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
@@ -1,53 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.consoleModule = void 0;
4
- const slice_1 = require("../../shared/slice");
4
+ const projectValue_1 = require("../../shared/projection/projectValue");
5
5
  const ALL_LEVELS = ['debug', 'error', 'info', 'log', 'warn'];
6
6
  const DEFAULT_MAX_ENTRIES = 100;
7
7
  const DEFAULT_STACK_LEVELS = ['error', 'warn'];
8
- const serializeArg = (arg, seen = new WeakSet()) => {
9
- if (arg === null || arg === undefined)
10
- return arg;
11
- if (typeof arg === 'function') {
12
- return `[Function: ${arg.name || 'anonymous'}]`;
13
- }
14
- if (typeof arg === 'symbol') {
15
- return arg.toString();
16
- }
17
- if (typeof arg !== 'object')
18
- return arg;
19
- if (arg instanceof Error) {
20
- return {
21
- message: arg.message,
22
- name: arg.name,
23
- stack: arg.stack,
24
- };
25
- }
26
- if (arg instanceof Date) {
27
- return arg.toISOString();
28
- }
29
- if (arg instanceof RegExp) {
30
- return arg.toString();
31
- }
32
- if (seen.has(arg)) {
33
- return '[Circular]';
34
- }
35
- seen.add(arg);
36
- if (Array.isArray(arg)) {
37
- return arg.map((item) => {
38
- return serializeArg(item, seen);
39
- });
40
- }
41
- const className = arg.constructor?.name;
42
- const serialized = {};
43
- if (className && className !== 'Object') {
44
- serialized.__class = className;
45
- }
46
- for (const key of Object.keys(arg)) {
47
- serialized[key] = serializeArg(arg[key], seen);
48
- }
49
- return serialized;
50
- };
8
+ // Default depth 3 top level is array of entries, level 2 expands each
9
+ // entry (id/level/timestamp inline, args/stack still markers), level 3
10
+ // opens the args array (primitive args inline, nested objects → ${obj}
11
+ // markers). Drill deeper via `path` or bump `depth`.
12
+ const CONSOLE_DEFAULT_DEPTH = 3;
13
+ const PROJECTION_SCHEMA = (0, projectValue_1.makeProjectionSchema)(CONSOLE_DEFAULT_DEPTH);
51
14
  const captureStack = () => {
52
15
  const stack = new Error().stack;
53
16
  if (!stack)
@@ -64,16 +27,20 @@ const captureStack = () => {
64
27
  // closes that gap. The factory below adopts the pre-existing buffer and
65
28
  // applies caller-supplied options retroactively.
66
29
  const buffer = [];
30
+ let nextId = 1;
67
31
  let maxEntries = DEFAULT_MAX_ENTRIES;
68
32
  let capturedLevels = new Set(ALL_LEVELS);
69
33
  let stackLevels = new Set(DEFAULT_STACK_LEVELS);
70
34
  const addEntry = (level, args) => {
71
35
  if (!capturedLevels.has(level))
72
36
  return;
37
+ // Args are stored RAW (no per-arg serializer). Projection — depth walk,
38
+ // marker collapse, cycle / class detection, redaction — runs at query
39
+ // time via the shared `projectValue`. This keeps cold-start capture
40
+ // cheap and lets the agent drill any path / depth at query time.
73
41
  const entry = {
74
- args: args.map((arg) => {
75
- return serializeArg(arg);
76
- }),
42
+ args,
43
+ id: nextId++,
77
44
  level,
78
45
  timestamp: new Date().toISOString(),
79
46
  };
@@ -99,6 +66,14 @@ const installPatches = () => {
99
66
  }
100
67
  };
101
68
  installPatches();
69
+ const project = (entries, args) => {
70
+ return (0, projectValue_1.applyProjection)(entries, args, projectValue_1.projectAsValue, CONSOLE_DEFAULT_DEPTH);
71
+ };
72
+ const filterByLevel = (level) => {
73
+ return buffer.filter((entry) => {
74
+ return entry.level === level;
75
+ });
76
+ };
102
77
  const consoleModule = (options) => {
103
78
  // Apply options retroactively to the already-running buffer.
104
79
  if (typeof options?.maxEntries === 'number') {
@@ -119,23 +94,13 @@ const consoleModule = (options) => {
119
94
  else if (Array.isArray(options?.stackTrace)) {
120
95
  stackLevels = new Set(options.stackTrace);
121
96
  }
122
- const filterByLevel = (level, slice) => {
123
- const filtered = buffer.filter((entry) => {
124
- return entry.level === level;
125
- });
126
- return (0, slice_1.applySlice)(filtered, (0, slice_1.parseSliceArg)(slice));
127
- };
128
- const sliceSchema = {
129
- description: (0, slice_1.sliceSchemaDescription)('Default omitted → every matching entry is returned.'),
130
- examples: [[-10], [-20, -10], [0, 50]],
131
- type: 'array',
132
- };
133
97
  return {
134
98
  description: `Ring buffer of console.log/warn/error/info/debug.
135
99
 
136
- Complex values (Errors, Dates, class instances, cyclic refs, functions,
137
- Symbols) are serialized safely. Stack traces can be captured per level.
138
- Capture starts at module-import time (before React mounts) so cold-start
100
+ Each entry carries a monotonic numeric \`id\`. Args are stored raw; the
101
+ shared projection runs at query time. Stack traces captured per level
102
+ (default error+warn). Listing tools accept path / depth / maxBytes
103
+ (default depth ${CONSOLE_DEFAULT_DEPTH}). Capture starts at module-import time so cold-start
139
104
  logs are not lost. Buffer size and captured levels are configurable via
140
105
  consoleModule options.`,
141
106
  name: 'console',
@@ -147,60 +112,20 @@ consoleModule options.`,
147
112
  return { success: true };
148
113
  },
149
114
  },
150
- get_debug: {
151
- description: 'Return console.debug entries.',
152
- handler: (args) => {
153
- return filterByLevel('debug', args.slice);
154
- },
155
- inputSchema: {
156
- slice: sliceSchema,
157
- },
158
- },
159
- get_errors: {
160
- description: 'Return console.error entries.',
161
- handler: (args) => {
162
- return filterByLevel('error', args.slice);
163
- },
164
- inputSchema: {
165
- slice: sliceSchema,
166
- },
167
- },
168
- get_info: {
169
- description: 'Return console.info entries.',
170
- handler: (args) => {
171
- return filterByLevel('info', args.slice);
172
- },
173
- inputSchema: {
174
- slice: sliceSchema,
175
- },
176
- },
177
115
  get_logs: {
178
- description: 'Return all log entries, optionally filtered by level and slice.',
116
+ description: 'Return log entries, optionally filtered by level.',
179
117
  handler: (args) => {
180
- let result = [...buffer];
181
- if (args.level) {
182
- result = result.filter((entry) => {
183
- return entry.level === args.level;
184
- });
185
- }
186
- return (0, slice_1.applySlice)(result, (0, slice_1.parseSliceArg)(args.slice));
118
+ const level = typeof args.level === 'string' ? args.level : undefined;
119
+ const result = level ? filterByLevel(level) : buffer;
120
+ return project(result, args);
187
121
  },
188
122
  inputSchema: {
123
+ ...PROJECTION_SCHEMA,
189
124
  level: {
190
- description: 'Filter by level.',
125
+ description: 'Filter by level. Omit for all levels.',
191
126
  examples: ['log', 'warn', 'error', 'info', 'debug'],
192
127
  type: 'string',
193
128
  },
194
- slice: sliceSchema,
195
- },
196
- },
197
- get_warnings: {
198
- description: 'Return console.warn entries.',
199
- handler: (args) => {
200
- return filterByLevel('warn', args.slice);
201
- },
202
- inputSchema: {
203
- slice: sliceSchema,
204
129
  },
205
130
  },
206
131
  },
@@ -1 +1 @@
1
- {"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/modules/console/console.ts"],"names":[],"mappings":";;;AACA,0CAAmF;AAInF,MAAM,UAAU,GAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACzE,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,oBAAoB,GAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAE3D,MAAM,YAAY,GAAG,CAAC,GAAY,EAAE,OAAO,IAAI,OAAO,EAAU,EAAW,EAAE;IAC3E,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAElD,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,cAAc,GAAG,CAAC,IAAI,IAAI,WAAW,GAAG,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAExC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,GAAG,YAAY,MAAM,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEd,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACtB,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;IACxC,MAAM,UAAU,GAA4B,EAAE,CAAC;IAE/C,IAAI,SAAS,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QACxC,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,UAAU,CAAC,GAAG,CAAC,GAAG,YAAY,CAAE,GAA+B,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,GAAuB,EAAE;IAC5C,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,sEAAsE;IACtE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,mEAAmE;AACnE,EAAE;AACF,2EAA2E;AAC3E,6EAA6E;AAC7E,4EAA4E;AAC5E,wEAAwE;AACxE,iDAAiD;AAEjD,MAAM,MAAM,GAAe,EAAE,CAAC;AAC9B,IAAI,UAAU,GAAG,mBAAmB,CAAC;AACrC,IAAI,cAAc,GAAG,IAAI,GAAG,CAAW,UAAU,CAAC,CAAC;AACnD,IAAI,WAAW,GAAG,IAAI,GAAG,CAAW,oBAAoB,CAAC,CAAC;AAE1D,MAAM,QAAQ,GAAG,CAAC,KAAe,EAAE,IAAe,EAAQ,EAAE;IAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO;IACvC,MAAM,KAAK,GAAa;QACtB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACrB,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC;QACF,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,GAAG,YAAY,EAAE,CAAC;IAC/B,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAC7B,MAAM,cAAc,GAAG,GAAS,EAAE;IAChC,IAAI,gBAAgB;QAAE,OAAO;IAC7B,gBAAgB,GAAG,IAAI,CAAC;IACxB,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACtC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACtB,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,cAAc,EAAE,CAAC;AAEV,MAAM,aAAa,GAAG,CAAC,OAA8B,EAAa,EAAE;IACzE,6DAA6D;IAC7D,IAAI,OAAO,OAAO,EAAE,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5C,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,cAAc,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,EAAE,UAAU,KAAK,IAAI,EAAE,CAAC;QACjC,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;SAAM,IAAI,OAAO,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC;QACzC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;IAC1B,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;QAC9C,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,KAAe,EAAE,KAAc,EAAc,EAAE;QACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACvC,OAAO,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,OAAO,IAAA,kBAAU,EAAC,QAAQ,EAAE,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG;QAClB,WAAW,EAAE,IAAA,8BAAsB,EAAC,qDAAqD,CAAC;QAC1F,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,EAAE,OAAO;KACd,CAAC;IAEF,OAAO;QACL,WAAW,EAAE;;;;;;uBAMM;QACnB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE;YACL,UAAU,EAAE;gBACV,WAAW,EAAE,uBAAuB;gBACpC,OAAO,EAAE,GAAG,EAAE;oBACZ,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;oBAClB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAC3B,CAAC;aACF;YACD,SAAS,EAAE;gBACT,WAAW,EAAE,+BAA+B;gBAC5C,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBAChB,OAAO,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC5C,CAAC;gBACD,WAAW,EAAE;oBACX,KAAK,EAAE,WAAW;iBACnB;aACF;YACD,UAAU,EAAE;gBACV,WAAW,EAAE,+BAA+B;gBAC5C,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBAChB,OAAO,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC5C,CAAC;gBACD,WAAW,EAAE;oBACX,KAAK,EAAE,WAAW;iBACnB;aACF;YACD,QAAQ,EAAE;gBACR,WAAW,EAAE,8BAA8B;gBAC3C,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBAChB,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3C,CAAC;gBACD,WAAW,EAAE;oBACX,KAAK,EAAE,WAAW;iBACnB;aACF;YACD,QAAQ,EAAE;gBACR,WAAW,EAAE,iEAAiE;gBAC9E,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBAChB,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;oBACzB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;4BAC/B,OAAO,KAAK,CAAC,KAAK,KAAM,IAAI,CAAC,KAAkB,CAAC;wBAClD,CAAC,CAAC,CAAC;oBACL,CAAC;oBACD,OAAO,IAAA,kBAAU,EAAC,MAAM,EAAE,IAAA,qBAAa,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvD,CAAC;gBACD,WAAW,EAAE;oBACX,KAAK,EAAE;wBACL,WAAW,EAAE,kBAAkB;wBAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;wBACnD,IAAI,EAAE,QAAQ;qBACf;oBACD,KAAK,EAAE,WAAW;iBACnB;aACF;YACD,YAAY,EAAE;gBACZ,WAAW,EAAE,8BAA8B;gBAC3C,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBAChB,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3C,CAAC;gBACD,WAAW,EAAE;oBACX,KAAK,EAAE,WAAW;iBACnB;aACF;SACF;KACF,CAAC;AACJ,CAAC,CAAC;AA3GW,QAAA,aAAa,iBA2GxB"}
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/modules/console/console.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  export type LogLevel = 'debug' | 'error' | 'info' | 'log' | 'warn';
2
2
  export interface LogEntry {
3
3
  args: unknown[];
4
+ id: number;
4
5
  level: LogLevel;
5
6
  timestamp: string;
6
7
  stack?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/console/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;CACnC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/console/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;CACnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../../src/modules/device/device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,eAAO,MAAM,YAAY,QAAO,SAoM/B,CAAC"}
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../../src/modules/device/device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA2CvD,eAAO,MAAM,YAAY,QAAO,SAwP/B,CAAC"}
@@ -1,172 +1,263 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.deviceModule = void 0;
4
+ const core_1 = require("../../shared/rn/core");
5
+ const deviceInfo_1 = require("../../shared/rn/deviceInfo");
6
+ // All fields the unified `info` tool can return. The handler reads from RN
7
+ // core modules (Platform, Dimensions, Appearance, AppState,
8
+ // AccessibilityInfo, Keyboard, Linking) plus — when installed — selected
9
+ // helpers from `react-native-device-info`. Pass `select` to filter; omit
10
+ // for the full payload.
11
+ //
12
+ // Fields backed by react-native-device-info (identity / app / battery /
13
+ // memoryStorage) return `{ unavailable: true, reason }` when the package
14
+ // isn't installed. Fields already surfaced in the handshake (appName,
15
+ // appVersion, bundleId, deviceId, label) are not duplicated here.
16
+ const INFO_FIELDS = [
17
+ // RN core
18
+ 'platform', // { os, version, constants } from Platform
19
+ 'dimensions', // { screen, window, screenPixels, windowPixels, pixelRatio }
20
+ 'pixelRatio', // { pixelRatio, fontScale }
21
+ 'appearance', // { colorScheme: 'light' | 'dark' | null }
22
+ 'appState', // { state: 'active' | 'background' | 'inactive' }
23
+ 'accessibility', // { isScreenReaderEnabled, isReduceMotionEnabled }
24
+ 'keyboard', // { isVisible, metrics }
25
+ 'initialUrl', // { url }
26
+ 'dev', // { dev: boolean }
27
+ // react-native-device-info (optional)
28
+ 'identity', // { model, manufacturer, deviceType, isTablet, hasNotch, hasDynamicIsland, systemName, systemVersion }
29
+ 'app', // { buildNumber, readableVersion, firstInstallTime, lastUpdateTime, installerPackageName }
30
+ 'battery', // { batteryLevel, isCharging, isLowBatteryLevel, powerState }
31
+ 'memoryStorage', // { totalMemory, usedMemory, maxMemory, totalDiskCapacity, freeDiskStorage }
32
+ ];
33
+ // react-native-device-info-backed fields share a single graceful-degradation
34
+ // payload when the package isn't installed.
35
+ const DI_FIELDS = new Set(['identity', 'app', 'battery', 'memoryStorage']);
4
36
  const deviceModule = () => {
5
- // Lazy require to avoid importing react-native on server side
6
- const getRN = () => {
7
- // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
8
- return require('react-native');
37
+ const buildInfoField = async (field) => {
38
+ // react-native-device-info-backed fields go first so we can short-circuit
39
+ // when the package is missing without poking at RN.
40
+ if (DI_FIELDS.has(field)) {
41
+ const DI = (0, deviceInfo_1.loadDeviceInfo)();
42
+ if (!DI)
43
+ return deviceInfo_1.DEVICE_INFO_UNAVAILABLE;
44
+ switch (field) {
45
+ case 'identity':
46
+ // Identity excludes handshake-duplicated fields (deviceId, label,
47
+ // appName/appVersion/bundleId).
48
+ return {
49
+ deviceType: (0, deviceInfo_1.callDI)(DI.getDeviceType),
50
+ hasDynamicIsland: (0, deviceInfo_1.callDI)(DI.hasDynamicIsland),
51
+ hasNotch: (0, deviceInfo_1.callDI)(DI.hasNotch),
52
+ isTablet: (0, deviceInfo_1.callDI)(DI.isTablet),
53
+ manufacturer: (0, deviceInfo_1.callDI)(DI.getManufacturerSync ?? DI.getBrand),
54
+ model: (0, deviceInfo_1.callDI)(DI.getModel),
55
+ systemName: (0, deviceInfo_1.callDI)(DI.getSystemName),
56
+ systemVersion: (0, deviceInfo_1.callDI)(DI.getSystemVersion),
57
+ };
58
+ case 'app': {
59
+ // App excludes bundleId / version / appName already in handshake.
60
+ const [firstInstallTime, lastUpdateTime, installerPackageName] = await Promise.all([
61
+ (0, deviceInfo_1.callDIAsync)(DI.getFirstInstallTime),
62
+ (0, deviceInfo_1.callDIAsync)(DI.getLastUpdateTime),
63
+ (0, deviceInfo_1.callDIAsync)(DI.getInstallerPackageName),
64
+ ]);
65
+ return {
66
+ buildNumber: (0, deviceInfo_1.callDI)(DI.getBuildNumber),
67
+ firstInstallTime,
68
+ installerPackageName,
69
+ lastUpdateTime,
70
+ readableVersion: (0, deviceInfo_1.callDI)(DI.getReadableVersion),
71
+ };
72
+ }
73
+ case 'battery': {
74
+ const [batteryLevel, isCharging, powerState] = await Promise.all([
75
+ (0, deviceInfo_1.callDIAsync)(DI.getBatteryLevel),
76
+ (0, deviceInfo_1.callDIAsync)(DI.isBatteryCharging),
77
+ (0, deviceInfo_1.callDIAsync)(DI.getPowerState),
78
+ ]);
79
+ return {
80
+ batteryLevel,
81
+ isCharging,
82
+ isLowBatteryLevel: typeof batteryLevel === 'number' ? batteryLevel < 0.2 : null,
83
+ powerState,
84
+ };
85
+ }
86
+ case 'memoryStorage': {
87
+ const [totalMemory, usedMemory, maxMemory, totalDiskCapacity, freeDiskStorage] = await Promise.all([
88
+ (0, deviceInfo_1.callDIAsync)(DI.getTotalMemory),
89
+ (0, deviceInfo_1.callDIAsync)(DI.getUsedMemory),
90
+ (0, deviceInfo_1.callDIAsync)(DI.getMaxMemory),
91
+ (0, deviceInfo_1.callDIAsync)(DI.getTotalDiskCapacity),
92
+ (0, deviceInfo_1.callDIAsync)(DI.getFreeDiskStorage),
93
+ ]);
94
+ return {
95
+ freeDiskStorage,
96
+ maxMemory,
97
+ totalDiskCapacity,
98
+ totalMemory,
99
+ usedMemory,
100
+ };
101
+ }
102
+ }
103
+ }
104
+ const RN = (0, core_1.getRN)();
105
+ switch (field) {
106
+ case 'platform':
107
+ return {
108
+ constants: RN.Platform.constants,
109
+ os: RN.Platform.OS,
110
+ version: RN.Platform.Version,
111
+ };
112
+ case 'dimensions': {
113
+ const ratio = RN.PixelRatio.get();
114
+ const screen = RN.Dimensions.get('screen');
115
+ const window = RN.Dimensions.get('window');
116
+ return {
117
+ pixelRatio: ratio,
118
+ screen,
119
+ screenPixels: {
120
+ height: Math.round(screen.height * ratio),
121
+ width: Math.round(screen.width * ratio),
122
+ },
123
+ window,
124
+ windowPixels: {
125
+ height: Math.round(window.height * ratio),
126
+ width: Math.round(window.width * ratio),
127
+ },
128
+ };
129
+ }
130
+ case 'pixelRatio':
131
+ return {
132
+ fontScale: RN.PixelRatio.getFontScale(),
133
+ pixelRatio: RN.PixelRatio.get(),
134
+ };
135
+ case 'appearance':
136
+ return { colorScheme: RN.Appearance.getColorScheme() };
137
+ case 'appState':
138
+ return { state: RN.AppState.currentState };
139
+ case 'accessibility': {
140
+ const [isScreenReaderEnabled, isReduceMotionEnabled] = await Promise.all([
141
+ RN.AccessibilityInfo.isScreenReaderEnabled(),
142
+ RN.AccessibilityInfo.isReduceMotionEnabled(),
143
+ ]);
144
+ return { isReduceMotionEnabled, isScreenReaderEnabled };
145
+ }
146
+ case 'keyboard':
147
+ return {
148
+ isVisible: RN.Keyboard.isVisible(),
149
+ metrics: RN.Keyboard.metrics(),
150
+ };
151
+ case 'initialUrl': {
152
+ const url = await RN.Linking.getInitialURL();
153
+ return { url };
154
+ }
155
+ case 'dev':
156
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
157
+ return { dev: Boolean(globalThis.__DEV__) };
158
+ default:
159
+ return null;
160
+ }
9
161
  };
10
162
  return {
11
163
  description: `Device + platform introspection, plus a few imperative actions (open URL, dismiss keyboard, reload, vibrate).
12
164
 
13
165
  Dimension helpers return values in both logical DP and physical pixels —
14
- physical pixel helpers (screenPixels / windowPixels in get_dimensions)
15
- match what host__tap / adb input tap consume.`,
166
+ physical pixel helpers (screenPixels / windowPixels under \`dimensions\`)
167
+ match what host__tap / adb input tap consume.
168
+
169
+ READS
170
+ info({ select? }) — one aggregate read. Returns any subset of:
171
+ RN core: platform, dimensions, pixelRatio, appearance, appState,
172
+ accessibility, keyboard, initialUrl, dev
173
+ react-native-device-info (optional dep): identity, app, battery,
174
+ memoryStorage
175
+ Pass \`select: ['battery','keyboard']\` to limit fields; omit for the full
176
+ payload. DI-backed fields gracefully return
177
+ \`{ unavailable: true, reason }\` when the package isn't installed. Fields
178
+ already in the handshake (appName / appVersion / bundleId / deviceId /
179
+ label) are not duplicated.
180
+
181
+ ACTIONS
182
+ open_url({ url, dryRun? }) — opens the URL via Linking. \`dryRun: true\`
183
+ only checks Linking.canOpenURL without launching anything (returns
184
+ { canOpen, url }).
185
+ open_settings — open the app settings page.
186
+ dismiss_keyboard — Keyboard.dismiss().
187
+ reload — DevSettings.reload() (dev only).
188
+ vibrate({ duration? }) — Vibration.vibrate(duration|400).`,
16
189
  name: 'device',
17
190
  tools: {
18
- can_open_url: {
19
- description: 'Check if a URL can be opened by an installed app.',
20
- handler: async (args) => {
21
- const { Linking } = getRN();
22
- const canOpen = await Linking.canOpenURL(args.url);
23
- return { canOpen, url: args.url };
24
- },
25
- inputSchema: {
26
- url: { description: 'URL to check.', type: 'string' },
27
- },
28
- },
29
191
  dismiss_keyboard: {
30
192
  description: 'Dismiss the currently visible keyboard.',
31
193
  handler: () => {
32
- const { Keyboard } = getRN();
194
+ const { Keyboard } = (0, core_1.getRN)();
33
195
  Keyboard.dismiss();
34
196
  return { success: true };
35
197
  },
36
198
  },
37
- get_accessibility_info: {
38
- description: 'Screen reader / reduce motion / bold text settings.',
39
- handler: async () => {
40
- const { AccessibilityInfo } = getRN();
41
- const [isScreenReaderEnabled, isReduceMotionEnabled] = await Promise.all([
42
- AccessibilityInfo.isScreenReaderEnabled(),
43
- AccessibilityInfo.isReduceMotionEnabled(),
44
- ]);
45
- return {
46
- isReduceMotionEnabled,
47
- isScreenReaderEnabled,
48
- };
49
- },
50
- },
51
- get_app_state: {
52
- description: 'App lifecycle state: active / background / inactive.',
53
- handler: () => {
54
- const { AppState } = getRN();
55
- return { state: AppState.currentState };
56
- },
57
- },
58
- get_appearance: {
59
- description: 'Current color scheme: light / dark / null.',
60
- handler: () => {
61
- const { Appearance } = getRN();
62
- return { colorScheme: Appearance.getColorScheme() };
63
- },
64
- },
65
- get_device_info: {
66
- description: 'Platform, OS version, dimensions, pixel ratio, appearance, dev flag.',
67
- handler: () => {
68
- const { Appearance, Dimensions, PixelRatio, Platform } = getRN();
69
- return {
70
- appearance: Appearance.getColorScheme(),
71
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
- dev: Boolean(globalThis.__DEV__),
73
- dimensions: {
74
- screen: Dimensions.get('screen'),
75
- window: Dimensions.get('window'),
76
- },
77
- pixelRatio: PixelRatio.get(),
78
- platform: {
79
- constants: Platform.constants,
80
- os: Platform.OS,
81
- version: Platform.Version,
82
- },
83
- };
84
- },
85
- },
86
- get_dimensions: {
87
- description: 'Screen + window dimensions in both DP (raw RN) and physical pixels.',
88
- handler: () => {
89
- const { Dimensions, PixelRatio } = getRN();
90
- const ratio = PixelRatio.get();
91
- const screen = Dimensions.get('screen');
92
- const window = Dimensions.get('window');
93
- return {
94
- pixelRatio: ratio,
95
- screen,
96
- screenPixels: {
97
- height: Math.round(screen.height * ratio),
98
- width: Math.round(screen.width * ratio),
99
- },
100
- window,
101
- windowPixels: {
102
- height: Math.round(window.height * ratio),
103
- width: Math.round(window.width * ratio),
104
- },
105
- };
106
- },
107
- },
108
- get_initial_url: {
109
- description: 'Deep link that launched the app, if any.',
110
- handler: async () => {
111
- const { Linking } = getRN();
112
- const url = await Linking.getInitialURL();
113
- return { url };
114
- },
115
- },
116
- get_keyboard_state: {
117
- description: 'Keyboard visibility + metrics.',
118
- handler: () => {
119
- const { Keyboard } = getRN();
120
- return {
121
- isVisible: Keyboard.isVisible(),
122
- metrics: Keyboard.metrics(),
123
- };
124
- },
125
- },
126
- get_pixel_ratio: {
127
- description: 'Pixel density + font scale.',
128
- handler: () => {
129
- const { PixelRatio } = getRN();
130
- return {
131
- fontScale: PixelRatio.getFontScale(),
132
- pixelRatio: PixelRatio.get(),
133
- };
199
+ info: {
200
+ description: `Aggregate device / platform introspection. Returns any subset of: ${INFO_FIELDS.join(' / ')}. Pass \`select: ['battery','keyboard']\` to limit to specific fields; omit for the full payload. Fields backed by react-native-device-info (identity / app / battery / memoryStorage) return \`{ unavailable: true, reason }\` when the package isn't installed.`,
201
+ handler: async (args) => {
202
+ const requested = Array.isArray(args.select)
203
+ ? args.select.filter((f) => {
204
+ return INFO_FIELDS.includes(f);
205
+ })
206
+ : INFO_FIELDS;
207
+ if (Array.isArray(args.select) && requested.length === 0) {
208
+ return {
209
+ availableFields: INFO_FIELDS,
210
+ error: `select must contain at least one known field. Got ${JSON.stringify(args.select)}.`,
211
+ };
212
+ }
213
+ const entries = await Promise.all(requested.map(async (field) => {
214
+ return [field, await buildInfoField(field)];
215
+ }));
216
+ const out = {};
217
+ for (const [key, value] of entries)
218
+ out[key] = value;
219
+ return out;
134
220
  },
135
- },
136
- get_platform: {
137
- description: 'OS, version, native constants (model/brand/manufacturer on Android).',
138
- handler: () => {
139
- const { Platform } = getRN();
140
- return {
141
- constants: Platform.constants,
142
- os: Platform.OS,
143
- version: Platform.Version,
144
- };
221
+ inputSchema: {
222
+ select: {
223
+ description: `Optional list of fields to return. Default = all. Known fields: ${INFO_FIELDS.join(' / ')}. identity / app / battery / memoryStorage require react-native-device-info; they return { unavailable: true, reason } when the package isn't installed.`,
224
+ examples: [['battery'], ['identity', 'app'], ['platform', 'dimensions']],
225
+ type: 'array',
226
+ },
145
227
  },
146
228
  },
147
229
  open_settings: {
148
230
  description: 'Open the app settings page in device settings.',
149
231
  handler: async () => {
150
- const { Linking } = getRN();
232
+ const { Linking } = (0, core_1.getRN)();
151
233
  await Linking.openSettings();
152
234
  return { success: true };
153
235
  },
154
236
  },
155
237
  open_url: {
156
- description: 'Open a URL with the appropriate installed app.',
238
+ description: 'Open a URL with the appropriate installed app. Pass `dryRun: true` to only check whether an app can handle it (returns `{ canOpen, url }`) without launching.',
157
239
  handler: async (args) => {
158
- const { Linking } = getRN();
159
- await Linking.openURL(args.url);
160
- return { success: true, url: args.url };
240
+ const { Linking } = (0, core_1.getRN)();
241
+ const url = args.url;
242
+ if (args.dryRun === true) {
243
+ const canOpen = await Linking.canOpenURL(url);
244
+ return { canOpen, url };
245
+ }
246
+ await Linking.openURL(url);
247
+ return { success: true, url };
161
248
  },
162
249
  inputSchema: {
163
- url: { description: 'URL to open.', type: 'string' },
250
+ dryRun: {
251
+ description: 'When true, only check Linking.canOpenURL and return `{ canOpen, url }` without opening. Default false.',
252
+ type: 'boolean',
253
+ },
254
+ url: { description: 'URL to open (or check, when dryRun:true).', type: 'string' },
164
255
  },
165
256
  },
166
257
  reload: {
167
258
  description: 'Reload the app (dev mode only — like pressing R in Metro).',
168
259
  handler: () => {
169
- const { DevSettings } = getRN();
260
+ const { DevSettings } = (0, core_1.getRN)();
170
261
  DevSettings.reload();
171
262
  return { success: true };
172
263
  },
@@ -174,7 +265,7 @@ match what host__tap / adb input tap consume.`,
174
265
  vibrate: {
175
266
  description: 'Vibrate the device.',
176
267
  handler: (args) => {
177
- const { Vibration } = getRN();
268
+ const { Vibration } = (0, core_1.getRN)();
178
269
  const duration = args.duration || 400;
179
270
  Vibration.vibrate(duration);
180
271
  return { success: true };