@qontinui/ui-bridge 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/ai/index.d.mts +312 -155
  2. package/dist/ai/index.d.ts +312 -155
  3. package/dist/ai/index.js +2363 -67
  4. package/dist/ai/index.js.map +1 -1
  5. package/dist/ai/index.mjs +2328 -68
  6. package/dist/ai/index.mjs.map +1 -1
  7. package/dist/annotations/index.d.mts +218 -0
  8. package/dist/annotations/index.d.ts +218 -0
  9. package/dist/annotations/index.js +246 -0
  10. package/dist/annotations/index.js.map +1 -0
  11. package/dist/annotations/index.mjs +241 -0
  12. package/dist/annotations/index.mjs.map +1 -0
  13. package/dist/assertions-BSR3afVr.d.ts +161 -0
  14. package/dist/assertions-CTw1hfOx.d.mts +161 -0
  15. package/dist/babel-plugin/index.js +23 -34
  16. package/dist/babel-plugin/index.js.map +1 -1
  17. package/dist/babel-plugin/index.mjs +23 -34
  18. package/dist/babel-plugin/index.mjs.map +1 -1
  19. package/dist/browser-capture-Bms60T6f.d.mts +47 -0
  20. package/dist/browser-capture-CsTU29mb.d.ts +47 -0
  21. package/dist/control/index.d.mts +26 -7
  22. package/dist/control/index.d.ts +26 -7
  23. package/dist/control/index.js +276 -48
  24. package/dist/control/index.js.map +1 -1
  25. package/dist/control/index.mjs +276 -48
  26. package/dist/control/index.mjs.map +1 -1
  27. package/dist/core/index.d.mts +2 -2
  28. package/dist/core/index.d.ts +2 -2
  29. package/dist/core/index.js.map +1 -1
  30. package/dist/core/index.mjs.map +1 -1
  31. package/dist/debug/index.d.mts +5 -3
  32. package/dist/debug/index.d.ts +5 -3
  33. package/dist/debug/index.js +925 -1
  34. package/dist/debug/index.js.map +1 -1
  35. package/dist/debug/index.mjs +924 -2
  36. package/dist/debug/index.mjs.map +1 -1
  37. package/dist/index.d.mts +12 -7
  38. package/dist/index.d.ts +12 -7
  39. package/dist/index.js +4720 -173
  40. package/dist/index.js.map +1 -1
  41. package/dist/index.mjs +4656 -174
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/{metrics-DTA2bwG7.d.mts → metrics-DuA2qIIz.d.mts} +2 -2
  44. package/dist/{metrics-BfiT_rhZ.d.ts → metrics-KFAAKNEB.d.ts} +2 -2
  45. package/dist/native/control/index.js +2 -7
  46. package/dist/native/control/index.js.map +1 -1
  47. package/dist/native/control/index.mjs +2 -7
  48. package/dist/native/control/index.mjs.map +1 -1
  49. package/dist/native/core/index.js.map +1 -1
  50. package/dist/native/core/index.mjs.map +1 -1
  51. package/dist/native/debug/index.js +23 -66
  52. package/dist/native/debug/index.js.map +1 -1
  53. package/dist/native/debug/index.mjs +23 -66
  54. package/dist/native/debug/index.mjs.map +1 -1
  55. package/dist/native/index.js +89 -131
  56. package/dist/native/index.js.map +1 -1
  57. package/dist/native/index.mjs +89 -131
  58. package/dist/native/index.mjs.map +1 -1
  59. package/dist/native/react/index.js +28 -52
  60. package/dist/native/react/index.js.map +1 -1
  61. package/dist/native/react/index.mjs +28 -52
  62. package/dist/native/react/index.mjs.map +1 -1
  63. package/dist/native/server/index.js +38 -13
  64. package/dist/native/server/index.js.map +1 -1
  65. package/dist/native/server/index.mjs +38 -13
  66. package/dist/native/server/index.mjs.map +1 -1
  67. package/dist/react/index.d.mts +107 -8
  68. package/dist/react/index.d.ts +107 -8
  69. package/dist/react/index.js +2194 -84
  70. package/dist/react/index.js.map +1 -1
  71. package/dist/react/index.mjs +2194 -85
  72. package/dist/react/index.mjs.map +1 -1
  73. package/dist/{registry-BKLEm-yk.d.ts → registry-C6dDtn1v.d.ts} +27 -2
  74. package/dist/{registry-BmZgyCz8.d.mts → registry-POtcxnal.d.mts} +27 -2
  75. package/dist/render-log/index.d.mts +1 -1
  76. package/dist/render-log/index.d.ts +1 -1
  77. package/dist/server/express.d.mts +5 -4
  78. package/dist/server/express.d.ts +5 -4
  79. package/dist/server/express.js +104 -2
  80. package/dist/server/express.js.map +1 -1
  81. package/dist/server/express.mjs +104 -2
  82. package/dist/server/express.mjs.map +1 -1
  83. package/dist/server/handlers.d.mts +36 -5
  84. package/dist/server/handlers.d.ts +36 -5
  85. package/dist/server/handlers.js +3129 -224
  86. package/dist/server/handlers.js.map +1 -1
  87. package/dist/server/handlers.mjs +3129 -224
  88. package/dist/server/handlers.mjs.map +1 -1
  89. package/dist/server/index.d.mts +7 -5
  90. package/dist/server/index.d.ts +7 -5
  91. package/dist/server/index.js +3215 -183
  92. package/dist/server/index.js.map +1 -1
  93. package/dist/server/index.mjs +3215 -183
  94. package/dist/server/index.mjs.map +1 -1
  95. package/dist/server/nextjs.d.mts +6 -4
  96. package/dist/server/nextjs.d.ts +6 -4
  97. package/dist/server/nextjs.js +106 -3
  98. package/dist/server/nextjs.js.map +1 -1
  99. package/dist/server/nextjs.mjs +106 -3
  100. package/dist/server/nextjs.mjs.map +1 -1
  101. package/dist/server/standalone.d.mts +6 -5
  102. package/dist/server/standalone.d.ts +6 -5
  103. package/dist/server/standalone.js +131 -5
  104. package/dist/server/standalone.js.map +1 -1
  105. package/dist/server/standalone.mjs +131 -5
  106. package/dist/server/standalone.mjs.map +1 -1
  107. package/dist/specs/index.d.mts +365 -0
  108. package/dist/specs/index.d.ts +365 -0
  109. package/dist/specs/index.js +2809 -0
  110. package/dist/specs/index.js.map +1 -0
  111. package/dist/specs/index.mjs +2786 -0
  112. package/dist/specs/index.mjs.map +1 -0
  113. package/dist/{standalone-BURj8J3G.d.ts → standalone-B6GLIEmR.d.ts} +6 -2
  114. package/dist/{standalone-Dwmel29d.d.mts → standalone-CjdYqj3P.d.mts} +6 -2
  115. package/dist/{types-CHnlwiTK.d.ts → types-B2EfvEaq.d.ts} +83 -3
  116. package/dist/{types-B7J7noLK.d.mts → types-C7gVYRnF.d.ts} +72 -2
  117. package/dist/{types-BkNRILUa.d.ts → types-CJGrBEhC.d.mts} +72 -2
  118. package/dist/types-CebMQj76.d.ts +1275 -0
  119. package/dist/types-D_ypYl3T.d.mts +1275 -0
  120. package/dist/types-UBtp7R0u.d.mts +132 -0
  121. package/dist/types-UBtp7R0u.d.ts +132 -0
  122. package/dist/{types-CEQLnFMv.d.mts → types-gO696T_t.d.mts} +83 -3
  123. package/dist/{types-jKVgTI6_.d.mts → types-suaYwWWg.d.mts} +173 -2
  124. package/dist/{types-jKVgTI6_.d.ts → types-suaYwWWg.d.ts} +173 -2
  125. package/package.json +18 -2
  126. package/dist/types-B5Q0GVo0.d.mts +0 -646
  127. package/dist/types-DfPqwU-i.d.ts +0 -646
@@ -61,6 +61,27 @@ var UI_BRIDGE_NATIVE_ROUTES = {
61
61
  path: "/ui-bridge/control/workflow/:id/run",
62
62
  description: "Run a workflow"
63
63
  },
64
+ // Page Navigation
65
+ PAGE_REFRESH: {
66
+ method: "POST",
67
+ path: "/ui-bridge/control/page/refresh",
68
+ description: "Refresh the current page"
69
+ },
70
+ PAGE_NAVIGATE: {
71
+ method: "POST",
72
+ path: "/ui-bridge/control/page/navigate",
73
+ description: "Navigate to a URL"
74
+ },
75
+ PAGE_GO_BACK: {
76
+ method: "POST",
77
+ path: "/ui-bridge/control/page/back",
78
+ description: "Go back in navigation history"
79
+ },
80
+ PAGE_GO_FORWARD: {
81
+ method: "POST",
82
+ path: "/ui-bridge/control/page/forward",
83
+ description: "Go forward in navigation history"
84
+ },
64
85
  // Health
65
86
  HEALTH: {
66
87
  method: "GET",
@@ -222,6 +243,19 @@ function createServerHandlers(registry, executor) {
222
243
  status: "pending"
223
244
  });
224
245
  },
246
+ // Page Navigation (stubs — React Native apps should override with their navigation provider)
247
+ pageRefresh: async () => {
248
+ return error("Page refresh not supported on native platform", "NOT_SUPPORTED");
249
+ },
250
+ pageNavigate: async () => {
251
+ return error("Page navigation not supported on native platform", "NOT_SUPPORTED");
252
+ },
253
+ pageGoBack: async () => {
254
+ return error("Page go back not supported on native platform", "NOT_SUPPORTED");
255
+ },
256
+ pageGoForward: async () => {
257
+ return error("Page go forward not supported on native platform", "NOT_SUPPORTED");
258
+ },
225
259
  // Health
226
260
  health: async () => {
227
261
  const stats = registry.getStats();
@@ -262,22 +296,13 @@ var NativeUIBridgeServer = class {
262
296
  return;
263
297
  }
264
298
  if (!this.adapter) {
265
- console.warn(
266
- "[ui-bridge-native] No server adapter configured. Call setAdapter() first."
267
- );
268
- console.warn(
269
- "[ui-bridge-native] See documentation for supported adapters."
270
- );
299
+ console.warn("[ui-bridge-native] No server adapter configured. Call setAdapter() first.");
300
+ console.warn("[ui-bridge-native] See documentation for supported adapters.");
271
301
  return;
272
302
  }
273
- await this.adapter.start(
274
- this.config.serverPort,
275
- this.handleRequest.bind(this)
276
- );
303
+ await this.adapter.start(this.config.serverPort, this.handleRequest.bind(this));
277
304
  this.running = true;
278
- console.log(
279
- `[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`
280
- );
305
+ console.log(`[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`);
281
306
  }
282
307
  /**
283
308
  * Stop the HTTP server
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/native/server/types.ts","../../../src/native/server/handlers.ts","../../../src/native/server/http-server.ts"],"names":["error","params"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * UI Bridge Native Server Types\n *\n * Types for the embedded HTTP server.\n */\n\nimport type {\n NativeUIBridgeConfig,\n NativeActionResponse,\n NativeFindResponse,\n NativeBridgeSnapshot,\n} from '../core/types';\nimport type { ComponentActionResponse } from '../control/types';\n\n/**\n * Server configuration\n */\nexport interface NativeServerConfig extends NativeUIBridgeConfig {\n /** Enable CORS */\n cors?: boolean;\n /** Allowed origins for CORS */\n allowedOrigins?: string[];\n}\n\n/**\n * Route definition\n */\nexport interface RouteDefinition {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n description: string;\n}\n\n/**\n * All UI Bridge Native routes\n */\nexport const UI_BRIDGE_NATIVE_ROUTES: Record<string, RouteDefinition> = {\n // Control - Elements\n GET_ELEMENTS: {\n method: 'GET',\n path: '/ui-bridge/control/elements',\n description: 'List all registered elements',\n },\n GET_ELEMENT: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id',\n description: 'Get element details',\n },\n GET_ELEMENT_STATE: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id/state',\n description: 'Get element state',\n },\n EXECUTE_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/element/:id/action',\n description: 'Execute action on element',\n },\n\n // Control - Components\n GET_COMPONENTS: {\n method: 'GET',\n path: '/ui-bridge/control/components',\n description: 'List all registered components',\n },\n GET_COMPONENT: {\n method: 'GET',\n path: '/ui-bridge/control/component/:id',\n description: 'Get component details',\n },\n EXECUTE_COMPONENT_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/component/:id/action/:actionId',\n description: 'Execute component action',\n },\n\n // Discovery\n FIND: {\n method: 'POST',\n path: '/ui-bridge/control/find',\n description: 'Find elements matching criteria',\n },\n GET_SNAPSHOT: {\n method: 'GET',\n path: '/ui-bridge/control/snapshot',\n description: 'Get full bridge snapshot',\n },\n\n // Workflows\n GET_WORKFLOWS: {\n method: 'GET',\n path: '/ui-bridge/control/workflows',\n description: 'List all workflows',\n },\n RUN_WORKFLOW: {\n method: 'POST',\n path: '/ui-bridge/control/workflow/:id/run',\n description: 'Run a workflow',\n },\n\n // Health\n HEALTH: {\n method: 'GET',\n path: '/ui-bridge/health',\n description: 'Health check',\n },\n};\n\n/**\n * API response wrapper\n */\nexport interface APIResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n code?: string;\n timestamp: number;\n}\n\n/**\n * Handler context\n */\nexport interface HandlerContext {\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n}\n\n/**\n * Handler function type\n */\nexport type HandlerFunction<T = unknown> = (\n context: HandlerContext\n) => Promise<APIResponse<T>>;\n\n/**\n * Server handlers interface\n */\nexport interface NativeServerHandlers {\n // Elements\n getElements: HandlerFunction<{ elements: unknown[] }>;\n getElement: HandlerFunction<{ element: unknown }>;\n getElementState: HandlerFunction<{ state: unknown }>;\n executeAction: HandlerFunction<NativeActionResponse>;\n\n // Components\n getComponents: HandlerFunction<{ components: unknown[] }>;\n getComponent: HandlerFunction<{ component: unknown }>;\n executeComponentAction: HandlerFunction<ComponentActionResponse>;\n\n // Discovery\n find: HandlerFunction<NativeFindResponse>;\n getSnapshot: HandlerFunction<NativeBridgeSnapshot>;\n\n // Workflows\n getWorkflows: HandlerFunction<{ workflows: unknown[] }>;\n runWorkflow: HandlerFunction<{ runId: string; status: string }>;\n\n // Health\n health: HandlerFunction<{ status: string; timestamp: number }>;\n}\n","/**\n * UI Bridge Native Server Handlers\n *\n * Request handlers for the HTTP API endpoints.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { NativeActionExecutor } from '../control/types';\nimport type {\n APIResponse,\n HandlerContext,\n NativeServerHandlers,\n} from './types';\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): NativeServerHandlers {\n return {\n // Elements\n getElements: async () => {\n const elements = registry.getAllElements().map((e) => ({\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 }));\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 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\n ? Object.keys(element.customActions)\n : undefined,\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?: Record<string, unknown>;\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 as any,\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 find: async (ctx: HandlerContext) => {\n const body = ctx.body as {\n types?: string[];\n testIdPattern?: string;\n accessibilityLabelPattern?: string;\n visibleOnly?: boolean;\n limit?: number;\n };\n\n const response = await executor.find({\n types: body?.types as any,\n testIdPattern: body?.testIdPattern,\n accessibilityLabelPattern: body?.accessibilityLabelPattern,\n visibleOnly: body?.visibleOnly,\n limit: body?.limit,\n });\n\n return success(response);\n },\n\n getSnapshot: async () => {\n const snapshot = registry.createSnapshot();\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 // TODO: Implement workflow execution\n return success({\n runId: `run-${Date.now()}`,\n status: 'pending',\n });\n },\n\n // Health\n health: async () => {\n const stats = registry.getStats();\n return success({\n status: 'healthy',\n timestamp: Date.now(),\n ...stats,\n });\n },\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 } from '../control/types';\nimport type {\n NativeServerConfig,\n NativeServerHandlers,\n APIResponse,\n} from './types';\nimport { createServerHandlers } from './handlers';\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 * 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 constructor(\n private registry: NativeUIBridgeRegistry,\n private executor: NativeActionExecutor,\n config: NativeServerConfig = {}\n ) {\n this.config = {\n serverPort: 9876,\n cors: true,\n ...config,\n };\n this.handlers = createServerHandlers(registry, executor);\n }\n\n /**\n * Set the server adapter\n */\n setAdapter(adapter: ServerAdapter): void {\n this.adapter = adapter;\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(\n '[ui-bridge-native] No server adapter configured. Call setAdapter() first.'\n );\n console.warn(\n '[ui-bridge-native] See documentation for supported adapters.'\n );\n return;\n }\n\n await this.adapter.start(\n this.config.serverPort!,\n this.handleRequest.bind(this)\n );\n this.running = true;\n\n console.log(\n `[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`\n );\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 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 /**\n * Handle incoming HTTP request\n */\n private 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 request to appropriate handler\n */\n private async routeRequest(request: HTTPRequest): Promise<APIResponse> {\n const { method, path, query, body } = request;\n\n // Parse path parameters\n const parsePath = (\n pattern: string,\n actual: string\n ): 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\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\n return params;\n };\n\n // Health check\n if (method === 'GET' && path === '/ui-bridge/health') {\n return this.handlers.health({ params: {}, query, body });\n }\n\n // Elements\n if (method === 'GET' && path === '/ui-bridge/control/elements') {\n return this.handlers.getElements({ params: {}, query, body });\n }\n\n let params = parsePath('/ui-bridge/control/element/:id', path);\n if (method === 'GET' && params) {\n return this.handlers.getElement({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/element/:id/state', path);\n if (method === 'GET' && params) {\n return this.handlers.getElementState({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/element/:id/action', path);\n if (method === 'POST' && params) {\n return this.handlers.executeAction({ params, query, body });\n }\n\n // Components\n if (method === 'GET' && path === '/ui-bridge/control/components') {\n return this.handlers.getComponents({ params: {}, query, body });\n }\n\n params = parsePath('/ui-bridge/control/component/:id', path);\n if (method === 'GET' && params) {\n return this.handlers.getComponent({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/component/:id/action/:actionId', path);\n if (method === 'POST' && params) {\n return this.handlers.executeComponentAction({ params, query, body });\n }\n\n // Discovery\n if (method === 'POST' && path === '/ui-bridge/control/find') {\n return this.handlers.find({ params: {}, query, body });\n }\n\n if (method === 'GET' && path === '/ui-bridge/control/snapshot') {\n return this.handlers.getSnapshot({ params: {}, query, body });\n }\n\n // Workflows\n if (method === 'GET' && path === '/ui-bridge/control/workflows') {\n return this.handlers.getWorkflows({ params: {}, query, body });\n }\n\n params = parsePath('/ui-bridge/control/workflow/:id/run', path);\n if (method === 'POST' && params) {\n return this.handlers.runWorkflow({ params, query, body });\n }\n\n // Not found\n return {\n success: false,\n error: `Route not found: ${method} ${path}`,\n code: '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"]}
1
+ {"version":3,"sources":["../../../src/native/server/types.ts","../../../src/native/server/handlers.ts","../../../src/native/server/http-server.ts"],"names":["error","params"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * UI Bridge Native Server Types\n *\n * Types for the embedded HTTP server.\n */\n\nimport type {\n NativeUIBridgeConfig,\n NativeActionResponse,\n NativeFindResponse,\n NativeBridgeSnapshot,\n} from '../core/types';\nimport type { ComponentActionResponse, PageNavigationResponse } from '../control/types';\n\n/**\n * Server configuration\n */\nexport interface NativeServerConfig extends NativeUIBridgeConfig {\n /** Enable CORS */\n cors?: boolean;\n /** Allowed origins for CORS */\n allowedOrigins?: string[];\n}\n\n/**\n * Route definition\n */\nexport interface RouteDefinition {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n description: string;\n}\n\n/**\n * All UI Bridge Native routes\n */\nexport const UI_BRIDGE_NATIVE_ROUTES: Record<string, RouteDefinition> = {\n // Control - Elements\n GET_ELEMENTS: {\n method: 'GET',\n path: '/ui-bridge/control/elements',\n description: 'List all registered elements',\n },\n GET_ELEMENT: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id',\n description: 'Get element details',\n },\n GET_ELEMENT_STATE: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id/state',\n description: 'Get element state',\n },\n EXECUTE_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/element/:id/action',\n description: 'Execute action on element',\n },\n\n // Control - Components\n GET_COMPONENTS: {\n method: 'GET',\n path: '/ui-bridge/control/components',\n description: 'List all registered components',\n },\n GET_COMPONENT: {\n method: 'GET',\n path: '/ui-bridge/control/component/:id',\n description: 'Get component details',\n },\n EXECUTE_COMPONENT_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/component/:id/action/:actionId',\n description: 'Execute component action',\n },\n\n // Discovery\n FIND: {\n method: 'POST',\n path: '/ui-bridge/control/find',\n description: 'Find elements matching criteria',\n },\n GET_SNAPSHOT: {\n method: 'GET',\n path: '/ui-bridge/control/snapshot',\n description: 'Get full bridge snapshot',\n },\n\n // Workflows\n GET_WORKFLOWS: {\n method: 'GET',\n path: '/ui-bridge/control/workflows',\n description: 'List all workflows',\n },\n RUN_WORKFLOW: {\n method: 'POST',\n path: '/ui-bridge/control/workflow/:id/run',\n description: 'Run a workflow',\n },\n\n // Page Navigation\n PAGE_REFRESH: {\n method: 'POST',\n path: '/ui-bridge/control/page/refresh',\n description: 'Refresh the current page',\n },\n PAGE_NAVIGATE: {\n method: 'POST',\n path: '/ui-bridge/control/page/navigate',\n description: 'Navigate to a URL',\n },\n PAGE_GO_BACK: {\n method: 'POST',\n path: '/ui-bridge/control/page/back',\n description: 'Go back in navigation history',\n },\n PAGE_GO_FORWARD: {\n method: 'POST',\n path: '/ui-bridge/control/page/forward',\n description: 'Go forward in navigation history',\n },\n\n // Health\n HEALTH: {\n method: 'GET',\n path: '/ui-bridge/health',\n description: 'Health check',\n },\n};\n\n/**\n * API response wrapper\n */\nexport interface APIResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n code?: string;\n timestamp: number;\n}\n\n/**\n * Handler context\n */\nexport interface HandlerContext {\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n}\n\n/**\n * Handler function type\n */\nexport type HandlerFunction<T = unknown> = (context: HandlerContext) => Promise<APIResponse<T>>;\n\n/**\n * Server handlers interface\n */\nexport interface NativeServerHandlers {\n // Elements\n getElements: HandlerFunction<{ elements: unknown[] }>;\n getElement: HandlerFunction<{ element: unknown }>;\n getElementState: HandlerFunction<{ state: unknown }>;\n executeAction: HandlerFunction<NativeActionResponse>;\n\n // Components\n getComponents: HandlerFunction<{ components: unknown[] }>;\n getComponent: HandlerFunction<{ component: unknown }>;\n executeComponentAction: HandlerFunction<ComponentActionResponse>;\n\n // Discovery\n find: HandlerFunction<NativeFindResponse>;\n getSnapshot: HandlerFunction<NativeBridgeSnapshot>;\n\n // Workflows\n getWorkflows: HandlerFunction<{ workflows: unknown[] }>;\n runWorkflow: HandlerFunction<{ runId: string; status: string }>;\n\n // Page Navigation\n pageRefresh: HandlerFunction<PageNavigationResponse>;\n pageNavigate: HandlerFunction<PageNavigationResponse>;\n pageGoBack: HandlerFunction<PageNavigationResponse>;\n pageGoForward: HandlerFunction<PageNavigationResponse>;\n\n // Health\n health: HandlerFunction<{ status: string; timestamp: number }>;\n}\n","/**\n * UI Bridge Native Server Handlers\n *\n * Request handlers for the HTTP API endpoints.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { NativeActionExecutor } from '../control/types';\nimport type { APIResponse, HandlerContext, NativeServerHandlers } from './types';\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): NativeServerHandlers {\n return {\n // Elements\n getElements: async () => {\n const elements = registry.getAllElements().map((e) => ({\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 }));\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 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 },\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?: Record<string, unknown>;\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 as any,\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 find: async (ctx: HandlerContext) => {\n const body = ctx.body as {\n types?: string[];\n testIdPattern?: string;\n accessibilityLabelPattern?: string;\n visibleOnly?: boolean;\n limit?: number;\n };\n\n const response = await executor.find({\n types: body?.types as any,\n testIdPattern: body?.testIdPattern,\n accessibilityLabelPattern: body?.accessibilityLabelPattern,\n visibleOnly: body?.visibleOnly,\n limit: body?.limit,\n });\n\n return success(response);\n },\n\n getSnapshot: async () => {\n const snapshot = registry.createSnapshot();\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 // TODO: Implement workflow execution\n return success({\n runId: `run-${Date.now()}`,\n status: 'pending',\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 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 // Health\n health: async () => {\n const stats = registry.getStats();\n return success({\n status: 'healthy',\n timestamp: Date.now(),\n ...stats,\n });\n },\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 } from '../control/types';\nimport type { NativeServerConfig, NativeServerHandlers, APIResponse } from './types';\nimport { createServerHandlers } from './handlers';\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 * 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 constructor(\n private registry: NativeUIBridgeRegistry,\n private executor: NativeActionExecutor,\n config: NativeServerConfig = {}\n ) {\n this.config = {\n serverPort: 9876,\n cors: true,\n ...config,\n };\n this.handlers = createServerHandlers(registry, executor);\n }\n\n /**\n * Set the server adapter\n */\n setAdapter(adapter: ServerAdapter): void {\n this.adapter = adapter;\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 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 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 /**\n * Handle incoming HTTP request\n */\n private 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 request to appropriate handler\n */\n private async routeRequest(request: HTTPRequest): Promise<APIResponse> {\n const { method, path, query, body } = request;\n\n // Parse path parameters\n const 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\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\n return params;\n };\n\n // Health check\n if (method === 'GET' && path === '/ui-bridge/health') {\n return this.handlers.health({ params: {}, query, body });\n }\n\n // Elements\n if (method === 'GET' && path === '/ui-bridge/control/elements') {\n return this.handlers.getElements({ params: {}, query, body });\n }\n\n let params = parsePath('/ui-bridge/control/element/:id', path);\n if (method === 'GET' && params) {\n return this.handlers.getElement({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/element/:id/state', path);\n if (method === 'GET' && params) {\n return this.handlers.getElementState({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/element/:id/action', path);\n if (method === 'POST' && params) {\n return this.handlers.executeAction({ params, query, body });\n }\n\n // Components\n if (method === 'GET' && path === '/ui-bridge/control/components') {\n return this.handlers.getComponents({ params: {}, query, body });\n }\n\n params = parsePath('/ui-bridge/control/component/:id', path);\n if (method === 'GET' && params) {\n return this.handlers.getComponent({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/component/:id/action/:actionId', path);\n if (method === 'POST' && params) {\n return this.handlers.executeComponentAction({ params, query, body });\n }\n\n // Discovery\n if (method === 'POST' && path === '/ui-bridge/control/find') {\n return this.handlers.find({ params: {}, query, body });\n }\n\n if (method === 'GET' && path === '/ui-bridge/control/snapshot') {\n return this.handlers.getSnapshot({ params: {}, query, body });\n }\n\n // Workflows\n if (method === 'GET' && path === '/ui-bridge/control/workflows') {\n return this.handlers.getWorkflows({ params: {}, query, body });\n }\n\n params = parsePath('/ui-bridge/control/workflow/:id/run', path);\n if (method === 'POST' && params) {\n return this.handlers.runWorkflow({ params, query, body });\n }\n\n // Not found\n return {\n success: false,\n error: `Route not found: ${method} ${path}`,\n code: '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"]}
@@ -59,6 +59,27 @@ var UI_BRIDGE_NATIVE_ROUTES = {
59
59
  path: "/ui-bridge/control/workflow/:id/run",
60
60
  description: "Run a workflow"
61
61
  },
62
+ // Page Navigation
63
+ PAGE_REFRESH: {
64
+ method: "POST",
65
+ path: "/ui-bridge/control/page/refresh",
66
+ description: "Refresh the current page"
67
+ },
68
+ PAGE_NAVIGATE: {
69
+ method: "POST",
70
+ path: "/ui-bridge/control/page/navigate",
71
+ description: "Navigate to a URL"
72
+ },
73
+ PAGE_GO_BACK: {
74
+ method: "POST",
75
+ path: "/ui-bridge/control/page/back",
76
+ description: "Go back in navigation history"
77
+ },
78
+ PAGE_GO_FORWARD: {
79
+ method: "POST",
80
+ path: "/ui-bridge/control/page/forward",
81
+ description: "Go forward in navigation history"
82
+ },
62
83
  // Health
63
84
  HEALTH: {
64
85
  method: "GET",
@@ -220,6 +241,19 @@ function createServerHandlers(registry, executor) {
220
241
  status: "pending"
221
242
  });
222
243
  },
244
+ // Page Navigation (stubs — React Native apps should override with their navigation provider)
245
+ pageRefresh: async () => {
246
+ return error("Page refresh not supported on native platform", "NOT_SUPPORTED");
247
+ },
248
+ pageNavigate: async () => {
249
+ return error("Page navigation not supported on native platform", "NOT_SUPPORTED");
250
+ },
251
+ pageGoBack: async () => {
252
+ return error("Page go back not supported on native platform", "NOT_SUPPORTED");
253
+ },
254
+ pageGoForward: async () => {
255
+ return error("Page go forward not supported on native platform", "NOT_SUPPORTED");
256
+ },
223
257
  // Health
224
258
  health: async () => {
225
259
  const stats = registry.getStats();
@@ -260,22 +294,13 @@ var NativeUIBridgeServer = class {
260
294
  return;
261
295
  }
262
296
  if (!this.adapter) {
263
- console.warn(
264
- "[ui-bridge-native] No server adapter configured. Call setAdapter() first."
265
- );
266
- console.warn(
267
- "[ui-bridge-native] See documentation for supported adapters."
268
- );
297
+ console.warn("[ui-bridge-native] No server adapter configured. Call setAdapter() first.");
298
+ console.warn("[ui-bridge-native] See documentation for supported adapters.");
269
299
  return;
270
300
  }
271
- await this.adapter.start(
272
- this.config.serverPort,
273
- this.handleRequest.bind(this)
274
- );
301
+ await this.adapter.start(this.config.serverPort, this.handleRequest.bind(this));
275
302
  this.running = true;
276
- console.log(
277
- `[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`
278
- );
303
+ console.log(`[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`);
279
304
  }
280
305
  /**
281
306
  * Stop the HTTP server
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/native/server/types.ts","../../../src/native/server/handlers.ts","../../../src/native/server/http-server.ts"],"names":["error","params"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * UI Bridge Native Server Types\n *\n * Types for the embedded HTTP server.\n */\n\nimport type {\n NativeUIBridgeConfig,\n NativeActionResponse,\n NativeFindResponse,\n NativeBridgeSnapshot,\n} from '../core/types';\nimport type { ComponentActionResponse } from '../control/types';\n\n/**\n * Server configuration\n */\nexport interface NativeServerConfig extends NativeUIBridgeConfig {\n /** Enable CORS */\n cors?: boolean;\n /** Allowed origins for CORS */\n allowedOrigins?: string[];\n}\n\n/**\n * Route definition\n */\nexport interface RouteDefinition {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n description: string;\n}\n\n/**\n * All UI Bridge Native routes\n */\nexport const UI_BRIDGE_NATIVE_ROUTES: Record<string, RouteDefinition> = {\n // Control - Elements\n GET_ELEMENTS: {\n method: 'GET',\n path: '/ui-bridge/control/elements',\n description: 'List all registered elements',\n },\n GET_ELEMENT: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id',\n description: 'Get element details',\n },\n GET_ELEMENT_STATE: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id/state',\n description: 'Get element state',\n },\n EXECUTE_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/element/:id/action',\n description: 'Execute action on element',\n },\n\n // Control - Components\n GET_COMPONENTS: {\n method: 'GET',\n path: '/ui-bridge/control/components',\n description: 'List all registered components',\n },\n GET_COMPONENT: {\n method: 'GET',\n path: '/ui-bridge/control/component/:id',\n description: 'Get component details',\n },\n EXECUTE_COMPONENT_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/component/:id/action/:actionId',\n description: 'Execute component action',\n },\n\n // Discovery\n FIND: {\n method: 'POST',\n path: '/ui-bridge/control/find',\n description: 'Find elements matching criteria',\n },\n GET_SNAPSHOT: {\n method: 'GET',\n path: '/ui-bridge/control/snapshot',\n description: 'Get full bridge snapshot',\n },\n\n // Workflows\n GET_WORKFLOWS: {\n method: 'GET',\n path: '/ui-bridge/control/workflows',\n description: 'List all workflows',\n },\n RUN_WORKFLOW: {\n method: 'POST',\n path: '/ui-bridge/control/workflow/:id/run',\n description: 'Run a workflow',\n },\n\n // Health\n HEALTH: {\n method: 'GET',\n path: '/ui-bridge/health',\n description: 'Health check',\n },\n};\n\n/**\n * API response wrapper\n */\nexport interface APIResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n code?: string;\n timestamp: number;\n}\n\n/**\n * Handler context\n */\nexport interface HandlerContext {\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n}\n\n/**\n * Handler function type\n */\nexport type HandlerFunction<T = unknown> = (\n context: HandlerContext\n) => Promise<APIResponse<T>>;\n\n/**\n * Server handlers interface\n */\nexport interface NativeServerHandlers {\n // Elements\n getElements: HandlerFunction<{ elements: unknown[] }>;\n getElement: HandlerFunction<{ element: unknown }>;\n getElementState: HandlerFunction<{ state: unknown }>;\n executeAction: HandlerFunction<NativeActionResponse>;\n\n // Components\n getComponents: HandlerFunction<{ components: unknown[] }>;\n getComponent: HandlerFunction<{ component: unknown }>;\n executeComponentAction: HandlerFunction<ComponentActionResponse>;\n\n // Discovery\n find: HandlerFunction<NativeFindResponse>;\n getSnapshot: HandlerFunction<NativeBridgeSnapshot>;\n\n // Workflows\n getWorkflows: HandlerFunction<{ workflows: unknown[] }>;\n runWorkflow: HandlerFunction<{ runId: string; status: string }>;\n\n // Health\n health: HandlerFunction<{ status: string; timestamp: number }>;\n}\n","/**\n * UI Bridge Native Server Handlers\n *\n * Request handlers for the HTTP API endpoints.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { NativeActionExecutor } from '../control/types';\nimport type {\n APIResponse,\n HandlerContext,\n NativeServerHandlers,\n} from './types';\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): NativeServerHandlers {\n return {\n // Elements\n getElements: async () => {\n const elements = registry.getAllElements().map((e) => ({\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 }));\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 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\n ? Object.keys(element.customActions)\n : undefined,\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?: Record<string, unknown>;\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 as any,\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 find: async (ctx: HandlerContext) => {\n const body = ctx.body as {\n types?: string[];\n testIdPattern?: string;\n accessibilityLabelPattern?: string;\n visibleOnly?: boolean;\n limit?: number;\n };\n\n const response = await executor.find({\n types: body?.types as any,\n testIdPattern: body?.testIdPattern,\n accessibilityLabelPattern: body?.accessibilityLabelPattern,\n visibleOnly: body?.visibleOnly,\n limit: body?.limit,\n });\n\n return success(response);\n },\n\n getSnapshot: async () => {\n const snapshot = registry.createSnapshot();\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 // TODO: Implement workflow execution\n return success({\n runId: `run-${Date.now()}`,\n status: 'pending',\n });\n },\n\n // Health\n health: async () => {\n const stats = registry.getStats();\n return success({\n status: 'healthy',\n timestamp: Date.now(),\n ...stats,\n });\n },\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 } from '../control/types';\nimport type {\n NativeServerConfig,\n NativeServerHandlers,\n APIResponse,\n} from './types';\nimport { createServerHandlers } from './handlers';\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 * 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 constructor(\n private registry: NativeUIBridgeRegistry,\n private executor: NativeActionExecutor,\n config: NativeServerConfig = {}\n ) {\n this.config = {\n serverPort: 9876,\n cors: true,\n ...config,\n };\n this.handlers = createServerHandlers(registry, executor);\n }\n\n /**\n * Set the server adapter\n */\n setAdapter(adapter: ServerAdapter): void {\n this.adapter = adapter;\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(\n '[ui-bridge-native] No server adapter configured. Call setAdapter() first.'\n );\n console.warn(\n '[ui-bridge-native] See documentation for supported adapters.'\n );\n return;\n }\n\n await this.adapter.start(\n this.config.serverPort!,\n this.handleRequest.bind(this)\n );\n this.running = true;\n\n console.log(\n `[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`\n );\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 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 /**\n * Handle incoming HTTP request\n */\n private 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 request to appropriate handler\n */\n private async routeRequest(request: HTTPRequest): Promise<APIResponse> {\n const { method, path, query, body } = request;\n\n // Parse path parameters\n const parsePath = (\n pattern: string,\n actual: string\n ): 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\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\n return params;\n };\n\n // Health check\n if (method === 'GET' && path === '/ui-bridge/health') {\n return this.handlers.health({ params: {}, query, body });\n }\n\n // Elements\n if (method === 'GET' && path === '/ui-bridge/control/elements') {\n return this.handlers.getElements({ params: {}, query, body });\n }\n\n let params = parsePath('/ui-bridge/control/element/:id', path);\n if (method === 'GET' && params) {\n return this.handlers.getElement({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/element/:id/state', path);\n if (method === 'GET' && params) {\n return this.handlers.getElementState({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/element/:id/action', path);\n if (method === 'POST' && params) {\n return this.handlers.executeAction({ params, query, body });\n }\n\n // Components\n if (method === 'GET' && path === '/ui-bridge/control/components') {\n return this.handlers.getComponents({ params: {}, query, body });\n }\n\n params = parsePath('/ui-bridge/control/component/:id', path);\n if (method === 'GET' && params) {\n return this.handlers.getComponent({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/component/:id/action/:actionId', path);\n if (method === 'POST' && params) {\n return this.handlers.executeComponentAction({ params, query, body });\n }\n\n // Discovery\n if (method === 'POST' && path === '/ui-bridge/control/find') {\n return this.handlers.find({ params: {}, query, body });\n }\n\n if (method === 'GET' && path === '/ui-bridge/control/snapshot') {\n return this.handlers.getSnapshot({ params: {}, query, body });\n }\n\n // Workflows\n if (method === 'GET' && path === '/ui-bridge/control/workflows') {\n return this.handlers.getWorkflows({ params: {}, query, body });\n }\n\n params = parsePath('/ui-bridge/control/workflow/:id/run', path);\n if (method === 'POST' && params) {\n return this.handlers.runWorkflow({ params, query, body });\n }\n\n // Not found\n return {\n success: false,\n error: `Route not found: ${method} ${path}`,\n code: '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"]}
1
+ {"version":3,"sources":["../../../src/native/server/types.ts","../../../src/native/server/handlers.ts","../../../src/native/server/http-server.ts"],"names":["error","params"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * UI Bridge Native Server Types\n *\n * Types for the embedded HTTP server.\n */\n\nimport type {\n NativeUIBridgeConfig,\n NativeActionResponse,\n NativeFindResponse,\n NativeBridgeSnapshot,\n} from '../core/types';\nimport type { ComponentActionResponse, PageNavigationResponse } from '../control/types';\n\n/**\n * Server configuration\n */\nexport interface NativeServerConfig extends NativeUIBridgeConfig {\n /** Enable CORS */\n cors?: boolean;\n /** Allowed origins for CORS */\n allowedOrigins?: string[];\n}\n\n/**\n * Route definition\n */\nexport interface RouteDefinition {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n description: string;\n}\n\n/**\n * All UI Bridge Native routes\n */\nexport const UI_BRIDGE_NATIVE_ROUTES: Record<string, RouteDefinition> = {\n // Control - Elements\n GET_ELEMENTS: {\n method: 'GET',\n path: '/ui-bridge/control/elements',\n description: 'List all registered elements',\n },\n GET_ELEMENT: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id',\n description: 'Get element details',\n },\n GET_ELEMENT_STATE: {\n method: 'GET',\n path: '/ui-bridge/control/element/:id/state',\n description: 'Get element state',\n },\n EXECUTE_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/element/:id/action',\n description: 'Execute action on element',\n },\n\n // Control - Components\n GET_COMPONENTS: {\n method: 'GET',\n path: '/ui-bridge/control/components',\n description: 'List all registered components',\n },\n GET_COMPONENT: {\n method: 'GET',\n path: '/ui-bridge/control/component/:id',\n description: 'Get component details',\n },\n EXECUTE_COMPONENT_ACTION: {\n method: 'POST',\n path: '/ui-bridge/control/component/:id/action/:actionId',\n description: 'Execute component action',\n },\n\n // Discovery\n FIND: {\n method: 'POST',\n path: '/ui-bridge/control/find',\n description: 'Find elements matching criteria',\n },\n GET_SNAPSHOT: {\n method: 'GET',\n path: '/ui-bridge/control/snapshot',\n description: 'Get full bridge snapshot',\n },\n\n // Workflows\n GET_WORKFLOWS: {\n method: 'GET',\n path: '/ui-bridge/control/workflows',\n description: 'List all workflows',\n },\n RUN_WORKFLOW: {\n method: 'POST',\n path: '/ui-bridge/control/workflow/:id/run',\n description: 'Run a workflow',\n },\n\n // Page Navigation\n PAGE_REFRESH: {\n method: 'POST',\n path: '/ui-bridge/control/page/refresh',\n description: 'Refresh the current page',\n },\n PAGE_NAVIGATE: {\n method: 'POST',\n path: '/ui-bridge/control/page/navigate',\n description: 'Navigate to a URL',\n },\n PAGE_GO_BACK: {\n method: 'POST',\n path: '/ui-bridge/control/page/back',\n description: 'Go back in navigation history',\n },\n PAGE_GO_FORWARD: {\n method: 'POST',\n path: '/ui-bridge/control/page/forward',\n description: 'Go forward in navigation history',\n },\n\n // Health\n HEALTH: {\n method: 'GET',\n path: '/ui-bridge/health',\n description: 'Health check',\n },\n};\n\n/**\n * API response wrapper\n */\nexport interface APIResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n code?: string;\n timestamp: number;\n}\n\n/**\n * Handler context\n */\nexport interface HandlerContext {\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n}\n\n/**\n * Handler function type\n */\nexport type HandlerFunction<T = unknown> = (context: HandlerContext) => Promise<APIResponse<T>>;\n\n/**\n * Server handlers interface\n */\nexport interface NativeServerHandlers {\n // Elements\n getElements: HandlerFunction<{ elements: unknown[] }>;\n getElement: HandlerFunction<{ element: unknown }>;\n getElementState: HandlerFunction<{ state: unknown }>;\n executeAction: HandlerFunction<NativeActionResponse>;\n\n // Components\n getComponents: HandlerFunction<{ components: unknown[] }>;\n getComponent: HandlerFunction<{ component: unknown }>;\n executeComponentAction: HandlerFunction<ComponentActionResponse>;\n\n // Discovery\n find: HandlerFunction<NativeFindResponse>;\n getSnapshot: HandlerFunction<NativeBridgeSnapshot>;\n\n // Workflows\n getWorkflows: HandlerFunction<{ workflows: unknown[] }>;\n runWorkflow: HandlerFunction<{ runId: string; status: string }>;\n\n // Page Navigation\n pageRefresh: HandlerFunction<PageNavigationResponse>;\n pageNavigate: HandlerFunction<PageNavigationResponse>;\n pageGoBack: HandlerFunction<PageNavigationResponse>;\n pageGoForward: HandlerFunction<PageNavigationResponse>;\n\n // Health\n health: HandlerFunction<{ status: string; timestamp: number }>;\n}\n","/**\n * UI Bridge Native Server Handlers\n *\n * Request handlers for the HTTP API endpoints.\n */\n\nimport type { NativeUIBridgeRegistry } from '../core/registry';\nimport type { NativeActionExecutor } from '../control/types';\nimport type { APIResponse, HandlerContext, NativeServerHandlers } from './types';\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): NativeServerHandlers {\n return {\n // Elements\n getElements: async () => {\n const elements = registry.getAllElements().map((e) => ({\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 }));\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 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 },\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?: Record<string, unknown>;\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 as any,\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 find: async (ctx: HandlerContext) => {\n const body = ctx.body as {\n types?: string[];\n testIdPattern?: string;\n accessibilityLabelPattern?: string;\n visibleOnly?: boolean;\n limit?: number;\n };\n\n const response = await executor.find({\n types: body?.types as any,\n testIdPattern: body?.testIdPattern,\n accessibilityLabelPattern: body?.accessibilityLabelPattern,\n visibleOnly: body?.visibleOnly,\n limit: body?.limit,\n });\n\n return success(response);\n },\n\n getSnapshot: async () => {\n const snapshot = registry.createSnapshot();\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 // TODO: Implement workflow execution\n return success({\n runId: `run-${Date.now()}`,\n status: 'pending',\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 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 // Health\n health: async () => {\n const stats = registry.getStats();\n return success({\n status: 'healthy',\n timestamp: Date.now(),\n ...stats,\n });\n },\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 } from '../control/types';\nimport type { NativeServerConfig, NativeServerHandlers, APIResponse } from './types';\nimport { createServerHandlers } from './handlers';\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 * 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 constructor(\n private registry: NativeUIBridgeRegistry,\n private executor: NativeActionExecutor,\n config: NativeServerConfig = {}\n ) {\n this.config = {\n serverPort: 9876,\n cors: true,\n ...config,\n };\n this.handlers = createServerHandlers(registry, executor);\n }\n\n /**\n * Set the server adapter\n */\n setAdapter(adapter: ServerAdapter): void {\n this.adapter = adapter;\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 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 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 /**\n * Handle incoming HTTP request\n */\n private 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 request to appropriate handler\n */\n private async routeRequest(request: HTTPRequest): Promise<APIResponse> {\n const { method, path, query, body } = request;\n\n // Parse path parameters\n const 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\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\n return params;\n };\n\n // Health check\n if (method === 'GET' && path === '/ui-bridge/health') {\n return this.handlers.health({ params: {}, query, body });\n }\n\n // Elements\n if (method === 'GET' && path === '/ui-bridge/control/elements') {\n return this.handlers.getElements({ params: {}, query, body });\n }\n\n let params = parsePath('/ui-bridge/control/element/:id', path);\n if (method === 'GET' && params) {\n return this.handlers.getElement({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/element/:id/state', path);\n if (method === 'GET' && params) {\n return this.handlers.getElementState({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/element/:id/action', path);\n if (method === 'POST' && params) {\n return this.handlers.executeAction({ params, query, body });\n }\n\n // Components\n if (method === 'GET' && path === '/ui-bridge/control/components') {\n return this.handlers.getComponents({ params: {}, query, body });\n }\n\n params = parsePath('/ui-bridge/control/component/:id', path);\n if (method === 'GET' && params) {\n return this.handlers.getComponent({ params, query, body });\n }\n\n params = parsePath('/ui-bridge/control/component/:id/action/:actionId', path);\n if (method === 'POST' && params) {\n return this.handlers.executeComponentAction({ params, query, body });\n }\n\n // Discovery\n if (method === 'POST' && path === '/ui-bridge/control/find') {\n return this.handlers.find({ params: {}, query, body });\n }\n\n if (method === 'GET' && path === '/ui-bridge/control/snapshot') {\n return this.handlers.getSnapshot({ params: {}, query, body });\n }\n\n // Workflows\n if (method === 'GET' && path === '/ui-bridge/control/workflows') {\n return this.handlers.getWorkflows({ params: {}, query, body });\n }\n\n params = parsePath('/ui-bridge/control/workflow/:id/run', path);\n if (method === 'POST' && params) {\n return this.handlers.runWorkflow({ params, query, body });\n }\n\n // Not found\n return {\n success: false,\n error: `Route not found: ${method} ${path}`,\n code: '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"]}