rnxsim 0.1.345 → 0.1.347

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 (174) hide show
  1. package/README.md +9 -3
  2. package/cli/commands/welcome.ts +19 -17
  3. package/cli/outbound-endpoints.ts +1 -1
  4. package/dist-cli/bin.js +5 -5
  5. package/dist-cli/chunks/{agent-52G55XTO.js → agent-VVY2A5YV.js} +2 -2
  6. package/dist-cli/chunks/{agent-wrapper-BOZM43ON.js → agent-wrapper-YBMTZ3KU.js} +2 -2
  7. package/dist-cli/chunks/{app-fonts-A2L6V5EZ.js → app-fonts-EF7FM3VP.js} +2 -2
  8. package/dist-cli/chunks/{assert-CJKIP4LN.js → assert-J7N6WGMS.js} +2 -2
  9. package/dist-cli/chunks/{auth-VHHN3TOB.js → auth-YGX3WVEL.js} +2 -2
  10. package/dist-cli/chunks/{beta-EBDIGV3E.js → beta-JXYFAOHO.js} +2 -2
  11. package/dist-cli/chunks/{camera-5F4KKCQ3.js → camera-WIVF3UQ3.js} +2 -2
  12. package/dist-cli/chunks/{chunk-PLB6UVVX.js → chunk-23WNLQUB.js} +2 -2
  13. package/dist-cli/chunks/{chunk-KZFJNDH3.js → chunk-24Q4J4U6.js} +1 -1
  14. package/dist-cli/chunks/chunk-2E5KDIGN.js +14 -0
  15. package/dist-cli/chunks/{chunk-XJBFJGNT.js → chunk-2PAG4FBP.js} +2 -2
  16. package/dist-cli/chunks/{chunk-7LGINKM6.js → chunk-2UZ6QQ6S.js} +2 -2
  17. package/dist-cli/chunks/{chunk-7V4KPZ7O.js → chunk-2W4ME6YI.js} +2 -2
  18. package/dist-cli/chunks/{chunk-5GXRRUOA.js → chunk-3HBHHU5F.js} +3 -3
  19. package/dist-cli/chunks/{chunk-E2RGSCHT.js → chunk-3SPBSEVL.js} +1 -1
  20. package/dist-cli/chunks/{chunk-QNBBKRCA.js → chunk-4KK5IRA6.js} +2 -2
  21. package/dist-cli/chunks/{chunk-4OKV7T5D.js → chunk-4KOWLH77.js} +2 -2
  22. package/dist-cli/chunks/{chunk-DPP2M4AJ.js → chunk-4RI6KXVH.js} +1 -1
  23. package/dist-cli/chunks/{chunk-DHM3JDCK.js → chunk-6CGQWXXT.js} +2 -2
  24. package/dist-cli/chunks/{chunk-ZMTZ5G5H.js → chunk-7C6XE6AT.js} +2 -2
  25. package/dist-cli/chunks/{chunk-7YMQRA6L.js → chunk-7D56NCJ3.js} +2 -2
  26. package/dist-cli/chunks/{chunk-4ZILDTZX.js → chunk-ABBCVE5V.js} +2 -2
  27. package/dist-cli/chunks/{chunk-JC33TOAF.js → chunk-ANANQDHB.js} +1 -1
  28. package/dist-cli/chunks/{chunk-BFTDL2GX.js → chunk-BA45ZZKU.js} +2 -2
  29. package/dist-cli/chunks/{chunk-RB4VFUNM.js → chunk-BAXXUHKV.js} +2 -2
  30. package/dist-cli/chunks/{chunk-LAQGSSTT.js → chunk-DC4MQAR3.js} +1 -1
  31. package/dist-cli/chunks/{chunk-KA4PJNTE.js → chunk-DTNRKFSE.js} +2 -2
  32. package/dist-cli/chunks/{chunk-A2Q76LJV.js → chunk-EEZEVA2C.js} +2 -2
  33. package/dist-cli/chunks/{chunk-7UIIAHVU.js → chunk-EIIZZ2XK.js} +2 -2
  34. package/dist-cli/chunks/{chunk-TEU5NGUA.js → chunk-FQ3OHHCY.js} +2 -2
  35. package/dist-cli/chunks/{chunk-BCQV63BW.js → chunk-HWAGFGV7.js} +3 -3
  36. package/dist-cli/chunks/{chunk-XXZLK4BY.js → chunk-HY7XOD5E.js} +1 -1
  37. package/dist-cli/chunks/{chunk-T7SBFG5I.js → chunk-IQWQ6KI7.js} +2 -2
  38. package/dist-cli/chunks/{chunk-TMRD5MHL.js → chunk-IS2LT6MN.js} +2 -2
  39. package/dist-cli/chunks/{chunk-NUPRHZQW.js → chunk-JG2TIZ7E.js} +2 -2
  40. package/dist-cli/chunks/{chunk-YVSUFVVB.js → chunk-JKRVWCTC.js} +1 -1
  41. package/dist-cli/chunks/{chunk-3DBTS4MC.js → chunk-JP4FCK5J.js} +6 -6
  42. package/dist-cli/chunks/{chunk-RTDHX6CW.js → chunk-JQTBZERT.js} +2 -2
  43. package/dist-cli/chunks/{chunk-OPHT4DUO.js → chunk-KYTBJ2QV.js} +1 -1
  44. package/dist-cli/chunks/{chunk-63ASUHOV.js → chunk-LRRQI4TP.js} +2 -2
  45. package/dist-cli/chunks/{chunk-RT3DXTDP.js → chunk-LWE2HRS4.js} +2 -2
  46. package/dist-cli/chunks/{chunk-U5YHXQHH.js → chunk-NJ2JVAGV.js} +2 -2
  47. package/dist-cli/chunks/{chunk-4BIPA7MD.js → chunk-O7WPHIYQ.js} +1 -1
  48. package/dist-cli/chunks/{chunk-WPPGU5IK.js → chunk-OG3KGU4V.js} +2 -2
  49. package/dist-cli/chunks/{chunk-KH777UAO.js → chunk-PCU2CQCI.js} +3 -3
  50. package/dist-cli/chunks/{chunk-KRZPFXVN.js → chunk-QJYUHYQS.js} +1 -1
  51. package/dist-cli/chunks/{chunk-HK7YKH6N.js → chunk-QK2U5IW3.js} +2 -2
  52. package/dist-cli/chunks/{chunk-3N7M5HMJ.js → chunk-SMLCC5EP.js} +1 -1
  53. package/dist-cli/chunks/{chunk-QNRWPAOA.js → chunk-SNBSRIKO.js} +2 -2
  54. package/dist-cli/chunks/{chunk-R7ZNRGQN.js → chunk-SYQZTZTR.js} +1 -1
  55. package/dist-cli/chunks/{chunk-7GO2DSYQ.js → chunk-TAYE2YII.js} +1 -1
  56. package/dist-cli/chunks/{chunk-EPLVIDPC.js → chunk-U6CJ3EHB.js} +1 -1
  57. package/dist-cli/chunks/{chunk-GKGXULJK.js → chunk-UM7IG4DE.js} +2 -2
  58. package/dist-cli/chunks/{chunk-VLBN3KRC.js → chunk-VENH5KLL.js} +1 -1
  59. package/dist-cli/chunks/{chunk-P2CGGMU2.js → chunk-W4MASUQ7.js} +2 -2
  60. package/dist-cli/chunks/{chunk-WU72KL6Z.js → chunk-WIYBEKBM.js} +2 -2
  61. package/dist-cli/chunks/{chunk-LRM2XCEQ.js → chunk-WNZOJDBL.js} +1 -1
  62. package/dist-cli/chunks/{chunk-UVOEHIGP.js → chunk-XB7DLZNQ.js} +1 -1
  63. package/dist-cli/chunks/{chunk-PLUWN2V5.js → chunk-XGUCAKZM.js} +1 -1
  64. package/dist-cli/chunks/{chunk-DGTV3KOW.js → chunk-Z6K6TD7X.js} +1 -1
  65. package/dist-cli/chunks/{chunk-BHKSCNDC.js → chunk-ZPCQFQEN.js} +1 -1
  66. package/dist-cli/chunks/{chunk-HXE344V3.js → chunk-ZY44NCRQ.js} +1 -1
  67. package/dist-cli/chunks/{cleanup-MAVZJXVW.js → cleanup-ZIDQQLEN.js} +2 -2
  68. package/dist-cli/chunks/cli-version-BEJJXF35.js +4 -0
  69. package/dist-cli/chunks/{compat-7AURLGCS.js → compat-5PFPTBBK.js} +2 -2
  70. package/dist-cli/chunks/{config-TN3Y4J5N.js → config-CG73FOTM.js} +2 -2
  71. package/dist-cli/chunks/{control-EV2ELU5R.js → control-7IYIDOOI.js} +2 -2
  72. package/dist-cli/chunks/daemon-G6VR7LJI.js +4 -0
  73. package/dist-cli/chunks/{debug-JICITUB6.js → debug-6AQQXXE3.js} +3 -3
  74. package/dist-cli/chunks/{desktop-4F5HGLLX.js → desktop-HJE5B4XO.js} +3 -3
  75. package/dist-cli/chunks/{detox-ZC7NHLJI.js → detox-KUZ7EYOP.js} +2 -2
  76. package/dist-cli/chunks/{device-V57GHRXX.js → device-O6WI4PQT.js} +2 -2
  77. package/dist-cli/chunks/{diagnose-FF4IWYXC.js → diagnose-FTCJGH2Q.js} +2 -2
  78. package/dist-cli/chunks/{disk-cleanup-T277L6ZO.js → disk-cleanup-YAXG52EZ.js} +2 -2
  79. package/dist-cli/chunks/drivers-6QOL2SON.js +4 -0
  80. package/dist-cli/chunks/{film-G7ZAPWB7.js → film-KTLKRCJR.js} +3 -3
  81. package/dist-cli/chunks/flow-6VQN4VNW.js +4 -0
  82. package/dist-cli/chunks/help-22OURA2E.js +4 -0
  83. package/dist-cli/chunks/{hidden-runtime-alias-VSJNNSNI.js → hidden-runtime-alias-W375XBOM.js} +2 -2
  84. package/dist-cli/chunks/{home-paths-75HP3HKA.js → home-paths-CIGRWLDB.js} +2 -2
  85. package/dist-cli/chunks/inspect-36A2IEJL.js +4 -0
  86. package/dist-cli/chunks/install-desktop-KOW3XXUF.js +4 -0
  87. package/dist-cli/chunks/{login-ZSIHGHUK.js → login-AJWLXLPQ.js} +2 -2
  88. package/dist-cli/chunks/{logout-Q4DXMI2C.js → logout-CEJLZIOI.js} +2 -2
  89. package/dist-cli/chunks/{maestro-LE5LCRBL.js → maestro-YF4M6M6L.js} +3 -3
  90. package/dist-cli/chunks/{maestro-generate-D3ZIJCRL.js → maestro-generate-FJWDLMEB.js} +3 -3
  91. package/dist-cli/chunks/{mode-BWX6MDPJ.js → mode-6BJ523BY.js} +2 -2
  92. package/dist-cli/chunks/{optional-demo-registry-6CVASL3S.js → optional-demo-registry-5CKCN2TP.js} +2 -2
  93. package/dist-cli/chunks/{perf-NXQZISN6.js → perf-WE6QTFJU.js} +2 -2
  94. package/dist-cli/chunks/{permissions-5PD67RRO.js → permissions-OZZZZFPB.js} +2 -2
  95. package/dist-cli/chunks/privacy-3BERNBUM.js +4 -0
  96. package/dist-cli/chunks/{record-YJF4KXMR.js → record-QHQS2524.js} +3 -3
  97. package/dist-cli/chunks/{report-issue-XOL5FQBG.js → report-issue-SEMVVJUH.js} +2 -2
  98. package/dist-cli/chunks/reset-A5AA5ML6.js +4 -0
  99. package/dist-cli/chunks/runtime-R26QWA2M.js +4 -0
  100. package/dist-cli/chunks/{screenshot-command-VRPJXWFS.js → screenshot-command-WW33MAB3.js} +3 -3
  101. package/dist-cli/chunks/{screenshot-layers-QP4WA2F5.js → screenshot-layers-2GJTEQ4T.js} +2 -2
  102. package/dist-cli/chunks/{screenshots-capture-O2IBAVSP.js → screenshots-capture-J5HKONCC.js} +2 -2
  103. package/dist-cli/chunks/{serve-WC6RZNJL.js → serve-FEBNDKUD.js} +2 -2
  104. package/dist-cli/chunks/{setup-A6BIG3KL.js → setup-NGZWS373.js} +2 -2
  105. package/dist-cli/chunks/{skills-A7YC6RL5.js → skills-CFCZFEME.js} +2 -2
  106. package/dist-cli/chunks/{state-IJI5YROJ.js → state-XWRKK7FW.js} +2 -2
  107. package/dist-cli/chunks/{storage-Z2DBO2PQ.js → storage-C5GNK4XB.js} +2 -2
  108. package/dist-cli/chunks/store-L3A4CLND.js +4 -0
  109. package/dist-cli/chunks/telemetry-O67J22QU.js +4 -0
  110. package/dist-cli/chunks/{timeline-N7V2M6QA.js → timeline-7RA7ZILQ.js} +2 -2
  111. package/dist-cli/chunks/{upgrade-P2NH3BOR.js → upgrade-ZW6IJ5LX.js} +2 -2
  112. package/dist-cli/chunks/upload-UKUN6HCD.js +4 -0
  113. package/dist-cli/chunks/{version-OUHCSCUS.js → version-N3E4OIMM.js} +2 -2
  114. package/dist-cli/chunks/{web-6NRTF3UV.js → web-UC2SFEBA.js} +2 -2
  115. package/dist-cli/chunks/welcome-DAZPCMES.js +5 -0
  116. package/dist-cli/chunks/{what-happened-FUEL3BEF.js → what-happened-VUNKID5W.js} +2 -2
  117. package/dist-lib/agent-daemon-client.cjs +1 -1
  118. package/dist-lib/agent-events.cjs +1 -1
  119. package/dist-lib/agent-identity.cjs +1 -1
  120. package/dist-lib/agent-sessions.cjs +1 -1
  121. package/dist-lib/attached-projects.cjs +1 -1
  122. package/dist-lib/auth/shared-session.cjs +1 -1
  123. package/dist-lib/backend-origin.cjs +13 -1
  124. package/dist-lib/beta.cjs +1 -1
  125. package/dist-lib/beta.mjs +1 -1
  126. package/dist-lib/bridge-constants.cjs +1 -1
  127. package/dist-lib/bridge-contract.cjs +1 -1
  128. package/dist-lib/cli-constants.cjs +1 -1
  129. package/dist-lib/config.cjs +1 -1
  130. package/dist-lib/detox/index.cjs +1 -1
  131. package/dist-lib/dev-bundle-resolution.cjs +26 -10
  132. package/dist-lib/home-paths.cjs +1 -1
  133. package/dist-lib/host/bridge-host.cjs +101 -58
  134. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  135. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  136. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  137. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  138. package/dist-lib/host/websocket-proxy.cjs +1 -1
  139. package/dist-lib/index.cjs +1 -1
  140. package/dist-lib/jump-to-source-babel.cjs +1 -1
  141. package/dist-lib/menu.cjs +1 -1
  142. package/dist-lib/menu.mjs +1 -1
  143. package/dist-lib/metro-production-bundle.cjs +1 -1
  144. package/dist-lib/metro-production-bundle.mjs +1 -1
  145. package/dist-lib/metro.cjs +1 -1
  146. package/dist-lib/profiles.cjs +1 -1
  147. package/dist-lib/public-brand.cjs +1 -1
  148. package/dist-lib/react-native-host-modules.cjs +1 -1
  149. package/dist-lib/react-native-host-modules.mjs +1 -1
  150. package/dist-lib/render-mode.cjs +1 -1
  151. package/dist-lib/scripts/dev-server-scanner.cjs +106 -59
  152. package/dist-lib/sdk.cjs +1 -1
  153. package/dist-lib/sdk.mjs +1 -1
  154. package/dist-lib/skills.cjs +127 -72
  155. package/dist-lib/vite.cjs +1 -1
  156. package/package.json +1 -1
  157. package/scripts/dev-server-scanner.ts +101 -47
  158. package/src/backend-origin.ts +15 -1
  159. package/src/dev-bundle-resolution.ts +29 -12
  160. package/dist-cli/chunks/chunk-TOF5TA5X.js +0 -14
  161. package/dist-cli/chunks/cli-version-2B4KRNML.js +0 -4
  162. package/dist-cli/chunks/daemon-KKDG5MYR.js +0 -4
  163. package/dist-cli/chunks/drivers-LCX7S76X.js +0 -4
  164. package/dist-cli/chunks/flow-ONZGGFGD.js +0 -4
  165. package/dist-cli/chunks/help-DROVDXJM.js +0 -4
  166. package/dist-cli/chunks/inspect-MDA7ESGQ.js +0 -4
  167. package/dist-cli/chunks/install-desktop-EIVZHIFA.js +0 -4
  168. package/dist-cli/chunks/privacy-H5KNRNIZ.js +0 -4
  169. package/dist-cli/chunks/reset-5LZN5P5B.js +0 -4
  170. package/dist-cli/chunks/runtime-U36VWBH3.js +0 -4
  171. package/dist-cli/chunks/store-BYTCKNIC.js +0 -4
  172. package/dist-cli/chunks/telemetry-JLHFMD7N.js +0 -4
  173. package/dist-cli/chunks/upload-Z2WX5DCD.js +0 -4
  174. package/dist-cli/chunks/welcome-6RS7PEJW.js +0 -5
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.345 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.347 | (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;
@@ -9476,6 +9476,27 @@ var init_bridge_constants = __esm({
9476
9476
  }
9477
9477
  });
9478
9478
 
9479
+ // src/backend-origin.ts
9480
+ function normalizeHostname(hostname) {
9481
+ return hostname.replace(/^\[|\]$/g, "").toLowerCase();
9482
+ }
9483
+ function buildLoopbackProbeBaseUrl(protocol, hostname, port) {
9484
+ const normalizedHostname = normalizeHostname(hostname);
9485
+ const urlHost = normalizedHostname.includes(":") ? `[${normalizedHostname}]` : normalizedHostname;
9486
+ return `${protocol}//${urlHost}:${port}`;
9487
+ }
9488
+ function isLoopbackHost(hostname) {
9489
+ const normalized = normalizeHostname(hostname);
9490
+ return normalized === "localhost" || normalized.endsWith(".localhost") || normalized === "0.0.0.0" || normalized === "::1" || /^127(?:\.\d{1,3}){3}$/.test(normalized);
9491
+ }
9492
+ var LOOPBACK_PROBE_HOSTNAMES;
9493
+ var init_backend_origin = __esm({
9494
+ "src/backend-origin.ts"() {
9495
+ "use strict";
9496
+ LOOPBACK_PROBE_HOSTNAMES = ["::1", "127.0.0.1"];
9497
+ }
9498
+ });
9499
+
9479
9500
  // src/config.ts
9480
9501
  function hasOwnKeys(value) {
9481
9502
  return !!value && Object.keys(value).length > 0;
@@ -9524,20 +9545,6 @@ var init_config = __esm({
9524
9545
  }
9525
9546
  });
9526
9547
 
9527
- // src/backend-origin.ts
9528
- function normalizeHostname(hostname) {
9529
- return hostname.replace(/^\[|\]$/g, "").toLowerCase();
9530
- }
9531
- function isLoopbackHost(hostname) {
9532
- const normalized = normalizeHostname(hostname);
9533
- return normalized === "localhost" || normalized.endsWith(".localhost") || normalized === "0.0.0.0" || normalized === "::1" || /^127(?:\.\d{1,3}){3}$/.test(normalized);
9534
- }
9535
- var init_backend_origin = __esm({
9536
- "src/backend-origin.ts"() {
9537
- "use strict";
9538
- }
9539
- });
9540
-
9541
9548
  // src/native-dev-bundle-url.ts
9542
9549
  function isAbsoluteHttpUrl(url) {
9543
9550
  return /^https?:\/\//i.test(url);
@@ -10019,27 +10026,36 @@ var init_optional_demo_registry = __esm({
10019
10026
  });
10020
10027
 
10021
10028
  // scripts/dev-server-scanner.ts
10022
- function tcpPing(port, timeout = TCP_GATE_MS) {
10023
- return new Promise((resolve7) => {
10024
- const sock = new import_net.default.Socket();
10025
- let settled = false;
10026
- const done = (ok) => {
10027
- if (settled) return;
10028
- settled = true;
10029
- sock.destroy();
10030
- resolve7(ok);
10031
- };
10032
- sock.setTimeout(timeout);
10033
- sock.once("connect", () => done(true));
10034
- sock.once("timeout", () => done(false));
10035
- sock.once("error", () => done(false));
10036
- sock.connect(port, "localhost");
10037
- });
10029
+ async function tcpPing(port, timeout = TCP_GATE_MS) {
10030
+ try {
10031
+ return await Promise.any(
10032
+ LOOPBACK_PROBE_HOSTNAMES.map(
10033
+ (hostname) => new Promise((resolve7, reject) => {
10034
+ const sock = new import_net.default.Socket();
10035
+ let settled = false;
10036
+ const done = (reachable) => {
10037
+ if (settled) return;
10038
+ settled = true;
10039
+ sock.destroy();
10040
+ if (reachable) resolve7(hostname);
10041
+ else reject(new Error(`unreachable loopback host ${hostname}`));
10042
+ };
10043
+ sock.setTimeout(timeout);
10044
+ sock.once("connect", () => done(true));
10045
+ sock.once("timeout", () => done(false));
10046
+ sock.once("error", () => done(false));
10047
+ sock.connect(port, hostname);
10048
+ })
10049
+ )
10050
+ );
10051
+ } catch {
10052
+ return null;
10053
+ }
10038
10054
  }
10039
- function httpGet(port, path18, method = "GET", timeout = TIMEOUT_MS, headers = {}) {
10055
+ function httpGet(hostname, port, path18, method = "GET", timeout = TIMEOUT_MS, headers = {}) {
10040
10056
  return new Promise((resolve7) => {
10041
10057
  const req = import_http.default.request(
10042
- { hostname: "localhost", port, path: path18, method, timeout, headers },
10058
+ { hostname, port, path: path18, method, timeout, headers },
10043
10059
  (res) => {
10044
10060
  let body = "";
10045
10061
  res.on("data", (c) => body += c.toString());
@@ -10051,7 +10067,12 @@ function httpGet(port, path18, method = "GET", timeout = TIMEOUT_MS, headers = {
10051
10067
  })();
10052
10068
  res.on(
10053
10069
  "end",
10054
- () => resolve7({ statusCode: res.statusCode || 0, body, contentType })
10070
+ () => resolve7({
10071
+ statusCode: res.statusCode || 0,
10072
+ body,
10073
+ contentType,
10074
+ hostname
10075
+ })
10055
10076
  );
10056
10077
  }
10057
10078
  );
@@ -10191,16 +10212,16 @@ async function resolveProcessCwd(pid) {
10191
10212
  }
10192
10213
  return null;
10193
10214
  }
10194
- function makeResult(port, framework, owner) {
10215
+ function makeResult(hostname, port, framework, owner) {
10195
10216
  return {
10196
10217
  port,
10197
10218
  framework,
10198
10219
  bundleUrl: withRuntimeConfig(
10199
10220
  port,
10200
- `http://localhost:${port}/index.bundle?platform=ios&dev=true&hot=true&minify=false`,
10221
+ `${buildLoopbackProbeBaseUrl("http:", hostname, port)}/index.bundle?platform=ios&dev=true&hot=true&minify=false`,
10201
10222
  owner.cwd
10202
10223
  ),
10203
- hmrUrl: `ws://localhost:${port}/hot`,
10224
+ hmrUrl: `${buildLoopbackProbeBaseUrl("ws:", hostname, port)}/hot`,
10204
10225
  lastSeen: Date.now(),
10205
10226
  ...owner
10206
10227
  };
@@ -10232,7 +10253,10 @@ function applyManifest(result, manifestRes, buildIconProxyUrl) {
10232
10253
  if (client.ios?.bundleIdentifier) result.bundleId = client.ios.bundleIdentifier;
10233
10254
  if (result.framework === "metro" && client.sdkVersion) result.framework = "expo";
10234
10255
  const rawLaunchUrl = manifest?.launchAsset?.url;
10235
- const launchUrl2 = typeof rawLaunchUrl === "string" ? alignLoopbackBundleUrlWithProbe(rawLaunchUrl, `http://localhost:${result.port}`) : rawLaunchUrl;
10256
+ const launchUrl2 = typeof rawLaunchUrl === "string" ? alignLoopbackBundleUrlWithProbe(
10257
+ rawLaunchUrl,
10258
+ buildLoopbackProbeBaseUrl("http:", manifestRes.hostname, result.port)
10259
+ ) : rawLaunchUrl;
10236
10260
  if (launchUrl2 && !result.patched && !isDirectOneBundleUrl(result.bundleUrl)) {
10237
10261
  result.bundleUrl = withRuntimeConfig(result.port, launchUrl2, result.cwd);
10238
10262
  }
@@ -10245,11 +10269,11 @@ function applyManifest(result, manifestRes, buildIconProxyUrl) {
10245
10269
  } else {
10246
10270
  const cleanPath = rawIconUrl.replace(/^\.\//, "");
10247
10271
  result.iconUrl = buildIconProxyUrl(
10248
- `http://localhost:${result.port}/assets/${cleanPath}`
10272
+ `${buildLoopbackProbeBaseUrl("http:", manifestRes.hostname, result.port)}/assets/${cleanPath}`
10249
10273
  );
10250
10274
  }
10251
10275
  } else {
10252
- result.iconUrl = rawIconUrl.startsWith("http") ? rawIconUrl : `http://localhost:${result.port}/assets/${rawIconUrl.replace(/^\.\//, "")}`;
10276
+ result.iconUrl = rawIconUrl.startsWith("http") ? rawIconUrl : `${buildLoopbackProbeBaseUrl("http:", manifestRes.hostname, result.port)}/assets/${rawIconUrl.replace(/^\.\//, "")}`;
10253
10277
  }
10254
10278
  }
10255
10279
  } catch {
@@ -10270,35 +10294,48 @@ function enrichWithManifest(result, buildIconProxyUrl) {
10270
10294
  }
10271
10295
  if (!enrichmentInFlight.has(result.port)) {
10272
10296
  enrichmentInFlight.add(result.port);
10273
- const port = result.port;
10274
- void fetchManifestEnrichment(port, buildIconProxyUrl).finally(
10275
- () => enrichmentInFlight.delete(port)
10297
+ void fetchManifestEnrichment(result, buildIconProxyUrl).finally(
10298
+ () => enrichmentInFlight.delete(result.port)
10276
10299
  );
10277
10300
  }
10278
10301
  return result;
10279
10302
  }
10280
- async function fetchManifestEnrichment(port, buildIconProxyUrl) {
10281
- const manifestRes = await httpGet(port, "/", "GET", ENRICH_TIMEOUT_MS, {
10282
- "expo-platform": "ios"
10283
- });
10303
+ async function fetchManifestEnrichment(result, buildIconProxyUrl) {
10304
+ const hostname = normalizeHostname(new URL(result.bundleUrl).hostname);
10305
+ const manifestRes = await httpGet(
10306
+ hostname,
10307
+ result.port,
10308
+ "/",
10309
+ "GET",
10310
+ ENRICH_TIMEOUT_MS,
10311
+ {
10312
+ "expo-platform": "ios"
10313
+ }
10314
+ );
10284
10315
  if (!manifestRes || manifestRes.statusCode !== 200) return;
10285
10316
  const parsed = applyManifest(
10286
- { port, framework: "one", bundleUrl: "", lastSeen: 0 },
10317
+ {
10318
+ port: result.port,
10319
+ framework: "one",
10320
+ bundleUrl: `${buildLoopbackProbeBaseUrl("http:", hostname, result.port)}/index.bundle`,
10321
+ lastSeen: 0
10322
+ },
10287
10323
  manifestRes,
10288
10324
  buildIconProxyUrl
10289
10325
  );
10290
10326
  if (!parsed.projectName && !parsed.iconUrl) return;
10291
- enrichmentCache.set(port, {
10327
+ enrichmentCache.set(result.port, {
10292
10328
  projectName: parsed.projectName,
10293
10329
  iconUrl: parsed.iconUrl,
10294
10330
  iconPath: parsed.iconPath,
10295
10331
  bundleId: parsed.bundleId
10296
10332
  });
10297
- portCache.delete(port);
10333
+ portCache.delete(result.port);
10298
10334
  }
10299
10335
  async function probePort(port, buildIconProxyUrl, listeningProcess) {
10300
10336
  await loadOptionalDemoApps();
10301
- if (!await tcpPing(port)) return null;
10337
+ const probeHostname = await tcpPing(port);
10338
+ if (!probeHostname) return null;
10302
10339
  const suppliedPid = listeningProcess?.pid;
10303
10340
  const ownerPid = suppliedPid && suppliedPid > 0 ? suppliedPid : await resolveListeningPid(port);
10304
10341
  const ownerCwd = ownerPid ? await resolveProcessCwd(ownerPid) : null;
@@ -10308,10 +10345,12 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
10308
10345
  };
10309
10346
  const onePath = `/node_modules/one/metro-entry.bundle?platform=ios&dev=true`;
10310
10347
  const [sootsimRes, statusRes, manifestRes, expoRes] = await Promise.all([
10311
- knownNonPatched.has(port) ? Promise.resolve(null) : httpGet(port, "/__soot/"),
10312
- httpGet(port, "/status"),
10313
- knownOne.has(port) ? Promise.resolve(null) : httpGet(port, "/", "GET", MANIFEST_TIMEOUT_MS, { "expo-platform": "ios" }),
10314
- knownNonExpo.has(port) ? Promise.resolve(null) : httpGet(port, "/_expo/status")
10348
+ knownNonPatched.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/__soot/"),
10349
+ httpGet(probeHostname, port, "/status"),
10350
+ knownOne.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/", "GET", MANIFEST_TIMEOUT_MS, {
10351
+ "expo-platform": "ios"
10352
+ }),
10353
+ knownNonExpo.has(port) ? Promise.resolve(null) : httpGet(probeHostname, port, "/_expo/status")
10315
10354
  ]);
10316
10355
  if (expoRes && expoRes.statusCode === 200) {
10317
10356
  knownNonExpo.delete(port);
@@ -10323,7 +10362,7 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
10323
10362
  const manifestClient = manifestParsed?.extra?.expoClient || manifestParsed?.extra || {};
10324
10363
  if (manifestParsed && (manifestLaunchUrl || typeof manifestClient.name === "string")) {
10325
10364
  knownNonPatched.add(port);
10326
- const launchUrl2 = manifestLaunchUrl || `http://localhost:${port}/index.bundle?platform=ios&dev=true&hot=true&minify=false`;
10365
+ const launchUrl2 = manifestLaunchUrl || `${buildLoopbackProbeBaseUrl("http:", probeHostname, port)}/index.bundle?platform=ios&dev=true&hot=true&minify=false`;
10327
10366
  const framework = launchUrl2.includes(
10328
10367
  "/one/metro-entry.bundle"
10329
10368
  ) ? "one" : "expo";
@@ -10332,7 +10371,7 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
10332
10371
  port,
10333
10372
  framework,
10334
10373
  bundleUrl: withRuntimeConfig(port, launchUrl2, owner.cwd),
10335
- hmrUrl: `ws://localhost:${port}/hot`,
10374
+ hmrUrl: `${buildLoopbackProbeBaseUrl("ws:", probeHostname, port)}/hot`,
10336
10375
  lastSeen: Date.now(),
10337
10376
  ...owner
10338
10377
  },
@@ -10344,7 +10383,12 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
10344
10383
  knownNonPatched.add(port);
10345
10384
  return enrichWithManifest(
10346
10385
  applyManifest(
10347
- makeResult(port, expoRes && expoRes.statusCode === 200 ? "expo" : "metro", owner),
10386
+ makeResult(
10387
+ probeHostname,
10388
+ port,
10389
+ expoRes && expoRes.statusCode === 200 ? "expo" : "metro",
10390
+ owner
10391
+ ),
10348
10392
  manifestRes,
10349
10393
  buildIconProxyUrl
10350
10394
  ),
@@ -10360,10 +10404,10 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
10360
10404
  framework: "one",
10361
10405
  bundleUrl: withRuntimeConfig(
10362
10406
  port,
10363
- `http://localhost:${port}/__soot/bundle.js`,
10407
+ `${buildLoopbackProbeBaseUrl("http:", probeHostname, port)}/__soot/bundle.js`,
10364
10408
  owner.cwd
10365
10409
  ),
10366
- hmrUrl: `ws://localhost:${port}/hot`,
10410
+ hmrUrl: `${buildLoopbackProbeBaseUrl("ws:", probeHostname, port)}/hot`,
10367
10411
  lastSeen: Date.now(),
10368
10412
  patched: true,
10369
10413
  ...owner
@@ -10378,7 +10422,7 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
10378
10422
  if (looksLikeMetroPackager) {
10379
10423
  return null;
10380
10424
  }
10381
- const oneRes = await httpGet(port, onePath, "HEAD");
10425
+ const oneRes = await httpGet(probeHostname, port, onePath, "HEAD");
10382
10426
  if (oneRes && oneRes.statusCode > 0 && oneRes.statusCode < 400 && /application\/javascript/i.test(oneRes.contentType || "")) {
10383
10427
  knownNonPatched.add(port);
10384
10428
  knownOne.add(port);
@@ -10389,10 +10433,10 @@ async function probePort(port, buildIconProxyUrl, listeningProcess) {
10389
10433
  framework: "one",
10390
10434
  bundleUrl: withRuntimeConfig(
10391
10435
  port,
10392
- `http://localhost:${port}${onePath}&minify=false`,
10436
+ `${buildLoopbackProbeBaseUrl("http:", probeHostname, port)}${onePath}&minify=false`,
10393
10437
  owner.cwd
10394
10438
  ),
10395
- hmrUrl: `ws://localhost:${port}/hot`,
10439
+ hmrUrl: `${buildLoopbackProbeBaseUrl("ws:", probeHostname, port)}/hot`,
10396
10440
  lastSeen: Date.now(),
10397
10441
  ...owner
10398
10442
  },
@@ -10514,6 +10558,7 @@ var init_dev_server_scanner = __esm({
10514
10558
  import_net = __toESM(require("net"), 1);
10515
10559
  import_node_path3 = require("node:path");
10516
10560
  import_util = require("util");
10561
+ init_backend_origin();
10517
10562
  init_config();
10518
10563
  init_native_dev_bundle_url();
10519
10564
  init_settings_bundle();
@@ -16789,15 +16834,8 @@ async function resolvePortViaServerScan(port) {
16789
16834
  return null;
16790
16835
  }
16791
16836
  }
16792
- async function probeBaseUrlBundle(baseUrl, port) {
16837
+ async function probeBaseUrlBundleDirect(baseUrl, port) {
16793
16838
  const normalizedBaseUrl = baseUrl.replace(/\/+$/, "");
16794
- try {
16795
- if (isLoopbackHost(new URL(normalizedBaseUrl).hostname)) {
16796
- const viaScan = await resolvePortViaServerScan(port);
16797
- if (viaScan) return viaScan;
16798
- }
16799
- } catch {
16800
- }
16801
16839
  try {
16802
16840
  const manifestRes = await fetchDevProbe(`${normalizedBaseUrl}/`, {
16803
16841
  headers: { "expo-platform": "ios" }
@@ -16836,8 +16874,25 @@ async function probeBaseUrlBundle(baseUrl, port) {
16836
16874
  }
16837
16875
  return null;
16838
16876
  }
16877
+ async function probeBaseUrlBundle(baseUrl, port) {
16878
+ try {
16879
+ if (isLoopbackHost(new URL(baseUrl).hostname)) {
16880
+ const viaScan = await resolvePortViaServerScan(port);
16881
+ if (viaScan) return viaScan;
16882
+ }
16883
+ } catch {
16884
+ }
16885
+ return probeBaseUrlBundleDirect(baseUrl, port);
16886
+ }
16839
16887
  async function probePortBundle(port) {
16840
- return probeBaseUrlBundle(buildBaseUrl("http:", "localhost", port), port);
16888
+ const viaScan = await resolvePortViaServerScan(port);
16889
+ if (viaScan) return viaScan;
16890
+ const candidates = await Promise.all(
16891
+ LOOPBACK_PROBE_HOSTNAMES.map(
16892
+ (hostname) => probeBaseUrlBundleDirect(buildLoopbackProbeBaseUrl("http:", hostname, port), port)
16893
+ )
16894
+ );
16895
+ return candidates.find((candidate) => candidate !== null) ?? null;
16841
16896
  }
16842
16897
  async function resolveConnectionInput(input) {
16843
16898
  const trimmed = input.trim();
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.345 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.347 | (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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rnxsim",
3
- "version": "0.1.345",
3
+ "version": "0.1.347",
4
4
  "description": "rnx CLI, Vite and Metro plugins, and agent skills for driving React Native apps in the browser.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",