peachsim 0.1.527 → 0.1.570

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 (158) hide show
  1. package/README.md +26 -26
  2. package/cli/app-fonts.ts +1 -1
  3. package/cli/app-splash.ts +1 -1
  4. package/cli/bin.ts +1 -1
  5. package/cli/bridge-diagnostics.ts +1 -1
  6. package/cli/bridge-flow-runner.ts +57 -5
  7. package/cli/cloud-client.ts +273 -6
  8. package/cli/cloud-dispatch.ts +22 -2
  9. package/cli/cloud-session.ts +60 -4
  10. package/cli/cloud-test-tunnel.ts +354 -0
  11. package/cli/commands/box/bundle-plane.ts +2 -2
  12. package/cli/commands/box/checkout-plane.ts +1 -1
  13. package/cli/commands/box/rnx-command.ts +2 -2
  14. package/cli/commands/box/search-command.ts +2 -2
  15. package/cli/commands/box.ts +8 -8
  16. package/cli/commands/compat.ts +1 -1
  17. package/cli/commands/control.ts +22 -3
  18. package/cli/commands/detox.ts +1 -1
  19. package/cli/commands/device.ts +1 -1
  20. package/cli/commands/diagnose.ts +1 -1
  21. package/cli/commands/film.ts +1 -1
  22. package/cli/commands/flow.ts +60 -3
  23. package/cli/commands/inspect/actions.ts +1 -1
  24. package/cli/commands/inspect/core.ts +6 -7
  25. package/cli/commands/inspect/find.ts +2 -1
  26. package/cli/commands/inspect/resolve-target.ts +5 -3
  27. package/cli/commands/inspect/shared.ts +1 -1
  28. package/cli/commands/inspect/wait-event.ts +1 -1
  29. package/cli/commands/inspect/wait-selector.ts +15 -4
  30. package/cli/commands/inspect.ts +19 -14
  31. package/cli/commands/maestro.ts +464 -43
  32. package/cli/commands/permissions.ts +1 -1
  33. package/cli/commands/platform.ts +205 -8
  34. package/cli/commands/preview.ts +2 -2
  35. package/cli/commands/record.ts +2 -2
  36. package/cli/commands/report-issue.ts +2 -2
  37. package/cli/commands/screenshot-layers.ts +1 -1
  38. package/cli/commands/screenshot.ts +1 -1
  39. package/cli/commands/setup.ts +2 -2
  40. package/cli/commands/test.ts +440 -115
  41. package/cli/commands/three-mode.ts +1 -1
  42. package/cli/commands/upload.ts +5 -5
  43. package/cli/commands/what-happened.ts +1 -1
  44. package/cli/desktop-companion.ts +3 -3
  45. package/cli/drivers/playwright-sim-host.ts +2 -2
  46. package/cli/flow-file.ts +7 -0
  47. package/cli/flow-live-status.ts +65 -8
  48. package/cli/help-core.ts +3 -3
  49. package/cli/hidden-runtime-alias.ts +1 -1
  50. package/cli/maestro-report.ts +178 -0
  51. package/cli/main.ts +1 -1
  52. package/cli/outbound-endpoints.ts +185 -136
  53. package/cli/parse-args.ts +1 -1
  54. package/cli/registry.ts +1 -1
  55. package/cli/resolve-assets.ts +1 -1
  56. package/cli/run-registry.ts +8 -0
  57. package/cli/send-to-box.ts +4 -4
  58. package/cli/ws-bridge.ts +3 -5
  59. package/detox/expectations.ts +1 -1
  60. package/detox/gestures.ts +2 -2
  61. package/detox/index.ts +71 -29
  62. package/detox/jest-preset.cjs +3 -3
  63. package/detox/jest-setup-after-env.cjs +1 -1
  64. package/dist-lib/agent-daemon-client.cjs +2 -2
  65. package/dist-lib/agent-events.cjs +1 -1
  66. package/dist-lib/agent-identity.cjs +1 -1
  67. package/dist-lib/agent-sessions.cjs +2 -2
  68. package/dist-lib/attached-projects.cjs +2 -2
  69. package/dist-lib/auth/shared-session.cjs +1 -1
  70. package/dist-lib/backend-origin.cjs +1 -1
  71. package/dist-lib/beta.cjs +1 -1
  72. package/dist-lib/beta.mjs +1 -1
  73. package/dist-lib/bridge-constants.cjs +1 -1
  74. package/dist-lib/bridge-contract-input.cjs +1 -1
  75. package/dist-lib/bridge-contract-input.mjs +1 -1
  76. package/dist-lib/bridge-contract.cjs +1 -1
  77. package/dist-lib/bridge-contract.mjs +1 -1
  78. package/dist-lib/capture-contract.cjs +94 -3
  79. package/dist-lib/capture-contract.mjs +93 -3
  80. package/dist-lib/cli-constants.cjs +1 -1
  81. package/dist-lib/cloud-contract.cjs +1 -1
  82. package/dist-lib/cloud-contract.mjs +1 -1
  83. package/dist-lib/cloud.cjs +2 -2
  84. package/dist-lib/cloud.mjs +2 -2
  85. package/dist-lib/config.cjs +1 -1
  86. package/dist-lib/detox/index.cjs +106 -25
  87. package/dist-lib/detox/jest-preset.cjs +3 -3
  88. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  89. package/dist-lib/home-paths.cjs +1 -1
  90. package/dist-lib/host/bridge-host.cjs +137 -61
  91. package/dist-lib/host/fetch-proxy-handler.cjs +28 -2
  92. package/dist-lib/host/fetch-proxy-overrides.cjs +33 -3
  93. package/dist-lib/host/fetch-proxy-overrides.mjs +30 -2
  94. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  95. package/dist-lib/host/websocket-proxy.cjs +1 -1
  96. package/dist-lib/index.cjs +209 -16
  97. package/dist-lib/jump-to-source-babel.cjs +1 -1
  98. package/dist-lib/jump-to-source-native.cjs +1 -1
  99. package/dist-lib/menu.cjs +2 -2
  100. package/dist-lib/menu.mjs +2 -2
  101. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  102. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  103. package/dist-lib/metro-production-bundle.cjs +3 -3
  104. package/dist-lib/metro-production-bundle.mjs +3 -3
  105. package/dist-lib/metro.cjs +8 -8
  106. package/dist-lib/profiles.cjs +1 -1
  107. package/dist-lib/public-brand.cjs +2 -2
  108. package/dist-lib/react-native-host-modules.cjs +1 -1
  109. package/dist-lib/react-native-host-modules.mjs +1 -1
  110. package/dist-lib/render-mode.cjs +1 -1
  111. package/dist-lib/scripts/dev-server-scanner.cjs +31 -15
  112. package/dist-lib/sdk.cjs +3 -2
  113. package/dist-lib/sdk.mjs +3 -2
  114. package/dist-lib/skills.cjs +362 -163
  115. package/dist-lib/swift-submit.cjs +1 -1
  116. package/dist-lib/swift-submit.mjs +1 -1
  117. package/dist-lib/swift.cjs +583 -16
  118. package/dist-lib/vite.cjs +29 -14
  119. package/package.json +9 -9
  120. package/scripts/dev-server-scanner.ts +41 -14
  121. package/scripts/optional-demo-registry.ts +3 -3
  122. package/skills/contrast/SKILL.md +9 -9
  123. package/skills/rnx-debug/SKILL.md +14 -4
  124. package/skills/rnx-perf/SKILL.md +5 -5
  125. package/skills/rnx-setup/SKILL.md +11 -11
  126. package/skills/rnx-test/SKILL.md +11 -11
  127. package/skills/rnx-visual/SKILL.md +6 -6
  128. package/src/agent-sessions.ts +3 -3
  129. package/src/attached-projects.ts +1 -1
  130. package/src/bridge-contract-input.ts +1 -1
  131. package/src/bridge-contract.ts +23 -5
  132. package/src/capture-contract.ts +145 -3
  133. package/src/config.ts +2 -2
  134. package/src/connect.ts +2 -2
  135. package/src/home-paths.ts +3 -3
  136. package/src/host/bridge-host.ts +2 -2
  137. package/src/host/fetch-proxy-handler.ts +4 -3
  138. package/src/host/fetch-proxy-overrides.ts +41 -0
  139. package/src/host/plane-host.ts +2 -2
  140. package/src/index.ts +3 -0
  141. package/src/metro-plugin.ts +4 -4
  142. package/src/metro-production-bundle.ts +2 -2
  143. package/src/native-seam-manifest.ts +6 -6
  144. package/src/public-brand.ts +1 -1
  145. package/src/rolldown-plugin-swift.ts +8 -5
  146. package/src/runtime-assets.ts +8 -6
  147. package/src/screenshots/frame-compose.ts +24 -56
  148. package/src/screenshots/org-deck.ts +1 -1
  149. package/src/screenshots/registry.ts +4 -4
  150. package/src/screenshots/schema.ts +1 -1
  151. package/src/sdk.ts +2 -2
  152. package/src/settings-bundle.ts +1 -1
  153. package/src/sim-client.ts +2 -4
  154. package/src/skills/builtin/compat-check.ts +1 -1
  155. package/src/vite-plugin-one.ts +1 -1
  156. package/src/vite-plugin-swift.ts +11 -6
  157. package/src/vite-plugin.ts +30 -17
  158. package/src/worklets-babel.ts +2 -2
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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;
@@ -23,7 +23,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
23
23
  var fetch_proxy_overrides_exports = {};
24
24
  __export(fetch_proxy_overrides_exports, {
25
25
  FETCH_PROXY_BROWSER_USER_AGENT: () => FETCH_PROXY_BROWSER_USER_AGENT,
26
- getFetchProxyTargetHeaders: () => getFetchProxyTargetHeaders
26
+ PUBLIC_RPC_TENANT: () => PUBLIC_RPC_TENANT,
27
+ getFetchProxyTargetHeaders: () => getFetchProxyTargetHeaders,
28
+ resolveFetchProxyTargetUrl: () => resolveFetchProxyTargetUrl
27
29
  });
28
30
  module.exports = __toCommonJS(fetch_proxy_overrides_exports);
29
31
  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";
@@ -48,6 +50,32 @@ function headerOverridesFor(hostname) {
48
50
  }
49
51
  return void 0;
50
52
  }
53
+ var PUBLIC_RPC_TENANT = "rnx-public-rpc";
54
+ var QUICKNODE_HOST_SUFFIX = ".quiknode.pro";
55
+ var PUBLIC_RPC_BY_QUICKNODE_CHAIN = {
56
+ "": "https://ethereum-rpc.publicnode.com",
57
+ "arbitrum-mainnet": "https://arbitrum-one-rpc.publicnode.com",
58
+ "avalanche-mainnet": "https://avalanche-c-chain-rpc.publicnode.com",
59
+ "base-mainnet": "https://base-rpc.publicnode.com",
60
+ "blast-mainnet": "https://blast-rpc.publicnode.com",
61
+ bsc: "https://bsc-rpc.publicnode.com",
62
+ "celo-mainnet": "https://celo-rpc.publicnode.com",
63
+ matic: "https://polygon-bor-rpc.publicnode.com",
64
+ optimism: "https://optimism-rpc.publicnode.com",
65
+ "soneium-mainnet": "https://soneium-rpc.publicnode.com",
66
+ "unichain-mainnet": "https://unichain-rpc.publicnode.com"
67
+ };
68
+ function resolveFetchProxyTargetUrl(requested) {
69
+ const host = requested.hostname.toLowerCase();
70
+ if (!host.endsWith(QUICKNODE_HOST_SUFFIX)) return requested;
71
+ const tenant = host.slice(0, -QUICKNODE_HOST_SUFFIX.length);
72
+ if (tenant !== PUBLIC_RPC_TENANT && !tenant.startsWith(`${PUBLIC_RPC_TENANT}.`)) {
73
+ return requested;
74
+ }
75
+ const chain = tenant === PUBLIC_RPC_TENANT ? "" : tenant.slice(PUBLIC_RPC_TENANT.length + 1);
76
+ const replacement = PUBLIC_RPC_BY_QUICKNODE_CHAIN[chain];
77
+ return replacement ? new URL(replacement) : requested;
78
+ }
51
79
  function getFetchProxyTargetHeaders(targetUrl) {
52
80
  const hostOverrides = headerOverridesFor(targetUrl.hostname);
53
81
  return {
@@ -59,5 +87,7 @@ function getFetchProxyTargetHeaders(targetUrl) {
59
87
  // Annotate the CommonJS export names for ESM import in node:
60
88
  0 && (module.exports = {
61
89
  FETCH_PROXY_BROWSER_USER_AGENT,
62
- getFetchProxyTargetHeaders
90
+ PUBLIC_RPC_TENANT,
91
+ getFetchProxyTargetHeaders,
92
+ resolveFetchProxyTargetUrl
63
93
  });
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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";
@@ -23,6 +23,32 @@ function headerOverridesFor(hostname) {
23
23
  }
24
24
  return void 0;
25
25
  }
26
+ var PUBLIC_RPC_TENANT = "rnx-public-rpc";
27
+ var QUICKNODE_HOST_SUFFIX = ".quiknode.pro";
28
+ var PUBLIC_RPC_BY_QUICKNODE_CHAIN = {
29
+ "": "https://ethereum-rpc.publicnode.com",
30
+ "arbitrum-mainnet": "https://arbitrum-one-rpc.publicnode.com",
31
+ "avalanche-mainnet": "https://avalanche-c-chain-rpc.publicnode.com",
32
+ "base-mainnet": "https://base-rpc.publicnode.com",
33
+ "blast-mainnet": "https://blast-rpc.publicnode.com",
34
+ bsc: "https://bsc-rpc.publicnode.com",
35
+ "celo-mainnet": "https://celo-rpc.publicnode.com",
36
+ matic: "https://polygon-bor-rpc.publicnode.com",
37
+ optimism: "https://optimism-rpc.publicnode.com",
38
+ "soneium-mainnet": "https://soneium-rpc.publicnode.com",
39
+ "unichain-mainnet": "https://unichain-rpc.publicnode.com"
40
+ };
41
+ function resolveFetchProxyTargetUrl(requested) {
42
+ const host = requested.hostname.toLowerCase();
43
+ if (!host.endsWith(QUICKNODE_HOST_SUFFIX)) return requested;
44
+ const tenant = host.slice(0, -QUICKNODE_HOST_SUFFIX.length);
45
+ if (tenant !== PUBLIC_RPC_TENANT && !tenant.startsWith(`${PUBLIC_RPC_TENANT}.`)) {
46
+ return requested;
47
+ }
48
+ const chain = tenant === PUBLIC_RPC_TENANT ? "" : tenant.slice(PUBLIC_RPC_TENANT.length + 1);
49
+ const replacement = PUBLIC_RPC_BY_QUICKNODE_CHAIN[chain];
50
+ return replacement ? new URL(replacement) : requested;
51
+ }
26
52
  function getFetchProxyTargetHeaders(targetUrl) {
27
53
  const hostOverrides = headerOverridesFor(targetUrl.hostname);
28
54
  return {
@@ -33,5 +59,7 @@ function getFetchProxyTargetHeaders(targetUrl) {
33
59
  }
34
60
  export {
35
61
  FETCH_PROXY_BROWSER_USER_AGENT,
36
- getFetchProxyTargetHeaders
62
+ PUBLIC_RPC_TENANT,
63
+ getFetchProxyTargetHeaders,
64
+ resolveFetchProxyTargetUrl
37
65
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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;
@@ -49,6 +49,7 @@ __export(src_exports, {
49
49
  isRnxScreenCapture: () => isRnxScreenCapture,
50
50
  jumpToSourceBabelPlugin: () => sootsimJumpToSourceBabelPlugin,
51
51
  metroPlugin: () => metro_plugin_default,
52
+ packRnxCaptureRegions: () => packRnxCaptureRegions,
52
53
  rnxCaptureRasterRegions: () => rnxCaptureRasterRegions,
53
54
  rnxPlugin: () => rnxPlugin,
54
55
  rnxRasterFrames: () => rnxRasterFrames,
@@ -59,12 +60,12 @@ module.exports = __toCommonJS(src_exports);
59
60
  // cli/cloud-client.ts
60
61
  var import_node_crypto = require("node:crypto");
61
62
 
62
- // ../sootsim-engine/src/metro-fingerprint-registry-client.ts
63
- var import_metro_fingerprint_registry = require("rnxsim/metro-fingerprint-registry");
63
+ // ../peach-engine/src/metro-fingerprint-registry-client.ts
64
+ var import_metro_fingerprint_registry = require("peachsim/metro-fingerprint-registry");
64
65
 
65
- // ../sootsim-engine/src/metro-fingerprint.ts
66
- var import_metro_production_bundle = require("rnxsim/metro-production-bundle");
67
- var import_react_native_host_modules = require("rnxsim/react-native-host-modules");
66
+ // ../peach-engine/src/metro-fingerprint.ts
67
+ var import_metro_production_bundle = require("peachsim/metro-production-bundle");
68
+ var import_react_native_host_modules = require("peachsim/react-native-host-modules");
68
69
 
69
70
  // src/backend-origin.ts
70
71
  function normalizeHostname(hostname) {
@@ -162,7 +163,7 @@ ${RNXSIM_METRO_SOURCE_MAP_COMMENT}${detached.sourceMappingUrl}`;
162
163
  var name = "rnx";
163
164
  var rnxPublicBrand = Object.freeze({
164
165
  name,
165
- packageName: "rnxsim",
166
+ packageName: "peachsim",
166
167
  commandName: "rnx",
167
168
  domain: "rnxsim.com",
168
169
  origin: "https://rnxsim.com"
@@ -343,6 +344,22 @@ function createCloudSession(input) {
343
344
  }
344
345
  return session;
345
346
  }
347
+ function createCloudBoxSession(input) {
348
+ const session = {
349
+ version: CLOUD_SESSION_VERSION,
350
+ service: "box",
351
+ boxId: input.boxId.trim(),
352
+ boxToken: input.boxToken,
353
+ apiOrigin: normalizeCloudOrigin(input.apiOrigin.trim()),
354
+ ...input.platform ? { platform: input.platform } : {},
355
+ ...input.device?.trim() ? { device: input.device.trim() } : {},
356
+ ...input.artifact ? { artifact: input.artifact } : {}
357
+ };
358
+ if (!session.boxId || !session.boxToken) {
359
+ throw new Error("cloud box session requires a box, an origin, and a box token");
360
+ }
361
+ return session;
362
+ }
346
363
  function parseCloudSession(encoded) {
347
364
  const value = encoded.trim();
348
365
  if (!value || value.length > MAX_ENCODED_SESSION_BYTES || !/^[A-Za-z0-9_-]+$/.test(value)) {
@@ -375,6 +392,17 @@ function parseCloudSession(encoded) {
375
392
  const boxId = typeof parsed.boxId === "string" ? parsed.boxId : void 0;
376
393
  const boxToken = typeof parsed.boxToken === "string" ? parsed.boxToken : void 0;
377
394
  try {
395
+ if (parsed.service === "box") {
396
+ if (!boxId || !boxToken) throw new Error("unreadable cloud box session");
397
+ return createCloudBoxSession({
398
+ boxId,
399
+ boxToken,
400
+ apiOrigin,
401
+ platform,
402
+ device,
403
+ artifact
404
+ });
405
+ }
378
406
  const simId = parsed.simId;
379
407
  const claimId = parsed.claimId;
380
408
  const token = parsed.token;
@@ -437,6 +465,14 @@ function responseError(status, text) {
437
465
  function resolveCloudSessionForParsed(parsed) {
438
466
  const session = readCloudSession();
439
467
  if (!session) return null;
468
+ if (session.service === "box") {
469
+ if (parsed.simIdSource === "flag" && parsed.simId !== session.boxId) {
470
+ throw new Error(
471
+ `this shell is connected to box ${session.boxId}; ${parsed.simId ? `--sim ${parsed.simId}` : "the requested simulator"} is not available in this shell`
472
+ );
473
+ }
474
+ return session;
475
+ }
440
476
  if (parsed.simIdSource === "flag" && parsed.simId !== session.simId) {
441
477
  throw new Error(
442
478
  `this shell is connected to remote simulator ${session.simId}; ${parsed.simId ? `--sim ${parsed.simId}` : "the requested simulator"} is not available in this shell`
@@ -532,10 +568,77 @@ var CloudBridge = class {
532
568
  close() {
533
569
  }
534
570
  };
571
+ var CloudBoxBridge = class {
572
+ constructor(session) {
573
+ this.session = session;
574
+ }
575
+ plane = "cloud";
576
+ async send(command, options) {
577
+ const id = (0, import_node_crypto.randomUUID)();
578
+ const payload = {};
579
+ for (const [key, value] of Object.entries(command)) {
580
+ if (key !== "id" && key !== "simId") payload[key] = value;
581
+ }
582
+ let response;
583
+ try {
584
+ response = await fetch(
585
+ `${this.session.apiOrigin}/v1/boxes/${encodeURIComponent(this.session.boxId)}/commands`,
586
+ {
587
+ method: "POST",
588
+ headers: {
589
+ authorization: `Bearer ${this.session.boxToken}`,
590
+ "content-type": "application/json"
591
+ },
592
+ body: JSON.stringify({ id, command: payload }),
593
+ ...options?.timeoutMs ? { signal: AbortSignal.timeout(options.timeoutMs) } : {}
594
+ }
595
+ );
596
+ } catch (error) {
597
+ throw new Error(
598
+ `could not reach box ${this.session.boxId} at ${this.session.apiOrigin}: ${error instanceof Error ? error.message : String(error)}`
599
+ );
600
+ }
601
+ const text = await response.text();
602
+ if (!response.ok) throw responseError(response.status, text);
603
+ let parsed;
604
+ try {
605
+ parsed = JSON.parse(text);
606
+ } catch {
607
+ throw new Error("box command returned unreadable JSON");
608
+ }
609
+ if (!isRecord2(parsed) || parsed.id !== id) {
610
+ throw new Error("box command returned an invalid command receipt");
611
+ }
612
+ if (typeof parsed.error === "string" && parsed.error) throw new Error(parsed.error);
613
+ if (!Object.hasOwn(parsed, "result")) {
614
+ throw new Error("box command receipt has no result");
615
+ }
616
+ return parsed.result;
617
+ }
618
+ listSims() {
619
+ return Promise.reject(new Error("a box does not expose a local simulator list"));
620
+ }
621
+ focusSim() {
622
+ return Promise.reject(new Error("a box simulator has no browser window to focus"));
623
+ }
624
+ resolveReloadedSim() {
625
+ return Promise.resolve(null);
626
+ }
627
+ closeSim() {
628
+ return Promise.reject(new Error("close a box simulator with rnx box stop"));
629
+ }
630
+ claim() {
631
+ return Promise.reject(
632
+ new Error("a box simulator is held by its Box page and has nothing to claim")
633
+ );
634
+ }
635
+ close() {
636
+ }
637
+ };
535
638
  function createCloudBridgeForParsed(parsed) {
536
639
  const session = resolveCloudSessionForParsed(parsed);
537
640
  if (!session) return null;
538
- return new CloudBridge(session);
641
+ return session.service === "box" ? new CloudBoxBridge(session) : new CloudBridge(session);
539
642
  }
540
643
 
541
644
  // cli/current-sim.ts
@@ -2967,7 +3070,7 @@ async function connect(options = {}) {
2967
3070
  const bridge2 = createCloudBridgeForParsed(target);
2968
3071
  if (!bridge2)
2969
3072
  throw new SimConnectError("remote simulator session disappeared while connecting");
2970
- return new SimClient(bridge2, cloud.simId, {
3073
+ return new SimClient(bridge2, cloud.service === "sim" ? cloud.simId : cloud.boxId, {
2971
3074
  commandTimeoutMs: options.timeoutMs ?? 15e3
2972
3075
  });
2973
3076
  }
@@ -3003,7 +3106,7 @@ function selectRnxRasterNodeIds(tree) {
3003
3106
  if (!visibleFrame || visibleFrame.width <= 0 || visibleFrame.height <= 0) continue;
3004
3107
  if (node.type === "masked-view" || node.type === "text" && typeof node.text === "string" && (new RegExp("\\p{Emoji_Presentation}", "u").test(node.text) || new RegExp("\\uFE0F|\\u200D|\\u20E3|\\p{Emoji_Modifier}|\\p{Regional_Indicator}", "u").test(
3005
3108
  node.text
3006
- )) || node.style._liquidGlass !== void 0 || node.style._liquidGlassEdge !== void 0) {
3109
+ )) || node.style._liquidGlass !== void 0 || node.style._liquidGlassEdge !== void 0 || node.style._liquidGlassMaterialTint !== void 0) {
3007
3110
  unsupported.add(node.nodeId);
3008
3111
  }
3009
3112
  }
@@ -3102,6 +3205,95 @@ function rnxCaptureRasterRegions(capture) {
3102
3205
  return frame ? [{ key: String(nodeId), nodeId, frame }] : [];
3103
3206
  });
3104
3207
  }
3208
+ function packRnxCaptureRegions(regions, pixelRatio, surface) {
3209
+ const physical = regions.map((region) => {
3210
+ const left = Math.floor(region.frame.x * pixelRatio);
3211
+ const top = Math.floor(region.frame.y * pixelRatio);
3212
+ const right = Math.ceil((region.frame.x + region.frame.width) * pixelRatio);
3213
+ const bottom = Math.ceil((region.frame.y + region.frame.height) * pixelRatio);
3214
+ if (left < 0 || top < 0 || right > surface.pixelWidth || bottom > surface.pixelHeight || right <= left || bottom <= top) {
3215
+ throw new Error(`capture region ${region.key} is outside the app surface`);
3216
+ }
3217
+ return {
3218
+ key: region.key,
3219
+ nodeId: region.nodeId,
3220
+ frame: {
3221
+ x: left / pixelRatio,
3222
+ y: top / pixelRatio,
3223
+ width: (right - left) / pixelRatio,
3224
+ height: (bottom - top) / pixelRatio
3225
+ },
3226
+ sourceX: left,
3227
+ sourceY: top,
3228
+ pixelWidth: right - left,
3229
+ pixelHeight: bottom - top
3230
+ };
3231
+ });
3232
+ const largestWidth = Math.max(...physical.map((region) => region.pixelWidth));
3233
+ const totalArea = physical.reduce(
3234
+ (area, region) => area + region.pixelWidth * region.pixelHeight,
3235
+ 0
3236
+ );
3237
+ if (totalArea > 4194304) {
3238
+ throw new Error("capture region pixels exceed the atlas budget");
3239
+ }
3240
+ const candidates = [
3241
+ largestWidth,
3242
+ Math.max(largestWidth, Math.ceil(Math.sqrt(totalArea))),
3243
+ Math.max(largestWidth, surface.pixelWidth),
3244
+ 4096
3245
+ ];
3246
+ const ordered = [...physical].sort(
3247
+ (left, right) => right.pixelHeight - left.pixelHeight || right.pixelWidth - left.pixelWidth || left.key.localeCompare(right.key)
3248
+ );
3249
+ let best = null;
3250
+ for (const candidate of [...new Set(candidates)]) {
3251
+ if (candidate > 4096) continue;
3252
+ let x = 0;
3253
+ let y = 0;
3254
+ let rowHeight = 0;
3255
+ let usedWidth = 0;
3256
+ const packed = [];
3257
+ for (const region of ordered) {
3258
+ if (x > 0 && x + region.pixelWidth > candidate) {
3259
+ y += rowHeight;
3260
+ x = 0;
3261
+ rowHeight = 0;
3262
+ }
3263
+ packed.push({ ...region, atlasX: x, atlasY: y });
3264
+ x += region.pixelWidth;
3265
+ rowHeight = Math.max(rowHeight, region.pixelHeight);
3266
+ usedWidth = Math.max(usedWidth, x);
3267
+ }
3268
+ const height2 = y + rowHeight;
3269
+ if (height2 > 4096 || usedWidth * height2 > 4194304) continue;
3270
+ const result = { width: usedWidth, height: height2, regions: packed };
3271
+ if (!best || result.width * result.height < best.width * best.height) best = result;
3272
+ }
3273
+ if (!best) throw new Error("capture regions cannot fit in one bounded atlas");
3274
+ const width = best.width / pixelRatio;
3275
+ const height = best.height / pixelRatio;
3276
+ return {
3277
+ width,
3278
+ height,
3279
+ pixelWidth: best.width,
3280
+ pixelHeight: best.height,
3281
+ regions: best.regions,
3282
+ atlasRegions: best.regions.map((region) => ({
3283
+ key: region.key,
3284
+ nodeId: region.nodeId,
3285
+ frame: region.frame,
3286
+ // a region flush with the far edge is anchored to the logical edge so
3287
+ // its source never runs past the atlas by a rounding hair
3288
+ source: {
3289
+ x: region.atlasX + region.pixelWidth === best.width ? width - region.frame.width : region.atlasX / pixelRatio,
3290
+ y: region.atlasY + region.pixelHeight === best.height ? height - region.frame.height : region.atlasY / pixelRatio,
3291
+ width: region.frame.width,
3292
+ height: region.frame.height
3293
+ }
3294
+ }))
3295
+ };
3296
+ }
3105
3297
  function captureRecord(value) {
3106
3298
  return value !== null && typeof value === "object" && !Array.isArray(value);
3107
3299
  }
@@ -3157,7 +3349,7 @@ function isRnxScreenCapture(value) {
3157
3349
  return captureRecord(tree.viewport) && captureInteger(tree.viewport.width) && tree.viewport.width > 0 && captureInteger(tree.viewport.height) && tree.viewport.height > 0 && captureInteger(tree.rootNodeId) && (tree.commitRevision === void 0 || captureInteger(tree.commitRevision)) && Array.isArray(tree.nodes) && tree.nodes.every(captureNode) && (visual === void 0 || visual.kind === "png" && (visual.producer === "headless-cpu-app-surface" || visual.producer === "browser-compositor-app-surface") && typeof visual.dataUri === "string" && visual.dataUri.startsWith("data:image/png;base64,") && captureInteger(visual.pixelWidth) && visual.pixelWidth > 0 && captureInteger(visual.pixelHeight) && visual.pixelHeight > 0);
3158
3350
  }
3159
3351
  function isRnxCaptureRegionAtlas(value) {
3160
- if (!captureRecord(value) || value.kind !== "png-atlas" || value.producer !== "headless-cpu-app-surface" || typeof value.dataUri !== "string" || !value.dataUri.startsWith("data:image/png;base64,") || !captureNumber(value.width) || value.width <= 0 || !captureNumber(value.height) || value.height <= 0 || !captureInteger(value.pixelWidth) || value.pixelWidth <= 0 || !captureInteger(value.pixelHeight) || value.pixelHeight <= 0 || !Array.isArray(value.regions) || value.regions.length === 0 || value.regions.length > 256) {
3352
+ if (!captureRecord(value) || value.kind !== "png-atlas" || value.producer !== "headless-cpu-app-surface" && value.producer !== "browser-compositor-app-surface" || typeof value.dataUri !== "string" || !value.dataUri.startsWith("data:image/png;base64,") || !captureNumber(value.width) || value.width <= 0 || !captureNumber(value.height) || value.height <= 0 || !captureInteger(value.pixelWidth) || value.pixelWidth <= 0 || !captureInteger(value.pixelHeight) || value.pixelHeight <= 0 || !Array.isArray(value.regions) || value.regions.length === 0 || value.regions.length > 256) {
3161
3353
  return false;
3162
3354
  }
3163
3355
  const scale = value.pixelWidth / value.width;
@@ -3690,7 +3882,7 @@ function findMonorepoRoot() {
3690
3882
  if (_monorepoRootCache !== void 0) return _monorepoRootCache;
3691
3883
  let dir = import_path2.default.dirname((0, import_url.fileURLToPath)(__sootsim_import_meta_url));
3692
3884
  for (let i = 0; i < 12 && dir !== import_path2.default.dirname(dir); i++) {
3693
- if (import_fs3.default.existsSync(import_path2.default.join(dir, "packages/sootsim-engine/package.json")) && import_fs3.default.existsSync(import_path2.default.join(dir, "public/sootsim"))) {
3885
+ if (import_fs3.default.existsSync(import_path2.default.join(dir, "packages/peach-engine/package.json")) && import_fs3.default.existsSync(import_path2.default.join(dir, "public/sootsim"))) {
3694
3886
  _monorepoRootCache = dir;
3695
3887
  return dir;
3696
3888
  }
@@ -3704,7 +3896,7 @@ function resolveDevCheckoutRuntimeRoot() {
3704
3896
  const root = findMonorepoRoot();
3705
3897
  if (!root) return null;
3706
3898
  const devBuild = import_path2.default.join(root, "public/sootsim");
3707
- if (import_fs3.default.existsSync(import_path2.default.join(devBuild, "index.html")) && import_fs3.default.existsSync(import_path2.default.join(devBuild, "engine/index.html")) && import_fs3.default.existsSync(import_path2.default.join(devBuild, "engine-tenant/worker.js"))) {
3899
+ if (import_fs3.default.existsSync(import_path2.default.join(devBuild, "index.html")) && import_fs3.default.existsSync(import_path2.default.join(devBuild, "engine/index.html")) && import_fs3.default.existsSync(import_path2.default.join(devBuild, "engine-tenant/worker.js")) && import_fs3.default.existsSync(import_path2.default.join(devBuild, "engine-tenant/worker.prod.js"))) {
3708
3900
  return devBuild;
3709
3901
  }
3710
3902
  return null;
@@ -3997,7 +4189,7 @@ var prefix = "/__soot";
3997
4189
  function readCallableMetroExport(moduleValue, label) {
3998
4190
  const callable = typeof moduleValue === "function" ? moduleValue : typeof moduleValue === "object" && moduleValue !== null ? Reflect.get(moduleValue, "default") : void 0;
3999
4191
  if (typeof callable !== "function") {
4000
- throw new Error(`rnxsim: Metro ${label} module did not export a function`);
4192
+ throw new Error(`peachsim: Metro ${label} module did not export a function`);
4001
4193
  }
4002
4194
  return (...args) => Reflect.apply(callable, void 0, args);
4003
4195
  }
@@ -4018,7 +4210,7 @@ function createMetroDefaultSerializer(projectRoot) {
4018
4210
  );
4019
4211
  const code = typeof serialized === "object" && serialized !== null ? Reflect.get(serialized, "code") : void 0;
4020
4212
  if (typeof code !== "string") {
4021
- throw new Error("rnxsim: Metro bundleToString did not return bundle code");
4213
+ throw new Error("peachsim: Metro bundleToString did not return bundle code");
4022
4214
  }
4023
4215
  return code;
4024
4216
  };
@@ -4034,7 +4226,7 @@ function appendRNXModulePaths(result, graph, options, projectRoot) {
4034
4226
  modulePaths[String(createModuleId(module2.path))] = import_path4.default.relative(projectRoot, module2.path).replaceAll(import_path4.default.sep, "/");
4035
4227
  }
4036
4228
  if (Object.keys(modulePaths).length !== dependencies.size) {
4037
- throw new Error("rnxsim: bundle module IDs were not unique");
4229
+ throw new Error("peachsim: bundle module IDs were not unique");
4038
4230
  }
4039
4231
  const specifiersByModuleId = /* @__PURE__ */ new Map();
4040
4232
  for (const module2 of dependencies.values()) {
@@ -4261,6 +4453,7 @@ function sootsimJumpToSourceBabelPlugin(api, options = {}) {
4261
4453
  isRnxScreenCapture,
4262
4454
  jumpToSourceBabelPlugin,
4263
4455
  metroPlugin,
4456
+ packRnxCaptureRegions,
4264
4457
  rnxCaptureRasterRegions,
4265
4458
  rnxPlugin,
4266
4459
  rnxRasterFrames,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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;
@@ -45,7 +45,7 @@ module.exports = __toCommonJS(menu_exports);
45
45
  var name = "rnx";
46
46
  var rnxPublicBrand = Object.freeze({
47
47
  name,
48
- packageName: "rnxsim",
48
+ packageName: "peachsim",
49
49
  commandName: "rnx",
50
50
  domain: "rnxsim.com",
51
51
  origin: "https://rnxsim.com"
package/dist-lib/menu.mjs CHANGED
@@ -1,10 +1,10 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "rnx";
5
5
  var rnxPublicBrand = Object.freeze({
6
6
  name,
7
- packageName: "rnxsim",
7
+ packageName: "peachsim",
8
8
  commandName: "rnx",
9
9
  domain: "rnxsim.com",
10
10
  origin: "https://rnxsim.com"
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-fingerprint-registry.ts
4
4
  var RNX_METRO_FINGERPRINT_SCHEMA_VERSION = 2;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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;
@@ -38,7 +38,7 @@ var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
38
38
  var RNX_METRO_MODULE_IDENTITY_VERSION = 2;
39
39
  function toRNXProductionBundleUrl(bundleUrl) {
40
40
  const relative = bundleUrl.startsWith("/");
41
- const url = new URL(bundleUrl, "http://rnxsim.local");
41
+ const url = new URL(bundleUrl, "http://peachsim.local");
42
42
  url.searchParams.set("dev", "false");
43
43
  url.searchParams.set("hot", "false");
44
44
  url.searchParams.set("minify", "true");
@@ -46,7 +46,7 @@ function toRNXProductionBundleUrl(bundleUrl) {
46
46
  }
47
47
  function toRNXDevelopmentBundleUrl(bundleUrl) {
48
48
  const relative = bundleUrl.startsWith("/");
49
- const url = new URL(bundleUrl, "http://rnxsim.local");
49
+ const url = new URL(bundleUrl, "http://peachsim.local");
50
50
  url.searchParams.set("dev", "true");
51
51
  url.searchParams.set("hot", "false");
52
52
  url.searchParams.set("minify", "false");
@@ -1,11 +1,11 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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=";
5
5
  var RNX_METRO_MODULE_IDENTITY_VERSION = 2;
6
6
  function toRNXProductionBundleUrl(bundleUrl) {
7
7
  const relative = bundleUrl.startsWith("/");
8
- const url = new URL(bundleUrl, "http://rnxsim.local");
8
+ const url = new URL(bundleUrl, "http://peachsim.local");
9
9
  url.searchParams.set("dev", "false");
10
10
  url.searchParams.set("hot", "false");
11
11
  url.searchParams.set("minify", "true");
@@ -13,7 +13,7 @@ function toRNXProductionBundleUrl(bundleUrl) {
13
13
  }
14
14
  function toRNXDevelopmentBundleUrl(bundleUrl) {
15
15
  const relative = bundleUrl.startsWith("/");
16
- const url = new URL(bundleUrl, "http://rnxsim.local");
16
+ const url = new URL(bundleUrl, "http://peachsim.local");
17
17
  url.searchParams.set("dev", "true");
18
18
  url.searchParams.set("hot", "false");
19
19
  url.searchParams.set("minify", "false");
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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;
@@ -492,7 +492,7 @@ var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
492
492
  var RNX_METRO_MODULE_IDENTITY_VERSION = 2;
493
493
  function toRNXProductionBundleUrl(bundleUrl) {
494
494
  const relative2 = bundleUrl.startsWith("/");
495
- const url = new URL(bundleUrl, "http://rnxsim.local");
495
+ const url = new URL(bundleUrl, "http://peachsim.local");
496
496
  url.searchParams.set("dev", "false");
497
497
  url.searchParams.set("hot", "false");
498
498
  url.searchParams.set("minify", "true");
@@ -500,7 +500,7 @@ function toRNXProductionBundleUrl(bundleUrl) {
500
500
  }
501
501
  function toRNXDevelopmentBundleUrl(bundleUrl) {
502
502
  const relative2 = bundleUrl.startsWith("/");
503
- const url = new URL(bundleUrl, "http://rnxsim.local");
503
+ const url = new URL(bundleUrl, "http://peachsim.local");
504
504
  url.searchParams.set("dev", "true");
505
505
  url.searchParams.set("hot", "false");
506
506
  url.searchParams.set("minify", "false");
@@ -575,7 +575,7 @@ function findMonorepoRoot() {
575
575
  if (_monorepoRootCache !== void 0) return _monorepoRootCache;
576
576
  let dir = import_path.default.dirname((0, import_url.fileURLToPath)(__sootsim_import_meta_url));
577
577
  for (let i = 0; i < 12 && dir !== import_path.default.dirname(dir); i++) {
578
- if (import_fs.default.existsSync(import_path.default.join(dir, "packages/sootsim-engine/package.json")) && import_fs.default.existsSync(import_path.default.join(dir, "public/sootsim"))) {
578
+ if (import_fs.default.existsSync(import_path.default.join(dir, "packages/peach-engine/package.json")) && import_fs.default.existsSync(import_path.default.join(dir, "public/sootsim"))) {
579
579
  _monorepoRootCache = dir;
580
580
  return dir;
581
581
  }
@@ -589,7 +589,7 @@ function resolveDevCheckoutRuntimeRoot() {
589
589
  const root = findMonorepoRoot();
590
590
  if (!root) return null;
591
591
  const devBuild = import_path.default.join(root, "public/sootsim");
592
- if (import_fs.default.existsSync(import_path.default.join(devBuild, "index.html")) && import_fs.default.existsSync(import_path.default.join(devBuild, "engine/index.html")) && import_fs.default.existsSync(import_path.default.join(devBuild, "engine-tenant/worker.js"))) {
592
+ if (import_fs.default.existsSync(import_path.default.join(devBuild, "index.html")) && import_fs.default.existsSync(import_path.default.join(devBuild, "engine/index.html")) && import_fs.default.existsSync(import_path.default.join(devBuild, "engine-tenant/worker.js")) && import_fs.default.existsSync(import_path.default.join(devBuild, "engine-tenant/worker.prod.js"))) {
593
593
  return devBuild;
594
594
  }
595
595
  return null;
@@ -714,7 +714,7 @@ var prefix = "/__soot";
714
714
  function readCallableMetroExport(moduleValue, label) {
715
715
  const callable = typeof moduleValue === "function" ? moduleValue : typeof moduleValue === "object" && moduleValue !== null ? Reflect.get(moduleValue, "default") : void 0;
716
716
  if (typeof callable !== "function") {
717
- throw new Error(`rnxsim: Metro ${label} module did not export a function`);
717
+ throw new Error(`peachsim: Metro ${label} module did not export a function`);
718
718
  }
719
719
  return (...args) => Reflect.apply(callable, void 0, args);
720
720
  }
@@ -735,7 +735,7 @@ function createMetroDefaultSerializer(projectRoot) {
735
735
  );
736
736
  const code = typeof serialized === "object" && serialized !== null ? Reflect.get(serialized, "code") : void 0;
737
737
  if (typeof code !== "string") {
738
- throw new Error("rnxsim: Metro bundleToString did not return bundle code");
738
+ throw new Error("peachsim: Metro bundleToString did not return bundle code");
739
739
  }
740
740
  return code;
741
741
  };
@@ -751,7 +751,7 @@ function appendRNXModulePaths(result, graph, options, projectRoot) {
751
751
  modulePaths[String(createModuleId(module2.path))] = import_path2.default.relative(projectRoot, module2.path).replaceAll(import_path2.default.sep, "/");
752
752
  }
753
753
  if (Object.keys(modulePaths).length !== dependencies.size) {
754
- throw new Error("rnxsim: bundle module IDs were not unique");
754
+ throw new Error("peachsim: bundle module IDs were not unique");
755
755
  }
756
756
  const specifiersByModuleId = /* @__PURE__ */ new Map();
757
757
  for (const module2 of dependencies.values()) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.570 | (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;