peachsim 0.1.662 → 0.1.663

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 (77) hide show
  1. package/cli/commands/inspect/core.ts +9 -1
  2. package/cli/commands/inspect/settling.ts +44 -1
  3. package/cli/commands/inspect/wait-ready.ts +40 -70
  4. package/dist-lib/agent-daemon-client.cjs +1 -1
  5. package/dist-lib/agent-events.cjs +1 -1
  6. package/dist-lib/agent-identity.cjs +1 -1
  7. package/dist-lib/agent-sessions.cjs +1 -1
  8. package/dist-lib/attached-projects.cjs +1 -1
  9. package/dist-lib/auth/shared-session.cjs +1 -1
  10. package/dist-lib/backend-origin.cjs +1 -1
  11. package/dist-lib/beta.cjs +1 -1
  12. package/dist-lib/beta.mjs +1 -1
  13. package/dist-lib/bridge-constants.cjs +1 -1
  14. package/dist-lib/bridge-contract-input.cjs +6 -2
  15. package/dist-lib/bridge-contract-input.mjs +6 -2
  16. package/dist-lib/bridge-contract.cjs +1 -1
  17. package/dist-lib/bridge-contract.mjs +1 -1
  18. package/dist-lib/capture-contract.cjs +1 -1
  19. package/dist-lib/capture-contract.mjs +1 -1
  20. package/dist-lib/cli-constants.cjs +1 -1
  21. package/dist-lib/cloud-contract.cjs +1 -1
  22. package/dist-lib/cloud-contract.mjs +1 -1
  23. package/dist-lib/cloud-test-args.cjs +1 -1
  24. package/dist-lib/cloud-test-args.mjs +1 -1
  25. package/dist-lib/cloud.cjs +1 -1
  26. package/dist-lib/cloud.mjs +1 -1
  27. package/dist-lib/config.cjs +1 -1
  28. package/dist-lib/detox/index.cjs +1 -1
  29. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  30. package/dist-lib/home-paths.cjs +1 -1
  31. package/dist-lib/host/bridge-host.cjs +1 -1
  32. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  33. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  34. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  35. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  36. package/dist-lib/host/websocket-proxy.cjs +1 -1
  37. package/dist-lib/index.cjs +8 -2
  38. package/dist-lib/jump-to-source-babel.cjs +1 -1
  39. package/dist-lib/jump-to-source-native.cjs +1 -1
  40. package/dist-lib/kotlin-host.cjs +13 -7
  41. package/dist-lib/menu.cjs +1 -1
  42. package/dist-lib/menu.mjs +1 -1
  43. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  44. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  45. package/dist-lib/metro-production-bundle.cjs +1 -1
  46. package/dist-lib/metro-production-bundle.mjs +1 -1
  47. package/dist-lib/metro.cjs +1 -1
  48. package/dist-lib/native-app-identity.cjs +1 -1
  49. package/dist-lib/native-app-identity.mjs +1 -1
  50. package/dist-lib/plist.cjs +1 -1
  51. package/dist-lib/plist.mjs +1 -1
  52. package/dist-lib/profiles.cjs +1 -1
  53. package/dist-lib/public-brand.cjs +1 -1
  54. package/dist-lib/react-native-host-modules.cjs +1 -1
  55. package/dist-lib/react-native-host-modules.mjs +1 -1
  56. package/dist-lib/render-mode.cjs +1 -1
  57. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  58. package/dist-lib/sdk.cjs +29 -2
  59. package/dist-lib/sdk.mjs +28 -2
  60. package/dist-lib/skills.cjs +9 -2
  61. package/dist-lib/swift-compile.cjs +1 -1
  62. package/dist-lib/swift-compile.mjs +1 -1
  63. package/dist-lib/swift-package.cjs +1 -1
  64. package/dist-lib/swift-package.mjs +1 -1
  65. package/dist-lib/swift-submit.cjs +1 -1
  66. package/dist-lib/swift-submit.mjs +1 -1
  67. package/dist-lib/swift.cjs +1 -1
  68. package/dist-lib/vite-swift.cjs +1 -1
  69. package/dist-lib/vite.cjs +1 -1
  70. package/kotlin/AppSources/dev/peach/app/PeachApp.kt +8 -2
  71. package/package.json +1 -1
  72. package/src/bridge-contract-input.ts +5 -1
  73. package/src/bridge-contract.ts +4 -1
  74. package/src/generated/android-framework-themes.json +341 -0
  75. package/src/kotlin-app.ts +47 -26
  76. package/src/kotlin-host.ts +14 -7
  77. package/src/sdk.ts +2 -1
@@ -1177,6 +1177,8 @@ export interface WaitReadyOptions {
1177
1177
  progressIntervalMs?: number
1178
1178
  onProgress?: (status: WaitReadyStatus) => void
1179
1179
  simId?: string
1180
+ // how long the node count must hold still; see SemanticWaitCondition.
1181
+ stableMs?: number
1180
1182
  }
1181
1183
 
1182
1184
  export function waitReadyReason(
@@ -1244,7 +1246,13 @@ export async function inspectWaitReady(
1244
1246
  {
1245
1247
  type: 'waitFor',
1246
1248
  ...(options.simId ? { simId: options.simId } : {}),
1247
- waitForOptions: { condition: { type: 'ready' }, timeoutMs },
1249
+ waitForOptions: {
1250
+ condition: {
1251
+ type: 'ready',
1252
+ ...(options.stableMs === undefined ? {} : { stableMs: options.stableMs }),
1253
+ },
1254
+ timeoutMs,
1255
+ },
1248
1256
  },
1249
1257
  { timeoutMs: timeoutMs + 1_000 },
1250
1258
  )
@@ -1,4 +1,9 @@
1
- import type { InspectBridge } from './core'
1
+ import {
2
+ inspectWaitReady,
3
+ type InspectBridge,
4
+ type WaitReadyOptions,
5
+ type WaitReadyStatus,
6
+ } from './core'
2
7
 
3
8
  export type WaitForSootsimIdleOptions = {
4
9
  bridge: InspectBridge
@@ -212,3 +217,41 @@ export async function waitForSootsimIdle({
212
217
  blockedBy: typeof blockedBy === 'string' ? blockedBy : 'unknown',
213
218
  }
214
219
  }
220
+
221
+ export type SettledWaitReady = {
222
+ // the last readiness read: the settled tree once the app went idle,
223
+ // otherwise the read that ended the wait.
224
+ status: WaitReadyStatus
225
+ // null when the app never became ready.
226
+ idle: WaitForSootsimIdleResult | null
227
+ elapsedMs: number
228
+ }
229
+
230
+ // `wait ready`, let the app settle, then read readiness again: the app keeps
231
+ // mounting while it settles, so the first tree that counted as ready
232
+ // undercounts what the caller is about to see. the settle already proved the
233
+ // tree holds still, so the re-read asks for no stability window and answers
234
+ // on its first poll unless the app stopped being ready.
235
+ export async function waitReadyAndSettle(
236
+ bridge: InspectBridge,
237
+ timeoutMs: number,
238
+ options: WaitReadyOptions = {},
239
+ ): Promise<SettledWaitReady> {
240
+ const start = Date.now()
241
+ const ready = await inspectWaitReady(bridge, timeoutMs, options)
242
+ if (!ready.ready) return { status: ready, idle: null, elapsedMs: Date.now() - start }
243
+ const idle = await waitForSootsimIdle({
244
+ bridge,
245
+ simId: options.simId,
246
+ maxMs: Math.max(100, Math.min(10_000, timeoutMs - (Date.now() - start))),
247
+ pollMs: 32,
248
+ stablePolls: 2,
249
+ })
250
+ if (!idle.settled) return { status: ready, idle, elapsedMs: Date.now() - start }
251
+ const settled = await inspectWaitReady(
252
+ bridge,
253
+ Math.max(1_000, timeoutMs - (Date.now() - start)),
254
+ { ...(options.simId ? { simId: options.simId } : {}), stableMs: 0 },
255
+ )
256
+ return { status: settled, idle, elapsedMs: Date.now() - start }
257
+ }
@@ -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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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;
@@ -374,8 +374,12 @@ function parseSemanticWaitOptions(value) {
374
374
  const type = stringValue(condition.type, "waitFor.condition.type");
375
375
  const timeoutMs = semanticWaitTimeout(input, "waitFor");
376
376
  if (type === "ready") {
377
+ const stableMs = optionalNumber(condition, "stableMs", "waitFor.condition");
378
+ if (stableMs !== void 0 && stableMs < 0) {
379
+ validationFailure("waitFor.condition.stableMs", "must be at least 0");
380
+ }
377
381
  return {
378
- condition: { type },
382
+ condition: { type, ...stableMs === void 0 ? {} : { stableMs } },
379
383
  ...timeoutMs === void 0 ? {} : { timeoutMs }
380
384
  };
381
385
  }
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_MAX_MS = 5e3;
@@ -338,8 +338,12 @@ function parseSemanticWaitOptions(value) {
338
338
  const type = stringValue(condition.type, "waitFor.condition.type");
339
339
  const timeoutMs = semanticWaitTimeout(input, "waitFor");
340
340
  if (type === "ready") {
341
+ const stableMs = optionalNumber(condition, "stableMs", "waitFor.condition");
342
+ if (stableMs !== void 0 && stableMs < 0) {
343
+ validationFailure("waitFor.condition.stableMs", "must be at least 0");
344
+ }
341
345
  return {
342
- condition: { type },
346
+ condition: { type, ...stableMs === void 0 ? {} : { stableMs } },
343
347
  ...timeoutMs === void 0 ? {} : { timeoutMs }
344
348
  };
345
349
  }
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var REFUSED_PERFORM_STEP_TYPES = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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.663 | (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;
@@ -1931,7 +1931,13 @@ async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
1931
1931
  {
1932
1932
  type: "waitFor",
1933
1933
  ...options.simId ? { simId: options.simId } : {},
1934
- waitForOptions: { condition: { type: "ready" }, timeoutMs }
1934
+ waitForOptions: {
1935
+ condition: {
1936
+ type: "ready",
1937
+ ...options.stableMs === void 0 ? {} : { stableMs: options.stableMs }
1938
+ },
1939
+ timeoutMs
1940
+ }
1935
1941
  },
1936
1942
  { timeoutMs: timeoutMs + 1e3 }
1937
1943
  );
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.663 | (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.663 | (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;
@@ -375,6 +375,16 @@ function viewModelInitializer({ name, signature }) {
375
375
  )}) }`;
376
376
  }
377
377
  }
378
+ function windowTheme(window) {
379
+ const argb = (color) => `0x${color.toString(16).padStart(8, "0")}.toInt()`;
380
+ return [
381
+ " android.view.WindowTheme(",
382
+ ` ${window.edgeToEdgeEnforced}, ${argb(window.statusBarColor)}, ${argb(window.navigationBarColor)},`,
383
+ ` ${window.statusBarContrastEnforced}, ${window.navigationBarContrastEnforced},`,
384
+ ` ${window.lightStatusBar}, ${window.lightNavigationBar},`,
385
+ " ),"
386
+ ];
387
+ }
378
388
  async function kotlinAppArtifact(app, moduleRoot, origin) {
379
389
  const toolchain = readToolchain(moduleRoot);
380
390
  const kotlinString = (value) => JSON.stringify(value).replaceAll("$", "\\$");
@@ -390,12 +400,8 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
390
400
  " dev.peach.app.PeachAppSpec(",
391
401
  ` android.content.ComponentName(${kotlinString(app.packageName)}, ${kotlinString(app.launcher.name)}),`,
392
402
  ` android.content.ComponentName(${kotlinString(app.packageName)}, ${kotlinString(app.launcher.targetClass)}),`,
393
- " android.view.WindowTheme(",
394
- ` ${app.window.edgeToEdgeEnforced}, 0x${app.window.statusBarColor.toString(16).padStart(8, "0")}.toInt(),`,
395
- ` 0x${app.window.navigationBarColor.toString(16).padStart(8, "0")}.toInt(),`,
396
- ` ${app.window.statusBarContrastEnforced}, ${app.window.navigationBarContrastEnforced},`,
397
- ` ${app.window.lightStatusBar}, ${app.window.lightNavigationBar},`,
398
- " ),",
403
+ ...windowTheme(app.window.day),
404
+ ...windowTheme(app.window.night),
399
405
  ` { ${app.applicationClass ?? "android.app.Application"}() },`,
400
406
  ` { ${app.launcher.targetClass}() },`,
401
407
  ` ${app.handlesUiMode},`,
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "Peach";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/is-record.ts
4
4
  function isRecord(value) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.663 | (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.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/native-app-identity.ts
4
4
  var NATIVE_APP_IDENTITY_PREFIX = "globalThis.__sootsimNativeAppIdentity=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.662 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/plist.ts
4
4
  import plistModule from "@expo/plist";