rnxsim 0.1.472 → 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 (57) hide show
  1. package/cli/commands/inspect/actions.ts +10 -6
  2. package/cli/commands/inspect/core.ts +2 -2
  3. package/cli/commands/inspect/wait-selector.ts +12 -4
  4. package/dist-lib/agent-daemon-client.cjs +1 -1
  5. package/dist-lib/agent-events.cjs +1 -1
  6. package/dist-lib/agent-identity.cjs +1 -1
  7. package/dist-lib/agent-sessions.cjs +1 -1
  8. package/dist-lib/attached-projects.cjs +1 -1
  9. package/dist-lib/auth/shared-session.cjs +1 -1
  10. package/dist-lib/backend-origin.cjs +1 -1
  11. package/dist-lib/beta.cjs +1 -1
  12. package/dist-lib/beta.mjs +1 -1
  13. package/dist-lib/bridge-constants.cjs +1 -1
  14. package/dist-lib/bridge-contract-input.cjs +8 -5
  15. package/dist-lib/bridge-contract-input.mjs +8 -5
  16. package/dist-lib/bridge-contract.cjs +1 -1
  17. package/dist-lib/bridge-contract.mjs +1 -1
  18. package/dist-lib/capture-contract.cjs +1 -1
  19. package/dist-lib/capture-contract.mjs +1 -1
  20. package/dist-lib/cli-constants.cjs +1 -1
  21. package/dist-lib/cloud-contract.cjs +1 -1
  22. package/dist-lib/cloud-contract.mjs +1 -1
  23. package/dist-lib/cloud.cjs +1 -1
  24. package/dist-lib/cloud.mjs +1 -1
  25. package/dist-lib/config.cjs +1 -1
  26. package/dist-lib/detox/index.cjs +12 -4
  27. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  28. package/dist-lib/home-paths.cjs +1 -1
  29. package/dist-lib/host/bridge-host.cjs +1 -1
  30. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  31. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  32. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  33. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  34. package/dist-lib/host/websocket-proxy.cjs +1 -1
  35. package/dist-lib/index.cjs +6 -4
  36. package/dist-lib/jump-to-source-babel.cjs +1 -1
  37. package/dist-lib/jump-to-source-native.cjs +1 -1
  38. package/dist-lib/menu.cjs +1 -1
  39. package/dist-lib/menu.mjs +1 -1
  40. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  41. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  42. package/dist-lib/metro-production-bundle.cjs +1 -1
  43. package/dist-lib/metro-production-bundle.mjs +1 -1
  44. package/dist-lib/metro.cjs +1 -1
  45. package/dist-lib/profiles.cjs +1 -1
  46. package/dist-lib/public-brand.cjs +1 -1
  47. package/dist-lib/react-native-host-modules.cjs +1 -1
  48. package/dist-lib/react-native-host-modules.mjs +1 -1
  49. package/dist-lib/render-mode.cjs +1 -1
  50. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  51. package/dist-lib/sdk.cjs +7 -5
  52. package/dist-lib/sdk.mjs +7 -5
  53. package/dist-lib/skills.cjs +64 -10
  54. package/dist-lib/vite.cjs +1 -1
  55. package/package.json +1 -1
  56. package/src/bridge-contract-input.ts +12 -4
  57. package/src/bridge-contract.ts +8 -1
@@ -329,21 +329,25 @@ interface TextCandidate {
329
329
  ancestorTestIDs: string[]
330
330
  }
331
331
 
332
- // a node repeating the text of its nearest labelled ancestor is that ancestor's
333
- // own caption (a pressable and its text child), so only the outer node is a
334
- // candidate. otherwise every labelled button is an ambiguous pair.
332
+ // a non-pressable node repeating the text of its nearest labelled ancestor,
333
+ // when that ancestor is pressable, is the ancestor's own caption (a button and
334
+ // its text child), so only the button is a candidate. otherwise every labelled
335
+ // button is an ambiguous pair. a pressable descendant is never folded into its
336
+ // ancestor: same text does not prove it shares the ancestor's tap target.
335
337
  function collectTextCandidates(
336
338
  nodes: readonly SimSemanticNode[],
337
339
  ancestors: string[] = [],
338
- ownerText = '',
340
+ pressableOwnerText = '',
339
341
  ): TextCandidate[] {
340
342
  const out: TextCandidate[] = []
341
343
  for (const node of nodes) {
342
344
  const text = nodeText(node)
343
- if (!text || text !== ownerText) out.push({ node, ancestorTestIDs: ancestors })
345
+ const caption = !!text && text === pressableOwnerText && !node.pressable
346
+ if (!caption) out.push({ node, ancestorTestIDs: ancestors })
344
347
  if (node.children?.length) {
345
348
  const next = node.testID ? [...ancestors, node.testID] : ancestors
346
- out.push(...collectTextCandidates(node.children, next, text || ownerText))
349
+ const owner = text ? (node.pressable ? text : '') : pressableOwnerText
350
+ out.push(...collectTextCandidates(node.children, next, owner))
347
351
  }
348
352
  }
349
353
  return out
@@ -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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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;
@@ -2307,14 +2307,16 @@ function payloadFromResolved(resolved, match, extra = {}) {
2307
2307
  ...extra
2308
2308
  };
2309
2309
  }
2310
- function collectTextCandidates(nodes, ancestors = [], ownerText = "") {
2310
+ function collectTextCandidates(nodes, ancestors = [], pressableOwnerText = "") {
2311
2311
  const out = [];
2312
2312
  for (const node of nodes) {
2313
2313
  const text = nodeText(node);
2314
- if (!text || text !== ownerText) out.push({ node, ancestorTestIDs: ancestors });
2314
+ const caption = !!text && text === pressableOwnerText && !node.pressable;
2315
+ if (!caption) out.push({ node, ancestorTestIDs: ancestors });
2315
2316
  if (node.children?.length) {
2316
2317
  const next = node.testID ? [...ancestors, node.testID] : ancestors;
2317
- out.push(...collectTextCandidates(node.children, next, text || ownerText));
2318
+ const owner = text ? node.pressable ? text : "" : pressableOwnerText;
2319
+ out.push(...collectTextCandidates(node.children, next, owner));
2318
2320
  }
2319
2321
  }
2320
2322
  return out;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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.472 | (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
@@ -1725,14 +1725,16 @@ function payloadFromResolved(resolved, match, extra = {}) {
1725
1725
  ...extra
1726
1726
  };
1727
1727
  }
1728
- function collectTextCandidates(nodes, ancestors = [], ownerText = "") {
1728
+ function collectTextCandidates(nodes, ancestors = [], pressableOwnerText = "") {
1729
1729
  const out = [];
1730
1730
  for (const node of nodes) {
1731
1731
  const text = nodeText(node);
1732
- if (!text || text !== ownerText) out.push({ node, ancestorTestIDs: ancestors });
1732
+ const caption = !!text && text === pressableOwnerText && !node.pressable;
1733
+ if (!caption) out.push({ node, ancestorTestIDs: ancestors });
1733
1734
  if (node.children?.length) {
1734
1735
  const next = node.testID ? [...ancestors, node.testID] : ancestors;
1735
- out.push(...collectTextCandidates(node.children, next, text || ownerText));
1736
+ const owner = text ? node.pressable ? text : "" : pressableOwnerText;
1737
+ out.push(...collectTextCandidates(node.children, next, owner));
1736
1738
  }
1737
1739
  }
1738
1740
  return out;
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.472 | (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
@@ -1629,14 +1629,16 @@ function payloadFromResolved(resolved, match, extra = {}) {
1629
1629
  ...extra
1630
1630
  };
1631
1631
  }
1632
- function collectTextCandidates(nodes, ancestors = [], ownerText = "") {
1632
+ function collectTextCandidates(nodes, ancestors = [], pressableOwnerText = "") {
1633
1633
  const out = [];
1634
1634
  for (const node of nodes) {
1635
1635
  const text = nodeText(node);
1636
- if (!text || text !== ownerText) out.push({ node, ancestorTestIDs: ancestors });
1636
+ const caption = !!text && text === pressableOwnerText && !node.pressable;
1637
+ if (!caption) out.push({ node, ancestorTestIDs: ancestors });
1637
1638
  if (node.children?.length) {
1638
1639
  const next = node.testID ? [...ancestors, node.testID] : ancestors;
1639
- out.push(...collectTextCandidates(node.children, next, text || ownerText));
1640
+ const owner = text ? node.pressable ? text : "" : pressableOwnerText;
1641
+ out.push(...collectTextCandidates(node.children, next, owner));
1640
1642
  }
1641
1643
  }
1642
1644
  return out;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.472 | (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: {
@@ -5310,7 +5364,7 @@ var init_supported_native_packages = __esm({
5310
5364
  "react-native-nitro-image",
5311
5365
  // seam
5312
5366
  "react-native-nitro-modules",
5313
- // seam
5367
+ // preset+seam
5314
5368
  "react-native-nitro-sound",
5315
5369
  // seam
5316
5370
  "react-native-nitro-sse",
@@ -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.472 | (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.472",
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 {