@qontinui/ui-bridge-native 0.3.1 → 0.4.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.
- package/dist/control/{index.d.mts → action-executor.d.ts} +6 -10
- package/dist/control/action-executor.d.ts.map +1 -0
- package/dist/control/index.d.ts +5 -95
- package/dist/control/index.d.ts.map +1 -0
- package/dist/{types-CjEKTDYT.d.ts → control/types.d.ts} +17 -20
- package/dist/control/types.d.ts.map +1 -0
- package/dist/core/element-identifier.d.ts +41 -0
- package/dist/core/element-identifier.d.ts.map +1 -0
- package/dist/core/index.d.ts +6 -43
- package/dist/core/index.d.ts.map +1 -0
- package/dist/{registry-pAUpQq2O.d.ts → core/registry.d.ts} +10 -13
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/{types-CGVut7mc.d.mts → core/types.d.ts} +41 -41
- package/dist/core/types.d.ts.map +1 -0
- package/dist/debug/index.d.ts +4 -44
- package/dist/debug/index.d.ts.map +1 -0
- package/dist/debug/index.js +1 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/index.mjs +2 -2
- package/dist/debug/index.mjs.map +1 -1
- package/dist/debug/{index.d.mts → inspector.d.ts} +3 -6
- package/dist/debug/inspector.d.ts.map +1 -0
- package/dist/design/{index.d.mts → design-inspector-native.d.ts} +7 -11
- package/dist/design/design-inspector-native.d.ts.map +1 -0
- package/dist/{design-types-BHr6Q1FX.d.mts → design/design-types.d.ts} +10 -11
- package/dist/design/design-types.d.ts.map +1 -0
- package/dist/design/index.d.ts +5 -60
- package/dist/design/index.d.ts.map +1 -0
- package/dist/index.d.ts +37 -86
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/modal/index.d.ts +2 -0
- package/dist/modal/index.d.ts.map +1 -0
- package/dist/modal/modal-detector.d.ts +29 -0
- package/dist/modal/modal-detector.d.ts.map +1 -0
- package/dist/react/StateAnnotation.d.ts +30 -0
- package/dist/react/StateAnnotation.d.ts.map +1 -0
- package/dist/react/UIBridgeNativeProvider.d.ts +156 -0
- package/dist/react/UIBridgeNativeProvider.d.ts.map +1 -0
- package/dist/react/index.d.ts +14 -69
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +3 -3
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +4 -4
- package/dist/react/index.mjs.map +1 -1
- package/dist/react/{index.d.mts → useAutoRegister.d.ts} +7 -15
- package/dist/react/useAutoRegister.d.ts.map +1 -0
- package/dist/react/useUIBridge.d.ts +103 -0
- package/dist/react/useUIBridge.d.ts.map +1 -0
- package/dist/react/useUIBridgeModal.d.ts +14 -0
- package/dist/react/useUIBridgeModal.d.ts.map +1 -0
- package/dist/react/useUIBridgeToast.d.ts +25 -0
- package/dist/react/useUIBridgeToast.d.ts.map +1 -0
- package/dist/react/useUIComponent.d.ts +112 -0
- package/dist/react/useUIComponent.d.ts.map +1 -0
- package/dist/react/useUIElement.d.ts +162 -0
- package/dist/react/useUIElement.d.ts.map +1 -0
- package/dist/server/design-handlers.d.ts +47 -0
- package/dist/server/design-handlers.d.ts.map +1 -0
- package/dist/server/handlers.d.ts +25 -0
- package/dist/server/handlers.d.ts.map +1 -0
- package/dist/server/http-server.d.ts +262 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/index.d.ts +14 -176
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/observability.d.ts +55 -0
- package/dist/server/observability.d.ts.map +1 -0
- package/dist/server/types.d.ts +368 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/ws-connection.d.ts +48 -0
- package/dist/server/ws-connection.d.ts.map +1 -0
- package/dist/server/ws-event-bridge.d.ts +113 -0
- package/dist/server/ws-event-bridge.d.ts.map +1 -0
- package/dist/server/ws-protocol.d.ts +48 -0
- package/dist/server/ws-protocol.d.ts.map +1 -0
- package/dist/server/ws-types.d.ts +65 -0
- package/dist/server/ws-types.d.ts.map +1 -0
- package/dist/toast/index.d.ts +2 -0
- package/dist/toast/index.d.ts.map +1 -0
- package/dist/toast/toast-capture.d.ts +27 -0
- package/dist/toast/toast-capture.d.ts.map +1 -0
- package/dist/transport/CloudRelayClient.d.ts +51 -0
- package/dist/transport/CloudRelayClient.d.ts.map +1 -0
- package/dist/transport/DeviceAnnouncer.d.ts +75 -0
- package/dist/transport/DeviceAnnouncer.d.ts.map +1 -0
- package/dist/transport/index.d.ts +3 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/logger.d.ts +23 -0
- package/dist/transport/logger.d.ts.map +1 -0
- package/dist/undo/index.d.ts +3 -0
- package/dist/undo/index.d.ts.map +1 -0
- package/dist/undo/undo-tracker.d.ts +59 -0
- package/dist/undo/undo-tracker.d.ts.map +1 -0
- package/package.json +3 -3
- package/dist/StateAnnotation--zm0Jfqj.d.ts +0 -755
- package/dist/StateAnnotation-BgFoVWFy.d.mts +0 -755
- package/dist/core/index.d.mts +0 -46
- package/dist/design-types-BHr6Q1FX.d.ts +0 -205
- package/dist/http-server--550eD1F.d.mts +0 -805
- package/dist/http-server-C9NaNBEP.d.ts +0 -805
- package/dist/index.d.mts +0 -89
- package/dist/registry-B5JadBN9.d.mts +0 -300
- package/dist/server/index.d.mts +0 -178
- package/dist/types-B0XA4vOF.d.mts +0 -197
- package/dist/types-CGVut7mc.d.ts +0 -567
package/dist/react/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/registry.ts","../../src/core/element-identifier.ts","../../src/control/action-executor.ts","../../src/design/design-inspector-native.ts","../../src/server/design-handlers.ts","../../src/server/handlers.ts","../../src/server/observability.ts","../../src/server/ws-types.ts","../../src/server/http-server.ts","../../src/server/ws-event-bridge.ts","../../src/transport/logger.ts","../../src/transport/DeviceAnnouncer.ts","../../src/transport/CloudRelayClient.ts","../../src/modal/modal-detector.ts","../../src/toast/toast-capture.ts","../../src/undo/undo-tracker.ts","../../src/react/UIBridgeNativeProvider.tsx","../../src/react/useUIElement.ts","../../src/react/useUIComponent.ts","../../src/react/useUIBridge.ts","../../src/react/useAutoRegister.ts","../../src/react/useUIBridgeModal.ts","../../src/react/useUIBridgeToast.ts","../../src/react/StateAnnotation.tsx"],"names":["error","success","summary","useRef","useState","useMemo","useCallback","useEffect","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Native Element and Component Registry\n *\n * Central registry for all UI elements and components registered with UI Bridge Native.\n * Adapted from ui-bridge for React Native environments.\n */\n\nimport type {\n RegisteredNativeElement,\n RegisteredNativeComponent,\n NativeElementState,\n NativeElementType,\n NativeStandardAction,\n NativeCustomAction,\n NativeAppInfo,\n NativeBridgeSnapshot,\n NativeElementIdentifier,\n NativeElementRef,\n NativeRegistrationCoverage,\n NativeRouteProviderLike,\n NativeSnapshotEnrichers,\n NativeSnapshotEnricher,\n Workflow,\n BridgeEvent,\n BridgeEventType,\n BridgeEventListener,\n} from './types';\n\n/**\n * Options for registering an element\n */\nexport interface RegisterElementOptions {\n type?: NativeElementType;\n label?: string;\n actions?: NativeStandardAction[];\n customActions?: Record<string, NativeCustomAction>;\n props?: Record<string, unknown>;\n treePath?: string;\n testId?: string;\n accessibilityLabel?: string;\n /** Route path where the element was registered (for page-scoped filtering) */\n registrationRoute?: string | null;\n /** Flattened RN style (from StyleSheet.flatten) for design review */\n flatStyle?: Record<string, unknown>;\n /** State-specific style overrides for design review */\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n };\n}\n\n/**\n * Options for registering a component\n */\nexport interface RegisterComponentOptions {\n name: string;\n description?: string;\n actions?: Array<{\n id: string;\n label?: string;\n description?: string;\n handler: (params?: unknown) => unknown | Promise<unknown>;\n }>;\n elementIds?: string[];\n}\n\n/**\n * Registry configuration\n */\nexport interface NativeRegistryConfig {\n verbose?: boolean;\n onEvent?: BridgeEventListener;\n}\n\n/**\n * Extract handler function names from an element's props.\n * Returns names of props whose values are functions (e.g. ['onPress', 'onChangeText']).\n */\nexport function extractHandlerNames(props?: Record<string, unknown>): string[] {\n if (!props) return [];\n return Object.keys(props).filter((k) => typeof props[k] === 'function');\n}\n\n/**\n * Infer available actions based on element type\n */\nfunction inferActions(type: NativeElementType): NativeStandardAction[] {\n const baseActions: NativeStandardAction[] = ['focus', 'blur'];\n\n switch (type) {\n case 'button':\n case 'touchable':\n case 'pressable':\n return [...baseActions, 'click', 'press', 'longPress', 'doubleTap'];\n case 'input':\n return [...baseActions, 'click', 'press', 'type', 'clear'];\n case 'text':\n return [...baseActions, 'click', 'press', 'longPress'];\n case 'view':\n return [...baseActions, 'click', 'press'];\n case 'scroll':\n return [...baseActions, 'scroll', 'swipe'];\n case 'list':\n return [...baseActions, 'scroll', 'swipe'];\n case 'listItem':\n return [...baseActions, 'click', 'press', 'longPress', 'swipe'];\n case 'switch':\n case 'checkbox':\n return [...baseActions, 'click', 'press', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'press'];\n case 'image':\n return [...baseActions, 'click', 'press', 'longPress'];\n case 'modal':\n return ['focus', 'blur'];\n case 'custom':\n default:\n return [...baseActions, 'click', 'press'];\n }\n}\n\n/**\n * Native UI Bridge Registry\n *\n * Manages registration and lookup of native UI elements and components.\n */\nexport class NativeUIBridgeRegistry {\n private elements = new Map<string, RegisteredNativeElement>();\n private components = new Map<string, RegisteredNativeComponent>();\n private workflows = new Map<string, Workflow>();\n private eventListeners = new Map<BridgeEventType, Set<BridgeEventListener>>();\n private config: NativeRegistryConfig;\n private enrichers: NativeSnapshotEnrichers = {};\n private snapshotExtras = new Map<string, NativeSnapshotEnricher>();\n /**\n * App identification metadata (appId/appName/appType/framework). Set via\n * `setAppInfo` — typically wired in the server constructor from the\n * `NativeUIBridgeConfig` the host passes to `UIBridgeNativeProvider`.\n *\n * When set, `createSnapshot` includes it on the resulting snapshot so\n * agents can identify the app from snapshot bytes alone (parity with the\n * `uiBridge` block on the `health` response). Snapshots created before\n * this is wired simply omit the field.\n */\n private appInfo: NativeAppInfo | null = null;\n /**\n * Optional route provider. When set, `createSnapshot` reads\n * `currentRoute`/`segments` from it whenever the caller does not pass an\n * explicit `routeInfo` argument. This lets the default `getSnapshot` HTTP\n * handler — which has no direct reference to the `NativeUIBridgeServer`\n * instance — still emit a populated `currentRoute` field.\n *\n * Wired by `NativeUIBridgeServer.setRouteProvider`, which forwards the\n * provider into the registry alongside the per-handler overrides it\n * already installs.\n */\n private routeProvider: NativeRouteProviderLike | null = null;\n /**\n * Sticky flag: flips `true` the first time any element is registered and\n * stays `true` even after elements are unregistered. Lets agents distinguish\n * \"this route never wired any elements\" from \"this route registered then\n * unmounted\".\n */\n private everHadRegistrations = false;\n\n constructor(config: NativeRegistryConfig = {}) {\n this.config = config;\n }\n\n // ============================================================================\n // App Info & Route Provider\n // ============================================================================\n\n /**\n * Set the app identification metadata returned alongside snapshots.\n * Idempotent — re-calling with the same shape is a no-op.\n * Pass `null` (or omit a previous call) to clear.\n */\n setAppInfo(info: NativeAppInfo | null | undefined): void {\n this.appInfo = info ?? null;\n }\n\n /** Read-only accessor for the registered app info, if any. */\n getAppInfo(): NativeAppInfo | null {\n return this.appInfo;\n }\n\n /**\n * Set a route provider whose `getCurrentRoute`/`getSegments` are read by\n * `createSnapshot` when no explicit `routeInfo` argument is supplied.\n *\n * Call with `null` to detach (e.g. when the host swaps providers on HMR).\n */\n setRouteProvider(provider: NativeRouteProviderLike | null | undefined): void {\n this.routeProvider = provider ?? null;\n }\n\n /** Read-only accessor for the registered route provider, if any. */\n getRouteProvider(): NativeRouteProviderLike | null {\n return this.routeProvider;\n }\n\n // ============================================================================\n // Snapshot Enricher Slots\n // ============================================================================\n\n /**\n * Register/replace canonical enrichers (modal/toast/undo). HMR-safe — calling\n * with a partial set merges into existing slots instead of clobbering them.\n */\n setEnrichers(e: Partial<NativeSnapshotEnrichers>): void {\n this.enrichers = { ...this.enrichers, ...e };\n }\n\n /**\n * Read-only accessor for the canonical enrichers slot. Returned object is\n * the live reference, so callers can detect \"no detector wired\" via\n * `getEnrichers().modalDetector === undefined`. Used by the test-hook HTTP\n * handlers (`control/modal/push`, `control/modal/dismiss/:id`) which need\n * to drive the ModalDetector directly without re-instantiating it.\n */\n getEnrichers(): Readonly<NativeSnapshotEnrichers> {\n return this.enrichers;\n }\n\n /**\n * Register a custom snapshot enricher. The returned object will be\n * `Object.assign`ed onto the snapshot, so use unique top-level keys to avoid\n * clobbering canonical fields. Returns a disposer.\n */\n registerSnapshotEnricher(name: string, fn: NativeSnapshotEnricher): () => void {\n this.snapshotExtras.set(name, fn);\n return () => this.unregisterSnapshotEnricher(name);\n }\n\n /** Remove a custom snapshot enricher by name */\n unregisterSnapshotEnricher(name: string): void {\n this.snapshotExtras.delete(name);\n }\n\n // ============================================================================\n // Element Management\n // ============================================================================\n\n /**\n * Register a native element\n */\n registerElement(\n id: string,\n ref: React.RefObject<NativeElementRef>,\n options: RegisterElementOptions = {}\n ): RegisteredNativeElement {\n const {\n type = 'custom',\n label,\n actions = inferActions(type),\n customActions,\n props,\n treePath = id,\n testId,\n accessibilityLabel,\n registrationRoute,\n flatStyle,\n stateStyles,\n } = options;\n\n // Create state getter\n const getState = (): NativeElementState => {\n const element = ref.current;\n if (!element) {\n return {\n mounted: false,\n visible: false,\n enabled: false,\n focused: false,\n layout: null,\n };\n }\n\n // State is populated by the element during onLayout\n // Here we return the stored state from the element's metadata\n const stored = this.elements.get(id);\n if (stored && stored.getState !== getState) {\n return stored.getState();\n }\n\n return {\n mounted: true,\n visible: true,\n enabled: true,\n focused: false,\n layout: null,\n };\n };\n\n // Create identifier getter\n const getIdentifier = (): NativeElementIdentifier => ({\n uiId: id,\n testId: testId || id,\n accessibilityLabel,\n treePath,\n });\n\n const registered: RegisteredNativeElement = {\n id,\n ref,\n type,\n label,\n actions,\n customActions,\n props,\n getState,\n getIdentifier,\n registeredAt: Date.now(),\n mounted: true,\n registrationRoute: registrationRoute ?? null,\n flatStyle,\n stateStyles,\n };\n\n this.elements.set(id, registered);\n this.everHadRegistrations = true;\n\n this.emit('element:registered', { id, type, label });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered element: ${id} (${type})`);\n }\n\n // Seed a sensible initial state so elements are immediately visible in snapshots\n // even before onLayout fires. Layout-measuring code can overwrite this later.\n this.updateElementState(id, {\n mounted: true,\n visible: true,\n enabled: true,\n focused: false,\n layout: null,\n });\n\n return registered;\n }\n\n /**\n * Unregister an element\n */\n unregisterElement(id: string): void {\n const element = this.elements.get(id);\n if (element) {\n this.elements.delete(id);\n this.emit('element:unregistered', { id });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Unregistered element: ${id}`);\n }\n }\n }\n\n /**\n * Get a registered element\n */\n getElement(id: string): RegisteredNativeElement | undefined {\n return this.elements.get(id);\n }\n\n /**\n * Get all registered elements\n */\n getAllElements(): RegisteredNativeElement[] {\n return Array.from(this.elements.values());\n }\n\n /**\n * Get all registered elements that are visible and have a layout\n */\n getVisibleElements(): RegisteredNativeElement[] {\n return this.getAllElements().filter((e) => {\n const state = e.getState();\n return state.visible && state.layout !== null;\n });\n }\n\n /**\n * Get elements registered on a specific route (for page-scoped filtering)\n */\n getElementsForRoute(route: string): RegisteredNativeElement[] {\n return this.getAllElements().filter((e) => e.registrationRoute === route);\n }\n\n /**\n * Mark elements registered on a route as off-screen (visible: false, layout: null).\n *\n * Use this when a screen loses focus but stays mounted — common in React Navigation\n * tab navigators where inactive tabs remain in the tree. Without this call, stale\n * `layout` data lingers in snapshots and makes off-screen elements look rendered.\n *\n * Does NOT unregister the elements — they stay registered so the user's next visit\n * re-measures them via `onLayout` without re-mount cost. Elements without a\n * `registrationRoute` (app-wide registrations) are untouched.\n */\n markRouteOffscreen(route: string): void {\n // Guard against accidental global wipes. Elements registered without a\n // route have `registrationRoute: null` — passing null/empty here would\n // match every globally-registered element and erase their layouts.\n if (route == null || route === '') {\n if (this.config.verbose) {\n console.warn(\n `[ui-bridge-native] markRouteOffscreen called with null/empty route — ignoring`\n );\n }\n return;\n }\n let cleared = 0;\n for (const element of this.elements.values()) {\n if (element.registrationRoute === route) {\n this.updateElementState(element.id, {\n visible: false,\n layout: null,\n });\n cleared++;\n }\n }\n if (this.config.verbose && cleared > 0) {\n console.log(`[ui-bridge-native] Marked ${cleared} elements offscreen for route: ${route}`);\n }\n }\n\n /**\n * Update element state\n */\n updateElementState(id: string, state: Partial<NativeElementState>): void {\n const element = this.elements.get(id);\n if (element) {\n // Create a new getState that includes the updated state\n const currentState = element.getState();\n const newState = { ...currentState, ...state };\n\n const updated: RegisteredNativeElement = {\n ...element,\n getState: () => newState,\n };\n\n this.elements.set(id, updated);\n this.emit('element:stateChanged', { id, state: newState });\n }\n }\n\n /**\n * Update element props (for action execution)\n */\n updateElementProps(id: string, props: Record<string, unknown>): void {\n const element = this.elements.get(id);\n if (element) {\n const updated: RegisteredNativeElement = {\n ...element,\n props: { ...element.props, ...props },\n };\n this.elements.set(id, updated);\n }\n }\n\n /**\n * Update element style for design review\n */\n updateElementStyle(\n id: string,\n flatStyle: Record<string, unknown>,\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n }\n ): void {\n const element = this.elements.get(id);\n if (element) {\n const updated: RegisteredNativeElement = {\n ...element,\n flatStyle,\n ...(stateStyles !== undefined ? { stateStyles } : {}),\n };\n this.elements.set(id, updated);\n }\n }\n\n /**\n * Get element style for design review\n */\n getElementStyle(id: string): Record<string, unknown> | null {\n const element = this.elements.get(id);\n return element?.flatStyle ?? null;\n }\n\n /**\n * Find element by testID\n */\n findByTestId(testId: string): RegisteredNativeElement | undefined {\n for (const element of this.elements.values()) {\n const identifier = element.getIdentifier();\n if (identifier.testId === testId) {\n return element;\n }\n }\n return undefined;\n }\n\n /**\n * Find elements by type\n */\n findByType(type: NativeElementType): RegisteredNativeElement[] {\n return Array.from(this.elements.values()).filter((e) => e.type === type);\n }\n\n // ============================================================================\n // Component Management\n // ============================================================================\n\n /**\n * Register a component\n */\n registerComponent(id: string, options: RegisterComponentOptions): RegisteredNativeComponent {\n const { name, description, actions = [], elementIds } = options;\n\n const registered: RegisteredNativeComponent = {\n id,\n name,\n description,\n actions: actions.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })),\n elementIds,\n registeredAt: Date.now(),\n mounted: true,\n };\n\n this.components.set(id, registered);\n\n this.emit('component:registered', { id, name });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered component: ${id} (${name})`);\n }\n\n return registered;\n }\n\n /**\n * Unregister a component\n */\n unregisterComponent(id: string): void {\n const component = this.components.get(id);\n if (component) {\n this.components.delete(id);\n this.emit('component:unregistered', { id });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Unregistered component: ${id}`);\n }\n }\n }\n\n /**\n * Get a registered component\n */\n getComponent(id: string): RegisteredNativeComponent | undefined {\n return this.components.get(id);\n }\n\n /**\n * Get all registered components\n */\n getAllComponents(): RegisteredNativeComponent[] {\n return Array.from(this.components.values());\n }\n\n // ============================================================================\n // Workflow Management\n // ============================================================================\n\n /**\n * Register a workflow\n */\n registerWorkflow(workflow: Workflow): void {\n this.workflows.set(workflow.id, workflow);\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered workflow: ${workflow.id}`);\n }\n }\n\n /**\n * Unregister a workflow\n */\n unregisterWorkflow(id: string): void {\n this.workflows.delete(id);\n }\n\n /**\n * Get a workflow\n */\n getWorkflow(id: string): Workflow | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Get all workflows\n */\n getAllWorkflows(): Workflow[] {\n return Array.from(this.workflows.values());\n }\n\n // ============================================================================\n // Event System\n // ============================================================================\n\n /**\n * Subscribe to events\n */\n on<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): () => void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, new Set());\n }\n this.eventListeners.get(type)!.add(listener as BridgeEventListener);\n\n // Return unsubscribe function\n return () => this.off(type, listener);\n }\n\n /**\n * Unsubscribe from events\n */\n off<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): void {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n }\n\n /**\n * Emit an event\n */\n emit(type: BridgeEventType, data: unknown): void {\n const event: BridgeEvent = {\n type,\n timestamp: Date.now(),\n data,\n };\n\n // Notify listeners\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error(`[ui-bridge-native] Event listener error:`, error);\n }\n }\n }\n\n // Notify global handler\n if (this.config.onEvent) {\n try {\n this.config.onEvent(event);\n } catch (error) {\n console.error(`[ui-bridge-native] Global event handler error:`, error);\n }\n }\n }\n\n // ============================================================================\n // Snapshots\n // ============================================================================\n\n /**\n * Create a snapshot of the current state.\n *\n * Route resolution: `routeInfo` wins when provided. Otherwise — and this\n * is the path the default `getSnapshot` HTTP handler takes — we fall back\n * to the registered `routeProvider`. This means callers that never wire a\n * server-level override (the bare-server / cloud-relay path) still get a\n * populated `currentRoute` field as long as `setRouteProvider` was called\n * on the registry.\n */\n createSnapshot(\n routeInfo?: {\n currentRoute?: string | null;\n segments?: string[];\n },\n options?: { visibleOnly?: boolean; currentRouteOnly?: boolean }\n ): NativeBridgeSnapshot {\n // Resolve route info: prefer the explicit argument, fall back to a\n // registered route provider. We treat an explicitly-passed `routeInfo`\n // (even if both fields are null/undefined) as \"the caller is in charge\"\n // so server-layer overrides that pass `{currentRoute: null}` keep working.\n const resolvedRoute: { currentRoute: string | null; segments: string[] | undefined } = (() => {\n if (routeInfo !== undefined) {\n return {\n currentRoute: routeInfo.currentRoute ?? null,\n segments: routeInfo.segments,\n };\n }\n if (this.routeProvider) {\n try {\n return {\n currentRoute: this.routeProvider.getCurrentRoute() ?? null,\n segments: this.routeProvider.getSegments?.(),\n };\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] routeProvider getCurrentRoute threw:`, error);\n }\n return { currentRoute: null, segments: undefined };\n }\n }\n return { currentRoute: null, segments: undefined };\n })();\n\n let elements = options?.visibleOnly ? this.getVisibleElements() : this.getAllElements();\n\n // Filter to only elements registered on the current route\n if (options?.currentRouteOnly && resolvedRoute.currentRoute) {\n const currentRoute = resolvedRoute.currentRoute;\n elements = elements.filter((e) => e.registrationRoute === currentRoute);\n }\n\n const snapshot: NativeBridgeSnapshot = {\n timestamp: Date.now(),\n elements: elements.map((e) => {\n const handlers = extractHandlerNames(e.props);\n return {\n id: e.id,\n type: e.type,\n label: e.label,\n identifier: e.getIdentifier(),\n state: e.getState(),\n actions: e.actions,\n customActions: e.customActions ? Object.keys(e.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: e.registrationRoute,\n };\n }),\n components: this.getAllComponents().map((c) => ({\n id: c.id,\n name: c.name,\n description: c.description,\n actions: c.actions.map((a) => a.id),\n elementIds: c.elementIds,\n })),\n workflows: this.getAllWorkflows().map((w) => ({\n id: w.id,\n name: w.name,\n description: w.description,\n stepCount: w.steps.length,\n })),\n currentRoute: resolvedRoute.currentRoute,\n segments: resolvedRoute.segments,\n registration: this.getRegistrationCoverage(),\n };\n\n // Include app identification metadata so consumers can identify which\n // app produced this snapshot without a separate health probe.\n if (this.appInfo) {\n snapshot.appInfo = this.appInfo;\n }\n\n // Canonical enrichers — each in its own try/catch so a misbehaving tracker\n // can never break the rest of the snapshot.\n if (this.enrichers.modalDetector) {\n try {\n snapshot.modalStack = this.enrichers.modalDetector.getSnapshotModalContext();\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] modalDetector enricher threw:`, error);\n }\n }\n }\n if (this.enrichers.toastCapture) {\n try {\n snapshot.toasts = this.enrichers.toastCapture.getSnapshotToastContext();\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] toastCapture enricher threw:`, error);\n }\n }\n }\n if (this.enrichers.undoTracker) {\n try {\n snapshot.undoRedo = this.enrichers.undoTracker.getSnapshotUndoContext();\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] undoTracker enricher threw:`, error);\n }\n }\n }\n\n // Custom enrichers — keys assign-merged onto the snapshot\n if (this.snapshotExtras.size > 0) {\n const ctx = { elements, currentRoute: resolvedRoute.currentRoute };\n for (const [name, fn] of this.snapshotExtras) {\n try {\n const extra = fn(ctx);\n if (extra && typeof extra === 'object') {\n Object.assign(snapshot, extra);\n }\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] snapshot enricher \"${name}\" threw:`, error);\n }\n }\n }\n }\n\n return snapshot;\n }\n\n /**\n * Get registry statistics\n */\n getStats(): { elements: number; components: number; workflows: number } {\n return {\n elements: this.elements.size,\n components: this.components.size,\n workflows: this.workflows.size,\n };\n }\n\n /**\n * Compute registration coverage metadata for the current registry state.\n *\n * Groups currently-registered elements by `registrationRoute`, bucketing\n * elements without a route under `'?'`. `everHadRegistrations` is sticky —\n * once true, it stays true for the lifetime of the registry instance.\n */\n getRegistrationCoverage(): NativeRegistrationCoverage {\n const byRoute: Record<string, number> = {};\n for (const element of this.elements.values()) {\n const key =\n element.registrationRoute == null || element.registrationRoute === ''\n ? '?'\n : element.registrationRoute;\n byRoute[key] = (byRoute[key] ?? 0) + 1;\n }\n return {\n totalRegistered: this.elements.size,\n everHadRegistrations: this.everHadRegistrations,\n byRoute,\n };\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.elements.clear();\n this.components.clear();\n this.workflows.clear();\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registry cleared`);\n }\n }\n}\n\n// ============================================================================\n// Global Registry\n// ============================================================================\n\nlet globalRegistry: NativeUIBridgeRegistry | null = null;\n\n/**\n * Set the global registry\n */\nexport function setGlobalRegistry(registry: NativeUIBridgeRegistry): void {\n globalRegistry = registry;\n}\n\n/**\n * Get the global registry\n */\nexport function getGlobalRegistry(): NativeUIBridgeRegistry | null {\n return globalRegistry;\n}\n\n/**\n * Reset the global registry\n */\nexport function resetGlobalRegistry(): void {\n globalRegistry?.clear();\n globalRegistry = null;\n}\n","/**\n * Native Element Identifier\n *\n * Utilities for identifying and finding native elements.\n * In React Native, we use testID, accessibilityLabel, and tree paths\n * instead of XPath/CSS selectors.\n */\n\nimport type { NativeElementIdentifier, RegisteredNativeElement } from './types';\nimport { getGlobalRegistry } from './registry';\n\n/**\n * Create an element identifier for a native element\n */\nexport function createNativeElementIdentifier(\n id: string,\n options: {\n testId?: string;\n accessibilityLabel?: string;\n accessibilityHint?: string;\n treePath?: string;\n } = {}\n): NativeElementIdentifier {\n return {\n uiId: id,\n testId: options.testId || id,\n accessibilityLabel: options.accessibilityLabel,\n accessibilityHint: options.accessibilityHint,\n treePath: options.treePath || id,\n };\n}\n\n/**\n * Find an element by its identifier in the global registry\n */\nexport function findElementByIdentifier(\n identifier: string | NativeElementIdentifier\n): RegisteredNativeElement | null {\n const registry = getGlobalRegistry();\n if (!registry) return null;\n\n // If string, try different lookup strategies\n if (typeof identifier === 'string') {\n // Try direct ID lookup\n const byId = registry.getElement(identifier);\n if (byId) return byId;\n\n // Try testID lookup\n const byTestId = registry.findByTestId(identifier);\n if (byTestId) return byTestId;\n\n // Try pattern matching\n return findByPattern(registry, identifier);\n }\n\n // If identifier object, try each strategy\n if (identifier.uiId) {\n const byId = registry.getElement(identifier.uiId);\n if (byId) return byId;\n }\n\n if (identifier.testId) {\n const byTestId = registry.findByTestId(identifier.testId);\n if (byTestId) return byTestId;\n }\n\n return null;\n}\n\n/**\n * Find element by pattern (supports wildcards)\n */\nfunction findByPattern(\n registry: ReturnType<typeof getGlobalRegistry>,\n pattern: string\n): RegisteredNativeElement | null {\n if (!registry) return null;\n\n // Convert pattern to regex\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special chars\n .replace(/\\*/g, '.*') // Convert * to .*\n .replace(/\\?/g, '.'); // Convert ? to .\n\n const regex = new RegExp(`^${regexPattern}$`, 'i');\n\n for (const element of registry.getAllElements()) {\n const identifier = element.getIdentifier();\n\n // Match against testId\n if (identifier.testId && regex.test(identifier.testId)) {\n return element;\n }\n\n // Match against uiId\n if (identifier.uiId && regex.test(identifier.uiId)) {\n return element;\n }\n\n // Match against treePath\n if (identifier.treePath && regex.test(identifier.treePath)) {\n return element;\n }\n\n // Match against accessibilityLabel\n if (identifier.accessibilityLabel && regex.test(identifier.accessibilityLabel)) {\n return element;\n }\n }\n\n return null;\n}\n\n/**\n * Find all elements matching a pattern\n */\nexport function findAllByPattern(pattern: string): RegisteredNativeElement[] {\n const registry = getGlobalRegistry();\n if (!registry) return [];\n\n // Convert pattern to regex\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n\n const regex = new RegExp(`^${regexPattern}$`, 'i');\n const results: RegisteredNativeElement[] = [];\n\n for (const element of registry.getAllElements()) {\n const identifier = element.getIdentifier();\n\n if (\n (identifier.testId && regex.test(identifier.testId)) ||\n (identifier.uiId && regex.test(identifier.uiId)) ||\n (identifier.treePath && regex.test(identifier.treePath)) ||\n (identifier.accessibilityLabel && regex.test(identifier.accessibilityLabel))\n ) {\n results.push(element);\n }\n }\n\n return results;\n}\n\n/**\n * Build a tree path for an element based on its position in the component tree\n */\nexport function buildTreePath(componentPath: string[], elementIndex?: number): string {\n let path = componentPath.join('/');\n if (elementIndex !== undefined) {\n path += `[${elementIndex}]`;\n }\n return path;\n}\n\n/**\n * Parse a tree path into its components\n */\nexport function parseTreePath(treePath: string): { components: string[]; index?: number } {\n const indexMatch = treePath.match(/\\[(\\d+)\\]$/);\n const index = indexMatch ? parseInt(indexMatch[1], 10) : undefined;\n const pathWithoutIndex = treePath.replace(/\\[\\d+\\]$/, '');\n const components = pathWithoutIndex.split('/').filter(Boolean);\n\n return { components, index };\n}\n\n/**\n * Check if an identifier matches criteria\n */\nexport function matchesIdentifier(\n identifier: NativeElementIdentifier,\n criteria: Partial<NativeElementIdentifier>\n): boolean {\n if (criteria.uiId && identifier.uiId !== criteria.uiId) {\n return false;\n }\n if (criteria.testId && identifier.testId !== criteria.testId) {\n return false;\n }\n if (\n criteria.accessibilityLabel &&\n identifier.accessibilityLabel !== criteria.accessibilityLabel\n ) {\n return false;\n }\n if (criteria.treePath && identifier.treePath !== criteria.treePath) {\n return false;\n }\n return true;\n}\n","/**\n * Native Action Executor\n *\n * Executes actions on registered native elements and components.\n * In React Native, we execute actions by calling prop handlers directly\n * (onPress, onChangeText, etc.) rather than simulating DOM events.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type {\n NativeStandardAction,\n NativeFindRequest,\n NativeFindResponse,\n DiscoveredNativeElement,\n WaitOptions,\n} from '../core/types';\nimport { findElementByIdentifier } from '../core/element-identifier';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n WaitResult,\n NativeActionExecutor,\n NativeActionEvent,\n NativeActionListener,\n TypeActionParams,\n ScrollActionParams,\n SwipeActionParams,\n PressActionParams,\n} from './types';\n\n/**\n * Default wait options\n */\nconst DEFAULT_WAIT_OPTIONS: Required<WaitOptions> = {\n visible: true,\n enabled: true,\n focused: false,\n state: {},\n timeout: 10000,\n interval: 100,\n};\n\n/**\n * Sleep for a duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Default native action executor implementation\n */\nexport class DefaultNativeActionExecutor implements NativeActionExecutor {\n private actionListeners = new Set<NativeActionListener>();\n\n constructor(private registry: NativeUIBridgeRegistry) {}\n\n onActionExecuted(listener: NativeActionListener): () => void {\n this.actionListeners.add(listener);\n return () => {\n this.actionListeners.delete(listener);\n };\n }\n\n /** Notify listeners out-of-band; isolate each invocation so one bad listener can't poison the rest. */\n private emitActionEvent(event: NativeActionEvent): void {\n for (const listener of this.actionListeners) {\n try {\n listener(event);\n } catch (error) {\n console.warn(`[ui-bridge-native] Action listener error:`, error);\n }\n }\n }\n\n /**\n * Execute an action on an element\n */\n async executeAction(\n elementId: string,\n request: ControlActionRequest\n ): Promise<ControlActionResponse> {\n const startTime = Date.now();\n let waitDurationMs = 0;\n\n try {\n // Find the element\n let registered = this.registry.getElement(elementId);\n\n // If not in registry, try by identifier\n if (!registered) {\n registered = findElementByIdentifier(elementId) ?? undefined;\n }\n\n if (!registered) {\n const failTime = Date.now();\n const errorMsg = `Element not found: ${elementId}`;\n this.emitActionEvent({\n elementId,\n action: request.action,\n params: request.params,\n success: false,\n error: errorMsg,\n timestamp: failTime,\n requestId: request.requestId,\n durationMs: failTime - startTime,\n });\n return {\n success: false,\n error: errorMsg,\n durationMs: failTime - startTime,\n timestamp: failTime,\n requestId: request.requestId,\n };\n }\n\n // Wait for conditions if specified\n if (request.waitOptions) {\n const waitResult = await this.waitForElementInternal(registered.id, request.waitOptions);\n waitDurationMs = waitResult.waitedMs;\n if (!waitResult.met) {\n const failTime = Date.now();\n const errorMsg = waitResult.error || 'Wait condition not met';\n this.emitActionEvent({\n elementId,\n action: request.action,\n params: request.params,\n success: false,\n error: errorMsg,\n timestamp: failTime,\n requestId: request.requestId,\n durationMs: failTime - startTime,\n });\n return {\n success: false,\n error: errorMsg,\n durationMs: failTime - startTime,\n timestamp: failTime,\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n // Execute the action\n const result = await this.performAction(registered, request.action, request.params);\n\n const successTime = Date.now();\n this.emitActionEvent({\n elementId,\n action: request.action,\n params: request.params,\n success: true,\n timestamp: successTime,\n requestId: request.requestId,\n durationMs: successTime - startTime,\n });\n return {\n success: true,\n elementState: registered.getState(),\n result,\n durationMs: successTime - startTime,\n timestamp: successTime,\n requestId: request.requestId,\n waitDurationMs,\n };\n } catch (error) {\n const failTime = Date.now();\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.emitActionEvent({\n elementId,\n action: request.action,\n params: request.params,\n success: false,\n error: errorMsg,\n timestamp: failTime,\n requestId: request.requestId,\n durationMs: failTime - startTime,\n });\n return {\n success: false,\n error: errorMsg,\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: failTime - startTime,\n timestamp: failTime,\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n /**\n * Perform an action on an element\n */\n private async performAction(\n element: ReturnType<NativeUIBridgeRegistry['getElement']>,\n action: NativeStandardAction | string,\n params?: Record<string, unknown>\n ): Promise<unknown> {\n if (!element) {\n throw new Error('Element not found');\n }\n\n const props = element.props || {};\n\n // Check for custom action first\n if (element.customActions && action in element.customActions) {\n return element.customActions[action].handler(params);\n }\n\n // Execute standard actions\n switch (action) {\n case 'click': // Web UI Bridge compatibility alias\n case 'press':\n return this.performPress(props, params as PressActionParams | undefined);\n\n case 'longPress':\n return this.performLongPress(props, params as PressActionParams | undefined);\n\n case 'doubleTap':\n return this.performDoubleTap(props);\n\n case 'type':\n return this.performType(element, props, params as unknown as TypeActionParams);\n\n case 'clear':\n return this.performClear(element, props);\n\n case 'focus':\n return this.performFocus(element);\n\n case 'blur':\n return this.performBlur(element);\n\n case 'scroll':\n return this.performScroll(props, params as ScrollActionParams | undefined);\n\n case 'swipe':\n return this.performSwipe(props, params as unknown as SwipeActionParams);\n\n case 'toggle':\n return this.performToggle(props);\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n }\n\n /**\n * Perform press action\n */\n private async performPress(\n props: Record<string, unknown>,\n params?: PressActionParams\n ): Promise<void> {\n // Try different press handlers in order of preference\n const handlers = ['onPress', 'onPressIn', 'onResponderRelease'];\n\n for (const handler of handlers) {\n if (typeof props[handler] === 'function') {\n // Create a synthetic event object\n const event = this.createPressEvent(params);\n (props[handler] as (event: unknown) => void)(event);\n return;\n }\n }\n\n throw new Error('No press handler found on element');\n }\n\n /**\n * Perform long press action\n */\n private async performLongPress(\n props: Record<string, unknown>,\n params?: PressActionParams\n ): Promise<void> {\n if (typeof props.onLongPress === 'function') {\n const event = this.createPressEvent(params);\n (props.onLongPress as (event: unknown) => void)(event);\n return;\n }\n\n throw new Error('No long press handler found on element');\n }\n\n /**\n * Perform double tap action\n */\n private async performDoubleTap(props: Record<string, unknown>): Promise<void> {\n // First try dedicated double tap handler\n if (typeof props.onDoubleTap === 'function') {\n (props.onDoubleTap as () => void)();\n return;\n }\n\n // Fall back to calling press twice\n if (typeof props.onPress === 'function') {\n const event = this.createPressEvent();\n (props.onPress as (event: unknown) => void)(event);\n await sleep(50);\n (props.onPress as (event: unknown) => void)(event);\n return;\n }\n\n throw new Error('No press handler found for double tap');\n }\n\n /**\n * Perform type action\n */\n private async performType(\n element: ReturnType<NativeUIBridgeRegistry['getElement']>,\n props: Record<string, unknown>,\n params: TypeActionParams\n ): Promise<void> {\n if (!params?.text) {\n throw new Error('Type action requires text parameter');\n }\n\n // Clear first if requested. Accept either `clearFirst` (native SDK\n // convention) or `clear` (runner UI Bridge convention) — so agents\n // using the same action across platforms don't hit a naming mismatch.\n if (params.clearFirst || params.clear) {\n await this.performClear(element, props);\n }\n\n // Type character by character if delay specified\n if (params.delay && params.delay > 0) {\n const currentValue = (element?.getState().value || '') as string;\n for (const char of params.text) {\n const newValue = currentValue + char;\n if (typeof props.onChangeText === 'function') {\n (props.onChangeText as (text: string) => void)(newValue);\n }\n await sleep(params.delay);\n }\n } else {\n // Type all at once\n if (typeof props.onChangeText === 'function') {\n (props.onChangeText as (text: string) => void)(params.text);\n } else if (typeof props.onChange === 'function') {\n (props.onChange as (event: { nativeEvent: { text: string } }) => void)({\n nativeEvent: { text: params.text },\n });\n } else {\n throw new Error('No text change handler found on element');\n }\n }\n\n // Update element state\n if (element) {\n this.registry.updateElementState(element.id, { value: params.text });\n }\n }\n\n /**\n * Perform clear action\n */\n private async performClear(\n element: ReturnType<NativeUIBridgeRegistry['getElement']>,\n props: Record<string, unknown>\n ): Promise<void> {\n if (typeof props.onChangeText === 'function') {\n (props.onChangeText as (text: string) => void)('');\n } else if (typeof props.onChange === 'function') {\n (props.onChange as (event: { nativeEvent: { text: string } }) => void)({\n nativeEvent: { text: '' },\n });\n }\n\n // Update element state\n if (element) {\n this.registry.updateElementState(element.id, { value: '' });\n }\n }\n\n /**\n * Perform focus action\n */\n private async performFocus(\n element: ReturnType<NativeUIBridgeRegistry['getElement']>\n ): Promise<void> {\n if (element?.ref.current && 'focus' in element.ref.current) {\n (element.ref.current as { focus: () => void }).focus();\n }\n\n // Update element state\n if (element) {\n this.registry.updateElementState(element.id, { focused: true });\n }\n }\n\n /**\n * Perform blur action\n */\n private async performBlur(\n element: ReturnType<NativeUIBridgeRegistry['getElement']>\n ): Promise<void> {\n if (element?.ref.current && 'blur' in element.ref.current) {\n (element.ref.current as { blur: () => void }).blur();\n }\n\n // Update element state\n if (element) {\n this.registry.updateElementState(element.id, { focused: false });\n }\n }\n\n /**\n * Perform scroll action\n */\n private async performScroll(\n props: Record<string, unknown>,\n params?: ScrollActionParams\n ): Promise<void> {\n if (typeof props.onScroll === 'function') {\n const event = {\n nativeEvent: {\n contentOffset: params?.offset || { x: 0, y: 0 },\n },\n };\n (props.onScroll as (event: unknown) => void)(event);\n }\n }\n\n /**\n * Perform swipe action\n */\n private async performSwipe(\n props: Record<string, unknown>,\n params: SwipeActionParams\n ): Promise<void> {\n if (!params?.direction) {\n throw new Error('Swipe action requires direction parameter');\n }\n\n // Try dedicated swipe handlers\n const handlerMap: Record<string, string> = {\n left: 'onSwipeLeft',\n right: 'onSwipeRight',\n up: 'onSwipeUp',\n down: 'onSwipeDown',\n };\n\n const handler = handlerMap[params.direction];\n if (handler && typeof props[handler] === 'function') {\n (props[handler] as () => void)();\n return;\n }\n\n // Fall back to generic swipe handler\n if (typeof props.onSwipe === 'function') {\n (props.onSwipe as (direction: string) => void)(params.direction);\n }\n }\n\n /**\n * Perform toggle action\n */\n private async performToggle(props: Record<string, unknown>): Promise<void> {\n // For Switch components\n if (typeof props.onValueChange === 'function') {\n const currentValue = props.value as boolean;\n (props.onValueChange as (value: boolean) => void)(!currentValue);\n return;\n }\n\n // Fall back to press\n if (typeof props.onPress === 'function') {\n (props.onPress as () => void)();\n return;\n }\n\n throw new Error('No toggle handler found on element');\n }\n\n /**\n * Create a synthetic press event\n */\n private createPressEvent(params?: PressActionParams): object {\n return {\n nativeEvent: {\n locationX: params?.position?.x ?? 0,\n locationY: params?.position?.y ?? 0,\n timestamp: Date.now(),\n },\n persist: () => {},\n };\n }\n\n /**\n * Execute a component action\n */\n async executeComponentAction(\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> {\n const startTime = Date.now();\n\n try {\n const component = this.registry.getComponent(componentId);\n\n if (!component) {\n return {\n success: false,\n error: `Component not found: ${componentId}`,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n // Find the action\n const action = component.actions.find((a) => a.id === request.action);\n\n if (!action) {\n return {\n success: false,\n error: `Action not found: ${request.action}`,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n // Execute the action\n const result = await action.handler(request.params);\n\n return {\n success: true,\n result,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n }\n\n /**\n * Find elements\n */\n async find(request: NativeFindRequest): Promise<NativeFindResponse> {\n const startTime = Date.now();\n\n const allElements = this.registry.getAllElements();\n let filtered = allElements;\n\n // Filter by type\n if (request.types && request.types.length > 0) {\n filtered = filtered.filter((e) => request.types!.includes(e.type));\n }\n\n // Filter by testID pattern\n if (request.testIdPattern) {\n const regex = new RegExp(request.testIdPattern.replace(/\\*/g, '.*').replace(/\\?/g, '.'));\n filtered = filtered.filter((e) => {\n const identifier = e.getIdentifier();\n return identifier.testId && regex.test(identifier.testId);\n });\n }\n\n // Filter by accessibility label pattern\n if (request.accessibilityLabelPattern) {\n const regex = new RegExp(\n request.accessibilityLabelPattern.replace(/\\*/g, '.*').replace(/\\?/g, '.')\n );\n filtered = filtered.filter((e) => {\n const identifier = e.getIdentifier();\n return identifier.accessibilityLabel && regex.test(identifier.accessibilityLabel);\n });\n }\n\n // Filter by visibility\n if (request.visibleOnly) {\n filtered = filtered.filter((e) => e.getState().visible);\n }\n\n // Apply limit\n if (request.limit && request.limit > 0) {\n filtered = filtered.slice(0, request.limit);\n }\n\n // Map to discovered elements\n const elements: DiscoveredNativeElement[] = filtered.map((e) => ({\n id: e.id,\n type: e.type,\n identifier: e.getIdentifier(),\n state: e.getState(),\n actions: e.actions,\n label: e.label,\n }));\n\n return {\n elements,\n total: elements.length,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Wait for element conditions\n */\n async waitForElement(elementId: string, options: WaitOptions): Promise<WaitResult> {\n return this.waitForElementInternal(elementId, options);\n }\n\n /**\n * Internal wait implementation\n */\n private async waitForElementInternal(\n elementId: string,\n options: WaitOptions\n ): Promise<WaitResult> {\n const opts = { ...DEFAULT_WAIT_OPTIONS, ...options };\n const startTime = Date.now();\n\n while (Date.now() - startTime < opts.timeout) {\n const element = this.registry.getElement(elementId);\n\n if (!element) {\n await sleep(opts.interval);\n continue;\n }\n\n const state = element.getState();\n\n // Check conditions\n let conditionsMet = true;\n\n if (opts.visible && !state.visible) {\n conditionsMet = false;\n }\n\n if (opts.enabled && !state.enabled) {\n conditionsMet = false;\n }\n\n if (opts.focused && !state.focused) {\n conditionsMet = false;\n }\n\n // Check custom state conditions\n if (opts.state && Object.keys(opts.state).length > 0) {\n const stateRecord = state as unknown as Record<string, unknown>;\n for (const [key, value] of Object.entries(opts.state)) {\n if (stateRecord[key] !== value) {\n conditionsMet = false;\n break;\n }\n }\n }\n\n if (conditionsMet) {\n return {\n met: true,\n waitedMs: Date.now() - startTime,\n state,\n };\n }\n\n await sleep(opts.interval);\n }\n\n return {\n met: false,\n waitedMs: Date.now() - startTime,\n error: `Timeout waiting for conditions on element: ${elementId}`,\n };\n }\n}\n\n/**\n * Create a native action executor\n */\nexport function createNativeActionExecutor(registry: NativeUIBridgeRegistry): NativeActionExecutor {\n return new DefaultNativeActionExecutor(registry);\n}\n","/**\n * Native Design Inspector\n *\n * Pure TypeScript functions that map flattened React Native styles to the\n * web SDK's ExtendedComputedStyles format. No react-native imports — works\n * with already-flattened style objects from the registry.\n *\n * Key differences from web:\n * - No `window.getComputedStyle()` — styles are declarative objects\n * - No hover/active states — uses pressed/focused/disabled\n * - No pseudo-elements (::before/::after)\n * - No CSS grid, cursor, visibility, transitions, background-image\n * - RN default flexDirection is 'column' (not 'row')\n * - Shadows differ: iOS uses shadow* props, Android uses elevation\n * - Numeric values → \"Npx\" strings\n */\n\nimport type {\n ExtendedComputedStyles,\n ElementDesignData,\n StateStyles,\n StyleDiff,\n ResponsiveSnapshot,\n NativeInteractionStateName,\n} from './design-types';\nimport type { NativeLayout } from '../core/types';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert a numeric RN value to a CSS px string.\n * String values (like \"50%\") pass through unchanged.\n */\nfunction toCssValue(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'number') return `${value}px`;\n return String(value);\n}\n\n/**\n * Convert RN transform array to CSS transform string.\n * e.g. [{translateX: 10}, {rotate: '45deg'}] → \"translateX(10px) rotate(45deg)\"\n */\nfunction transformToCss(transform: unknown): string {\n if (!Array.isArray(transform) || transform.length === 0) return '';\n\n return transform\n .map((t: Record<string, unknown>) => {\n const key = Object.keys(t)[0];\n if (!key) return '';\n const val = t[key];\n // Rotation values are already strings like '45deg'\n if (typeof val === 'string') return `${key}(${val})`;\n // Numeric values need px for translate, unitless for scale\n if (typeof val === 'number') {\n const needsPx = key.startsWith('translate') || key === 'perspective';\n return `${key}(${val}${needsPx ? 'px' : ''})`;\n }\n return '';\n })\n .filter(Boolean)\n .join(' ');\n}\n\n/**\n * Convert RN shadow props (iOS) + elevation (Android) to CSS box-shadow string.\n */\nfunction shadowToCss(style: Record<string, unknown>): string {\n const parts: string[] = [];\n\n // iOS shadow\n const shadowColor = style.shadowColor as string | undefined;\n const shadowOffset = style.shadowOffset as { width: number; height: number } | undefined;\n const shadowOpacity = style.shadowOpacity as number | undefined;\n const shadowRadius = style.shadowRadius as number | undefined;\n\n if (shadowColor && shadowOffset && shadowOpacity != null && shadowOpacity > 0) {\n const { width, height } = shadowOffset;\n parts.push(\n `${width}px ${height}px ${shadowRadius ?? 0}px ${shadowColor}` +\n (shadowOpacity < 1 ? ` /* opacity: ${shadowOpacity} */` : '')\n );\n }\n\n // Android elevation\n const elevation = style.elevation as number | undefined;\n if (elevation != null && elevation > 0) {\n parts.push(`elevation(${elevation})`);\n }\n\n return parts.join(', ');\n}\n\n/**\n * Convert RN border props to CSS border shorthand.\n */\nfunction borderToCss(style: Record<string, unknown>): string {\n const width = style.borderWidth as number | undefined;\n const color = style.borderColor as string | undefined;\n\n if (width == null && color == null) return '';\n return `${width ?? 0}px solid ${color ?? 'transparent'}`;\n}\n\n/**\n * Convert RN borderRadius to CSS border-radius string.\n * Handles both uniform radius and per-corner values.\n */\nfunction borderRadiusToCss(style: Record<string, unknown>): string {\n const uniform = style.borderRadius as number | undefined;\n if (uniform != null) return `${uniform}px`;\n\n const tl = style.borderTopLeftRadius as number | undefined;\n const tr = style.borderTopRightRadius as number | undefined;\n const bl = style.borderBottomLeftRadius as number | undefined;\n const br = style.borderBottomRightRadius as number | undefined;\n\n if (tl == null && tr == null && bl == null && br == null) return '';\n return `${tl ?? 0}px ${tr ?? 0}px ${br ?? 0}px ${bl ?? 0}px`;\n}\n\n/**\n * Resolve margin/padding shorthand + Horizontal/Vertical expansions.\n * Returns top, right, bottom, left values.\n */\nfunction resolveSpacing(\n style: Record<string, unknown>,\n prefix: 'margin' | 'padding'\n): { top: string; right: string; bottom: string; left: string; shorthand: string } {\n const all = style[prefix];\n const top = style[`${prefix}Top`] ?? style[`${prefix}Vertical`] ?? all;\n const bottom = style[`${prefix}Bottom`] ?? style[`${prefix}Vertical`] ?? all;\n const right = style[`${prefix}Right`] ?? style[`${prefix}Horizontal`] ?? all;\n const left = style[`${prefix}Left`] ?? style[`${prefix}Horizontal`] ?? all;\n\n const t = toCssValue(top);\n const r = toCssValue(right);\n const b = toCssValue(bottom);\n const l = toCssValue(left);\n\n // Build shorthand\n let shorthand = '';\n if (t || r || b || l) {\n if (t === r && r === b && b === l) {\n shorthand = t || '0px';\n } else if (t === b && r === l) {\n shorthand = `${t || '0px'} ${r || '0px'}`;\n } else {\n shorthand = `${t || '0px'} ${r || '0px'} ${b || '0px'} ${l || '0px'}`;\n }\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n shorthand,\n };\n}\n\n/**\n * Resolve gap values (gap, rowGap, columnGap).\n */\nfunction resolveGap(style: Record<string, unknown>): string {\n const gap = style.gap as number | undefined;\n const rowGap = style.rowGap as number | undefined;\n const columnGap = style.columnGap as number | undefined;\n\n if (gap != null) return `${gap}px`;\n if (rowGap != null && columnGap != null) return `${rowGap}px ${columnGap}px`;\n if (rowGap != null) return `${rowGap}px`;\n if (columnGap != null) return `${columnGap}px`;\n return '';\n}\n\n// ============================================================================\n// Core mapping function\n// ============================================================================\n\n/**\n * Map a flattened React Native style object to ExtendedComputedStyles.\n *\n * Rules:\n * - Numeric values → \"Npx\"\n * - String values → pass through\n * - textDecorationLine → textDecoration\n * - RN shadow props → boxShadow string\n * - CSS-only properties (cursor, visibility, grid*, etc.) → empty string\n */\nexport function mapNativeStyleToExtended(\n rnStyle: Record<string, unknown> | undefined | null\n): ExtendedComputedStyles {\n const s = rnStyle ?? {};\n\n const margin = resolveSpacing(s, 'margin');\n const padding = resolveSpacing(s, 'padding');\n\n return {\n // Layout\n display: (s.display as string) ?? 'flex',\n position: (s.position as string) ?? 'relative',\n boxSizing: '', // CSS-only\n width: toCssValue(s.width),\n height: toCssValue(s.height),\n minWidth: toCssValue(s.minWidth),\n maxWidth: toCssValue(s.maxWidth),\n minHeight: toCssValue(s.minHeight),\n maxHeight: toCssValue(s.maxHeight),\n margin: margin.shorthand,\n marginTop: margin.top,\n marginRight: margin.right,\n marginBottom: margin.bottom,\n marginLeft: margin.left,\n padding: padding.shorthand,\n paddingTop: padding.top,\n paddingRight: padding.right,\n paddingBottom: padding.bottom,\n paddingLeft: padding.left,\n overflow: (s.overflow as string) ?? '',\n overflowX: '', // CSS-only\n overflowY: '', // CSS-only\n\n // Flex/Grid — RN defaults to column, not row\n flexDirection: (s.flexDirection as string) ?? '',\n flexWrap: (s.flexWrap as string) ?? '',\n justifyContent: (s.justifyContent as string) ?? '',\n alignItems: (s.alignItems as string) ?? '',\n alignSelf: (s.alignSelf as string) ?? '',\n gap: resolveGap(s),\n gridTemplateColumns: '', // CSS-only\n gridTemplateRows: '', // CSS-only\n\n // Typography\n fontFamily: (s.fontFamily as string) ?? '',\n fontSize: toCssValue(s.fontSize),\n fontWeight: (s.fontWeight as string) ?? '',\n lineHeight: toCssValue(s.lineHeight),\n letterSpacing: toCssValue(s.letterSpacing),\n textAlign: (s.textAlign as string) ?? '',\n textTransform: (s.textTransform as string) ?? '',\n textDecoration: (s.textDecorationLine as string) ?? '', // RN name → CSS name\n color: (s.color as string) ?? '',\n\n // Visual\n backgroundColor: (s.backgroundColor as string) ?? '',\n backgroundImage: '', // CSS-only\n border: borderToCss(s),\n borderRadius: borderRadiusToCss(s),\n boxShadow: shadowToCss(s),\n opacity: s.opacity != null ? String(s.opacity) : '',\n outline: '', // CSS-only\n\n // Effects\n transform: transformToCss(s.transform),\n transition: '', // CSS-only\n cursor: '', // CSS-only\n zIndex: s.zIndex != null ? String(s.zIndex) : '',\n visibility: '', // CSS-only\n pointerEvents: (s.pointerEvents as string) ?? '',\n };\n}\n\n// ============================================================================\n// Design data functions\n// ============================================================================\n\n/**\n * Produce ElementDesignData for a single native element.\n */\nexport function getNativeElementDesignData(\n id: string,\n label: string | undefined,\n type: string,\n rnStyle: Record<string, unknown> | undefined | null,\n layout: NativeLayout | null\n): ElementDesignData {\n return {\n elementId: id,\n label,\n type,\n styles: mapNativeStyleToExtended(rnStyle),\n pseudoElements: [], // RN has no pseudo-elements\n rect: layout\n ? {\n x: layout.pageX,\n y: layout.pageY,\n width: layout.width,\n height: layout.height,\n }\n : { x: 0, y: 0, width: 0, height: 0 },\n };\n}\n\n/**\n * Compute style diffs between default and a state variation.\n */\nfunction computeStyleDiff(\n defaultStyles: ExtendedComputedStyles,\n stateStyles: ExtendedComputedStyles\n): StyleDiff[] {\n const diffs: StyleDiff[] = [];\n for (const key of Object.keys(defaultStyles) as Array<keyof ExtendedComputedStyles>) {\n if (defaultStyles[key] !== stateStyles[key]) {\n diffs.push({\n property: key,\n defaultValue: defaultStyles[key],\n stateValue: stateStyles[key],\n });\n }\n }\n return diffs;\n}\n\n/**\n * Merge a base RN style with a state override.\n */\nfunction mergeStyles(\n base: Record<string, unknown>,\n override: Record<string, unknown> | undefined\n): Record<string, unknown> {\n if (!override) return base;\n return { ...base, ...override };\n}\n\n/**\n * Produce StateStyles[] for default/pressed/focused/disabled.\n * Only includes states that have actual overrides or the default state.\n */\nexport function captureNativeStateVariations(\n baseStyle: Record<string, unknown> | undefined | null,\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n }\n): StateStyles[] {\n const base = baseStyle ?? {};\n const defaultExtended = mapNativeStyleToExtended(base);\n\n const results: StateStyles[] = [\n {\n state: 'default',\n styles: defaultExtended,\n diffFromDefault: [],\n },\n ];\n\n if (!stateStyles) return results;\n\n const states: Array<{ name: NativeInteractionStateName; override?: Record<string, unknown> }> = [\n { name: 'pressed', override: stateStyles.pressed },\n { name: 'focused', override: stateStyles.focused },\n { name: 'disabled', override: stateStyles.disabled },\n ];\n\n for (const { name, override } of states) {\n if (!override) continue;\n const merged = mergeStyles(base, override);\n const extended = mapNativeStyleToExtended(merged);\n const diff = computeStyleDiff(defaultExtended, extended);\n if (diff.length > 0) {\n results.push({ state: name, styles: extended, diffFromDefault: diff });\n }\n }\n\n return results;\n}\n\n/**\n * Capture a responsive snapshot.\n *\n * Platform limitation: RN cannot constrain screen width at runtime.\n * This returns a single snapshot at the current device dimensions.\n */\nexport function captureNativeResponsiveSnapshot(\n elements: Array<{\n id: string;\n label?: string;\n type: string;\n flatStyle?: Record<string, unknown>;\n layout: NativeLayout | null;\n }>,\n screenDimensions: { width: number; height: number }\n): ResponsiveSnapshot[] {\n const elementData = elements.map((el) =>\n getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, el.layout)\n );\n\n return [\n {\n viewportWidth: screenDimensions.width,\n viewportLabel: 'current',\n elements: elementData,\n timestamp: Date.now(),\n },\n ];\n}\n","/**\n * UI Bridge Native Design Review Handlers\n *\n * HTTP handlers for the 8 design review endpoints.\n * Maps registered element styles to the web SDK's design data format.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { APIResponse, HandlerContext } from './types';\nimport type { ElementDesignData, StateStyles, ResponsiveSnapshot } from '../design/design-types';\nimport {\n mapNativeStyleToExtended,\n getNativeElementDesignData,\n captureNativeStateVariations,\n captureNativeResponsiveSnapshot,\n} from '../design/design-inspector-native';\n\n// Style guide and baseline stored in closure (same pattern as web SDK)\nlet loadedStyleGuide: unknown = null;\nlet savedBaseline: unknown = null;\n\n// Try to load the style validator from the web SDK (optional peer dep)\nlet styleValidator: {\n runStyleAudit: (\n elements: Array<{ elementId: string; styles: Record<string, string> }>,\n guide: unknown\n ) => unknown;\n} | null = null;\n\n// Try to load quality evaluator from the web SDK (optional peer dep)\nlet qualityEvaluator: {\n evaluateQuality: (\n elements: ElementDesignData[],\n viewport: { width: number; height: number },\n context?: unknown\n ) => unknown;\n listContexts: () => Array<{ name: string; description: string }>;\n createBaseline: (\n elements: ElementDesignData[],\n viewport: { width: number; height: number },\n label?: string\n ) => unknown;\n diffSnapshots: (baseline: unknown, current: ElementDesignData[]) => unknown;\n} | null = null;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const specs = require('@qontinui/ui-bridge/specs');\n styleValidator = specs;\n qualityEvaluator = specs;\n} catch {\n // Optional dependency not installed — audit/evaluate endpoints will return an error\n}\n\nfunction success<T>(data: T): APIResponse<T> {\n return { success: true, data, timestamp: Date.now() };\n}\n\nfunction error<T = unknown>(message: string, code?: string): APIResponse<T> {\n return { success: false, error: message, code, timestamp: Date.now() };\n}\n\n/**\n * Design handler interface (subset of NativeServerHandlers)\n */\nexport interface NativeDesignHandlers {\n getElementStyles: (ctx: HandlerContext) => Promise<APIResponse<ElementDesignData>>;\n getElementStateStyles: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ elementId: string; stateStyles: StateStyles[] }>>;\n getDesignSnapshot: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ elements: ElementDesignData[]; timestamp: number }>>;\n getResponsiveSnapshots: (ctx: HandlerContext) => Promise<APIResponse<ResponsiveSnapshot[]>>;\n runDesignAudit: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n loadStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<{ loaded: boolean }>>;\n getStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n clearStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n evaluateQuality: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n getQualityContexts: (\n ctx: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; description: string }>>>;\n saveBaseline: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ saved: boolean; elementCount: number }>>;\n diffBaseline: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n}\n\n/**\n * Create design review handlers.\n */\nexport function createDesignHandlers(registry: NativeUIBridgeRegistry): NativeDesignHandlers {\n // Helper to get screen dimensions (React Native's Dimensions API must be\n // called at handler time, not import time, so we use a lazy getter).\n function getScreenDimensions(): { width: number; height: number } {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { Dimensions } = require('react-native');\n const screen = Dimensions.get('screen');\n return { width: screen.width, height: screen.height };\n } catch {\n return { width: 0, height: 0 };\n }\n }\n\n return {\n // 1. GET /design/element/:id/styles\n getElementStyles: async (ctx) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error('Element not found: ' + id, 'ELEMENT_NOT_FOUND');\n }\n\n const state = element.getState();\n const data = getNativeElementDesignData(\n id,\n element.label,\n element.type,\n element.flatStyle,\n state.layout\n );\n\n return success(data);\n },\n\n // 2. POST /design/element/:id/state-styles\n getElementStateStyles: async (ctx) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error('Element not found: ' + id, 'ELEMENT_NOT_FOUND');\n }\n\n const stateStyles = captureNativeStateVariations(element.flatStyle, element.stateStyles);\n\n return success({ elementId: id, stateStyles });\n },\n\n // 3. POST /design/snapshot\n getDesignSnapshot: async (ctx) => {\n const body = ctx.body as\n | {\n elementIds?: string[];\n includePseudoElements?: boolean;\n }\n | undefined;\n\n let elements = registry.getAllElements();\n\n // Filter to requested IDs if specified\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n return success({ elements: designData, timestamp: Date.now() });\n },\n\n // 4. POST /design/responsive\n getResponsiveSnapshots: async () => {\n // Platform limitation: RN cannot constrain screen width at runtime.\n // Returns a single snapshot at current device dimensions.\n const elements = registry.getAllElements();\n const elementData = elements.map((el) => {\n const state = el.getState();\n return {\n id: el.id,\n label: el.label,\n type: el.type,\n flatStyle: el.flatStyle,\n layout: state.layout,\n };\n });\n\n const snapshots = captureNativeResponsiveSnapshot(elementData, getScreenDimensions());\n return success(snapshots);\n },\n\n // 5. POST /design/audit\n runDesignAudit: async (ctx) => {\n const body = ctx.body as\n | {\n guide?: unknown;\n elementIds?: string[];\n }\n | undefined;\n\n const guide = body?.guide ?? loadedStyleGuide;\n\n if (!guide) {\n return error('No style guide loaded or provided', 'NO_STYLE_GUIDE');\n }\n\n if (!styleValidator) {\n return error(\n 'Install @qontinui/ui-bridge for style audit support. ' +\n 'Add it as a dependency: npm install @qontinui/ui-bridge',\n 'VALIDATOR_NOT_AVAILABLE'\n );\n }\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n // Map elements to the format expected by the validator\n const auditElements = elements.map((el) => ({\n elementId: el.id,\n styles: mapNativeStyleToExtended(el.flatStyle) as unknown as Record<string, string>,\n }));\n\n try {\n const report = styleValidator.runStyleAudit(auditElements, guide);\n return success(report);\n } catch (err) {\n return error(\n 'Audit failed: ' + (err instanceof Error ? err.message : String(err)),\n 'DESIGN_AUDIT_ERROR'\n );\n }\n },\n\n // 6. POST /design/style-guide/load\n loadStyleGuide: async (ctx) => {\n const body = ctx.body as { guide?: unknown } | undefined;\n\n if (!body?.guide) {\n return error('Style guide is required in request body', 'INVALID_REQUEST');\n }\n\n loadedStyleGuide = body.guide;\n return success({ loaded: true });\n },\n\n // 7. GET /design/style-guide\n getStyleGuide: async () => {\n return success(loadedStyleGuide);\n },\n\n // 8. DELETE /design/style-guide\n clearStyleGuide: async () => {\n loadedStyleGuide = null;\n return success({ cleared: true });\n },\n\n // 9. POST /design/evaluate\n evaluateQuality: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support. ' +\n 'Add it as a dependency: npm install @qontinui/ui-bridge',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n const body = ctx.body as\n | {\n context?: string;\n customContext?: unknown;\n elementIds?: string[];\n viewport?: { width: number; height: number };\n }\n | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n const viewport = body?.viewport ?? getScreenDimensions();\n\n // Resolve context: custom object > style guide context > built-in name\n let context: unknown = body?.customContext ?? body?.context ?? 'general';\n if (typeof context === 'string' && loadedStyleGuide) {\n const guide = loadedStyleGuide as { qualityContexts?: Record<string, unknown> };\n if (guide.qualityContexts?.[context]) {\n context = guide.qualityContexts[context];\n }\n }\n\n try {\n const report = qualityEvaluator.evaluateQuality(designData, viewport, context);\n return success(report);\n } catch (err) {\n return error(\n 'Evaluation failed: ' + (err instanceof Error ? err.message : String(err)),\n 'QUALITY_EVALUATION_ERROR'\n );\n }\n },\n\n // 10. GET /design/evaluate/contexts\n getQualityContexts: async () => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n return success(qualityEvaluator.listContexts());\n },\n\n // 11. POST /design/evaluate/baseline\n saveBaseline: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n const body = ctx.body as\n | {\n label?: string;\n elementIds?: string[];\n }\n | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n const viewport = getScreenDimensions();\n savedBaseline = qualityEvaluator.createBaseline(designData, viewport, body?.label);\n return success({ saved: true, elementCount: designData.length });\n },\n\n // 12. POST /design/evaluate/diff\n diffBaseline: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n if (!savedBaseline) {\n return error('No baseline saved. Call saveBaseline first.', 'NO_BASELINE');\n }\n\n const body = ctx.body as { elementIds?: string[] } | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n try {\n const report = qualityEvaluator.diffSnapshots(savedBaseline, designData);\n return success(report);\n } catch (err) {\n return error(\n 'Diff failed: ' + (err instanceof Error ? err.message : String(err)),\n 'DIFF_BASELINE_ERROR'\n );\n }\n },\n };\n}\n","/**\n * UI Bridge Native Server Handlers\n *\n * Request handlers for the HTTP API endpoints.\n */\n\nimport { type NativeUIBridgeRegistry, extractHandlerNames } from '../core/registry';\nimport type {\n NativeElementType,\n NativeLayout,\n NativeModalInfo,\n WaitOptions,\n WorkflowStep,\n} from '../core/types';\nimport type { NativeActionExecutor } from '../control/types';\nimport type {\n APIResponse,\n ConsoleErrorsResponse,\n DismissModalResponse,\n FillFormFieldInput,\n FillFormFieldResult,\n FillFormResponse,\n HandlerContext,\n NativeServerHandlers,\n NetworkRequestsResponse,\n PushModalRequest,\n PushModalResponse,\n TapAtResponse,\n} from './types';\nimport { createDesignHandlers } from './design-handlers';\nimport type { ConsoleErrorBuffer, NetworkRequestBuffer } from './observability';\n\n/**\n * Result of executing a single workflow step\n */\ninterface WorkflowStepResult {\n stepId: string;\n type: string;\n status: 'completed' | 'failed' | 'skipped';\n result?: unknown;\n error?: string;\n durationMs: number;\n}\n\n/**\n * Execute a single workflow step using the registry and executor\n */\nasync function executeWorkflowStep(\n step: WorkflowStep,\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor\n): Promise<WorkflowStepResult> {\n const startTime = Date.now();\n\n try {\n switch (step.type) {\n case 'element-action': {\n if (!step.target || !step.action) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'element-action step requires target and action',\n durationMs: Date.now() - startTime,\n };\n }\n\n const response = await executor.executeAction(step.target, {\n action: step.action,\n params: step.params,\n waitOptions: step.waitOptions,\n });\n\n return {\n stepId: step.id,\n type: step.type,\n status: response.success ? 'completed' : 'failed',\n result: response.result,\n error: response.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'component-action': {\n if (!step.target || !step.action) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'component-action step requires target and action',\n durationMs: Date.now() - startTime,\n };\n }\n\n const response = await executor.executeComponentAction(step.target, {\n action: step.action,\n params: step.params,\n });\n\n return {\n stepId: step.id,\n type: step.type,\n status: response.success ? 'completed' : 'failed',\n result: response.result,\n error: response.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'wait': {\n if (!step.target) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'wait step requires target element id',\n durationMs: Date.now() - startTime,\n };\n }\n\n const waitResult = await executor.waitForElement(\n step.target,\n step.waitOptions || { visible: true, timeout: 10000, interval: 100 }\n );\n\n return {\n stepId: step.id,\n type: step.type,\n status: waitResult.met ? 'completed' : 'failed',\n result: waitResult.state,\n error: waitResult.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'assert': {\n if (!step.target) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'assert step requires target element id',\n durationMs: Date.now() - startTime,\n };\n }\n\n const element = registry.getElement(step.target);\n if (!element) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: `Element not found: ${step.target}`,\n durationMs: Date.now() - startTime,\n };\n }\n\n const state = element.getState();\n const expected = step.params || {};\n const stateRecord = state as unknown as Record<string, unknown>;\n const mismatches: string[] = [];\n\n for (const [key, value] of Object.entries(expected)) {\n const actual = stateRecord[key];\n const isEqual =\n typeof value === 'object' && value !== null\n ? JSON.stringify(actual) === JSON.stringify(value)\n : actual === value;\n if (!isEqual) {\n mismatches.push(\n `${key}: expected ${JSON.stringify(value)}, got ${JSON.stringify(actual)}`\n );\n }\n }\n\n return {\n stepId: step.id,\n type: step.type,\n status: mismatches.length === 0 ? 'completed' : 'failed',\n result: { state, mismatches },\n error: mismatches.length > 0 ? `Assertion failed: ${mismatches.join('; ')}` : undefined,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'custom': {\n if (!step.handler) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'custom step requires a handler function',\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await step.handler();\n // Allow handlers to signal failure by returning { success: false, error: '...' }\n const failed =\n result &&\n typeof result === 'object' &&\n 'success' in result &&\n (result as Record<string, unknown>).success === false;\n\n return {\n stepId: step.id,\n type: step.type,\n status: failed ? 'failed' : 'completed',\n result,\n error: failed\n ? ((result as Record<string, unknown>).error as string) ||\n 'Custom handler returned failure'\n : undefined,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'log': {\n const message = step.params?.message ?? step.params?.text ?? `[workflow] step ${step.id}`;\n console.log(`[ui-bridge-native] workflow log: ${message}`);\n\n return {\n stepId: step.id,\n type: step.type,\n status: 'completed',\n result: { message },\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'navigate':\n case 'branch':\n case 'loop':\n case 'extract':\n return {\n stepId: step.id,\n type: step.type,\n status: 'skipped',\n error: `Step type \"${step.type}\" is not yet supported in native workflow execution`,\n durationMs: Date.now() - startTime,\n };\n\n default:\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: `Unknown step type: ${step.type}`,\n durationMs: Date.now() - startTime,\n };\n }\n } catch (err) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Create a success response\n */\nfunction success<T>(data: T): APIResponse<T> {\n return {\n success: true,\n data,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create an error response\n */\nfunction error<T = unknown>(message: string, code?: string): APIResponse<T> {\n return {\n success: false,\n error: message,\n code,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create server handlers\n */\nexport function createServerHandlers(\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor,\n config?: {\n appInfo?: { appId: string; appName: string; appType: string; framework?: string };\n /** Optional console-error ring buffer powering `GET /control/console-errors`. */\n consoleErrorBuffer?: ConsoleErrorBuffer;\n /** Optional network-request ring buffer powering `GET /sdk/network-requests`. */\n networkRequestBuffer?: NetworkRequestBuffer;\n }\n): NativeServerHandlers {\n const designHandlers = createDesignHandlers(registry);\n\n return {\n // Elements\n getElements: async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx.query?.visibleOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.visibleOnly === true;\n const forRoute = (ctx.query?.route || (ctx.body as Record<string, unknown>)?.route) as\n | string\n | undefined;\n\n let allElements = visibleOnly ? registry.getVisibleElements() : registry.getAllElements();\n\n // Filter by specific route (injected by setRouteProvider override when currentRouteOnly is set)\n if (forRoute) {\n allElements = allElements.filter((e) => e.registrationRoute === forRoute);\n }\n\n const elements = allElements.map((e) => {\n const handlers = extractHandlerNames(e.props);\n return {\n id: e.id,\n type: e.type,\n label: e.label,\n identifier: e.getIdentifier(),\n state: e.getState(),\n actions: e.actions,\n customActions: e.customActions ? Object.keys(e.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: e.registrationRoute,\n };\n });\n\n return success({ elements });\n },\n\n getElement: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error(`Element not found: ${id}`, 'ELEMENT_NOT_FOUND');\n }\n\n const handlers = extractHandlerNames(element.props);\n\n return success({\n element: {\n id: element.id,\n type: element.type,\n label: element.label,\n identifier: element.getIdentifier(),\n state: element.getState(),\n actions: element.actions,\n customActions: element.customActions ? Object.keys(element.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: element.registrationRoute,\n },\n });\n },\n\n getElementState: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error(`Element not found: ${id}`, 'ELEMENT_NOT_FOUND');\n }\n\n return success({ state: element.getState() });\n },\n\n executeAction: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const body = ctx.body as {\n action: string;\n params?: Record<string, unknown>;\n waitOptions?: WaitOptions;\n };\n\n if (!body?.action) {\n return error('Action is required', 'INVALID_REQUEST');\n }\n\n const response = await executor.executeAction(id, {\n action: body.action,\n params: body.params,\n waitOptions: body.waitOptions,\n });\n\n if (!response.success) {\n return error(response.error || 'Action failed', 'ACTION_FAILED');\n }\n\n return success(response);\n },\n\n // Components\n getComponents: async () => {\n const components = registry.getAllComponents().map((c) => ({\n id: c.id,\n name: c.name,\n description: c.description,\n actions: c.actions.map((a) => ({ id: a.id, label: a.label })),\n elementIds: c.elementIds,\n }));\n\n return success({ components });\n },\n\n getComponent: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const component = registry.getComponent(id);\n\n if (!component) {\n return error(`Component not found: ${id}`, 'COMPONENT_NOT_FOUND');\n }\n\n return success({\n component: {\n id: component.id,\n name: component.name,\n description: component.description,\n actions: component.actions.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n })),\n elementIds: component.elementIds,\n },\n });\n },\n\n executeComponentAction: async (ctx: HandlerContext) => {\n const { id, actionId } = ctx.params;\n const body = ctx.body as { params?: Record<string, unknown> };\n\n const response = await executor.executeComponentAction(id, {\n action: actionId,\n params: body?.params,\n });\n\n if (!response.success) {\n return error(response.error || 'Action failed', 'ACTION_FAILED');\n }\n\n return success(response);\n },\n\n // Discovery\n //\n // Native parity with the runner's `POST /ui-bridge/ai/find`. The runner\n // matches a free-text `query` against label > text > value > aria-label >\n // placeholder > name. We replicate that here against the native registry's\n // analogues:\n // 1. `label` (the registered display label)\n // 2. identifier fields: `testId`, `accessibilityLabel`, `treePath`, `uiId`\n // 3. registered handler names (e.g. `onPress`, `onChangeText`)\n //\n // Match is case-insensitive substring. Empty/missing query falls back to\n // the structured filters (types/visibleOnly/etc.) so callers that don't\n // pass `query` still get the legacy behaviour. Once we've narrowed by\n // query the response is shaped through the executor's NativeFindResponse\n // envelope so the wire format stays stable.\n find: async (ctx: HandlerContext) => {\n const body = ctx.body as {\n query?: string;\n types?: NativeElementType[];\n testIdPattern?: string;\n accessibilityLabelPattern?: string;\n visibleOnly?: boolean;\n limit?: number;\n };\n\n const response = await executor.find({\n types: body?.types,\n testIdPattern: body?.testIdPattern,\n accessibilityLabelPattern: body?.accessibilityLabelPattern,\n visibleOnly: body?.visibleOnly,\n // When `query` is supplied we apply our own limit *after* ranking so\n // the highest-priority matches survive the cap; defer slicing to us\n // by widening here.\n limit: body?.query && body.query.length > 0 ? undefined : body?.limit,\n });\n\n const rawQuery = typeof body?.query === 'string' ? body.query.trim() : '';\n if (rawQuery.length === 0) {\n return success(response);\n }\n\n const needle = rawQuery.toLowerCase();\n const containsNeedle = (value: unknown): boolean =>\n typeof value === 'string' && value.toLowerCase().includes(needle);\n\n // Score each discovered element by best-priority field match. Lower\n // priorityRank wins; ties keep registry insertion order (stable sort).\n const scored: Array<{ priorityRank: number; element: (typeof response.elements)[number] }> =\n [];\n\n for (const el of response.elements) {\n let priorityRank = Number.POSITIVE_INFINITY;\n\n // 1. label\n if (containsNeedle(el.label)) {\n priorityRank = Math.min(priorityRank, 0);\n }\n\n // 2. identifier fields\n const ident = el.identifier;\n if (ident) {\n if (containsNeedle(ident.testId)) priorityRank = Math.min(priorityRank, 1);\n if (containsNeedle(ident.accessibilityLabel)) priorityRank = Math.min(priorityRank, 1);\n if (containsNeedle(ident.treePath)) priorityRank = Math.min(priorityRank, 1);\n if (containsNeedle(ident.uiId)) priorityRank = Math.min(priorityRank, 1);\n }\n\n // 3. registered handler names — pull from the registry since the\n // discovered envelope doesn't include props.\n if (priorityRank === Number.POSITIVE_INFINITY) {\n const registered = registry.getElement(el.id);\n const handlers = extractHandlerNames(registered?.props);\n if (handlers.some((h) => h.toLowerCase().includes(needle))) {\n priorityRank = 2;\n }\n }\n\n if (priorityRank !== Number.POSITIVE_INFINITY) {\n scored.push({ priorityRank, element: el });\n }\n }\n\n scored.sort((a, b) => a.priorityRank - b.priorityRank);\n\n const limit = body?.limit && body.limit > 0 ? body.limit : undefined;\n const filtered = limit ? scored.slice(0, limit) : scored;\n\n return success({\n ...response,\n elements: filtered.map((s) => s.element),\n total: filtered.length,\n });\n },\n\n getSnapshot: async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx.query?.visibleOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.visibleOnly === true;\n const currentRouteOnly =\n ctx.query?.currentRouteOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.currentRouteOnly === true;\n // Pass `undefined` (not `null`) for routeInfo so `createSnapshot`\n // falls back to a registry-registered route provider if one exists —\n // without that fallback, the cloud-relay / bare-server path would\n // emit `currentRoute: null` even when a `RouteTracker` was wired.\n const snapshot = registry.createSnapshot(undefined, { visibleOnly, currentRouteOnly });\n return success(snapshot);\n },\n\n // Workflows\n getWorkflows: async () => {\n const workflows = registry.getAllWorkflows().map((w) => ({\n id: w.id,\n name: w.name,\n description: w.description,\n stepCount: w.steps.length,\n }));\n\n return success({ workflows });\n },\n\n runWorkflow: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const workflow = registry.getWorkflow(id);\n\n if (!workflow) {\n return error(`Workflow not found: ${id}`, 'WORKFLOW_NOT_FOUND');\n }\n\n const runId = `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const startTime = Date.now();\n const stepResults: WorkflowStepResult[] = [];\n let status: 'completed' | 'failed' = 'completed';\n\n registry.emit('workflow:started', {\n runId,\n workflowId: id,\n workflowName: workflow.name,\n totalSteps: workflow.steps.length,\n });\n\n for (const step of workflow.steps) {\n const stepResult = await executeWorkflowStep(step, registry, executor);\n stepResults.push(stepResult);\n\n if (stepResult.status === 'completed' || stepResult.status === 'skipped') {\n registry.emit('workflow:stepCompleted', {\n runId,\n workflowId: id,\n step: stepResult,\n });\n }\n\n if (stepResult.status === 'failed') {\n status = 'failed';\n registry.emit('workflow:failed', {\n runId,\n workflowId: id,\n failedStep: stepResult,\n completedSteps: stepResults.length - 1,\n totalSteps: workflow.steps.length,\n });\n break;\n }\n }\n\n if (status === 'completed') {\n registry.emit('workflow:completed', {\n runId,\n workflowId: id,\n steps: stepResults,\n totalDurationMs: Date.now() - startTime,\n });\n }\n\n return success({\n runId,\n status,\n steps: stepResults,\n totalSteps: workflow.steps.length,\n completedSteps: stepResults.filter((s) => s.status === 'completed').length,\n failedSteps: stepResults.filter((s) => s.status === 'failed').length,\n skippedSteps: stepResults.filter((s) => s.status === 'skipped').length,\n durationMs: Date.now() - startTime,\n });\n },\n\n // Page Navigation (stubs — React Native apps should override with their navigation provider)\n pageRefresh: async () => {\n return error('Page refresh not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageNavigate: async () => {\n return error('Page navigation not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageReplace: async () => {\n return error('Page replace not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageGoBack: async () => {\n return error('Page go back not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageGoForward: async () => {\n return error('Page go forward not supported on native platform', 'NOT_SUPPORTED');\n },\n\n // Screenshot (stub — apps should override with their screen capture library)\n getScreenshot: async () => {\n return error(\n 'Screenshot not supported. Provide a screenshotProvider to UIBridgeNativeProvider.',\n 'NOT_SUPPORTED'\n );\n },\n\n // Meta / Introspection (stub — server constructor overrides with real route table)\n getMethods: async () => {\n return error('Methods introspection not configured', 'NOT_SUPPORTED');\n },\n\n // AI helpers\n //\n // Mobile-side parity with the runner's `POST /ui-bridge/ai/fill-form`.\n // Each entry in `fields` is dispatched through the existing executor as a\n // `type` action with `clear: true` so the input value is replaced\n // atomically (the closest native equivalent to the web bridge's\n // \"setValue\" semantics — there is no `setValue` action on native).\n //\n // Failures do not short-circuit: every field is attempted, and the\n // response carries per-field success/error plus aggregate counts.\n fillForm: async (ctx: HandlerContext): Promise<APIResponse<FillFormResponse>> => {\n const body = ctx.body as { fields?: unknown } | undefined;\n const rawFields = body?.fields;\n\n if (!Array.isArray(rawFields)) {\n return error('Request body must include \"fields\" array', 'INVALID_REQUEST');\n }\n\n const results: FillFormFieldResult[] = [];\n\n for (let i = 0; i < rawFields.length; i++) {\n const field = rawFields[i] as Partial<FillFormFieldInput> | null | undefined;\n\n // Validate per-field shape; record the failure but keep going so the\n // caller gets a complete picture of what worked and what didn't.\n if (!field || typeof field !== 'object') {\n results.push({\n elementId: '',\n success: false,\n error: `fields[${i}] must be an object with \"elementId\" and \"value\"`,\n });\n continue;\n }\n\n const { elementId, value } = field;\n\n if (typeof elementId !== 'string' || elementId.length === 0) {\n results.push({\n elementId: typeof elementId === 'string' ? elementId : '',\n success: false,\n error: `fields[${i}] is missing a non-empty \"elementId\"`,\n });\n continue;\n }\n\n if (typeof value !== 'string') {\n results.push({\n elementId,\n success: false,\n error: `fields[${i}] is missing a string \"value\"`,\n });\n continue;\n }\n\n try {\n const response = await executor.executeAction(elementId, {\n action: 'type',\n params: { text: value, clear: true },\n });\n\n if (response.success) {\n results.push({ elementId, success: true });\n } else {\n results.push({\n elementId,\n success: false,\n error: response.error ?? 'Action failed',\n });\n }\n } catch (err) {\n // executor.executeAction normally captures errors itself, but a\n // bespoke executor implementation may still throw — surface that.\n results.push({\n elementId,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const succeededCount = results.filter((r) => r.success).length;\n const failedCount = results.length - succeededCount;\n\n return success({ results, succeededCount, failedCount });\n },\n\n // Coord-based tap\n //\n // Synthesizes a press at the given screen coordinates by scanning the\n // registered elements' layout rects for a containing match. We prefer the\n // *topmost* match (smallest area = innermost child) since native UIs\n // generally render parents before children, and the user's tap should\n // logically hit the leaf-most interactive element.\n //\n // Coords are interpreted in the absolute (screen) space published by\n // `measureInWindow`; we compare against `pageX/pageY` when available and\n // fall back to the layout's relative `x/y` so this works in test fixtures\n // that don't measure (the fallback only matches single-rooted screens but\n // is good enough for the unit suite).\n tapAt: async (ctx: HandlerContext): Promise<APIResponse<TapAtResponse>> => {\n const body = ctx.body as Partial<{\n x: number;\n y: number;\n action: 'press' | 'longPress' | 'doubleTap';\n }> | undefined;\n\n const x = body?.x;\n const y = body?.y;\n\n if (typeof x !== 'number' || !Number.isFinite(x)) {\n return error<TapAtResponse>('\"x\" must be a finite number', 'INVALID_REQUEST');\n }\n if (typeof y !== 'number' || !Number.isFinite(y)) {\n return error<TapAtResponse>('\"y\" must be a finite number', 'INVALID_REQUEST');\n }\n\n const action = body?.action ?? 'press';\n const allowedActions: ReadonlyArray<TapAtResponse['action']> = [\n 'press',\n 'longPress',\n 'doubleTap',\n ];\n if (!allowedActions.includes(action)) {\n return error<TapAtResponse>(\n `\"action\" must be one of: ${allowedActions.join(', ')}`,\n 'INVALID_REQUEST'\n );\n }\n\n // Collect all candidates whose layout rect contains (x, y). Prefer\n // pageX/pageY (absolute coords) when both are populated; fall back to\n // the relative x/y otherwise.\n type Candidate = {\n elementId: string;\n layout: NativeLayout;\n area: number;\n };\n const candidates: Candidate[] = [];\n\n for (const el of registry.getAllElements()) {\n const state = el.getState();\n const layout = state?.layout;\n if (!layout) continue;\n if (\n typeof layout.width !== 'number' ||\n typeof layout.height !== 'number' ||\n layout.width <= 0 ||\n layout.height <= 0\n ) {\n continue;\n }\n\n const hasPage =\n typeof layout.pageX === 'number' &&\n typeof layout.pageY === 'number' &&\n Number.isFinite(layout.pageX) &&\n Number.isFinite(layout.pageY);\n\n const left = hasPage ? layout.pageX : layout.x;\n const top = hasPage ? layout.pageY : layout.y;\n\n if (\n x >= left &&\n x <= left + layout.width &&\n y >= top &&\n y <= top + layout.height\n ) {\n candidates.push({\n elementId: el.id,\n layout,\n area: layout.width * layout.height,\n });\n }\n }\n\n if (candidates.length === 0) {\n return error<TapAtResponse>(\n `No element registered at (${x}, ${y})`,\n 'no_element_at_coords'\n );\n }\n\n // Topmost = smallest area. Stable sort preserves registration order for\n // ties, so a parent and a same-size child won't flip non-deterministically.\n candidates.sort((a, b) => a.area - b.area);\n const target = candidates[0];\n\n const response = await executor.executeAction(target.elementId, { action });\n if (!response.success) {\n return error<TapAtResponse>(response.error || 'Action failed', 'ACTION_FAILED');\n }\n\n return success<TapAtResponse>({\n elementId: target.elementId,\n action,\n layout: {\n x: target.layout.x,\n y: target.layout.y,\n width: target.layout.width,\n height: target.layout.height,\n pageX: target.layout.pageX,\n pageY: target.layout.pageY,\n },\n });\n },\n\n // Observability — console error / network request ring buffers.\n //\n // The buffers are owned by NativeUIBridgeServer and patched onto the\n // globals on `start()` (gated behind `features.testHooks`). When no\n // buffer is provided (no testHooks, or a stripped-down server fixture),\n // these handlers gracefully return empty arrays so callers can probe\n // without 500ing.\n getConsoleErrors: async (ctx: HandlerContext): Promise<APIResponse<ConsoleErrorsResponse>> => {\n const buf = config?.consoleErrorBuffer;\n const since = ctx.query?.since !== undefined ? Number(ctx.query.since) : undefined;\n const limit = ctx.query?.limit !== undefined ? Number(ctx.query.limit) : undefined;\n\n if (!buf) {\n return success<ConsoleErrorsResponse>({\n entries: [],\n count: 0,\n bufferSize: 0,\n });\n }\n\n const entries = buf.entries({\n since: typeof since === 'number' && Number.isFinite(since) ? since : undefined,\n limit: typeof limit === 'number' && Number.isFinite(limit) ? limit : undefined,\n });\n\n return success<ConsoleErrorsResponse>({\n entries,\n count: entries.length,\n bufferSize: buf.size(),\n });\n },\n\n getNetworkRequests: async (\n ctx: HandlerContext\n ): Promise<APIResponse<NetworkRequestsResponse>> => {\n const buf = config?.networkRequestBuffer;\n const since = ctx.query?.since !== undefined ? Number(ctx.query.since) : undefined;\n const limit = ctx.query?.limit !== undefined ? Number(ctx.query.limit) : undefined;\n\n if (!buf) {\n return success<NetworkRequestsResponse>({\n entries: [],\n count: 0,\n bufferSize: 0,\n });\n }\n\n const entries = buf.entries({\n since: typeof since === 'number' && Number.isFinite(since) ? since : undefined,\n limit: typeof limit === 'number' && Number.isFinite(limit) ? limit : undefined,\n });\n\n return success<NetworkRequestsResponse>({\n entries,\n count: entries.length,\n bufferSize: buf.size(),\n });\n },\n\n // Test hooks — modal stack manipulation\n //\n // These two endpoints exist so external automation runners can drive\n // ModalDetector state via HTTP, mirroring the in-tree `pushModal` /\n // `dismissModal` calls that components normally make. They're gated by\n // `features.testHooks` at the route layer (see http-server.ts); the\n // handlers themselves still defend against a missing modalDetector\n // because the bare server path used by CloudRelayClient may run before\n // enrichers are wired.\n pushModal: async (ctx: HandlerContext): Promise<APIResponse<PushModalResponse>> => {\n const detector = registry.getEnrichers().modalDetector;\n if (!detector) {\n return error<PushModalResponse>(\n 'modal detector not registered',\n 'ENRICHER_UNAVAILABLE'\n );\n }\n\n const body = ctx.body as Partial<PushModalRequest> | undefined;\n const id = body?.id;\n if (typeof id !== 'string' || id.length === 0) {\n return error<PushModalResponse>(\n 'pushModal requires a non-empty \"id\"',\n 'INVALID_REQUEST'\n );\n }\n\n const allowedTypes = ['modal', 'sheet', 'drawer', 'popover', 'alertdialog', 'dialog'];\n const requestedType = body?.type;\n if (\n requestedType !== undefined &&\n (typeof requestedType !== 'string' || !allowedTypes.includes(requestedType))\n ) {\n return error<PushModalResponse>(\n `pushModal \"type\" must be one of: ${allowedTypes.join(', ')}`,\n 'INVALID_REQUEST'\n );\n }\n\n detector.pushModal({\n id,\n title: body?.title,\n // requestedType is narrowed by the allowedTypes guard above; the cast\n // converts the validated string to the NativeModalInfo['type'] union.\n type: requestedType as NativeModalInfo['type'] | undefined,\n blocking: body?.blocking,\n dismissible: body?.dismissible,\n });\n\n // Pull the canonicalised entry back out so the response reflects what's\n // actually in the stack (defaults applied, detectedAt populated).\n const stored = detector.getActive().find((m) => m.id === id);\n return success<PushModalResponse>({\n pushed: true,\n id,\n title: stored?.title,\n type: stored?.type,\n blocking: stored?.blocking,\n dismissible: stored?.dismissible,\n pushedAt: stored?.detectedAt ?? Date.now(),\n });\n },\n\n dismissModal: async (ctx: HandlerContext): Promise<APIResponse<DismissModalResponse>> => {\n const detector = registry.getEnrichers().modalDetector;\n if (!detector) {\n return error<DismissModalResponse>(\n 'modal detector not registered',\n 'ENRICHER_UNAVAILABLE'\n );\n }\n\n const { id } = ctx.params;\n if (typeof id !== 'string' || id.length === 0) {\n return error<DismissModalResponse>(\n 'dismissModal requires a modal id in the path',\n 'INVALID_REQUEST'\n );\n }\n\n // The slot type allows `dismissModal` to return either `boolean` (the\n // canonical ModalDetector class) or `void` (legacy/duck-typed impls).\n // Probe via `getActive()` first so the result is consistent regardless\n // of the implementation's return signal.\n const wasPresent = detector.getActive().some((m) => m.id === id);\n if (!wasPresent) {\n return error<DismissModalResponse>(`modal not found: ${id}`, 'MODAL_NOT_FOUND');\n }\n\n detector.dismissModal(id);\n return success<DismissModalResponse>({ dismissed: id });\n },\n\n // Design Review\n ...designHandlers,\n\n // Health\n health: async () => {\n const stats = registry.getStats();\n const registration = registry.getRegistrationCoverage();\n const response: Record<string, unknown> = {\n status: 'healthy',\n timestamp: Date.now(),\n ...stats,\n registration,\n };\n\n if (config?.appInfo) {\n response.uiBridge = {\n version: '0.3.0',\n ...config.appInfo,\n capabilities: ['elements', 'components', 'actions', 'design'],\n elementCount: stats.elements,\n componentCount: stats.components,\n };\n }\n\n return success(response);\n },\n };\n}\n","/**\n * UI Bridge Native — observability ring buffers.\n *\n * Two small last-N buffers backing the `/control/console-errors` and\n * `/sdk/network-requests` endpoints. Each buffer monkey-patches the relevant\n * global on `install()` and restores the original on `uninstall()`, so they\n * can be installed/torn-down with the server's lifecycle.\n *\n * Both buffers are gated behind `features.testHooks` by the caller (see\n * NativeUIBridgeServer). Production builds default to `testHooks: false`,\n * so these patches never run on real users' devices.\n *\n * Implementation notes:\n * - Buffers default to capacity 100 entries and drop oldest on overflow.\n * - Patches are idempotent: `install()` is a no-op when already installed;\n * `uninstall()` is a no-op when not installed.\n * - Patches only restore the *original* function captured at install time;\n * if other code wraps `console.error` / `fetch` between install and\n * uninstall, those wrappers will be lost. Acceptable for test hooks.\n */\nimport type { ConsoleErrorEntry, NetworkRequestEntry } from './types';\n\n// ── Ring buffer ─────────────────────────────────────────────────────────────\n\n/** A simple ring buffer that drops oldest on overflow. */\nclass RingBuffer<T extends { timestamp: number }> {\n private items: T[] = [];\n\n constructor(private readonly capacity: number) {}\n\n push(entry: T): void {\n this.items.push(entry);\n if (this.items.length > this.capacity) {\n this.items.splice(0, this.items.length - this.capacity);\n }\n }\n\n /**\n * Return entries optionally filtered by `since` (timestamp ms) and capped\n * at `limit`. Newest-end is preserved when `limit` would otherwise truncate.\n */\n entries(opts: { since?: number; limit?: number } = {}): T[] {\n const { since, limit } = opts;\n let filtered = this.items;\n if (typeof since === 'number') {\n filtered = filtered.filter((e) => e.timestamp >= since);\n }\n if (typeof limit === 'number' && limit >= 0 && filtered.length > limit) {\n filtered = filtered.slice(filtered.length - limit);\n }\n return filtered.slice();\n }\n\n size(): number {\n return this.items.length;\n }\n\n clear(): void {\n this.items.length = 0;\n }\n}\n\n// ── Console error buffer ────────────────────────────────────────────────────\n\ninterface PatchedConsole {\n error: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n}\n\n/**\n * Format console arguments the same way `console.log` would (joined by\n * spaces, with errors stringified to their `message`).\n */\nfunction formatConsoleArgs(args: unknown[]): string {\n return args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ');\n}\n\n/** Pull the first `Error` from the args, if any, and return its `.stack`. */\nfunction extractStack(args: unknown[]): string | undefined {\n for (const a of args) {\n if (a instanceof Error && a.stack) return a.stack;\n }\n return undefined;\n}\n\nexport class ConsoleErrorBuffer {\n private buffer: RingBuffer<ConsoleErrorEntry>;\n private installed = false;\n private originalError?: PatchedConsole['error'];\n private originalWarn?: PatchedConsole['warn'];\n\n constructor(capacity = 100) {\n this.buffer = new RingBuffer<ConsoleErrorEntry>(capacity);\n }\n\n install(): void {\n if (this.installed) return;\n if (typeof console === 'undefined') return;\n\n // Capture the originals as-is (no .bind) so `uninstall()` restores the\n // exact reference callers had before we touched the global.\n this.originalError = console.error as PatchedConsole['error'];\n this.originalWarn = console.warn as PatchedConsole['warn'];\n\n const buffer = this.buffer;\n const origError = this.originalError;\n const origWarn = this.originalWarn;\n\n console.error = (...args: unknown[]): void => {\n try {\n buffer.push({\n timestamp: Date.now(),\n level: 'error',\n message: formatConsoleArgs(args),\n stack: extractStack(args),\n });\n } catch {\n // Never let the patch throw — fall through to the original.\n }\n origError.apply(console, args);\n };\n\n console.warn = (...args: unknown[]): void => {\n try {\n buffer.push({\n timestamp: Date.now(),\n level: 'warn',\n message: formatConsoleArgs(args),\n stack: extractStack(args),\n });\n } catch {\n // ignore\n }\n origWarn.apply(console, args);\n };\n\n this.installed = true;\n }\n\n uninstall(): void {\n if (!this.installed) return;\n if (typeof console === 'undefined') return;\n\n if (this.originalError) console.error = this.originalError;\n if (this.originalWarn) console.warn = this.originalWarn;\n\n this.originalError = undefined;\n this.originalWarn = undefined;\n this.installed = false;\n }\n\n entries(opts: { since?: number; limit?: number } = {}): ConsoleErrorEntry[] {\n return this.buffer.entries(opts);\n }\n\n size(): number {\n return this.buffer.size();\n }\n\n clear(): void {\n this.buffer.clear();\n }\n\n isInstalled(): boolean {\n return this.installed;\n }\n}\n\n// ── Network request buffer ──────────────────────────────────────────────────\n\ntype FetchFn = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\n/**\n * Best-effort URL extraction from a `fetch` first-arg. Mirrors what RN's\n * polyfill accepts (string | URL | Request).\n */\nfunction extractUrl(input: unknown): string {\n if (typeof input === 'string') return input;\n if (input && typeof input === 'object') {\n const obj = input as { url?: unknown; toString?: () => string };\n if (typeof obj.url === 'string') return obj.url;\n try {\n return String(input);\n } catch {\n return '';\n }\n }\n return '';\n}\n\n/**\n * Best-effort method extraction. `fetch(url, {method})` overrides the\n * Request's method, so we check `init` first and fall back to the Request.\n */\nfunction extractMethod(input: unknown, init?: RequestInit): string {\n if (init && typeof init.method === 'string') return init.method.toUpperCase();\n if (input && typeof input === 'object') {\n const obj = input as { method?: unknown };\n if (typeof obj.method === 'string') return obj.method.toUpperCase();\n }\n return 'GET';\n}\n\n/** Minimal shape of `globalThis` we patch. Avoids depending on DOM types. */\ninterface PatchableGlobal {\n fetch?: FetchFn;\n XMLHttpRequest?: typeof XMLHttpRequest;\n}\n\nexport class NetworkRequestBuffer {\n private buffer: RingBuffer<NetworkRequestEntry>;\n private installed = false;\n private originalFetch?: FetchFn;\n private originalXhrOpen?: typeof XMLHttpRequest.prototype.open;\n private originalXhrSend?: typeof XMLHttpRequest.prototype.send;\n\n constructor(capacity = 100) {\n this.buffer = new RingBuffer<NetworkRequestEntry>(capacity);\n }\n\n install(): void {\n if (this.installed) return;\n const g = globalThis as PatchableGlobal;\n\n if (typeof g.fetch === 'function') {\n // Capture the original reference as-is so `uninstall()` restores the\n // exact function callers had before we patched.\n this.originalFetch = g.fetch;\n const buffer = this.buffer;\n const original = this.originalFetch;\n\n const patched: FetchFn = async (input, init) => {\n const start = Date.now();\n const url = extractUrl(input);\n const method = extractMethod(input, init);\n\n try {\n const res = await original.call(globalThis, input, init);\n buffer.push({\n timestamp: start,\n method,\n url,\n status: res.status,\n durationMs: Date.now() - start,\n ok: res.ok,\n });\n return res;\n } catch (err) {\n buffer.push({\n timestamp: start,\n method,\n url,\n status: 0,\n durationMs: Date.now() - start,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n };\n\n g.fetch = patched;\n }\n\n // Patch XMLHttpRequest if present (RN ships it; node doesn't unless polyfilled).\n if (typeof g.XMLHttpRequest === 'function') {\n const Xhr = g.XMLHttpRequest;\n this.originalXhrOpen = Xhr.prototype.open;\n this.originalXhrSend = Xhr.prototype.send;\n\n const buffer = this.buffer;\n\n // Stash method+url on the instance so `send` can record them.\n const origOpen = this.originalXhrOpen;\n Xhr.prototype.open = function (\n this: XMLHttpRequest & {\n __uiBridgeMethod?: string;\n __uiBridgeUrl?: string;\n },\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n this.__uiBridgeMethod = method.toUpperCase();\n this.__uiBridgeUrl = typeof url === 'string' ? url : String(url);\n // origOpen has overloaded signatures; we forward the original args.\n return (origOpen as (...args: unknown[]) => unknown).call(\n this,\n method,\n url,\n ...rest\n ) as void;\n } as typeof XMLHttpRequest.prototype.open;\n\n const origSend = this.originalXhrSend;\n Xhr.prototype.send = function (\n this: XMLHttpRequest & {\n __uiBridgeMethod?: string;\n __uiBridgeUrl?: string;\n },\n body?: Document | XMLHttpRequestBodyInit | null\n ) {\n const start = Date.now();\n const method = this.__uiBridgeMethod ?? 'GET';\n const url = this.__uiBridgeUrl ?? '';\n\n const finalize = (status: number, ok: boolean, error?: string) => {\n buffer.push({\n timestamp: start,\n method,\n url,\n status,\n durationMs: Date.now() - start,\n ok,\n error,\n });\n };\n\n const onLoadEnd = () => {\n this.removeEventListener('loadend', onLoadEnd);\n this.removeEventListener('error', onError);\n finalize(this.status, this.status >= 200 && this.status < 300);\n };\n const onError = () => {\n this.removeEventListener('loadend', onLoadEnd);\n this.removeEventListener('error', onError);\n finalize(0, false, 'XMLHttpRequest error');\n };\n\n this.addEventListener('loadend', onLoadEnd);\n this.addEventListener('error', onError);\n\n return (origSend as (...args: unknown[]) => unknown).call(\n this,\n body\n ) as void;\n } as typeof XMLHttpRequest.prototype.send;\n }\n\n this.installed = true;\n }\n\n uninstall(): void {\n if (!this.installed) return;\n const g = globalThis as PatchableGlobal;\n\n if (this.originalFetch) {\n g.fetch = this.originalFetch;\n this.originalFetch = undefined;\n }\n if (typeof g.XMLHttpRequest === 'function') {\n if (this.originalXhrOpen) {\n g.XMLHttpRequest.prototype.open = this.originalXhrOpen;\n }\n if (this.originalXhrSend) {\n g.XMLHttpRequest.prototype.send = this.originalXhrSend;\n }\n }\n this.originalXhrOpen = undefined;\n this.originalXhrSend = undefined;\n this.installed = false;\n }\n\n entries(opts: { since?: number; limit?: number } = {}): NetworkRequestEntry[] {\n return this.buffer.entries(opts);\n }\n\n size(): number {\n return this.buffer.size();\n }\n\n clear(): void {\n this.buffer.clear();\n }\n\n isInstalled(): boolean {\n return this.installed;\n }\n}\n","/**\n * WebSocket JSON-RPC message types for the UI Bridge protocol.\n */\n\n// ── Client → Server ─────────────────────────────────────────────────────────\n\n/** Standard JSON-RPC request */\nexport interface JsonRpcRequest {\n id: number | string;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/** Batch request — execute multiple requests concurrently */\nexport interface JsonRpcBatchRequest {\n id: number | string;\n batch: JsonRpcRequest[];\n}\n\n/** Subscribe to registry events */\nexport interface JsonRpcSubscribe {\n id: number | string;\n method: 'subscribe';\n params: {\n events: string[];\n /** Optional throttle in ms — batch rapid events within this window */\n throttleMs?: number;\n };\n}\n\n/** Unsubscribe from registry events */\nexport interface JsonRpcUnsubscribe {\n id: number | string;\n method: 'unsubscribe';\n params: { events: string[] };\n}\n\n/** Any client message */\nexport type JsonRpcClientMessage =\n | JsonRpcRequest\n | JsonRpcBatchRequest\n | JsonRpcSubscribe\n | JsonRpcUnsubscribe;\n\n// ── Server → Client ─────────────────────────────────────────────────────────\n\n/** Standard JSON-RPC response */\nexport interface JsonRpcResponse {\n id: number | string;\n result?: {\n success: boolean;\n data?: unknown;\n error?: string;\n code?: string;\n timestamp?: number;\n };\n}\n\n/** Batch response */\nexport interface JsonRpcBatchResponse {\n id: number | string;\n results: JsonRpcResponse[];\n}\n\n/** Server-pushed event (no id — not a response to a request) */\nexport interface JsonRpcEvent {\n event: string;\n data: unknown;\n timestamp: number;\n}\n\n/** Any server message */\nexport type JsonRpcServerMessage = JsonRpcResponse | JsonRpcBatchResponse | JsonRpcEvent;\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Check if a message is a batch request */\nexport function isBatchRequest(msg: unknown): msg is JsonRpcBatchRequest {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'batch' in msg &&\n Array.isArray((msg as JsonRpcBatchRequest).batch)\n );\n}\n\n/** Check if a message is a subscribe request */\nexport function isSubscribe(msg: unknown): msg is JsonRpcSubscribe {\n return (\n typeof msg === 'object' && msg !== null && (msg as JsonRpcSubscribe).method === 'subscribe'\n );\n}\n\n/** Check if a message is an unsubscribe request */\nexport function isUnsubscribe(msg: unknown): msg is JsonRpcUnsubscribe {\n return (\n typeof msg === 'object' && msg !== null && (msg as JsonRpcUnsubscribe).method === 'unsubscribe'\n );\n}\n","/**\n * UI Bridge Native HTTP Server\n *\n * Abstract HTTP server implementation for React Native.\n * This provides a framework-agnostic server interface that can be\n * implemented using various React Native HTTP server libraries.\n *\n * Supported libraries:\n * - react-native-http-bridge (recommended)\n * - @aspect/react-native-http-server\n * - Custom implementations\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { NativeActionExecutor, PageNavigationResponse } from '../control/types';\nimport type {\n NativeServerConfig,\n NativeServerHandlers,\n NavigationProvider,\n RouteProvider,\n ScreenshotProvider,\n APIResponse,\n HandlerContext,\n} from './types';\nimport type { BridgeEvent } from '../core/types';\nimport { createServerHandlers } from './handlers';\nimport { ConsoleErrorBuffer, NetworkRequestBuffer } from './observability';\nimport type { WebSocketEventBridge } from './ws-event-bridge';\nimport type { JsonRpcRequest, JsonRpcResponse } from './ws-types';\nimport { isBatchRequest, isSubscribe, isUnsubscribe } from './ws-types';\n\n// ── Path pattern matching ───────────────────────────────────────────────────\n\n/**\n * Match an actual path against a pattern with :name placeholders.\n * Returns extracted params, or null if the pattern does not match.\n *\n * Example: parsePath('control/element/:id/action', 'control/element/tab-runs/action')\n * → { id: 'tab-runs' }\n */\nfunction parsePath(pattern: string, actual: string): Record<string, string> | null {\n const patternParts = pattern.split('/');\n const actualParts = actual.split('/');\n\n if (patternParts.length !== actualParts.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(':')) {\n params[patternParts[i].slice(1)] = actualParts[i];\n } else if (patternParts[i] !== actualParts[i]) {\n return null;\n }\n }\n return params;\n}\n\n// ── WebSocket route table ───────────────────────────────────────────────────\n\n/**\n * Route table for WebSocket JSON-RPC methods.\n *\n * Method strings use the same path structure as HTTP routes (with :id placeholders)\n * but without the /ui-bridge/ prefix. Path params are extracted automatically.\n *\n * Examples:\n * \"health\" → handlers.health\n * \"control/snapshot\" → handlers.getSnapshot\n * \"control/element/tab-runs/action\" → handlers.executeAction ({id: 'tab-runs'})\n * \"control/component/my-comp/action/submit\" → handlers.executeComponentAction\n */\ntype HandlerKey = keyof NativeServerHandlers;\ntype HttpVerb = 'GET' | 'POST' | 'DELETE';\n\ninterface WsRoute {\n pattern: string;\n handler: HandlerKey;\n /**\n * HTTP verbs this route accepts when invoked over HTTP. When absent the\n * route is WS-only (or matches any verb on HTTP). Multiple verbs allow\n * a single pattern to serve GET+POST etc.\n */\n httpMethods?: readonly HttpVerb[];\n /**\n * When true, the route is only mounted (HTTP + WS + manifest) when the\n * server config opts in via `testHooks`. Production builds default to\n * `testHooks: false` so these endpoints simply don't exist in the route\n * table — agents probing `/_routes` won't see them.\n */\n requiresTestHooks?: boolean;\n}\n\nconst WS_ROUTES: readonly WsRoute[] = [\n // Health\n { pattern: 'health', handler: 'health', httpMethods: ['GET'] },\n\n // Elements\n { pattern: 'control/elements', handler: 'getElements', httpMethods: ['GET'] },\n // Flat alias — matches the runner UI Bridge's `/ui-bridge/elements` path so\n // agents can use the same URL across runner + mobile without remembering\n // the `control/` prefix. Delegates to the same handler.\n { pattern: 'elements', handler: 'getElements', httpMethods: ['GET'] },\n { pattern: 'control/element/:id', handler: 'getElement', httpMethods: ['GET'] },\n { pattern: 'control/element/:id/state', handler: 'getElementState', httpMethods: ['GET'] },\n { pattern: 'control/element/:id/action', handler: 'executeAction', httpMethods: ['POST'] },\n\n // Components\n { pattern: 'control/components', handler: 'getComponents', httpMethods: ['GET'] },\n { pattern: 'control/component/:id', handler: 'getComponent', httpMethods: ['GET'] },\n {\n pattern: 'control/component/:id/action/:actionId',\n handler: 'executeComponentAction',\n httpMethods: ['POST'],\n },\n\n // Discovery\n { pattern: 'control/find', handler: 'find', httpMethods: ['POST'] },\n // Runner-parity alias for `control/find`; the runner exposes its\n // AI-powered element search at `/ui-bridge/ai/find`, so mobile mounts the\n // same handler at both paths to keep agents portable across platforms.\n { pattern: 'ai/find', handler: 'find', httpMethods: ['POST'] },\n { pattern: 'control/snapshot', handler: 'getSnapshot', httpMethods: ['GET'] },\n { pattern: 'control/discover', handler: 'getSnapshot' },\n\n // Workflows\n { pattern: 'control/workflows', handler: 'getWorkflows', httpMethods: ['GET'] },\n { pattern: 'control/workflow/:id/run', handler: 'runWorkflow', httpMethods: ['POST'] },\n\n // Page Navigation\n { pattern: 'control/page/refresh', handler: 'pageRefresh', httpMethods: ['POST'] },\n { pattern: 'control/page/navigate', handler: 'pageNavigate', httpMethods: ['POST'] },\n { pattern: 'control/page/replace', handler: 'pageReplace', httpMethods: ['POST'] },\n { pattern: 'control/page/back', handler: 'pageGoBack', httpMethods: ['POST'] },\n { pattern: 'control/page/forward', handler: 'pageGoForward', httpMethods: ['POST'] },\n\n // Screenshot — accepts both GET and POST on HTTP\n { pattern: 'control/screenshot', handler: 'getScreenshot', httpMethods: ['GET', 'POST'] },\n\n // Design Review\n { pattern: 'design/element/:id/styles', handler: 'getElementStyles', httpMethods: ['GET'] },\n {\n pattern: 'design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n httpMethods: ['POST'],\n },\n { pattern: 'design/snapshot', handler: 'getDesignSnapshot', httpMethods: ['POST'] },\n { pattern: 'design/responsive', handler: 'getResponsiveSnapshots', httpMethods: ['POST'] },\n { pattern: 'design/audit', handler: 'runDesignAudit', httpMethods: ['POST'] },\n { pattern: 'design/style-guide/load', handler: 'loadStyleGuide', httpMethods: ['POST'] },\n { pattern: 'design/style-guide', handler: 'getStyleGuide', httpMethods: ['GET'] },\n // style-guide/clear: WS uses this pattern; HTTP uses DELETE on /design/style-guide.\n // We keep a WS-only entry for the explicit \"clear\" subpath, and add a DELETE-on-style-guide entry.\n { pattern: 'design/style-guide/clear', handler: 'clearStyleGuide' },\n { pattern: 'design/style-guide', handler: 'clearStyleGuide', httpMethods: ['DELETE'] },\n\n // Quality Evaluation\n { pattern: 'design/evaluate', handler: 'evaluateQuality', httpMethods: ['POST'] },\n { pattern: 'design/evaluate/contexts', handler: 'getQualityContexts', httpMethods: ['GET'] },\n { pattern: 'design/evaluate/baseline', handler: 'saveBaseline', httpMethods: ['POST'] },\n { pattern: 'design/evaluate/diff', handler: 'diffBaseline', httpMethods: ['POST'] },\n\n // Meta / Introspection\n { pattern: 'meta/methods', handler: 'getMethods', httpMethods: ['GET'] },\n\n // AI helpers — mobile parity with the runner's `/ui-bridge/ai/*` family.\n { pattern: 'ai/fill-form', handler: 'fillForm', httpMethods: ['POST'] },\n\n // Coord-based tap — synthesizes a press at the given screen coords by\n // matching against registered elements' layout rects.\n { pattern: 'control/tap', handler: 'tapAt', httpMethods: ['POST'] },\n\n // Test hooks — gated behind `features.testHooks`. Let external runners\n // drive the ModalDetector over HTTP so tests can flip `snapshot.modalStack`\n // without mounting React components.\n {\n pattern: 'control/modal/push',\n handler: 'pushModal',\n httpMethods: ['POST'],\n requiresTestHooks: true,\n },\n {\n pattern: 'control/modal/dismiss/:id',\n handler: 'dismissModal',\n httpMethods: ['POST'],\n requiresTestHooks: true,\n },\n\n // Observability — last-N console errors + network requests. testHooks-gated\n // because patching `console.error` / `fetch` is invasive in production.\n {\n pattern: 'control/console-errors',\n handler: 'getConsoleErrors',\n httpMethods: ['GET'],\n requiresTestHooks: true,\n },\n {\n pattern: 'sdk/network-requests',\n handler: 'getNetworkRequests',\n httpMethods: ['GET'],\n requiresTestHooks: true,\n },\n];\n\n// ── _help payload ───────────────────────────────────────────────────────────\n\n/**\n * Short description keyed by handler name — rendered alongside the route\n * list so `_help` is self-documenting. Only needs to cover handlers that\n * appear in WS_ROUTES.\n */\nconst HANDLER_DESCRIPTIONS: Record<string, string> = {\n health: 'Liveness probe; returns app metadata + element count',\n getElements: 'Flat list of registered UI elements',\n getElement: 'Single element by id',\n getElementState: 'Dynamic state (value, focused, checked) for one element',\n executeAction: 'Run an action on an element (see \"actions\" below for names)',\n getComponents: 'Higher-level components with action schemas',\n getComponent: 'Component detail + per-action paramSchema',\n executeComponentAction: 'Invoke a component action directly (preferred over button clicks)',\n find: 'AI-powered element search by natural-language query',\n getSnapshot:\n 'Full snapshot: elements + route + state. Supports ?visibleOnly=true and ?currentRouteOnly=true',\n getWorkflows: 'List registered workflows',\n runWorkflow: 'Trigger a workflow by id',\n pageRefresh: 'Reload the current route',\n pageNavigate: 'Imperative router.push(url) — preferred over tapping tab buttons',\n pageReplace: 'router.replace(url)',\n pageGoBack: 'router.back()',\n pageGoForward: 'router.forward()',\n getScreenshot: 'PNG screenshot of the current screen',\n getElementStyles: 'Computed styles for an element (design review)',\n getElementStateStyles: 'Computed styles per interaction state (hover/focus/disabled)',\n getDesignSnapshot: 'Visual + style snapshot for design review',\n getResponsiveSnapshots: 'Screenshots at multiple viewport widths',\n runDesignAudit: 'Accessibility + visual audit',\n loadStyleGuide: 'Load a design system style guide',\n getStyleGuide: 'Fetch the currently loaded style guide',\n clearStyleGuide: 'Unload the style guide',\n evaluateQuality: 'Score the current UI against a quality context',\n getQualityContexts: 'List available quality evaluation contexts',\n saveBaseline: 'Save a quality baseline snapshot',\n diffBaseline: 'Diff current UI against a saved baseline',\n getMethods: 'List every handler name (legacy introspection)',\n fillForm:\n 'Fill multiple inputs in one call: body { fields: [{elementId, value}] } — each field dispatches `type` + `clear:true`',\n tapAt:\n 'Synthesize a press at given screen coords by matching registered element layout rects: body { x, y, action? }',\n getConsoleErrors:\n 'TEST HOOK — last-N console.error/console.warn entries; ?since=<ms>&limit=<n>',\n getNetworkRequests:\n 'TEST HOOK — last-N fetch/XHR entries with status + duration; ?since=<ms>&limit=<n>',\n pushModal:\n 'TEST HOOK — push a modal onto the snapshot.modalStack via the registry ModalDetector',\n dismissModal:\n 'TEST HOOK — dismiss a modal by id from the snapshot.modalStack via the registry ModalDetector',\n};\n\n/** Static reference for common action names + their params. */\nconst ACTION_REFERENCE = [\n { name: 'press', aliases: ['click'], params: 'PressActionParams (optional position)' },\n { name: 'longPress', params: 'PressActionParams (optional position)' },\n { name: 'doubleTap', params: 'none' },\n {\n name: 'type',\n params:\n 'TypeActionParams { text, delay?, clear? | clearFirst? } — `clear:true` replaces content atomically',\n },\n { name: 'clear', params: 'none — empties the input' },\n { name: 'focus', params: 'none' },\n { name: 'blur', params: 'none' },\n { name: 'scroll', params: 'ScrollActionParams { offset? {x,y}, to? }' },\n { name: 'swipe', params: 'SwipeActionParams { direction, distance }' },\n { name: 'toggle', params: 'none — flips boolean controls' },\n];\n\n/**\n * Minimal `{method, path}` list matching the runner's `/_routes` shape so\n * the same URL works across platforms. Expanded multi-verb routes into one\n * entry per verb. `testHooks` enables the gated `control/modal/*` endpoints.\n */\nfunction buildRoutesPayload(testHooks: boolean) {\n const entries: Array<{ method: string; path: string }> = [];\n for (const r of WS_ROUTES) {\n if (!r.httpMethods) continue;\n if (r.requiresTestHooks && !testHooks) continue;\n for (const m of r.httpMethods) {\n entries.push({ method: m, path: `/ui-bridge/${r.pattern}` });\n }\n }\n // Expose the two discovery endpoints themselves so self-reference is clean.\n entries.push({ method: 'GET', path: '/ui-bridge/_help' });\n entries.push({ method: 'GET', path: '/ui-bridge/_routes' });\n entries.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));\n return { routes: entries, count: entries.length };\n}\n\n/**\n * Build the `/_help` payload: route index + action reference.\n * Cheap to compute; we don't cache since it's rarely called.\n * Routes that require `testHooks` are filtered out when the flag is off so\n * agents probing the manifest never see endpoints they can't call.\n */\nfunction buildHelpPayload(testHooks: boolean) {\n return {\n version: 1,\n description: 'UI Bridge Native HTTP surface. Prefix every path with /ui-bridge/.',\n routes: WS_ROUTES.filter((r) => !r.requiresTestHooks || testHooks).map((r) => ({\n pattern: r.pattern,\n httpMethods: r.httpMethods ?? [],\n wsOnly: !r.httpMethods,\n handler: r.handler,\n description: HANDLER_DESCRIPTIONS[r.handler] ?? '',\n })),\n actions: ACTION_REFERENCE,\n tips: [\n 'Start with `GET /ui-bridge/control/snapshot?visibleOnly=true` to see what the user actually sees.',\n 'Prefer `control/component/:id/action/:actionId` over button presses — typed paramSchema, no button-id guessing.',\n 'Use `pageNavigate` for tab switches instead of pressing tab buttons; gesture state often swallows clicks.',\n 'The `type` action supports `clear:true` to replace existing text atomically in one call.',\n ],\n };\n}\n\n/**\n * HTTP Request interface (library-agnostic)\n */\nexport interface HTTPRequest {\n method: string;\n path: string;\n headers: Record<string, string>;\n query: Record<string, string>;\n body?: unknown;\n}\n\n/**\n * HTTP Response interface (library-agnostic)\n */\nexport interface HTTPResponse {\n status: number;\n headers: Record<string, string>;\n body: string;\n}\n\n/**\n * Request handler type\n */\nexport type RequestHandler = (request: HTTPRequest) => Promise<HTTPResponse>;\n\n/**\n * Server adapter interface\n *\n * Implement this interface to integrate with your chosen HTTP server library.\n */\nexport interface ServerAdapter {\n /** Start the server */\n start(port: number, handler: RequestHandler): Promise<void>;\n /** Stop the server */\n stop(): Promise<void>;\n /** Check if server is running */\n isRunning(): boolean;\n}\n\n/**\n * WebSocket-aware server adapter interface.\n *\n * Extends ServerAdapter with callbacks for WebSocket connections.\n * The adapter manages the raw TCP/WS layer; these callbacks let the\n * UI Bridge server handle message routing and event broadcasting.\n */\nexport interface WebSocketServerAdapter extends ServerAdapter {\n /** Called when a JSON text frame is received from a WS client. Returns response string or null. */\n onWebSocketMessage?: (connId: string, message: string) => Promise<string | null>;\n /** Called when a new WS connection is established after the HTTP 101 upgrade. */\n onWebSocketConnect?: (connId: string) => void;\n /** Called when a WS connection is closed or drops. */\n onWebSocketDisconnect?: (connId: string) => void;\n /** Send a message to a specific WS connection by ID. */\n sendToConnection?: (connId: string, message: string) => void;\n /** Send a message to all connected WS clients. */\n broadcast?: (message: string) => void;\n}\n\n/**\n * Native UI Bridge HTTP Server\n */\nexport class NativeUIBridgeServer {\n private config: NativeServerConfig;\n private handlers: NativeServerHandlers;\n private adapter?: ServerAdapter;\n private running = false;\n /**\n * Per-connection cleanup thunks for in-flight waiters (waitForElement,\n * waitForCondition, ...). Aborted when a client disconnects so the\n * underlying timers/listeners don't leak.\n */\n private pendingWaiters = new Map<string, Set<() => void>>();\n\n /**\n * Observability ring buffers backing `/control/console-errors` and\n * `/sdk/network-requests`. Allocated unconditionally so the handler can\n * always read them, but the global patches (`install()`) only fire on\n * `start()` when `testHooks` is set — production builds don't monkey-patch.\n */\n private consoleErrorBuffer: ConsoleErrorBuffer;\n private networkRequestBuffer: NetworkRequestBuffer;\n\n constructor(\n private registry: NativeUIBridgeRegistry,\n private executor: NativeActionExecutor,\n config: NativeServerConfig = {}\n ) {\n this.config = {\n serverPort: 8087,\n cors: true,\n ...config,\n };\n this.consoleErrorBuffer = new ConsoleErrorBuffer();\n this.networkRequestBuffer = new NetworkRequestBuffer();\n // Mirror appInfo into the registry so `createSnapshot` includes it\n // automatically — keeps the default `getSnapshot` handler and any other\n // call site (e.g. context.createSnapshot, cloud-relay tunnels) on the\n // same code path without each having to thread `appInfo` through.\n if (this.config.appInfo) {\n this.registry.setAppInfo(this.config.appInfo);\n }\n this.handlers = createServerHandlers(registry, executor, {\n appInfo: this.config.appInfo,\n consoleErrorBuffer: this.consoleErrorBuffer,\n networkRequestBuffer: this.networkRequestBuffer,\n });\n\n // Set up method introspection from the route table\n this.handlers.getMethods = async () => {\n const testHooks = this.config.testHooks === true;\n const methods = WS_ROUTES.filter((r) => !r.requiresTestHooks || testHooks).map((r) => ({\n method: r.pattern,\n httpMethods: r.httpMethods ? [...r.httpMethods] : undefined,\n }));\n // Add special WebSocket-only methods not in the route table\n const wsMethods = [\n { method: 'waitForElement', description: 'Wait for an element to be registered' },\n { method: 'waitForCondition', description: 'Wait for an element state predicate' },\n { method: 'sequence', description: 'Execute a sequence of steps in order' },\n { method: 'events/history', description: 'Replay recent registry events' },\n { method: 'subscriptions/list', description: 'List current event subscriptions' },\n ];\n return {\n success: true,\n data: { methods: [...methods, ...wsMethods] },\n timestamp: Date.now(),\n };\n };\n }\n\n /**\n * Set the server adapter\n */\n setAdapter(adapter: ServerAdapter): void {\n this.adapter = adapter;\n }\n\n /**\n * Set a navigation provider for programmatic route navigation.\n * This enables `control/page/navigate` and `control/page/back` on native.\n */\n setNavigationProvider(provider: NavigationProvider): void {\n this.handlers.pageNavigate = async (ctx): Promise<APIResponse<PageNavigationResponse>> => {\n const body = ctx.body as Record<string, unknown> | undefined;\n const url = body?.url;\n if (!url || typeof url !== 'string') {\n return { success: false, error: 'Missing required \"url\" parameter', timestamp: Date.now() };\n }\n try {\n provider.navigate(url);\n return {\n success: true,\n data: { success: true, url, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: unknown) {\n return {\n success: false,\n error: `Navigation failed: ${e instanceof Error ? e.message : String(e)}`,\n timestamp: Date.now(),\n };\n }\n };\n\n this.handlers.pageReplace = async (ctx): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.replace) {\n return {\n success: false,\n error: 'Replace navigation not supported by navigation provider',\n timestamp: Date.now(),\n };\n }\n const body = ctx.body as Record<string, unknown> | undefined;\n const url = body?.url;\n if (!url || typeof url !== 'string') {\n return { success: false, error: 'Missing required \"url\" parameter', timestamp: Date.now() };\n }\n try {\n provider.replace(url);\n return {\n success: true,\n data: { success: true, url, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: unknown) {\n return {\n success: false,\n error: `Replace navigation failed: ${e instanceof Error ? e.message : String(e)}`,\n timestamp: Date.now(),\n };\n }\n };\n\n this.handlers.pageGoBack = async (): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.back) {\n return { success: false, error: 'Back navigation not supported', timestamp: Date.now() };\n }\n try {\n provider.back();\n return {\n success: true,\n data: { success: true, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: unknown) {\n return {\n success: false,\n error: `Back navigation failed: ${e instanceof Error ? e.message : String(e)}`,\n timestamp: Date.now(),\n };\n }\n };\n\n this.handlers.pageRefresh = async (): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.refresh) {\n return {\n success: false,\n error: 'Page refresh not supported by navigation provider',\n timestamp: Date.now(),\n };\n }\n try {\n provider.refresh();\n return {\n success: true,\n data: { success: true, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: unknown) {\n return {\n success: false,\n error: `Refresh failed: ${e instanceof Error ? e.message : String(e)}`,\n timestamp: Date.now(),\n };\n }\n };\n }\n\n /**\n * Set a route provider for reporting the current navigation route.\n * When set, `control/snapshot` responses include `currentRoute` and `segments`.\n *\n * Also forwards the provider into the registry so the *default*\n * `getSnapshot` handler (and any other call site of\n * `registry.createSnapshot`) reads the route too — without this the\n * cloud-relay/bare-server path returned `currentRoute: null` even when\n * a `RouteTracker` was wired, because that path never installed the\n * server-level handler override below.\n */\n setRouteProvider(provider: RouteProvider): void {\n this.registry.setRouteProvider(provider);\n // Override getElements to support currentRouteOnly filtering with real route data\n const baseGetElements = this.handlers.getElements;\n this.handlers.getElements = async (ctx: HandlerContext) => {\n const currentRouteOnly =\n ctx.query?.currentRouteOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.currentRouteOnly === true;\n\n // If currentRouteOnly requested and no explicit route param, inject the current route\n if (currentRouteOnly && !ctx.query?.route && !(ctx.body as Record<string, unknown>)?.route) {\n const currentRoute = provider.getCurrentRoute();\n if (currentRoute) {\n // Inject route into query so the base handler can filter by it\n ctx.query = { ...ctx.query, route: currentRoute };\n }\n }\n return baseGetElements(ctx);\n };\n\n this.handlers.getSnapshot = async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx?.query?.visibleOnly === 'true' ||\n (ctx?.body as Record<string, unknown>)?.visibleOnly === true;\n const currentRouteOnly =\n ctx?.query?.currentRouteOnly === 'true' ||\n (ctx?.body as Record<string, unknown>)?.currentRouteOnly === true;\n const snapshot = this.registry.createSnapshot(\n {\n currentRoute: provider.getCurrentRoute(),\n segments: provider.getSegments?.(),\n },\n { visibleOnly, currentRouteOnly }\n );\n return { success: true, data: snapshot, timestamp: Date.now() };\n };\n }\n\n /**\n * Set a screenshot provider for native screen capture.\n * This enables `control/screenshot` on native.\n */\n setScreenshotProvider(provider: ScreenshotProvider): void {\n const SCREENSHOT_TIMEOUT_MS = 10_000;\n this.handlers.getScreenshot = async () => {\n try {\n const result = await Promise.race([\n provider.capture(),\n new Promise<never>((_, reject) =>\n setTimeout(\n () =>\n reject(new Error(`Screenshot capture timed out after ${SCREENSHOT_TIMEOUT_MS}ms`)),\n SCREENSHOT_TIMEOUT_MS\n )\n ),\n ]);\n return {\n success: true,\n data: { screenshot: result.base64, width: result.width, height: result.height },\n timestamp: Date.now(),\n };\n } catch (e: unknown) {\n return {\n success: false,\n error: `Screenshot capture failed: ${e instanceof Error ? e.message : String(e)}`,\n timestamp: Date.now(),\n };\n }\n };\n }\n\n /**\n * Start the HTTP server\n */\n async start(): Promise<void> {\n if (this.running) {\n console.warn('[ui-bridge-native] Server already running');\n return;\n }\n\n if (!this.adapter) {\n console.warn('[ui-bridge-native] No server adapter configured. Call setAdapter() first.');\n console.warn('[ui-bridge-native] See documentation for supported adapters.');\n return;\n }\n\n // Install observability patches before binding the port — gated behind\n // `testHooks` so production builds don't monkey-patch console/fetch.\n if (this.config.testHooks === true) {\n this.consoleErrorBuffer.install();\n this.networkRequestBuffer.install();\n }\n\n await this.adapter.start(this.config.serverPort!, this.handleRequest.bind(this));\n this.running = true;\n\n console.log(`[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`);\n }\n\n /**\n * Stop the HTTP server\n */\n async stop(): Promise<void> {\n if (!this.running || !this.adapter) {\n return;\n }\n\n await this.adapter.stop();\n this.running = false;\n\n // Restore the original globals; idempotent if never installed.\n this.consoleErrorBuffer.uninstall();\n this.networkRequestBuffer.uninstall();\n\n console.log('[ui-bridge-native] HTTP server stopped');\n }\n\n /**\n * Check if server is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n // ── WebSocket Support ───────────────────────────────────────────────────\n\n private eventBridge?: WebSocketEventBridge;\n\n /**\n * Set the event bridge for WebSocket event broadcasting and subscriptions.\n */\n setEventBridge(bridge: WebSocketEventBridge): void {\n this.eventBridge = bridge;\n }\n\n /**\n * Handle a JSON-RPC message from a WebSocket client.\n * Parses the message, routes to the appropriate handler, and returns\n * a JSON string response (or null for events that need no response).\n */\n async handleWebSocketMessage(connId: string, rawMessage: string): Promise<string | null> {\n let msg: unknown;\n try {\n msg = JSON.parse(rawMessage);\n } catch {\n return JSON.stringify({\n error: 'Invalid JSON',\n timestamp: Date.now(),\n });\n }\n\n if (typeof msg !== 'object' || msg === null) {\n return JSON.stringify({\n error: 'Message must be a JSON object',\n timestamp: Date.now(),\n });\n }\n\n const message = msg as Record<string, unknown>;\n const id = (message.id as string | number | undefined) ?? 0;\n\n // Handle batch requests\n if (isBatchRequest(message)) {\n const results = await this.handleBatchRequest(message.batch);\n return JSON.stringify({ id, results });\n }\n\n // Handle subscribe\n if (isSubscribe(message)) {\n const events = message.params?.events || [];\n const throttleMs = message.params?.throttleMs;\n const ok = this.eventBridge?.handleSubscribe(connId, events, throttleMs) ?? false;\n return JSON.stringify({\n id,\n result: {\n success: ok,\n data: { subscribed: events },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Handle unsubscribe\n if (isUnsubscribe(message)) {\n const events = message.params?.events || [];\n const ok = this.eventBridge?.handleUnsubscribe(connId, events) ?? false;\n return JSON.stringify({\n id,\n result: {\n success: ok,\n data: { unsubscribed: events },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const method = message.method as string;\n const params = (message.params || {}) as Record<string, unknown>;\n\n // ── Connection-aware special methods ──────────────────────────────────\n\n // subscriptions/list — return current subscriptions + throttle for this connection\n if (method === 'subscriptions/list') {\n const events = this.eventBridge?.getSubscriptions(connId) ?? [];\n const throttleMs = this.eventBridge?.getThrottleMs(connId);\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: { events, throttleMs: throttleMs ?? null },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // waitForElement — resolve when element is registered, or timeout\n if (method === 'waitForElement') {\n return this.handleWaitForElement(connId, id, params);\n }\n\n // waitForCondition — resolve when an element state predicate becomes true\n if (method === 'waitForCondition') {\n return this.handleWaitForCondition(connId, id, params);\n }\n\n // sequence — execute steps in order, stop on first failure\n if (method === 'sequence') {\n return this.handleSequence(id, params);\n }\n\n // events/history — replay recent events matching optional filter\n if (method === 'events/history') {\n const eventsFilter = Array.isArray(params.events) ? (params.events as string[]) : undefined;\n const since = typeof params.since === 'number' ? params.since : undefined;\n const limit = typeof params.limit === 'number' ? params.limit : undefined;\n const history = this.eventBridge?.getHistory({ events: eventsFilter, since }) ?? [];\n const sliced =\n limit !== undefined && limit > 0 && history.length > limit\n ? history.slice(history.length - limit)\n : history;\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: { events: sliced },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Standard JSON-RPC request\n\n if (!method) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing \"method\" field',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n try {\n const apiResponse = await this.routeMethodToHandler(method, params);\n return JSON.stringify({ id, result: apiResponse } satisfies JsonRpcResponse);\n } catch (error) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: error instanceof Error ? error.message : 'Internal error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n }\n\n /**\n * Execute a batch of JSON-RPC requests concurrently.\n */\n async handleBatchRequest(batch: JsonRpcRequest[]): Promise<JsonRpcResponse[]> {\n return Promise.all(\n batch.map(async (req) => {\n try {\n const result = await this.routeMethodToHandler(\n req.method,\n (req.params || {}) as Record<string, unknown>\n );\n return { id: req.id, result } as JsonRpcResponse;\n } catch (error) {\n return {\n id: req.id,\n result: {\n success: false,\n error: error instanceof Error ? error.message : 'Internal error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse;\n }\n })\n );\n }\n\n /**\n * Register an in-flight waiter's cleanup thunk under the given connection.\n * Returns an `unregister` thunk that the natural-resolution path should\n * call so the cleanup isn't re-invoked on disconnect.\n */\n private registerWaiter(connId: string, cleanup: () => void): () => void {\n let set = this.pendingWaiters.get(connId);\n if (!set) {\n set = new Set();\n this.pendingWaiters.set(connId, set);\n }\n set.add(cleanup);\n return () => {\n const s = this.pendingWaiters.get(connId);\n if (!s) return;\n s.delete(cleanup);\n if (s.size === 0) this.pendingWaiters.delete(connId);\n };\n }\n\n /**\n * Abort all pending waiters associated with a connection. Called by the\n * provider's WS disconnect handler so timers/listeners don't leak after\n * the client goes away.\n */\n abortWaitersForConnection(connId: string): void {\n const set = this.pendingWaiters.get(connId);\n if (!set) return;\n for (const cleanup of set) {\n try {\n cleanup();\n } catch (err) {\n console.warn('[ui-bridge-native] waiter cleanup threw:', err);\n }\n }\n this.pendingWaiters.delete(connId);\n }\n\n /**\n * Wait for an element to be registered, or resolve immediately if it already exists.\n * Returns a JsonRpcResponse JSON string.\n */\n private async handleWaitForElement(\n connId: string,\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const targetId = params.id;\n const timeout = typeof params.timeout === 'number' ? params.timeout : 10000;\n\n if (!targetId || typeof targetId !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"id\" parameter',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Already registered — return immediately\n const existing = this.registry.getElement(targetId);\n if (existing) {\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: {\n id: targetId,\n state: existing.getState(),\n identifier: existing.getIdentifier(),\n waited: false,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Wait for element:registered event with matching id, or timeout\n return new Promise<string>((resolve) => {\n let settled = false;\n let unsub: (() => void) | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let unregister: (() => void) | null = null;\n\n const cleanup = () => {\n if (settled) return;\n settled = true;\n if (unsub) {\n unsub();\n unsub = null;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (unregister) {\n unregister();\n unregister = null;\n }\n };\n\n // Track this waiter so it can be aborted if the connection closes.\n unregister = this.registerWaiter(connId, () => {\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Connection closed before element was registered',\n code: 'CONNECTION_CLOSED',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n unsub = this.registry.on('element:registered', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n\n cleanup();\n const el = this.registry.getElement(targetId);\n resolve(\n JSON.stringify({\n id,\n result: {\n success: true,\n data: {\n id: targetId,\n state: el?.getState() ?? null,\n identifier: el?.getIdentifier() ?? null,\n waited: true,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n timer = setTimeout(() => {\n if (settled) return;\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: `Timeout waiting for element: ${targetId}`,\n code: 'TIMEOUT',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n }, timeout);\n });\n }\n\n /**\n * Wait for an arbitrary element-state predicate to become true.\n *\n * Supported `condition` shapes:\n * {field: \"mounted\"|\"visible\"|\"enabled\"|\"focused\", equals: boolean}\n * {field: \"layout\", exists: true}\n * {field: string, equals: unknown} // generic: state[field] === equals\n *\n * Resolves immediately with `waited:false` if the predicate already\n * holds. Otherwise subscribes to `element:registered` and\n * `element:stateChanged` until the predicate matches or timeout fires.\n */\n private async handleWaitForCondition(\n connId: string,\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const targetId = params.elementId;\n const condition = params.condition as\n | { field?: string; equals?: unknown; exists?: boolean }\n | undefined;\n const timeout = typeof params.timeout === 'number' ? params.timeout : 10000;\n\n if (!targetId || typeof targetId !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"elementId\" parameter',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n if (!condition || typeof condition.field !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"condition.field\"',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const evaluate = (state: Record<string, unknown> | null | undefined): boolean => {\n if (!state) return false;\n const value = state[condition.field as string];\n if (condition.exists === true) return value !== null && value !== undefined;\n if ('equals' in condition) return value === condition.equals;\n return false;\n };\n\n const makeResult = (state: Record<string, unknown> | null, waited: boolean) =>\n JSON.stringify({\n id,\n result: {\n success: true,\n data: { id: targetId, state, waited },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n\n // Fast path: already holds.\n const existing = this.registry.getElement(targetId);\n if (existing) {\n const state = existing.getState() as unknown as Record<string, unknown> | null;\n if (evaluate(state)) {\n return makeResult(state, false);\n }\n }\n\n return new Promise<string>((resolve) => {\n let settled = false;\n let unsubRegistered: (() => void) | null = null;\n let unsubStateChanged: (() => void) | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let unregister: (() => void) | null = null;\n\n const cleanup = () => {\n if (settled) return;\n settled = true;\n if (unsubRegistered) {\n unsubRegistered();\n unsubRegistered = null;\n }\n if (unsubStateChanged) {\n unsubStateChanged();\n unsubStateChanged = null;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (unregister) {\n unregister();\n unregister = null;\n }\n };\n\n unregister = this.registerWaiter(connId, () => {\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Connection closed before condition was met',\n code: 'CONNECTION_CLOSED',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n const checkAndResolve = () => {\n if (settled) return;\n const el = this.registry.getElement(targetId);\n if (!el) return;\n const state = el.getState() as unknown as Record<string, unknown> | null;\n if (evaluate(state)) {\n cleanup();\n resolve(makeResult(state, true));\n }\n };\n\n unsubRegistered = this.registry.on('element:registered', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n checkAndResolve();\n });\n\n unsubStateChanged = this.registry.on('element:stateChanged', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n checkAndResolve();\n });\n\n timer = setTimeout(() => {\n if (settled) return;\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: `Timeout waiting for condition on element: ${targetId}`,\n code: 'TIMEOUT',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n }, timeout);\n });\n }\n\n /**\n * Execute a sequence of JSON-RPC steps in order, stopping on first failure.\n * Returns a JsonRpcResponse JSON string with per-step results.\n */\n private async handleSequence(\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const rawSteps = params.steps;\n\n if (!Array.isArray(rawSteps) || rawSteps.length === 0) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or empty \"steps\" array',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const steps = rawSteps as Array<{ method: string; params?: Record<string, unknown> }>;\n const results: Array<{ step: number; method: string; result: APIResponse }> = [];\n let allSuccess = true;\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n\n if (!step || typeof step.method !== 'string') {\n results.push({\n step: i,\n method: String(step?.method ?? ''),\n result: {\n success: false,\n error: 'Step is missing \"method\" field',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n });\n allSuccess = false;\n break;\n }\n\n try {\n const stepResult = await this.routeMethodToHandler(step.method, step.params ?? {});\n results.push({ step: i, method: step.method, result: stepResult });\n if (!stepResult.success) {\n allSuccess = false;\n break;\n }\n } catch (err) {\n results.push({\n step: i,\n method: step.method,\n result: {\n success: false,\n error: err instanceof Error ? err.message : 'Step execution failed',\n code: 'STEP_FAILED',\n timestamp: Date.now(),\n },\n });\n allSuccess = false;\n break;\n }\n }\n\n return JSON.stringify({\n id,\n result: {\n success: allSuccess,\n data: {\n completedSteps: results.length,\n totalSteps: steps.length,\n results,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n /**\n * Route a JSON-RPC method string to the appropriate handler using path-style matching.\n *\n * Method strings mirror HTTP routes but without the /ui-bridge/ prefix.\n * Path params are extracted from :name placeholders in the route pattern.\n *\n * Examples:\n * \"health\" → handlers.health\n * \"control/snapshot\" → handlers.getSnapshot\n * \"control/element/tab-runs/action\" → handlers.executeAction ({id:'tab-runs'})\n * \"control/component/my-comp/action/submit\" → handlers.executeComponentAction\n */\n private async routeMethodToHandler(\n method: string,\n params: Record<string, unknown>\n ): Promise<APIResponse> {\n const testHooks = this.config.testHooks === true;\n for (const route of WS_ROUTES) {\n const pathParams = parsePath(route.pattern, method);\n if (!pathParams) continue;\n\n // Test-hook routes are invisible over WS too when the flag is off.\n if (route.requiresTestHooks && !testHooks) continue;\n\n const ctx: HandlerContext = {\n params: pathParams,\n query:\n params.query && typeof params.query === 'object'\n ? (params.query as Record<string, string>)\n : {},\n body: params,\n };\n\n return this.handlers[route.handler](ctx);\n }\n\n return {\n success: false,\n error: `Unknown method: ${method}`,\n code: 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n\n /**\n * Handle incoming HTTP request\n *\n * Exposed as public so that CloudRelayClient can call it directly (without\n * loopback TCP overhead) when processing tunneled requests.\n */\n async handleRequest(request: HTTPRequest): Promise<HTTPResponse> {\n // Add CORS headers if enabled\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.cors) {\n headers['Access-Control-Allow-Origin'] = this.config.allowedOrigins\n ? this.config.allowedOrigins.join(',')\n : '*';\n headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';\n headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization';\n }\n\n // Handle CORS preflight\n if (request.method === 'OPTIONS') {\n return { status: 204, headers, body: '' };\n }\n\n try {\n const response = await this.routeRequest(request);\n return {\n status: response.success ? 200 : 400,\n headers,\n body: JSON.stringify(response),\n };\n } catch (error) {\n const errorResponse: APIResponse = {\n success: false,\n error: error instanceof Error ? error.message : 'Internal server error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n };\n return {\n status: 500,\n headers,\n body: JSON.stringify(errorResponse),\n };\n }\n }\n\n /**\n * Route an HTTP request to the appropriate handler using WS_ROUTES.\n *\n * Strips the `/ui-bridge/` prefix from the path, then iterates the shared\n * WS_ROUTES table. Each route's `pattern` is matched against the stripped\n * path via the module-level `parsePath` helper; path params are merged\n * with the request body into a HandlerContext.\n *\n * `httpMethods` disambiguates routes that share a pattern but differ\n * by verb (e.g. GET vs DELETE on `design/style-guide`). A route without\n * `httpMethods` is WS-only and will not be matched on HTTP.\n */\n private async routeRequest(request: HTTPRequest): Promise<APIResponse> {\n const { method, path, query, body } = request;\n\n const PREFIX = '/ui-bridge/';\n if (!path.startsWith(PREFIX)) {\n return {\n success: false,\n error: `Route not found: ${method} ${path}`,\n code: 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n\n const stripped = path.slice(PREFIX.length);\n\n // Discoverability:\n // - `_help` (rich) — routes + action reference + tips\n // - `_routes` (minimal) — runner-compatible shape for parity\n // Lets agents fetch a single URL on either runner or mobile to see what\n // they can do without reading docs.\n const testHooks = this.config.testHooks === true;\n\n if (method === 'GET' && stripped === '_help') {\n return {\n success: true,\n data: buildHelpPayload(testHooks),\n timestamp: Date.now(),\n };\n }\n if (method === 'GET' && stripped === '_routes') {\n return {\n success: true,\n data: buildRoutesPayload(testHooks),\n timestamp: Date.now(),\n };\n }\n\n let patternMatchedButWrongVerb = false;\n\n for (const route of WS_ROUTES) {\n const pathParams = parsePath(route.pattern, stripped);\n if (!pathParams) continue;\n\n // Pattern matches — now filter on HTTP verb.\n if (!route.httpMethods) {\n // WS-only route; don't serve on HTTP.\n continue;\n }\n // Route gated by `testHooks`: behave as if it isn't registered when\n // the flag is off so production builds get a vanilla NOT_FOUND.\n if (route.requiresTestHooks && !testHooks) {\n continue;\n }\n if (!route.httpMethods.includes(method as HttpVerb)) {\n patternMatchedButWrongVerb = true;\n continue;\n }\n\n const ctx: HandlerContext = { params: pathParams, query, body };\n return this.handlers[route.handler](ctx);\n }\n\n return {\n success: false,\n error: patternMatchedButWrongVerb\n ? `Method not allowed: ${method} ${path}`\n : `Route not found: ${method} ${path}`,\n code: patternMatchedButWrongVerb ? 'METHOD_NOT_ALLOWED' : 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Create a UI Bridge Native server\n */\nexport function createNativeServer(\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor,\n config?: NativeServerConfig\n): NativeUIBridgeServer {\n return new NativeUIBridgeServer(registry, executor, config);\n}\n\n/**\n * Example adapter using react-native-http-bridge\n *\n * To use this adapter:\n * 1. Install: npm install react-native-http-bridge\n * 2. Link native modules\n * 3. Create adapter and pass to server\n *\n * ```tsx\n * import httpBridge from 'react-native-http-bridge';\n *\n * const adapter: ServerAdapter = {\n * start: async (port, handler) => {\n * httpBridge.start(port, 'ui-bridge', async (request) => {\n * const response = await handler({\n * method: request.type,\n * path: request.url,\n * headers: request.headers || {},\n * query: parseQuery(request.url),\n * body: request.postData ? JSON.parse(request.postData) : undefined,\n * });\n * httpBridge.respond(\n * request.requestId,\n * response.status,\n * response.headers['Content-Type'],\n * response.body\n * );\n * });\n * },\n * stop: async () => {\n * httpBridge.stop();\n * },\n * isRunning: () => true,\n * };\n *\n * server.setAdapter(adapter);\n * await server.start();\n * ```\n */\n","/**\n * Bridges NativeUIBridgeRegistry events to WebSocket clients.\n *\n * Subscribes to all registry event types and broadcasts them as\n * JsonRpcEvent messages to connected WebSocket clients based on\n * their per-connection subscription sets.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { BridgeEventType, BridgeEvent } from '../core/types';\nimport type { WebSocketConnection } from './ws-connection';\nimport type { JsonRpcEvent } from './ws-types';\n\n/** All event types the bridge can subscribe to */\nconst BRIDGE_EVENT_TYPES: BridgeEventType[] = [\n 'element:registered',\n 'element:unregistered',\n 'element:stateChanged',\n 'component:registered',\n 'component:unregistered',\n 'action:started',\n 'action:completed',\n 'action:failed',\n 'workflow:started',\n 'workflow:stepCompleted',\n 'workflow:completed',\n 'workflow:failed',\n 'render:snapshot',\n 'error',\n];\n\n/** Per-connection throttle state for batching rapid events */\ninterface ThrottleState {\n ms: number;\n pending: JsonRpcEvent[];\n timer: ReturnType<typeof setTimeout> | null;\n}\n\n// ── Glob pattern matching ───────────────────────────────────────────────────\n\n/** Cache of compiled glob→RegExp to avoid recompiling hot patterns. */\nconst GLOB_CACHE = new Map<string, RegExp>();\n\n/**\n * Convert a glob-style pattern (supports `*` / `**` wildcards) to a RegExp.\n * All other regex metacharacters are escaped, so colons and other\n * event-name characters pass through literally.\n *\n * globToRegex(\"*\") → /^.*$/\n * globToRegex(\"element:*\") → /^element:.*$/\n * globToRegex(\"*:stateChanged\") → /^.*:stateChanged$/\n */\nexport function globToRegex(pattern: string): RegExp {\n const cached = GLOB_CACHE.get(pattern);\n if (cached) return cached;\n\n // Normalize ** → * (same semantics for flat event names)\n const normalized = pattern.replace(/\\*\\*/g, '*');\n // Escape regex metacharacters except '*'\n const escaped = normalized.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\n // Replace '*' with '.*'\n const body = escaped.replace(/\\*/g, '.*');\n const regex = new RegExp(`^${body}$`);\n GLOB_CACHE.set(pattern, regex);\n return regex;\n}\n\n/** Options for the WebSocketEventBridge constructor. */\nexport interface WebSocketEventBridgeOptions {\n /** Heartbeat ping interval in ms (default 30000) */\n heartbeatIntervalMs?: number;\n /** Max number of events to retain in the replay history buffer (default 100, 0 disables) */\n maxHistory?: number;\n}\n\nexport class WebSocketEventBridge {\n private connections = new Map<string, WebSocketConnection>();\n private throttles = new Map<string, ThrottleState>();\n private unsubscribers: Array<() => void> = [];\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private registry: NativeUIBridgeRegistry;\n private heartbeatIntervalMs: number;\n /**\n * True ring buffer for event replay history.\n *\n * `historyBuf` is a fixed-capacity slot array; `historyHead` points at the\n * NEXT write position; `historyCount` is the number of valid slots\n * (clamped to capacity). Append is O(1) — no array shifting.\n */\n private historyBuf: (JsonRpcEvent | undefined)[] = [];\n private historyHead = 0;\n private historyCount = 0;\n\n constructor(\n registry: NativeUIBridgeRegistry,\n optionsOrHeartbeatMs: WebSocketEventBridgeOptions | number = {}\n ) {\n this.registry = registry;\n // Accept legacy positional number form\n const opts: WebSocketEventBridgeOptions =\n typeof optionsOrHeartbeatMs === 'number'\n ? { heartbeatIntervalMs: optionsOrHeartbeatMs }\n : optionsOrHeartbeatMs;\n this.heartbeatIntervalMs = opts.heartbeatIntervalMs ?? 30000;\n const cap = Math.max(0, (opts.maxHistory ?? 100) | 0);\n this.historyBuf = cap > 0 ? new Array(cap) : [];\n }\n\n /** Effective ring buffer capacity. 0 means history is disabled. */\n private get historyCapacity(): number {\n return this.historyBuf.length;\n }\n\n /**\n * Start listening to registry events and broadcasting to WS clients.\n * Also starts the heartbeat timer.\n */\n start(): void {\n for (const eventType of BRIDGE_EVENT_TYPES) {\n const unsub = this.registry.on(eventType, (event: BridgeEvent) => {\n this.broadcastEvent(eventType, event.data);\n });\n this.unsubscribers.push(unsub);\n }\n\n this.startHeartbeat();\n }\n\n /** Stop listening to registry events and clear connections. */\n stop(): void {\n for (const unsub of this.unsubscribers) {\n unsub();\n }\n this.unsubscribers = [];\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n // Clean up throttle timers\n for (const throttle of this.throttles.values()) {\n if (throttle.timer) clearTimeout(throttle.timer);\n }\n this.throttles.clear();\n\n // Close all connections\n for (const conn of this.connections.values()) {\n conn.close(1001, 'Server shutting down');\n }\n this.connections.clear();\n this.historyBuf.fill(undefined);\n this.historyHead = 0;\n this.historyCount = 0;\n }\n\n /** Register a new WebSocket connection. */\n addConnection(conn: WebSocketConnection): void {\n this.connections.set(conn.id, conn);\n }\n\n /** Remove a WebSocket connection (called on disconnect). */\n removeConnection(connId: string): void {\n this.connections.delete(connId);\n const throttle = this.throttles.get(connId);\n if (throttle?.timer) clearTimeout(throttle.timer);\n this.throttles.delete(connId);\n }\n\n /** Get the number of active connections. */\n get connectionCount(): number {\n return this.connections.size;\n }\n\n /**\n * Add event subscriptions for a connection.\n *\n * Event names are stored as glob patterns. Supported forms:\n * - Exact: \"element:registered\"\n * - Prefix: \"element:*\"\n * - Suffix: \"*:stateChanged\"\n * - All: \"*\"\n *\n * @param throttleMs — if >0, batch rapid events within this window before sending\n */\n handleSubscribe(connId: string, events: string[], throttleMs?: number): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n for (const event of events) {\n conn.subscriptions.add(event);\n }\n if (throttleMs && throttleMs > 0) {\n this.throttles.set(connId, { ms: throttleMs, pending: [], timer: null });\n }\n return true;\n }\n\n /**\n * Remove event subscriptions for a connection.\n * If all subscriptions are cleared, also drops the throttle entry\n * (and any pending flush timer) so a subsequent resubscribe starts clean.\n */\n handleUnsubscribe(connId: string, events: string[]): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n for (const event of events) {\n conn.subscriptions.delete(event);\n }\n if (conn.subscriptions.size === 0) {\n const throttle = this.throttles.get(connId);\n if (throttle?.timer) clearTimeout(throttle.timer);\n this.throttles.delete(connId);\n }\n return true;\n }\n\n /**\n * Get the subscription set for a connection.\n * Returns the original pattern strings (not compiled regexes).\n */\n getSubscriptions(connId: string): string[] {\n const conn = this.connections.get(connId);\n return conn ? Array.from(conn.subscriptions) : [];\n }\n\n /**\n * Check if a connection is subscribed to a specific event.\n * Matches exact names first (fast path), then tests each stored\n * pattern as a glob against the event type.\n */\n isSubscribed(connId: string, eventType: string): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n // Fast path: exact match\n if (conn.subscriptions.has(eventType)) return true;\n // Glob path: test each pattern\n for (const pattern of conn.subscriptions) {\n // Skip exact names with no wildcard — already tested above\n if (!pattern.includes('*')) continue;\n if (globToRegex(pattern).test(eventType)) return true;\n }\n return false;\n }\n\n /** Get the throttle window (in ms) configured for a connection, or undefined if none. */\n getThrottleMs(connId: string): number | undefined {\n return this.throttles.get(connId)?.ms;\n }\n\n /**\n * Get recent events from the replay history buffer.\n *\n * @param filter.events — optional list of glob patterns to match event types against\n * @param filter.since — optional timestamp (ms); only events at or after this time\n */\n getHistory(filter?: { events?: string[]; since?: number }): JsonRpcEvent[] {\n const cap = this.historyCapacity;\n if (cap === 0 || this.historyCount === 0) return [];\n\n const since = filter?.since;\n const regexes = filter?.events?.map((p) => globToRegex(p));\n\n // Walk the ring buffer in chronological (oldest → newest) order.\n const start = (this.historyHead - this.historyCount + cap) % cap;\n const out: JsonRpcEvent[] = [];\n for (let i = 0; i < this.historyCount; i++) {\n const e = this.historyBuf[(start + i) % cap];\n if (!e) continue;\n if (since !== undefined && e.timestamp < since) continue;\n if (regexes && regexes.length > 0 && !regexes.some((r) => r.test(e.event))) continue;\n out.push(e);\n }\n return out;\n }\n\n /**\n * Configure the max history buffer size at runtime. 0 disables history.\n * Reallocates the ring buffer, preserving the most recent\n * min(historyCount, newCapacity) events in chronological order.\n */\n setMaxHistory(maxHistory: number): void {\n const newCap = Math.max(0, maxHistory | 0);\n if (newCap === this.historyCapacity) return;\n\n if (newCap === 0) {\n this.historyBuf = [];\n this.historyHead = 0;\n this.historyCount = 0;\n return;\n }\n\n // Preserve the latest min(count, newCap) events.\n const oldCap = this.historyCapacity;\n const keep = Math.min(this.historyCount, newCap);\n const newBuf: (JsonRpcEvent | undefined)[] = new Array(newCap);\n if (keep > 0 && oldCap > 0) {\n // Source range: the last `keep` events ending just before historyHead.\n const start = (this.historyHead - keep + oldCap) % oldCap;\n for (let i = 0; i < keep; i++) {\n newBuf[i] = this.historyBuf[(start + i) % oldCap];\n }\n }\n this.historyBuf = newBuf;\n this.historyCount = keep;\n this.historyHead = keep % newCap;\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private broadcastEvent(eventType: string, data: unknown): void {\n const event: JsonRpcEvent = {\n event: eventType,\n data,\n timestamp: Date.now(),\n };\n\n // Append to ring buffer — O(1), no shifting.\n const cap = this.historyCapacity;\n if (cap > 0) {\n this.historyBuf[this.historyHead] = event;\n this.historyHead = (this.historyHead + 1) % cap;\n if (this.historyCount < cap) this.historyCount++;\n }\n\n for (const [connId, conn] of this.connections) {\n const throttle = this.throttles.get(connId);\n if (throttle) {\n this.enqueueThrottled(connId, conn, throttle, event);\n } else {\n conn.sendEvent(event);\n }\n }\n }\n\n /** Queue an event for throttled delivery, flushing after the throttle window. */\n private enqueueThrottled(\n connId: string,\n conn: WebSocketConnection,\n throttle: ThrottleState,\n event: JsonRpcEvent\n ): void {\n throttle.pending.push(event);\n if (throttle.timer) return; // Flush already scheduled\n\n throttle.timer = setTimeout(() => {\n const events = throttle.pending.splice(0);\n throttle.timer = null;\n // Verify connection still exists\n if (!this.connections.has(connId)) return;\n for (const e of events) {\n conn.sendEvent(e);\n }\n }, throttle.ms);\n }\n\n private startHeartbeat(): void {\n this.heartbeatTimer = setInterval(() => {\n for (const [id, conn] of this.connections) {\n if (!conn.isOpen) {\n this.connections.delete(id);\n continue;\n }\n\n if (!conn.alive) {\n // Missed previous ping — connection is dead\n console.warn(`[ws-event-bridge] Connection ${id} missed heartbeat, closing`);\n conn.close(1001, 'Heartbeat timeout');\n this.connections.delete(id);\n continue;\n }\n\n // Mark as not-alive, send ping. If pong arrives, alive is set back to true.\n conn.alive = false;\n conn.ping();\n }\n }, this.heartbeatIntervalMs);\n }\n}\n","/**\n * Minimal logger for the UI Bridge Native transport layer.\n *\n * Wraps console so callers go through a single controlled point. Log output\n * can be suppressed globally by setting:\n *\n * import { transportLogger } from './logger';\n * transportLogger.silent = true;\n *\n * In production builds you can also tree-shake the verbose log() calls by\n * checking `__DEV__` in your Metro bundler config, but the silent flag is\n * simpler and works without build-time configuration.\n */\n\nexport interface TransportLogger {\n log(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n /** Set to true to suppress all log output (warn/error are always emitted). */\n silent: boolean;\n}\n\nfunction createTransportLogger(): TransportLogger {\n return {\n silent: false,\n log(message: string, ...args: unknown[]): void {\n if (!this.silent) {\n console.log(message, ...args);\n }\n },\n warn(message: string, ...args: unknown[]): void {\n console.warn(message, ...args);\n },\n error(message: string, ...args: unknown[]): void {\n console.error(message, ...args);\n },\n };\n}\n\n/** Shared logger instance for the transport layer. */\nexport const transportLogger = createTransportLogger();\n","/**\n * Device Announcer — mDNS + Cloud registration for physical device discovery\n *\n * Announces the UI Bridge service on the local network via mDNS (when\n * react-native-zeroconf is available) and optionally registers with the\n * cloud relay backend.\n */\n\nimport { Platform } from 'react-native';\nimport { transportLogger } from './logger';\n\nexport interface AnnouncerConfig {\n /** Stable device identifier */\n deviceId: string;\n /** App bundle/package ID */\n appId: string;\n /** UI Bridge server port (default 8087) */\n port?: number;\n /** Cloud relay WebSocket URL for registration */\n cloudRelayUrl?: string;\n /** Auth token for cloud relay */\n cloudToken?: string;\n /** UI Bridge SDK version */\n version?: string;\n}\n\nexport interface DeviceAnnouncerState {\n mdnsActive: boolean;\n cloudConnected: boolean;\n}\n\n/** Minimal interface for the react-native-zeroconf Zeroconf instance */\ninterface ZeroconfService {\n publishService(\n type: string,\n protocol: string,\n domain: string,\n name: string,\n port: number,\n txtRecord: Record<string, string>\n ): void;\n unpublishService(name: string): void;\n}\n\n/** Possible messages received over the cloud relay WebSocket */\ninterface RelayMessage {\n type: string;\n [key: string]: unknown;\n}\n\nconst DEFAULT_PORT = 8087;\nconst RECONNECT_INITIAL_DELAY_MS = 2_000;\nconst RECONNECT_MAX_DELAY_MS = 60_000;\n\n/**\n * Announces the UI Bridge server on the local network (mDNS) and optionally\n * registers with the qontinui.io cloud relay for remote discovery.\n */\nexport class DeviceAnnouncer {\n private config: Required<Pick<AnnouncerConfig, 'deviceId' | 'appId'>> & AnnouncerConfig;\n private state: DeviceAnnouncerState = {\n mdnsActive: false,\n cloudConnected: false,\n };\n private cloudWs: WebSocket | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectDelay = RECONNECT_INITIAL_DELAY_MS;\n private stopped = false;\n /** Zeroconf instance, set when mDNS is successfully started */\n private zeroconf: ZeroconfService | null = null;\n /** Rotated pairing token for mDNS TXT records */\n private pairingToken: string;\n\n constructor(config: AnnouncerConfig) {\n this.config = config;\n this.pairingToken = generateHex(16);\n }\n\n // ── mDNS ──────────────────────────────────────────────────────────────────\n\n /**\n * Start mDNS advertisement.\n *\n * The consumer must pass the `Zeroconf` constructor (from `react-native-zeroconf`)\n * explicitly; otherwise this is a no-op.\n *\n * Rationale: Metro's `require()` throws an uncatchable module-load error if the\n * bundle doesn't include the named package. That error escapes async try/catch\n * boundaries and crashes the app. We avoid it by never calling `require()`\n * ourselves — the consumer imports the package when they know it's installed.\n *\n * @param ZeroconfCtor - constructor from `import Zeroconf from 'react-native-zeroconf'`\n */\n async startMdnsAdvertise(ZeroconfCtor?: new () => ZeroconfService): Promise<void> {\n if (!ZeroconfCtor) {\n transportLogger.log(\n '[DeviceAnnouncer] mDNS advertisement skipped (no Zeroconf constructor provided). ' +\n 'Pass one to enable mDNS.'\n );\n return;\n }\n try {\n this.zeroconf = new ZeroconfCtor();\n\n const port = this.config.port ?? DEFAULT_PORT;\n const serviceName = `UIBridge-${this.config.deviceId.slice(0, 8)}`;\n\n this.zeroconf.publishService('_uibridge', '_tcp.', 'local.', serviceName, port, {\n device_id: this.config.deviceId,\n app_id: this.config.appId,\n version: this.config.version ?? 'unknown',\n pairing_token: this.pairingToken,\n });\n\n this.state = { ...this.state, mdnsActive: true };\n transportLogger.log(`[DeviceAnnouncer] mDNS: advertising \"${serviceName}\" on port ${port}`);\n } catch (err) {\n transportLogger.warn('[DeviceAnnouncer] mDNS start failed:', err);\n }\n }\n\n // ── Cloud relay ───────────────────────────────────────────────────────────\n\n /**\n * Connect to the cloud relay WebSocket and send a device_register message.\n *\n * Reconnects automatically with exponential backoff (2 s → 60 s) if the\n * connection drops.\n */\n async connectCloudRelay(): Promise<void> {\n if (!this.config.cloudRelayUrl || !this.config.cloudToken) {\n return;\n }\n if (this.stopped) return;\n\n const url = `${this.config.cloudRelayUrl}?token=${encodeURIComponent(this.config.cloudToken)}`;\n\n transportLogger.log('[DeviceAnnouncer] Cloud relay: connecting to', url);\n\n const ws = new WebSocket(url);\n this.cloudWs = ws;\n\n ws.onopen = () => {\n if (this.stopped) {\n ws.close();\n return;\n }\n this.reconnectDelay = RECONNECT_INITIAL_DELAY_MS;\n this.state = { ...this.state, cloudConnected: true };\n transportLogger.log('[DeviceAnnouncer] Cloud relay: connected');\n\n // Register this device with the backend\n ws.send(\n JSON.stringify({\n type: 'device_register',\n device_id: this.config.deviceId,\n app_id: this.config.appId,\n platform: getPlatform(),\n display_name: this.config.deviceId,\n ui_bridge_version: this.config.version ?? 'unknown',\n })\n );\n };\n\n ws.onmessage = (event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data as string) as RelayMessage;\n transportLogger.log('[DeviceAnnouncer] Cloud relay message:', msg.type);\n // Tunneled HTTP requests are handled by CloudRelayClient when wired up\n } catch {\n // ignore malformed messages\n }\n };\n\n ws.onclose = () => {\n this.state = { ...this.state, cloudConnected: false };\n if (!this.stopped) {\n this.scheduleReconnect();\n }\n };\n\n ws.onerror = (err: Event) => {\n transportLogger.warn('[DeviceAnnouncer] Cloud relay error:', err);\n // onclose will fire after this and trigger reconnect\n };\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n /** Stop all advertising and registration. */\n async stop(): Promise<void> {\n this.stopped = true;\n\n // Cancel any pending reconnect\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n // Unpublish mDNS service\n if (this.zeroconf) {\n try {\n const serviceName = `UIBridge-${this.config.deviceId.slice(0, 8)}`;\n this.zeroconf.unpublishService(serviceName);\n } catch {\n // ignore\n }\n this.zeroconf = null;\n }\n this.state = { ...this.state, mdnsActive: false };\n\n // Close cloud WebSocket\n if (this.cloudWs) {\n this.cloudWs.onclose = null; // prevent reconnect loop\n this.cloudWs.close();\n this.cloudWs = null;\n }\n this.state = { ...this.state, cloudConnected: false };\n }\n\n /** Return a copy of the current announcer state. */\n getState(): DeviceAnnouncerState {\n return { ...this.state };\n }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private scheduleReconnect(): void {\n if (this.stopped) return;\n const delay = this.reconnectDelay;\n transportLogger.log(`[DeviceAnnouncer] Cloud relay: reconnecting in ${delay}ms`);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (!this.stopped) {\n void this.connectCloudRelay();\n }\n }, delay);\n // Exponential backoff\n this.reconnectDelay = Math.min(this.reconnectDelay * 2, RECONNECT_MAX_DELAY_MS);\n }\n}\n\n// ── Utilities ─────────────────────────────────────────────────────────────────\n\nfunction generateHex(bytes: number): string {\n const arr = new Uint8Array(bytes);\n // In React Native, Math.random() is fine for a non-security pairing token\n for (let i = 0; i < bytes; i++) {\n arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nfunction getPlatform(): string {\n return Platform?.OS ?? 'unknown';\n}\n","/**\n * Cloud Relay Client — WebSocket tunnel from mobile device to backend\n *\n * Maintains a persistent WebSocket connection to the qontinui.io backend.\n * Receives tunneled HTTP requests from runners, calls the local NativeUIBridgeServer,\n * and sends responses back through the tunnel.\n */\n\nimport type { NativeUIBridgeServer } from '../server/http-server';\nimport { transportLogger } from './logger';\n\nexport interface CloudRelayConfig {\n /** WebSocket URL for the device bridge endpoint */\n relayUrl: string;\n /** Stable device identifier */\n deviceId: string;\n /** Authentication token */\n authToken: string;\n /** Reference to the local UI Bridge server for processing requests */\n uiBridgeServer: NativeUIBridgeServer;\n}\n\ninterface TunnelRequest {\n id: string;\n method: string;\n path: string;\n headers: Record<string, string>;\n body?: unknown;\n}\n\ninterface TunnelResponse {\n id: string;\n status: number;\n headers: Record<string, string>;\n body?: unknown;\n}\n\nconst INITIAL_RECONNECT_DELAY_MS = 2_000;\nconst MAX_RECONNECT_DELAY_MS = 60_000;\n\n/**\n * Manages a WebSocket tunnel from the mobile device to the qontinui.io backend.\n *\n * When a runner sends an HTTP request to a cloud device it is serialised as a\n * `TunnelRequest` JSON frame by the backend and forwarded here. This client\n * deserializes it, calls `NativeUIBridgeServer.handleRequest()` directly\n * (avoiding loopback TCP overhead), and sends the `TunnelResponse` back.\n */\nexport class CloudRelayClient {\n private ws: WebSocket | null = null;\n private config: CloudRelayConfig;\n private reconnectDelay = INITIAL_RECONNECT_DELAY_MS;\n private maxReconnectDelay = MAX_RECONNECT_DELAY_MS;\n private stopped = false;\n private _isConnected = false;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: CloudRelayConfig) {\n this.config = config;\n }\n\n /** Whether the relay WebSocket is currently connected */\n get isConnected(): boolean {\n return this._isConnected;\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n /** Connect to the relay and start processing tunneled requests. */\n start(): void {\n this.stopped = false;\n this.connect();\n }\n\n /** Disconnect and stop reconnecting. */\n stop(): void {\n this.stopped = true;\n this._isConnected = false;\n\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.onclose = null; // prevent reconnect loop\n this.ws.close();\n this.ws = null;\n }\n }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private connect(): void {\n if (this.stopped) return;\n\n const url = `${this.config.relayUrl}?token=${encodeURIComponent(this.config.authToken)}`;\n\n transportLogger.log('[CloudRelayClient] Connecting to', url);\n\n const ws = new WebSocket(url);\n this.ws = ws;\n\n ws.onopen = () => {\n if (this.stopped) {\n ws.close();\n return;\n }\n this._isConnected = true;\n this.reconnectDelay = INITIAL_RECONNECT_DELAY_MS;\n\n transportLogger.log('[CloudRelayClient] Connected to relay');\n\n // Register as a device\n ws.send(\n JSON.stringify({\n type: 'device_register',\n device_id: this.config.deviceId,\n })\n );\n };\n\n ws.onmessage = (event: MessageEvent) => {\n void this.onMessage(event.data as string);\n };\n\n ws.onclose = () => {\n this._isConnected = false;\n if (!this.stopped) {\n this.scheduleReconnect();\n }\n };\n\n ws.onerror = (err: Event) => {\n transportLogger.warn('[CloudRelayClient] WebSocket error:', err);\n // onclose will fire next and handle reconnect\n };\n }\n\n private async onMessage(raw: string): Promise<void> {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n transportLogger.warn('[CloudRelayClient] Received non-JSON message');\n return;\n }\n\n // Only handle tunnel_request frames\n if (msg['type'] !== 'tunnel_request') return;\n\n // Validate required fields\n if (\n typeof msg['id'] !== 'string' ||\n typeof msg['method'] !== 'string' ||\n typeof msg['path'] !== 'string'\n ) {\n transportLogger.warn('[CloudRelayClient] Malformed tunnel_request — missing required fields');\n return;\n }\n\n const req: TunnelRequest = {\n id: msg['id'],\n method: msg['method'],\n path: msg['path'],\n headers: (msg['headers'] as Record<string, string>) ?? {},\n body: msg['body'],\n };\n\n const resp = await this.handleTunneledRequest(req);\n\n // Send response back through the WebSocket\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify({ type: 'tunnel_response', ...resp }));\n }\n }\n\n /**\n * Process a tunneled HTTP request by calling the local NativeUIBridgeServer\n * directly (no loopback TCP involved).\n */\n private async handleTunneledRequest(req: TunnelRequest): Promise<TunnelResponse> {\n try {\n const httpResp = await this.config.uiBridgeServer.handleRequest({\n method: req.method,\n path: req.path,\n headers: req.headers,\n query: parseQueryParams(req.path),\n body: req.body,\n });\n\n // Parse the JSON body back to an object so it can be re-serialised as a\n // proper JSON value in the tunnel response (avoids double-encoding).\n let bodyValue: unknown;\n try {\n bodyValue = httpResp.body ? (JSON.parse(httpResp.body) as unknown) : undefined;\n } catch {\n bodyValue = httpResp.body || undefined;\n }\n\n return {\n id: req.id,\n status: httpResp.status,\n headers: httpResp.headers,\n body: bodyValue,\n };\n } catch (err) {\n transportLogger.error('[CloudRelayClient] Error handling tunneled request:', err);\n return {\n id: req.id,\n status: 500,\n headers: { 'content-type': 'application/json' },\n body: {\n success: false,\n error: err instanceof Error ? err.message : 'Internal server error',\n },\n };\n }\n }\n\n private scheduleReconnect(): void {\n if (this.stopped) return;\n const delay = this.reconnectDelay;\n transportLogger.log(`[CloudRelayClient] Reconnecting in ${delay}ms`);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (!this.stopped) {\n this.connect();\n }\n }, delay);\n this.reconnectDelay = Math.min(this.reconnectDelay * 2, this.maxReconnectDelay);\n }\n}\n\n// ── Utilities ─────────────────────────────────────────────────────────────────\n\n/**\n * Extract query-string parameters from a URL path.\n * e.g. `/ui-bridge/control/elements?visibleOnly=true` → `{ visibleOnly: 'true' }`\n */\nfunction parseQueryParams(path: string): Record<string, string> {\n const qIdx = path.indexOf('?');\n if (qIdx === -1) return {};\n const qs = path.slice(qIdx + 1);\n const result: Record<string, string> = {};\n for (const pair of qs.split('&')) {\n const [k, v] = pair.split('=');\n if (k) {\n result[decodeURIComponent(k)] = decodeURIComponent(v ?? '');\n }\n }\n return result;\n}\n","import type { NativeModalInfo, NativeSnapshotModalContext } from '../core/types';\n\nexport interface ModalPushInput {\n id: string;\n title?: string;\n type?: NativeModalInfo['type'];\n blocking?: boolean;\n dismissible?: boolean;\n}\n\n/**\n * Declarative modal store. Components/hooks call pushModal/dismissModal directly\n * — there is no DOM/tree scanner. The detector is the single source of truth for\n * the snapshot's modalStack context.\n */\nexport class ModalDetector {\n /** Map preserves O(1) idempotent replace by id; ordering comes from detectedAt. */\n private modals = new Map<string, NativeModalInfo>();\n\n pushModal(modal: ModalPushInput): void {\n const existing = this.modals.get(modal.id);\n const detectedAt = existing ? existing.detectedAt : Date.now();\n const next: NativeModalInfo = {\n id: modal.id,\n title: modal.title,\n type: modal.type ?? 'modal',\n blocking: modal.blocking ?? true,\n dismissible: modal.dismissible ?? true,\n detectedAt,\n };\n this.modals.set(modal.id, next);\n }\n\n /**\n * Remove a modal from the stack. Returns `true` if a modal with that id\n * was actually deleted, `false` if nothing matched (idempotent so repeated\n * calls don't throw, but callers — e.g. the HTTP test-hook endpoint — can\n * surface the miss to clients).\n */\n dismissModal(id: string): boolean {\n return this.modals.delete(id);\n }\n\n getSnapshotModalContext(): NativeSnapshotModalContext {\n const active = this.getActive();\n const ctx: NativeSnapshotModalContext = {\n modals: active,\n hasBlockingModal: active.some((m) => m.blocking),\n count: active.length,\n };\n if (active.length > 0) {\n ctx.topModal = active[active.length - 1];\n }\n return ctx;\n }\n\n getActive(): NativeModalInfo[] {\n return Array.from(this.modals.values()).sort((a, b) => a.detectedAt - b.detectedAt);\n }\n\n clear(): void {\n this.modals.clear();\n }\n}\n","import type { NativeCapturedToast, NativeSnapshotToastContext } from '../core/types';\n\nexport interface ToastRecordInput {\n id: string;\n message: string;\n level?: NativeCapturedToast['level'];\n appearedAt?: number;\n}\n\nexport interface ToastCaptureConfig {\n maxRecent?: number;\n}\n\nconst DEFAULT_MAX_RECENT = 50;\n\n/**\n * Declarative toast/snackbar tracker. Components call recordToast/dismissToast\n * directly — there is no DOM/tree scanner. The active map plus a fixed-size\n * recent ring buffer feed the snapshot's toasts context.\n */\nexport class ToastCapture {\n private active = new Map<string, NativeCapturedToast>();\n private recent: NativeCapturedToast[] = [];\n private totalCaptured = 0;\n private maxRecent: number;\n\n constructor(config: ToastCaptureConfig = {}) {\n this.maxRecent = config.maxRecent ?? DEFAULT_MAX_RECENT;\n }\n\n recordToast(toast: ToastRecordInput): void {\n if (this.active.has(toast.id)) {\n return;\n }\n const appearedAt = toast.appearedAt ?? Date.now();\n const entry: NativeCapturedToast = {\n id: toast.id,\n message: toast.message,\n level: toast.level ?? 'info',\n appearedAt,\n visible: true,\n durationMs: 0,\n };\n this.active.set(toast.id, entry);\n this.totalCaptured += 1;\n }\n\n dismissToast(id: string): void {\n const entry = this.active.get(id);\n if (!entry) {\n return;\n }\n this.active.delete(id);\n const dismissedAt = Date.now();\n const dismissed: NativeCapturedToast = {\n ...entry,\n dismissedAt,\n visible: false,\n durationMs: dismissedAt - entry.appearedAt,\n };\n this.recent.push(dismissed);\n if (this.recent.length > this.maxRecent) {\n this.recent.shift();\n }\n }\n\n getSnapshotToastContext(): NativeSnapshotToastContext {\n const now = Date.now();\n const active = Array.from(this.active.values()).map((entry) => ({\n ...entry,\n durationMs: now - entry.appearedAt,\n }));\n return {\n active,\n recent: [...this.recent],\n totalCaptured: this.totalCaptured,\n };\n }\n\n clear(): void {\n this.active.clear();\n this.recent = [];\n this.totalCaptured = 0;\n }\n}\n","import type { NativeSnapshotUndoContext } from '../core/types';\n\n/**\n * A single bridge action recorded for undo correlation. Action-correlation\n * only — RN has no DOM/execCommand probe, so we rely on developer\n * declaration plus this rolling history of recent actions.\n */\nexport interface ActionRecord {\n id: string;\n type: string;\n targetId?: string;\n description?: string;\n timestamp: number;\n /** Default true — set false for actions that aren't reversible (e.g. navigation, network calls) */\n reversible?: boolean;\n}\n\n/**\n * Developer-declared undo/redo state. When set, this is authoritative and\n * overrides any heuristic inference from action history.\n */\nexport interface DeclaredUndoState {\n canUndo: boolean;\n canRedo: boolean;\n undoDescription?: string;\n redoDescription?: string;\n undoDepth?: number;\n redoDepth?: number;\n}\n\nexport interface UndoTrackerConfig {\n maxHistory?: number;\n}\n\nconst DEFAULT_MAX_HISTORY = 50;\n\nfunction buildSummary(ctx: {\n canUndo: boolean;\n canRedo: boolean;\n undoDescription?: string;\n redoDescription?: string;\n}): string {\n if (!ctx.canUndo && !ctx.canRedo) {\n return 'no undo available';\n }\n const parts: string[] = [];\n if (ctx.canUndo) {\n parts.push(`undo: '${ctx.undoDescription ?? 'available'}'`);\n }\n if (ctx.canRedo) {\n parts.push(`redo: '${ctx.redoDescription ?? 'available'}'`);\n }\n return parts.join(' / ');\n}\n\n/**\n * Action-correlation undo tracker for React Native.\n *\n * Maintains a rolling buffer of recent actions and a developer-declared\n * undo state slot. The declared state is authoritative when set; otherwise\n * we infer `canUndo` from whether any reversible action has been recorded.\n * `executeUndo`/`executeRedo` are placeholders pending an IPC path through\n * ui-bridge-native to the runner's `/control/undo`.\n */\nexport class UndoTracker {\n private readonly maxHistory: number;\n private actions: ActionRecord[] = [];\n private declaredState: DeclaredUndoState | null = null;\n\n constructor(config: UndoTrackerConfig = {}) {\n this.maxHistory = config.maxHistory ?? DEFAULT_MAX_HISTORY;\n }\n\n recordAction(record: ActionRecord): void {\n this.actions.push(record);\n if (this.actions.length > this.maxHistory) {\n this.actions = this.actions.slice(-this.maxHistory);\n }\n }\n\n setDeclaredState(state: DeclaredUndoState): void {\n this.declaredState = state;\n }\n\n getActionHistory(): ActionRecord[] {\n return this.actions.slice();\n }\n\n getSnapshotUndoContext(): NativeSnapshotUndoContext {\n const declared = this.declaredState;\n if (declared) {\n const summary = buildSummary({\n canUndo: declared.canUndo,\n canRedo: declared.canRedo,\n undoDescription: declared.undoDescription,\n redoDescription: declared.redoDescription,\n });\n return {\n canUndo: declared.canUndo,\n canRedo: declared.canRedo,\n undoDescription: declared.undoDescription,\n redoDescription: declared.redoDescription,\n undoDepth: declared.undoDepth,\n redoDepth: declared.redoDepth,\n summary,\n };\n }\n\n const canUndo = this.actions.some((a) => a.reversible !== false);\n const canRedo = false;\n // Surface the most recent reversible action's description as the inferred undo target\n const lastReversible = [...this.actions].reverse().find((a) => a.reversible !== false);\n const undoDescription = lastReversible?.description;\n const summary = buildSummary({ canUndo, canRedo, undoDescription });\n return {\n canUndo,\n canRedo,\n undoDescription,\n summary,\n };\n }\n\n executeUndo(): { ok: boolean; reason?: string } {\n return { ok: false, reason: 'Not implemented in native' };\n }\n\n executeRedo(): { ok: boolean; reason?: string } {\n return { ok: false, reason: 'Not implemented in native' };\n }\n\n clear(): void {\n this.actions = [];\n this.declaredState = null;\n }\n}\n","/**\n * UI Bridge Native Provider\n *\n * React context provider for UI Bridge Native functionality.\n */\n\nimport React, {\n createContext,\n useContext,\n useMemo,\n useEffect,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport type {\n NativeUIBridgeFeatures,\n NativeUIBridgeConfig,\n RegisteredNativeElement,\n RegisteredNativeComponent,\n NativeBridgeSnapshot,\n BridgeEventType,\n BridgeEventListener,\n} from '../core/types';\nimport { NativeUIBridgeRegistry, setGlobalRegistry, resetGlobalRegistry } from '../core/registry';\nimport { createNativeActionExecutor } from '../control/action-executor';\nimport type { NativeActionExecutor } from '../control/types';\nimport {\n createNativeServer,\n type NativeUIBridgeServer,\n type ServerAdapter,\n type WebSocketServerAdapter,\n} from '../server/http-server';\nimport type { RouteProvider } from '../server/types';\nimport { WebSocketEventBridge } from '../server/ws-event-bridge';\nimport { DeviceAnnouncer } from '../transport/DeviceAnnouncer';\nimport { CloudRelayClient, type CloudRelayConfig } from '../transport/CloudRelayClient';\nimport { ModalDetector } from '../modal/modal-detector';\nimport { ToastCapture } from '../toast/toast-capture';\nimport { UndoTracker } from '../undo/undo-tracker';\n\n/**\n * UI Bridge Native context value\n */\nexport interface UIBridgeNativeContextValue {\n /** Feature flags */\n features: NativeUIBridgeFeatures;\n /** Configuration */\n config: NativeUIBridgeConfig;\n /** Element registry */\n registry: NativeUIBridgeRegistry;\n /** Action executor */\n executor: NativeActionExecutor;\n /** Modal stack tracker (declarative pushModal/dismissModal) */\n modalDetector: ModalDetector;\n /** Toast/snackbar tracker (declarative recordToast/dismissToast) */\n toastCapture: ToastCapture;\n /** Undo/redo action-correlation tracker */\n undoTracker: UndoTracker;\n /** Get all registered elements */\n getElements: () => RegisteredNativeElement[];\n /** Get all registered components */\n getComponents: () => RegisteredNativeComponent[];\n /** Create a snapshot */\n createSnapshot: () => NativeBridgeSnapshot;\n /** Subscribe to events */\n on: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => () => void;\n /** Unsubscribe from events */\n off: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => void;\n /** Whether the provider is initialized */\n initialized: boolean;\n /** Server running status */\n serverRunning: boolean;\n /** Start the HTTP server */\n startServer: () => Promise<void>;\n /** Stop the HTTP server */\n stopServer: () => void;\n /** Get the current navigation route (if a RouteProvider is configured) */\n getCurrentRoute: () => string | null;\n}\n\n/**\n * UI Bridge Native context\n */\nconst UIBridgeNativeContext = createContext<UIBridgeNativeContextValue | null>(null);\n\n/**\n * UI Bridge Native provider props\n */\nexport interface UIBridgeNativeProviderProps {\n /** Child components */\n children: React.ReactNode;\n /** Feature flags */\n features?: NativeUIBridgeFeatures;\n /** Configuration */\n config?: NativeUIBridgeConfig;\n /** Event handler */\n onEvent?: BridgeEventListener;\n /**\n * A ServerAdapter instance for the HTTP server.\n * The app is responsible for creating this using its preferred native TCP/HTTP library.\n * @see ServerAdapter interface in server/http-server.ts\n */\n serverAdapter?: ServerAdapter;\n /**\n * Navigation provider for programmatic route navigation via UI Bridge.\n * Pass Expo Router's push/back functions to enable `control/page/navigate`.\n */\n navigationProvider?: { navigate: (url: string) => void; back?: () => void };\n /**\n * Screenshot provider for native screen capture via UI Bridge.\n * Pass a function that captures the current screen as base64 PNG.\n */\n screenshotProvider?: {\n capture: () => Promise<{ base64: string; width: number; height: number }>;\n };\n /**\n * Route provider for exposing the current navigation route in snapshots.\n * Wire this to Expo Router's `usePathname()` / `useSegments()` via a module-level ref.\n */\n routeProvider?: RouteProvider;\n /**\n * Configuration for the cloud relay tunnel (enables remote device verification\n * when USB/LAN are not available). Omit `uiBridgeServer` — the provider wires\n * that automatically after the server starts.\n */\n cloudRelayConfig?: Omit<CloudRelayConfig, 'uiBridgeServer'>;\n /**\n * Enable mDNS advertisement so that runners on the same LAN can discover this\n * device automatically (requires react-native-zeroconf).\n */\n enableMdnsAnnounce?: boolean;\n /**\n * Stable device identifier used for mDNS TXT records and cloud relay\n * registration. Typically sourced from expo-device or a UUID stored in\n * AsyncStorage.\n */\n deviceId?: string;\n}\n\n/**\n * UI Bridge Native Provider\n *\n * Provides UI Bridge Native context to child components.\n *\n * @example\n * ```tsx\n * // app/_layout.tsx\n * import { UIBridgeNativeProvider } from 'ui-bridge-native';\n *\n * export default function RootLayout() {\n * return (\n * <UIBridgeNativeProvider\n * features={{ server: __DEV__, debug: __DEV__ }}\n * config={{ serverPort: 8087 }}\n * >\n * <Stack>{children}</Stack>\n * </UIBridgeNativeProvider>\n * );\n * }\n * ```\n */\nexport function UIBridgeNativeProvider({\n children,\n features = {},\n config = {},\n onEvent,\n serverAdapter,\n navigationProvider,\n screenshotProvider,\n routeProvider,\n cloudRelayConfig,\n enableMdnsAnnounce,\n deviceId,\n}: UIBridgeNativeProviderProps) {\n const registryRef = useRef<NativeUIBridgeRegistry | null>(null);\n const executorRef = useRef<NativeActionExecutor | null>(null);\n const modalDetectorRef = useRef<ModalDetector | null>(null);\n const toastCaptureRef = useRef<ToastCapture | null>(null);\n const undoTrackerRef = useRef<UndoTracker | null>(null);\n const [serverRunning, setServerRunning] = useState(false);\n\n // Initialize on first render\n if (!registryRef.current) {\n registryRef.current = new NativeUIBridgeRegistry({\n verbose: config.verbose,\n onEvent,\n });\n setGlobalRegistry(registryRef.current);\n }\n\n const registry = registryRef.current;\n\n // Create executor (memoized)\n if (!executorRef.current) {\n executorRef.current = createNativeActionExecutor(registry);\n }\n\n const executor = executorRef.current;\n\n // Trackers — lazy-init the same way as registry/executor so each provider\n // lifecycle has exactly one stable instance.\n if (!modalDetectorRef.current) modalDetectorRef.current = new ModalDetector();\n if (!toastCaptureRef.current) toastCaptureRef.current = new ToastCapture();\n if (!undoTrackerRef.current) undoTrackerRef.current = new UndoTracker();\n\n const modalDetector = modalDetectorRef.current;\n const toastCapture = toastCaptureRef.current;\n const undoTracker = undoTrackerRef.current;\n\n // Server instance (persisted across renders)\n const serverRef = useRef<NativeUIBridgeServer | null>(null);\n const eventBridgeRef = useRef<WebSocketEventBridge | null>(null);\n\n // Cloud / mDNS transport references\n const announcerRef = useRef<DeviceAnnouncer | null>(null);\n const cloudRelayRef = useRef<CloudRelayClient | null>(null);\n\n // Server management — uses injected serverAdapter if provided\n const startServer = useCallback(async () => {\n if (!features.server) return;\n\n if (!serverAdapter) {\n console.warn(\n `[ui-bridge-native] HTTP server not available: no serverAdapter prop provided. ` +\n `Pass a serverAdapter to UIBridgeNativeProvider to enable the HTTP server.`\n );\n return;\n }\n\n const server = createNativeServer(registry, executor, {\n serverPort: config.serverPort || 8087,\n cors: true,\n appInfo: config.appInfo,\n testHooks: features.testHooks === true,\n });\n\n server.setAdapter(serverAdapter);\n\n // Wire navigation provider if supplied\n if (navigationProvider) {\n server.setNavigationProvider(navigationProvider);\n }\n\n // Wire screenshot provider if supplied\n if (screenshotProvider) {\n server.setScreenshotProvider(screenshotProvider);\n }\n\n // Wire route provider if supplied (must be set AFTER navigationProvider\n // since both may override getSnapshot / pageNavigate handlers)\n if (routeProvider) {\n server.setRouteProvider(routeProvider);\n }\n\n // Wire up WebSocket event bridge if adapter supports it\n const wsAdapter = serverAdapter as WebSocketServerAdapter;\n if (typeof wsAdapter.broadcast === 'function') {\n const eventBridge = new WebSocketEventBridge(registry);\n server.setEventBridge(eventBridge);\n\n wsAdapter.onWebSocketConnect = (connId: string) => {\n // Create a lightweight connection proxy for the event bridge\n // The actual WebSocketConnection lives in the adapter\n eventBridge.addConnection({\n id: connId,\n subscriptions: new Set(),\n alive: true,\n isOpen: true,\n send: (msg: string) => wsAdapter.sendToConnection?.(connId, msg),\n sendEvent: (event: { event: string }) => {\n if (!eventBridge.isSubscribed(connId, event.event)) return;\n wsAdapter.sendToConnection?.(connId, JSON.stringify(event));\n },\n ping: () => {\n /* adapter handles heartbeat */\n },\n close: () => {\n /* adapter handles close */\n },\n destroy: () => {\n /* adapter handles destroy */\n },\n } as any); // eslint-disable-line @typescript-eslint/no-explicit-any\n };\n\n wsAdapter.onWebSocketDisconnect = (connId: string) => {\n // Abort any pending waiters (waitForElement / waitForCondition)\n // for this connection BEFORE removing it — stops leaked timers\n // and registry listeners.\n server.abortWaitersForConnection(connId);\n eventBridge.removeConnection(connId);\n };\n\n wsAdapter.onWebSocketMessage = async (connId: string, message: string) => {\n return server.handleWebSocketMessage(connId, message);\n };\n\n eventBridge.start();\n eventBridgeRef.current = eventBridge;\n }\n\n try {\n await server.start();\n serverRef.current = server;\n setServerRunning(true);\n } catch (err) {\n console.warn('[ui-bridge-native] Failed to start HTTP server:', err);\n }\n }, [\n features.server,\n features.testHooks,\n config.serverPort,\n config.appInfo,\n registry,\n executor,\n serverAdapter,\n navigationProvider,\n screenshotProvider,\n routeProvider,\n ]);\n\n const stopServer = useCallback(() => {\n if (eventBridgeRef.current) {\n eventBridgeRef.current.stop();\n eventBridgeRef.current = null;\n }\n if (serverRef.current) {\n serverRef.current.stop().catch(() => {});\n serverRef.current = null;\n }\n setServerRunning(false);\n }, []);\n\n // Auto-start server if enabled\n useEffect(() => {\n if (features.server) {\n startServer();\n return () => stopServer();\n }\n }, [features.server, startServer, stopServer]);\n\n // Start mDNS announcement and cloud relay.\n //\n // The cloud relay path does NOT require the HTTP server to be running —\n // it calls `server.handleRequest()` directly, bypassing HTTP. This matters\n // for preview/production builds where `features.server` is typically\n // false (no native TCP server adapter available). We still need a\n // NativeUIBridgeServer instance to handle tunneled requests, so we create\n // a bare instance here if startServer() didn't already make one.\n //\n // mDNS also doesn't need the HTTP server — it just advertises on the\n // network so remote devices can discover this phone's address.\n useEffect(() => {\n // Everything here is best-effort — any exception must not crash the app.\n try {\n const needsBareServer = !serverRef.current && !!cloudRelayConfig;\n if (needsBareServer) {\n try {\n // Create a server instance for handleRequest() use only; no adapter,\n // no HTTP listener. This is safe without features.server.\n const bareServer = createNativeServer(registry, executor, {\n serverPort: config.serverPort || 8087,\n cors: true,\n appInfo: config.appInfo,\n testHooks: features.testHooks === true,\n });\n if (navigationProvider) bareServer.setNavigationProvider(navigationProvider);\n if (screenshotProvider) bareServer.setScreenshotProvider(screenshotProvider);\n if (routeProvider) bareServer.setRouteProvider(routeProvider);\n serverRef.current = bareServer;\n } catch (err) {\n console.warn('[ui-bridge-native] Failed to create bare server:', err);\n }\n }\n\n // mDNS advertisement\n if (enableMdnsAnnounce && deviceId) {\n try {\n const announcer = new DeviceAnnouncer({\n deviceId,\n appId: config.appInfo?.appId ?? 'unknown',\n port: config.serverPort ?? 8087,\n cloudRelayUrl: cloudRelayConfig?.relayUrl,\n cloudToken: cloudRelayConfig?.authToken,\n });\n announcerRef.current = announcer;\n void announcer.startMdnsAdvertise().catch((err) => {\n console.warn('[ui-bridge-native] mDNS advertise failed:', err);\n });\n } catch (err) {\n console.warn('[ui-bridge-native] Failed to start DeviceAnnouncer:', err);\n }\n }\n\n // Cloud relay tunnel (works without HTTP server)\n if (cloudRelayConfig && serverRef.current) {\n try {\n const relayClient = new CloudRelayClient({\n ...cloudRelayConfig,\n uiBridgeServer: serverRef.current,\n });\n cloudRelayRef.current = relayClient;\n relayClient.start();\n } catch (err) {\n console.warn('[ui-bridge-native] Failed to start CloudRelayClient:', err);\n }\n }\n } catch (err) {\n console.warn('[ui-bridge-native] Transport effect failed:', err);\n }\n\n return () => {\n try {\n if (announcerRef.current) {\n void announcerRef.current.stop().catch(() => {});\n announcerRef.current = null;\n }\n if (cloudRelayRef.current) {\n cloudRelayRef.current.stop();\n cloudRelayRef.current = null;\n }\n } catch {\n // cleanup must never throw\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n serverRunning,\n cloudRelayConfig?.relayUrl,\n cloudRelayConfig?.authToken,\n enableMdnsAnnounce,\n deviceId,\n ]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n stopServer();\n resetGlobalRegistry();\n };\n }, [stopServer]);\n\n // Context methods\n const getElements = useCallback(() => registry.getAllElements(), [registry]);\n\n const getComponents = useCallback(() => registry.getAllComponents(), [registry]);\n\n const createSnapshot = useCallback(() => registry.createSnapshot(), [registry]);\n\n const getCurrentRoute = useCallback(() => {\n return routeProvider?.getCurrentRoute() ?? null;\n }, [routeProvider]);\n\n // Mark the previous route's elements offscreen when the active route changes.\n // Without this, React Navigation's persistent-mount behavior leaves stale\n // layouts in the registry for tabs the user has left. Elements on the new\n // route re-fire `onLayout` and repopulate their layout.\n useEffect(() => {\n if (!routeProvider) return;\n\n let lastRoute: string | null = routeProvider.getCurrentRoute();\n\n return routeProvider.subscribe((current: string | null) => {\n if (current !== lastRoute && lastRoute != null) {\n registry.markRouteOffscreen(lastRoute);\n }\n lastRoute = current;\n });\n }, [routeProvider, registry]);\n\n // Wire trackers into the registry's snapshot enricher slots. Trackers are\n // stable refs, so this effect runs exactly once per provider lifecycle.\n useEffect(() => {\n registry.setEnrichers({ modalDetector, toastCapture, undoTracker });\n }, [registry, modalDetector, toastCapture, undoTracker]);\n\n // Mirror successful bridge actions into UndoTracker's rolling history so\n // snapshots can surface action-correlation undo context without each\n // action site needing to call recordAction manually.\n useEffect(() => {\n const unsubscribe = executor.onActionExecuted((event) => {\n if (!event.success) return;\n undoTracker.recordAction({\n id: event.requestId ?? `action-${event.timestamp}`,\n type: event.action,\n targetId: event.elementId,\n timestamp: event.timestamp,\n reversible: true,\n });\n });\n return unsubscribe;\n }, [executor, undoTracker]);\n\n const on = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.on(type, listener),\n [registry]\n );\n\n const off = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.off(type, listener),\n [registry]\n );\n\n const contextValue = useMemo<UIBridgeNativeContextValue>(\n () => ({\n features,\n config,\n registry,\n executor,\n modalDetector,\n toastCapture,\n undoTracker,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n initialized: true,\n serverRunning,\n startServer,\n stopServer,\n getCurrentRoute,\n }),\n [\n features,\n config,\n registry,\n executor,\n modalDetector,\n toastCapture,\n undoTracker,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n serverRunning,\n startServer,\n stopServer,\n getCurrentRoute,\n ]\n );\n\n return (\n <UIBridgeNativeContext.Provider value={contextValue}>{children}</UIBridgeNativeContext.Provider>\n );\n}\n\n/**\n * useUIBridgeNative hook\n *\n * Access the UI Bridge Native context. Throws if used outside provider.\n */\nexport function useUIBridgeNative(): UIBridgeNativeContextValue {\n const context = useContext(UIBridgeNativeContext);\n if (!context) {\n throw new Error('useUIBridgeNative must be used within a UIBridgeNativeProvider');\n }\n return context;\n}\n\n/**\n * useUIBridgeNativeOptional hook\n *\n * Access the UI Bridge Native context, returning null if outside provider.\n */\nexport function useUIBridgeNativeOptional(): UIBridgeNativeContextValue | null {\n return useContext(UIBridgeNativeContext);\n}\n\n/**\n * useUIBridgeNativeRequired hook\n *\n * Alias for useUIBridgeNative (throws if outside provider).\n */\nexport const useUIBridgeNativeRequired = useUIBridgeNative;\n","/**\n * useUIElement Hook for React Native\n *\n * Register a native element with UI Bridge for control and observation.\n */\n\nimport { useRef, useEffect, useCallback, useMemo, useState } from 'react';\nimport { StyleSheet } from 'react-native';\nimport type {\n NativeElementType,\n NativeStandardAction,\n NativeCustomAction,\n NativeElementState,\n NativeElementIdentifier,\n RegisteredNativeElement,\n NativeElementRef,\n NativeLayout,\n} from '../core/types';\nimport { useUIBridgeNativeOptional } from './UIBridgeNativeProvider';\n\n/**\n * Flatten an RN style prop into a plain object.\n * Uses StyleSheet.flatten which handles arrays, IDs, and nested objects.\n */\nfunction flattenStyle(style: unknown): Record<string, unknown> | undefined {\n if (style == null) return undefined;\n try {\n const flat = StyleSheet.flatten(style as Parameters<typeof StyleSheet.flatten>[0]);\n return flat ? (flat as Record<string, unknown>) : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Flatten state style overrides into plain objects.\n */\nfunction flattenStateStyles(stateStyles?: {\n pressed?: unknown;\n focused?: unknown;\n disabled?: unknown;\n}):\n | {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n }\n | undefined {\n if (!stateStyles) return undefined;\n const result: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n } = {};\n if (stateStyles.pressed != null) result.pressed = flattenStyle(stateStyles.pressed);\n if (stateStyles.focused != null) result.focused = flattenStyle(stateStyles.focused);\n if (stateStyles.disabled != null) result.disabled = flattenStyle(stateStyles.disabled);\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Local type definition for the layout data we extract from LayoutChangeEvent.\n * We use this internally to avoid type conflicts between different react-native versions\n * (e.g., when ui-bridge-native is used as a file: dependency with a different RN version).\n */\ninterface LayoutEventData {\n nativeEvent: {\n layout: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n };\n}\n\n/**\n * useUIElement options\n */\nexport interface UseUIElementOptions {\n /** Unique identifier for the element */\n id: string;\n /** Element type (defaults to 'custom') */\n type?: NativeElementType;\n /** Human-readable label */\n label?: string;\n /** Override available actions */\n actions?: NativeStandardAction[];\n /** Custom actions */\n customActions?: Record<string, NativeCustomAction>;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Callback when state changes */\n onStateChange?: (state: NativeElementState) => void;\n /** Parent component path for tree path generation */\n parentPath?: string;\n /** RN style prop — will be flattened for design review */\n style?: unknown;\n /** State-specific style overrides for design review (pressed, focused, disabled) */\n stateStyles?: {\n pressed?: unknown;\n focused?: unknown;\n disabled?: unknown;\n };\n /**\n * Handler props to auto-register with the bridge for action execution.\n * When provided, the bridge can invoke these handlers via press/type/toggle actions\n * without the component needing a separate useEffect + updateElementProps call.\n *\n * @example\n * ```tsx\n * const { ref, onLayout, bridgeProps } = useUIElement({\n * id: 'my-button',\n * type: 'pressable',\n * handlers: { onPress: handlePress },\n * });\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handlers?: Record<string, ((...args: any[]) => any) | undefined>;\n}\n\n/**\n * Bridge props to spread onto the component\n */\nexport interface UIBridgeProps {\n /** Test ID for automation */\n testID: string;\n /** Accessibility label */\n accessibilityLabel?: string;\n}\n\n/**\n * useUIElement return value\n */\nexport interface UseUIElementReturn {\n /** Ref to attach to the element */\n ref: React.RefObject<NativeElementRef>;\n /** onLayout handler to spread onto the element - uses generic type for RN version compatibility */\n onLayout: (event: {\n nativeEvent: { layout: { x: number; y: number; width: number; height: number } };\n }) => void;\n /** Props to spread onto the element for identification */\n bridgeProps: UIBridgeProps;\n /** Whether the element is registered */\n registered: boolean;\n /** Get current state */\n getState: () => NativeElementState | null;\n /** Get element identifier */\n getIdentifier: () => NativeElementIdentifier | null;\n /** Trigger an action on this element */\n trigger: (\n action: NativeStandardAction | string,\n params?: Record<string, unknown>\n ) => Promise<void>;\n /** Manually register the element */\n register: () => void;\n /** Manually unregister the element */\n unregister: () => void;\n /** The registered element info */\n registeredElement: RegisteredNativeElement | null;\n /** Update style for design review (flattens and stores in registry) */\n updateStyle: (\n style: unknown,\n stateStyles?: { pressed?: unknown; focused?: unknown; disabled?: unknown }\n ) => void;\n}\n\n/**\n * useUIElement hook for React Native\n *\n * Registers a native element with UI Bridge for programmatic control.\n *\n * @example\n * ```tsx\n * function SubmitButton() {\n * const { ref, onLayout, bridgeProps, trigger } = useUIElement({\n * id: 'submit-btn',\n * type: 'button',\n * label: 'Submit Form',\n * });\n *\n * return (\n * <Pressable\n * ref={ref}\n * onLayout={onLayout}\n * {...bridgeProps}\n * onPress={() => handleSubmit()}\n * >\n * <Text>Submit</Text>\n * </Pressable>\n * );\n * }\n * ```\n */\nexport function useUIElement(options: UseUIElementOptions): UseUIElementReturn {\n const bridge = useUIBridgeNativeOptional();\n const ref = useRef<NativeElementRef>(null);\n const [registered, setRegistered] = useState(false);\n const [_layout, setLayout] = useState<NativeLayout | null>(null);\n const propsRef = useRef<Record<string, unknown>>({});\n // Authoritative registration tracking. See the web `useUIElement` for\n // rationale: consumers commonly pass inline `style`/`stateStyles` objects,\n // and threading the `registered` state into the register useCallback's deps\n // creates a cleanup/run feedback loop past React's 50-update ceiling.\n const registeredRef = useRef(false);\n const registeredIdRef = useRef<string | null>(null);\n\n const {\n id,\n type = 'custom',\n label,\n actions,\n customActions,\n autoRegister = true,\n onStateChange,\n parentPath,\n style,\n stateStyles: stateStylesProp,\n handlers: handlersProp,\n } = options;\n\n // Build tree path\n const treePath = parentPath ? `${parentPath}/${id}` : id;\n\n // Bridge props to spread onto the element\n const bridgeProps: UIBridgeProps = useMemo(\n () => ({\n testID: id,\n accessibilityLabel: label,\n }),\n [id, label]\n );\n\n // Register the element\n const register = useCallback(() => {\n if (!bridge || registeredRef.current) return;\n\n bridge.registry.registerElement(id, ref, {\n type,\n label,\n actions,\n customActions,\n treePath,\n testId: id,\n accessibilityLabel: label,\n registrationRoute: bridge.getCurrentRoute(),\n flatStyle: flattenStyle(style),\n stateStyles: flattenStateStyles(stateStylesProp),\n });\n registeredRef.current = true;\n registeredIdRef.current = id;\n setRegistered(true);\n }, [bridge, id, type, label, actions, customActions, treePath, style, stateStylesProp]);\n\n // Unregister the element\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterElement(registeredIdRef.current ?? id);\n registeredRef.current = false;\n registeredIdRef.current = null;\n setRegistered(false);\n }, [bridge, id]);\n\n // Keep `onStateChange` in a ref so the layout callback doesn't get\n // re-created (and thereby miss the first layout event) when the consumer\n // passes an inline arrow function.\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => {\n onStateChangeRef.current = onStateChange;\n }, [onStateChange]);\n\n // Handle layout changes.\n //\n // Registry write gating uses `registeredRef.current` (not the React\n // `registered` state) so the very first `onLayout` event — which can fire\n // before `setRegistered(true)` has been committed by React — still pushes\n // layout into the registry. Without this, snapshots show layout `(?, ?)`\n // until the element is interacted with, because the initial onLayout's\n // closure captured `registered === false` and silently dropped the write.\n // updateElementState itself is also no-op when the id isn't registered,\n // so this is safe even when `onLayout` fires before mount.\n const onLayout = useCallback(\n (event: LayoutEventData) => {\n const { x, y, width, height } = event.nativeEvent.layout;\n\n const writeLayout = (newLayout: NativeLayout) => {\n setLayout(newLayout);\n if (!bridge) return;\n const newState: NativeElementState = {\n mounted: true,\n visible: width > 0 && height > 0,\n enabled: true,\n focused: false,\n layout: newLayout,\n };\n bridge.registry.updateElementState(id, newState);\n onStateChangeRef.current?.(newState);\n };\n\n // Get absolute position using measureInWindow when available.\n if (ref.current && 'measureInWindow' in ref.current) {\n (\n ref.current as {\n measureInWindow: (\n callback: (pageX: number, pageY: number, w: number, h: number) => void\n ) => void;\n }\n ).measureInWindow((pageX: number, pageY: number) => {\n writeLayout({ x, y, width, height, pageX, pageY });\n });\n } else {\n // Fallback when measureInWindow isn't on the ref (test fixtures, web).\n writeLayout({ x, y, width, height, pageX: x, pageY: y });\n }\n },\n [bridge, id]\n );\n\n // Keep latest register/unregister in refs so the auto-register effect does\n // not re-run when consumers pass inline `style`/`stateStyles` options.\n const registerRef = useRef(register);\n const unregisterRef = useRef(unregister);\n useEffect(() => {\n registerRef.current = register;\n unregisterRef.current = unregister;\n }, [register, unregister]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister) {\n registerRef.current();\n }\n\n return () => {\n if (registeredRef.current) {\n unregisterRef.current();\n }\n };\n }, [autoRegister, bridge]);\n\n // Layout-on-mount fallback.\n //\n // Bug being addressed: the registry's `layout` field shows `(?, ?)` until\n // the element is actioned. Two compounding causes:\n // 1. The first `onLayout` event used to drop its write because the\n // callback's closure captured `registered === false` (fixed above by\n // switching to a registry-only write path).\n // 2. Some consumers don't actually thread `onLayout={onLayout}` onto\n // their RN component, so the layout never measures.\n //\n // For (2), schedule a `measureInWindow` after registration. We still need\n // the consumer to thread the `ref` (which they always do — it's how\n // they get an actionable target), so this is best-effort: when ref is\n // populated and supports measureInWindow, push the result into the\n // registry. The dependency list is [bridge, registered, id] so this\n // re-runs once `register()` flips `registered` to true.\n useEffect(() => {\n if (!bridge || !registered) return;\n const node = ref.current as\n | (NativeElementRef & {\n measureInWindow?: (\n callback: (pageX: number, pageY: number, w: number, h: number) => void\n ) => void;\n })\n | null;\n if (!node || typeof node.measureInWindow !== 'function') return;\n\n let cancelled = false;\n node.measureInWindow((pageX: number, pageY: number, w: number, h: number) => {\n if (cancelled) return;\n // measureInWindow can return zeros before layout has actually run.\n // Skip writing then — `onLayout` (when wired) will fire with real\n // numbers shortly.\n if (w <= 0 || h <= 0) return;\n const newLayout: NativeLayout = {\n x: pageX,\n y: pageY,\n width: w,\n height: h,\n pageX,\n pageY,\n };\n setLayout(newLayout);\n const newState: NativeElementState = {\n mounted: true,\n visible: true,\n enabled: true,\n focused: false,\n layout: newLayout,\n };\n bridge.registry.updateElementState(id, newState);\n onStateChangeRef.current?.(newState);\n });\n return () => {\n cancelled = true;\n };\n }, [bridge, registered, id]);\n\n // Auto-register handler props (onPress, onChangeText, etc.) when provided.\n // We use a ref to track which keys were last registered so we can clear\n // stale handlers on cleanup or when the handlers object changes.\n const registeredHandlerKeysRef = useRef<string[]>([]);\n\n useEffect(() => {\n if (!bridge || !registered || !handlersProp) return;\n\n // Filter to only function values\n const fnProps: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(handlersProp)) {\n if (typeof value === 'function') {\n fnProps[key] = value;\n }\n }\n\n const newKeys = Object.keys(fnProps);\n\n // Clear any previously registered keys that are no longer present\n const removedKeys = registeredHandlerKeysRef.current.filter((k) => !newKeys.includes(k));\n if (removedKeys.length > 0) {\n const cleared: Record<string, unknown> = {};\n for (const key of removedKeys) {\n cleared[key] = undefined;\n }\n bridge.registry.updateElementProps(id, cleared);\n }\n\n if (newKeys.length > 0) {\n bridge.registry.updateElementProps(id, fnProps);\n }\n registeredHandlerKeysRef.current = newKeys;\n\n return () => {\n // On unmount or re-run, clear all registered handlers\n if (registeredHandlerKeysRef.current.length > 0) {\n const cleared: Record<string, unknown> = {};\n for (const key of registeredHandlerKeysRef.current) {\n cleared[key] = undefined;\n }\n bridge.registry.updateElementProps(id, cleared);\n registeredHandlerKeysRef.current = [];\n }\n };\n }, [bridge, registered, id, handlersProp]);\n\n // Update props for action execution (allows accessing onPress, onChangeText, etc.)\n const _updateProps = useCallback(\n (props: Record<string, unknown>) => {\n propsRef.current = { ...propsRef.current, ...props };\n if (bridge && registered) {\n bridge.registry.updateElementProps(id, props);\n }\n },\n [bridge, registered, id]\n );\n\n // Get state\n const getState = useCallback((): NativeElementState | null => {\n if (!bridge) return null;\n const element = bridge.registry.getElement(id);\n return element?.getState() || null;\n }, [bridge, id]);\n\n // Get identifier\n const getIdentifier = useCallback((): NativeElementIdentifier | null => {\n if (!bridge) return null;\n const element = bridge.registry.getElement(id);\n return element?.getIdentifier() || null;\n }, [bridge, id]);\n\n // Trigger action\n const trigger = useCallback(\n async (action: NativeStandardAction | string, params?: Record<string, unknown>) => {\n if (!bridge) {\n throw new Error('UI Bridge Native not available');\n }\n\n const response = await bridge.executor.executeAction(id, {\n action,\n params,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n },\n [bridge, id]\n );\n\n // Update style for design review\n const updateStyle = useCallback(\n (\n newStyle: unknown,\n newStateStyles?: { pressed?: unknown; focused?: unknown; disabled?: unknown }\n ) => {\n if (!bridge || !registered) return;\n const flat = flattenStyle(newStyle);\n if (flat) {\n bridge.registry.updateElementStyle(id, flat, flattenStateStyles(newStateStyles));\n }\n },\n [bridge, registered, id]\n );\n\n // Get registered element\n const registeredElement = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getElement(id) || null;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [bridge, id, registered]);\n\n return {\n ref,\n onLayout,\n bridgeProps,\n registered,\n getState,\n getIdentifier,\n trigger,\n register,\n unregister,\n registeredElement,\n updateStyle,\n };\n}\n\n/**\n * useUIElementWithProps hook\n *\n * Extended version that also captures component props for action execution.\n * Useful when you need the bridge to be able to call onPress, onChangeText, etc.\n *\n * @example\n * ```tsx\n * function TextInputField({ onChangeText, value }) {\n * const { ref, onLayout, bridgeProps, captureProps } = useUIElementWithProps({\n * id: 'email-input',\n * type: 'input',\n * });\n *\n * // Capture props so bridge can call onChangeText\n * captureProps({ onChangeText, value });\n *\n * return (\n * <TextInput\n * ref={ref}\n * onLayout={onLayout}\n * {...bridgeProps}\n * value={value}\n * onChangeText={onChangeText}\n * />\n * );\n * }\n * ```\n */\nexport interface UseUIElementWithPropsReturn extends UseUIElementReturn {\n /** Capture props for action execution */\n captureProps: (props: Record<string, unknown>) => void;\n}\n\nexport function useUIElementWithProps(options: UseUIElementOptions): UseUIElementWithPropsReturn {\n const elementReturn = useUIElement(options);\n const bridge = useUIBridgeNativeOptional();\n\n const captureProps = useCallback(\n (props: Record<string, unknown>) => {\n if (bridge && elementReturn.registered) {\n bridge.registry.updateElementProps(options.id, props);\n }\n },\n [bridge, elementReturn.registered, options.id]\n );\n\n return {\n ...elementReturn,\n captureProps,\n };\n}\n","/**\n * useUIComponent Hook for React Native\n *\n * Register a component with UI Bridge for component-level actions.\n */\n\nimport { useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { RegisteredNativeComponent } from '../core/types';\nimport { useUIBridgeNativeOptional } from './UIBridgeNativeProvider';\n\n/**\n * Action definition for useUIComponent\n */\nexport interface ComponentActionDef<TParams = unknown, TResult = unknown> {\n /** Action identifier */\n id: string;\n /** Human-readable label */\n label?: string;\n /** Description */\n description?: string;\n /** Handler function */\n handler: (params?: TParams) => TResult | Promise<TResult>;\n}\n\n/**\n * useUIComponent options\n */\nexport interface UseUIComponentOptions {\n /** Unique identifier for the component */\n id: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Actions available on this component */\n actions?: ComponentActionDef[];\n /** Child element IDs owned by this component */\n elementIds?: string[];\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\n/**\n * useUIComponent return value\n */\nexport interface UseUIComponentReturn {\n /** Whether the component is registered */\n registered: boolean;\n /** Execute an action on this component */\n executeAction: <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ) => Promise<TResult>;\n /** Manually register the component */\n register: () => void;\n /** Manually unregister the component */\n unregister: () => void;\n /** Update actions dynamically */\n updateActions: (actions: ComponentActionDef[]) => void;\n /** Add an element ID to this component */\n addElement: (elementId: string) => void;\n /** Remove an element ID from this component */\n removeElement: (elementId: string) => void;\n /** The registered component info */\n registeredComponent: RegisteredNativeComponent | null;\n}\n\n/**\n * useUIComponent hook for React Native\n *\n * Registers a component with UI Bridge for component-level control.\n * Components can expose high-level actions that may orchestrate multiple element interactions.\n *\n * @example\n * ```tsx\n * function LoginForm() {\n * const [email, setEmail] = useState('');\n * const [password, setPassword] = useState('');\n *\n * useUIComponent({\n * id: 'login-form',\n * name: 'Login Form',\n * actions: [\n * {\n * id: 'login',\n * label: 'Submit Login',\n * handler: async ({ email, password }) => {\n * setEmail(email);\n * setPassword(password);\n * await submitLogin();\n * },\n * },\n * {\n * id: 'clear',\n * label: 'Clear Form',\n * handler: () => {\n * setEmail('');\n * setPassword('');\n * },\n * },\n * ],\n * });\n *\n * return (\n * <View>\n * <TextInput value={email} onChangeText={setEmail} />\n * <TextInput value={password} onChangeText={setPassword} secureTextEntry />\n * <Button title=\"Login\" onPress={handleSubmit} />\n * </View>\n * );\n * }\n * ```\n */\nexport function useUIComponent(options: UseUIComponentOptions): UseUIComponentReturn {\n const bridge = useUIBridgeNativeOptional();\n const registeredRef = useRef(false);\n const registeredIdRef = useRef<string | null>(null);\n const actionsRef = useRef(options.actions || []);\n const elementIdsRef = useRef(options.elementIds || []);\n\n const { id, name, description, autoRegister = true } = options;\n\n // Update refs when options change\n useEffect(() => {\n actionsRef.current = options.actions || [];\n elementIdsRef.current = options.elementIds || [];\n }, [options.actions, options.elementIds]);\n\n // Register the component\n const register = useCallback(() => {\n if (!bridge || registeredRef.current) return;\n\n bridge.registry.registerComponent(id, {\n name,\n description,\n actions: actionsRef.current.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })),\n elementIds: elementIdsRef.current,\n });\n registeredRef.current = true;\n registeredIdRef.current = id;\n }, [bridge, id, name, description]);\n\n // Unregister the component\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterComponent(registeredIdRef.current ?? id);\n registeredRef.current = false;\n registeredIdRef.current = null;\n }, [bridge, id]);\n\n // Execute an action\n const executeAction = useCallback(\n async <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ): Promise<TResult> => {\n if (!bridge) {\n throw new Error('UI Bridge Native not available');\n }\n\n const response = await bridge.executor.executeComponentAction(id, {\n action: actionId,\n params: params as Record<string, unknown>,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n\n return response.result as TResult;\n },\n [bridge, id]\n );\n\n // Update actions dynamically\n const updateActions = useCallback(\n (actions: ComponentActionDef[]) => {\n actionsRef.current = actions;\n\n // Re-register with updated actions if already registered\n if (registeredRef.current && bridge) {\n bridge.registry.unregisterComponent(id);\n registeredRef.current = false;\n register();\n }\n },\n [bridge, id, register]\n );\n\n // Add element ID\n const addElement = useCallback((elementId: string) => {\n if (!elementIdsRef.current.includes(elementId)) {\n elementIdsRef.current = [...elementIdsRef.current, elementId];\n }\n }, []);\n\n // Remove element ID\n const removeElement = useCallback((elementId: string) => {\n elementIdsRef.current = elementIdsRef.current.filter((eid) => eid !== elementId);\n }, []);\n\n // Keep latest register/unregister in refs so the auto-register effect does\n // not re-run when consumers pass inline options.\n const registerRef = useRef(register);\n const unregisterRef = useRef(unregister);\n useEffect(() => {\n registerRef.current = register;\n unregisterRef.current = unregister;\n }, [register, unregister]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister) {\n registerRef.current();\n }\n\n return () => {\n if (registeredRef.current) {\n unregisterRef.current();\n }\n };\n }, [autoRegister, bridge]);\n\n // Get registered component\n const registeredComponent = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getComponent(id) || null;\n }, [bridge, id]);\n\n return {\n registered: registeredRef.current,\n executeAction,\n register,\n unregister,\n updateActions,\n addElement,\n removeElement,\n registeredComponent,\n };\n}\n\n/**\n * useUIComponentAction hook\n *\n * Create a stable action handler that can be used with useUIComponent.\n * Useful for memoizing action handlers.\n */\nexport function useUIComponentAction<TParams = unknown, TResult = unknown>(\n handler: (params?: TParams) => TResult | Promise<TResult>,\n deps: React.DependencyList\n): (params?: TParams) => TResult | Promise<TResult> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(handler, deps);\n}\n","/**\n * useUIBridge Hook for React Native\n *\n * Provides a simplified interface for common UI Bridge operations.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport type {\n NativeActionRequest,\n NativeActionResponse,\n NativeFindRequest,\n NativeFindResponse,\n NativeBridgeSnapshot,\n RegisteredNativeElement,\n RegisteredNativeComponent,\n Workflow,\n} from '../core/types';\nimport { useUIBridgeNativeOptional } from './UIBridgeNativeProvider';\n\n/**\n * Component action request\n */\nexport interface ComponentActionRequest {\n /** Action ID */\n action: string;\n /** Action parameters */\n params?: Record<string, unknown>;\n}\n\n/**\n * Component action response\n */\nexport interface ComponentActionResponse {\n /** Whether the action succeeded */\n success: boolean;\n /** Result of the action */\n result?: unknown;\n /** Error message if failed */\n error?: string;\n /** Duration in milliseconds */\n durationMs: number;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * useUIBridge return type\n */\nexport interface UseUIBridgeReturn {\n /** Whether UI Bridge is available */\n available: boolean;\n /** Whether UI Bridge is initialized */\n initialized: boolean;\n /** All registered elements */\n elements: RegisteredNativeElement[];\n /** All registered components */\n components: RegisteredNativeComponent[];\n /** All registered workflows */\n workflows: Workflow[];\n /** Create a snapshot of the current state */\n createSnapshot: () => NativeBridgeSnapshot;\n /** Execute an action on an element */\n executeAction: (elementId: string, request: NativeActionRequest) => Promise<NativeActionResponse>;\n /** Execute a component action */\n executeComponentAction: (\n componentId: string,\n request: ComponentActionRequest\n ) => Promise<ComponentActionResponse>;\n /** Find elements */\n find: (request?: NativeFindRequest) => Promise<NativeFindResponse>;\n /** Get an element by ID */\n getElement: (id: string) => RegisteredNativeElement | undefined;\n /** Get a component by ID */\n getComponent: (id: string) => RegisteredNativeComponent | undefined;\n /** Get element state by ID */\n getElementState: (id: string) => ReturnType<RegisteredNativeElement['getState']> | null;\n /** Register a workflow */\n registerWorkflow: (workflow: Workflow) => void;\n /** Unregister a workflow */\n unregisterWorkflow: (id: string) => void;\n}\n\n/**\n * useUIBridge hook\n *\n * Provides a simplified interface for accessing UI Bridge functionality.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { available, elements, executeAction, find } = useUIBridge();\n *\n * if (!available) {\n * return <Text>UI Bridge not available</Text>;\n * }\n *\n * const handlePress = async () => {\n * // Find all buttons\n * const result = await find({ types: ['button'] });\n * console.log('Found buttons:', result.elements);\n *\n * // Execute action on specific element\n * await executeAction('submit-btn', { action: 'press' });\n * };\n *\n * return (\n * <View>\n * <Text>Elements: {elements.length}</Text>\n * <Button title=\"Press\" onPress={handlePress} />\n * </View>\n * );\n * }\n * ```\n */\nexport function useUIBridge(): UseUIBridgeReturn {\n const bridge = useUIBridgeNativeOptional();\n\n const available = bridge !== null;\n const initialized = bridge?.initialized ?? false;\n\n // Get elements\n const elements = useMemo(() => (bridge ? bridge.getElements() : []), [bridge]);\n\n // Get components\n const components = useMemo(() => (bridge ? bridge.getComponents() : []), [bridge]);\n\n // Get workflows\n const workflows = useMemo(() => (bridge ? bridge.registry.getAllWorkflows() : []), [bridge]);\n\n // Create snapshot\n const createSnapshot = useCallback((): NativeBridgeSnapshot => {\n if (!bridge) {\n return {\n timestamp: Date.now(),\n elements: [],\n components: [],\n workflows: [],\n };\n }\n return bridge.createSnapshot();\n }, [bridge]);\n\n // Execute action\n const executeAction = useCallback(\n async (elementId: string, request: NativeActionRequest): Promise<NativeActionResponse> => {\n if (!bridge) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return bridge.executor.executeAction(elementId, request);\n },\n [bridge]\n );\n\n // Execute component action\n const executeComponentAction = useCallback(\n async (\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> => {\n if (!bridge) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return bridge.executor.executeComponentAction(componentId, request);\n },\n [bridge]\n );\n\n // Find elements\n const find = useCallback(\n async (request?: NativeFindRequest): Promise<NativeFindResponse> => {\n if (!bridge) {\n return {\n elements: [],\n total: 0,\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return bridge.executor.find(request || {});\n },\n [bridge]\n );\n\n // Get element\n const getElement = useCallback((id: string) => bridge?.registry.getElement(id), [bridge]);\n\n // Get component\n const getComponent = useCallback((id: string) => bridge?.registry.getComponent(id), [bridge]);\n\n // Get element state\n const getElementState = useCallback(\n (id: string) => {\n const element = bridge?.registry.getElement(id);\n return element?.getState() ?? null;\n },\n [bridge]\n );\n\n // Register workflow\n const registerWorkflow = useCallback(\n (workflow: Workflow) => {\n bridge?.registry.registerWorkflow(workflow);\n },\n [bridge]\n );\n\n // Unregister workflow\n const unregisterWorkflow = useCallback(\n (id: string) => {\n bridge?.registry.unregisterWorkflow(id);\n },\n [bridge]\n );\n\n return {\n available,\n initialized,\n elements,\n components,\n workflows,\n createSnapshot,\n executeAction,\n executeComponentAction,\n find,\n getElement,\n getComponent,\n getElementState,\n registerWorkflow,\n unregisterWorkflow,\n };\n}\n\n/**\n * useUIBridgeRequired hook\n *\n * Same as useUIBridge but throws if not available.\n */\nexport function useUIBridgeRequired(): UseUIBridgeReturn {\n const result = useUIBridge();\n if (!result.available) {\n throw new Error('useUIBridgeRequired must be used within a UIBridgeNativeProvider');\n }\n return result;\n}\n","/**\n * useAutoRegister Hook for React Native\n *\n * Enables automatic registration of interactive React Native components.\n * Unlike the web version, this doesn't use MutationObserver (no DOM).\n * Instead, it provides a simple API for components to register themselves.\n *\n * For comprehensive coverage in React Native, components should:\n * 1. Use this hook at the app root to enable the registry\n * 2. Use useUIElement on interactive components (or wrap with Pressable/TouchableOpacity)\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { useUIBridgeNativeOptional } from './UIBridgeNativeProvider';\nimport type { NativeElementRef } from '../core/types';\nimport type { RegisterElementOptions } from '../core/registry';\n\n/**\n * Options for auto-registration in React Native\n */\nexport interface NativeAutoRegisterOptions {\n /** Enable auto-registration (default: true in dev mode) */\n enabled?: boolean;\n /** Callback when element is registered */\n onRegister?: (id: string) => void;\n /** Callback when element is unregistered */\n onUnregister?: (id: string) => void;\n}\n\n/**\n * Handle returned by useAutoRegister for programmatic registration\n */\nexport interface NativeAutoRegisterHandle {\n /** Register an element programmatically */\n register: (\n id: string,\n ref: React.RefObject<NativeElementRef>,\n options?: RegisterElementOptions\n ) => void;\n /** Unregister an element programmatically */\n unregister: (id: string) => void;\n /** Check if auto-registration is enabled */\n isEnabled: boolean;\n}\n\n/**\n * Hook for enabling automatic element registration in React Native.\n *\n * Since React Native doesn't have a DOM to observe, this hook provides\n * a handle for programmatic registration. For most use cases, you should\n * use useUIElement directly on interactive components.\n *\n * @example\n * ```tsx\n * function App() {\n * const autoRegister = useAutoRegister({ enabled: __DEV__ });\n *\n * // Programmatic registration (rare use case)\n * useEffect(() => {\n * autoRegister.register('custom-element', {\n * type: 'button',\n * label: 'Custom Button',\n * });\n *\n * return () => autoRegister.unregister('custom-element');\n * }, []);\n *\n * return <YourApp />;\n * }\n * ```\n */\nexport function useAutoRegister(options: NativeAutoRegisterOptions = {}): NativeAutoRegisterHandle {\n // Note: __DEV__ is a React Native global, but TypeScript doesn't know about it by default\n // Using false as a safe default - consumers should explicitly set enabled: __DEV__ in their app\n const { enabled = false, onRegister, onUnregister } = options;\n\n const bridge = useUIBridgeNativeOptional();\n const registeredIdsRef = useRef(new Set<string>());\n\n /**\n * Register an element\n */\n const register = useCallback(\n (\n id: string,\n ref: React.RefObject<NativeElementRef>,\n elementOptions?: RegisterElementOptions\n ): void => {\n if (!enabled || !bridge?.registry) return;\n\n // Avoid duplicate registration\n if (registeredIdsRef.current.has(id)) return;\n\n bridge.registry.registerElement(id, ref, elementOptions);\n registeredIdsRef.current.add(id);\n onRegister?.(id);\n },\n [enabled, bridge, onRegister]\n );\n\n /**\n * Unregister an element\n */\n const unregister = useCallback(\n (id: string): void => {\n if (!bridge?.registry) return;\n\n bridge.registry.unregisterElement(id);\n registeredIdsRef.current.delete(id);\n onUnregister?.(id);\n },\n [bridge, onUnregister]\n );\n\n /**\n * Cleanup on unmount\n */\n useEffect(() => {\n // Capture ref at effect time so cleanup unregisters the exact same set\n // of IDs, regardless of any future ref reassignment.\n const registeredIds = registeredIdsRef.current;\n return () => {\n registeredIds.forEach((id) => {\n bridge?.registry.unregisterElement(id);\n });\n registeredIds.clear();\n };\n }, [bridge]);\n\n return {\n register,\n unregister,\n isEnabled: enabled && !!bridge?.registry,\n };\n}\n\nexport default useAutoRegister;\n","import { useEffect } from 'react';\nimport { useUIBridgeNative } from './UIBridgeNativeProvider';\nimport type { NativeModalInfo } from '../core/types';\n\nexport interface UseUIBridgeModalOptions {\n id: string;\n title?: string;\n type?: NativeModalInfo['type'];\n blocking?: boolean;\n dismissible?: boolean;\n}\n\n/**\n * Declarative hook: while mounted, registers a modal entry on the active\n * stack so UI Bridge snapshots reflect that a modal is open.\n */\nexport function useUIBridgeModal(opts: UseUIBridgeModalOptions): void {\n const { modalDetector } = useUIBridgeNative();\n const { id, title, type, blocking, dismissible } = opts;\n\n useEffect(() => {\n modalDetector.pushModal({ id, title, type, blocking, dismissible });\n return () => {\n modalDetector.dismissModal(id);\n };\n }, [modalDetector, id, title, type, blocking, dismissible]);\n}\n","import { useCallback, useEffect } from 'react';\nimport { useUIBridgeNative } from './UIBridgeNativeProvider';\nimport type { NativeCapturedToast } from '../core/types';\n\nexport interface UseUIBridgeToastOptions {\n id: string;\n message: string;\n level?: NativeCapturedToast['level'];\n}\n\n/**\n * Declarative hook: while mounted, surfaces a toast via the snapshot enricher.\n * Best for explicit-lifecycle toast components.\n */\nexport function useUIBridgeToast(opts: UseUIBridgeToastOptions): void {\n const { toastCapture } = useUIBridgeNative();\n const { id, message, level } = opts;\n\n useEffect(() => {\n toastCapture.recordToast({ id, message, level });\n return () => {\n toastCapture.dismissToast(id);\n };\n }, [toastCapture, id, message, level]);\n}\n\nexport interface ToastRecorderInput {\n id: string;\n message: string;\n level?: NativeCapturedToast['level'];\n}\n\n/**\n * Imperative hook: returns a `recordToast` callback for code that fires\n * toasts outside React (catch blocks, library callbacks, etc.).\n */\nexport function useToastRecorder(): {\n recordToast: (toast: ToastRecorderInput) => void;\n dismissToast: (id: string) => void;\n} {\n const { toastCapture } = useUIBridgeNative();\n const recordToast = useCallback(\n (toast: ToastRecorderInput) => {\n toastCapture.recordToast(toast);\n },\n [toastCapture]\n );\n const dismissToast = useCallback((id: string) => toastCapture.dismissToast(id), [toastCapture]);\n return { recordToast, dismissToast };\n}\n","import type { ReactElement, ReactNode } from 'react';\n\nexport interface StateAnnotationRequiredElement {\n role?: string;\n text?: string;\n testID?: string;\n [key: string]: unknown;\n}\n\nexport interface StateProps {\n id: string;\n name?: string;\n description?: string;\n requiredElements?: StateAnnotationRequiredElement[];\n blocking?: boolean;\n children?: ReactNode;\n [key: string]: unknown;\n}\n\nexport function State(props: StateProps): ReactElement {\n return <>{props.children}</>;\n}\n\nexport interface TransitionToProps {\n id: string;\n name?: string;\n fromStates?: string[];\n activateStates?: string[];\n exitStates?: string[];\n effect?: string;\n description?: string;\n children?: ReactNode;\n [key: string]: unknown;\n}\n\nexport function TransitionTo(props: TransitionToProps): ReactElement {\n return <>{props.children}</>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/registry.ts","../../src/core/element-identifier.ts","../../src/control/action-executor.ts","../../src/design/design-inspector-native.ts","../../src/server/design-handlers.ts","../../src/server/handlers.ts","../../src/server/observability.ts","../../src/server/ws-types.ts","../../src/server/http-server.ts","../../src/server/ws-event-bridge.ts","../../src/transport/logger.ts","../../src/transport/DeviceAnnouncer.ts","../../src/transport/CloudRelayClient.ts","../../src/modal/modal-detector.ts","../../src/toast/toast-capture.ts","../../src/undo/undo-tracker.ts","../../src/react/UIBridgeNativeProvider.tsx","../../src/react/useUIElement.ts","../../src/react/useUIComponent.ts","../../src/react/useUIBridge.ts","../../src/react/useAutoRegister.ts","../../src/react/useUIBridgeModal.ts","../../src/react/useUIBridgeToast.ts","../../src/react/StateAnnotation.tsx"],"names":["error","success","summary","useRef","useState","useMemo","useCallback","useEffect","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Native Element and Component Registry\n *\n * Central registry for all UI elements and components registered with UI Bridge Native.\n * Adapted from ui-bridge for React Native environments.\n */\n\nimport type {\n RegisteredNativeElement,\n RegisteredNativeComponent,\n NativeElementState,\n NativeElementType,\n NativeStandardAction,\n NativeCustomAction,\n NativeAppInfo,\n NativeBridgeSnapshot,\n NativeElementIdentifier,\n NativeElementRef,\n NativeRegistrationCoverage,\n NativeRouteProviderLike,\n NativeSnapshotEnrichers,\n NativeSnapshotEnricher,\n Workflow,\n BridgeEvent,\n BridgeEventType,\n BridgeEventListener,\n} from './types';\n\n/**\n * Options for registering an element\n */\nexport interface RegisterElementOptions {\n type?: NativeElementType;\n label?: string;\n actions?: NativeStandardAction[];\n customActions?: Record<string, NativeCustomAction>;\n props?: Record<string, unknown>;\n treePath?: string;\n testId?: string;\n accessibilityLabel?: string;\n /** Route path where the element was registered (for page-scoped filtering) */\n registrationRoute?: string | null;\n /** Flattened RN style (from StyleSheet.flatten) for design review */\n flatStyle?: Record<string, unknown>;\n /** State-specific style overrides for design review */\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n };\n}\n\n/**\n * Options for registering a component\n */\nexport interface RegisterComponentOptions {\n name: string;\n description?: string;\n actions?: Array<{\n id: string;\n label?: string;\n description?: string;\n handler: (params?: unknown) => unknown | Promise<unknown>;\n }>;\n elementIds?: string[];\n}\n\n/**\n * Registry configuration\n */\nexport interface NativeRegistryConfig {\n verbose?: boolean;\n onEvent?: BridgeEventListener;\n}\n\n/**\n * Extract handler function names from an element's props.\n * Returns names of props whose values are functions (e.g. ['onPress', 'onChangeText']).\n */\nexport function extractHandlerNames(props?: Record<string, unknown>): string[] {\n if (!props) return [];\n return Object.keys(props).filter((k) => typeof props[k] === 'function');\n}\n\n/**\n * Infer available actions based on element type\n */\nfunction inferActions(type: NativeElementType): NativeStandardAction[] {\n const baseActions: NativeStandardAction[] = ['focus', 'blur'];\n\n switch (type) {\n case 'button':\n case 'touchable':\n case 'pressable':\n return [...baseActions, 'click', 'press', 'longPress', 'doubleTap'];\n case 'input':\n return [...baseActions, 'click', 'press', 'type', 'clear'];\n case 'text':\n return [...baseActions, 'click', 'press', 'longPress'];\n case 'view':\n return [...baseActions, 'click', 'press'];\n case 'scroll':\n return [...baseActions, 'scroll', 'swipe'];\n case 'list':\n return [...baseActions, 'scroll', 'swipe'];\n case 'listItem':\n return [...baseActions, 'click', 'press', 'longPress', 'swipe'];\n case 'switch':\n case 'checkbox':\n return [...baseActions, 'click', 'press', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'press'];\n case 'image':\n return [...baseActions, 'click', 'press', 'longPress'];\n case 'modal':\n return ['focus', 'blur'];\n case 'custom':\n default:\n return [...baseActions, 'click', 'press'];\n }\n}\n\n/**\n * Native UI Bridge Registry\n *\n * Manages registration and lookup of native UI elements and components.\n */\nexport class NativeUIBridgeRegistry {\n private elements = new Map<string, RegisteredNativeElement>();\n private components = new Map<string, RegisteredNativeComponent>();\n private workflows = new Map<string, Workflow>();\n private eventListeners = new Map<BridgeEventType, Set<BridgeEventListener>>();\n private config: NativeRegistryConfig;\n private enrichers: NativeSnapshotEnrichers = {};\n private snapshotExtras = new Map<string, NativeSnapshotEnricher>();\n /**\n * App identification metadata (appId/appName/appType/framework). Set via\n * `setAppInfo` — typically wired in the server constructor from the\n * `NativeUIBridgeConfig` the host passes to `UIBridgeNativeProvider`.\n *\n * When set, `createSnapshot` includes it on the resulting snapshot so\n * agents can identify the app from snapshot bytes alone (parity with the\n * `uiBridge` block on the `health` response). Snapshots created before\n * this is wired simply omit the field.\n */\n private appInfo: NativeAppInfo | null = null;\n /**\n * Optional route provider. When set, `createSnapshot` reads\n * `currentRoute`/`segments` from it whenever the caller does not pass an\n * explicit `routeInfo` argument. This lets the default `getSnapshot` HTTP\n * handler — which has no direct reference to the `NativeUIBridgeServer`\n * instance — still emit a populated `currentRoute` field.\n *\n * Wired by `NativeUIBridgeServer.setRouteProvider`, which forwards the\n * provider into the registry alongside the per-handler overrides it\n * already installs.\n */\n private routeProvider: NativeRouteProviderLike | null = null;\n /**\n * Sticky flag: flips `true` the first time any element is registered and\n * stays `true` even after elements are unregistered. Lets agents distinguish\n * \"this route never wired any elements\" from \"this route registered then\n * unmounted\".\n */\n private everHadRegistrations = false;\n\n constructor(config: NativeRegistryConfig = {}) {\n this.config = config;\n }\n\n // ============================================================================\n // App Info & Route Provider\n // ============================================================================\n\n /**\n * Set the app identification metadata returned alongside snapshots.\n * Idempotent — re-calling with the same shape is a no-op.\n * Pass `null` (or omit a previous call) to clear.\n */\n setAppInfo(info: NativeAppInfo | null | undefined): void {\n this.appInfo = info ?? null;\n }\n\n /** Read-only accessor for the registered app info, if any. */\n getAppInfo(): NativeAppInfo | null {\n return this.appInfo;\n }\n\n /**\n * Set a route provider whose `getCurrentRoute`/`getSegments` are read by\n * `createSnapshot` when no explicit `routeInfo` argument is supplied.\n *\n * Call with `null` to detach (e.g. when the host swaps providers on HMR).\n */\n setRouteProvider(provider: NativeRouteProviderLike | null | undefined): void {\n this.routeProvider = provider ?? null;\n }\n\n /** Read-only accessor for the registered route provider, if any. */\n getRouteProvider(): NativeRouteProviderLike | null {\n return this.routeProvider;\n }\n\n // ============================================================================\n // Snapshot Enricher Slots\n // ============================================================================\n\n /**\n * Register/replace canonical enrichers (modal/toast/undo). HMR-safe — calling\n * with a partial set merges into existing slots instead of clobbering them.\n */\n setEnrichers(e: Partial<NativeSnapshotEnrichers>): void {\n this.enrichers = { ...this.enrichers, ...e };\n }\n\n /**\n * Read-only accessor for the canonical enrichers slot. Returned object is\n * the live reference, so callers can detect \"no detector wired\" via\n * `getEnrichers().modalDetector === undefined`. Used by the test-hook HTTP\n * handlers (`control/modal/push`, `control/modal/dismiss/:id`) which need\n * to drive the ModalDetector directly without re-instantiating it.\n */\n getEnrichers(): Readonly<NativeSnapshotEnrichers> {\n return this.enrichers;\n }\n\n /**\n * Register a custom snapshot enricher. The returned object will be\n * `Object.assign`ed onto the snapshot, so use unique top-level keys to avoid\n * clobbering canonical fields. Returns a disposer.\n */\n registerSnapshotEnricher(name: string, fn: NativeSnapshotEnricher): () => void {\n this.snapshotExtras.set(name, fn);\n return () => this.unregisterSnapshotEnricher(name);\n }\n\n /** Remove a custom snapshot enricher by name */\n unregisterSnapshotEnricher(name: string): void {\n this.snapshotExtras.delete(name);\n }\n\n // ============================================================================\n // Element Management\n // ============================================================================\n\n /**\n * Register a native element\n */\n registerElement(\n id: string,\n ref: React.RefObject<NativeElementRef>,\n options: RegisterElementOptions = {}\n ): RegisteredNativeElement {\n const {\n type = 'custom',\n label,\n actions = inferActions(type),\n customActions,\n props,\n treePath = id,\n testId,\n accessibilityLabel,\n registrationRoute,\n flatStyle,\n stateStyles,\n } = options;\n\n // Create state getter\n const getState = (): NativeElementState => {\n const element = ref.current;\n if (!element) {\n return {\n mounted: false,\n visible: false,\n enabled: false,\n focused: false,\n layout: null,\n };\n }\n\n // State is populated by the element during onLayout\n // Here we return the stored state from the element's metadata\n const stored = this.elements.get(id);\n if (stored && stored.getState !== getState) {\n return stored.getState();\n }\n\n return {\n mounted: true,\n visible: true,\n enabled: true,\n focused: false,\n layout: null,\n };\n };\n\n // Create identifier getter\n const getIdentifier = (): NativeElementIdentifier => ({\n uiId: id,\n testId: testId || id,\n accessibilityLabel,\n treePath,\n });\n\n const registered: RegisteredNativeElement = {\n id,\n ref,\n type,\n label,\n actions,\n customActions,\n props,\n getState,\n getIdentifier,\n registeredAt: Date.now(),\n mounted: true,\n registrationRoute: registrationRoute ?? null,\n flatStyle,\n stateStyles,\n };\n\n this.elements.set(id, registered);\n this.everHadRegistrations = true;\n\n this.emit('element:registered', { id, type, label });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered element: ${id} (${type})`);\n }\n\n // Seed a sensible initial state so elements are immediately visible in snapshots\n // even before onLayout fires. Layout-measuring code can overwrite this later.\n this.updateElementState(id, {\n mounted: true,\n visible: true,\n enabled: true,\n focused: false,\n layout: null,\n });\n\n return registered;\n }\n\n /**\n * Unregister an element\n */\n unregisterElement(id: string): void {\n const element = this.elements.get(id);\n if (element) {\n this.elements.delete(id);\n this.emit('element:unregistered', { id });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Unregistered element: ${id}`);\n }\n }\n }\n\n /**\n * Get a registered element\n */\n getElement(id: string): RegisteredNativeElement | undefined {\n return this.elements.get(id);\n }\n\n /**\n * Get all registered elements\n */\n getAllElements(): RegisteredNativeElement[] {\n return Array.from(this.elements.values());\n }\n\n /**\n * Get all registered elements that are visible and have a layout\n */\n getVisibleElements(): RegisteredNativeElement[] {\n return this.getAllElements().filter((e) => {\n const state = e.getState();\n return state.visible && state.layout !== null;\n });\n }\n\n /**\n * Get elements registered on a specific route (for page-scoped filtering)\n */\n getElementsForRoute(route: string): RegisteredNativeElement[] {\n return this.getAllElements().filter((e) => e.registrationRoute === route);\n }\n\n /**\n * Mark elements registered on a route as off-screen (visible: false, layout: null).\n *\n * Use this when a screen loses focus but stays mounted — common in React Navigation\n * tab navigators where inactive tabs remain in the tree. Without this call, stale\n * `layout` data lingers in snapshots and makes off-screen elements look rendered.\n *\n * Does NOT unregister the elements — they stay registered so the user's next visit\n * re-measures them via `onLayout` without re-mount cost. Elements without a\n * `registrationRoute` (app-wide registrations) are untouched.\n */\n markRouteOffscreen(route: string): void {\n // Guard against accidental global wipes. Elements registered without a\n // route have `registrationRoute: null` — passing null/empty here would\n // match every globally-registered element and erase their layouts.\n if (route == null || route === '') {\n if (this.config.verbose) {\n console.warn(\n `[ui-bridge-native] markRouteOffscreen called with null/empty route — ignoring`\n );\n }\n return;\n }\n let cleared = 0;\n for (const element of this.elements.values()) {\n if (element.registrationRoute === route) {\n this.updateElementState(element.id, {\n visible: false,\n layout: null,\n });\n cleared++;\n }\n }\n if (this.config.verbose && cleared > 0) {\n console.log(`[ui-bridge-native] Marked ${cleared} elements offscreen for route: ${route}`);\n }\n }\n\n /**\n * Update element state\n */\n updateElementState(id: string, state: Partial<NativeElementState>): void {\n const element = this.elements.get(id);\n if (element) {\n // Create a new getState that includes the updated state\n const currentState = element.getState();\n const newState = { ...currentState, ...state };\n\n const updated: RegisteredNativeElement = {\n ...element,\n getState: () => newState,\n };\n\n this.elements.set(id, updated);\n this.emit('element:stateChanged', { id, state: newState });\n }\n }\n\n /**\n * Update element props (for action execution)\n */\n updateElementProps(id: string, props: Record<string, unknown>): void {\n const element = this.elements.get(id);\n if (element) {\n const updated: RegisteredNativeElement = {\n ...element,\n props: { ...element.props, ...props },\n };\n this.elements.set(id, updated);\n }\n }\n\n /**\n * Update element style for design review\n */\n updateElementStyle(\n id: string,\n flatStyle: Record<string, unknown>,\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n }\n ): void {\n const element = this.elements.get(id);\n if (element) {\n const updated: RegisteredNativeElement = {\n ...element,\n flatStyle,\n ...(stateStyles !== undefined ? { stateStyles } : {}),\n };\n this.elements.set(id, updated);\n }\n }\n\n /**\n * Get element style for design review\n */\n getElementStyle(id: string): Record<string, unknown> | null {\n const element = this.elements.get(id);\n return element?.flatStyle ?? null;\n }\n\n /**\n * Find element by testID\n */\n findByTestId(testId: string): RegisteredNativeElement | undefined {\n for (const element of this.elements.values()) {\n const identifier = element.getIdentifier();\n if (identifier.testId === testId) {\n return element;\n }\n }\n return undefined;\n }\n\n /**\n * Find elements by type\n */\n findByType(type: NativeElementType): RegisteredNativeElement[] {\n return Array.from(this.elements.values()).filter((e) => e.type === type);\n }\n\n // ============================================================================\n // Component Management\n // ============================================================================\n\n /**\n * Register a component\n */\n registerComponent(id: string, options: RegisterComponentOptions): RegisteredNativeComponent {\n const { name, description, actions = [], elementIds } = options;\n\n const registered: RegisteredNativeComponent = {\n id,\n name,\n description,\n actions: actions.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })),\n elementIds,\n registeredAt: Date.now(),\n mounted: true,\n };\n\n this.components.set(id, registered);\n\n this.emit('component:registered', { id, name });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered component: ${id} (${name})`);\n }\n\n return registered;\n }\n\n /**\n * Unregister a component\n */\n unregisterComponent(id: string): void {\n const component = this.components.get(id);\n if (component) {\n this.components.delete(id);\n this.emit('component:unregistered', { id });\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Unregistered component: ${id}`);\n }\n }\n }\n\n /**\n * Get a registered component\n */\n getComponent(id: string): RegisteredNativeComponent | undefined {\n return this.components.get(id);\n }\n\n /**\n * Get all registered components\n */\n getAllComponents(): RegisteredNativeComponent[] {\n return Array.from(this.components.values());\n }\n\n // ============================================================================\n // Workflow Management\n // ============================================================================\n\n /**\n * Register a workflow\n */\n registerWorkflow(workflow: Workflow): void {\n this.workflows.set(workflow.id, workflow);\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registered workflow: ${workflow.id}`);\n }\n }\n\n /**\n * Unregister a workflow\n */\n unregisterWorkflow(id: string): void {\n this.workflows.delete(id);\n }\n\n /**\n * Get a workflow\n */\n getWorkflow(id: string): Workflow | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Get all workflows\n */\n getAllWorkflows(): Workflow[] {\n return Array.from(this.workflows.values());\n }\n\n // ============================================================================\n // Event System\n // ============================================================================\n\n /**\n * Subscribe to events\n */\n on<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): () => void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, new Set());\n }\n this.eventListeners.get(type)!.add(listener as BridgeEventListener);\n\n // Return unsubscribe function\n return () => this.off(type, listener);\n }\n\n /**\n * Unsubscribe from events\n */\n off<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): void {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n }\n\n /**\n * Emit an event\n */\n emit(type: BridgeEventType, data: unknown): void {\n const event: BridgeEvent = {\n type,\n timestamp: Date.now(),\n data,\n };\n\n // Notify listeners\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error(`[ui-bridge-native] Event listener error:`, error);\n }\n }\n }\n\n // Notify global handler\n if (this.config.onEvent) {\n try {\n this.config.onEvent(event);\n } catch (error) {\n console.error(`[ui-bridge-native] Global event handler error:`, error);\n }\n }\n }\n\n // ============================================================================\n // Snapshots\n // ============================================================================\n\n /**\n * Create a snapshot of the current state.\n *\n * Route resolution: `routeInfo` wins when provided. Otherwise — and this\n * is the path the default `getSnapshot` HTTP handler takes — we fall back\n * to the registered `routeProvider`. This means callers that never wire a\n * server-level override (the bare-server / cloud-relay path) still get a\n * populated `currentRoute` field as long as `setRouteProvider` was called\n * on the registry.\n */\n createSnapshot(\n routeInfo?: {\n currentRoute?: string | null;\n segments?: string[];\n },\n options?: { visibleOnly?: boolean; currentRouteOnly?: boolean }\n ): NativeBridgeSnapshot {\n // Resolve route info: prefer the explicit argument, fall back to a\n // registered route provider. We treat an explicitly-passed `routeInfo`\n // (even if both fields are null/undefined) as \"the caller is in charge\"\n // so server-layer overrides that pass `{currentRoute: null}` keep working.\n const resolvedRoute: { currentRoute: string | null; segments: string[] | undefined } = (() => {\n if (routeInfo !== undefined) {\n return {\n currentRoute: routeInfo.currentRoute ?? null,\n segments: routeInfo.segments,\n };\n }\n if (this.routeProvider) {\n try {\n return {\n currentRoute: this.routeProvider.getCurrentRoute() ?? null,\n segments: this.routeProvider.getSegments?.(),\n };\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] routeProvider getCurrentRoute threw:`, error);\n }\n return { currentRoute: null, segments: undefined };\n }\n }\n return { currentRoute: null, segments: undefined };\n })();\n\n let elements = options?.visibleOnly ? this.getVisibleElements() : this.getAllElements();\n\n // Filter to only elements registered on the current route\n if (options?.currentRouteOnly && resolvedRoute.currentRoute) {\n const currentRoute = resolvedRoute.currentRoute;\n elements = elements.filter((e) => e.registrationRoute === currentRoute);\n }\n\n const snapshot: NativeBridgeSnapshot = {\n timestamp: Date.now(),\n elements: elements.map((e) => {\n const handlers = extractHandlerNames(e.props);\n return {\n id: e.id,\n type: e.type,\n label: e.label,\n identifier: e.getIdentifier(),\n state: e.getState(),\n actions: e.actions,\n customActions: e.customActions ? Object.keys(e.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: e.registrationRoute,\n };\n }),\n components: this.getAllComponents().map((c) => ({\n id: c.id,\n name: c.name,\n description: c.description,\n actions: c.actions.map((a) => a.id),\n elementIds: c.elementIds,\n })),\n workflows: this.getAllWorkflows().map((w) => ({\n id: w.id,\n name: w.name,\n description: w.description,\n stepCount: w.steps.length,\n })),\n currentRoute: resolvedRoute.currentRoute,\n segments: resolvedRoute.segments,\n registration: this.getRegistrationCoverage(),\n };\n\n // Include app identification metadata so consumers can identify which\n // app produced this snapshot without a separate health probe.\n if (this.appInfo) {\n snapshot.appInfo = this.appInfo;\n }\n\n // Canonical enrichers — each in its own try/catch so a misbehaving tracker\n // can never break the rest of the snapshot.\n if (this.enrichers.modalDetector) {\n try {\n snapshot.modalStack = this.enrichers.modalDetector.getSnapshotModalContext();\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] modalDetector enricher threw:`, error);\n }\n }\n }\n if (this.enrichers.toastCapture) {\n try {\n snapshot.toasts = this.enrichers.toastCapture.getSnapshotToastContext();\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] toastCapture enricher threw:`, error);\n }\n }\n }\n if (this.enrichers.undoTracker) {\n try {\n snapshot.undoRedo = this.enrichers.undoTracker.getSnapshotUndoContext();\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] undoTracker enricher threw:`, error);\n }\n }\n }\n\n // Custom enrichers — keys assign-merged onto the snapshot\n if (this.snapshotExtras.size > 0) {\n const ctx = { elements, currentRoute: resolvedRoute.currentRoute };\n for (const [name, fn] of this.snapshotExtras) {\n try {\n const extra = fn(ctx);\n if (extra && typeof extra === 'object') {\n Object.assign(snapshot, extra);\n }\n } catch (error) {\n if (this.config.verbose) {\n console.warn(`[ui-bridge-native] snapshot enricher \"${name}\" threw:`, error);\n }\n }\n }\n }\n\n return snapshot;\n }\n\n /**\n * Get registry statistics\n */\n getStats(): { elements: number; components: number; workflows: number } {\n return {\n elements: this.elements.size,\n components: this.components.size,\n workflows: this.workflows.size,\n };\n }\n\n /**\n * Compute registration coverage metadata for the current registry state.\n *\n * Groups currently-registered elements by `registrationRoute`, bucketing\n * elements without a route under `'?'`. `everHadRegistrations` is sticky —\n * once true, it stays true for the lifetime of the registry instance.\n */\n getRegistrationCoverage(): NativeRegistrationCoverage {\n const byRoute: Record<string, number> = {};\n for (const element of this.elements.values()) {\n const key =\n element.registrationRoute == null || element.registrationRoute === ''\n ? '?'\n : element.registrationRoute;\n byRoute[key] = (byRoute[key] ?? 0) + 1;\n }\n return {\n totalRegistered: this.elements.size,\n everHadRegistrations: this.everHadRegistrations,\n byRoute,\n };\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.elements.clear();\n this.components.clear();\n this.workflows.clear();\n\n if (this.config.verbose) {\n console.log(`[ui-bridge-native] Registry cleared`);\n }\n }\n}\n\n// ============================================================================\n// Global Registry\n// ============================================================================\n\nlet globalRegistry: NativeUIBridgeRegistry | null = null;\n\n/**\n * Set the global registry\n */\nexport function setGlobalRegistry(registry: NativeUIBridgeRegistry): void {\n globalRegistry = registry;\n}\n\n/**\n * Get the global registry\n */\nexport function getGlobalRegistry(): NativeUIBridgeRegistry | null {\n return globalRegistry;\n}\n\n/**\n * Reset the global registry\n */\nexport function resetGlobalRegistry(): void {\n globalRegistry?.clear();\n globalRegistry = null;\n}\n","/**\n * Native Element Identifier\n *\n * Utilities for identifying and finding native elements.\n * In React Native, we use testID, accessibilityLabel, and tree paths\n * instead of XPath/CSS selectors.\n */\n\nimport type { NativeElementIdentifier, RegisteredNativeElement } from './types';\nimport { getGlobalRegistry } from './registry';\n\n/**\n * Create an element identifier for a native element\n */\nexport function createNativeElementIdentifier(\n id: string,\n options: {\n testId?: string;\n accessibilityLabel?: string;\n accessibilityHint?: string;\n treePath?: string;\n } = {}\n): NativeElementIdentifier {\n return {\n uiId: id,\n testId: options.testId || id,\n accessibilityLabel: options.accessibilityLabel,\n accessibilityHint: options.accessibilityHint,\n treePath: options.treePath || id,\n };\n}\n\n/**\n * Find an element by its identifier in the global registry\n */\nexport function findElementByIdentifier(\n identifier: string | NativeElementIdentifier\n): RegisteredNativeElement | null {\n const registry = getGlobalRegistry();\n if (!registry) return null;\n\n // If string, try different lookup strategies\n if (typeof identifier === 'string') {\n // Try direct ID lookup\n const byId = registry.getElement(identifier);\n if (byId) return byId;\n\n // Try testID lookup\n const byTestId = registry.findByTestId(identifier);\n if (byTestId) return byTestId;\n\n // Try pattern matching\n return findByPattern(registry, identifier);\n }\n\n // If identifier object, try each strategy\n if (identifier.uiId) {\n const byId = registry.getElement(identifier.uiId);\n if (byId) return byId;\n }\n\n if (identifier.testId) {\n const byTestId = registry.findByTestId(identifier.testId);\n if (byTestId) return byTestId;\n }\n\n return null;\n}\n\n/**\n * Find element by pattern (supports wildcards)\n */\nfunction findByPattern(\n registry: ReturnType<typeof getGlobalRegistry>,\n pattern: string\n): RegisteredNativeElement | null {\n if (!registry) return null;\n\n // Convert pattern to regex\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special chars\n .replace(/\\*/g, '.*') // Convert * to .*\n .replace(/\\?/g, '.'); // Convert ? to .\n\n const regex = new RegExp(`^${regexPattern}$`, 'i');\n\n for (const element of registry.getAllElements()) {\n const identifier = element.getIdentifier();\n\n // Match against testId\n if (identifier.testId && regex.test(identifier.testId)) {\n return element;\n }\n\n // Match against uiId\n if (identifier.uiId && regex.test(identifier.uiId)) {\n return element;\n }\n\n // Match against treePath\n if (identifier.treePath && regex.test(identifier.treePath)) {\n return element;\n }\n\n // Match against accessibilityLabel\n if (identifier.accessibilityLabel && regex.test(identifier.accessibilityLabel)) {\n return element;\n }\n }\n\n return null;\n}\n\n/**\n * Find all elements matching a pattern\n */\nexport function findAllByPattern(pattern: string): RegisteredNativeElement[] {\n const registry = getGlobalRegistry();\n if (!registry) return [];\n\n // Convert pattern to regex\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n\n const regex = new RegExp(`^${regexPattern}$`, 'i');\n const results: RegisteredNativeElement[] = [];\n\n for (const element of registry.getAllElements()) {\n const identifier = element.getIdentifier();\n\n if (\n (identifier.testId && regex.test(identifier.testId)) ||\n (identifier.uiId && regex.test(identifier.uiId)) ||\n (identifier.treePath && regex.test(identifier.treePath)) ||\n (identifier.accessibilityLabel && regex.test(identifier.accessibilityLabel))\n ) {\n results.push(element);\n }\n }\n\n return results;\n}\n\n/**\n * Build a tree path for an element based on its position in the component tree\n */\nexport function buildTreePath(componentPath: string[], elementIndex?: number): string {\n let path = componentPath.join('/');\n if (elementIndex !== undefined) {\n path += `[${elementIndex}]`;\n }\n return path;\n}\n\n/**\n * Parse a tree path into its components\n */\nexport function parseTreePath(treePath: string): { components: string[]; index?: number } {\n const indexMatch = treePath.match(/\\[(\\d+)\\]$/);\n const index = indexMatch ? parseInt(indexMatch[1], 10) : undefined;\n const pathWithoutIndex = treePath.replace(/\\[\\d+\\]$/, '');\n const components = pathWithoutIndex.split('/').filter(Boolean);\n\n return { components, index };\n}\n\n/**\n * Check if an identifier matches criteria\n */\nexport function matchesIdentifier(\n identifier: NativeElementIdentifier,\n criteria: Partial<NativeElementIdentifier>\n): boolean {\n if (criteria.uiId && identifier.uiId !== criteria.uiId) {\n return false;\n }\n if (criteria.testId && identifier.testId !== criteria.testId) {\n return false;\n }\n if (\n criteria.accessibilityLabel &&\n identifier.accessibilityLabel !== criteria.accessibilityLabel\n ) {\n return false;\n }\n if (criteria.treePath && identifier.treePath !== criteria.treePath) {\n return false;\n }\n return true;\n}\n","/**\n * Native Action Executor\n *\n * Executes actions on registered native elements and components.\n * In React Native, we execute actions by calling prop handlers directly\n * (onPress, onChangeText, etc.) rather than simulating DOM events.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type {\n NativeStandardAction,\n NativeFindRequest,\n NativeFindResponse,\n DiscoveredNativeElement,\n WaitOptions,\n} from '../core/types';\nimport { findElementByIdentifier } from '../core/element-identifier';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n WaitResult,\n NativeActionExecutor,\n NativeActionEvent,\n NativeActionListener,\n TypeActionParams,\n ScrollActionParams,\n SwipeActionParams,\n PressActionParams,\n} from './types';\n\n/**\n * Default wait options\n */\nconst DEFAULT_WAIT_OPTIONS: Required<WaitOptions> = {\n visible: true,\n enabled: true,\n focused: false,\n state: {},\n timeout: 10000,\n interval: 100,\n};\n\n/**\n * Sleep for a duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Default native action executor implementation\n */\nexport class DefaultNativeActionExecutor implements NativeActionExecutor {\n private actionListeners = new Set<NativeActionListener>();\n\n constructor(private registry: NativeUIBridgeRegistry) {}\n\n onActionExecuted(listener: NativeActionListener): () => void {\n this.actionListeners.add(listener);\n return () => {\n this.actionListeners.delete(listener);\n };\n }\n\n /** Notify listeners out-of-band; isolate each invocation so one bad listener can't poison the rest. */\n private emitActionEvent(event: NativeActionEvent): void {\n for (const listener of this.actionListeners) {\n try {\n listener(event);\n } catch (error) {\n console.warn(`[ui-bridge-native] Action listener error:`, error);\n }\n }\n }\n\n /**\n * Execute an action on an element\n */\n async executeAction(\n elementId: string,\n request: ControlActionRequest\n ): Promise<ControlActionResponse> {\n const startTime = Date.now();\n let waitDurationMs = 0;\n\n try {\n // Find the element\n let registered = this.registry.getElement(elementId);\n\n // If not in registry, try by identifier\n if (!registered) {\n registered = findElementByIdentifier(elementId) ?? undefined;\n }\n\n if (!registered) {\n const failTime = Date.now();\n const errorMsg = `Element not found: ${elementId}`;\n this.emitActionEvent({\n elementId,\n action: request.action,\n params: request.params,\n success: false,\n error: errorMsg,\n timestamp: failTime,\n requestId: request.requestId,\n durationMs: failTime - startTime,\n });\n return {\n success: false,\n error: errorMsg,\n durationMs: failTime - startTime,\n timestamp: failTime,\n requestId: request.requestId,\n };\n }\n\n // Wait for conditions if specified\n if (request.waitOptions) {\n const waitResult = await this.waitForElementInternal(registered.id, request.waitOptions);\n waitDurationMs = waitResult.waitedMs;\n if (!waitResult.met) {\n const failTime = Date.now();\n const errorMsg = waitResult.error || 'Wait condition not met';\n this.emitActionEvent({\n elementId,\n action: request.action,\n params: request.params,\n success: false,\n error: errorMsg,\n timestamp: failTime,\n requestId: request.requestId,\n durationMs: failTime - startTime,\n });\n return {\n success: false,\n error: errorMsg,\n durationMs: failTime - startTime,\n timestamp: failTime,\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n // Execute the action\n const result = await this.performAction(registered, request.action, request.params);\n\n const successTime = Date.now();\n this.emitActionEvent({\n elementId,\n action: request.action,\n params: request.params,\n success: true,\n timestamp: successTime,\n requestId: request.requestId,\n durationMs: successTime - startTime,\n });\n return {\n success: true,\n elementState: registered.getState(),\n result,\n durationMs: successTime - startTime,\n timestamp: successTime,\n requestId: request.requestId,\n waitDurationMs,\n };\n } catch (error) {\n const failTime = Date.now();\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.emitActionEvent({\n elementId,\n action: request.action,\n params: request.params,\n success: false,\n error: errorMsg,\n timestamp: failTime,\n requestId: request.requestId,\n durationMs: failTime - startTime,\n });\n return {\n success: false,\n error: errorMsg,\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: failTime - startTime,\n timestamp: failTime,\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n /**\n * Perform an action on an element\n */\n private async performAction(\n element: ReturnType<NativeUIBridgeRegistry['getElement']>,\n action: NativeStandardAction | string,\n params?: Record<string, unknown>\n ): Promise<unknown> {\n if (!element) {\n throw new Error('Element not found');\n }\n\n const props = element.props || {};\n\n // Check for custom action first\n if (element.customActions && action in element.customActions) {\n return element.customActions[action].handler(params);\n }\n\n // Execute standard actions\n switch (action) {\n case 'click': // Web UI Bridge compatibility alias\n case 'press':\n return this.performPress(props, params as PressActionParams | undefined);\n\n case 'longPress':\n return this.performLongPress(props, params as PressActionParams | undefined);\n\n case 'doubleTap':\n return this.performDoubleTap(props);\n\n case 'type':\n return this.performType(element, props, params as unknown as TypeActionParams);\n\n case 'clear':\n return this.performClear(element, props);\n\n case 'focus':\n return this.performFocus(element);\n\n case 'blur':\n return this.performBlur(element);\n\n case 'scroll':\n return this.performScroll(props, params as ScrollActionParams | undefined);\n\n case 'swipe':\n return this.performSwipe(props, params as unknown as SwipeActionParams);\n\n case 'toggle':\n return this.performToggle(props);\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n }\n\n /**\n * Perform press action\n */\n private async performPress(\n props: Record<string, unknown>,\n params?: PressActionParams\n ): Promise<void> {\n // Try different press handlers in order of preference\n const handlers = ['onPress', 'onPressIn', 'onResponderRelease'];\n\n for (const handler of handlers) {\n if (typeof props[handler] === 'function') {\n // Create a synthetic event object\n const event = this.createPressEvent(params);\n (props[handler] as (event: unknown) => void)(event);\n return;\n }\n }\n\n throw new Error('No press handler found on element');\n }\n\n /**\n * Perform long press action\n */\n private async performLongPress(\n props: Record<string, unknown>,\n params?: PressActionParams\n ): Promise<void> {\n if (typeof props.onLongPress === 'function') {\n const event = this.createPressEvent(params);\n (props.onLongPress as (event: unknown) => void)(event);\n return;\n }\n\n throw new Error('No long press handler found on element');\n }\n\n /**\n * Perform double tap action\n */\n private async performDoubleTap(props: Record<string, unknown>): Promise<void> {\n // First try dedicated double tap handler\n if (typeof props.onDoubleTap === 'function') {\n (props.onDoubleTap as () => void)();\n return;\n }\n\n // Fall back to calling press twice\n if (typeof props.onPress === 'function') {\n const event = this.createPressEvent();\n (props.onPress as (event: unknown) => void)(event);\n await sleep(50);\n (props.onPress as (event: unknown) => void)(event);\n return;\n }\n\n throw new Error('No press handler found for double tap');\n }\n\n /**\n * Perform type action\n */\n private async performType(\n element: ReturnType<NativeUIBridgeRegistry['getElement']>,\n props: Record<string, unknown>,\n params: TypeActionParams\n ): Promise<void> {\n if (!params?.text) {\n throw new Error('Type action requires text parameter');\n }\n\n // Clear first if requested. Accept either `clearFirst` (native SDK\n // convention) or `clear` (runner UI Bridge convention) — so agents\n // using the same action across platforms don't hit a naming mismatch.\n if (params.clearFirst || params.clear) {\n await this.performClear(element, props);\n }\n\n // Type character by character if delay specified\n if (params.delay && params.delay > 0) {\n const currentValue = (element?.getState().value || '') as string;\n for (const char of params.text) {\n const newValue = currentValue + char;\n if (typeof props.onChangeText === 'function') {\n (props.onChangeText as (text: string) => void)(newValue);\n }\n await sleep(params.delay);\n }\n } else {\n // Type all at once\n if (typeof props.onChangeText === 'function') {\n (props.onChangeText as (text: string) => void)(params.text);\n } else if (typeof props.onChange === 'function') {\n (props.onChange as (event: { nativeEvent: { text: string } }) => void)({\n nativeEvent: { text: params.text },\n });\n } else {\n throw new Error('No text change handler found on element');\n }\n }\n\n // Update element state\n if (element) {\n this.registry.updateElementState(element.id, { value: params.text });\n }\n }\n\n /**\n * Perform clear action\n */\n private async performClear(\n element: ReturnType<NativeUIBridgeRegistry['getElement']>,\n props: Record<string, unknown>\n ): Promise<void> {\n if (typeof props.onChangeText === 'function') {\n (props.onChangeText as (text: string) => void)('');\n } else if (typeof props.onChange === 'function') {\n (props.onChange as (event: { nativeEvent: { text: string } }) => void)({\n nativeEvent: { text: '' },\n });\n }\n\n // Update element state\n if (element) {\n this.registry.updateElementState(element.id, { value: '' });\n }\n }\n\n /**\n * Perform focus action\n */\n private async performFocus(\n element: ReturnType<NativeUIBridgeRegistry['getElement']>\n ): Promise<void> {\n if (element?.ref.current && 'focus' in element.ref.current) {\n (element.ref.current as { focus: () => void }).focus();\n }\n\n // Update element state\n if (element) {\n this.registry.updateElementState(element.id, { focused: true });\n }\n }\n\n /**\n * Perform blur action\n */\n private async performBlur(\n element: ReturnType<NativeUIBridgeRegistry['getElement']>\n ): Promise<void> {\n if (element?.ref.current && 'blur' in element.ref.current) {\n (element.ref.current as { blur: () => void }).blur();\n }\n\n // Update element state\n if (element) {\n this.registry.updateElementState(element.id, { focused: false });\n }\n }\n\n /**\n * Perform scroll action\n */\n private async performScroll(\n props: Record<string, unknown>,\n params?: ScrollActionParams\n ): Promise<void> {\n if (typeof props.onScroll === 'function') {\n const event = {\n nativeEvent: {\n contentOffset: params?.offset || { x: 0, y: 0 },\n },\n };\n (props.onScroll as (event: unknown) => void)(event);\n }\n }\n\n /**\n * Perform swipe action\n */\n private async performSwipe(\n props: Record<string, unknown>,\n params: SwipeActionParams\n ): Promise<void> {\n if (!params?.direction) {\n throw new Error('Swipe action requires direction parameter');\n }\n\n // Try dedicated swipe handlers\n const handlerMap: Record<string, string> = {\n left: 'onSwipeLeft',\n right: 'onSwipeRight',\n up: 'onSwipeUp',\n down: 'onSwipeDown',\n };\n\n const handler = handlerMap[params.direction];\n if (handler && typeof props[handler] === 'function') {\n (props[handler] as () => void)();\n return;\n }\n\n // Fall back to generic swipe handler\n if (typeof props.onSwipe === 'function') {\n (props.onSwipe as (direction: string) => void)(params.direction);\n }\n }\n\n /**\n * Perform toggle action\n */\n private async performToggle(props: Record<string, unknown>): Promise<void> {\n // For Switch components\n if (typeof props.onValueChange === 'function') {\n const currentValue = props.value as boolean;\n (props.onValueChange as (value: boolean) => void)(!currentValue);\n return;\n }\n\n // Fall back to press\n if (typeof props.onPress === 'function') {\n (props.onPress as () => void)();\n return;\n }\n\n throw new Error('No toggle handler found on element');\n }\n\n /**\n * Create a synthetic press event\n */\n private createPressEvent(params?: PressActionParams): object {\n return {\n nativeEvent: {\n locationX: params?.position?.x ?? 0,\n locationY: params?.position?.y ?? 0,\n timestamp: Date.now(),\n },\n persist: () => {},\n };\n }\n\n /**\n * Execute a component action\n */\n async executeComponentAction(\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> {\n const startTime = Date.now();\n\n try {\n const component = this.registry.getComponent(componentId);\n\n if (!component) {\n return {\n success: false,\n error: `Component not found: ${componentId}`,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n // Find the action\n const action = component.actions.find((a) => a.id === request.action);\n\n if (!action) {\n return {\n success: false,\n error: `Action not found: ${request.action}`,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n // Execute the action\n const result = await action.handler(request.params);\n\n return {\n success: true,\n result,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n }\n\n /**\n * Find elements\n */\n async find(request: NativeFindRequest): Promise<NativeFindResponse> {\n const startTime = Date.now();\n\n const allElements = this.registry.getAllElements();\n let filtered = allElements;\n\n // Filter by type\n if (request.types && request.types.length > 0) {\n filtered = filtered.filter((e) => request.types!.includes(e.type));\n }\n\n // Filter by testID pattern\n if (request.testIdPattern) {\n const regex = new RegExp(request.testIdPattern.replace(/\\*/g, '.*').replace(/\\?/g, '.'));\n filtered = filtered.filter((e) => {\n const identifier = e.getIdentifier();\n return identifier.testId && regex.test(identifier.testId);\n });\n }\n\n // Filter by accessibility label pattern\n if (request.accessibilityLabelPattern) {\n const regex = new RegExp(\n request.accessibilityLabelPattern.replace(/\\*/g, '.*').replace(/\\?/g, '.')\n );\n filtered = filtered.filter((e) => {\n const identifier = e.getIdentifier();\n return identifier.accessibilityLabel && regex.test(identifier.accessibilityLabel);\n });\n }\n\n // Filter by visibility\n if (request.visibleOnly) {\n filtered = filtered.filter((e) => e.getState().visible);\n }\n\n // Apply limit\n if (request.limit && request.limit > 0) {\n filtered = filtered.slice(0, request.limit);\n }\n\n // Map to discovered elements\n const elements: DiscoveredNativeElement[] = filtered.map((e) => ({\n id: e.id,\n type: e.type,\n identifier: e.getIdentifier(),\n state: e.getState(),\n actions: e.actions,\n label: e.label,\n }));\n\n return {\n elements,\n total: elements.length,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Wait for element conditions\n */\n async waitForElement(elementId: string, options: WaitOptions): Promise<WaitResult> {\n return this.waitForElementInternal(elementId, options);\n }\n\n /**\n * Internal wait implementation\n */\n private async waitForElementInternal(\n elementId: string,\n options: WaitOptions\n ): Promise<WaitResult> {\n const opts = { ...DEFAULT_WAIT_OPTIONS, ...options };\n const startTime = Date.now();\n\n while (Date.now() - startTime < opts.timeout) {\n const element = this.registry.getElement(elementId);\n\n if (!element) {\n await sleep(opts.interval);\n continue;\n }\n\n const state = element.getState();\n\n // Check conditions\n let conditionsMet = true;\n\n if (opts.visible && !state.visible) {\n conditionsMet = false;\n }\n\n if (opts.enabled && !state.enabled) {\n conditionsMet = false;\n }\n\n if (opts.focused && !state.focused) {\n conditionsMet = false;\n }\n\n // Check custom state conditions\n if (opts.state && Object.keys(opts.state).length > 0) {\n const stateRecord = state as unknown as Record<string, unknown>;\n for (const [key, value] of Object.entries(opts.state)) {\n if (stateRecord[key] !== value) {\n conditionsMet = false;\n break;\n }\n }\n }\n\n if (conditionsMet) {\n return {\n met: true,\n waitedMs: Date.now() - startTime,\n state,\n };\n }\n\n await sleep(opts.interval);\n }\n\n return {\n met: false,\n waitedMs: Date.now() - startTime,\n error: `Timeout waiting for conditions on element: ${elementId}`,\n };\n }\n}\n\n/**\n * Create a native action executor\n */\nexport function createNativeActionExecutor(registry: NativeUIBridgeRegistry): NativeActionExecutor {\n return new DefaultNativeActionExecutor(registry);\n}\n","/**\n * Native Design Inspector\n *\n * Pure TypeScript functions that map flattened React Native styles to the\n * web SDK's ExtendedComputedStyles format. No react-native imports — works\n * with already-flattened style objects from the registry.\n *\n * Key differences from web:\n * - No `window.getComputedStyle()` — styles are declarative objects\n * - No hover/active states — uses pressed/focused/disabled\n * - No pseudo-elements (::before/::after)\n * - No CSS grid, cursor, visibility, transitions, background-image\n * - RN default flexDirection is 'column' (not 'row')\n * - Shadows differ: iOS uses shadow* props, Android uses elevation\n * - Numeric values → \"Npx\" strings\n */\n\nimport type {\n ExtendedComputedStyles,\n ElementDesignData,\n StateStyles,\n StyleDiff,\n ResponsiveSnapshot,\n NativeInteractionStateName,\n} from './design-types';\nimport type { NativeLayout } from '../core/types';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert a numeric RN value to a CSS px string.\n * String values (like \"50%\") pass through unchanged.\n */\nfunction toCssValue(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'number') return `${value}px`;\n return String(value);\n}\n\n/**\n * Convert RN transform array to CSS transform string.\n * e.g. [{translateX: 10}, {rotate: '45deg'}] → \"translateX(10px) rotate(45deg)\"\n */\nfunction transformToCss(transform: unknown): string {\n if (!Array.isArray(transform) || transform.length === 0) return '';\n\n return transform\n .map((t: Record<string, unknown>) => {\n const key = Object.keys(t)[0];\n if (!key) return '';\n const val = t[key];\n // Rotation values are already strings like '45deg'\n if (typeof val === 'string') return `${key}(${val})`;\n // Numeric values need px for translate, unitless for scale\n if (typeof val === 'number') {\n const needsPx = key.startsWith('translate') || key === 'perspective';\n return `${key}(${val}${needsPx ? 'px' : ''})`;\n }\n return '';\n })\n .filter(Boolean)\n .join(' ');\n}\n\n/**\n * Convert RN shadow props (iOS) + elevation (Android) to CSS box-shadow string.\n */\nfunction shadowToCss(style: Record<string, unknown>): string {\n const parts: string[] = [];\n\n // iOS shadow\n const shadowColor = style.shadowColor as string | undefined;\n const shadowOffset = style.shadowOffset as { width: number; height: number } | undefined;\n const shadowOpacity = style.shadowOpacity as number | undefined;\n const shadowRadius = style.shadowRadius as number | undefined;\n\n if (shadowColor && shadowOffset && shadowOpacity != null && shadowOpacity > 0) {\n const { width, height } = shadowOffset;\n parts.push(\n `${width}px ${height}px ${shadowRadius ?? 0}px ${shadowColor}` +\n (shadowOpacity < 1 ? ` /* opacity: ${shadowOpacity} */` : '')\n );\n }\n\n // Android elevation\n const elevation = style.elevation as number | undefined;\n if (elevation != null && elevation > 0) {\n parts.push(`elevation(${elevation})`);\n }\n\n return parts.join(', ');\n}\n\n/**\n * Convert RN border props to CSS border shorthand.\n */\nfunction borderToCss(style: Record<string, unknown>): string {\n const width = style.borderWidth as number | undefined;\n const color = style.borderColor as string | undefined;\n\n if (width == null && color == null) return '';\n return `${width ?? 0}px solid ${color ?? 'transparent'}`;\n}\n\n/**\n * Convert RN borderRadius to CSS border-radius string.\n * Handles both uniform radius and per-corner values.\n */\nfunction borderRadiusToCss(style: Record<string, unknown>): string {\n const uniform = style.borderRadius as number | undefined;\n if (uniform != null) return `${uniform}px`;\n\n const tl = style.borderTopLeftRadius as number | undefined;\n const tr = style.borderTopRightRadius as number | undefined;\n const bl = style.borderBottomLeftRadius as number | undefined;\n const br = style.borderBottomRightRadius as number | undefined;\n\n if (tl == null && tr == null && bl == null && br == null) return '';\n return `${tl ?? 0}px ${tr ?? 0}px ${br ?? 0}px ${bl ?? 0}px`;\n}\n\n/**\n * Resolve margin/padding shorthand + Horizontal/Vertical expansions.\n * Returns top, right, bottom, left values.\n */\nfunction resolveSpacing(\n style: Record<string, unknown>,\n prefix: 'margin' | 'padding'\n): { top: string; right: string; bottom: string; left: string; shorthand: string } {\n const all = style[prefix];\n const top = style[`${prefix}Top`] ?? style[`${prefix}Vertical`] ?? all;\n const bottom = style[`${prefix}Bottom`] ?? style[`${prefix}Vertical`] ?? all;\n const right = style[`${prefix}Right`] ?? style[`${prefix}Horizontal`] ?? all;\n const left = style[`${prefix}Left`] ?? style[`${prefix}Horizontal`] ?? all;\n\n const t = toCssValue(top);\n const r = toCssValue(right);\n const b = toCssValue(bottom);\n const l = toCssValue(left);\n\n // Build shorthand\n let shorthand = '';\n if (t || r || b || l) {\n if (t === r && r === b && b === l) {\n shorthand = t || '0px';\n } else if (t === b && r === l) {\n shorthand = `${t || '0px'} ${r || '0px'}`;\n } else {\n shorthand = `${t || '0px'} ${r || '0px'} ${b || '0px'} ${l || '0px'}`;\n }\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n shorthand,\n };\n}\n\n/**\n * Resolve gap values (gap, rowGap, columnGap).\n */\nfunction resolveGap(style: Record<string, unknown>): string {\n const gap = style.gap as number | undefined;\n const rowGap = style.rowGap as number | undefined;\n const columnGap = style.columnGap as number | undefined;\n\n if (gap != null) return `${gap}px`;\n if (rowGap != null && columnGap != null) return `${rowGap}px ${columnGap}px`;\n if (rowGap != null) return `${rowGap}px`;\n if (columnGap != null) return `${columnGap}px`;\n return '';\n}\n\n// ============================================================================\n// Core mapping function\n// ============================================================================\n\n/**\n * Map a flattened React Native style object to ExtendedComputedStyles.\n *\n * Rules:\n * - Numeric values → \"Npx\"\n * - String values → pass through\n * - textDecorationLine → textDecoration\n * - RN shadow props → boxShadow string\n * - CSS-only properties (cursor, visibility, grid*, etc.) → empty string\n */\nexport function mapNativeStyleToExtended(\n rnStyle: Record<string, unknown> | undefined | null\n): ExtendedComputedStyles {\n const s = rnStyle ?? {};\n\n const margin = resolveSpacing(s, 'margin');\n const padding = resolveSpacing(s, 'padding');\n\n return {\n // Layout\n display: (s.display as string) ?? 'flex',\n position: (s.position as string) ?? 'relative',\n boxSizing: '', // CSS-only\n width: toCssValue(s.width),\n height: toCssValue(s.height),\n minWidth: toCssValue(s.minWidth),\n maxWidth: toCssValue(s.maxWidth),\n minHeight: toCssValue(s.minHeight),\n maxHeight: toCssValue(s.maxHeight),\n margin: margin.shorthand,\n marginTop: margin.top,\n marginRight: margin.right,\n marginBottom: margin.bottom,\n marginLeft: margin.left,\n padding: padding.shorthand,\n paddingTop: padding.top,\n paddingRight: padding.right,\n paddingBottom: padding.bottom,\n paddingLeft: padding.left,\n overflow: (s.overflow as string) ?? '',\n overflowX: '', // CSS-only\n overflowY: '', // CSS-only\n\n // Flex/Grid — RN defaults to column, not row\n flexDirection: (s.flexDirection as string) ?? '',\n flexWrap: (s.flexWrap as string) ?? '',\n justifyContent: (s.justifyContent as string) ?? '',\n alignItems: (s.alignItems as string) ?? '',\n alignSelf: (s.alignSelf as string) ?? '',\n gap: resolveGap(s),\n gridTemplateColumns: '', // CSS-only\n gridTemplateRows: '', // CSS-only\n\n // Typography\n fontFamily: (s.fontFamily as string) ?? '',\n fontSize: toCssValue(s.fontSize),\n fontWeight: (s.fontWeight as string) ?? '',\n lineHeight: toCssValue(s.lineHeight),\n letterSpacing: toCssValue(s.letterSpacing),\n textAlign: (s.textAlign as string) ?? '',\n textTransform: (s.textTransform as string) ?? '',\n textDecoration: (s.textDecorationLine as string) ?? '', // RN name → CSS name\n color: (s.color as string) ?? '',\n\n // Visual\n backgroundColor: (s.backgroundColor as string) ?? '',\n backgroundImage: '', // CSS-only\n border: borderToCss(s),\n borderRadius: borderRadiusToCss(s),\n boxShadow: shadowToCss(s),\n opacity: s.opacity != null ? String(s.opacity) : '',\n outline: '', // CSS-only\n\n // Effects\n transform: transformToCss(s.transform),\n transition: '', // CSS-only\n cursor: '', // CSS-only\n zIndex: s.zIndex != null ? String(s.zIndex) : '',\n visibility: '', // CSS-only\n pointerEvents: (s.pointerEvents as string) ?? '',\n };\n}\n\n// ============================================================================\n// Design data functions\n// ============================================================================\n\n/**\n * Produce ElementDesignData for a single native element.\n */\nexport function getNativeElementDesignData(\n id: string,\n label: string | undefined,\n type: string,\n rnStyle: Record<string, unknown> | undefined | null,\n layout: NativeLayout | null\n): ElementDesignData {\n return {\n elementId: id,\n label,\n type,\n styles: mapNativeStyleToExtended(rnStyle),\n pseudoElements: [], // RN has no pseudo-elements\n rect: layout\n ? {\n x: layout.pageX,\n y: layout.pageY,\n width: layout.width,\n height: layout.height,\n }\n : { x: 0, y: 0, width: 0, height: 0 },\n };\n}\n\n/**\n * Compute style diffs between default and a state variation.\n */\nfunction computeStyleDiff(\n defaultStyles: ExtendedComputedStyles,\n stateStyles: ExtendedComputedStyles\n): StyleDiff[] {\n const diffs: StyleDiff[] = [];\n for (const key of Object.keys(defaultStyles) as Array<keyof ExtendedComputedStyles>) {\n if (defaultStyles[key] !== stateStyles[key]) {\n diffs.push({\n property: key,\n defaultValue: defaultStyles[key],\n stateValue: stateStyles[key],\n });\n }\n }\n return diffs;\n}\n\n/**\n * Merge a base RN style with a state override.\n */\nfunction mergeStyles(\n base: Record<string, unknown>,\n override: Record<string, unknown> | undefined\n): Record<string, unknown> {\n if (!override) return base;\n return { ...base, ...override };\n}\n\n/**\n * Produce StateStyles[] for default/pressed/focused/disabled.\n * Only includes states that have actual overrides or the default state.\n */\nexport function captureNativeStateVariations(\n baseStyle: Record<string, unknown> | undefined | null,\n stateStyles?: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n }\n): StateStyles[] {\n const base = baseStyle ?? {};\n const defaultExtended = mapNativeStyleToExtended(base);\n\n const results: StateStyles[] = [\n {\n state: 'default',\n styles: defaultExtended,\n diffFromDefault: [],\n },\n ];\n\n if (!stateStyles) return results;\n\n const states: Array<{ name: NativeInteractionStateName; override?: Record<string, unknown> }> = [\n { name: 'pressed', override: stateStyles.pressed },\n { name: 'focused', override: stateStyles.focused },\n { name: 'disabled', override: stateStyles.disabled },\n ];\n\n for (const { name, override } of states) {\n if (!override) continue;\n const merged = mergeStyles(base, override);\n const extended = mapNativeStyleToExtended(merged);\n const diff = computeStyleDiff(defaultExtended, extended);\n if (diff.length > 0) {\n results.push({ state: name, styles: extended, diffFromDefault: diff });\n }\n }\n\n return results;\n}\n\n/**\n * Capture a responsive snapshot.\n *\n * Platform limitation: RN cannot constrain screen width at runtime.\n * This returns a single snapshot at the current device dimensions.\n */\nexport function captureNativeResponsiveSnapshot(\n elements: Array<{\n id: string;\n label?: string;\n type: string;\n flatStyle?: Record<string, unknown>;\n layout: NativeLayout | null;\n }>,\n screenDimensions: { width: number; height: number }\n): ResponsiveSnapshot[] {\n const elementData = elements.map((el) =>\n getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, el.layout)\n );\n\n return [\n {\n viewportWidth: screenDimensions.width,\n viewportLabel: 'current',\n elements: elementData,\n timestamp: Date.now(),\n },\n ];\n}\n","/**\n * UI Bridge Native Design Review Handlers\n *\n * HTTP handlers for the 8 design review endpoints.\n * Maps registered element styles to the web SDK's design data format.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { APIResponse, HandlerContext } from './types';\nimport type { ElementDesignData, StateStyles, ResponsiveSnapshot } from '../design/design-types';\nimport {\n mapNativeStyleToExtended,\n getNativeElementDesignData,\n captureNativeStateVariations,\n captureNativeResponsiveSnapshot,\n} from '../design/design-inspector-native';\n\n// Style guide and baseline stored in closure (same pattern as web SDK)\nlet loadedStyleGuide: unknown = null;\nlet savedBaseline: unknown = null;\n\n// Try to load the style validator from the web SDK (optional peer dep)\nlet styleValidator: {\n runStyleAudit: (\n elements: Array<{ elementId: string; styles: Record<string, string> }>,\n guide: unknown\n ) => unknown;\n} | null = null;\n\n// Try to load quality evaluator from the web SDK (optional peer dep)\nlet qualityEvaluator: {\n evaluateQuality: (\n elements: ElementDesignData[],\n viewport: { width: number; height: number },\n context?: unknown\n ) => unknown;\n listContexts: () => Array<{ name: string; description: string }>;\n createBaseline: (\n elements: ElementDesignData[],\n viewport: { width: number; height: number },\n label?: string\n ) => unknown;\n diffSnapshots: (baseline: unknown, current: ElementDesignData[]) => unknown;\n} | null = null;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const specs = require('@qontinui/ui-bridge/specs');\n styleValidator = specs;\n qualityEvaluator = specs;\n} catch {\n // Optional dependency not installed — audit/evaluate endpoints will return an error\n}\n\nfunction success<T>(data: T): APIResponse<T> {\n return { success: true, data, timestamp: Date.now() };\n}\n\nfunction error<T = unknown>(message: string, code?: string): APIResponse<T> {\n return { success: false, error: message, code, timestamp: Date.now() };\n}\n\n/**\n * Design handler interface (subset of NativeServerHandlers)\n */\nexport interface NativeDesignHandlers {\n getElementStyles: (ctx: HandlerContext) => Promise<APIResponse<ElementDesignData>>;\n getElementStateStyles: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ elementId: string; stateStyles: StateStyles[] }>>;\n getDesignSnapshot: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ elements: ElementDesignData[]; timestamp: number }>>;\n getResponsiveSnapshots: (ctx: HandlerContext) => Promise<APIResponse<ResponsiveSnapshot[]>>;\n runDesignAudit: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n loadStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<{ loaded: boolean }>>;\n getStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n clearStyleGuide: (ctx: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n evaluateQuality: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n getQualityContexts: (\n ctx: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; description: string }>>>;\n saveBaseline: (\n ctx: HandlerContext\n ) => Promise<APIResponse<{ saved: boolean; elementCount: number }>>;\n diffBaseline: (ctx: HandlerContext) => Promise<APIResponse<unknown>>;\n}\n\n/**\n * Create design review handlers.\n */\nexport function createDesignHandlers(registry: NativeUIBridgeRegistry): NativeDesignHandlers {\n // Helper to get screen dimensions (React Native's Dimensions API must be\n // called at handler time, not import time, so we use a lazy getter).\n function getScreenDimensions(): { width: number; height: number } {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { Dimensions } = require('react-native');\n const screen = Dimensions.get('screen');\n return { width: screen.width, height: screen.height };\n } catch {\n return { width: 0, height: 0 };\n }\n }\n\n return {\n // 1. GET /design/element/:id/styles\n getElementStyles: async (ctx) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error('Element not found: ' + id, 'ELEMENT_NOT_FOUND');\n }\n\n const state = element.getState();\n const data = getNativeElementDesignData(\n id,\n element.label,\n element.type,\n element.flatStyle,\n state.layout\n );\n\n return success(data);\n },\n\n // 2. POST /design/element/:id/state-styles\n getElementStateStyles: async (ctx) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error('Element not found: ' + id, 'ELEMENT_NOT_FOUND');\n }\n\n const stateStyles = captureNativeStateVariations(element.flatStyle, element.stateStyles);\n\n return success({ elementId: id, stateStyles });\n },\n\n // 3. POST /design/snapshot\n getDesignSnapshot: async (ctx) => {\n const body = ctx.body as\n | {\n elementIds?: string[];\n includePseudoElements?: boolean;\n }\n | undefined;\n\n let elements = registry.getAllElements();\n\n // Filter to requested IDs if specified\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n return success({ elements: designData, timestamp: Date.now() });\n },\n\n // 4. POST /design/responsive\n getResponsiveSnapshots: async () => {\n // Platform limitation: RN cannot constrain screen width at runtime.\n // Returns a single snapshot at current device dimensions.\n const elements = registry.getAllElements();\n const elementData = elements.map((el) => {\n const state = el.getState();\n return {\n id: el.id,\n label: el.label,\n type: el.type,\n flatStyle: el.flatStyle,\n layout: state.layout,\n };\n });\n\n const snapshots = captureNativeResponsiveSnapshot(elementData, getScreenDimensions());\n return success(snapshots);\n },\n\n // 5. POST /design/audit\n runDesignAudit: async (ctx) => {\n const body = ctx.body as\n | {\n guide?: unknown;\n elementIds?: string[];\n }\n | undefined;\n\n const guide = body?.guide ?? loadedStyleGuide;\n\n if (!guide) {\n return error('No style guide loaded or provided', 'NO_STYLE_GUIDE');\n }\n\n if (!styleValidator) {\n return error(\n 'Install @qontinui/ui-bridge for style audit support. ' +\n 'Add it as a dependency: npm install @qontinui/ui-bridge',\n 'VALIDATOR_NOT_AVAILABLE'\n );\n }\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n // Map elements to the format expected by the validator\n const auditElements = elements.map((el) => ({\n elementId: el.id,\n styles: mapNativeStyleToExtended(el.flatStyle) as unknown as Record<string, string>,\n }));\n\n try {\n const report = styleValidator.runStyleAudit(auditElements, guide);\n return success(report);\n } catch (err) {\n return error(\n 'Audit failed: ' + (err instanceof Error ? err.message : String(err)),\n 'DESIGN_AUDIT_ERROR'\n );\n }\n },\n\n // 6. POST /design/style-guide/load\n loadStyleGuide: async (ctx) => {\n const body = ctx.body as { guide?: unknown } | undefined;\n\n if (!body?.guide) {\n return error('Style guide is required in request body', 'INVALID_REQUEST');\n }\n\n loadedStyleGuide = body.guide;\n return success({ loaded: true });\n },\n\n // 7. GET /design/style-guide\n getStyleGuide: async () => {\n return success(loadedStyleGuide);\n },\n\n // 8. DELETE /design/style-guide\n clearStyleGuide: async () => {\n loadedStyleGuide = null;\n return success({ cleared: true });\n },\n\n // 9. POST /design/evaluate\n evaluateQuality: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support. ' +\n 'Add it as a dependency: npm install @qontinui/ui-bridge',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n const body = ctx.body as\n | {\n context?: string;\n customContext?: unknown;\n elementIds?: string[];\n viewport?: { width: number; height: number };\n }\n | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n const viewport = body?.viewport ?? getScreenDimensions();\n\n // Resolve context: custom object > style guide context > built-in name\n let context: unknown = body?.customContext ?? body?.context ?? 'general';\n if (typeof context === 'string' && loadedStyleGuide) {\n const guide = loadedStyleGuide as { qualityContexts?: Record<string, unknown> };\n if (guide.qualityContexts?.[context]) {\n context = guide.qualityContexts[context];\n }\n }\n\n try {\n const report = qualityEvaluator.evaluateQuality(designData, viewport, context);\n return success(report);\n } catch (err) {\n return error(\n 'Evaluation failed: ' + (err instanceof Error ? err.message : String(err)),\n 'QUALITY_EVALUATION_ERROR'\n );\n }\n },\n\n // 10. GET /design/evaluate/contexts\n getQualityContexts: async () => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n return success(qualityEvaluator.listContexts());\n },\n\n // 11. POST /design/evaluate/baseline\n saveBaseline: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n const body = ctx.body as\n | {\n label?: string;\n elementIds?: string[];\n }\n | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n const viewport = getScreenDimensions();\n savedBaseline = qualityEvaluator.createBaseline(designData, viewport, body?.label);\n return success({ saved: true, elementCount: designData.length });\n },\n\n // 12. POST /design/evaluate/diff\n diffBaseline: async (ctx) => {\n if (!qualityEvaluator) {\n return error(\n 'Install @qontinui/ui-bridge for quality evaluation support.',\n 'EVALUATOR_NOT_AVAILABLE'\n );\n }\n\n if (!savedBaseline) {\n return error('No baseline saved. Call saveBaseline first.', 'NO_BASELINE');\n }\n\n const body = ctx.body as { elementIds?: string[] } | undefined;\n\n let elements = registry.getAllElements();\n if (body?.elementIds && body.elementIds.length > 0) {\n const idSet = new Set(body.elementIds);\n elements = elements.filter((e) => idSet.has(e.id));\n }\n\n const designData: ElementDesignData[] = elements.map((el) => {\n const state = el.getState();\n return getNativeElementDesignData(el.id, el.label, el.type, el.flatStyle, state.layout);\n });\n\n try {\n const report = qualityEvaluator.diffSnapshots(savedBaseline, designData);\n return success(report);\n } catch (err) {\n return error(\n 'Diff failed: ' + (err instanceof Error ? err.message : String(err)),\n 'DIFF_BASELINE_ERROR'\n );\n }\n },\n };\n}\n","/**\n * UI Bridge Native Server Handlers\n *\n * Request handlers for the HTTP API endpoints.\n */\n\nimport { type NativeUIBridgeRegistry, extractHandlerNames } from '../core/registry';\nimport type {\n NativeElementType,\n NativeLayout,\n NativeModalInfo,\n WaitOptions,\n WorkflowStep,\n} from '../core/types';\nimport type { NativeActionExecutor } from '../control/types';\nimport type {\n APIResponse,\n ConsoleErrorsResponse,\n DismissModalResponse,\n FillFormFieldInput,\n FillFormFieldResult,\n FillFormResponse,\n HandlerContext,\n NativeServerHandlers,\n NetworkRequestsResponse,\n PushModalRequest,\n PushModalResponse,\n TapAtResponse,\n} from './types';\nimport { createDesignHandlers } from './design-handlers';\nimport type { ConsoleErrorBuffer, NetworkRequestBuffer } from './observability';\n\n/**\n * Result of executing a single workflow step\n */\ninterface WorkflowStepResult {\n stepId: string;\n type: string;\n status: 'completed' | 'failed' | 'skipped';\n result?: unknown;\n error?: string;\n durationMs: number;\n}\n\n/**\n * Execute a single workflow step using the registry and executor\n */\nasync function executeWorkflowStep(\n step: WorkflowStep,\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor\n): Promise<WorkflowStepResult> {\n const startTime = Date.now();\n\n try {\n switch (step.type) {\n case 'element-action': {\n if (!step.target || !step.action) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'element-action step requires target and action',\n durationMs: Date.now() - startTime,\n };\n }\n\n const response = await executor.executeAction(step.target, {\n action: step.action,\n params: step.params,\n waitOptions: step.waitOptions,\n });\n\n return {\n stepId: step.id,\n type: step.type,\n status: response.success ? 'completed' : 'failed',\n result: response.result,\n error: response.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'component-action': {\n if (!step.target || !step.action) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'component-action step requires target and action',\n durationMs: Date.now() - startTime,\n };\n }\n\n const response = await executor.executeComponentAction(step.target, {\n action: step.action,\n params: step.params,\n });\n\n return {\n stepId: step.id,\n type: step.type,\n status: response.success ? 'completed' : 'failed',\n result: response.result,\n error: response.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'wait': {\n if (!step.target) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'wait step requires target element id',\n durationMs: Date.now() - startTime,\n };\n }\n\n const waitResult = await executor.waitForElement(\n step.target,\n step.waitOptions || { visible: true, timeout: 10000, interval: 100 }\n );\n\n return {\n stepId: step.id,\n type: step.type,\n status: waitResult.met ? 'completed' : 'failed',\n result: waitResult.state,\n error: waitResult.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'assert': {\n if (!step.target) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'assert step requires target element id',\n durationMs: Date.now() - startTime,\n };\n }\n\n const element = registry.getElement(step.target);\n if (!element) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: `Element not found: ${step.target}`,\n durationMs: Date.now() - startTime,\n };\n }\n\n const state = element.getState();\n const expected = step.params || {};\n const stateRecord = state as unknown as Record<string, unknown>;\n const mismatches: string[] = [];\n\n for (const [key, value] of Object.entries(expected)) {\n const actual = stateRecord[key];\n const isEqual =\n typeof value === 'object' && value !== null\n ? JSON.stringify(actual) === JSON.stringify(value)\n : actual === value;\n if (!isEqual) {\n mismatches.push(\n `${key}: expected ${JSON.stringify(value)}, got ${JSON.stringify(actual)}`\n );\n }\n }\n\n return {\n stepId: step.id,\n type: step.type,\n status: mismatches.length === 0 ? 'completed' : 'failed',\n result: { state, mismatches },\n error: mismatches.length > 0 ? `Assertion failed: ${mismatches.join('; ')}` : undefined,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'custom': {\n if (!step.handler) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: 'custom step requires a handler function',\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await step.handler();\n // Allow handlers to signal failure by returning { success: false, error: '...' }\n const failed =\n result &&\n typeof result === 'object' &&\n 'success' in result &&\n (result as Record<string, unknown>).success === false;\n\n return {\n stepId: step.id,\n type: step.type,\n status: failed ? 'failed' : 'completed',\n result,\n error: failed\n ? ((result as Record<string, unknown>).error as string) ||\n 'Custom handler returned failure'\n : undefined,\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'log': {\n const message = step.params?.message ?? step.params?.text ?? `[workflow] step ${step.id}`;\n console.log(`[ui-bridge-native] workflow log: ${message}`);\n\n return {\n stepId: step.id,\n type: step.type,\n status: 'completed',\n result: { message },\n durationMs: Date.now() - startTime,\n };\n }\n\n case 'navigate':\n case 'branch':\n case 'loop':\n case 'extract':\n return {\n stepId: step.id,\n type: step.type,\n status: 'skipped',\n error: `Step type \"${step.type}\" is not yet supported in native workflow execution`,\n durationMs: Date.now() - startTime,\n };\n\n default:\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: `Unknown step type: ${step.type}`,\n durationMs: Date.now() - startTime,\n };\n }\n } catch (err) {\n return {\n stepId: step.id,\n type: step.type,\n status: 'failed',\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Create a success response\n */\nfunction success<T>(data: T): APIResponse<T> {\n return {\n success: true,\n data,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create an error response\n */\nfunction error<T = unknown>(message: string, code?: string): APIResponse<T> {\n return {\n success: false,\n error: message,\n code,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create server handlers\n */\nexport function createServerHandlers(\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor,\n config?: {\n appInfo?: { appId: string; appName: string; appType: string; framework?: string };\n /** Optional console-error ring buffer powering `GET /control/console-errors`. */\n consoleErrorBuffer?: ConsoleErrorBuffer;\n /** Optional network-request ring buffer powering `GET /sdk/network-requests`. */\n networkRequestBuffer?: NetworkRequestBuffer;\n }\n): NativeServerHandlers {\n const designHandlers = createDesignHandlers(registry);\n\n return {\n // Elements\n getElements: async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx.query?.visibleOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.visibleOnly === true;\n const forRoute = (ctx.query?.route || (ctx.body as Record<string, unknown>)?.route) as\n | string\n | undefined;\n\n let allElements = visibleOnly ? registry.getVisibleElements() : registry.getAllElements();\n\n // Filter by specific route (injected by setRouteProvider override when currentRouteOnly is set)\n if (forRoute) {\n allElements = allElements.filter((e) => e.registrationRoute === forRoute);\n }\n\n const elements = allElements.map((e) => {\n const handlers = extractHandlerNames(e.props);\n return {\n id: e.id,\n type: e.type,\n label: e.label,\n identifier: e.getIdentifier(),\n state: e.getState(),\n actions: e.actions,\n customActions: e.customActions ? Object.keys(e.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: e.registrationRoute,\n };\n });\n\n return success({ elements });\n },\n\n getElement: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error(`Element not found: ${id}`, 'ELEMENT_NOT_FOUND');\n }\n\n const handlers = extractHandlerNames(element.props);\n\n return success({\n element: {\n id: element.id,\n type: element.type,\n label: element.label,\n identifier: element.getIdentifier(),\n state: element.getState(),\n actions: element.actions,\n customActions: element.customActions ? Object.keys(element.customActions) : undefined,\n registeredHandlers: handlers.length > 0 ? handlers : undefined,\n registrationRoute: element.registrationRoute,\n },\n });\n },\n\n getElementState: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const element = registry.getElement(id);\n\n if (!element) {\n return error(`Element not found: ${id}`, 'ELEMENT_NOT_FOUND');\n }\n\n return success({ state: element.getState() });\n },\n\n executeAction: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const body = ctx.body as {\n action: string;\n params?: Record<string, unknown>;\n waitOptions?: WaitOptions;\n };\n\n if (!body?.action) {\n return error('Action is required', 'INVALID_REQUEST');\n }\n\n const response = await executor.executeAction(id, {\n action: body.action,\n params: body.params,\n waitOptions: body.waitOptions,\n });\n\n if (!response.success) {\n return error(response.error || 'Action failed', 'ACTION_FAILED');\n }\n\n return success(response);\n },\n\n // Components\n getComponents: async () => {\n const components = registry.getAllComponents().map((c) => ({\n id: c.id,\n name: c.name,\n description: c.description,\n actions: c.actions.map((a) => ({ id: a.id, label: a.label })),\n elementIds: c.elementIds,\n }));\n\n return success({ components });\n },\n\n getComponent: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const component = registry.getComponent(id);\n\n if (!component) {\n return error(`Component not found: ${id}`, 'COMPONENT_NOT_FOUND');\n }\n\n return success({\n component: {\n id: component.id,\n name: component.name,\n description: component.description,\n actions: component.actions.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n })),\n elementIds: component.elementIds,\n },\n });\n },\n\n executeComponentAction: async (ctx: HandlerContext) => {\n const { id, actionId } = ctx.params;\n const body = ctx.body as { params?: Record<string, unknown> };\n\n const response = await executor.executeComponentAction(id, {\n action: actionId,\n params: body?.params,\n });\n\n if (!response.success) {\n return error(response.error || 'Action failed', 'ACTION_FAILED');\n }\n\n return success(response);\n },\n\n // Discovery\n //\n // Native parity with the runner's `POST /ui-bridge/ai/find`. The runner\n // matches a free-text `query` against label > text > value > aria-label >\n // placeholder > name. We replicate that here against the native registry's\n // analogues:\n // 1. `label` (the registered display label)\n // 2. identifier fields: `testId`, `accessibilityLabel`, `treePath`, `uiId`\n // 3. registered handler names (e.g. `onPress`, `onChangeText`)\n //\n // Match is case-insensitive substring. Empty/missing query falls back to\n // the structured filters (types/visibleOnly/etc.) so callers that don't\n // pass `query` still get the legacy behaviour. Once we've narrowed by\n // query the response is shaped through the executor's NativeFindResponse\n // envelope so the wire format stays stable.\n find: async (ctx: HandlerContext) => {\n const body = ctx.body as {\n query?: string;\n types?: NativeElementType[];\n testIdPattern?: string;\n accessibilityLabelPattern?: string;\n visibleOnly?: boolean;\n limit?: number;\n };\n\n const response = await executor.find({\n types: body?.types,\n testIdPattern: body?.testIdPattern,\n accessibilityLabelPattern: body?.accessibilityLabelPattern,\n visibleOnly: body?.visibleOnly,\n // When `query` is supplied we apply our own limit *after* ranking so\n // the highest-priority matches survive the cap; defer slicing to us\n // by widening here.\n limit: body?.query && body.query.length > 0 ? undefined : body?.limit,\n });\n\n const rawQuery = typeof body?.query === 'string' ? body.query.trim() : '';\n if (rawQuery.length === 0) {\n return success(response);\n }\n\n const needle = rawQuery.toLowerCase();\n const containsNeedle = (value: unknown): boolean =>\n typeof value === 'string' && value.toLowerCase().includes(needle);\n\n // Score each discovered element by best-priority field match. Lower\n // priorityRank wins; ties keep registry insertion order (stable sort).\n const scored: Array<{ priorityRank: number; element: (typeof response.elements)[number] }> =\n [];\n\n for (const el of response.elements) {\n let priorityRank = Number.POSITIVE_INFINITY;\n\n // 1. label\n if (containsNeedle(el.label)) {\n priorityRank = Math.min(priorityRank, 0);\n }\n\n // 2. identifier fields\n const ident = el.identifier;\n if (ident) {\n if (containsNeedle(ident.testId)) priorityRank = Math.min(priorityRank, 1);\n if (containsNeedle(ident.accessibilityLabel)) priorityRank = Math.min(priorityRank, 1);\n if (containsNeedle(ident.treePath)) priorityRank = Math.min(priorityRank, 1);\n if (containsNeedle(ident.uiId)) priorityRank = Math.min(priorityRank, 1);\n }\n\n // 3. registered handler names — pull from the registry since the\n // discovered envelope doesn't include props.\n if (priorityRank === Number.POSITIVE_INFINITY) {\n const registered = registry.getElement(el.id);\n const handlers = extractHandlerNames(registered?.props);\n if (handlers.some((h) => h.toLowerCase().includes(needle))) {\n priorityRank = 2;\n }\n }\n\n if (priorityRank !== Number.POSITIVE_INFINITY) {\n scored.push({ priorityRank, element: el });\n }\n }\n\n scored.sort((a, b) => a.priorityRank - b.priorityRank);\n\n const limit = body?.limit && body.limit > 0 ? body.limit : undefined;\n const filtered = limit ? scored.slice(0, limit) : scored;\n\n return success({\n ...response,\n elements: filtered.map((s) => s.element),\n total: filtered.length,\n });\n },\n\n getSnapshot: async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx.query?.visibleOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.visibleOnly === true;\n const currentRouteOnly =\n ctx.query?.currentRouteOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.currentRouteOnly === true;\n // Pass `undefined` (not `null`) for routeInfo so `createSnapshot`\n // falls back to a registry-registered route provider if one exists —\n // without that fallback, the cloud-relay / bare-server path would\n // emit `currentRoute: null` even when a `RouteTracker` was wired.\n const snapshot = registry.createSnapshot(undefined, { visibleOnly, currentRouteOnly });\n return success(snapshot);\n },\n\n // Workflows\n getWorkflows: async () => {\n const workflows = registry.getAllWorkflows().map((w) => ({\n id: w.id,\n name: w.name,\n description: w.description,\n stepCount: w.steps.length,\n }));\n\n return success({ workflows });\n },\n\n runWorkflow: async (ctx: HandlerContext) => {\n const { id } = ctx.params;\n const workflow = registry.getWorkflow(id);\n\n if (!workflow) {\n return error(`Workflow not found: ${id}`, 'WORKFLOW_NOT_FOUND');\n }\n\n const runId = `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const startTime = Date.now();\n const stepResults: WorkflowStepResult[] = [];\n let status: 'completed' | 'failed' = 'completed';\n\n registry.emit('workflow:started', {\n runId,\n workflowId: id,\n workflowName: workflow.name,\n totalSteps: workflow.steps.length,\n });\n\n for (const step of workflow.steps) {\n const stepResult = await executeWorkflowStep(step, registry, executor);\n stepResults.push(stepResult);\n\n if (stepResult.status === 'completed' || stepResult.status === 'skipped') {\n registry.emit('workflow:stepCompleted', {\n runId,\n workflowId: id,\n step: stepResult,\n });\n }\n\n if (stepResult.status === 'failed') {\n status = 'failed';\n registry.emit('workflow:failed', {\n runId,\n workflowId: id,\n failedStep: stepResult,\n completedSteps: stepResults.length - 1,\n totalSteps: workflow.steps.length,\n });\n break;\n }\n }\n\n if (status === 'completed') {\n registry.emit('workflow:completed', {\n runId,\n workflowId: id,\n steps: stepResults,\n totalDurationMs: Date.now() - startTime,\n });\n }\n\n return success({\n runId,\n status,\n steps: stepResults,\n totalSteps: workflow.steps.length,\n completedSteps: stepResults.filter((s) => s.status === 'completed').length,\n failedSteps: stepResults.filter((s) => s.status === 'failed').length,\n skippedSteps: stepResults.filter((s) => s.status === 'skipped').length,\n durationMs: Date.now() - startTime,\n });\n },\n\n // Page Navigation (stubs — React Native apps should override with their navigation provider)\n pageRefresh: async () => {\n return error('Page refresh not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageNavigate: async () => {\n return error('Page navigation not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageReplace: async () => {\n return error('Page replace not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageGoBack: async () => {\n return error('Page go back not supported on native platform', 'NOT_SUPPORTED');\n },\n\n pageGoForward: async () => {\n return error('Page go forward not supported on native platform', 'NOT_SUPPORTED');\n },\n\n // Screenshot (stub — apps should override with their screen capture library)\n getScreenshot: async () => {\n return error(\n 'Screenshot not supported. Provide a screenshotProvider to UIBridgeNativeProvider.',\n 'NOT_SUPPORTED'\n );\n },\n\n // Meta / Introspection (stub — server constructor overrides with real route table)\n getMethods: async () => {\n return error('Methods introspection not configured', 'NOT_SUPPORTED');\n },\n\n // AI helpers\n //\n // Mobile-side parity with the runner's `POST /ui-bridge/ai/fill-form`.\n // Each entry in `fields` is dispatched through the existing executor as a\n // `type` action with `clear: true` so the input value is replaced\n // atomically (the closest native equivalent to the web bridge's\n // \"setValue\" semantics — there is no `setValue` action on native).\n //\n // Failures do not short-circuit: every field is attempted, and the\n // response carries per-field success/error plus aggregate counts.\n fillForm: async (ctx: HandlerContext): Promise<APIResponse<FillFormResponse>> => {\n const body = ctx.body as { fields?: unknown } | undefined;\n const rawFields = body?.fields;\n\n if (!Array.isArray(rawFields)) {\n return error('Request body must include \"fields\" array', 'INVALID_REQUEST');\n }\n\n const results: FillFormFieldResult[] = [];\n\n for (let i = 0; i < rawFields.length; i++) {\n const field = rawFields[i] as Partial<FillFormFieldInput> | null | undefined;\n\n // Validate per-field shape; record the failure but keep going so the\n // caller gets a complete picture of what worked and what didn't.\n if (!field || typeof field !== 'object') {\n results.push({\n elementId: '',\n success: false,\n error: `fields[${i}] must be an object with \"elementId\" and \"value\"`,\n });\n continue;\n }\n\n const { elementId, value } = field;\n\n if (typeof elementId !== 'string' || elementId.length === 0) {\n results.push({\n elementId: typeof elementId === 'string' ? elementId : '',\n success: false,\n error: `fields[${i}] is missing a non-empty \"elementId\"`,\n });\n continue;\n }\n\n if (typeof value !== 'string') {\n results.push({\n elementId,\n success: false,\n error: `fields[${i}] is missing a string \"value\"`,\n });\n continue;\n }\n\n try {\n const response = await executor.executeAction(elementId, {\n action: 'type',\n params: { text: value, clear: true },\n });\n\n if (response.success) {\n results.push({ elementId, success: true });\n } else {\n results.push({\n elementId,\n success: false,\n error: response.error ?? 'Action failed',\n });\n }\n } catch (err) {\n // executor.executeAction normally captures errors itself, but a\n // bespoke executor implementation may still throw — surface that.\n results.push({\n elementId,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const succeededCount = results.filter((r) => r.success).length;\n const failedCount = results.length - succeededCount;\n\n return success({ results, succeededCount, failedCount });\n },\n\n // Coord-based tap\n //\n // Synthesizes a press at the given screen coordinates by scanning the\n // registered elements' layout rects for a containing match. We prefer the\n // *topmost* match (smallest area = innermost child) since native UIs\n // generally render parents before children, and the user's tap should\n // logically hit the leaf-most interactive element.\n //\n // Coords are interpreted in the absolute (screen) space published by\n // `measureInWindow`; we compare against `pageX/pageY` when available and\n // fall back to the layout's relative `x/y` so this works in test fixtures\n // that don't measure (the fallback only matches single-rooted screens but\n // is good enough for the unit suite).\n tapAt: async (ctx: HandlerContext): Promise<APIResponse<TapAtResponse>> => {\n const body = ctx.body as Partial<{\n x: number;\n y: number;\n action: 'press' | 'longPress' | 'doubleTap';\n }> | undefined;\n\n const x = body?.x;\n const y = body?.y;\n\n if (typeof x !== 'number' || !Number.isFinite(x)) {\n return error<TapAtResponse>('\"x\" must be a finite number', 'INVALID_REQUEST');\n }\n if (typeof y !== 'number' || !Number.isFinite(y)) {\n return error<TapAtResponse>('\"y\" must be a finite number', 'INVALID_REQUEST');\n }\n\n const action = body?.action ?? 'press';\n const allowedActions: ReadonlyArray<TapAtResponse['action']> = [\n 'press',\n 'longPress',\n 'doubleTap',\n ];\n if (!allowedActions.includes(action)) {\n return error<TapAtResponse>(\n `\"action\" must be one of: ${allowedActions.join(', ')}`,\n 'INVALID_REQUEST'\n );\n }\n\n // Collect all candidates whose layout rect contains (x, y). Prefer\n // pageX/pageY (absolute coords) when both are populated; fall back to\n // the relative x/y otherwise.\n type Candidate = {\n elementId: string;\n layout: NativeLayout;\n area: number;\n };\n const candidates: Candidate[] = [];\n\n for (const el of registry.getAllElements()) {\n const state = el.getState();\n const layout = state?.layout;\n if (!layout) continue;\n if (\n typeof layout.width !== 'number' ||\n typeof layout.height !== 'number' ||\n layout.width <= 0 ||\n layout.height <= 0\n ) {\n continue;\n }\n\n const hasPage =\n typeof layout.pageX === 'number' &&\n typeof layout.pageY === 'number' &&\n Number.isFinite(layout.pageX) &&\n Number.isFinite(layout.pageY);\n\n const left = hasPage ? layout.pageX : layout.x;\n const top = hasPage ? layout.pageY : layout.y;\n\n if (\n x >= left &&\n x <= left + layout.width &&\n y >= top &&\n y <= top + layout.height\n ) {\n candidates.push({\n elementId: el.id,\n layout,\n area: layout.width * layout.height,\n });\n }\n }\n\n if (candidates.length === 0) {\n return error<TapAtResponse>(\n `No element registered at (${x}, ${y})`,\n 'no_element_at_coords'\n );\n }\n\n // Topmost = smallest area. Stable sort preserves registration order for\n // ties, so a parent and a same-size child won't flip non-deterministically.\n candidates.sort((a, b) => a.area - b.area);\n const target = candidates[0];\n\n const response = await executor.executeAction(target.elementId, { action });\n if (!response.success) {\n return error<TapAtResponse>(response.error || 'Action failed', 'ACTION_FAILED');\n }\n\n return success<TapAtResponse>({\n elementId: target.elementId,\n action,\n layout: {\n x: target.layout.x,\n y: target.layout.y,\n width: target.layout.width,\n height: target.layout.height,\n pageX: target.layout.pageX,\n pageY: target.layout.pageY,\n },\n });\n },\n\n // Observability — console error / network request ring buffers.\n //\n // The buffers are owned by NativeUIBridgeServer and patched onto the\n // globals on `start()` (gated behind `features.testHooks`). When no\n // buffer is provided (no testHooks, or a stripped-down server fixture),\n // these handlers gracefully return empty arrays so callers can probe\n // without 500ing.\n getConsoleErrors: async (ctx: HandlerContext): Promise<APIResponse<ConsoleErrorsResponse>> => {\n const buf = config?.consoleErrorBuffer;\n const since = ctx.query?.since !== undefined ? Number(ctx.query.since) : undefined;\n const limit = ctx.query?.limit !== undefined ? Number(ctx.query.limit) : undefined;\n\n if (!buf) {\n return success<ConsoleErrorsResponse>({\n entries: [],\n count: 0,\n bufferSize: 0,\n });\n }\n\n const entries = buf.entries({\n since: typeof since === 'number' && Number.isFinite(since) ? since : undefined,\n limit: typeof limit === 'number' && Number.isFinite(limit) ? limit : undefined,\n });\n\n return success<ConsoleErrorsResponse>({\n entries,\n count: entries.length,\n bufferSize: buf.size(),\n });\n },\n\n getNetworkRequests: async (\n ctx: HandlerContext\n ): Promise<APIResponse<NetworkRequestsResponse>> => {\n const buf = config?.networkRequestBuffer;\n const since = ctx.query?.since !== undefined ? Number(ctx.query.since) : undefined;\n const limit = ctx.query?.limit !== undefined ? Number(ctx.query.limit) : undefined;\n\n if (!buf) {\n return success<NetworkRequestsResponse>({\n entries: [],\n count: 0,\n bufferSize: 0,\n });\n }\n\n const entries = buf.entries({\n since: typeof since === 'number' && Number.isFinite(since) ? since : undefined,\n limit: typeof limit === 'number' && Number.isFinite(limit) ? limit : undefined,\n });\n\n return success<NetworkRequestsResponse>({\n entries,\n count: entries.length,\n bufferSize: buf.size(),\n });\n },\n\n // Test hooks — modal stack manipulation\n //\n // These two endpoints exist so external automation runners can drive\n // ModalDetector state via HTTP, mirroring the in-tree `pushModal` /\n // `dismissModal` calls that components normally make. They're gated by\n // `features.testHooks` at the route layer (see http-server.ts); the\n // handlers themselves still defend against a missing modalDetector\n // because the bare server path used by CloudRelayClient may run before\n // enrichers are wired.\n pushModal: async (ctx: HandlerContext): Promise<APIResponse<PushModalResponse>> => {\n const detector = registry.getEnrichers().modalDetector;\n if (!detector) {\n return error<PushModalResponse>(\n 'modal detector not registered',\n 'ENRICHER_UNAVAILABLE'\n );\n }\n\n const body = ctx.body as Partial<PushModalRequest> | undefined;\n const id = body?.id;\n if (typeof id !== 'string' || id.length === 0) {\n return error<PushModalResponse>(\n 'pushModal requires a non-empty \"id\"',\n 'INVALID_REQUEST'\n );\n }\n\n const allowedTypes = ['modal', 'sheet', 'drawer', 'popover', 'alertdialog', 'dialog'];\n const requestedType = body?.type;\n if (\n requestedType !== undefined &&\n (typeof requestedType !== 'string' || !allowedTypes.includes(requestedType))\n ) {\n return error<PushModalResponse>(\n `pushModal \"type\" must be one of: ${allowedTypes.join(', ')}`,\n 'INVALID_REQUEST'\n );\n }\n\n detector.pushModal({\n id,\n title: body?.title,\n // requestedType is narrowed by the allowedTypes guard above; the cast\n // converts the validated string to the NativeModalInfo['type'] union.\n type: requestedType as NativeModalInfo['type'] | undefined,\n blocking: body?.blocking,\n dismissible: body?.dismissible,\n });\n\n // Pull the canonicalised entry back out so the response reflects what's\n // actually in the stack (defaults applied, detectedAt populated).\n const stored = detector.getActive().find((m) => m.id === id);\n return success<PushModalResponse>({\n pushed: true,\n id,\n title: stored?.title,\n type: stored?.type,\n blocking: stored?.blocking,\n dismissible: stored?.dismissible,\n pushedAt: stored?.detectedAt ?? Date.now(),\n });\n },\n\n dismissModal: async (ctx: HandlerContext): Promise<APIResponse<DismissModalResponse>> => {\n const detector = registry.getEnrichers().modalDetector;\n if (!detector) {\n return error<DismissModalResponse>(\n 'modal detector not registered',\n 'ENRICHER_UNAVAILABLE'\n );\n }\n\n const { id } = ctx.params;\n if (typeof id !== 'string' || id.length === 0) {\n return error<DismissModalResponse>(\n 'dismissModal requires a modal id in the path',\n 'INVALID_REQUEST'\n );\n }\n\n // The slot type allows `dismissModal` to return either `boolean` (the\n // canonical ModalDetector class) or `void` (legacy/duck-typed impls).\n // Probe via `getActive()` first so the result is consistent regardless\n // of the implementation's return signal.\n const wasPresent = detector.getActive().some((m) => m.id === id);\n if (!wasPresent) {\n return error<DismissModalResponse>(`modal not found: ${id}`, 'MODAL_NOT_FOUND');\n }\n\n detector.dismissModal(id);\n return success<DismissModalResponse>({ dismissed: id });\n },\n\n // Design Review\n ...designHandlers,\n\n // Health\n health: async () => {\n const stats = registry.getStats();\n const registration = registry.getRegistrationCoverage();\n const response: Record<string, unknown> = {\n status: 'healthy',\n timestamp: Date.now(),\n ...stats,\n registration,\n };\n\n if (config?.appInfo) {\n response.uiBridge = {\n version: '0.3.0',\n ...config.appInfo,\n capabilities: ['elements', 'components', 'actions', 'design'],\n elementCount: stats.elements,\n componentCount: stats.components,\n };\n }\n\n return success(response);\n },\n };\n}\n","/**\n * UI Bridge Native — observability ring buffers.\n *\n * Two small last-N buffers backing the `/control/console-errors` and\n * `/sdk/network-requests` endpoints. Each buffer monkey-patches the relevant\n * global on `install()` and restores the original on `uninstall()`, so they\n * can be installed/torn-down with the server's lifecycle.\n *\n * Both buffers are gated behind `features.testHooks` by the caller (see\n * NativeUIBridgeServer). Production builds default to `testHooks: false`,\n * so these patches never run on real users' devices.\n *\n * Implementation notes:\n * - Buffers default to capacity 100 entries and drop oldest on overflow.\n * - Patches are idempotent: `install()` is a no-op when already installed;\n * `uninstall()` is a no-op when not installed.\n * - Patches only restore the *original* function captured at install time;\n * if other code wraps `console.error` / `fetch` between install and\n * uninstall, those wrappers will be lost. Acceptable for test hooks.\n */\nimport type { ConsoleErrorEntry, NetworkRequestEntry } from './types';\n\n// ── Ring buffer ─────────────────────────────────────────────────────────────\n\n/** A simple ring buffer that drops oldest on overflow. */\nclass RingBuffer<T extends { timestamp: number }> {\n private items: T[] = [];\n\n constructor(private readonly capacity: number) {}\n\n push(entry: T): void {\n this.items.push(entry);\n if (this.items.length > this.capacity) {\n this.items.splice(0, this.items.length - this.capacity);\n }\n }\n\n /**\n * Return entries optionally filtered by `since` (timestamp ms) and capped\n * at `limit`. Newest-end is preserved when `limit` would otherwise truncate.\n */\n entries(opts: { since?: number; limit?: number } = {}): T[] {\n const { since, limit } = opts;\n let filtered = this.items;\n if (typeof since === 'number') {\n filtered = filtered.filter((e) => e.timestamp >= since);\n }\n if (typeof limit === 'number' && limit >= 0 && filtered.length > limit) {\n filtered = filtered.slice(filtered.length - limit);\n }\n return filtered.slice();\n }\n\n size(): number {\n return this.items.length;\n }\n\n clear(): void {\n this.items.length = 0;\n }\n}\n\n// ── Console error buffer ────────────────────────────────────────────────────\n\ninterface PatchedConsole {\n error: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n}\n\n/**\n * Format console arguments the same way `console.log` would (joined by\n * spaces, with errors stringified to their `message`).\n */\nfunction formatConsoleArgs(args: unknown[]): string {\n return args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ');\n}\n\n/** Pull the first `Error` from the args, if any, and return its `.stack`. */\nfunction extractStack(args: unknown[]): string | undefined {\n for (const a of args) {\n if (a instanceof Error && a.stack) return a.stack;\n }\n return undefined;\n}\n\nexport class ConsoleErrorBuffer {\n private buffer: RingBuffer<ConsoleErrorEntry>;\n private installed = false;\n private originalError?: PatchedConsole['error'];\n private originalWarn?: PatchedConsole['warn'];\n\n constructor(capacity = 100) {\n this.buffer = new RingBuffer<ConsoleErrorEntry>(capacity);\n }\n\n install(): void {\n if (this.installed) return;\n if (typeof console === 'undefined') return;\n\n // Capture the originals as-is (no .bind) so `uninstall()` restores the\n // exact reference callers had before we touched the global.\n this.originalError = console.error as PatchedConsole['error'];\n this.originalWarn = console.warn as PatchedConsole['warn'];\n\n const buffer = this.buffer;\n const origError = this.originalError;\n const origWarn = this.originalWarn;\n\n console.error = (...args: unknown[]): void => {\n try {\n buffer.push({\n timestamp: Date.now(),\n level: 'error',\n message: formatConsoleArgs(args),\n stack: extractStack(args),\n });\n } catch {\n // Never let the patch throw — fall through to the original.\n }\n origError.apply(console, args);\n };\n\n console.warn = (...args: unknown[]): void => {\n try {\n buffer.push({\n timestamp: Date.now(),\n level: 'warn',\n message: formatConsoleArgs(args),\n stack: extractStack(args),\n });\n } catch {\n // ignore\n }\n origWarn.apply(console, args);\n };\n\n this.installed = true;\n }\n\n uninstall(): void {\n if (!this.installed) return;\n if (typeof console === 'undefined') return;\n\n if (this.originalError) console.error = this.originalError;\n if (this.originalWarn) console.warn = this.originalWarn;\n\n this.originalError = undefined;\n this.originalWarn = undefined;\n this.installed = false;\n }\n\n entries(opts: { since?: number; limit?: number } = {}): ConsoleErrorEntry[] {\n return this.buffer.entries(opts);\n }\n\n size(): number {\n return this.buffer.size();\n }\n\n clear(): void {\n this.buffer.clear();\n }\n\n isInstalled(): boolean {\n return this.installed;\n }\n}\n\n// ── Network request buffer ──────────────────────────────────────────────────\n\ntype FetchFn = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\n/**\n * Best-effort URL extraction from a `fetch` first-arg. Mirrors what RN's\n * polyfill accepts (string | URL | Request).\n */\nfunction extractUrl(input: unknown): string {\n if (typeof input === 'string') return input;\n if (input && typeof input === 'object') {\n const obj = input as { url?: unknown; toString?: () => string };\n if (typeof obj.url === 'string') return obj.url;\n try {\n return String(input);\n } catch {\n return '';\n }\n }\n return '';\n}\n\n/**\n * Best-effort method extraction. `fetch(url, {method})` overrides the\n * Request's method, so we check `init` first and fall back to the Request.\n */\nfunction extractMethod(input: unknown, init?: RequestInit): string {\n if (init && typeof init.method === 'string') return init.method.toUpperCase();\n if (input && typeof input === 'object') {\n const obj = input as { method?: unknown };\n if (typeof obj.method === 'string') return obj.method.toUpperCase();\n }\n return 'GET';\n}\n\n/** Minimal shape of `globalThis` we patch. Avoids depending on DOM types. */\ninterface PatchableGlobal {\n fetch?: FetchFn;\n XMLHttpRequest?: typeof XMLHttpRequest;\n}\n\nexport class NetworkRequestBuffer {\n private buffer: RingBuffer<NetworkRequestEntry>;\n private installed = false;\n private originalFetch?: FetchFn;\n private originalXhrOpen?: typeof XMLHttpRequest.prototype.open;\n private originalXhrSend?: typeof XMLHttpRequest.prototype.send;\n\n constructor(capacity = 100) {\n this.buffer = new RingBuffer<NetworkRequestEntry>(capacity);\n }\n\n install(): void {\n if (this.installed) return;\n const g = globalThis as PatchableGlobal;\n\n if (typeof g.fetch === 'function') {\n // Capture the original reference as-is so `uninstall()` restores the\n // exact function callers had before we patched.\n this.originalFetch = g.fetch;\n const buffer = this.buffer;\n const original = this.originalFetch;\n\n const patched: FetchFn = async (input, init) => {\n const start = Date.now();\n const url = extractUrl(input);\n const method = extractMethod(input, init);\n\n try {\n const res = await original.call(globalThis, input, init);\n buffer.push({\n timestamp: start,\n method,\n url,\n status: res.status,\n durationMs: Date.now() - start,\n ok: res.ok,\n });\n return res;\n } catch (err) {\n buffer.push({\n timestamp: start,\n method,\n url,\n status: 0,\n durationMs: Date.now() - start,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n };\n\n g.fetch = patched;\n }\n\n // Patch XMLHttpRequest if present (RN ships it; node doesn't unless polyfilled).\n if (typeof g.XMLHttpRequest === 'function') {\n const Xhr = g.XMLHttpRequest;\n this.originalXhrOpen = Xhr.prototype.open;\n this.originalXhrSend = Xhr.prototype.send;\n\n const buffer = this.buffer;\n\n // Stash method+url on the instance so `send` can record them.\n const origOpen = this.originalXhrOpen;\n Xhr.prototype.open = function (\n this: XMLHttpRequest & {\n __uiBridgeMethod?: string;\n __uiBridgeUrl?: string;\n },\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n this.__uiBridgeMethod = method.toUpperCase();\n this.__uiBridgeUrl = typeof url === 'string' ? url : String(url);\n // origOpen has overloaded signatures; we forward the original args.\n return (origOpen as (...args: unknown[]) => unknown).call(\n this,\n method,\n url,\n ...rest\n ) as void;\n } as typeof XMLHttpRequest.prototype.open;\n\n const origSend = this.originalXhrSend;\n Xhr.prototype.send = function (\n this: XMLHttpRequest & {\n __uiBridgeMethod?: string;\n __uiBridgeUrl?: string;\n },\n body?: Document | XMLHttpRequestBodyInit | null\n ) {\n const start = Date.now();\n const method = this.__uiBridgeMethod ?? 'GET';\n const url = this.__uiBridgeUrl ?? '';\n\n const finalize = (status: number, ok: boolean, error?: string) => {\n buffer.push({\n timestamp: start,\n method,\n url,\n status,\n durationMs: Date.now() - start,\n ok,\n error,\n });\n };\n\n const onLoadEnd = () => {\n this.removeEventListener('loadend', onLoadEnd);\n this.removeEventListener('error', onError);\n finalize(this.status, this.status >= 200 && this.status < 300);\n };\n const onError = () => {\n this.removeEventListener('loadend', onLoadEnd);\n this.removeEventListener('error', onError);\n finalize(0, false, 'XMLHttpRequest error');\n };\n\n this.addEventListener('loadend', onLoadEnd);\n this.addEventListener('error', onError);\n\n return (origSend as (...args: unknown[]) => unknown).call(\n this,\n body\n ) as void;\n } as typeof XMLHttpRequest.prototype.send;\n }\n\n this.installed = true;\n }\n\n uninstall(): void {\n if (!this.installed) return;\n const g = globalThis as PatchableGlobal;\n\n if (this.originalFetch) {\n g.fetch = this.originalFetch;\n this.originalFetch = undefined;\n }\n if (typeof g.XMLHttpRequest === 'function') {\n if (this.originalXhrOpen) {\n g.XMLHttpRequest.prototype.open = this.originalXhrOpen;\n }\n if (this.originalXhrSend) {\n g.XMLHttpRequest.prototype.send = this.originalXhrSend;\n }\n }\n this.originalXhrOpen = undefined;\n this.originalXhrSend = undefined;\n this.installed = false;\n }\n\n entries(opts: { since?: number; limit?: number } = {}): NetworkRequestEntry[] {\n return this.buffer.entries(opts);\n }\n\n size(): number {\n return this.buffer.size();\n }\n\n clear(): void {\n this.buffer.clear();\n }\n\n isInstalled(): boolean {\n return this.installed;\n }\n}\n","/**\n * WebSocket JSON-RPC message types for the UI Bridge protocol.\n */\n\n// ── Client → Server ─────────────────────────────────────────────────────────\n\n/** Standard JSON-RPC request */\nexport interface JsonRpcRequest {\n id: number | string;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/** Batch request — execute multiple requests concurrently */\nexport interface JsonRpcBatchRequest {\n id: number | string;\n batch: JsonRpcRequest[];\n}\n\n/** Subscribe to registry events */\nexport interface JsonRpcSubscribe {\n id: number | string;\n method: 'subscribe';\n params: {\n events: string[];\n /** Optional throttle in ms — batch rapid events within this window */\n throttleMs?: number;\n };\n}\n\n/** Unsubscribe from registry events */\nexport interface JsonRpcUnsubscribe {\n id: number | string;\n method: 'unsubscribe';\n params: { events: string[] };\n}\n\n/** Any client message */\nexport type JsonRpcClientMessage =\n | JsonRpcRequest\n | JsonRpcBatchRequest\n | JsonRpcSubscribe\n | JsonRpcUnsubscribe;\n\n// ── Server → Client ─────────────────────────────────────────────────────────\n\n/** Standard JSON-RPC response */\nexport interface JsonRpcResponse {\n id: number | string;\n result?: {\n success: boolean;\n data?: unknown;\n error?: string;\n code?: string;\n timestamp?: number;\n };\n}\n\n/** Batch response */\nexport interface JsonRpcBatchResponse {\n id: number | string;\n results: JsonRpcResponse[];\n}\n\n/** Server-pushed event (no id — not a response to a request) */\nexport interface JsonRpcEvent {\n event: string;\n data: unknown;\n timestamp: number;\n}\n\n/** Any server message */\nexport type JsonRpcServerMessage = JsonRpcResponse | JsonRpcBatchResponse | JsonRpcEvent;\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Check if a message is a batch request */\nexport function isBatchRequest(msg: unknown): msg is JsonRpcBatchRequest {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'batch' in msg &&\n Array.isArray((msg as JsonRpcBatchRequest).batch)\n );\n}\n\n/** Check if a message is a subscribe request */\nexport function isSubscribe(msg: unknown): msg is JsonRpcSubscribe {\n return (\n typeof msg === 'object' && msg !== null && (msg as JsonRpcSubscribe).method === 'subscribe'\n );\n}\n\n/** Check if a message is an unsubscribe request */\nexport function isUnsubscribe(msg: unknown): msg is JsonRpcUnsubscribe {\n return (\n typeof msg === 'object' && msg !== null && (msg as JsonRpcUnsubscribe).method === 'unsubscribe'\n );\n}\n","/**\n * UI Bridge Native HTTP Server\n *\n * Abstract HTTP server implementation for React Native.\n * This provides a framework-agnostic server interface that can be\n * implemented using various React Native HTTP server libraries.\n *\n * Supported libraries:\n * - react-native-http-bridge (recommended)\n * - @aspect/react-native-http-server\n * - Custom implementations\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { NativeActionExecutor, PageNavigationResponse } from '../control/types';\nimport type {\n NativeServerConfig,\n NativeServerHandlers,\n NavigationProvider,\n RouteProvider,\n ScreenshotProvider,\n APIResponse,\n HandlerContext,\n} from './types';\nimport type { BridgeEvent } from '../core/types';\nimport { createServerHandlers } from './handlers';\nimport { ConsoleErrorBuffer, NetworkRequestBuffer } from './observability';\nimport type { WebSocketEventBridge } from './ws-event-bridge';\nimport type { JsonRpcRequest, JsonRpcResponse } from './ws-types';\nimport { isBatchRequest, isSubscribe, isUnsubscribe } from './ws-types';\n\n// ── Path pattern matching ───────────────────────────────────────────────────\n\n/**\n * Match an actual path against a pattern with :name placeholders.\n * Returns extracted params, or null if the pattern does not match.\n *\n * Example: parsePath('control/element/:id/action', 'control/element/tab-runs/action')\n * → { id: 'tab-runs' }\n */\nfunction parsePath(pattern: string, actual: string): Record<string, string> | null {\n const patternParts = pattern.split('/');\n const actualParts = actual.split('/');\n\n if (patternParts.length !== actualParts.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(':')) {\n params[patternParts[i].slice(1)] = actualParts[i];\n } else if (patternParts[i] !== actualParts[i]) {\n return null;\n }\n }\n return params;\n}\n\n// ── WebSocket route table ───────────────────────────────────────────────────\n\n/**\n * Route table for WebSocket JSON-RPC methods.\n *\n * Method strings use the same path structure as HTTP routes (with :id placeholders)\n * but without the /ui-bridge/ prefix. Path params are extracted automatically.\n *\n * Examples:\n * \"health\" → handlers.health\n * \"control/snapshot\" → handlers.getSnapshot\n * \"control/element/tab-runs/action\" → handlers.executeAction ({id: 'tab-runs'})\n * \"control/component/my-comp/action/submit\" → handlers.executeComponentAction\n */\ntype HandlerKey = keyof NativeServerHandlers;\ntype HttpVerb = 'GET' | 'POST' | 'DELETE';\n\ninterface WsRoute {\n pattern: string;\n handler: HandlerKey;\n /**\n * HTTP verbs this route accepts when invoked over HTTP. When absent the\n * route is WS-only (or matches any verb on HTTP). Multiple verbs allow\n * a single pattern to serve GET+POST etc.\n */\n httpMethods?: readonly HttpVerb[];\n /**\n * When true, the route is only mounted (HTTP + WS + manifest) when the\n * server config opts in via `testHooks`. Production builds default to\n * `testHooks: false` so these endpoints simply don't exist in the route\n * table — agents probing `/_routes` won't see them.\n */\n requiresTestHooks?: boolean;\n}\n\nconst WS_ROUTES: readonly WsRoute[] = [\n // Health\n { pattern: 'health', handler: 'health', httpMethods: ['GET'] },\n\n // Elements\n { pattern: 'control/elements', handler: 'getElements', httpMethods: ['GET'] },\n // Flat alias — matches the runner UI Bridge's `/ui-bridge/elements` path so\n // agents can use the same URL across runner + mobile without remembering\n // the `control/` prefix. Delegates to the same handler.\n { pattern: 'elements', handler: 'getElements', httpMethods: ['GET'] },\n { pattern: 'control/element/:id', handler: 'getElement', httpMethods: ['GET'] },\n { pattern: 'control/element/:id/state', handler: 'getElementState', httpMethods: ['GET'] },\n { pattern: 'control/element/:id/action', handler: 'executeAction', httpMethods: ['POST'] },\n\n // Components\n { pattern: 'control/components', handler: 'getComponents', httpMethods: ['GET'] },\n { pattern: 'control/component/:id', handler: 'getComponent', httpMethods: ['GET'] },\n {\n pattern: 'control/component/:id/action/:actionId',\n handler: 'executeComponentAction',\n httpMethods: ['POST'],\n },\n\n // Discovery\n { pattern: 'control/find', handler: 'find', httpMethods: ['POST'] },\n // Runner-parity alias for `control/find`; the runner exposes its\n // AI-powered element search at `/ui-bridge/ai/find`, so mobile mounts the\n // same handler at both paths to keep agents portable across platforms.\n { pattern: 'ai/find', handler: 'find', httpMethods: ['POST'] },\n { pattern: 'control/snapshot', handler: 'getSnapshot', httpMethods: ['GET'] },\n { pattern: 'control/discover', handler: 'getSnapshot' },\n\n // Workflows\n { pattern: 'control/workflows', handler: 'getWorkflows', httpMethods: ['GET'] },\n { pattern: 'control/workflow/:id/run', handler: 'runWorkflow', httpMethods: ['POST'] },\n\n // Page Navigation\n { pattern: 'control/page/refresh', handler: 'pageRefresh', httpMethods: ['POST'] },\n { pattern: 'control/page/navigate', handler: 'pageNavigate', httpMethods: ['POST'] },\n { pattern: 'control/page/replace', handler: 'pageReplace', httpMethods: ['POST'] },\n { pattern: 'control/page/back', handler: 'pageGoBack', httpMethods: ['POST'] },\n { pattern: 'control/page/forward', handler: 'pageGoForward', httpMethods: ['POST'] },\n\n // Screenshot — accepts both GET and POST on HTTP\n { pattern: 'control/screenshot', handler: 'getScreenshot', httpMethods: ['GET', 'POST'] },\n\n // Design Review\n { pattern: 'design/element/:id/styles', handler: 'getElementStyles', httpMethods: ['GET'] },\n {\n pattern: 'design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n httpMethods: ['POST'],\n },\n { pattern: 'design/snapshot', handler: 'getDesignSnapshot', httpMethods: ['POST'] },\n { pattern: 'design/responsive', handler: 'getResponsiveSnapshots', httpMethods: ['POST'] },\n { pattern: 'design/audit', handler: 'runDesignAudit', httpMethods: ['POST'] },\n { pattern: 'design/style-guide/load', handler: 'loadStyleGuide', httpMethods: ['POST'] },\n { pattern: 'design/style-guide', handler: 'getStyleGuide', httpMethods: ['GET'] },\n // style-guide/clear: WS uses this pattern; HTTP uses DELETE on /design/style-guide.\n // We keep a WS-only entry for the explicit \"clear\" subpath, and add a DELETE-on-style-guide entry.\n { pattern: 'design/style-guide/clear', handler: 'clearStyleGuide' },\n { pattern: 'design/style-guide', handler: 'clearStyleGuide', httpMethods: ['DELETE'] },\n\n // Quality Evaluation\n { pattern: 'design/evaluate', handler: 'evaluateQuality', httpMethods: ['POST'] },\n { pattern: 'design/evaluate/contexts', handler: 'getQualityContexts', httpMethods: ['GET'] },\n { pattern: 'design/evaluate/baseline', handler: 'saveBaseline', httpMethods: ['POST'] },\n { pattern: 'design/evaluate/diff', handler: 'diffBaseline', httpMethods: ['POST'] },\n\n // Meta / Introspection\n { pattern: 'meta/methods', handler: 'getMethods', httpMethods: ['GET'] },\n\n // AI helpers — mobile parity with the runner's `/ui-bridge/ai/*` family.\n { pattern: 'ai/fill-form', handler: 'fillForm', httpMethods: ['POST'] },\n\n // Coord-based tap — synthesizes a press at the given screen coords by\n // matching against registered elements' layout rects.\n { pattern: 'control/tap', handler: 'tapAt', httpMethods: ['POST'] },\n\n // Test hooks — gated behind `features.testHooks`. Let external runners\n // drive the ModalDetector over HTTP so tests can flip `snapshot.modalStack`\n // without mounting React components.\n {\n pattern: 'control/modal/push',\n handler: 'pushModal',\n httpMethods: ['POST'],\n requiresTestHooks: true,\n },\n {\n pattern: 'control/modal/dismiss/:id',\n handler: 'dismissModal',\n httpMethods: ['POST'],\n requiresTestHooks: true,\n },\n\n // Observability — last-N console errors + network requests. testHooks-gated\n // because patching `console.error` / `fetch` is invasive in production.\n {\n pattern: 'control/console-errors',\n handler: 'getConsoleErrors',\n httpMethods: ['GET'],\n requiresTestHooks: true,\n },\n {\n pattern: 'sdk/network-requests',\n handler: 'getNetworkRequests',\n httpMethods: ['GET'],\n requiresTestHooks: true,\n },\n];\n\n// ── _help payload ───────────────────────────────────────────────────────────\n\n/**\n * Short description keyed by handler name — rendered alongside the route\n * list so `_help` is self-documenting. Only needs to cover handlers that\n * appear in WS_ROUTES.\n */\nconst HANDLER_DESCRIPTIONS: Record<string, string> = {\n health: 'Liveness probe; returns app metadata + element count',\n getElements: 'Flat list of registered UI elements',\n getElement: 'Single element by id',\n getElementState: 'Dynamic state (value, focused, checked) for one element',\n executeAction: 'Run an action on an element (see \"actions\" below for names)',\n getComponents: 'Higher-level components with action schemas',\n getComponent: 'Component detail + per-action paramSchema',\n executeComponentAction: 'Invoke a component action directly (preferred over button clicks)',\n find: 'AI-powered element search by natural-language query',\n getSnapshot:\n 'Full snapshot: elements + route + state. Supports ?visibleOnly=true and ?currentRouteOnly=true',\n getWorkflows: 'List registered workflows',\n runWorkflow: 'Trigger a workflow by id',\n pageRefresh: 'Reload the current route',\n pageNavigate: 'Imperative router.push(url) — preferred over tapping tab buttons',\n pageReplace: 'router.replace(url)',\n pageGoBack: 'router.back()',\n pageGoForward: 'router.forward()',\n getScreenshot: 'PNG screenshot of the current screen',\n getElementStyles: 'Computed styles for an element (design review)',\n getElementStateStyles: 'Computed styles per interaction state (hover/focus/disabled)',\n getDesignSnapshot: 'Visual + style snapshot for design review',\n getResponsiveSnapshots: 'Screenshots at multiple viewport widths',\n runDesignAudit: 'Accessibility + visual audit',\n loadStyleGuide: 'Load a design system style guide',\n getStyleGuide: 'Fetch the currently loaded style guide',\n clearStyleGuide: 'Unload the style guide',\n evaluateQuality: 'Score the current UI against a quality context',\n getQualityContexts: 'List available quality evaluation contexts',\n saveBaseline: 'Save a quality baseline snapshot',\n diffBaseline: 'Diff current UI against a saved baseline',\n getMethods: 'List every handler name (legacy introspection)',\n fillForm:\n 'Fill multiple inputs in one call: body { fields: [{elementId, value}] } — each field dispatches `type` + `clear:true`',\n tapAt:\n 'Synthesize a press at given screen coords by matching registered element layout rects: body { x, y, action? }',\n getConsoleErrors:\n 'TEST HOOK — last-N console.error/console.warn entries; ?since=<ms>&limit=<n>',\n getNetworkRequests:\n 'TEST HOOK — last-N fetch/XHR entries with status + duration; ?since=<ms>&limit=<n>',\n pushModal:\n 'TEST HOOK — push a modal onto the snapshot.modalStack via the registry ModalDetector',\n dismissModal:\n 'TEST HOOK — dismiss a modal by id from the snapshot.modalStack via the registry ModalDetector',\n};\n\n/** Static reference for common action names + their params. */\nconst ACTION_REFERENCE = [\n { name: 'press', aliases: ['click'], params: 'PressActionParams (optional position)' },\n { name: 'longPress', params: 'PressActionParams (optional position)' },\n { name: 'doubleTap', params: 'none' },\n {\n name: 'type',\n params:\n 'TypeActionParams { text, delay?, clear? | clearFirst? } — `clear:true` replaces content atomically',\n },\n { name: 'clear', params: 'none — empties the input' },\n { name: 'focus', params: 'none' },\n { name: 'blur', params: 'none' },\n { name: 'scroll', params: 'ScrollActionParams { offset? {x,y}, to? }' },\n { name: 'swipe', params: 'SwipeActionParams { direction, distance }' },\n { name: 'toggle', params: 'none — flips boolean controls' },\n];\n\n/**\n * Minimal `{method, path}` list matching the runner's `/_routes` shape so\n * the same URL works across platforms. Expanded multi-verb routes into one\n * entry per verb. `testHooks` enables the gated `control/modal/*` endpoints.\n */\nfunction buildRoutesPayload(testHooks: boolean) {\n const entries: Array<{ method: string; path: string }> = [];\n for (const r of WS_ROUTES) {\n if (!r.httpMethods) continue;\n if (r.requiresTestHooks && !testHooks) continue;\n for (const m of r.httpMethods) {\n entries.push({ method: m, path: `/ui-bridge/${r.pattern}` });\n }\n }\n // Expose the two discovery endpoints themselves so self-reference is clean.\n entries.push({ method: 'GET', path: '/ui-bridge/_help' });\n entries.push({ method: 'GET', path: '/ui-bridge/_routes' });\n entries.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));\n return { routes: entries, count: entries.length };\n}\n\n/**\n * Build the `/_help` payload: route index + action reference.\n * Cheap to compute; we don't cache since it's rarely called.\n * Routes that require `testHooks` are filtered out when the flag is off so\n * agents probing the manifest never see endpoints they can't call.\n */\nfunction buildHelpPayload(testHooks: boolean) {\n return {\n version: 1,\n description: 'UI Bridge Native HTTP surface. Prefix every path with /ui-bridge/.',\n routes: WS_ROUTES.filter((r) => !r.requiresTestHooks || testHooks).map((r) => ({\n pattern: r.pattern,\n httpMethods: r.httpMethods ?? [],\n wsOnly: !r.httpMethods,\n handler: r.handler,\n description: HANDLER_DESCRIPTIONS[r.handler] ?? '',\n })),\n actions: ACTION_REFERENCE,\n tips: [\n 'Start with `GET /ui-bridge/control/snapshot?visibleOnly=true` to see what the user actually sees.',\n 'Prefer `control/component/:id/action/:actionId` over button presses — typed paramSchema, no button-id guessing.',\n 'Use `pageNavigate` for tab switches instead of pressing tab buttons; gesture state often swallows clicks.',\n 'The `type` action supports `clear:true` to replace existing text atomically in one call.',\n ],\n };\n}\n\n/**\n * HTTP Request interface (library-agnostic)\n */\nexport interface HTTPRequest {\n method: string;\n path: string;\n headers: Record<string, string>;\n query: Record<string, string>;\n body?: unknown;\n}\n\n/**\n * HTTP Response interface (library-agnostic)\n */\nexport interface HTTPResponse {\n status: number;\n headers: Record<string, string>;\n body: string;\n}\n\n/**\n * Request handler type\n */\nexport type RequestHandler = (request: HTTPRequest) => Promise<HTTPResponse>;\n\n/**\n * Server adapter interface\n *\n * Implement this interface to integrate with your chosen HTTP server library.\n */\nexport interface ServerAdapter {\n /** Start the server */\n start(port: number, handler: RequestHandler): Promise<void>;\n /** Stop the server */\n stop(): Promise<void>;\n /** Check if server is running */\n isRunning(): boolean;\n}\n\n/**\n * WebSocket-aware server adapter interface.\n *\n * Extends ServerAdapter with callbacks for WebSocket connections.\n * The adapter manages the raw TCP/WS layer; these callbacks let the\n * UI Bridge server handle message routing and event broadcasting.\n */\nexport interface WebSocketServerAdapter extends ServerAdapter {\n /** Called when a JSON text frame is received from a WS client. Returns response string or null. */\n onWebSocketMessage?: (connId: string, message: string) => Promise<string | null>;\n /** Called when a new WS connection is established after the HTTP 101 upgrade. */\n onWebSocketConnect?: (connId: string) => void;\n /** Called when a WS connection is closed or drops. */\n onWebSocketDisconnect?: (connId: string) => void;\n /** Send a message to a specific WS connection by ID. */\n sendToConnection?: (connId: string, message: string) => void;\n /** Send a message to all connected WS clients. */\n broadcast?: (message: string) => void;\n}\n\n/**\n * Native UI Bridge HTTP Server\n */\nexport class NativeUIBridgeServer {\n private config: NativeServerConfig;\n private handlers: NativeServerHandlers;\n private adapter?: ServerAdapter;\n private running = false;\n /**\n * Per-connection cleanup thunks for in-flight waiters (waitForElement,\n * waitForCondition, ...). Aborted when a client disconnects so the\n * underlying timers/listeners don't leak.\n */\n private pendingWaiters = new Map<string, Set<() => void>>();\n\n /**\n * Observability ring buffers backing `/control/console-errors` and\n * `/sdk/network-requests`. Allocated unconditionally so the handler can\n * always read them, but the global patches (`install()`) only fire on\n * `start()` when `testHooks` is set — production builds don't monkey-patch.\n */\n private consoleErrorBuffer: ConsoleErrorBuffer;\n private networkRequestBuffer: NetworkRequestBuffer;\n\n constructor(\n private registry: NativeUIBridgeRegistry,\n private executor: NativeActionExecutor,\n config: NativeServerConfig = {}\n ) {\n this.config = {\n serverPort: 8087,\n cors: true,\n ...config,\n };\n this.consoleErrorBuffer = new ConsoleErrorBuffer();\n this.networkRequestBuffer = new NetworkRequestBuffer();\n // Mirror appInfo into the registry so `createSnapshot` includes it\n // automatically — keeps the default `getSnapshot` handler and any other\n // call site (e.g. context.createSnapshot, cloud-relay tunnels) on the\n // same code path without each having to thread `appInfo` through.\n if (this.config.appInfo) {\n this.registry.setAppInfo(this.config.appInfo);\n }\n this.handlers = createServerHandlers(registry, executor, {\n appInfo: this.config.appInfo,\n consoleErrorBuffer: this.consoleErrorBuffer,\n networkRequestBuffer: this.networkRequestBuffer,\n });\n\n // Set up method introspection from the route table\n this.handlers.getMethods = async () => {\n const testHooks = this.config.testHooks === true;\n const methods = WS_ROUTES.filter((r) => !r.requiresTestHooks || testHooks).map((r) => ({\n method: r.pattern,\n httpMethods: r.httpMethods ? [...r.httpMethods] : undefined,\n }));\n // Add special WebSocket-only methods not in the route table\n const wsMethods = [\n { method: 'waitForElement', description: 'Wait for an element to be registered' },\n { method: 'waitForCondition', description: 'Wait for an element state predicate' },\n { method: 'sequence', description: 'Execute a sequence of steps in order' },\n { method: 'events/history', description: 'Replay recent registry events' },\n { method: 'subscriptions/list', description: 'List current event subscriptions' },\n ];\n return {\n success: true,\n data: { methods: [...methods, ...wsMethods] },\n timestamp: Date.now(),\n };\n };\n }\n\n /**\n * Set the server adapter\n */\n setAdapter(adapter: ServerAdapter): void {\n this.adapter = adapter;\n }\n\n /**\n * Set a navigation provider for programmatic route navigation.\n * This enables `control/page/navigate` and `control/page/back` on native.\n */\n setNavigationProvider(provider: NavigationProvider): void {\n this.handlers.pageNavigate = async (ctx): Promise<APIResponse<PageNavigationResponse>> => {\n const body = ctx.body as Record<string, unknown> | undefined;\n const url = body?.url;\n if (!url || typeof url !== 'string') {\n return { success: false, error: 'Missing required \"url\" parameter', timestamp: Date.now() };\n }\n try {\n provider.navigate(url);\n return {\n success: true,\n data: { success: true, url, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: unknown) {\n return {\n success: false,\n error: `Navigation failed: ${e instanceof Error ? e.message : String(e)}`,\n timestamp: Date.now(),\n };\n }\n };\n\n this.handlers.pageReplace = async (ctx): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.replace) {\n return {\n success: false,\n error: 'Replace navigation not supported by navigation provider',\n timestamp: Date.now(),\n };\n }\n const body = ctx.body as Record<string, unknown> | undefined;\n const url = body?.url;\n if (!url || typeof url !== 'string') {\n return { success: false, error: 'Missing required \"url\" parameter', timestamp: Date.now() };\n }\n try {\n provider.replace(url);\n return {\n success: true,\n data: { success: true, url, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: unknown) {\n return {\n success: false,\n error: `Replace navigation failed: ${e instanceof Error ? e.message : String(e)}`,\n timestamp: Date.now(),\n };\n }\n };\n\n this.handlers.pageGoBack = async (): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.back) {\n return { success: false, error: 'Back navigation not supported', timestamp: Date.now() };\n }\n try {\n provider.back();\n return {\n success: true,\n data: { success: true, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: unknown) {\n return {\n success: false,\n error: `Back navigation failed: ${e instanceof Error ? e.message : String(e)}`,\n timestamp: Date.now(),\n };\n }\n };\n\n this.handlers.pageRefresh = async (): Promise<APIResponse<PageNavigationResponse>> => {\n if (!provider.refresh) {\n return {\n success: false,\n error: 'Page refresh not supported by navigation provider',\n timestamp: Date.now(),\n };\n }\n try {\n provider.refresh();\n return {\n success: true,\n data: { success: true, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n } catch (e: unknown) {\n return {\n success: false,\n error: `Refresh failed: ${e instanceof Error ? e.message : String(e)}`,\n timestamp: Date.now(),\n };\n }\n };\n }\n\n /**\n * Set a route provider for reporting the current navigation route.\n * When set, `control/snapshot` responses include `currentRoute` and `segments`.\n *\n * Also forwards the provider into the registry so the *default*\n * `getSnapshot` handler (and any other call site of\n * `registry.createSnapshot`) reads the route too — without this the\n * cloud-relay/bare-server path returned `currentRoute: null` even when\n * a `RouteTracker` was wired, because that path never installed the\n * server-level handler override below.\n */\n setRouteProvider(provider: RouteProvider): void {\n this.registry.setRouteProvider(provider);\n // Override getElements to support currentRouteOnly filtering with real route data\n const baseGetElements = this.handlers.getElements;\n this.handlers.getElements = async (ctx: HandlerContext) => {\n const currentRouteOnly =\n ctx.query?.currentRouteOnly === 'true' ||\n (ctx.body as Record<string, unknown>)?.currentRouteOnly === true;\n\n // If currentRouteOnly requested and no explicit route param, inject the current route\n if (currentRouteOnly && !ctx.query?.route && !(ctx.body as Record<string, unknown>)?.route) {\n const currentRoute = provider.getCurrentRoute();\n if (currentRoute) {\n // Inject route into query so the base handler can filter by it\n ctx.query = { ...ctx.query, route: currentRoute };\n }\n }\n return baseGetElements(ctx);\n };\n\n this.handlers.getSnapshot = async (ctx: HandlerContext) => {\n const visibleOnly =\n ctx?.query?.visibleOnly === 'true' ||\n (ctx?.body as Record<string, unknown>)?.visibleOnly === true;\n const currentRouteOnly =\n ctx?.query?.currentRouteOnly === 'true' ||\n (ctx?.body as Record<string, unknown>)?.currentRouteOnly === true;\n const snapshot = this.registry.createSnapshot(\n {\n currentRoute: provider.getCurrentRoute(),\n segments: provider.getSegments?.(),\n },\n { visibleOnly, currentRouteOnly }\n );\n return { success: true, data: snapshot, timestamp: Date.now() };\n };\n }\n\n /**\n * Set a screenshot provider for native screen capture.\n * This enables `control/screenshot` on native.\n */\n setScreenshotProvider(provider: ScreenshotProvider): void {\n const SCREENSHOT_TIMEOUT_MS = 10_000;\n this.handlers.getScreenshot = async () => {\n try {\n const result = await Promise.race([\n provider.capture(),\n new Promise<never>((_, reject) =>\n setTimeout(\n () =>\n reject(new Error(`Screenshot capture timed out after ${SCREENSHOT_TIMEOUT_MS}ms`)),\n SCREENSHOT_TIMEOUT_MS\n )\n ),\n ]);\n return {\n success: true,\n data: { screenshot: result.base64, width: result.width, height: result.height },\n timestamp: Date.now(),\n };\n } catch (e: unknown) {\n return {\n success: false,\n error: `Screenshot capture failed: ${e instanceof Error ? e.message : String(e)}`,\n timestamp: Date.now(),\n };\n }\n };\n }\n\n /**\n * Start the HTTP server\n */\n async start(): Promise<void> {\n if (this.running) {\n console.warn('[ui-bridge-native] Server already running');\n return;\n }\n\n if (!this.adapter) {\n console.warn('[ui-bridge-native] No server adapter configured. Call setAdapter() first.');\n console.warn('[ui-bridge-native] See documentation for supported adapters.');\n return;\n }\n\n // Install observability patches before binding the port — gated behind\n // `testHooks` so production builds don't monkey-patch console/fetch.\n if (this.config.testHooks === true) {\n this.consoleErrorBuffer.install();\n this.networkRequestBuffer.install();\n }\n\n await this.adapter.start(this.config.serverPort!, this.handleRequest.bind(this));\n this.running = true;\n\n console.log(`[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`);\n }\n\n /**\n * Stop the HTTP server\n */\n async stop(): Promise<void> {\n if (!this.running || !this.adapter) {\n return;\n }\n\n await this.adapter.stop();\n this.running = false;\n\n // Restore the original globals; idempotent if never installed.\n this.consoleErrorBuffer.uninstall();\n this.networkRequestBuffer.uninstall();\n\n console.log('[ui-bridge-native] HTTP server stopped');\n }\n\n /**\n * Check if server is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n // ── WebSocket Support ───────────────────────────────────────────────────\n\n private eventBridge?: WebSocketEventBridge;\n\n /**\n * Set the event bridge for WebSocket event broadcasting and subscriptions.\n */\n setEventBridge(bridge: WebSocketEventBridge): void {\n this.eventBridge = bridge;\n }\n\n /**\n * Handle a JSON-RPC message from a WebSocket client.\n * Parses the message, routes to the appropriate handler, and returns\n * a JSON string response (or null for events that need no response).\n */\n async handleWebSocketMessage(connId: string, rawMessage: string): Promise<string | null> {\n let msg: unknown;\n try {\n msg = JSON.parse(rawMessage);\n } catch {\n return JSON.stringify({\n error: 'Invalid JSON',\n timestamp: Date.now(),\n });\n }\n\n if (typeof msg !== 'object' || msg === null) {\n return JSON.stringify({\n error: 'Message must be a JSON object',\n timestamp: Date.now(),\n });\n }\n\n const message = msg as Record<string, unknown>;\n const id = (message.id as string | number | undefined) ?? 0;\n\n // Handle batch requests\n if (isBatchRequest(message)) {\n const results = await this.handleBatchRequest(message.batch);\n return JSON.stringify({ id, results });\n }\n\n // Handle subscribe\n if (isSubscribe(message)) {\n const events = message.params?.events || [];\n const throttleMs = message.params?.throttleMs;\n const ok = this.eventBridge?.handleSubscribe(connId, events, throttleMs) ?? false;\n return JSON.stringify({\n id,\n result: {\n success: ok,\n data: { subscribed: events },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Handle unsubscribe\n if (isUnsubscribe(message)) {\n const events = message.params?.events || [];\n const ok = this.eventBridge?.handleUnsubscribe(connId, events) ?? false;\n return JSON.stringify({\n id,\n result: {\n success: ok,\n data: { unsubscribed: events },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const method = message.method as string;\n const params = (message.params || {}) as Record<string, unknown>;\n\n // ── Connection-aware special methods ──────────────────────────────────\n\n // subscriptions/list — return current subscriptions + throttle for this connection\n if (method === 'subscriptions/list') {\n const events = this.eventBridge?.getSubscriptions(connId) ?? [];\n const throttleMs = this.eventBridge?.getThrottleMs(connId);\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: { events, throttleMs: throttleMs ?? null },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // waitForElement — resolve when element is registered, or timeout\n if (method === 'waitForElement') {\n return this.handleWaitForElement(connId, id, params);\n }\n\n // waitForCondition — resolve when an element state predicate becomes true\n if (method === 'waitForCondition') {\n return this.handleWaitForCondition(connId, id, params);\n }\n\n // sequence — execute steps in order, stop on first failure\n if (method === 'sequence') {\n return this.handleSequence(id, params);\n }\n\n // events/history — replay recent events matching optional filter\n if (method === 'events/history') {\n const eventsFilter = Array.isArray(params.events) ? (params.events as string[]) : undefined;\n const since = typeof params.since === 'number' ? params.since : undefined;\n const limit = typeof params.limit === 'number' ? params.limit : undefined;\n const history = this.eventBridge?.getHistory({ events: eventsFilter, since }) ?? [];\n const sliced =\n limit !== undefined && limit > 0 && history.length > limit\n ? history.slice(history.length - limit)\n : history;\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: { events: sliced },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Standard JSON-RPC request\n\n if (!method) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing \"method\" field',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n try {\n const apiResponse = await this.routeMethodToHandler(method, params);\n return JSON.stringify({ id, result: apiResponse } satisfies JsonRpcResponse);\n } catch (error) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: error instanceof Error ? error.message : 'Internal error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n }\n\n /**\n * Execute a batch of JSON-RPC requests concurrently.\n */\n async handleBatchRequest(batch: JsonRpcRequest[]): Promise<JsonRpcResponse[]> {\n return Promise.all(\n batch.map(async (req) => {\n try {\n const result = await this.routeMethodToHandler(\n req.method,\n (req.params || {}) as Record<string, unknown>\n );\n return { id: req.id, result } as JsonRpcResponse;\n } catch (error) {\n return {\n id: req.id,\n result: {\n success: false,\n error: error instanceof Error ? error.message : 'Internal error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse;\n }\n })\n );\n }\n\n /**\n * Register an in-flight waiter's cleanup thunk under the given connection.\n * Returns an `unregister` thunk that the natural-resolution path should\n * call so the cleanup isn't re-invoked on disconnect.\n */\n private registerWaiter(connId: string, cleanup: () => void): () => void {\n let set = this.pendingWaiters.get(connId);\n if (!set) {\n set = new Set();\n this.pendingWaiters.set(connId, set);\n }\n set.add(cleanup);\n return () => {\n const s = this.pendingWaiters.get(connId);\n if (!s) return;\n s.delete(cleanup);\n if (s.size === 0) this.pendingWaiters.delete(connId);\n };\n }\n\n /**\n * Abort all pending waiters associated with a connection. Called by the\n * provider's WS disconnect handler so timers/listeners don't leak after\n * the client goes away.\n */\n abortWaitersForConnection(connId: string): void {\n const set = this.pendingWaiters.get(connId);\n if (!set) return;\n for (const cleanup of set) {\n try {\n cleanup();\n } catch (err) {\n console.warn('[ui-bridge-native] waiter cleanup threw:', err);\n }\n }\n this.pendingWaiters.delete(connId);\n }\n\n /**\n * Wait for an element to be registered, or resolve immediately if it already exists.\n * Returns a JsonRpcResponse JSON string.\n */\n private async handleWaitForElement(\n connId: string,\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const targetId = params.id;\n const timeout = typeof params.timeout === 'number' ? params.timeout : 10000;\n\n if (!targetId || typeof targetId !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"id\" parameter',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Already registered — return immediately\n const existing = this.registry.getElement(targetId);\n if (existing) {\n return JSON.stringify({\n id,\n result: {\n success: true,\n data: {\n id: targetId,\n state: existing.getState(),\n identifier: existing.getIdentifier(),\n waited: false,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n // Wait for element:registered event with matching id, or timeout\n return new Promise<string>((resolve) => {\n let settled = false;\n let unsub: (() => void) | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let unregister: (() => void) | null = null;\n\n const cleanup = () => {\n if (settled) return;\n settled = true;\n if (unsub) {\n unsub();\n unsub = null;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (unregister) {\n unregister();\n unregister = null;\n }\n };\n\n // Track this waiter so it can be aborted if the connection closes.\n unregister = this.registerWaiter(connId, () => {\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Connection closed before element was registered',\n code: 'CONNECTION_CLOSED',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n unsub = this.registry.on('element:registered', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n\n cleanup();\n const el = this.registry.getElement(targetId);\n resolve(\n JSON.stringify({\n id,\n result: {\n success: true,\n data: {\n id: targetId,\n state: el?.getState() ?? null,\n identifier: el?.getIdentifier() ?? null,\n waited: true,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n timer = setTimeout(() => {\n if (settled) return;\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: `Timeout waiting for element: ${targetId}`,\n code: 'TIMEOUT',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n }, timeout);\n });\n }\n\n /**\n * Wait for an arbitrary element-state predicate to become true.\n *\n * Supported `condition` shapes:\n * {field: \"mounted\"|\"visible\"|\"enabled\"|\"focused\", equals: boolean}\n * {field: \"layout\", exists: true}\n * {field: string, equals: unknown} // generic: state[field] === equals\n *\n * Resolves immediately with `waited:false` if the predicate already\n * holds. Otherwise subscribes to `element:registered` and\n * `element:stateChanged` until the predicate matches or timeout fires.\n */\n private async handleWaitForCondition(\n connId: string,\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const targetId = params.elementId;\n const condition = params.condition as\n | { field?: string; equals?: unknown; exists?: boolean }\n | undefined;\n const timeout = typeof params.timeout === 'number' ? params.timeout : 10000;\n\n if (!targetId || typeof targetId !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"elementId\" parameter',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n if (!condition || typeof condition.field !== 'string') {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or invalid \"condition.field\"',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const evaluate = (state: Record<string, unknown> | null | undefined): boolean => {\n if (!state) return false;\n const value = state[condition.field as string];\n if (condition.exists === true) return value !== null && value !== undefined;\n if ('equals' in condition) return value === condition.equals;\n return false;\n };\n\n const makeResult = (state: Record<string, unknown> | null, waited: boolean) =>\n JSON.stringify({\n id,\n result: {\n success: true,\n data: { id: targetId, state, waited },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n\n // Fast path: already holds.\n const existing = this.registry.getElement(targetId);\n if (existing) {\n const state = existing.getState() as unknown as Record<string, unknown> | null;\n if (evaluate(state)) {\n return makeResult(state, false);\n }\n }\n\n return new Promise<string>((resolve) => {\n let settled = false;\n let unsubRegistered: (() => void) | null = null;\n let unsubStateChanged: (() => void) | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let unregister: (() => void) | null = null;\n\n const cleanup = () => {\n if (settled) return;\n settled = true;\n if (unsubRegistered) {\n unsubRegistered();\n unsubRegistered = null;\n }\n if (unsubStateChanged) {\n unsubStateChanged();\n unsubStateChanged = null;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (unregister) {\n unregister();\n unregister = null;\n }\n };\n\n unregister = this.registerWaiter(connId, () => {\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Connection closed before condition was met',\n code: 'CONNECTION_CLOSED',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n });\n\n const checkAndResolve = () => {\n if (settled) return;\n const el = this.registry.getElement(targetId);\n if (!el) return;\n const state = el.getState() as unknown as Record<string, unknown> | null;\n if (evaluate(state)) {\n cleanup();\n resolve(makeResult(state, true));\n }\n };\n\n unsubRegistered = this.registry.on('element:registered', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n checkAndResolve();\n });\n\n unsubStateChanged = this.registry.on('element:stateChanged', (event: BridgeEvent) => {\n if (settled) return;\n const data = event.data as { id?: string } | undefined;\n if (data?.id !== targetId) return;\n checkAndResolve();\n });\n\n timer = setTimeout(() => {\n if (settled) return;\n cleanup();\n resolve(\n JSON.stringify({\n id,\n result: {\n success: false,\n error: `Timeout waiting for condition on element: ${targetId}`,\n code: 'TIMEOUT',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse)\n );\n }, timeout);\n });\n }\n\n /**\n * Execute a sequence of JSON-RPC steps in order, stopping on first failure.\n * Returns a JsonRpcResponse JSON string with per-step results.\n */\n private async handleSequence(\n id: string | number,\n params: Record<string, unknown>\n ): Promise<string> {\n const rawSteps = params.steps;\n\n if (!Array.isArray(rawSteps) || rawSteps.length === 0) {\n return JSON.stringify({\n id,\n result: {\n success: false,\n error: 'Missing or empty \"steps\" array',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n const steps = rawSteps as Array<{ method: string; params?: Record<string, unknown> }>;\n const results: Array<{ step: number; method: string; result: APIResponse }> = [];\n let allSuccess = true;\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n\n if (!step || typeof step.method !== 'string') {\n results.push({\n step: i,\n method: String(step?.method ?? ''),\n result: {\n success: false,\n error: 'Step is missing \"method\" field',\n code: 'INVALID_REQUEST',\n timestamp: Date.now(),\n },\n });\n allSuccess = false;\n break;\n }\n\n try {\n const stepResult = await this.routeMethodToHandler(step.method, step.params ?? {});\n results.push({ step: i, method: step.method, result: stepResult });\n if (!stepResult.success) {\n allSuccess = false;\n break;\n }\n } catch (err) {\n results.push({\n step: i,\n method: step.method,\n result: {\n success: false,\n error: err instanceof Error ? err.message : 'Step execution failed',\n code: 'STEP_FAILED',\n timestamp: Date.now(),\n },\n });\n allSuccess = false;\n break;\n }\n }\n\n return JSON.stringify({\n id,\n result: {\n success: allSuccess,\n data: {\n completedSteps: results.length,\n totalSteps: steps.length,\n results,\n },\n timestamp: Date.now(),\n },\n } satisfies JsonRpcResponse);\n }\n\n /**\n * Route a JSON-RPC method string to the appropriate handler using path-style matching.\n *\n * Method strings mirror HTTP routes but without the /ui-bridge/ prefix.\n * Path params are extracted from :name placeholders in the route pattern.\n *\n * Examples:\n * \"health\" → handlers.health\n * \"control/snapshot\" → handlers.getSnapshot\n * \"control/element/tab-runs/action\" → handlers.executeAction ({id:'tab-runs'})\n * \"control/component/my-comp/action/submit\" → handlers.executeComponentAction\n */\n private async routeMethodToHandler(\n method: string,\n params: Record<string, unknown>\n ): Promise<APIResponse> {\n const testHooks = this.config.testHooks === true;\n for (const route of WS_ROUTES) {\n const pathParams = parsePath(route.pattern, method);\n if (!pathParams) continue;\n\n // Test-hook routes are invisible over WS too when the flag is off.\n if (route.requiresTestHooks && !testHooks) continue;\n\n const ctx: HandlerContext = {\n params: pathParams,\n query:\n params.query && typeof params.query === 'object'\n ? (params.query as Record<string, string>)\n : {},\n body: params,\n };\n\n return this.handlers[route.handler](ctx);\n }\n\n return {\n success: false,\n error: `Unknown method: ${method}`,\n code: 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n\n /**\n * Handle incoming HTTP request\n *\n * Exposed as public so that CloudRelayClient can call it directly (without\n * loopback TCP overhead) when processing tunneled requests.\n */\n async handleRequest(request: HTTPRequest): Promise<HTTPResponse> {\n // Add CORS headers if enabled\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.cors) {\n headers['Access-Control-Allow-Origin'] = this.config.allowedOrigins\n ? this.config.allowedOrigins.join(',')\n : '*';\n headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';\n headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization';\n }\n\n // Handle CORS preflight\n if (request.method === 'OPTIONS') {\n return { status: 204, headers, body: '' };\n }\n\n try {\n const response = await this.routeRequest(request);\n return {\n status: response.success ? 200 : 400,\n headers,\n body: JSON.stringify(response),\n };\n } catch (error) {\n const errorResponse: APIResponse = {\n success: false,\n error: error instanceof Error ? error.message : 'Internal server error',\n code: 'INTERNAL_ERROR',\n timestamp: Date.now(),\n };\n return {\n status: 500,\n headers,\n body: JSON.stringify(errorResponse),\n };\n }\n }\n\n /**\n * Route an HTTP request to the appropriate handler using WS_ROUTES.\n *\n * Strips the `/ui-bridge/` prefix from the path, then iterates the shared\n * WS_ROUTES table. Each route's `pattern` is matched against the stripped\n * path via the module-level `parsePath` helper; path params are merged\n * with the request body into a HandlerContext.\n *\n * `httpMethods` disambiguates routes that share a pattern but differ\n * by verb (e.g. GET vs DELETE on `design/style-guide`). A route without\n * `httpMethods` is WS-only and will not be matched on HTTP.\n */\n private async routeRequest(request: HTTPRequest): Promise<APIResponse> {\n const { method, path, query, body } = request;\n\n const PREFIX = '/ui-bridge/';\n if (!path.startsWith(PREFIX)) {\n return {\n success: false,\n error: `Route not found: ${method} ${path}`,\n code: 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n\n const stripped = path.slice(PREFIX.length);\n\n // Discoverability:\n // - `_help` (rich) — routes + action reference + tips\n // - `_routes` (minimal) — runner-compatible shape for parity\n // Lets agents fetch a single URL on either runner or mobile to see what\n // they can do without reading docs.\n const testHooks = this.config.testHooks === true;\n\n if (method === 'GET' && stripped === '_help') {\n return {\n success: true,\n data: buildHelpPayload(testHooks),\n timestamp: Date.now(),\n };\n }\n if (method === 'GET' && stripped === '_routes') {\n return {\n success: true,\n data: buildRoutesPayload(testHooks),\n timestamp: Date.now(),\n };\n }\n\n let patternMatchedButWrongVerb = false;\n\n for (const route of WS_ROUTES) {\n const pathParams = parsePath(route.pattern, stripped);\n if (!pathParams) continue;\n\n // Pattern matches — now filter on HTTP verb.\n if (!route.httpMethods) {\n // WS-only route; don't serve on HTTP.\n continue;\n }\n // Route gated by `testHooks`: behave as if it isn't registered when\n // the flag is off so production builds get a vanilla NOT_FOUND.\n if (route.requiresTestHooks && !testHooks) {\n continue;\n }\n if (!route.httpMethods.includes(method as HttpVerb)) {\n patternMatchedButWrongVerb = true;\n continue;\n }\n\n const ctx: HandlerContext = { params: pathParams, query, body };\n return this.handlers[route.handler](ctx);\n }\n\n return {\n success: false,\n error: patternMatchedButWrongVerb\n ? `Method not allowed: ${method} ${path}`\n : `Route not found: ${method} ${path}`,\n code: patternMatchedButWrongVerb ? 'METHOD_NOT_ALLOWED' : 'NOT_FOUND',\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Create a UI Bridge Native server\n */\nexport function createNativeServer(\n registry: NativeUIBridgeRegistry,\n executor: NativeActionExecutor,\n config?: NativeServerConfig\n): NativeUIBridgeServer {\n return new NativeUIBridgeServer(registry, executor, config);\n}\n\n/**\n * Example adapter using react-native-http-bridge\n *\n * To use this adapter:\n * 1. Install: npm install react-native-http-bridge\n * 2. Link native modules\n * 3. Create adapter and pass to server\n *\n * ```tsx\n * import httpBridge from 'react-native-http-bridge';\n *\n * const adapter: ServerAdapter = {\n * start: async (port, handler) => {\n * httpBridge.start(port, 'ui-bridge', async (request) => {\n * const response = await handler({\n * method: request.type,\n * path: request.url,\n * headers: request.headers || {},\n * query: parseQuery(request.url),\n * body: request.postData ? JSON.parse(request.postData) : undefined,\n * });\n * httpBridge.respond(\n * request.requestId,\n * response.status,\n * response.headers['Content-Type'],\n * response.body\n * );\n * });\n * },\n * stop: async () => {\n * httpBridge.stop();\n * },\n * isRunning: () => true,\n * };\n *\n * server.setAdapter(adapter);\n * await server.start();\n * ```\n */\n","/**\n * Bridges NativeUIBridgeRegistry events to WebSocket clients.\n *\n * Subscribes to all registry event types and broadcasts them as\n * JsonRpcEvent messages to connected WebSocket clients based on\n * their per-connection subscription sets.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { BridgeEventType, BridgeEvent } from '../core/types';\nimport type { WebSocketConnection } from './ws-connection';\nimport type { JsonRpcEvent } from './ws-types';\n\n/** All event types the bridge can subscribe to */\nconst BRIDGE_EVENT_TYPES: BridgeEventType[] = [\n 'element:registered',\n 'element:unregistered',\n 'element:stateChanged',\n 'component:registered',\n 'component:unregistered',\n 'action:started',\n 'action:completed',\n 'action:failed',\n 'workflow:started',\n 'workflow:stepCompleted',\n 'workflow:completed',\n 'workflow:failed',\n 'render:snapshot',\n 'error',\n];\n\n/** Per-connection throttle state for batching rapid events */\ninterface ThrottleState {\n ms: number;\n pending: JsonRpcEvent[];\n timer: ReturnType<typeof setTimeout> | null;\n}\n\n// ── Glob pattern matching ───────────────────────────────────────────────────\n\n/** Cache of compiled glob→RegExp to avoid recompiling hot patterns. */\nconst GLOB_CACHE = new Map<string, RegExp>();\n\n/**\n * Convert a glob-style pattern (supports `*` / `**` wildcards) to a RegExp.\n * All other regex metacharacters are escaped, so colons and other\n * event-name characters pass through literally.\n *\n * globToRegex(\"*\") → /^.*$/\n * globToRegex(\"element:*\") → /^element:.*$/\n * globToRegex(\"*:stateChanged\") → /^.*:stateChanged$/\n */\nexport function globToRegex(pattern: string): RegExp {\n const cached = GLOB_CACHE.get(pattern);\n if (cached) return cached;\n\n // Normalize ** → * (same semantics for flat event names)\n const normalized = pattern.replace(/\\*\\*/g, '*');\n // Escape regex metacharacters except '*'\n const escaped = normalized.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\n // Replace '*' with '.*'\n const body = escaped.replace(/\\*/g, '.*');\n const regex = new RegExp(`^${body}$`);\n GLOB_CACHE.set(pattern, regex);\n return regex;\n}\n\n/** Options for the WebSocketEventBridge constructor. */\nexport interface WebSocketEventBridgeOptions {\n /** Heartbeat ping interval in ms (default 30000) */\n heartbeatIntervalMs?: number;\n /** Max number of events to retain in the replay history buffer (default 100, 0 disables) */\n maxHistory?: number;\n}\n\nexport class WebSocketEventBridge {\n private connections = new Map<string, WebSocketConnection>();\n private throttles = new Map<string, ThrottleState>();\n private unsubscribers: Array<() => void> = [];\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private registry: NativeUIBridgeRegistry;\n private heartbeatIntervalMs: number;\n /**\n * True ring buffer for event replay history.\n *\n * `historyBuf` is a fixed-capacity slot array; `historyHead` points at the\n * NEXT write position; `historyCount` is the number of valid slots\n * (clamped to capacity). Append is O(1) — no array shifting.\n */\n private historyBuf: (JsonRpcEvent | undefined)[] = [];\n private historyHead = 0;\n private historyCount = 0;\n\n constructor(\n registry: NativeUIBridgeRegistry,\n optionsOrHeartbeatMs: WebSocketEventBridgeOptions | number = {}\n ) {\n this.registry = registry;\n // Accept legacy positional number form\n const opts: WebSocketEventBridgeOptions =\n typeof optionsOrHeartbeatMs === 'number'\n ? { heartbeatIntervalMs: optionsOrHeartbeatMs }\n : optionsOrHeartbeatMs;\n this.heartbeatIntervalMs = opts.heartbeatIntervalMs ?? 30000;\n const cap = Math.max(0, (opts.maxHistory ?? 100) | 0);\n this.historyBuf = cap > 0 ? new Array(cap) : [];\n }\n\n /** Effective ring buffer capacity. 0 means history is disabled. */\n private get historyCapacity(): number {\n return this.historyBuf.length;\n }\n\n /**\n * Start listening to registry events and broadcasting to WS clients.\n * Also starts the heartbeat timer.\n */\n start(): void {\n for (const eventType of BRIDGE_EVENT_TYPES) {\n const unsub = this.registry.on(eventType, (event: BridgeEvent) => {\n this.broadcastEvent(eventType, event.data);\n });\n this.unsubscribers.push(unsub);\n }\n\n this.startHeartbeat();\n }\n\n /** Stop listening to registry events and clear connections. */\n stop(): void {\n for (const unsub of this.unsubscribers) {\n unsub();\n }\n this.unsubscribers = [];\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n // Clean up throttle timers\n for (const throttle of this.throttles.values()) {\n if (throttle.timer) clearTimeout(throttle.timer);\n }\n this.throttles.clear();\n\n // Close all connections\n for (const conn of this.connections.values()) {\n conn.close(1001, 'Server shutting down');\n }\n this.connections.clear();\n this.historyBuf.fill(undefined);\n this.historyHead = 0;\n this.historyCount = 0;\n }\n\n /** Register a new WebSocket connection. */\n addConnection(conn: WebSocketConnection): void {\n this.connections.set(conn.id, conn);\n }\n\n /** Remove a WebSocket connection (called on disconnect). */\n removeConnection(connId: string): void {\n this.connections.delete(connId);\n const throttle = this.throttles.get(connId);\n if (throttle?.timer) clearTimeout(throttle.timer);\n this.throttles.delete(connId);\n }\n\n /** Get the number of active connections. */\n get connectionCount(): number {\n return this.connections.size;\n }\n\n /**\n * Add event subscriptions for a connection.\n *\n * Event names are stored as glob patterns. Supported forms:\n * - Exact: \"element:registered\"\n * - Prefix: \"element:*\"\n * - Suffix: \"*:stateChanged\"\n * - All: \"*\"\n *\n * @param throttleMs — if >0, batch rapid events within this window before sending\n */\n handleSubscribe(connId: string, events: string[], throttleMs?: number): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n for (const event of events) {\n conn.subscriptions.add(event);\n }\n if (throttleMs && throttleMs > 0) {\n this.throttles.set(connId, { ms: throttleMs, pending: [], timer: null });\n }\n return true;\n }\n\n /**\n * Remove event subscriptions for a connection.\n * If all subscriptions are cleared, also drops the throttle entry\n * (and any pending flush timer) so a subsequent resubscribe starts clean.\n */\n handleUnsubscribe(connId: string, events: string[]): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n for (const event of events) {\n conn.subscriptions.delete(event);\n }\n if (conn.subscriptions.size === 0) {\n const throttle = this.throttles.get(connId);\n if (throttle?.timer) clearTimeout(throttle.timer);\n this.throttles.delete(connId);\n }\n return true;\n }\n\n /**\n * Get the subscription set for a connection.\n * Returns the original pattern strings (not compiled regexes).\n */\n getSubscriptions(connId: string): string[] {\n const conn = this.connections.get(connId);\n return conn ? Array.from(conn.subscriptions) : [];\n }\n\n /**\n * Check if a connection is subscribed to a specific event.\n * Matches exact names first (fast path), then tests each stored\n * pattern as a glob against the event type.\n */\n isSubscribed(connId: string, eventType: string): boolean {\n const conn = this.connections.get(connId);\n if (!conn) return false;\n // Fast path: exact match\n if (conn.subscriptions.has(eventType)) return true;\n // Glob path: test each pattern\n for (const pattern of conn.subscriptions) {\n // Skip exact names with no wildcard — already tested above\n if (!pattern.includes('*')) continue;\n if (globToRegex(pattern).test(eventType)) return true;\n }\n return false;\n }\n\n /** Get the throttle window (in ms) configured for a connection, or undefined if none. */\n getThrottleMs(connId: string): number | undefined {\n return this.throttles.get(connId)?.ms;\n }\n\n /**\n * Get recent events from the replay history buffer.\n *\n * @param filter.events — optional list of glob patterns to match event types against\n * @param filter.since — optional timestamp (ms); only events at or after this time\n */\n getHistory(filter?: { events?: string[]; since?: number }): JsonRpcEvent[] {\n const cap = this.historyCapacity;\n if (cap === 0 || this.historyCount === 0) return [];\n\n const since = filter?.since;\n const regexes = filter?.events?.map((p) => globToRegex(p));\n\n // Walk the ring buffer in chronological (oldest → newest) order.\n const start = (this.historyHead - this.historyCount + cap) % cap;\n const out: JsonRpcEvent[] = [];\n for (let i = 0; i < this.historyCount; i++) {\n const e = this.historyBuf[(start + i) % cap];\n if (!e) continue;\n if (since !== undefined && e.timestamp < since) continue;\n if (regexes && regexes.length > 0 && !regexes.some((r) => r.test(e.event))) continue;\n out.push(e);\n }\n return out;\n }\n\n /**\n * Configure the max history buffer size at runtime. 0 disables history.\n * Reallocates the ring buffer, preserving the most recent\n * min(historyCount, newCapacity) events in chronological order.\n */\n setMaxHistory(maxHistory: number): void {\n const newCap = Math.max(0, maxHistory | 0);\n if (newCap === this.historyCapacity) return;\n\n if (newCap === 0) {\n this.historyBuf = [];\n this.historyHead = 0;\n this.historyCount = 0;\n return;\n }\n\n // Preserve the latest min(count, newCap) events.\n const oldCap = this.historyCapacity;\n const keep = Math.min(this.historyCount, newCap);\n const newBuf: (JsonRpcEvent | undefined)[] = new Array(newCap);\n if (keep > 0 && oldCap > 0) {\n // Source range: the last `keep` events ending just before historyHead.\n const start = (this.historyHead - keep + oldCap) % oldCap;\n for (let i = 0; i < keep; i++) {\n newBuf[i] = this.historyBuf[(start + i) % oldCap];\n }\n }\n this.historyBuf = newBuf;\n this.historyCount = keep;\n this.historyHead = keep % newCap;\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private broadcastEvent(eventType: string, data: unknown): void {\n const event: JsonRpcEvent = {\n event: eventType,\n data,\n timestamp: Date.now(),\n };\n\n // Append to ring buffer — O(1), no shifting.\n const cap = this.historyCapacity;\n if (cap > 0) {\n this.historyBuf[this.historyHead] = event;\n this.historyHead = (this.historyHead + 1) % cap;\n if (this.historyCount < cap) this.historyCount++;\n }\n\n for (const [connId, conn] of this.connections) {\n const throttle = this.throttles.get(connId);\n if (throttle) {\n this.enqueueThrottled(connId, conn, throttle, event);\n } else {\n conn.sendEvent(event);\n }\n }\n }\n\n /** Queue an event for throttled delivery, flushing after the throttle window. */\n private enqueueThrottled(\n connId: string,\n conn: WebSocketConnection,\n throttle: ThrottleState,\n event: JsonRpcEvent\n ): void {\n throttle.pending.push(event);\n if (throttle.timer) return; // Flush already scheduled\n\n throttle.timer = setTimeout(() => {\n const events = throttle.pending.splice(0);\n throttle.timer = null;\n // Verify connection still exists\n if (!this.connections.has(connId)) return;\n for (const e of events) {\n conn.sendEvent(e);\n }\n }, throttle.ms);\n }\n\n private startHeartbeat(): void {\n this.heartbeatTimer = setInterval(() => {\n for (const [id, conn] of this.connections) {\n if (!conn.isOpen) {\n this.connections.delete(id);\n continue;\n }\n\n if (!conn.alive) {\n // Missed previous ping — connection is dead\n console.warn(`[ws-event-bridge] Connection ${id} missed heartbeat, closing`);\n conn.close(1001, 'Heartbeat timeout');\n this.connections.delete(id);\n continue;\n }\n\n // Mark as not-alive, send ping. If pong arrives, alive is set back to true.\n conn.alive = false;\n conn.ping();\n }\n }, this.heartbeatIntervalMs);\n }\n}\n","/**\n * Minimal logger for the UI Bridge Native transport layer.\n *\n * Wraps console so callers go through a single controlled point. Log output\n * can be suppressed globally by setting:\n *\n * import { transportLogger } from './logger';\n * transportLogger.silent = true;\n *\n * In production builds you can also tree-shake the verbose log() calls by\n * checking `__DEV__` in your Metro bundler config, but the silent flag is\n * simpler and works without build-time configuration.\n */\n\nexport interface TransportLogger {\n log(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n /** Set to true to suppress all log output (warn/error are always emitted). */\n silent: boolean;\n}\n\nfunction createTransportLogger(): TransportLogger {\n return {\n silent: false,\n log(message: string, ...args: unknown[]): void {\n if (!this.silent) {\n console.log(message, ...args);\n }\n },\n warn(message: string, ...args: unknown[]): void {\n console.warn(message, ...args);\n },\n error(message: string, ...args: unknown[]): void {\n console.error(message, ...args);\n },\n };\n}\n\n/** Shared logger instance for the transport layer. */\nexport const transportLogger = createTransportLogger();\n","/**\n * Device Announcer — mDNS + Cloud registration for physical device discovery\n *\n * Announces the UI Bridge service on the local network via mDNS (when\n * react-native-zeroconf is available) and optionally registers with the\n * cloud relay backend.\n */\n\nimport { Platform } from 'react-native';\nimport { transportLogger } from './logger';\n\nexport interface AnnouncerConfig {\n /** Stable device identifier */\n deviceId: string;\n /** App bundle/package ID */\n appId: string;\n /** UI Bridge server port (default 8087) */\n port?: number;\n /** Cloud relay WebSocket URL for registration */\n cloudRelayUrl?: string;\n /** Auth token for cloud relay */\n cloudToken?: string;\n /** UI Bridge SDK version */\n version?: string;\n}\n\nexport interface DeviceAnnouncerState {\n mdnsActive: boolean;\n cloudConnected: boolean;\n}\n\n/** Minimal interface for the react-native-zeroconf Zeroconf instance */\ninterface ZeroconfService {\n publishService(\n type: string,\n protocol: string,\n domain: string,\n name: string,\n port: number,\n txtRecord: Record<string, string>\n ): void;\n unpublishService(name: string): void;\n}\n\n/** Possible messages received over the cloud relay WebSocket */\ninterface RelayMessage {\n type: string;\n [key: string]: unknown;\n}\n\nconst DEFAULT_PORT = 8087;\nconst RECONNECT_INITIAL_DELAY_MS = 2_000;\nconst RECONNECT_MAX_DELAY_MS = 60_000;\n\n/**\n * Announces the UI Bridge server on the local network (mDNS) and optionally\n * registers with the qontinui.io cloud relay for remote discovery.\n */\nexport class DeviceAnnouncer {\n private config: Required<Pick<AnnouncerConfig, 'deviceId' | 'appId'>> & AnnouncerConfig;\n private state: DeviceAnnouncerState = {\n mdnsActive: false,\n cloudConnected: false,\n };\n private cloudWs: WebSocket | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectDelay = RECONNECT_INITIAL_DELAY_MS;\n private stopped = false;\n /** Zeroconf instance, set when mDNS is successfully started */\n private zeroconf: ZeroconfService | null = null;\n /** Rotated pairing token for mDNS TXT records */\n private pairingToken: string;\n\n constructor(config: AnnouncerConfig) {\n this.config = config;\n this.pairingToken = generateHex(16);\n }\n\n // ── mDNS ──────────────────────────────────────────────────────────────────\n\n /**\n * Start mDNS advertisement.\n *\n * The consumer must pass the `Zeroconf` constructor (from `react-native-zeroconf`)\n * explicitly; otherwise this is a no-op.\n *\n * Rationale: Metro's `require()` throws an uncatchable module-load error if the\n * bundle doesn't include the named package. That error escapes async try/catch\n * boundaries and crashes the app. We avoid it by never calling `require()`\n * ourselves — the consumer imports the package when they know it's installed.\n *\n * @param ZeroconfCtor - constructor from `import Zeroconf from 'react-native-zeroconf'`\n */\n async startMdnsAdvertise(ZeroconfCtor?: new () => ZeroconfService): Promise<void> {\n if (!ZeroconfCtor) {\n transportLogger.log(\n '[DeviceAnnouncer] mDNS advertisement skipped (no Zeroconf constructor provided). ' +\n 'Pass one to enable mDNS.'\n );\n return;\n }\n try {\n this.zeroconf = new ZeroconfCtor();\n\n const port = this.config.port ?? DEFAULT_PORT;\n const serviceName = `UIBridge-${this.config.deviceId.slice(0, 8)}`;\n\n this.zeroconf.publishService('_uibridge', '_tcp.', 'local.', serviceName, port, {\n device_id: this.config.deviceId,\n app_id: this.config.appId,\n version: this.config.version ?? 'unknown',\n pairing_token: this.pairingToken,\n });\n\n this.state = { ...this.state, mdnsActive: true };\n transportLogger.log(`[DeviceAnnouncer] mDNS: advertising \"${serviceName}\" on port ${port}`);\n } catch (err) {\n transportLogger.warn('[DeviceAnnouncer] mDNS start failed:', err);\n }\n }\n\n // ── Cloud relay ───────────────────────────────────────────────────────────\n\n /**\n * Connect to the cloud relay WebSocket and send a device_register message.\n *\n * Reconnects automatically with exponential backoff (2 s → 60 s) if the\n * connection drops.\n */\n async connectCloudRelay(): Promise<void> {\n if (!this.config.cloudRelayUrl || !this.config.cloudToken) {\n return;\n }\n if (this.stopped) return;\n\n const url = `${this.config.cloudRelayUrl}?token=${encodeURIComponent(this.config.cloudToken)}`;\n\n transportLogger.log('[DeviceAnnouncer] Cloud relay: connecting to', url);\n\n const ws = new WebSocket(url);\n this.cloudWs = ws;\n\n ws.onopen = () => {\n if (this.stopped) {\n ws.close();\n return;\n }\n this.reconnectDelay = RECONNECT_INITIAL_DELAY_MS;\n this.state = { ...this.state, cloudConnected: true };\n transportLogger.log('[DeviceAnnouncer] Cloud relay: connected');\n\n // Register this device with the backend\n ws.send(\n JSON.stringify({\n type: 'device_register',\n device_id: this.config.deviceId,\n app_id: this.config.appId,\n platform: getPlatform(),\n display_name: this.config.deviceId,\n ui_bridge_version: this.config.version ?? 'unknown',\n })\n );\n };\n\n ws.onmessage = (event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data as string) as RelayMessage;\n transportLogger.log('[DeviceAnnouncer] Cloud relay message:', msg.type);\n // Tunneled HTTP requests are handled by CloudRelayClient when wired up\n } catch {\n // ignore malformed messages\n }\n };\n\n ws.onclose = () => {\n this.state = { ...this.state, cloudConnected: false };\n if (!this.stopped) {\n this.scheduleReconnect();\n }\n };\n\n ws.onerror = (err: Event) => {\n transportLogger.warn('[DeviceAnnouncer] Cloud relay error:', err);\n // onclose will fire after this and trigger reconnect\n };\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n /** Stop all advertising and registration. */\n async stop(): Promise<void> {\n this.stopped = true;\n\n // Cancel any pending reconnect\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n // Unpublish mDNS service\n if (this.zeroconf) {\n try {\n const serviceName = `UIBridge-${this.config.deviceId.slice(0, 8)}`;\n this.zeroconf.unpublishService(serviceName);\n } catch {\n // ignore\n }\n this.zeroconf = null;\n }\n this.state = { ...this.state, mdnsActive: false };\n\n // Close cloud WebSocket\n if (this.cloudWs) {\n this.cloudWs.onclose = null; // prevent reconnect loop\n this.cloudWs.close();\n this.cloudWs = null;\n }\n this.state = { ...this.state, cloudConnected: false };\n }\n\n /** Return a copy of the current announcer state. */\n getState(): DeviceAnnouncerState {\n return { ...this.state };\n }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private scheduleReconnect(): void {\n if (this.stopped) return;\n const delay = this.reconnectDelay;\n transportLogger.log(`[DeviceAnnouncer] Cloud relay: reconnecting in ${delay}ms`);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (!this.stopped) {\n void this.connectCloudRelay();\n }\n }, delay);\n // Exponential backoff\n this.reconnectDelay = Math.min(this.reconnectDelay * 2, RECONNECT_MAX_DELAY_MS);\n }\n}\n\n// ── Utilities ─────────────────────────────────────────────────────────────────\n\nfunction generateHex(bytes: number): string {\n const arr = new Uint8Array(bytes);\n // In React Native, Math.random() is fine for a non-security pairing token\n for (let i = 0; i < bytes; i++) {\n arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nfunction getPlatform(): string {\n return Platform?.OS ?? 'unknown';\n}\n","/**\n * Cloud Relay Client — WebSocket tunnel from mobile device to backend\n *\n * Maintains a persistent WebSocket connection to the qontinui.io backend.\n * Receives tunneled HTTP requests from runners, calls the local NativeUIBridgeServer,\n * and sends responses back through the tunnel.\n */\n\nimport type { NativeUIBridgeServer } from '../server/http-server';\nimport { transportLogger } from './logger';\n\nexport interface CloudRelayConfig {\n /** WebSocket URL for the device bridge endpoint */\n relayUrl: string;\n /** Stable device identifier */\n deviceId: string;\n /** Authentication token */\n authToken: string;\n /** Reference to the local UI Bridge server for processing requests */\n uiBridgeServer: NativeUIBridgeServer;\n}\n\ninterface TunnelRequest {\n id: string;\n method: string;\n path: string;\n headers: Record<string, string>;\n body?: unknown;\n}\n\ninterface TunnelResponse {\n id: string;\n status: number;\n headers: Record<string, string>;\n body?: unknown;\n}\n\nconst INITIAL_RECONNECT_DELAY_MS = 2_000;\nconst MAX_RECONNECT_DELAY_MS = 60_000;\n\n/**\n * Manages a WebSocket tunnel from the mobile device to the qontinui.io backend.\n *\n * When a runner sends an HTTP request to a cloud device it is serialised as a\n * `TunnelRequest` JSON frame by the backend and forwarded here. This client\n * deserializes it, calls `NativeUIBridgeServer.handleRequest()` directly\n * (avoiding loopback TCP overhead), and sends the `TunnelResponse` back.\n */\nexport class CloudRelayClient {\n private ws: WebSocket | null = null;\n private config: CloudRelayConfig;\n private reconnectDelay = INITIAL_RECONNECT_DELAY_MS;\n private maxReconnectDelay = MAX_RECONNECT_DELAY_MS;\n private stopped = false;\n private _isConnected = false;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: CloudRelayConfig) {\n this.config = config;\n }\n\n /** Whether the relay WebSocket is currently connected */\n get isConnected(): boolean {\n return this._isConnected;\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n /** Connect to the relay and start processing tunneled requests. */\n start(): void {\n this.stopped = false;\n this.connect();\n }\n\n /** Disconnect and stop reconnecting. */\n stop(): void {\n this.stopped = true;\n this._isConnected = false;\n\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.onclose = null; // prevent reconnect loop\n this.ws.close();\n this.ws = null;\n }\n }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private connect(): void {\n if (this.stopped) return;\n\n const url = `${this.config.relayUrl}?token=${encodeURIComponent(this.config.authToken)}`;\n\n transportLogger.log('[CloudRelayClient] Connecting to', url);\n\n const ws = new WebSocket(url);\n this.ws = ws;\n\n ws.onopen = () => {\n if (this.stopped) {\n ws.close();\n return;\n }\n this._isConnected = true;\n this.reconnectDelay = INITIAL_RECONNECT_DELAY_MS;\n\n transportLogger.log('[CloudRelayClient] Connected to relay');\n\n // Register as a device\n ws.send(\n JSON.stringify({\n type: 'device_register',\n device_id: this.config.deviceId,\n })\n );\n };\n\n ws.onmessage = (event: MessageEvent) => {\n void this.onMessage(event.data as string);\n };\n\n ws.onclose = () => {\n this._isConnected = false;\n if (!this.stopped) {\n this.scheduleReconnect();\n }\n };\n\n ws.onerror = (err: Event) => {\n transportLogger.warn('[CloudRelayClient] WebSocket error:', err);\n // onclose will fire next and handle reconnect\n };\n }\n\n private async onMessage(raw: string): Promise<void> {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n transportLogger.warn('[CloudRelayClient] Received non-JSON message');\n return;\n }\n\n // Only handle tunnel_request frames\n if (msg['type'] !== 'tunnel_request') return;\n\n // Validate required fields\n if (\n typeof msg['id'] !== 'string' ||\n typeof msg['method'] !== 'string' ||\n typeof msg['path'] !== 'string'\n ) {\n transportLogger.warn('[CloudRelayClient] Malformed tunnel_request — missing required fields');\n return;\n }\n\n const req: TunnelRequest = {\n id: msg['id'],\n method: msg['method'],\n path: msg['path'],\n headers: (msg['headers'] as Record<string, string>) ?? {},\n body: msg['body'],\n };\n\n const resp = await this.handleTunneledRequest(req);\n\n // Send response back through the WebSocket\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify({ type: 'tunnel_response', ...resp }));\n }\n }\n\n /**\n * Process a tunneled HTTP request by calling the local NativeUIBridgeServer\n * directly (no loopback TCP involved).\n */\n private async handleTunneledRequest(req: TunnelRequest): Promise<TunnelResponse> {\n try {\n const httpResp = await this.config.uiBridgeServer.handleRequest({\n method: req.method,\n path: req.path,\n headers: req.headers,\n query: parseQueryParams(req.path),\n body: req.body,\n });\n\n // Parse the JSON body back to an object so it can be re-serialised as a\n // proper JSON value in the tunnel response (avoids double-encoding).\n let bodyValue: unknown;\n try {\n bodyValue = httpResp.body ? (JSON.parse(httpResp.body) as unknown) : undefined;\n } catch {\n bodyValue = httpResp.body || undefined;\n }\n\n return {\n id: req.id,\n status: httpResp.status,\n headers: httpResp.headers,\n body: bodyValue,\n };\n } catch (err) {\n transportLogger.error('[CloudRelayClient] Error handling tunneled request:', err);\n return {\n id: req.id,\n status: 500,\n headers: { 'content-type': 'application/json' },\n body: {\n success: false,\n error: err instanceof Error ? err.message : 'Internal server error',\n },\n };\n }\n }\n\n private scheduleReconnect(): void {\n if (this.stopped) return;\n const delay = this.reconnectDelay;\n transportLogger.log(`[CloudRelayClient] Reconnecting in ${delay}ms`);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (!this.stopped) {\n this.connect();\n }\n }, delay);\n this.reconnectDelay = Math.min(this.reconnectDelay * 2, this.maxReconnectDelay);\n }\n}\n\n// ── Utilities ─────────────────────────────────────────────────────────────────\n\n/**\n * Extract query-string parameters from a URL path.\n * e.g. `/ui-bridge/control/elements?visibleOnly=true` → `{ visibleOnly: 'true' }`\n */\nfunction parseQueryParams(path: string): Record<string, string> {\n const qIdx = path.indexOf('?');\n if (qIdx === -1) return {};\n const qs = path.slice(qIdx + 1);\n const result: Record<string, string> = {};\n for (const pair of qs.split('&')) {\n const [k, v] = pair.split('=');\n if (k) {\n result[decodeURIComponent(k)] = decodeURIComponent(v ?? '');\n }\n }\n return result;\n}\n","import type { NativeModalInfo, NativeSnapshotModalContext } from '../core/types';\n\nexport interface ModalPushInput {\n id: string;\n title?: string;\n type?: NativeModalInfo['type'];\n blocking?: boolean;\n dismissible?: boolean;\n}\n\n/**\n * Declarative modal store. Components/hooks call pushModal/dismissModal directly\n * — there is no DOM/tree scanner. The detector is the single source of truth for\n * the snapshot's modalStack context.\n */\nexport class ModalDetector {\n /** Map preserves O(1) idempotent replace by id; ordering comes from detectedAt. */\n private modals = new Map<string, NativeModalInfo>();\n\n pushModal(modal: ModalPushInput): void {\n const existing = this.modals.get(modal.id);\n const detectedAt = existing ? existing.detectedAt : Date.now();\n const next: NativeModalInfo = {\n id: modal.id,\n title: modal.title,\n type: modal.type ?? 'modal',\n blocking: modal.blocking ?? true,\n dismissible: modal.dismissible ?? true,\n detectedAt,\n };\n this.modals.set(modal.id, next);\n }\n\n /**\n * Remove a modal from the stack. Returns `true` if a modal with that id\n * was actually deleted, `false` if nothing matched (idempotent so repeated\n * calls don't throw, but callers — e.g. the HTTP test-hook endpoint — can\n * surface the miss to clients).\n */\n dismissModal(id: string): boolean {\n return this.modals.delete(id);\n }\n\n getSnapshotModalContext(): NativeSnapshotModalContext {\n const active = this.getActive();\n const ctx: NativeSnapshotModalContext = {\n modals: active,\n hasBlockingModal: active.some((m) => m.blocking),\n count: active.length,\n };\n if (active.length > 0) {\n ctx.topModal = active[active.length - 1];\n }\n return ctx;\n }\n\n getActive(): NativeModalInfo[] {\n return Array.from(this.modals.values()).sort((a, b) => a.detectedAt - b.detectedAt);\n }\n\n clear(): void {\n this.modals.clear();\n }\n}\n","import type { NativeCapturedToast, NativeSnapshotToastContext } from '../core/types';\n\nexport interface ToastRecordInput {\n id: string;\n message: string;\n level?: NativeCapturedToast['level'];\n appearedAt?: number;\n}\n\nexport interface ToastCaptureConfig {\n maxRecent?: number;\n}\n\nconst DEFAULT_MAX_RECENT = 50;\n\n/**\n * Declarative toast/snackbar tracker. Components call recordToast/dismissToast\n * directly — there is no DOM/tree scanner. The active map plus a fixed-size\n * recent ring buffer feed the snapshot's toasts context.\n */\nexport class ToastCapture {\n private active = new Map<string, NativeCapturedToast>();\n private recent: NativeCapturedToast[] = [];\n private totalCaptured = 0;\n private maxRecent: number;\n\n constructor(config: ToastCaptureConfig = {}) {\n this.maxRecent = config.maxRecent ?? DEFAULT_MAX_RECENT;\n }\n\n recordToast(toast: ToastRecordInput): void {\n if (this.active.has(toast.id)) {\n return;\n }\n const appearedAt = toast.appearedAt ?? Date.now();\n const entry: NativeCapturedToast = {\n id: toast.id,\n message: toast.message,\n level: toast.level ?? 'info',\n appearedAt,\n visible: true,\n durationMs: 0,\n };\n this.active.set(toast.id, entry);\n this.totalCaptured += 1;\n }\n\n dismissToast(id: string): void {\n const entry = this.active.get(id);\n if (!entry) {\n return;\n }\n this.active.delete(id);\n const dismissedAt = Date.now();\n const dismissed: NativeCapturedToast = {\n ...entry,\n dismissedAt,\n visible: false,\n durationMs: dismissedAt - entry.appearedAt,\n };\n this.recent.push(dismissed);\n if (this.recent.length > this.maxRecent) {\n this.recent.shift();\n }\n }\n\n getSnapshotToastContext(): NativeSnapshotToastContext {\n const now = Date.now();\n const active = Array.from(this.active.values()).map((entry) => ({\n ...entry,\n durationMs: now - entry.appearedAt,\n }));\n return {\n active,\n recent: [...this.recent],\n totalCaptured: this.totalCaptured,\n };\n }\n\n clear(): void {\n this.active.clear();\n this.recent = [];\n this.totalCaptured = 0;\n }\n}\n","import type { NativeSnapshotUndoContext } from '../core/types';\n\n/**\n * A single bridge action recorded for undo correlation. Action-correlation\n * only — RN has no DOM/execCommand probe, so we rely on developer\n * declaration plus this rolling history of recent actions.\n */\nexport interface ActionRecord {\n id: string;\n type: string;\n targetId?: string;\n description?: string;\n timestamp: number;\n /** Default true — set false for actions that aren't reversible (e.g. navigation, network calls) */\n reversible?: boolean;\n}\n\n/**\n * Developer-declared undo/redo state. When set, this is authoritative and\n * overrides any heuristic inference from action history.\n */\nexport interface DeclaredUndoState {\n canUndo: boolean;\n canRedo: boolean;\n undoDescription?: string;\n redoDescription?: string;\n undoDepth?: number;\n redoDepth?: number;\n}\n\nexport interface UndoTrackerConfig {\n maxHistory?: number;\n}\n\nconst DEFAULT_MAX_HISTORY = 50;\n\nfunction buildSummary(ctx: {\n canUndo: boolean;\n canRedo: boolean;\n undoDescription?: string;\n redoDescription?: string;\n}): string {\n if (!ctx.canUndo && !ctx.canRedo) {\n return 'no undo available';\n }\n const parts: string[] = [];\n if (ctx.canUndo) {\n parts.push(`undo: '${ctx.undoDescription ?? 'available'}'`);\n }\n if (ctx.canRedo) {\n parts.push(`redo: '${ctx.redoDescription ?? 'available'}'`);\n }\n return parts.join(' / ');\n}\n\n/**\n * Action-correlation undo tracker for React Native.\n *\n * Maintains a rolling buffer of recent actions and a developer-declared\n * undo state slot. The declared state is authoritative when set; otherwise\n * we infer `canUndo` from whether any reversible action has been recorded.\n * `executeUndo`/`executeRedo` are placeholders pending an IPC path through\n * ui-bridge-native to the runner's `/control/undo`.\n */\nexport class UndoTracker {\n private readonly maxHistory: number;\n private actions: ActionRecord[] = [];\n private declaredState: DeclaredUndoState | null = null;\n\n constructor(config: UndoTrackerConfig = {}) {\n this.maxHistory = config.maxHistory ?? DEFAULT_MAX_HISTORY;\n }\n\n recordAction(record: ActionRecord): void {\n this.actions.push(record);\n if (this.actions.length > this.maxHistory) {\n this.actions = this.actions.slice(-this.maxHistory);\n }\n }\n\n setDeclaredState(state: DeclaredUndoState): void {\n this.declaredState = state;\n }\n\n getActionHistory(): ActionRecord[] {\n return this.actions.slice();\n }\n\n getSnapshotUndoContext(): NativeSnapshotUndoContext {\n const declared = this.declaredState;\n if (declared) {\n const summary = buildSummary({\n canUndo: declared.canUndo,\n canRedo: declared.canRedo,\n undoDescription: declared.undoDescription,\n redoDescription: declared.redoDescription,\n });\n return {\n canUndo: declared.canUndo,\n canRedo: declared.canRedo,\n undoDescription: declared.undoDescription,\n redoDescription: declared.redoDescription,\n undoDepth: declared.undoDepth,\n redoDepth: declared.redoDepth,\n summary,\n };\n }\n\n const canUndo = this.actions.some((a) => a.reversible !== false);\n const canRedo = false;\n // Surface the most recent reversible action's description as the inferred undo target\n const lastReversible = [...this.actions].reverse().find((a) => a.reversible !== false);\n const undoDescription = lastReversible?.description;\n const summary = buildSummary({ canUndo, canRedo, undoDescription });\n return {\n canUndo,\n canRedo,\n undoDescription,\n summary,\n };\n }\n\n executeUndo(): { ok: boolean; reason?: string } {\n return { ok: false, reason: 'Not implemented in native' };\n }\n\n executeRedo(): { ok: boolean; reason?: string } {\n return { ok: false, reason: 'Not implemented in native' };\n }\n\n clear(): void {\n this.actions = [];\n this.declaredState = null;\n }\n}\n","/**\n * UI Bridge Native Provider\n *\n * React context provider for UI Bridge Native functionality.\n */\n\nimport React, {\n createContext,\n use,\n useMemo,\n useEffect,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport type {\n NativeUIBridgeFeatures,\n NativeUIBridgeConfig,\n RegisteredNativeElement,\n RegisteredNativeComponent,\n NativeBridgeSnapshot,\n BridgeEventType,\n BridgeEventListener,\n} from '../core/types';\nimport { NativeUIBridgeRegistry, setGlobalRegistry, resetGlobalRegistry } from '../core/registry';\nimport { createNativeActionExecutor } from '../control/action-executor';\nimport type { NativeActionExecutor } from '../control/types';\nimport {\n createNativeServer,\n type NativeUIBridgeServer,\n type ServerAdapter,\n type WebSocketServerAdapter,\n} from '../server/http-server';\nimport type { RouteProvider } from '../server/types';\nimport { WebSocketEventBridge } from '../server/ws-event-bridge';\nimport { DeviceAnnouncer } from '../transport/DeviceAnnouncer';\nimport { CloudRelayClient, type CloudRelayConfig } from '../transport/CloudRelayClient';\nimport { ModalDetector } from '../modal/modal-detector';\nimport { ToastCapture } from '../toast/toast-capture';\nimport { UndoTracker } from '../undo/undo-tracker';\n\n/**\n * UI Bridge Native context value\n */\nexport interface UIBridgeNativeContextValue {\n /** Feature flags */\n features: NativeUIBridgeFeatures;\n /** Configuration */\n config: NativeUIBridgeConfig;\n /** Element registry */\n registry: NativeUIBridgeRegistry;\n /** Action executor */\n executor: NativeActionExecutor;\n /** Modal stack tracker (declarative pushModal/dismissModal) */\n modalDetector: ModalDetector;\n /** Toast/snackbar tracker (declarative recordToast/dismissToast) */\n toastCapture: ToastCapture;\n /** Undo/redo action-correlation tracker */\n undoTracker: UndoTracker;\n /** Get all registered elements */\n getElements: () => RegisteredNativeElement[];\n /** Get all registered components */\n getComponents: () => RegisteredNativeComponent[];\n /** Create a snapshot */\n createSnapshot: () => NativeBridgeSnapshot;\n /** Subscribe to events */\n on: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => () => void;\n /** Unsubscribe from events */\n off: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => void;\n /** Whether the provider is initialized */\n initialized: boolean;\n /** Server running status */\n serverRunning: boolean;\n /** Start the HTTP server */\n startServer: () => Promise<void>;\n /** Stop the HTTP server */\n stopServer: () => void;\n /** Get the current navigation route (if a RouteProvider is configured) */\n getCurrentRoute: () => string | null;\n}\n\n/**\n * UI Bridge Native context\n */\nconst UIBridgeNativeContext = createContext<UIBridgeNativeContextValue | null>(null);\n\n/**\n * UI Bridge Native provider props\n */\nexport interface UIBridgeNativeProviderProps {\n /** Child components */\n children: React.ReactNode;\n /** Feature flags */\n features?: NativeUIBridgeFeatures;\n /** Configuration */\n config?: NativeUIBridgeConfig;\n /** Event handler */\n onEvent?: BridgeEventListener;\n /**\n * A ServerAdapter instance for the HTTP server.\n * The app is responsible for creating this using its preferred native TCP/HTTP library.\n * @see ServerAdapter interface in server/http-server.ts\n */\n serverAdapter?: ServerAdapter;\n /**\n * Navigation provider for programmatic route navigation via UI Bridge.\n * Pass Expo Router's push/back functions to enable `control/page/navigate`.\n */\n navigationProvider?: { navigate: (url: string) => void; back?: () => void };\n /**\n * Screenshot provider for native screen capture via UI Bridge.\n * Pass a function that captures the current screen as base64 PNG.\n */\n screenshotProvider?: {\n capture: () => Promise<{ base64: string; width: number; height: number }>;\n };\n /**\n * Route provider for exposing the current navigation route in snapshots.\n * Wire this to Expo Router's `usePathname()` / `useSegments()` via a module-level ref.\n */\n routeProvider?: RouteProvider;\n /**\n * Configuration for the cloud relay tunnel (enables remote device verification\n * when USB/LAN are not available). Omit `uiBridgeServer` — the provider wires\n * that automatically after the server starts.\n */\n cloudRelayConfig?: Omit<CloudRelayConfig, 'uiBridgeServer'>;\n /**\n * Enable mDNS advertisement so that runners on the same LAN can discover this\n * device automatically (requires react-native-zeroconf).\n */\n enableMdnsAnnounce?: boolean;\n /**\n * Stable device identifier used for mDNS TXT records and cloud relay\n * registration. Typically sourced from expo-device or a UUID stored in\n * AsyncStorage.\n */\n deviceId?: string;\n}\n\n/**\n * UI Bridge Native Provider\n *\n * Provides UI Bridge Native context to child components.\n *\n * @example\n * ```tsx\n * // app/_layout.tsx\n * import { UIBridgeNativeProvider } from 'ui-bridge-native';\n *\n * export default function RootLayout() {\n * return (\n * <UIBridgeNativeProvider\n * features={{ server: __DEV__, debug: __DEV__ }}\n * config={{ serverPort: 8087 }}\n * >\n * <Stack>{children}</Stack>\n * </UIBridgeNativeProvider>\n * );\n * }\n * ```\n */\nexport function UIBridgeNativeProvider({\n children,\n features = {},\n config = {},\n onEvent,\n serverAdapter,\n navigationProvider,\n screenshotProvider,\n routeProvider,\n cloudRelayConfig,\n enableMdnsAnnounce,\n deviceId,\n}: UIBridgeNativeProviderProps) {\n const registryRef = useRef<NativeUIBridgeRegistry | null>(null);\n const executorRef = useRef<NativeActionExecutor | null>(null);\n const modalDetectorRef = useRef<ModalDetector | null>(null);\n const toastCaptureRef = useRef<ToastCapture | null>(null);\n const undoTrackerRef = useRef<UndoTracker | null>(null);\n const [serverRunning, setServerRunning] = useState(false);\n\n // Initialize on first render\n if (!registryRef.current) {\n registryRef.current = new NativeUIBridgeRegistry({\n verbose: config.verbose,\n onEvent,\n });\n setGlobalRegistry(registryRef.current);\n }\n\n const registry = registryRef.current;\n\n // Create executor (memoized)\n if (!executorRef.current) {\n executorRef.current = createNativeActionExecutor(registry);\n }\n\n const executor = executorRef.current;\n\n // Trackers — lazy-init the same way as registry/executor so each provider\n // lifecycle has exactly one stable instance.\n if (!modalDetectorRef.current) modalDetectorRef.current = new ModalDetector();\n if (!toastCaptureRef.current) toastCaptureRef.current = new ToastCapture();\n if (!undoTrackerRef.current) undoTrackerRef.current = new UndoTracker();\n\n const modalDetector = modalDetectorRef.current;\n const toastCapture = toastCaptureRef.current;\n const undoTracker = undoTrackerRef.current;\n\n // Server instance (persisted across renders)\n const serverRef = useRef<NativeUIBridgeServer | null>(null);\n const eventBridgeRef = useRef<WebSocketEventBridge | null>(null);\n\n // Cloud / mDNS transport references\n const announcerRef = useRef<DeviceAnnouncer | null>(null);\n const cloudRelayRef = useRef<CloudRelayClient | null>(null);\n\n // Server management — uses injected serverAdapter if provided\n const startServer = useCallback(async () => {\n if (!features.server) return;\n\n if (!serverAdapter) {\n console.warn(\n `[ui-bridge-native] HTTP server not available: no serverAdapter prop provided. ` +\n `Pass a serverAdapter to UIBridgeNativeProvider to enable the HTTP server.`\n );\n return;\n }\n\n const server = createNativeServer(registry, executor, {\n serverPort: config.serverPort || 8087,\n cors: true,\n appInfo: config.appInfo,\n testHooks: features.testHooks === true,\n });\n\n server.setAdapter(serverAdapter);\n\n // Wire navigation provider if supplied\n if (navigationProvider) {\n server.setNavigationProvider(navigationProvider);\n }\n\n // Wire screenshot provider if supplied\n if (screenshotProvider) {\n server.setScreenshotProvider(screenshotProvider);\n }\n\n // Wire route provider if supplied (must be set AFTER navigationProvider\n // since both may override getSnapshot / pageNavigate handlers)\n if (routeProvider) {\n server.setRouteProvider(routeProvider);\n }\n\n // Wire up WebSocket event bridge if adapter supports it\n const wsAdapter = serverAdapter as WebSocketServerAdapter;\n if (typeof wsAdapter.broadcast === 'function') {\n const eventBridge = new WebSocketEventBridge(registry);\n server.setEventBridge(eventBridge);\n\n wsAdapter.onWebSocketConnect = (connId: string) => {\n // Create a lightweight connection proxy for the event bridge\n // The actual WebSocketConnection lives in the adapter\n eventBridge.addConnection({\n id: connId,\n subscriptions: new Set(),\n alive: true,\n isOpen: true,\n send: (msg: string) => wsAdapter.sendToConnection?.(connId, msg),\n sendEvent: (event: { event: string }) => {\n if (!eventBridge.isSubscribed(connId, event.event)) return;\n wsAdapter.sendToConnection?.(connId, JSON.stringify(event));\n },\n ping: () => {\n /* adapter handles heartbeat */\n },\n close: () => {\n /* adapter handles close */\n },\n destroy: () => {\n /* adapter handles destroy */\n },\n } as any); // eslint-disable-line @typescript-eslint/no-explicit-any\n };\n\n wsAdapter.onWebSocketDisconnect = (connId: string) => {\n // Abort any pending waiters (waitForElement / waitForCondition)\n // for this connection BEFORE removing it — stops leaked timers\n // and registry listeners.\n server.abortWaitersForConnection(connId);\n eventBridge.removeConnection(connId);\n };\n\n wsAdapter.onWebSocketMessage = async (connId: string, message: string) => {\n return server.handleWebSocketMessage(connId, message);\n };\n\n eventBridge.start();\n eventBridgeRef.current = eventBridge;\n }\n\n try {\n await server.start();\n serverRef.current = server;\n setServerRunning(true);\n } catch (err) {\n console.warn('[ui-bridge-native] Failed to start HTTP server:', err);\n }\n }, [\n features.server,\n features.testHooks,\n config.serverPort,\n config.appInfo,\n registry,\n executor,\n serverAdapter,\n navigationProvider,\n screenshotProvider,\n routeProvider,\n ]);\n\n const stopServer = useCallback(() => {\n if (eventBridgeRef.current) {\n eventBridgeRef.current.stop();\n eventBridgeRef.current = null;\n }\n if (serverRef.current) {\n serverRef.current.stop().catch(() => {});\n serverRef.current = null;\n }\n setServerRunning(false);\n }, []);\n\n // Auto-start server if enabled\n useEffect(() => {\n if (features.server) {\n startServer();\n return () => stopServer();\n }\n }, [features.server, startServer, stopServer]);\n\n // Start mDNS announcement and cloud relay.\n //\n // The cloud relay path does NOT require the HTTP server to be running —\n // it calls `server.handleRequest()` directly, bypassing HTTP. This matters\n // for preview/production builds where `features.server` is typically\n // false (no native TCP server adapter available). We still need a\n // NativeUIBridgeServer instance to handle tunneled requests, so we create\n // a bare instance here if startServer() didn't already make one.\n //\n // mDNS also doesn't need the HTTP server — it just advertises on the\n // network so remote devices can discover this phone's address.\n useEffect(() => {\n // Everything here is best-effort — any exception must not crash the app.\n try {\n const needsBareServer = !serverRef.current && !!cloudRelayConfig;\n if (needsBareServer) {\n try {\n // Create a server instance for handleRequest() use only; no adapter,\n // no HTTP listener. This is safe without features.server.\n const bareServer = createNativeServer(registry, executor, {\n serverPort: config.serverPort || 8087,\n cors: true,\n appInfo: config.appInfo,\n testHooks: features.testHooks === true,\n });\n if (navigationProvider) bareServer.setNavigationProvider(navigationProvider);\n if (screenshotProvider) bareServer.setScreenshotProvider(screenshotProvider);\n if (routeProvider) bareServer.setRouteProvider(routeProvider);\n serverRef.current = bareServer;\n } catch (err) {\n console.warn('[ui-bridge-native] Failed to create bare server:', err);\n }\n }\n\n // mDNS advertisement\n if (enableMdnsAnnounce && deviceId) {\n try {\n const announcer = new DeviceAnnouncer({\n deviceId,\n appId: config.appInfo?.appId ?? 'unknown',\n port: config.serverPort ?? 8087,\n cloudRelayUrl: cloudRelayConfig?.relayUrl,\n cloudToken: cloudRelayConfig?.authToken,\n });\n announcerRef.current = announcer;\n void announcer.startMdnsAdvertise().catch((err) => {\n console.warn('[ui-bridge-native] mDNS advertise failed:', err);\n });\n } catch (err) {\n console.warn('[ui-bridge-native] Failed to start DeviceAnnouncer:', err);\n }\n }\n\n // Cloud relay tunnel (works without HTTP server)\n if (cloudRelayConfig && serverRef.current) {\n try {\n const relayClient = new CloudRelayClient({\n ...cloudRelayConfig,\n uiBridgeServer: serverRef.current,\n });\n cloudRelayRef.current = relayClient;\n relayClient.start();\n } catch (err) {\n console.warn('[ui-bridge-native] Failed to start CloudRelayClient:', err);\n }\n }\n } catch (err) {\n console.warn('[ui-bridge-native] Transport effect failed:', err);\n }\n\n return () => {\n try {\n if (announcerRef.current) {\n void announcerRef.current.stop().catch(() => {});\n announcerRef.current = null;\n }\n if (cloudRelayRef.current) {\n cloudRelayRef.current.stop();\n cloudRelayRef.current = null;\n }\n } catch {\n // cleanup must never throw\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n serverRunning,\n cloudRelayConfig?.relayUrl,\n cloudRelayConfig?.authToken,\n enableMdnsAnnounce,\n deviceId,\n ]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n stopServer();\n resetGlobalRegistry();\n };\n }, [stopServer]);\n\n // Context methods\n const getElements = useCallback(() => registry.getAllElements(), [registry]);\n\n const getComponents = useCallback(() => registry.getAllComponents(), [registry]);\n\n const createSnapshot = useCallback(() => registry.createSnapshot(), [registry]);\n\n const getCurrentRoute = useCallback(() => {\n return routeProvider?.getCurrentRoute() ?? null;\n }, [routeProvider]);\n\n // Mark the previous route's elements offscreen when the active route changes.\n // Without this, React Navigation's persistent-mount behavior leaves stale\n // layouts in the registry for tabs the user has left. Elements on the new\n // route re-fire `onLayout` and repopulate their layout.\n useEffect(() => {\n if (!routeProvider) return;\n\n let lastRoute: string | null = routeProvider.getCurrentRoute();\n\n return routeProvider.subscribe((current: string | null) => {\n if (current !== lastRoute && lastRoute != null) {\n registry.markRouteOffscreen(lastRoute);\n }\n lastRoute = current;\n });\n }, [routeProvider, registry]);\n\n // Wire trackers into the registry's snapshot enricher slots. Trackers are\n // stable refs, so this effect runs exactly once per provider lifecycle.\n useEffect(() => {\n registry.setEnrichers({ modalDetector, toastCapture, undoTracker });\n }, [registry, modalDetector, toastCapture, undoTracker]);\n\n // Mirror successful bridge actions into UndoTracker's rolling history so\n // snapshots can surface action-correlation undo context without each\n // action site needing to call recordAction manually.\n useEffect(() => {\n const unsubscribe = executor.onActionExecuted((event) => {\n if (!event.success) return;\n undoTracker.recordAction({\n id: event.requestId ?? `action-${event.timestamp}`,\n type: event.action,\n targetId: event.elementId,\n timestamp: event.timestamp,\n reversible: true,\n });\n });\n return unsubscribe;\n }, [executor, undoTracker]);\n\n const on = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.on(type, listener),\n [registry]\n );\n\n const off = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.off(type, listener),\n [registry]\n );\n\n const contextValue = useMemo<UIBridgeNativeContextValue>(\n () => ({\n features,\n config,\n registry,\n executor,\n modalDetector,\n toastCapture,\n undoTracker,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n initialized: true,\n serverRunning,\n startServer,\n stopServer,\n getCurrentRoute,\n }),\n [\n features,\n config,\n registry,\n executor,\n modalDetector,\n toastCapture,\n undoTracker,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n serverRunning,\n startServer,\n stopServer,\n getCurrentRoute,\n ]\n );\n\n return <UIBridgeNativeContext value={contextValue}>{children}</UIBridgeNativeContext>;\n}\n\n/**\n * useUIBridgeNative hook\n *\n * Access the UI Bridge Native context. Throws if used outside provider.\n */\nexport function useUIBridgeNative(): UIBridgeNativeContextValue {\n const context = use(UIBridgeNativeContext);\n if (!context) {\n throw new Error('useUIBridgeNative must be used within a UIBridgeNativeProvider');\n }\n return context;\n}\n\n/**\n * useUIBridgeNativeOptional hook\n *\n * Access the UI Bridge Native context, returning null if outside provider.\n */\nexport function useUIBridgeNativeOptional(): UIBridgeNativeContextValue | null {\n return use(UIBridgeNativeContext);\n}\n\n/**\n * useUIBridgeNativeRequired hook\n *\n * Alias for useUIBridgeNative (throws if outside provider).\n */\nexport const useUIBridgeNativeRequired = useUIBridgeNative;\n","/**\n * useUIElement Hook for React Native\n *\n * Register a native element with UI Bridge for control and observation.\n */\n\nimport { useRef, useEffect, useCallback, useMemo, useState } from 'react';\nimport { StyleSheet } from 'react-native';\nimport type {\n NativeElementType,\n NativeStandardAction,\n NativeCustomAction,\n NativeElementState,\n NativeElementIdentifier,\n RegisteredNativeElement,\n NativeElementRef,\n NativeLayout,\n} from '../core/types';\nimport { useUIBridgeNativeOptional } from './UIBridgeNativeProvider';\n\n/**\n * Flatten an RN style prop into a plain object.\n * Uses StyleSheet.flatten which handles arrays, IDs, and nested objects.\n */\nfunction flattenStyle(style: unknown): Record<string, unknown> | undefined {\n if (style == null) return undefined;\n try {\n const flat = StyleSheet.flatten(style as Parameters<typeof StyleSheet.flatten>[0]);\n return flat ? (flat as Record<string, unknown>) : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Flatten state style overrides into plain objects.\n */\nfunction flattenStateStyles(stateStyles?: {\n pressed?: unknown;\n focused?: unknown;\n disabled?: unknown;\n}):\n | {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n }\n | undefined {\n if (!stateStyles) return undefined;\n const result: {\n pressed?: Record<string, unknown>;\n focused?: Record<string, unknown>;\n disabled?: Record<string, unknown>;\n } = {};\n if (stateStyles.pressed != null) result.pressed = flattenStyle(stateStyles.pressed);\n if (stateStyles.focused != null) result.focused = flattenStyle(stateStyles.focused);\n if (stateStyles.disabled != null) result.disabled = flattenStyle(stateStyles.disabled);\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Local type definition for the layout data we extract from LayoutChangeEvent.\n * We use this internally to avoid type conflicts between different react-native versions\n * (e.g., when ui-bridge-native is used as a file: dependency with a different RN version).\n */\ninterface LayoutEventData {\n nativeEvent: {\n layout: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n };\n}\n\n/**\n * useUIElement options\n */\nexport interface UseUIElementOptions {\n /** Unique identifier for the element */\n id: string;\n /** Element type (defaults to 'custom') */\n type?: NativeElementType;\n /** Human-readable label */\n label?: string;\n /** Override available actions */\n actions?: NativeStandardAction[];\n /** Custom actions */\n customActions?: Record<string, NativeCustomAction>;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Callback when state changes */\n onStateChange?: (state: NativeElementState) => void;\n /** Parent component path for tree path generation */\n parentPath?: string;\n /** RN style prop — will be flattened for design review */\n style?: unknown;\n /** State-specific style overrides for design review (pressed, focused, disabled) */\n stateStyles?: {\n pressed?: unknown;\n focused?: unknown;\n disabled?: unknown;\n };\n /**\n * Handler props to auto-register with the bridge for action execution.\n * When provided, the bridge can invoke these handlers via press/type/toggle actions\n * without the component needing a separate useEffect + updateElementProps call.\n *\n * @example\n * ```tsx\n * const { ref, onLayout, bridgeProps } = useUIElement({\n * id: 'my-button',\n * type: 'pressable',\n * handlers: { onPress: handlePress },\n * });\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handlers?: Record<string, ((...args: any[]) => any) | undefined>;\n}\n\n/**\n * Bridge props to spread onto the component\n */\nexport interface UIBridgeProps {\n /** Test ID for automation */\n testID: string;\n /** Accessibility label */\n accessibilityLabel?: string;\n}\n\n/**\n * useUIElement return value\n */\nexport interface UseUIElementReturn {\n /** Ref to attach to the element */\n ref: React.RefObject<NativeElementRef>;\n /** onLayout handler to spread onto the element - uses generic type for RN version compatibility */\n onLayout: (event: {\n nativeEvent: { layout: { x: number; y: number; width: number; height: number } };\n }) => void;\n /** Props to spread onto the element for identification */\n bridgeProps: UIBridgeProps;\n /** Whether the element is registered */\n registered: boolean;\n /** Get current state */\n getState: () => NativeElementState | null;\n /** Get element identifier */\n getIdentifier: () => NativeElementIdentifier | null;\n /** Trigger an action on this element */\n trigger: (\n action: NativeStandardAction | string,\n params?: Record<string, unknown>\n ) => Promise<void>;\n /** Manually register the element */\n register: () => void;\n /** Manually unregister the element */\n unregister: () => void;\n /** The registered element info */\n registeredElement: RegisteredNativeElement | null;\n /** Update style for design review (flattens and stores in registry) */\n updateStyle: (\n style: unknown,\n stateStyles?: { pressed?: unknown; focused?: unknown; disabled?: unknown }\n ) => void;\n}\n\n/**\n * useUIElement hook for React Native\n *\n * Registers a native element with UI Bridge for programmatic control.\n *\n * @example\n * ```tsx\n * function SubmitButton() {\n * const { ref, onLayout, bridgeProps, trigger } = useUIElement({\n * id: 'submit-btn',\n * type: 'button',\n * label: 'Submit Form',\n * });\n *\n * return (\n * <Pressable\n * ref={ref}\n * onLayout={onLayout}\n * {...bridgeProps}\n * onPress={() => handleSubmit()}\n * >\n * <Text>Submit</Text>\n * </Pressable>\n * );\n * }\n * ```\n */\nexport function useUIElement(options: UseUIElementOptions): UseUIElementReturn {\n const bridge = useUIBridgeNativeOptional();\n const ref = useRef<NativeElementRef>(null);\n const [registered, setRegistered] = useState(false);\n const [_layout, setLayout] = useState<NativeLayout | null>(null);\n const propsRef = useRef<Record<string, unknown>>({});\n // Authoritative registration tracking. See the web `useUIElement` for\n // rationale: consumers commonly pass inline `style`/`stateStyles` objects,\n // and threading the `registered` state into the register useCallback's deps\n // creates a cleanup/run feedback loop past React's 50-update ceiling.\n const registeredRef = useRef(false);\n const registeredIdRef = useRef<string | null>(null);\n\n const {\n id,\n type = 'custom',\n label,\n actions,\n customActions,\n autoRegister = true,\n onStateChange,\n parentPath,\n style,\n stateStyles: stateStylesProp,\n handlers: handlersProp,\n } = options;\n\n // Build tree path\n const treePath = parentPath ? `${parentPath}/${id}` : id;\n\n // Bridge props to spread onto the element\n const bridgeProps: UIBridgeProps = useMemo(\n () => ({\n testID: id,\n accessibilityLabel: label,\n }),\n [id, label]\n );\n\n // Register the element\n const register = useCallback(() => {\n if (!bridge || registeredRef.current) return;\n\n bridge.registry.registerElement(id, ref, {\n type,\n label,\n actions,\n customActions,\n treePath,\n testId: id,\n accessibilityLabel: label,\n registrationRoute: bridge.getCurrentRoute(),\n flatStyle: flattenStyle(style),\n stateStyles: flattenStateStyles(stateStylesProp),\n });\n registeredRef.current = true;\n registeredIdRef.current = id;\n setRegistered(true);\n }, [bridge, id, type, label, actions, customActions, treePath, style, stateStylesProp]);\n\n // Unregister the element\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterElement(registeredIdRef.current ?? id);\n registeredRef.current = false;\n registeredIdRef.current = null;\n setRegistered(false);\n }, [bridge, id]);\n\n // Keep `onStateChange` in a ref so the layout callback doesn't get\n // re-created (and thereby miss the first layout event) when the consumer\n // passes an inline arrow function.\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => {\n onStateChangeRef.current = onStateChange;\n }, [onStateChange]);\n\n // Handle layout changes.\n //\n // Registry write gating uses `registeredRef.current` (not the React\n // `registered` state) so the very first `onLayout` event — which can fire\n // before `setRegistered(true)` has been committed by React — still pushes\n // layout into the registry. Without this, snapshots show layout `(?, ?)`\n // until the element is interacted with, because the initial onLayout's\n // closure captured `registered === false` and silently dropped the write.\n // updateElementState itself is also no-op when the id isn't registered,\n // so this is safe even when `onLayout` fires before mount.\n const onLayout = useCallback(\n (event: LayoutEventData) => {\n const { x, y, width, height } = event.nativeEvent.layout;\n\n const writeLayout = (newLayout: NativeLayout) => {\n setLayout(newLayout);\n if (!bridge) return;\n const newState: NativeElementState = {\n mounted: true,\n visible: width > 0 && height > 0,\n enabled: true,\n focused: false,\n layout: newLayout,\n };\n bridge.registry.updateElementState(id, newState);\n onStateChangeRef.current?.(newState);\n };\n\n // Get absolute position using measureInWindow when available.\n if (ref.current && 'measureInWindow' in ref.current) {\n (\n ref.current as {\n measureInWindow: (\n callback: (pageX: number, pageY: number, w: number, h: number) => void\n ) => void;\n }\n ).measureInWindow((pageX: number, pageY: number) => {\n writeLayout({ x, y, width, height, pageX, pageY });\n });\n } else {\n // Fallback when measureInWindow isn't on the ref (test fixtures, web).\n writeLayout({ x, y, width, height, pageX: x, pageY: y });\n }\n },\n [bridge, id]\n );\n\n // Keep latest register/unregister in refs so the auto-register effect does\n // not re-run when consumers pass inline `style`/`stateStyles` options.\n const registerRef = useRef(register);\n const unregisterRef = useRef(unregister);\n useEffect(() => {\n registerRef.current = register;\n unregisterRef.current = unregister;\n }, [register, unregister]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister) {\n registerRef.current();\n }\n\n return () => {\n if (registeredRef.current) {\n unregisterRef.current();\n }\n };\n }, [autoRegister, bridge]);\n\n // Layout-on-mount fallback.\n //\n // Bug being addressed: the registry's `layout` field shows `(?, ?)` until\n // the element is actioned. Two compounding causes:\n // 1. The first `onLayout` event used to drop its write because the\n // callback's closure captured `registered === false` (fixed above by\n // switching to a registry-only write path).\n // 2. Some consumers don't actually thread `onLayout={onLayout}` onto\n // their RN component, so the layout never measures.\n //\n // For (2), schedule a `measureInWindow` after registration. We still need\n // the consumer to thread the `ref` (which they always do — it's how\n // they get an actionable target), so this is best-effort: when ref is\n // populated and supports measureInWindow, push the result into the\n // registry. The dependency list is [bridge, registered, id] so this\n // re-runs once `register()` flips `registered` to true.\n useEffect(() => {\n if (!bridge || !registered) return;\n const node = ref.current as\n | (NativeElementRef & {\n measureInWindow?: (\n callback: (pageX: number, pageY: number, w: number, h: number) => void\n ) => void;\n })\n | null;\n if (!node || typeof node.measureInWindow !== 'function') return;\n\n let cancelled = false;\n node.measureInWindow((pageX: number, pageY: number, w: number, h: number) => {\n if (cancelled) return;\n // measureInWindow can return zeros before layout has actually run.\n // Skip writing then — `onLayout` (when wired) will fire with real\n // numbers shortly.\n if (w <= 0 || h <= 0) return;\n const newLayout: NativeLayout = {\n x: pageX,\n y: pageY,\n width: w,\n height: h,\n pageX,\n pageY,\n };\n setLayout(newLayout);\n const newState: NativeElementState = {\n mounted: true,\n visible: true,\n enabled: true,\n focused: false,\n layout: newLayout,\n };\n bridge.registry.updateElementState(id, newState);\n onStateChangeRef.current?.(newState);\n });\n return () => {\n cancelled = true;\n };\n }, [bridge, registered, id]);\n\n // Auto-register handler props (onPress, onChangeText, etc.) when provided.\n // We use a ref to track which keys were last registered so we can clear\n // stale handlers on cleanup or when the handlers object changes.\n const registeredHandlerKeysRef = useRef<string[]>([]);\n\n useEffect(() => {\n if (!bridge || !registered || !handlersProp) return;\n\n // Filter to only function values\n const fnProps: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(handlersProp)) {\n if (typeof value === 'function') {\n fnProps[key] = value;\n }\n }\n\n const newKeys = Object.keys(fnProps);\n\n // Clear any previously registered keys that are no longer present\n const removedKeys = registeredHandlerKeysRef.current.filter((k) => !newKeys.includes(k));\n if (removedKeys.length > 0) {\n const cleared: Record<string, unknown> = {};\n for (const key of removedKeys) {\n cleared[key] = undefined;\n }\n bridge.registry.updateElementProps(id, cleared);\n }\n\n if (newKeys.length > 0) {\n bridge.registry.updateElementProps(id, fnProps);\n }\n registeredHandlerKeysRef.current = newKeys;\n\n return () => {\n // On unmount or re-run, clear all registered handlers\n if (registeredHandlerKeysRef.current.length > 0) {\n const cleared: Record<string, unknown> = {};\n for (const key of registeredHandlerKeysRef.current) {\n cleared[key] = undefined;\n }\n bridge.registry.updateElementProps(id, cleared);\n registeredHandlerKeysRef.current = [];\n }\n };\n }, [bridge, registered, id, handlersProp]);\n\n // Update props for action execution (allows accessing onPress, onChangeText, etc.)\n const _updateProps = useCallback(\n (props: Record<string, unknown>) => {\n propsRef.current = { ...propsRef.current, ...props };\n if (bridge && registered) {\n bridge.registry.updateElementProps(id, props);\n }\n },\n [bridge, registered, id]\n );\n\n // Get state\n const getState = useCallback((): NativeElementState | null => {\n if (!bridge) return null;\n const element = bridge.registry.getElement(id);\n return element?.getState() || null;\n }, [bridge, id]);\n\n // Get identifier\n const getIdentifier = useCallback((): NativeElementIdentifier | null => {\n if (!bridge) return null;\n const element = bridge.registry.getElement(id);\n return element?.getIdentifier() || null;\n }, [bridge, id]);\n\n // Trigger action\n const trigger = useCallback(\n async (action: NativeStandardAction | string, params?: Record<string, unknown>) => {\n if (!bridge) {\n throw new Error('UI Bridge Native not available');\n }\n\n const response = await bridge.executor.executeAction(id, {\n action,\n params,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n },\n [bridge, id]\n );\n\n // Update style for design review\n const updateStyle = useCallback(\n (\n newStyle: unknown,\n newStateStyles?: { pressed?: unknown; focused?: unknown; disabled?: unknown }\n ) => {\n if (!bridge || !registered) return;\n const flat = flattenStyle(newStyle);\n if (flat) {\n bridge.registry.updateElementStyle(id, flat, flattenStateStyles(newStateStyles));\n }\n },\n [bridge, registered, id]\n );\n\n // Get registered element\n const registeredElement = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getElement(id) || null;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [bridge, id, registered]);\n\n return {\n ref,\n onLayout,\n bridgeProps,\n registered,\n getState,\n getIdentifier,\n trigger,\n register,\n unregister,\n registeredElement,\n updateStyle,\n };\n}\n\n/**\n * useUIElementWithProps hook\n *\n * Extended version that also captures component props for action execution.\n * Useful when you need the bridge to be able to call onPress, onChangeText, etc.\n *\n * @example\n * ```tsx\n * function TextInputField({ onChangeText, value }) {\n * const { ref, onLayout, bridgeProps, captureProps } = useUIElementWithProps({\n * id: 'email-input',\n * type: 'input',\n * });\n *\n * // Capture props so bridge can call onChangeText\n * captureProps({ onChangeText, value });\n *\n * return (\n * <TextInput\n * ref={ref}\n * onLayout={onLayout}\n * {...bridgeProps}\n * value={value}\n * onChangeText={onChangeText}\n * />\n * );\n * }\n * ```\n */\nexport interface UseUIElementWithPropsReturn extends UseUIElementReturn {\n /** Capture props for action execution */\n captureProps: (props: Record<string, unknown>) => void;\n}\n\nexport function useUIElementWithProps(options: UseUIElementOptions): UseUIElementWithPropsReturn {\n const elementReturn = useUIElement(options);\n const bridge = useUIBridgeNativeOptional();\n\n const captureProps = useCallback(\n (props: Record<string, unknown>) => {\n if (bridge && elementReturn.registered) {\n bridge.registry.updateElementProps(options.id, props);\n }\n },\n [bridge, elementReturn.registered, options.id]\n );\n\n return {\n ...elementReturn,\n captureProps,\n };\n}\n","/**\n * useUIComponent Hook for React Native\n *\n * Register a component with UI Bridge for component-level actions.\n */\n\nimport { useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { RegisteredNativeComponent } from '../core/types';\nimport { useUIBridgeNativeOptional } from './UIBridgeNativeProvider';\n\n/**\n * Action definition for useUIComponent\n */\nexport interface ComponentActionDef<TParams = unknown, TResult = unknown> {\n /** Action identifier */\n id: string;\n /** Human-readable label */\n label?: string;\n /** Description */\n description?: string;\n /** Handler function */\n handler: (params?: TParams) => TResult | Promise<TResult>;\n}\n\n/**\n * useUIComponent options\n */\nexport interface UseUIComponentOptions {\n /** Unique identifier for the component */\n id: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Actions available on this component */\n actions?: ComponentActionDef[];\n /** Child element IDs owned by this component */\n elementIds?: string[];\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\n/**\n * useUIComponent return value\n */\nexport interface UseUIComponentReturn {\n /** Whether the component is registered */\n registered: boolean;\n /** Execute an action on this component */\n executeAction: <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ) => Promise<TResult>;\n /** Manually register the component */\n register: () => void;\n /** Manually unregister the component */\n unregister: () => void;\n /** Update actions dynamically */\n updateActions: (actions: ComponentActionDef[]) => void;\n /** Add an element ID to this component */\n addElement: (elementId: string) => void;\n /** Remove an element ID from this component */\n removeElement: (elementId: string) => void;\n /** The registered component info */\n registeredComponent: RegisteredNativeComponent | null;\n}\n\n/**\n * useUIComponent hook for React Native\n *\n * Registers a component with UI Bridge for component-level control.\n * Components can expose high-level actions that may orchestrate multiple element interactions.\n *\n * @example\n * ```tsx\n * function LoginForm() {\n * const [email, setEmail] = useState('');\n * const [password, setPassword] = useState('');\n *\n * useUIComponent({\n * id: 'login-form',\n * name: 'Login Form',\n * actions: [\n * {\n * id: 'login',\n * label: 'Submit Login',\n * handler: async ({ email, password }) => {\n * setEmail(email);\n * setPassword(password);\n * await submitLogin();\n * },\n * },\n * {\n * id: 'clear',\n * label: 'Clear Form',\n * handler: () => {\n * setEmail('');\n * setPassword('');\n * },\n * },\n * ],\n * });\n *\n * return (\n * <View>\n * <TextInput value={email} onChangeText={setEmail} />\n * <TextInput value={password} onChangeText={setPassword} secureTextEntry />\n * <Button title=\"Login\" onPress={handleSubmit} />\n * </View>\n * );\n * }\n * ```\n */\nexport function useUIComponent(options: UseUIComponentOptions): UseUIComponentReturn {\n const bridge = useUIBridgeNativeOptional();\n const registeredRef = useRef(false);\n const registeredIdRef = useRef<string | null>(null);\n const actionsRef = useRef(options.actions || []);\n const elementIdsRef = useRef(options.elementIds || []);\n\n const { id, name, description, autoRegister = true } = options;\n\n // Update refs when options change\n useEffect(() => {\n actionsRef.current = options.actions || [];\n elementIdsRef.current = options.elementIds || [];\n }, [options.actions, options.elementIds]);\n\n // Register the component\n const register = useCallback(() => {\n if (!bridge || registeredRef.current) return;\n\n bridge.registry.registerComponent(id, {\n name,\n description,\n actions: actionsRef.current.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })),\n elementIds: elementIdsRef.current,\n });\n registeredRef.current = true;\n registeredIdRef.current = id;\n }, [bridge, id, name, description]);\n\n // Unregister the component\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterComponent(registeredIdRef.current ?? id);\n registeredRef.current = false;\n registeredIdRef.current = null;\n }, [bridge, id]);\n\n // Execute an action\n const executeAction = useCallback(\n async <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ): Promise<TResult> => {\n if (!bridge) {\n throw new Error('UI Bridge Native not available');\n }\n\n const response = await bridge.executor.executeComponentAction(id, {\n action: actionId,\n params: params as Record<string, unknown>,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n\n return response.result as TResult;\n },\n [bridge, id]\n );\n\n // Update actions dynamically\n const updateActions = useCallback(\n (actions: ComponentActionDef[]) => {\n actionsRef.current = actions;\n\n // Re-register with updated actions if already registered\n if (registeredRef.current && bridge) {\n bridge.registry.unregisterComponent(id);\n registeredRef.current = false;\n register();\n }\n },\n [bridge, id, register]\n );\n\n // Add element ID\n const addElement = useCallback((elementId: string) => {\n if (!elementIdsRef.current.includes(elementId)) {\n elementIdsRef.current = [...elementIdsRef.current, elementId];\n }\n }, []);\n\n // Remove element ID\n const removeElement = useCallback((elementId: string) => {\n elementIdsRef.current = elementIdsRef.current.filter((eid) => eid !== elementId);\n }, []);\n\n // Keep latest register/unregister in refs so the auto-register effect does\n // not re-run when consumers pass inline options.\n const registerRef = useRef(register);\n const unregisterRef = useRef(unregister);\n useEffect(() => {\n registerRef.current = register;\n unregisterRef.current = unregister;\n }, [register, unregister]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister) {\n registerRef.current();\n }\n\n return () => {\n if (registeredRef.current) {\n unregisterRef.current();\n }\n };\n }, [autoRegister, bridge]);\n\n // Get registered component\n const registeredComponent = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getComponent(id) || null;\n }, [bridge, id]);\n\n return {\n registered: registeredRef.current,\n executeAction,\n register,\n unregister,\n updateActions,\n addElement,\n removeElement,\n registeredComponent,\n };\n}\n\n/**\n * useUIComponentAction hook\n *\n * Create a stable action handler that can be used with useUIComponent.\n * Useful for memoizing action handlers.\n */\nexport function useUIComponentAction<TParams = unknown, TResult = unknown>(\n handler: (params?: TParams) => TResult | Promise<TResult>,\n deps: React.DependencyList\n): (params?: TParams) => TResult | Promise<TResult> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(handler, deps);\n}\n","/**\n * useUIBridge Hook for React Native\n *\n * Provides a simplified interface for common UI Bridge operations.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport type {\n NativeActionRequest,\n NativeActionResponse,\n NativeFindRequest,\n NativeFindResponse,\n NativeBridgeSnapshot,\n RegisteredNativeElement,\n RegisteredNativeComponent,\n Workflow,\n} from '../core/types';\nimport { useUIBridgeNativeOptional } from './UIBridgeNativeProvider';\n\n/**\n * Component action request\n */\nexport interface ComponentActionRequest {\n /** Action ID */\n action: string;\n /** Action parameters */\n params?: Record<string, unknown>;\n}\n\n/**\n * Component action response\n */\nexport interface ComponentActionResponse {\n /** Whether the action succeeded */\n success: boolean;\n /** Result of the action */\n result?: unknown;\n /** Error message if failed */\n error?: string;\n /** Duration in milliseconds */\n durationMs: number;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * useUIBridge return type\n */\nexport interface UseUIBridgeReturn {\n /** Whether UI Bridge is available */\n available: boolean;\n /** Whether UI Bridge is initialized */\n initialized: boolean;\n /** All registered elements */\n elements: RegisteredNativeElement[];\n /** All registered components */\n components: RegisteredNativeComponent[];\n /** All registered workflows */\n workflows: Workflow[];\n /** Create a snapshot of the current state */\n createSnapshot: () => NativeBridgeSnapshot;\n /** Execute an action on an element */\n executeAction: (elementId: string, request: NativeActionRequest) => Promise<NativeActionResponse>;\n /** Execute a component action */\n executeComponentAction: (\n componentId: string,\n request: ComponentActionRequest\n ) => Promise<ComponentActionResponse>;\n /** Find elements */\n find: (request?: NativeFindRequest) => Promise<NativeFindResponse>;\n /** Get an element by ID */\n getElement: (id: string) => RegisteredNativeElement | undefined;\n /** Get a component by ID */\n getComponent: (id: string) => RegisteredNativeComponent | undefined;\n /** Get element state by ID */\n getElementState: (id: string) => ReturnType<RegisteredNativeElement['getState']> | null;\n /** Register a workflow */\n registerWorkflow: (workflow: Workflow) => void;\n /** Unregister a workflow */\n unregisterWorkflow: (id: string) => void;\n}\n\n/**\n * useUIBridge hook\n *\n * Provides a simplified interface for accessing UI Bridge functionality.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { available, elements, executeAction, find } = useUIBridge();\n *\n * if (!available) {\n * return <Text>UI Bridge not available</Text>;\n * }\n *\n * const handlePress = async () => {\n * // Find all buttons\n * const result = await find({ types: ['button'] });\n * console.log('Found buttons:', result.elements);\n *\n * // Execute action on specific element\n * await executeAction('submit-btn', { action: 'press' });\n * };\n *\n * return (\n * <View>\n * <Text>Elements: {elements.length}</Text>\n * <Button title=\"Press\" onPress={handlePress} />\n * </View>\n * );\n * }\n * ```\n */\nexport function useUIBridge(): UseUIBridgeReturn {\n const bridge = useUIBridgeNativeOptional();\n\n const available = bridge !== null;\n const initialized = bridge?.initialized ?? false;\n\n // Get elements\n const elements = useMemo(() => (bridge ? bridge.getElements() : []), [bridge]);\n\n // Get components\n const components = useMemo(() => (bridge ? bridge.getComponents() : []), [bridge]);\n\n // Get workflows\n const workflows = useMemo(() => (bridge ? bridge.registry.getAllWorkflows() : []), [bridge]);\n\n // Create snapshot\n const createSnapshot = useCallback((): NativeBridgeSnapshot => {\n if (!bridge) {\n return {\n timestamp: Date.now(),\n elements: [],\n components: [],\n workflows: [],\n };\n }\n return bridge.createSnapshot();\n }, [bridge]);\n\n // Execute action\n const executeAction = useCallback(\n async (elementId: string, request: NativeActionRequest): Promise<NativeActionResponse> => {\n if (!bridge) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return bridge.executor.executeAction(elementId, request);\n },\n [bridge]\n );\n\n // Execute component action\n const executeComponentAction = useCallback(\n async (\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> => {\n if (!bridge) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return bridge.executor.executeComponentAction(componentId, request);\n },\n [bridge]\n );\n\n // Find elements\n const find = useCallback(\n async (request?: NativeFindRequest): Promise<NativeFindResponse> => {\n if (!bridge) {\n return {\n elements: [],\n total: 0,\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return bridge.executor.find(request || {});\n },\n [bridge]\n );\n\n // Get element\n const getElement = useCallback((id: string) => bridge?.registry.getElement(id), [bridge]);\n\n // Get component\n const getComponent = useCallback((id: string) => bridge?.registry.getComponent(id), [bridge]);\n\n // Get element state\n const getElementState = useCallback(\n (id: string) => {\n const element = bridge?.registry.getElement(id);\n return element?.getState() ?? null;\n },\n [bridge]\n );\n\n // Register workflow\n const registerWorkflow = useCallback(\n (workflow: Workflow) => {\n bridge?.registry.registerWorkflow(workflow);\n },\n [bridge]\n );\n\n // Unregister workflow\n const unregisterWorkflow = useCallback(\n (id: string) => {\n bridge?.registry.unregisterWorkflow(id);\n },\n [bridge]\n );\n\n return {\n available,\n initialized,\n elements,\n components,\n workflows,\n createSnapshot,\n executeAction,\n executeComponentAction,\n find,\n getElement,\n getComponent,\n getElementState,\n registerWorkflow,\n unregisterWorkflow,\n };\n}\n\n/**\n * useUIBridgeRequired hook\n *\n * Same as useUIBridge but throws if not available.\n */\nexport function useUIBridgeRequired(): UseUIBridgeReturn {\n const result = useUIBridge();\n if (!result.available) {\n throw new Error('useUIBridgeRequired must be used within a UIBridgeNativeProvider');\n }\n return result;\n}\n","/**\n * useAutoRegister Hook for React Native\n *\n * Enables automatic registration of interactive React Native components.\n * Unlike the web version, this doesn't use MutationObserver (no DOM).\n * Instead, it provides a simple API for components to register themselves.\n *\n * For comprehensive coverage in React Native, components should:\n * 1. Use this hook at the app root to enable the registry\n * 2. Use useUIElement on interactive components (or wrap with Pressable/TouchableOpacity)\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { useUIBridgeNativeOptional } from './UIBridgeNativeProvider';\nimport type { NativeElementRef } from '../core/types';\nimport type { RegisterElementOptions } from '../core/registry';\n\n/**\n * Options for auto-registration in React Native\n */\nexport interface NativeAutoRegisterOptions {\n /** Enable auto-registration (default: true in dev mode) */\n enabled?: boolean;\n /** Callback when element is registered */\n onRegister?: (id: string) => void;\n /** Callback when element is unregistered */\n onUnregister?: (id: string) => void;\n}\n\n/**\n * Handle returned by useAutoRegister for programmatic registration\n */\nexport interface NativeAutoRegisterHandle {\n /** Register an element programmatically */\n register: (\n id: string,\n ref: React.RefObject<NativeElementRef>,\n options?: RegisterElementOptions\n ) => void;\n /** Unregister an element programmatically */\n unregister: (id: string) => void;\n /** Check if auto-registration is enabled */\n isEnabled: boolean;\n}\n\n/**\n * Hook for enabling automatic element registration in React Native.\n *\n * Since React Native doesn't have a DOM to observe, this hook provides\n * a handle for programmatic registration. For most use cases, you should\n * use useUIElement directly on interactive components.\n *\n * @example\n * ```tsx\n * function App() {\n * const autoRegister = useAutoRegister({ enabled: __DEV__ });\n *\n * // Programmatic registration (rare use case)\n * useEffect(() => {\n * autoRegister.register('custom-element', {\n * type: 'button',\n * label: 'Custom Button',\n * });\n *\n * return () => autoRegister.unregister('custom-element');\n * }, []);\n *\n * return <YourApp />;\n * }\n * ```\n */\nexport function useAutoRegister(options: NativeAutoRegisterOptions = {}): NativeAutoRegisterHandle {\n // Note: __DEV__ is a React Native global, but TypeScript doesn't know about it by default\n // Using false as a safe default - consumers should explicitly set enabled: __DEV__ in their app\n const { enabled = false, onRegister, onUnregister } = options;\n\n const bridge = useUIBridgeNativeOptional();\n const registeredIdsRef = useRef(new Set<string>());\n\n /**\n * Register an element\n */\n const register = useCallback(\n (\n id: string,\n ref: React.RefObject<NativeElementRef>,\n elementOptions?: RegisterElementOptions\n ): void => {\n if (!enabled || !bridge?.registry) return;\n\n // Avoid duplicate registration\n if (registeredIdsRef.current.has(id)) return;\n\n bridge.registry.registerElement(id, ref, elementOptions);\n registeredIdsRef.current.add(id);\n onRegister?.(id);\n },\n [enabled, bridge, onRegister]\n );\n\n /**\n * Unregister an element\n */\n const unregister = useCallback(\n (id: string): void => {\n if (!bridge?.registry) return;\n\n bridge.registry.unregisterElement(id);\n registeredIdsRef.current.delete(id);\n onUnregister?.(id);\n },\n [bridge, onUnregister]\n );\n\n /**\n * Cleanup on unmount\n */\n useEffect(() => {\n // Capture ref at effect time so cleanup unregisters the exact same set\n // of IDs, regardless of any future ref reassignment.\n const registeredIds = registeredIdsRef.current;\n return () => {\n registeredIds.forEach((id) => {\n bridge?.registry.unregisterElement(id);\n });\n registeredIds.clear();\n };\n }, [bridge]);\n\n return {\n register,\n unregister,\n isEnabled: enabled && !!bridge?.registry,\n };\n}\n\nexport default useAutoRegister;\n","import { useEffect } from 'react';\nimport { useUIBridgeNative } from './UIBridgeNativeProvider';\nimport type { NativeModalInfo } from '../core/types';\n\nexport interface UseUIBridgeModalOptions {\n id: string;\n title?: string;\n type?: NativeModalInfo['type'];\n blocking?: boolean;\n dismissible?: boolean;\n}\n\n/**\n * Declarative hook: while mounted, registers a modal entry on the active\n * stack so UI Bridge snapshots reflect that a modal is open.\n */\nexport function useUIBridgeModal(opts: UseUIBridgeModalOptions): void {\n const { modalDetector } = useUIBridgeNative();\n const { id, title, type, blocking, dismissible } = opts;\n\n useEffect(() => {\n modalDetector.pushModal({ id, title, type, blocking, dismissible });\n return () => {\n modalDetector.dismissModal(id);\n };\n }, [modalDetector, id, title, type, blocking, dismissible]);\n}\n","import { useCallback, useEffect } from 'react';\nimport { useUIBridgeNative } from './UIBridgeNativeProvider';\nimport type { NativeCapturedToast } from '../core/types';\n\nexport interface UseUIBridgeToastOptions {\n id: string;\n message: string;\n level?: NativeCapturedToast['level'];\n}\n\n/**\n * Declarative hook: while mounted, surfaces a toast via the snapshot enricher.\n * Best for explicit-lifecycle toast components.\n */\nexport function useUIBridgeToast(opts: UseUIBridgeToastOptions): void {\n const { toastCapture } = useUIBridgeNative();\n const { id, message, level } = opts;\n\n useEffect(() => {\n toastCapture.recordToast({ id, message, level });\n return () => {\n toastCapture.dismissToast(id);\n };\n }, [toastCapture, id, message, level]);\n}\n\nexport interface ToastRecorderInput {\n id: string;\n message: string;\n level?: NativeCapturedToast['level'];\n}\n\n/**\n * Imperative hook: returns a `recordToast` callback for code that fires\n * toasts outside React (catch blocks, library callbacks, etc.).\n */\nexport function useToastRecorder(): {\n recordToast: (toast: ToastRecorderInput) => void;\n dismissToast: (id: string) => void;\n} {\n const { toastCapture } = useUIBridgeNative();\n const recordToast = useCallback(\n (toast: ToastRecorderInput) => {\n toastCapture.recordToast(toast);\n },\n [toastCapture]\n );\n const dismissToast = useCallback((id: string) => toastCapture.dismissToast(id), [toastCapture]);\n return { recordToast, dismissToast };\n}\n","import type { ReactElement, ReactNode } from 'react';\n\nexport interface StateAnnotationRequiredElement {\n role?: string;\n text?: string;\n testID?: string;\n [key: string]: unknown;\n}\n\nexport interface StateProps {\n id: string;\n name?: string;\n description?: string;\n requiredElements?: StateAnnotationRequiredElement[];\n blocking?: boolean;\n children?: ReactNode;\n [key: string]: unknown;\n}\n\nexport function State(props: StateProps): ReactElement {\n return <>{props.children}</>;\n}\n\nexport interface TransitionToProps {\n id: string;\n name?: string;\n fromStates?: string[];\n activateStates?: string[];\n exitStates?: string[];\n effect?: string;\n description?: string;\n children?: ReactNode;\n [key: string]: unknown;\n}\n\nexport function TransitionTo(props: TransitionToProps): ReactElement {\n return <>{props.children}</>;\n}\n"]}
|