@qontinui/ui-bridge-native 0.6.8 → 0.6.10

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.
@@ -37,6 +37,16 @@ export interface UseUIElementOptionsBase<T extends NativeElementType = NativeEle
37
37
  actions?: NativeStandardAction[];
38
38
  /** Custom actions */
39
39
  customActions?: Record<string, NativeCustomAction>;
40
+ /**
41
+ * Current controlled value for text inputs. When provided, it is threaded
42
+ * into the registered element's `state.value` so a `GET /control/element/:id`
43
+ * (or `/state`) reflects what the user sees — without this, the input
44
+ * registers with `value: undefined` and a bridge read returns null even
45
+ * though the field is populated. Pass the same value you bind to the RN
46
+ * `<TextInput value={...} />` prop; the hook keeps the registry in sync as
47
+ * it changes.
48
+ */
49
+ value?: string;
40
50
  /** Whether to automatically register on mount */
41
51
  autoRegister?: boolean;
42
52
  /** Callback when state changes */
@@ -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":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAEjB,MAAM,eAAe,CAAC;AA4DvB,KAAK,UAAU,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAE1C;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,MAAM,6BAA6B,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEnE;;;GAGG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB;IACtF,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACnD;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kCAAkC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACpD,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oFAAoF;IACpF,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mCAAmC,CAClD,CAAC,SAAS,6BAA6B,GAAG,6BAA6B,CACvE,SAAQ,uBAAuB,CAAC,CAAC,CAAC;IAClC;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE;QACR,oEAAoE;QACpE,OAAO,EAAE,YAAY,CAAC;QACtB,6DAA6D;QAC7D,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;KACvC,CAAC;CACH;AAED;;;;GAIG;AACH,MAAM,WAAW,mCAAmC,CAClD,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,CAC/C,SAAQ,uBAAuB,CAAC,CAAC,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;CACnD;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,IAC7E,CAAC,SAAS,6BAA6B,GACnC,mCAAmC,CAAC,CAAC,CAAC,GACtC,mCAAmC,CAAC,CAAC,CAAC,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACvC,mGAAmG;IACnG,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,WAAW,EAAE;YAAE,MAAM,EAAE;gBAAE,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;KAClF,KAAK,IAAI,CAAC;IACX,0DAA0D;IAC1D,WAAW,EAAE,aAAa,CAAC;IAC3B,wCAAwC;IACxC,UAAU,EAAE,OAAO,CAAC;IACpB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,kBAAkB,GAAG,IAAI,CAAC;IAC1C,6BAA6B;IAC7B,aAAa,EAAE,MAAM,uBAAuB,GAAG,IAAI,CAAC;IACpD,wCAAwC;IACxC,OAAO,EAAE,CACP,MAAM,EAAE,oBAAoB,GAAG,MAAM,EACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,sCAAsC;IACtC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,kCAAkC;IAClC,iBAAiB,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAClD,uEAAuE;IACvE,WAAW,EAAE,CACX,KAAK,EAAE,OAAO,EACd,WAAW,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,KACvE,IAAI,CAAC;IACV;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAoFD,wBAAgB,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,EAC1E,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC9B,kBAAkB,CAAC;AAiatB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,2BAA4B,SAAQ,kBAAkB;IACrE,yCAAyC;IACzC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACxD;AAED;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,IACtF,mCAAmC,CAAC,CAAC,CAAC,CAAC;AAEzC,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,EACnF,OAAO,EAAE,4BAA4B,CAAC,CAAC,CAAC,GACvC,2BAA2B,CAsB7B"}
@@ -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,CA47BtB"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/server/handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,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;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,CA09BtB"}
@@ -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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,kBAAkB,CAAC;AACrF,OAAO,KAAK,EACV,kBAAkB,EAElB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EAGlB,MAAM,SAAS,CAAC;AAIjB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAkXlE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAE7E;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,iCAAiC;IACjC,SAAS,IAAI,OAAO,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,mGAAmG;IACnG,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjF,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,sDAAsD;IACtD,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,kDAAkD;IAClD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAuB7B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAvBlB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAAC,CAAgB;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAAsC;IAE5D;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,oBAAoB,CAAuB;gBAGzC,QAAQ,EAAE,sBAAsB,EAChC,QAAQ,EAAE,oBAAoB,EACtC,MAAM,GAAE,kBAAuB;IA8CjC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAIxC;;;OAGG;IACH,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAiGzD;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAsC/C;;;OAGG;IACH,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IA6BzD;;;;OAIG;IACH,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IA4BvD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAMpB,OAAO,CAAC,WAAW,CAAC,CAAuB;IAE3C;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAIlD;;;;OAIG;IACG,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4IxF;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAwB7E;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAetB;;;;OAIG;IACH,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAa/C;;;OAGG;YACW,oBAAoB;IAwHlC;;;;;;;;;;;OAWG;YACW,sBAAsB;IAmJpC;;;OAGG;YACW,cAAc;IA6E5B;;;;;;;;;;;OAWG;YACW,oBAAoB;IAgClC;;;;;OAKG;IACG,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAuDhE;;;;;;;;;;;OAWG;YACW,YAAY;CAuE3B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,sBAAsB,EAChC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,CAAC,EAAE,kBAAkB,GAC1B,oBAAoB,CAEtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG"}
@@ -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"}
@@ -57,6 +57,11 @@ var UI_BRIDGE_NATIVE_ROUTES = {
57
57
  path: "/ui-bridge/control/snapshot",
58
58
  description: "Get full bridge snapshot"
59
59
  },
60
+ DISCOVER: {
61
+ method: "GET",
62
+ path: "/ui-bridge/control/discover",
63
+ description: "Discover elements (alias for snapshot; web/runner parity)"
64
+ },
60
65
  PAGE_HEALTH: {
61
66
  method: "POST",
62
67
  path: "/ui-bridge/control/page-health",
@@ -184,6 +189,18 @@ var UI_BRIDGE_NATIVE_ROUTES = {
184
189
  path: "/ui-bridge/control/modal/dismiss/:id",
185
190
  description: "Dismiss a modal by id (testHooks)"
186
191
  },
192
+ // Observability — last-N ring buffers (always mounted; `installed:false`
193
+ // when the console/network patches are off, i.e. no testHooks).
194
+ CONSOLE_ERRORS: {
195
+ method: "GET",
196
+ path: "/ui-bridge/control/console-errors",
197
+ description: "Last-N captured console.error/console.warn entries"
198
+ },
199
+ NETWORK_REQUESTS: {
200
+ method: "GET",
201
+ path: "/ui-bridge/sdk/network-requests",
202
+ description: "Last-N captured fetch/XHR requests with status + duration"
203
+ },
187
204
  // Health
188
205
  HEALTH: {
189
206
  method: "GET",
@@ -943,6 +960,13 @@ function matchElementsByText(registry, text, opts) {
943
960
  scored.sort((a, b) => a.rank - b.rank);
944
961
  return scored.map((s) => s.element);
945
962
  }
963
+ function resolveElementState(element) {
964
+ const state = element.getState();
965
+ if (element.type === "input" && state.value === void 0 && typeof element.props?.value === "string") {
966
+ return { ...state, value: element.props.value };
967
+ }
968
+ return state;
969
+ }
946
970
  async function executeWorkflowStep(step, registry, executor) {
947
971
  const startTime = Date.now();
948
972
  try {
@@ -1179,7 +1203,7 @@ function createServerHandlers(registry, executor, config) {
1179
1203
  type: element.type,
1180
1204
  label: element.label,
1181
1205
  identifier: element.getIdentifier(),
1182
- state: element.getState(),
1206
+ state: resolveElementState(element),
1183
1207
  actions: element.actions,
1184
1208
  customActions: element.customActions ? Object.keys(element.customActions) : void 0,
1185
1209
  registeredHandlers: handlers.length > 0 ? handlers : void 0,
@@ -1193,18 +1217,19 @@ function createServerHandlers(registry, executor, config) {
1193
1217
  if (!element) {
1194
1218
  return error2(`Element not found: ${id}`, "ELEMENT_NOT_FOUND");
1195
1219
  }
1196
- return success2({ state: element.getState() });
1220
+ return success2({ state: resolveElementState(element) });
1197
1221
  },
1198
1222
  executeAction: async (ctx) => {
1199
- const { id } = ctx.params;
1200
- const body = ctx.body;
1201
- if (!body?.action) {
1223
+ const rawBody = ctx.body ?? {};
1224
+ const envelope = rawBody.request && typeof rawBody.request === "object" ? rawBody.request : rawBody;
1225
+ const id = ctx.params.id ?? rawBody.id ?? "";
1226
+ if (!envelope?.action) {
1202
1227
  return error2("Action is required", "INVALID_REQUEST");
1203
1228
  }
1204
1229
  const response = await executor.executeAction(id, {
1205
- action: body.action,
1206
- params: body.params,
1207
- waitOptions: body.waitOptions
1230
+ action: envelope.action,
1231
+ params: envelope.params,
1232
+ waitOptions: envelope.waitOptions
1208
1233
  });
1209
1234
  if (!response.success) {
1210
1235
  return error2(response.error || "Action failed", "ACTION_FAILED");
@@ -1716,7 +1741,8 @@ function createServerHandlers(registry, executor, config) {
1716
1741
  return success2({
1717
1742
  entries: [],
1718
1743
  count: 0,
1719
- bufferSize: 0
1744
+ bufferSize: 0,
1745
+ installed: false
1720
1746
  });
1721
1747
  }
1722
1748
  const entries = buf.entries({
@@ -1726,7 +1752,8 @@ function createServerHandlers(registry, executor, config) {
1726
1752
  return success2({
1727
1753
  entries,
1728
1754
  count: entries.length,
1729
- bufferSize: buf.size()
1755
+ bufferSize: buf.size(),
1756
+ installed: buf.isInstalled()
1730
1757
  });
1731
1758
  },
1732
1759
  getNetworkRequests: async (ctx) => {
@@ -1737,7 +1764,8 @@ function createServerHandlers(registry, executor, config) {
1737
1764
  return success2({
1738
1765
  entries: [],
1739
1766
  count: 0,
1740
- bufferSize: 0
1767
+ bufferSize: 0,
1768
+ installed: false
1741
1769
  });
1742
1770
  }
1743
1771
  const entries = buf.entries({
@@ -1747,7 +1775,8 @@ function createServerHandlers(registry, executor, config) {
1747
1775
  return success2({
1748
1776
  entries,
1749
1777
  count: entries.length,
1750
- bufferSize: buf.size()
1778
+ bufferSize: buf.size(),
1779
+ installed: buf.isInstalled()
1751
1780
  });
1752
1781
  },
1753
1782
  // Test hooks — modal stack manipulation
@@ -1839,7 +1868,7 @@ function createServerHandlers(registry, executor, config) {
1839
1868
  };
1840
1869
  if (config?.appInfo) {
1841
1870
  response.uiBridge = {
1842
- version: "0.3.0",
1871
+ version: "0.6.10",
1843
1872
  ...config.appInfo,
1844
1873
  capabilities: ["elements", "components", "actions", "design"],
1845
1874
  elementCount: stats.elements,
@@ -2166,7 +2195,10 @@ var WS_ROUTES = [
2166
2195
  // same handler at both paths to keep agents portable across platforms.
2167
2196
  { pattern: "ai/find", handler: "find", httpMethods: ["POST"] },
2168
2197
  { pattern: "control/snapshot", handler: "getSnapshot", httpMethods: ["GET"] },
2169
- { pattern: "control/discover", handler: "getSnapshot" },
2198
+ // Discovery alias — web/runner parity with `POST /control/discover` (a
2199
+ // legacy alias for snapshot/find). Mounted on HTTP (GET+POST) so mobile
2200
+ // doesn't 404 where web returns 200; delegates to the snapshot handler.
2201
+ { pattern: "control/discover", handler: "getSnapshot", httpMethods: ["GET", "POST"] },
2170
2202
  // Page health — accepts both GET and POST so the canonical skill invocation
2171
2203
  // (`POST .../control/page-health` with an empty body) and ad-hoc curls both
2172
2204
  // work without a body-shape gotcha.
@@ -2260,19 +2292,26 @@ var WS_ROUTES = [
2260
2292
  httpMethods: ["POST"],
2261
2293
  requiresTestHooks: true
2262
2294
  },
2263
- // Observability — last-N console errors + network requests. testHooks-gated
2264
- // because patching `console.error` / `fetch` is invasive in production.
2295
+ // Observability — last-N console errors + network requests.
2296
+ //
2297
+ // Always mounted (not testHooks-gated) so they return a schema-valid 200
2298
+ // on every build instead of a 404 that agents can't distinguish from a
2299
+ // missing route. The INVASIVE part — monkey-patching `console.error` /
2300
+ // `fetch` / `XMLHttpRequest` — stays gated behind `testHooks` (see
2301
+ // NativeUIBridgeServer.start → buffer.install()). When the patches aren't
2302
+ // installed the handlers report `installed: false` + empty entries, so
2303
+ // production builds expose the contract without observing real users'
2304
+ // console/network traffic. Set `features.testHooks` (typically on
2305
+ // `__DEV__`) to populate the buffers with live data.
2265
2306
  {
2266
2307
  pattern: "control/console-errors",
2267
2308
  handler: "getConsoleErrors",
2268
- httpMethods: ["GET"],
2269
- requiresTestHooks: true
2309
+ httpMethods: ["GET"]
2270
2310
  },
2271
2311
  {
2272
2312
  pattern: "sdk/network-requests",
2273
2313
  handler: "getNetworkRequests",
2274
- httpMethods: ["GET"],
2275
- requiresTestHooks: true
2314
+ httpMethods: ["GET"]
2276
2315
  }
2277
2316
  ];
2278
2317
  var HANDLER_DESCRIPTIONS = {
@@ -2319,8 +2358,8 @@ var HANDLER_DESCRIPTIONS = {
2319
2358
  typeInto: "App-agnostic: type into the input matching a label: body { label, text, clear?, visibleOnly? }. (selector form is web-only)",
2320
2359
  readValue: "STUB \u2014 selector-based; NOT_SUPPORTED on native (no DOM). Use /control/element/:id/state to read a value.",
2321
2360
  findByText: "App-agnostic: list elements matching free-text (no press): body { text, visibleOnly? }",
2322
- getConsoleErrors: "TEST HOOK \u2014 last-N console.error/console.warn entries; ?since=<ms>&limit=<n>",
2323
- getNetworkRequests: "TEST HOOK \u2014 last-N fetch/XHR entries with status + duration; ?since=<ms>&limit=<n>",
2361
+ getConsoleErrors: "Last-N console.error/console.warn entries; ?since=<ms>&limit=<n>. `installed:false` when capture is off (no testHooks) \u2014 entries empty but schema-valid.",
2362
+ getNetworkRequests: "Last-N fetch/XHR entries with status + duration; ?since=<ms>&limit=<n>. `installed:false` when capture is off (no testHooks) \u2014 entries empty but schema-valid.",
2324
2363
  pushModal: "TEST HOOK \u2014 push a modal onto the snapshot.modalStack via the registry ModalDetector",
2325
2364
  dismissModal: "TEST HOOK \u2014 dismiss a modal by id from the snapshot.modalStack via the registry ModalDetector",
2326
2365
  keepAwake: "TEST HOOK \u2014 keep the device screen awake via the injected keepAwakeProvider: body { enabled: boolean, durationMs?: number }"
@@ -3955,6 +3994,46 @@ var WebSocketConnection = class {
3955
3994
  }
3956
3995
  };
3957
3996
 
3997
+ // src/server/bind-retry.ts
3998
+ function isAddrInUseError(err) {
3999
+ const message = err instanceof Error ? err.message : typeof err === "string" ? err : String(err);
4000
+ const code = err?.code;
4001
+ return message.includes("EADDRINUSE") || message.toLowerCase().includes("address already in use") || code === "EADDRINUSE";
4002
+ }
4003
+ var defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
4004
+ async function bindWithRetry(attempt, options = {}) {
4005
+ const {
4006
+ minTotalMs = 3e4,
4007
+ initialDelayMs = 500,
4008
+ maxDelayMs = 5e3,
4009
+ backoffFactor = 2,
4010
+ logger = console,
4011
+ sleep = defaultSleep,
4012
+ now = Date.now
4013
+ } = options;
4014
+ const startedAt = now();
4015
+ let delay = initialDelayMs;
4016
+ let attemptIndex = 0;
4017
+ for (; ; ) {
4018
+ try {
4019
+ await attempt(attemptIndex);
4020
+ return;
4021
+ } catch (err) {
4022
+ const elapsed = now() - startedAt;
4023
+ const budgetExhausted = elapsed + delay >= minTotalMs;
4024
+ if (!isAddrInUseError(err) || budgetExhausted) {
4025
+ throw err;
4026
+ }
4027
+ logger.warn(
4028
+ `[ui-bridge-native] bind failed with EADDRINUSE (attempt ${attemptIndex + 1}); retrying in ${delay}ms (elapsed ${elapsed}ms / budget ${minTotalMs === Infinity ? "\u221E" : minTotalMs}ms)`
4029
+ );
4030
+ await sleep(delay);
4031
+ delay = Math.min(delay * backoffFactor, maxDelayMs);
4032
+ attemptIndex += 1;
4033
+ }
4034
+ }
4035
+ }
4036
+
3958
4037
  exports.ConsoleErrorBuffer = ConsoleErrorBuffer;
3959
4038
  exports.NativeUIBridgeServer = NativeUIBridgeServer;
3960
4039
  exports.NetworkRequestBuffer = NetworkRequestBuffer;
@@ -3967,6 +4046,7 @@ exports.OPCODE_TEXT = OPCODE_TEXT;
3967
4046
  exports.UI_BRIDGE_NATIVE_ROUTES = UI_BRIDGE_NATIVE_ROUTES;
3968
4047
  exports.WebSocketConnection = WebSocketConnection;
3969
4048
  exports.WebSocketEventBridge = WebSocketEventBridge;
4049
+ exports.bindWithRetry = bindWithRetry;
3970
4050
  exports.buildUpgradeResponse = buildUpgradeResponse;
3971
4051
  exports.computeAcceptKey = computeAcceptKey;
3972
4052
  exports.createDesignHandlers = createDesignHandlers;
@@ -3978,6 +4058,7 @@ exports.encodeCloseFrame = encodeCloseFrame;
3978
4058
  exports.encodePingFrame = encodePingFrame;
3979
4059
  exports.encodePongFrame = encodePongFrame;
3980
4060
  exports.encodeTextFrame = encodeTextFrame;
4061
+ exports.isAddrInUseError = isAddrInUseError;
3981
4062
  exports.isBatchRequest = isBatchRequest;
3982
4063
  exports.isSubscribe = isSubscribe;
3983
4064
  exports.isUnsubscribe = isUnsubscribe;