@ddqd/droid-mcp 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/CLAUDE.md +124 -0
- package/EXAMPLES.md +471 -0
- package/LICENSE +21 -0
- package/README.md +354 -0
- package/dist/adb.d.ts +110 -0
- package/dist/adb.d.ts.map +1 -0
- package/dist/adb.js +579 -0
- package/dist/adb.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +366 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +54 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +34 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
package/dist/adb.js
ADDED
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import { exec, spawn } from "child_process";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
import { readFile, mkdir, writeFile, readdir, stat, rm } from "fs/promises";
|
|
4
|
+
import { join, resolve } from "path";
|
|
5
|
+
import sharp from "sharp";
|
|
6
|
+
const execAsync = promisify(exec);
|
|
7
|
+
// Debug logging utility
|
|
8
|
+
const DEBUG = process.env.DROID_MCP_DEBUG === "true" || process.env.DEBUG === "1";
|
|
9
|
+
function debugLog(message, data) {
|
|
10
|
+
if (DEBUG) {
|
|
11
|
+
const timestamp = new Date().toISOString();
|
|
12
|
+
const dataStr = data ? JSON.stringify(data, null, 2) : "";
|
|
13
|
+
console.error(`[${timestamp}] [ADB DEBUG] ${message}${dataStr ? "\n" + dataStr : ""}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class AdbError extends Error {
|
|
17
|
+
code;
|
|
18
|
+
stderr;
|
|
19
|
+
constructor(message, code, stderr) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.code = code;
|
|
22
|
+
this.stderr = stderr;
|
|
23
|
+
this.name = "AdbError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Execute an ADB command
|
|
28
|
+
* @param command - Array of command arguments (e.g., ["logcat", "-d", "-t", "200"])
|
|
29
|
+
* @returns Promise with stdout and stderr
|
|
30
|
+
* @throws AdbError if command fails
|
|
31
|
+
*/
|
|
32
|
+
export async function execAdb(command) {
|
|
33
|
+
const fullCommand = `adb ${command.join(" ")}`;
|
|
34
|
+
debugLog("Executing ADB command", { command: fullCommand });
|
|
35
|
+
try {
|
|
36
|
+
const startTime = Date.now();
|
|
37
|
+
const { stdout, stderr } = await execAsync(fullCommand, {
|
|
38
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large log outputs
|
|
39
|
+
});
|
|
40
|
+
const duration = Date.now() - startTime;
|
|
41
|
+
debugLog("ADB command completed", {
|
|
42
|
+
command: fullCommand,
|
|
43
|
+
duration: `${duration}ms`,
|
|
44
|
+
stdoutLength: stdout?.length || 0,
|
|
45
|
+
stderrLength: stderr?.length || 0
|
|
46
|
+
});
|
|
47
|
+
return { stdout, stderr };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
debugLog("ADB command failed", {
|
|
51
|
+
command: fullCommand,
|
|
52
|
+
error: error instanceof Error ? error.message : String(error),
|
|
53
|
+
errorCode: error && typeof error === "object" && "code" in error ? error.code : undefined
|
|
54
|
+
});
|
|
55
|
+
if (error && typeof error === "object" && "code" in error) {
|
|
56
|
+
const execError = error;
|
|
57
|
+
throw new AdbError(`ADB command failed: ${fullCommand}`, execError.code, execError.stderr || "");
|
|
58
|
+
}
|
|
59
|
+
throw new AdbError(`ADB command failed: ${fullCommand}`, null, error instanceof Error ? error.message : String(error));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Получает PID процесса по package ID
|
|
64
|
+
* @param packageId - Package ID приложения (например, "com.example.app")
|
|
65
|
+
* @returns PID процесса или null, если приложение не запущено
|
|
66
|
+
*/
|
|
67
|
+
export async function getPidForPackage(packageId) {
|
|
68
|
+
try {
|
|
69
|
+
const { stdout } = await execAdb(["shell", "pidof", "-s", packageId]);
|
|
70
|
+
const pid = stdout.trim();
|
|
71
|
+
return pid && pid.length > 0 ? pid : null;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// Если пакет не найден или не запущен, возвращаем null
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Получает PID для списка package ID
|
|
80
|
+
* @param packageIds - Массив package ID
|
|
81
|
+
* @returns Массив PID для запущенных процессов (только те, что найдены)
|
|
82
|
+
*/
|
|
83
|
+
export async function getPidsForPackages(packageIds) {
|
|
84
|
+
const pids = [];
|
|
85
|
+
for (const packageId of packageIds) {
|
|
86
|
+
const pid = await getPidForPackage(packageId);
|
|
87
|
+
if (pid) {
|
|
88
|
+
pids.push(pid);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return pids;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Получает список установленных сторонних приложений (User installed)
|
|
95
|
+
* @returns Массив package ID установленных приложений
|
|
96
|
+
*/
|
|
97
|
+
export async function listThirdPartyPackages() {
|
|
98
|
+
try {
|
|
99
|
+
const { stdout } = await execAdb(["shell", "pm", "list", "packages", "-3"]);
|
|
100
|
+
return stdout
|
|
101
|
+
.split(/\r?\n/)
|
|
102
|
+
.filter((line) => line.trim().startsWith("package:"))
|
|
103
|
+
.map((line) => line.trim().replace("package:", ""));
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Пытается найти applicationId в build.gradle файлах проекта
|
|
111
|
+
* @param rootDir - Корневая директория проекта (по умолчанию process.cwd())
|
|
112
|
+
* @returns Найденный applicationId или null
|
|
113
|
+
*/
|
|
114
|
+
export async function scanGradleForPackageId(rootDir = process.cwd()) {
|
|
115
|
+
// Проверяем список возможных путей
|
|
116
|
+
const candidates = [
|
|
117
|
+
"app/build.gradle",
|
|
118
|
+
"app/build.gradle.kts",
|
|
119
|
+
"build.gradle",
|
|
120
|
+
"build.gradle.kts"
|
|
121
|
+
];
|
|
122
|
+
for (const relPath of candidates) {
|
|
123
|
+
try {
|
|
124
|
+
const content = await readFile(join(rootDir, relPath), "utf-8");
|
|
125
|
+
// Ищем applicationId "com.example" или applicationId = "com.example"
|
|
126
|
+
const match = content.match(/applicationId\s+[=]?\s*["']([^"']+)["']/);
|
|
127
|
+
if (match && match[1]) {
|
|
128
|
+
return match[1];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
// Файл не найден, идем дальше
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Запускает logcat и слушает вывод до появления stopPattern или истечения таймаута
|
|
139
|
+
* @param options - Параметры захвата логов
|
|
140
|
+
* @returns Promise с накопленными логами
|
|
141
|
+
* @throws AdbError если команда не может быть выполнена
|
|
142
|
+
*/
|
|
143
|
+
export function captureLogcatUntil(options) {
|
|
144
|
+
const { stopPattern, timeoutMs, clearBuffer, tag, priority, buffer, pids } = options;
|
|
145
|
+
debugLog("captureLogcatUntil started", { stopPattern, timeoutMs, clearBuffer, tag, priority, buffer, pids });
|
|
146
|
+
// Валидация regex pattern
|
|
147
|
+
let regex;
|
|
148
|
+
try {
|
|
149
|
+
regex = new RegExp(stopPattern, "i"); // Case-insensitive
|
|
150
|
+
debugLog("Regex pattern validated", { stopPattern });
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
debugLog("Invalid regex pattern", { stopPattern, error: error instanceof Error ? error.message : String(error) });
|
|
154
|
+
throw new AdbError(`Invalid regex pattern: ${stopPattern}`, null, error instanceof Error ? error.message : String(error));
|
|
155
|
+
}
|
|
156
|
+
return new Promise(async (resolve, reject) => {
|
|
157
|
+
// Очистка буфера перед началом, если требуется
|
|
158
|
+
if (clearBuffer) {
|
|
159
|
+
debugLog("Clearing logcat buffer");
|
|
160
|
+
try {
|
|
161
|
+
await execAdb(["logcat", "-c"]);
|
|
162
|
+
debugLog("Logcat buffer cleared");
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
debugLog("Failed to clear logcat buffer", { error: error instanceof Error ? error.message : String(error) });
|
|
166
|
+
reject(new AdbError("Failed to clear logcat buffer", null, error instanceof AdbError ? error.stderr : String(error)));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Построение команды adb logcat
|
|
171
|
+
const command = ["logcat"];
|
|
172
|
+
// Формат вывода
|
|
173
|
+
command.push("-v", "threadtime");
|
|
174
|
+
// Выбор буфера
|
|
175
|
+
if (buffer) {
|
|
176
|
+
command.push("-b", buffer);
|
|
177
|
+
}
|
|
178
|
+
// Фильтры по PID (множественные --pid поддерживаются)
|
|
179
|
+
if (pids && pids.length > 0) {
|
|
180
|
+
for (const pid of pids) {
|
|
181
|
+
command.push(`--pid=${pid}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Фильтры по tag и priority
|
|
185
|
+
if (tag && priority) {
|
|
186
|
+
command.push(`${tag}:${priority}`);
|
|
187
|
+
}
|
|
188
|
+
else if (tag) {
|
|
189
|
+
command.push(`${tag}:*`);
|
|
190
|
+
}
|
|
191
|
+
else if (priority) {
|
|
192
|
+
command.push(`*:${priority}`);
|
|
193
|
+
}
|
|
194
|
+
debugLog("Spawning adb logcat process", { command: `adb ${command.join(" ")}` });
|
|
195
|
+
// Запуск процесса
|
|
196
|
+
const child = spawn("adb", command);
|
|
197
|
+
let logBuffer = "";
|
|
198
|
+
const MAX_BUFFER_SIZE = 10 * 1024 * 1024; // 10MB limit
|
|
199
|
+
// Таймаут безопасности
|
|
200
|
+
const timeout = setTimeout(() => {
|
|
201
|
+
debugLog("Capture timeout reached", { timeoutMs, stopPattern, bufferSize: logBuffer.length });
|
|
202
|
+
cleanup();
|
|
203
|
+
resolve(logBuffer +
|
|
204
|
+
`\n\n[MCP] Timeout reached (${timeoutMs}ms). Stop pattern "${stopPattern}" not found.`);
|
|
205
|
+
}, timeoutMs);
|
|
206
|
+
function cleanup() {
|
|
207
|
+
clearTimeout(timeout);
|
|
208
|
+
if (child && !child.killed) {
|
|
209
|
+
child.kill();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Обработка stdout
|
|
213
|
+
child.stdout.on("data", (data) => {
|
|
214
|
+
const chunk = data.toString("utf8");
|
|
215
|
+
// Проверка размера буфера
|
|
216
|
+
if (logBuffer.length + chunk.length > MAX_BUFFER_SIZE) {
|
|
217
|
+
debugLog("Buffer size limit reached", { bufferSize: logBuffer.length, maxSize: MAX_BUFFER_SIZE });
|
|
218
|
+
cleanup();
|
|
219
|
+
resolve(logBuffer +
|
|
220
|
+
`\n\n[MCP] Buffer size limit (10MB) reached. Stopping capture.`);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
logBuffer += chunk;
|
|
224
|
+
debugLog("Received log chunk", { chunkLength: chunk.length, totalBufferSize: logBuffer.length });
|
|
225
|
+
// Проверка на стоп-слово
|
|
226
|
+
if (regex.test(chunk)) {
|
|
227
|
+
debugLog("Stop pattern matched", { stopPattern, matchedChunk: chunk.substring(0, 200) });
|
|
228
|
+
cleanup();
|
|
229
|
+
resolve(logBuffer);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
// Обработка stderr
|
|
233
|
+
child.stderr.on("data", (data) => {
|
|
234
|
+
const errorChunk = data.toString("utf8");
|
|
235
|
+
// Логируем ошибки adb, но не прерываем процесс
|
|
236
|
+
// (adb может писать в stderr даже при нормальной работе)
|
|
237
|
+
if (errorChunk.includes("error") || errorChunk.includes("Error")) {
|
|
238
|
+
logBuffer += `\n[ADB stderr]: ${errorChunk}`;
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
// Обработка ошибок запуска процесса
|
|
242
|
+
child.on("error", (err) => {
|
|
243
|
+
cleanup();
|
|
244
|
+
reject(new AdbError(`Failed to spawn adb process: ${err.message}`, null, err.message));
|
|
245
|
+
});
|
|
246
|
+
// Обработка завершения процесса (неожиданное)
|
|
247
|
+
child.on("exit", (code, signal) => {
|
|
248
|
+
cleanup();
|
|
249
|
+
if (code !== null && code !== 0) {
|
|
250
|
+
reject(new AdbError(`adb logcat process exited with code ${code}`, code, `Process terminated with signal: ${signal || "unknown"}`));
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
// Процесс завершился нормально (редкий случай)
|
|
254
|
+
resolve(logBuffer + `\n\n[MCP] Process exited normally before stop pattern was found.`);
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Выполняет uiautomator dump и возвращает XML
|
|
261
|
+
* @returns XML строка с иерархией View
|
|
262
|
+
* @throws AdbError если команда не может быть выполнена
|
|
263
|
+
*/
|
|
264
|
+
export async function dumpViewHierarchy() {
|
|
265
|
+
debugLog("dumpViewHierarchy started");
|
|
266
|
+
// Сначала дампим на устройство (надежнее, чем exec-out для больших деревьев)
|
|
267
|
+
const dumpPath = "/sdcard/window_dump.xml";
|
|
268
|
+
try {
|
|
269
|
+
// Выполняем dump на устройстве
|
|
270
|
+
await execAdb(["shell", "uiautomator", "dump", dumpPath]);
|
|
271
|
+
debugLog("uiautomator dump completed on device");
|
|
272
|
+
// Читаем результат через cat
|
|
273
|
+
const result = await execAdb(["shell", "cat", dumpPath]);
|
|
274
|
+
debugLog("dumpViewHierarchy completed", { outputLength: result.stdout?.length || 0 });
|
|
275
|
+
return result.stdout;
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
debugLog("dumpViewHierarchy failed", { error: error instanceof Error ? error.message : String(error) });
|
|
279
|
+
if (error instanceof AdbError) {
|
|
280
|
+
throw error;
|
|
281
|
+
}
|
|
282
|
+
throw new AdbError("Failed to dump view hierarchy", null, error instanceof Error ? error.message : String(error));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Простой парсер XML для uiautomator dump
|
|
287
|
+
* Парсит XML в дерево узлов без использования внешних библиотек
|
|
288
|
+
*/
|
|
289
|
+
function parseSimpleXml(xml) {
|
|
290
|
+
debugLog("parseSimpleXml started", { xmlLength: xml.length });
|
|
291
|
+
// Удаляем XML декларацию и комментарии
|
|
292
|
+
let cleaned = xml.replace(/<\?xml[^?]*\?>/g, "");
|
|
293
|
+
cleaned = cleaned.replace(/<!--[\s\S]*?-->/g, "");
|
|
294
|
+
// Находим корневой элемент
|
|
295
|
+
const rootMatch = cleaned.match(/<hierarchy[^>]*>([\s\S]*)<\/hierarchy>/);
|
|
296
|
+
if (!rootMatch) {
|
|
297
|
+
throw new AdbError("Invalid uiautomator dump XML: missing root hierarchy element", null, "");
|
|
298
|
+
}
|
|
299
|
+
const rootContent = rootMatch[1];
|
|
300
|
+
function parseNode(content, depth = 0) {
|
|
301
|
+
const nodes = [];
|
|
302
|
+
let pos = 0;
|
|
303
|
+
while (pos < content.length) {
|
|
304
|
+
// Пропускаем пробелы и переводы строк
|
|
305
|
+
const wsMatch = content.slice(pos).match(/^\s*/);
|
|
306
|
+
if (wsMatch) {
|
|
307
|
+
pos += wsMatch[0].length;
|
|
308
|
+
}
|
|
309
|
+
if (pos >= content.length) {
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
// Ищем открывающий тег
|
|
313
|
+
const openTagMatch = content.slice(pos).match(/^<(\w+)([^>]*)>/);
|
|
314
|
+
if (!openTagMatch) {
|
|
315
|
+
// Если тег не найден, пропускаем остаток
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
const fullMatch = openTagMatch[0];
|
|
319
|
+
const tagName = openTagMatch[1];
|
|
320
|
+
const attrsStr = openTagMatch[2];
|
|
321
|
+
const tagStart = pos;
|
|
322
|
+
pos += fullMatch.length;
|
|
323
|
+
// Парсим атрибуты
|
|
324
|
+
const attributes = {};
|
|
325
|
+
const attrRegex = /(\w+)=["']([^"']*)["']/g;
|
|
326
|
+
let attrMatch;
|
|
327
|
+
while ((attrMatch = attrRegex.exec(attrsStr)) !== null) {
|
|
328
|
+
attributes[attrMatch[1]] = attrMatch[2];
|
|
329
|
+
}
|
|
330
|
+
// Находим закрывающий тег
|
|
331
|
+
const closeTag = `</${tagName}>`;
|
|
332
|
+
const closeTagPos = content.indexOf(closeTag, pos);
|
|
333
|
+
if (closeTagPos === -1) {
|
|
334
|
+
// Самозакрывающийся тег или ошибка
|
|
335
|
+
nodes.push({ name: tagName, attributes, children: [] });
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
// Извлекаем содержимое между тегами
|
|
339
|
+
const innerContent = content.slice(pos, closeTagPos);
|
|
340
|
+
// Рекурсивно парсим дочерние узлы
|
|
341
|
+
const children = parseNode(innerContent, depth + 1);
|
|
342
|
+
nodes.push({ name: tagName, attributes, children });
|
|
343
|
+
pos = closeTagPos + closeTag.length;
|
|
344
|
+
}
|
|
345
|
+
return nodes;
|
|
346
|
+
}
|
|
347
|
+
const parsedRoots = parseNode(rootContent);
|
|
348
|
+
if (parsedRoots.length === 0) {
|
|
349
|
+
throw new AdbError("Invalid uiautomator dump XML: empty hierarchy", null, "");
|
|
350
|
+
}
|
|
351
|
+
// Возвращаем первый корневой узел
|
|
352
|
+
debugLog("parseSimpleXml completed", { rootCount: parsedRoots.length });
|
|
353
|
+
return parsedRoots[0];
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Парсит XML иерархии View в оптимизированное для AI дерево
|
|
357
|
+
* @param xml - XML строка от uiautomator dump
|
|
358
|
+
* @param options - Опции парсинга
|
|
359
|
+
* @returns Оптимизированное дерево View
|
|
360
|
+
*/
|
|
361
|
+
export function parseViewHierarchyXml(xml, options) {
|
|
362
|
+
debugLog("parseViewHierarchyXml started", { includeInvisible: options.includeInvisible, compact: options.compact });
|
|
363
|
+
const rootNode = parseSimpleXml(xml);
|
|
364
|
+
function shouldKeepNode(node) {
|
|
365
|
+
const attrs = node.attributes;
|
|
366
|
+
// В компактном режиме фильтруем пустые контейнеры
|
|
367
|
+
if (options.compact && !options.includeInvisible) {
|
|
368
|
+
return !!(attrs.text ||
|
|
369
|
+
attrs["content-desc"] ||
|
|
370
|
+
attrs["resource-id"] ||
|
|
371
|
+
attrs.clickable === "true");
|
|
372
|
+
}
|
|
373
|
+
return true;
|
|
374
|
+
}
|
|
375
|
+
function parseNode(node) {
|
|
376
|
+
if (!shouldKeepNode(node)) {
|
|
377
|
+
// В компактном режиме проверяем, есть ли полезные дочерние узлы
|
|
378
|
+
if (options.compact) {
|
|
379
|
+
for (const child of node.children) {
|
|
380
|
+
if (shouldKeepNode(child)) {
|
|
381
|
+
// Есть полезный дочерний элемент, сохраняем контейнер
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// Если все потомки пустые, пропускаем этот узел
|
|
386
|
+
let hasUsefulChild = false;
|
|
387
|
+
for (const child of node.children) {
|
|
388
|
+
if (parseNode(child)) {
|
|
389
|
+
hasUsefulChild = true;
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
if (!hasUsefulChild) {
|
|
394
|
+
return null;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
// В non-compact режиме сохраняем всё
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
const attrs = node.attributes;
|
|
402
|
+
// Берём имя класса из атрибута или из имени узла
|
|
403
|
+
const fullClassName = attrs.class || node.name || "View";
|
|
404
|
+
const result = {
|
|
405
|
+
class: fullClassName.split(".").pop() || "View",
|
|
406
|
+
};
|
|
407
|
+
// Добавляем bounds (полезно для понимания позиций)
|
|
408
|
+
if (attrs.bounds) {
|
|
409
|
+
result.bounds = attrs.bounds;
|
|
410
|
+
}
|
|
411
|
+
// Добавляем resource-id (только имя, без пакета)
|
|
412
|
+
if (attrs["resource-id"]) {
|
|
413
|
+
const idParts = attrs["resource-id"].split("/");
|
|
414
|
+
result.id = idParts[idParts.length - 1];
|
|
415
|
+
}
|
|
416
|
+
// Добавляем текст
|
|
417
|
+
if (attrs.text) {
|
|
418
|
+
result.text = attrs.text;
|
|
419
|
+
}
|
|
420
|
+
// Добавляем content-desc
|
|
421
|
+
if (attrs["content-desc"]) {
|
|
422
|
+
result.desc = attrs["content-desc"];
|
|
423
|
+
}
|
|
424
|
+
// Добавляем clickable флаг
|
|
425
|
+
if (attrs.clickable === "true") {
|
|
426
|
+
result.clickable = true;
|
|
427
|
+
}
|
|
428
|
+
// Рекурсивно обрабатываем дочерние узлы
|
|
429
|
+
const children = [];
|
|
430
|
+
for (const child of node.children) {
|
|
431
|
+
const parsedChild = parseNode(child);
|
|
432
|
+
if (parsedChild) {
|
|
433
|
+
children.push(parsedChild);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (children.length > 0) {
|
|
437
|
+
result.children = children;
|
|
438
|
+
}
|
|
439
|
+
return result;
|
|
440
|
+
}
|
|
441
|
+
const parsed = parseNode(rootNode);
|
|
442
|
+
if (!parsed) {
|
|
443
|
+
// Если всё отфильтровано, возвращаем минимальный узел
|
|
444
|
+
return {
|
|
445
|
+
class: "Root",
|
|
446
|
+
children: []
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
debugLog("parseViewHierarchyXml completed");
|
|
450
|
+
return parsed;
|
|
451
|
+
}
|
|
452
|
+
// ============================================================================
|
|
453
|
+
// Screenshot Capture
|
|
454
|
+
// ============================================================================
|
|
455
|
+
let OUTPUT_DIR = null;
|
|
456
|
+
export function setOutputDir(dir) {
|
|
457
|
+
OUTPUT_DIR = dir;
|
|
458
|
+
}
|
|
459
|
+
export function getOutputDir() {
|
|
460
|
+
if (OUTPUT_DIR) {
|
|
461
|
+
return OUTPUT_DIR;
|
|
462
|
+
}
|
|
463
|
+
// Дефолт: .droid-mcp/screenshots внутри проекта
|
|
464
|
+
const defaultDir = join(process.cwd(), ".droid-mcp", "screenshots");
|
|
465
|
+
// Логируем warning если используется дефолт
|
|
466
|
+
console.error(`[MCP] Warning: No output directory configured. Using default: ${defaultDir}`);
|
|
467
|
+
console.error(`[MCP] To set output directory, pass --output-dir argument or DROID_MCP_OUTPUT_DIR env var`);
|
|
468
|
+
return defaultDir;
|
|
469
|
+
}
|
|
470
|
+
async function ensureOutputDir() {
|
|
471
|
+
const dir = getOutputDir();
|
|
472
|
+
await mkdir(dir, { recursive: true });
|
|
473
|
+
return dir;
|
|
474
|
+
}
|
|
475
|
+
async function cleanupOldScreenshots() {
|
|
476
|
+
try {
|
|
477
|
+
const dir = getOutputDir();
|
|
478
|
+
const files = await readdir(dir).catch(() => []);
|
|
479
|
+
const now = Date.now();
|
|
480
|
+
const maxAge = 60 * 60 * 1000; // 1 час
|
|
481
|
+
for (const file of files) {
|
|
482
|
+
if (!file.startsWith("screenshot_"))
|
|
483
|
+
continue;
|
|
484
|
+
const filePath = join(dir, file);
|
|
485
|
+
const stats = await stat(filePath).catch(() => null);
|
|
486
|
+
if (!stats)
|
|
487
|
+
continue;
|
|
488
|
+
if (now - stats.mtimeMs > maxAge) {
|
|
489
|
+
await rm(filePath);
|
|
490
|
+
debugLog("Cleaned up old screenshot", { file });
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
catch (error) {
|
|
495
|
+
// Ignore cleanup errors
|
|
496
|
+
debugLog("Cleanup failed (non-critical)", { error });
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
export async function captureScreenshot(options) {
|
|
500
|
+
debugLog("captureScreenshot started", { format: options.format, scale: options.scale, output: options.output });
|
|
501
|
+
try {
|
|
502
|
+
// 1. Получаем raw PNG через ADB
|
|
503
|
+
const pngBuffer = await captureScreenshotRaw();
|
|
504
|
+
debugLog("Raw screenshot captured", { size: pngBuffer.length });
|
|
505
|
+
// 2. Получаем метаданные и масштабируем
|
|
506
|
+
const metadata = await sharp(pngBuffer).metadata();
|
|
507
|
+
const originalWidth = metadata.width || 1080;
|
|
508
|
+
const originalHeight = metadata.height || 1920;
|
|
509
|
+
const targetWidth = Math.round(originalWidth * options.scale);
|
|
510
|
+
const targetHeight = Math.round(originalHeight * options.scale);
|
|
511
|
+
debugLog("Processing image", {
|
|
512
|
+
original: `${originalWidth}x${originalHeight}`,
|
|
513
|
+
target: `${targetWidth}x${targetHeight}`
|
|
514
|
+
});
|
|
515
|
+
// 3. Конвертируем через sharp
|
|
516
|
+
let pipeline = sharp(pngBuffer).resize(targetWidth, targetHeight);
|
|
517
|
+
if (options.format === "webp") {
|
|
518
|
+
pipeline = pipeline.webp({ quality: options.quality });
|
|
519
|
+
}
|
|
520
|
+
const processedBuffer = await pipeline.toBuffer();
|
|
521
|
+
debugLog("Screenshot processed", { size: processedBuffer.length, format: options.format });
|
|
522
|
+
// 4. Базовый результат
|
|
523
|
+
const baseResult = {
|
|
524
|
+
format: options.format,
|
|
525
|
+
size: processedBuffer.length,
|
|
526
|
+
sizeKb: Math.round(processedBuffer.length / 1024),
|
|
527
|
+
width: targetWidth,
|
|
528
|
+
height: targetHeight,
|
|
529
|
+
originalWidth,
|
|
530
|
+
originalHeight,
|
|
531
|
+
scaled: targetWidth !== originalWidth,
|
|
532
|
+
};
|
|
533
|
+
// 5. Возвращаем в зависимости от output режима
|
|
534
|
+
if (options.output === "base64") {
|
|
535
|
+
const base64 = processedBuffer.toString("base64");
|
|
536
|
+
return {
|
|
537
|
+
...baseResult,
|
|
538
|
+
data: base64,
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
// 6. Сохраняем в файл
|
|
542
|
+
await ensureOutputDir();
|
|
543
|
+
await cleanupOldScreenshots();
|
|
544
|
+
const timestamp = new Date().toISOString()
|
|
545
|
+
.replace(/[:.]/g, "-")
|
|
546
|
+
.replace("T", "_")
|
|
547
|
+
.slice(0, 19);
|
|
548
|
+
const filename = `screenshot_${timestamp}.${options.format}`;
|
|
549
|
+
const filePath = resolve(await ensureOutputDir(), filename);
|
|
550
|
+
await writeFile(filePath, processedBuffer);
|
|
551
|
+
debugLog("Screenshot saved", { filePath });
|
|
552
|
+
return {
|
|
553
|
+
...baseResult,
|
|
554
|
+
filePath, // абсолютный путь
|
|
555
|
+
relativePath: filename, // для удобства
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
catch (error) {
|
|
559
|
+
debugLog("captureScreenshot failed", { error: error instanceof Error ? error.message : String(error) });
|
|
560
|
+
throw new AdbError(`Failed to capture screenshot: ${error instanceof Error ? error.message : String(error)}`, null, "");
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
async function captureScreenshotRaw() {
|
|
564
|
+
debugLog("Capturing raw screenshot via ADB");
|
|
565
|
+
try {
|
|
566
|
+
const { stdout } = await execAsync("adb exec-out screencap -p", {
|
|
567
|
+
maxBuffer: 20 * 1024 * 1024,
|
|
568
|
+
encoding: null,
|
|
569
|
+
});
|
|
570
|
+
// Исправляем \r\n на Windows
|
|
571
|
+
const fixedBuffer = Buffer.from(stdout.toString().replace(/\r\n/g, "\n"), "binary");
|
|
572
|
+
debugLog("Raw screenshot captured", { size: fixedBuffer.length });
|
|
573
|
+
return fixedBuffer;
|
|
574
|
+
}
|
|
575
|
+
catch (error) {
|
|
576
|
+
throw new AdbError("Failed to capture screenshot via ADB", null, error instanceof Error ? error.message : String(error));
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=adb.js.map
|
package/dist/adb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adb.js","sourceRoot":"","sources":["../src/adb.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|