@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,174 @@
1
+ import { z } from "zod";
2
+ import { adb, adbShell } from "../adb.js";
3
+ import { assertWriteAllowed } from "./utils.js";
4
+ // --- Schemas ---
5
+ export const listPackagesSchema = z.object({
6
+ filter: z
7
+ .string()
8
+ .optional()
9
+ .describe("Filter packages by name. Example: 'com.google'"),
10
+ type: z
11
+ .enum(["all", "system", "third-party"])
12
+ .optional()
13
+ .default("all")
14
+ .describe("Package type filter: all, system, or third-party."),
15
+ serial: z
16
+ .string()
17
+ .optional()
18
+ .describe("Device serial number. Uses default device if omitted."),
19
+ });
20
+ export const getPackageInfoSchema = z.object({
21
+ packageName: z
22
+ .string()
23
+ .describe("Package name. Example: 'com.android.chrome'"),
24
+ serial: z
25
+ .string()
26
+ .optional()
27
+ .describe("Device serial number. Uses default device if omitted."),
28
+ });
29
+ export const installAppSchema = z.object({
30
+ apkPath: z.string().describe("Local path to the APK file to install."),
31
+ replace: z
32
+ .boolean()
33
+ .optional()
34
+ .default(true)
35
+ .describe("Replace existing app if installed (default: true)."),
36
+ serial: z
37
+ .string()
38
+ .optional()
39
+ .describe("Device serial number. Uses default device if omitted."),
40
+ });
41
+ export const uninstallAppSchema = z.object({
42
+ packageName: z
43
+ .string()
44
+ .describe("Package name to uninstall. Example: 'com.example.app'"),
45
+ keepData: z
46
+ .boolean()
47
+ .optional()
48
+ .default(false)
49
+ .describe("Keep app data after uninstall (default: false)."),
50
+ serial: z
51
+ .string()
52
+ .optional()
53
+ .describe("Device serial number. Uses default device if omitted."),
54
+ });
55
+ export const launchAppSchema = z.object({
56
+ packageName: z
57
+ .string()
58
+ .describe("Package name to launch. Example: 'com.android.chrome'"),
59
+ activity: z
60
+ .string()
61
+ .optional()
62
+ .describe("Activity to start. If omitted, launches the default launcher activity."),
63
+ serial: z
64
+ .string()
65
+ .optional()
66
+ .describe("Device serial number. Uses default device if omitted."),
67
+ });
68
+ export const stopAppSchema = z.object({
69
+ packageName: z
70
+ .string()
71
+ .describe("Package name to force stop. Example: 'com.example.app'"),
72
+ serial: z
73
+ .string()
74
+ .optional()
75
+ .describe("Device serial number. Uses default device if omitted."),
76
+ });
77
+ // --- Handlers ---
78
+ export async function listPackages(params) {
79
+ const opts = params.serial ? { serial: params.serial } : undefined;
80
+ let flag = "";
81
+ if (params.type === "system")
82
+ flag = "-s";
83
+ else if (params.type === "third-party")
84
+ flag = "-3";
85
+ const args = flag ? `pm list packages ${flag}` : "pm list packages";
86
+ const output = await adbShell(args, opts);
87
+ let packages = output
88
+ .split("\n")
89
+ .map((l) => l.replace("package:", "").trim())
90
+ .filter(Boolean);
91
+ if (params.filter) {
92
+ const filter = params.filter.toLowerCase();
93
+ packages = packages.filter((p) => p.toLowerCase().includes(filter));
94
+ }
95
+ packages.sort();
96
+ return { count: packages.length, packages };
97
+ }
98
+ export async function getPackageInfo(params) {
99
+ const opts = params.serial ? { serial: params.serial } : undefined;
100
+ const output = await adbShell(`dumpsys package ${params.packageName}`, opts);
101
+ const info = {
102
+ packageName: params.packageName,
103
+ };
104
+ const versionName = output.match(/versionName=(\S+)/);
105
+ if (versionName)
106
+ info.versionName = versionName[1];
107
+ const versionCode = output.match(/versionCode=(\d+)/);
108
+ if (versionCode)
109
+ info.versionCode = versionCode[1];
110
+ const targetSdk = output.match(/targetSdk=(\d+)/);
111
+ if (targetSdk)
112
+ info.targetSdk = targetSdk[1];
113
+ const minSdk = output.match(/minSdk=(\d+)/);
114
+ if (minSdk)
115
+ info.minSdk = minSdk[1];
116
+ const firstInstall = output.match(/firstInstallTime=(.+)/);
117
+ if (firstInstall)
118
+ info.firstInstallTime = firstInstall[1].trim();
119
+ const lastUpdate = output.match(/lastUpdateTime=(.+)/);
120
+ if (lastUpdate)
121
+ info.lastUpdateTime = lastUpdate[1].trim();
122
+ const permissions = [];
123
+ const permSection = output.match(/requested permissions:\n([\s\S]*?)(?:\n\s*\n|\ninstall permissions:)/);
124
+ if (permSection) {
125
+ const lines = permSection[1].split("\n");
126
+ for (const line of lines) {
127
+ const perm = line.trim();
128
+ if (perm && perm.startsWith("android.permission.")) {
129
+ permissions.push(perm);
130
+ }
131
+ }
132
+ }
133
+ if (permissions.length > 0)
134
+ info.permissions = permissions;
135
+ return info;
136
+ }
137
+ export async function installApp(params) {
138
+ assertWriteAllowed();
139
+ const opts = params.serial ? { serial: params.serial } : undefined;
140
+ const args = ["install"];
141
+ if (params.replace)
142
+ args.push("-r");
143
+ args.push(params.apkPath);
144
+ const output = await adb(args, { ...opts, timeout: 120_000 });
145
+ return { result: output };
146
+ }
147
+ export async function uninstallApp(params) {
148
+ assertWriteAllowed();
149
+ const opts = params.serial ? { serial: params.serial } : undefined;
150
+ const args = ["uninstall"];
151
+ if (params.keepData)
152
+ args.push("-k");
153
+ args.push(params.packageName);
154
+ const output = await adb(args, opts);
155
+ return { result: output };
156
+ }
157
+ export async function launchApp(params) {
158
+ assertWriteAllowed();
159
+ const opts = params.serial ? { serial: params.serial } : undefined;
160
+ if (params.activity) {
161
+ const component = `${params.packageName}/${params.activity}`;
162
+ const output = await adbShell(`am start -n ${component}`, opts);
163
+ return { result: output };
164
+ }
165
+ const output = await adbShell(`monkey -p ${params.packageName} -c android.intent.category.LAUNCHER 1`, opts);
166
+ return { result: output };
167
+ }
168
+ export async function stopApp(params) {
169
+ assertWriteAllowed();
170
+ const opts = params.serial ? { serial: params.serial } : undefined;
171
+ const output = await adbShell(`am force-stop ${params.packageName}`, opts);
172
+ return { result: output || "App stopped successfully" };
173
+ }
174
+ //# sourceMappingURL=apps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.js","sourceRoot":"","sources":["../../src/tools/apps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ export declare const listDevicesSchema: z.ZodObject<{}, z.core.$strip>;
3
+ export declare const getDeviceInfoSchema: z.ZodObject<{
4
+ serial: z.ZodOptional<z.ZodString>;
5
+ }, z.core.$strip>;
6
+ export declare const getDevicePropertiesSchema: z.ZodObject<{
7
+ filter: z.ZodOptional<z.ZodString>;
8
+ serial: z.ZodOptional<z.ZodString>;
9
+ }, z.core.$strip>;
10
+ export declare const connectDeviceSchema: z.ZodObject<{
11
+ address: z.ZodString;
12
+ }, z.core.$strip>;
13
+ export declare const disconnectDeviceSchema: z.ZodObject<{
14
+ address: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strip>;
16
+ export declare function listDevices(): Promise<{
17
+ count: number;
18
+ devices: {
19
+ serial: string;
20
+ status: string;
21
+ }[];
22
+ }>;
23
+ export declare function getDeviceInfo(params: z.infer<typeof getDeviceInfoSchema>): Promise<{
24
+ model: string;
25
+ brand: string;
26
+ androidVersion: string;
27
+ sdkVersion: number;
28
+ abi: string;
29
+ display: {
30
+ density: string;
31
+ size: string;
32
+ };
33
+ }>;
34
+ export declare function getDeviceProperties(params: z.infer<typeof getDevicePropertiesSchema>): Promise<{
35
+ count: number;
36
+ properties: Record<string, string>;
37
+ }>;
38
+ export declare function connectDevice(params: z.infer<typeof connectDeviceSchema>): Promise<{
39
+ result: string;
40
+ }>;
41
+ export declare function disconnectDevice(params: z.infer<typeof disconnectDeviceSchema>): Promise<{
42
+ result: string;
43
+ }>;
44
+ //# sourceMappingURL=device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/tools/device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,iBAAiB,gCAAe,CAAC;AAE9C,eAAO,MAAM,mBAAmB;;iBAK9B,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;iBAWpC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;iBAI9B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;iBAOjC,CAAC;AAIH,wBAAsB,WAAW;;;;;;GAmBhC;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;;;;;;;;;;GAyB5C;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC;;;GAoBlD;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;;GAK5C;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC;;GAQ/C"}
@@ -0,0 +1,105 @@
1
+ import { z } from "zod";
2
+ import { adb, adbShell } from "../adb.js";
3
+ import { assertWriteAllowed } from "./utils.js";
4
+ // --- Schemas ---
5
+ export const listDevicesSchema = z.object({});
6
+ export const getDeviceInfoSchema = z.object({
7
+ serial: z
8
+ .string()
9
+ .optional()
10
+ .describe("Device serial number. Uses default device if omitted."),
11
+ });
12
+ export const getDevicePropertiesSchema = z.object({
13
+ filter: z
14
+ .string()
15
+ .optional()
16
+ .describe("Filter properties by prefix. Example: 'ro.build' to get build-related props."),
17
+ serial: z
18
+ .string()
19
+ .optional()
20
+ .describe("Device serial number. Uses default device if omitted."),
21
+ });
22
+ export const connectDeviceSchema = z.object({
23
+ address: z
24
+ .string()
25
+ .describe("Device address in host:port format. Example: '192.168.1.100:5555'"),
26
+ });
27
+ export const disconnectDeviceSchema = z.object({
28
+ address: z
29
+ .string()
30
+ .optional()
31
+ .describe("Device address to disconnect. Disconnects all TCP/IP devices if omitted."),
32
+ });
33
+ // --- Handlers ---
34
+ export async function listDevices() {
35
+ const output = await adb(["devices", "-l"]);
36
+ const lines = output.split("\n").filter((l) => l.trim() && !l.startsWith("List"));
37
+ const devices = lines.map((line) => {
38
+ const parts = line.trim().split(/\s+/);
39
+ const serial = parts[0];
40
+ const status = parts[1];
41
+ const details = {};
42
+ for (const part of parts.slice(2)) {
43
+ const [key, value] = part.split(":");
44
+ if (key && value) {
45
+ details[key] = value;
46
+ }
47
+ }
48
+ return { serial, status, ...details };
49
+ });
50
+ return { count: devices.length, devices };
51
+ }
52
+ export async function getDeviceInfo(params) {
53
+ const opts = params.serial ? { serial: params.serial } : undefined;
54
+ const [model, brand, sdk, release, density, size, abi] = await Promise.all([
55
+ adbShell("getprop ro.product.model", opts),
56
+ adbShell("getprop ro.product.brand", opts),
57
+ adbShell("getprop ro.build.version.sdk", opts),
58
+ adbShell("getprop ro.build.version.release", opts),
59
+ adbShell("wm density", opts).catch(() => "unknown"),
60
+ adbShell("wm size", opts).catch(() => "unknown"),
61
+ adbShell("getprop ro.product.cpu.abi", opts),
62
+ ]);
63
+ return {
64
+ model: model.trim(),
65
+ brand: brand.trim(),
66
+ androidVersion: release.trim(),
67
+ sdkVersion: parseInt(sdk.trim(), 10),
68
+ abi: abi.trim(),
69
+ display: {
70
+ density: density.replace("Physical density: ", "").trim(),
71
+ size: size.replace("Physical size: ", "").trim(),
72
+ },
73
+ };
74
+ }
75
+ export async function getDeviceProperties(params) {
76
+ const opts = params.serial ? { serial: params.serial } : undefined;
77
+ const output = await adbShell("getprop", opts);
78
+ const props = {};
79
+ const lines = output.split("\n");
80
+ for (const line of lines) {
81
+ const match = line.match(/^\[(.+?)\]:\s*\[(.*)?\]$/);
82
+ if (match) {
83
+ const key = match[1];
84
+ const value = match[2] ?? "";
85
+ if (!params.filter || key.startsWith(params.filter)) {
86
+ props[key] = value;
87
+ }
88
+ }
89
+ }
90
+ return { count: Object.keys(props).length, properties: props };
91
+ }
92
+ export async function connectDevice(params) {
93
+ assertWriteAllowed();
94
+ const output = await adb(["connect", params.address]);
95
+ return { result: output };
96
+ }
97
+ export async function disconnectDevice(params) {
98
+ assertWriteAllowed();
99
+ const args = params.address
100
+ ? ["disconnect", params.address]
101
+ : ["disconnect"];
102
+ const output = await adb(args);
103
+ return { result: output };
104
+ }
105
+ //# sourceMappingURL=device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/tools/device.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+ export declare const listAvdsSchema: z.ZodObject<{}, z.core.$strip>;
3
+ export declare const startEmulatorSchema: z.ZodObject<{
4
+ avdName: z.ZodString;
5
+ noWindow: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
6
+ wipeData: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
7
+ }, z.core.$strip>;
8
+ export declare const stopEmulatorSchema: z.ZodObject<{
9
+ serial: z.ZodDefault<z.ZodOptional<z.ZodString>>;
10
+ }, z.core.$strip>;
11
+ export declare const listSnapshotsSchema: z.ZodObject<{
12
+ serial: z.ZodDefault<z.ZodOptional<z.ZodString>>;
13
+ }, z.core.$strip>;
14
+ export declare const loadSnapshotSchema: z.ZodObject<{
15
+ snapshotName: z.ZodString;
16
+ serial: z.ZodDefault<z.ZodOptional<z.ZodString>>;
17
+ }, z.core.$strip>;
18
+ export declare function listAvds(): Promise<{
19
+ count: number;
20
+ avds: string[];
21
+ error?: undefined;
22
+ } | {
23
+ count: number;
24
+ avds: never[];
25
+ error: string;
26
+ }>;
27
+ export declare function startEmulator(params: z.infer<typeof startEmulatorSchema>): Promise<{
28
+ result: string;
29
+ pid: number | undefined;
30
+ }>;
31
+ export declare function stopEmulator(params: z.infer<typeof stopEmulatorSchema>): Promise<{
32
+ result: string;
33
+ }>;
34
+ export declare function listSnapshots(params: z.infer<typeof listSnapshotsSchema>): Promise<{
35
+ count: number;
36
+ snapshots: string[];
37
+ note?: undefined;
38
+ } | {
39
+ count: number;
40
+ snapshots: never[];
41
+ note: string;
42
+ }>;
43
+ export declare function loadSnapshot(params: z.infer<typeof loadSnapshotSchema>): Promise<{
44
+ result: string;
45
+ }>;
46
+ //# sourceMappingURL=emulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emulator.d.ts","sourceRoot":"","sources":["../../src/tools/emulator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0BxB,eAAO,MAAM,cAAc,gCAAe,CAAC;AAE3C,eAAO,MAAM,mBAAmB;;;;iBAY9B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;iBAQ7B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;iBAM9B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;iBAO7B,CAAC;AAIH,wBAAsB,QAAQ;;;;;;;;GA2B7B;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;;;GAkB5C;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;;GAK3C;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;;;;;;;;GAe5C;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;;GAQ3C"}
@@ -0,0 +1,129 @@
1
+ import { z } from "zod";
2
+ import { execFile, spawn } from "node:child_process";
3
+ import { promisify } from "node:util";
4
+ import path from "node:path";
5
+ import { config } from "../config.js";
6
+ import { adb, adbShell } from "../adb.js";
7
+ import { assertWriteAllowed } from "./utils.js";
8
+ const execFileAsync = promisify(execFile);
9
+ function getEmulatorPath() {
10
+ if (config.androidHome) {
11
+ return path.join(config.androidHome, "emulator", "emulator");
12
+ }
13
+ return "emulator";
14
+ }
15
+ function getAvdManagerPath() {
16
+ if (config.androidHome) {
17
+ return path.join(config.androidHome, "cmdline-tools", "latest", "bin", "avdmanager");
18
+ }
19
+ return "avdmanager";
20
+ }
21
+ // --- Schemas ---
22
+ export const listAvdsSchema = z.object({});
23
+ export const startEmulatorSchema = z.object({
24
+ avdName: z.string().describe("Name of the AVD to start."),
25
+ noWindow: z
26
+ .boolean()
27
+ .optional()
28
+ .default(false)
29
+ .describe("Start emulator without GUI window (headless mode)."),
30
+ wipeData: z
31
+ .boolean()
32
+ .optional()
33
+ .default(false)
34
+ .describe("Wipe user data before starting."),
35
+ });
36
+ export const stopEmulatorSchema = z.object({
37
+ serial: z
38
+ .string()
39
+ .optional()
40
+ .default("emulator-5554")
41
+ .describe("Emulator serial number to stop (default: 'emulator-5554')."),
42
+ });
43
+ export const listSnapshotsSchema = z.object({
44
+ serial: z
45
+ .string()
46
+ .optional()
47
+ .default("emulator-5554")
48
+ .describe("Emulator serial number (default: 'emulator-5554')."),
49
+ });
50
+ export const loadSnapshotSchema = z.object({
51
+ snapshotName: z.string().describe("Name of the snapshot to load."),
52
+ serial: z
53
+ .string()
54
+ .optional()
55
+ .default("emulator-5554")
56
+ .describe("Emulator serial number (default: 'emulator-5554')."),
57
+ });
58
+ // --- Handlers ---
59
+ export async function listAvds() {
60
+ const emulatorPath = getEmulatorPath();
61
+ try {
62
+ const { stdout } = await execFileAsync(emulatorPath, ["-list-avds"]);
63
+ const avds = stdout
64
+ .trim()
65
+ .split("\n")
66
+ .filter(Boolean);
67
+ return { count: avds.length, avds };
68
+ }
69
+ catch {
70
+ try {
71
+ const avdManagerPath = getAvdManagerPath();
72
+ const { stdout } = await execFileAsync(avdManagerPath, ["list", "avd", "-c"]);
73
+ const avds = stdout
74
+ .trim()
75
+ .split("\n")
76
+ .filter(Boolean);
77
+ return { count: avds.length, avds };
78
+ }
79
+ catch {
80
+ return {
81
+ count: 0,
82
+ avds: [],
83
+ error: "Could not list AVDs. Ensure ANDROID_HOME is set and emulator/avdmanager is available.",
84
+ };
85
+ }
86
+ }
87
+ }
88
+ export async function startEmulator(params) {
89
+ assertWriteAllowed();
90
+ const emulatorPath = getEmulatorPath();
91
+ const args = ["-avd", params.avdName];
92
+ if (params.noWindow)
93
+ args.push("-no-window");
94
+ if (params.wipeData)
95
+ args.push("-wipe-data");
96
+ const child = spawn(emulatorPath, args, {
97
+ detached: true,
98
+ stdio: "ignore",
99
+ });
100
+ child.unref();
101
+ return {
102
+ result: `Emulator '${params.avdName}' starting...`,
103
+ pid: child.pid,
104
+ };
105
+ }
106
+ export async function stopEmulator(params) {
107
+ assertWriteAllowed();
108
+ const output = await adb(["emu", "kill"], { serial: params.serial });
109
+ return { result: output || "Emulator stopped" };
110
+ }
111
+ export async function listSnapshots(params) {
112
+ try {
113
+ const output = await adbShell("ls /data/misc/snapshots/ 2>/dev/null || echo 'default_boot'", { serial: params.serial });
114
+ const snapshots = output
115
+ .trim()
116
+ .split("\n")
117
+ .filter(Boolean);
118
+ return { count: snapshots.length, snapshots };
119
+ }
120
+ catch {
121
+ return { count: 0, snapshots: [], note: "Snapshot listing not supported on this device" };
122
+ }
123
+ }
124
+ export async function loadSnapshot(params) {
125
+ assertWriteAllowed();
126
+ const output = await adb(["emu", "avd", "snapshot", "load", params.snapshotName], { serial: params.serial });
127
+ return { result: output || `Snapshot '${params.snapshotName}' loaded` };
128
+ }
129
+ //# sourceMappingURL=emulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emulator.js","sourceRoot":"","sources":["../../src/tools/emulator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ export declare const listFilesSchema: z.ZodObject<{
3
+ path: z.ZodDefault<z.ZodOptional<z.ZodString>>;
4
+ recursive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
5
+ serial: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strip>;
7
+ export declare const pullFileSchema: z.ZodObject<{
8
+ remotePath: z.ZodString;
9
+ localPath: z.ZodString;
10
+ serial: z.ZodOptional<z.ZodString>;
11
+ }, z.core.$strip>;
12
+ export declare const pushFileSchema: z.ZodObject<{
13
+ localPath: z.ZodString;
14
+ remotePath: z.ZodString;
15
+ serial: z.ZodOptional<z.ZodString>;
16
+ }, z.core.$strip>;
17
+ export declare const deleteFileSchema: z.ZodObject<{
18
+ path: z.ZodString;
19
+ recursive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
20
+ serial: z.ZodOptional<z.ZodString>;
21
+ }, z.core.$strip>;
22
+ export declare function listFiles(params: z.infer<typeof listFilesSchema>): Promise<{
23
+ path: string;
24
+ count: number;
25
+ entries: string[];
26
+ }>;
27
+ export declare function pullFile(params: z.infer<typeof pullFileSchema>): Promise<{
28
+ result: string;
29
+ }>;
30
+ export declare function pushFile(params: z.infer<typeof pushFileSchema>): Promise<{
31
+ result: string;
32
+ }>;
33
+ export declare function deleteFile(params: z.infer<typeof deleteFileSchema>): Promise<{
34
+ result: string;
35
+ }>;
36
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/tools/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,eAAe;;;;iBAe1B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;iBAWzB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;iBASzB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;iBAW3B,CAAC;AAIH,wBAAsB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;;;;GAWtE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC;;GAOpE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC;;GAQpE;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC;;GAMxE"}
@@ -0,0 +1,85 @@
1
+ import { z } from "zod";
2
+ import { adb, adbShell } from "../adb.js";
3
+ import { assertWriteAllowed } from "./utils.js";
4
+ // --- Schemas ---
5
+ export const listFilesSchema = z.object({
6
+ path: z
7
+ .string()
8
+ .optional()
9
+ .default("/sdcard")
10
+ .describe("Directory path on device (default: /sdcard)."),
11
+ recursive: z
12
+ .boolean()
13
+ .optional()
14
+ .default(false)
15
+ .describe("List files recursively (default: false)."),
16
+ serial: z
17
+ .string()
18
+ .optional()
19
+ .describe("Device serial number. Uses default device if omitted."),
20
+ });
21
+ export const pullFileSchema = z.object({
22
+ remotePath: z
23
+ .string()
24
+ .describe("File path on the device to pull."),
25
+ localPath: z
26
+ .string()
27
+ .describe("Local destination path."),
28
+ serial: z
29
+ .string()
30
+ .optional()
31
+ .describe("Device serial number. Uses default device if omitted."),
32
+ });
33
+ export const pushFileSchema = z.object({
34
+ localPath: z.string().describe("Local file path to push."),
35
+ remotePath: z
36
+ .string()
37
+ .describe("Destination path on the device."),
38
+ serial: z
39
+ .string()
40
+ .optional()
41
+ .describe("Device serial number. Uses default device if omitted."),
42
+ });
43
+ export const deleteFileSchema = z.object({
44
+ path: z.string().describe("File or directory path on the device to delete."),
45
+ recursive: z
46
+ .boolean()
47
+ .optional()
48
+ .default(false)
49
+ .describe("Delete recursively for directories (default: false)."),
50
+ serial: z
51
+ .string()
52
+ .optional()
53
+ .describe("Device serial number. Uses default device if omitted."),
54
+ });
55
+ // --- Handlers ---
56
+ export async function listFiles(params) {
57
+ const opts = params.serial ? { serial: params.serial } : undefined;
58
+ const flag = params.recursive ? "-lR" : "-la";
59
+ const output = await adbShell(`ls ${flag} ${params.path}`, opts);
60
+ const lines = output.split("\n").filter(Boolean);
61
+ return {
62
+ path: params.path,
63
+ count: lines.length,
64
+ entries: lines,
65
+ };
66
+ }
67
+ export async function pullFile(params) {
68
+ const opts = params.serial ? { serial: params.serial } : undefined;
69
+ const output = await adb(["pull", params.remotePath, params.localPath], opts);
70
+ return { result: output };
71
+ }
72
+ export async function pushFile(params) {
73
+ assertWriteAllowed();
74
+ const opts = params.serial ? { serial: params.serial } : undefined;
75
+ const output = await adb(["push", params.localPath, params.remotePath], opts);
76
+ return { result: output };
77
+ }
78
+ export async function deleteFile(params) {
79
+ assertWriteAllowed();
80
+ const opts = params.serial ? { serial: params.serial } : undefined;
81
+ const flag = params.recursive ? "-rf" : "-f";
82
+ const output = await adbShell(`rm ${flag} ${params.path}`, opts);
83
+ return { result: output || `Deleted: ${params.path}` };
84
+ }
85
+ //# sourceMappingURL=files.js.map