@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.
- package/dist/control/action-executor.d.ts +15 -0
- package/dist/control/action-executor.d.ts.map +1 -1
- package/dist/control/index.js +36 -1
- package/dist/control/index.js.map +1 -1
- package/dist/control/index.mjs +36 -1
- package/dist/control/index.mjs.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +1 -1
- package/dist/core/index.mjs.map +1 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +153 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +152 -27
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.js +94 -26
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +94 -26
- package/dist/react/index.mjs.map +1 -1
- package/dist/react/useUIElement.d.ts +10 -0
- package/dist/react/useUIElement.d.ts.map +1 -1
- package/dist/server/bind-retry.d.ts +64 -0
- package/dist/server/bind-retry.d.ts.map +1 -0
- package/dist/server/handlers.d.ts.map +1 -1
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +103 -22
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +102 -23
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/types.d.ts +14 -0
- package/dist/server/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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":"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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;
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/server/index.js
CHANGED
|
@@ -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
|
|
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
|
|
1220
|
+
return success2({ state: resolveElementState(element) });
|
|
1197
1221
|
},
|
|
1198
1222
|
executeAction: async (ctx) => {
|
|
1199
|
-
const
|
|
1200
|
-
const
|
|
1201
|
-
|
|
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:
|
|
1206
|
-
params:
|
|
1207
|
-
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.
|
|
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
|
-
|
|
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.
|
|
2264
|
-
//
|
|
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: "
|
|
2323
|
-
getNetworkRequests: "
|
|
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;
|