@qontinui/ui-bridge-native 0.6.9 → 0.6.11

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 (45) hide show
  1. package/dist/control/action-executor.d.ts.map +1 -1
  2. package/dist/control/index.js +2 -1
  3. package/dist/control/index.js.map +1 -1
  4. package/dist/control/index.mjs +2 -1
  5. package/dist/control/index.mjs.map +1 -1
  6. package/dist/core/index.js +232 -1
  7. package/dist/core/index.js.map +1 -1
  8. package/dist/core/index.mjs +232 -2
  9. package/dist/core/index.mjs.map +1 -1
  10. package/dist/core/registry.d.ts +46 -1
  11. package/dist/core/registry.d.ts.map +1 -1
  12. package/dist/core/types.d.ts +114 -0
  13. package/dist/core/types.d.ts.map +1 -1
  14. package/dist/core/vision-fields.d.ts +142 -0
  15. package/dist/core/vision-fields.d.ts.map +1 -0
  16. package/dist/debug/index.js.map +1 -1
  17. package/dist/debug/index.mjs.map +1 -1
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +371 -20
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.mjs +365 -22
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/react/UIBridgeNativeProvider.d.ts.map +1 -1
  25. package/dist/react/index.js +323 -20
  26. package/dist/react/index.js.map +1 -1
  27. package/dist/react/index.mjs +324 -21
  28. package/dist/react/index.mjs.map +1 -1
  29. package/dist/react/useUIElement.d.ts.map +1 -1
  30. package/dist/server/bind-retry.d.ts +64 -0
  31. package/dist/server/bind-retry.d.ts.map +1 -0
  32. package/dist/server/handlers.d.ts.map +1 -1
  33. package/dist/server/http-server.d.ts +9 -1
  34. package/dist/server/http-server.d.ts.map +1 -1
  35. package/dist/server/index.d.ts +2 -0
  36. package/dist/server/index.d.ts.map +1 -1
  37. package/dist/server/index.js +275 -13
  38. package/dist/server/index.js.map +1 -1
  39. package/dist/server/index.mjs +274 -14
  40. package/dist/server/index.mjs.map +1 -1
  41. package/dist/server/observability.d.ts +4 -3
  42. package/dist/server/observability.d.ts.map +1 -1
  43. package/dist/server/types.d.ts +10 -0
  44. package/dist/server/types.d.ts.map +1 -1
  45. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useUIElement.d.ts","sourceRoot":"","sources":["../../src/react/useUIElement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useUIElement.d.ts","sourceRoot":"","sources":["../../src/react/useUIElement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Resilient TCP-bind helper for native UI Bridge server adapters.
3
+ *
4
+ * Background: the on-device bridge binds a TCP server on a fixed port (8087).
5
+ * On hot-reload, app foreground/background cycles, or a crash-restart, the OS
6
+ * can leave the previous socket in a lingering state, so the fresh bind fails
7
+ * with `EADDRINUSE`. The original adapter gave up after 3 fixed retries
8
+ * (~5s total), after which the bridge was permanently dead until the app was
9
+ * fully restarted — a single transient stale socket bricked automation.
10
+ *
11
+ * This helper centralises a robust bind loop so every adapter (and a unit
12
+ * test) shares one implementation:
13
+ * - SO_REUSEADDR is requested on bind where the platform/library supports it
14
+ * (passed through to the caller's `attempt` via `reuseAddress: true`), so
15
+ * a lingering TIME_WAIT socket doesn't block rebind.
16
+ * - On `EADDRINUSE` it retries with exponential backoff (capped) for at
17
+ * least `minTotalMs` (default 30s) instead of bailing after a fixed count.
18
+ * - Every retry is logged so operators can see the bridge recovering.
19
+ * - Non-`EADDRINUSE` errors fail fast (a wrong-permission / bad-host error
20
+ * won't fix itself by waiting).
21
+ *
22
+ * The helper is transport-agnostic: the caller supplies an `attempt` thunk
23
+ * that performs ONE bind attempt and resolves on `listening` / rejects on
24
+ * error. This keeps the package free of any concrete TCP library dependency
25
+ * (the same reason `ServerAdapter` is an interface).
26
+ */
27
+ /** True when an error looks like an address-already-in-use bind failure. */
28
+ export declare function isAddrInUseError(err: unknown): boolean;
29
+ export interface BindWithRetryOptions {
30
+ /**
31
+ * Minimum total wall-clock time to keep retrying `EADDRINUSE` before giving
32
+ * up, in milliseconds. The loop always makes at least one attempt and keeps
33
+ * retrying until this budget is exhausted. Default 30_000 (30s).
34
+ *
35
+ * Pass `Infinity` to retry indefinitely (with capped backoff) — appropriate
36
+ * for an always-on device bridge that should self-heal whenever the stale
37
+ * socket finally clears.
38
+ */
39
+ minTotalMs?: number;
40
+ /** Initial backoff delay between retries, in ms. Default 500. */
41
+ initialDelayMs?: number;
42
+ /** Maximum backoff delay (cap for exponential growth), in ms. Default 5_000. */
43
+ maxDelayMs?: number;
44
+ /** Multiplier applied to the delay after each retry. Default 2. */
45
+ backoffFactor?: number;
46
+ /** Logger for retry diagnostics. Defaults to `console`. */
47
+ logger?: Pick<Console, 'warn' | 'error'>;
48
+ /** Injectable sleep — overridable in tests to avoid real timers. */
49
+ sleep?: (ms: number) => Promise<void>;
50
+ /** Injectable clock — overridable in tests. Defaults to `Date.now`. */
51
+ now?: () => number;
52
+ }
53
+ /**
54
+ * Run `attempt()` repeatedly until it resolves, retrying on `EADDRINUSE` with
55
+ * exponential backoff for at least `minTotalMs`. Non-address-in-use errors
56
+ * reject immediately. Resolves once a bind attempt succeeds.
57
+ *
58
+ * @param attempt One bind attempt. Receives the attempt index (0-based) and
59
+ * MUST resolve on a successful `listening` event or reject on error. The
60
+ * caller is responsible for tearing down any half-bound server before the
61
+ * next attempt (see the adapter's `recreate` thunk).
62
+ */
63
+ export declare function bindWithRetry(attempt: (attemptIndex: number) => Promise<void>, options?: BindWithRetryOptions): Promise<void>;
64
+ //# sourceMappingURL=bind-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bind-retry.d.ts","sourceRoot":"","sources":["../../src/server/bind-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAWtD;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACzC,oEAAoE;IACpE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAKD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAChD,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAwCf"}
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/server/handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,sBAAsB,EAG5B,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAQV,oBAAoB,EAKrB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAyThF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,sBAAsB,EAChC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,CAAC,EAAE;IACP,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,iFAAiF;IACjF,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,MAAM;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D,GACA,oBAAoB,CAg8BtB"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/server/handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EACL,KAAK,sBAAsB,EAI5B,MAAM,kBAAkB,CAAC;AAS1B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAQV,oBAAoB,EAKrB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AA4VhF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,sBAAsB,EAChC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,CAAC,EAAE;IACP,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,iFAAiF;IACjF,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,MAAM;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D,GACA,oBAAoB,CAs+BtB"}
@@ -90,10 +90,18 @@ export declare class NativeUIBridgeServer {
90
90
  * Observability ring buffers backing `/control/console-errors` and
91
91
  * `/sdk/network-requests`. Allocated unconditionally so the handler can
92
92
  * always read them, but the global patches (`install()`) only fire on
93
- * `start()` when `testHooks` is set — production builds don't monkey-patch.
93
+ * `start()` when observability is enabled (the dedicated `observability`
94
+ * flag, defaulting to `testHooks`) — builds with both off don't
95
+ * monkey-patch.
94
96
  */
95
97
  private consoleErrorBuffer;
96
98
  private networkRequestBuffer;
99
+ /**
100
+ * Whether the console/network capture should be installed. The dedicated
101
+ * `observability` flag wins when set; otherwise falls back to `testHooks`
102
+ * so consumers predating the flag keep their exact behavior.
103
+ */
104
+ private observabilityEnabled;
97
105
  constructor(registry: NativeUIBridgeRegistry, executor: NativeActionExecutor, config?: NativeServerConfig);
98
106
  /**
99
107
  * Set the server adapter
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":"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"}
@@ -13,4 +13,6 @@ export { WebSocketConnection } from './ws-connection';
13
13
  export type { WebSocketMessageHandler } from './ws-connection';
14
14
  export { WebSocketEventBridge } from './ws-event-bridge';
15
15
  export { ConsoleErrorBuffer, NetworkRequestBuffer } from './observability';
16
+ export { bindWithRetry, isAddrInUseError } from './bind-retry';
17
+ export type { BindWithRetryOptions } from './bind-retry';
16
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
@@ -209,6 +209,179 @@ var UI_BRIDGE_NATIVE_ROUTES = {
209
209
  }
210
210
  };
211
211
 
212
+ // src/core/vision-fields.ts
213
+ var INTERACTIVE_HANDLER_NAMES = /* @__PURE__ */ new Set([
214
+ "onPress",
215
+ "onPressIn",
216
+ "onPressOut",
217
+ "onLongPress",
218
+ "onChangeText",
219
+ "onValueChange",
220
+ "onChange",
221
+ "onSubmitEditing",
222
+ "onClick",
223
+ "onTouchStart",
224
+ "onTouchEnd"
225
+ ]);
226
+ var INTERACTIVE_TYPES = /* @__PURE__ */ new Set([
227
+ "button",
228
+ "input",
229
+ "switch",
230
+ "checkbox",
231
+ "radio",
232
+ "touchable",
233
+ "pressable",
234
+ "listItem"
235
+ ]);
236
+ function roleForType(type) {
237
+ switch (type) {
238
+ case "button":
239
+ case "touchable":
240
+ case "pressable":
241
+ return "button";
242
+ case "input":
243
+ return "textbox";
244
+ case "text":
245
+ return "text";
246
+ case "switch":
247
+ return "switch";
248
+ case "checkbox":
249
+ return "checkbox";
250
+ case "radio":
251
+ return "radio";
252
+ case "image":
253
+ return "img";
254
+ case "list":
255
+ return "list";
256
+ case "listItem":
257
+ return "listitem";
258
+ case "modal":
259
+ return "dialog";
260
+ case "scroll":
261
+ case "view":
262
+ case "custom":
263
+ default:
264
+ return void 0;
265
+ }
266
+ }
267
+ function deriveInteractable(type, handlerNames) {
268
+ if (INTERACTIVE_TYPES.has(type)) return true;
269
+ if (handlerNames) {
270
+ for (const name of handlerNames) {
271
+ if (INTERACTIVE_HANDLER_NAMES.has(name)) return true;
272
+ }
273
+ }
274
+ return false;
275
+ }
276
+ function deriveText(state, label) {
277
+ const candidates = [state.value, state.textContent, label];
278
+ for (const c of candidates) {
279
+ if (typeof c === "string") {
280
+ const trimmed = c.trim();
281
+ if (trimmed.length > 0) return trimmed;
282
+ }
283
+ }
284
+ return void 0;
285
+ }
286
+ var NAMED_COLORS = {
287
+ black: { r: 0, g: 0, b: 0 },
288
+ white: { r: 255, g: 255, b: 255 },
289
+ red: { r: 255, g: 0, b: 0 },
290
+ green: { r: 0, g: 128, b: 0 },
291
+ blue: { r: 0, g: 0, b: 255 },
292
+ gray: { r: 128, g: 128, b: 128 },
293
+ grey: { r: 128, g: 128, b: 128 },
294
+ silver: { r: 192, g: 192, b: 192 },
295
+ transparent: { r: 0, g: 0, b: 0 },
296
+ orange: { r: 255, g: 165, b: 0 },
297
+ yellow: { r: 255, g: 255, b: 0 },
298
+ purple: { r: 128, g: 0, b: 128 },
299
+ navy: { r: 0, g: 0, b: 128 }
300
+ };
301
+ var clamp255 = (n) => Math.max(0, Math.min(255, Math.round(n)));
302
+ function parseColorToRgb(input) {
303
+ if (typeof input !== "string") return void 0;
304
+ const raw = input.trim().toLowerCase();
305
+ if (raw.length === 0) return void 0;
306
+ if (Object.prototype.hasOwnProperty.call(NAMED_COLORS, raw)) {
307
+ return NAMED_COLORS[raw];
308
+ }
309
+ if (raw.startsWith("#")) {
310
+ const hex = raw.slice(1);
311
+ if (hex.length === 3 || hex.length === 4) {
312
+ const r = parseInt(hex[0] + hex[0], 16);
313
+ const g = parseInt(hex[1] + hex[1], 16);
314
+ const b = parseInt(hex[2] + hex[2], 16);
315
+ if ([r, g, b].every((v) => Number.isFinite(v))) return { r, g, b };
316
+ return void 0;
317
+ }
318
+ if (hex.length === 6 || hex.length === 8) {
319
+ const r = parseInt(hex.slice(0, 2), 16);
320
+ const g = parseInt(hex.slice(2, 4), 16);
321
+ const b = parseInt(hex.slice(4, 6), 16);
322
+ if ([r, g, b].every((v) => Number.isFinite(v))) return { r, g, b };
323
+ return void 0;
324
+ }
325
+ return void 0;
326
+ }
327
+ const rgbMatch = raw.match(/^rgba?\(([^)]+)\)$/);
328
+ if (rgbMatch) {
329
+ const parts = rgbMatch[1].split(",").map((p) => p.trim());
330
+ if (parts.length < 3) return void 0;
331
+ const channel = (p) => {
332
+ if (p.endsWith("%")) {
333
+ const pct = parseFloat(p.slice(0, -1));
334
+ if (!Number.isFinite(pct)) return void 0;
335
+ return clamp255(pct / 100 * 255);
336
+ }
337
+ const n = parseFloat(p);
338
+ if (!Number.isFinite(n)) return void 0;
339
+ return clamp255(n);
340
+ };
341
+ const r = channel(parts[0]);
342
+ const g = channel(parts[1]);
343
+ const b = channel(parts[2]);
344
+ if (r === void 0 || g === void 0 || b === void 0) return void 0;
345
+ return { r, g, b };
346
+ }
347
+ return void 0;
348
+ }
349
+ function parseFontSizePx(input) {
350
+ if (typeof input === "number") {
351
+ return Number.isFinite(input) && input > 0 ? input : void 0;
352
+ }
353
+ if (typeof input === "string") {
354
+ const m = input.trim().match(/^(-?\d*\.?\d+)/);
355
+ if (m) {
356
+ const n = parseFloat(m[1]);
357
+ return Number.isFinite(n) && n > 0 ? n : void 0;
358
+ }
359
+ }
360
+ return void 0;
361
+ }
362
+ function projectVisionFields(args) {
363
+ const { type, label, handlerNames, state, flatStyle } = args;
364
+ const fields = {
365
+ interactable: deriveInteractable(type, handlerNames)
366
+ };
367
+ const text = deriveText(state, label);
368
+ if (text !== void 0) fields.text = text;
369
+ const role = roleForType(type);
370
+ if (role !== void 0) fields.role = role;
371
+ if (flatStyle) {
372
+ const fg = parseColorToRgb(flatStyle.color);
373
+ if (fg !== void 0) fields.fg_color = fg;
374
+ const bg = parseColorToRgb(flatStyle.backgroundColor);
375
+ if (bg !== void 0) fields.bg_color = bg;
376
+ const size = parseFontSizePx(flatStyle.fontSize);
377
+ if (size !== void 0) fields.font_size_px = size;
378
+ if (typeof flatStyle.fontFamily === "string" && flatStyle.fontFamily.trim().length > 0) {
379
+ fields.font_family = flatStyle.fontFamily;
380
+ }
381
+ }
382
+ return fields;
383
+ }
384
+
212
385
  // src/core/registry.ts
213
386
  function extractHandlerNames(props) {
214
387
  if (!props) return [];
@@ -218,6 +391,25 @@ function matchesCurrentRoute(registrationRoute, currentRoute) {
218
391
  if (registrationRoute == null || registrationRoute === "") return true;
219
392
  return registrationRoute === currentRoute;
220
393
  }
394
+ function projectBbox(state, visibility, pixelRatio = 1) {
395
+ if (visibility !== "visible") return void 0;
396
+ const layout = state.layout;
397
+ if (!layout) return void 0;
398
+ const ratio = pixelRatio > 0 && Number.isFinite(pixelRatio) ? pixelRatio : 1;
399
+ const toPx = (v) => Math.max(0, Math.round(v * ratio));
400
+ const hasPage = typeof layout.pageX === "number" && typeof layout.pageY === "number" && Number.isFinite(layout.pageX) && Number.isFinite(layout.pageY);
401
+ const originX = hasPage ? layout.pageX : layout.x;
402
+ const originY = hasPage ? layout.pageY : layout.y;
403
+ if (typeof originX !== "number" || typeof originY !== "number" || typeof layout.width !== "number" || typeof layout.height !== "number" || !Number.isFinite(originX) || !Number.isFinite(originY) || !Number.isFinite(layout.width) || !Number.isFinite(layout.height)) {
404
+ return void 0;
405
+ }
406
+ return {
407
+ x: toPx(originX),
408
+ y: toPx(originY),
409
+ w: toPx(layout.width),
410
+ h: toPx(layout.height)
411
+ };
412
+ }
221
413
 
222
414
  // src/design/design-inspector-native.ts
223
415
  function toCssValue(value) {
@@ -695,7 +887,7 @@ function createDesignHandlers(registry, viewportProvider) {
695
887
  var GRID_SIZE = 20;
696
888
  var NAV_TYPES = /* @__PURE__ */ new Set(["button", "heading", "badge", "status-message"]);
697
889
  var SKIP_TEXT_TYPES = /* @__PURE__ */ new Set(["button", "link", "tab", "menuitem"]);
698
- var INTERACTIVE_TYPES = /* @__PURE__ */ new Set([
890
+ var INTERACTIVE_TYPES2 = /* @__PURE__ */ new Set([
699
891
  "button",
700
892
  "input",
701
893
  "switch",
@@ -892,7 +1084,7 @@ function diagnosePageHealth(elements, viewport) {
892
1084
  let interactiveTotal = 0;
893
1085
  let interactiveDisabled = 0;
894
1086
  for (const el of elements) {
895
- if (!INTERACTIVE_TYPES.has(el.type)) continue;
1087
+ if (!INTERACTIVE_TYPES2.has(el.type)) continue;
896
1088
  interactiveTotal++;
897
1089
  if (el.state.enabled === false) interactiveDisabled++;
898
1090
  }
@@ -960,6 +1152,13 @@ function matchElementsByText(registry, text, opts) {
960
1152
  scored.sort((a, b) => a.rank - b.rank);
961
1153
  return scored.map((s) => s.element);
962
1154
  }
1155
+ function resolveElementState(element) {
1156
+ const state = element.getState();
1157
+ if (element.type === "input" && state.value === void 0 && typeof element.props?.value === "string") {
1158
+ return { ...state, value: element.props.value };
1159
+ }
1160
+ return state;
1161
+ }
963
1162
  async function executeWorkflowStep(step, registry, executor) {
964
1163
  const startTime = Date.now();
965
1164
  try {
@@ -1168,6 +1367,16 @@ function createServerHandlers(registry, executor, config) {
1168
1367
  const handlers = extractHandlerNames(e.props);
1169
1368
  const state = e.getState();
1170
1369
  const visibility = !state.visible ? "hidden" : state.layout !== null ? "visible" : "likely-visible";
1370
+ const bbox = projectBbox(state, visibility, registry.getPixelRatio());
1371
+ const vision = projectVisionFields({
1372
+ type: e.type,
1373
+ label: e.label,
1374
+ // Real handler names (onPress/...), NOT inferred actions which
1375
+ // synthesize press/click onto every element. See projectVisionFields.
1376
+ handlerNames: handlers,
1377
+ state,
1378
+ flatStyle: e.flatStyle
1379
+ });
1171
1380
  return {
1172
1381
  id: e.id,
1173
1382
  type: e.type,
@@ -1178,7 +1387,9 @@ function createServerHandlers(registry, executor, config) {
1178
1387
  customActions: e.customActions ? Object.keys(e.customActions) : void 0,
1179
1388
  registeredHandlers: handlers.length > 0 ? handlers : void 0,
1180
1389
  registrationRoute: e.registrationRoute,
1181
- visibility
1390
+ visibility,
1391
+ ...bbox ? { bbox } : {},
1392
+ ...vision
1182
1393
  };
1183
1394
  });
1184
1395
  return success2({ elements });
@@ -1196,7 +1407,7 @@ function createServerHandlers(registry, executor, config) {
1196
1407
  type: element.type,
1197
1408
  label: element.label,
1198
1409
  identifier: element.getIdentifier(),
1199
- state: element.getState(),
1410
+ state: resolveElementState(element),
1200
1411
  actions: element.actions,
1201
1412
  customActions: element.customActions ? Object.keys(element.customActions) : void 0,
1202
1413
  registeredHandlers: handlers.length > 0 ? handlers : void 0,
@@ -1210,18 +1421,19 @@ function createServerHandlers(registry, executor, config) {
1210
1421
  if (!element) {
1211
1422
  return error2(`Element not found: ${id}`, "ELEMENT_NOT_FOUND");
1212
1423
  }
1213
- return success2({ state: element.getState() });
1424
+ return success2({ state: resolveElementState(element) });
1214
1425
  },
1215
1426
  executeAction: async (ctx) => {
1216
- const { id } = ctx.params;
1217
- const body = ctx.body;
1218
- if (!body?.action) {
1427
+ const rawBody = ctx.body ?? {};
1428
+ const envelope = rawBody.request && typeof rawBody.request === "object" ? rawBody.request : rawBody;
1429
+ const id = ctx.params.id ?? rawBody.id ?? "";
1430
+ if (!envelope?.action) {
1219
1431
  return error2("Action is required", "INVALID_REQUEST");
1220
1432
  }
1221
1433
  const response = await executor.executeAction(id, {
1222
- action: body.action,
1223
- params: body.params,
1224
- waitOptions: body.waitOptions
1434
+ action: envelope.action,
1435
+ params: envelope.params,
1436
+ waitOptions: envelope.waitOptions
1225
1437
  });
1226
1438
  if (!response.success) {
1227
1439
  return error2(response.error || "Action failed", "ACTION_FAILED");
@@ -1860,7 +2072,7 @@ function createServerHandlers(registry, executor, config) {
1860
2072
  };
1861
2073
  if (config?.appInfo) {
1862
2074
  response.uiBridge = {
1863
- version: "0.3.0",
2075
+ version: "0.6.11",
1864
2076
  ...config.appInfo,
1865
2077
  capabilities: ["elements", "components", "actions", "design"],
1866
2078
  elementCount: stats.elements,
@@ -2452,6 +2664,14 @@ var NativeUIBridgeServer = class {
2452
2664
  };
2453
2665
  };
2454
2666
  }
2667
+ /**
2668
+ * Whether the console/network capture should be installed. The dedicated
2669
+ * `observability` flag wins when set; otherwise falls back to `testHooks`
2670
+ * so consumers predating the flag keep their exact behavior.
2671
+ */
2672
+ observabilityEnabled() {
2673
+ return this.config.observability ?? this.config.testHooks === true;
2674
+ }
2455
2675
  /**
2456
2676
  * Set the server adapter
2457
2677
  */
@@ -2665,7 +2885,7 @@ var NativeUIBridgeServer = class {
2665
2885
  console.warn("[ui-bridge-native] See documentation for supported adapters.");
2666
2886
  return;
2667
2887
  }
2668
- if (this.config.testHooks === true) {
2888
+ if (this.observabilityEnabled()) {
2669
2889
  this.consoleErrorBuffer.install();
2670
2890
  this.networkRequestBuffer.install();
2671
2891
  }
@@ -3986,6 +4206,46 @@ var WebSocketConnection = class {
3986
4206
  }
3987
4207
  };
3988
4208
 
4209
+ // src/server/bind-retry.ts
4210
+ function isAddrInUseError(err) {
4211
+ const message = err instanceof Error ? err.message : typeof err === "string" ? err : String(err);
4212
+ const code = err?.code;
4213
+ return message.includes("EADDRINUSE") || message.toLowerCase().includes("address already in use") || code === "EADDRINUSE";
4214
+ }
4215
+ var defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
4216
+ async function bindWithRetry(attempt, options = {}) {
4217
+ const {
4218
+ minTotalMs = 3e4,
4219
+ initialDelayMs = 500,
4220
+ maxDelayMs = 5e3,
4221
+ backoffFactor = 2,
4222
+ logger = console,
4223
+ sleep = defaultSleep,
4224
+ now = Date.now
4225
+ } = options;
4226
+ const startedAt = now();
4227
+ let delay = initialDelayMs;
4228
+ let attemptIndex = 0;
4229
+ for (; ; ) {
4230
+ try {
4231
+ await attempt(attemptIndex);
4232
+ return;
4233
+ } catch (err) {
4234
+ const elapsed = now() - startedAt;
4235
+ const budgetExhausted = elapsed + delay >= minTotalMs;
4236
+ if (!isAddrInUseError(err) || budgetExhausted) {
4237
+ throw err;
4238
+ }
4239
+ logger.warn(
4240
+ `[ui-bridge-native] bind failed with EADDRINUSE (attempt ${attemptIndex + 1}); retrying in ${delay}ms (elapsed ${elapsed}ms / budget ${minTotalMs === Infinity ? "\u221E" : minTotalMs}ms)`
4241
+ );
4242
+ await sleep(delay);
4243
+ delay = Math.min(delay * backoffFactor, maxDelayMs);
4244
+ attemptIndex += 1;
4245
+ }
4246
+ }
4247
+ }
4248
+
3989
4249
  exports.ConsoleErrorBuffer = ConsoleErrorBuffer;
3990
4250
  exports.NativeUIBridgeServer = NativeUIBridgeServer;
3991
4251
  exports.NetworkRequestBuffer = NetworkRequestBuffer;
@@ -3998,6 +4258,7 @@ exports.OPCODE_TEXT = OPCODE_TEXT;
3998
4258
  exports.UI_BRIDGE_NATIVE_ROUTES = UI_BRIDGE_NATIVE_ROUTES;
3999
4259
  exports.WebSocketConnection = WebSocketConnection;
4000
4260
  exports.WebSocketEventBridge = WebSocketEventBridge;
4261
+ exports.bindWithRetry = bindWithRetry;
4001
4262
  exports.buildUpgradeResponse = buildUpgradeResponse;
4002
4263
  exports.computeAcceptKey = computeAcceptKey;
4003
4264
  exports.createDesignHandlers = createDesignHandlers;
@@ -4009,6 +4270,7 @@ exports.encodeCloseFrame = encodeCloseFrame;
4009
4270
  exports.encodePingFrame = encodePingFrame;
4010
4271
  exports.encodePongFrame = encodePongFrame;
4011
4272
  exports.encodeTextFrame = encodeTextFrame;
4273
+ exports.isAddrInUseError = isAddrInUseError;
4012
4274
  exports.isBatchRequest = isBatchRequest;
4013
4275
  exports.isSubscribe = isSubscribe;
4014
4276
  exports.isUnsubscribe = isUnsubscribe;