react-native-mcp-kit 1.0.1 → 2.0.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 +220 -720
- package/dist/babel/stripPlugin.d.ts.map +1 -1
- package/dist/babel/stripPlugin.js +40 -3
- package/dist/babel/stripPlugin.js.map +1 -1
- package/dist/bin/ios-hid +0 -0
- package/dist/client/contexts/McpContext/McpProvider.d.ts +1 -1
- package/dist/client/contexts/McpContext/McpProvider.d.ts.map +1 -1
- package/dist/client/contexts/McpContext/McpProvider.js +67 -4
- package/dist/client/contexts/McpContext/McpProvider.js.map +1 -1
- package/dist/client/contexts/McpContext/types.d.ts +11 -1
- package/dist/client/contexts/McpContext/types.d.ts.map +1 -1
- package/dist/client/core/McpClient.d.ts +7 -0
- package/dist/client/core/McpClient.d.ts.map +1 -1
- package/dist/client/core/McpClient.js +73 -2
- package/dist/client/core/McpClient.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/modules/device/device.d.ts.map +1 -1
- package/dist/modules/device/device.js +16 -4
- package/dist/modules/device/device.js.map +1 -1
- package/dist/modules/fiberTree/fiberTree.d.ts.map +1 -1
- package/dist/modules/fiberTree/fiberTree.js +61 -15
- package/dist/modules/fiberTree/fiberTree.js.map +1 -1
- package/dist/modules/fiberTree/types.d.ts +9 -0
- package/dist/modules/fiberTree/types.d.ts.map +1 -1
- package/dist/modules/fiberTree/utils.d.ts +2 -1
- package/dist/modules/fiberTree/utils.d.ts.map +1 -1
- package/dist/modules/fiberTree/utils.js +57 -1
- package/dist/modules/fiberTree/utils.js.map +1 -1
- package/dist/modules/index.d.ts +0 -1
- package/dist/modules/index.d.ts.map +1 -1
- package/dist/modules/index.js +1 -3
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/navigation/navigation.d.ts.map +1 -1
- package/dist/modules/navigation/navigation.js +32 -40
- package/dist/modules/navigation/navigation.js.map +1 -1
- package/dist/modules/navigation/types.d.ts +2 -1
- package/dist/modules/navigation/types.d.ts.map +1 -1
- package/dist/server/bridge.d.ts +38 -12
- package/dist/server/bridge.d.ts.map +1 -1
- package/dist/server/bridge.js +136 -56
- package/dist/server/bridge.js.map +1 -1
- package/dist/server/cli.js +10 -1
- package/dist/server/cli.js.map +1 -1
- package/dist/server/host/deviceResolver.d.ts +53 -0
- package/dist/server/host/deviceResolver.d.ts.map +1 -0
- package/dist/server/host/deviceResolver.js +555 -0
- package/dist/server/host/deviceResolver.js.map +1 -0
- package/dist/server/host/helpers.d.ts +33 -0
- package/dist/server/host/helpers.d.ts.map +1 -0
- package/dist/server/host/helpers.js +42 -0
- package/dist/server/host/helpers.js.map +1 -0
- package/dist/server/host/hostModule.d.ts +4 -0
- package/dist/server/host/hostModule.d.ts.map +1 -0
- package/dist/server/host/hostModule.js +26 -0
- package/dist/server/host/hostModule.js.map +1 -0
- package/dist/server/host/index.d.ts +4 -0
- package/dist/server/host/index.d.ts.map +1 -0
- package/dist/server/host/index.js +8 -0
- package/dist/server/host/index.js.map +1 -0
- package/dist/server/host/iosInput.d.ts +15 -0
- package/dist/server/host/iosInput.d.ts.map +1 -0
- package/dist/server/host/iosInput.js +93 -0
- package/dist/server/host/iosInput.js.map +1 -0
- package/dist/server/host/modules/screenshot.d.ts +4 -0
- package/dist/server/host/modules/screenshot.d.ts.map +1 -0
- package/dist/server/host/modules/screenshot.js +615 -0
- package/dist/server/host/modules/screenshot.js.map +1 -0
- package/dist/server/host/processRunner.d.ts +19 -0
- package/dist/server/host/processRunner.d.ts.map +1 -0
- package/dist/server/host/processRunner.js +58 -0
- package/dist/server/host/processRunner.js.map +1 -0
- package/dist/server/host/tools/capture.d.ts +6 -0
- package/dist/server/host/tools/capture.d.ts.map +1 -0
- package/dist/server/host/tools/capture.js +148 -0
- package/dist/server/host/tools/capture.js.map +1 -0
- package/dist/server/host/tools/devices.d.ts +4 -0
- package/dist/server/host/tools/devices.d.ts.map +1 -0
- package/dist/server/host/tools/devices.js +17 -0
- package/dist/server/host/tools/devices.js.map +1 -0
- package/dist/server/host/tools/input.d.ts +7 -0
- package/dist/server/host/tools/input.d.ts.map +1 -0
- package/dist/server/host/tools/input.js +286 -0
- package/dist/server/host/tools/input.js.map +1 -0
- package/dist/server/host/tools/lifecycle.d.ts +6 -0
- package/dist/server/host/tools/lifecycle.d.ts.map +1 -0
- package/dist/server/host/tools/lifecycle.js +271 -0
- package/dist/server/host/tools/lifecycle.js.map +1 -0
- package/dist/server/host/types.d.ts +17 -0
- package/dist/server/host/types.d.ts.map +1 -0
- package/dist/{modules/components → server/host}/types.js.map +1 -1
- package/dist/server/host/wda.d.ts +15 -0
- package/dist/server/host/wda.d.ts.map +1 -0
- package/dist/server/host/wda.js +100 -0
- package/dist/server/host/wda.js.map +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +10 -17
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcpServer.d.ts +5 -10
- package/dist/server/mcpServer.d.ts.map +1 -1
- package/dist/server/mcpServer.js +438 -153
- package/dist/server/mcpServer.js.map +1 -1
- package/dist/server/types.d.ts +2 -8
- package/dist/server/types.d.ts.map +1 -1
- package/dist/shared/protocol.d.ts +6 -0
- package/dist/shared/protocol.d.ts.map +1 -1
- package/package.json +6 -12
- package/dist/client/contexts/McpTreeContext/McpTracker.d.ts +0 -10
- package/dist/client/contexts/McpTreeContext/McpTracker.d.ts.map +0 -1
- package/dist/client/contexts/McpTreeContext/McpTracker.js +0 -101
- package/dist/client/contexts/McpTreeContext/McpTracker.js.map +0 -1
- package/dist/client/contexts/McpTreeContext/McpTreeContext.d.ts +0 -2
- package/dist/client/contexts/McpTreeContext/McpTreeContext.d.ts.map +0 -1
- package/dist/client/contexts/McpTreeContext/McpTreeContext.js +0 -6
- package/dist/client/contexts/McpTreeContext/McpTreeContext.js.map +0 -1
- package/dist/client/contexts/McpTreeContext/McpTreeRegistry.d.ts +0 -16
- package/dist/client/contexts/McpTreeContext/McpTreeRegistry.d.ts.map +0 -1
- package/dist/client/contexts/McpTreeContext/McpTreeRegistry.js +0 -96
- package/dist/client/contexts/McpTreeContext/McpTreeRegistry.js.map +0 -1
- package/dist/client/contexts/McpTreeContext/index.d.ts +0 -5
- package/dist/client/contexts/McpTreeContext/index.d.ts.map +0 -1
- package/dist/client/contexts/McpTreeContext/index.js +0 -10
- package/dist/client/contexts/McpTreeContext/index.js.map +0 -1
- package/dist/client/contexts/McpTreeContext/types.d.ts +0 -14
- package/dist/client/contexts/McpTreeContext/types.d.ts.map +0 -1
- package/dist/client/contexts/McpTreeContext/types.js.map +0 -1
- package/dist/modules/components/components.d.ts +0 -8
- package/dist/modules/components/components.d.ts.map +0 -1
- package/dist/modules/components/components.js +0 -315
- package/dist/modules/components/components.js.map +0 -1
- package/dist/modules/components/index.d.ts +0 -3
- package/dist/modules/components/index.d.ts.map +0 -1
- package/dist/modules/components/index.js +0 -6
- package/dist/modules/components/index.js.map +0 -1
- package/dist/modules/components/types.d.ts +0 -18
- package/dist/modules/components/types.d.ts.map +0 -1
- package/dist/modules/components/types.js +0 -3
- package/dist/modules/components/utils.d.ts +0 -18
- package/dist/modules/components/utils.d.ts.map +0 -1
- package/dist/modules/components/utils.js +0 -386
- package/dist/modules/components/utils.js.map +0 -1
- package/dist/modules/screenshot/index.d.ts +0 -3
- package/dist/modules/screenshot/index.d.ts.map +0 -1
- package/dist/modules/screenshot/index.js +0 -6
- package/dist/modules/screenshot/index.js.map +0 -1
- package/dist/modules/screenshot/screenshot.d.ts +0 -4
- package/dist/modules/screenshot/screenshot.d.ts.map +0 -1
- package/dist/modules/screenshot/screenshot.js +0 -89
- package/dist/modules/screenshot/screenshot.js.map +0 -1
- package/dist/modules/screenshot/types.d.ts +0 -5
- package/dist/modules/screenshot/types.d.ts.map +0 -1
- package/dist/modules/screenshot/types.js +0 -3
- package/dist/modules/screenshot/types.js.map +0 -1
- package/dist/modules/tree/index.d.ts +0 -2
- package/dist/modules/tree/index.d.ts.map +0 -1
- package/dist/modules/tree/index.js +0 -6
- package/dist/modules/tree/index.js.map +0 -1
- package/dist/modules/tree/tree.d.ts +0 -3
- package/dist/modules/tree/tree.d.ts.map +0 -1
- package/dist/modules/tree/tree.js +0 -274
- package/dist/modules/tree/tree.js.map +0 -1
- /package/dist/{client/contexts/McpTreeContext → server/host}/types.js +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ProcessResult {
|
|
2
|
+
exitCode: number | null;
|
|
3
|
+
signal: NodeJS.Signals | null;
|
|
4
|
+
stderr: Buffer;
|
|
5
|
+
stdout: Buffer;
|
|
6
|
+
timedOut: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface RunProcessOptions {
|
|
9
|
+
env?: Record<string, string>;
|
|
10
|
+
killSignal?: NodeJS.Signals;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class ProcessNotFoundError extends Error {
|
|
14
|
+
readonly command: string;
|
|
15
|
+
constructor(command: string);
|
|
16
|
+
}
|
|
17
|
+
export type ProcessRunner = (command: string, args: readonly string[], options?: RunProcessOptions) => Promise<ProcessResult>;
|
|
18
|
+
export declare const runProcess: ProcessRunner;
|
|
19
|
+
//# sourceMappingURL=processRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processRunner.d.ts","sourceRoot":"","sources":["../../../src/server/host/processRunner.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aACjB,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;CAI5C;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,iBAAiB,KACxB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,eAAO,MAAM,UAAU,EAAE,aA8CxB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runProcess = exports.ProcessNotFoundError = void 0;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
6
|
+
class ProcessNotFoundError extends Error {
|
|
7
|
+
command;
|
|
8
|
+
constructor(command) {
|
|
9
|
+
super(`Command not found: ${command}`);
|
|
10
|
+
this.command = command;
|
|
11
|
+
this.name = 'ProcessNotFoundError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.ProcessNotFoundError = ProcessNotFoundError;
|
|
15
|
+
const runProcess = (command, args, options = {}) => {
|
|
16
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
17
|
+
const killSignal = options.killSignal ?? 'SIGKILL';
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const child = (0, node_child_process_1.spawn)(command, [...args], {
|
|
20
|
+
env: options.env ? { ...process.env, ...options.env } : process.env,
|
|
21
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
22
|
+
});
|
|
23
|
+
const stdoutChunks = [];
|
|
24
|
+
const stderrChunks = [];
|
|
25
|
+
let timedOut = false;
|
|
26
|
+
const timer = setTimeout(() => {
|
|
27
|
+
timedOut = true;
|
|
28
|
+
child.kill(killSignal);
|
|
29
|
+
}, timeoutMs);
|
|
30
|
+
child.stdout?.on('data', (chunk) => {
|
|
31
|
+
stdoutChunks.push(chunk);
|
|
32
|
+
});
|
|
33
|
+
child.stderr?.on('data', (chunk) => {
|
|
34
|
+
stderrChunks.push(chunk);
|
|
35
|
+
});
|
|
36
|
+
child.on('error', (err) => {
|
|
37
|
+
clearTimeout(timer);
|
|
38
|
+
if (err.code === 'ENOENT') {
|
|
39
|
+
reject(new ProcessNotFoundError(command));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
reject(err);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
child.on('close', (exitCode, signal) => {
|
|
46
|
+
clearTimeout(timer);
|
|
47
|
+
resolve({
|
|
48
|
+
exitCode,
|
|
49
|
+
signal,
|
|
50
|
+
stderr: Buffer.concat(stderrChunks),
|
|
51
|
+
stdout: Buffer.concat(stdoutChunks),
|
|
52
|
+
timedOut,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
exports.runProcess = runProcess;
|
|
58
|
+
//# sourceMappingURL=processRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processRunner.js","sourceRoot":"","sources":["../../../src/server/host/processRunner.ts"],"names":[],"mappings":";;;AAAA,2DAA2C;AAE3C,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAgBlC,MAAa,oBAAqB,SAAQ,KAAK;IACjB;IAA5B,YAA4B,OAAe;QACzC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QADb,YAAO,GAAP,OAAO,CAAQ;QAEzC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AALD,oDAKC;AAQM,MAAM,UAAU,GAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;IACvE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,SAAS,CAAC;IAEnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;YACnE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAC/C,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;YACrC,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC;gBACN,QAAQ;gBACR,MAAM;gBACN,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBACnC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBACnC,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AA9CW,QAAA,UAAU,cA8CrB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ProcessRunner } from '../../../server/host/processRunner';
|
|
2
|
+
import { type HostToolHandler } from '../../../server/host/types';
|
|
3
|
+
declare const SCREENSHOT_TIMEOUT_MS = 15000;
|
|
4
|
+
export declare const screenshotTool: (runner: ProcessRunner) => HostToolHandler;
|
|
5
|
+
export { SCREENSHOT_TIMEOUT_MS };
|
|
6
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../../src/server/host/tools/capture.ts"],"names":[],"mappings":"AASA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,QAAA,MAAM,qBAAqB,QAAS,CAAC;AAqIrC,eAAO,MAAM,cAAc,WAAY,aAAa,KAAG,eAwBtD,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SCREENSHOT_TIMEOUT_MS = exports.screenshotTool = void 0;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const promises_1 = require("node:fs/promises");
|
|
9
|
+
const node_os_1 = require("node:os");
|
|
10
|
+
const node_path_1 = require("node:path");
|
|
11
|
+
const sharp_1 = __importDefault(require("sharp"));
|
|
12
|
+
const deviceResolver_1 = require("../../../server/host/deviceResolver");
|
|
13
|
+
const helpers_1 = require("../../../server/host/helpers");
|
|
14
|
+
const processRunner_1 = require("../../../server/host/processRunner");
|
|
15
|
+
const SCREENSHOT_TIMEOUT_MS = 15_000;
|
|
16
|
+
exports.SCREENSHOT_TIMEOUT_MS = SCREENSHOT_TIMEOUT_MS;
|
|
17
|
+
const SCREENSHOT_DEFAULT_WIDTH = 370;
|
|
18
|
+
const SCREENSHOT_MIN_WIDTH = 64;
|
|
19
|
+
const SCREENSHOT_MAX_WIDTH = 1568;
|
|
20
|
+
const WEBP_QUALITY = 80;
|
|
21
|
+
const clampWidth = (value) => {
|
|
22
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
23
|
+
return SCREENSHOT_DEFAULT_WIDTH;
|
|
24
|
+
}
|
|
25
|
+
return Math.max(SCREENSHOT_MIN_WIDTH, Math.min(SCREENSHOT_MAX_WIDTH, Math.floor(value)));
|
|
26
|
+
};
|
|
27
|
+
const resizeScreenshot = async (input, targetWidth) => {
|
|
28
|
+
return (0, sharp_1.default)(input)
|
|
29
|
+
.resize({ width: targetWidth, withoutEnlargement: true })
|
|
30
|
+
.webp({ quality: WEBP_QUALITY })
|
|
31
|
+
.toBuffer();
|
|
32
|
+
};
|
|
33
|
+
const hashBuffer = (buf) => {
|
|
34
|
+
return (0, node_crypto_1.createHash)('sha256').update(buf).digest('hex');
|
|
35
|
+
};
|
|
36
|
+
// Per-device cache for screenshot diff
|
|
37
|
+
const lastScreenshotHash = new Map();
|
|
38
|
+
const captureIos = async (udid, runner, width) => {
|
|
39
|
+
const tmpPath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `rnmcp-ios-${(0, node_crypto_1.randomUUID)()}.png`);
|
|
40
|
+
try {
|
|
41
|
+
const proc = await runner('xcrun', ['simctl', 'io', udid, 'screenshot', tmpPath], {
|
|
42
|
+
timeoutMs: SCREENSHOT_TIMEOUT_MS,
|
|
43
|
+
});
|
|
44
|
+
if (proc.timedOut) {
|
|
45
|
+
return { error: `iOS screenshot timed out after ${SCREENSHOT_TIMEOUT_MS}ms` };
|
|
46
|
+
}
|
|
47
|
+
if (proc.exitCode !== 0) {
|
|
48
|
+
return {
|
|
49
|
+
error: `xcrun simctl io screenshot failed (exit ${proc.exitCode}): ${proc.stderr.toString('utf8').trim().slice(0, 500)}`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const raw = await (0, promises_1.readFile)(tmpPath);
|
|
53
|
+
const resized = await resizeScreenshot(raw, width);
|
|
54
|
+
const hash = hashBuffer(resized);
|
|
55
|
+
if (lastScreenshotHash.get(udid) === hash) {
|
|
56
|
+
return { message: 'Screenshot unchanged since last capture.', unchanged: true };
|
|
57
|
+
}
|
|
58
|
+
lastScreenshotHash.set(udid, hash);
|
|
59
|
+
return [
|
|
60
|
+
{
|
|
61
|
+
data: resized.toString('base64'),
|
|
62
|
+
mimeType: 'image/webp',
|
|
63
|
+
type: 'image',
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (err instanceof processRunner_1.ProcessNotFoundError) {
|
|
69
|
+
return {
|
|
70
|
+
error: 'xcrun not found. iOS screenshots require Xcode command line tools.',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return { error: `Failed to capture iOS screenshot: ${err.message}` };
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
(0, promises_1.rm)(tmpPath, { force: true }).catch(() => {
|
|
77
|
+
// best-effort cleanup
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const captureAndroid = async (serial, runner, width) => {
|
|
82
|
+
try {
|
|
83
|
+
const proc = await runner('adb', ['-s', serial, 'exec-out', 'screencap', '-p'], {
|
|
84
|
+
timeoutMs: SCREENSHOT_TIMEOUT_MS,
|
|
85
|
+
});
|
|
86
|
+
if (proc.timedOut) {
|
|
87
|
+
return { error: `Android screenshot timed out after ${SCREENSHOT_TIMEOUT_MS}ms` };
|
|
88
|
+
}
|
|
89
|
+
if (proc.exitCode !== 0) {
|
|
90
|
+
return {
|
|
91
|
+
error: `adb screencap failed (exit ${proc.exitCode}): ${proc.stderr.toString('utf8').trim().slice(0, 500)}`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (proc.stdout.length === 0) {
|
|
95
|
+
return { error: 'adb screencap returned empty output' };
|
|
96
|
+
}
|
|
97
|
+
const resized = await resizeScreenshot(proc.stdout, width);
|
|
98
|
+
const hash = hashBuffer(resized);
|
|
99
|
+
if (lastScreenshotHash.get(serial) === hash) {
|
|
100
|
+
return { message: 'Screenshot unchanged since last capture.', unchanged: true };
|
|
101
|
+
}
|
|
102
|
+
lastScreenshotHash.set(serial, hash);
|
|
103
|
+
return [
|
|
104
|
+
{
|
|
105
|
+
data: resized.toString('base64'),
|
|
106
|
+
mimeType: 'image/webp',
|
|
107
|
+
type: 'image',
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
if (err instanceof processRunner_1.ProcessNotFoundError) {
|
|
113
|
+
return {
|
|
114
|
+
error: 'adb not found. Android screenshots require Android platform-tools on PATH.',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
error: `Failed to capture Android screenshot: ${err.message}`,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const screenshotTool = (runner) => {
|
|
123
|
+
return {
|
|
124
|
+
description: `Capture a WebP screenshot from an iOS simulator or Android device, resized to save vision tokens. Default width ${SCREENSHOT_DEFAULT_WIDTH}px (pass \`width\` to override, max ${SCREENSHOT_MAX_WIDTH}). Returns "unchanged: true" if the screen hasn't changed since the last capture (saves tokens on redundant checks). For tap targeting prefer fiber_tree__find_all bounds — screenshots are only needed for visual verification or when targeting non-React surfaces.`,
|
|
125
|
+
handler: async (args, ctx) => {
|
|
126
|
+
const resolved = await (0, deviceResolver_1.resolveDevice)(ctx, (0, helpers_1.parseResolveOptions)(args), runner);
|
|
127
|
+
if (!resolved.ok) {
|
|
128
|
+
return { error: resolved.error };
|
|
129
|
+
}
|
|
130
|
+
const width = clampWidth(args.width);
|
|
131
|
+
if (resolved.device.platform === 'ios') {
|
|
132
|
+
return captureIos(resolved.device.nativeId, runner, width);
|
|
133
|
+
}
|
|
134
|
+
return captureAndroid(resolved.device.nativeId, runner, width);
|
|
135
|
+
},
|
|
136
|
+
inputSchema: {
|
|
137
|
+
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|
|
138
|
+
width: {
|
|
139
|
+
description: `Output width in pixels. Aspect ratio preserved, height auto-computed. Default ${SCREENSHOT_DEFAULT_WIDTH}. Capped to ${SCREENSHOT_MIN_WIDTH}..${SCREENSHOT_MAX_WIDTH}. Use higher values when you need to read small text; default is enough for visual verification.`,
|
|
140
|
+
type: 'number',
|
|
141
|
+
},
|
|
142
|
+
...helpers_1.NATIVE_ID_SCHEMA,
|
|
143
|
+
},
|
|
144
|
+
timeout: SCREENSHOT_TIMEOUT_MS,
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
exports.screenshotTool = screenshotTool;
|
|
148
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../src/server/host/tools/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../../../src/server/host/tools/devices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAI3D,eAAO,MAAM,eAAe,WAAY,aAAa,KAAG,eAUvD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listDevicesTool = void 0;
|
|
4
|
+
const deviceResolver_1 = require("../../../server/host/deviceResolver");
|
|
5
|
+
const capture_1 = require("./capture");
|
|
6
|
+
const listDevicesTool = (runner) => {
|
|
7
|
+
return {
|
|
8
|
+
description: 'List all iOS simulators (booted or not) and Android devices (online or offline) visible via xcrun simctl / adb. Each device is annotated with connected=true and a clientId when it matches a currently-connected React Native client. Connected devices appear first in each platform group.',
|
|
9
|
+
handler: async (_args, ctx) => {
|
|
10
|
+
return (0, deviceResolver_1.enrichDevicesWithClientStatus)(ctx.bridge, runner);
|
|
11
|
+
},
|
|
12
|
+
inputSchema: {},
|
|
13
|
+
timeout: capture_1.SCREENSHOT_TIMEOUT_MS,
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
exports.listDevicesTool = listDevicesTool;
|
|
17
|
+
//# sourceMappingURL=devices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../../../src/server/host/tools/devices.ts"],"names":[],"mappings":";;;AAAA,iEAA6E;AAI7E,uCAAkD;AAE3C,MAAM,eAAe,GAAG,CAAC,MAAqB,EAAmB,EAAE;IACxE,OAAO;QACL,WAAW,EACT,+RAA+R;QACjS,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5B,OAAO,IAAA,8CAA6B,EAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QACD,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,+BAAqB;KAC/B,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,eAAe,mBAU1B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ProcessRunner } from '../../../server/host/processRunner';
|
|
2
|
+
import { type HostToolHandler } from '../../../server/host/types';
|
|
3
|
+
export declare const tapTool: (runner: ProcessRunner) => HostToolHandler;
|
|
4
|
+
export declare const swipeTool: (runner: ProcessRunner) => HostToolHandler;
|
|
5
|
+
export declare const typeTextTool: (runner: ProcessRunner) => HostToolHandler;
|
|
6
|
+
export declare const pressKeyTool: (runner: ProcessRunner) => HostToolHandler;
|
|
7
|
+
//# sourceMappingURL=input.d.ts.map
|
|
@@ -0,0 +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;AAwJ3D,eAAO,MAAM,OAAO,WAAY,aAAa,KAAG,eAoC/C,CAAC;AAEF,eAAO,MAAM,SAAS,WAAY,aAAa,KAAG,eA2EjD,CAAC;AAEF,eAAO,MAAM,YAAY,WAAY,aAAa,KAAG,eA2CpD,CAAC;AAEF,eAAO,MAAM,YAAY,WAAY,aAAa,KAAG,eAgCpD,CAAC"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pressKeyTool = exports.typeTextTool = exports.swipeTool = exports.tapTool = void 0;
|
|
4
|
+
const deviceResolver_1 = require("../../../server/host/deviceResolver");
|
|
5
|
+
const helpers_1 = require("../../../server/host/helpers");
|
|
6
|
+
const iosInput_1 = require("../../../server/host/iosInput");
|
|
7
|
+
const processRunner_1 = require("../../../server/host/processRunner");
|
|
8
|
+
const INPUT_TIMEOUT_MS = 5_000;
|
|
9
|
+
const SWIPE_DURATION_DEFAULT_MS = 300;
|
|
10
|
+
const SWIPE_DURATION_MIN_MS = 50;
|
|
11
|
+
const SWIPE_DURATION_MAX_MS = 5_000;
|
|
12
|
+
const ANDROID_KEYCODES = {
|
|
13
|
+
back: 'KEYCODE_BACK',
|
|
14
|
+
backspace: 'KEYCODE_DEL',
|
|
15
|
+
enter: 'KEYCODE_ENTER',
|
|
16
|
+
escape: 'KEYCODE_ESCAPE',
|
|
17
|
+
home: 'KEYCODE_HOME',
|
|
18
|
+
menu: 'KEYCODE_MENU',
|
|
19
|
+
power: 'KEYCODE_POWER',
|
|
20
|
+
space: 'KEYCODE_SPACE',
|
|
21
|
+
tab: 'KEYCODE_TAB',
|
|
22
|
+
volume_down: 'KEYCODE_VOLUME_DOWN',
|
|
23
|
+
volume_up: 'KEYCODE_VOLUME_UP',
|
|
24
|
+
};
|
|
25
|
+
const KEY_NAMES = Object.keys(ANDROID_KEYCODES).sort();
|
|
26
|
+
const escapeAdbInputText = (text) => {
|
|
27
|
+
const spaced = text.replace(/\s/g, '%s');
|
|
28
|
+
return spaced.replace(/([\\'"`$&|;<>()[\]{}*?!#~])/g, '\\$1');
|
|
29
|
+
};
|
|
30
|
+
const clampSwipeDuration = (value) => {
|
|
31
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
|
|
32
|
+
return SWIPE_DURATION_DEFAULT_MS;
|
|
33
|
+
}
|
|
34
|
+
return Math.max(SWIPE_DURATION_MIN_MS, Math.min(SWIPE_DURATION_MAX_MS, Math.floor(value)));
|
|
35
|
+
};
|
|
36
|
+
const runAdbInput = async (serial, args, runner, action) => {
|
|
37
|
+
try {
|
|
38
|
+
const proc = await runner('adb', ['-s', serial, 'shell', 'input', ...args], {
|
|
39
|
+
timeoutMs: INPUT_TIMEOUT_MS,
|
|
40
|
+
});
|
|
41
|
+
if (proc.timedOut) {
|
|
42
|
+
return { error: `Android ${action} timed out after ${INPUT_TIMEOUT_MS}ms` };
|
|
43
|
+
}
|
|
44
|
+
if (proc.exitCode !== 0) {
|
|
45
|
+
return {
|
|
46
|
+
error: `adb shell input ${action} failed (exit ${proc.exitCode}): ${proc.stderr.toString('utf8').trim().slice(0, 500)}`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return { ok: true };
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err instanceof processRunner_1.ProcessNotFoundError) {
|
|
53
|
+
return {
|
|
54
|
+
error: 'adb not found. Android host tools require Android platform-tools on PATH.',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return { error: `Failed to run Android ${action}: ${err.message}` };
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const tapAndroid = (serial, x, y, runner) => {
|
|
61
|
+
return runAdbInput(serial, ['tap', String(x), String(y)], runner, 'tap');
|
|
62
|
+
};
|
|
63
|
+
const swipeAndroid = (serial, x1, y1, x2, y2, durationMs, runner) => {
|
|
64
|
+
return runAdbInput(serial, ['swipe', String(x1), String(y1), String(x2), String(y2), String(durationMs)], runner, 'swipe');
|
|
65
|
+
};
|
|
66
|
+
// `adb shell input text` maps characters through the default virtual keyboard
|
|
67
|
+
// keymap, which only covers ASCII. Anything outside that set crashes the input
|
|
68
|
+
// service with an opaque "Attempt to get length of null array" NPE. Refuse it
|
|
69
|
+
// up front with an actionable message.
|
|
70
|
+
// eslint-disable-next-line no-control-regex
|
|
71
|
+
const NON_ASCII_RE = /[^\x00-\x7F]/;
|
|
72
|
+
const typeTextAndroid = async (serial, text, submit, runner) => {
|
|
73
|
+
if (NON_ASCII_RE.test(text)) {
|
|
74
|
+
return {
|
|
75
|
+
error: 'Android type_text only supports ASCII — `adb shell input text` has no code path for non-ASCII characters. Workarounds: tap the target field then drive the content some other way (e.g. fiber_tree__invoke on onChangeText), or paste from the device clipboard via a helper app.',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Select all + delete existing text first (consistent with iOS behavior).
|
|
79
|
+
// `input keycombination` sends keys simultaneously (Ctrl+A = select all).
|
|
80
|
+
try {
|
|
81
|
+
const selAll = await runner('adb', ['-s', serial, 'shell', 'input', 'keycombination', '113', '29'], {
|
|
82
|
+
timeoutMs: INPUT_TIMEOUT_MS,
|
|
83
|
+
});
|
|
84
|
+
if (selAll.exitCode === 0) {
|
|
85
|
+
await runAdbInput(serial, ['keyevent', 'KEYCODE_DEL'], runner, 'clear');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// keycombination not supported — skip clear, just append
|
|
90
|
+
}
|
|
91
|
+
const escaped = escapeAdbInputText(text);
|
|
92
|
+
const typed = await runAdbInput(serial, ['text', escaped], runner, 'text');
|
|
93
|
+
if ('error' in typed) {
|
|
94
|
+
return typed;
|
|
95
|
+
}
|
|
96
|
+
if (submit) {
|
|
97
|
+
return runAdbInput(serial, ['keyevent', 'KEYCODE_ENTER'], runner, 'submit');
|
|
98
|
+
}
|
|
99
|
+
return typed;
|
|
100
|
+
};
|
|
101
|
+
const pressKeyAndroid = (serial, key, runner) => {
|
|
102
|
+
const keycode = ANDROID_KEYCODES[key];
|
|
103
|
+
if (!keycode) {
|
|
104
|
+
return Promise.resolve({
|
|
105
|
+
error: `Unknown key '${key}'. Supported: ${KEY_NAMES.join(', ')}.`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return runAdbInput(serial, ['keyevent', keycode], runner, 'keyevent');
|
|
109
|
+
};
|
|
110
|
+
const tapTool = (runner) => {
|
|
111
|
+
return {
|
|
112
|
+
description: 'Tap at absolute pixel coordinates (x, y), top-left origin. Coordinates match fiber_tree bounds.centerX/centerY — feed them directly. Goes through the OS gesture pipeline, so use this (over fiber_tree__invoke) whenever you want to exercise the real touch path. Android: adb shell input tap. iOS: bundled ios-hid binary (HID injection into iOS Simulator via SimulatorKit).',
|
|
113
|
+
handler: async (args, ctx) => {
|
|
114
|
+
const resolved = await (0, deviceResolver_1.resolveDevice)(ctx, (0, helpers_1.parseResolveOptions)(args), runner);
|
|
115
|
+
if (!resolved.ok) {
|
|
116
|
+
return { error: resolved.error };
|
|
117
|
+
}
|
|
118
|
+
const x = (0, helpers_1.parseCoord)(args.x, 'x');
|
|
119
|
+
if (!x.ok)
|
|
120
|
+
return { error: x.error };
|
|
121
|
+
const y = (0, helpers_1.parseCoord)(args.y, 'y');
|
|
122
|
+
if (!y.ok)
|
|
123
|
+
return { error: y.error };
|
|
124
|
+
const result = resolved.device.platform === 'ios'
|
|
125
|
+
? await (0, iosInput_1.tapIos)(resolved.device.nativeId, x.value, y.value, runner)
|
|
126
|
+
: await tapAndroid(resolved.device.nativeId, x.value, y.value, runner);
|
|
127
|
+
if ('error' in result) {
|
|
128
|
+
return { error: result.error };
|
|
129
|
+
}
|
|
130
|
+
return { device: resolved.device, tapped: true, x: x.value, y: y.value };
|
|
131
|
+
},
|
|
132
|
+
inputSchema: {
|
|
133
|
+
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|
|
134
|
+
x: {
|
|
135
|
+
description: 'Absolute x pixel coordinate (top-left origin).',
|
|
136
|
+
type: 'number',
|
|
137
|
+
},
|
|
138
|
+
y: {
|
|
139
|
+
description: 'Absolute y pixel coordinate (top-left origin).',
|
|
140
|
+
type: 'number',
|
|
141
|
+
},
|
|
142
|
+
...helpers_1.NATIVE_ID_SCHEMA,
|
|
143
|
+
},
|
|
144
|
+
timeout: INPUT_TIMEOUT_MS,
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
exports.tapTool = tapTool;
|
|
148
|
+
const swipeTool = (runner) => {
|
|
149
|
+
return {
|
|
150
|
+
description: 'Swipe (or scroll) from (x1, y1) to (x2, y2) on the target device. Coordinates are absolute pixels, top-left origin. durationMs defaults to 300 and is clamped to 50..5000. Android: adb shell input swipe. iOS: bundled ios-hid binary (HID injection into iOS Simulator via SimulatorKit).',
|
|
151
|
+
handler: async (args, ctx) => {
|
|
152
|
+
const resolved = await (0, deviceResolver_1.resolveDevice)(ctx, (0, helpers_1.parseResolveOptions)(args), runner);
|
|
153
|
+
if (!resolved.ok) {
|
|
154
|
+
return { error: resolved.error };
|
|
155
|
+
}
|
|
156
|
+
const x1 = (0, helpers_1.parseCoord)(args.x1, 'x1');
|
|
157
|
+
if (!x1.ok)
|
|
158
|
+
return { error: x1.error };
|
|
159
|
+
const y1 = (0, helpers_1.parseCoord)(args.y1, 'y1');
|
|
160
|
+
if (!y1.ok)
|
|
161
|
+
return { error: y1.error };
|
|
162
|
+
const x2 = (0, helpers_1.parseCoord)(args.x2, 'x2');
|
|
163
|
+
if (!x2.ok)
|
|
164
|
+
return { error: x2.error };
|
|
165
|
+
const y2 = (0, helpers_1.parseCoord)(args.y2, 'y2');
|
|
166
|
+
if (!y2.ok)
|
|
167
|
+
return { error: y2.error };
|
|
168
|
+
const durationMs = clampSwipeDuration(args.durationMs);
|
|
169
|
+
const result = resolved.device.platform === 'ios'
|
|
170
|
+
? await (0, iosInput_1.swipeIos)(resolved.device.nativeId, x1.value, y1.value, x2.value, y2.value, durationMs, runner)
|
|
171
|
+
: await swipeAndroid(resolved.device.nativeId, x1.value, y1.value, x2.value, y2.value, durationMs, runner);
|
|
172
|
+
if ('error' in result) {
|
|
173
|
+
return { error: result.error };
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
device: resolved.device,
|
|
177
|
+
durationMs,
|
|
178
|
+
from: { x: x1.value, y: y1.value },
|
|
179
|
+
swiped: true,
|
|
180
|
+
to: { x: x2.value, y: y2.value },
|
|
181
|
+
};
|
|
182
|
+
},
|
|
183
|
+
inputSchema: {
|
|
184
|
+
durationMs: {
|
|
185
|
+
description: `Total swipe duration in milliseconds. Default ${SWIPE_DURATION_DEFAULT_MS}. Clamped to ${SWIPE_DURATION_MIN_MS}..${SWIPE_DURATION_MAX_MS}.`,
|
|
186
|
+
type: 'number',
|
|
187
|
+
},
|
|
188
|
+
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|
|
189
|
+
x1: {
|
|
190
|
+
description: 'Start x pixel coordinate (top-left origin).',
|
|
191
|
+
type: 'number',
|
|
192
|
+
},
|
|
193
|
+
x2: {
|
|
194
|
+
description: 'End x pixel coordinate (top-left origin).',
|
|
195
|
+
type: 'number',
|
|
196
|
+
},
|
|
197
|
+
y1: {
|
|
198
|
+
description: 'Start y pixel coordinate (top-left origin).',
|
|
199
|
+
type: 'number',
|
|
200
|
+
},
|
|
201
|
+
y2: {
|
|
202
|
+
description: 'End y pixel coordinate (top-left origin).',
|
|
203
|
+
type: 'number',
|
|
204
|
+
},
|
|
205
|
+
...helpers_1.NATIVE_ID_SCHEMA,
|
|
206
|
+
},
|
|
207
|
+
timeout: INPUT_TIMEOUT_MS + SWIPE_DURATION_MAX_MS,
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
exports.swipeTool = swipeTool;
|
|
211
|
+
const typeTextTool = (runner) => {
|
|
212
|
+
return {
|
|
213
|
+
description: 'Type text into the currently focused input field on the target device. Replaces existing text (select-all then paste). Pass submit=true to press ENTER after typing. iOS accepts any unicode (pastes via simctl pbcopy + Cmd+A/Cmd+V, immune to keyboard-layout). Android is ASCII-only — `adb shell input text` lacks a codepath for non-ASCII, so the tool refuses it with an explanatory error. For Cyrillic/CJK/emoji on Android, drive the target via fiber_tree__invoke on onChangeText instead.',
|
|
214
|
+
handler: async (args, ctx) => {
|
|
215
|
+
const resolved = await (0, deviceResolver_1.resolveDevice)(ctx, (0, helpers_1.parseResolveOptions)(args), runner);
|
|
216
|
+
if (!resolved.ok) {
|
|
217
|
+
return { error: resolved.error };
|
|
218
|
+
}
|
|
219
|
+
const text = typeof args.text === 'string' ? args.text : undefined;
|
|
220
|
+
if (text === undefined) {
|
|
221
|
+
return { error: "'text' is required and must be a string" };
|
|
222
|
+
}
|
|
223
|
+
const submit = args.submit === true;
|
|
224
|
+
const result = resolved.device.platform === 'ios'
|
|
225
|
+
? await (0, iosInput_1.typeTextIos)(resolved.device.nativeId, text, submit, runner)
|
|
226
|
+
: await typeTextAndroid(resolved.device.nativeId, text, submit, runner);
|
|
227
|
+
if ('error' in result) {
|
|
228
|
+
return { error: result.error };
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
device: resolved.device,
|
|
232
|
+
length: text.length,
|
|
233
|
+
submitted: submit,
|
|
234
|
+
typed: true,
|
|
235
|
+
};
|
|
236
|
+
},
|
|
237
|
+
inputSchema: {
|
|
238
|
+
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|
|
239
|
+
submit: {
|
|
240
|
+
description: 'Press ENTER after typing (e.g. to submit a search). Default false.',
|
|
241
|
+
type: 'boolean',
|
|
242
|
+
},
|
|
243
|
+
text: {
|
|
244
|
+
description: 'Text to type into the currently focused input field. Whitespace and shell metacharacters are escaped automatically.',
|
|
245
|
+
type: 'string',
|
|
246
|
+
},
|
|
247
|
+
...helpers_1.NATIVE_ID_SCHEMA,
|
|
248
|
+
},
|
|
249
|
+
timeout: INPUT_TIMEOUT_MS,
|
|
250
|
+
};
|
|
251
|
+
};
|
|
252
|
+
exports.typeTextTool = typeTextTool;
|
|
253
|
+
const pressKeyTool = (runner) => {
|
|
254
|
+
return {
|
|
255
|
+
description: `Press a hardware/semantic key on the target device. Android: adb shell input keyevent. iOS: bundled ios-hid binary (HID keyboard/button events via SimulatorKit). Accepted key names: ${KEY_NAMES.join(', ')}. On iOS back/menu/power/volume_up/volume_down are not available.`,
|
|
256
|
+
handler: async (args, ctx) => {
|
|
257
|
+
const resolved = await (0, deviceResolver_1.resolveDevice)(ctx, (0, helpers_1.parseResolveOptions)(args), runner);
|
|
258
|
+
if (!resolved.ok) {
|
|
259
|
+
return { error: resolved.error };
|
|
260
|
+
}
|
|
261
|
+
const key = (0, helpers_1.parseStringArg)(args.key);
|
|
262
|
+
if (!key) {
|
|
263
|
+
return { error: `'key' is required. Supported: ${KEY_NAMES.join(', ')}.` };
|
|
264
|
+
}
|
|
265
|
+
const result = resolved.device.platform === 'ios'
|
|
266
|
+
? await (0, iosInput_1.pressKeyIos)(resolved.device.nativeId, key, runner)
|
|
267
|
+
: await pressKeyAndroid(resolved.device.nativeId, key, runner);
|
|
268
|
+
if ('error' in result) {
|
|
269
|
+
return { error: result.error };
|
|
270
|
+
}
|
|
271
|
+
return { device: resolved.device, key, pressed: true };
|
|
272
|
+
},
|
|
273
|
+
inputSchema: {
|
|
274
|
+
key: {
|
|
275
|
+
description: `Semantic key name. Mapped to the target platform's native key code internally. Supported: ${KEY_NAMES.join(', ')}.`,
|
|
276
|
+
enum: KEY_NAMES,
|
|
277
|
+
type: 'string',
|
|
278
|
+
},
|
|
279
|
+
platform: helpers_1.PLATFORM_ARG_SCHEMA,
|
|
280
|
+
...helpers_1.NATIVE_ID_SCHEMA,
|
|
281
|
+
},
|
|
282
|
+
timeout: INPUT_TIMEOUT_MS,
|
|
283
|
+
};
|
|
284
|
+
};
|
|
285
|
+
exports.pressKeyTool = pressKeyTool;
|
|
286
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../../../src/server/host/tools/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ProcessRunner } from '../../../server/host/processRunner';
|
|
2
|
+
import { type HostToolHandler } from '../../../server/host/types';
|
|
3
|
+
export declare const launchAppTool: (runner: ProcessRunner) => HostToolHandler;
|
|
4
|
+
export declare const terminateAppTool: (runner: ProcessRunner) => HostToolHandler;
|
|
5
|
+
export declare const restartAppTool: (runner: ProcessRunner) => HostToolHandler;
|
|
6
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/server/host/tools/lifecycle.ts"],"names":[],"mappings":"AAQA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAsO7E,eAAO,MAAM,aAAa,WAAY,aAAa,KAAG,eA8BrD,CAAC;AAEF,eAAO,MAAM,gBAAgB,WAAY,aAAa,KAAG,eA8BxD,CAAC;AAIF,eAAO,MAAM,cAAc,WAAY,aAAa,KAAG,eAyCtD,CAAC"}
|