peachsim 0.1.662 → 0.1.664

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 (78) hide show
  1. package/cli/commands/control.ts +9 -17
  2. package/cli/commands/inspect/core.ts +44 -23
  3. package/cli/commands/inspect/settling.ts +54 -1
  4. package/cli/commands/inspect/wait-ready.ts +40 -70
  5. package/dist-lib/agent-daemon-client.cjs +1 -1
  6. package/dist-lib/agent-events.cjs +1 -1
  7. package/dist-lib/agent-identity.cjs +1 -1
  8. package/dist-lib/agent-sessions.cjs +1 -1
  9. package/dist-lib/attached-projects.cjs +1 -1
  10. package/dist-lib/auth/shared-session.cjs +1 -1
  11. package/dist-lib/backend-origin.cjs +1 -1
  12. package/dist-lib/beta.cjs +1 -1
  13. package/dist-lib/beta.mjs +1 -1
  14. package/dist-lib/bridge-constants.cjs +1 -1
  15. package/dist-lib/bridge-contract-input.cjs +1 -1
  16. package/dist-lib/bridge-contract-input.mjs +1 -1
  17. package/dist-lib/bridge-contract.cjs +6 -1
  18. package/dist-lib/bridge-contract.mjs +5 -1
  19. package/dist-lib/capture-contract.cjs +1 -1
  20. package/dist-lib/capture-contract.mjs +1 -1
  21. package/dist-lib/cli-constants.cjs +1 -1
  22. package/dist-lib/cloud-contract.cjs +1 -1
  23. package/dist-lib/cloud-contract.mjs +1 -1
  24. package/dist-lib/cloud-test-args.cjs +1 -1
  25. package/dist-lib/cloud-test-args.mjs +1 -1
  26. package/dist-lib/cloud.cjs +1 -1
  27. package/dist-lib/cloud.mjs +1 -1
  28. package/dist-lib/config.cjs +1 -1
  29. package/dist-lib/detox/index.cjs +1 -1
  30. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  31. package/dist-lib/home-paths.cjs +1 -1
  32. package/dist-lib/host/bridge-host.cjs +1 -1
  33. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  34. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  35. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  36. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  37. package/dist-lib/host/websocket-proxy.cjs +1 -1
  38. package/dist-lib/index.cjs +16 -17
  39. package/dist-lib/jump-to-source-babel.cjs +1 -1
  40. package/dist-lib/jump-to-source-native.cjs +1 -1
  41. package/dist-lib/kotlin-host.cjs +13 -7
  42. package/dist-lib/menu.cjs +1 -1
  43. package/dist-lib/menu.mjs +1 -1
  44. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  45. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  46. package/dist-lib/metro-production-bundle.cjs +1 -1
  47. package/dist-lib/metro-production-bundle.mjs +1 -1
  48. package/dist-lib/metro.cjs +1 -1
  49. package/dist-lib/native-app-identity.cjs +1 -1
  50. package/dist-lib/native-app-identity.mjs +1 -1
  51. package/dist-lib/plist.cjs +1 -1
  52. package/dist-lib/plist.mjs +1 -1
  53. package/dist-lib/profiles.cjs +1 -1
  54. package/dist-lib/public-brand.cjs +1 -1
  55. package/dist-lib/react-native-host-modules.cjs +1 -1
  56. package/dist-lib/react-native-host-modules.mjs +1 -1
  57. package/dist-lib/render-mode.cjs +1 -1
  58. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  59. package/dist-lib/sdk.cjs +57 -17
  60. package/dist-lib/sdk.mjs +54 -17
  61. package/dist-lib/skills.cjs +38 -27
  62. package/dist-lib/swift-compile.cjs +1 -1
  63. package/dist-lib/swift-compile.mjs +1 -1
  64. package/dist-lib/swift-package.cjs +1 -1
  65. package/dist-lib/swift-package.mjs +1 -1
  66. package/dist-lib/swift-submit.cjs +1 -1
  67. package/dist-lib/swift-submit.mjs +1 -1
  68. package/dist-lib/swift.cjs +1 -1
  69. package/dist-lib/vite-swift.cjs +1 -1
  70. package/dist-lib/vite.cjs +1 -1
  71. package/kotlin/AppSources/dev/peach/app/PeachApp.kt +8 -2
  72. package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +56 -0
  73. package/package.json +1 -1
  74. package/src/bridge-contract.ts +15 -0
  75. package/src/generated/android-framework-themes.json +341 -0
  76. package/src/kotlin-app.ts +47 -26
  77. package/src/kotlin-host.ts +14 -7
  78. package/src/sdk.ts +2 -1
@@ -90,7 +90,7 @@ import {
90
90
  worldForBridgePort,
91
91
  type BridgeSimInfo,
92
92
  } from '../ws-bridge'
93
- import { inspectDescribe, inspectWaitReady } from './inspect/core'
93
+ import { inspectDescribe, inspectReadySnapshot, waitReadyReason } from './inspect/core'
94
94
  import { isAgentEnv } from './inspect/env'
95
95
  import type { DriverId, DriverLaunchResult } from '../drivers/types'
96
96
 
@@ -1346,24 +1346,16 @@ async function maybeDescribeAfterOpen(wsPort: number, simId: string, args: strin
1346
1346
  })
1347
1347
  try {
1348
1348
  if (noDescribe) return
1349
- let readyProbe: Awaited<ReturnType<typeof inspectWaitReady>> | null = null
1349
+ // the tree just held still, so one probe says whether the app is up
1350
+ let readyProbe: Awaited<ReturnType<typeof inspectReadySnapshot>> | null = null
1350
1351
  try {
1351
- readyProbe = await inspectWaitReady(bridge, 1)
1352
+ readyProbe = await inspectReadySnapshot(bridge, 3000)
1352
1353
  } catch {}
1353
- if (readyProbe) {
1354
- if (!readyProbe.ready) {
1355
- const reason = readyProbe.loadingText
1356
- ? `still showing "${readyProbe.loadingText}"`
1357
- : readyProbe.flag !== true
1358
- ? 'guest ready event has not fired'
1359
- : readyProbe.targets <= 0
1360
- ? 'no visible app content is inspectable yet'
1361
- : 'app tree is still stabilizing'
1362
- console.log(
1363
- ` app still loading: ${reason} (nodes: ${readyProbe.nodes}, targets: ${readyProbe.targets})`,
1364
- )
1365
- console.log(' before interacting, run: peach wait ready --max-ms 120000')
1366
- }
1354
+ if (readyProbe && !readyProbe.ready) {
1355
+ console.log(
1356
+ ` app still loading: ${waitReadyReason(readyProbe)} (nodes: ${readyProbe.nodes}, targets: ${readyProbe.targets})`,
1357
+ )
1358
+ console.log(' before interacting, run: peach wait ready --max-ms 120000')
1367
1359
  }
1368
1360
  const result = await inspectDescribe(bridge, {
1369
1361
  describe: true,
@@ -14,12 +14,14 @@
14
14
  import {
15
15
  HEADLESS_TENANT_FETCH_HUNG_MARKER,
16
16
  PUBLIC_NO_NETWORK_MARKER,
17
+ readyProbeIsReady,
17
18
  type SemanticWaitResult,
18
19
  type WsBridgeCommand,
19
20
  } from '../../../src/bridge-contract'
20
21
  export {
21
22
  readyProbeHasContent,
22
23
  readyProbeHasTargetContent,
24
+ readyProbeIsReady,
23
25
  } from '../../../src/bridge-contract'
24
26
  import type {
25
27
  SimSemanticNode,
@@ -1237,16 +1239,47 @@ export async function inspectWaitReady(
1237
1239
  timeoutMs = 20_000,
1238
1240
  options: WaitReadyOptions = {},
1239
1241
  ): Promise<WaitReadyStatus> {
1242
+ const result = await sendReadyWait(bridge, timeoutMs, timeoutMs + 1_000, options.simId)
1243
+ // a guest app that redboxes still paints: its ErrorBoundary is a real tree
1244
+ // with real nodes, so the engine's own readiness condition matches and every
1245
+ // caller reads exit 0 as "the app is up". an app that has errored is not
1246
+ // ready, so a guest error is disqualifying here rather than merely printed
1247
+ // on the failure path. `errors` (a console.error count) is deliberately not
1248
+ // used because apps can log errors benignly. `suppressedEntryError` remains
1249
+ // excluded because it never gates readiness by contract.
1250
+ const status = waitReadyStatus(result, result.matched && !result.probe?.externalError)
1251
+ if (!status.ready && options.onProgress) options.onProgress(status)
1252
+ return status
1253
+ }
1254
+
1255
+ // one readiness probe, judged on its own: no stability window, since the
1256
+ // caller has already let the app settle. any runtime answers it, because a
1257
+ // one-millisecond wait polls once and returns that probe whether or not its
1258
+ // own stability window matched.
1259
+ export async function inspectReadySnapshot(
1260
+ bridge: InspectBridge,
1261
+ sendTimeoutMs: number,
1262
+ simId?: string,
1263
+ ): Promise<WaitReadyStatus> {
1264
+ const result = await sendReadyWait(bridge, 1, sendTimeoutMs, simId)
1265
+ return waitReadyStatus(result, result.probe ? readyProbeIsReady(result.probe) : false)
1266
+ }
1267
+
1268
+ async function sendReadyWait(
1269
+ bridge: InspectBridge,
1270
+ timeoutMs: number,
1271
+ sendTimeoutMs: number,
1272
+ simId: string | undefined,
1273
+ ): Promise<SemanticWaitResult> {
1240
1274
  const start = Date.now()
1241
- let result: SemanticWaitResult
1242
1275
  try {
1243
- result = await bridge.send(
1276
+ return await bridge.send(
1244
1277
  {
1245
1278
  type: 'waitFor',
1246
- ...(options.simId ? { simId: options.simId } : {}),
1279
+ ...(simId ? { simId } : {}),
1247
1280
  waitForOptions: { condition: { type: 'ready' }, timeoutMs },
1248
1281
  },
1249
- { timeoutMs: timeoutMs + 1_000 },
1282
+ { timeoutMs: sendTimeoutMs },
1250
1283
  )
1251
1284
  } catch (error) {
1252
1285
  const bridgeError = error instanceof Error ? error.message : String(error)
@@ -1256,24 +1289,14 @@ export async function inspectWaitReady(
1256
1289
  ) {
1257
1290
  throw error
1258
1291
  }
1259
- result = {
1260
- matched: false,
1261
- elapsedMs: Date.now() - start,
1262
- polls: 0,
1263
- error: bridgeError,
1264
- }
1292
+ return { matched: false, elapsedMs: Date.now() - start, polls: 0, error: bridgeError }
1265
1293
  }
1294
+ }
1295
+
1296
+ function waitReadyStatus(result: SemanticWaitResult, ready: boolean): WaitReadyStatus {
1266
1297
  const probe = result.probe
1267
- // a guest app that redboxes still paints: its ErrorBoundary is a real tree
1268
- // with real nodes, so the engine's own readiness condition matches and every
1269
- // caller reads exit 0 as "the app is up". an app that has errored is not
1270
- // ready, so a guest error is disqualifying here rather than merely printed
1271
- // on the failure path. `errors` (a console.error count) is deliberately not
1272
- // used because apps can log errors benignly. `suppressedEntryError` remains
1273
- // excluded because it never gates readiness by contract.
1274
- const externalError = probe?.externalError ?? ''
1275
- const status: WaitReadyStatus = {
1276
- ready: result.matched && !externalError,
1298
+ return {
1299
+ ready,
1277
1300
  elapsedMs: result.elapsedMs,
1278
1301
  nodes: probe?.nodes ?? 0,
1279
1302
  targets: probe?.targets ?? 0,
@@ -1284,13 +1307,11 @@ export async function inspectWaitReady(
1284
1307
  loadingText: probe?.loadingText ?? '',
1285
1308
  externalReady: probe?.externalReady ?? null,
1286
1309
  externalStatus: probe?.externalStatus ?? '',
1287
- externalError,
1310
+ externalError: probe?.externalError ?? '',
1288
1311
  suppressedEntryError: probe?.suppressedEntryError ?? '',
1289
1312
  errors: probe?.errors ?? 0,
1290
1313
  bridgeError: result.error ?? '',
1291
1314
  }
1292
- if (!status.ready && options.onProgress) options.onProgress(status)
1293
- return status
1294
1315
  }
1295
1316
 
1296
1317
  // `wait selector` — block until a node with the given testID is present and
@@ -1,4 +1,10 @@
1
- import type { InspectBridge } from './core'
1
+ import {
2
+ inspectReadySnapshot,
3
+ inspectWaitReady,
4
+ type InspectBridge,
5
+ type WaitReadyOptions,
6
+ type WaitReadyStatus,
7
+ } from './core'
2
8
 
3
9
  export type WaitForSootsimIdleOptions = {
4
10
  bridge: InspectBridge
@@ -212,3 +218,50 @@ export async function waitForSootsimIdle({
212
218
  blockedBy: typeof blockedBy === 'string' ? blockedBy : 'unknown',
213
219
  }
214
220
  }
221
+
222
+ export type SettledWaitReady = {
223
+ // the last readiness read: the settled tree once the app went idle,
224
+ // otherwise the read that ended the wait.
225
+ status: WaitReadyStatus
226
+ // the last settle; null when the app never became ready.
227
+ idle: WaitForSootsimIdleResult | null
228
+ elapsedMs: number
229
+ }
230
+
231
+ // `wait ready`, let the app settle, then read the settled tree once: the app
232
+ // keeps mounting while it settles, so the first tree that counted as ready
233
+ // undercounts what the caller is about to see. a settled app that is no
234
+ // longer ready (it reloaded, or went back to loading) has not proven the tree
235
+ // it shows next, so that starts the wait over. one deadline bounds it all.
236
+ export async function waitReadyAndSettle(
237
+ bridge: InspectBridge,
238
+ timeoutMs: number,
239
+ options: WaitReadyOptions = {},
240
+ ): Promise<SettledWaitReady> {
241
+ const start = Date.now()
242
+ const remaining = () => Math.max(0, start + timeoutMs - Date.now())
243
+ const result = (status: WaitReadyStatus, idle: WaitForSootsimIdleResult | null) => ({
244
+ status,
245
+ idle,
246
+ elapsedMs: Date.now() - start,
247
+ })
248
+ let idle: WaitForSootsimIdleResult | null = null
249
+ for (;;) {
250
+ const ready = await inspectWaitReady(bridge, remaining(), options)
251
+ if (!ready.ready) return result(ready, idle)
252
+ idle = await waitForSootsimIdle({
253
+ bridge,
254
+ simId: options.simId,
255
+ maxMs: Math.min(10_000, remaining()),
256
+ pollMs: 32,
257
+ stablePolls: 2,
258
+ })
259
+ if (!idle.settled) return result(ready, idle)
260
+ const settled = await inspectReadySnapshot(
261
+ bridge,
262
+ Math.max(1_000, remaining()),
263
+ options.simId,
264
+ )
265
+ if (settled.ready || remaining() === 0) return result(settled, idle)
266
+ }
267
+ }
@@ -1,6 +1,11 @@
1
1
  import { rnxExit } from '../../run-rnx'
2
- import { inspectWaitReady, resolveMaxMsFlag, waitReadyReason } from './core'
3
- import { waitForSootsimIdle } from './settling'
2
+ import {
3
+ inspectWaitReady,
4
+ resolveMaxMsFlag,
5
+ type WaitReadyStatus,
6
+ waitReadyReason,
7
+ } from './core'
8
+ import { waitReadyAndSettle } from './settling'
4
9
  import type { WsBridge } from '../../ws-bridge'
5
10
 
6
11
  // blocks until the guest app bundle has finished loading and painted real
@@ -18,79 +23,44 @@ export async function runWaitReadySubcommand(opts: {
18
23
  // routinely take 10-15s to evaluate + mount.
19
24
  const timeoutMs = resolveMaxMsFlag(args, 20000)
20
25
 
21
- const {
22
- ready,
23
- elapsedMs,
24
- nodes,
25
- targets,
26
- liveFrameActive,
27
- liveFrameChannels,
28
- flag,
29
- loadingText,
30
- externalReady,
31
- externalStatus,
32
- externalError,
33
- suppressedEntryError,
34
- errors,
35
- bridgeError,
36
- } = await inspectWaitReady(bridge, timeoutMs, {
37
- ...(bridge.plane !== 'cloud'
38
- ? {
39
- onProgress(status) {
40
- console.error(
41
- ` still waiting after ${status.elapsedMs}ms — ${waitReadyReason(status)} (nodes: ${status.nodes}, targets: ${status.targets}, live surfaces: ${status.liveFrameActive ? status.liveFrameChannels : 0}, errors: ${status.errors})`,
42
- )
43
- },
44
- }
45
- : {}),
46
- })
47
- if (ready) {
48
- if (bridge.plane === 'cloud') {
49
- console.log(
50
- ` ready in ${elapsedMs}ms: ${nodes} nodes, ${targets} targets${liveFrameActive ? `, ${liveFrameChannels} live surfaces` : ''}`,
51
- )
52
- return
53
- }
54
- const remainingMs = timeoutMs - elapsedMs
55
- const idleBudgetMs = Math.max(100, Math.min(10_000, remainingMs))
56
- const idle = await waitForSootsimIdle({
57
- bridge,
58
- maxMs: idleBudgetMs,
59
- pollMs: 32,
60
- stablePolls: 2,
61
- })
62
- if (!idle.settled) {
63
- console.error(
64
- ` ⚠ wait ready timed out after ${elapsedMs + idle.elapsed}ms — app mounted but did not settle (nodes: ${nodes}, targets: ${targets})`,
65
- )
66
- rnxExit(1)
67
- }
68
- // the app keeps mounting while it settles, so report the settled tree,
69
- // not the first one that counted as ready.
70
- const settled = await inspectWaitReady(bridge, 1_000)
71
- if (!settled.ready) {
26
+ if (bridge.plane === 'cloud') {
27
+ const status = await inspectWaitReady(bridge, timeoutMs)
28
+ if (!status.ready) timedOut(status, status.elapsedMs)
29
+ printReady(status, status.elapsedMs)
30
+ return
31
+ }
32
+ const { status, idle, elapsedMs } = await waitReadyAndSettle(bridge, timeoutMs, {
33
+ onProgress(progress) {
72
34
  console.error(
73
- ` ⚠ wait ready: the app stopped being ready while it settled — ${waitReadyReason(settled)} (nodes: ${settled.nodes}, targets: ${settled.targets}, errors: ${settled.errors})`,
35
+ ` still waiting after ${progress.elapsedMs}ms — ${waitReadyReason(progress)} (nodes: ${progress.nodes}, targets: ${progress.targets}, live surfaces: ${progress.liveFrameActive ? progress.liveFrameChannels : 0}, errors: ${progress.errors})`,
74
36
  )
75
- rnxExit(1)
76
- }
77
- console.log(
78
- ` ready in ${elapsedMs + idle.elapsed}ms: ${settled.nodes} nodes, ${settled.targets} targets${settled.liveFrameActive ? `, ${settled.liveFrameChannels} live surfaces` : ''}`,
37
+ },
38
+ })
39
+ if (!idle) timedOut(status, elapsedMs)
40
+ if (!idle.settled) {
41
+ console.error(
42
+ ` ⚠ wait ready timed out after ${elapsedMs}ms — app mounted but did not settle: ${idle.blockedBy} (nodes: ${status.nodes}, targets: ${status.targets})`,
79
43
  )
80
- return
44
+ rnxExit(1)
81
45
  }
82
- const reason = waitReadyReason({
83
- externalError,
84
- loadingText,
85
- externalReady,
86
- externalStatus,
87
- flag,
88
- targets,
89
- suppressedEntryError,
90
- bridgeError,
91
- })
46
+ if (!status.ready) {
47
+ console.error(
48
+ ` ⚠ wait ready: the app stopped being ready after it settled — ${waitReadyReason(status)} (nodes: ${status.nodes}, targets: ${status.targets}, errors: ${status.errors})`,
49
+ )
50
+ rnxExit(1)
51
+ }
52
+ printReady(status, elapsedMs)
53
+ }
54
+
55
+ function printReady(status: WaitReadyStatus, elapsedMs: number): void {
56
+ console.log(
57
+ ` ready in ${elapsedMs}ms: ${status.nodes} nodes, ${status.targets} targets${status.liveFrameActive ? `, ${status.liveFrameChannels} live surfaces` : ''}`,
58
+ )
59
+ }
60
+
61
+ function timedOut(status: WaitReadyStatus, elapsedMs: number): never {
92
62
  console.error(
93
- ` ⚠ wait ready timed out after ${elapsedMs}ms — ${reason} (nodes: ${nodes}, targets: ${targets}, live surfaces: ${liveFrameActive ? liveFrameChannels : 0}, errors: ${errors})`,
63
+ ` ⚠ wait ready timed out after ${elapsedMs}ms — ${waitReadyReason(status)} (nodes: ${status.nodes}, targets: ${status.targets}, live surfaces: ${status.liveFrameActive ? status.liveFrameChannels : 0}, errors: ${status.errors})`,
94
64
  )
95
65
  rnxExit(1)
96
66
  }
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/beta.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/beta.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/beta.ts
4
4
  var IS_BETA = true;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_MAX_MS = 5e3;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -33,6 +33,7 @@ __export(bridge_contract_exports, {
33
33
  performStepRefusal: () => performStepRefusal,
34
34
  readyProbeHasContent: () => readyProbeHasContent,
35
35
  readyProbeHasTargetContent: () => readyProbeHasTargetContent,
36
+ readyProbeIsReady: () => readyProbeIsReady,
36
37
  refusedPerformStepReason: () => refusedPerformStepReason
37
38
  });
38
39
  module.exports = __toCommonJS(bridge_contract_exports);
@@ -113,6 +114,9 @@ function readyProbeHasContent(probe) {
113
114
  function readyProbeHasTargetContent(probe) {
114
115
  return probe.liveFrameActive || probe.targets > 0;
115
116
  }
117
+ function readyProbeIsReady(probe) {
118
+ return (probe.flag === true ? readyProbeHasContent(probe) : readyProbeHasTargetContent(probe)) && probe.externalReady !== false && !probe.externalError && !probe.loadingText;
119
+ }
116
120
  // Annotate the CommonJS export names for ESM import in node:
117
121
  0 && (module.exports = {
118
122
  HEADLESS_TENANT_FETCH_HUNG_MARKER,
@@ -126,5 +130,6 @@ function readyProbeHasTargetContent(probe) {
126
130
  performStepRefusal,
127
131
  readyProbeHasContent,
128
132
  readyProbeHasTargetContent,
133
+ readyProbeIsReady,
129
134
  refusedPerformStepReason
130
135
  });
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var REFUSED_PERFORM_STEP_TYPES = [
@@ -78,6 +78,9 @@ function readyProbeHasContent(probe) {
78
78
  function readyProbeHasTargetContent(probe) {
79
79
  return probe.liveFrameActive || probe.targets > 0;
80
80
  }
81
+ function readyProbeIsReady(probe) {
82
+ return (probe.flag === true ? readyProbeHasContent(probe) : readyProbeHasTargetContent(probe)) && probe.externalReady !== false && !probe.externalError && !probe.loadingText;
83
+ }
81
84
  export {
82
85
  HEADLESS_TENANT_FETCH_HUNG_MARKER,
83
86
  PUBLIC_NO_NETWORK_MARKER,
@@ -90,5 +93,6 @@ export {
90
93
  performStepRefusal,
91
94
  readyProbeHasContent,
92
95
  readyProbeHasTargetContent,
96
+ readyProbeIsReady,
93
97
  refusedPerformStepReason
94
98
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/capture-contract.ts
4
4
  var RNX_SCREEN_CAPTURE_VERSION = 1;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/cloud-contract.ts
4
4
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/cloud-test-args.ts
4
4
  var CLOUD_TEST_ARGS_MAX_COUNT = 32;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.664 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;