rnxsim 0.1.473 → 0.1.474

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 (56) hide show
  1. package/cli/commands/inspect/core.ts +2 -2
  2. package/cli/commands/inspect/wait-selector.ts +12 -4
  3. package/dist-lib/agent-daemon-client.cjs +1 -1
  4. package/dist-lib/agent-events.cjs +1 -1
  5. package/dist-lib/agent-identity.cjs +1 -1
  6. package/dist-lib/agent-sessions.cjs +1 -1
  7. package/dist-lib/attached-projects.cjs +1 -1
  8. package/dist-lib/auth/shared-session.cjs +1 -1
  9. package/dist-lib/backend-origin.cjs +1 -1
  10. package/dist-lib/beta.cjs +1 -1
  11. package/dist-lib/beta.mjs +1 -1
  12. package/dist-lib/bridge-constants.cjs +1 -1
  13. package/dist-lib/bridge-contract-input.cjs +8 -5
  14. package/dist-lib/bridge-contract-input.mjs +8 -5
  15. package/dist-lib/bridge-contract.cjs +1 -1
  16. package/dist-lib/bridge-contract.mjs +1 -1
  17. package/dist-lib/capture-contract.cjs +1 -1
  18. package/dist-lib/capture-contract.mjs +1 -1
  19. package/dist-lib/cli-constants.cjs +1 -1
  20. package/dist-lib/cloud-contract.cjs +1 -1
  21. package/dist-lib/cloud-contract.mjs +1 -1
  22. package/dist-lib/cloud.cjs +1 -1
  23. package/dist-lib/cloud.mjs +1 -1
  24. package/dist-lib/config.cjs +1 -1
  25. package/dist-lib/detox/index.cjs +12 -4
  26. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  27. package/dist-lib/home-paths.cjs +1 -1
  28. package/dist-lib/host/bridge-host.cjs +1 -1
  29. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  30. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  31. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  32. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  33. package/dist-lib/host/websocket-proxy.cjs +1 -1
  34. package/dist-lib/index.cjs +1 -1
  35. package/dist-lib/jump-to-source-babel.cjs +1 -1
  36. package/dist-lib/jump-to-source-native.cjs +1 -1
  37. package/dist-lib/menu.cjs +1 -1
  38. package/dist-lib/menu.mjs +1 -1
  39. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  40. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  41. package/dist-lib/metro-production-bundle.cjs +1 -1
  42. package/dist-lib/metro-production-bundle.mjs +1 -1
  43. package/dist-lib/metro.cjs +1 -1
  44. package/dist-lib/profiles.cjs +1 -1
  45. package/dist-lib/public-brand.cjs +1 -1
  46. package/dist-lib/react-native-host-modules.cjs +1 -1
  47. package/dist-lib/react-native-host-modules.mjs +1 -1
  48. package/dist-lib/render-mode.cjs +1 -1
  49. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  50. package/dist-lib/sdk.cjs +2 -2
  51. package/dist-lib/sdk.mjs +2 -2
  52. package/dist-lib/skills.cjs +63 -9
  53. package/dist-lib/vite.cjs +1 -1
  54. package/package.json +1 -1
  55. package/src/bridge-contract-input.ts +12 -4
  56. package/src/bridge-contract.ts +8 -1
@@ -1146,7 +1146,7 @@ export async function inspectWaitSelector(
1146
1146
  bridge: InspectBridge,
1147
1147
  testId: string,
1148
1148
  timeoutMs = 5000,
1149
- opts: { gone?: boolean } = {},
1149
+ opts: { gone?: boolean; structural?: boolean } = {},
1150
1150
  ): Promise<{ found: boolean; node?: SimSemanticNode; elapsed: number }> {
1151
1151
  const gone = opts.gone === true
1152
1152
  const result: SemanticWaitResult = await bridge.send(
@@ -1154,7 +1154,7 @@ export async function inspectWaitSelector(
1154
1154
  type: 'waitFor',
1155
1155
  waitForOptions: {
1156
1156
  condition: {
1157
- type: gone ? 'absent' : 'present',
1157
+ type: gone ? 'absent' : opts.structural === true ? 'mounted' : 'present',
1158
1158
  selector: { testID: testId },
1159
1159
  },
1160
1160
  timeoutMs,
@@ -2,9 +2,13 @@ import { rnxExit } from '../../run-rnx'
2
2
  import { inspectWaitSelector } from './core'
3
3
  import type { WsBridge } from '../../ws-bridge'
4
4
 
5
- // blocks until a node with the given testID is present and laid out, or — with
6
- // `--gone` — until it is absent. the engine owns the polling loop and this
7
- // handler sends one request, then reports.
5
+ // blocks until a node with the given testID is visible and laid out, or — with
6
+ // `--gone` — until it is absent. `--structural` drops the visibility test and
7
+ // waits only for the node to exist, which is what a marker rendered as proof
8
+ // (a build id, a launch phase) needs: it is 1x1 and painted under the app, so
9
+ // it is permanently occluded and the visible check can never match it. the
10
+ // engine owns the polling loop and this handler sends one request, then
11
+ // reports.
8
12
  export async function runWaitSelectorSubcommand(opts: {
9
13
  bridge: WsBridge
10
14
  args: string[]
@@ -14,16 +18,20 @@ export async function runWaitSelectorSubcommand(opts: {
14
18
  const { bridge, args, positional, inspectUsage } = opts
15
19
  const testId = positional[1]
16
20
  if (!testId) {
17
- console.error(inspectUsage('selector', '<testid> [--max-ms 5000] [--gone]'))
21
+ console.error(
22
+ inspectUsage('selector', '<testid> [--max-ms 5000] [--gone] [--structural]'),
23
+ )
18
24
  rnxExit(1)
19
25
  }
20
26
  const maxMsIdx = args.indexOf('--max-ms')
21
27
  const timeoutMs =
22
28
  maxMsIdx >= 0 && args[maxMsIdx + 1] ? Math.max(100, Number(args[maxMsIdx + 1])) : 5000
23
29
  const gone = args.includes('--gone')
30
+ const structural = args.includes('--structural')
24
31
 
25
32
  const { found, node, elapsed } = await inspectWaitSelector(bridge, testId, timeoutMs, {
26
33
  gone,
34
+ structural,
27
35
  })
28
36
 
29
37
  if (gone) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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;
@@ -196,8 +196,11 @@ function parsePerformStep(value, index) {
196
196
  case "waitFor": {
197
197
  const timeoutMs = semanticWaitTimeout(step, path);
198
198
  const condition = step.condition === void 0 ? void 0 : stringValue(step.condition, `${path}.condition`);
199
- if (condition !== void 0 && condition !== "present" && condition !== "absent") {
200
- return validationFailure(`${path}.condition`, "must be present or absent");
199
+ if (condition !== void 0 && condition !== "present" && condition !== "mounted" && condition !== "absent") {
200
+ return validationFailure(
201
+ `${path}.condition`,
202
+ "must be present, mounted, or absent"
203
+ );
201
204
  }
202
205
  const selector = step.testID === void 0 ? { id: stringValue(step.id, `${path}.id`) } : { testID: stringValue(step.testID, `${path}.testID`) };
203
206
  return {
@@ -303,10 +306,10 @@ function parseSemanticWaitOptions(value) {
303
306
  ...timeoutMs === void 0 ? {} : { timeoutMs }
304
307
  };
305
308
  }
306
- if (type !== "present" && type !== "absent") {
309
+ if (type !== "present" && type !== "mounted" && type !== "absent") {
307
310
  return validationFailure(
308
311
  "waitFor.condition.type",
309
- "must be ready, present, or absent"
312
+ "must be ready, present, mounted, or absent"
310
313
  );
311
314
  }
312
315
  return {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_MAX_MS = 5e3;
@@ -161,8 +161,11 @@ function parsePerformStep(value, index) {
161
161
  case "waitFor": {
162
162
  const timeoutMs = semanticWaitTimeout(step, path);
163
163
  const condition = step.condition === void 0 ? void 0 : stringValue(step.condition, `${path}.condition`);
164
- if (condition !== void 0 && condition !== "present" && condition !== "absent") {
165
- return validationFailure(`${path}.condition`, "must be present or absent");
164
+ if (condition !== void 0 && condition !== "present" && condition !== "mounted" && condition !== "absent") {
165
+ return validationFailure(
166
+ `${path}.condition`,
167
+ "must be present, mounted, or absent"
168
+ );
166
169
  }
167
170
  const selector = step.testID === void 0 ? { id: stringValue(step.id, `${path}.id`) } : { testID: stringValue(step.testID, `${path}.testID`) };
168
171
  return {
@@ -268,10 +271,10 @@ function parseSemanticWaitOptions(value) {
268
271
  ...timeoutMs === void 0 ? {} : { timeoutMs }
269
272
  };
270
273
  }
271
- if (type !== "present" && type !== "absent") {
274
+ if (type !== "present" && type !== "mounted" && type !== "absent") {
272
275
  return validationFailure(
273
276
  "waitFor.condition.type",
274
- "must be ready, present, or absent"
277
+ "must be ready, present, mounted, or absent"
275
278
  );
276
279
  }
277
280
  return {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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;
@@ -265,7 +265,8 @@ function processIdentity(pid) {
265
265
  }
266
266
  }
267
267
  function softwareChromeAllowed(runtime = currentRuntime()) {
268
- return runtime.platform === "linux" && runtime.env.GITHUB_ACTIONS === "true" && runtime.env.RUNNER_OS === "Linux";
268
+ if (runtime.platform !== "linux") return false;
269
+ return runtime.env.GITHUB_ACTIONS === "true" && runtime.env.RUNNER_OS === "Linux" || runtime.env.CONTRAST_CF_FACTORY_CONTAINER === "1";
269
270
  }
270
271
  function isSoftwareRendererArgument(value) {
271
272
  const arg = String(value);
@@ -708,7 +709,7 @@ function softwareChromeLaunchOptions(opts) {
708
709
  }
709
710
  const callerArgs = Array.isArray(opts.args) ? opts.args.map(String) : [];
710
711
  const unmanagedCallerArgs = callerArgs.filter((arg) => {
711
- return !arg.startsWith("--use-angle=") && arg !== "--enable-gpu" && arg !== "--enable-gpu-rasterization" && arg !== "--enable-zero-copy" && arg !== "--ignore-gpu-blocklist" && !/^--enable-unsafe-webgpu(?:=.*)?$/i.test(arg) && !/^--enable-unsafe-swiftshader(?:=.*)?$/i.test(arg);
712
+ return !arg.startsWith("--use-angle=") && arg !== "--enable-gpu" && arg !== "--enable-gpu-rasterization" && arg !== "--enable-zero-copy" && arg !== "--ignore-gpu-blocklist" && arg !== "--disable-gpu-watchdog" && !/^--enable-unsafe-webgpu(?:=.*)?$/i.test(arg) && !/^--enable-unsafe-swiftshader(?:=.*)?$/i.test(arg);
712
713
  });
713
714
  const software = {
714
715
  ...opts,
@@ -721,7 +722,14 @@ function softwareChromeLaunchOptions(opts) {
721
722
  ...unmanagedCallerArgs,
722
723
  "--use-angle=swiftshader",
723
724
  "--enable-unsafe-swiftshader",
724
- "--enable-unsafe-webgpu"
725
+ "--enable-unsafe-webgpu",
726
+ // the GPU watchdog kills the GPU process when a task outlives its
727
+ // timeout. SwiftShader precompiling Graphite pipelines on two CPU cores
728
+ // legitimately outlives it, and the compositor then fails with "graphite
729
+ // device was lost while precompiling pipelines" although nothing hung.
730
+ // the cost: a genuinely wedged GPU process now holds its job until the
731
+ // job's own timeout instead of dying fast.
732
+ "--disable-gpu-watchdog"
725
733
  ],
726
734
  ["Vulkan"]
727
735
  )
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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;
@@ -787,7 +787,7 @@ async function inspectWaitSelector(bridge, testId, timeoutMs = 5e3, opts = {}) {
787
787
  type: "waitFor",
788
788
  waitForOptions: {
789
789
  condition: {
790
- type: gone ? "absent" : "present",
790
+ type: gone ? "absent" : opts.structural === true ? "mounted" : "present",
791
791
  selector: { testID: testId }
792
792
  },
793
793
  timeoutMs
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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);
@@ -691,7 +691,7 @@ async function inspectWaitSelector(bridge, testId, timeoutMs = 5e3, opts = {}) {
691
691
  type: "waitFor",
692
692
  waitForOptions: {
693
693
  condition: {
694
- type: gone ? "absent" : "present",
694
+ type: gone ? "absent" : opts.structural === true ? "mounted" : "present",
695
695
  selector: { testID: testId }
696
696
  },
697
697
  timeoutMs
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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;
@@ -57,7 +57,8 @@ function processIdentity(pid) {
57
57
  }
58
58
  }
59
59
  function softwareChromeAllowed(runtime = currentRuntime()) {
60
- return runtime.platform === "linux" && runtime.env.GITHUB_ACTIONS === "true" && runtime.env.RUNNER_OS === "Linux";
60
+ if (runtime.platform !== "linux") return false;
61
+ return runtime.env.GITHUB_ACTIONS === "true" && runtime.env.RUNNER_OS === "Linux" || runtime.env.CONTRAST_CF_FACTORY_CONTAINER === "1";
61
62
  }
62
63
  function isSoftwareRendererArgument(value) {
63
64
  const arg = String(value);
@@ -482,7 +483,7 @@ function softwareChromeLaunchOptions(opts) {
482
483
  }
483
484
  const callerArgs = Array.isArray(opts.args) ? opts.args.map(String) : [];
484
485
  const unmanagedCallerArgs = callerArgs.filter((arg) => {
485
- return !arg.startsWith("--use-angle=") && arg !== "--enable-gpu" && arg !== "--enable-gpu-rasterization" && arg !== "--enable-zero-copy" && arg !== "--ignore-gpu-blocklist" && !/^--enable-unsafe-webgpu(?:=.*)?$/i.test(arg) && !/^--enable-unsafe-swiftshader(?:=.*)?$/i.test(arg);
486
+ return !arg.startsWith("--use-angle=") && arg !== "--enable-gpu" && arg !== "--enable-gpu-rasterization" && arg !== "--enable-zero-copy" && arg !== "--ignore-gpu-blocklist" && arg !== "--disable-gpu-watchdog" && !/^--enable-unsafe-webgpu(?:=.*)?$/i.test(arg) && !/^--enable-unsafe-swiftshader(?:=.*)?$/i.test(arg);
486
487
  });
487
488
  const software = {
488
489
  ...opts,
@@ -495,7 +496,14 @@ function softwareChromeLaunchOptions(opts) {
495
496
  ...unmanagedCallerArgs,
496
497
  "--use-angle=swiftshader",
497
498
  "--enable-unsafe-swiftshader",
498
- "--enable-unsafe-webgpu"
499
+ "--enable-unsafe-webgpu",
500
+ // the GPU watchdog kills the GPU process when a task outlives its
501
+ // timeout. SwiftShader precompiling Graphite pipelines on two CPU cores
502
+ // legitimately outlives it, and the compositor then fails with "graphite
503
+ // device was lost while precompiling pipelines" although nothing hung.
504
+ // the cost: a genuinely wedged GPU process now holds its job until the
505
+ // job's own timeout instead of dying fast.
506
+ "--disable-gpu-watchdog"
499
507
  ],
500
508
  ["Vulkan"]
501
509
  )
@@ -4198,7 +4206,53 @@ var init_capability_outcomes2 = __esm({
4198
4206
  "react-native-safe-area-context": {
4199
4207
  exactTestedVersion: "5.7.0",
4200
4208
  supportedVersionRange: ">=4.0.0",
4201
- lastMeasured: null,
4209
+ lastMeasured: {
4210
+ byWeighting: {
4211
+ strict: {
4212
+ android: {
4213
+ passedWeight: 0,
4214
+ failedWeight: 0,
4215
+ unassessedWeight: 13,
4216
+ totalWeight: 13,
4217
+ assessedWeight: 0,
4218
+ compatibility: null,
4219
+ assessed: 0
4220
+ },
4221
+ ios: {
4222
+ passedWeight: 0,
4223
+ failedWeight: 0,
4224
+ unassessedWeight: 13,
4225
+ totalWeight: 13,
4226
+ assessedWeight: 0,
4227
+ compatibility: null,
4228
+ assessed: 0
4229
+ }
4230
+ },
4231
+ usage: {
4232
+ android: {
4233
+ passedWeight: 0,
4234
+ failedWeight: 0,
4235
+ unassessedWeight: 389,
4236
+ totalWeight: 389,
4237
+ assessedWeight: 0,
4238
+ compatibility: null,
4239
+ assessed: 0
4240
+ },
4241
+ ios: {
4242
+ passedWeight: 0,
4243
+ failedWeight: 0,
4244
+ unassessedWeight: 389,
4245
+ totalWeight: 389,
4246
+ assessedWeight: 0,
4247
+ compatibility: null,
4248
+ assessed: 0
4249
+ }
4250
+ }
4251
+ },
4252
+ capturedAt: "2026-09-10T08:03:06.591Z",
4253
+ receipts: ["safe-area-initial-insets-2026-09-09-p40993-r2"],
4254
+ sourceCommit: "a13aa54553c70fd1ab96e3cfaaf0d81d58bc19ea"
4255
+ },
4202
4256
  unmatchedReferenceCount: 74,
4203
4257
  byPlatform: {
4204
4258
  android: {
@@ -5935,8 +5989,8 @@ var init_registry = __esm({
5935
5989
  id: "provider-and-window-metrics",
5936
5990
  usage: 3,
5937
5991
  importance: 3,
5938
- estimate: 0.97,
5939
- rationale: "SafeAreaProvider and initialWindowMetrics expose live frame and inset values from the device-spec and keyboard sources. The compatibility facade does not export the upstream initialWindowSafeAreaInsets value, so direct imports of that public constant do not receive the native package value."
5992
+ estimate: 1,
5993
+ rationale: "SafeAreaProvider, initialWindowMetrics and the deprecated initialWindowSafeAreaInsets constant expose live frame and inset values from the device-spec and keyboard sources. The inspected provider and window-metric path has no app-facing behavior gap."
5940
5994
  },
5941
5995
  {
5942
5996
  id: "edge-aware-layout",
@@ -5962,8 +6016,8 @@ var init_registry = __esm({
5962
6016
  ],
5963
6017
  capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-safe-area-context"],
5964
6018
  note: "live device/system-bar/ime metrics, edges/mode padding, hooks",
5965
- working: "SafeAreaProvider with live Android system-bar and IME-resized frame metrics, SafeAreaView (edges/mode padding/margin), useSafeAreaInsets, useSafeAreaFrame, SafeAreaInsetsContext, SafeAreaFrameContext, initialWindowMetrics, SafeAreaListener onInsetsChange, withSafeAreaInsets HOC",
5966
- missing: "initialWindowSafeAreaInsets is not exported; rotation-specific provider frame deltas remain unassessed"
6019
+ working: "SafeAreaProvider with live Android system-bar and IME-resized frame metrics, SafeAreaView (edges/mode padding/margin), useSafeAreaInsets, useSafeAreaFrame, SafeAreaInsetsContext, SafeAreaFrameContext, initialWindowMetrics, initialWindowSafeAreaInsets, SafeAreaListener onInsetsChange, withSafeAreaInsets HOC",
6020
+ missing: "rotation-specific provider frame deltas remain unassessed"
5967
6021
  }
5968
6022
  ]
5969
6023
  },
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.473 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.474 | (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.473",
3
+ "version": "0.1.474",
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",
@@ -206,8 +206,16 @@ export function parsePerformStep(value: unknown, index: number): SimPerformStep
206
206
  step.condition === undefined
207
207
  ? undefined
208
208
  : stringValue(step.condition, `${path}.condition`)
209
- if (condition !== undefined && condition !== 'present' && condition !== 'absent') {
210
- return validationFailure(`${path}.condition`, 'must be present or absent')
209
+ if (
210
+ condition !== undefined &&
211
+ condition !== 'present' &&
212
+ condition !== 'mounted' &&
213
+ condition !== 'absent'
214
+ ) {
215
+ return validationFailure(
216
+ `${path}.condition`,
217
+ 'must be present, mounted, or absent',
218
+ )
211
219
  }
212
220
  const selector =
213
221
  step.testID === undefined
@@ -331,10 +339,10 @@ export function parseSemanticWaitOptions(value: unknown): SemanticWaitOptions {
331
339
  ...(timeoutMs === undefined ? {} : { timeoutMs }),
332
340
  }
333
341
  }
334
- if (type !== 'present' && type !== 'absent') {
342
+ if (type !== 'present' && type !== 'mounted' && type !== 'absent') {
335
343
  return validationFailure(
336
344
  'waitFor.condition.type',
337
- 'must be ready, present, or absent',
345
+ 'must be ready, present, mounted, or absent',
338
346
  )
339
347
  }
340
348
  return {
@@ -159,7 +159,7 @@ export type PerformStep =
159
159
  type: 'waitFor'
160
160
  testID?: string
161
161
  id?: string
162
- condition?: 'present' | 'absent'
162
+ condition?: 'present' | 'mounted' | 'absent'
163
163
  timeoutMs?: number
164
164
  }
165
165
 
@@ -202,9 +202,16 @@ export interface PerformResult {
202
202
  // waitFor — engine-side semantic condition polling
203
203
  // ---------------------------------------------------------------------------
204
204
 
205
+ // `present` is what a person can see: the node must survive the occlusion pass,
206
+ // so a button behind a sheet does not count. `mounted` asks only whether the
207
+ // node exists and is laid out, which is the right question for a marker the app
208
+ // renders as proof of something (a build id, a launch phase) rather than as
209
+ // something to look at — those are 1x1 and painted under the whole app, so they
210
+ // are permanently occluded and `present` can never match one.
205
211
  export type SemanticWaitCondition =
206
212
  | { type: 'ready' }
207
213
  | { type: 'present'; selector: SimSemanticResolveSelector }
214
+ | { type: 'mounted'; selector: SimSemanticResolveSelector }
208
215
  | { type: 'absent'; selector: SimSemanticResolveSelector }
209
216
 
210
217
  export interface SemanticWaitOptions {