@qontinui/ui-bridge 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/ai/index.d.mts +893 -0
  2. package/dist/ai/index.d.ts +893 -0
  3. package/dist/ai/index.js +3897 -0
  4. package/dist/ai/index.js.map +1 -0
  5. package/dist/ai/index.mjs +3839 -0
  6. package/dist/ai/index.mjs.map +1 -0
  7. package/dist/babel-plugin/index.js +515 -0
  8. package/dist/babel-plugin/index.js.map +1 -0
  9. package/dist/babel-plugin/index.mjs +499 -0
  10. package/dist/babel-plugin/index.mjs.map +1 -0
  11. package/dist/control/index.d.mts +5 -4
  12. package/dist/control/index.d.ts +5 -4
  13. package/dist/core/index.d.mts +115 -42
  14. package/dist/core/index.d.ts +115 -42
  15. package/dist/core/index.js +0 -983
  16. package/dist/core/index.js.map +1 -1
  17. package/dist/core/index.mjs +1 -972
  18. package/dist/core/index.mjs.map +1 -1
  19. package/dist/debug/index.d.mts +3 -3
  20. package/dist/debug/index.d.ts +3 -3
  21. package/dist/index.d.mts +8 -7
  22. package/dist/index.d.ts +8 -7
  23. package/dist/index.js +8249 -4163
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.mjs +8193 -4152
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/{metrics-QCnK0EFw.d.ts → metrics-BfiT_rhZ.d.ts} +2 -2
  28. package/dist/{metrics-BCG7z7Aq.d.mts → metrics-DTA2bwG7.d.mts} +2 -2
  29. package/dist/native/control/index.js +453 -0
  30. package/dist/native/control/index.js.map +1 -0
  31. package/dist/native/control/index.mjs +450 -0
  32. package/dist/native/control/index.mjs.map +1 -0
  33. package/dist/native/core/index.js +486 -0
  34. package/dist/native/core/index.js.map +1 -0
  35. package/dist/native/core/index.mjs +475 -0
  36. package/dist/native/core/index.mjs.map +1 -0
  37. package/dist/native/debug/index.js +451 -0
  38. package/dist/native/debug/index.js.map +1 -0
  39. package/dist/native/debug/index.mjs +449 -0
  40. package/dist/native/debug/index.mjs.map +1 -0
  41. package/dist/native/index.js +2274 -0
  42. package/dist/native/index.js.map +1 -0
  43. package/dist/native/index.mjs +2246 -0
  44. package/dist/native/index.mjs.map +1 -0
  45. package/dist/native/react/index.js +1401 -0
  46. package/dist/native/react/index.js.map +1 -0
  47. package/dist/native/react/index.mjs +1389 -0
  48. package/dist/native/react/index.mjs.map +1 -0
  49. package/dist/native/server/index.js +415 -0
  50. package/dist/native/server/index.js.map +1 -0
  51. package/dist/native/server/index.mjs +410 -0
  52. package/dist/native/server/index.mjs.map +1 -0
  53. package/dist/react/index.d.mts +20 -6
  54. package/dist/react/index.d.ts +20 -6
  55. package/dist/react/index.js +629 -14
  56. package/dist/react/index.js.map +1 -1
  57. package/dist/react/index.mjs +629 -14
  58. package/dist/react/index.mjs.map +1 -1
  59. package/dist/{registry-CT6BVVKr.d.mts → registry-BKLEm-yk.d.ts} +29 -14
  60. package/dist/{registry-D4mQ01B3.d.ts → registry-BmZgyCz8.d.mts} +29 -14
  61. package/dist/render-log/index.d.mts +1 -1
  62. package/dist/render-log/index.d.ts +1 -1
  63. package/dist/server/express.d.mts +36 -0
  64. package/dist/server/express.d.ts +36 -0
  65. package/dist/server/express.js +196 -0
  66. package/dist/server/express.js.map +1 -0
  67. package/dist/server/express.mjs +192 -0
  68. package/dist/server/express.mjs.map +1 -0
  69. package/dist/server/handlers.d.mts +93 -0
  70. package/dist/server/handlers.d.ts +93 -0
  71. package/dist/server/handlers.js +4278 -0
  72. package/dist/server/handlers.js.map +1 -0
  73. package/dist/server/handlers.mjs +4275 -0
  74. package/dist/server/handlers.mjs.map +1 -0
  75. package/dist/server/index.d.mts +10 -0
  76. package/dist/server/index.d.ts +10 -0
  77. package/dist/server/index.js +5352 -0
  78. package/dist/server/index.js.map +1 -0
  79. package/dist/server/index.mjs +5337 -0
  80. package/dist/server/index.mjs.map +1 -0
  81. package/dist/server/nextjs.d.mts +126 -0
  82. package/dist/server/nextjs.d.ts +126 -0
  83. package/dist/server/nextjs.js +287 -0
  84. package/dist/server/nextjs.js.map +1 -0
  85. package/dist/server/nextjs.mjs +282 -0
  86. package/dist/server/nextjs.mjs.map +1 -0
  87. package/dist/server/standalone.d.mts +6 -0
  88. package/dist/server/standalone.d.ts +6 -0
  89. package/dist/server/standalone.js +719 -0
  90. package/dist/server/standalone.js.map +1 -0
  91. package/dist/server/standalone.mjs +715 -0
  92. package/dist/server/standalone.mjs.map +1 -0
  93. package/dist/standalone-BURj8J3G.d.ts +212 -0
  94. package/dist/standalone-Dwmel29d.d.mts +212 -0
  95. package/dist/swc-plugin/index.d.mts +79 -0
  96. package/dist/swc-plugin/index.d.ts +79 -0
  97. package/dist/swc-plugin/index.js +15 -0
  98. package/dist/swc-plugin/index.js.map +1 -0
  99. package/dist/swc-plugin/index.mjs +9 -0
  100. package/dist/swc-plugin/index.mjs.map +1 -0
  101. package/dist/types-B5Q0GVo0.d.mts +646 -0
  102. package/dist/{types-DdJD9yw5.d.mts → types-B7J7noLK.d.mts} +1 -1
  103. package/dist/{types-BDkXy5si.d.ts → types-BkNRILUa.d.ts} +1 -1
  104. package/dist/types-CEQLnFMv.d.mts +156 -0
  105. package/dist/types-CHnlwiTK.d.ts +156 -0
  106. package/dist/types-DfPqwU-i.d.ts +646 -0
  107. package/dist/{types-BpvpStn3.d.mts → types-jKVgTI6_.d.mts} +364 -160
  108. package/dist/{types-BpvpStn3.d.ts → types-jKVgTI6_.d.ts} +364 -160
  109. package/package.json +111 -3
  110. package/swc-plugin-wasm/ui_bridge_swc_plugin.wasm +0 -0
  111. package/dist/websocket-client-B2LC9CYc.d.mts +0 -124
  112. package/dist/websocket-client-DupH0X7B.d.ts +0 -124
@@ -0,0 +1,410 @@
1
+ // src/native/server/types.ts
2
+ var UI_BRIDGE_NATIVE_ROUTES = {
3
+ // Control - Elements
4
+ GET_ELEMENTS: {
5
+ method: "GET",
6
+ path: "/ui-bridge/control/elements",
7
+ description: "List all registered elements"
8
+ },
9
+ GET_ELEMENT: {
10
+ method: "GET",
11
+ path: "/ui-bridge/control/element/:id",
12
+ description: "Get element details"
13
+ },
14
+ GET_ELEMENT_STATE: {
15
+ method: "GET",
16
+ path: "/ui-bridge/control/element/:id/state",
17
+ description: "Get element state"
18
+ },
19
+ EXECUTE_ACTION: {
20
+ method: "POST",
21
+ path: "/ui-bridge/control/element/:id/action",
22
+ description: "Execute action on element"
23
+ },
24
+ // Control - Components
25
+ GET_COMPONENTS: {
26
+ method: "GET",
27
+ path: "/ui-bridge/control/components",
28
+ description: "List all registered components"
29
+ },
30
+ GET_COMPONENT: {
31
+ method: "GET",
32
+ path: "/ui-bridge/control/component/:id",
33
+ description: "Get component details"
34
+ },
35
+ EXECUTE_COMPONENT_ACTION: {
36
+ method: "POST",
37
+ path: "/ui-bridge/control/component/:id/action/:actionId",
38
+ description: "Execute component action"
39
+ },
40
+ // Discovery
41
+ FIND: {
42
+ method: "POST",
43
+ path: "/ui-bridge/control/find",
44
+ description: "Find elements matching criteria"
45
+ },
46
+ GET_SNAPSHOT: {
47
+ method: "GET",
48
+ path: "/ui-bridge/control/snapshot",
49
+ description: "Get full bridge snapshot"
50
+ },
51
+ // Workflows
52
+ GET_WORKFLOWS: {
53
+ method: "GET",
54
+ path: "/ui-bridge/control/workflows",
55
+ description: "List all workflows"
56
+ },
57
+ RUN_WORKFLOW: {
58
+ method: "POST",
59
+ path: "/ui-bridge/control/workflow/:id/run",
60
+ description: "Run a workflow"
61
+ },
62
+ // Health
63
+ HEALTH: {
64
+ method: "GET",
65
+ path: "/ui-bridge/health",
66
+ description: "Health check"
67
+ }
68
+ };
69
+
70
+ // src/native/server/handlers.ts
71
+ function success(data) {
72
+ return {
73
+ success: true,
74
+ data,
75
+ timestamp: Date.now()
76
+ };
77
+ }
78
+ function error(message, code) {
79
+ return {
80
+ success: false,
81
+ error: message,
82
+ code,
83
+ timestamp: Date.now()
84
+ };
85
+ }
86
+ function createServerHandlers(registry, executor) {
87
+ return {
88
+ // Elements
89
+ getElements: async () => {
90
+ const elements = registry.getAllElements().map((e) => ({
91
+ id: e.id,
92
+ type: e.type,
93
+ label: e.label,
94
+ identifier: e.getIdentifier(),
95
+ state: e.getState(),
96
+ actions: e.actions,
97
+ customActions: e.customActions ? Object.keys(e.customActions) : void 0
98
+ }));
99
+ return success({ elements });
100
+ },
101
+ getElement: async (ctx) => {
102
+ const { id } = ctx.params;
103
+ const element = registry.getElement(id);
104
+ if (!element) {
105
+ return error(`Element not found: ${id}`, "ELEMENT_NOT_FOUND");
106
+ }
107
+ return success({
108
+ element: {
109
+ id: element.id,
110
+ type: element.type,
111
+ label: element.label,
112
+ identifier: element.getIdentifier(),
113
+ state: element.getState(),
114
+ actions: element.actions,
115
+ customActions: element.customActions ? Object.keys(element.customActions) : void 0
116
+ }
117
+ });
118
+ },
119
+ getElementState: async (ctx) => {
120
+ const { id } = ctx.params;
121
+ const element = registry.getElement(id);
122
+ if (!element) {
123
+ return error(`Element not found: ${id}`, "ELEMENT_NOT_FOUND");
124
+ }
125
+ return success({ state: element.getState() });
126
+ },
127
+ executeAction: async (ctx) => {
128
+ const { id } = ctx.params;
129
+ const body = ctx.body;
130
+ if (!body?.action) {
131
+ return error("Action is required", "INVALID_REQUEST");
132
+ }
133
+ const response = await executor.executeAction(id, {
134
+ action: body.action,
135
+ params: body.params,
136
+ waitOptions: body.waitOptions
137
+ });
138
+ if (!response.success) {
139
+ return error(response.error || "Action failed", "ACTION_FAILED");
140
+ }
141
+ return success(response);
142
+ },
143
+ // Components
144
+ getComponents: async () => {
145
+ const components = registry.getAllComponents().map((c) => ({
146
+ id: c.id,
147
+ name: c.name,
148
+ description: c.description,
149
+ actions: c.actions.map((a) => ({ id: a.id, label: a.label })),
150
+ elementIds: c.elementIds
151
+ }));
152
+ return success({ components });
153
+ },
154
+ getComponent: async (ctx) => {
155
+ const { id } = ctx.params;
156
+ const component = registry.getComponent(id);
157
+ if (!component) {
158
+ return error(`Component not found: ${id}`, "COMPONENT_NOT_FOUND");
159
+ }
160
+ return success({
161
+ component: {
162
+ id: component.id,
163
+ name: component.name,
164
+ description: component.description,
165
+ actions: component.actions.map((a) => ({
166
+ id: a.id,
167
+ label: a.label,
168
+ description: a.description
169
+ })),
170
+ elementIds: component.elementIds
171
+ }
172
+ });
173
+ },
174
+ executeComponentAction: async (ctx) => {
175
+ const { id, actionId } = ctx.params;
176
+ const body = ctx.body;
177
+ const response = await executor.executeComponentAction(id, {
178
+ action: actionId,
179
+ params: body?.params
180
+ });
181
+ if (!response.success) {
182
+ return error(response.error || "Action failed", "ACTION_FAILED");
183
+ }
184
+ return success(response);
185
+ },
186
+ // Discovery
187
+ find: async (ctx) => {
188
+ const body = ctx.body;
189
+ const response = await executor.find({
190
+ types: body?.types,
191
+ testIdPattern: body?.testIdPattern,
192
+ accessibilityLabelPattern: body?.accessibilityLabelPattern,
193
+ visibleOnly: body?.visibleOnly,
194
+ limit: body?.limit
195
+ });
196
+ return success(response);
197
+ },
198
+ getSnapshot: async () => {
199
+ const snapshot = registry.createSnapshot();
200
+ return success(snapshot);
201
+ },
202
+ // Workflows
203
+ getWorkflows: async () => {
204
+ const workflows = registry.getAllWorkflows().map((w) => ({
205
+ id: w.id,
206
+ name: w.name,
207
+ description: w.description,
208
+ stepCount: w.steps.length
209
+ }));
210
+ return success({ workflows });
211
+ },
212
+ runWorkflow: async (ctx) => {
213
+ const { id } = ctx.params;
214
+ const workflow = registry.getWorkflow(id);
215
+ if (!workflow) {
216
+ return error(`Workflow not found: ${id}`, "WORKFLOW_NOT_FOUND");
217
+ }
218
+ return success({
219
+ runId: `run-${Date.now()}`,
220
+ status: "pending"
221
+ });
222
+ },
223
+ // Health
224
+ health: async () => {
225
+ const stats = registry.getStats();
226
+ return success({
227
+ status: "healthy",
228
+ timestamp: Date.now(),
229
+ ...stats
230
+ });
231
+ }
232
+ };
233
+ }
234
+
235
+ // src/native/server/http-server.ts
236
+ var NativeUIBridgeServer = class {
237
+ constructor(registry, executor, config = {}) {
238
+ this.registry = registry;
239
+ this.executor = executor;
240
+ this.running = false;
241
+ this.config = {
242
+ serverPort: 9876,
243
+ cors: true,
244
+ ...config
245
+ };
246
+ this.handlers = createServerHandlers(registry, executor);
247
+ }
248
+ /**
249
+ * Set the server adapter
250
+ */
251
+ setAdapter(adapter) {
252
+ this.adapter = adapter;
253
+ }
254
+ /**
255
+ * Start the HTTP server
256
+ */
257
+ async start() {
258
+ if (this.running) {
259
+ console.warn("[ui-bridge-native] Server already running");
260
+ return;
261
+ }
262
+ 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
+ );
269
+ return;
270
+ }
271
+ await this.adapter.start(
272
+ this.config.serverPort,
273
+ this.handleRequest.bind(this)
274
+ );
275
+ this.running = true;
276
+ console.log(
277
+ `[ui-bridge-native] HTTP server started on port ${this.config.serverPort}`
278
+ );
279
+ }
280
+ /**
281
+ * Stop the HTTP server
282
+ */
283
+ async stop() {
284
+ if (!this.running || !this.adapter) {
285
+ return;
286
+ }
287
+ await this.adapter.stop();
288
+ this.running = false;
289
+ console.log("[ui-bridge-native] HTTP server stopped");
290
+ }
291
+ /**
292
+ * Check if server is running
293
+ */
294
+ isRunning() {
295
+ return this.running;
296
+ }
297
+ /**
298
+ * Handle incoming HTTP request
299
+ */
300
+ async handleRequest(request) {
301
+ const headers = {
302
+ "Content-Type": "application/json"
303
+ };
304
+ if (this.config.cors) {
305
+ headers["Access-Control-Allow-Origin"] = this.config.allowedOrigins ? this.config.allowedOrigins.join(",") : "*";
306
+ headers["Access-Control-Allow-Methods"] = "GET, POST, PUT, DELETE, OPTIONS";
307
+ headers["Access-Control-Allow-Headers"] = "Content-Type, Authorization";
308
+ }
309
+ if (request.method === "OPTIONS") {
310
+ return { status: 204, headers, body: "" };
311
+ }
312
+ try {
313
+ const response = await this.routeRequest(request);
314
+ return {
315
+ status: response.success ? 200 : 400,
316
+ headers,
317
+ body: JSON.stringify(response)
318
+ };
319
+ } catch (error2) {
320
+ const errorResponse = {
321
+ success: false,
322
+ error: error2 instanceof Error ? error2.message : "Internal server error",
323
+ code: "INTERNAL_ERROR",
324
+ timestamp: Date.now()
325
+ };
326
+ return {
327
+ status: 500,
328
+ headers,
329
+ body: JSON.stringify(errorResponse)
330
+ };
331
+ }
332
+ }
333
+ /**
334
+ * Route request to appropriate handler
335
+ */
336
+ async routeRequest(request) {
337
+ const { method, path, query, body } = request;
338
+ const parsePath = (pattern, actual) => {
339
+ const patternParts = pattern.split("/");
340
+ const actualParts = actual.split("/");
341
+ if (patternParts.length !== actualParts.length) {
342
+ return null;
343
+ }
344
+ const params2 = {};
345
+ for (let i = 0; i < patternParts.length; i++) {
346
+ if (patternParts[i].startsWith(":")) {
347
+ params2[patternParts[i].slice(1)] = actualParts[i];
348
+ } else if (patternParts[i] !== actualParts[i]) {
349
+ return null;
350
+ }
351
+ }
352
+ return params2;
353
+ };
354
+ if (method === "GET" && path === "/ui-bridge/health") {
355
+ return this.handlers.health({ params: {}, query, body });
356
+ }
357
+ if (method === "GET" && path === "/ui-bridge/control/elements") {
358
+ return this.handlers.getElements({ params: {}, query, body });
359
+ }
360
+ let params = parsePath("/ui-bridge/control/element/:id", path);
361
+ if (method === "GET" && params) {
362
+ return this.handlers.getElement({ params, query, body });
363
+ }
364
+ params = parsePath("/ui-bridge/control/element/:id/state", path);
365
+ if (method === "GET" && params) {
366
+ return this.handlers.getElementState({ params, query, body });
367
+ }
368
+ params = parsePath("/ui-bridge/control/element/:id/action", path);
369
+ if (method === "POST" && params) {
370
+ return this.handlers.executeAction({ params, query, body });
371
+ }
372
+ if (method === "GET" && path === "/ui-bridge/control/components") {
373
+ return this.handlers.getComponents({ params: {}, query, body });
374
+ }
375
+ params = parsePath("/ui-bridge/control/component/:id", path);
376
+ if (method === "GET" && params) {
377
+ return this.handlers.getComponent({ params, query, body });
378
+ }
379
+ params = parsePath("/ui-bridge/control/component/:id/action/:actionId", path);
380
+ if (method === "POST" && params) {
381
+ return this.handlers.executeComponentAction({ params, query, body });
382
+ }
383
+ if (method === "POST" && path === "/ui-bridge/control/find") {
384
+ return this.handlers.find({ params: {}, query, body });
385
+ }
386
+ if (method === "GET" && path === "/ui-bridge/control/snapshot") {
387
+ return this.handlers.getSnapshot({ params: {}, query, body });
388
+ }
389
+ if (method === "GET" && path === "/ui-bridge/control/workflows") {
390
+ return this.handlers.getWorkflows({ params: {}, query, body });
391
+ }
392
+ params = parsePath("/ui-bridge/control/workflow/:id/run", path);
393
+ if (method === "POST" && params) {
394
+ return this.handlers.runWorkflow({ params, query, body });
395
+ }
396
+ return {
397
+ success: false,
398
+ error: `Route not found: ${method} ${path}`,
399
+ code: "NOT_FOUND",
400
+ timestamp: Date.now()
401
+ };
402
+ }
403
+ };
404
+ function createNativeServer(registry, executor, config) {
405
+ return new NativeUIBridgeServer(registry, executor, config);
406
+ }
407
+
408
+ export { NativeUIBridgeServer, UI_BRIDGE_NATIVE_ROUTES, createNativeServer, createServerHandlers };
409
+ //# sourceMappingURL=index.mjs.map
410
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +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,11 +1,12 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React$1, { ReactNode } from 'react';
3
- import { n as UIBridgeFeatures, U as UIBridgeConfig, t as WSConnectionState, l as RegisteredElement, R as RegisteredComponent, f as BridgeSnapshot, e as BridgeEventType, d as BridgeEventListener, X as WSSubscriptionOptions, c as BridgeEvent, i as ElementType, S as StandardAction, g as CustomAction, h as ElementState, E as ElementIdentifier, a1 as Workflow, p as UIStateGroup, o as UIState, m as StateSnapshot, a2 as WorkflowStep, T as TransitionResult, q as UITransition, N as NavigationResult, P as PathResult } from '../types-BpvpStn3.mjs';
4
- import { U as UIBridgeRegistry } from '../registry-CT6BVVKr.mjs';
5
- import { U as UIBridgeWSClient } from '../websocket-client-B2LC9CYc.mjs';
3
+ import { D as UIBridgeFeatures, U as UIBridgeConfig, M as WSConnectionState, x as RegisteredElement, w as RegisteredComponent, l as BridgeSnapshot, k as BridgeEventType, j as BridgeEventListener, a9 as WSSubscriptionOptions, i as BridgeEvent, r as ElementType, S as StandardAction, o as CustomAction, q as ElementState, p as ElementIdentifier, af as Workflow, G as UIStateGroup, F as UIState, z as StateSnapshot, ag as WorkflowStep, T as TransitionResult, H as UITransition, N as NavigationResult, v as PathResult } from '../types-jKVgTI6_.mjs';
4
+ import { U as UIBridgeRegistry } from '../registry-BmZgyCz8.mjs';
5
+ import { UIBridgeWSClient } from '../core/index.mjs';
6
6
  import { RenderLogManager } from '../render-log/index.mjs';
7
- import { M as MetricsCollector } from '../metrics-BCG7z7Aq.mjs';
8
- import { A as ActionExecutor, i as WorkflowEngine, b as ControlActionRequest, c as ControlActionResponse, C as ComponentActionRequest, a as ComponentActionResponse, F as FindRequest, g as FindResponse, j as WorkflowRunRequest, k as WorkflowRunResponse } from '../types-DdJD9yw5.mjs';
7
+ import { M as MetricsCollector } from '../metrics-DTA2bwG7.mjs';
8
+ import { A as ActionExecutor, i as WorkflowEngine, b as ControlActionRequest, c as ControlActionResponse, C as ComponentActionRequest, a as ComponentActionResponse, F as FindRequest, g as FindResponse, j as WorkflowRunRequest, k as WorkflowRunResponse } from '../types-B7J7noLK.mjs';
9
+ import '../types-B5Q0GVo0.mjs';
9
10
 
10
11
  /**
11
12
  * UI Bridge context value
@@ -180,6 +181,15 @@ interface ComponentActionDef<TParams = unknown, TResult = unknown> {
180
181
  /** Handler function */
181
182
  handler: (params?: TParams) => TResult | Promise<TResult>;
182
183
  }
184
+ /**
185
+ * Computed property definition for useUIComponent
186
+ */
187
+ interface ComputedPropertyDef<T = unknown> {
188
+ /** Getter function for the computed value */
189
+ getter: () => T;
190
+ /** Description of what the computed property represents */
191
+ description?: string;
192
+ }
183
193
  /**
184
194
  * useUIComponent options
185
195
  */
@@ -196,6 +206,10 @@ interface UseUIComponentOptions {
196
206
  elementIds?: string[];
197
207
  /** Whether to automatically register on mount */
198
208
  autoRegister?: boolean;
209
+ /** Function to get the current component state */
210
+ state?: () => Record<string, unknown>;
211
+ /** Computed properties exposed by the component */
212
+ computed?: Record<string, ComputedPropertyDef | (() => unknown)>;
199
213
  }
200
214
  /**
201
215
  * useUIComponent return value
@@ -783,4 +797,4 @@ interface AutoRegisterProviderProps extends Omit<AutoRegisterOptions, 'root'> {
783
797
  */
784
798
  declare function AutoRegisterProvider({ children, scopeToChildren, enabled, idStrategy, debounceMs, includeHidden, includeSelectors, excludeSelectors, generateId, onRegister, onUnregister, }: AutoRegisterProviderProps): react_jsx_runtime.JSX.Element;
785
799
 
786
- export { type AutoRegisterOptions, AutoRegisterProvider, type AutoRegisterProviderProps, type ComponentActionDef, type IdStrategy, type UIBridgeContextValue, UIBridgeProvider, type UIBridgeProviderProps, type UseUIBridgeReturn, type UseUIComponentOptions, type UseUIComponentReturn, type UseUIElementOptions, type UseUIElementReturn, type UseUINavigationReturn, type UseUIStateGroupOptions, type UseUIStateGroupReturn, type UseUIStateOptions, type UseUIStateReturn, type UseUITransitionOptions, type UseUITransitionReturn, useActiveStates, useAutoRegister, useAvailableTransitions, useCanNavigateTo, useNavigationPath, useStateSnapshot, useTransitions, useUIBridge, useUIBridgeContext, useUIBridgeOptional, useUIBridgeRequired, useUIComponent, useUIComponentAction, useUIElement, useUIElementRef, useUINavigation, useUIState, useUIStateGroup, useUITransition };
800
+ export { type AutoRegisterOptions, AutoRegisterProvider, type AutoRegisterProviderProps, type ComponentActionDef, type ComputedPropertyDef, type IdStrategy, type UIBridgeContextValue, UIBridgeProvider, type UIBridgeProviderProps, type UseUIBridgeReturn, type UseUIComponentOptions, type UseUIComponentReturn, type UseUIElementOptions, type UseUIElementReturn, type UseUINavigationReturn, type UseUIStateGroupOptions, type UseUIStateGroupReturn, type UseUIStateOptions, type UseUIStateReturn, type UseUITransitionOptions, type UseUITransitionReturn, useActiveStates, useAutoRegister, useAvailableTransitions, useCanNavigateTo, useNavigationPath, useStateSnapshot, useTransitions, useUIBridge, useUIBridgeContext, useUIBridgeOptional, useUIBridgeRequired, useUIComponent, useUIComponentAction, useUIElement, useUIElementRef, useUINavigation, useUIState, useUIStateGroup, useUITransition };
@@ -1,11 +1,12 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React$1, { ReactNode } from 'react';
3
- import { n as UIBridgeFeatures, U as UIBridgeConfig, t as WSConnectionState, l as RegisteredElement, R as RegisteredComponent, f as BridgeSnapshot, e as BridgeEventType, d as BridgeEventListener, X as WSSubscriptionOptions, c as BridgeEvent, i as ElementType, S as StandardAction, g as CustomAction, h as ElementState, E as ElementIdentifier, a1 as Workflow, p as UIStateGroup, o as UIState, m as StateSnapshot, a2 as WorkflowStep, T as TransitionResult, q as UITransition, N as NavigationResult, P as PathResult } from '../types-BpvpStn3.js';
4
- import { U as UIBridgeRegistry } from '../registry-D4mQ01B3.js';
5
- import { U as UIBridgeWSClient } from '../websocket-client-DupH0X7B.js';
3
+ import { D as UIBridgeFeatures, U as UIBridgeConfig, M as WSConnectionState, x as RegisteredElement, w as RegisteredComponent, l as BridgeSnapshot, k as BridgeEventType, j as BridgeEventListener, a9 as WSSubscriptionOptions, i as BridgeEvent, r as ElementType, S as StandardAction, o as CustomAction, q as ElementState, p as ElementIdentifier, af as Workflow, G as UIStateGroup, F as UIState, z as StateSnapshot, ag as WorkflowStep, T as TransitionResult, H as UITransition, N as NavigationResult, v as PathResult } from '../types-jKVgTI6_.js';
4
+ import { U as UIBridgeRegistry } from '../registry-BKLEm-yk.js';
5
+ import { UIBridgeWSClient } from '../core/index.js';
6
6
  import { RenderLogManager } from '../render-log/index.js';
7
- import { M as MetricsCollector } from '../metrics-QCnK0EFw.js';
8
- import { A as ActionExecutor, i as WorkflowEngine, b as ControlActionRequest, c as ControlActionResponse, C as ComponentActionRequest, a as ComponentActionResponse, F as FindRequest, g as FindResponse, j as WorkflowRunRequest, k as WorkflowRunResponse } from '../types-BDkXy5si.js';
7
+ import { M as MetricsCollector } from '../metrics-BfiT_rhZ.js';
8
+ import { A as ActionExecutor, i as WorkflowEngine, b as ControlActionRequest, c as ControlActionResponse, C as ComponentActionRequest, a as ComponentActionResponse, F as FindRequest, g as FindResponse, j as WorkflowRunRequest, k as WorkflowRunResponse } from '../types-BkNRILUa.js';
9
+ import '../types-DfPqwU-i.js';
9
10
 
10
11
  /**
11
12
  * UI Bridge context value
@@ -180,6 +181,15 @@ interface ComponentActionDef<TParams = unknown, TResult = unknown> {
180
181
  /** Handler function */
181
182
  handler: (params?: TParams) => TResult | Promise<TResult>;
182
183
  }
184
+ /**
185
+ * Computed property definition for useUIComponent
186
+ */
187
+ interface ComputedPropertyDef<T = unknown> {
188
+ /** Getter function for the computed value */
189
+ getter: () => T;
190
+ /** Description of what the computed property represents */
191
+ description?: string;
192
+ }
183
193
  /**
184
194
  * useUIComponent options
185
195
  */
@@ -196,6 +206,10 @@ interface UseUIComponentOptions {
196
206
  elementIds?: string[];
197
207
  /** Whether to automatically register on mount */
198
208
  autoRegister?: boolean;
209
+ /** Function to get the current component state */
210
+ state?: () => Record<string, unknown>;
211
+ /** Computed properties exposed by the component */
212
+ computed?: Record<string, ComputedPropertyDef | (() => unknown)>;
199
213
  }
200
214
  /**
201
215
  * useUIComponent return value
@@ -783,4 +797,4 @@ interface AutoRegisterProviderProps extends Omit<AutoRegisterOptions, 'root'> {
783
797
  */
784
798
  declare function AutoRegisterProvider({ children, scopeToChildren, enabled, idStrategy, debounceMs, includeHidden, includeSelectors, excludeSelectors, generateId, onRegister, onUnregister, }: AutoRegisterProviderProps): react_jsx_runtime.JSX.Element;
785
799
 
786
- export { type AutoRegisterOptions, AutoRegisterProvider, type AutoRegisterProviderProps, type ComponentActionDef, type IdStrategy, type UIBridgeContextValue, UIBridgeProvider, type UIBridgeProviderProps, type UseUIBridgeReturn, type UseUIComponentOptions, type UseUIComponentReturn, type UseUIElementOptions, type UseUIElementReturn, type UseUINavigationReturn, type UseUIStateGroupOptions, type UseUIStateGroupReturn, type UseUIStateOptions, type UseUIStateReturn, type UseUITransitionOptions, type UseUITransitionReturn, useActiveStates, useAutoRegister, useAvailableTransitions, useCanNavigateTo, useNavigationPath, useStateSnapshot, useTransitions, useUIBridge, useUIBridgeContext, useUIBridgeOptional, useUIBridgeRequired, useUIComponent, useUIComponentAction, useUIElement, useUIElementRef, useUINavigation, useUIState, useUIStateGroup, useUITransition };
800
+ export { type AutoRegisterOptions, AutoRegisterProvider, type AutoRegisterProviderProps, type ComponentActionDef, type ComputedPropertyDef, type IdStrategy, type UIBridgeContextValue, UIBridgeProvider, type UIBridgeProviderProps, type UseUIBridgeReturn, type UseUIComponentOptions, type UseUIComponentReturn, type UseUIElementOptions, type UseUIElementReturn, type UseUINavigationReturn, type UseUIStateGroupOptions, type UseUIStateGroupReturn, type UseUIStateOptions, type UseUIStateReturn, type UseUITransitionOptions, type UseUITransitionReturn, useActiveStates, useAutoRegister, useAvailableTransitions, useCanNavigateTo, useNavigationPath, useStateSnapshot, useTransitions, useUIBridge, useUIBridgeContext, useUIBridgeOptional, useUIBridgeRequired, useUIComponent, useUIComponentAction, useUIElement, useUIElementRef, useUINavigation, useUIState, useUIStateGroup, useUITransition };