react-native-mcp-kit 3.0.1 → 4.1.0

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 (195) hide show
  1. package/README.md +25 -13
  2. package/dist/babel/testIdPlugin.d.ts.map +1 -1
  3. package/dist/babel/testIdPlugin.js +22 -13
  4. package/dist/babel/testIdPlugin.js.map +1 -1
  5. package/dist/bin/ios-hid +0 -0
  6. package/dist/client/contexts/McpContext/McpProvider.d.ts.map +1 -1
  7. package/dist/client/contexts/McpContext/McpProvider.js +5 -5
  8. package/dist/client/contexts/McpContext/McpProvider.js.map +1 -1
  9. package/dist/client/core/McpClient.d.ts.map +1 -1
  10. package/dist/client/core/McpClient.js +42 -34
  11. package/dist/client/core/McpClient.js.map +1 -1
  12. package/dist/modules/alert/alert.d.ts.map +1 -1
  13. package/dist/modules/alert/alert.js +2 -5
  14. package/dist/modules/alert/alert.js.map +1 -1
  15. package/dist/modules/console/console.d.ts.map +1 -1
  16. package/dist/modules/console/console.js +32 -107
  17. package/dist/modules/console/console.js.map +1 -1
  18. package/dist/modules/console/types.d.ts +1 -0
  19. package/dist/modules/console/types.d.ts.map +1 -1
  20. package/dist/modules/device/device.d.ts.map +1 -1
  21. package/dist/modules/device/device.js +224 -133
  22. package/dist/modules/device/device.js.map +1 -1
  23. package/dist/modules/errors/errors.d.ts.map +1 -1
  24. package/dist/modules/errors/errors.js +19 -36
  25. package/dist/modules/errors/errors.js.map +1 -1
  26. package/dist/modules/fiberTree/children.d.ts +49 -0
  27. package/dist/modules/fiberTree/children.d.ts.map +1 -0
  28. package/dist/modules/fiberTree/children.js +182 -0
  29. package/dist/modules/fiberTree/children.js.map +1 -0
  30. package/dist/modules/fiberTree/constants.d.ts +13 -0
  31. package/dist/modules/fiberTree/constants.d.ts.map +1 -0
  32. package/dist/modules/fiberTree/constants.js +24 -0
  33. package/dist/modules/fiberTree/constants.js.map +1 -0
  34. package/dist/modules/fiberTree/fiberTree.d.ts +3 -6
  35. package/dist/modules/fiberTree/fiberTree.d.ts.map +1 -1
  36. package/dist/modules/fiberTree/fiberTree.js +219 -1080
  37. package/dist/modules/fiberTree/fiberTree.js.map +1 -1
  38. package/dist/modules/fiberTree/finder.d.ts +60 -0
  39. package/dist/modules/fiberTree/finder.d.ts.map +1 -0
  40. package/dist/modules/fiberTree/finder.js +107 -0
  41. package/dist/modules/fiberTree/finder.js.map +1 -0
  42. package/dist/modules/fiberTree/hooks.d.ts +103 -0
  43. package/dist/modules/fiberTree/hooks.d.ts.map +1 -0
  44. package/dist/modules/fiberTree/hooks.js +532 -0
  45. package/dist/modules/fiberTree/hooks.js.map +1 -0
  46. package/dist/modules/fiberTree/projection.d.ts +49 -0
  47. package/dist/modules/fiberTree/projection.d.ts.map +1 -0
  48. package/dist/modules/fiberTree/projection.js +82 -0
  49. package/dist/modules/fiberTree/projection.js.map +1 -0
  50. package/dist/modules/fiberTree/query.d.ts +56 -0
  51. package/dist/modules/fiberTree/query.d.ts.map +1 -0
  52. package/dist/modules/fiberTree/query.js +151 -0
  53. package/dist/modules/fiberTree/query.js.map +1 -0
  54. package/dist/modules/fiberTree/redact.d.ts +24 -0
  55. package/dist/modules/fiberTree/redact.d.ts.map +1 -0
  56. package/dist/modules/fiberTree/redact.js +51 -0
  57. package/dist/modules/fiberTree/redact.js.map +1 -0
  58. package/dist/modules/fiberTree/types.d.ts +7 -0
  59. package/dist/modules/fiberTree/types.d.ts.map +1 -1
  60. package/dist/modules/fiberTree/utils.d.ts +8 -2
  61. package/dist/modules/fiberTree/utils.d.ts.map +1 -1
  62. package/dist/modules/fiberTree/utils.js +79 -78
  63. package/dist/modules/fiberTree/utils.js.map +1 -1
  64. package/dist/modules/fiberTree/viewport.d.ts +28 -0
  65. package/dist/modules/fiberTree/viewport.d.ts.map +1 -0
  66. package/dist/modules/fiberTree/viewport.js +50 -0
  67. package/dist/modules/fiberTree/viewport.js.map +1 -0
  68. package/dist/modules/fiberTree/waitFor.d.ts +52 -0
  69. package/dist/modules/fiberTree/waitFor.d.ts.map +1 -0
  70. package/dist/modules/fiberTree/waitFor.js +98 -0
  71. package/dist/modules/fiberTree/waitFor.js.map +1 -0
  72. package/dist/modules/logBox/logBox.d.ts.map +1 -1
  73. package/dist/modules/logBox/logBox.js +59 -66
  74. package/dist/modules/logBox/logBox.js.map +1 -1
  75. package/dist/modules/navigation/navigation.d.ts.map +1 -1
  76. package/dist/modules/navigation/navigation.js +115 -114
  77. package/dist/modules/navigation/navigation.js.map +1 -1
  78. package/dist/modules/network/network.d.ts.map +1 -1
  79. package/dist/modules/network/network.js +78 -197
  80. package/dist/modules/network/network.js.map +1 -1
  81. package/dist/modules/network/types.d.ts +23 -27
  82. package/dist/modules/network/types.d.ts.map +1 -1
  83. package/dist/modules/reactQuery/reactQuery.d.ts.map +1 -1
  84. package/dist/modules/reactQuery/reactQuery.js +46 -52
  85. package/dist/modules/reactQuery/reactQuery.js.map +1 -1
  86. package/dist/modules/storage/storage.d.ts.map +1 -1
  87. package/dist/modules/storage/storage.js +20 -3
  88. package/dist/modules/storage/storage.js.map +1 -1
  89. package/dist/server/bridge.d.ts +1 -0
  90. package/dist/server/bridge.d.ts.map +1 -1
  91. package/dist/server/bridge.js +1 -0
  92. package/dist/server/bridge.js.map +1 -1
  93. package/dist/server/host/coredevice/dtx.d.ts +79 -0
  94. package/dist/server/host/coredevice/dtx.d.ts.map +1 -0
  95. package/dist/server/host/coredevice/dtx.js +453 -0
  96. package/dist/server/host/coredevice/dtx.js.map +1 -0
  97. package/dist/server/host/coredevice/nska.d.ts +6 -0
  98. package/dist/server/host/coredevice/nska.d.ts.map +1 -0
  99. package/dist/server/host/coredevice/nska.js +277 -0
  100. package/dist/server/host/coredevice/nska.js.map +1 -0
  101. package/dist/server/host/coredevice/rsd.d.ts +20 -0
  102. package/dist/server/host/coredevice/rsd.d.ts.map +1 -0
  103. package/dist/server/host/coredevice/rsd.js +244 -0
  104. package/dist/server/host/coredevice/rsd.js.map +1 -0
  105. package/dist/server/host/coredevice/screenshot.d.ts +11 -0
  106. package/dist/server/host/coredevice/screenshot.d.ts.map +1 -0
  107. package/dist/server/host/coredevice/screenshot.js +84 -0
  108. package/dist/server/host/coredevice/screenshot.js.map +1 -0
  109. package/dist/server/host/coredevice/tunnel.d.ts +29 -0
  110. package/dist/server/host/coredevice/tunnel.d.ts.map +1 -0
  111. package/dist/server/host/coredevice/tunnel.js +222 -0
  112. package/dist/server/host/coredevice/tunnel.js.map +1 -0
  113. package/dist/server/host/coredevice/xpc.d.ts +21 -0
  114. package/dist/server/host/coredevice/xpc.d.ts.map +1 -0
  115. package/dist/server/host/coredevice/xpc.js +318 -0
  116. package/dist/server/host/coredevice/xpc.js.map +1 -0
  117. package/dist/server/host/deviceResolver.d.ts +8 -0
  118. package/dist/server/host/deviceResolver.d.ts.map +1 -1
  119. package/dist/server/host/deviceResolver.js +128 -62
  120. package/dist/server/host/deviceResolver.js.map +1 -1
  121. package/dist/server/host/tools/capture.d.ts.map +1 -1
  122. package/dist/server/host/tools/capture.js +26 -0
  123. package/dist/server/host/tools/capture.js.map +1 -1
  124. package/dist/server/host/tools/input.js +2 -2
  125. package/dist/server/host/tools/input.js.map +1 -1
  126. package/dist/server/mcpServer.d.ts.map +1 -1
  127. package/dist/server/mcpServer.js +44 -3
  128. package/dist/server/mcpServer.js.map +1 -1
  129. package/dist/server/metro/eventCapture.d.ts +0 -2
  130. package/dist/server/metro/eventCapture.d.ts.map +1 -1
  131. package/dist/server/metro/eventCapture.js +1 -2
  132. package/dist/server/metro/eventCapture.js.map +1 -1
  133. package/dist/server/metro/tools/events.d.ts.map +1 -1
  134. package/dist/server/metro/tools/events.js +11 -11
  135. package/dist/server/metro/tools/events.js.map +1 -1
  136. package/dist/shared/projection/projectValue.d.ts +90 -0
  137. package/dist/shared/projection/projectValue.d.ts.map +1 -0
  138. package/dist/shared/projection/projectValue.js +322 -0
  139. package/dist/shared/projection/projectValue.js.map +1 -0
  140. package/dist/shared/projection/redact.d.ts +31 -0
  141. package/dist/shared/projection/redact.d.ts.map +1 -0
  142. package/dist/shared/projection/redact.js +78 -0
  143. package/dist/shared/projection/redact.js.map +1 -0
  144. package/dist/shared/projection/resolvePath.d.ts +45 -0
  145. package/dist/shared/projection/resolvePath.d.ts.map +1 -0
  146. package/dist/shared/projection/resolvePath.js +211 -0
  147. package/dist/shared/projection/resolvePath.js.map +1 -0
  148. package/dist/shared/protocol.d.ts +2 -1
  149. package/dist/shared/protocol.d.ts.map +1 -1
  150. package/dist/shared/protocol.js +1 -1
  151. package/dist/shared/rn/core.d.ts +48 -0
  152. package/dist/shared/rn/core.d.ts.map +1 -0
  153. package/dist/shared/rn/core.js +100 -0
  154. package/dist/shared/rn/core.js.map +1 -0
  155. package/dist/shared/rn/deviceInfo.d.ts +40 -0
  156. package/dist/shared/rn/deviceInfo.d.ts.map +1 -0
  157. package/dist/shared/rn/deviceInfo.js +78 -0
  158. package/dist/shared/rn/deviceInfo.js.map +1 -0
  159. package/package.json +4 -2
  160. package/dist/client/hooks/useMcpState.d.ts +0 -3
  161. package/dist/client/hooks/useMcpState.d.ts.map +0 -1
  162. package/dist/client/hooks/useMcpState.js +0 -20
  163. package/dist/client/hooks/useMcpState.js.map +0 -1
  164. package/dist/server/canonicalize.d.ts +0 -8
  165. package/dist/server/canonicalize.d.ts.map +0 -1
  166. package/dist/server/canonicalize.js +0 -23
  167. package/dist/server/canonicalize.js.map +0 -1
  168. package/dist/server/host/modules/screenshot.d.ts +0 -4
  169. package/dist/server/host/modules/screenshot.d.ts.map +0 -1
  170. package/dist/server/host/modules/screenshot.js +0 -615
  171. package/dist/server/host/modules/screenshot.js.map +0 -1
  172. package/dist/server/host/tools/connectionStatus.d.ts +0 -9
  173. package/dist/server/host/tools/connectionStatus.d.ts.map +0 -1
  174. package/dist/server/host/tools/connectionStatus.js +0 -39
  175. package/dist/server/host/tools/connectionStatus.js.map +0 -1
  176. package/dist/server/host/tools/symbolicate.d.ts +0 -3
  177. package/dist/server/host/tools/symbolicate.d.ts.map +0 -1
  178. package/dist/server/host/tools/symbolicate.js +0 -209
  179. package/dist/server/host/tools/symbolicate.js.map +0 -1
  180. package/dist/server/host/wda.d.ts +0 -15
  181. package/dist/server/host/wda.d.ts.map +0 -1
  182. package/dist/server/host/wda.js +0 -100
  183. package/dist/server/host/wda.js.map +0 -1
  184. package/dist/server/inputSchemaToZod.d.ts +0 -19
  185. package/dist/server/inputSchemaToZod.d.ts.map +0 -1
  186. package/dist/server/inputSchemaToZod.js +0 -89
  187. package/dist/server/inputSchemaToZod.js.map +0 -1
  188. package/dist/server/metro/tools/openUrl.d.ts +0 -3
  189. package/dist/server/metro/tools/openUrl.d.ts.map +0 -1
  190. package/dist/server/metro/tools/openUrl.js +0 -71
  191. package/dist/server/metro/tools/openUrl.js.map +0 -1
  192. package/dist/shared/slice.d.ts +0 -16
  193. package/dist/shared/slice.d.ts.map +0 -1
  194. package/dist/shared/slice.js +0 -29
  195. package/dist/shared/slice.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ /**
3
+ * `select` parser — converts the agent's raw select array into a strict
4
+ * `Projection` object the query handler can read against. Recognises three
5
+ * shapes per entry:
6
+ * - bare string → include the named field with defaults
7
+ * - { field: true } → same
8
+ * - { field: options } → include with per-field options
9
+ *
10
+ * Heavy fields (`props`, `hooks`, `children`) take per-field option
11
+ * objects; light fields (mcpId / name / testID / bounds / refMethods) just
12
+ * toggle on. Validation of children's nested select happens inside
13
+ * `parseChildrenOptions` so the error surfaces with the offending field
14
+ * name.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.parseProjection = exports.QUERY_DEFAULT_FIELDS = void 0;
18
+ const children_1 = require("./children");
19
+ const hooks_1 = require("./hooks");
20
+ exports.QUERY_DEFAULT_FIELDS = ['mcpId', 'name', 'testID'];
21
+ /**
22
+ * Parse the `select` arg into a flat Projection. Each element of `select`
23
+ * may be either a string (include the named field with default options)
24
+ * or an object whose keys are field names and whose values are
25
+ * `true` / `false` / per-field projection options.
26
+ *
27
+ * Per-field options:
28
+ * props: { path?, depth?, maxBytes? } — projection of the props object
29
+ * hooks: HooksRawOptions — kinds/names filters + withValues
30
+ * + path/depth/maxBytes for hook
31
+ * values
32
+ * children: number | { treeDepth?, select?, itemsCap? }
33
+ * — recursive light-only walker; see
34
+ * parseChildrenSelect for limits.
35
+ *
36
+ * Heavy fields (props, hooks) are projected handler-side with these
37
+ * per-field options so the rest of the response (mcpId, name, total, ...)
38
+ * stays raw and always visible.
39
+ */
40
+ const parseProjection = (selectArg) => {
41
+ const fields = new Set();
42
+ let propsRaw = {};
43
+ let hooksRaw;
44
+ let childrenOpts = null;
45
+ if (Array.isArray(selectArg)) {
46
+ for (const entry of selectArg) {
47
+ if (typeof entry === 'string') {
48
+ fields.add(entry);
49
+ continue;
50
+ }
51
+ if (entry && typeof entry === 'object') {
52
+ for (const [key, value] of Object.entries(entry)) {
53
+ if (value === false)
54
+ continue;
55
+ if (key === 'children') {
56
+ childrenOpts = (0, children_1.parseChildrenOptions)(value);
57
+ continue;
58
+ }
59
+ fields.add(key);
60
+ if (key === 'props' && value && typeof value === 'object') {
61
+ propsRaw = value;
62
+ }
63
+ else if (key === 'hooks' && value && typeof value === 'object') {
64
+ hooksRaw = value;
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ if (fields.size === 0) {
71
+ for (const f of exports.QUERY_DEFAULT_FIELDS)
72
+ fields.add(f);
73
+ }
74
+ return {
75
+ children: childrenOpts,
76
+ fields,
77
+ hooks: (0, hooks_1.buildHooksOptions)(hooksRaw),
78
+ props: propsRaw,
79
+ };
80
+ };
81
+ exports.parseProjection = parseProjection;
82
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/modules/fiberTree/projection.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAEH,yCAAwE;AACxE,mCAAqF;AAexE,QAAA,oBAAoB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;AAEzE;;;;;;;;;;;;;;;;;;GAkBG;AACI,MAAM,eAAe,GAAG,CAAC,SAAkB,EAAc,EAAE;IAChE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,IAAI,QAAQ,GAAiB,EAAE,CAAC;IAChC,IAAI,QAAqC,CAAC;IAC1C,IAAI,YAAY,GAA2B,IAAI,CAAC;IAEhD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAClB,SAAS;YACX,CAAC;YACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;oBAC5E,IAAI,KAAK,KAAK,KAAK;wBAAE,SAAS;oBAC9B,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;wBACvB,YAAY,GAAG,IAAA,+BAAoB,EAAC,KAAK,CAAC,CAAC;wBAC3C,SAAS;oBACX,CAAC;oBACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAChB,IAAI,GAAG,KAAK,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;wBAC1D,QAAQ,GAAG,KAAqB,CAAC;oBACnC,CAAC;yBAAM,IAAI,GAAG,KAAK,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;wBACjE,QAAQ,GAAG,KAAwB,CAAC;oBACtC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,4BAAoB;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,MAAM;QACN,KAAK,EAAE,IAAA,yBAAiB,EAAC,QAAQ,CAAC;QAClC,KAAK,EAAE,QAAQ;KAChB,CAAC;AACJ,CAAC,CAAC;AAxCW,QAAA,eAAe,mBAwC1B"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Query primitive — chained `steps`, each step a `scope` + criteria pair.
3
+ * Each step's matches fan out into the next step's scope (so a 2-step
4
+ * `[{ name: 'List' }, { scope: 'children', name: 'Item' }]` reads as
5
+ * "find all Lists, then for each List collect its Item children").
6
+ *
7
+ * Scopes (`QueryScope`) control which fibers a step *considers*; criteria
8
+ * (from `ComponentQuery`) filter that set. Validation rejects unknown
9
+ * scope strings at the entry point so typos surface as a structured
10
+ * error instead of silently degrading to the default `descendants`.
11
+ */
12
+ import { type ComponentQuery, type Fiber } from './types';
13
+ export interface FiberTreeNavigationRef {
14
+ getCurrentRoute?: () => unknown;
15
+ }
16
+ export type QueryScope = 'ancestors' | 'children' | 'descendants' | 'nearest_host' | 'parent' | 'root' | 'screen' | 'self' | 'siblings';
17
+ export interface QueryStep extends ComponentQuery {
18
+ /**
19
+ * If provided, only the N-th match survives into the next step. Omit to
20
+ * forward every match along (fan-out across scopes on the next step).
21
+ */
22
+ index?: number;
23
+ /**
24
+ * Which fibers relative to the previous step's result are considered for this
25
+ * step. Defaults to 'descendants' (so the first step walks the whole tree
26
+ * from the fiber root). Other values walk 'parent'/'ancestors'/'siblings'/
27
+ * 'children'/'self'.
28
+ */
29
+ scope?: QueryScope;
30
+ }
31
+ export interface QueryRuntime {
32
+ root: Fiber;
33
+ navigationRef?: FiberTreeNavigationRef | null;
34
+ }
35
+ /**
36
+ * Up-front validation of every step's `scope`. Returns a human-readable
37
+ * error string on a bad scope (with the valid set listed for the agent),
38
+ * or null when all steps look sane. Keeps unknown scopes from silently
39
+ * collapsing to the default 'descendants' inside `collectByScope`.
40
+ */
41
+ export declare const validateSteps: (steps: QueryStep[]) => string | null;
42
+ /**
43
+ * Walk the chain of steps starting from the fiber root. Each iteration
44
+ * collects candidates via `collectByScope`, then filters with
45
+ * `matchesQuery`. `step.index` picks one match; otherwise all matches
46
+ * fan out as the input set for the next step.
47
+ */
48
+ export declare const runQueryChain: (runtime: QueryRuntime, steps: QueryStep[]) => Fiber[];
49
+ /**
50
+ * Keep only fibers whose ancestor chain contains no other match. Removes
51
+ * wrapper cascades (PressableView → Pressable → View → RCTView) while
52
+ * keeping independent siblings with overlapping bounds (e.g.
53
+ * absolute-positioned overlays). Preserves original DFS order.
54
+ */
55
+ export declare const dedupAncestors: (matches: Fiber[]) => Fiber[];
56
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/modules/fiberTree/query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAc1D,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC;CACjC;AAED,MAAM,MAAM,UAAU,GAClB,WAAW,GACX,UAAU,GACV,aAAa,GACb,cAAc,GACd,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,MAAM,GACN,UAAU,CAAC;AAcf,MAAM,WAAW,SAAU,SAAQ,cAAc;IAC/C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,aAAa,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAC/C;AAiDD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,UAAW,SAAS,EAAE,KAAG,MAAM,GAAG,IAU3D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,YAAa,YAAY,SAAS,SAAS,EAAE,KAAG,KAAK,EA0B9E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,YAAa,KAAK,EAAE,KAAG,KAAK,EAWtD,CAAC"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ /**
3
+ * Query primitive — chained `steps`, each step a `scope` + criteria pair.
4
+ * Each step's matches fan out into the next step's scope (so a 2-step
5
+ * `[{ name: 'List' }, { scope: 'children', name: 'Item' }]` reads as
6
+ * "find all Lists, then for each List collect its Item children").
7
+ *
8
+ * Scopes (`QueryScope`) control which fibers a step *considers*; criteria
9
+ * (from `ComponentQuery`) filter that set. Validation rejects unknown
10
+ * scope strings at the entry point so typos surface as a structured
11
+ * error instead of silently degrading to the default `descendants`.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.dedupAncestors = exports.runQueryChain = exports.validateSteps = void 0;
15
+ const utils_1 = require("./utils");
16
+ const VALID_SCOPES = new Set([
17
+ 'ancestors',
18
+ 'children',
19
+ 'descendants',
20
+ 'nearest_host',
21
+ 'parent',
22
+ 'root',
23
+ 'screen',
24
+ 'self',
25
+ 'siblings',
26
+ ]);
27
+ const resolveScreenFiber = (runtime) => {
28
+ const nav = runtime.navigationRef;
29
+ if (!nav || typeof nav.getCurrentRoute !== 'function')
30
+ return null;
31
+ const route = nav.getCurrentRoute();
32
+ const key = route && typeof route.key === 'string' ? route.key : undefined;
33
+ if (!key)
34
+ return null;
35
+ return (0, utils_1.findScreenFiberByRouteKey)(runtime.root, key);
36
+ };
37
+ const collectByScope = (fiber, scope, runtime) => {
38
+ switch (scope) {
39
+ case 'self':
40
+ return [fiber];
41
+ case 'parent':
42
+ return fiber.return ? [fiber.return] : [];
43
+ case 'ancestors':
44
+ return (0, utils_1.getAncestors)(fiber);
45
+ case 'children':
46
+ return (0, utils_1.getDirectChildren)(fiber);
47
+ case 'siblings':
48
+ return (0, utils_1.getSiblings)(fiber);
49
+ case 'nearest_host': {
50
+ const host = (0, utils_1.findHostFiber)(fiber);
51
+ return host ? [host] : [];
52
+ }
53
+ case 'root':
54
+ // Top of the fiber tree, regardless of the previous step's match. Use
55
+ // as the first step (e.g. `query({ steps: [{ scope: 'root' }], select:
56
+ // [{ children: 5 }] })` to dump the whole tree). Criteria on this step
57
+ // are matched against the root fiber itself; if you want descendants
58
+ // of root, follow with another step using scope:'descendants'.
59
+ return [runtime.root];
60
+ case 'screen': {
61
+ const screen = resolveScreenFiber(runtime);
62
+ if (!screen)
63
+ return [];
64
+ return (0, utils_1.findAllByQuery)(screen, {}).filter((f) => {
65
+ return f !== screen;
66
+ });
67
+ }
68
+ case 'descendants':
69
+ default:
70
+ return (0, utils_1.findAllByQuery)(fiber, {}).filter((f) => {
71
+ return f !== fiber;
72
+ });
73
+ }
74
+ };
75
+ /**
76
+ * Up-front validation of every step's `scope`. Returns a human-readable
77
+ * error string on a bad scope (with the valid set listed for the agent),
78
+ * or null when all steps look sane. Keeps unknown scopes from silently
79
+ * collapsing to the default 'descendants' inside `collectByScope`.
80
+ */
81
+ const validateSteps = (steps) => {
82
+ for (let i = 0; i < steps.length; i++) {
83
+ const step = steps[i];
84
+ if (!step)
85
+ continue;
86
+ if (step.scope !== undefined && !VALID_SCOPES.has(step.scope)) {
87
+ const valid = Array.from(VALID_SCOPES).sort().join(' / ');
88
+ return `steps[${i}].scope: unknown scope "${step.scope}". Valid: ${valid}.`;
89
+ }
90
+ }
91
+ return null;
92
+ };
93
+ exports.validateSteps = validateSteps;
94
+ /**
95
+ * Walk the chain of steps starting from the fiber root. Each iteration
96
+ * collects candidates via `collectByScope`, then filters with
97
+ * `matchesQuery`. `step.index` picks one match; otherwise all matches
98
+ * fan out as the input set for the next step.
99
+ */
100
+ const runQueryChain = (runtime, steps) => {
101
+ let current = [runtime.root];
102
+ for (const step of steps) {
103
+ const scope = step.scope ?? 'descendants';
104
+ const seen = new Set();
105
+ const collected = [];
106
+ for (const fiber of current) {
107
+ for (const candidate of collectByScope(fiber, scope, runtime)) {
108
+ if (!seen.has(candidate)) {
109
+ seen.add(candidate);
110
+ collected.push(candidate);
111
+ }
112
+ }
113
+ }
114
+ const filtered = collected.filter((f) => {
115
+ return (0, utils_1.matchesQuery)(f, step);
116
+ });
117
+ if (typeof step.index === 'number') {
118
+ const picked = filtered[step.index];
119
+ current = picked ? [picked] : [];
120
+ }
121
+ else {
122
+ current = filtered;
123
+ }
124
+ if (current.length === 0)
125
+ return [];
126
+ }
127
+ return current;
128
+ };
129
+ exports.runQueryChain = runQueryChain;
130
+ /**
131
+ * Keep only fibers whose ancestor chain contains no other match. Removes
132
+ * wrapper cascades (PressableView → Pressable → View → RCTView) while
133
+ * keeping independent siblings with overlapping bounds (e.g.
134
+ * absolute-positioned overlays). Preserves original DFS order.
135
+ */
136
+ const dedupAncestors = (matches) => {
137
+ if (matches.length < 2)
138
+ return matches;
139
+ const matchSet = new Set(matches);
140
+ return matches.filter((fiber) => {
141
+ let p = fiber.return;
142
+ while (p) {
143
+ if (matchSet.has(p))
144
+ return false;
145
+ p = p.return;
146
+ }
147
+ return true;
148
+ });
149
+ };
150
+ exports.dedupAncestors = dedupAncestors;
151
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/modules/fiberTree/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Hook-value redaction. Names matching any compiled pattern have their
3
+ * `value` masked as `"[redacted]"` in `withValues: true` responses while
4
+ * keeping kind / name / hook visible. Matching is applied to a hook's
5
+ * `name` AND every entry in its `via` chain so values stay masked even
6
+ * when nested under a sensitive custom hook (a leaf `value` inside a
7
+ * `useAuth()` expansion).
8
+ *
9
+ * Default list catches the common security-sensitive names. Tuned to
10
+ * match real-world variable names without over-matching innocents:
11
+ * `Pin$` is anchored so it doesn't catch "Spinner"; broad terms like
12
+ * `auth` are deliberately omitted (would catch `isAuthenticated`).
13
+ */
14
+ export declare const DEFAULT_REDACT_HOOK_NAMES: ReadonlyArray<string | RegExp>;
15
+ /** Placeholder put on the `value` field of a redacted hook entry. */
16
+ export declare const REDACTED_VALUE = "[redacted]";
17
+ /**
18
+ * Compile a mixed string/RegExp list into RegExps. String patterns are
19
+ * escaped and made case-insensitive (so `"password"` catches `password`,
20
+ * `oldPassword`, `passwordHash`); RegExp values are kept verbatim.
21
+ */
22
+ export declare const compileRedactPatterns: (raw: ReadonlyArray<string | RegExp>) => RegExp[];
23
+ export declare const matchesAnyRedactPattern: (name: string, patterns: RegExp[]) => boolean;
24
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../src/modules/fiberTree/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,yBAAyB,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CASpE,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,cAAc,eAAe,CAAC;AAM3C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAS,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,KAAG,MAAM,EAIjF,CAAC;AAEF,eAAO,MAAM,uBAAuB,SAAU,MAAM,YAAY,MAAM,EAAE,KAAG,OAK1E,CAAC"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchesAnyRedactPattern = exports.compileRedactPatterns = exports.REDACTED_VALUE = exports.DEFAULT_REDACT_HOOK_NAMES = void 0;
4
+ /**
5
+ * Hook-value redaction. Names matching any compiled pattern have their
6
+ * `value` masked as `"[redacted]"` in `withValues: true` responses while
7
+ * keeping kind / name / hook visible. Matching is applied to a hook's
8
+ * `name` AND every entry in its `via` chain so values stay masked even
9
+ * when nested under a sensitive custom hook (a leaf `value` inside a
10
+ * `useAuth()` expansion).
11
+ *
12
+ * Default list catches the common security-sensitive names. Tuned to
13
+ * match real-world variable names without over-matching innocents:
14
+ * `Pin$` is anchored so it doesn't catch "Spinner"; broad terms like
15
+ * `auth` are deliberately omitted (would catch `isAuthenticated`).
16
+ */
17
+ exports.DEFAULT_REDACT_HOOK_NAMES = [
18
+ /password/i,
19
+ /token/i,
20
+ /jwt/i,
21
+ /secret/i,
22
+ /Pin$/,
23
+ /credential/i,
24
+ /apiKey/i,
25
+ /authorization/i,
26
+ ];
27
+ /** Placeholder put on the `value` field of a redacted hook entry. */
28
+ exports.REDACTED_VALUE = '[redacted]';
29
+ const escapeRegExp = (s) => {
30
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
31
+ };
32
+ /**
33
+ * Compile a mixed string/RegExp list into RegExps. String patterns are
34
+ * escaped and made case-insensitive (so `"password"` catches `password`,
35
+ * `oldPassword`, `passwordHash`); RegExp values are kept verbatim.
36
+ */
37
+ const compileRedactPatterns = (raw) => {
38
+ return raw.map((p) => {
39
+ return typeof p === 'string' ? new RegExp(escapeRegExp(p), 'i') : p;
40
+ });
41
+ };
42
+ exports.compileRedactPatterns = compileRedactPatterns;
43
+ const matchesAnyRedactPattern = (name, patterns) => {
44
+ for (const p of patterns) {
45
+ if (p.test(name))
46
+ return true;
47
+ }
48
+ return false;
49
+ };
50
+ exports.matchesAnyRedactPattern = matchesAnyRedactPattern;
51
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../src/modules/fiberTree/redact.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;GAYG;AACU,QAAA,yBAAyB,GAAmC;IACvE,WAAW;IACX,QAAQ;IACR,MAAM;IACN,SAAS;IACT,MAAM;IACN,aAAa;IACb,SAAS;IACT,gBAAgB;CACjB,CAAC;AAEF,qEAAqE;AACxD,QAAA,cAAc,GAAG,YAAY,CAAC;AAE3C,MAAM,YAAY,GAAG,CAAC,CAAS,EAAU,EAAE;IACzC,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF;;;;GAIG;AACI,MAAM,qBAAqB,GAAG,CAAC,GAAmC,EAAY,EAAE;IACrF,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAJW,QAAA,qBAAqB,yBAIhC;AAEK,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAE,QAAkB,EAAW,EAAE;IACnF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AALW,QAAA,uBAAuB,2BAKlC"}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Loose alias for React's internal Fiber shape — we only ever poke a handful
3
+ * of fields (memoizedProps, memoizedState, type, return, sibling, child)
4
+ * and the exact shape drifts between React versions. Centralised here so
5
+ * every sub-module reaches for the same alias instead of re-declaring it.
6
+ */
7
+ export type Fiber = any;
1
8
  export type ComponentType = 'composite' | 'host' | 'other' | 'text';
2
9
  export interface Bounds {
3
10
  centerX: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/fiberTree/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpE,MAAM,WAAW,MAAM;IAErB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,MAAM,GACN,MAAM,GACN;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,GAAG,CAAC,EAAE,cAAc,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,cAAc,GAAG,cAAc,EAAE,CAAC;IACxC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/fiberTree/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,KAAK,GAAG,GAAG,CAAC;AAExB,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpE,MAAM,WAAW,MAAM;IAErB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,MAAM,GACN,MAAM,GACN;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,GAAG,CAAC,EAAE,cAAc,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,cAAc,GAAG,cAAc,EAAE,CAAC;IACxC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -1,10 +1,16 @@
1
+ import { type ProjectOptions } from '../../shared/projection/projectValue';
1
2
  import { type Bounds, type ComponentQuery, type SerializedComponent } from './types';
2
3
  type Fiber = any;
3
4
  export declare const setRootRef: (ref: unknown) => void;
4
5
  export declare const getFiberRoot: () => Fiber | null;
5
6
  export declare const getComponentName: (fiber: Fiber) => string;
6
- export declare const serializeValue: (value: unknown, seen?: WeakSet<object>, depth?: number, maxDepth?: number) => unknown;
7
- export declare const serializeProps: (props: Record<string, unknown> | null) => Record<string, unknown>;
7
+ /**
8
+ * Projection helper used everywhere fiber values are serialised (props, hook
9
+ * values, fiber refs). Pre-applies the fiber-aware collapse rule + skip list
10
+ * over the shared `projectValue`. Callers can pass `path` / `depth` / etc.
11
+ * through `options` like with `projectValue` directly.
12
+ */
13
+ export declare const projectFiberValue: (value: unknown, options?: ProjectOptions) => unknown;
8
14
  export declare const serializeFiber: (fiber: Fiber, maxDepth: number, currentDepth?: number) => SerializedComponent | null;
9
15
  export declare const findFiber: (root: Fiber, predicate: (fiber: Fiber) => boolean) => Fiber | null;
10
16
  export declare const findAllFibers: (root: Fiber, predicate: (fiber: Fiber) => boolean) => Fiber[];
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/modules/fiberTree/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EACX,KAAK,cAAc,EAGnB,KAAK,mBAAmB,EACzB,MAAM,SAAS,CAAC;AAYjB,KAAK,KAAK,GAAG,GAAG,CAAC;AAKjB,eAAO,MAAM,UAAU,QAAS,OAAO,KAAG,IAEzC,CAAC;AAeF,eAAO,MAAM,YAAY,QAAO,KAAK,GAAG,IAKvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,UAAW,KAAK,KAAG,MA+B/C,CAAC;AAmBF,eAAO,MAAM,cAAc,UAClB,OAAO,SACR,OAAO,CAAC,MAAM,CAAC,6BAEX,MAAM,KACf,OAyDF,CAAC;AAWF,eAAO,MAAM,cAAc,UAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAc5F,CAAC;AAoBF,eAAO,MAAM,cAAc,UAClB,KAAK,YACF,MAAM,4BAEf,mBAAmB,GAAG,IAaxB,CAAC;AA4EF,eAAO,MAAM,SAAS,SAAU,KAAK,aAAa,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,KAAG,KAAK,GAAG,IAWrF,CAAC;AAEF,eAAO,MAAM,aAAa,SAAU,KAAK,aAAa,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,KAAG,KAAK,EAgBtF,CAAC;AAEF,eAAO,MAAM,WAAW,SAAU,KAAK,SAAS,MAAM,KAAG,KAAK,GAAG,IAIhE,CAAC;AAEF,eAAO,MAAM,YAAY,SAAU,KAAK,UAAU,MAAM,KAAG,KAAK,GAAG,IAIlE,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,KAAK,QAAQ,MAAM,KAAG,KAAK,GAAG,IAI9D,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,KAAK,QAAQ,MAAM,KAAG,KAAK,GAAG,IAK9D,CAAC;AAqEF,eAAO,MAAM,YAAY,UAAW,KAAK,SAAS,cAAc,KAAG,OA0ClE,CAAC;AAEF,eAAO,MAAM,cAAc,SAAU,KAAK,SAAS,cAAc,KAAG,KAAK,EAIxE,CAAC;AAGF,eAAO,MAAM,iBAAiB,UAAW,KAAK,KAAG,KAAK,EAQrD,CAAC;AAGF,eAAO,MAAM,WAAW,UAAW,KAAK,KAAG,KAAK,EAM/C,CAAC;AAGF,eAAO,MAAM,YAAY,UAAW,KAAK,KAAG,KAAK,EAQhD,CAAC;AAGF,eAAO,MAAM,aAAa,UAAW,KAAK,KAAG,KAAK,GAAG,IAUpD,CAAC;AAaF;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,SAAU,KAAK,YAAY,MAAM,KAAG,KAAK,GAAG,IAajF,CAAC;AAGF,eAAO,MAAM,iBAAiB,UAAW,KAAK,KAAG,OAoBhD,CAAC;AAYF,eAAO,MAAM,YAAY,UAAiB,KAAK,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAiDtE,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAAc,OAAO,KAAG,MAAM,EAiB7D,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/modules/fiberTree/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EACL,KAAK,MAAM,EACX,KAAK,cAAc,EAGnB,KAAK,mBAAmB,EACzB,MAAM,SAAS,CAAC;AAYjB,KAAK,KAAK,GAAG,GAAG,CAAC;AAKjB,eAAO,MAAM,UAAU,QAAS,OAAO,KAAG,IAEzC,CAAC;AAeF,eAAO,MAAM,YAAY,QAAO,KAAK,GAAG,IAKvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,UAAW,KAAK,KAAG,MAqC/C,CAAC;AA6EF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,UAAW,OAAO,YAAW,cAAc,KAAQ,OAMhF,CAAC;AAoBF,eAAO,MAAM,cAAc,UAClB,KAAK,YACF,MAAM,4BAEf,mBAAmB,GAAG,IAaxB,CAAC;AA+EF,eAAO,MAAM,SAAS,SAAU,KAAK,aAAa,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,KAAG,KAAK,GAAG,IAWrF,CAAC;AAEF,eAAO,MAAM,aAAa,SAAU,KAAK,aAAa,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,KAAG,KAAK,EAgBtF,CAAC;AAEF,eAAO,MAAM,WAAW,SAAU,KAAK,SAAS,MAAM,KAAG,KAAK,GAAG,IAIhE,CAAC;AAEF,eAAO,MAAM,YAAY,SAAU,KAAK,UAAU,MAAM,KAAG,KAAK,GAAG,IAIlE,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,KAAK,QAAQ,MAAM,KAAG,KAAK,GAAG,IAI9D,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,KAAK,QAAQ,MAAM,KAAG,KAAK,GAAG,IAK9D,CAAC;AAqEF,eAAO,MAAM,YAAY,UAAW,KAAK,SAAS,cAAc,KAAG,OA0ClE,CAAC;AAEF,eAAO,MAAM,cAAc,SAAU,KAAK,SAAS,cAAc,KAAG,KAAK,EAIxE,CAAC;AAGF,eAAO,MAAM,iBAAiB,UAAW,KAAK,KAAG,KAAK,EAQrD,CAAC;AAGF,eAAO,MAAM,WAAW,UAAW,KAAK,KAAG,KAAK,EAM/C,CAAC;AAGF,eAAO,MAAM,YAAY,UAAW,KAAK,KAAG,KAAK,EAQhD,CAAC;AAGF,eAAO,MAAM,aAAa,UAAW,KAAK,KAAG,KAAK,GAAG,IAUpD,CAAC;AAaF;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,SAAU,KAAK,YAAY,MAAM,KAAG,KAAK,GAAG,IAajF,CAAC;AAGF,eAAO,MAAM,iBAAiB,UAAW,KAAK,KAAG,OAoBhD,CAAC;AAYF,eAAO,MAAM,YAAY,UAAiB,KAAK,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAgDtE,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAAc,OAAO,KAAG,MAAM,EAiB7D,CAAC"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAvailableMethods = exports.measureFiber = exports.getNativeInstance = exports.findScreenFiberByRouteKey = exports.findHostFiber = exports.getAncestors = exports.getSiblings = exports.getDirectChildren = exports.findAllByQuery = exports.matchesQuery = exports.findByText = exports.findByName = exports.findByTestID = exports.findByMcpId = exports.findAllFibers = exports.findFiber = exports.serializeFiber = exports.serializeProps = exports.serializeValue = exports.getComponentName = exports.getFiberRoot = exports.setRootRef = void 0;
3
+ exports.getAvailableMethods = exports.measureFiber = exports.getNativeInstance = exports.findScreenFiberByRouteKey = exports.findHostFiber = exports.getAncestors = exports.getSiblings = exports.getDirectChildren = exports.findAllByQuery = exports.matchesQuery = exports.findByText = exports.findByName = exports.findByTestID = exports.findByMcpId = exports.findAllFibers = exports.findFiber = exports.serializeFiber = exports.projectFiberValue = exports.getComponentName = exports.getFiberRoot = exports.setRootRef = void 0;
4
+ const projectValue_1 = require("../../shared/projection/projectValue");
5
+ const core_1 = require("../../shared/rn/core");
4
6
  // Fiber tag constants
5
7
  const HOST_COMPONENT = 5;
6
8
  const HOST_TEXT = 6;
@@ -36,8 +38,14 @@ const getFiberRoot = () => {
36
38
  };
37
39
  exports.getFiberRoot = getFiberRoot;
38
40
  const getComponentName = (fiber) => {
39
- if (!fiber.type)
41
+ // Host root has no `type` and no `return` parent. Surface it as
42
+ // "FiberRoot" instead of "Unknown" so dumps via scope:'root' read
43
+ // sensibly (and the name doesn't collide with a real component).
44
+ if (!fiber.type) {
45
+ if (!fiber.return)
46
+ return 'FiberRoot';
40
47
  return 'Unknown';
48
+ }
41
49
  if (typeof fiber.type === 'string') {
42
50
  return fiber.type;
43
51
  }
@@ -75,85 +83,76 @@ const getComponentType = (fiber) => {
75
83
  }
76
84
  return 'other';
77
85
  };
78
- const MAX_VALUE_DEPTH = 3;
79
- const serializeValue = (value, seen = new WeakSet(), depth = 0, maxDepth = MAX_VALUE_DEPTH) => {
80
- if (value === null || value === undefined)
81
- return value;
82
- if (depth > maxDepth)
83
- return '[...]';
84
- if (typeof value === 'function') {
85
- return `[Function: ${value.name || 'anonymous'}]`;
86
- }
87
- if (typeof value === 'symbol') {
88
- return value.toString();
89
- }
90
- if (typeof value !== 'object')
91
- return value;
92
- // React element
93
- if (value && typeof value === 'object' && '$$typeof' in value) {
94
- return '[ReactElement]';
95
- }
96
- if (seen.has(value))
97
- return '[Circular]';
98
- seen.add(value);
99
- // Skip objects that look like fiber nodes or native instances
100
- if (value &&
101
- typeof value === 'object' &&
102
- ('stateNode' in value || 'memoizedProps' in value || '__nativeTag' in value)) {
103
- return '[InternalObject]';
104
- }
105
- if (Array.isArray(value)) {
106
- return value.slice(0, 10).map((item) => {
107
- return (0, exports.serializeValue)(item, seen, depth + 1, maxDepth);
108
- });
109
- }
110
- const result = {};
111
- try {
112
- const keys = Object.keys(value);
113
- for (const key of keys.slice(0, 20)) {
114
- if (key.startsWith('__'))
115
- continue;
116
- try {
117
- result[key] = (0, exports.serializeValue)(value[key], seen, depth + 1, maxDepth);
118
- }
119
- catch {
120
- result[key] = '[Error]';
121
- }
122
- }
123
- }
124
- catch {
125
- return '[Object]';
126
- }
127
- return result;
128
- };
129
- exports.serializeValue = serializeValue;
130
- // Props to skip — internal React/RN properties that bloat output
131
- const SKIP_PROPS = new Set([
86
+ // Props/values to drop — internal React/RN bookkeeping that bloats output.
87
+ // Used by `projectFiberValue` below as `skipKeys`. Anything matching the
88
+ // `__`-prefix regex is also dropped (covers `__nativeTag`, `__reactProps$...`,
89
+ // react-refresh internal markers, etc.).
90
+ const SKIP_KEYS_FIBER = [
132
91
  '__internalInstanceHandle',
133
92
  '__nativeTag',
134
93
  'children',
135
94
  'collapsableChildren',
136
95
  'ref',
137
- ]);
138
- const serializeProps = (props) => {
139
- if (!props)
140
- return {};
141
- const result = {};
142
- for (const key of Object.keys(props)) {
143
- if (SKIP_PROPS.has(key))
144
- continue;
145
- if (key.startsWith('__'))
146
- continue;
147
- try {
148
- result[key] = (0, exports.serializeValue)(props[key]);
149
- }
150
- catch {
151
- result[key] = '[Error reading prop]';
152
- }
153
- }
154
- return result;
96
+ /^__/,
97
+ ];
98
+ // Collapse rule: detect React elements / fiber nodes / native instances and
99
+ // replace them with compact `${...}`-keyed marker objects. Stops projectValue
100
+ // from descending into ~unbounded React internals graph and emits something
101
+ // the agent can act on (mcpId / componentName).
102
+ const fiberCollapseRule = (value) => {
103
+ if (!value || typeof value !== 'object')
104
+ return undefined;
105
+ const obj = value;
106
+ // React element — has `$$typeof` symbol
107
+ if ('$$typeof' in obj) {
108
+ return { ['${ReactElement}']: true };
109
+ }
110
+ // Fiber-like or native-instance — try to extract a compact ref
111
+ const looksLikeFiberOrNative = 'stateNode' in obj || 'memoizedProps' in obj || '__nativeTag' in obj;
112
+ if (!looksLikeFiberOrNative)
113
+ return undefined;
114
+ // pull a fiber out — direct, or via internal handle on a native view
115
+ const fiber = obj._reactInternals ??
116
+ obj._reactInternalFiber ??
117
+ obj._internalFiberInstanceHandleDEV ??
118
+ obj._internalInstanceHandle ??
119
+ ('memoizedProps' in obj ? obj : undefined);
120
+ const meta = {};
121
+ if (fiber) {
122
+ const props = fiber.memoizedProps;
123
+ const mcpId = props?.['data-mcp-id'];
124
+ const testID = props?.testID;
125
+ if (mcpId)
126
+ meta.mcpId = mcpId;
127
+ if (testID)
128
+ meta.testID = testID;
129
+ const typeName = fiber.type?.displayName ??
130
+ fiber.type?.name;
131
+ if (typeName)
132
+ meta.name = typeName;
133
+ }
134
+ if ('__nativeTag' in obj) {
135
+ meta.nativeTag = obj.__nativeTag;
136
+ const viewConfig = obj.viewConfig;
137
+ if (viewConfig?.uiViewClassName)
138
+ meta.viewClass = viewConfig.uiViewClassName;
139
+ }
140
+ return { ['${ref}']: Object.keys(meta).length > 0 ? meta : true };
141
+ };
142
+ /**
143
+ * Projection helper used everywhere fiber values are serialised (props, hook
144
+ * values, fiber refs). Pre-applies the fiber-aware collapse rule + skip list
145
+ * over the shared `projectValue`. Callers can pass `path` / `depth` / etc.
146
+ * through `options` like with `projectValue` directly.
147
+ */
148
+ const projectFiberValue = (value, options = {}) => {
149
+ return (0, projectValue_1.projectValue)(value, {
150
+ ...options,
151
+ collapse: [fiberCollapseRule, ...(options.collapse ?? [])],
152
+ skipKeys: [...SKIP_KEYS_FIBER, ...(options.skipKeys ?? [])],
153
+ }).value;
155
154
  };
156
- exports.serializeProps = serializeProps;
155
+ exports.projectFiberValue = projectFiberValue;
157
156
  const getTextContent = (fiber) => {
158
157
  if (fiber.tag === HOST_TEXT) {
159
158
  return fiber.memoizedProps;
@@ -231,7 +230,10 @@ const serializeFiberUnsafe = (fiber, maxDepth, currentDepth) => {
231
230
  return null;
232
231
  }
233
232
  const name = (0, exports.getComponentName)(fiber);
234
- const props = (0, exports.serializeProps)(fiber.memoizedProps);
233
+ // Pass raw memoizedProps through — handler-level `applyProjection` runs the
234
+ // single canonical projectValue walk on the final response, including this
235
+ // tree. Projecting here would cause double-projection and break path drill.
236
+ const props = (fiber.memoizedProps ?? {});
235
237
  const mcpId = fiber.memoizedProps?.['data-mcp-id'];
236
238
  const testID = fiber.memoizedProps?.testID;
237
239
  const text = getTextContent(fiber);
@@ -558,8 +560,7 @@ const measureFiber = async (fiber) => {
558
560
  const instance = canonical?.publicInstance ?? hostFiber.stateNode;
559
561
  if (!instance)
560
562
  return null;
561
- // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
562
- const RN = require('react-native');
563
+ const RN = (0, core_1.getRN)();
563
564
  const { PixelRatio, UIManager, findNodeHandle } = RN;
564
565
  const handle = typeof findNodeHandle === 'function' ? findNodeHandle(instance) : null;
565
566
  if (handle == null)