rnxsim 0.1.452 → 0.1.454

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 (63) hide show
  1. package/cli/bridge-flow-runner.ts +41 -13
  2. package/cli/cloud-client.ts +10 -0
  3. package/cli/commands/control.ts +52 -7
  4. package/cli/commands/flow.ts +1 -5
  5. package/cli/commands/inspect/settling.ts +35 -3
  6. package/cli/drivers/playwright.ts +2 -4
  7. package/cli/ws-bridge.ts +72 -5
  8. package/detox/proof-frame.cjs +2 -5
  9. package/dist-lib/agent-daemon-client.cjs +1 -1
  10. package/dist-lib/agent-events.cjs +1 -1
  11. package/dist-lib/agent-identity.cjs +1 -1
  12. package/dist-lib/agent-sessions.cjs +1 -1
  13. package/dist-lib/attached-projects.cjs +1 -1
  14. package/dist-lib/auth/shared-session.cjs +1 -1
  15. package/dist-lib/backend-origin.cjs +1 -1
  16. package/dist-lib/beta.cjs +1 -1
  17. package/dist-lib/beta.mjs +1 -1
  18. package/dist-lib/bridge-constants.cjs +1 -1
  19. package/dist-lib/bridge-contract-input.cjs +1 -1
  20. package/dist-lib/bridge-contract-input.mjs +1 -1
  21. package/dist-lib/bridge-contract.cjs +1 -1
  22. package/dist-lib/bridge-contract.mjs +1 -1
  23. package/dist-lib/capture-contract.cjs +1 -1
  24. package/dist-lib/capture-contract.mjs +1 -1
  25. package/dist-lib/cli-constants.cjs +1 -1
  26. package/dist-lib/cloud-contract.cjs +1 -1
  27. package/dist-lib/cloud-contract.mjs +1 -1
  28. package/dist-lib/cloud.cjs +1 -1
  29. package/dist-lib/cloud.mjs +1 -1
  30. package/dist-lib/config.cjs +1 -1
  31. package/dist-lib/detox/index.cjs +2 -4
  32. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  33. package/dist-lib/home-paths.cjs +1 -1
  34. package/dist-lib/host/bridge-host.cjs +1 -1
  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 +89 -8
  41. package/dist-lib/jump-to-source-babel.cjs +1 -1
  42. package/dist-lib/jump-to-source-native.cjs +1 -1
  43. package/dist-lib/menu.cjs +1 -1
  44. package/dist-lib/menu.mjs +1 -1
  45. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  46. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  47. package/dist-lib/metro-production-bundle.cjs +1 -1
  48. package/dist-lib/metro-production-bundle.mjs +1 -1
  49. package/dist-lib/metro.cjs +1 -1
  50. package/dist-lib/profiles.cjs +1 -1
  51. package/dist-lib/public-brand.cjs +1 -1
  52. package/dist-lib/react-native-host-modules.cjs +1 -1
  53. package/dist-lib/react-native-host-modules.mjs +1 -1
  54. package/dist-lib/render-mode.cjs +1 -1
  55. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  56. package/dist-lib/sdk.cjs +35 -5
  57. package/dist-lib/sdk.mjs +35 -5
  58. package/dist-lib/skills.cjs +190 -44
  59. package/dist-lib/vite.cjs +1 -1
  60. package/package.json +1 -1
  61. package/src/flow-timeout-scale.ts +15 -0
  62. package/src/playwright-host-log.ts +16 -0
  63. package/src/sim-client.ts +4 -0
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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;
@@ -159,9 +159,7 @@ var require_proof_frame = __commonJS({
159
159
  throw new Error("proof content measurement needs RGBA pixels and dimensions");
160
160
  }
161
161
  const yStart = Math.floor(height * PROOF_CONTENT_DEFINITION.contentBandInsetFraction);
162
- const yEnd = Math.ceil(
163
- height * (1 - PROOF_CONTENT_DEFINITION.contentBandInsetFraction)
164
- );
162
+ const yEnd = Math.ceil(height * (1 - PROOF_CONTENT_DEFINITION.contentBandInsetFraction));
165
163
  const bucketCounts = new Uint32Array(32 * 32 * 32);
166
164
  let totalPixels = 0;
167
165
  for (let y = yStart; y < yEnd; y++) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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;
@@ -349,6 +349,16 @@ function readCurrentTarget() {
349
349
  function readCurrentSimId() {
350
350
  return readCurrentTarget()?.simId ?? null;
351
351
  }
352
+ function saveCurrentSimId(simId) {
353
+ const normalized = simId.trim();
354
+ if (!normalized) return;
355
+ writeSecureJsonAtomic(getCurrentSimPath(), {
356
+ version: CURRENT_SIM_VERSION,
357
+ plane: "local",
358
+ simId: normalized,
359
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
360
+ });
361
+ }
352
362
  function clearCurrentSimId() {
353
363
  (0, import_fs2.rmSync)(getCurrentSimPath(), { force: true });
354
364
  }
@@ -752,6 +762,15 @@ function createBridge(wsPort, opts = {}) {
752
762
  });
753
763
  let warnedAboutContention = false;
754
764
  let noticedTarget = false;
765
+ let pinnedHostPid = null;
766
+ let lineageLookupInFlight = false;
767
+ function pickReloadedSuccessor(sims, retiredSimId) {
768
+ if (pinnedHostPid === null) return null;
769
+ const successors = (Array.isArray(sims) ? sims : []).filter(
770
+ (sim) => sim.id !== retiredSimId && sim.readyState === "open" && sim.meta?.sootsimHostPid === pinnedHostPid
771
+ );
772
+ return successors.length === 1 ? successors[0].id : null;
773
+ }
755
774
  function maybeNoticeTarget(cmdType, simId) {
756
775
  if (noticedTarget) return;
757
776
  if (process.env.SOOTSIM_QUIET_TARGET_NOTICE === "1") return;
@@ -807,7 +826,7 @@ function createBridge(wsPort, opts = {}) {
807
826
  plane: "local",
808
827
  async send(cmd, callOpts) {
809
828
  const effectiveTimeoutMs = callOpts?.timeoutMs ?? commandTimeoutMs;
810
- const sendOnce = async (defaultSimId) => {
829
+ const sendOnce = async (defaultSimId, cmdOverride) => {
811
830
  await ready;
812
831
  const id = nextId++;
813
832
  return new Promise((resolve3, reject) => {
@@ -829,7 +848,7 @@ function createBridge(wsPort, opts = {}) {
829
848
  reject(e);
830
849
  }
831
850
  });
832
- const payload = { ...cmd, id };
851
+ const payload = { ...cmdOverride ?? cmd, id };
833
852
  if (payload.simId === void 0 && defaultSimId) {
834
853
  payload.simId = defaultSimId;
835
854
  }
@@ -839,11 +858,36 @@ function createBridge(wsPort, opts = {}) {
839
858
  };
840
859
  const sentSimId = opts.simIdSource === "flag" ? opts.simId : readCurrentSimId() ?? opts.simId;
841
860
  try {
842
- return await sendOnce(sentSimId);
861
+ const result = await sendOnce(sentSimId);
862
+ if (sentSimId && pinnedHostPid === null && !lineageLookupInFlight) {
863
+ lineageLookupInFlight = true;
864
+ void sendOnce(void 0, { type: "bridge:list-sims" }).then((sims) => {
865
+ if (!Array.isArray(sims)) return;
866
+ const pinned = sims.find((sim) => sim.id === sentSimId);
867
+ const hostPid = pinned?.meta?.sootsimHostPid;
868
+ if (typeof hostPid === "number") pinnedHostPid = hostPid;
869
+ }).catch(() => {
870
+ }).finally(() => {
871
+ lineageLookupInFlight = false;
872
+ });
873
+ }
874
+ return result;
843
875
  } catch (error) {
844
876
  const message = error instanceof Error ? error.message : String(error);
845
877
  const missingSimMessage = `no sim connected with id ${sentSimId}`;
846
878
  if (opts.simIdSource !== "flag" && sentSimId && cmd.simId === void 0 && (message === missingSimMessage || message.startsWith(`${missingSimMessage};`))) {
879
+ const successor = pickReloadedSuccessor(
880
+ await sendOnce(void 0, { type: "bridge:list-sims" }),
881
+ sentSimId
882
+ );
883
+ if (successor) {
884
+ saveCurrentSimId(successor);
885
+ process.stderr.write(
886
+ ` note: sim ${sentSimId} reloaded and reconnected as ${successor}; following it
887
+ `
888
+ );
889
+ return sendOnce(successor);
890
+ }
847
891
  clearCurrentSimId();
848
892
  throw new Error(
849
893
  `saved sim ${sentSimId} is gone${message.slice(missingSimMessage.length)}; run \`rnx list\` and \`rnx use <sim>\`, or open a fresh sim`
@@ -856,6 +900,13 @@ function createBridge(wsPort, opts = {}) {
856
900
  const sims = await this.send({ type: "bridge:list-sims" });
857
901
  return Array.isArray(sims) ? sims : [];
858
902
  },
903
+ // a caller holding its own pinned sim id (a flow runner sets simId on every
904
+ // command, so it never reaches the pin-following path in send) asks here
905
+ // after a reload retires that id. null means nothing proves what replaced
906
+ // it, and the caller must fail rather than guess.
907
+ async resolveReloadedSim(retiredSimId) {
908
+ return pickReloadedSuccessor(await this.listSims(), retiredSimId);
909
+ },
859
910
  async focusSim(simId) {
860
911
  return this.send({ type: "focus", simId });
861
912
  },
@@ -1694,8 +1745,19 @@ async function waitForSootsimIdle({
1694
1745
  let lastRequestTotal = -1
1695
1746
  let stable = 0
1696
1747
  let visuallyStillSince = 0
1748
+ // counts across the whole budget: a flag that is true on every poll is a
1749
+ // different bug from one that is true intermittently, and the two need
1750
+ // opposite fixes (engine vs budget).
1751
+ let polls = 0
1752
+ let dirtyPolls = 0
1753
+ let animatingPolls = 0
1754
+ let layoutChangedPolls = 0
1697
1755
  while (Date.now() < deadline) {
1698
1756
  const snapshot = await readSnapshot()
1757
+ polls++
1758
+ if (snapshot.layoutDirty) dirtyPolls++
1759
+ if (snapshot.animating) animatingPolls++
1760
+ if (polls > 1 && snapshot.layout !== lastLayout) layoutChangedPolls++
1699
1761
  const strictOk =
1700
1762
  !strict ||
1701
1763
  (snapshot.renderStatsAvailable && !snapshot.animating && !snapshot.layoutDirty)
@@ -1716,7 +1778,7 @@ async function waitForSootsimIdle({
1716
1778
  stable >= requiredStablePolls &&
1717
1779
  (networkQuiet || Date.now() - visuallyStillSince >= networkQuietGraceMs)
1718
1780
  ) {
1719
- return { settled: true, elapsed: Date.now() - start }
1781
+ return { settled: true, elapsed: Date.now() - start, blockedBy: '' }
1720
1782
  }
1721
1783
  } else {
1722
1784
  stable = 0
@@ -1726,17 +1788,33 @@ async function waitForSootsimIdle({
1726
1788
  lastRequestTotal = snapshot.requestTotal
1727
1789
  await sleep(pollMs)
1728
1790
  }
1729
- return { settled: false, elapsed: Date.now() - start }
1791
+ const last = await readSnapshot()
1792
+ const blockers = []
1793
+ if (strict && !last.renderStatsAvailable) blockers.push('render stats unavailable')
1794
+ if (last.animating) blockers.push('animations still running')
1795
+ if (last.layoutDirty) blockers.push('layout still dirty')
1796
+ if (last.pendingFetches > 0) blockers.push(last.pendingFetches + ' image fetches pending')
1797
+ if (last.layout !== lastLayout) blockers.push('layout still changing')
1798
+ if (last.requestInFlight > 0) blockers.push(last.requestInFlight + ' requests in flight')
1799
+ return {
1800
+ settled: false,
1801
+ elapsed: Date.now() - start,
1802
+ blockedBy:
1803
+ (blockers.length ? blockers.join(', ') : 'unknown') +
1804
+ ' over ' + polls + ' polls (layout changed ' + layoutChangedPolls +
1805
+ 'x, layoutDirty ' + dirtyPolls + 'x, animating ' + animatingPolls + 'x)',
1806
+ }
1730
1807
  })()`
1731
1808
  },
1732
1809
  {
1733
1810
  timeoutMs: maxMs + 1e3
1734
1811
  }
1735
1812
  );
1736
- const { elapsed, settled } = result ?? {};
1813
+ const { elapsed, settled, blockedBy } = result ?? {};
1737
1814
  return {
1738
1815
  elapsed: typeof elapsed === "number" ? elapsed : maxMs,
1739
- settled: settled === true
1816
+ settled: settled === true,
1817
+ blockedBy: typeof blockedBy === "string" ? blockedBy : "unknown"
1740
1818
  };
1741
1819
  }
1742
1820
 
@@ -2231,6 +2309,9 @@ var SimClient = class {
2231
2309
  listSims() {
2232
2310
  return this.bridge.listSims();
2233
2311
  }
2312
+ resolveReloadedSim(retiredSimId) {
2313
+ return this.bridge.resolveReloadedSim(retiredSimId);
2314
+ }
2234
2315
  focusSim(simId = this.simId) {
2235
2316
  return this.bridge.focusSim(simId);
2236
2317
  }
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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;
@@ -1464,8 +1464,19 @@ async function waitForSootsimIdle({
1464
1464
  let lastRequestTotal = -1
1465
1465
  let stable = 0
1466
1466
  let visuallyStillSince = 0
1467
+ // counts across the whole budget: a flag that is true on every poll is a
1468
+ // different bug from one that is true intermittently, and the two need
1469
+ // opposite fixes (engine vs budget).
1470
+ let polls = 0
1471
+ let dirtyPolls = 0
1472
+ let animatingPolls = 0
1473
+ let layoutChangedPolls = 0
1467
1474
  while (Date.now() < deadline) {
1468
1475
  const snapshot = await readSnapshot()
1476
+ polls++
1477
+ if (snapshot.layoutDirty) dirtyPolls++
1478
+ if (snapshot.animating) animatingPolls++
1479
+ if (polls > 1 && snapshot.layout !== lastLayout) layoutChangedPolls++
1469
1480
  const strictOk =
1470
1481
  !strict ||
1471
1482
  (snapshot.renderStatsAvailable && !snapshot.animating && !snapshot.layoutDirty)
@@ -1486,7 +1497,7 @@ async function waitForSootsimIdle({
1486
1497
  stable >= requiredStablePolls &&
1487
1498
  (networkQuiet || Date.now() - visuallyStillSince >= networkQuietGraceMs)
1488
1499
  ) {
1489
- return { settled: true, elapsed: Date.now() - start }
1500
+ return { settled: true, elapsed: Date.now() - start, blockedBy: '' }
1490
1501
  }
1491
1502
  } else {
1492
1503
  stable = 0
@@ -1496,17 +1507,33 @@ async function waitForSootsimIdle({
1496
1507
  lastRequestTotal = snapshot.requestTotal
1497
1508
  await sleep(pollMs)
1498
1509
  }
1499
- return { settled: false, elapsed: Date.now() - start }
1510
+ const last = await readSnapshot()
1511
+ const blockers = []
1512
+ if (strict && !last.renderStatsAvailable) blockers.push('render stats unavailable')
1513
+ if (last.animating) blockers.push('animations still running')
1514
+ if (last.layoutDirty) blockers.push('layout still dirty')
1515
+ if (last.pendingFetches > 0) blockers.push(last.pendingFetches + ' image fetches pending')
1516
+ if (last.layout !== lastLayout) blockers.push('layout still changing')
1517
+ if (last.requestInFlight > 0) blockers.push(last.requestInFlight + ' requests in flight')
1518
+ return {
1519
+ settled: false,
1520
+ elapsed: Date.now() - start,
1521
+ blockedBy:
1522
+ (blockers.length ? blockers.join(', ') : 'unknown') +
1523
+ ' over ' + polls + ' polls (layout changed ' + layoutChangedPolls +
1524
+ 'x, layoutDirty ' + dirtyPolls + 'x, animating ' + animatingPolls + 'x)',
1525
+ }
1500
1526
  })()`
1501
1527
  },
1502
1528
  {
1503
1529
  timeoutMs: maxMs + 1e3
1504
1530
  }
1505
1531
  );
1506
- const { elapsed, settled } = result ?? {};
1532
+ const { elapsed, settled, blockedBy } = result ?? {};
1507
1533
  return {
1508
1534
  elapsed: typeof elapsed === "number" ? elapsed : maxMs,
1509
- settled: settled === true
1535
+ settled: settled === true,
1536
+ blockedBy: typeof blockedBy === "string" ? blockedBy : "unknown"
1510
1537
  };
1511
1538
  }
1512
1539
 
@@ -2001,6 +2028,9 @@ var SimClient = class {
2001
2028
  listSims() {
2002
2029
  return this.bridge.listSims();
2003
2030
  }
2031
+ resolveReloadedSim(retiredSimId) {
2032
+ return this.bridge.resolveReloadedSim(retiredSimId);
2033
+ }
2004
2034
  focusSim(simId = this.simId) {
2005
2035
  return this.bridge.focusSim(simId);
2006
2036
  }
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.452 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.454 | (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);
@@ -1368,8 +1368,19 @@ async function waitForSootsimIdle({
1368
1368
  let lastRequestTotal = -1
1369
1369
  let stable = 0
1370
1370
  let visuallyStillSince = 0
1371
+ // counts across the whole budget: a flag that is true on every poll is a
1372
+ // different bug from one that is true intermittently, and the two need
1373
+ // opposite fixes (engine vs budget).
1374
+ let polls = 0
1375
+ let dirtyPolls = 0
1376
+ let animatingPolls = 0
1377
+ let layoutChangedPolls = 0
1371
1378
  while (Date.now() < deadline) {
1372
1379
  const snapshot = await readSnapshot()
1380
+ polls++
1381
+ if (snapshot.layoutDirty) dirtyPolls++
1382
+ if (snapshot.animating) animatingPolls++
1383
+ if (polls > 1 && snapshot.layout !== lastLayout) layoutChangedPolls++
1373
1384
  const strictOk =
1374
1385
  !strict ||
1375
1386
  (snapshot.renderStatsAvailable && !snapshot.animating && !snapshot.layoutDirty)
@@ -1390,7 +1401,7 @@ async function waitForSootsimIdle({
1390
1401
  stable >= requiredStablePolls &&
1391
1402
  (networkQuiet || Date.now() - visuallyStillSince >= networkQuietGraceMs)
1392
1403
  ) {
1393
- return { settled: true, elapsed: Date.now() - start }
1404
+ return { settled: true, elapsed: Date.now() - start, blockedBy: '' }
1394
1405
  }
1395
1406
  } else {
1396
1407
  stable = 0
@@ -1400,17 +1411,33 @@ async function waitForSootsimIdle({
1400
1411
  lastRequestTotal = snapshot.requestTotal
1401
1412
  await sleep(pollMs)
1402
1413
  }
1403
- return { settled: false, elapsed: Date.now() - start }
1414
+ const last = await readSnapshot()
1415
+ const blockers = []
1416
+ if (strict && !last.renderStatsAvailable) blockers.push('render stats unavailable')
1417
+ if (last.animating) blockers.push('animations still running')
1418
+ if (last.layoutDirty) blockers.push('layout still dirty')
1419
+ if (last.pendingFetches > 0) blockers.push(last.pendingFetches + ' image fetches pending')
1420
+ if (last.layout !== lastLayout) blockers.push('layout still changing')
1421
+ if (last.requestInFlight > 0) blockers.push(last.requestInFlight + ' requests in flight')
1422
+ return {
1423
+ settled: false,
1424
+ elapsed: Date.now() - start,
1425
+ blockedBy:
1426
+ (blockers.length ? blockers.join(', ') : 'unknown') +
1427
+ ' over ' + polls + ' polls (layout changed ' + layoutChangedPolls +
1428
+ 'x, layoutDirty ' + dirtyPolls + 'x, animating ' + animatingPolls + 'x)',
1429
+ }
1404
1430
  })()`
1405
1431
  },
1406
1432
  {
1407
1433
  timeoutMs: maxMs + 1e3
1408
1434
  }
1409
1435
  );
1410
- const { elapsed, settled } = result ?? {};
1436
+ const { elapsed, settled, blockedBy } = result ?? {};
1411
1437
  return {
1412
1438
  elapsed: typeof elapsed === "number" ? elapsed : maxMs,
1413
- settled: settled === true
1439
+ settled: settled === true,
1440
+ blockedBy: typeof blockedBy === "string" ? blockedBy : "unknown"
1414
1441
  };
1415
1442
  }
1416
1443
 
@@ -1905,6 +1932,9 @@ var SimClient = class {
1905
1932
  listSims() {
1906
1933
  return this.bridge.listSims();
1907
1934
  }
1935
+ resolveReloadedSim(retiredSimId) {
1936
+ return this.bridge.resolveReloadedSim(retiredSimId);
1937
+ }
1908
1938
  focusSim(simId = this.simId) {
1909
1939
  return this.bridge.focusSim(simId);
1910
1940
  }