@us-all/android-mcp 1.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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +277 -0
  3. package/dist/adb.d.ts +8 -0
  4. package/dist/adb.d.ts.map +1 -0
  5. package/dist/adb.js +35 -0
  6. package/dist/adb.js.map +1 -0
  7. package/dist/config.d.ts +9 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +22 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +81 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/tools/apps.d.ts +51 -0
  16. package/dist/tools/apps.d.ts.map +1 -0
  17. package/dist/tools/apps.js +174 -0
  18. package/dist/tools/apps.js.map +1 -0
  19. package/dist/tools/device.d.ts +44 -0
  20. package/dist/tools/device.d.ts.map +1 -0
  21. package/dist/tools/device.js +105 -0
  22. package/dist/tools/device.js.map +1 -0
  23. package/dist/tools/emulator.d.ts +46 -0
  24. package/dist/tools/emulator.d.ts.map +1 -0
  25. package/dist/tools/emulator.js +129 -0
  26. package/dist/tools/emulator.js.map +1 -0
  27. package/dist/tools/files.d.ts +36 -0
  28. package/dist/tools/files.d.ts.map +1 -0
  29. package/dist/tools/files.js +85 -0
  30. package/dist/tools/files.js.map +1 -0
  31. package/dist/tools/logcat.d.ts +44 -0
  32. package/dist/tools/logcat.d.ts.map +1 -0
  33. package/dist/tools/logcat.js +123 -0
  34. package/dist/tools/logcat.js.map +1 -0
  35. package/dist/tools/shell.d.ts +11 -0
  36. package/dist/tools/shell.d.ts.map +1 -0
  37. package/dist/tools/shell.js +34 -0
  38. package/dist/tools/shell.js.map +1 -0
  39. package/dist/tools/system.d.ts +31 -0
  40. package/dist/tools/system.d.ts.map +1 -0
  41. package/dist/tools/system.js +80 -0
  42. package/dist/tools/system.js.map +1 -0
  43. package/dist/tools/ui.d.ts +80 -0
  44. package/dist/tools/ui.d.ts.map +1 -0
  45. package/dist/tools/ui.js +195 -0
  46. package/dist/tools/ui.js.map +1 -0
  47. package/dist/tools/utils.d.ts +43 -0
  48. package/dist/tools/utils.d.ts.map +1 -0
  49. package/dist/tools/utils.js +108 -0
  50. package/dist/tools/utils.js.map +1 -0
  51. package/package.json +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/tools/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ export declare const getLogcatSchema: z.ZodObject<{
3
+ lines: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
4
+ tag: z.ZodOptional<z.ZodString>;
5
+ priority: z.ZodOptional<z.ZodEnum<{
6
+ V: "V";
7
+ D: "D";
8
+ I: "I";
9
+ W: "W";
10
+ E: "E";
11
+ F: "F";
12
+ }>>;
13
+ serial: z.ZodOptional<z.ZodString>;
14
+ }, z.core.$strip>;
15
+ export declare const clearLogcatSchema: z.ZodObject<{
16
+ serial: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strip>;
18
+ export declare const searchLogcatSchema: z.ZodObject<{
19
+ pattern: z.ZodString;
20
+ lines: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
21
+ caseSensitive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
22
+ serial: z.ZodOptional<z.ZodString>;
23
+ }, z.core.$strip>;
24
+ export declare const getCrashLogsSchema: z.ZodObject<{
25
+ packageName: z.ZodOptional<z.ZodString>;
26
+ serial: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>;
28
+ export declare function getLogcat(params: z.infer<typeof getLogcatSchema>): Promise<{
29
+ lineCount: number;
30
+ logs: string[];
31
+ }>;
32
+ export declare function clearLogcat(params: z.infer<typeof clearLogcatSchema>): Promise<{
33
+ result: string;
34
+ }>;
35
+ export declare function searchLogcat(params: z.infer<typeof searchLogcatSchema>): Promise<{
36
+ matchCount: number;
37
+ totalSearched: number;
38
+ matches: string[];
39
+ }>;
40
+ export declare function getCrashLogs(params: z.infer<typeof getCrashLogsSchema>): Promise<{
41
+ crashCount: number;
42
+ crashes: string[];
43
+ }>;
44
+ //# sourceMappingURL=logcat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logcat.d.ts","sourceRoot":"","sources":["../../src/tools/logcat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,eAAe;;;;;;;;;;;;iBAqB1B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;iBAK5B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;iBAiB7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;iBAW7B,CAAC;AAIH,wBAAsB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;;;GAqBtE;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC;;GAM1C;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;;;;GAuB3C;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;;;GA6B3C"}
@@ -0,0 +1,123 @@
1
+ import { z } from "zod";
2
+ import { adb, adbShell } from "../adb.js";
3
+ import { assertWriteAllowed } from "./utils.js";
4
+ // --- Schemas ---
5
+ export const getLogcatSchema = z.object({
6
+ lines: z
7
+ .coerce
8
+ .number()
9
+ .optional()
10
+ .default(100)
11
+ .describe("Number of recent log lines to retrieve (default: 100)."),
12
+ tag: z
13
+ .string()
14
+ .optional()
15
+ .describe("Filter by log tag. Example: 'ActivityManager'"),
16
+ priority: z
17
+ .enum(["V", "D", "I", "W", "E", "F"])
18
+ .optional()
19
+ .describe("Minimum log priority: V(erbose), D(ebug), I(nfo), W(arn), E(rror), F(atal)."),
20
+ serial: z
21
+ .string()
22
+ .optional()
23
+ .describe("Device serial number. Uses default device if omitted."),
24
+ });
25
+ export const clearLogcatSchema = z.object({
26
+ serial: z
27
+ .string()
28
+ .optional()
29
+ .describe("Device serial number. Uses default device if omitted."),
30
+ });
31
+ export const searchLogcatSchema = z.object({
32
+ pattern: z.string().describe("Text pattern to search for in logs."),
33
+ lines: z
34
+ .coerce
35
+ .number()
36
+ .optional()
37
+ .default(500)
38
+ .describe("Number of recent log lines to search through (default: 500)."),
39
+ caseSensitive: z
40
+ .boolean()
41
+ .optional()
42
+ .default(false)
43
+ .describe("Case sensitive search (default: false)."),
44
+ serial: z
45
+ .string()
46
+ .optional()
47
+ .describe("Device serial number. Uses default device if omitted."),
48
+ });
49
+ export const getCrashLogsSchema = z.object({
50
+ packageName: z
51
+ .string()
52
+ .optional()
53
+ .describe("Filter crash logs for a specific package. Shows all crashes if omitted."),
54
+ serial: z
55
+ .string()
56
+ .optional()
57
+ .describe("Device serial number. Uses default device if omitted."),
58
+ });
59
+ // --- Handlers ---
60
+ export async function getLogcat(params) {
61
+ const opts = params.serial ? { serial: params.serial } : undefined;
62
+ const args = ["logcat", "-d", `-t`, `${params.lines}`];
63
+ if (params.tag && params.priority) {
64
+ args.push(`${params.tag}:${params.priority}`, "*:S");
65
+ }
66
+ else if (params.tag) {
67
+ args.push(`${params.tag}:V`, "*:S");
68
+ }
69
+ else if (params.priority) {
70
+ args.push(`*:${params.priority}`);
71
+ }
72
+ const output = await adb(args, opts);
73
+ const lines = output
74
+ .split("\n")
75
+ .filter((l) => l && !l.startsWith("--------- beginning of"));
76
+ return {
77
+ lineCount: lines.length,
78
+ logs: lines,
79
+ };
80
+ }
81
+ export async function clearLogcat(params) {
82
+ assertWriteAllowed();
83
+ const opts = params.serial ? { serial: params.serial } : undefined;
84
+ await adb(["logcat", "-c"], opts);
85
+ return { result: "Logcat buffer cleared" };
86
+ }
87
+ export async function searchLogcat(params) {
88
+ const opts = params.serial ? { serial: params.serial } : undefined;
89
+ const output = await adb(["logcat", "-d", "-t", `${params.lines}`], opts);
90
+ const lines = output.split("\n").filter(Boolean);
91
+ const pattern = params.caseSensitive
92
+ ? params.pattern
93
+ : params.pattern.toLowerCase();
94
+ const matches = lines.filter((line) => {
95
+ const target = params.caseSensitive ? line : line.toLowerCase();
96
+ return target.includes(pattern);
97
+ });
98
+ return {
99
+ matchCount: matches.length,
100
+ totalSearched: lines.length,
101
+ matches,
102
+ };
103
+ }
104
+ export async function getCrashLogs(params) {
105
+ const opts = params.serial ? { serial: params.serial } : undefined;
106
+ const output = await adbShell("logcat -d -b crash", opts).catch(async () => {
107
+ return await adb(["logcat", "-d", "-t", "500"], opts);
108
+ });
109
+ let lines = output.split("\n").filter(Boolean);
110
+ if (params.packageName) {
111
+ lines = lines.filter((line) => line.includes(params.packageName));
112
+ }
113
+ const fatalLines = lines.filter((line) => line.includes("FATAL") ||
114
+ line.includes("AndroidRuntime") ||
115
+ line.includes("Exception") ||
116
+ line.includes("Error") ||
117
+ line.includes("crash"));
118
+ return {
119
+ crashCount: fatalLines.length,
120
+ crashes: fatalLines.length > 0 ? fatalLines : lines.slice(-50),
121
+ };
122
+ }
123
+ //# sourceMappingURL=logcat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logcat.js","sourceRoot":"","sources":["../../src/tools/logcat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { z } from "zod";
2
+ export declare const executeShellSchema: z.ZodObject<{
3
+ command: z.ZodString;
4
+ timeout: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
5
+ serial: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strip>;
7
+ export declare function executeShell(params: z.infer<typeof executeShellSchema>): Promise<{
8
+ command: string;
9
+ output: string;
10
+ }>;
11
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,kBAAkB;;;;iBAiB7B,CAAC;AAIH,wBAAsB,YAAY,CAChC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;;;GAY3C"}
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ import { adbShell } from "../adb.js";
3
+ import { assertShellAllowed } from "./utils.js";
4
+ // --- Schema ---
5
+ export const executeShellSchema = z.object({
6
+ command: z
7
+ .string()
8
+ .min(1, "Command must not be empty")
9
+ .describe("ADB shell command to execute. Example: 'ls /data/local/tmp'"),
10
+ timeout: z
11
+ .coerce
12
+ .number()
13
+ .optional()
14
+ .default(30000)
15
+ .describe("Command timeout in milliseconds (default: 30000)."),
16
+ serial: z
17
+ .string()
18
+ .optional()
19
+ .describe("Device serial number. Uses default device if omitted."),
20
+ });
21
+ // --- Handler ---
22
+ export async function executeShell(params) {
23
+ assertShellAllowed();
24
+ const opts = {
25
+ ...(params.serial ? { serial: params.serial } : {}),
26
+ timeout: params.timeout,
27
+ };
28
+ const output = await adbShell(params.command, opts);
29
+ return {
30
+ command: params.command,
31
+ output,
32
+ };
33
+ }
34
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,iBAAiB;AAEjB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC;SACnC,QAAQ,CACP,6DAA6D,CAC9D;IACH,OAAO,EAAE,CAAC;SACP,MAAM;SACN,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,mDAAmD,CAAC;IAChE,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,uDAAuD,CAAC;CACrE,CAAC,CAAC;AAEH,kBAAkB;AAElB,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA0C;IAE1C,kBAAkB,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG;QACX,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ export declare const getBatteryInfoSchema: z.ZodObject<{
3
+ serial: z.ZodOptional<z.ZodString>;
4
+ }, z.core.$strip>;
5
+ export declare const getNetworkInfoSchema: z.ZodObject<{
6
+ serial: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$strip>;
8
+ export declare const changeSettingSchema: z.ZodObject<{
9
+ namespace: z.ZodEnum<{
10
+ system: "system";
11
+ secure: "secure";
12
+ global: "global";
13
+ }>;
14
+ key: z.ZodString;
15
+ value: z.ZodString;
16
+ serial: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strip>;
18
+ export declare function getBatteryInfo(params: z.infer<typeof getBatteryInfoSchema>): Promise<Record<string, string | number | boolean>>;
19
+ export declare function getNetworkInfo(params: z.infer<typeof getNetworkInfoSchema>): Promise<{
20
+ wifi: {
21
+ enabled: boolean;
22
+ ipAddress: string | undefined;
23
+ details: string[];
24
+ };
25
+ connectivity: string[];
26
+ }>;
27
+ export declare function changeSetting(params: z.infer<typeof changeSettingSchema>): Promise<{
28
+ result: string;
29
+ currentValue: string;
30
+ }>;
31
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,oBAAoB;;iBAK/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;iBAK/B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;iBAU9B,CAAC;AAIH,wBAAsB,cAAc,CAClC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,sDAwB7C;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC;;;;;;;GAwB7C;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;;;GAkB5C"}
@@ -0,0 +1,80 @@
1
+ import { z } from "zod";
2
+ import { adbShell } from "../adb.js";
3
+ import { assertWriteAllowed } from "./utils.js";
4
+ // --- Schemas ---
5
+ export const getBatteryInfoSchema = z.object({
6
+ serial: z
7
+ .string()
8
+ .optional()
9
+ .describe("Device serial number. Uses default device if omitted."),
10
+ });
11
+ export const getNetworkInfoSchema = z.object({
12
+ serial: z
13
+ .string()
14
+ .optional()
15
+ .describe("Device serial number. Uses default device if omitted."),
16
+ });
17
+ export const changeSettingSchema = z.object({
18
+ namespace: z
19
+ .enum(["system", "secure", "global"])
20
+ .describe("Settings namespace: system, secure, or global."),
21
+ key: z.string().describe("Setting key. Example: 'screen_brightness'"),
22
+ value: z.string().describe("Setting value."),
23
+ serial: z
24
+ .string()
25
+ .optional()
26
+ .describe("Device serial number. Uses default device if omitted."),
27
+ });
28
+ // --- Handlers ---
29
+ export async function getBatteryInfo(params) {
30
+ const opts = params.serial ? { serial: params.serial } : undefined;
31
+ const output = await adbShell("dumpsys battery", opts);
32
+ const info = {};
33
+ const lines = output.split("\n");
34
+ for (const line of lines) {
35
+ const match = line.match(/^\s+(\w[\w\s]*?):\s*(.+)$/);
36
+ if (match) {
37
+ const key = match[1].trim().replace(/\s+/g, "_").toLowerCase();
38
+ const val = match[2].trim();
39
+ if (val === "true" || val === "false") {
40
+ info[key] = val === "true";
41
+ }
42
+ else if (/^\d+$/.test(val)) {
43
+ info[key] = parseInt(val, 10);
44
+ }
45
+ else {
46
+ info[key] = val;
47
+ }
48
+ }
49
+ }
50
+ return info;
51
+ }
52
+ export async function getNetworkInfo(params) {
53
+ const opts = params.serial ? { serial: params.serial } : undefined;
54
+ const [wifi, connectivity, ip] = await Promise.all([
55
+ adbShell("dumpsys wifi | head -20", opts).catch(() => ""),
56
+ adbShell("dumpsys connectivity | grep -A 5 'NetworkAgentInfo'", opts).catch(() => ""),
57
+ adbShell("ip addr show", opts).catch(() => ""),
58
+ ]);
59
+ const wifiEnabled = wifi.includes("Wi-Fi is enabled") || wifi.includes("mWifiEnabled true");
60
+ const ipMatch = ip.match(/inet\s+(\d+\.\d+\.\d+\.\d+)\/\d+.*wlan/);
61
+ return {
62
+ wifi: {
63
+ enabled: wifiEnabled,
64
+ ipAddress: ipMatch ? ipMatch[1] : undefined,
65
+ details: wifi.split("\n").slice(0, 10).filter(Boolean),
66
+ },
67
+ connectivity: connectivity.split("\n").filter(Boolean).slice(0, 10),
68
+ };
69
+ }
70
+ export async function changeSetting(params) {
71
+ assertWriteAllowed();
72
+ const opts = params.serial ? { serial: params.serial } : undefined;
73
+ await adbShell(`settings put ${params.namespace} ${params.key} ${params.value}`, opts);
74
+ const verify = await adbShell(`settings get ${params.namespace} ${params.key}`, opts);
75
+ return {
76
+ result: `Set ${params.namespace}/${params.key} = ${params.value}`,
77
+ currentValue: verify.trim(),
78
+ };
79
+ }
80
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { z } from "zod";
2
+ export declare const takeScreenshotSchema: z.ZodObject<{
3
+ serial: z.ZodOptional<z.ZodString>;
4
+ }, z.core.$strip>;
5
+ export declare const dumpUiHierarchySchema: z.ZodObject<{
6
+ compact: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
7
+ serial: z.ZodOptional<z.ZodString>;
8
+ }, z.core.$strip>;
9
+ export declare const tapSchema: z.ZodObject<{
10
+ x: z.ZodCoercedNumber<unknown>;
11
+ y: z.ZodCoercedNumber<unknown>;
12
+ serial: z.ZodOptional<z.ZodString>;
13
+ }, z.core.$strip>;
14
+ export declare const longPressSchema: z.ZodObject<{
15
+ x: z.ZodCoercedNumber<unknown>;
16
+ y: z.ZodCoercedNumber<unknown>;
17
+ duration: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
18
+ serial: z.ZodOptional<z.ZodString>;
19
+ }, z.core.$strip>;
20
+ export declare const swipeSchema: z.ZodObject<{
21
+ x1: z.ZodCoercedNumber<unknown>;
22
+ y1: z.ZodCoercedNumber<unknown>;
23
+ x2: z.ZodCoercedNumber<unknown>;
24
+ y2: z.ZodCoercedNumber<unknown>;
25
+ duration: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
26
+ serial: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>;
28
+ export declare const inputTextSchema: z.ZodObject<{
29
+ text: z.ZodString;
30
+ serial: z.ZodOptional<z.ZodString>;
31
+ }, z.core.$strip>;
32
+ export declare const pressKeySchema: z.ZodObject<{
33
+ key: z.ZodString;
34
+ serial: z.ZodOptional<z.ZodString>;
35
+ }, z.core.$strip>;
36
+ interface UiElement {
37
+ index: number;
38
+ class: string;
39
+ text?: string;
40
+ contentDesc?: string;
41
+ resourceId?: string;
42
+ clickable: boolean;
43
+ focusable: boolean;
44
+ scrollable: boolean;
45
+ bounds: string;
46
+ center?: {
47
+ x: number;
48
+ y: number;
49
+ };
50
+ }
51
+ export declare function takeScreenshot(params: z.infer<typeof takeScreenshotSchema>): Promise<{
52
+ base64: string;
53
+ mimeType: string;
54
+ }>;
55
+ export declare function dumpUiHierarchy(params: z.infer<typeof dumpUiHierarchySchema>): Promise<{
56
+ elements: never[];
57
+ raw: string;
58
+ elementCount?: undefined;
59
+ } | {
60
+ elementCount: number;
61
+ elements: UiElement[];
62
+ raw?: undefined;
63
+ }>;
64
+ export declare function tap(params: z.infer<typeof tapSchema>): Promise<{
65
+ result: string;
66
+ }>;
67
+ export declare function longPress(params: z.infer<typeof longPressSchema>): Promise<{
68
+ result: string;
69
+ }>;
70
+ export declare function swipe(params: z.infer<typeof swipeSchema>): Promise<{
71
+ result: string;
72
+ }>;
73
+ export declare function inputText(params: z.infer<typeof inputTextSchema>): Promise<{
74
+ result: string;
75
+ }>;
76
+ export declare function pressKey(params: z.infer<typeof pressKeySchema>): Promise<{
77
+ result: string;
78
+ }>;
79
+ export {};
80
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/tools/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,oBAAoB;;iBAK/B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;iBAYhC,CAAC;AAEH,eAAO,MAAM,SAAS;;;;iBAOpB,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;iBAa1B,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;iBAetB,CAAC;AAEH,eAAO,MAAM,eAAe;;;iBAM1B,CAAC;AAEH,eAAO,MAAM,cAAc;;;iBAUzB,CAAC;AAIH,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC;AA+DD,wBAAsB,cAAc,CAClC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC;;;GAQ7C;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC;;;;;;;;GAyB9C;AAED,wBAAsB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC;;GAK1D;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;;GAUtE;AAED,wBAAsB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC;;GAU9D;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;;GAMtE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC;;GAQpE"}
@@ -0,0 +1,195 @@
1
+ import { z } from "zod";
2
+ import { XMLParser } from "fast-xml-parser";
3
+ import { adbShell, adbRawBuffer } from "../adb.js";
4
+ import { assertWriteAllowed } from "./utils.js";
5
+ // --- Schemas ---
6
+ export const takeScreenshotSchema = z.object({
7
+ serial: z
8
+ .string()
9
+ .optional()
10
+ .describe("Device serial number. Uses default device if omitted."),
11
+ });
12
+ export const dumpUiHierarchySchema = z.object({
13
+ compact: z
14
+ .boolean()
15
+ .optional()
16
+ .default(true)
17
+ .describe("Return compact format (interactive elements only) for token efficiency. Default: true."),
18
+ serial: z
19
+ .string()
20
+ .optional()
21
+ .describe("Device serial number. Uses default device if omitted."),
22
+ });
23
+ export const tapSchema = z.object({
24
+ x: z.coerce.number().describe("X coordinate to tap."),
25
+ y: z.coerce.number().describe("Y coordinate to tap."),
26
+ serial: z
27
+ .string()
28
+ .optional()
29
+ .describe("Device serial number. Uses default device if omitted."),
30
+ });
31
+ export const longPressSchema = z.object({
32
+ x: z.coerce.number().describe("X coordinate to long press."),
33
+ y: z.coerce.number().describe("Y coordinate to long press."),
34
+ duration: z
35
+ .coerce
36
+ .number()
37
+ .optional()
38
+ .default(1000)
39
+ .describe("Duration in milliseconds (default: 1000)."),
40
+ serial: z
41
+ .string()
42
+ .optional()
43
+ .describe("Device serial number. Uses default device if omitted."),
44
+ });
45
+ export const swipeSchema = z.object({
46
+ x1: z.coerce.number().describe("Start X coordinate."),
47
+ y1: z.coerce.number().describe("Start Y coordinate."),
48
+ x2: z.coerce.number().describe("End X coordinate."),
49
+ y2: z.coerce.number().describe("End Y coordinate."),
50
+ duration: z
51
+ .coerce
52
+ .number()
53
+ .optional()
54
+ .default(300)
55
+ .describe("Duration in milliseconds (default: 300)."),
56
+ serial: z
57
+ .string()
58
+ .optional()
59
+ .describe("Device serial number. Uses default device if omitted."),
60
+ });
61
+ export const inputTextSchema = z.object({
62
+ text: z.string().describe("Text to input. Special characters will be escaped."),
63
+ serial: z
64
+ .string()
65
+ .optional()
66
+ .describe("Device serial number. Uses default device if omitted."),
67
+ });
68
+ export const pressKeySchema = z.object({
69
+ key: z
70
+ .string()
71
+ .describe("Key to press. Examples: 'KEYCODE_BACK', 'KEYCODE_HOME', 'KEYCODE_ENTER', 'KEYCODE_VOLUME_UP'. Full list: https://developer.android.com/reference/android/view/KeyEvent"),
72
+ serial: z
73
+ .string()
74
+ .optional()
75
+ .describe("Device serial number. Uses default device if omitted."),
76
+ });
77
+ function parseBounds(boundsStr) {
78
+ const match = boundsStr.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);
79
+ if (!match)
80
+ return undefined;
81
+ const x1 = parseInt(match[1], 10);
82
+ const y1 = parseInt(match[2], 10);
83
+ const x2 = parseInt(match[3], 10);
84
+ const y2 = parseInt(match[4], 10);
85
+ return { x: Math.round((x1 + x2) / 2), y: Math.round((y1 + y2) / 2) };
86
+ }
87
+ function isInteractive(attrs) {
88
+ return (attrs["@_clickable"] === "true" ||
89
+ attrs["@_long-clickable"] === "true" ||
90
+ attrs["@_focusable"] === "true" ||
91
+ attrs["@_scrollable"] === "true" ||
92
+ attrs["@_checkable"] === "true");
93
+ }
94
+ function flattenNodes(node, result, compact) {
95
+ const attrs = node;
96
+ const bounds = attrs["@_bounds"] ?? "";
97
+ const interactive = isInteractive(attrs);
98
+ if (!compact || interactive) {
99
+ const element = {
100
+ index: result.length,
101
+ class: (attrs["@_class"] ?? "").split(".").pop() ?? "",
102
+ clickable: attrs["@_clickable"] === "true",
103
+ focusable: attrs["@_focusable"] === "true",
104
+ scrollable: attrs["@_scrollable"] === "true",
105
+ bounds,
106
+ };
107
+ if (attrs["@_text"])
108
+ element.text = attrs["@_text"];
109
+ if (attrs["@_content-desc"])
110
+ element.contentDesc = attrs["@_content-desc"];
111
+ if (attrs["@_resource-id"]) {
112
+ element.resourceId = attrs["@_resource-id"].split("/").pop();
113
+ }
114
+ if (bounds)
115
+ element.center = parseBounds(bounds);
116
+ result.push(element);
117
+ }
118
+ const children = node["node"];
119
+ if (Array.isArray(children)) {
120
+ for (const child of children) {
121
+ flattenNodes(child, result, compact);
122
+ }
123
+ }
124
+ else if (children && typeof children === "object") {
125
+ flattenNodes(children, result, compact);
126
+ }
127
+ }
128
+ // --- Handlers ---
129
+ export async function takeScreenshot(params) {
130
+ const opts = params.serial ? { serial: params.serial } : undefined;
131
+ const buffer = await adbRawBuffer(["exec-out", "screencap", "-p"], opts);
132
+ return {
133
+ base64: buffer.toString("base64"),
134
+ mimeType: "image/png",
135
+ };
136
+ }
137
+ export async function dumpUiHierarchy(params) {
138
+ const opts = params.serial ? { serial: params.serial } : undefined;
139
+ await adbShell("uiautomator dump /sdcard/window_dump.xml", opts);
140
+ const xml = await adbShell("cat /sdcard/window_dump.xml", opts);
141
+ const parser = new XMLParser({
142
+ ignoreAttributes: false,
143
+ attributeNamePrefix: "@_",
144
+ });
145
+ const parsed = parser.parse(xml);
146
+ const hierarchy = parsed?.hierarchy;
147
+ if (!hierarchy) {
148
+ return { elements: [], raw: xml.substring(0, 500) };
149
+ }
150
+ const elements = [];
151
+ flattenNodes(hierarchy, elements, params.compact);
152
+ return {
153
+ elementCount: elements.length,
154
+ elements,
155
+ };
156
+ }
157
+ export async function tap(params) {
158
+ assertWriteAllowed();
159
+ const opts = params.serial ? { serial: params.serial } : undefined;
160
+ await adbShell(`input tap ${params.x} ${params.y}`, opts);
161
+ return { result: `Tapped at (${params.x}, ${params.y})` };
162
+ }
163
+ export async function longPress(params) {
164
+ assertWriteAllowed();
165
+ const opts = params.serial ? { serial: params.serial } : undefined;
166
+ await adbShell(`input swipe ${params.x} ${params.y} ${params.x} ${params.y} ${params.duration}`, opts);
167
+ return {
168
+ result: `Long pressed at (${params.x}, ${params.y}) for ${params.duration}ms`,
169
+ };
170
+ }
171
+ export async function swipe(params) {
172
+ assertWriteAllowed();
173
+ const opts = params.serial ? { serial: params.serial } : undefined;
174
+ await adbShell(`input swipe ${params.x1} ${params.y1} ${params.x2} ${params.y2} ${params.duration}`, opts);
175
+ return {
176
+ result: `Swiped from (${params.x1}, ${params.y1}) to (${params.x2}, ${params.y2})`,
177
+ };
178
+ }
179
+ export async function inputText(params) {
180
+ assertWriteAllowed();
181
+ const opts = params.serial ? { serial: params.serial } : undefined;
182
+ const escaped = params.text.replace(/ /g, "%s").replace(/'/g, "\\'");
183
+ await adbShell(`input text '${escaped}'`, opts);
184
+ return { result: `Typed: "${params.text}"` };
185
+ }
186
+ export async function pressKey(params) {
187
+ assertWriteAllowed();
188
+ const opts = params.serial ? { serial: params.serial } : undefined;
189
+ const keycode = params.key.startsWith("KEYCODE_")
190
+ ? params.key
191
+ : `KEYCODE_${params.key.toUpperCase()}`;
192
+ await adbShell(`input keyevent ${keycode}`, opts);
193
+ return { result: `Pressed key: ${keycode}` };
194
+ }
195
+ //# sourceMappingURL=ui.js.map