rnxsim 0.1.411 → 0.1.413

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 (53) hide show
  1. package/cli/bridge-flow-runner.ts +24 -18
  2. package/cli/outbound-endpoints.ts +8 -0
  3. package/dist-lib/agent-daemon-client.cjs +1 -1
  4. package/dist-lib/agent-events.cjs +1 -1
  5. package/dist-lib/agent-identity.cjs +1 -1
  6. package/dist-lib/agent-sessions.cjs +1 -1
  7. package/dist-lib/attached-projects.cjs +1 -1
  8. package/dist-lib/auth/shared-session.cjs +1 -1
  9. package/dist-lib/backend-origin.cjs +2 -2
  10. package/dist-lib/beta.cjs +1 -1
  11. package/dist-lib/beta.mjs +1 -1
  12. package/dist-lib/bridge-constants.cjs +1 -1
  13. package/dist-lib/bridge-contract-input.cjs +1 -1
  14. package/dist-lib/bridge-contract-input.mjs +1 -1
  15. package/dist-lib/bridge-contract.cjs +1 -1
  16. package/dist-lib/bridge-contract.mjs +1 -1
  17. package/dist-lib/capture-contract.cjs +1 -1
  18. package/dist-lib/capture-contract.mjs +1 -1
  19. package/dist-lib/cli-constants.cjs +1 -1
  20. package/dist-lib/cloud-contract.cjs +1 -1
  21. package/dist-lib/cloud-contract.mjs +1 -1
  22. package/dist-lib/config.cjs +1 -1
  23. package/dist-lib/detox/index.cjs +1 -1
  24. package/dist-lib/dev-bundle-resolution.cjs +2 -2
  25. package/dist-lib/home-paths.cjs +1 -1
  26. package/dist-lib/host/bridge-host.cjs +15 -2
  27. package/dist-lib/host/fetch-proxy-handler.cjs +14 -1
  28. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  29. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  30. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  31. package/dist-lib/host/websocket-proxy.cjs +1 -1
  32. package/dist-lib/index.cjs +1 -1
  33. package/dist-lib/jump-to-source-babel.cjs +1 -1
  34. package/dist-lib/menu.cjs +1 -1
  35. package/dist-lib/menu.mjs +1 -1
  36. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  37. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  38. package/dist-lib/metro-production-bundle.cjs +1 -1
  39. package/dist-lib/metro-production-bundle.mjs +1 -1
  40. package/dist-lib/metro.cjs +1 -1
  41. package/dist-lib/profiles.cjs +1 -1
  42. package/dist-lib/public-brand.cjs +1 -1
  43. package/dist-lib/react-native-host-modules.cjs +1 -1
  44. package/dist-lib/react-native-host-modules.mjs +1 -1
  45. package/dist-lib/render-mode.cjs +1 -1
  46. package/dist-lib/scripts/dev-server-scanner.cjs +2 -2
  47. package/dist-lib/sdk.cjs +1 -1
  48. package/dist-lib/sdk.mjs +1 -1
  49. package/dist-lib/skills.cjs +35 -6
  50. package/dist-lib/vite.cjs +1 -1
  51. package/package.json +1 -1
  52. package/src/backend-origin.ts +1 -1
  53. package/src/host/fetch-proxy-handler.ts +13 -0
@@ -1833,6 +1833,17 @@ export class SootSimBridgeFlowRunner {
1833
1833
  }
1834
1834
 
1835
1835
  private async reloadGuestApp() {
1836
+ // try the gentle reload first — in-place React re-mount preserves
1837
+ // recording state and avoids the full worker lifecycle tear-down.
1838
+ const reloaded = await this.bridge.send({
1839
+ type: 'call',
1840
+ simId: this.opts.simId,
1841
+ path: 'SootSim.bridges.hotRemount.reloadExternalApp',
1842
+ args: [],
1843
+ })
1844
+ if (reloaded) return
1845
+
1846
+ // fallback for surfaces that don't export the hot-remount bridge: a
1836
1847
  // hard page reload resets the tenant worker.
1837
1848
  await this.evaluate('window.location.reload()').catch(() => {})
1838
1849
  }
@@ -1908,12 +1919,15 @@ export class SootSimBridgeFlowRunner {
1908
1919
  const wantsClear = !!(opts && typeof opts === 'object' && opts.clearState)
1909
1920
  const wantsResetRuntime = readBooleanKey(opts, 'resetRuntime')
1910
1921
 
1911
- if (!this.firstLaunchDone && !wantsClear) {
1912
- // First launch in the flow, no clear: if the shell is on home, mirror
1913
- // Maestro's "launch the app" boundary through the shell. Otherwise the
1914
- // guest app is already booting from the initial sim open, so just wait.
1922
+ if (!this.firstLaunchDone) {
1915
1923
  this.firstLaunchDone = true
1916
- if (hasLaunchArguments) {
1924
+ if (wantsClear) {
1925
+ await this.resetGuestAppData({
1926
+ launchArguments: hasLaunchArguments ? launchArguments : null,
1927
+ initialUrl: null,
1928
+ })
1929
+ await this.waitForTree(120000)
1930
+ } else if (hasLaunchArguments) {
1917
1931
  const launched = await this.launchShellAppFromHomeIfNeeded(opts)
1918
1932
  if (launched) await this.waitForTree(120000)
1919
1933
  await this.reloadGuestAppRuntime({
@@ -1921,22 +1935,13 @@ export class SootSimBridgeFlowRunner {
1921
1935
  initialUrl: null,
1922
1936
  })
1923
1937
  await this.waitForTree(120000)
1938
+ await this.waitForTree(30000)
1924
1939
  } else if (wantsResetRuntime) {
1925
- // rnx benchmark flows need app auth/storage kept warm while the
1926
- // guest React runtime starts fresh inside the timed/recorded boundary.
1927
- // the reload re-runs the app entry inside the mounted app surface, so
1928
- // it only does anything while the shell is showing the app. issued from
1929
- // home it acks, blanks the surface, and never re-mounts a root
1930
- // component, so launch first and let a flow that starts at home reset
1931
- // the same runtime a flow that starts in-app does. a surface we just
1932
- // launched still has to finish mounting before the reset, since
1933
- // resetting mid-mount drops the module cache while that first load is
1934
- // in flight; an already-foregrounded app is past that point and a
1935
- // second readiness wait would only pad the measured reset.
1936
1940
  const launched = await this.launchShellAppFromHomeIfNeeded(opts)
1937
1941
  if (launched) await this.waitForTree(120000)
1938
1942
  await this.reloadGuestAppRuntime({})
1939
1943
  await this.waitForTree(120000)
1944
+ await this.waitForTree(30000)
1940
1945
  } else if (this.appStopped) {
1941
1946
  await this.launchShellAppFromHomeIfNeeded(opts)
1942
1947
  await this.reloadGuestAppRuntime({
@@ -1944,12 +1949,13 @@ export class SootSimBridgeFlowRunner {
1944
1949
  initialUrl: null,
1945
1950
  })
1946
1951
  await this.waitForTree(120000)
1952
+ await this.waitForTree(30000)
1947
1953
  } else {
1948
1954
  await this.launchShellAppFromHomeIfNeeded(opts)
1955
+ await this.waitForTree(120000)
1956
+ await this.waitForTree(30000)
1949
1957
  }
1950
- await this.waitForTree(30000)
1951
1958
  } else {
1952
- this.firstLaunchDone = true
1953
1959
  if (wantsClear) {
1954
1960
  await this.resetGuestAppData({
1955
1961
  launchArguments: hasLaunchArguments ? launchArguments : null,
@@ -297,6 +297,14 @@ export const DECLARED_OUTBOUND_CALLS: Record<string, OutboundCallDeclaration> =
297
297
  category: 'same_origin_runtime',
298
298
  count: 1,
299
299
  },
300
+ // the tenant build's built-in app chunk prefetch list and the chunk bodies
301
+ // it names, resolved against the worker chunk's own url.
302
+ 'packages/sootsim-engine/src/render-worker/app-in-worker.tsx :: fetch :: listUrl': {
303
+ category: 'same_origin_runtime',
304
+ count: 1,
305
+ },
306
+ 'packages/sootsim-engine/src/render-worker/app-in-worker.tsx :: fetch :: new URL(file, listUrl)':
307
+ { category: 'same_origin_runtime', count: 1 },
300
308
  'packages/sootsim-engine/src/render-worker/host.ts :: fetch :: msg.fallbackUrl': {
301
309
  category: 'guest_app_network',
302
310
  count: 1,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -33,7 +33,7 @@ __export(backend_origin_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(backend_origin_exports);
35
35
  var DEFAULT_CONTRAST_BACKEND_ORIGIN = "https://contrast.dev";
36
- var LOOPBACK_PROBE_HOSTNAMES = ["::1", "127.0.0.1"];
36
+ var LOOPBACK_PROBE_HOSTNAMES = ["127.0.0.1", "::1"];
37
37
  function normalizeHostname(hostname) {
38
38
  return hostname.replace(/^\[|\]$/g, "").toLowerCase();
39
39
  }
package/dist-lib/beta.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/beta.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/beta.ts
4
4
  var IS_BETA = true;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_MAX_MS = 5e3;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_DEFAULT_MS = 500;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/capture-contract.ts
4
4
  var RNX_SCREEN_CAPTURE_VERSION = 1;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/cloud-contract.ts
4
4
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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;
@@ -30,7 +30,7 @@ __export(dev_bundle_resolution_exports, {
30
30
  module.exports = __toCommonJS(dev_bundle_resolution_exports);
31
31
 
32
32
  // src/backend-origin.ts
33
- var LOOPBACK_PROBE_HOSTNAMES = ["::1", "127.0.0.1"];
33
+ var LOOPBACK_PROBE_HOSTNAMES = ["127.0.0.1", "::1"];
34
34
  function normalizeHostname(hostname) {
35
35
  return hostname.replace(/^\[|\]$/g, "").toLowerCase();
36
36
  }
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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;
@@ -117,7 +117,7 @@ var import_node_fs2 = require("node:fs");
117
117
  var import_node_path3 = require("node:path");
118
118
 
119
119
  // src/backend-origin.ts
120
- var LOOPBACK_PROBE_HOSTNAMES = ["::1", "127.0.0.1"];
120
+ var LOOPBACK_PROBE_HOSTNAMES = ["127.0.0.1", "::1"];
121
121
  function normalizeHostname(hostname) {
122
122
  return hostname.replace(/^\[|\]$/g, "").toLowerCase();
123
123
  }
@@ -3643,6 +3643,19 @@ async function handleFetchProxyRequest(req, res) {
3643
3643
  res.destroy(err instanceof Error ? err : new Error(String(err)));
3644
3644
  return;
3645
3645
  }
3646
+ const norm = normalizeHostname(upstreamUrl.hostname);
3647
+ if (isLoopbackHost(norm) && err?.code === "ECONNREFUSED") {
3648
+ const altHost = norm === "::1" ? "127.0.0.1" : norm === "127.0.0.1" ? "::1" : "127.0.0.1";
3649
+ if (altHost !== norm) {
3650
+ try {
3651
+ const altUrl = new URL(upstreamUrl.href);
3652
+ altUrl.hostname = altHost;
3653
+ await proxy(altUrl, originalMethod, body, 0);
3654
+ return;
3655
+ } catch {
3656
+ }
3657
+ }
3658
+ }
3646
3659
  applyFetchProxyCors(res);
3647
3660
  res.writeHead(502, { "Content-Type": "text/plain" });
3648
3661
  res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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;
@@ -295,6 +295,19 @@ async function handleFetchProxyRequest(req, res) {
295
295
  res.destroy(err instanceof Error ? err : new Error(String(err)));
296
296
  return;
297
297
  }
298
+ const norm = normalizeHostname(upstreamUrl.hostname);
299
+ if (isLoopbackHost(norm) && err?.code === "ECONNREFUSED") {
300
+ const altHost = norm === "::1" ? "127.0.0.1" : norm === "127.0.0.1" ? "::1" : "127.0.0.1";
301
+ if (altHost !== norm) {
302
+ try {
303
+ const altUrl = new URL(upstreamUrl.href);
304
+ altUrl.hostname = altHost;
305
+ await proxy(altUrl, originalMethod, body, 0);
306
+ return;
307
+ } catch {
308
+ }
309
+ }
310
+ }
298
311
  applyFetchProxyCors(res);
299
312
  res.writeHead(502, { "Content-Type": "text/plain" });
300
313
  res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "rnx";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/react-native-host-modules.ts
4
4
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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;
@@ -56,7 +56,7 @@ var import_node_fs2 = require("node:fs");
56
56
  var import_node_path3 = require("node:path");
57
57
 
58
58
  // src/backend-origin.ts
59
- var LOOPBACK_PROBE_HOSTNAMES = ["::1", "127.0.0.1"];
59
+ var LOOPBACK_PROBE_HOSTNAMES = ["127.0.0.1", "::1"];
60
60
  function normalizeHostname(hostname) {
61
61
  return hostname.replace(/^\[|\]$/g, "").toLowerCase();
62
62
  }
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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;
@@ -14473,7 +14473,7 @@ var LOOPBACK_PROBE_HOSTNAMES;
14473
14473
  var init_backend_origin = __esm({
14474
14474
  "src/backend-origin.ts"() {
14475
14475
  "use strict";
14476
- LOOPBACK_PROBE_HOSTNAMES = ["::1", "127.0.0.1"];
14476
+ LOOPBACK_PROBE_HOSTNAMES = ["127.0.0.1", "::1"];
14477
14477
  }
14478
14478
  });
14479
14479
 
@@ -18390,6 +18390,19 @@ async function handleFetchProxyRequest(req, res) {
18390
18390
  res.destroy(err instanceof Error ? err : new Error(String(err)));
18391
18391
  return;
18392
18392
  }
18393
+ const norm = normalizeHostname(upstreamUrl.hostname);
18394
+ if (isLoopbackHost(norm) && err?.code === "ECONNREFUSED") {
18395
+ const altHost = norm === "::1" ? "127.0.0.1" : norm === "127.0.0.1" ? "::1" : "127.0.0.1";
18396
+ if (altHost !== norm) {
18397
+ try {
18398
+ const altUrl = new URL(upstreamUrl.href);
18399
+ altUrl.hostname = altHost;
18400
+ await proxy(altUrl, originalMethod, body, 0);
18401
+ return;
18402
+ } catch {
18403
+ }
18404
+ }
18405
+ }
18393
18406
  applyFetchProxyCors(res);
18394
18407
  res.writeHead(502, { "Content-Type": "text/plain" });
18395
18408
  res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`);
@@ -28779,6 +28792,13 @@ var init_bridge_flow_runner = __esm({
28779
28792
  throw new Error("extendedWaitUntil timed out");
28780
28793
  }
28781
28794
  async reloadGuestApp() {
28795
+ const reloaded = await this.bridge.send({
28796
+ type: "call",
28797
+ simId: this.opts.simId,
28798
+ path: "SootSim.bridges.hotRemount.reloadExternalApp",
28799
+ args: []
28800
+ });
28801
+ if (reloaded) return;
28782
28802
  await this.evaluate("window.location.reload()").catch(() => {
28783
28803
  });
28784
28804
  }
@@ -28842,9 +28862,15 @@ var init_bridge_flow_runner = __esm({
28842
28862
  }
28843
28863
  const wantsClear = !!(opts && typeof opts === "object" && opts.clearState);
28844
28864
  const wantsResetRuntime = readBooleanKey(opts, "resetRuntime");
28845
- if (!this.firstLaunchDone && !wantsClear) {
28865
+ if (!this.firstLaunchDone) {
28846
28866
  this.firstLaunchDone = true;
28847
- if (hasLaunchArguments) {
28867
+ if (wantsClear) {
28868
+ await this.resetGuestAppData({
28869
+ launchArguments: hasLaunchArguments ? launchArguments : null,
28870
+ initialUrl: null
28871
+ });
28872
+ await this.waitForTree(12e4);
28873
+ } else if (hasLaunchArguments) {
28848
28874
  const launched = await this.launchShellAppFromHomeIfNeeded(opts);
28849
28875
  if (launched) await this.waitForTree(12e4);
28850
28876
  await this.reloadGuestAppRuntime({
@@ -28852,11 +28878,13 @@ var init_bridge_flow_runner = __esm({
28852
28878
  initialUrl: null
28853
28879
  });
28854
28880
  await this.waitForTree(12e4);
28881
+ await this.waitForTree(3e4);
28855
28882
  } else if (wantsResetRuntime) {
28856
28883
  const launched = await this.launchShellAppFromHomeIfNeeded(opts);
28857
28884
  if (launched) await this.waitForTree(12e4);
28858
28885
  await this.reloadGuestAppRuntime({});
28859
28886
  await this.waitForTree(12e4);
28887
+ await this.waitForTree(3e4);
28860
28888
  } else if (this.appStopped) {
28861
28889
  await this.launchShellAppFromHomeIfNeeded(opts);
28862
28890
  await this.reloadGuestAppRuntime({
@@ -28864,12 +28892,13 @@ var init_bridge_flow_runner = __esm({
28864
28892
  initialUrl: null
28865
28893
  });
28866
28894
  await this.waitForTree(12e4);
28895
+ await this.waitForTree(3e4);
28867
28896
  } else {
28868
28897
  await this.launchShellAppFromHomeIfNeeded(opts);
28898
+ await this.waitForTree(12e4);
28899
+ await this.waitForTree(3e4);
28869
28900
  }
28870
- await this.waitForTree(3e4);
28871
28901
  } else {
28872
- this.firstLaunchDone = true;
28873
28902
  if (wantsClear) {
28874
28903
  await this.resetGuestAppData({
28875
28904
  launchArguments: hasLaunchArguments ? launchArguments : null,
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.411 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.413 | (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.411",
3
+ "version": "0.1.413",
4
4
  "description": "Vite and Metro plugins, testing drivers, and SDK exports for rnx.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -1,6 +1,6 @@
1
1
  const DEFAULT_CONTRAST_BACKEND_ORIGIN = 'https://contrast.dev'
2
2
 
3
- export const LOOPBACK_PROBE_HOSTNAMES = ['::1', '127.0.0.1'] as const
3
+ export const LOOPBACK_PROBE_HOSTNAMES = ['127.0.0.1', '::1'] as const
4
4
 
5
5
  export function normalizeHostname(hostname: string): string {
6
6
  return hostname.replace(/^\[|\]$/g, '').toLowerCase()
@@ -310,6 +310,19 @@ export async function handleFetchProxyRequest(
310
310
  res.destroy(err instanceof Error ? err : new Error(String(err)))
311
311
  return
312
312
  }
313
+ const norm = normalizeHostname(upstreamUrl.hostname)
314
+ if (isLoopbackHost(norm) && (err as { code?: string })?.code === 'ECONNREFUSED') {
315
+ const altHost =
316
+ norm === '::1' ? '127.0.0.1' : norm === '127.0.0.1' ? '::1' : '127.0.0.1'
317
+ if (altHost !== norm) {
318
+ try {
319
+ const altUrl = new URL(upstreamUrl.href)
320
+ altUrl.hostname = altHost
321
+ await proxy(altUrl, originalMethod, body, 0)
322
+ return
323
+ } catch {}
324
+ }
325
+ }
313
326
  applyFetchProxyCors(res)
314
327
  res.writeHead(502, { 'Content-Type': 'text/plain' })
315
328
  res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`)