peachsim 0.1.527 → 0.1.571

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 (169) hide show
  1. package/README.md +28 -28
  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 +72 -12
  7. package/cli/cloud-client.ts +273 -6
  8. package/cli/cloud-dispatch.ts +23 -2
  9. package/cli/cloud-session.ts +60 -4
  10. package/cli/cloud-test-result-files.ts +97 -0
  11. package/cli/cloud-test-tunnel.ts +354 -0
  12. package/cli/commands/box/bundle-plane.ts +2 -2
  13. package/cli/commands/box/checkout-plane.ts +1 -1
  14. package/cli/commands/box/rnx-command.ts +2 -2
  15. package/cli/commands/box/search-command.ts +2 -2
  16. package/cli/commands/box.ts +8 -8
  17. package/cli/commands/compat.ts +1 -1
  18. package/cli/commands/control.ts +22 -3
  19. package/cli/commands/detox.ts +1 -1
  20. package/cli/commands/device.ts +1 -1
  21. package/cli/commands/diagnose.ts +1 -1
  22. package/cli/commands/film.ts +1 -1
  23. package/cli/commands/flow.ts +60 -3
  24. package/cli/commands/inspect/actions.ts +1 -1
  25. package/cli/commands/inspect/core.ts +6 -7
  26. package/cli/commands/inspect/find.ts +2 -1
  27. package/cli/commands/inspect/resolve-target.ts +5 -3
  28. package/cli/commands/inspect/shared.ts +1 -1
  29. package/cli/commands/inspect/wait-event.ts +1 -1
  30. package/cli/commands/inspect/wait-selector.ts +15 -4
  31. package/cli/commands/inspect.ts +19 -14
  32. package/cli/commands/maestro.ts +582 -69
  33. package/cli/commands/permissions.ts +1 -1
  34. package/cli/commands/platform.ts +205 -8
  35. package/cli/commands/preview.ts +2 -2
  36. package/cli/commands/record.ts +2 -2
  37. package/cli/commands/report-issue.ts +2 -2
  38. package/cli/commands/screenshot-layers.ts +1 -1
  39. package/cli/commands/screenshot.ts +1 -1
  40. package/cli/commands/setup.ts +2 -2
  41. package/cli/commands/test.ts +600 -117
  42. package/cli/commands/three-mode.ts +1 -1
  43. package/cli/commands/upload.ts +5 -5
  44. package/cli/commands/what-happened.ts +1 -1
  45. package/cli/desktop-companion.ts +3 -3
  46. package/cli/drivers/playwright-sim-host.ts +2 -2
  47. package/cli/flow-file.ts +7 -0
  48. package/cli/flow-live-status.ts +65 -8
  49. package/cli/help-core.ts +3 -3
  50. package/cli/hidden-runtime-alias.ts +1 -1
  51. package/cli/maestro-report.ts +180 -0
  52. package/cli/main.ts +1 -1
  53. package/cli/outbound-endpoints.ts +187 -136
  54. package/cli/parse-args.ts +1 -1
  55. package/cli/registry.ts +1 -1
  56. package/cli/resolve-assets.ts +1 -1
  57. package/cli/run-registry.ts +10 -1
  58. package/cli/send-to-box.ts +4 -4
  59. package/cli/ws-bridge.ts +3 -5
  60. package/detox/expectations.ts +1 -1
  61. package/detox/gestures.ts +2 -2
  62. package/detox/index.ts +71 -29
  63. package/detox/jest-preset.cjs +5 -5
  64. package/detox/jest-setup-after-env.cjs +1 -1
  65. package/dist-lib/agent-daemon-client.cjs +2 -2
  66. package/dist-lib/agent-events.cjs +1 -1
  67. package/dist-lib/agent-identity.cjs +1 -1
  68. package/dist-lib/agent-sessions.cjs +2 -2
  69. package/dist-lib/attached-projects.cjs +2 -2
  70. package/dist-lib/auth/shared-session.cjs +1 -1
  71. package/dist-lib/backend-origin.cjs +1 -1
  72. package/dist-lib/beta.cjs +1 -1
  73. package/dist-lib/beta.mjs +1 -1
  74. package/dist-lib/bridge-constants.cjs +1 -1
  75. package/dist-lib/bridge-contract-input.cjs +1 -1
  76. package/dist-lib/bridge-contract-input.mjs +1 -1
  77. package/dist-lib/bridge-contract.cjs +1 -1
  78. package/dist-lib/bridge-contract.mjs +1 -1
  79. package/dist-lib/capture-contract.cjs +94 -3
  80. package/dist-lib/capture-contract.mjs +93 -3
  81. package/dist-lib/cli-constants.cjs +1 -1
  82. package/dist-lib/cloud-contract.cjs +1 -1
  83. package/dist-lib/cloud-contract.mjs +1 -1
  84. package/dist-lib/cloud-test-args.cjs +116 -0
  85. package/dist-lib/cloud-test-args.mjs +86 -0
  86. package/dist-lib/cloud.cjs +2 -2
  87. package/dist-lib/cloud.mjs +2 -2
  88. package/dist-lib/config.cjs +1 -1
  89. package/dist-lib/detox/index.cjs +106 -25
  90. package/dist-lib/detox/jest-preset.cjs +5 -5
  91. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  92. package/dist-lib/home-paths.cjs +1 -1
  93. package/dist-lib/host/bridge-host.cjs +150 -65
  94. package/dist-lib/host/fetch-proxy-handler.cjs +28 -2
  95. package/dist-lib/host/fetch-proxy-overrides.cjs +33 -3
  96. package/dist-lib/host/fetch-proxy-overrides.mjs +30 -2
  97. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  98. package/dist-lib/host/websocket-proxy.cjs +1 -1
  99. package/dist-lib/index.cjs +224 -41
  100. package/dist-lib/jump-to-source-babel.cjs +1 -1
  101. package/dist-lib/jump-to-source-native.cjs +1 -1
  102. package/dist-lib/menu.cjs +2 -2
  103. package/dist-lib/menu.mjs +2 -2
  104. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  105. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  106. package/dist-lib/metro-production-bundle.cjs +3 -3
  107. package/dist-lib/metro-production-bundle.mjs +3 -3
  108. package/dist-lib/metro.cjs +8 -8
  109. package/dist-lib/profiles.cjs +1 -1
  110. package/dist-lib/public-brand.cjs +2 -2
  111. package/dist-lib/react-native-host-modules.cjs +1 -1
  112. package/dist-lib/react-native-host-modules.mjs +1 -1
  113. package/dist-lib/render-mode.cjs +1 -1
  114. package/dist-lib/scripts/dev-server-scanner.cjs +31 -15
  115. package/dist-lib/sdk.cjs +3 -2
  116. package/dist-lib/sdk.mjs +3 -2
  117. package/dist-lib/skills.cjs +478 -266
  118. package/dist-lib/swift-compile.cjs +372 -0
  119. package/dist-lib/swift-compile.mjs +339 -0
  120. package/dist-lib/swift-package.cjs +78 -0
  121. package/dist-lib/swift-package.mjs +52 -0
  122. package/dist-lib/swift-submit.cjs +1 -1
  123. package/dist-lib/swift-submit.mjs +1 -1
  124. package/dist-lib/swift.cjs +583 -16
  125. package/dist-lib/vite.cjs +483 -150
  126. package/package.json +30 -9
  127. package/scripts/dev-server-scanner.ts +41 -14
  128. package/scripts/optional-demo-registry.ts +3 -3
  129. package/skills/contrast/SKILL.md +9 -9
  130. package/skills/rnx-debug/SKILL.md +14 -4
  131. package/skills/rnx-perf/SKILL.md +5 -5
  132. package/skills/rnx-setup/SKILL.md +11 -11
  133. package/skills/rnx-test/SKILL.md +14 -14
  134. package/skills/rnx-visual/SKILL.md +6 -6
  135. package/src/agent-sessions.ts +3 -3
  136. package/src/attached-projects.ts +1 -1
  137. package/src/bridge-contract-input.ts +1 -1
  138. package/src/bridge-contract.ts +23 -5
  139. package/src/capture-contract.ts +145 -3
  140. package/src/cloud-test-args.ts +100 -0
  141. package/src/config.ts +2 -2
  142. package/src/connect.ts +2 -2
  143. package/src/home-paths.ts +3 -3
  144. package/src/host/bridge-host.ts +2 -2
  145. package/src/host/fetch-proxy-handler.ts +4 -3
  146. package/src/host/fetch-proxy-overrides.ts +41 -0
  147. package/src/host/plane-host.ts +2 -2
  148. package/src/index.ts +3 -0
  149. package/src/metro-plugin.ts +4 -4
  150. package/src/metro-production-bundle.ts +2 -2
  151. package/src/native-seam-manifest.ts +6 -6
  152. package/src/public-brand.ts +1 -1
  153. package/src/rolldown-plugin-swift.ts +16 -12
  154. package/src/runtime-assets.ts +8 -6
  155. package/src/screenshots/frame-compose.ts +24 -56
  156. package/src/screenshots/org-deck.ts +1 -1
  157. package/src/screenshots/registry.ts +4 -4
  158. package/src/screenshots/schema.ts +1 -1
  159. package/src/sdk.ts +2 -2
  160. package/src/settings-bundle.ts +1 -1
  161. package/src/sim-client.ts +2 -4
  162. package/src/skills/builtin/compat-check.ts +1 -1
  163. package/src/swift-compile.ts +359 -0
  164. package/src/swift-package.ts +69 -0
  165. package/src/swift-submit.ts +3 -2
  166. package/src/vite-plugin-one.ts +1 -1
  167. package/src/vite-plugin-swift.ts +114 -113
  168. package/src/vite-plugin.ts +30 -17
  169. 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.571 | (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.571 | (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.571 | (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.571 | (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.571 | (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;
@@ -3781,10 +3973,10 @@ function resolveRuntimeRootForHostname(hostname) {
3781
3973
  const version = runtimeVersionFromHostname(hostname);
3782
3974
  return version ? resolveInstalledRuntimeRoot(version) : null;
3783
3975
  }
3784
- function resolveRuntimeRootForRequestHost(host) {
3785
- if (!host) return resolveActiveRuntimeRoot();
3976
+ function resolveRuntimeRootForRequestHost(host2) {
3977
+ if (!host2) return resolveActiveRuntimeRoot();
3786
3978
  try {
3787
- return resolveRuntimeRootForHostname(new URL(`http://${host}`).hostname);
3979
+ return resolveRuntimeRootForHostname(new URL(`http://${host2}`).hostname);
3788
3980
  } catch {
3789
3981
  return null;
3790
3982
  }
@@ -3824,25 +4016,15 @@ function serveRuntimeFile(req, res, fullPath) {
3824
4016
  import_fs3.default.createReadStream(fullPath).pipe(res);
3825
4017
  }
3826
4018
 
3827
- // src/vite-plugin-swift.ts
4019
+ // src/swift-compile.ts
3828
4020
  var import_node_child_process2 = require("node:child_process");
3829
- var import_node_os2 = __toESM(require("node:os"), 1);
3830
- var import_node_path6 = __toESM(require("node:path"), 1);
3831
4021
  var import_node_util = require("node:util");
3832
-
3833
- // ../sootsim-swift/toolchain.json
3834
- var toolchain_default = {
3835
- release: "swift-6.3-RELEASE",
3836
- wasmSdkChecksum: "9fa4016ee632c7e9e906608ec3b55cf13dfc4dff44e47574c5af58064dc33fd9"
3837
- };
4022
+ var run = (0, import_node_util.promisify)(import_node_child_process2.execFile);
4023
+ var ROOT_LOCKS = Symbol.for("peachsim.swiftCompile.rootLocks");
4024
+ var host = globalThis;
4025
+ var rootLocks = host[ROOT_LOCKS] ??= /* @__PURE__ */ new Map();
3838
4026
 
3839
4027
  // src/vite-plugin-swift.ts
3840
- var run = (0, import_node_util.promisify)(import_node_child_process2.execFile);
3841
- var TOOLCHAIN_BIN = import_node_path6.default.join(
3842
- import_node_os2.default.homedir(),
3843
- `Library/Developer/Toolchains/${toolchain_default.release}.xctoolchain/usr/bin`
3844
- );
3845
- var WASM_SDK = `${toolchain_default.release}_wasm`;
3846
4028
  var BUNDLE_MAX_FILE_BYTES = 2 * 1024 * 1024;
3847
4029
  var BUNDLE_MAX_TOTAL_BYTES = 8 * 1024 * 1024;
3848
4030
 
@@ -3997,7 +4179,7 @@ var prefix = "/__soot";
3997
4179
  function readCallableMetroExport(moduleValue, label) {
3998
4180
  const callable = typeof moduleValue === "function" ? moduleValue : typeof moduleValue === "object" && moduleValue !== null ? Reflect.get(moduleValue, "default") : void 0;
3999
4181
  if (typeof callable !== "function") {
4000
- throw new Error(`rnxsim: Metro ${label} module did not export a function`);
4182
+ throw new Error(`peachsim: Metro ${label} module did not export a function`);
4001
4183
  }
4002
4184
  return (...args) => Reflect.apply(callable, void 0, args);
4003
4185
  }
@@ -4018,7 +4200,7 @@ function createMetroDefaultSerializer(projectRoot) {
4018
4200
  );
4019
4201
  const code = typeof serialized === "object" && serialized !== null ? Reflect.get(serialized, "code") : void 0;
4020
4202
  if (typeof code !== "string") {
4021
- throw new Error("rnxsim: Metro bundleToString did not return bundle code");
4203
+ throw new Error("peachsim: Metro bundleToString did not return bundle code");
4022
4204
  }
4023
4205
  return code;
4024
4206
  };
@@ -4034,7 +4216,7 @@ function appendRNXModulePaths(result, graph, options, projectRoot) {
4034
4216
  modulePaths[String(createModuleId(module2.path))] = import_path4.default.relative(projectRoot, module2.path).replaceAll(import_path4.default.sep, "/");
4035
4217
  }
4036
4218
  if (Object.keys(modulePaths).length !== dependencies.size) {
4037
- throw new Error("rnxsim: bundle module IDs were not unique");
4219
+ throw new Error("peachsim: bundle module IDs were not unique");
4038
4220
  }
4039
4221
  const specifiersByModuleId = /* @__PURE__ */ new Map();
4040
4222
  for (const module2 of dependencies.values()) {
@@ -4181,13 +4363,13 @@ function resolveMetroPort(server) {
4181
4363
  var metro_plugin_default = withRNX;
4182
4364
 
4183
4365
  // src/jump-to-source-babel.ts
4184
- function normalizeSourcePath(path9) {
4185
- const queryStart = path9.indexOf("?");
4186
- const clean = queryStart >= 0 ? path9.slice(0, queryStart) : path9;
4366
+ function normalizeSourcePath(path8) {
4367
+ const queryStart = path8.indexOf("?");
4368
+ const clean = queryStart >= 0 ? path8.slice(0, queryStart) : path8;
4187
4369
  return clean.replace(/\\/g, "/");
4188
4370
  }
4189
- function matchesPath(path9, matcher) {
4190
- return typeof matcher === "string" ? path9.includes(matcher) : matcher.test(path9);
4371
+ function matchesPath(path8, matcher) {
4372
+ return typeof matcher === "string" ? path8.includes(matcher) : matcher.test(path8);
4191
4373
  }
4192
4374
  function shouldStampFile(filename, options) {
4193
4375
  const normalized = normalizeSourcePath(filename);
@@ -4220,11 +4402,11 @@ function sootsimJumpToSourceBabelPlugin(api, options = {}) {
4220
4402
  return {
4221
4403
  name: "sootsim-jump-to-source",
4222
4404
  visitor: {
4223
- JSXOpeningElement(path9, state) {
4405
+ JSXOpeningElement(path8, state) {
4224
4406
  if (options.enabled === false) return;
4225
4407
  const filename = state.file?.opts?.filename;
4226
4408
  if (!filename || !shouldStampFile(filename, options)) return;
4227
- const node = path9.node;
4409
+ const node = path8.node;
4228
4410
  const tagName = getJSXName(node.name);
4229
4411
  if (!tagName || tagName === "Fragment" || tagName.endsWith(".Fragment")) return;
4230
4412
  if (hasAttribute(node, attrName)) return;
@@ -4261,6 +4443,7 @@ function sootsimJumpToSourceBabelPlugin(api, options = {}) {
4261
4443
  isRnxScreenCapture,
4262
4444
  jumpToSourceBabelPlugin,
4263
4445
  metroPlugin,
4446
+ packRnxCaptureRegions,
4264
4447
  rnxCaptureRasterRegions,
4265
4448
  rnxPlugin,
4266
4449
  rnxRasterFrames,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.571 | (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.571 | (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.571 | (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.571 | (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.571 | (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.571 | (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.571 | (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");