react-native-mcp-kit 4.1.0 → 4.2.1
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/collectHooks.d.ts +13 -0
- package/dist/babel/testIdPlugin/collectHooks.d.ts.map +1 -0
- package/dist/babel/testIdPlugin/collectHooks.js +112 -0
- package/dist/babel/testIdPlugin/collectHooks.js.map +1 -0
- package/dist/babel/testIdPlugin/constants.d.ts +6 -0
- package/dist/babel/testIdPlugin/constants.d.ts.map +1 -0
- package/dist/babel/testIdPlugin/constants.js +49 -0
- package/dist/babel/testIdPlugin/constants.js.map +1 -0
- package/dist/babel/testIdPlugin/helpers.d.ts +7 -0
- package/dist/babel/testIdPlugin/helpers.d.ts.map +1 -0
- package/dist/babel/testIdPlugin/helpers.js +77 -0
- package/dist/babel/testIdPlugin/helpers.js.map +1 -0
- package/dist/babel/testIdPlugin/hocUnwrap.d.ts +4 -0
- package/dist/babel/testIdPlugin/hocUnwrap.d.ts.map +1 -0
- package/dist/babel/testIdPlugin/hocUnwrap.js +94 -0
- package/dist/babel/testIdPlugin/hocUnwrap.js.map +1 -0
- package/dist/babel/{testIdPlugin.d.ts → testIdPlugin/index.d.ts} +1 -1
- package/dist/babel/testIdPlugin/index.d.ts.map +1 -0
- package/dist/babel/testIdPlugin/index.js +205 -0
- package/dist/babel/testIdPlugin/index.js.map +1 -0
- package/dist/babel/testIdPlugin/inject.d.ts +7 -0
- package/dist/babel/testIdPlugin/inject.d.ts.map +1 -0
- package/dist/babel/testIdPlugin/inject.js +86 -0
- package/dist/babel/testIdPlugin/inject.js.map +1 -0
- package/dist/babel/testIdPlugin/types.d.ts +59 -0
- package/dist/babel/testIdPlugin/types.d.ts.map +1 -0
- package/dist/babel/testIdPlugin/types.js +3 -0
- package/dist/babel/testIdPlugin/types.js.map +1 -0
- package/dist/bin/ios-hid +0 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- 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/extract.d.ts +6 -0
- package/dist/modules/fiberTree/hooks/extract.d.ts.map +1 -0
- package/dist/modules/fiberTree/hooks/extract.js +187 -0
- package/dist/modules/fiberTree/hooks/extract.js.map +1 -0
- package/dist/modules/fiberTree/hooks/flatten.d.ts +4 -0
- package/dist/modules/fiberTree/hooks/flatten.d.ts.map +1 -0
- package/dist/modules/fiberTree/hooks/flatten.js +81 -0
- package/dist/modules/fiberTree/hooks/flatten.js.map +1 -0
- package/dist/modules/fiberTree/hooks/index.d.ts +5 -0
- package/dist/modules/fiberTree/hooks/index.d.ts.map +1 -0
- package/dist/modules/fiberTree/hooks/index.js +10 -0
- package/dist/modules/fiberTree/hooks/index.js.map +1 -0
- package/dist/modules/fiberTree/hooks/options.d.ts +9 -0
- package/dist/modules/fiberTree/hooks/options.d.ts.map +1 -0
- package/dist/modules/fiberTree/hooks/options.js +27 -0
- package/dist/modules/fiberTree/hooks/options.js.map +1 -0
- package/dist/modules/fiberTree/hooks/patterns.d.ts +2 -0
- package/dist/modules/fiberTree/hooks/patterns.d.ts.map +1 -0
- package/dist/modules/fiberTree/hooks/patterns.js +26 -0
- package/dist/modules/fiberTree/hooks/patterns.js.map +1 -0
- package/dist/modules/fiberTree/hooks/shape.d.ts +3 -0
- package/dist/modules/fiberTree/hooks/shape.d.ts.map +1 -0
- package/dist/modules/fiberTree/hooks/shape.js +66 -0
- package/dist/modules/fiberTree/hooks/shape.js.map +1 -0
- package/dist/modules/fiberTree/hooks/slotCount.d.ts +2 -0
- package/dist/modules/fiberTree/hooks/slotCount.d.ts.map +1 -0
- package/dist/modules/fiberTree/hooks/slotCount.js +93 -0
- package/dist/modules/fiberTree/hooks/slotCount.js.map +1 -0
- package/dist/modules/fiberTree/{hooks.d.ts → hooks/types.d.ts} +18 -34
- package/dist/modules/fiberTree/hooks/types.d.ts.map +1 -0
- package/dist/modules/fiberTree/hooks/types.js +3 -0
- package/dist/modules/fiberTree/hooks/types.js.map +1 -0
- package/dist/modules/fiberTree/hooks/value.d.ts +2 -0
- package/dist/modules/fiberTree/hooks/value.d.ts.map +1 -0
- package/dist/modules/fiberTree/hooks/value.js +89 -0
- package/dist/modules/fiberTree/hooks/value.js.map +1 -0
- package/dist/modules/fiberTree/utils/constants.d.ts +8 -0
- package/dist/modules/fiberTree/utils/constants.d.ts.map +1 -0
- package/dist/modules/fiberTree/utils/constants.js +15 -0
- package/dist/modules/fiberTree/utils/constants.js.map +1 -0
- package/dist/modules/fiberTree/utils/index.d.ts +9 -0
- package/dist/modules/fiberTree/utils/index.d.ts.map +1 -0
- package/dist/modules/fiberTree/utils/index.js +34 -0
- package/dist/modules/fiberTree/utils/index.js.map +1 -0
- package/dist/modules/fiberTree/utils/match.d.ts +4 -0
- package/dist/modules/fiberTree/utils/match.d.ts.map +1 -0
- package/dist/modules/fiberTree/utils/match.js +169 -0
- package/dist/modules/fiberTree/utils/match.js.map +1 -0
- package/dist/modules/fiberTree/utils/naming.d.ts +4 -0
- package/dist/modules/fiberTree/utils/naming.d.ts.map +1 -0
- package/dist/modules/fiberTree/utils/naming.js +52 -0
- package/dist/modules/fiberTree/utils/naming.js.map +1 -0
- package/dist/modules/fiberTree/utils/native.d.ts +5 -0
- package/dist/modules/fiberTree/utils/native.d.ts.map +1 -0
- package/dist/modules/fiberTree/utils/native.js +101 -0
- package/dist/modules/fiberTree/utils/native.js.map +1 -0
- package/dist/modules/fiberTree/utils/projection.d.ts +9 -0
- package/dist/modules/fiberTree/utils/projection.d.ts.map +1 -0
- package/dist/modules/fiberTree/utils/projection.js +75 -0
- package/dist/modules/fiberTree/utils/projection.js.map +1 -0
- package/dist/modules/fiberTree/utils/root.d.ts +4 -0
- package/dist/modules/fiberTree/utils/root.d.ts.map +1 -0
- package/dist/modules/fiberTree/utils/root.js +30 -0
- package/dist/modules/fiberTree/utils/root.js.map +1 -0
- package/dist/modules/fiberTree/utils/screen.d.ts +10 -0
- package/dist/modules/fiberTree/utils/screen.d.ts.map +1 -0
- package/dist/modules/fiberTree/utils/screen.js +39 -0
- package/dist/modules/fiberTree/utils/screen.js.map +1 -0
- package/dist/modules/fiberTree/utils/serialize.d.ts +4 -0
- package/dist/modules/fiberTree/utils/serialize.d.ts.map +1 -0
- package/dist/modules/fiberTree/utils/serialize.js +102 -0
- package/dist/modules/fiberTree/utils/serialize.js.map +1 -0
- package/dist/modules/fiberTree/utils/traverse.d.ts +12 -0
- package/dist/modules/fiberTree/utils/traverse.d.ts.map +1 -0
- package/dist/modules/fiberTree/utils/traverse.js +107 -0
- package/dist/modules/fiberTree/utils/traverse.js.map +1 -0
- 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/dispatch.d.ts +15 -0
- package/dist/server/dispatch.d.ts.map +1 -0
- package/dist/server/dispatch.js +121 -0
- package/dist/server/dispatch.js.map +1 -0
- package/dist/server/helpers.d.ts +97 -0
- package/dist/server/helpers.d.ts.map +1 -0
- package/dist/server/helpers.js +162 -0
- package/dist/server/helpers.js.map +1 -0
- package/dist/server/host/deviceResolver/byClient.d.ts +5 -0
- package/dist/server/host/deviceResolver/byClient.d.ts.map +1 -0
- package/dist/server/host/deviceResolver/byClient.js +171 -0
- package/dist/server/host/deviceResolver/byClient.js.map +1 -0
- package/dist/server/host/deviceResolver/byId.d.ts +5 -0
- package/dist/server/host/deviceResolver/byId.d.ts.map +1 -0
- package/dist/server/host/deviceResolver/byId.js +81 -0
- package/dist/server/host/deviceResolver/byId.js.map +1 -0
- package/dist/server/host/deviceResolver/enrich.d.ts +5 -0
- package/dist/server/host/deviceResolver/enrich.d.ts.map +1 -0
- package/dist/server/host/deviceResolver/enrich.js +123 -0
- package/dist/server/host/deviceResolver/enrich.js.map +1 -0
- package/dist/server/host/deviceResolver/index.d.ts +13 -0
- package/dist/server/host/deviceResolver/index.d.ts.map +1 -0
- package/dist/server/host/deviceResolver/index.js +65 -0
- package/dist/server/host/deviceResolver/index.js.map +1 -0
- package/dist/server/host/deviceResolver/list.d.ts +10 -0
- package/dist/server/host/deviceResolver/list.d.ts.map +1 -0
- package/dist/server/host/deviceResolver/list.js +119 -0
- package/dist/server/host/deviceResolver/list.js.map +1 -0
- package/dist/server/host/deviceResolver/scan.d.ts +4 -0
- package/dist/server/host/deviceResolver/scan.d.ts.map +1 -0
- package/dist/server/host/deviceResolver/scan.js +102 -0
- package/dist/server/host/deviceResolver/scan.js.map +1 -0
- package/dist/server/host/{deviceResolver.d.ts → deviceResolver/types.d.ts} +1 -16
- package/dist/server/host/deviceResolver/types.d.ts.map +1 -0
- package/dist/server/host/deviceResolver/types.js +3 -0
- package/dist/server/host/deviceResolver/types.js.map +1 -0
- 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/android.d.ts +15 -0
- package/dist/server/host/tools/input/android.d.ts.map +1 -0
- package/dist/server/host/tools/input/android.js +88 -0
- package/dist/server/host/tools/input/android.js.map +1 -0
- package/dist/server/host/tools/input/constants.d.ts +14 -0
- package/dist/server/host/tools/input/constants.d.ts.map +1 -0
- package/dist/server/host/tools/input/constants.js +41 -0
- package/dist/server/host/tools/input/constants.js.map +1 -0
- package/dist/server/host/tools/input/drag.d.ts +4 -0
- package/dist/server/host/tools/input/drag.d.ts.map +1 -0
- package/dist/server/host/tools/input/drag.js +76 -0
- package/dist/server/host/tools/input/drag.js.map +1 -0
- package/dist/server/host/tools/input/index.d.ts +8 -0
- package/dist/server/host/tools/input/index.d.ts.map +1 -0
- package/dist/server/host/tools/input/index.js +18 -0
- package/dist/server/host/tools/input/index.js.map +1 -0
- package/dist/server/host/tools/input/longPress.d.ts +4 -0
- package/dist/server/host/tools/input/longPress.d.ts.map +1 -0
- package/dist/server/host/tools/input/longPress.js +49 -0
- package/dist/server/host/tools/input/longPress.js.map +1 -0
- package/dist/server/host/tools/input/pressKey.d.ts +4 -0
- package/dist/server/host/tools/input/pressKey.d.ts.map +1 -0
- package/dist/server/host/tools/input/pressKey.js +42 -0
- package/dist/server/host/tools/input/pressKey.js.map +1 -0
- package/dist/server/host/tools/input/swipe.d.ts +4 -0
- package/dist/server/host/tools/input/swipe.d.ts.map +1 -0
- package/dist/server/host/tools/input/swipe.js +71 -0
- package/dist/server/host/tools/input/swipe.js.map +1 -0
- package/dist/server/host/tools/input/tap.d.ts +4 -0
- package/dist/server/host/tools/input/tap.d.ts.map +1 -0
- package/dist/server/host/tools/input/tap.js +49 -0
- package/dist/server/host/tools/input/tap.js.map +1 -0
- package/dist/server/host/tools/input/typeText.d.ts +4 -0
- package/dist/server/host/tools/input/typeText.d.ts.map +1 -0
- package/dist/server/host/tools/input/typeText.js +52 -0
- package/dist/server/host/tools/input/typeText.js.map +1 -0
- package/dist/server/host/tools/input/typeTextBatch.d.ts +4 -0
- package/dist/server/host/tools/input/typeTextBatch.d.ts.map +1 -0
- package/dist/server/host/tools/input/typeTextBatch.js +106 -0
- package/dist/server/host/tools/input/typeTextBatch.js.map +1 -0
- 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/instructions.d.ts +2 -0
- package/dist/server/instructions.d.ts.map +1 -0
- package/dist/server/instructions.js +74 -0
- package/dist/server/instructions.js.map +1 -0
- package/dist/server/mcpServer.d.ts +0 -12
- package/dist/server/mcpServer.d.ts.map +1 -1
- package/dist/server/mcpServer.js +26 -877
- package/dist/server/mcpServer.js.map +1 -1
- 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/server/predicate.d.ts +31 -0
- package/dist/server/predicate.d.ts.map +1 -0
- package/dist/server/predicate.js +104 -0
- package/dist/server/predicate.js.map +1 -0
- package/dist/server/tools/assert.d.ts +4 -0
- package/dist/server/tools/assert.d.ts.map +1 -0
- package/dist/server/tools/assert.js +79 -0
- package/dist/server/tools/assert.js.map +1 -0
- package/dist/server/tools/call.d.ts +4 -0
- package/dist/server/tools/call.d.ts.map +1 -0
- package/dist/server/tools/call.js +38 -0
- package/dist/server/tools/call.js.map +1 -0
- package/dist/server/tools/connectionStatus.d.ts +4 -0
- package/dist/server/tools/connectionStatus.d.ts.map +1 -0
- package/dist/server/tools/connectionStatus.js +41 -0
- package/dist/server/tools/connectionStatus.js.map +1 -0
- package/dist/server/tools/describeTool.d.ts +4 -0
- package/dist/server/tools/describeTool.d.ts.map +1 -0
- package/dist/server/tools/describeTool.js +130 -0
- package/dist/server/tools/describeTool.js.map +1 -0
- package/dist/server/tools/listTools.d.ts +4 -0
- package/dist/server/tools/listTools.d.ts.map +1 -0
- package/dist/server/tools/listTools.js +109 -0
- package/dist/server/tools/listTools.js.map +1 -0
- package/dist/server/tools/waitUntil.d.ts +4 -0
- package/dist/server/tools/waitUntil.d.ts.map +1 -0
- package/dist/server/tools/waitUntil.js +119 -0
- package/dist/server/tools/waitUntil.js.map +1 -0
- 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 +2 -2
- package/dist/babel/testIdPlugin.d.ts.map +0 -1
- package/dist/babel/testIdPlugin.js +0 -537
- package/dist/babel/testIdPlugin.js.map +0 -1
- package/dist/modules/fiberTree/hooks.d.ts.map +0 -1
- package/dist/modules/fiberTree/hooks.js +0 -532
- package/dist/modules/fiberTree/hooks.js.map +0 -1
- package/dist/modules/fiberTree/utils.d.ts +0 -39
- package/dist/modules/fiberTree/utils.d.ts.map +0 -1
- package/dist/modules/fiberTree/utils.js +0 -616
- package/dist/modules/fiberTree/utils.js.map +0 -1
- package/dist/server/host/deviceResolver.d.ts.map +0 -1
- package/dist/server/host/deviceResolver.js +0 -621
- package/dist/server/host/deviceResolver.js.map +0 -1
- package/dist/server/host/tools/input.d.ts +0 -10
- package/dist/server/host/tools/input.d.ts.map +0 -1
- package/dist/server/host/tools/input.js +0 -478
- package/dist/server/host/tools/input.js.map +0 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.enrichDevicesWithClientStatus = exports.listIosSimulators = exports.listIosRealDevices = exports.listAndroidDevices = exports.clearDeviceCache = exports.resolveDevice = void 0;
|
|
4
|
+
const byClient_1 = require("./byClient");
|
|
5
|
+
const byId_1 = require("./byId");
|
|
6
|
+
const scan_1 = require("./scan");
|
|
7
|
+
const resolveDevice = async (ctx, options, runner) => {
|
|
8
|
+
// Step 0: explicit native identifier — highest priority, bypasses everything else
|
|
9
|
+
if (options.udid) {
|
|
10
|
+
return (0, byId_1.resolveIosByUdid)(options.udid, runner);
|
|
11
|
+
}
|
|
12
|
+
if (options.serial) {
|
|
13
|
+
return (0, byId_1.resolveAndroidBySerial)(options.serial, runner);
|
|
14
|
+
}
|
|
15
|
+
// Step 1: explicit clientId — resolve it, no bare-scan fallback
|
|
16
|
+
if (ctx.requestedClientId) {
|
|
17
|
+
const client = ctx.bridge.getClient(ctx.requestedClientId);
|
|
18
|
+
if (!client) {
|
|
19
|
+
const available = ctx.bridge
|
|
20
|
+
.listClients()
|
|
21
|
+
.map((c) => {
|
|
22
|
+
return c.id;
|
|
23
|
+
})
|
|
24
|
+
.join(', ') || '(none)';
|
|
25
|
+
return {
|
|
26
|
+
error: `Client '${ctx.requestedClientId}' not connected. Available: ${available}`,
|
|
27
|
+
ok: false,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
return (0, byClient_1.resolveClientToDevice)(client, runner);
|
|
31
|
+
}
|
|
32
|
+
// Step 2: exactly one connected client matching the platform filter → auto-pick
|
|
33
|
+
const clients = ctx.bridge.listClients();
|
|
34
|
+
const filtered = options.platform
|
|
35
|
+
? clients.filter((c) => {
|
|
36
|
+
return c.platform === options.platform;
|
|
37
|
+
})
|
|
38
|
+
: clients;
|
|
39
|
+
if (filtered.length === 1) {
|
|
40
|
+
return (0, byClient_1.resolveClientToDevice)(filtered[0], runner);
|
|
41
|
+
}
|
|
42
|
+
// Step 3: multiple matching clients → ambiguous, error
|
|
43
|
+
if (filtered.length > 1) {
|
|
44
|
+
const labels = filtered
|
|
45
|
+
.map((c) => {
|
|
46
|
+
return c.label ? `${c.id} (${c.label})` : c.id;
|
|
47
|
+
})
|
|
48
|
+
.join(', ');
|
|
49
|
+
return {
|
|
50
|
+
error: `Multiple clients connected: ${labels}. Specify clientId.`,
|
|
51
|
+
ok: false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Step 4: no clients matched — fall through to bare platform scan
|
|
55
|
+
return (0, scan_1.scanForDevice)(options.platform, runner);
|
|
56
|
+
};
|
|
57
|
+
exports.resolveDevice = resolveDevice;
|
|
58
|
+
var list_1 = require("./list");
|
|
59
|
+
Object.defineProperty(exports, "clearDeviceCache", { enumerable: true, get: function () { return list_1.clearDeviceCache; } });
|
|
60
|
+
Object.defineProperty(exports, "listAndroidDevices", { enumerable: true, get: function () { return list_1.listAndroidDevices; } });
|
|
61
|
+
Object.defineProperty(exports, "listIosRealDevices", { enumerable: true, get: function () { return list_1.listIosRealDevices; } });
|
|
62
|
+
Object.defineProperty(exports, "listIosSimulators", { enumerable: true, get: function () { return list_1.listIosSimulators; } });
|
|
63
|
+
var enrich_1 = require("./enrich");
|
|
64
|
+
Object.defineProperty(exports, "enrichDevicesWithClientStatus", { enumerable: true, get: function () { return enrich_1.enrichDevicesWithClientStatus; } });
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/index.ts"],"names":[],"mappings":";;;AAGA,yCAAmD;AACnD,iCAAkE;AAClE,iCAAuC;AAShC,MAAM,aAAa,GAAG,KAAK,EAChC,GAAgB,EAChB,OAAuB,EACvB,MAAqB,EACM,EAAE;IAC7B,kFAAkF;IAClF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,IAAA,uBAAgB,EAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,IAAA,6BAAsB,EAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,gEAAgE;IAChE,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,SAAS,GACb,GAAG,CAAC,MAAM;iBACP,WAAW,EAAE;iBACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,OAAO,CAAC,CAAC,EAAE,CAAC;YACd,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;YAC5B,OAAO;gBACL,KAAK,EAAE,WAAW,GAAG,CAAC,iBAAiB,+BAA+B,SAAS,EAAE;gBACjF,EAAE,EAAE,KAAK;aACV,CAAC;QACJ,CAAC;QACD,OAAO,IAAA,gCAAqB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,gFAAgF;IAChF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ;QAC/B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACnB,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC;QACzC,CAAC,CAAC;QACJ,CAAC,CAAC,OAAO,CAAC;IAEZ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAA,gCAAqB,EAAC,QAAQ,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,uDAAuD;IACvD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,QAAQ;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO;YACL,KAAK,EAAE,+BAA+B,MAAM,qBAAqB;YACjE,EAAE,EAAE,KAAK;SACV,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,OAAO,IAAA,oBAAa,EAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC,CAAC;AA3DW,QAAA,aAAa,iBA2DxB;AAEF,+BAKgB;AAJd,wGAAA,gBAAgB,OAAA;AAChB,0GAAA,kBAAkB,OAAA;AAClB,0GAAA,kBAAkB,OAAA;AAClB,yGAAA,iBAAiB,OAAA;AAEnB,mCAAyD;AAAhD,uHAAA,6BAA6B,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ProcessRunner } from '../../../server/host/processRunner';
|
|
2
|
+
import { type AndroidDevice, type DeviceResolution, type IosRealDevice, type IosSimulator } from './types';
|
|
3
|
+
export declare const clearDeviceCache: () => void;
|
|
4
|
+
export declare const XCRUN_MISSING_ERROR = "xcrun not found. iOS host tools require Xcode command line tools (macOS only).";
|
|
5
|
+
export declare const ADB_MISSING_ERROR = "adb not found. Android host tools require Android platform-tools on PATH.";
|
|
6
|
+
export declare const toDeviceError: (err: unknown, context: string, toolMissing: string) => DeviceResolution;
|
|
7
|
+
export declare const listIosSimulators: (runner: ProcessRunner) => Promise<IosSimulator[]>;
|
|
8
|
+
export declare const listIosRealDevices: (runner: ProcessRunner) => Promise<IosRealDevice[]>;
|
|
9
|
+
export declare const listAndroidDevices: (runner: ProcessRunner) => Promise<AndroidDevice[]>;
|
|
10
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/list.ts"],"names":[],"mappings":"AAMA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEvF,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,SAAS,CAAC;AAcjB,eAAO,MAAM,gBAAgB,QAAO,IAInC,CAAC;AAEF,eAAO,MAAM,mBAAmB,mFACkD,CAAC;AACnF,eAAO,MAAM,iBAAiB,8EAC+C,CAAC;AAK9E,eAAO,MAAM,aAAa,QACnB,OAAO,WACH,MAAM,eACF,MAAM,KAClB,gBAKF,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAkB,aAAa,KAAG,OAAO,CAAC,YAAY,EAAE,CAyBrF,CAAC;AAKF,eAAO,MAAM,kBAAkB,WAAkB,aAAa,KAAG,OAAO,CAAC,aAAa,EAAE,CA2CvF,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAAkB,aAAa,KAAG,OAAO,CAAC,aAAa,EAAE,CAwBvF,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listAndroidDevices = exports.listIosRealDevices = exports.listIosSimulators = exports.toDeviceError = exports.ADB_MISSING_ERROR = exports.XCRUN_MISSING_ERROR = exports.clearDeviceCache = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const promises_1 = require("node:fs/promises");
|
|
7
|
+
const node_os_1 = require("node:os");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const processRunner_1 = require("../../../server/host/processRunner");
|
|
10
|
+
const CACHE_TTL_MS = 5_000;
|
|
11
|
+
const LIST_TIMEOUT_MS = 5_000;
|
|
12
|
+
let iosCache = null;
|
|
13
|
+
let iosRealCache = null;
|
|
14
|
+
let androidCache = null;
|
|
15
|
+
const clearDeviceCache = () => {
|
|
16
|
+
iosCache = null;
|
|
17
|
+
iosRealCache = null;
|
|
18
|
+
androidCache = null;
|
|
19
|
+
};
|
|
20
|
+
exports.clearDeviceCache = clearDeviceCache;
|
|
21
|
+
exports.XCRUN_MISSING_ERROR = 'xcrun not found. iOS host tools require Xcode command line tools (macOS only).';
|
|
22
|
+
exports.ADB_MISSING_ERROR = 'adb not found. Android host tools require Android platform-tools on PATH.';
|
|
23
|
+
// Map a thrown error to a user-facing DeviceResolution error. Handles the
|
|
24
|
+
// common ProcessNotFoundError → "install the toolchain" message; everything
|
|
25
|
+
// else gets wrapped as a context-prefixed message.
|
|
26
|
+
const toDeviceError = (err, context, toolMissing) => {
|
|
27
|
+
if (err instanceof processRunner_1.ProcessNotFoundError) {
|
|
28
|
+
return { error: toolMissing, ok: false };
|
|
29
|
+
}
|
|
30
|
+
return { error: `${context}: ${err.message}`, ok: false };
|
|
31
|
+
};
|
|
32
|
+
exports.toDeviceError = toDeviceError;
|
|
33
|
+
const listIosSimulators = async (runner) => {
|
|
34
|
+
if (iosCache && Date.now() - iosCache.timestamp < CACHE_TTL_MS) {
|
|
35
|
+
return iosCache.result;
|
|
36
|
+
}
|
|
37
|
+
const proc = await runner('xcrun', ['simctl', 'list', 'devices', '--json'], {
|
|
38
|
+
timeoutMs: LIST_TIMEOUT_MS,
|
|
39
|
+
});
|
|
40
|
+
if (proc.exitCode !== 0) {
|
|
41
|
+
throw new Error(`xcrun simctl list failed (exit ${proc.exitCode}): ${proc.stderr.toString('utf8').trim().slice(0, 500)}`);
|
|
42
|
+
}
|
|
43
|
+
const parsed = JSON.parse(proc.stdout.toString('utf8'));
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const runtime of Object.values(parsed.devices ?? {})) {
|
|
46
|
+
for (const d of runtime) {
|
|
47
|
+
if (typeof d.udid === 'string' && typeof d.name === 'string' && typeof d.state === 'string') {
|
|
48
|
+
out.push({ name: d.name, state: d.state, udid: d.udid });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
iosCache = { result: out, timestamp: Date.now() };
|
|
53
|
+
return out;
|
|
54
|
+
};
|
|
55
|
+
exports.listIosSimulators = listIosSimulators;
|
|
56
|
+
// Paired physical iOS devices come from `xcrun devicectl` — simctl knows
|
|
57
|
+
// nothing about them. The JSON output of `list devices` is the only stable
|
|
58
|
+
// integration surface (its stdout has a human-readable header first).
|
|
59
|
+
const listIosRealDevices = async (runner) => {
|
|
60
|
+
if (iosRealCache && Date.now() - iosRealCache.timestamp < CACHE_TTL_MS) {
|
|
61
|
+
return iosRealCache.result;
|
|
62
|
+
}
|
|
63
|
+
const tmpPath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `rnmcp-devicectl-${(0, node_crypto_1.randomUUID)()}.json`);
|
|
64
|
+
try {
|
|
65
|
+
const proc = await runner('xcrun', ['devicectl', 'list', 'devices', '--json-output', tmpPath], {
|
|
66
|
+
timeoutMs: LIST_TIMEOUT_MS,
|
|
67
|
+
});
|
|
68
|
+
if (proc.exitCode !== 0) {
|
|
69
|
+
throw new Error(`xcrun devicectl list failed (exit ${proc.exitCode}): ${proc.stderr.toString('utf8').trim().slice(0, 500)}`);
|
|
70
|
+
}
|
|
71
|
+
const raw = (0, node_fs_1.readFileSync)(tmpPath, 'utf8');
|
|
72
|
+
const parsed = JSON.parse(raw);
|
|
73
|
+
const devices = parsed.result?.devices ?? [];
|
|
74
|
+
const out = [];
|
|
75
|
+
for (const d of devices) {
|
|
76
|
+
if (d.hardwareProperties?.platform !== 'iOS')
|
|
77
|
+
continue;
|
|
78
|
+
const id = d.identifier;
|
|
79
|
+
const name = d.deviceProperties?.name;
|
|
80
|
+
const pairingState = d.connectionProperties?.pairingState;
|
|
81
|
+
if (typeof id === 'string' && typeof name === 'string' && typeof pairingState === 'string') {
|
|
82
|
+
out.push({ coreDeviceIdentifier: id, name, pairingState });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
iosRealCache = { result: out, timestamp: Date.now() };
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
(0, promises_1.rm)(tmpPath, { force: true }).catch(() => {
|
|
90
|
+
// best-effort
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
exports.listIosRealDevices = listIosRealDevices;
|
|
95
|
+
const listAndroidDevices = async (runner) => {
|
|
96
|
+
if (androidCache && Date.now() - androidCache.timestamp < CACHE_TTL_MS) {
|
|
97
|
+
return androidCache.result;
|
|
98
|
+
}
|
|
99
|
+
const proc = await runner('adb', ['devices'], { timeoutMs: LIST_TIMEOUT_MS });
|
|
100
|
+
if (proc.exitCode !== 0) {
|
|
101
|
+
throw new Error(`adb devices failed (exit ${proc.exitCode}): ${proc.stderr.toString('utf8').trim().slice(0, 500)}`);
|
|
102
|
+
}
|
|
103
|
+
const lines = proc.stdout.toString('utf8').split('\n');
|
|
104
|
+
const out = [];
|
|
105
|
+
for (const raw of lines.slice(1)) {
|
|
106
|
+
const line = raw.trim();
|
|
107
|
+
if (!line) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const match = line.match(/^(\S+)\s+(\S+)\s*$/);
|
|
111
|
+
if (match?.[1] && match[2]) {
|
|
112
|
+
out.push({ serial: match[1], state: match[2] });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
androidCache = { result: out, timestamp: Date.now() };
|
|
116
|
+
return out;
|
|
117
|
+
};
|
|
118
|
+
exports.listAndroidDevices = listAndroidDevices;
|
|
119
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ProcessRunner } from '../../../server/host/processRunner';
|
|
2
|
+
import { type DeviceResolution } from './types';
|
|
3
|
+
export declare const scanForDevice: (platform: "android" | "ios" | undefined, runner: ProcessRunner) => Promise<DeviceResolution>;
|
|
4
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AASjE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA+EhD,eAAO,MAAM,aAAa,aACd,SAAS,GAAG,KAAK,GAAG,SAAS,UAC/B,aAAa,KACpB,OAAO,CAAC,gBAAgB,CAmB1B,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scanForDevice = void 0;
|
|
4
|
+
const list_1 = require("./list");
|
|
5
|
+
const scanIosDevices = async (runner) => {
|
|
6
|
+
try {
|
|
7
|
+
const sims = await (0, list_1.listIosSimulators)(runner);
|
|
8
|
+
const booted = sims.filter((s) => {
|
|
9
|
+
return s.state === 'Booted';
|
|
10
|
+
});
|
|
11
|
+
if (booted.length === 0) {
|
|
12
|
+
return {
|
|
13
|
+
error: 'No booted iOS simulator found. Boot one via Simulator.app or `xcrun simctl boot <udid>`.',
|
|
14
|
+
ok: false,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (booted.length === 1) {
|
|
18
|
+
const only = booted[0];
|
|
19
|
+
return {
|
|
20
|
+
device: {
|
|
21
|
+
displayName: only.name,
|
|
22
|
+
kind: 'simulator',
|
|
23
|
+
nativeId: only.udid,
|
|
24
|
+
platform: 'ios',
|
|
25
|
+
},
|
|
26
|
+
ok: true,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const list = booted
|
|
30
|
+
.map((s) => {
|
|
31
|
+
return `${s.name} (${s.udid})`;
|
|
32
|
+
})
|
|
33
|
+
.join(', ');
|
|
34
|
+
return {
|
|
35
|
+
error: `Multiple iOS simulators booted: ${list}. Specify clientId or a more precise target.`,
|
|
36
|
+
ok: false,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return (0, list_1.toDeviceError)(err, 'Failed to list iOS simulators', list_1.XCRUN_MISSING_ERROR);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const scanAndroidDevices = async (runner) => {
|
|
44
|
+
try {
|
|
45
|
+
const devices = await (0, list_1.listAndroidDevices)(runner);
|
|
46
|
+
const online = devices.filter((d) => {
|
|
47
|
+
return d.state === 'device';
|
|
48
|
+
});
|
|
49
|
+
if (online.length === 0) {
|
|
50
|
+
return {
|
|
51
|
+
error: 'No online Android device found. Start an emulator or connect a device.',
|
|
52
|
+
ok: false,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (online.length === 1) {
|
|
56
|
+
const only = online[0];
|
|
57
|
+
return {
|
|
58
|
+
device: {
|
|
59
|
+
displayName: only.serial,
|
|
60
|
+
kind: 'real-device',
|
|
61
|
+
nativeId: only.serial,
|
|
62
|
+
platform: 'android',
|
|
63
|
+
},
|
|
64
|
+
ok: true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const list = online
|
|
68
|
+
.map((d) => {
|
|
69
|
+
return d.serial;
|
|
70
|
+
})
|
|
71
|
+
.join(', ');
|
|
72
|
+
return {
|
|
73
|
+
error: `Multiple Android devices online: ${list}. Specify clientId.`,
|
|
74
|
+
ok: false,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return (0, list_1.toDeviceError)(err, 'Failed to list Android devices', list_1.ADB_MISSING_ERROR);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const scanForDevice = async (platform, runner) => {
|
|
82
|
+
if (platform === 'ios') {
|
|
83
|
+
return scanIosDevices(runner);
|
|
84
|
+
}
|
|
85
|
+
if (platform === 'android') {
|
|
86
|
+
return scanAndroidDevices(runner);
|
|
87
|
+
}
|
|
88
|
+
const iosResult = await scanIosDevices(runner);
|
|
89
|
+
if (iosResult.ok) {
|
|
90
|
+
return iosResult;
|
|
91
|
+
}
|
|
92
|
+
const androidResult = await scanAndroidDevices(runner);
|
|
93
|
+
if (androidResult.ok) {
|
|
94
|
+
return androidResult;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
error: `No device available. iOS: ${iosResult.error} Android: ${androidResult.error}`,
|
|
98
|
+
ok: false,
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
exports.scanForDevice = scanForDevice;
|
|
102
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import { type Bridge } from '../../server/bridge';
|
|
2
|
-
import { type ProcessRunner } from './processRunner';
|
|
3
|
-
import { type HostContext } from './types';
|
|
4
1
|
export interface IosSimulator {
|
|
5
2
|
name: string;
|
|
6
3
|
state: string;
|
|
@@ -46,16 +43,4 @@ export type DeviceResolution = {
|
|
|
46
43
|
error: string;
|
|
47
44
|
ok: false;
|
|
48
45
|
};
|
|
49
|
-
|
|
50
|
-
platform?: 'android' | 'ios';
|
|
51
|
-
serial?: string;
|
|
52
|
-
udid?: string;
|
|
53
|
-
}
|
|
54
|
-
export declare const clearDeviceCache: () => void;
|
|
55
|
-
export declare const listIosSimulators: (runner: ProcessRunner) => Promise<IosSimulator[]>;
|
|
56
|
-
export declare const listIosRealDevices: (runner: ProcessRunner) => Promise<IosRealDevice[]>;
|
|
57
|
-
export declare const listAndroidDevices: (runner: ProcessRunner) => Promise<AndroidDevice[]>;
|
|
58
|
-
export declare const resolveDevice: (ctx: HostContext, options: ResolveOptions, runner: ProcessRunner) => Promise<DeviceResolution>;
|
|
59
|
-
export declare const enrichDevicesWithClientStatus: (bridge: Bridge, runner: ProcessRunner) => Promise<EnrichedDeviceList>;
|
|
60
|
-
export {};
|
|
61
|
-
//# sourceMappingURL=deviceResolver.d.ts.map
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,WAAW,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,GAAG,KAAK,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,qBAAqB,EAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,GAAG,EAAE,cAAc,EAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/types.ts"],"names":[],"mappings":""}
|
|
@@ -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"}
|