@qontinui/ui-bridge 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/ai/index.d.mts +5 -5
  2. package/dist/ai/index.d.ts +5 -5
  3. package/dist/artifacts/index.d.mts +6 -6
  4. package/dist/artifacts/index.d.ts +6 -6
  5. package/dist/{assertions-Cuf-hvNa.d.ts → assertions-DwPKlu6v.d.ts} +1 -1
  6. package/dist/{assertions-C-uxQGa8.d.mts → assertions-j3SVwQrW.d.mts} +1 -1
  7. package/dist/{browser-capture-9-HEYLK-.d.ts → browser-capture-CDRUbuDp.d.ts} +1 -1
  8. package/dist/{browser-capture-CrytvSDO.d.mts → browser-capture-CRVnwBE4.d.mts} +1 -1
  9. package/dist/{change-observer-CBfJ5biX.d.mts → change-observer-BPtZll6d.d.mts} +1 -1
  10. package/dist/{change-observer-DRBa79aK.d.ts → change-observer-D0aEcwCl.d.ts} +1 -1
  11. package/dist/contracts/index.d.mts +5 -5
  12. package/dist/contracts/index.d.ts +5 -5
  13. package/dist/control/index.d.mts +4 -4
  14. package/dist/control/index.d.ts +4 -4
  15. package/dist/core/index.d.mts +9 -9
  16. package/dist/core/index.d.ts +9 -9
  17. package/dist/ctr/index.d.mts +4 -4
  18. package/dist/ctr/index.d.ts +4 -4
  19. package/dist/ctr/migrate.d.mts +3 -3
  20. package/dist/ctr/migrate.d.ts +3 -3
  21. package/dist/debug/index.d.mts +6 -6
  22. package/dist/debug/index.d.ts +6 -6
  23. package/dist/{drag-drop-detector-CXlhwPb7.d.mts → drag-drop-detector-Baq_Ixcc.d.mts} +1 -1
  24. package/dist/{drag-drop-detector-B8j1bMWp.d.ts → drag-drop-detector-gMHP_QIg.d.ts} +1 -1
  25. package/dist/{effect-store-Cp6Kb2-X.d.ts → effect-store-C0YCNUMx.d.ts} +1 -1
  26. package/dist/{effect-store-C7l209DQ.d.mts → effect-store-CATaXg5u.d.mts} +1 -1
  27. package/dist/{error-snapshot-DCr4oUYq.d.mts → error-snapshot-CmaQu6Ox.d.mts} +1 -1
  28. package/dist/{error-snapshot-owQQTv8i.d.ts → error-snapshot-DENlqCYO.d.ts} +1 -1
  29. package/dist/{find-B4dTGeqA.d.mts → find-A7hwZli6.d.mts} +1 -1
  30. package/dist/{find-DWZC8yoa.d.ts → find-DpPytcRP.d.ts} +1 -1
  31. package/dist/index.d.mts +20 -20
  32. package/dist/index.d.ts +20 -20
  33. package/dist/index.js +1 -1
  34. package/dist/index.mjs +1 -1
  35. package/dist/injected/bundle.global.js +1 -1
  36. package/dist/injected/index.d.mts +1 -1
  37. package/dist/injected/index.d.ts +1 -1
  38. package/dist/{metrics-Bz_3-pCs.d.mts → metrics-Bqs3Guh-.d.mts} +1 -1
  39. package/dist/{metrics-Dc2AV4Dr.d.ts → metrics-CnWC5_lF.d.ts} +1 -1
  40. package/dist/{migrate-specs-to-ctr-Dem0JPuu.d.ts → migrate-specs-to-ctr-BdcTdvZZ.d.ts} +2 -2
  41. package/dist/{migrate-specs-to-ctr-CUWHsCz-.d.mts → migrate-specs-to-ctr-KlH3DlnN.d.mts} +2 -2
  42. package/dist/{nextjs-CF71sn2M.d.ts → nextjs-BLvmgmnW.d.ts} +2 -2
  43. package/dist/{nextjs-CkNdxAF9.d.mts → nextjs-qQe7vyS4.d.mts} +2 -2
  44. package/dist/react/index.d.mts +4 -4
  45. package/dist/react/index.d.ts +4 -4
  46. package/dist/react/index.js +1 -1
  47. package/dist/react/index.mjs +1 -1
  48. package/dist/render-log/index.d.mts +1 -1
  49. package/dist/render-log/index.d.ts +1 -1
  50. package/dist/server/express.d.mts +7 -7
  51. package/dist/server/express.d.ts +7 -7
  52. package/dist/server/express.js +5 -0
  53. package/dist/server/express.js.map +1 -1
  54. package/dist/server/express.mjs +5 -0
  55. package/dist/server/express.mjs.map +1 -1
  56. package/dist/server/handlers.d.mts +9 -9
  57. package/dist/server/handlers.d.ts +9 -9
  58. package/dist/server/handlers.js +6 -0
  59. package/dist/server/handlers.js.map +1 -1
  60. package/dist/server/handlers.mjs +6 -0
  61. package/dist/server/handlers.mjs.map +1 -1
  62. package/dist/server/index.d.mts +101 -18
  63. package/dist/server/index.d.ts +101 -18
  64. package/dist/server/index.js +35 -1
  65. package/dist/server/index.js.map +1 -1
  66. package/dist/server/index.mjs +35 -2
  67. package/dist/server/index.mjs.map +1 -1
  68. package/dist/server/nextjs.d.mts +8 -8
  69. package/dist/server/nextjs.d.ts +8 -8
  70. package/dist/server/nextjs.js +13 -1
  71. package/dist/server/nextjs.js.map +1 -1
  72. package/dist/server/nextjs.mjs +13 -1
  73. package/dist/server/nextjs.mjs.map +1 -1
  74. package/dist/server/standalone.d.mts +9 -9
  75. package/dist/server/standalone.d.ts +9 -9
  76. package/dist/server/standalone.js +5 -0
  77. package/dist/server/standalone.js.map +1 -1
  78. package/dist/server/standalone.mjs +5 -0
  79. package/dist/server/standalone.mjs.map +1 -1
  80. package/dist/specs/index.d.mts +10 -10
  81. package/dist/specs/index.d.ts +10 -10
  82. package/dist/{sse-handler-CpB3bJ2N.d.mts → sse-handler-BE5cyXF7.d.mts} +1 -1
  83. package/dist/{sse-handler-BpZ9QtRm.d.ts → sse-handler-Bw_4h2AN.d.ts} +1 -1
  84. package/dist/{standalone-C_knSpNG.d.ts → standalone-SkUUJ8sc.d.ts} +4 -4
  85. package/dist/{standalone-CY0Uj5LQ.d.mts → standalone-u-N_N3Wl.d.mts} +4 -4
  86. package/dist/{store-Bv5wJ91r.d.mts → store-BHzSGFU2.d.mts} +1 -1
  87. package/dist/{store-BjSi35SI.d.ts → store-DH3LUEjx.d.ts} +1 -1
  88. package/dist/{style-types-mvMAEeSI.d.mts → style-types-CtwPR05K.d.mts} +1 -1
  89. package/dist/{style-types-De_9GaYG.d.ts → style-types-lmRdKbT8.d.ts} +1 -1
  90. package/dist/{types-BUCPM1o1.d.mts → types-CB7QpT8R.d.mts} +3 -3
  91. package/dist/{types-IQUAZlE2.d.mts → types-CgsWB31c.d.mts} +1 -1
  92. package/dist/{types-zS11cuej.d.ts → types-Chf3cfrT.d.ts} +12 -0
  93. package/dist/{types-C6ix-zFE.d.ts → types-CovPz-sh.d.ts} +1 -1
  94. package/dist/{types-Bubo62kN.d.mts → types-DNc31VlO.d.mts} +80 -7
  95. package/dist/{types-vftd8HsR.d.ts → types-DgIxG1sS.d.ts} +1 -1
  96. package/dist/{types-Bz40rWAT.d.ts → types-DhJE_FQX.d.ts} +3 -3
  97. package/dist/{types-DUVvn3yt.d.ts → types-DmMT2yMs.d.ts} +80 -7
  98. package/dist/{types-D1UiLr75.d.mts → types-DnqZodFb.d.mts} +12 -0
  99. package/dist/{types-cfwRCpgn.d.ts → types-bG3xLcjL.d.ts} +1 -1
  100. package/dist/{types-q-2aMSnI.d.mts → types-cQzKFRd5.d.mts} +1 -1
  101. package/dist/{types-BYhYroLP.d.mts → types-gusNHeJt.d.mts} +1 -1
  102. package/dist/verification-layers/index.d.mts +5 -5
  103. package/dist/verification-layers/index.d.ts +5 -5
  104. package/dist/{websocket-client-Bmt4YNSR.d.ts → websocket-client-BEtd7_GO.d.ts} +1 -1
  105. package/dist/{websocket-client-B_W7ZvT0.d.mts → websocket-client-CDRMdZdU.d.mts} +1 -1
  106. package/dist/{ws-streaming-DGiomqt_.d.mts → ws-streaming-BzumSnWw.d.mts} +1 -1
  107. package/dist/{ws-streaming-D_tat1kF.d.ts → ws-streaming-DweATXes.d.ts} +1 -1
  108. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/types.ts","../../src/diagnostics/codes.generated.ts","../../src/diagnostics/index.ts","../../src/server/express.ts"],"names":["m","body"],"mappings":"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","file":"express.mjs","sourcesContent":["/**\n * UI Bridge Server Types\n *\n * Shared types for server adapters.\n */\n\nimport type { UIBridgeConfig, ElementHistoryOptions } from '../core';\nimport type { UiBridgeErrorCode } from '../diagnostics';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n BatchActionRequest,\n BatchActionResponse,\n FindRequest,\n FindResponse,\n ControlSnapshot,\n WorkflowRunRequest,\n WorkflowRunResponse,\n PageNavigateRequest,\n PageNavigationResponse,\n FillFormRequest,\n EffectRecordEntry,\n} from '../control';\nimport type { FillResult } from '../core/types';\nimport type { PageHealthReport } from './page-health';\nimport type { RenderLogEntry, RenderLogEntryType } from '../render-log';\nimport type {\n SearchCriteria,\n SearchResponse,\n NLActionRequest,\n NLActionResponse,\n AssertionRequest,\n AssertionResult,\n BatchAssertionRequest,\n BatchAssertionResult,\n SemanticSnapshot,\n SemanticDiff,\n SemanticSearchCriteria,\n SemanticSearchResponse,\n Intent,\n IntentSearchResponse,\n IntentExecutionResult,\n RecoveryAttemptRequest,\n RecoveryAttemptResult,\n PageDataMap,\n PageRegionMap,\n StructuredDataExtraction,\n CrossAppComparisonReport,\n ComponentInfo,\n ActionWithDiffRequest,\n ActionDiffResult,\n ChangePredicate,\n WaitForChangeOptions,\n CategorizedDiff,\n ChangeBufferDrainResult,\n SnapshotBookmark,\n FormsResponse,\n StructuredChangeAnalysis,\n FormSnapshot,\n FormDiff,\n FindResult,\n FindContext,\n} from '../ai';\nimport type {\n InteractionStateName,\n ElementDesignData,\n StateStyles,\n ResponsiveSnapshot,\n} from '../core/types';\nimport type { StyleGuideConfig, StyleAuditReport } from '../specs/style-types';\nimport type {\n QualityEvaluationReport,\n SnapshotDiffReport,\n EvaluateRequest,\n} from '../specs/quality-types';\nimport type {\n UIState,\n UIStateGroup,\n UITransition,\n PathResult,\n TransitionResult,\n NavigationResult,\n StateSnapshot,\n} from '../core';\nimport type { ElementAnnotation, AnnotationConfig, AnnotationCoverage } from '../annotations';\nimport type { CapturedError, AnyCapturedEvent } from '../debug/browser-capture-types';\nimport type { FingerprintedEvent } from '../debug/error-fingerprint';\nimport type { TimelineEntry } from '../debug/error-timeline';\nimport type { HealthReport } from '../debug/health-score';\nimport type { ErrorSessionSummary, BaselineComparison } from '../debug/error-session';\nimport type { NetworkChain } from '../debug/network-chain';\nimport type { ErrorSnapshot } from '../debug/error-snapshot';\nimport type { CompositeIdleStatus, SignalStatus } from '../idle';\nimport type { NetworkRequestEntry, WaitForRequestOptions, WaitForRequestResult } from '../network';\nimport type { UndoRedoState } from '../undo';\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 the diagnostics `mapInternalErrorCode`).\n */\n code?: UiBridgeErrorCode;\n /** Request timestamp */\n timestamp: number;\n /** Response metadata (staleness, diagnostics) */\n _meta?: {\n stale?: boolean;\n staleSinceMs?: number;\n cacheAgeMs?: number;\n fallback?: boolean;\n reason?: string;\n };\n /** Recovery suggestions for error responses */\n suggestions?: string[];\n /**\n * Optional HTTP status code hint. When set, the framework adapter\n * (Express / Next.js) will use this code instead of the default 200.\n * Used by endpoints that need 4xx semantics on logical failure (e.g.\n * Phase 2.1 `/control/element/:id/expect` returns 422 when the asserted\n * predicate doesn't hold). Stripped from the JSON body before send so\n * external consumers see the same envelope shape.\n */\n httpStatus?: 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 * Browser events response — returned by GET /control/browser-events\n */\nexport interface BrowserEventsResponse {\n /** Raw events (filtered by params) */\n events: AnyCapturedEvent[] | CapturedError[];\n /** Total count of returned events */\n count: number;\n /** Deduplicated event groups (only when deduplicate=true) */\n deduplicated?: FingerprintedEvent[];\n /** Number of unique fingerprints (only when deduplicate=true) */\n uniqueCount?: number;\n}\n\n/**\n * Phase 2.1 (plan 2026-05-03) — body for POST /control/element/:id/expect.\n * Reuses the closed `WaitForElementState` enum from the SDK runtime so the\n * predicate evaluator is shared with `/ai/wait-for-element`. The critical\n * semantic difference: this endpoint **fails the request** with HTTP 422\n * when the predicate doesn't hold within `timeout`, instead of returning\n * 200 + `found:false`.\n */\nexport interface ElementExpectRequest {\n /** Predicate to assert. Closed enum mirroring WaitForElementState. */\n state:\n | 'present'\n | 'visible'\n | 'enabled'\n | 'disabled'\n | 'value-not-empty'\n | 'value-empty'\n | 'checked'\n | 'unchecked'\n | 'absent';\n /** Timeout in ms. Default 5000, capped at 30000. */\n timeout?: number;\n /** Poll interval in ms. Default 100, minimum 10. */\n pollMs?: number;\n}\n\n/**\n * Response from POST /control/element/:id/expect. `passed:true` rides on\n * HTTP 200; `passed:false` rides on HTTP 422 (set via `APIResponse.httpStatus`).\n */\nexport interface ElementExpectResponse {\n /** Whether the predicate held within the timeout window. */\n passed: boolean;\n /**\n * Element snapshot at the moment the predicate flipped true (on pass) or\n * the most recent registered snapshot before timeout (on fail). `null`\n * when the element was never registered during the wait.\n */\n observedState: {\n registered: boolean;\n state: Record<string, unknown> | null;\n } | null;\n /** Wall-clock duration of the wait in ms. */\n durationMs: number;\n}\n\n/**\n * Phase 1.3 (plan 2026-05-03) — flat machine-readable digest of \"is the\n * page in a sensible state right now?\". Synthesized from the live snapshot,\n * console-errors buffer, and idle detector so the caller spends one round-\n * trip instead of four. Distinct from the NL `/ai/page-summary` digest.\n */\nexport interface StateSummary {\n /** Count of snapshot elements that are both layout-positioned and visible. */\n visibleElementCount: number;\n /** True when the snapshot's `modalStack` has at least one entry. */\n modalOpen: boolean;\n /** True when the console-errors buffer has at least one entry. */\n hasErrors: boolean;\n /**\n * Pass-through of the idle detector's composite status, or `null` when\n * idle detection is disabled. Lets callers gate work on idle without\n * issuing a separate `/control/idle-status` round-trip.\n */\n idleSignals: CompositeIdleStatus | null;\n /** Number of components currently registered. */\n registeredComponents: number;\n /** Current page route, or `null` when undeterminable. */\n route: string | null;\n /** Currently active tab id (for tab-based apps), or `null` when not provided. */\n activeTab: string | null;\n}\n\n/**\n * Phase 4.1 (plan 2026-05-03) — body for POST /control/sdk/spawn-headless.\n *\n * Wraps the already-shipped `@qontinui/ui-bridge-headless` package's\n * `launchHeadlessTab` so callers can spin up a real Chromium tab for testing\n * without manually opening a browser. The endpoint is gated behind the\n * `enableHeadlessSpawn` config flag (or `ENABLE_HEADLESS_SPAWN=1`); disabled\n * by default because it pulls in Playwright + Chromium at runtime.\n */\nexport interface SpawnHeadlessRequest {\n /** Target URL the headless tab should navigate to. Must start with http:// or https://. */\n url: string;\n /**\n * Max time (ms) to wait for the headless client to register a tab over UI Bridge.\n * Default 30000, capped at 60000.\n */\n timeoutMs?: number;\n /**\n * Auto-close timer (seconds). Tracked spawned tabs are also closed on\n * server shutdown. Default 300.\n */\n keepAliveSecs?: number;\n /**\n * Run Chromium without a visible window. Default `true` — the whole point\n * of this endpoint is \"no manual browser\".\n */\n headless?: boolean;\n /** Viewport size override. Default 1280x720. */\n viewport?: { width: number; height: number };\n}\n\n/**\n * Phase 4.1 — response from POST /control/sdk/spawn-headless.\n */\nexport interface SpawnHeadlessResponse {\n /** True when the tab was launched (regardless of UI Bridge registration). */\n spawned: boolean;\n /** Tab id assigned by the relay when registration succeeded; `null` otherwise. */\n tabId: string | null;\n /** True when the relay reported the tab as connected before timeout. */\n uiBridgeRegistered: boolean;\n /** URL the page actually ended up at after navigation. */\n finalUrl: string;\n}\n\n/**\n * Per-user tab scoping context (§4.2) — threaded as the final positional\n * argument of every relay-dispatching handler.\n *\n * The Next.js adapter populates `callerUserId` from the trusted\n * `X-Caller-User-Id` request header (set by the consumer's auth gate from\n * the authenticated identity — NEVER from a browser-supplied value). The\n * relay-handlers layer lifts `callerUserId` into `ownerCheck.userId` on the\n * downstream `relay.queueCommand` call so the relay refuses to dispatch\n * the command to a tab owned by a different user.\n *\n * The reason this is a dedicated final-arg `context` object instead of a\n * field in the request body / query: many handlers (e.g. `captureSnapshot`,\n * `clearRenderLog`, `getElementState(id)`) have zero-arg or args-without-bag\n * signatures, so there is no body/query for the adapter to splice\n * `__callerUserId` into. Without this explicit channel, those handlers\n * would bypass per-user scoping entirely and silently dispatch to whichever\n * tab happened to be `primaryTabId` — including tabs owned by other users.\n */\nexport interface HandlerContext {\n /**\n * Authenticated caller's user id, as supplied by the consumer's auth gate\n * via the `X-Caller-User-Id` header. When present, the relay restricts\n * dispatch to tabs owned by this user. When absent, the call is treated\n * as a trusted admin / server-side call and the unfiltered primary-tab\n * fallback applies.\n */\n callerUserId?: string;\n}\n\n/**\n * Server handler interface\n *\n * Implementations provide these handlers for different frameworks.\n *\n * Per-user tab scoping (§4.2): handlers that dispatch to a browser tab\n * accept an optional final `context?: HandlerContext` parameter. The\n * Next.js / Express adapters thread the authenticated caller's user id\n * through that parameter so the relay can enforce per-user dispatch\n * boundaries.\n */\nexport interface UIBridgeServerHandlers {\n // Render log endpoints\n getRenderLog: (\n query?: RenderLogQuery,\n context?: HandlerContext\n ) => Promise<APIResponse<RenderLogEntry[]>>;\n clearRenderLog: (context?: HandlerContext) => Promise<APIResponse<void>>;\n captureSnapshot: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getRenderLogPath: () => Promise<APIResponse<{ path: string }>>;\n\n // Control endpoints\n getElements: (\n options?: {\n recency?: string;\n /** Case-insensitive substring filter on the element's title DOM attribute */\n title?: string;\n /** Case-insensitive substring filter on the element's aria-label DOM attribute */\n aria_label?: string;\n /** Case-insensitive substring filter on the element's visible text / label */\n text?: string;\n /**\n * Phase 3.2 (plan 2026-05-03) — return only elements whose `reveals`\n * array contains an entry that matches this query. Bi-directional glob\n * match: query may be a concrete id matching a `*`-glob entry, or a\n * `*`-glob matching concrete entries.\n */\n revealsAny?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['elements']>>;\n getElement: (\n id: string,\n options?: { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['elements'][0]>>;\n getElementState: (id: string, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getElementReactState: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n executeElementAction: (\n id: string,\n request: ControlActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ControlActionResponse>>;\n executeBatchAction: (\n request: BatchActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<BatchActionResponse>>;\n /**\n * Rank snapshot elements by natural-language query against the\n * structured disambiguation metadata (variant, position, color,\n * contextPath, label, type). Returns scored matches.\n *\n * Free-text input is tokenised and matched token-bag style; structured\n * filters (type, origin, visibleOnly, contextPathContains) act as hard\n * filters. See `@qontinui/ui-bridge/core` `findElements` for the\n * scoring model.\n */\n rankElements: (\n request: {\n text?: string;\n type?: string;\n variant?: string;\n position?: string;\n color?: string;\n contextPathContains?: string;\n origin?: 'hook' | 'auto';\n visibleOnly?: boolean;\n limit?: number;\n minScore?: number;\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n Array<{\n id: string;\n score: number;\n reasons: string[];\n element: ControlSnapshot['elements'][0];\n }>\n >\n >;\n\n // Component endpoints\n // F2 (Direction B): `data` is `{components: [...]}` so the envelope matches\n // the runner's direct `/ui-bridge/control/components` route and aligns with\n // every other rich endpoint convention (object-shaped `data`).\n getComponents: (\n options?: {\n recency?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ components: ControlSnapshot['components'] }>>;\n getComponent: (\n id: string,\n options?: { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['components'][0]>>;\n getComponentState: (\n id: string,\n context?: HandlerContext\n ) => 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 context?: HandlerContext\n ) => Promise<APIResponse<ComponentActionResponse>>;\n\n // Find endpoints\n find: (\n request?: FindRequest & { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResponse>>;\n /**\n * @deprecated Use find() instead\n */\n discover: (\n request?: FindRequest & { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResponse>>;\n getControlSnapshot: (\n request?: {\n targetTabId?: string;\n url?: string;\n skipSettle?: boolean | string;\n settleTimeout?: number | string;\n recency?: string;\n /**\n * Item 1 filter: when `true`, drop elements with `kind: \"content\"`\n * (semantic `data-ui-bridge-content` entries) from the response.\n * Default `false` — include everything.\n */\n interactiveOnly?: boolean | string;\n /** snake_case alias for `interactiveOnly`. */\n interactive_only?: boolean | string;\n /**\n * Manual-test remediation 2026-05-10 (Item 2) filter: when `true`,\n * keep only elements that report disabled by any of these signals in\n * the snapshot's `state`: `disabled === true`,\n * `ariaDisabled === \"true\"`, or `enabled === false`. Default `false` —\n * include everything. All other snapshot metadata (route, activeTab,\n * registration, viewport, errorSummary) is preserved unchanged.\n */\n withDisabledOnly?: boolean | string;\n /** snake_case alias for `withDisabledOnly`. */\n with_disabled_only?: boolean | string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot>>;\n\n // Vision pipeline endpoints — runner-direct; SDK stubs only.\n visionCapture: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionAnnotate: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionDiff: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionRaw: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionCacheStream: (sha256: string, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n visionHealth: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n // Phase 4 — text-bearing outputs.\n visionExtract: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionDescribe: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n // Phase 6 — analyzers + assertion DSL + baselines + frontend mutation signal.\n visionAnalyze: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionAssert: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionBaseline: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionBaselinesList: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n visionMutationOccurred: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Workflow endpoints\n getWorkflows: (\n options?: {\n recency?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['workflows']>>;\n runWorkflow: (\n id: string,\n request?: WorkflowRunRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<WorkflowRunResponse>>;\n getWorkflowStatus: (\n runId: string,\n context?: HandlerContext\n ) => Promise<APIResponse<WorkflowRunResponse>>;\n\n // Debug endpoints\n getActionHistory: (\n limit?: number,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown[]>>;\n // D3 Effect Calculus (Phase 2) — read-only recent predict-then-verify\n // cycles from the process-global effect store. Newest-first; `limit` caps\n // the slice (omitted = all retained, default ring-buffer cap 100).\n getRecentEffects: (\n options?: { limit?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<EffectRecordEntry[]>>;\n getMetrics: () => Promise<APIResponse<unknown>>;\n highlightElement: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getElementTree: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getConsoleErrors: (\n params?: {\n since?: number;\n /**\n * Monotonic id cursor — return only entries with `id > sinceId`.\n * Paired with `nextSinceId` in the ungrouped response for pagination.\n * Takes precedence over the legacy `since` timestamp filter when both\n * are provided.\n */\n sinceId?: number;\n limit?: number;\n group?: boolean;\n groupBy?: 'fingerprint' | 'message' | 'source';\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n | {\n errors: CapturedError[];\n count: number;\n /** Cursor for the next call — last returned entry's id, or `sinceId` if empty. */\n nextSinceId?: number;\n /** Lifetime total of entries evicted from the underlying buffer. */\n droppedCount?: number;\n /** Current buffer size (not filtered by level/since). */\n bufferedCount?: number;\n }\n | { groups: unknown[]; totalErrors: number; totalGroups: number }\n >\n >;\n clearConsoleErrors: (context?: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n\n // AI-native endpoints\n aiSearch: (\n criteria: SearchCriteria,\n context?: HandlerContext\n ) => Promise<APIResponse<SearchResponse>>;\n aiFind: (\n request: {\n query: string;\n context?: FindContext;\n confidenceThreshold?: number;\n /**\n * B2 — strict literal-match mode. When `true`, returns only elements\n * with a case-insensitive exact match against id / labelText /\n * ariaLabel / textContent / title / placeholder / value / name; no\n * fuzzy fallback. Default `false` keeps fuzzy behaviour.\n */\n strict?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResult>>;\n aiExecute: (\n request: NLActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<NLActionResponse>>;\n aiAssert: (\n request: AssertionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<AssertionResult>>;\n aiAssertBatch: (\n request: BatchAssertionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<BatchAssertionResult>>;\n getSemanticSnapshot: (\n options?: {\n includeForms?: string | boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticSnapshot>>;\n getSemanticDiff: (\n since?: number,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n getPageSummary: (context?: HandlerContext) => Promise<APIResponse<string>>;\n\n // Change tracking endpoints\n executeWithDiff: (\n request: ActionWithDiffRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ActionDiffResult>>;\n waitForChange: (\n request: {\n predicate: ChangePredicate;\n options?: WaitForChangeOptions;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff>>;\n categorizeLastDiff: (context?: HandlerContext) => Promise<APIResponse<CategorizedDiff | null>>;\n getScopedDiff: (\n request: {\n scope: string;\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n // Budget-aware diff summary\n summarizeDiff: (\n request: {\n budget: number;\n includeIds?: boolean;\n includeCategory?: boolean;\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ summary: string }>>;\n // Structured change analysis (table/list-aware)\n analyzeStructuredChanges: (\n request: {\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<StructuredChangeAnalysis>>;\n\n // Change buffer endpoints\n enableChangeBuffer: (context?: HandlerContext) => Promise<APIResponse<{ enabled: boolean }>>;\n disableChangeBuffer: (context?: HandlerContext) => Promise<APIResponse<{ enabled: boolean }>>;\n drainChangeBuffer: (\n context?: HandlerContext\n ) => Promise<APIResponse<ChangeBufferDrainResult>>;\n getChangeBufferSize: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ size: number; enabled: boolean }>>;\n\n // Snapshot bookmark endpoints\n saveBookmark: (\n request: { name: string },\n context?: HandlerContext\n ) => Promise<APIResponse<SnapshotBookmark>>;\n getBookmark: (name: string, context?: HandlerContext) => Promise<APIResponse<SnapshotBookmark>>;\n deleteBookmark: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ deleted: boolean }>>;\n listBookmarks: (context?: HandlerContext) => Promise<APIResponse<string[]>>;\n diffFromBookmark: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n\n // Semantic search (embedding-based)\n aiSemanticSearch: (\n criteria: SemanticSearchCriteria,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticSearchResponse>>;\n\n // State management endpoints\n getStates: (context?: HandlerContext) => Promise<APIResponse<UIState[]>>;\n getState: (id: string, context?: HandlerContext) => Promise<APIResponse<UIState>>;\n getActiveStates: (context?: HandlerContext) => Promise<APIResponse<UIState[]>>;\n activateState: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n deactivateState: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getStateGroups: (context?: HandlerContext) => Promise<APIResponse<UIStateGroup[]>>;\n activateStateGroup: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n deactivateStateGroup: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getTransitions: (context?: HandlerContext) => Promise<APIResponse<UITransition[]>>;\n canExecuteTransition: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ canExecute: boolean; reason?: string }>>;\n executeTransition: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<TransitionResult>>;\n findPath: (\n request: { targetStates: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<PathResult>>;\n navigateTo: (\n request: { targetStates: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<NavigationResult>>;\n getStateSnapshot: (context?: HandlerContext) => Promise<APIResponse<StateSnapshot>>;\n\n // Intent endpoints\n executeIntent: (\n request: {\n intentId: string;\n params?: Record<string, unknown>;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentExecutionResult>>;\n findIntent: (\n request: { query: string },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentSearchResponse>>;\n listIntents: (context?: HandlerContext) => Promise<APIResponse<Intent[]>>;\n registerIntent: (intent: Intent, context?: HandlerContext) => Promise<APIResponse<Intent>>;\n executeIntentFromQuery: (\n request: {\n query: string;\n params?: Record<string, unknown>;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentExecutionResult>>;\n deleteIntent: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ deleted: boolean }>>;\n\n // Recovery endpoints\n attemptRecovery: (\n request: RecoveryAttemptRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<RecoveryAttemptResult>>;\n\n // Cross-app analysis endpoints\n analyzePageData: (context?: HandlerContext) => Promise<APIResponse<PageDataMap>>;\n analyzePageRegions: (context?: HandlerContext) => Promise<APIResponse<PageRegionMap>>;\n analyzeStructuredData: (\n context?: HandlerContext\n ) => Promise<APIResponse<StructuredDataExtraction>>;\n crossAppCompare: (\n request: {\n sourceSnapshot: SemanticSnapshot;\n targetSnapshot: SemanticSnapshot;\n sourceComponents?: ComponentInfo[];\n targetComponents?: ComponentInfo[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<CrossAppComparisonReport>>;\n\n // Page navigation endpoints\n pageRefresh: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageNavigate: (\n request: PageNavigateRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<PageNavigationResponse>>;\n pageGoBack: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageGoForward: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageEvaluate: (request: unknown, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n pageScroll: (request: unknown, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Clipboard endpoints (browser gesture-based)\n clipboardWrite: (request: unknown, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n clipboardRead: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Annotation endpoints\n getAnnotations: (\n context?: HandlerContext\n ) => Promise<APIResponse<Record<string, ElementAnnotation>>>;\n getAnnotation: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementAnnotation>>;\n setAnnotation: (\n id: string,\n annotation: ElementAnnotation,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementAnnotation>>;\n deleteAnnotation: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n importAnnotations: (\n config: AnnotationConfig,\n context?: HandlerContext\n ) => Promise<APIResponse<{ count: number }>>;\n exportAnnotations: (context?: HandlerContext) => Promise<APIResponse<AnnotationConfig>>;\n getAnnotationCoverage: (\n context?: HandlerContext\n ) => Promise<APIResponse<AnnotationCoverage>>;\n\n // Performance diagnostics endpoints\n getPerformanceEntries: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n clearPerformanceEntries: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ cleared: boolean }>>;\n getBrowserEvents: (\n params?: {\n type?: string;\n since?: number;\n limit?: number;\n severity?: string;\n deduplicate?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<BrowserEventsResponse>>;\n getTimeline: (\n params?: {\n since?: number;\n limit?: number;\n minSeverity?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ entries: TimelineEntry[]; count: number }>>;\n\n // Health score endpoint\n getHealthReport: (\n params?: { windowMs?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<HealthReport>>;\n\n // Network chain endpoints\n getNetworkChains: (\n params?: {\n since?: number;\n limit?: number;\n failuresOnly?: boolean;\n url?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ chains: NetworkChain[]; count: number }>>;\n\n // Error session endpoints\n startErrorSession: (\n request: { label?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ sessionId: string }>>;\n endErrorSession: (\n context?: HandlerContext\n ) => Promise<APIResponse<ErrorSessionSummary | null>>;\n getErrorSessions: (context?: HandlerContext) => Promise<APIResponse<ErrorSessionSummary[]>>;\n captureErrorBaseline: (\n request: { label: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ label: string; capturedAt: number; fingerprintCount: number }>>;\n compareErrorBaseline: (\n request: { label: string },\n context?: HandlerContext\n ) => Promise<APIResponse<BaselineComparison | null>>;\n\n // Error snapshots (auto-captured on significant errors)\n getErrorSnapshots: (\n params?: {\n limit?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ snapshots: ErrorSnapshot[]; count: number }>>;\n\n // Composite error report (health + recent errors + session in one call)\n getErrorReport: (\n context?: HandlerContext\n ) => Promise<\n APIResponse<{\n health: HealthReport;\n recentErrors: AnyCapturedEvent[];\n activeSession: ErrorSessionSummary | null;\n snapshots: ErrorSnapshot[];\n }>\n >;\n\n // Design review endpoints\n getElementStyles: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementDesignData>>;\n getElementStateStyles: (\n id: string,\n request: { states?: InteractionStateName[] },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elementId: string; stateStyles: StateStyles[] }>>;\n getDesignSnapshot: (\n request?: {\n elementIds?: string[];\n includePseudoElements?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elements: ElementDesignData[]; timestamp: number }>>;\n getResponsiveSnapshots: (\n request: {\n viewports?: Record<string, number>;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ResponsiveSnapshot[]>>;\n setViewportConstraints: (\n request: { width?: number; restore?: boolean },\n context?: HandlerContext\n ) => Promise<\n APIResponse<{\n success: boolean;\n viewportWidth: number;\n constrainedWidth: number;\n timestamp: number;\n }>\n >;\n runDesignAudit: (\n request?: {\n guide?: StyleGuideConfig;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<StyleAuditReport>>;\n loadStyleGuide: (\n request: {\n guide: StyleGuideConfig;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ loaded: boolean }>>;\n getStyleGuide: (context?: HandlerContext) => Promise<APIResponse<StyleGuideConfig | null>>;\n clearStyleGuide: (context?: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n\n // Quality evaluation endpoints\n evaluateQuality: (\n request?: EvaluateRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<QualityEvaluationReport>>;\n getQualityContexts: (\n context?: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; description: string }>>>;\n saveBaseline: (\n request?: {\n label?: string;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ saved: boolean; elementCount: number }>>;\n diffBaseline: (\n request?: { elementIds?: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<SnapshotDiffReport>>;\n\n // Form state awareness endpoints\n getForms: (context?: HandlerContext) => Promise<APIResponse<FormsResponse>>;\n fillForm: (\n request: FillFormRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<FillResult>>;\n snapshotForms: (context?: HandlerContext) => Promise<APIResponse<FormSnapshot>>;\n diffForms: (\n request: {\n before: FormSnapshot;\n after: FormSnapshot;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<FormDiff>>;\n\n // Clipboard endpoints\n getClipboard: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ text: string | null; formats: string[] }>>;\n setClipboard: (\n request: {\n text: string;\n html?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ written: boolean; formats: string[] }>>;\n\n // Network request monitoring endpoints\n getNetworkRequests: (\n params?: {\n status?: string;\n method?: string;\n urlPattern?: string;\n failuresOnly?: boolean;\n since?: number;\n limit?: number;\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<{ requests: NetworkRequestEntry[]; count: number; inFlightCount: number }>\n >;\n\n getNetworkRequestsInFlight: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ requests: NetworkRequestEntry[]; count: number }>>;\n\n waitForNetworkRequest: (\n request: WaitForRequestOptions,\n context?: HandlerContext\n ) => Promise<APIResponse<WaitForRequestResult>>;\n\n getNetworkRequest: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<NetworkRequestEntry>>;\n\n // Idle detection endpoints\n getIdleStatus: (context?: HandlerContext) => Promise<APIResponse<CompositeIdleStatus>>;\n getIdleSignalStatus: (\n signal: string,\n context?: HandlerContext\n ) => Promise<APIResponse<SignalStatus>>;\n waitForIdle: (\n request?: {\n timeout?: number;\n minStableMs?: number;\n exclude?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<CompositeIdleStatus>>;\n waitForSignalIdle: (\n signal: string,\n request?: { timeout?: number; minStableMs?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<SignalStatus>>;\n waitForTargets: (\n request: {\n targets: Array<string | { indicator: string }>;\n timeout?: number;\n minStableMs?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<Record<string, SignalStatus>>>;\n\n // Undo/redo awareness endpoints\n getUndoState: (context?: HandlerContext) => Promise<APIResponse<UndoRedoState>>;\n executeUndo: (context?: HandlerContext) => Promise<APIResponse<{ executed: boolean }>>;\n executeRedo: (context?: HandlerContext) => Promise<APIResponse<{ executed: boolean }>>;\n\n // Phase 1.3 (plan 2026-05-03) — flat machine-readable digest of \"is the\n // page in a sensible state right now?\" so callers don't have to fan out\n // five round-trips (snapshot + console-errors + idle-status + …) just to\n // pre-flight an interaction. Distinct from `/ai/page-summary` which\n // returns NL prose for human consumption.\n getStateSummary: () => Promise<APIResponse<StateSummary>>;\n\n // Phase 2.1 (plan 2026-05-03) — assert an element predicate.\n // Returns 200 + passed:true on success, 422 + passed:false on timeout\n // (set via APIResponse.httpStatus). Shares predicate evaluation with\n // `/ai/wait-for-element` so semantics stay aligned.\n expectElement: (\n id: string,\n request: ElementExpectRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementExpectResponse>>;\n\n // Phase 4.1 (plan 2026-05-03) — spawn a real Chromium tab via\n // `@qontinui/ui-bridge-headless` so callers can drive the web bridge\n // without manually opening a browser. Gated behind `enableHeadlessSpawn`\n // (off by default); returns 503 when disabled or when the optional peer\n // dependency isn't installed; 400 on bad input.\n spawnHeadless: (\n request: SpawnHeadlessRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<SpawnHeadlessResponse>>;\n\n // Page health diagnostics — runs the same spatial-coverage / layout /\n // text-signal heuristics as the runner's `/control/page-health` analyzer\n // (qontinui-runner src-tauri/src/mcp/ui_bridge/screenshots.rs) but\n // server-side over the current snapshot. Pure data-over-elements; no\n // browser context required beyond a relayed snapshot.\n pageHealth: () => Promise<APIResponse<PageHealthReport>>;\n\n // API discovery\n getCapabilities: () => Promise<APIResponse<CapabilitiesResponse>>;\n\n // Specs endpoint — serves all loaded specs for runner discovery\n getSpecs: () => Promise<APIResponse<Record<string, unknown>>>;\n\n // Heartbeat (app health detection)\n receiveHeartbeat: () => Promise<APIResponse<{ received: boolean }>>;\n\n // Element event log\n getElementHistory: (\n elementId: string,\n options?: ElementHistoryOptions,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown[]>>;\n\n // Media discovery & analysis endpoints — removed in Phase 2 of the\n // UI Bridge Vision Pipeline (2026-05-13). The `/control/screenshot`,\n // `/control/annotated-screenshot`, `/control/element-screenshot`,\n // `/control/capture-element-images`, `/control/get-element-images`,\n // `/control/diagnose-stuck-screen`, and `/ai/media/*` routes are\n // superseded by `/vision/{capture,annotate,diff,raw,cache,health}`\n // declared above (handlers prefixed `vision*`). The runner answers those\n // routes directly; the SDK keeps stubs for type-completeness.\n\n // Change observation (push-based)\n getChangesSince: (params?: {\n since?: number;\n limit?: number;\n }) => Promise<APIResponse<{ events: DOMChangeEvent[]; count: number }>>;\n\n /** Tear down internal subscriptions and observers to prevent resource leaks. */\n destroy?: () => void;\n\n // Enhanced discovery endpoints\n query: (\n request: {\n selector: string;\n limit?: number;\n includeState?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elements: unknown[]; count: number }>>;\n\n waitForElement: (\n request: {\n selector?: string;\n elementId?: string;\n timeout?: number;\n pollInterval?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ found: boolean; element?: unknown; waitedMs: number }>>;\n\n /**\n * Tier 3.1 — Wait for an element matching a structured selector to satisfy\n * a given condition (present / visible / clickable / text-matches).\n *\n * Implemented via registry polling so it works with both DOM and native elements.\n */\n waitForElementByCondition: (\n request: WaitForElementByConditionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<WaitForElementByConditionResponse>>;\n\n /**\n * Testing-friendliness — Wait for an SPA route change with optional\n * from/to matching. Returns a timeout shape (reason: 'timeout') when no\n * matching navigation occurs before `timeoutMs`.\n */\n waitForRouteChange: (\n request?: WaitForRouteChangeRequest,\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n WaitForRouteChangeResponse | { reason: 'timeout'; lastKnownRoute?: string; elapsedMs: number }\n >\n >;\n\n /**\n * Testing-friendliness — Wait for an element matching `predicate` to be\n * registered (or visible / have layout, per `requirement`). Polls the\n * in-memory registry; falls back to `document.querySelector` when\n * `predicate.selector` is given.\n */\n waitForElementRegistered: (\n request: WaitForElementRequest,\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n | WaitForElementSuccessResponse\n | { reason: 'timeout'; elapsedMs: number; closestMatch?: Record<string, unknown> }\n >\n >;\n\n /**\n * Tier 3.2 — Execute a heterogeneous sequence of actions, waits, and\n * snapshots in one round-trip.\n */\n controlBatch: (\n request: ControlBatchRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ControlBatchResponse>>;\n\n // App-agnostic convenience endpoints\n clickByText: (\n request: {\n text: string;\n tag?: string;\n exact?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n clickBySelector: (\n request: {\n selector: string;\n index?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n typeInto: (\n request: {\n selector?: string;\n label?: string;\n text: string;\n clear?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ typed: boolean; element?: unknown }>>;\n\n readValue: (\n request: {\n selector: string;\n index?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ value: string | null; length: number }>>;\n\n findByText: (\n request: { text: string; tag?: string; exact?: boolean },\n context?: HandlerContext\n ) => 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\n getDiagnostics: (context?: HandlerContext) => Promise<\n APIResponse<{\n sdk_initialized: boolean;\n auto_register_active: boolean;\n registered_elements: number;\n dom_interactive_elements: number;\n mutation_observer_active: boolean;\n navigation_adapter: string;\n page_title: string;\n page_url: string;\n page_ready: boolean;\n providers_mounted: string[];\n last_discover_at: string | null;\n capabilities: string[];\n }>\n >;\n\n // Navigation adapter endpoints\n getRoutes: (\n context?: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; path: string }>>>;\n navigateByAdapter: (\n request: { page: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ navigated: boolean; route: { name: string; path: string } }>>;\n}\n\n/**\n * Push-based DOM change event.\n *\n * Batched subtree-change events emitted by the ChangeObserver and relayed\n * through the CommandRelay. Inspired by folk-js/allio's SubtreeChanged event.\n */\nexport interface DOMChangeEvent {\n type: 'subtreeChanged';\n timestamp: number;\n added: string[];\n removed: string[];\n modified: string[];\n}\n\n/**\n * Endpoint description for API discovery\n */\nexport interface EndpointInfo {\n method: string;\n path: string;\n description: string;\n queryParams?: Record<string, string>;\n}\n\n/**\n * Category of related endpoints\n */\nexport interface EndpointCategory {\n description: string;\n endpoints: EndpointInfo[];\n}\n\n/**\n * Response from the /capabilities endpoint\n */\nexport interface CapabilitiesResponse {\n version: string;\n categories: Record<string, EndpointCategory>;\n}\n\n/**\n * Selector criteria for waitForElementByCondition.\n * All provided fields are ANDed together (case-insensitive substring match).\n */\nexport interface ElementConditionSelector {\n /** Match by element id (exact or substring) */\n id?: string;\n /** Match by title attribute (substring) */\n title?: string;\n /** Match by aria-label attribute (substring) */\n aria_label?: string;\n /** Match by visible text / label (substring) */\n text?: string;\n /** Match by element type (e.g. \"button\", \"input\") */\n type?: string;\n}\n\n/**\n * Request body for POST /ai/wait-for-element (Tier 3.1)\n */\nexport interface WaitForElementByConditionRequest {\n /** Selector criteria — all provided fields must match */\n selector: ElementConditionSelector;\n /** Max wait in ms (default 5000, capped at 60000) */\n timeout_ms?: number;\n /** Condition to check on each poll */\n condition?: 'present' | 'visible' | 'clickable' | 'text-matches';\n /** Substring to match when condition is \"text-matches\" (case-insensitive) */\n text_match?: string;\n}\n\n/**\n * Response body for POST /ai/wait-for-element (Tier 3.1)\n */\nexport interface WaitForElementByConditionResponse {\n /** Whether the condition was satisfied before timeout */\n matched: boolean;\n /** The matched element (present when matched is true) */\n element?: unknown;\n /** How long we actually waited in ms */\n waited_ms: number;\n}\n\n/**\n * Request body for POST /ai/wait-for-route-change.\n *\n * Blocks until the SPA route changes. Optionally filters by the prior\n * route (`fromRoute`) and/or the new route (`toRoute` with `matchMode`).\n * When a matching route change happened between the request arriving and\n * the subscription being set, the handler resolves immediately with\n * `elapsedMs: 0` by scanning the always-on recent-route-change buffer.\n */\nexport interface WaitForRouteChangeRequest {\n /** Only fire when the prior route equals this exact string. */\n fromRoute?: string;\n /** Only fire when the new route matches this (per `matchMode`). */\n toRoute?: string;\n /** How to compare `toRoute` against the new route. Default: `\"exact\"`. */\n matchMode?: 'exact' | 'prefix' | 'regex';\n /** Max wait in ms. Default 5000, clamped to [100, 60000]. */\n timeoutMs?: number;\n}\n\n/**\n * Response body for POST /ai/wait-for-route-change (success case).\n */\nexport interface WaitForRouteChangeResponse {\n from: string;\n to: string;\n elapsedMs: number;\n}\n\n/**\n * Selector predicate for POST /ai/wait-for-element.\n *\n * All provided fields are ANDed. At least one field should be provided;\n * otherwise the first registered element is returned.\n */\nexport interface WaitForElementPredicate {\n /** Match by element id (exact). */\n id?: string;\n /** Match by label / accessible name (case-insensitive substring). */\n label?: string;\n /** Match by data-testid attribute (exact). */\n testId?: string;\n /** CSS selector — falls back to document.querySelector if element is not in registry. */\n selector?: string;\n}\n\n/**\n * Request body for POST /ai/wait-for-element.\n *\n * Polls the in-memory registry for an element matching `predicate`. When\n * `selector` is supplied, falls back to `document.querySelector` once per\n * poll so the wait also covers elements that aren't SDK-registered.\n */\nexport interface WaitForElementRequest {\n predicate: WaitForElementPredicate;\n /**\n * Additional requirement on the matched element.\n * - `\"registered\"` (default): element exists in the registry.\n * - `\"visible\"`: element exists AND is visible per snapshot rules.\n * - `\"has-layout\"`: element exists AND `layout.width > 0 && layout.height > 0`.\n */\n requirement?: 'registered' | 'visible' | 'has-layout';\n /** Poll interval in ms. Default 100, clamped to [50, 1000]. */\n pollMs?: number;\n /** Max wait in ms. Default 5000, clamped to [100, 60000]. */\n timeoutMs?: number;\n}\n\n/**\n * Response body for POST /ai/wait-for-element (success case).\n */\nexport interface WaitForElementSuccessResponse {\n element: {\n id: string;\n label?: string;\n type?: string;\n [key: string]: unknown;\n };\n elapsedMs: number;\n}\n\n/**\n * A single step in a Tier 3.2 control batch request.\n */\nexport type ControlBatchStep =\n | {\n type: 'action';\n /** ID of the element to act on */\n element_id: string;\n /** Action name (click, type, focus, …) */\n action: string;\n /** Optional action parameters */\n params?: Record<string, unknown>;\n }\n | {\n type: 'wait';\n /** Milliseconds to sleep */\n ms: number;\n }\n | {\n type: 'snapshot';\n };\n\n/**\n * Request body for POST /control/batch (Tier 3.2)\n */\nexport interface ControlBatchRequest {\n actions: ControlBatchStep[];\n /** When true (default), stop executing on the first error */\n stop_on_error?: boolean;\n}\n\n/**\n * Per-step result in a Tier 3.2 batch response\n */\nexport interface ControlBatchStepResult {\n index: number;\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n/**\n * Response body for POST /control/batch (Tier 3.2)\n */\nexport interface ControlBatchResponse {\n results: ControlBatchStepResult[];\n completed: number;\n total: number;\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: 'GET',\n path: '/control/element/:id/react-state',\n handler: 'getElementReactState',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/element/:id/action',\n handler: 'executeElementAction',\n params: ['id'],\n bodyRequired: true,\n },\n // Phase 2.1 (plan 2026-05-03) — assert an element predicate. Returns\n // 200 + passed:true on success, 422 + passed:false on timeout.\n {\n method: 'POST',\n path: '/control/element/:id/expect',\n handler: 'expectElement',\n params: ['id'],\n bodyRequired: true,\n },\n // Phase 4.1 (plan 2026-05-03) — spawn a real Chromium tab via\n // `@qontinui/ui-bridge-headless`. Gated behind `enableHeadlessSpawn`\n // / `ENABLE_HEADLESS_SPAWN=1`; returns 503 when disabled or the\n // optional peer dependency is absent.\n {\n method: 'POST',\n path: '/control/sdk/spawn-headless',\n handler: 'spawnHeadless',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/actions/batch',\n handler: 'executeBatchAction',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/elements/rank',\n handler: 'rankElements',\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 // Phase 1.3 (plan 2026-05-03) — flat digest synthesized from snapshot +\n // console-errors + idle-status. One call instead of five.\n { method: 'GET', path: '/control/state-summary', handler: 'getStateSummary' },\n\n // Page health diagnostics — runs the spatial-coverage / layout / text-\n // signal heuristics defined in `./page-health.ts`. Byte-equivalent output\n // shape to the runner's `/control/page-health` handler so the page-health\n // skill (.claude/skills/page-health/SKILL.md) sees identical payloads\n // regardless of transport. POST (matches runner) — body reserved for\n // future per-check toggles (currently ignored).\n { method: 'POST', path: '/control/page-health', handler: 'pageHealth' },\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 // D3 Effect Calculus (Phase 2) — read-only recent predict-then-verify cycles.\n { method: 'GET', path: '/effects/recent', handler: 'getRecentEffects' },\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 { method: 'GET', path: '/control/console-errors', handler: 'getConsoleErrors' },\n { method: 'POST', path: '/control/console-errors/clear', handler: 'clearConsoleErrors' },\n\n // AI-native endpoints\n { method: 'POST', path: '/ai/search', handler: 'aiSearch', bodyRequired: true },\n { method: 'POST', path: '/ai/find', handler: 'aiFind', bodyRequired: true },\n { method: 'POST', path: '/ai/execute', handler: 'aiExecute', bodyRequired: true },\n { method: 'POST', path: '/ai/assert', handler: 'aiAssert', bodyRequired: true },\n { method: 'POST', path: '/ai/assert/batch', handler: 'aiAssertBatch', bodyRequired: true },\n { method: 'GET', path: '/ai/snapshot', handler: 'getSemanticSnapshot' },\n { method: 'GET', path: '/ai/diff', handler: 'getSemanticDiff' },\n { method: 'GET', path: '/ai/summary', handler: 'getPageSummary' },\n { method: 'POST', path: '/ai/semantic-search', handler: 'aiSemanticSearch', bodyRequired: true },\n\n // Change tracking\n {\n method: 'POST',\n path: '/ai/execute-with-diff',\n handler: 'executeWithDiff',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/ai/wait-for-change',\n handler: 'waitForChange',\n bodyRequired: true,\n },\n { method: 'GET', path: '/ai/categorize-last-diff', handler: 'categorizeLastDiff' },\n { method: 'POST', path: '/ai/scoped-diff', handler: 'getScopedDiff', bodyRequired: true },\n {\n method: 'POST',\n path: '/ai/summarize-diff',\n handler: 'summarizeDiff',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/ai/structured-changes',\n handler: 'analyzeStructuredChanges',\n bodyRequired: true,\n },\n\n // Change buffer\n { method: 'POST', path: '/ai/change-buffer/enable', handler: 'enableChangeBuffer' },\n { method: 'POST', path: '/ai/change-buffer/disable', handler: 'disableChangeBuffer' },\n { method: 'POST', path: '/ai/change-buffer/drain', handler: 'drainChangeBuffer' },\n { method: 'GET', path: '/ai/change-buffer/size', handler: 'getChangeBufferSize' },\n\n // Snapshot bookmarks (static routes before parameterized).\n //\n // The list/save endpoints use the plural `/ai/bookmarks` while the\n // per-resource endpoints historically used the singular `/ai/bookmark/:name`.\n // The plural variants are aliased to the same handlers so callers reading\n // the canonical reference (which uses plural throughout) don't hit 404s\n // when paths drift in their head.\n { method: 'POST', path: '/ai/bookmarks', handler: 'saveBookmark', bodyRequired: true },\n { method: 'GET', path: '/ai/bookmarks', handler: 'listBookmarks' },\n { method: 'GET', path: '/ai/bookmark/:name', handler: 'getBookmark', params: ['name'] },\n { method: 'GET', path: '/ai/bookmarks/:name', handler: 'getBookmark', params: ['name'] },\n {\n method: 'DELETE',\n path: '/ai/bookmark/:name',\n handler: 'deleteBookmark',\n params: ['name'],\n },\n {\n method: 'DELETE',\n path: '/ai/bookmarks/:name',\n handler: 'deleteBookmark',\n params: ['name'],\n },\n {\n method: 'GET',\n path: '/ai/bookmark/:name/diff',\n handler: 'diffFromBookmark',\n params: ['name'],\n },\n {\n method: 'GET',\n path: '/ai/bookmarks/:name/diff',\n handler: 'diffFromBookmark',\n params: ['name'],\n },\n\n // State management (static routes before parameterized)\n { method: 'GET', path: '/control/states', handler: 'getStates' },\n { method: 'GET', path: '/control/states/active', handler: 'getActiveStates' },\n { method: 'GET', path: '/control/states/snapshot', handler: 'getStateSnapshot' },\n { method: 'POST', path: '/control/states/find-path', handler: 'findPath', bodyRequired: true },\n { method: 'POST', path: '/control/states/navigate', handler: 'navigateTo', bodyRequired: true },\n { method: 'GET', path: '/control/state/:id', handler: 'getState', params: ['id'] },\n { method: 'POST', path: '/control/state/:id/activate', handler: 'activateState', params: ['id'] },\n {\n method: 'POST',\n path: '/control/state/:id/deactivate',\n handler: 'deactivateState',\n params: ['id'],\n },\n { method: 'GET', path: '/control/state-groups', handler: 'getStateGroups' },\n {\n method: 'POST',\n path: '/control/state-group/:id/activate',\n handler: 'activateStateGroup',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/state-group/:id/deactivate',\n handler: 'deactivateStateGroup',\n params: ['id'],\n },\n { method: 'GET', path: '/control/transitions', handler: 'getTransitions' },\n {\n method: 'GET',\n path: '/control/transition/:id/can-execute',\n handler: 'canExecuteTransition',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/transition/:id/execute',\n handler: 'executeTransition',\n params: ['id'],\n },\n\n // Intent endpoints\n { method: 'GET', path: '/ai/intents', handler: 'listIntents' },\n { method: 'POST', path: '/ai/intents/execute', handler: 'executeIntent', bodyRequired: true },\n { method: 'POST', path: '/ai/intents/find', handler: 'findIntent', bodyRequired: true },\n { method: 'POST', path: '/ai/intents/register', handler: 'registerIntent', bodyRequired: true },\n {\n method: 'POST',\n path: '/ai/intents/execute-from-query',\n handler: 'executeIntentFromQuery',\n bodyRequired: true,\n },\n\n // Recovery endpoints\n {\n method: 'POST',\n path: '/ai/recovery/attempt',\n handler: 'attemptRecovery',\n bodyRequired: true,\n },\n\n // Cross-app analysis endpoints\n { method: 'GET', path: '/ai/analyze/data', handler: 'analyzePageData' },\n { method: 'GET', path: '/ai/analyze/regions', handler: 'analyzePageRegions' },\n { method: 'GET', path: '/ai/analyze/structured-data', handler: 'analyzeStructuredData' },\n {\n method: 'POST',\n path: '/ai/analyze/cross-app-compare',\n handler: 'crossAppCompare',\n bodyRequired: true,\n },\n\n // Page navigation\n { method: 'POST', path: '/control/page/refresh', handler: 'pageRefresh' },\n { method: 'POST', path: '/control/page/navigate', handler: 'pageNavigate', bodyRequired: true },\n { method: 'POST', path: '/control/page/back', handler: 'pageGoBack' },\n { method: 'POST', path: '/control/page/forward', handler: 'pageGoForward' },\n { method: 'POST', path: '/control/page/evaluate', handler: 'pageEvaluate', bodyRequired: true },\n { method: 'POST', path: '/control/page/scroll', handler: 'pageScroll', bodyRequired: true },\n\n // Clipboard (relay to browser for gesture-based access)\n {\n method: 'POST',\n path: '/control/clipboard/write',\n handler: 'clipboardWrite',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/clipboard/read', handler: 'clipboardRead' },\n\n // Annotations (static routes before parameterized)\n { method: 'GET', path: '/annotations', handler: 'getAnnotations' },\n { method: 'GET', path: '/annotations/export', handler: 'exportAnnotations' },\n { method: 'GET', path: '/annotations/coverage', handler: 'getAnnotationCoverage' },\n { method: 'POST', path: '/annotations/import', handler: 'importAnnotations', bodyRequired: true },\n { method: 'GET', path: '/annotations/:id', handler: 'getAnnotation', params: ['id'] },\n {\n method: 'PUT',\n path: '/annotations/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n { method: 'DELETE', path: '/annotations/:id', handler: 'deleteAnnotation', params: ['id'] },\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 { method: 'GET', path: '/control/timeline', handler: 'getTimeline' },\n { method: 'GET', path: '/control/health', handler: 'getHealthReport' },\n { method: 'GET', path: '/control/network-chains', handler: 'getNetworkChains' },\n { method: 'POST', path: '/control/error-sessions/start', handler: 'startErrorSession' },\n { method: 'POST', path: '/control/error-sessions/end', handler: 'endErrorSession' },\n { method: 'GET', path: '/control/error-sessions', handler: 'getErrorSessions' },\n {\n method: 'POST',\n path: '/control/error-baselines/capture',\n handler: 'captureErrorBaseline',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/error-baselines/compare',\n handler: 'compareErrorBaseline',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/error-snapshots', handler: 'getErrorSnapshots' },\n { method: 'GET', path: '/control/error-report', handler: 'getErrorReport' },\n\n // Design review\n {\n method: 'GET',\n path: '/design/element/:id/styles',\n handler: 'getElementStyles',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n params: ['id'],\n },\n { method: 'POST', path: '/design/snapshot', handler: 'getDesignSnapshot' },\n {\n method: 'POST',\n path: '/design/responsive',\n handler: 'getResponsiveSnapshots',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/viewport-constraints',\n handler: 'setViewportConstraints',\n bodyRequired: true,\n },\n { method: 'POST', path: '/design/audit', handler: 'runDesignAudit' },\n {\n method: 'POST',\n path: '/design/style-guide/load',\n handler: 'loadStyleGuide',\n bodyRequired: true,\n },\n { method: 'GET', path: '/design/style-guide', handler: 'getStyleGuide' },\n { method: 'DELETE', path: '/design/style-guide', handler: 'clearStyleGuide' },\n\n // Quality evaluation\n { method: 'POST', path: '/design/evaluate', handler: 'evaluateQuality' },\n { method: 'GET', path: '/design/evaluate/contexts', handler: 'getQualityContexts' },\n { method: 'POST', path: '/design/evaluate/baseline', handler: 'saveBaseline' },\n { method: 'POST', path: '/design/evaluate/diff', handler: 'diffBaseline' },\n\n // Form state awareness\n { method: 'GET', path: '/control/forms', handler: 'getForms' },\n { method: 'POST', path: '/control/fill', handler: 'fillForm', bodyRequired: true },\n { method: 'POST', path: '/control/forms/snapshot', handler: 'snapshotForms' },\n {\n method: 'POST',\n path: '/control/forms/diff',\n handler: 'diffForms',\n bodyRequired: true,\n },\n\n // Clipboard\n { method: 'GET', path: '/control/clipboard', handler: 'getClipboard' },\n { method: 'POST', path: '/control/clipboard', handler: 'setClipboard', bodyRequired: true },\n\n // Network request monitoring (static routes before parameterized)\n { method: 'GET', path: '/control/network-requests', handler: 'getNetworkRequests' },\n {\n method: 'GET',\n path: '/control/network-requests/in-flight',\n handler: 'getNetworkRequestsInFlight',\n },\n {\n method: 'POST',\n path: '/control/network-requests/wait',\n handler: 'waitForNetworkRequest',\n bodyRequired: true,\n },\n {\n method: 'GET',\n path: '/control/network-request/:id',\n handler: 'getNetworkRequest',\n params: ['id'],\n },\n\n // Idle detection (static routes before parameterized).\n //\n // `/ai/idle-status` is a **byte-identical alias** of `/control/idle-status`\n // — same handler key, same payload. The `/control/*` form is canonical\n // (matches the `/control/*` family convention) and the `/ai/*` alias\n // exists so semantic-search / AI consumers can reach idle state under\n // the namespace they already query. Mirrors the runner's\n // `add_dual!(router, get, \"idle-status\", …)` registration at\n // `qontinui-runner/src-tauri/src/mcp/ui_bridge/errors.rs::routes`. See\n // `docs-site/docs/api/runner-features.md` for the canonicalisation rule.\n { method: 'GET', path: '/control/idle-status', handler: 'getIdleStatus' },\n { method: 'GET', path: '/ai/idle-status', handler: 'getIdleStatus' },\n { method: 'POST', path: '/control/wait-for-idle', handler: 'waitForIdle' },\n {\n method: 'POST',\n path: '/control/wait-for-targets',\n handler: 'waitForTargets',\n bodyRequired: true,\n },\n {\n method: 'GET',\n path: '/control/idle-status/:signal',\n handler: 'getIdleSignalStatus',\n params: ['signal'],\n },\n {\n method: 'POST',\n path: '/control/wait-for-idle/:signal',\n handler: 'waitForSignalIdle',\n params: ['signal'],\n },\n\n // Undo/redo awareness\n { method: 'GET', path: '/control/undo-state', handler: 'getUndoState' },\n { method: 'POST', path: '/control/undo', handler: 'executeUndo' },\n { method: 'POST', path: '/control/redo', handler: 'executeRedo' },\n\n // API discovery\n { method: 'GET', path: '/capabilities', handler: 'getCapabilities' },\n\n // Specs\n { method: 'GET', path: '/control/specs', handler: 'getSpecs' },\n\n // Heartbeat\n { method: 'POST', path: '/heartbeat', handler: 'receiveHeartbeat' },\n\n // Vision pipeline (Phase 2, plan 2026-05-13). Replaces the legacy\n // `/control/{screenshot,annotated-screenshot,element-screenshot,\n // capture-element-images,get-element-images,diagnose-stuck-screen}`\n // and `/ai/media/*` routes. The runner answers these directly; the\n // SDK exposes stubs that return `runner_required` so the route table\n // stays the single source of truth.\n { method: 'POST', path: '/vision/capture', handler: 'visionCapture' },\n { method: 'POST', path: '/vision/annotate', handler: 'visionAnnotate' },\n { method: 'POST', path: '/vision/diff', handler: 'visionDiff' },\n { method: 'POST', path: '/vision/raw', handler: 'visionRaw' },\n // Phase 4 — text-bearing outputs (OCR + VLM caption).\n { method: 'POST', path: '/vision/extract', handler: 'visionExtract' },\n { method: 'POST', path: '/vision/describe', handler: 'visionDescribe' },\n // Phase 6 — declarative analyzers + assertion DSL.\n { method: 'POST', path: '/vision/analyze', handler: 'visionAnalyze' },\n { method: 'POST', path: '/vision/assert', handler: 'visionAssert' },\n { method: 'POST', path: '/vision/baseline', handler: 'visionBaseline' },\n { method: 'GET', path: '/vision/baselines', handler: 'visionBaselinesList' },\n // Frontend → runner mutation signal (Phase 6).\n {\n method: 'POST',\n path: '/vision/mutation-occurred',\n handler: 'visionMutationOccurred',\n },\n {\n method: 'GET',\n path: '/vision/cache/:sha256',\n handler: 'visionCacheStream',\n params: ['sha256'],\n },\n { method: 'GET', path: '/vision/health', handler: 'visionHealth' },\n\n // Change observation (push-based)\n { method: 'GET', path: '/control/changes/since', handler: 'getChangesSince' },\n\n // ── Route aliases ──────────────────────────────────────────────────\n // These map commonly expected paths to existing handlers.\n\n // Design review aliases under /control/ (static before parameterized)\n { method: 'POST', path: '/control/design/snapshot', handler: 'getDesignSnapshot' },\n {\n method: 'POST',\n path: '/control/design/responsive',\n handler: 'getResponsiveSnapshots',\n bodyRequired: true,\n },\n { method: 'POST', path: '/control/design/audit', handler: 'runDesignAudit' },\n {\n method: 'GET',\n path: '/control/design/element/:id/styles',\n handler: 'getElementStyles',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n params: ['id'],\n },\n\n // Annotation aliases under /control/ (static before parameterized)\n { method: 'GET', path: '/control/annotations', handler: 'getAnnotations' },\n {\n method: 'POST',\n path: '/control/annotation/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/annotations/export', handler: 'exportAnnotations' },\n { method: 'GET', path: '/control/annotations/coverage', handler: 'getAnnotationCoverage' },\n {\n method: 'POST',\n path: '/control/annotations/import',\n handler: 'importAnnotations',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/annotation/:id', handler: 'getAnnotation', params: ['id'] },\n {\n method: 'PUT',\n path: '/control/annotation/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n {\n method: 'DELETE',\n path: '/control/annotation/:id',\n handler: 'deleteAnnotation',\n params: ['id'],\n },\n\n // History/metrics aliases under /control/\n { method: 'GET', path: '/control/action-history', handler: 'getActionHistory' },\n { method: 'GET', path: '/control/history', handler: 'getActionHistory' },\n { method: 'GET', path: '/control/metrics', handler: 'getMetrics' },\n { method: 'GET', path: '/control/interaction-metrics', handler: 'getMetrics' },\n {\n method: 'GET',\n path: '/control/element/:id/history',\n handler: 'getElementHistory',\n params: ['id'],\n },\n\n // Intent aliases under /control/ (static before parameterized)\n { method: 'GET', path: '/control/intents', handler: 'listIntents' },\n { method: 'POST', path: '/control/intents', handler: 'registerIntent', bodyRequired: true },\n {\n method: 'POST',\n path: '/control/intent/:name/execute',\n handler: 'executeIntent',\n params: ['name'],\n bodyRequired: true,\n },\n { method: 'DELETE', path: '/control/intent/:name', handler: 'deleteIntent', params: ['name'] },\n\n // AI assert-batch alias (hyphenated form)\n { method: 'POST', path: '/ai/assert-batch', handler: 'aiAssertBatch', bodyRequired: true },\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 {\n method: 'POST',\n path: '/control/page/type-into',\n handler: 'typeInto',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/read-value',\n handler: 'readValue',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/find-by-text',\n handler: 'findByText',\n bodyRequired: true,\n },\n\n // Tier 3.1 — registry-based element condition polling\n {\n method: 'POST',\n path: '/ai/wait-for-element-condition',\n handler: 'waitForElementByCondition',\n bodyRequired: true,\n },\n\n // Testing-friendliness — route-change wait\n {\n method: 'POST',\n path: '/ai/wait-for-route-change',\n handler: 'waitForRouteChange',\n },\n {\n method: 'POST',\n path: '/ai/wait-for-element',\n handler: 'waitForElementRegistered',\n bodyRequired: true,\n },\n\n // Tier 3.2 — mixed action/wait/snapshot batch\n {\n method: 'POST',\n path: '/control/batch-execute',\n handler: 'controlBatch',\n bodyRequired: true,\n },\n\n // Diagnostics\n { method: 'GET', path: '/diagnostics', handler: 'getDiagnostics' },\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 * Canonical app-agnostic interaction relay command actions.\n *\n * These are the cross-platform \"convenience\" interactions (click/type/read)\n * that the server relays verbatim over the SDK command channel (SSE for web,\n * WebSocket for the runner). The *action string* here is the single source of\n * truth shared by three sites:\n *\n * 1. `relay-handlers.ts` — `relayCommand('<action>', request)` queues it for\n * the connected browser/native tab.\n * 2. `react/commandHandlers.ts` — the browser-side `executeCommand` switch\n * MUST have a matching `case '<action>'`, otherwise the relay hits\n * `default: throw new Error('Unknown command action')` and the runner\n * silently falls back to its own Tauri webview (masking the failure).\n * 3. `native/react/commandHandlers.ts` — the React-Native relay parity case.\n *\n * The drift guard test (`relay-handlers.contract.test.ts`) asserts every entry\n * here resolves to a handler case so the browser executor can never again\n * queue an action it cannot execute. Add new app-agnostic interactions here\n * first, then wire all three sites.\n */\nexport const INTERACTION_RELAY_COMMAND_ACTIONS = [\n 'clickByText',\n 'clickBySelector',\n 'typeInto',\n 'readValue',\n 'findByText',\n] as const;\n\n/**\n * Union of the canonical interaction relay command action strings.\n */\nexport type InteractionRelayCommandAction =\n (typeof INTERACTION_RELAY_COMMAND_ACTIONS)[number];\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","// @generated from diagnostics/codes.json — do not edit\n/* eslint-disable */\n\n/**\n * Canonical UI Bridge diagnostic code vocabulary + recovery catalog.\n * Generated from `diagnostics/codes.json`. See `scripts/gen-diagnostics.ts`.\n */\n\nexport type UiBridgeErrorCode =\n | \"UB-ACTION-FAILED\"\n | \"UB-ACTION-REJECTED\"\n | \"UB-ACTION-TIMEOUT\"\n | \"UB-AMBIGUOUS-MATCH\"\n | \"UB-ASSERT-CONTRAST\"\n | \"UB-ASSERT-ELEMENT-MISSING\"\n | \"UB-ASSERT-LAYOUT\"\n | \"UB-ASSERT-TEXT-MISMATCH\"\n | \"UB-ASSERT-TIMEOUT\"\n | \"UB-ASSERT-VISIBILITY\"\n | \"UB-ELEM-BLOCKED\"\n | \"UB-ELEM-DISABLED\"\n | \"UB-ELEM-NOT-ENABLED\"\n | \"UB-ELEM-NOT-FOUND\"\n | \"UB-ELEM-NOT-INTERACTABLE\"\n | \"UB-ELEM-NOT-VISIBLE\"\n | \"UB-HEALTH-EMPTY-CONTENT-AREA\"\n | \"UB-HEALTH-EMPTY-TEXT-SIGNAL\"\n | \"UB-HEALTH-ERROR-TEXT-SIGNAL\"\n | \"UB-HEALTH-LOADING-CLASS-SIGNAL\"\n | \"UB-HEALTH-LOADING-TEXT-SIGNAL\"\n | \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\"\n | \"UB-HEALTH-LOW-SPATIAL-COVERAGE\"\n | \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\"\n | \"UB-HEALTH-NO-CONTENT-ELEMENTS\"\n | \"UB-HEALTH-OFF-SCREEN-ELEMENT\"\n | \"UB-HEALTH-SPARSE-CONTENT\"\n | \"UB-HEALTH-ZERO-SIZE-ELEMENT\"\n | \"UB-LOW-CONFIDENCE\"\n | \"UB-MULTIPLE-ELEMENTS\"\n | \"UB-NAVIGATION-ERROR\"\n | \"UB-NET-ERROR\"\n | \"UB-PAGE-LOAD-ERROR\"\n | \"UB-PARSE-ERROR\"\n | \"UB-STALE-ELEMENT\"\n | \"UB-STATE-NOT-REACHED\"\n | \"UB-UNEXPECTED-STATE\"\n | \"UB-UNKNOWN-ERROR\"\n | \"UB-UNSUPPORTED-ACTION\"\n | \"UB-VALIDATION-ERROR\"\n | \"UB-VLM-STRUCTURED-PARSE-FAIL\";\n\n/** All diagnostic codes, in stable sorted order. */\nexport const UI_BRIDGE_ERROR_CODES: readonly UiBridgeErrorCode[] = [\n \"UB-ACTION-FAILED\",\n \"UB-ACTION-REJECTED\",\n \"UB-ACTION-TIMEOUT\",\n \"UB-AMBIGUOUS-MATCH\",\n \"UB-ASSERT-CONTRAST\",\n \"UB-ASSERT-ELEMENT-MISSING\",\n \"UB-ASSERT-LAYOUT\",\n \"UB-ASSERT-TEXT-MISMATCH\",\n \"UB-ASSERT-TIMEOUT\",\n \"UB-ASSERT-VISIBILITY\",\n \"UB-ELEM-BLOCKED\",\n \"UB-ELEM-DISABLED\",\n \"UB-ELEM-NOT-ENABLED\",\n \"UB-ELEM-NOT-FOUND\",\n \"UB-ELEM-NOT-INTERACTABLE\",\n \"UB-ELEM-NOT-VISIBLE\",\n \"UB-HEALTH-EMPTY-CONTENT-AREA\",\n \"UB-HEALTH-EMPTY-TEXT-SIGNAL\",\n \"UB-HEALTH-ERROR-TEXT-SIGNAL\",\n \"UB-HEALTH-LOADING-CLASS-SIGNAL\",\n \"UB-HEALTH-LOADING-TEXT-SIGNAL\",\n \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\",\n \"UB-HEALTH-LOW-SPATIAL-COVERAGE\",\n \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\",\n \"UB-HEALTH-NO-CONTENT-ELEMENTS\",\n \"UB-HEALTH-OFF-SCREEN-ELEMENT\",\n \"UB-HEALTH-SPARSE-CONTENT\",\n \"UB-HEALTH-ZERO-SIZE-ELEMENT\",\n \"UB-LOW-CONFIDENCE\",\n \"UB-MULTIPLE-ELEMENTS\",\n \"UB-NAVIGATION-ERROR\",\n \"UB-NET-ERROR\",\n \"UB-PAGE-LOAD-ERROR\",\n \"UB-PARSE-ERROR\",\n \"UB-STALE-ELEMENT\",\n \"UB-STATE-NOT-REACHED\",\n \"UB-UNEXPECTED-STATE\",\n \"UB-UNKNOWN-ERROR\",\n \"UB-UNSUPPORTED-ACTION\",\n \"UB-VALIDATION-ERROR\",\n \"UB-VLM-STRUCTURED-PARSE-FAIL\",\n] as const;\n\nexport type DiagnosticCategory =\n | 'element'\n | 'action'\n | 'assertion'\n | 'network'\n | 'system';\n\n/**\n * Canonical recovery suggestion shape (D6). One type across every\n * failure surface: ActionFailureDetails, StructuredFailureInfo,\n * ERROR_SUGGESTIONS, getRecoverySuggestions, codes.json.recoveryTemplate.\n */\nexport interface RecoverySuggestion {\n /** Human-readable suggestion. */\n suggestion: string;\n /** Optional machine-executable command. */\n command?: string;\n /** Confidence this will help (0-1). */\n confidence: number;\n /** Whether retrying the original action may help. */\n retryable: boolean;\n /** Order hint (lower = try first). */\n priority?: number;\n}\n\nexport interface DiagnosticEntry {\n description: string;\n commonCauses: string[];\n recoveryTemplate: RecoverySuggestion[];\n category: DiagnosticCategory;\n}\n\nexport const DIAGNOSTICS: Record<UiBridgeErrorCode, DiagnosticEntry> = {\n \"UB-ACTION-FAILED\": {\n description: \"The action could not be completed.\",\n commonCauses: [\n \"The element became non-interactable mid-action\",\n \"A transient runtime error interrupted the action\",\n \"The underlying handler threw\",\n ],\n recoveryTemplate: [\n { suggestion: \"Check if the element is interactable\", confidence: 0.7, retryable: false, priority: 1 },\n { suggestion: \"Wait and retry the action\", command: \"wait 1 second then retry\", confidence: 0.6, retryable: true, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-ACTION-REJECTED\": {\n description: \"The action was rejected before execution (e.g. by a guard, policy, or validation gate).\",\n commonCauses: [\n \"A safety guard blocked the action\",\n \"The action is not permitted in the current state\",\n \"Preconditions for the action were not met\",\n ],\n recoveryTemplate: [\n { suggestion: \"Check whether the action is permitted in the current state\", confidence: 0.6, retryable: false, priority: 1 },\n { suggestion: \"Satisfy the action's preconditions and retry\", confidence: 0.5, retryable: true, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-ACTION-TIMEOUT\": {\n description: \"The action timed out waiting for a condition to be met.\",\n commonCauses: [\n \"The awaited condition can never be satisfied\",\n \"The configured timeout is too short for the operation\",\n \"The page stopped responding\",\n ],\n recoveryTemplate: [\n { suggestion: \"Increase the timeout duration (the wait gave up after ${waitDurationMs}ms)\", confidence: 0.8, retryable: true, priority: 1 },\n { suggestion: \"Check if the condition '${waitCondition}' can ever be met\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Verify the page is responding\", command: \"check page status\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"action\",\n },\n \"UB-AMBIGUOUS-MATCH\": {\n description: \"Multiple elements match with similar confidence; a single best match could not be chosen.\",\n commonCauses: [\n \"Two or more elements have near-identical text\",\n \"The search criteria are not discriminating enough\",\n \"Section context was not provided\",\n ],\n recoveryTemplate: [\n { suggestion: \"Be more specific about which element you mean\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Include the section or form name in the description\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Use the element ID directly\", confidence: 0.7, retryable: false, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ASSERT-CONTRAST\": {\n description: \"A color-contrast (accessibility) assertion failed.\",\n commonCauses: [\n \"Foreground/background contrast is below the required ratio\",\n \"A theme change reduced contrast\",\n \"The element is over a low-contrast background\",\n ],\n recoveryTemplate: [\n { suggestion: \"Adjust the color tokens to meet the required contrast ratio\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-ELEMENT-MISSING\": {\n description: \"An assertion targeted an element that does not exist.\",\n commonCauses: [\n \"The target element was never registered or rendered\",\n \"The element was removed before the assertion ran\",\n \"The selector/id is wrong\",\n ],\n recoveryTemplate: [\n { suggestion: \"Verify the element id/selector and that it is rendered before asserting\", command: \"wait for element\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-LAYOUT\": {\n description: \"A layout/geometry assertion failed (position, size, alignment, overlap).\",\n commonCauses: [\n \"The element's geometry differs from the expected layout\",\n \"A responsive breakpoint changed the layout\",\n \"The assertion ran before layout settled\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for layout to settle and re-assert\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-TEXT-MISMATCH\": {\n description: \"An assertion about element text content failed (exact/contains/regex mismatch).\",\n commonCauses: [\n \"The actual text differs from the expected text\",\n \"The text had not finished updating when asserted\",\n \"Whitespace or casing differences\",\n ],\n recoveryTemplate: [\n { suggestion: \"Re-read the element text and compare; relax to a contains/regex match if appropriate\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-TIMEOUT\": {\n description: \"An assertion timed out waiting for its condition.\",\n commonCauses: [\n \"The asserted condition never became true\",\n \"The timeout was shorter than the time the condition needs\",\n \"The page stopped updating\",\n ],\n recoveryTemplate: [\n { suggestion: \"Increase the assertion timeout or verify the condition can be met\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-VISIBILITY\": {\n description: \"An assertion about element visibility failed.\",\n commonCauses: [\n \"The element was expected visible but is hidden (or vice versa)\",\n \"The element had not rendered when the assertion ran\",\n \"An overlay changed effective visibility\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the element to reach the expected visibility and re-assert\", command: \"wait for element\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ELEM-BLOCKED\": {\n description: \"The element is blocked by another element such as a modal, overlay, or popup.\",\n commonCauses: [\n \"A modal dialog is open over the target\",\n \"A toast or notification overlay intercepts pointer events\",\n \"A full-screen loading layer is present\",\n ],\n recoveryTemplate: [\n { suggestion: \"Close the modal or popup\", command: \"click close button\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Dismiss the overlay\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for the blocking element to disappear\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-DISABLED\": {\n description: \"The element is disabled and cannot be interacted with.\",\n commonCauses: [\n \"Required prerequisite fields are not yet filled\",\n \"A guard condition keeps the control disabled\",\n \"An async dependency has not resolved\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fill in required fields first\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Complete prerequisite steps\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Wait for '${elementId}' to become enabled\", command: \"wait for element to be enabled\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-ENABLED\": {\n description: \"The element is present and visible but disabled, so it cannot be interacted with.\",\n commonCauses: [\n \"Required form fields have not been filled\",\n \"A prerequisite step in a workflow is incomplete\",\n \"The element is intentionally disabled until an async operation completes\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fill in required fields first\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Complete prerequisite steps in the form\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Wait for the element to become enabled\", command: \"wait for element to be enabled\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-FOUND\": {\n description: \"No element matching the target description or selector could be found.\",\n commonCauses: [\n \"The page had not finished loading when the action ran\",\n \"The element is rendered only after a user interaction\",\n \"The description/selector does not match any element on the page\",\n \"The element is in a different route or tab than the active one\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the page to fully load, then look for '${elementId}' again\", command: \"wait for page to load\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Use a different description for the element '${elementId}'\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Scroll the page to reveal '${elementId}'\", command: \"scroll down\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-INTERACTABLE\": {\n description: \"The element is visible and enabled but cannot receive the interaction (e.g. covered, animating, or pointer-events:none).\",\n commonCauses: [\n \"A modal or popup is overlaying the element\",\n \"A CSS animation or transition is in progress\",\n \"The element is partially outside the viewport\",\n \"pointer-events:none is set on the element or an ancestor\",\n ],\n recoveryTemplate: [\n { suggestion: \"Close any modal or popup blocking the element\", command: \"click close button\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Scroll the element into the viewport\", command: \"scroll to element\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for animations to complete\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-VISIBLE\": {\n description: \"The element exists in the DOM but is not currently visible.\",\n commonCauses: [\n \"The element is scrolled out of the viewport\",\n \"A loading overlay or modal is covering it\",\n \"A parent has display:none or visibility:hidden\",\n \"The element has zero size or no layout box\",\n ],\n recoveryTemplate: [\n { suggestion: \"Scroll to make '${elementId}' visible\", command: \"scroll to element\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Close any blocking modals or popups\", command: \"click close button\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for any loading overlays to disappear\", command: \"wait for loading\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-HEALTH-EMPTY-CONTENT-AREA\": {\n description: \"Page health: the main content area is nearly empty while the sidebar/left region has content.\",\n commonCauses: [\n \"The content panel failed to render\",\n \"A data fetch for the main view errored\",\n \"A routing issue left the content region blank\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the view and re-run the health check\", command: \"refresh page\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-EMPTY-TEXT-SIGNAL\": {\n description: \"Page health: empty-state text was detected (e.g. \\\"no results\\\", \\\"nothing here\\\").\",\n commonCauses: [\n \"A data set returned no items\",\n \"A filter excluded all results\",\n \"The expected data failed to load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Verify the data source and filters; re-run the health check after data loads\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-ERROR-TEXT-SIGNAL\": {\n description: \"Page health: error-indicating text was detected on the page.\",\n commonCauses: [\n \"An application error was rendered to the user\",\n \"A failed request surfaced an error banner\",\n \"An exception boundary rendered a fallback\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the error message and address the underlying failure before retrying\", confidence: 0.5, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOADING-CLASS-SIGNAL\": {\n description: \"Page health: a loading/skeleton/spinner CSS class was detected on a visible element.\",\n commonCauses: [\n \"A skeleton or spinner is still showing\",\n \"An async region has not resolved\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the loading indicator to clear and re-run the health check\", command: \"wait for loading\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOADING-TEXT-SIGNAL\": {\n description: \"Page health: loading-indicating text was detected, suggesting the page is not settled.\",\n commonCauses: [\n \"An async load is still in progress\",\n \"The page is stuck in a loading state\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for loading to complete and re-run the health check\", command: \"wait for loading\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\": {\n description: \"Page health: all visible elements are navigation-type, suggesting the content body is missing.\",\n commonCauses: [\n \"Only chrome/navigation rendered; the body did not\",\n \"Content failed to load behind the navigation shell\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the page and re-run the health check\", command: \"refresh page\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOW-SPATIAL-COVERAGE\": {\n description: \"Page health: rendered elements occupy a critically/abnormally small fraction of the viewport.\",\n commonCauses: [\n \"The page is still loading content\",\n \"A render error left most of the page blank\",\n \"The main content failed to mount\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the page to finish loading and re-run the health check\", command: \"wait for page to load\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\": {\n description: \"Page health: over half of interactive elements are disabled.\",\n commonCauses: [\n \"The page is gated behind an unmet precondition\",\n \"A loading state disabled most controls\",\n \"The user lacks permission for most actions\",\n ],\n recoveryTemplate: [\n { suggestion: \"Satisfy the precondition that enables the controls, then re-run the health check\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-NO-CONTENT-ELEMENTS\": {\n description: \"Page health: no elements were found in the content region.\",\n commonCauses: [\n \"The content view did not mount\",\n \"An exception prevented content rendering\",\n \"The page is stuck before content load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the page and re-run the health check\", command: \"refresh page\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-OFF-SCREEN-ELEMENT\": {\n description: \"Page health: a visible element is positioned entirely off-screen.\",\n commonCauses: [\n \"A negative-offset or transform pushed the element out of view\",\n \"A layout bug positioned the element outside the viewport\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the element's positioning/CSS; this typically indicates a layout defect\", confidence: 0.3, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-SPARSE-CONTENT\": {\n description: \"Page health: the content region has very few elements.\",\n commonCauses: [\n \"Content is only partially rendered\",\n \"A list/grid returned few or no items\",\n \"The page is mid-load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for content to finish loading and re-run the health check\", command: \"wait for loading\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-ZERO-SIZE-ELEMENT\": {\n description: \"Page health: a visible element has zero width or height.\",\n commonCauses: [\n \"A CSS layout bug collapsed the element\",\n \"Missing content gave the element no intrinsic size\",\n \"A fl/grid sizing rule produced a zero box\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the element's layout/CSS; this typically indicates a rendering defect\", confidence: 0.3, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-LOW-CONFIDENCE\": {\n description: \"The best matching element has confidence below the acceptance threshold.\",\n commonCauses: [\n \"The description does not closely match any element's text\",\n \"The confidence threshold is set higher than the actual best match\",\n \"The element label differs from the human-expected wording\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use the exact text shown on the element\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Try a different description that more closely matches the element\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Lower the confidence threshold if the match is correct\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-MULTIPLE-ELEMENTS\": {\n description: \"Multiple elements match the description; the target is ambiguous.\",\n commonCauses: [\n \"The description is too generic\",\n \"Repeated list/grid items share the same label\",\n \"Several controls have identical accessible names\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a more specific description\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Include the element position (first, second, etc.)\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Use the element ID directly\", confidence: 0.7, retryable: false, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-NAVIGATION-ERROR\": {\n description: \"Navigation to the target page failed.\",\n commonCauses: [\n \"The target URL is incorrect or unreachable\",\n \"A navigation guard blocked the route\",\n \"The route does not exist\",\n ],\n recoveryTemplate: [\n { suggestion: \"Try the navigation again\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Check if the URL is correct\", confidence: 0.6, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-NET-ERROR\": {\n description: \"A network error occurred while performing the action or loading data.\",\n commonCauses: [\n \"The backing request failed or timed out\",\n \"Connectivity was lost\",\n \"A CORS or proxy error blocked the request\",\n ],\n recoveryTemplate: [\n { suggestion: \"Retry the action once connectivity is restored\", confidence: 0.6, retryable: true, priority: 1 },\n { suggestion: \"Check network connectivity\", confidence: 0.5, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-PAGE-LOAD-ERROR\": {\n description: \"The page failed to load correctly.\",\n commonCauses: [\n \"A critical resource failed to load\",\n \"The server returned an error response\",\n \"Network connectivity was interrupted during load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Refresh the page\", command: \"refresh page\", confidence: 0.8, retryable: true, priority: 1 },\n { suggestion: \"Check network connectivity\", confidence: 0.6, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-PARSE-ERROR\": {\n description: \"Could not parse the natural language instruction.\",\n commonCauses: [\n \"The instruction is too complex or ambiguous to parse\",\n \"The instruction does not reference a recognizable action\",\n \"The instruction format is unsupported\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a simpler instruction format like \\\"click Submit button\\\"\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Use specific element names visible on the page\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-STALE-ELEMENT\": {\n description: \"The element reference is no longer attached to the DOM.\",\n commonCauses: [\n \"The component unmounted between discovery and action\",\n \"A re-render replaced the element node\",\n \"The element was detached by a parent update\",\n ],\n recoveryTemplate: [\n { suggestion: \"Re-find '${elementId}'\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Wait for page to stabilize\", command: \"wait 1 second\", confidence: 0.7, retryable: true, priority: 2 },\n ],\n category: \"element\",\n },\n \"UB-STATE-NOT-REACHED\": {\n description: \"The expected post-action state was not reached.\",\n commonCauses: [\n \"The action did not produce the expected state transition\",\n \"An async side-effect has not completed yet\",\n \"The expected state assertion is incorrect\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for state to stabilize and re-check\", command: \"wait 2 seconds\", confidence: 0.6, retryable: true, priority: 1 },\n { suggestion: \"Verify the expected state condition is correct\", confidence: 0.5, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-UNEXPECTED-STATE\": {\n description: \"The element or page is in an unexpected state.\",\n commonCauses: [\n \"The page state drifted from what the workflow assumed\",\n \"A concurrent update changed the state\",\n \"Stale state was used for the decision\",\n ],\n recoveryTemplate: [\n { suggestion: \"Refresh the page state\", command: \"refresh\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Wait for state to stabilize\", command: \"wait 2 seconds\", confidence: 0.6, retryable: true, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-UNKNOWN-ERROR\": {\n description: \"An unknown or uncategorized error occurred.\",\n commonCauses: [\n \"An unexpected runtime exception with no specific code\",\n \"An error path that has not yet been mapped to a stable code\",\n ],\n recoveryTemplate: [\n { suggestion: \"Try a different approach or check the page state\", confidence: 0.5, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-UNSUPPORTED-ACTION\": {\n description: \"The requested action type is not supported for this element or surface.\",\n commonCauses: [\n \"The action verb is not implemented for the element type\",\n \"A composite action needs to be broken into primitives\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a different action type\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Break down into simpler actions\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-VALIDATION-ERROR\": {\n description: \"The parsed action failed validation.\",\n commonCauses: [\n \"Required parameters for the action are missing\",\n \"A parameter value is out of range or the wrong type\",\n \"The instruction format is invalid\",\n ],\n recoveryTemplate: [\n { suggestion: \"Provide required parameters for the action\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Check the instruction format\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-VLM-STRUCTURED-PARSE-FAIL\": {\n description: \"The VLM Describe response could not be parsed into the closed structured schema; the prose-only response was returned with structured=null.\",\n commonCauses: [\n \"The model returned malformed or non-JSON output in JSON mode\",\n \"The structured payload did not validate against the schema\",\n \"Model-specific JSON-mode unreliability\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fall back to the prose description; retry the describe call once\", confidence: 0.4, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n};\n","/**\n * UI Bridge diagnostics — single source of truth.\n *\n * The code vocabulary, recovery catalog, and canonical `RecoverySuggestion`\n * shape (D6) are generated from `diagnostics/codes.json` into\n * `codes.generated.ts`. This barrel re-exports them and folds the previously\n * hand-maintained `ERROR_SUGGESTIONS` map and `getRecoverySuggestions()` switch\n * onto that single source (plan D6 / §5).\n */\n\nexport type {\n UiBridgeErrorCode,\n DiagnosticCategory,\n RecoverySuggestion,\n DiagnosticEntry,\n} from './codes.generated';\nexport { UI_BRIDGE_ERROR_CODES, DIAGNOSTICS } from './codes.generated';\n\nimport type { UiBridgeErrorCode, RecoverySuggestion } from './codes.generated';\nimport { DIAGNOSTICS } from './codes.generated';\n\n/**\n * Recovery suggestions per code, sourced from the generated catalog.\n *\n * Replaces the former hand-maintained `ERROR_SUGGESTIONS` map in\n * `ai/error-context.ts` (D6 — one source). Returns a defensive copy so callers\n * may sort/mutate without corrupting the catalog.\n */\nexport const ERROR_SUGGESTIONS: Record<UiBridgeErrorCode, RecoverySuggestion[]> =\n Object.fromEntries(\n (Object.keys(DIAGNOSTICS) as UiBridgeErrorCode[]).map((code) => [\n code,\n DIAGNOSTICS[code].recoveryTemplate.map((r) => ({ ...r })),\n ])\n ) as Record<UiBridgeErrorCode, RecoverySuggestion[]>;\n\n/**\n * Context map used to render `${key}` placeholders inside recovery templates.\n * Values are coerced to strings at substitution time; `undefined`/`null`\n * entries leave their placeholder untouched (treated as \"unknown key\").\n */\nexport type RecoveryRenderContext = Record<\n string,\n string | number | boolean | null | undefined\n>;\n\nconst PLACEHOLDER_RE = /\\$\\{([^}]+)\\}/g;\n\n/**\n * Substitute `${key}` placeholders in a template string from a context map.\n *\n * - Any `${key}` present (and non-nullish) in `context` is replaced with its\n * stringified value (at minimum `${elementId}` / `${waitDurationMs}`, but\n * any key is supported).\n * - Unknown placeholders (key absent, or value `undefined`/`null`) are left\n * **verbatim** and nothing is logged (per Phase 3 spec).\n */\nfunction renderTemplateString(\n template: string,\n context: RecoveryRenderContext\n): string {\n if (template.indexOf('${') === -1) return template;\n return template.replace(PLACEHOLDER_RE, (whole, key: string) => {\n const value = context[key];\n if (value === undefined || value === null) return whole;\n return String(value);\n });\n}\n\n/**\n * Render a single recovery suggestion's `suggestion` and `command` strings\n * against a failure-context map, returning a fresh object (never mutates the\n * catalog entry).\n */\nfunction renderSuggestion(\n suggestion: RecoverySuggestion,\n context: RecoveryRenderContext\n): RecoverySuggestion {\n const rendered: RecoverySuggestion = {\n ...suggestion,\n suggestion: renderTemplateString(suggestion.suggestion, context),\n };\n if (suggestion.command !== undefined) {\n rendered.command = renderTemplateString(suggestion.command, context);\n }\n return rendered;\n}\n\n/**\n * Generate recovery suggestions for an error code.\n *\n * Replaces the duplicated `getRecoverySuggestions()` switch statements in\n * `server/handlers.ts` and `ui-bridge-server/handlers.ts` (D6 — one source).\n * Unknown codes fall back to the generic `UB-UNKNOWN-ERROR` template.\n *\n * When `context` is supplied, every `${key}` placeholder in each suggestion's\n * `suggestion`/`command` is substituted from it (Phase 3 — sync failure paths\n * pass `${elementId}` / `${waitDurationMs}` / etc.). Unknown placeholders are\n * left untouched. Without `context` the static catalog template is returned\n * (defensive copy).\n */\nexport function getRecoverySuggestions(\n errorCode: UiBridgeErrorCode,\n context?: RecoveryRenderContext\n): RecoverySuggestion[] {\n const entry = DIAGNOSTICS[errorCode] ?? DIAGNOSTICS['UB-UNKNOWN-ERROR'];\n if (!context) {\n return entry.recoveryTemplate.map((r) => ({ ...r }));\n }\n return entry.recoveryTemplate.map((r) => renderSuggestion(r, context));\n}\n\n/**\n * Error codes for which retrying the original action is recommended.\n * Derived from the catalog: a code is retry-recommended when any of its\n * recovery template entries is `retryable: true`.\n */\nfunction isRetryRecommended(errorCode: UiBridgeErrorCode): boolean {\n const entry = DIAGNOSTICS[errorCode] ?? DIAGNOSTICS['UB-UNKNOWN-ERROR'];\n return entry.recoveryTemplate.some((r) => r.retryable);\n}\n\n/**\n * Structured-failure shape mirror of `core/types.ts` `ActionFailureDetails`.\n * Re-declared structurally here (rather than imported) to keep the\n * diagnostics barrel free of a back-edge into `core`; the field set is the\n * subset every failure surface populates.\n */\nexport interface BuiltActionFailureDetails {\n errorCode: UiBridgeErrorCode;\n message: string;\n elementId?: string;\n suggestedActions: RecoverySuggestion[];\n retryRecommended: boolean;\n context?: Record<string, unknown>;\n durationMs?: number;\n timeoutMs?: number;\n /** Typed-reason discriminators (Phase 3) — mirror `ActionFailureDetails`. */\n disabledReason?: 'native' | 'aria' | 'pointer-none';\n visibilityReason?: 'hidden' | 'off-screen' | 'occluded' | 'no-layout';\n staleReason?: 'unmounted' | 'rerendered' | 'detached';\n waitCondition?: string;\n waitTimedOutAfterMs?: number;\n timeoutType?: 'network' | 'navigation' | 'computation';\n}\n\n/**\n * Map a loosely-typed internal/legacy error code (the historical\n * `error(msg, 'NOT_FOUND')`-style strings used across `handlers.ts` /\n * `relay-handlers.ts`) plus its prose message to a canonical\n * `UiBridgeErrorCode`.\n *\n * Single source for `ui-bridge-server/src/error-mapper.ts` and the\n * `ui-bridge` `server/relay-handlers.ts` `error()` helper (Phase 1). The\n * legacy strings are an internal SDK convention, not a public wire vocabulary\n * (no `legacy:[]` recognition surface — D1); this mapper exists only to\n * convert them at the response boundary so `APIResponse.code` is canonical.\n *\n * Resolution order: explicit code mapping → message heuristic →\n * `UB-UNKNOWN-ERROR`.\n */\nconst INTERNAL_CODE_TO_CANONICAL: Record<string, UiBridgeErrorCode> = {\n NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n ELEMENT_NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n COMPONENT_NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n INVALID_REQUEST: 'UB-VALIDATION-ERROR',\n VALIDATION_ERROR: 'UB-VALIDATION-ERROR',\n NOT_IMPLEMENTED: 'UB-UNSUPPORTED-ACTION',\n RUNNER_REQUIRED: 'UB-ACTION-REJECTED',\n RUNNER_UNAVAILABLE: 'UB-NET-ERROR',\n RUNNER_ERROR: 'UB-NET-ERROR',\n COMMAND_FAILED: 'UB-ACTION-FAILED',\n HEADLESS_SPAWN_UNSUPPORTED_ON_RELAY: 'UB-UNSUPPORTED-ACTION',\n HEADLESS_SPAWN_DISABLED: 'UB-ACTION-REJECTED',\n HEADLESS_PEER_MISSING: 'UB-UNSUPPORTED-ACTION',\n HEADLESS_LAUNCH_FAILED: 'UB-ACTION-FAILED',\n WAIT_ERROR: 'UB-ACTION-TIMEOUT',\n PAGE_HEALTH_ERROR: 'UB-UNKNOWN-ERROR',\n QUERY_ERROR: 'UB-VALIDATION-ERROR',\n CDP_DISABLED: 'UB-ACTION-REJECTED',\n UNAUTHORIZED: 'UB-ACTION-REJECTED',\n INTERNAL_ERROR: 'UB-UNKNOWN-ERROR',\n};\n\nexport function mapInternalErrorCode(\n internalCode?: string,\n message?: string\n): UiBridgeErrorCode {\n if (internalCode) {\n // Already canonical — pass through.\n if ((DIAGNOSTICS as Record<string, unknown>)[internalCode]) {\n return internalCode as UiBridgeErrorCode;\n }\n const mapped = INTERNAL_CODE_TO_CANONICAL[internalCode];\n if (mapped) return mapped;\n // Generic `*_ERROR` convention → categorise by family below, else unknown.\n if (internalCode.endsWith('_ERROR')) {\n const m = (message ?? '').toLowerCase();\n if (m.includes('not found') || m.includes('does not exist'))\n return 'UB-ELEM-NOT-FOUND';\n if (m.includes('timeout') || m.includes('timed out'))\n return 'UB-ACTION-TIMEOUT';\n return 'UB-UNKNOWN-ERROR';\n }\n }\n\n const m = (message ?? '').toLowerCase();\n if (m.includes('not found') || m.includes('does not exist'))\n return 'UB-ELEM-NOT-FOUND';\n if (m.includes('not visible') || m.includes('hidden'))\n return 'UB-ELEM-NOT-VISIBLE';\n if (m.includes('disabled')) return 'UB-ELEM-DISABLED';\n if (m.includes('timeout') || m.includes('timed out'))\n return 'UB-ACTION-TIMEOUT';\n if (m.includes('required') || m.includes('invalid'))\n return 'UB-VALIDATION-ERROR';\n if (m.includes('network') || m.includes('disconnected'))\n return 'UB-NET-ERROR';\n\n return 'UB-UNKNOWN-ERROR';\n}\n\n/**\n * Build canonical structured failure details from an error code + prose\n * message. Single source for the `failureDetails` field added to\n * `ComponentActionResponse` / `WorkflowStepResult` in Phase 1 (and reused by\n * the server `createFailureDetails`). `suggestedActions` and\n * `retryRecommended` are both derived from the generated catalog (D6) — no\n * hand-maintained tables.\n */\nexport function buildActionFailureDetails(\n errorCode: UiBridgeErrorCode,\n message: string,\n options: {\n elementId?: string;\n context?: Record<string, unknown>;\n durationMs?: number;\n timeoutMs?: number;\n /**\n * Failure-context map for rendering `${...}` placeholders in the catalog\n * recovery templates (Phase 3). `elementId` is auto-merged in when set.\n */\n renderContext?: RecoveryRenderContext;\n /** Typed-reason discriminators (Phase 3). */\n disabledReason?: 'native' | 'aria' | 'pointer-none';\n visibilityReason?: 'hidden' | 'off-screen' | 'occluded' | 'no-layout';\n staleReason?: 'unmounted' | 'rerendered' | 'detached';\n waitCondition?: string;\n waitTimedOutAfterMs?: number;\n timeoutType?: 'network' | 'navigation' | 'computation';\n } = {}\n): BuiltActionFailureDetails {\n // The element id is always a valid `${elementId}` substitution source even\n // when the caller didn't pass an explicit renderContext.\n const renderContext: RecoveryRenderContext | undefined =\n options.renderContext || options.elementId !== undefined\n ? { elementId: options.elementId, ...options.renderContext }\n : undefined;\n\n return {\n errorCode,\n message,\n elementId: options.elementId,\n suggestedActions: getRecoverySuggestions(errorCode, renderContext),\n retryRecommended: isRetryRecommended(errorCode),\n context: options.context,\n durationMs: options.durationMs,\n timeoutMs: options.timeoutMs,\n disabledReason: options.disabledReason,\n visibilityReason: options.visibilityReason,\n staleReason: options.staleReason,\n waitCondition: options.waitCondition,\n waitTimedOutAfterMs: options.waitTimedOutAfterMs,\n timeoutType: options.timeoutType,\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 '../diagnostics';\nimport type { SSEManager } from './sse-handler';\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 /** SSE manager for streaming events (pass to enable GET /control/events/stream) */\n sseManager?: SSEManager;\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: Partial<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 if (config.useBodyParser) {\n router.use(express.json());\n }\n\n // Add authentication middleware if configured\n if (config.authenticate) {\n router.use(async (req: Request, res: Response, next: NextFunction) => {\n try {\n const authenticated = await config.authenticate!(req);\n if (!authenticated) {\n res.status(401).json(wrapError('Unauthorized', 'UNAUTHORIZED'));\n return;\n }\n next();\n } catch (error) {\n res.status(500).json(wrapError(error as Error, 'AUTH_ERROR'));\n }\n });\n }\n\n // Register routes\n for (const route of UI_BRIDGE_ROUTES) {\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch';\n const path = route.path;\n const handlerName = route.handler as keyof UIBridgeServerHandlers;\n const handler = handlers[handlerName];\n\n if (!handler) {\n console.warn(`Handler not found for route: ${route.method} ${route.path}`);\n continue;\n }\n\n router[method](\n path,\n createRouteHandler(route, handler as (...args: unknown[]) => Promise<APIResponse<unknown>>)\n );\n }\n\n // SSE streaming endpoint (outside normal route pattern — holds connection open)\n if (config.sseManager) {\n const sse = config.sseManager;\n router.get('/control/events/stream', (req: Request, res: Response) => {\n // Set SSE headers\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no'); // Disable nginx buffering\n res.flushHeaders();\n\n const types = req.query.types as string | undefined;\n const elements = req.query.elements as string | undefined;\n\n const clientId = sse.addClient(\n (data: string) => res.write(data),\n () => {\n if (!res.writableEnded) res.end();\n },\n types,\n elements\n );\n\n // Clean up on disconnect\n req.on('close', () => {\n sse.removeClient(clientId);\n });\n });\n\n // Change observation SSE stream — filters to snapshot:changed events only\n router.get('/control/changes/stream', (changesReq: Request, changesRes: Response) => {\n changesRes.setHeader('Content-Type', 'text/event-stream');\n changesRes.setHeader('Cache-Control', 'no-cache');\n changesRes.setHeader('Connection', 'keep-alive');\n changesRes.setHeader('X-Accel-Buffering', 'no');\n changesRes.flushHeaders();\n\n const clientId = sse.addClient(\n (data: string) => changesRes.write(data),\n () => {\n if (!changesRes.writableEnded) changesRes.end();\n },\n 'snapshot:changed' // Pre-filter to change events only\n );\n\n changesReq.on('close', () => {\n sse.removeClient(clientId);\n });\n });\n }\n\n return router;\n}\n\n/**\n * Create a route handler from a route definition\n */\nfunction createRouteHandler(\n route: RouteDefinition,\n handler: (...args: unknown[]) => Promise<APIResponse<unknown>>\n) {\n return async (req: Request, res: Response) => {\n try {\n // Extract params\n const args: unknown[] = [];\n\n if (route.params) {\n for (const param of route.params) {\n args.push(req.params[param]);\n }\n }\n\n // Item #4 — per-tab routing. Sniff `tabId` from query, header, and\n // body, then thread it into whichever arg the handler accepts. Body\n // wins if it already has `tabId` (caller knew what they wanted);\n // otherwise query > header. Header name matches the Next.js adapter.\n const queryTabId =\n (typeof req.query.tabId === 'string' && req.query.tabId) ||\n (typeof req.query.targetTabId === 'string' && req.query.targetTabId) ||\n undefined;\n const headerTabId =\n (typeof req.headers['x-ui-bridge-tab-id'] === 'string'\n ? (req.headers['x-ui-bridge-tab-id'] as string)\n : undefined) ?? undefined;\n const externalTabId = queryTabId || headerTabId;\n\n // Per-user tab scoping (§4.2): mirror the Next.js adapter's\n // X-Caller-User-Id sniff so the trusted-identity-bound `context`\n // reaches every relay-dispatching handler — even the zero-arg ones\n // (captureSnapshot, clearRenderLog, getElementState, …) whose body\n // / query splice can't carry `__callerUserId`.\n const headerCallerUserId =\n (typeof req.headers['x-caller-user-id'] === 'string'\n ? (req.headers['x-caller-user-id'] as string)\n : undefined) ?? undefined;\n\n // Add body when the route declares one. See nextjs.ts for the\n // per-user-scoping rationale (POST routes without `bodyRequired`\n // are context-only handlers whose signatures end at the trailing\n // `context?: HandlerContext` arg).\n if (route.bodyRequired) {\n let body = req.body;\n if (\n externalTabId &&\n body !== null &&\n typeof body === 'object' &&\n !Array.isArray(body) &&\n (body as Record<string, unknown>).tabId === undefined &&\n (body as Record<string, unknown>).targetTabId === undefined\n ) {\n body = { ...(body as Record<string, unknown>), tabId: externalTabId };\n } else if (!body && externalTabId) {\n body = { tabId: externalTabId };\n }\n if (\n headerCallerUserId &&\n body !== null &&\n typeof body === 'object' &&\n !Array.isArray(body)\n ) {\n body = { ...(body as Record<string, unknown>), __callerUserId: headerCallerUserId };\n } else if (!body && headerCallerUserId) {\n body = { __callerUserId: headerCallerUserId };\n }\n args.push(body);\n }\n\n // Add query params for GET requests. See nextjs.ts for why\n // `__callerUserId` is NOT spliced into the searchParams.\n if (route.method === 'GET') {\n const query = { ...req.query } as Record<string, unknown>;\n if (externalTabId && query.tabId === undefined && query.targetTabId === undefined) {\n query.tabId = externalTabId;\n }\n if (Object.keys(query).length > 0) {\n args.push(query);\n }\n }\n\n // Per-user tab scoping (§4.2) — trailing context arg. The adapter\n // ALWAYS supplies this so zero-arg / id-only handlers\n // (captureSnapshot, clearRenderLog, getElementState(id)) — whose\n // signatures can't carry __callerUserId in the body/query — still\n // enforce ownership when X-Caller-User-Id is present. Adds NO\n // overhead when the header is absent (context.callerUserId\n // undefined → relay falls back to primary-tab dispatch).\n args.push({ callerUserId: headerCallerUserId });\n\n const result = await handler(...args);\n // Honor APIResponse.httpStatus for endpoints that need 4xx semantics\n // (e.g. Phase 2.1 `/control/element/:id/expect` → 422 on assertion\n // failure). Strip the hint from the body so the envelope shape stays\n // stable for consumers that only know the default 200 contract.\n const httpStatus =\n typeof (result as APIResponse<unknown>).httpStatus === 'number'\n ? (result as APIResponse<unknown>).httpStatus\n : undefined;\n let body: unknown = result;\n if (httpStatus !== undefined) {\n const { httpStatus: _omit, ...rest } = result as APIResponse<unknown>;\n body = rest;\n res.status(httpStatus).json(body);\n } else {\n res.json(body);\n }\n } catch (error) {\n res.status(500).json(wrapError(error as Error, 'INTERNAL_ERROR'));\n }\n };\n}\n\n/**\n * Create Express app with UI Bridge routes\n *\n * Convenience function that creates a complete Express app with UI Bridge.\n */\nexport function createExpressApp(\n handlers: Partial<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 (also served at /status)\n app.get(['/health', '/status'], (_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: Partial<UIBridgeServerHandlers>,\n config: ExpressAdapterConfig = {}\n): Router {\n return createExpressRouter(handlers, config);\n}\n"]}
1
+ {"version":3,"sources":["../../src/server/types.ts","../../src/diagnostics/codes.generated.ts","../../src/diagnostics/index.ts","../../src/server/express.ts"],"names":["m","body"],"mappings":"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","file":"express.mjs","sourcesContent":["/**\n * UI Bridge Server Types\n *\n * Shared types for server adapters.\n */\n\nimport type { UIBridgeConfig, ElementHistoryOptions } from '../core';\nimport type { UiBridgeErrorCode } from '../diagnostics';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n BatchActionRequest,\n BatchActionResponse,\n FindRequest,\n FindResponse,\n ControlSnapshot,\n WorkflowRunRequest,\n WorkflowRunResponse,\n PageNavigateRequest,\n PageNavigationResponse,\n FillFormRequest,\n EffectRecordEntry,\n} from '../control';\nimport type { FillResult } from '../core/types';\nimport type { PageHealthReport } from './page-health';\nimport type { RenderLogEntry, RenderLogEntryType } from '../render-log';\nimport type {\n SearchCriteria,\n SearchResponse,\n NLActionRequest,\n NLActionResponse,\n AssertionRequest,\n AssertionResult,\n BatchAssertionRequest,\n BatchAssertionResult,\n SemanticSnapshot,\n SemanticDiff,\n SemanticSearchCriteria,\n SemanticSearchResponse,\n Intent,\n IntentSearchResponse,\n IntentExecutionResult,\n RecoveryAttemptRequest,\n RecoveryAttemptResult,\n PageDataMap,\n PageRegionMap,\n StructuredDataExtraction,\n CrossAppComparisonReport,\n ComponentInfo,\n ActionWithDiffRequest,\n ActionDiffResult,\n ChangePredicate,\n WaitForChangeOptions,\n CategorizedDiff,\n ChangeBufferDrainResult,\n SnapshotBookmark,\n FormsResponse,\n StructuredChangeAnalysis,\n FormSnapshot,\n FormDiff,\n FindResult,\n FindContext,\n} from '../ai';\nimport type {\n InteractionStateName,\n ElementDesignData,\n StateStyles,\n ResponsiveSnapshot,\n} from '../core/types';\nimport type { StyleGuideConfig, StyleAuditReport } from '../specs/style-types';\nimport type {\n QualityEvaluationReport,\n SnapshotDiffReport,\n EvaluateRequest,\n} from '../specs/quality-types';\nimport type {\n UIState,\n UIStateGroup,\n UITransition,\n PathResult,\n TransitionResult,\n NavigationResult,\n StateSnapshot,\n} from '../core';\nimport type { ElementAnnotation, AnnotationConfig, AnnotationCoverage } from '../annotations';\nimport type { CapturedError, AnyCapturedEvent } from '../debug/browser-capture-types';\nimport type { FingerprintedEvent } from '../debug/error-fingerprint';\nimport type { TimelineEntry } from '../debug/error-timeline';\nimport type { HealthReport } from '../debug/health-score';\nimport type { ErrorSessionSummary, BaselineComparison } from '../debug/error-session';\nimport type { NetworkChain } from '../debug/network-chain';\nimport type { ErrorSnapshot } from '../debug/error-snapshot';\nimport type { CompositeIdleStatus, SignalStatus } from '../idle';\nimport type { NetworkRequestEntry, WaitForRequestOptions, WaitForRequestResult } from '../network';\nimport type { UndoRedoState } from '../undo';\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 the diagnostics `mapInternalErrorCode`).\n */\n code?: UiBridgeErrorCode;\n /** Request timestamp */\n timestamp: number;\n /** Response metadata (staleness, diagnostics) */\n _meta?: {\n stale?: boolean;\n staleSinceMs?: number;\n cacheAgeMs?: number;\n fallback?: boolean;\n reason?: string;\n };\n /** Recovery suggestions for error responses */\n suggestions?: string[];\n /**\n * Optional HTTP status code hint. When set, the framework adapter\n * (Express / Next.js) will use this code instead of the default 200.\n * Used by endpoints that need 4xx semantics on logical failure (e.g.\n * Phase 2.1 `/control/element/:id/expect` returns 422 when the asserted\n * predicate doesn't hold). Stripped from the JSON body before send so\n * external consumers see the same envelope shape.\n */\n httpStatus?: number;\n}\n\n/**\n * Render log query parameters\n */\n/**\n * One runner-owned webview window, as returned by `listWindows()`\n * (`GET /control/runner-windows`). The wire shape mirrors the runner's\n * `ui_bridge_list_runner_windows_handler` exactly — no field remapping.\n */\nexport interface RunnerWindow {\n /** The window's Tauri label — the value to pass as `windowLabel`. */\n label: string;\n /** `'main'` for the runner's primary window, `'secondary'` for a pop-out. */\n kind: 'main' | 'secondary';\n /** The window's title, or `null` if unavailable. */\n title: string | null;\n}\n\n/**\n * Response payload of `listWindows()` (`GET /control/runner-windows`).\n */\nexport interface RunnerWindowsList {\n /** Number of windows returned. */\n count: number;\n /** The runner process's own webview windows, sorted by `label`. */\n windows: RunnerWindow[];\n}\n\n/**\n * Request body for `POST /control/page/evaluate` (`pageEvaluate`).\n *\n * The body is forwarded verbatim to the runner, so any additional fields are\n * preserved (index signature); the two known fields are typed for\n * discoverability.\n */\nexport interface PageEvaluateRequest {\n /** JavaScript expression to evaluate in the target window. */\n expression: string;\n /**\n * Target a runner pop-out window discoverable via `listWindows()`;\n * omit → the main window. The runner reads this from the request body\n * (`EvaluateQuery.window_label`) or the `?windowLabel=` query, **query\n * wins** (`resolve_evaluate_window`); unknown labels yield a structured\n * error naming the missing window.\n */\n windowLabel?: string;\n /** Forward-compatible: extra fields are forwarded to the runner verbatim. */\n [key: string]: unknown;\n}\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 * Browser events response — returned by GET /control/browser-events\n */\nexport interface BrowserEventsResponse {\n /** Raw events (filtered by params) */\n events: AnyCapturedEvent[] | CapturedError[];\n /** Total count of returned events */\n count: number;\n /** Deduplicated event groups (only when deduplicate=true) */\n deduplicated?: FingerprintedEvent[];\n /** Number of unique fingerprints (only when deduplicate=true) */\n uniqueCount?: number;\n}\n\n/**\n * Phase 2.1 (plan 2026-05-03) — body for POST /control/element/:id/expect.\n * Reuses the closed `WaitForElementState` enum from the SDK runtime so the\n * predicate evaluator is shared with `/ai/wait-for-element`. The critical\n * semantic difference: this endpoint **fails the request** with HTTP 422\n * when the predicate doesn't hold within `timeout`, instead of returning\n * 200 + `found:false`.\n */\nexport interface ElementExpectRequest {\n /** Predicate to assert. Closed enum mirroring WaitForElementState. */\n state:\n | 'present'\n | 'visible'\n | 'enabled'\n | 'disabled'\n | 'value-not-empty'\n | 'value-empty'\n | 'checked'\n | 'unchecked'\n | 'absent';\n /** Timeout in ms. Default 5000, capped at 30000. */\n timeout?: number;\n /** Poll interval in ms. Default 100, minimum 10. */\n pollMs?: number;\n}\n\n/**\n * Response from POST /control/element/:id/expect. `passed:true` rides on\n * HTTP 200; `passed:false` rides on HTTP 422 (set via `APIResponse.httpStatus`).\n */\nexport interface ElementExpectResponse {\n /** Whether the predicate held within the timeout window. */\n passed: boolean;\n /**\n * Element snapshot at the moment the predicate flipped true (on pass) or\n * the most recent registered snapshot before timeout (on fail). `null`\n * when the element was never registered during the wait.\n */\n observedState: {\n registered: boolean;\n state: Record<string, unknown> | null;\n } | null;\n /** Wall-clock duration of the wait in ms. */\n durationMs: number;\n}\n\n/**\n * Phase 1.3 (plan 2026-05-03) — flat machine-readable digest of \"is the\n * page in a sensible state right now?\". Synthesized from the live snapshot,\n * console-errors buffer, and idle detector so the caller spends one round-\n * trip instead of four. Distinct from the NL `/ai/page-summary` digest.\n */\nexport interface StateSummary {\n /** Count of snapshot elements that are both layout-positioned and visible. */\n visibleElementCount: number;\n /** True when the snapshot's `modalStack` has at least one entry. */\n modalOpen: boolean;\n /** True when the console-errors buffer has at least one entry. */\n hasErrors: boolean;\n /**\n * Pass-through of the idle detector's composite status, or `null` when\n * idle detection is disabled. Lets callers gate work on idle without\n * issuing a separate `/control/idle-status` round-trip.\n */\n idleSignals: CompositeIdleStatus | null;\n /** Number of components currently registered. */\n registeredComponents: number;\n /** Current page route, or `null` when undeterminable. */\n route: string | null;\n /** Currently active tab id (for tab-based apps), or `null` when not provided. */\n activeTab: string | null;\n}\n\n/**\n * Phase 4.1 (plan 2026-05-03) — body for POST /control/sdk/spawn-headless.\n *\n * Wraps the already-shipped `@qontinui/ui-bridge-headless` package's\n * `launchHeadlessTab` so callers can spin up a real Chromium tab for testing\n * without manually opening a browser. The endpoint is gated behind the\n * `enableHeadlessSpawn` config flag (or `ENABLE_HEADLESS_SPAWN=1`); disabled\n * by default because it pulls in Playwright + Chromium at runtime.\n */\nexport interface SpawnHeadlessRequest {\n /** Target URL the headless tab should navigate to. Must start with http:// or https://. */\n url: string;\n /**\n * Max time (ms) to wait for the headless client to register a tab over UI Bridge.\n * Default 30000, capped at 60000.\n */\n timeoutMs?: number;\n /**\n * Auto-close timer (seconds). Tracked spawned tabs are also closed on\n * server shutdown. Default 300.\n */\n keepAliveSecs?: number;\n /**\n * Run Chromium without a visible window. Default `true` — the whole point\n * of this endpoint is \"no manual browser\".\n */\n headless?: boolean;\n /** Viewport size override. Default 1280x720. */\n viewport?: { width: number; height: number };\n}\n\n/**\n * Phase 4.1 — response from POST /control/sdk/spawn-headless.\n */\nexport interface SpawnHeadlessResponse {\n /** True when the tab was launched (regardless of UI Bridge registration). */\n spawned: boolean;\n /** Tab id assigned by the relay when registration succeeded; `null` otherwise. */\n tabId: string | null;\n /** True when the relay reported the tab as connected before timeout. */\n uiBridgeRegistered: boolean;\n /** URL the page actually ended up at after navigation. */\n finalUrl: string;\n}\n\n/**\n * Per-user tab scoping context (§4.2) — threaded as the final positional\n * argument of every relay-dispatching handler.\n *\n * The Next.js adapter populates `callerUserId` from the trusted\n * `X-Caller-User-Id` request header (set by the consumer's auth gate from\n * the authenticated identity — NEVER from a browser-supplied value). The\n * relay-handlers layer lifts `callerUserId` into `ownerCheck.userId` on the\n * downstream `relay.queueCommand` call so the relay refuses to dispatch\n * the command to a tab owned by a different user.\n *\n * The reason this is a dedicated final-arg `context` object instead of a\n * field in the request body / query: many handlers (e.g. `captureSnapshot`,\n * `clearRenderLog`, `getElementState(id)`) have zero-arg or args-without-bag\n * signatures, so there is no body/query for the adapter to splice\n * `__callerUserId` into. Without this explicit channel, those handlers\n * would bypass per-user scoping entirely and silently dispatch to whichever\n * tab happened to be `primaryTabId` — including tabs owned by other users.\n */\nexport interface HandlerContext {\n /**\n * Authenticated caller's user id, as supplied by the consumer's auth gate\n * via the `X-Caller-User-Id` header. When present, the relay restricts\n * dispatch to tabs owned by this user. When absent, the call is treated\n * as a trusted admin / server-side call and the unfiltered primary-tab\n * fallback applies.\n */\n callerUserId?: string;\n}\n\n/**\n * Server handler interface\n *\n * Implementations provide these handlers for different frameworks.\n *\n * Per-user tab scoping (§4.2): handlers that dispatch to a browser tab\n * accept an optional final `context?: HandlerContext` parameter. The\n * Next.js / Express adapters thread the authenticated caller's user id\n * through that parameter so the relay can enforce per-user dispatch\n * boundaries.\n */\nexport interface UIBridgeServerHandlers {\n // Render log endpoints\n getRenderLog: (\n query?: RenderLogQuery,\n context?: HandlerContext\n ) => Promise<APIResponse<RenderLogEntry[]>>;\n clearRenderLog: (context?: HandlerContext) => Promise<APIResponse<void>>;\n captureSnapshot: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getRenderLogPath: () => Promise<APIResponse<{ path: string }>>;\n\n // Control endpoints\n getElements: (\n options?: {\n recency?: string;\n /** Case-insensitive substring filter on the element's title DOM attribute */\n title?: string;\n /** Case-insensitive substring filter on the element's aria-label DOM attribute */\n aria_label?: string;\n /** Case-insensitive substring filter on the element's visible text / label */\n text?: string;\n /**\n * Phase 3.2 (plan 2026-05-03) — return only elements whose `reveals`\n * array contains an entry that matches this query. Bi-directional glob\n * match: query may be a concrete id matching a `*`-glob entry, or a\n * `*`-glob matching concrete entries.\n */\n revealsAny?: string;\n /**\n * Target a runner pop-out window discoverable via `listWindows()`;\n * omit → the main window. Serialized as the `?windowLabel=` query\n * parameter (the runner reads it from the query on `GET\n * /control/elements`); unknown labels yield a structured error naming\n * the missing window.\n */\n windowLabel?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['elements']>>;\n /**\n * Enumerate the runner process's OWN webview windows — the main window plus\n * any pop-out terminal windows — so callers can discover valid `windowLabel`\n * targets before issuing a window-scoped command. Maps to\n * `GET /control/runner-windows`.\n *\n * **Runner-only.** This is answered by the qontinui-runner, which owns the\n * Tauri webviews. Non-runner server contexts (a plain React-app server, the\n * relay's browser-tab path) host no runner windows and return a\n * `NOT_IMPLEMENTED` error — discover windows via direct HTTP to the runner.\n * Distinct from `/control/windows`, which enumerates OS desktop windows.\n */\n listWindows: (context?: HandlerContext) => Promise<APIResponse<RunnerWindowsList>>;\n getElement: (\n id: string,\n options?: { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['elements'][0]>>;\n getElementState: (id: string, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getElementReactState: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n executeElementAction: (\n id: string,\n request: ControlActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ControlActionResponse>>;\n executeBatchAction: (\n request: BatchActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<BatchActionResponse>>;\n /**\n * Rank snapshot elements by natural-language query against the\n * structured disambiguation metadata (variant, position, color,\n * contextPath, label, type). Returns scored matches.\n *\n * Free-text input is tokenised and matched token-bag style; structured\n * filters (type, origin, visibleOnly, contextPathContains) act as hard\n * filters. See `@qontinui/ui-bridge/core` `findElements` for the\n * scoring model.\n */\n rankElements: (\n request: {\n text?: string;\n type?: string;\n variant?: string;\n position?: string;\n color?: string;\n contextPathContains?: string;\n origin?: 'hook' | 'auto';\n visibleOnly?: boolean;\n limit?: number;\n minScore?: number;\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n Array<{\n id: string;\n score: number;\n reasons: string[];\n element: ControlSnapshot['elements'][0];\n }>\n >\n >;\n\n // Component endpoints\n // F2 (Direction B): `data` is `{components: [...]}` so the envelope matches\n // the runner's direct `/ui-bridge/control/components` route and aligns with\n // every other rich endpoint convention (object-shaped `data`).\n getComponents: (\n options?: {\n recency?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ components: ControlSnapshot['components'] }>>;\n getComponent: (\n id: string,\n options?: { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['components'][0]>>;\n getComponentState: (\n id: string,\n context?: HandlerContext\n ) => 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 context?: HandlerContext\n ) => Promise<APIResponse<ComponentActionResponse>>;\n\n // Find endpoints\n find: (\n request?: FindRequest & { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResponse>>;\n /**\n * @deprecated Use find() instead\n */\n discover: (\n request?: FindRequest & { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResponse>>;\n getControlSnapshot: (\n request?: {\n targetTabId?: string;\n url?: string;\n skipSettle?: boolean | string;\n settleTimeout?: number | string;\n recency?: string;\n /**\n * Item 1 filter: when `true`, drop elements with `kind: \"content\"`\n * (semantic `data-ui-bridge-content` entries) from the response.\n * Default `false` — include everything.\n */\n interactiveOnly?: boolean | string;\n /** snake_case alias for `interactiveOnly`. */\n interactive_only?: boolean | string;\n /**\n * Manual-test remediation 2026-05-10 (Item 2) filter: when `true`,\n * keep only elements that report disabled by any of these signals in\n * the snapshot's `state`: `disabled === true`,\n * `ariaDisabled === \"true\"`, or `enabled === false`. Default `false` —\n * include everything. All other snapshot metadata (route, activeTab,\n * registration, viewport, errorSummary) is preserved unchanged.\n */\n withDisabledOnly?: boolean | string;\n /** snake_case alias for `withDisabledOnly`. */\n with_disabled_only?: boolean | string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot>>;\n\n // Vision pipeline endpoints — runner-direct; SDK stubs only.\n visionCapture: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionAnnotate: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionDiff: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionRaw: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionCacheStream: (sha256: string, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n visionHealth: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n // Phase 4 — text-bearing outputs.\n visionExtract: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionDescribe: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n // Phase 6 — analyzers + assertion DSL + baselines + frontend mutation signal.\n visionAnalyze: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionAssert: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionBaseline: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionBaselinesList: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n visionMutationOccurred: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Workflow endpoints\n getWorkflows: (\n options?: {\n recency?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['workflows']>>;\n runWorkflow: (\n id: string,\n request?: WorkflowRunRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<WorkflowRunResponse>>;\n getWorkflowStatus: (\n runId: string,\n context?: HandlerContext\n ) => Promise<APIResponse<WorkflowRunResponse>>;\n\n // Debug endpoints\n getActionHistory: (\n limit?: number,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown[]>>;\n // D3 Effect Calculus (Phase 2) — read-only recent predict-then-verify\n // cycles from the process-global effect store. Newest-first; `limit` caps\n // the slice (omitted = all retained, default ring-buffer cap 100).\n getRecentEffects: (\n options?: { limit?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<EffectRecordEntry[]>>;\n getMetrics: () => Promise<APIResponse<unknown>>;\n highlightElement: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getElementTree: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getConsoleErrors: (\n params?: {\n since?: number;\n /**\n * Monotonic id cursor — return only entries with `id > sinceId`.\n * Paired with `nextSinceId` in the ungrouped response for pagination.\n * Takes precedence over the legacy `since` timestamp filter when both\n * are provided.\n */\n sinceId?: number;\n limit?: number;\n group?: boolean;\n groupBy?: 'fingerprint' | 'message' | 'source';\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n | {\n errors: CapturedError[];\n count: number;\n /** Cursor for the next call — last returned entry's id, or `sinceId` if empty. */\n nextSinceId?: number;\n /** Lifetime total of entries evicted from the underlying buffer. */\n droppedCount?: number;\n /** Current buffer size (not filtered by level/since). */\n bufferedCount?: number;\n }\n | { groups: unknown[]; totalErrors: number; totalGroups: number }\n >\n >;\n clearConsoleErrors: (context?: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n\n // AI-native endpoints\n aiSearch: (\n criteria: SearchCriteria,\n context?: HandlerContext\n ) => Promise<APIResponse<SearchResponse>>;\n aiFind: (\n request: {\n query: string;\n context?: FindContext;\n confidenceThreshold?: number;\n /**\n * B2 — strict literal-match mode. When `true`, returns only elements\n * with a case-insensitive exact match against id / labelText /\n * ariaLabel / textContent / title / placeholder / value / name; no\n * fuzzy fallback. Default `false` keeps fuzzy behaviour.\n */\n strict?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResult>>;\n aiExecute: (\n request: NLActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<NLActionResponse>>;\n aiAssert: (\n request: AssertionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<AssertionResult>>;\n aiAssertBatch: (\n request: BatchAssertionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<BatchAssertionResult>>;\n getSemanticSnapshot: (\n options?: {\n includeForms?: string | boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticSnapshot>>;\n getSemanticDiff: (\n since?: number,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n getPageSummary: (context?: HandlerContext) => Promise<APIResponse<string>>;\n\n // Change tracking endpoints\n executeWithDiff: (\n request: ActionWithDiffRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ActionDiffResult>>;\n waitForChange: (\n request: {\n predicate: ChangePredicate;\n options?: WaitForChangeOptions;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff>>;\n categorizeLastDiff: (context?: HandlerContext) => Promise<APIResponse<CategorizedDiff | null>>;\n getScopedDiff: (\n request: {\n scope: string;\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n // Budget-aware diff summary\n summarizeDiff: (\n request: {\n budget: number;\n includeIds?: boolean;\n includeCategory?: boolean;\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ summary: string }>>;\n // Structured change analysis (table/list-aware)\n analyzeStructuredChanges: (\n request: {\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<StructuredChangeAnalysis>>;\n\n // Change buffer endpoints\n enableChangeBuffer: (context?: HandlerContext) => Promise<APIResponse<{ enabled: boolean }>>;\n disableChangeBuffer: (context?: HandlerContext) => Promise<APIResponse<{ enabled: boolean }>>;\n drainChangeBuffer: (\n context?: HandlerContext\n ) => Promise<APIResponse<ChangeBufferDrainResult>>;\n getChangeBufferSize: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ size: number; enabled: boolean }>>;\n\n // Snapshot bookmark endpoints\n saveBookmark: (\n request: { name: string },\n context?: HandlerContext\n ) => Promise<APIResponse<SnapshotBookmark>>;\n getBookmark: (name: string, context?: HandlerContext) => Promise<APIResponse<SnapshotBookmark>>;\n deleteBookmark: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ deleted: boolean }>>;\n listBookmarks: (context?: HandlerContext) => Promise<APIResponse<string[]>>;\n diffFromBookmark: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n\n // Semantic search (embedding-based)\n aiSemanticSearch: (\n criteria: SemanticSearchCriteria,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticSearchResponse>>;\n\n // State management endpoints\n getStates: (context?: HandlerContext) => Promise<APIResponse<UIState[]>>;\n getState: (id: string, context?: HandlerContext) => Promise<APIResponse<UIState>>;\n getActiveStates: (context?: HandlerContext) => Promise<APIResponse<UIState[]>>;\n activateState: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n deactivateState: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getStateGroups: (context?: HandlerContext) => Promise<APIResponse<UIStateGroup[]>>;\n activateStateGroup: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n deactivateStateGroup: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getTransitions: (context?: HandlerContext) => Promise<APIResponse<UITransition[]>>;\n canExecuteTransition: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ canExecute: boolean; reason?: string }>>;\n executeTransition: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<TransitionResult>>;\n findPath: (\n request: { targetStates: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<PathResult>>;\n navigateTo: (\n request: { targetStates: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<NavigationResult>>;\n getStateSnapshot: (context?: HandlerContext) => Promise<APIResponse<StateSnapshot>>;\n\n // Intent endpoints\n executeIntent: (\n request: {\n intentId: string;\n params?: Record<string, unknown>;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentExecutionResult>>;\n findIntent: (\n request: { query: string },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentSearchResponse>>;\n listIntents: (context?: HandlerContext) => Promise<APIResponse<Intent[]>>;\n registerIntent: (intent: Intent, context?: HandlerContext) => Promise<APIResponse<Intent>>;\n executeIntentFromQuery: (\n request: {\n query: string;\n params?: Record<string, unknown>;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentExecutionResult>>;\n deleteIntent: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ deleted: boolean }>>;\n\n // Recovery endpoints\n attemptRecovery: (\n request: RecoveryAttemptRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<RecoveryAttemptResult>>;\n\n // Cross-app analysis endpoints\n analyzePageData: (context?: HandlerContext) => Promise<APIResponse<PageDataMap>>;\n analyzePageRegions: (context?: HandlerContext) => Promise<APIResponse<PageRegionMap>>;\n analyzeStructuredData: (\n context?: HandlerContext\n ) => Promise<APIResponse<StructuredDataExtraction>>;\n crossAppCompare: (\n request: {\n sourceSnapshot: SemanticSnapshot;\n targetSnapshot: SemanticSnapshot;\n sourceComponents?: ComponentInfo[];\n targetComponents?: ComponentInfo[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<CrossAppComparisonReport>>;\n\n // Page navigation endpoints\n pageRefresh: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageNavigate: (\n request: PageNavigateRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<PageNavigationResponse>>;\n pageGoBack: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageGoForward: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageEvaluate: (\n request: PageEvaluateRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n pageScroll: (request: unknown, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Clipboard endpoints (browser gesture-based)\n clipboardWrite: (request: unknown, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n clipboardRead: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Annotation endpoints\n getAnnotations: (\n context?: HandlerContext\n ) => Promise<APIResponse<Record<string, ElementAnnotation>>>;\n getAnnotation: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementAnnotation>>;\n setAnnotation: (\n id: string,\n annotation: ElementAnnotation,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementAnnotation>>;\n deleteAnnotation: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n importAnnotations: (\n config: AnnotationConfig,\n context?: HandlerContext\n ) => Promise<APIResponse<{ count: number }>>;\n exportAnnotations: (context?: HandlerContext) => Promise<APIResponse<AnnotationConfig>>;\n getAnnotationCoverage: (\n context?: HandlerContext\n ) => Promise<APIResponse<AnnotationCoverage>>;\n\n // Performance diagnostics endpoints\n getPerformanceEntries: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n clearPerformanceEntries: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ cleared: boolean }>>;\n getBrowserEvents: (\n params?: {\n type?: string;\n since?: number;\n limit?: number;\n severity?: string;\n deduplicate?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<BrowserEventsResponse>>;\n getTimeline: (\n params?: {\n since?: number;\n limit?: number;\n minSeverity?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ entries: TimelineEntry[]; count: number }>>;\n\n // Health score endpoint\n getHealthReport: (\n params?: { windowMs?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<HealthReport>>;\n\n // Network chain endpoints\n getNetworkChains: (\n params?: {\n since?: number;\n limit?: number;\n failuresOnly?: boolean;\n url?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ chains: NetworkChain[]; count: number }>>;\n\n // Error session endpoints\n startErrorSession: (\n request: { label?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ sessionId: string }>>;\n endErrorSession: (\n context?: HandlerContext\n ) => Promise<APIResponse<ErrorSessionSummary | null>>;\n getErrorSessions: (context?: HandlerContext) => Promise<APIResponse<ErrorSessionSummary[]>>;\n captureErrorBaseline: (\n request: { label: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ label: string; capturedAt: number; fingerprintCount: number }>>;\n compareErrorBaseline: (\n request: { label: string },\n context?: HandlerContext\n ) => Promise<APIResponse<BaselineComparison | null>>;\n\n // Error snapshots (auto-captured on significant errors)\n getErrorSnapshots: (\n params?: {\n limit?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ snapshots: ErrorSnapshot[]; count: number }>>;\n\n // Composite error report (health + recent errors + session in one call)\n getErrorReport: (\n context?: HandlerContext\n ) => Promise<\n APIResponse<{\n health: HealthReport;\n recentErrors: AnyCapturedEvent[];\n activeSession: ErrorSessionSummary | null;\n snapshots: ErrorSnapshot[];\n }>\n >;\n\n // Design review endpoints\n getElementStyles: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementDesignData>>;\n getElementStateStyles: (\n id: string,\n request: { states?: InteractionStateName[] },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elementId: string; stateStyles: StateStyles[] }>>;\n getDesignSnapshot: (\n request?: {\n elementIds?: string[];\n includePseudoElements?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elements: ElementDesignData[]; timestamp: number }>>;\n getResponsiveSnapshots: (\n request: {\n viewports?: Record<string, number>;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ResponsiveSnapshot[]>>;\n setViewportConstraints: (\n request: { width?: number; restore?: boolean },\n context?: HandlerContext\n ) => Promise<\n APIResponse<{\n success: boolean;\n viewportWidth: number;\n constrainedWidth: number;\n timestamp: number;\n }>\n >;\n runDesignAudit: (\n request?: {\n guide?: StyleGuideConfig;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<StyleAuditReport>>;\n loadStyleGuide: (\n request: {\n guide: StyleGuideConfig;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ loaded: boolean }>>;\n getStyleGuide: (context?: HandlerContext) => Promise<APIResponse<StyleGuideConfig | null>>;\n clearStyleGuide: (context?: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n\n // Quality evaluation endpoints\n evaluateQuality: (\n request?: EvaluateRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<QualityEvaluationReport>>;\n getQualityContexts: (\n context?: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; description: string }>>>;\n saveBaseline: (\n request?: {\n label?: string;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ saved: boolean; elementCount: number }>>;\n diffBaseline: (\n request?: { elementIds?: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<SnapshotDiffReport>>;\n\n // Form state awareness endpoints\n getForms: (context?: HandlerContext) => Promise<APIResponse<FormsResponse>>;\n fillForm: (\n request: FillFormRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<FillResult>>;\n snapshotForms: (context?: HandlerContext) => Promise<APIResponse<FormSnapshot>>;\n diffForms: (\n request: {\n before: FormSnapshot;\n after: FormSnapshot;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<FormDiff>>;\n\n // Clipboard endpoints\n getClipboard: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ text: string | null; formats: string[] }>>;\n setClipboard: (\n request: {\n text: string;\n html?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ written: boolean; formats: string[] }>>;\n\n // Network request monitoring endpoints\n getNetworkRequests: (\n params?: {\n status?: string;\n method?: string;\n urlPattern?: string;\n failuresOnly?: boolean;\n since?: number;\n limit?: number;\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<{ requests: NetworkRequestEntry[]; count: number; inFlightCount: number }>\n >;\n\n getNetworkRequestsInFlight: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ requests: NetworkRequestEntry[]; count: number }>>;\n\n waitForNetworkRequest: (\n request: WaitForRequestOptions,\n context?: HandlerContext\n ) => Promise<APIResponse<WaitForRequestResult>>;\n\n getNetworkRequest: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<NetworkRequestEntry>>;\n\n // Idle detection endpoints\n getIdleStatus: (context?: HandlerContext) => Promise<APIResponse<CompositeIdleStatus>>;\n getIdleSignalStatus: (\n signal: string,\n context?: HandlerContext\n ) => Promise<APIResponse<SignalStatus>>;\n waitForIdle: (\n request?: {\n timeout?: number;\n minStableMs?: number;\n exclude?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<CompositeIdleStatus>>;\n waitForSignalIdle: (\n signal: string,\n request?: { timeout?: number; minStableMs?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<SignalStatus>>;\n waitForTargets: (\n request: {\n targets: Array<string | { indicator: string }>;\n timeout?: number;\n minStableMs?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<Record<string, SignalStatus>>>;\n\n // Undo/redo awareness endpoints\n getUndoState: (context?: HandlerContext) => Promise<APIResponse<UndoRedoState>>;\n executeUndo: (context?: HandlerContext) => Promise<APIResponse<{ executed: boolean }>>;\n executeRedo: (context?: HandlerContext) => Promise<APIResponse<{ executed: boolean }>>;\n\n // Phase 1.3 (plan 2026-05-03) — flat machine-readable digest of \"is the\n // page in a sensible state right now?\" so callers don't have to fan out\n // five round-trips (snapshot + console-errors + idle-status + …) just to\n // pre-flight an interaction. Distinct from `/ai/page-summary` which\n // returns NL prose for human consumption.\n getStateSummary: () => Promise<APIResponse<StateSummary>>;\n\n // Phase 2.1 (plan 2026-05-03) — assert an element predicate.\n // Returns 200 + passed:true on success, 422 + passed:false on timeout\n // (set via APIResponse.httpStatus). Shares predicate evaluation with\n // `/ai/wait-for-element` so semantics stay aligned.\n expectElement: (\n id: string,\n request: ElementExpectRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementExpectResponse>>;\n\n // Phase 4.1 (plan 2026-05-03) — spawn a real Chromium tab via\n // `@qontinui/ui-bridge-headless` so callers can drive the web bridge\n // without manually opening a browser. Gated behind `enableHeadlessSpawn`\n // (off by default); returns 503 when disabled or when the optional peer\n // dependency isn't installed; 400 on bad input.\n spawnHeadless: (\n request: SpawnHeadlessRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<SpawnHeadlessResponse>>;\n\n // Page health diagnostics — runs the same spatial-coverage / layout /\n // text-signal heuristics as the runner's `/control/page-health` analyzer\n // (qontinui-runner src-tauri/src/mcp/ui_bridge/screenshots.rs) but\n // server-side over the current snapshot. Pure data-over-elements; no\n // browser context required beyond a relayed snapshot.\n pageHealth: () => Promise<APIResponse<PageHealthReport>>;\n\n // API discovery\n getCapabilities: () => Promise<APIResponse<CapabilitiesResponse>>;\n\n // Specs endpoint — serves all loaded specs for runner discovery\n getSpecs: () => Promise<APIResponse<Record<string, unknown>>>;\n\n // Heartbeat (app health detection)\n receiveHeartbeat: () => Promise<APIResponse<{ received: boolean }>>;\n\n // Element event log\n getElementHistory: (\n elementId: string,\n options?: ElementHistoryOptions,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown[]>>;\n\n // Media discovery & analysis endpoints — removed in Phase 2 of the\n // UI Bridge Vision Pipeline (2026-05-13). The `/control/screenshot`,\n // `/control/annotated-screenshot`, `/control/element-screenshot`,\n // `/control/capture-element-images`, `/control/get-element-images`,\n // `/control/diagnose-stuck-screen`, and `/ai/media/*` routes are\n // superseded by `/vision/{capture,annotate,diff,raw,cache,health}`\n // declared above (handlers prefixed `vision*`). The runner answers those\n // routes directly; the SDK keeps stubs for type-completeness.\n\n // Change observation (push-based)\n getChangesSince: (params?: {\n since?: number;\n limit?: number;\n }) => Promise<APIResponse<{ events: DOMChangeEvent[]; count: number }>>;\n\n /** Tear down internal subscriptions and observers to prevent resource leaks. */\n destroy?: () => void;\n\n // Enhanced discovery endpoints\n query: (\n request: {\n selector: string;\n limit?: number;\n includeState?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elements: unknown[]; count: number }>>;\n\n waitForElement: (\n request: {\n selector?: string;\n elementId?: string;\n timeout?: number;\n pollInterval?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ found: boolean; element?: unknown; waitedMs: number }>>;\n\n /**\n * Tier 3.1 — Wait for an element matching a structured selector to satisfy\n * a given condition (present / visible / clickable / text-matches).\n *\n * Implemented via registry polling so it works with both DOM and native elements.\n */\n waitForElementByCondition: (\n request: WaitForElementByConditionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<WaitForElementByConditionResponse>>;\n\n /**\n * Testing-friendliness — Wait for an SPA route change with optional\n * from/to matching. Returns a timeout shape (reason: 'timeout') when no\n * matching navigation occurs before `timeoutMs`.\n */\n waitForRouteChange: (\n request?: WaitForRouteChangeRequest,\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n WaitForRouteChangeResponse | { reason: 'timeout'; lastKnownRoute?: string; elapsedMs: number }\n >\n >;\n\n /**\n * Testing-friendliness — Wait for an element matching `predicate` to be\n * registered (or visible / have layout, per `requirement`). Polls the\n * in-memory registry; falls back to `document.querySelector` when\n * `predicate.selector` is given.\n */\n waitForElementRegistered: (\n request: WaitForElementRequest,\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n | WaitForElementSuccessResponse\n | { reason: 'timeout'; elapsedMs: number; closestMatch?: Record<string, unknown> }\n >\n >;\n\n /**\n * Tier 3.2 — Execute a heterogeneous sequence of actions, waits, and\n * snapshots in one round-trip.\n */\n controlBatch: (\n request: ControlBatchRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ControlBatchResponse>>;\n\n // App-agnostic convenience endpoints\n clickByText: (\n request: {\n text: string;\n tag?: string;\n exact?: boolean;\n /** Target a runner pop-out window discoverable via `listWindows()`; omit → main window. Read from the body. */\n windowLabel?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n clickBySelector: (\n request: {\n selector: string;\n index?: number;\n /** Target a runner pop-out window discoverable via `listWindows()`; omit → main window. Read from the body. */\n windowLabel?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n typeInto: (\n request: {\n selector?: string;\n label?: string;\n text: string;\n clear?: boolean;\n /** Target a runner pop-out window discoverable via `listWindows()`; omit → main window. Read from the body. */\n windowLabel?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ typed: boolean; element?: unknown }>>;\n\n readValue: (\n request: {\n selector: string;\n index?: number;\n /** Target a runner pop-out window discoverable via `listWindows()`; omit → main window. Read from the body. */\n windowLabel?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ value: string | null; length: number }>>;\n\n findByText: (\n request: { text: string; tag?: string; exact?: boolean; windowLabel?: string },\n context?: HandlerContext\n ) => 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\n getDiagnostics: (context?: HandlerContext) => Promise<\n APIResponse<{\n sdk_initialized: boolean;\n auto_register_active: boolean;\n registered_elements: number;\n dom_interactive_elements: number;\n mutation_observer_active: boolean;\n navigation_adapter: string;\n page_title: string;\n page_url: string;\n page_ready: boolean;\n providers_mounted: string[];\n last_discover_at: string | null;\n capabilities: string[];\n }>\n >;\n\n // Navigation adapter endpoints\n getRoutes: (\n context?: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; path: string }>>>;\n navigateByAdapter: (\n request: { page: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ navigated: boolean; route: { name: string; path: string } }>>;\n}\n\n/**\n * Push-based DOM change event.\n *\n * Batched subtree-change events emitted by the ChangeObserver and relayed\n * through the CommandRelay. Inspired by folk-js/allio's SubtreeChanged event.\n */\nexport interface DOMChangeEvent {\n type: 'subtreeChanged';\n timestamp: number;\n added: string[];\n removed: string[];\n modified: string[];\n}\n\n/**\n * Endpoint description for API discovery\n */\nexport interface EndpointInfo {\n method: string;\n path: string;\n description: string;\n queryParams?: Record<string, string>;\n}\n\n/**\n * Category of related endpoints\n */\nexport interface EndpointCategory {\n description: string;\n endpoints: EndpointInfo[];\n}\n\n/**\n * Response from the /capabilities endpoint\n */\nexport interface CapabilitiesResponse {\n version: string;\n categories: Record<string, EndpointCategory>;\n}\n\n/**\n * Selector criteria for waitForElementByCondition.\n * All provided fields are ANDed together (case-insensitive substring match).\n */\nexport interface ElementConditionSelector {\n /** Match by element id (exact or substring) */\n id?: string;\n /** Match by title attribute (substring) */\n title?: string;\n /** Match by aria-label attribute (substring) */\n aria_label?: string;\n /** Match by visible text / label (substring) */\n text?: string;\n /** Match by element type (e.g. \"button\", \"input\") */\n type?: string;\n}\n\n/**\n * Request body for POST /ai/wait-for-element (Tier 3.1)\n */\nexport interface WaitForElementByConditionRequest {\n /** Selector criteria — all provided fields must match */\n selector: ElementConditionSelector;\n /** Max wait in ms (default 5000, capped at 60000) */\n timeout_ms?: number;\n /** Condition to check on each poll */\n condition?: 'present' | 'visible' | 'clickable' | 'text-matches';\n /** Substring to match when condition is \"text-matches\" (case-insensitive) */\n text_match?: string;\n}\n\n/**\n * Response body for POST /ai/wait-for-element (Tier 3.1)\n */\nexport interface WaitForElementByConditionResponse {\n /** Whether the condition was satisfied before timeout */\n matched: boolean;\n /** The matched element (present when matched is true) */\n element?: unknown;\n /** How long we actually waited in ms */\n waited_ms: number;\n}\n\n/**\n * Request body for POST /ai/wait-for-route-change.\n *\n * Blocks until the SPA route changes. Optionally filters by the prior\n * route (`fromRoute`) and/or the new route (`toRoute` with `matchMode`).\n * When a matching route change happened between the request arriving and\n * the subscription being set, the handler resolves immediately with\n * `elapsedMs: 0` by scanning the always-on recent-route-change buffer.\n */\nexport interface WaitForRouteChangeRequest {\n /** Only fire when the prior route equals this exact string. */\n fromRoute?: string;\n /** Only fire when the new route matches this (per `matchMode`). */\n toRoute?: string;\n /** How to compare `toRoute` against the new route. Default: `\"exact\"`. */\n matchMode?: 'exact' | 'prefix' | 'regex';\n /** Max wait in ms. Default 5000, clamped to [100, 60000]. */\n timeoutMs?: number;\n}\n\n/**\n * Response body for POST /ai/wait-for-route-change (success case).\n */\nexport interface WaitForRouteChangeResponse {\n from: string;\n to: string;\n elapsedMs: number;\n}\n\n/**\n * Selector predicate for POST /ai/wait-for-element.\n *\n * All provided fields are ANDed. At least one field should be provided;\n * otherwise the first registered element is returned.\n */\nexport interface WaitForElementPredicate {\n /** Match by element id (exact). */\n id?: string;\n /** Match by label / accessible name (case-insensitive substring). */\n label?: string;\n /** Match by data-testid attribute (exact). */\n testId?: string;\n /** CSS selector — falls back to document.querySelector if element is not in registry. */\n selector?: string;\n}\n\n/**\n * Request body for POST /ai/wait-for-element.\n *\n * Polls the in-memory registry for an element matching `predicate`. When\n * `selector` is supplied, falls back to `document.querySelector` once per\n * poll so the wait also covers elements that aren't SDK-registered.\n */\nexport interface WaitForElementRequest {\n predicate: WaitForElementPredicate;\n /**\n * Additional requirement on the matched element.\n * - `\"registered\"` (default): element exists in the registry.\n * - `\"visible\"`: element exists AND is visible per snapshot rules.\n * - `\"has-layout\"`: element exists AND `layout.width > 0 && layout.height > 0`.\n */\n requirement?: 'registered' | 'visible' | 'has-layout';\n /** Poll interval in ms. Default 100, clamped to [50, 1000]. */\n pollMs?: number;\n /** Max wait in ms. Default 5000, clamped to [100, 60000]. */\n timeoutMs?: number;\n}\n\n/**\n * Response body for POST /ai/wait-for-element (success case).\n */\nexport interface WaitForElementSuccessResponse {\n element: {\n id: string;\n label?: string;\n type?: string;\n [key: string]: unknown;\n };\n elapsedMs: number;\n}\n\n/**\n * A single step in a Tier 3.2 control batch request.\n */\nexport type ControlBatchStep =\n | {\n type: 'action';\n /** ID of the element to act on */\n element_id: string;\n /** Action name (click, type, focus, …) */\n action: string;\n /** Optional action parameters */\n params?: Record<string, unknown>;\n }\n | {\n type: 'wait';\n /** Milliseconds to sleep */\n ms: number;\n }\n | {\n type: 'snapshot';\n };\n\n/**\n * Request body for POST /control/batch (Tier 3.2)\n */\nexport interface ControlBatchRequest {\n actions: ControlBatchStep[];\n /** When true (default), stop executing on the first error */\n stop_on_error?: boolean;\n}\n\n/**\n * Per-step result in a Tier 3.2 batch response\n */\nexport interface ControlBatchStepResult {\n index: number;\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n/**\n * Response body for POST /control/batch (Tier 3.2)\n */\nexport interface ControlBatchResponse {\n results: ControlBatchStepResult[];\n completed: number;\n total: number;\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 // Discover the runner process's own webview windows (main + pop-outs) so\n // callers can resolve a `windowLabel` target. Runner-owned; promoted out of\n // the runner_only_baseline allow-list once the SDK declared it here (plan\n // 2026-06-07-multi-window-sdk-automation, Phase 2).\n { method: 'GET', path: '/control/runner-windows', handler: 'listWindows' },\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: 'GET',\n path: '/control/element/:id/react-state',\n handler: 'getElementReactState',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/element/:id/action',\n handler: 'executeElementAction',\n params: ['id'],\n bodyRequired: true,\n },\n // Phase 2.1 (plan 2026-05-03) — assert an element predicate. Returns\n // 200 + passed:true on success, 422 + passed:false on timeout.\n {\n method: 'POST',\n path: '/control/element/:id/expect',\n handler: 'expectElement',\n params: ['id'],\n bodyRequired: true,\n },\n // Phase 4.1 (plan 2026-05-03) — spawn a real Chromium tab via\n // `@qontinui/ui-bridge-headless`. Gated behind `enableHeadlessSpawn`\n // / `ENABLE_HEADLESS_SPAWN=1`; returns 503 when disabled or the\n // optional peer dependency is absent.\n {\n method: 'POST',\n path: '/control/sdk/spawn-headless',\n handler: 'spawnHeadless',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/actions/batch',\n handler: 'executeBatchAction',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/elements/rank',\n handler: 'rankElements',\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 // Phase 1.3 (plan 2026-05-03) — flat digest synthesized from snapshot +\n // console-errors + idle-status. One call instead of five.\n { method: 'GET', path: '/control/state-summary', handler: 'getStateSummary' },\n\n // Page health diagnostics — runs the spatial-coverage / layout / text-\n // signal heuristics defined in `./page-health.ts`. Byte-equivalent output\n // shape to the runner's `/control/page-health` handler so the page-health\n // skill (.claude/skills/page-health/SKILL.md) sees identical payloads\n // regardless of transport. POST (matches runner) — body reserved for\n // future per-check toggles (currently ignored).\n { method: 'POST', path: '/control/page-health', handler: 'pageHealth' },\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 // D3 Effect Calculus (Phase 2) — read-only recent predict-then-verify cycles.\n { method: 'GET', path: '/effects/recent', handler: 'getRecentEffects' },\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 { method: 'GET', path: '/control/console-errors', handler: 'getConsoleErrors' },\n { method: 'POST', path: '/control/console-errors/clear', handler: 'clearConsoleErrors' },\n\n // AI-native endpoints\n { method: 'POST', path: '/ai/search', handler: 'aiSearch', bodyRequired: true },\n { method: 'POST', path: '/ai/find', handler: 'aiFind', bodyRequired: true },\n { method: 'POST', path: '/ai/execute', handler: 'aiExecute', bodyRequired: true },\n { method: 'POST', path: '/ai/assert', handler: 'aiAssert', bodyRequired: true },\n { method: 'POST', path: '/ai/assert/batch', handler: 'aiAssertBatch', bodyRequired: true },\n { method: 'GET', path: '/ai/snapshot', handler: 'getSemanticSnapshot' },\n { method: 'GET', path: '/ai/diff', handler: 'getSemanticDiff' },\n { method: 'GET', path: '/ai/summary', handler: 'getPageSummary' },\n { method: 'POST', path: '/ai/semantic-search', handler: 'aiSemanticSearch', bodyRequired: true },\n\n // Change tracking\n {\n method: 'POST',\n path: '/ai/execute-with-diff',\n handler: 'executeWithDiff',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/ai/wait-for-change',\n handler: 'waitForChange',\n bodyRequired: true,\n },\n { method: 'GET', path: '/ai/categorize-last-diff', handler: 'categorizeLastDiff' },\n { method: 'POST', path: '/ai/scoped-diff', handler: 'getScopedDiff', bodyRequired: true },\n {\n method: 'POST',\n path: '/ai/summarize-diff',\n handler: 'summarizeDiff',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/ai/structured-changes',\n handler: 'analyzeStructuredChanges',\n bodyRequired: true,\n },\n\n // Change buffer\n { method: 'POST', path: '/ai/change-buffer/enable', handler: 'enableChangeBuffer' },\n { method: 'POST', path: '/ai/change-buffer/disable', handler: 'disableChangeBuffer' },\n { method: 'POST', path: '/ai/change-buffer/drain', handler: 'drainChangeBuffer' },\n { method: 'GET', path: '/ai/change-buffer/size', handler: 'getChangeBufferSize' },\n\n // Snapshot bookmarks (static routes before parameterized).\n //\n // The list/save endpoints use the plural `/ai/bookmarks` while the\n // per-resource endpoints historically used the singular `/ai/bookmark/:name`.\n // The plural variants are aliased to the same handlers so callers reading\n // the canonical reference (which uses plural throughout) don't hit 404s\n // when paths drift in their head.\n { method: 'POST', path: '/ai/bookmarks', handler: 'saveBookmark', bodyRequired: true },\n { method: 'GET', path: '/ai/bookmarks', handler: 'listBookmarks' },\n { method: 'GET', path: '/ai/bookmark/:name', handler: 'getBookmark', params: ['name'] },\n { method: 'GET', path: '/ai/bookmarks/:name', handler: 'getBookmark', params: ['name'] },\n {\n method: 'DELETE',\n path: '/ai/bookmark/:name',\n handler: 'deleteBookmark',\n params: ['name'],\n },\n {\n method: 'DELETE',\n path: '/ai/bookmarks/:name',\n handler: 'deleteBookmark',\n params: ['name'],\n },\n {\n method: 'GET',\n path: '/ai/bookmark/:name/diff',\n handler: 'diffFromBookmark',\n params: ['name'],\n },\n {\n method: 'GET',\n path: '/ai/bookmarks/:name/diff',\n handler: 'diffFromBookmark',\n params: ['name'],\n },\n\n // State management (static routes before parameterized)\n { method: 'GET', path: '/control/states', handler: 'getStates' },\n { method: 'GET', path: '/control/states/active', handler: 'getActiveStates' },\n { method: 'GET', path: '/control/states/snapshot', handler: 'getStateSnapshot' },\n { method: 'POST', path: '/control/states/find-path', handler: 'findPath', bodyRequired: true },\n { method: 'POST', path: '/control/states/navigate', handler: 'navigateTo', bodyRequired: true },\n { method: 'GET', path: '/control/state/:id', handler: 'getState', params: ['id'] },\n { method: 'POST', path: '/control/state/:id/activate', handler: 'activateState', params: ['id'] },\n {\n method: 'POST',\n path: '/control/state/:id/deactivate',\n handler: 'deactivateState',\n params: ['id'],\n },\n { method: 'GET', path: '/control/state-groups', handler: 'getStateGroups' },\n {\n method: 'POST',\n path: '/control/state-group/:id/activate',\n handler: 'activateStateGroup',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/state-group/:id/deactivate',\n handler: 'deactivateStateGroup',\n params: ['id'],\n },\n { method: 'GET', path: '/control/transitions', handler: 'getTransitions' },\n {\n method: 'GET',\n path: '/control/transition/:id/can-execute',\n handler: 'canExecuteTransition',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/transition/:id/execute',\n handler: 'executeTransition',\n params: ['id'],\n },\n\n // Intent endpoints\n { method: 'GET', path: '/ai/intents', handler: 'listIntents' },\n { method: 'POST', path: '/ai/intents/execute', handler: 'executeIntent', bodyRequired: true },\n { method: 'POST', path: '/ai/intents/find', handler: 'findIntent', bodyRequired: true },\n { method: 'POST', path: '/ai/intents/register', handler: 'registerIntent', bodyRequired: true },\n {\n method: 'POST',\n path: '/ai/intents/execute-from-query',\n handler: 'executeIntentFromQuery',\n bodyRequired: true,\n },\n\n // Recovery endpoints\n {\n method: 'POST',\n path: '/ai/recovery/attempt',\n handler: 'attemptRecovery',\n bodyRequired: true,\n },\n\n // Cross-app analysis endpoints\n { method: 'GET', path: '/ai/analyze/data', handler: 'analyzePageData' },\n { method: 'GET', path: '/ai/analyze/regions', handler: 'analyzePageRegions' },\n { method: 'GET', path: '/ai/analyze/structured-data', handler: 'analyzeStructuredData' },\n {\n method: 'POST',\n path: '/ai/analyze/cross-app-compare',\n handler: 'crossAppCompare',\n bodyRequired: true,\n },\n\n // Page navigation\n { method: 'POST', path: '/control/page/refresh', handler: 'pageRefresh' },\n { method: 'POST', path: '/control/page/navigate', handler: 'pageNavigate', bodyRequired: true },\n { method: 'POST', path: '/control/page/back', handler: 'pageGoBack' },\n { method: 'POST', path: '/control/page/forward', handler: 'pageGoForward' },\n { method: 'POST', path: '/control/page/evaluate', handler: 'pageEvaluate', bodyRequired: true },\n { method: 'POST', path: '/control/page/scroll', handler: 'pageScroll', bodyRequired: true },\n\n // Clipboard (relay to browser for gesture-based access)\n {\n method: 'POST',\n path: '/control/clipboard/write',\n handler: 'clipboardWrite',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/clipboard/read', handler: 'clipboardRead' },\n\n // Annotations (static routes before parameterized)\n { method: 'GET', path: '/annotations', handler: 'getAnnotations' },\n { method: 'GET', path: '/annotations/export', handler: 'exportAnnotations' },\n { method: 'GET', path: '/annotations/coverage', handler: 'getAnnotationCoverage' },\n { method: 'POST', path: '/annotations/import', handler: 'importAnnotations', bodyRequired: true },\n { method: 'GET', path: '/annotations/:id', handler: 'getAnnotation', params: ['id'] },\n {\n method: 'PUT',\n path: '/annotations/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n { method: 'DELETE', path: '/annotations/:id', handler: 'deleteAnnotation', params: ['id'] },\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 { method: 'GET', path: '/control/timeline', handler: 'getTimeline' },\n { method: 'GET', path: '/control/health', handler: 'getHealthReport' },\n { method: 'GET', path: '/control/network-chains', handler: 'getNetworkChains' },\n { method: 'POST', path: '/control/error-sessions/start', handler: 'startErrorSession' },\n { method: 'POST', path: '/control/error-sessions/end', handler: 'endErrorSession' },\n { method: 'GET', path: '/control/error-sessions', handler: 'getErrorSessions' },\n {\n method: 'POST',\n path: '/control/error-baselines/capture',\n handler: 'captureErrorBaseline',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/error-baselines/compare',\n handler: 'compareErrorBaseline',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/error-snapshots', handler: 'getErrorSnapshots' },\n { method: 'GET', path: '/control/error-report', handler: 'getErrorReport' },\n\n // Design review\n {\n method: 'GET',\n path: '/design/element/:id/styles',\n handler: 'getElementStyles',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n params: ['id'],\n },\n { method: 'POST', path: '/design/snapshot', handler: 'getDesignSnapshot' },\n {\n method: 'POST',\n path: '/design/responsive',\n handler: 'getResponsiveSnapshots',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/viewport-constraints',\n handler: 'setViewportConstraints',\n bodyRequired: true,\n },\n { method: 'POST', path: '/design/audit', handler: 'runDesignAudit' },\n {\n method: 'POST',\n path: '/design/style-guide/load',\n handler: 'loadStyleGuide',\n bodyRequired: true,\n },\n { method: 'GET', path: '/design/style-guide', handler: 'getStyleGuide' },\n { method: 'DELETE', path: '/design/style-guide', handler: 'clearStyleGuide' },\n\n // Quality evaluation\n { method: 'POST', path: '/design/evaluate', handler: 'evaluateQuality' },\n { method: 'GET', path: '/design/evaluate/contexts', handler: 'getQualityContexts' },\n { method: 'POST', path: '/design/evaluate/baseline', handler: 'saveBaseline' },\n { method: 'POST', path: '/design/evaluate/diff', handler: 'diffBaseline' },\n\n // Form state awareness\n { method: 'GET', path: '/control/forms', handler: 'getForms' },\n { method: 'POST', path: '/control/fill', handler: 'fillForm', bodyRequired: true },\n { method: 'POST', path: '/control/forms/snapshot', handler: 'snapshotForms' },\n {\n method: 'POST',\n path: '/control/forms/diff',\n handler: 'diffForms',\n bodyRequired: true,\n },\n\n // Clipboard\n { method: 'GET', path: '/control/clipboard', handler: 'getClipboard' },\n { method: 'POST', path: '/control/clipboard', handler: 'setClipboard', bodyRequired: true },\n\n // Network request monitoring (static routes before parameterized)\n { method: 'GET', path: '/control/network-requests', handler: 'getNetworkRequests' },\n {\n method: 'GET',\n path: '/control/network-requests/in-flight',\n handler: 'getNetworkRequestsInFlight',\n },\n {\n method: 'POST',\n path: '/control/network-requests/wait',\n handler: 'waitForNetworkRequest',\n bodyRequired: true,\n },\n {\n method: 'GET',\n path: '/control/network-request/:id',\n handler: 'getNetworkRequest',\n params: ['id'],\n },\n\n // Idle detection (static routes before parameterized).\n //\n // `/ai/idle-status` is a **byte-identical alias** of `/control/idle-status`\n // — same handler key, same payload. The `/control/*` form is canonical\n // (matches the `/control/*` family convention) and the `/ai/*` alias\n // exists so semantic-search / AI consumers can reach idle state under\n // the namespace they already query. Mirrors the runner's\n // `add_dual!(router, get, \"idle-status\", …)` registration at\n // `qontinui-runner/src-tauri/src/mcp/ui_bridge/errors.rs::routes`. See\n // `docs-site/docs/api/runner-features.md` for the canonicalisation rule.\n { method: 'GET', path: '/control/idle-status', handler: 'getIdleStatus' },\n { method: 'GET', path: '/ai/idle-status', handler: 'getIdleStatus' },\n { method: 'POST', path: '/control/wait-for-idle', handler: 'waitForIdle' },\n {\n method: 'POST',\n path: '/control/wait-for-targets',\n handler: 'waitForTargets',\n bodyRequired: true,\n },\n {\n method: 'GET',\n path: '/control/idle-status/:signal',\n handler: 'getIdleSignalStatus',\n params: ['signal'],\n },\n {\n method: 'POST',\n path: '/control/wait-for-idle/:signal',\n handler: 'waitForSignalIdle',\n params: ['signal'],\n },\n\n // Undo/redo awareness\n { method: 'GET', path: '/control/undo-state', handler: 'getUndoState' },\n { method: 'POST', path: '/control/undo', handler: 'executeUndo' },\n { method: 'POST', path: '/control/redo', handler: 'executeRedo' },\n\n // API discovery\n { method: 'GET', path: '/capabilities', handler: 'getCapabilities' },\n\n // Specs\n { method: 'GET', path: '/control/specs', handler: 'getSpecs' },\n\n // Heartbeat\n { method: 'POST', path: '/heartbeat', handler: 'receiveHeartbeat' },\n\n // Vision pipeline (Phase 2, plan 2026-05-13). Replaces the legacy\n // `/control/{screenshot,annotated-screenshot,element-screenshot,\n // capture-element-images,get-element-images,diagnose-stuck-screen}`\n // and `/ai/media/*` routes. The runner answers these directly; the\n // SDK exposes stubs that return `runner_required` so the route table\n // stays the single source of truth.\n { method: 'POST', path: '/vision/capture', handler: 'visionCapture' },\n { method: 'POST', path: '/vision/annotate', handler: 'visionAnnotate' },\n { method: 'POST', path: '/vision/diff', handler: 'visionDiff' },\n { method: 'POST', path: '/vision/raw', handler: 'visionRaw' },\n // Phase 4 — text-bearing outputs (OCR + VLM caption).\n { method: 'POST', path: '/vision/extract', handler: 'visionExtract' },\n { method: 'POST', path: '/vision/describe', handler: 'visionDescribe' },\n // Phase 6 — declarative analyzers + assertion DSL.\n { method: 'POST', path: '/vision/analyze', handler: 'visionAnalyze' },\n { method: 'POST', path: '/vision/assert', handler: 'visionAssert' },\n { method: 'POST', path: '/vision/baseline', handler: 'visionBaseline' },\n { method: 'GET', path: '/vision/baselines', handler: 'visionBaselinesList' },\n // Frontend → runner mutation signal (Phase 6).\n {\n method: 'POST',\n path: '/vision/mutation-occurred',\n handler: 'visionMutationOccurred',\n },\n {\n method: 'GET',\n path: '/vision/cache/:sha256',\n handler: 'visionCacheStream',\n params: ['sha256'],\n },\n { method: 'GET', path: '/vision/health', handler: 'visionHealth' },\n\n // Change observation (push-based)\n { method: 'GET', path: '/control/changes/since', handler: 'getChangesSince' },\n\n // ── Route aliases ──────────────────────────────────────────────────\n // These map commonly expected paths to existing handlers.\n\n // Design review aliases under /control/ (static before parameterized)\n { method: 'POST', path: '/control/design/snapshot', handler: 'getDesignSnapshot' },\n {\n method: 'POST',\n path: '/control/design/responsive',\n handler: 'getResponsiveSnapshots',\n bodyRequired: true,\n },\n { method: 'POST', path: '/control/design/audit', handler: 'runDesignAudit' },\n {\n method: 'GET',\n path: '/control/design/element/:id/styles',\n handler: 'getElementStyles',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n params: ['id'],\n },\n\n // Annotation aliases under /control/ (static before parameterized)\n { method: 'GET', path: '/control/annotations', handler: 'getAnnotations' },\n {\n method: 'POST',\n path: '/control/annotation/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/annotations/export', handler: 'exportAnnotations' },\n { method: 'GET', path: '/control/annotations/coverage', handler: 'getAnnotationCoverage' },\n {\n method: 'POST',\n path: '/control/annotations/import',\n handler: 'importAnnotations',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/annotation/:id', handler: 'getAnnotation', params: ['id'] },\n {\n method: 'PUT',\n path: '/control/annotation/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n {\n method: 'DELETE',\n path: '/control/annotation/:id',\n handler: 'deleteAnnotation',\n params: ['id'],\n },\n\n // History/metrics aliases under /control/\n { method: 'GET', path: '/control/action-history', handler: 'getActionHistory' },\n { method: 'GET', path: '/control/history', handler: 'getActionHistory' },\n { method: 'GET', path: '/control/metrics', handler: 'getMetrics' },\n { method: 'GET', path: '/control/interaction-metrics', handler: 'getMetrics' },\n {\n method: 'GET',\n path: '/control/element/:id/history',\n handler: 'getElementHistory',\n params: ['id'],\n },\n\n // Intent aliases under /control/ (static before parameterized)\n { method: 'GET', path: '/control/intents', handler: 'listIntents' },\n { method: 'POST', path: '/control/intents', handler: 'registerIntent', bodyRequired: true },\n {\n method: 'POST',\n path: '/control/intent/:name/execute',\n handler: 'executeIntent',\n params: ['name'],\n bodyRequired: true,\n },\n { method: 'DELETE', path: '/control/intent/:name', handler: 'deleteIntent', params: ['name'] },\n\n // AI assert-batch alias (hyphenated form)\n { method: 'POST', path: '/ai/assert-batch', handler: 'aiAssertBatch', bodyRequired: true },\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 {\n method: 'POST',\n path: '/control/page/type-into',\n handler: 'typeInto',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/read-value',\n handler: 'readValue',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/find-by-text',\n handler: 'findByText',\n bodyRequired: true,\n },\n\n // Tier 3.1 — registry-based element condition polling\n {\n method: 'POST',\n path: '/ai/wait-for-element-condition',\n handler: 'waitForElementByCondition',\n bodyRequired: true,\n },\n\n // Testing-friendliness — route-change wait\n {\n method: 'POST',\n path: '/ai/wait-for-route-change',\n handler: 'waitForRouteChange',\n },\n {\n method: 'POST',\n path: '/ai/wait-for-element',\n handler: 'waitForElementRegistered',\n bodyRequired: true,\n },\n\n // Tier 3.2 — mixed action/wait/snapshot batch\n {\n method: 'POST',\n path: '/control/batch-execute',\n handler: 'controlBatch',\n bodyRequired: true,\n },\n\n // Diagnostics\n { method: 'GET', path: '/diagnostics', handler: 'getDiagnostics' },\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 * Canonical app-agnostic interaction relay command actions.\n *\n * These are the cross-platform \"convenience\" interactions (click/type/read)\n * that the server relays verbatim over the SDK command channel (SSE for web,\n * WebSocket for the runner). The *action string* here is the single source of\n * truth shared by three sites:\n *\n * 1. `relay-handlers.ts` — `relayCommand('<action>', request)` queues it for\n * the connected browser/native tab.\n * 2. `react/commandHandlers.ts` — the browser-side `executeCommand` switch\n * MUST have a matching `case '<action>'`, otherwise the relay hits\n * `default: throw new Error('Unknown command action')` and the runner\n * silently falls back to its own Tauri webview (masking the failure).\n * 3. `native/react/commandHandlers.ts` — the React-Native relay parity case.\n *\n * The drift guard test (`relay-handlers.contract.test.ts`) asserts every entry\n * here resolves to a handler case so the browser executor can never again\n * queue an action it cannot execute. Add new app-agnostic interactions here\n * first, then wire all three sites.\n */\nexport const INTERACTION_RELAY_COMMAND_ACTIONS = [\n 'clickByText',\n 'clickBySelector',\n 'typeInto',\n 'readValue',\n 'findByText',\n] as const;\n\n/**\n * Union of the canonical interaction relay command action strings.\n */\nexport type InteractionRelayCommandAction =\n (typeof INTERACTION_RELAY_COMMAND_ACTIONS)[number];\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","// @generated from diagnostics/codes.json — do not edit\n/* eslint-disable */\n\n/**\n * Canonical UI Bridge diagnostic code vocabulary + recovery catalog.\n * Generated from `diagnostics/codes.json`. See `scripts/gen-diagnostics.ts`.\n */\n\nexport type UiBridgeErrorCode =\n | \"UB-ACTION-FAILED\"\n | \"UB-ACTION-REJECTED\"\n | \"UB-ACTION-TIMEOUT\"\n | \"UB-AMBIGUOUS-MATCH\"\n | \"UB-ASSERT-CONTRAST\"\n | \"UB-ASSERT-ELEMENT-MISSING\"\n | \"UB-ASSERT-LAYOUT\"\n | \"UB-ASSERT-TEXT-MISMATCH\"\n | \"UB-ASSERT-TIMEOUT\"\n | \"UB-ASSERT-VISIBILITY\"\n | \"UB-ELEM-BLOCKED\"\n | \"UB-ELEM-DISABLED\"\n | \"UB-ELEM-NOT-ENABLED\"\n | \"UB-ELEM-NOT-FOUND\"\n | \"UB-ELEM-NOT-INTERACTABLE\"\n | \"UB-ELEM-NOT-VISIBLE\"\n | \"UB-HEALTH-EMPTY-CONTENT-AREA\"\n | \"UB-HEALTH-EMPTY-TEXT-SIGNAL\"\n | \"UB-HEALTH-ERROR-TEXT-SIGNAL\"\n | \"UB-HEALTH-LOADING-CLASS-SIGNAL\"\n | \"UB-HEALTH-LOADING-TEXT-SIGNAL\"\n | \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\"\n | \"UB-HEALTH-LOW-SPATIAL-COVERAGE\"\n | \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\"\n | \"UB-HEALTH-NO-CONTENT-ELEMENTS\"\n | \"UB-HEALTH-OFF-SCREEN-ELEMENT\"\n | \"UB-HEALTH-SPARSE-CONTENT\"\n | \"UB-HEALTH-ZERO-SIZE-ELEMENT\"\n | \"UB-LOW-CONFIDENCE\"\n | \"UB-MULTIPLE-ELEMENTS\"\n | \"UB-NAVIGATION-ERROR\"\n | \"UB-NET-ERROR\"\n | \"UB-PAGE-LOAD-ERROR\"\n | \"UB-PARSE-ERROR\"\n | \"UB-STALE-ELEMENT\"\n | \"UB-STATE-NOT-REACHED\"\n | \"UB-UNEXPECTED-STATE\"\n | \"UB-UNKNOWN-ERROR\"\n | \"UB-UNSUPPORTED-ACTION\"\n | \"UB-VALIDATION-ERROR\"\n | \"UB-VLM-STRUCTURED-PARSE-FAIL\";\n\n/** All diagnostic codes, in stable sorted order. */\nexport const UI_BRIDGE_ERROR_CODES: readonly UiBridgeErrorCode[] = [\n \"UB-ACTION-FAILED\",\n \"UB-ACTION-REJECTED\",\n \"UB-ACTION-TIMEOUT\",\n \"UB-AMBIGUOUS-MATCH\",\n \"UB-ASSERT-CONTRAST\",\n \"UB-ASSERT-ELEMENT-MISSING\",\n \"UB-ASSERT-LAYOUT\",\n \"UB-ASSERT-TEXT-MISMATCH\",\n \"UB-ASSERT-TIMEOUT\",\n \"UB-ASSERT-VISIBILITY\",\n \"UB-ELEM-BLOCKED\",\n \"UB-ELEM-DISABLED\",\n \"UB-ELEM-NOT-ENABLED\",\n \"UB-ELEM-NOT-FOUND\",\n \"UB-ELEM-NOT-INTERACTABLE\",\n \"UB-ELEM-NOT-VISIBLE\",\n \"UB-HEALTH-EMPTY-CONTENT-AREA\",\n \"UB-HEALTH-EMPTY-TEXT-SIGNAL\",\n \"UB-HEALTH-ERROR-TEXT-SIGNAL\",\n \"UB-HEALTH-LOADING-CLASS-SIGNAL\",\n \"UB-HEALTH-LOADING-TEXT-SIGNAL\",\n \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\",\n \"UB-HEALTH-LOW-SPATIAL-COVERAGE\",\n \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\",\n \"UB-HEALTH-NO-CONTENT-ELEMENTS\",\n \"UB-HEALTH-OFF-SCREEN-ELEMENT\",\n \"UB-HEALTH-SPARSE-CONTENT\",\n \"UB-HEALTH-ZERO-SIZE-ELEMENT\",\n \"UB-LOW-CONFIDENCE\",\n \"UB-MULTIPLE-ELEMENTS\",\n \"UB-NAVIGATION-ERROR\",\n \"UB-NET-ERROR\",\n \"UB-PAGE-LOAD-ERROR\",\n \"UB-PARSE-ERROR\",\n \"UB-STALE-ELEMENT\",\n \"UB-STATE-NOT-REACHED\",\n \"UB-UNEXPECTED-STATE\",\n \"UB-UNKNOWN-ERROR\",\n \"UB-UNSUPPORTED-ACTION\",\n \"UB-VALIDATION-ERROR\",\n \"UB-VLM-STRUCTURED-PARSE-FAIL\",\n] as const;\n\nexport type DiagnosticCategory =\n | 'element'\n | 'action'\n | 'assertion'\n | 'network'\n | 'system';\n\n/**\n * Canonical recovery suggestion shape (D6). One type across every\n * failure surface: ActionFailureDetails, StructuredFailureInfo,\n * ERROR_SUGGESTIONS, getRecoverySuggestions, codes.json.recoveryTemplate.\n */\nexport interface RecoverySuggestion {\n /** Human-readable suggestion. */\n suggestion: string;\n /** Optional machine-executable command. */\n command?: string;\n /** Confidence this will help (0-1). */\n confidence: number;\n /** Whether retrying the original action may help. */\n retryable: boolean;\n /** Order hint (lower = try first). */\n priority?: number;\n}\n\nexport interface DiagnosticEntry {\n description: string;\n commonCauses: string[];\n recoveryTemplate: RecoverySuggestion[];\n category: DiagnosticCategory;\n}\n\nexport const DIAGNOSTICS: Record<UiBridgeErrorCode, DiagnosticEntry> = {\n \"UB-ACTION-FAILED\": {\n description: \"The action could not be completed.\",\n commonCauses: [\n \"The element became non-interactable mid-action\",\n \"A transient runtime error interrupted the action\",\n \"The underlying handler threw\",\n ],\n recoveryTemplate: [\n { suggestion: \"Check if the element is interactable\", confidence: 0.7, retryable: false, priority: 1 },\n { suggestion: \"Wait and retry the action\", command: \"wait 1 second then retry\", confidence: 0.6, retryable: true, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-ACTION-REJECTED\": {\n description: \"The action was rejected before execution (e.g. by a guard, policy, or validation gate).\",\n commonCauses: [\n \"A safety guard blocked the action\",\n \"The action is not permitted in the current state\",\n \"Preconditions for the action were not met\",\n ],\n recoveryTemplate: [\n { suggestion: \"Check whether the action is permitted in the current state\", confidence: 0.6, retryable: false, priority: 1 },\n { suggestion: \"Satisfy the action's preconditions and retry\", confidence: 0.5, retryable: true, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-ACTION-TIMEOUT\": {\n description: \"The action timed out waiting for a condition to be met.\",\n commonCauses: [\n \"The awaited condition can never be satisfied\",\n \"The configured timeout is too short for the operation\",\n \"The page stopped responding\",\n ],\n recoveryTemplate: [\n { suggestion: \"Increase the timeout duration (the wait gave up after ${waitDurationMs}ms)\", confidence: 0.8, retryable: true, priority: 1 },\n { suggestion: \"Check if the condition '${waitCondition}' can ever be met\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Verify the page is responding\", command: \"check page status\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"action\",\n },\n \"UB-AMBIGUOUS-MATCH\": {\n description: \"Multiple elements match with similar confidence; a single best match could not be chosen.\",\n commonCauses: [\n \"Two or more elements have near-identical text\",\n \"The search criteria are not discriminating enough\",\n \"Section context was not provided\",\n ],\n recoveryTemplate: [\n { suggestion: \"Be more specific about which element you mean\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Include the section or form name in the description\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Use the element ID directly\", confidence: 0.7, retryable: false, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ASSERT-CONTRAST\": {\n description: \"A color-contrast (accessibility) assertion failed.\",\n commonCauses: [\n \"Foreground/background contrast is below the required ratio\",\n \"A theme change reduced contrast\",\n \"The element is over a low-contrast background\",\n ],\n recoveryTemplate: [\n { suggestion: \"Adjust the color tokens to meet the required contrast ratio\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-ELEMENT-MISSING\": {\n description: \"An assertion targeted an element that does not exist.\",\n commonCauses: [\n \"The target element was never registered or rendered\",\n \"The element was removed before the assertion ran\",\n \"The selector/id is wrong\",\n ],\n recoveryTemplate: [\n { suggestion: \"Verify the element id/selector and that it is rendered before asserting\", command: \"wait for element\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-LAYOUT\": {\n description: \"A layout/geometry assertion failed (position, size, alignment, overlap).\",\n commonCauses: [\n \"The element's geometry differs from the expected layout\",\n \"A responsive breakpoint changed the layout\",\n \"The assertion ran before layout settled\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for layout to settle and re-assert\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-TEXT-MISMATCH\": {\n description: \"An assertion about element text content failed (exact/contains/regex mismatch).\",\n commonCauses: [\n \"The actual text differs from the expected text\",\n \"The text had not finished updating when asserted\",\n \"Whitespace or casing differences\",\n ],\n recoveryTemplate: [\n { suggestion: \"Re-read the element text and compare; relax to a contains/regex match if appropriate\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-TIMEOUT\": {\n description: \"An assertion timed out waiting for its condition.\",\n commonCauses: [\n \"The asserted condition never became true\",\n \"The timeout was shorter than the time the condition needs\",\n \"The page stopped updating\",\n ],\n recoveryTemplate: [\n { suggestion: \"Increase the assertion timeout or verify the condition can be met\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-VISIBILITY\": {\n description: \"An assertion about element visibility failed.\",\n commonCauses: [\n \"The element was expected visible but is hidden (or vice versa)\",\n \"The element had not rendered when the assertion ran\",\n \"An overlay changed effective visibility\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the element to reach the expected visibility and re-assert\", command: \"wait for element\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ELEM-BLOCKED\": {\n description: \"The element is blocked by another element such as a modal, overlay, or popup.\",\n commonCauses: [\n \"A modal dialog is open over the target\",\n \"A toast or notification overlay intercepts pointer events\",\n \"A full-screen loading layer is present\",\n ],\n recoveryTemplate: [\n { suggestion: \"Close the modal or popup\", command: \"click close button\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Dismiss the overlay\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for the blocking element to disappear\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-DISABLED\": {\n description: \"The element is disabled and cannot be interacted with.\",\n commonCauses: [\n \"Required prerequisite fields are not yet filled\",\n \"A guard condition keeps the control disabled\",\n \"An async dependency has not resolved\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fill in required fields first\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Complete prerequisite steps\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Wait for '${elementId}' to become enabled\", command: \"wait for element to be enabled\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-ENABLED\": {\n description: \"The element is present and visible but disabled, so it cannot be interacted with.\",\n commonCauses: [\n \"Required form fields have not been filled\",\n \"A prerequisite step in a workflow is incomplete\",\n \"The element is intentionally disabled until an async operation completes\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fill in required fields first\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Complete prerequisite steps in the form\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Wait for the element to become enabled\", command: \"wait for element to be enabled\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-FOUND\": {\n description: \"No element matching the target description or selector could be found.\",\n commonCauses: [\n \"The page had not finished loading when the action ran\",\n \"The element is rendered only after a user interaction\",\n \"The description/selector does not match any element on the page\",\n \"The element is in a different route or tab than the active one\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the page to fully load, then look for '${elementId}' again\", command: \"wait for page to load\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Use a different description for the element '${elementId}'\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Scroll the page to reveal '${elementId}'\", command: \"scroll down\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-INTERACTABLE\": {\n description: \"The element is visible and enabled but cannot receive the interaction (e.g. covered, animating, or pointer-events:none).\",\n commonCauses: [\n \"A modal or popup is overlaying the element\",\n \"A CSS animation or transition is in progress\",\n \"The element is partially outside the viewport\",\n \"pointer-events:none is set on the element or an ancestor\",\n ],\n recoveryTemplate: [\n { suggestion: \"Close any modal or popup blocking the element\", command: \"click close button\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Scroll the element into the viewport\", command: \"scroll to element\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for animations to complete\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-VISIBLE\": {\n description: \"The element exists in the DOM but is not currently visible.\",\n commonCauses: [\n \"The element is scrolled out of the viewport\",\n \"A loading overlay or modal is covering it\",\n \"A parent has display:none or visibility:hidden\",\n \"The element has zero size or no layout box\",\n ],\n recoveryTemplate: [\n { suggestion: \"Scroll to make '${elementId}' visible\", command: \"scroll to element\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Close any blocking modals or popups\", command: \"click close button\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for any loading overlays to disappear\", command: \"wait for loading\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-HEALTH-EMPTY-CONTENT-AREA\": {\n description: \"Page health: the main content area is nearly empty while the sidebar/left region has content.\",\n commonCauses: [\n \"The content panel failed to render\",\n \"A data fetch for the main view errored\",\n \"A routing issue left the content region blank\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the view and re-run the health check\", command: \"refresh page\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-EMPTY-TEXT-SIGNAL\": {\n description: \"Page health: empty-state text was detected (e.g. \\\"no results\\\", \\\"nothing here\\\").\",\n commonCauses: [\n \"A data set returned no items\",\n \"A filter excluded all results\",\n \"The expected data failed to load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Verify the data source and filters; re-run the health check after data loads\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-ERROR-TEXT-SIGNAL\": {\n description: \"Page health: error-indicating text was detected on the page.\",\n commonCauses: [\n \"An application error was rendered to the user\",\n \"A failed request surfaced an error banner\",\n \"An exception boundary rendered a fallback\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the error message and address the underlying failure before retrying\", confidence: 0.5, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOADING-CLASS-SIGNAL\": {\n description: \"Page health: a loading/skeleton/spinner CSS class was detected on a visible element.\",\n commonCauses: [\n \"A skeleton or spinner is still showing\",\n \"An async region has not resolved\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the loading indicator to clear and re-run the health check\", command: \"wait for loading\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOADING-TEXT-SIGNAL\": {\n description: \"Page health: loading-indicating text was detected, suggesting the page is not settled.\",\n commonCauses: [\n \"An async load is still in progress\",\n \"The page is stuck in a loading state\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for loading to complete and re-run the health check\", command: \"wait for loading\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\": {\n description: \"Page health: all visible elements are navigation-type, suggesting the content body is missing.\",\n commonCauses: [\n \"Only chrome/navigation rendered; the body did not\",\n \"Content failed to load behind the navigation shell\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the page and re-run the health check\", command: \"refresh page\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOW-SPATIAL-COVERAGE\": {\n description: \"Page health: rendered elements occupy a critically/abnormally small fraction of the viewport.\",\n commonCauses: [\n \"The page is still loading content\",\n \"A render error left most of the page blank\",\n \"The main content failed to mount\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the page to finish loading and re-run the health check\", command: \"wait for page to load\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\": {\n description: \"Page health: over half of interactive elements are disabled.\",\n commonCauses: [\n \"The page is gated behind an unmet precondition\",\n \"A loading state disabled most controls\",\n \"The user lacks permission for most actions\",\n ],\n recoveryTemplate: [\n { suggestion: \"Satisfy the precondition that enables the controls, then re-run the health check\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-NO-CONTENT-ELEMENTS\": {\n description: \"Page health: no elements were found in the content region.\",\n commonCauses: [\n \"The content view did not mount\",\n \"An exception prevented content rendering\",\n \"The page is stuck before content load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the page and re-run the health check\", command: \"refresh page\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-OFF-SCREEN-ELEMENT\": {\n description: \"Page health: a visible element is positioned entirely off-screen.\",\n commonCauses: [\n \"A negative-offset or transform pushed the element out of view\",\n \"A layout bug positioned the element outside the viewport\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the element's positioning/CSS; this typically indicates a layout defect\", confidence: 0.3, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-SPARSE-CONTENT\": {\n description: \"Page health: the content region has very few elements.\",\n commonCauses: [\n \"Content is only partially rendered\",\n \"A list/grid returned few or no items\",\n \"The page is mid-load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for content to finish loading and re-run the health check\", command: \"wait for loading\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-ZERO-SIZE-ELEMENT\": {\n description: \"Page health: a visible element has zero width or height.\",\n commonCauses: [\n \"A CSS layout bug collapsed the element\",\n \"Missing content gave the element no intrinsic size\",\n \"A fl/grid sizing rule produced a zero box\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the element's layout/CSS; this typically indicates a rendering defect\", confidence: 0.3, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-LOW-CONFIDENCE\": {\n description: \"The best matching element has confidence below the acceptance threshold.\",\n commonCauses: [\n \"The description does not closely match any element's text\",\n \"The confidence threshold is set higher than the actual best match\",\n \"The element label differs from the human-expected wording\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use the exact text shown on the element\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Try a different description that more closely matches the element\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Lower the confidence threshold if the match is correct\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-MULTIPLE-ELEMENTS\": {\n description: \"Multiple elements match the description; the target is ambiguous.\",\n commonCauses: [\n \"The description is too generic\",\n \"Repeated list/grid items share the same label\",\n \"Several controls have identical accessible names\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a more specific description\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Include the element position (first, second, etc.)\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Use the element ID directly\", confidence: 0.7, retryable: false, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-NAVIGATION-ERROR\": {\n description: \"Navigation to the target page failed.\",\n commonCauses: [\n \"The target URL is incorrect or unreachable\",\n \"A navigation guard blocked the route\",\n \"The route does not exist\",\n ],\n recoveryTemplate: [\n { suggestion: \"Try the navigation again\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Check if the URL is correct\", confidence: 0.6, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-NET-ERROR\": {\n description: \"A network error occurred while performing the action or loading data.\",\n commonCauses: [\n \"The backing request failed or timed out\",\n \"Connectivity was lost\",\n \"A CORS or proxy error blocked the request\",\n ],\n recoveryTemplate: [\n { suggestion: \"Retry the action once connectivity is restored\", confidence: 0.6, retryable: true, priority: 1 },\n { suggestion: \"Check network connectivity\", confidence: 0.5, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-PAGE-LOAD-ERROR\": {\n description: \"The page failed to load correctly.\",\n commonCauses: [\n \"A critical resource failed to load\",\n \"The server returned an error response\",\n \"Network connectivity was interrupted during load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Refresh the page\", command: \"refresh page\", confidence: 0.8, retryable: true, priority: 1 },\n { suggestion: \"Check network connectivity\", confidence: 0.6, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-PARSE-ERROR\": {\n description: \"Could not parse the natural language instruction.\",\n commonCauses: [\n \"The instruction is too complex or ambiguous to parse\",\n \"The instruction does not reference a recognizable action\",\n \"The instruction format is unsupported\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a simpler instruction format like \\\"click Submit button\\\"\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Use specific element names visible on the page\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-STALE-ELEMENT\": {\n description: \"The element reference is no longer attached to the DOM.\",\n commonCauses: [\n \"The component unmounted between discovery and action\",\n \"A re-render replaced the element node\",\n \"The element was detached by a parent update\",\n ],\n recoveryTemplate: [\n { suggestion: \"Re-find '${elementId}'\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Wait for page to stabilize\", command: \"wait 1 second\", confidence: 0.7, retryable: true, priority: 2 },\n ],\n category: \"element\",\n },\n \"UB-STATE-NOT-REACHED\": {\n description: \"The expected post-action state was not reached.\",\n commonCauses: [\n \"The action did not produce the expected state transition\",\n \"An async side-effect has not completed yet\",\n \"The expected state assertion is incorrect\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for state to stabilize and re-check\", command: \"wait 2 seconds\", confidence: 0.6, retryable: true, priority: 1 },\n { suggestion: \"Verify the expected state condition is correct\", confidence: 0.5, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-UNEXPECTED-STATE\": {\n description: \"The element or page is in an unexpected state.\",\n commonCauses: [\n \"The page state drifted from what the workflow assumed\",\n \"A concurrent update changed the state\",\n \"Stale state was used for the decision\",\n ],\n recoveryTemplate: [\n { suggestion: \"Refresh the page state\", command: \"refresh\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Wait for state to stabilize\", command: \"wait 2 seconds\", confidence: 0.6, retryable: true, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-UNKNOWN-ERROR\": {\n description: \"An unknown or uncategorized error occurred.\",\n commonCauses: [\n \"An unexpected runtime exception with no specific code\",\n \"An error path that has not yet been mapped to a stable code\",\n ],\n recoveryTemplate: [\n { suggestion: \"Try a different approach or check the page state\", confidence: 0.5, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-UNSUPPORTED-ACTION\": {\n description: \"The requested action type is not supported for this element or surface.\",\n commonCauses: [\n \"The action verb is not implemented for the element type\",\n \"A composite action needs to be broken into primitives\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a different action type\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Break down into simpler actions\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-VALIDATION-ERROR\": {\n description: \"The parsed action failed validation.\",\n commonCauses: [\n \"Required parameters for the action are missing\",\n \"A parameter value is out of range or the wrong type\",\n \"The instruction format is invalid\",\n ],\n recoveryTemplate: [\n { suggestion: \"Provide required parameters for the action\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Check the instruction format\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-VLM-STRUCTURED-PARSE-FAIL\": {\n description: \"The VLM Describe response could not be parsed into the closed structured schema; the prose-only response was returned with structured=null.\",\n commonCauses: [\n \"The model returned malformed or non-JSON output in JSON mode\",\n \"The structured payload did not validate against the schema\",\n \"Model-specific JSON-mode unreliability\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fall back to the prose description; retry the describe call once\", confidence: 0.4, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n};\n","/**\n * UI Bridge diagnostics — single source of truth.\n *\n * The code vocabulary, recovery catalog, and canonical `RecoverySuggestion`\n * shape (D6) are generated from `diagnostics/codes.json` into\n * `codes.generated.ts`. This barrel re-exports them and folds the previously\n * hand-maintained `ERROR_SUGGESTIONS` map and `getRecoverySuggestions()` switch\n * onto that single source (plan D6 / §5).\n */\n\nexport type {\n UiBridgeErrorCode,\n DiagnosticCategory,\n RecoverySuggestion,\n DiagnosticEntry,\n} from './codes.generated';\nexport { UI_BRIDGE_ERROR_CODES, DIAGNOSTICS } from './codes.generated';\n\nimport type { UiBridgeErrorCode, RecoverySuggestion } from './codes.generated';\nimport { DIAGNOSTICS } from './codes.generated';\n\n/**\n * Recovery suggestions per code, sourced from the generated catalog.\n *\n * Replaces the former hand-maintained `ERROR_SUGGESTIONS` map in\n * `ai/error-context.ts` (D6 — one source). Returns a defensive copy so callers\n * may sort/mutate without corrupting the catalog.\n */\nexport const ERROR_SUGGESTIONS: Record<UiBridgeErrorCode, RecoverySuggestion[]> =\n Object.fromEntries(\n (Object.keys(DIAGNOSTICS) as UiBridgeErrorCode[]).map((code) => [\n code,\n DIAGNOSTICS[code].recoveryTemplate.map((r) => ({ ...r })),\n ])\n ) as Record<UiBridgeErrorCode, RecoverySuggestion[]>;\n\n/**\n * Context map used to render `${key}` placeholders inside recovery templates.\n * Values are coerced to strings at substitution time; `undefined`/`null`\n * entries leave their placeholder untouched (treated as \"unknown key\").\n */\nexport type RecoveryRenderContext = Record<\n string,\n string | number | boolean | null | undefined\n>;\n\nconst PLACEHOLDER_RE = /\\$\\{([^}]+)\\}/g;\n\n/**\n * Substitute `${key}` placeholders in a template string from a context map.\n *\n * - Any `${key}` present (and non-nullish) in `context` is replaced with its\n * stringified value (at minimum `${elementId}` / `${waitDurationMs}`, but\n * any key is supported).\n * - Unknown placeholders (key absent, or value `undefined`/`null`) are left\n * **verbatim** and nothing is logged (per Phase 3 spec).\n */\nfunction renderTemplateString(\n template: string,\n context: RecoveryRenderContext\n): string {\n if (template.indexOf('${') === -1) return template;\n return template.replace(PLACEHOLDER_RE, (whole, key: string) => {\n const value = context[key];\n if (value === undefined || value === null) return whole;\n return String(value);\n });\n}\n\n/**\n * Render a single recovery suggestion's `suggestion` and `command` strings\n * against a failure-context map, returning a fresh object (never mutates the\n * catalog entry).\n */\nfunction renderSuggestion(\n suggestion: RecoverySuggestion,\n context: RecoveryRenderContext\n): RecoverySuggestion {\n const rendered: RecoverySuggestion = {\n ...suggestion,\n suggestion: renderTemplateString(suggestion.suggestion, context),\n };\n if (suggestion.command !== undefined) {\n rendered.command = renderTemplateString(suggestion.command, context);\n }\n return rendered;\n}\n\n/**\n * Generate recovery suggestions for an error code.\n *\n * Replaces the duplicated `getRecoverySuggestions()` switch statements in\n * `server/handlers.ts` and `ui-bridge-server/handlers.ts` (D6 — one source).\n * Unknown codes fall back to the generic `UB-UNKNOWN-ERROR` template.\n *\n * When `context` is supplied, every `${key}` placeholder in each suggestion's\n * `suggestion`/`command` is substituted from it (Phase 3 — sync failure paths\n * pass `${elementId}` / `${waitDurationMs}` / etc.). Unknown placeholders are\n * left untouched. Without `context` the static catalog template is returned\n * (defensive copy).\n */\nexport function getRecoverySuggestions(\n errorCode: UiBridgeErrorCode,\n context?: RecoveryRenderContext\n): RecoverySuggestion[] {\n const entry = DIAGNOSTICS[errorCode] ?? DIAGNOSTICS['UB-UNKNOWN-ERROR'];\n if (!context) {\n return entry.recoveryTemplate.map((r) => ({ ...r }));\n }\n return entry.recoveryTemplate.map((r) => renderSuggestion(r, context));\n}\n\n/**\n * Error codes for which retrying the original action is recommended.\n * Derived from the catalog: a code is retry-recommended when any of its\n * recovery template entries is `retryable: true`.\n */\nfunction isRetryRecommended(errorCode: UiBridgeErrorCode): boolean {\n const entry = DIAGNOSTICS[errorCode] ?? DIAGNOSTICS['UB-UNKNOWN-ERROR'];\n return entry.recoveryTemplate.some((r) => r.retryable);\n}\n\n/**\n * Structured-failure shape mirror of `core/types.ts` `ActionFailureDetails`.\n * Re-declared structurally here (rather than imported) to keep the\n * diagnostics barrel free of a back-edge into `core`; the field set is the\n * subset every failure surface populates.\n */\nexport interface BuiltActionFailureDetails {\n errorCode: UiBridgeErrorCode;\n message: string;\n elementId?: string;\n suggestedActions: RecoverySuggestion[];\n retryRecommended: boolean;\n context?: Record<string, unknown>;\n durationMs?: number;\n timeoutMs?: number;\n /** Typed-reason discriminators (Phase 3) — mirror `ActionFailureDetails`. */\n disabledReason?: 'native' | 'aria' | 'pointer-none';\n visibilityReason?: 'hidden' | 'off-screen' | 'occluded' | 'no-layout';\n staleReason?: 'unmounted' | 'rerendered' | 'detached';\n waitCondition?: string;\n waitTimedOutAfterMs?: number;\n timeoutType?: 'network' | 'navigation' | 'computation';\n}\n\n/**\n * Map a loosely-typed internal/legacy error code (the historical\n * `error(msg, 'NOT_FOUND')`-style strings used across `handlers.ts` /\n * `relay-handlers.ts`) plus its prose message to a canonical\n * `UiBridgeErrorCode`.\n *\n * Single source for `ui-bridge-server/src/error-mapper.ts` and the\n * `ui-bridge` `server/relay-handlers.ts` `error()` helper (Phase 1). The\n * legacy strings are an internal SDK convention, not a public wire vocabulary\n * (no `legacy:[]` recognition surface — D1); this mapper exists only to\n * convert them at the response boundary so `APIResponse.code` is canonical.\n *\n * Resolution order: explicit code mapping → message heuristic →\n * `UB-UNKNOWN-ERROR`.\n */\nconst INTERNAL_CODE_TO_CANONICAL: Record<string, UiBridgeErrorCode> = {\n NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n ELEMENT_NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n COMPONENT_NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n INVALID_REQUEST: 'UB-VALIDATION-ERROR',\n VALIDATION_ERROR: 'UB-VALIDATION-ERROR',\n NOT_IMPLEMENTED: 'UB-UNSUPPORTED-ACTION',\n RUNNER_REQUIRED: 'UB-ACTION-REJECTED',\n RUNNER_UNAVAILABLE: 'UB-NET-ERROR',\n RUNNER_ERROR: 'UB-NET-ERROR',\n COMMAND_FAILED: 'UB-ACTION-FAILED',\n HEADLESS_SPAWN_UNSUPPORTED_ON_RELAY: 'UB-UNSUPPORTED-ACTION',\n HEADLESS_SPAWN_DISABLED: 'UB-ACTION-REJECTED',\n HEADLESS_PEER_MISSING: 'UB-UNSUPPORTED-ACTION',\n HEADLESS_LAUNCH_FAILED: 'UB-ACTION-FAILED',\n WAIT_ERROR: 'UB-ACTION-TIMEOUT',\n PAGE_HEALTH_ERROR: 'UB-UNKNOWN-ERROR',\n QUERY_ERROR: 'UB-VALIDATION-ERROR',\n CDP_DISABLED: 'UB-ACTION-REJECTED',\n UNAUTHORIZED: 'UB-ACTION-REJECTED',\n INTERNAL_ERROR: 'UB-UNKNOWN-ERROR',\n};\n\nexport function mapInternalErrorCode(\n internalCode?: string,\n message?: string\n): UiBridgeErrorCode {\n if (internalCode) {\n // Already canonical — pass through.\n if ((DIAGNOSTICS as Record<string, unknown>)[internalCode]) {\n return internalCode as UiBridgeErrorCode;\n }\n const mapped = INTERNAL_CODE_TO_CANONICAL[internalCode];\n if (mapped) return mapped;\n // Generic `*_ERROR` convention → categorise by family below, else unknown.\n if (internalCode.endsWith('_ERROR')) {\n const m = (message ?? '').toLowerCase();\n if (m.includes('not found') || m.includes('does not exist'))\n return 'UB-ELEM-NOT-FOUND';\n if (m.includes('timeout') || m.includes('timed out'))\n return 'UB-ACTION-TIMEOUT';\n return 'UB-UNKNOWN-ERROR';\n }\n }\n\n const m = (message ?? '').toLowerCase();\n if (m.includes('not found') || m.includes('does not exist'))\n return 'UB-ELEM-NOT-FOUND';\n if (m.includes('not visible') || m.includes('hidden'))\n return 'UB-ELEM-NOT-VISIBLE';\n if (m.includes('disabled')) return 'UB-ELEM-DISABLED';\n if (m.includes('timeout') || m.includes('timed out'))\n return 'UB-ACTION-TIMEOUT';\n if (m.includes('required') || m.includes('invalid'))\n return 'UB-VALIDATION-ERROR';\n if (m.includes('network') || m.includes('disconnected'))\n return 'UB-NET-ERROR';\n\n return 'UB-UNKNOWN-ERROR';\n}\n\n/**\n * Build canonical structured failure details from an error code + prose\n * message. Single source for the `failureDetails` field added to\n * `ComponentActionResponse` / `WorkflowStepResult` in Phase 1 (and reused by\n * the server `createFailureDetails`). `suggestedActions` and\n * `retryRecommended` are both derived from the generated catalog (D6) — no\n * hand-maintained tables.\n */\nexport function buildActionFailureDetails(\n errorCode: UiBridgeErrorCode,\n message: string,\n options: {\n elementId?: string;\n context?: Record<string, unknown>;\n durationMs?: number;\n timeoutMs?: number;\n /**\n * Failure-context map for rendering `${...}` placeholders in the catalog\n * recovery templates (Phase 3). `elementId` is auto-merged in when set.\n */\n renderContext?: RecoveryRenderContext;\n /** Typed-reason discriminators (Phase 3). */\n disabledReason?: 'native' | 'aria' | 'pointer-none';\n visibilityReason?: 'hidden' | 'off-screen' | 'occluded' | 'no-layout';\n staleReason?: 'unmounted' | 'rerendered' | 'detached';\n waitCondition?: string;\n waitTimedOutAfterMs?: number;\n timeoutType?: 'network' | 'navigation' | 'computation';\n } = {}\n): BuiltActionFailureDetails {\n // The element id is always a valid `${elementId}` substitution source even\n // when the caller didn't pass an explicit renderContext.\n const renderContext: RecoveryRenderContext | undefined =\n options.renderContext || options.elementId !== undefined\n ? { elementId: options.elementId, ...options.renderContext }\n : undefined;\n\n return {\n errorCode,\n message,\n elementId: options.elementId,\n suggestedActions: getRecoverySuggestions(errorCode, renderContext),\n retryRecommended: isRetryRecommended(errorCode),\n context: options.context,\n durationMs: options.durationMs,\n timeoutMs: options.timeoutMs,\n disabledReason: options.disabledReason,\n visibilityReason: options.visibilityReason,\n staleReason: options.staleReason,\n waitCondition: options.waitCondition,\n waitTimedOutAfterMs: options.waitTimedOutAfterMs,\n timeoutType: options.timeoutType,\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 '../diagnostics';\nimport type { SSEManager } from './sse-handler';\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 /** SSE manager for streaming events (pass to enable GET /control/events/stream) */\n sseManager?: SSEManager;\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: Partial<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 if (config.useBodyParser) {\n router.use(express.json());\n }\n\n // Add authentication middleware if configured\n if (config.authenticate) {\n router.use(async (req: Request, res: Response, next: NextFunction) => {\n try {\n const authenticated = await config.authenticate!(req);\n if (!authenticated) {\n res.status(401).json(wrapError('Unauthorized', 'UNAUTHORIZED'));\n return;\n }\n next();\n } catch (error) {\n res.status(500).json(wrapError(error as Error, 'AUTH_ERROR'));\n }\n });\n }\n\n // Register routes\n for (const route of UI_BRIDGE_ROUTES) {\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch';\n const path = route.path;\n const handlerName = route.handler as keyof UIBridgeServerHandlers;\n const handler = handlers[handlerName];\n\n if (!handler) {\n console.warn(`Handler not found for route: ${route.method} ${route.path}`);\n continue;\n }\n\n router[method](\n path,\n createRouteHandler(route, handler as (...args: unknown[]) => Promise<APIResponse<unknown>>)\n );\n }\n\n // SSE streaming endpoint (outside normal route pattern — holds connection open)\n if (config.sseManager) {\n const sse = config.sseManager;\n router.get('/control/events/stream', (req: Request, res: Response) => {\n // Set SSE headers\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no'); // Disable nginx buffering\n res.flushHeaders();\n\n const types = req.query.types as string | undefined;\n const elements = req.query.elements as string | undefined;\n\n const clientId = sse.addClient(\n (data: string) => res.write(data),\n () => {\n if (!res.writableEnded) res.end();\n },\n types,\n elements\n );\n\n // Clean up on disconnect\n req.on('close', () => {\n sse.removeClient(clientId);\n });\n });\n\n // Change observation SSE stream — filters to snapshot:changed events only\n router.get('/control/changes/stream', (changesReq: Request, changesRes: Response) => {\n changesRes.setHeader('Content-Type', 'text/event-stream');\n changesRes.setHeader('Cache-Control', 'no-cache');\n changesRes.setHeader('Connection', 'keep-alive');\n changesRes.setHeader('X-Accel-Buffering', 'no');\n changesRes.flushHeaders();\n\n const clientId = sse.addClient(\n (data: string) => changesRes.write(data),\n () => {\n if (!changesRes.writableEnded) changesRes.end();\n },\n 'snapshot:changed' // Pre-filter to change events only\n );\n\n changesReq.on('close', () => {\n sse.removeClient(clientId);\n });\n });\n }\n\n return router;\n}\n\n/**\n * Create a route handler from a route definition\n */\nfunction createRouteHandler(\n route: RouteDefinition,\n handler: (...args: unknown[]) => Promise<APIResponse<unknown>>\n) {\n return async (req: Request, res: Response) => {\n try {\n // Extract params\n const args: unknown[] = [];\n\n if (route.params) {\n for (const param of route.params) {\n args.push(req.params[param]);\n }\n }\n\n // Item #4 — per-tab routing. Sniff `tabId` from query, header, and\n // body, then thread it into whichever arg the handler accepts. Body\n // wins if it already has `tabId` (caller knew what they wanted);\n // otherwise query > header. Header name matches the Next.js adapter.\n const queryTabId =\n (typeof req.query.tabId === 'string' && req.query.tabId) ||\n (typeof req.query.targetTabId === 'string' && req.query.targetTabId) ||\n undefined;\n const headerTabId =\n (typeof req.headers['x-ui-bridge-tab-id'] === 'string'\n ? (req.headers['x-ui-bridge-tab-id'] as string)\n : undefined) ?? undefined;\n const externalTabId = queryTabId || headerTabId;\n\n // Per-user tab scoping (§4.2): mirror the Next.js adapter's\n // X-Caller-User-Id sniff so the trusted-identity-bound `context`\n // reaches every relay-dispatching handler — even the zero-arg ones\n // (captureSnapshot, clearRenderLog, getElementState, …) whose body\n // / query splice can't carry `__callerUserId`.\n const headerCallerUserId =\n (typeof req.headers['x-caller-user-id'] === 'string'\n ? (req.headers['x-caller-user-id'] as string)\n : undefined) ?? undefined;\n\n // Add body when the route declares one. See nextjs.ts for the\n // per-user-scoping rationale (POST routes without `bodyRequired`\n // are context-only handlers whose signatures end at the trailing\n // `context?: HandlerContext` arg).\n if (route.bodyRequired) {\n let body = req.body;\n if (\n externalTabId &&\n body !== null &&\n typeof body === 'object' &&\n !Array.isArray(body) &&\n (body as Record<string, unknown>).tabId === undefined &&\n (body as Record<string, unknown>).targetTabId === undefined\n ) {\n body = { ...(body as Record<string, unknown>), tabId: externalTabId };\n } else if (!body && externalTabId) {\n body = { tabId: externalTabId };\n }\n if (\n headerCallerUserId &&\n body !== null &&\n typeof body === 'object' &&\n !Array.isArray(body)\n ) {\n body = { ...(body as Record<string, unknown>), __callerUserId: headerCallerUserId };\n } else if (!body && headerCallerUserId) {\n body = { __callerUserId: headerCallerUserId };\n }\n args.push(body);\n }\n\n // Add query params for GET requests. See nextjs.ts for why\n // `__callerUserId` is NOT spliced into the searchParams.\n if (route.method === 'GET') {\n const query = { ...req.query } as Record<string, unknown>;\n if (externalTabId && query.tabId === undefined && query.targetTabId === undefined) {\n query.tabId = externalTabId;\n }\n if (Object.keys(query).length > 0) {\n args.push(query);\n }\n }\n\n // Per-user tab scoping (§4.2) — trailing context arg. The adapter\n // ALWAYS supplies this so zero-arg / id-only handlers\n // (captureSnapshot, clearRenderLog, getElementState(id)) — whose\n // signatures can't carry __callerUserId in the body/query — still\n // enforce ownership when X-Caller-User-Id is present. Adds NO\n // overhead when the header is absent (context.callerUserId\n // undefined → relay falls back to primary-tab dispatch).\n args.push({ callerUserId: headerCallerUserId });\n\n const result = await handler(...args);\n // Honor APIResponse.httpStatus for endpoints that need 4xx semantics\n // (e.g. Phase 2.1 `/control/element/:id/expect` → 422 on assertion\n // failure). Strip the hint from the body so the envelope shape stays\n // stable for consumers that only know the default 200 contract.\n const httpStatus =\n typeof (result as APIResponse<unknown>).httpStatus === 'number'\n ? (result as APIResponse<unknown>).httpStatus\n : undefined;\n let body: unknown = result;\n if (httpStatus !== undefined) {\n const { httpStatus: _omit, ...rest } = result as APIResponse<unknown>;\n body = rest;\n res.status(httpStatus).json(body);\n } else {\n res.json(body);\n }\n } catch (error) {\n res.status(500).json(wrapError(error as Error, 'INTERNAL_ERROR'));\n }\n };\n}\n\n/**\n * Create Express app with UI Bridge routes\n *\n * Convenience function that creates a complete Express app with UI Bridge.\n */\nexport function createExpressApp(\n handlers: Partial<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 (also served at /status)\n app.get(['/health', '/status'], (_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: Partial<UIBridgeServerHandlers>,\n config: ExpressAdapterConfig = {}\n): Router {\n return createExpressRouter(handlers, config);\n}\n"]}