rnxsim 0.1.418 → 0.1.420

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 (67) hide show
  1. package/cli/cloud-client.ts +164 -12
  2. package/cli/cloud-dispatch.ts +7 -2
  3. package/cli/commands/box/checkout-plane.ts +78 -40
  4. package/cli/commands/inspect/core.ts +23 -14
  5. package/cli/commands/inspect/wait-ready.ts +2 -0
  6. package/cli/commands/platform.ts +30 -9
  7. package/cli/outbound-endpoints.ts +6 -0
  8. package/cli/self-invocation.ts +2 -2
  9. package/cli/shell-init.ts +1 -1
  10. package/cli/ws-bridge.ts +7 -5
  11. package/dist-lib/agent-daemon-client.cjs +1 -1
  12. package/dist-lib/agent-events.cjs +1 -1
  13. package/dist-lib/agent-identity.cjs +1 -1
  14. package/dist-lib/agent-sessions.cjs +1 -1
  15. package/dist-lib/attached-projects.cjs +1 -1
  16. package/dist-lib/auth/shared-session.cjs +1 -1
  17. package/dist-lib/backend-origin.cjs +1 -1
  18. package/dist-lib/beta.cjs +1 -1
  19. package/dist-lib/beta.mjs +1 -1
  20. package/dist-lib/bridge-constants.cjs +1 -1
  21. package/dist-lib/bridge-contract-input.cjs +1 -1
  22. package/dist-lib/bridge-contract-input.mjs +1 -1
  23. package/dist-lib/bridge-contract.cjs +7 -1
  24. package/dist-lib/bridge-contract.mjs +5 -1
  25. package/dist-lib/capture-contract.cjs +1 -1
  26. package/dist-lib/capture-contract.mjs +1 -1
  27. package/dist-lib/cli-constants.cjs +1 -1
  28. package/dist-lib/cloud-contract.cjs +1 -1
  29. package/dist-lib/cloud-contract.mjs +1 -1
  30. package/dist-lib/config.cjs +1 -1
  31. package/dist-lib/detox/index.cjs +1 -1
  32. package/dist-lib/dev-bundle-resolution.cjs +6 -4
  33. package/dist-lib/home-paths.cjs +1 -1
  34. package/dist-lib/host/bridge-host.cjs +55 -28
  35. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  36. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  37. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  38. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  39. package/dist-lib/host/websocket-proxy.cjs +1 -1
  40. package/dist-lib/index.cjs +14 -7
  41. package/dist-lib/jump-to-source-babel.cjs +1 -1
  42. package/dist-lib/menu.cjs +1 -1
  43. package/dist-lib/menu.mjs +1 -1
  44. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  45. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  46. package/dist-lib/metro-production-bundle.cjs +1 -1
  47. package/dist-lib/metro-production-bundle.mjs +1 -1
  48. package/dist-lib/metro.cjs +4 -3
  49. package/dist-lib/profiles.cjs +1 -1
  50. package/dist-lib/public-brand.cjs +1 -1
  51. package/dist-lib/react-native-host-modules.cjs +1 -1
  52. package/dist-lib/react-native-host-modules.mjs +1 -1
  53. package/dist-lib/render-mode.cjs +1 -1
  54. package/dist-lib/scripts/dev-server-scanner.cjs +9 -6
  55. package/dist-lib/sdk.cjs +6 -3
  56. package/dist-lib/sdk.mjs +6 -3
  57. package/dist-lib/skills.cjs +71 -36
  58. package/dist-lib/vite.cjs +1 -1
  59. package/package.json +1 -1
  60. package/scripts/dev-server-scanner.ts +9 -5
  61. package/src/bridge-contract.ts +3 -0
  62. package/src/dev-bundle-resolution.ts +6 -3
  63. package/src/dev-server-open.ts +3 -2
  64. package/src/host/bridge-host.ts +1 -1
  65. package/src/host/plane-host.ts +1 -1
  66. package/src/native-dev-bundle-url.ts +1 -1
  67. package/src/vite-plugin.ts +1 -1
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/beta.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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;
@@ -22,6 +22,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  // src/bridge-contract.ts
23
23
  var bridge_contract_exports = {};
24
24
  __export(bridge_contract_exports, {
25
+ HEADLESS_TENANT_FETCH_HUNG_MARKER: () => HEADLESS_TENANT_FETCH_HUNG_MARKER,
26
+ PUBLIC_NO_NETWORK_MARKER: () => PUBLIC_NO_NETWORK_MARKER,
25
27
  SEMANTIC_READY_CONTENT_NODE_FLOOR: () => SEMANTIC_READY_CONTENT_NODE_FLOOR,
26
28
  SEMANTIC_READY_NODE_STABLE_MS: () => SEMANTIC_READY_NODE_STABLE_MS,
27
29
  SEMANTIC_READY_POLL_MS: () => SEMANTIC_READY_POLL_MS,
@@ -36,6 +38,8 @@ var SIM_LONG_PRESS_MAX_MS = 5e3;
36
38
  var SEMANTIC_READY_CONTENT_NODE_FLOOR = 100;
37
39
  var SEMANTIC_READY_NODE_STABLE_MS = 750;
38
40
  var SEMANTIC_READY_POLL_MS = 150;
41
+ var PUBLIC_NO_NETWORK_MARKER = "public RNX Cloud simulators have no network";
42
+ var HEADLESS_TENANT_FETCH_HUNG_MARKER = "headless tenant fetch hung";
39
43
  function readyProbeHasContent(probe) {
40
44
  return probe.liveFrameActive || probe.targets > 0 || probe.nodes >= SEMANTIC_READY_CONTENT_NODE_FLOOR;
41
45
  }
@@ -44,6 +48,8 @@ function readyProbeHasTargetContent(probe) {
44
48
  }
45
49
  // Annotate the CommonJS export names for ESM import in node:
46
50
  0 && (module.exports = {
51
+ HEADLESS_TENANT_FETCH_HUNG_MARKER,
52
+ PUBLIC_NO_NETWORK_MARKER,
47
53
  SEMANTIC_READY_CONTENT_NODE_FLOOR,
48
54
  SEMANTIC_READY_NODE_STABLE_MS,
49
55
  SEMANTIC_READY_POLL_MS,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_DEFAULT_MS = 500;
@@ -6,6 +6,8 @@ var SIM_LONG_PRESS_MAX_MS = 5e3;
6
6
  var SEMANTIC_READY_CONTENT_NODE_FLOOR = 100;
7
7
  var SEMANTIC_READY_NODE_STABLE_MS = 750;
8
8
  var SEMANTIC_READY_POLL_MS = 150;
9
+ var PUBLIC_NO_NETWORK_MARKER = "public RNX Cloud simulators have no network";
10
+ var HEADLESS_TENANT_FETCH_HUNG_MARKER = "headless tenant fetch hung";
9
11
  function readyProbeHasContent(probe) {
10
12
  return probe.liveFrameActive || probe.targets > 0 || probe.nodes >= SEMANTIC_READY_CONTENT_NODE_FLOOR;
11
13
  }
@@ -13,6 +15,8 @@ function readyProbeHasTargetContent(probe) {
13
15
  return probe.liveFrameActive || probe.targets > 0;
14
16
  }
15
17
  export {
18
+ HEADLESS_TENANT_FETCH_HUNG_MARKER,
19
+ PUBLIC_NO_NETWORK_MARKER,
16
20
  SEMANTIC_READY_CONTENT_NODE_FLOOR,
17
21
  SEMANTIC_READY_NODE_STABLE_MS,
18
22
  SEMANTIC_READY_POLL_MS,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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;
@@ -169,12 +169,14 @@ async function probeExpoManifest(normalizedBaseUrl, port) {
169
169
  async (res) => res.ok ? { ok: true, body: await res.text() } : null,
170
170
  () => void 0
171
171
  );
172
+ let probeDeadline;
172
173
  const answered = await Promise.race([
173
174
  pending,
174
- new Promise(
175
- (resolve) => setTimeout(() => resolve("timeout"), MANIFEST_PROBE_TIMEOUT_MS).unref?.()
176
- )
175
+ new Promise((resolve) => {
176
+ probeDeadline = setTimeout(() => resolve("timeout"), MANIFEST_PROBE_TIMEOUT_MS);
177
+ })
177
178
  ]);
179
+ clearTimeout(probeDeadline);
178
180
  if (answered === "timeout" || answered === void 0) return { state: "no-answer" };
179
181
  if (answered === null) return { state: "no-manifest" };
180
182
  body = answered.body;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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;
@@ -539,7 +539,7 @@ async function readAppSettingsBundle(projectRoot) {
539
539
  // scripts/dev-server-scanner.ts
540
540
  init_optional_demo_registry();
541
541
  var EXEC_EXIT_GRACE_MS = 2e3;
542
- function execGuarded(command, timeout, extra = {}) {
542
+ async function execGuarded(command, timeout, extra = {}) {
543
543
  let child;
544
544
  const ran = new Promise((resolve2, reject) => {
545
545
  child = (0, import_child_process.exec)(command, { encoding: "utf8", timeout, ...extra }, (err, stdout) => {
@@ -547,16 +547,20 @@ function execGuarded(command, timeout, extra = {}) {
547
547
  else resolve2({ stdout });
548
548
  });
549
549
  });
550
+ let deadlineTimer;
550
551
  const deadline = new Promise((_resolve, reject) => {
551
- const timer = setTimeout(() => {
552
+ deadlineTimer = setTimeout(() => {
552
553
  child?.kill("SIGKILL");
553
554
  const err = new Error(`\`${command}\` did not exit within ${timeout}ms`);
554
555
  Object.assign(err, { killed: true });
555
556
  reject(err);
556
557
  }, timeout + EXEC_EXIT_GRACE_MS);
557
- timer.unref?.();
558
558
  });
559
- return Promise.race([ran, deadline]);
559
+ try {
560
+ return await Promise.race([ran, deadline]);
561
+ } finally {
562
+ clearTimeout(deadlineTimer);
563
+ }
560
564
  }
561
565
  var TIMEOUT_MS = 250;
562
566
  var MANIFEST_TIMEOUT_MS = 1500;
@@ -622,7 +626,6 @@ function httpGet(hostname, port, path12, method = "GET", timeout = TIMEOUT_MS, h
622
626
  req.socket?.unref();
623
627
  }, timeout);
624
628
  const abandon = setTimeout(() => req.destroy(), BODY_TIMEOUT_MS);
625
- abandon.unref?.();
626
629
  req.on("close", () => {
627
630
  clearTimeout(giveUp);
628
631
  clearTimeout(abandon);
@@ -3896,6 +3899,8 @@ var CheckoutRequiresGitError = class extends Error {
3896
3899
  };
3897
3900
  var BINARY_SNIFF_BYTES = 8192;
3898
3901
  var LIST_FILES_TIMEOUT_MS = 1e4;
3902
+ var LIST_FILES_ATTEMPTS = 3;
3903
+ var LIST_FILES_RETRY_MS = 25;
3899
3904
  function looksBinary(filePath, size) {
3900
3905
  if (size === 0) return false;
3901
3906
  let fd;
@@ -3927,33 +3932,55 @@ var CheckoutFilePlane = class {
3927
3932
  index() {
3928
3933
  return this.entries;
3929
3934
  }
3930
- async refresh() {
3931
- let stdout;
3932
- try {
3933
- const args = this.trackedOnly ? ["ls-files", "-z"] : ["ls-files", "-co", "--exclude-standard", "-z"];
3934
- stdout = (0, import_node_child_process4.execFileSync)("git", args, {
3935
- cwd: this.root,
3936
- encoding: "utf8",
3937
- maxBuffer: 64 * 1024 * 1024,
3938
- timeout: this.listTimeoutMs,
3939
- // stating the environment is not redundant here. bun 1.3.14 resolves
3940
- // the binary for the synchronous form against the PATH it captured at
3941
- // startup and ignores a later change to `process.env.PATH`, so without
3942
- // this it runs a different git than every other call in the process.
3943
- env: process.env
3944
- });
3945
- } catch (error) {
3946
- const message = error instanceof Error ? error.message : String(error);
3947
- const killed = error instanceof Error && "signal" in error && error.signal === "SIGTERM";
3948
- throw new CheckoutRequiresGitError(
3949
- killed ? `git did not list the project's files in ${this.root} within ${this.listTimeoutMs / 1e3}s, so the box has no file set to serve. the checkout may be on a stalled filesystem, or this machine may be too loaded to start a subprocess.` : `could not list the project's files with git in ${this.root}: ${message}`
3950
- );
3951
- }
3935
+ listFiles() {
3936
+ const args = this.trackedOnly ? ["ls-files", "-z"] : ["ls-files", "-co", "--exclude-standard", "-z"];
3937
+ const stdout = (0, import_node_child_process4.execFileSync)("git", args, {
3938
+ cwd: this.root,
3939
+ encoding: "utf8",
3940
+ maxBuffer: 64 * 1024 * 1024,
3941
+ timeout: this.listTimeoutMs,
3942
+ // stating the environment is not redundant here. bun 1.3.14 resolves
3943
+ // the binary for the synchronous form against the PATH it captured at
3944
+ // startup and ignores a later change to `process.env.PATH`, so without
3945
+ // this it runs a different git than every other call in the process.
3946
+ env: process.env
3947
+ });
3952
3948
  if (stdout.length === 0) {
3953
3949
  throw new CheckoutRequiresGitError(
3954
3950
  `git listed no ${this.trackedOnly ? "tracked " : ""}files in ${this.root}. either the checkout contains no eligible files, or this machine could not read the child process's output.`
3955
3951
  );
3956
3952
  }
3953
+ return stdout;
3954
+ }
3955
+ async refresh() {
3956
+ let stdout = "";
3957
+ let lastFailure;
3958
+ for (let attempt = 1; attempt <= LIST_FILES_ATTEMPTS; attempt++) {
3959
+ try {
3960
+ stdout = this.listFiles();
3961
+ lastFailure = void 0;
3962
+ break;
3963
+ } catch (error) {
3964
+ if (error instanceof CheckoutRequiresGitError) {
3965
+ lastFailure = error;
3966
+ } else {
3967
+ const message = error instanceof Error ? error.message : String(error);
3968
+ const killed = error instanceof Error && "signal" in error && error.signal === "SIGTERM";
3969
+ lastFailure = new CheckoutRequiresGitError(
3970
+ killed ? `git did not list the project's files in ${this.root} within ${this.listTimeoutMs / 1e3}s, so the box has no file set to serve. the checkout may be on a stalled filesystem, or this machine may be too loaded to start a subprocess.` : `could not list the project's files with git in ${this.root}: ${message}`
3971
+ );
3972
+ }
3973
+ if (attempt < LIST_FILES_ATTEMPTS) {
3974
+ await new Promise(
3975
+ (resolve2) => setTimeout(resolve2, LIST_FILES_RETRY_MS * attempt)
3976
+ );
3977
+ }
3978
+ }
3979
+ }
3980
+ if (lastFailure) {
3981
+ lastFailure.message = `${lastFailure.message} (${LIST_FILES_ATTEMPTS} attempts)`;
3982
+ throw lastFailure;
3983
+ }
3957
3984
  const next = /* @__PURE__ */ new Map();
3958
3985
  const nextSniffed = /* @__PURE__ */ new Map();
3959
3986
  for (const relative of stdout.split("\0")) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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;
@@ -841,15 +841,20 @@ function createBridge(wsPort, opts = {}) {
841
841
  } catch {
842
842
  }
843
843
  ws.close();
844
- setTimeout(() => {
844
+ const terminateGrace = setTimeout(() => {
845
845
  if (ws.readyState !== import_ws.WebSocket.CLOSED) {
846
846
  ws.terminate();
847
847
  }
848
- }, 250).unref();
848
+ }, 250);
849
+ ws.once("close", () => clearTimeout(terminateGrace));
849
850
  }
850
851
  };
851
852
  }
852
853
 
854
+ // src/bridge-contract.ts
855
+ var PUBLIC_NO_NETWORK_MARKER = "public RNX Cloud simulators have no network";
856
+ var HEADLESS_TENANT_FETCH_HUNG_MARKER = "headless tenant fetch hung";
857
+
853
858
  // cli/commands/inspect/core.ts
854
859
  async function inspectTree(bridge, depth = 5) {
855
860
  const result = await bridge.send({
@@ -1315,12 +1320,13 @@ async function inspectFind(bridge, q) {
1315
1320
  }
1316
1321
  function waitReadyReason(status) {
1317
1322
  if (status.bridgeError) {
1318
- if (status.bridgeError.includes("headless tenant fetch hung") || status.bridgeError.includes("public RNX Cloud simulators have no network")) {
1323
+ if (status.bridgeError.includes(HEADLESS_TENANT_FETCH_HUNG_MARKER) || status.bridgeError.includes(PUBLIC_NO_NETWORK_MARKER)) {
1319
1324
  return status.bridgeError;
1320
1325
  }
1321
1326
  return `sim unreachable: ${status.bridgeError} \u2014 the target tab is closed or no sim is connected (check \`rnx list\`, reopen with \`rnx open\`)`;
1322
1327
  }
1323
- const base = status.externalError ? `guest app errored: ${status.externalError}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true && status.targets > 0 ? "native content is rendered but the ready signal has not settled" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
1328
+ const waitingOnGuestFetch = status.externalReady === false && /https?:\/\//.test(status.externalStatus);
1329
+ const base = status.externalError ? `guest app errored: ${status.externalError}` : waitingOnGuestFetch ? `waiting on a guest fetch: ${status.externalStatus}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true && status.targets > 0 ? "native content is rendered but the ready signal has not settled" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
1324
1330
  return !status.externalError && status.suppressedEntryError ? `${base} (suppressed entry error: ${status.suppressedEntryError})` : base;
1325
1331
  }
1326
1332
  async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
@@ -2853,9 +2859,11 @@ function openRnxDesktopWhenMetroIsReady({
2853
2859
  const deadline = Date.now() + timeoutMs;
2854
2860
  return new Promise((resolve2) => {
2855
2861
  let finished = false;
2862
+ let retryTimer;
2856
2863
  const finish = (opened) => {
2857
2864
  if (finished) return;
2858
2865
  finished = true;
2866
+ clearTimeout(retryTimer);
2859
2867
  scheduledMetroOpens.delete(key);
2860
2868
  resolve2(opened);
2861
2869
  };
@@ -2868,8 +2876,7 @@ function openRnxDesktopWhenMetroIsReady({
2868
2876
  finish(false);
2869
2877
  return;
2870
2878
  }
2871
- const timer = setTimeout(check, intervalMs);
2872
- timer.unref();
2879
+ retryTimer = setTimeout(check, intervalMs);
2873
2880
  };
2874
2881
  const check = () => {
2875
2882
  const request = import_node_http.default.get(
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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;
@@ -137,9 +137,11 @@ function openRnxDesktopWhenMetroIsReady({
137
137
  const deadline = Date.now() + timeoutMs;
138
138
  return new Promise((resolve) => {
139
139
  let finished = false;
140
+ let retryTimer;
140
141
  const finish = (opened) => {
141
142
  if (finished) return;
142
143
  finished = true;
144
+ clearTimeout(retryTimer);
143
145
  scheduledMetroOpens.delete(key);
144
146
  resolve(opened);
145
147
  };
@@ -152,8 +154,7 @@ function openRnxDesktopWhenMetroIsReady({
152
154
  finish(false);
153
155
  return;
154
156
  }
155
- const timer = setTimeout(check, intervalMs);
156
- timer.unref();
157
+ retryTimer = setTimeout(check, intervalMs);
157
158
  };
158
159
  const check = () => {
159
160
  const request = import_node_http.default.get(
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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;
@@ -521,7 +521,7 @@ function optionalDemoAppsSync() {
521
521
 
522
522
  // scripts/dev-server-scanner.ts
523
523
  var EXEC_EXIT_GRACE_MS = 2e3;
524
- function execGuarded(command, timeout, extra = {}) {
524
+ async function execGuarded(command, timeout, extra = {}) {
525
525
  let child;
526
526
  const ran = new Promise((resolve2, reject) => {
527
527
  child = (0, import_child_process.exec)(command, { encoding: "utf8", timeout, ...extra }, (err, stdout) => {
@@ -529,16 +529,20 @@ function execGuarded(command, timeout, extra = {}) {
529
529
  else resolve2({ stdout });
530
530
  });
531
531
  });
532
+ let deadlineTimer;
532
533
  const deadline = new Promise((_resolve, reject) => {
533
- const timer = setTimeout(() => {
534
+ deadlineTimer = setTimeout(() => {
534
535
  child?.kill("SIGKILL");
535
536
  const err = new Error(`\`${command}\` did not exit within ${timeout}ms`);
536
537
  Object.assign(err, { killed: true });
537
538
  reject(err);
538
539
  }, timeout + EXEC_EXIT_GRACE_MS);
539
- timer.unref?.();
540
540
  });
541
- return Promise.race([ran, deadline]);
541
+ try {
542
+ return await Promise.race([ran, deadline]);
543
+ } finally {
544
+ clearTimeout(deadlineTimer);
545
+ }
542
546
  }
543
547
  var TIMEOUT_MS = 250;
544
548
  var MANIFEST_TIMEOUT_MS = 1500;
@@ -604,7 +608,6 @@ function httpGet(hostname, port, path, method = "GET", timeout = TIMEOUT_MS, hea
604
608
  req.socket?.unref();
605
609
  }, timeout);
606
610
  const abandon = setTimeout(() => req.destroy(), BODY_TIMEOUT_MS);
607
- abandon.unref?.();
608
611
  req.on("close", () => {
609
612
  clearTimeout(giveUp);
610
613
  clearTimeout(abandon);
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.418 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.420 | (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;
@@ -100,6 +100,8 @@ module.exports = __toCommonJS(sdk_exports);
100
100
 
101
101
  // src/bridge-contract.ts
102
102
  var SEMANTIC_READY_CONTENT_NODE_FLOOR = 100;
103
+ var PUBLIC_NO_NETWORK_MARKER = "public RNX Cloud simulators have no network";
104
+ var HEADLESS_TENANT_FETCH_HUNG_MARKER = "headless tenant fetch hung";
103
105
  function readyProbeHasContent(probe) {
104
106
  return probe.liveFrameActive || probe.targets > 0 || probe.nodes >= SEMANTIC_READY_CONTENT_NODE_FLOOR;
105
107
  }
@@ -723,12 +725,13 @@ function shellEscape(value) {
723
725
  }
724
726
  function waitReadyReason(status) {
725
727
  if (status.bridgeError) {
726
- if (status.bridgeError.includes("headless tenant fetch hung") || status.bridgeError.includes("public RNX Cloud simulators have no network")) {
728
+ if (status.bridgeError.includes(HEADLESS_TENANT_FETCH_HUNG_MARKER) || status.bridgeError.includes(PUBLIC_NO_NETWORK_MARKER)) {
727
729
  return status.bridgeError;
728
730
  }
729
731
  return `sim unreachable: ${status.bridgeError} \u2014 the target tab is closed or no sim is connected (check \`rnx list\`, reopen with \`rnx open\`)`;
730
732
  }
731
- const base = status.externalError ? `guest app errored: ${status.externalError}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true && status.targets > 0 ? "native content is rendered but the ready signal has not settled" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
733
+ const waitingOnGuestFetch = status.externalReady === false && /https?:\/\//.test(status.externalStatus);
734
+ const base = status.externalError ? `guest app errored: ${status.externalError}` : waitingOnGuestFetch ? `waiting on a guest fetch: ${status.externalStatus}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true && status.targets > 0 ? "native content is rendered but the ready signal has not settled" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
732
735
  return !status.externalError && status.suppressedEntryError ? `${base} (suppressed entry error: ${status.suppressedEntryError})` : base;
733
736
  }
734
737
  async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {