rnxsim 0.1.459 → 0.1.460

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 (54) hide show
  1. package/cli/drivers/playwright-sim-host.ts +24 -0
  2. package/dist-lib/agent-daemon-client.cjs +1 -1
  3. package/dist-lib/agent-events.cjs +1 -1
  4. package/dist-lib/agent-identity.cjs +1 -1
  5. package/dist-lib/agent-sessions.cjs +1 -1
  6. package/dist-lib/attached-projects.cjs +1 -1
  7. package/dist-lib/auth/shared-session.cjs +1 -1
  8. package/dist-lib/backend-origin.cjs +1 -1
  9. package/dist-lib/beta.cjs +1 -1
  10. package/dist-lib/beta.mjs +1 -1
  11. package/dist-lib/bridge-constants.cjs +1 -1
  12. package/dist-lib/bridge-contract-input.cjs +1 -1
  13. package/dist-lib/bridge-contract-input.mjs +1 -1
  14. package/dist-lib/bridge-contract.cjs +1 -1
  15. package/dist-lib/bridge-contract.mjs +1 -1
  16. package/dist-lib/capture-contract.cjs +1 -1
  17. package/dist-lib/capture-contract.mjs +1 -1
  18. package/dist-lib/cli-constants.cjs +1 -1
  19. package/dist-lib/cloud-contract.cjs +1 -1
  20. package/dist-lib/cloud-contract.mjs +1 -1
  21. package/dist-lib/cloud.cjs +1 -1
  22. package/dist-lib/cloud.mjs +1 -1
  23. package/dist-lib/config.cjs +1 -1
  24. package/dist-lib/detox/index.cjs +1 -1
  25. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  26. package/dist-lib/home-paths.cjs +1 -1
  27. package/dist-lib/host/bridge-host.cjs +12 -7
  28. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  29. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  30. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  31. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  32. package/dist-lib/host/websocket-proxy.cjs +1 -1
  33. package/dist-lib/index.cjs +1 -1
  34. package/dist-lib/jump-to-source-babel.cjs +1 -1
  35. package/dist-lib/jump-to-source-native.cjs +1 -1
  36. package/dist-lib/menu.cjs +1 -1
  37. package/dist-lib/menu.mjs +1 -1
  38. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  39. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  40. package/dist-lib/metro-production-bundle.cjs +1 -1
  41. package/dist-lib/metro-production-bundle.mjs +1 -1
  42. package/dist-lib/metro.cjs +1 -1
  43. package/dist-lib/profiles.cjs +1 -1
  44. package/dist-lib/public-brand.cjs +1 -1
  45. package/dist-lib/react-native-host-modules.cjs +1 -1
  46. package/dist-lib/react-native-host-modules.mjs +1 -1
  47. package/dist-lib/render-mode.cjs +1 -1
  48. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  49. package/dist-lib/sdk.cjs +1 -1
  50. package/dist-lib/sdk.mjs +1 -1
  51. package/dist-lib/skills.cjs +16 -17
  52. package/dist-lib/vite.cjs +1 -1
  53. package/package.json +1 -1
  54. package/src/host/bridge-host.ts +14 -8
@@ -1,3 +1,7 @@
1
+ import {
2
+ readBrowserCompositeCaptureRequest,
3
+ resolveBrowserCompositeCdpClip,
4
+ } from '../../../sootsim-engine/src/capture/browser-composite'
1
5
  // the detached browser host, as CJS source.
2
6
  //
3
7
  // it resolves playwright from the absolute path the driver hands it, launches
@@ -66,6 +70,8 @@ const { existsSync, mkdtempSync, readdirSync, rmSync, unlinkSync } = require('fs
66
70
  const { execSync } = require('child_process');
67
71
  const { tmpdir } = require('os');
68
72
  const { join } = require('path');
73
+ const readBrowserCompositeCaptureRequest = ${readBrowserCompositeCaptureRequest.toString()};
74
+ const resolveBrowserCompositeCdpClip = ${resolveBrowserCompositeCdpClip.toString()};
69
75
  // chrome tree reaper — playwright's browser.close() and even SIGKILLing the
70
76
  // root chrome process do NOT reliably take down the helper tree (gpu, renderer,
71
77
  // network/storage utilities). they reparent to launchd/init and survive, each
@@ -422,6 +428,24 @@ const cleanupProfile = () => {
422
428
  await context.exposeBinding('__sootsimHostClose', async () => {
423
429
  await shutdown(0);
424
430
  });
431
+ await context.exposeBinding('__sootsimHostCapture', async (source, value) => {
432
+ const request = readBrowserCompositeCaptureRequest(value);
433
+ const session = await source.page.context().newCDPSession(source.page);
434
+ try {
435
+ const result = await session.send('Page.captureScreenshot', {
436
+ format: 'png',
437
+ fromSurface: true,
438
+ captureBeyondViewport: true,
439
+ clip: resolveBrowserCompositeCdpClip(
440
+ request,
441
+ await session.send('Page.getLayoutMetrics'),
442
+ ),
443
+ });
444
+ return 'data:image/png;base64,' + result.data;
445
+ } finally {
446
+ await session.detach();
447
+ }
448
+ });
425
449
  const connectTimeoutMs = Number(process.env.SOOTSIM_PW_CONNECT_TIMEOUT_MS || 120000);
426
450
  if (connectAckFile) {
427
451
  connectAckPoll = setInterval(() => {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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;
@@ -8732,7 +8732,7 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
8732
8732
  inflightScan = null;
8733
8733
  static SCAN_FRESH_MS = 2e3;
8734
8734
  constructor(opts = {}) {
8735
- this.preferredPort = opts.port || DEFAULT_SOOTSIM_BRIDGE_PORT;
8735
+ this.preferredPort = opts.port ?? DEFAULT_SOOTSIM_BRIDGE_PORT;
8736
8736
  this.port = this.preferredPort;
8737
8737
  this.shouldWriteLockfile = opts.writeLockfile === true;
8738
8738
  this.shouldWriteDevLockfile = opts.writeDevLockfile === true;
@@ -8782,9 +8782,9 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
8782
8782
  for (let attempt = 0; attempt < this.portFallbackCount; attempt++) {
8783
8783
  const candidate = this.preferredPort + attempt;
8784
8784
  try {
8785
- await this.bindOnce(candidate, options?.silent === true);
8786
- this.effectivePort = candidate;
8787
- this.port = candidate;
8785
+ const boundPort = await this.bindOnce(candidate, options?.silent === true);
8786
+ this.effectivePort = boundPort;
8787
+ this.port = boundPort;
8788
8788
  this.startedAt = Date.now();
8789
8789
  if (attempt > 0 && !options?.silent) {
8790
8790
  process.stderr.write(
@@ -8793,7 +8793,7 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
8793
8793
  );
8794
8794
  }
8795
8795
  this.afterBind();
8796
- return candidate;
8796
+ return boundPort;
8797
8797
  } catch (err) {
8798
8798
  const e = err;
8799
8799
  if (e?.code !== "EADDRINUSE") {
@@ -8829,6 +8829,11 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
8829
8829
  server.once("error", onError);
8830
8830
  server.listen(port, "127.0.0.1", () => {
8831
8831
  if (settled) return;
8832
+ const address = server.address();
8833
+ if (!address || typeof address === "string") {
8834
+ onError(new Error("ws bridge has no bound TCP address"));
8835
+ return;
8836
+ }
8832
8837
  settled = true;
8833
8838
  server.removeListener("error", onError);
8834
8839
  server.on("error", (err) => {
@@ -8844,7 +8849,7 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
8844
8849
  this.wss?.emit("connection", ws, req);
8845
8850
  });
8846
8851
  });
8847
- resolve5();
8852
+ resolve5(address.port);
8848
8853
  });
8849
8854
  });
8850
8855
  }
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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;
@@ -4005,7 +4005,7 @@ var init_supported_native_packages = __esm({
4005
4005
  "@react-native-documents/viewer",
4006
4006
  // seam
4007
4007
  "@react-native-firebase/analytics",
4008
- // seam+coverage
4008
+ // coverage
4009
4009
  "@react-native-firebase/app",
4010
4010
  // seam+coverage
4011
4011
  "@react-native-firebase/auth",
@@ -4023,7 +4023,7 @@ var init_supported_native_packages = __esm({
4023
4023
  "@react-native-masked-view/masked-view",
4024
4024
  // preset+coverage
4025
4025
  "@react-native-menu/menu",
4026
- // seam+coverage
4026
+ // coverage
4027
4027
  "@react-native-ml-kit/barcode-scanning",
4028
4028
  // seam
4029
4029
  "@react-native-picker/picker",
@@ -4059,7 +4059,7 @@ var init_supported_native_packages = __esm({
4059
4059
  "@shopify/flash-list",
4060
4060
  // coverage
4061
4061
  "@shopify/react-native-performance",
4062
- // seam+coverage
4062
+ // coverage
4063
4063
  "@shopify/react-native-skia",
4064
4064
  // preset+coverage
4065
4065
  "@simform_solutions/react-native-audio-waveform",
@@ -4214,8 +4214,6 @@ var init_supported_native_packages = __esm({
4214
4214
  // visual-proof+coverage
4215
4215
  "expo-sensors",
4216
4216
  // visual-proof
4217
- "expo-share-extension",
4218
- // seam
4219
4217
  "expo-sharing",
4220
4218
  // visual-proof
4221
4219
  "expo-sms",
@@ -4228,8 +4226,6 @@ var init_supported_native_packages = __esm({
4228
4226
  // visual-proof+coverage
4229
4227
  "expo-sqlite",
4230
4228
  // preset+coverage
4231
- "expo-squircle-view",
4232
- // seam
4233
4229
  "expo-store-review",
4234
4230
  // visual-proof+coverage
4235
4231
  "expo-symbols",
@@ -4241,7 +4237,7 @@ var init_supported_native_packages = __esm({
4241
4237
  "expo-testflight",
4242
4238
  // seam+coverage
4243
4239
  "expo-tracking-transparency",
4244
- // visual-proof+seam+coverage
4240
+ // visual-proof+coverage
4245
4241
  "expo-updates",
4246
4242
  // preset+seam+coverage
4247
4243
  "expo-video",
@@ -4396,8 +4392,6 @@ var init_supported_native_packages = __esm({
4396
4392
  // coverage
4397
4393
  "react-native-fast-secure-storage",
4398
4394
  // seam+coverage
4399
- "react-native-fast-squircle",
4400
- // seam
4401
4395
  "react-native-fast-trie",
4402
4396
  // seam+coverage
4403
4397
  "react-native-fbsdk-next",
@@ -27738,7 +27732,7 @@ var init_bridge_host = __esm({
27738
27732
  inflightScan = null;
27739
27733
  static SCAN_FRESH_MS = 2e3;
27740
27734
  constructor(opts = {}) {
27741
- this.preferredPort = opts.port || DEFAULT_SOOTSIM_BRIDGE_PORT;
27735
+ this.preferredPort = opts.port ?? DEFAULT_SOOTSIM_BRIDGE_PORT;
27742
27736
  this.port = this.preferredPort;
27743
27737
  this.shouldWriteLockfile = opts.writeLockfile === true;
27744
27738
  this.shouldWriteDevLockfile = opts.writeDevLockfile === true;
@@ -27788,9 +27782,9 @@ var init_bridge_host = __esm({
27788
27782
  for (let attempt = 0; attempt < this.portFallbackCount; attempt++) {
27789
27783
  const candidate = this.preferredPort + attempt;
27790
27784
  try {
27791
- await this.bindOnce(candidate, options?.silent === true);
27792
- this.effectivePort = candidate;
27793
- this.port = candidate;
27785
+ const boundPort = await this.bindOnce(candidate, options?.silent === true);
27786
+ this.effectivePort = boundPort;
27787
+ this.port = boundPort;
27794
27788
  this.startedAt = Date.now();
27795
27789
  if (attempt > 0 && !options?.silent) {
27796
27790
  process.stderr.write(
@@ -27799,7 +27793,7 @@ var init_bridge_host = __esm({
27799
27793
  );
27800
27794
  }
27801
27795
  this.afterBind();
27802
- return candidate;
27796
+ return boundPort;
27803
27797
  } catch (err) {
27804
27798
  const e = err;
27805
27799
  if (e?.code !== "EADDRINUSE") {
@@ -27835,6 +27829,11 @@ var init_bridge_host = __esm({
27835
27829
  server.once("error", onError);
27836
27830
  server.listen(port, "127.0.0.1", () => {
27837
27831
  if (settled) return;
27832
+ const address = server.address();
27833
+ if (!address || typeof address === "string") {
27834
+ onError(new Error("ws bridge has no bound TCP address"));
27835
+ return;
27836
+ }
27838
27837
  settled = true;
27839
27838
  server.removeListener("error", onError);
27840
27839
  server.on("error", (err) => {
@@ -27850,7 +27849,7 @@ var init_bridge_host = __esm({
27850
27849
  this.wss?.emit("connection", ws, req);
27851
27850
  });
27852
27851
  });
27853
- resolve9();
27852
+ resolve9(address.port);
27854
27853
  });
27855
27854
  });
27856
27855
  }
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.459 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.460 | (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.459",
3
+ "version": "0.1.460",
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",
@@ -223,6 +223,7 @@ interface BridgeForwardedCommand {
223
223
  }
224
224
 
225
225
  export interface BridgeHostOptions {
226
+ /** use 0 for an OS-assigned port; startAsync returns the bound address. */
226
227
  port?: number
227
228
  openUrl?: (url: string, options?: OpenUrlOptions) => Promise<void> | void
228
229
  /** Contrast-specific excludes for the agent host's dev-server scan. passed
@@ -466,7 +467,7 @@ export class SootSimBridgeHost {
466
467
  private static SCAN_FRESH_MS = 2000
467
468
 
468
469
  constructor(opts: BridgeHostOptions = {}) {
469
- this.preferredPort = opts.port || DEFAULT_SOOTSIM_BRIDGE_PORT
470
+ this.preferredPort = opts.port ?? DEFAULT_SOOTSIM_BRIDGE_PORT
470
471
  this.port = this.preferredPort
471
472
  // default off — callers that want the lockfile (rnx serve) opt in.
472
473
  this.shouldWriteLockfile = opts.writeLockfile === true
@@ -537,9 +538,9 @@ export class SootSimBridgeHost {
537
538
  for (let attempt = 0; attempt < this.portFallbackCount; attempt++) {
538
539
  const candidate = this.preferredPort + attempt
539
540
  try {
540
- await this.bindOnce(candidate, options?.silent === true)
541
- this.effectivePort = candidate
542
- this.port = candidate
541
+ const boundPort = await this.bindOnce(candidate, options?.silent === true)
542
+ this.effectivePort = boundPort
543
+ this.port = boundPort
543
544
  this.startedAt = Date.now()
544
545
  if (attempt > 0 && !options?.silent) {
545
546
  process.stderr.write(
@@ -547,7 +548,7 @@ export class SootSimBridgeHost {
547
548
  )
548
549
  }
549
550
  this.afterBind()
550
- return candidate
551
+ return boundPort
551
552
  } catch (err: unknown) {
552
553
  const e = err as NodeJS.ErrnoException
553
554
  if (e?.code !== 'EADDRINUSE') {
@@ -566,8 +567,8 @@ export class SootSimBridgeHost {
566
567
  )
567
568
  }
568
569
 
569
- private bindOnce(port: number, _silent: boolean): Promise<void> {
570
- return new Promise<void>((resolve, reject) => {
570
+ private bindOnce(port: number, _silent: boolean): Promise<number> {
571
+ return new Promise<number>((resolve, reject) => {
571
572
  const server = createServer((req, res) => this.handleHttpRequest(req, res))
572
573
  let settled = false
573
574
 
@@ -589,6 +590,11 @@ export class SootSimBridgeHost {
589
590
  // 127.0.0.1 explicitly to avoid the localhost-vs-::1 DNS coinflip.
590
591
  server.listen(port, '127.0.0.1', () => {
591
592
  if (settled) return
593
+ const address = server.address()
594
+ if (!address || typeof address === 'string') {
595
+ onError(new Error('ws bridge has no bound TCP address'))
596
+ return
597
+ }
592
598
  settled = true
593
599
  server.removeListener('error', onError)
594
600
  server.on('error', (err) => {
@@ -603,7 +609,7 @@ export class SootSimBridgeHost {
603
609
  this.wss?.emit('connection', ws, req)
604
610
  })
605
611
  })
606
- resolve()
612
+ resolve(address.port)
607
613
  })
608
614
  })
609
615
  }