peachsim 0.1.637 → 0.1.638

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 (79) hide show
  1. package/README.md +8 -5
  2. package/cli/bridge-flow-runner.ts +442 -14
  3. package/cli/commands/inspect/core.ts +93 -24
  4. package/cli/commands/maestro.ts +2 -2
  5. package/cli/commands/serve.ts +13 -1
  6. package/cli/drivers/playwright-provisioning.ts +8 -16
  7. package/cli/drivers/playwright-sim-host.ts +3 -0
  8. package/cli/drivers/playwright.ts +1 -0
  9. package/cli/internal-child.ts +51 -8
  10. package/dist-lib/agent-daemon-client.cjs +1 -1
  11. package/dist-lib/agent-events.cjs +1 -1
  12. package/dist-lib/agent-identity.cjs +1 -1
  13. package/dist-lib/agent-sessions.cjs +1 -1
  14. package/dist-lib/attached-projects.cjs +1 -1
  15. package/dist-lib/auth/shared-session.cjs +1 -1
  16. package/dist-lib/backend-origin.cjs +1 -1
  17. package/dist-lib/beta.cjs +1 -1
  18. package/dist-lib/beta.mjs +1 -1
  19. package/dist-lib/bridge-constants.cjs +1 -1
  20. package/dist-lib/bridge-contract-input.cjs +3 -2
  21. package/dist-lib/bridge-contract-input.mjs +3 -2
  22. package/dist-lib/bridge-contract.cjs +1 -1
  23. package/dist-lib/bridge-contract.mjs +1 -1
  24. package/dist-lib/capture-contract.cjs +1 -1
  25. package/dist-lib/capture-contract.mjs +1 -1
  26. package/dist-lib/cli-constants.cjs +1 -1
  27. package/dist-lib/cloud-contract.cjs +1 -1
  28. package/dist-lib/cloud-contract.mjs +1 -1
  29. package/dist-lib/cloud-test-args.cjs +1 -1
  30. package/dist-lib/cloud-test-args.mjs +1 -1
  31. package/dist-lib/cloud.cjs +1 -1
  32. package/dist-lib/cloud.mjs +1 -1
  33. package/dist-lib/config.cjs +1 -1
  34. package/dist-lib/detox/index.cjs +1 -1
  35. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  36. package/dist-lib/home-paths.cjs +1 -1
  37. package/dist-lib/host/bridge-host.cjs +4 -2
  38. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  39. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  40. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  41. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  42. package/dist-lib/host/websocket-proxy.cjs +1 -1
  43. package/dist-lib/index.cjs +76 -20
  44. package/dist-lib/jump-to-source-babel.cjs +1 -1
  45. package/dist-lib/jump-to-source-native.cjs +1 -1
  46. package/dist-lib/kotlin-host.cjs +1 -1
  47. package/dist-lib/menu.cjs +1 -1
  48. package/dist-lib/menu.mjs +1 -1
  49. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  50. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  51. package/dist-lib/metro-production-bundle.cjs +1 -1
  52. package/dist-lib/metro-production-bundle.mjs +1 -1
  53. package/dist-lib/metro.cjs +1 -1
  54. package/dist-lib/native-app-identity.cjs +1 -1
  55. package/dist-lib/native-app-identity.mjs +1 -1
  56. package/dist-lib/profiles.cjs +1 -1
  57. package/dist-lib/public-brand.cjs +1 -1
  58. package/dist-lib/react-native-host-modules.cjs +1 -1
  59. package/dist-lib/react-native-host-modules.mjs +1 -1
  60. package/dist-lib/render-mode.cjs +1 -1
  61. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  62. package/dist-lib/sdk.cjs +78 -20
  63. package/dist-lib/sdk.mjs +77 -20
  64. package/dist-lib/skills.cjs +394 -62
  65. package/dist-lib/swift-compile.cjs +89 -7
  66. package/dist-lib/swift-compile.mjs +89 -7
  67. package/dist-lib/swift-package.cjs +1 -1
  68. package/dist-lib/swift-package.mjs +1 -1
  69. package/dist-lib/swift-submit.cjs +1 -1
  70. package/dist-lib/swift-submit.mjs +1 -1
  71. package/dist-lib/swift.cjs +122 -34
  72. package/dist-lib/vite-swift.cjs +89 -7
  73. package/dist-lib/vite.cjs +1 -1
  74. package/package.json +1 -1
  75. package/src/bridge-contract-input.ts +3 -2
  76. package/src/bridge-contract.ts +8 -0
  77. package/src/host/bridge-host.ts +5 -5
  78. package/src/native-seam-manifest.ts +4 -6
  79. package/src/swift-compile.ts +105 -9
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "Peach";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/is-record.ts
4
4
  function isRecord(value) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/native-app-identity.ts
4
4
  var NATIVE_APP_IDENTITY_PREFIX = "globalThis.__sootsimNativeAppIdentity=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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;
@@ -75,6 +75,7 @@ __export(sdk_exports, {
75
75
  inspectWarnings: () => inspectWarnings,
76
76
  isInspectModeActive: () => isInspectModeActive,
77
77
  isInspectPickCommand: () => isInspectPickCommand,
78
+ isPeachAccessibilityTree: () => isPeachAccessibilityTree,
78
79
  isShellCommandUnavailable: () => isShellCommandUnavailable,
79
80
  isSimSemanticTree: () => isSimSemanticTree,
80
81
  isTapSuccess: () => isTapSuccess,
@@ -675,33 +676,89 @@ function formatLayoutElements(elements, opts) {
675
676
  });
676
677
  return lines.join("\n");
677
678
  }
679
+ function isPeachAccessibilityTree(value) {
680
+ if (!Array.isArray(value)) return false;
681
+ return value.every((node) => {
682
+ if (node === null || typeof node !== "object") return false;
683
+ if (Reflect.get(node, "platform") !== "ios" && Reflect.get(node, "platform") !== "android")
684
+ return false;
685
+ if (typeof Reflect.get(node, "elementId") !== "string") return false;
686
+ if (!Number.isInteger(Reflect.get(node, "nodeId"))) return false;
687
+ for (const key of ["type", "role"]) {
688
+ if (typeof Reflect.get(node, key) !== "string") return false;
689
+ }
690
+ for (const key of ["testID", "label", "hint", "value", "placeholder"]) {
691
+ const field = Reflect.get(node, key);
692
+ if (field !== null && typeof field !== "string") return false;
693
+ }
694
+ for (const key of [
695
+ "isAccessibilityElement",
696
+ "enabled",
697
+ "selected",
698
+ "checked",
699
+ "clickable",
700
+ "isTextInput"
701
+ ]) {
702
+ if (typeof Reflect.get(node, key) !== "boolean") return false;
703
+ }
704
+ const hasFocus = Reflect.get(node, "hasFocus");
705
+ if (hasFocus !== void 0 && typeof hasFocus !== "boolean") return false;
706
+ const state = Reflect.get(node, "state");
707
+ if (state !== null) {
708
+ if (typeof state !== "object") return false;
709
+ const checked = Reflect.get(state, "checked");
710
+ if (typeof checked !== "boolean" && checked !== "mixed") return false;
711
+ for (const key of ["disabled", "selected", "busy", "expanded"]) {
712
+ if (typeof Reflect.get(state, key) !== "boolean") return false;
713
+ }
714
+ }
715
+ const value2 = Reflect.get(node, "accessibilityValue");
716
+ if (value2 !== null) {
717
+ if (typeof value2 !== "object") return false;
718
+ for (const key of ["min", "max", "now"]) {
719
+ const field = Reflect.get(value2, key);
720
+ if (field !== void 0 && (typeof field !== "number" || !Number.isFinite(field)))
721
+ return false;
722
+ }
723
+ const text = Reflect.get(value2, "text");
724
+ if (text !== void 0 && typeof text !== "string") return false;
725
+ }
726
+ if (!isSemanticGeometry(Reflect.get(node, "frame"))) return false;
727
+ return isPeachAccessibilityTree(Reflect.get(node, "children"));
728
+ });
729
+ }
678
730
  async function inspectAccessibilityTree(bridge) {
679
731
  const result = await bridge.send({
680
732
  type: "query",
681
- query: { kind: "find", selector: { visible: true } }
733
+ query: { kind: "accessibility" }
682
734
  });
683
- if (!isSemanticQueryResult(result)) return [];
684
- return result.nodes.flatMap((node) => {
685
- if (node.accessibilityHidden) return [];
686
- if (!node.role && !node.label && !node.text && !node.pressable) return [];
687
- return [
688
- {
689
- role: node.role ?? (node.pressable ? "button" : node.type === "text" ? "statictext" : "none"),
690
- label: node.label ?? node.text ?? null,
691
- hint: null,
692
- state: null,
693
- testID: node.testID ?? null,
735
+ const tree = result !== null && typeof result === "object" ? Reflect.get(result, "accessibility") : void 0;
736
+ if (!isPeachAccessibilityTree(tree))
737
+ throw new Error("engine returned an invalid accessibility snapshot");
738
+ const nodes = [];
739
+ const visit = (node) => {
740
+ if (node.isAccessibilityElement) {
741
+ nodes.push({
742
+ role: node.role,
743
+ label: node.label,
744
+ hint: node.hint,
745
+ state: node.state ? { ...node.state } : null,
746
+ testID: node.testID,
694
747
  position: {
695
- x: Math.round(node.geometry.x),
696
- y: Math.round(node.geometry.y)
748
+ x: Math.round(node.frame.x),
749
+ y: Math.round(node.frame.y)
697
750
  },
698
751
  size: {
699
- w: Math.round(node.geometry.width),
700
- h: Math.round(node.geometry.height)
752
+ w: Math.round(node.frame.width),
753
+ h: Math.round(node.frame.height)
701
754
  }
702
- }
703
- ];
704
- });
755
+ });
756
+ if (node.platform === "ios") return;
757
+ }
758
+ for (const child of node.children) visit(child);
759
+ };
760
+ for (const root of tree) visit(root);
761
+ return nodes;
705
762
  }
706
763
  function resolveFindMode(q) {
707
764
  if (q.testId) {
@@ -2551,6 +2608,7 @@ var SimClient = class {
2551
2608
  inspectWarnings,
2552
2609
  isInspectModeActive,
2553
2610
  isInspectPickCommand,
2611
+ isPeachAccessibilityTree,
2554
2612
  isShellCommandUnavailable,
2555
2613
  isSimSemanticTree,
2556
2614
  isTapSuccess,
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.638 | (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);
@@ -576,33 +576,89 @@ function formatLayoutElements(elements, opts) {
576
576
  });
577
577
  return lines.join("\n");
578
578
  }
579
+ function isPeachAccessibilityTree(value) {
580
+ if (!Array.isArray(value)) return false;
581
+ return value.every((node) => {
582
+ if (node === null || typeof node !== "object") return false;
583
+ if (Reflect.get(node, "platform") !== "ios" && Reflect.get(node, "platform") !== "android")
584
+ return false;
585
+ if (typeof Reflect.get(node, "elementId") !== "string") return false;
586
+ if (!Number.isInteger(Reflect.get(node, "nodeId"))) return false;
587
+ for (const key of ["type", "role"]) {
588
+ if (typeof Reflect.get(node, key) !== "string") return false;
589
+ }
590
+ for (const key of ["testID", "label", "hint", "value", "placeholder"]) {
591
+ const field = Reflect.get(node, key);
592
+ if (field !== null && typeof field !== "string") return false;
593
+ }
594
+ for (const key of [
595
+ "isAccessibilityElement",
596
+ "enabled",
597
+ "selected",
598
+ "checked",
599
+ "clickable",
600
+ "isTextInput"
601
+ ]) {
602
+ if (typeof Reflect.get(node, key) !== "boolean") return false;
603
+ }
604
+ const hasFocus = Reflect.get(node, "hasFocus");
605
+ if (hasFocus !== void 0 && typeof hasFocus !== "boolean") return false;
606
+ const state = Reflect.get(node, "state");
607
+ if (state !== null) {
608
+ if (typeof state !== "object") return false;
609
+ const checked = Reflect.get(state, "checked");
610
+ if (typeof checked !== "boolean" && checked !== "mixed") return false;
611
+ for (const key of ["disabled", "selected", "busy", "expanded"]) {
612
+ if (typeof Reflect.get(state, key) !== "boolean") return false;
613
+ }
614
+ }
615
+ const value2 = Reflect.get(node, "accessibilityValue");
616
+ if (value2 !== null) {
617
+ if (typeof value2 !== "object") return false;
618
+ for (const key of ["min", "max", "now"]) {
619
+ const field = Reflect.get(value2, key);
620
+ if (field !== void 0 && (typeof field !== "number" || !Number.isFinite(field)))
621
+ return false;
622
+ }
623
+ const text = Reflect.get(value2, "text");
624
+ if (text !== void 0 && typeof text !== "string") return false;
625
+ }
626
+ if (!isSemanticGeometry(Reflect.get(node, "frame"))) return false;
627
+ return isPeachAccessibilityTree(Reflect.get(node, "children"));
628
+ });
629
+ }
579
630
  async function inspectAccessibilityTree(bridge) {
580
631
  const result = await bridge.send({
581
632
  type: "query",
582
- query: { kind: "find", selector: { visible: true } }
633
+ query: { kind: "accessibility" }
583
634
  });
584
- if (!isSemanticQueryResult(result)) return [];
585
- return result.nodes.flatMap((node) => {
586
- if (node.accessibilityHidden) return [];
587
- if (!node.role && !node.label && !node.text && !node.pressable) return [];
588
- return [
589
- {
590
- role: node.role ?? (node.pressable ? "button" : node.type === "text" ? "statictext" : "none"),
591
- label: node.label ?? node.text ?? null,
592
- hint: null,
593
- state: null,
594
- testID: node.testID ?? null,
635
+ const tree = result !== null && typeof result === "object" ? Reflect.get(result, "accessibility") : void 0;
636
+ if (!isPeachAccessibilityTree(tree))
637
+ throw new Error("engine returned an invalid accessibility snapshot");
638
+ const nodes = [];
639
+ const visit = (node) => {
640
+ if (node.isAccessibilityElement) {
641
+ nodes.push({
642
+ role: node.role,
643
+ label: node.label,
644
+ hint: node.hint,
645
+ state: node.state ? { ...node.state } : null,
646
+ testID: node.testID,
595
647
  position: {
596
- x: Math.round(node.geometry.x),
597
- y: Math.round(node.geometry.y)
648
+ x: Math.round(node.frame.x),
649
+ y: Math.round(node.frame.y)
598
650
  },
599
651
  size: {
600
- w: Math.round(node.geometry.width),
601
- h: Math.round(node.geometry.height)
652
+ w: Math.round(node.frame.width),
653
+ h: Math.round(node.frame.height)
602
654
  }
603
- }
604
- ];
605
- });
655
+ });
656
+ if (node.platform === "ios") return;
657
+ }
658
+ for (const child of node.children) visit(child);
659
+ };
660
+ for (const root of tree) visit(root);
661
+ return nodes;
606
662
  }
607
663
  function resolveFindMode(q) {
608
664
  if (q.testId) {
@@ -2451,6 +2507,7 @@ export {
2451
2507
  inspectWarnings,
2452
2508
  isInspectModeActive,
2453
2509
  isInspectPickCommand,
2510
+ isPeachAccessibilityTree,
2454
2511
  isShellCommandUnavailable,
2455
2512
  isSimSemanticTree,
2456
2513
  isTapSuccess,