react-native-mcp-kit 4.1.0 → 4.2.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 +6 -6
- package/dist/babel/testIdPlugin.d.ts.map +1 -1
- package/dist/babel/testIdPlugin.js +60 -12
- package/dist/babel/testIdPlugin.js.map +1 -1
- package/dist/bin/ios-hid +0 -0
- package/dist/modules/alert/alert.d.ts.map +1 -1
- package/dist/modules/alert/alert.js +18 -3
- 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 +38 -12
- package/dist/modules/console/console.js.map +1 -1
- package/dist/modules/console/types.d.ts +1 -1
- 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 +17 -4
- 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 +3 -1
- package/dist/modules/errors/errors.js.map +1 -1
- package/dist/modules/fiberTree/fiberTree.d.ts.map +1 -1
- package/dist/modules/fiberTree/fiberTree.js +44 -7
- package/dist/modules/fiberTree/fiberTree.js.map +1 -1
- package/dist/modules/fiberTree/finder.d.ts +2 -0
- package/dist/modules/fiberTree/finder.d.ts.map +1 -1
- package/dist/modules/fiberTree/finder.js +3 -1
- package/dist/modules/fiberTree/finder.js.map +1 -1
- package/dist/modules/fiberTree/hooks.d.ts +17 -0
- package/dist/modules/fiberTree/hooks.d.ts.map +1 -1
- package/dist/modules/fiberTree/hooks.js +22 -4
- package/dist/modules/fiberTree/hooks.js.map +1 -1
- package/dist/modules/fiberTree/utils.d.ts.map +1 -1
- package/dist/modules/fiberTree/utils.js +29 -4
- package/dist/modules/fiberTree/utils.js.map +1 -1
- package/dist/modules/i18next/i18next.d.ts.map +1 -1
- package/dist/modules/i18next/i18next.js +27 -6
- package/dist/modules/i18next/i18next.js.map +1 -1
- package/dist/modules/logBox/logBox.d.ts.map +1 -1
- package/dist/modules/logBox/logBox.js +8 -4
- 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 +19 -4
- package/dist/modules/navigation/navigation.js.map +1 -1
- package/dist/modules/network/network.js +1 -1
- package/dist/modules/network/network.js.map +1 -1
- package/dist/modules/reactQuery/reactQuery.d.ts.map +1 -1
- package/dist/modules/reactQuery/reactQuery.js +2 -1
- 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 +23 -8
- package/dist/modules/storage/storage.js.map +1 -1
- package/dist/server/bridge.d.ts +2 -0
- package/dist/server/bridge.d.ts.map +1 -1
- package/dist/server/bridge.js +61 -5
- package/dist/server/bridge.js.map +1 -1
- package/dist/server/host/tools/capture.d.ts.map +1 -1
- package/dist/server/host/tools/capture.js +52 -22
- package/dist/server/host/tools/capture.js.map +1 -1
- package/dist/server/host/tools/devices.d.ts.map +1 -1
- package/dist/server/host/tools/devices.js +25 -4
- package/dist/server/host/tools/devices.js.map +1 -1
- package/dist/server/host/tools/input.d.ts.map +1 -1
- package/dist/server/host/tools/input.js +45 -20
- package/dist/server/host/tools/input.js.map +1 -1
- package/dist/server/host/tools/tapFiber.d.ts.map +1 -1
- package/dist/server/host/tools/tapFiber.js +2 -0
- package/dist/server/host/tools/tapFiber.js.map +1 -1
- package/dist/server/mcpServer.js +4 -4
- package/dist/server/metro/tools/events.d.ts.map +1 -1
- package/dist/server/metro/tools/events.js +1 -0
- package/dist/server/metro/tools/events.js.map +1 -1
- package/dist/server/metro/tools/openInEditor.d.ts.map +1 -1
- package/dist/server/metro/tools/openInEditor.js +4 -1
- package/dist/server/metro/tools/openInEditor.js.map +1 -1
- package/dist/server/metro/tools/symbolicate.d.ts.map +1 -1
- package/dist/server/metro/tools/symbolicate.js +41 -11
- package/dist/server/metro/tools/symbolicate.js.map +1 -1
- package/dist/shared/projection/projectValue.d.ts +12 -1
- package/dist/shared/projection/projectValue.d.ts.map +1 -1
- package/dist/shared/projection/projectValue.js +42 -12
- package/dist/shared/projection/projectValue.js.map +1 -1
- package/dist/shared/projection/resolvePath.d.ts +14 -2
- package/dist/shared/projection/resolvePath.d.ts.map +1 -1
- package/dist/shared/projection/resolvePath.js +25 -3
- package/dist/shared/projection/resolvePath.js.map +1 -1
- package/package.json +1 -1
package/dist/server/bridge.js
CHANGED
|
@@ -5,10 +5,19 @@ const node_crypto_1 = require("node:crypto");
|
|
|
5
5
|
const ws_1 = require("ws");
|
|
6
6
|
const protocol_1 = require("../shared/protocol");
|
|
7
7
|
const REQUEST_TIMEOUT = 10_000;
|
|
8
|
+
// When a client's WebSocket drops, we keep its ID slot reserved for this long
|
|
9
|
+
// so a reconnect from the same `(deviceId, bundleId, platform)` triple lands
|
|
10
|
+
// back on the same id (e.g. `ios-1`). 10 minutes covers the long tail —
|
|
11
|
+
// Metro fast-refresh bounces, app backgrounded during a coffee break,
|
|
12
|
+
// Xcode rebuild + relaunch, brief network blips, longer pauses while the
|
|
13
|
+
// agent thinks. Stale entries are still cheap (just a ClientEntry copy
|
|
14
|
+
// holding a dead socket reference), so a longer window costs little.
|
|
15
|
+
const RECONNECT_GRACE_MS = 10 * 60_000;
|
|
8
16
|
class Bridge {
|
|
9
17
|
port;
|
|
10
18
|
wss = null;
|
|
11
19
|
clients = new Map();
|
|
20
|
+
disconnectedClients = new Map();
|
|
12
21
|
socketToClientId = new WeakMap();
|
|
13
22
|
platformSequences = new Map();
|
|
14
23
|
pendingRequests = new Map();
|
|
@@ -37,10 +46,24 @@ class Bridge {
|
|
|
37
46
|
});
|
|
38
47
|
ws.on('close', () => {
|
|
39
48
|
const clientId = this.socketToClientId.get(ws);
|
|
40
|
-
if (clientId)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
49
|
+
if (!clientId)
|
|
50
|
+
return;
|
|
51
|
+
const entry = this.clients.get(clientId);
|
|
52
|
+
this.clients.delete(clientId);
|
|
53
|
+
this.socketToClientId.delete(ws);
|
|
54
|
+
this.rejectPendingForClient(clientId, `Client '${clientId}' disconnected`);
|
|
55
|
+
if (entry) {
|
|
56
|
+
// Reserve the ID for a reconnect from the same identity. While the
|
|
57
|
+
// ghost lives, the client is invisible to `listClients` /
|
|
58
|
+
// `getClient` (so tools fail with "not connected"), but a
|
|
59
|
+
// re-registering app matching this entry's `(platform, deviceId,
|
|
60
|
+
// bundleId)` will pick the slot back up.
|
|
61
|
+
const timer = setTimeout(() => {
|
|
62
|
+
this.disconnectedClients.delete(clientId);
|
|
63
|
+
}, RECONNECT_GRACE_MS);
|
|
64
|
+
// Don't keep the event loop alive solely for ghost expiry.
|
|
65
|
+
timer.unref?.();
|
|
66
|
+
this.disconnectedClients.set(clientId, { entry, timer });
|
|
44
67
|
}
|
|
45
68
|
});
|
|
46
69
|
});
|
|
@@ -51,6 +74,10 @@ class Bridge {
|
|
|
51
74
|
}
|
|
52
75
|
async stop() {
|
|
53
76
|
this.rejectAllPending('Server stopping');
|
|
77
|
+
for (const ghost of this.disconnectedClients.values()) {
|
|
78
|
+
clearTimeout(ghost.timer);
|
|
79
|
+
}
|
|
80
|
+
this.disconnectedClients.clear();
|
|
54
81
|
return new Promise((resolve) => {
|
|
55
82
|
if (this.wss) {
|
|
56
83
|
this.wss.close(() => {
|
|
@@ -151,7 +178,20 @@ class Bridge {
|
|
|
151
178
|
}
|
|
152
179
|
break;
|
|
153
180
|
}
|
|
154
|
-
|
|
181
|
+
// If a recently-disconnected client matches this registration's
|
|
182
|
+
// identity triple, reuse its ID instead of allocating a fresh one —
|
|
183
|
+
// keeps `ios-1` stable across Fast Refresh reloads / WS blips.
|
|
184
|
+
const stickyId = this.findGhostMatch(message);
|
|
185
|
+
let id;
|
|
186
|
+
if (stickyId) {
|
|
187
|
+
const ghost = this.disconnectedClients.get(stickyId);
|
|
188
|
+
clearTimeout(ghost.timer);
|
|
189
|
+
this.disconnectedClients.delete(stickyId);
|
|
190
|
+
id = stickyId;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
id = this.nextClientId(message.platform);
|
|
194
|
+
}
|
|
155
195
|
const entry = {
|
|
156
196
|
appName: message.appName,
|
|
157
197
|
appVersion: message.appVersion,
|
|
@@ -220,6 +260,22 @@ class Bridge {
|
|
|
220
260
|
this.platformSequences.set(prefix, next);
|
|
221
261
|
return `${prefix}-${next}`;
|
|
222
262
|
}
|
|
263
|
+
// Look for a ghost ClientEntry whose identity triple (platform, deviceId,
|
|
264
|
+
// bundleId) matches this incoming registration. All three must be present
|
|
265
|
+
// and identical — partial matches are too risky (two apps on the same
|
|
266
|
+
// device, two devices of the same model with no deviceId set, …).
|
|
267
|
+
findGhostMatch(message) {
|
|
268
|
+
if (!message.deviceId || !message.bundleId || !message.platform)
|
|
269
|
+
return null;
|
|
270
|
+
for (const [id, ghost] of this.disconnectedClients) {
|
|
271
|
+
if (ghost.entry.platform === message.platform &&
|
|
272
|
+
ghost.entry.deviceId === message.deviceId &&
|
|
273
|
+
ghost.entry.bundleId === message.bundleId) {
|
|
274
|
+
return id;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
223
279
|
rejectPendingForClient(clientId, reason) {
|
|
224
280
|
for (const [id, pending] of this.pendingRequests) {
|
|
225
281
|
if (pending.clientId === clientId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/server/bridge.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAEzC,2BAAqC;AAGrC,gDAU2B;AAE3B,MAAM,eAAe,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/server/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../../src/server/host/tools/capture.ts"],"names":[],"mappings":"AAUA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,QAAA,MAAM,qBAAqB,QAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../../src/server/host/tools/capture.ts"],"names":[],"mappings":"AAUA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,QAAA,MAAM,qBAAqB,QAAS,CAAC;AA6SrC,eAAO,MAAM,cAAc,WAAY,aAAa,KAAG,eAuDtD,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -87,15 +87,16 @@ const resizeScreenshot = async (input, targetWidth, region) => {
|
|
|
87
87
|
const hashBuffer = (buf) => {
|
|
88
88
|
return (0, node_crypto_1.createHash)('sha256').update(buf).digest('hex');
|
|
89
89
|
};
|
|
90
|
-
// Per-device cache for screenshot diff
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
90
|
+
// Per-device cache for screenshot diff. Holds the meta of the last actually
|
|
91
|
+
// returned response so the `unchanged: true` reply can tell the agent what
|
|
92
|
+
// the still-on-the-wire image looked like (size, region, hash) without
|
|
93
|
+
// re-shipping the bytes.
|
|
94
|
+
const lastScreenshot = new Map();
|
|
95
|
+
const buildMeta = (resized, hash) => {
|
|
96
96
|
const sourceWidth = resized.region?.width ?? resized.originalWidth;
|
|
97
|
-
|
|
97
|
+
return {
|
|
98
98
|
bytes: resized.buffer.length,
|
|
99
|
+
hash,
|
|
99
100
|
height: resized.height,
|
|
100
101
|
originalHeight: resized.originalHeight,
|
|
101
102
|
originalWidth: resized.originalWidth,
|
|
@@ -103,6 +104,12 @@ const buildResponse = (resized) => {
|
|
|
103
104
|
scale: sourceWidth ? Number((resized.width / sourceWidth).toFixed(3)) : undefined,
|
|
104
105
|
width: resized.width,
|
|
105
106
|
};
|
|
107
|
+
};
|
|
108
|
+
const buildResponse = (resized, hash) => {
|
|
109
|
+
// `scale` = image-to-source ratio. When a region was cropped it's the
|
|
110
|
+
// image/region ratio; otherwise it's image/full-screen. Agents use it for
|
|
111
|
+
// pixel-back-to-device math.
|
|
112
|
+
const meta = buildMeta(resized, hash);
|
|
106
113
|
return [
|
|
107
114
|
{
|
|
108
115
|
data: resized.buffer.toString('base64'),
|
|
@@ -115,6 +122,13 @@ const buildResponse = (resized) => {
|
|
|
115
122
|
},
|
|
116
123
|
];
|
|
117
124
|
};
|
|
125
|
+
const unchangedResponse = (lastMeta) => {
|
|
126
|
+
return {
|
|
127
|
+
lastMeta,
|
|
128
|
+
message: 'Screenshot unchanged since last capture.',
|
|
129
|
+
unchanged: true,
|
|
130
|
+
};
|
|
131
|
+
};
|
|
118
132
|
const captureIos = async (udid, runner, width, region) => {
|
|
119
133
|
const tmpPath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `rnmcp-ios-${(0, node_crypto_1.randomUUID)()}.png`);
|
|
120
134
|
try {
|
|
@@ -132,11 +146,13 @@ const captureIos = async (udid, runner, width, region) => {
|
|
|
132
146
|
const raw = await (0, promises_1.readFile)(tmpPath);
|
|
133
147
|
const resized = await resizeScreenshot(raw, width, region);
|
|
134
148
|
const hash = hashBuffer(resized.buffer);
|
|
135
|
-
|
|
136
|
-
|
|
149
|
+
const last = lastScreenshot.get(udid);
|
|
150
|
+
if (last && last.hash === hash) {
|
|
151
|
+
return unchangedResponse(last);
|
|
137
152
|
}
|
|
138
|
-
|
|
139
|
-
|
|
153
|
+
const meta = buildMeta(resized, hash);
|
|
154
|
+
lastScreenshot.set(udid, meta);
|
|
155
|
+
return buildResponse(resized, hash);
|
|
140
156
|
}
|
|
141
157
|
catch (err) {
|
|
142
158
|
if (err instanceof processRunner_1.ProcessNotFoundError) {
|
|
@@ -162,11 +178,13 @@ const captureIosRealDevice = async (coreDeviceIdentifier, width, region) => {
|
|
|
162
178
|
});
|
|
163
179
|
const resized = await resizeScreenshot(raw, width, region);
|
|
164
180
|
const hash = hashBuffer(resized.buffer);
|
|
165
|
-
|
|
166
|
-
|
|
181
|
+
const last = lastScreenshot.get(coreDeviceIdentifier);
|
|
182
|
+
if (last && last.hash === hash) {
|
|
183
|
+
return unchangedResponse(last);
|
|
167
184
|
}
|
|
168
|
-
|
|
169
|
-
|
|
185
|
+
const meta = buildMeta(resized, hash);
|
|
186
|
+
lastScreenshot.set(coreDeviceIdentifier, meta);
|
|
187
|
+
return buildResponse(resized, hash);
|
|
170
188
|
}
|
|
171
189
|
catch (err) {
|
|
172
190
|
return {
|
|
@@ -192,11 +210,13 @@ const captureAndroid = async (serial, runner, width, region) => {
|
|
|
192
210
|
}
|
|
193
211
|
const resized = await resizeScreenshot(proc.stdout, width, region);
|
|
194
212
|
const hash = hashBuffer(resized.buffer);
|
|
195
|
-
|
|
196
|
-
|
|
213
|
+
const last = lastScreenshot.get(serial);
|
|
214
|
+
if (last && last.hash === hash) {
|
|
215
|
+
return unchangedResponse(last);
|
|
197
216
|
}
|
|
198
|
-
|
|
199
|
-
|
|
217
|
+
const meta = buildMeta(resized, hash);
|
|
218
|
+
lastScreenshot.set(serial, meta);
|
|
219
|
+
return buildResponse(resized, hash);
|
|
200
220
|
}
|
|
201
221
|
catch (err) {
|
|
202
222
|
if (err instanceof processRunner_1.ProcessNotFoundError) {
|
|
@@ -211,12 +231,12 @@ const captureAndroid = async (serial, runner, width, region) => {
|
|
|
211
231
|
};
|
|
212
232
|
const screenshotTool = (runner) => {
|
|
213
233
|
return {
|
|
214
|
-
description: `WebP screenshot, resized to save vision tokens. Response is [image, metadata] where metadata is JSON with { width, height, originalWidth, originalHeight, scale, bytes, region? }.
|
|
234
|
+
description: `WebP screenshot, resized to save vision tokens. Response is [image, metadata] where metadata is JSON with { width, height, originalWidth, originalHeight, scale, bytes, hash, region? }.
|
|
215
235
|
|
|
216
236
|
TOKEN BUDGETING
|
|
217
237
|
• Vision tokens are driven by image area. Default width ${SCREENSHOT_DEFAULT_WIDTH} gives a readable full-screen view at ~300 tokens. Bump only to read small text.
|
|
218
238
|
• Pass \`region: { x, y, width, height }\` (physical device pixels) to crop to a single element — typical tap-target shrinks to ~20-60 vision tokens. Grab the rect from fiber_tree__query bounds.
|
|
219
|
-
• { unchanged: true } is returned when the resized bytes are identical to the previous capture — cheap polling.
|
|
239
|
+
• \`{ unchanged: true, lastMeta }\` is returned when the resized bytes are identical to the previous capture — cheap polling. \`lastMeta\` is the meta of the previously-returned image (same shape, including \`hash\`) so you don't need to re-query.
|
|
220
240
|
|
|
221
241
|
Use fiber_tree bounds for tap targeting; screenshots are for visual verification of what the UI looks like right now.`,
|
|
222
242
|
handler: async (args, ctx) => {
|
|
@@ -242,10 +262,20 @@ Use fiber_tree bounds for tap targeting; screenshots are for visual verification
|
|
|
242
262
|
region: {
|
|
243
263
|
description: 'Crop rectangle in original device pixels (top-left origin). Out-of-bounds values are clipped. Typical use: pass fiber_tree bounds ({ x, y, width, height }) to snapshot just one component. Omitted = full screen.',
|
|
244
264
|
examples: [{ height: 128, width: 900, x: 60, y: 200 }],
|
|
265
|
+
properties: {
|
|
266
|
+
height: { exclusiveMinimum: 0, type: 'number' },
|
|
267
|
+
width: { exclusiveMinimum: 0, type: 'number' },
|
|
268
|
+
x: { minimum: 0, type: 'number' },
|
|
269
|
+
y: { minimum: 0, type: 'number' },
|
|
270
|
+
},
|
|
271
|
+
required: ['x', 'y', 'width', 'height'],
|
|
245
272
|
type: 'object',
|
|
246
273
|
},
|
|
247
274
|
width: {
|
|
248
|
-
|
|
275
|
+
default: SCREENSHOT_DEFAULT_WIDTH,
|
|
276
|
+
description: 'Output width in px (aspect preserved, applied AFTER cropping). Default reads normal UI at ~300 vision tokens; bump only to read small text.',
|
|
277
|
+
maximum: SCREENSHOT_MAX_WIDTH,
|
|
278
|
+
minimum: SCREENSHOT_MIN_WIDTH,
|
|
249
279
|
type: 'number',
|
|
250
280
|
},
|
|
251
281
|
...helpers_1.NATIVE_ID_SCHEMA,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../src/server/host/tools/capture.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAqD;AACrD,+CAAgD;AAChD,qCAAiC;AACjC,yCAAiC;AAEjC,kDAA0B;AAE1B,oEAAwE;AACxE,iEAA6D;AAC7D,mDAAmG;AACnG,+DAAuF;AAGvF,MAAM,qBAAqB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../src/server/host/tools/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../../../src/server/host/tools/devices.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../../../src/server/host/tools/devices.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAmB3D,eAAO,MAAM,eAAe,WAAY,aAAa,KAAG,eAkBvD,CAAC"}
|
|
@@ -3,13 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.listDevicesTool = void 0;
|
|
4
4
|
const deviceResolver_1 = require("../../../server/host/deviceResolver");
|
|
5
5
|
const capture_1 = require("./capture");
|
|
6
|
+
const filterConnected = (devices) => {
|
|
7
|
+
const onlyConnectedIos = (item) => {
|
|
8
|
+
return item.connected;
|
|
9
|
+
};
|
|
10
|
+
const onlyConnectedAndroid = (item) => {
|
|
11
|
+
return item.connected;
|
|
12
|
+
};
|
|
13
|
+
return {
|
|
14
|
+
android: Array.isArray(devices.android)
|
|
15
|
+
? devices.android.filter(onlyConnectedAndroid)
|
|
16
|
+
: devices.android,
|
|
17
|
+
ios: Array.isArray(devices.ios) ? devices.ios.filter(onlyConnectedIos) : devices.ios,
|
|
18
|
+
};
|
|
19
|
+
};
|
|
6
20
|
const listDevicesTool = (runner) => {
|
|
7
21
|
return {
|
|
8
|
-
description: 'Enumerate visible iOS simulators + Android devices. Connected clients are annotated with their clientId; connected devices are listed first in each platform group.',
|
|
9
|
-
handler: async (
|
|
10
|
-
|
|
22
|
+
description: 'Enumerate visible iOS simulators + Android devices. Connected clients are annotated with their clientId; connected devices are listed first in each platform group. Pass `connected: true` to filter to only devices with a live MCP client attached.',
|
|
23
|
+
handler: async (args, ctx) => {
|
|
24
|
+
const all = await (0, deviceResolver_1.enrichDevicesWithClientStatus)(ctx.bridge, runner);
|
|
25
|
+
return args.connected === true ? filterConnected(all) : all;
|
|
26
|
+
},
|
|
27
|
+
inputSchema: {
|
|
28
|
+
connected: {
|
|
29
|
+
default: false,
|
|
30
|
+
description: 'When true, drop devices without an attached MCP client. Error envelopes for each platform are preserved.',
|
|
31
|
+
type: 'boolean',
|
|
32
|
+
},
|
|
11
33
|
},
|
|
12
|
-
inputSchema: {},
|
|
13
34
|
timeout: capture_1.SCREENSHOT_TIMEOUT_MS,
|
|
14
35
|
};
|
|
15
36
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../../../src/server/host/tools/devices.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../../../src/server/host/tools/devices.ts"],"names":[],"mappings":";;;AAAA,iEAKsC;AAItC,uCAAkD;AAElD,MAAM,eAAe,GAAG,CAAC,OAA2B,EAAsB,EAAE;IAC1E,MAAM,gBAAgB,GAAG,CAAC,IAAoB,EAAW,EAAE;QACzD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC,CAAC;IACF,MAAM,oBAAoB,GAAG,CAAC,IAA2B,EAAW,EAAE;QACpE,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC,CAAC;IACF,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;YACrC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAC9C,CAAC,CAAC,OAAO,CAAC,OAAO;QACnB,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;KACrF,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,eAAe,GAAG,CAAC,MAAqB,EAAmB,EAAE;IACxE,OAAO;QACL,WAAW,EACT,uPAAuP;QACzP,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,MAAM,IAAA,8CAA6B,EAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9D,CAAC;QACD,WAAW,EAAE;YACX,SAAS,EAAE;gBACT,OAAO,EAAE,KAAK;gBACd,WAAW,EACT,0GAA0G;gBAC5G,IAAI,EAAE,SAAS;aAChB;SACF;QACD,OAAO,EAAE,+BAAqB;KAC/B,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,eAAe,mBAkB1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/server/host/tools/input.ts"],"names":[],"mappings":"AAUA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA6J3D,eAAO,MAAM,OAAO,WAAY,aAAa,KAAG,
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/server/host/tools/input.ts"],"names":[],"mappings":"AAUA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA6J3D,eAAO,MAAM,OAAO,WAAY,aAAa,KAAG,eAsC/C,CAAC;AAEF,eAAO,MAAM,SAAS,WAAY,aAAa,KAAG,eA0EjD,CAAC;AAEF,eAAO,MAAM,YAAY,WAAY,aAAa,KAAG,eA4CpD,CAAC;AASF,eAAO,MAAM,aAAa,WAAY,aAAa,KAAG,eAsDrD,CAAC;AAEF,eAAO,MAAM,QAAQ,WAAY,aAAa,KAAG,eAgFhD,CAAC;AASF,eAAO,MAAM,iBAAiB,WAAY,aAAa,KAAG,eAyGzD,CAAC;AAEF,eAAO,MAAM,YAAY,WAAY,aAAa,KAAG,eAgCpD,CAAC"}
|
|
@@ -138,10 +138,12 @@ const tapTool = (runner) => {
|
|
|
138
138
|
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|
|
139
139
|
x: {
|
|
140
140
|
description: 'Absolute x pixel coordinate (top-left origin).',
|
|
141
|
+
minimum: 0,
|
|
141
142
|
type: 'number',
|
|
142
143
|
},
|
|
143
144
|
y: {
|
|
144
145
|
description: 'Absolute y pixel coordinate (top-left origin).',
|
|
146
|
+
minimum: 0,
|
|
145
147
|
type: 'number',
|
|
146
148
|
},
|
|
147
149
|
...helpers_1.NATIVE_ID_SCHEMA,
|
|
@@ -187,26 +189,25 @@ const swipeTool = (runner) => {
|
|
|
187
189
|
},
|
|
188
190
|
inputSchema: {
|
|
189
191
|
durationMs: {
|
|
190
|
-
|
|
192
|
+
default: SWIPE_DURATION_DEFAULT_MS,
|
|
193
|
+
description: 'Total swipe duration in milliseconds.',
|
|
194
|
+
maximum: SWIPE_DURATION_MAX_MS,
|
|
195
|
+
minimum: SWIPE_DURATION_MIN_MS,
|
|
191
196
|
type: 'number',
|
|
192
197
|
},
|
|
193
198
|
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|
|
194
199
|
x1: {
|
|
195
200
|
description: 'Start x pixel coordinate (top-left origin).',
|
|
201
|
+
minimum: 0,
|
|
196
202
|
type: 'number',
|
|
197
203
|
},
|
|
198
|
-
x2: {
|
|
199
|
-
description: 'End x pixel coordinate (top-left origin).',
|
|
200
|
-
type: 'number',
|
|
201
|
-
},
|
|
204
|
+
x2: { description: 'End x pixel coordinate (top-left origin).', minimum: 0, type: 'number' },
|
|
202
205
|
y1: {
|
|
203
206
|
description: 'Start y pixel coordinate (top-left origin).',
|
|
207
|
+
minimum: 0,
|
|
204
208
|
type: 'number',
|
|
205
209
|
},
|
|
206
|
-
y2: {
|
|
207
|
-
description: 'End y pixel coordinate (top-left origin).',
|
|
208
|
-
type: 'number',
|
|
209
|
-
},
|
|
210
|
+
y2: { description: 'End y pixel coordinate (top-left origin).', minimum: 0, type: 'number' },
|
|
210
211
|
...helpers_1.NATIVE_ID_SCHEMA,
|
|
211
212
|
},
|
|
212
213
|
timeout: INPUT_TIMEOUT_MS + SWIPE_DURATION_MAX_MS,
|
|
@@ -242,7 +243,8 @@ const typeTextTool = (runner) => {
|
|
|
242
243
|
inputSchema: {
|
|
243
244
|
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|
|
244
245
|
submit: {
|
|
245
|
-
|
|
246
|
+
default: false,
|
|
247
|
+
description: 'Press ENTER after typing (e.g. to submit a search).',
|
|
246
248
|
type: 'boolean',
|
|
247
249
|
},
|
|
248
250
|
text: {
|
|
@@ -286,12 +288,15 @@ const longPressTool = (runner) => {
|
|
|
286
288
|
},
|
|
287
289
|
inputSchema: {
|
|
288
290
|
durationMs: {
|
|
289
|
-
|
|
291
|
+
default: LONG_PRESS_DURATION_DEFAULT_MS,
|
|
292
|
+
description: 'Hold duration in milliseconds.',
|
|
293
|
+
maximum: SWIPE_DURATION_MAX_MS,
|
|
294
|
+
minimum: SWIPE_DURATION_MIN_MS,
|
|
290
295
|
type: 'number',
|
|
291
296
|
},
|
|
292
297
|
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|
|
293
|
-
x: { description: 'Absolute x pixel coordinate.', type: 'number' },
|
|
294
|
-
y: { description: 'Absolute y pixel coordinate.', type: 'number' },
|
|
298
|
+
x: { description: 'Absolute x pixel coordinate.', minimum: 0, type: 'number' },
|
|
299
|
+
y: { description: 'Absolute y pixel coordinate.', minimum: 0, type: 'number' },
|
|
295
300
|
...helpers_1.NATIVE_ID_SCHEMA,
|
|
296
301
|
},
|
|
297
302
|
timeout: INPUT_TIMEOUT_MS + SWIPE_DURATION_MAX_MS,
|
|
@@ -341,18 +346,24 @@ const dragTool = (runner) => {
|
|
|
341
346
|
},
|
|
342
347
|
inputSchema: {
|
|
343
348
|
durationMs: {
|
|
344
|
-
|
|
349
|
+
default: DRAG_MOVE_DEFAULT_MS,
|
|
350
|
+
description: 'Move portion in milliseconds.',
|
|
351
|
+
maximum: SWIPE_DURATION_MAX_MS,
|
|
352
|
+
minimum: SWIPE_DURATION_MIN_MS,
|
|
345
353
|
type: 'number',
|
|
346
354
|
},
|
|
347
355
|
holdMs: {
|
|
348
|
-
|
|
356
|
+
default: DRAG_HOLD_DEFAULT_MS,
|
|
357
|
+
description: 'Hold time near start before the motion. 0 to skip hold.',
|
|
358
|
+
maximum: SWIPE_DURATION_MAX_MS,
|
|
359
|
+
minimum: 0,
|
|
349
360
|
type: 'number',
|
|
350
361
|
},
|
|
351
362
|
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|
|
352
|
-
x1: { description: 'Start x pixel coordinate.', type: 'number' },
|
|
353
|
-
x2: { description: 'End x pixel coordinate.', type: 'number' },
|
|
354
|
-
y1: { description: 'Start y pixel coordinate.', type: 'number' },
|
|
355
|
-
y2: { description: 'End y pixel coordinate.', type: 'number' },
|
|
363
|
+
x1: { description: 'Start x pixel coordinate.', minimum: 0, type: 'number' },
|
|
364
|
+
x2: { description: 'End x pixel coordinate.', minimum: 0, type: 'number' },
|
|
365
|
+
y1: { description: 'Start y pixel coordinate.', minimum: 0, type: 'number' },
|
|
366
|
+
y2: { description: 'End y pixel coordinate.', minimum: 0, type: 'number' },
|
|
356
367
|
...helpers_1.NATIVE_ID_SCHEMA,
|
|
357
368
|
},
|
|
358
369
|
timeout: INPUT_TIMEOUT_MS + SWIPE_DURATION_MAX_MS,
|
|
@@ -429,10 +440,24 @@ focusDelayMs default is ${BATCH_FOCUS_DELAY_DEFAULT_MS}ms — tuned for in-place
|
|
|
429
440
|
{ submit: true, text: 'pa55word', x: 120, y: 520 },
|
|
430
441
|
],
|
|
431
442
|
],
|
|
443
|
+
items: {
|
|
444
|
+
properties: {
|
|
445
|
+
submit: { default: false, type: 'boolean' },
|
|
446
|
+
text: { type: 'string' },
|
|
447
|
+
x: { minimum: 0, type: 'number' },
|
|
448
|
+
y: { minimum: 0, type: 'number' },
|
|
449
|
+
},
|
|
450
|
+
required: ['x', 'y', 'text'],
|
|
451
|
+
type: 'object',
|
|
452
|
+
},
|
|
453
|
+
minItems: 1,
|
|
432
454
|
type: 'array',
|
|
433
455
|
},
|
|
434
456
|
focusDelayMs: {
|
|
435
|
-
|
|
457
|
+
default: BATCH_FOCUS_DELAY_DEFAULT_MS,
|
|
458
|
+
description: 'Delay between tap and type. Use 0 to skip when the input is already focused.',
|
|
459
|
+
maximum: BATCH_FOCUS_DELAY_MAX_MS,
|
|
460
|
+
minimum: 0,
|
|
436
461
|
type: 'number',
|
|
437
462
|
},
|
|
438
463
|
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|