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.
- package/README.md +25 -13
- package/dist/babel/testIdPlugin.d.ts.map +1 -1
- package/dist/babel/testIdPlugin.js +22 -13
- package/dist/babel/testIdPlugin.js.map +1 -1
- package/dist/bin/ios-hid +0 -0
- package/dist/client/contexts/McpContext/McpProvider.d.ts.map +1 -1
- package/dist/client/contexts/McpContext/McpProvider.js +5 -5
- package/dist/client/contexts/McpContext/McpProvider.js.map +1 -1
- package/dist/client/core/McpClient.d.ts.map +1 -1
- package/dist/client/core/McpClient.js +42 -34
- package/dist/client/core/McpClient.js.map +1 -1
- package/dist/modules/alert/alert.d.ts.map +1 -1
- package/dist/modules/alert/alert.js +2 -5
- package/dist/modules/alert/alert.js.map +1 -1
- package/dist/modules/console/console.d.ts.map +1 -1
- package/dist/modules/console/console.js +32 -107
- package/dist/modules/console/console.js.map +1 -1
- package/dist/modules/console/types.d.ts +1 -0
- package/dist/modules/console/types.d.ts.map +1 -1
- package/dist/modules/device/device.d.ts.map +1 -1
- package/dist/modules/device/device.js +224 -133
- package/dist/modules/device/device.js.map +1 -1
- package/dist/modules/errors/errors.d.ts.map +1 -1
- package/dist/modules/errors/errors.js +19 -36
- package/dist/modules/errors/errors.js.map +1 -1
- package/dist/modules/fiberTree/children.d.ts +49 -0
- package/dist/modules/fiberTree/children.d.ts.map +1 -0
- package/dist/modules/fiberTree/children.js +182 -0
- package/dist/modules/fiberTree/children.js.map +1 -0
- package/dist/modules/fiberTree/constants.d.ts +13 -0
- package/dist/modules/fiberTree/constants.d.ts.map +1 -0
- package/dist/modules/fiberTree/constants.js +24 -0
- package/dist/modules/fiberTree/constants.js.map +1 -0
- package/dist/modules/fiberTree/fiberTree.d.ts +3 -6
- package/dist/modules/fiberTree/fiberTree.d.ts.map +1 -1
- package/dist/modules/fiberTree/fiberTree.js +219 -1080
- package/dist/modules/fiberTree/fiberTree.js.map +1 -1
- package/dist/modules/fiberTree/finder.d.ts +60 -0
- package/dist/modules/fiberTree/finder.d.ts.map +1 -0
- package/dist/modules/fiberTree/finder.js +107 -0
- package/dist/modules/fiberTree/finder.js.map +1 -0
- package/dist/modules/fiberTree/hooks.d.ts +103 -0
- package/dist/modules/fiberTree/hooks.d.ts.map +1 -0
- package/dist/modules/fiberTree/hooks.js +532 -0
- package/dist/modules/fiberTree/hooks.js.map +1 -0
- package/dist/modules/fiberTree/projection.d.ts +49 -0
- package/dist/modules/fiberTree/projection.d.ts.map +1 -0
- package/dist/modules/fiberTree/projection.js +82 -0
- package/dist/modules/fiberTree/projection.js.map +1 -0
- package/dist/modules/fiberTree/query.d.ts +56 -0
- package/dist/modules/fiberTree/query.d.ts.map +1 -0
- package/dist/modules/fiberTree/query.js +151 -0
- package/dist/modules/fiberTree/query.js.map +1 -0
- package/dist/modules/fiberTree/redact.d.ts +24 -0
- package/dist/modules/fiberTree/redact.d.ts.map +1 -0
- package/dist/modules/fiberTree/redact.js +51 -0
- package/dist/modules/fiberTree/redact.js.map +1 -0
- package/dist/modules/fiberTree/types.d.ts +7 -0
- package/dist/modules/fiberTree/types.d.ts.map +1 -1
- package/dist/modules/fiberTree/utils.d.ts +8 -2
- package/dist/modules/fiberTree/utils.d.ts.map +1 -1
- package/dist/modules/fiberTree/utils.js +79 -78
- package/dist/modules/fiberTree/utils.js.map +1 -1
- package/dist/modules/fiberTree/viewport.d.ts +28 -0
- package/dist/modules/fiberTree/viewport.d.ts.map +1 -0
- package/dist/modules/fiberTree/viewport.js +50 -0
- package/dist/modules/fiberTree/viewport.js.map +1 -0
- package/dist/modules/fiberTree/waitFor.d.ts +52 -0
- package/dist/modules/fiberTree/waitFor.d.ts.map +1 -0
- package/dist/modules/fiberTree/waitFor.js +98 -0
- package/dist/modules/fiberTree/waitFor.js.map +1 -0
- package/dist/modules/logBox/logBox.d.ts.map +1 -1
- package/dist/modules/logBox/logBox.js +59 -66
- package/dist/modules/logBox/logBox.js.map +1 -1
- package/dist/modules/navigation/navigation.d.ts.map +1 -1
- package/dist/modules/navigation/navigation.js +115 -114
- package/dist/modules/navigation/navigation.js.map +1 -1
- package/dist/modules/network/network.d.ts.map +1 -1
- package/dist/modules/network/network.js +78 -197
- package/dist/modules/network/network.js.map +1 -1
- package/dist/modules/network/types.d.ts +23 -27
- package/dist/modules/network/types.d.ts.map +1 -1
- package/dist/modules/reactQuery/reactQuery.d.ts.map +1 -1
- package/dist/modules/reactQuery/reactQuery.js +46 -52
- package/dist/modules/reactQuery/reactQuery.js.map +1 -1
- package/dist/modules/storage/storage.d.ts.map +1 -1
- package/dist/modules/storage/storage.js +20 -3
- package/dist/modules/storage/storage.js.map +1 -1
- package/dist/server/bridge.d.ts +1 -0
- package/dist/server/bridge.d.ts.map +1 -1
- package/dist/server/bridge.js +1 -0
- package/dist/server/bridge.js.map +1 -1
- package/dist/server/host/coredevice/dtx.d.ts +79 -0
- package/dist/server/host/coredevice/dtx.d.ts.map +1 -0
- package/dist/server/host/coredevice/dtx.js +453 -0
- package/dist/server/host/coredevice/dtx.js.map +1 -0
- package/dist/server/host/coredevice/nska.d.ts +6 -0
- package/dist/server/host/coredevice/nska.d.ts.map +1 -0
- package/dist/server/host/coredevice/nska.js +277 -0
- package/dist/server/host/coredevice/nska.js.map +1 -0
- package/dist/server/host/coredevice/rsd.d.ts +20 -0
- package/dist/server/host/coredevice/rsd.d.ts.map +1 -0
- package/dist/server/host/coredevice/rsd.js +244 -0
- package/dist/server/host/coredevice/rsd.js.map +1 -0
- package/dist/server/host/coredevice/screenshot.d.ts +11 -0
- package/dist/server/host/coredevice/screenshot.d.ts.map +1 -0
- package/dist/server/host/coredevice/screenshot.js +84 -0
- package/dist/server/host/coredevice/screenshot.js.map +1 -0
- package/dist/server/host/coredevice/tunnel.d.ts +29 -0
- package/dist/server/host/coredevice/tunnel.d.ts.map +1 -0
- package/dist/server/host/coredevice/tunnel.js +222 -0
- package/dist/server/host/coredevice/tunnel.js.map +1 -0
- package/dist/server/host/coredevice/xpc.d.ts +21 -0
- package/dist/server/host/coredevice/xpc.d.ts.map +1 -0
- package/dist/server/host/coredevice/xpc.js +318 -0
- package/dist/server/host/coredevice/xpc.js.map +1 -0
- package/dist/server/host/deviceResolver.d.ts +8 -0
- package/dist/server/host/deviceResolver.d.ts.map +1 -1
- package/dist/server/host/deviceResolver.js +128 -62
- package/dist/server/host/deviceResolver.js.map +1 -1
- package/dist/server/host/tools/capture.d.ts.map +1 -1
- package/dist/server/host/tools/capture.js +26 -0
- package/dist/server/host/tools/capture.js.map +1 -1
- package/dist/server/host/tools/input.js +2 -2
- package/dist/server/host/tools/input.js.map +1 -1
- package/dist/server/mcpServer.d.ts.map +1 -1
- package/dist/server/mcpServer.js +44 -3
- package/dist/server/mcpServer.js.map +1 -1
- package/dist/server/metro/eventCapture.d.ts +0 -2
- package/dist/server/metro/eventCapture.d.ts.map +1 -1
- package/dist/server/metro/eventCapture.js +1 -2
- package/dist/server/metro/eventCapture.js.map +1 -1
- package/dist/server/metro/tools/events.d.ts.map +1 -1
- package/dist/server/metro/tools/events.js +11 -11
- package/dist/server/metro/tools/events.js.map +1 -1
- package/dist/shared/projection/projectValue.d.ts +90 -0
- package/dist/shared/projection/projectValue.d.ts.map +1 -0
- package/dist/shared/projection/projectValue.js +322 -0
- package/dist/shared/projection/projectValue.js.map +1 -0
- package/dist/shared/projection/redact.d.ts +31 -0
- package/dist/shared/projection/redact.d.ts.map +1 -0
- package/dist/shared/projection/redact.js +78 -0
- package/dist/shared/projection/redact.js.map +1 -0
- package/dist/shared/projection/resolvePath.d.ts +45 -0
- package/dist/shared/projection/resolvePath.d.ts.map +1 -0
- package/dist/shared/projection/resolvePath.js +211 -0
- package/dist/shared/projection/resolvePath.js.map +1 -0
- package/dist/shared/protocol.d.ts +2 -1
- package/dist/shared/protocol.d.ts.map +1 -1
- package/dist/shared/protocol.js +1 -1
- package/dist/shared/rn/core.d.ts +48 -0
- package/dist/shared/rn/core.d.ts.map +1 -0
- package/dist/shared/rn/core.js +100 -0
- package/dist/shared/rn/core.js.map +1 -0
- package/dist/shared/rn/deviceInfo.d.ts +40 -0
- package/dist/shared/rn/deviceInfo.d.ts.map +1 -0
- package/dist/shared/rn/deviceInfo.js +78 -0
- package/dist/shared/rn/deviceInfo.js.map +1 -0
- package/package.json +4 -2
- package/dist/client/hooks/useMcpState.d.ts +0 -3
- package/dist/client/hooks/useMcpState.d.ts.map +0 -1
- package/dist/client/hooks/useMcpState.js +0 -20
- package/dist/client/hooks/useMcpState.js.map +0 -1
- package/dist/server/canonicalize.d.ts +0 -8
- package/dist/server/canonicalize.d.ts.map +0 -1
- package/dist/server/canonicalize.js +0 -23
- package/dist/server/canonicalize.js.map +0 -1
- package/dist/server/host/modules/screenshot.d.ts +0 -4
- package/dist/server/host/modules/screenshot.d.ts.map +0 -1
- package/dist/server/host/modules/screenshot.js +0 -615
- package/dist/server/host/modules/screenshot.js.map +0 -1
- package/dist/server/host/tools/connectionStatus.d.ts +0 -9
- package/dist/server/host/tools/connectionStatus.d.ts.map +0 -1
- package/dist/server/host/tools/connectionStatus.js +0 -39
- package/dist/server/host/tools/connectionStatus.js.map +0 -1
- package/dist/server/host/tools/symbolicate.d.ts +0 -3
- package/dist/server/host/tools/symbolicate.d.ts.map +0 -1
- package/dist/server/host/tools/symbolicate.js +0 -209
- package/dist/server/host/tools/symbolicate.js.map +0 -1
- package/dist/server/host/wda.d.ts +0 -15
- package/dist/server/host/wda.d.ts.map +0 -1
- package/dist/server/host/wda.js +0 -100
- package/dist/server/host/wda.js.map +0 -1
- package/dist/server/inputSchemaToZod.d.ts +0 -19
- package/dist/server/inputSchemaToZod.d.ts.map +0 -1
- package/dist/server/inputSchemaToZod.js +0 -89
- package/dist/server/inputSchemaToZod.js.map +0 -1
- package/dist/server/metro/tools/openUrl.d.ts +0 -3
- package/dist/server/metro/tools/openUrl.d.ts.map +0 -1
- package/dist/server/metro/tools/openUrl.js +0 -71
- package/dist/server/metro/tools/openUrl.js.map +0 -1
- package/dist/shared/slice.d.ts +0 -16
- package/dist/shared/slice.d.ts.map +0 -1
- package/dist/shared/slice.js +0 -29
- 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
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
75
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
116
|
+
description: 'Return log entries, optionally filtered by level.',
|
|
179
117
|
handler: (args) => {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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,
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/modules/console/console.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
//
|
|
8
|
-
|
|
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
|
|
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
|
-
|
|
38
|
-
description: '
|
|
39
|
-
handler: async () => {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
160
|
-
|
|
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
|
-
|
|
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 };
|