deepadb 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.
- package/LICENSE +21 -0
- package/README.md +631 -0
- package/build/bridge/adb-bridge.d.ts +65 -0
- package/build/bridge/adb-bridge.d.ts.map +1 -0
- package/build/bridge/adb-bridge.js +164 -0
- package/build/bridge/adb-bridge.js.map +1 -0
- package/build/bridge/device-manager.d.ts +41 -0
- package/build/bridge/device-manager.d.ts.map +1 -0
- package/build/bridge/device-manager.js +109 -0
- package/build/bridge/device-manager.js.map +1 -0
- package/build/bridge/local-bridge.d.ts +92 -0
- package/build/bridge/local-bridge.d.ts.map +1 -0
- package/build/bridge/local-bridge.js +345 -0
- package/build/bridge/local-bridge.js.map +1 -0
- package/build/config/config.d.ts +39 -0
- package/build/config/config.d.ts.map +1 -0
- package/build/config/config.js +84 -0
- package/build/config/config.js.map +1 -0
- package/build/graphql-api.d.ts +36 -0
- package/build/graphql-api.d.ts.map +1 -0
- package/build/graphql-api.js +296 -0
- package/build/graphql-api.js.map +1 -0
- package/build/http-transport.d.ts +26 -0
- package/build/http-transport.d.ts.map +1 -0
- package/build/http-transport.js +105 -0
- package/build/http-transport.js.map +1 -0
- package/build/index.d.ts +14 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +66 -0
- package/build/index.js.map +1 -0
- package/build/middleware/chipset.d.ts +29 -0
- package/build/middleware/chipset.d.ts.map +1 -0
- package/build/middleware/chipset.js +123 -0
- package/build/middleware/chipset.js.map +1 -0
- package/build/middleware/cleanup.d.ts +24 -0
- package/build/middleware/cleanup.d.ts.map +1 -0
- package/build/middleware/cleanup.js +53 -0
- package/build/middleware/cleanup.js.map +1 -0
- package/build/middleware/fetch-utils.d.ts +19 -0
- package/build/middleware/fetch-utils.d.ts.map +1 -0
- package/build/middleware/fetch-utils.js +64 -0
- package/build/middleware/fetch-utils.js.map +1 -0
- package/build/middleware/logger.d.ts +17 -0
- package/build/middleware/logger.d.ts.map +1 -0
- package/build/middleware/logger.js +38 -0
- package/build/middleware/logger.js.map +1 -0
- package/build/middleware/output-processor.d.ts +57 -0
- package/build/middleware/output-processor.d.ts.map +1 -0
- package/build/middleware/output-processor.js +162 -0
- package/build/middleware/output-processor.js.map +1 -0
- package/build/middleware/sanitize.d.ts +30 -0
- package/build/middleware/sanitize.d.ts.map +1 -0
- package/build/middleware/sanitize.js +46 -0
- package/build/middleware/sanitize.js.map +1 -0
- package/build/middleware/security.d.ts +52 -0
- package/build/middleware/security.d.ts.map +1 -0
- package/build/middleware/security.js +123 -0
- package/build/middleware/security.js.map +1 -0
- package/build/middleware/ui-dump.d.ts +23 -0
- package/build/middleware/ui-dump.d.ts.map +1 -0
- package/build/middleware/ui-dump.js +59 -0
- package/build/middleware/ui-dump.js.map +1 -0
- package/build/server.d.ts +18 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +133 -0
- package/build/server.js.map +1 -0
- package/build/tool-context.d.ts +22 -0
- package/build/tool-context.d.ts.map +1 -0
- package/build/tool-context.js +9 -0
- package/build/tool-context.js.map +1 -0
- package/build/tools/accessibility.d.ts +10 -0
- package/build/tools/accessibility.d.ts.map +1 -0
- package/build/tools/accessibility.js +259 -0
- package/build/tools/accessibility.js.map +1 -0
- package/build/tools/at-commands.d.ts +20 -0
- package/build/tools/at-commands.d.ts.map +1 -0
- package/build/tools/at-commands.js +378 -0
- package/build/tools/at-commands.js.map +1 -0
- package/build/tools/baseband.d.ts +15 -0
- package/build/tools/baseband.d.ts.map +1 -0
- package/build/tools/baseband.js +323 -0
- package/build/tools/baseband.js.map +1 -0
- package/build/tools/build.d.ts +6 -0
- package/build/tools/build.d.ts.map +1 -0
- package/build/tools/build.js +80 -0
- package/build/tools/build.js.map +1 -0
- package/build/tools/ci.d.ts +9 -0
- package/build/tools/ci.d.ts.map +1 -0
- package/build/tools/ci.js +163 -0
- package/build/tools/ci.js.map +1 -0
- package/build/tools/control.d.ts +10 -0
- package/build/tools/control.d.ts.map +1 -0
- package/build/tools/control.js +197 -0
- package/build/tools/control.js.map +1 -0
- package/build/tools/device-farm.d.ts +10 -0
- package/build/tools/device-farm.d.ts.map +1 -0
- package/build/tools/device-farm.js +140 -0
- package/build/tools/device-farm.js.map +1 -0
- package/build/tools/device-profiles.d.ts +16 -0
- package/build/tools/device-profiles.d.ts.map +1 -0
- package/build/tools/device-profiles.js +272 -0
- package/build/tools/device-profiles.js.map +1 -0
- package/build/tools/device.d.ts +6 -0
- package/build/tools/device.d.ts.map +1 -0
- package/build/tools/device.js +72 -0
- package/build/tools/device.js.map +1 -0
- package/build/tools/diagnostics.d.ts +7 -0
- package/build/tools/diagnostics.d.ts.map +1 -0
- package/build/tools/diagnostics.js +153 -0
- package/build/tools/diagnostics.js.map +1 -0
- package/build/tools/emulator.d.ts +9 -0
- package/build/tools/emulator.d.ts.map +1 -0
- package/build/tools/emulator.js +223 -0
- package/build/tools/emulator.js.map +1 -0
- package/build/tools/files.d.ts +6 -0
- package/build/tools/files.d.ts.map +1 -0
- package/build/tools/files.js +78 -0
- package/build/tools/files.js.map +1 -0
- package/build/tools/firmware-analysis.d.ts +24 -0
- package/build/tools/firmware-analysis.d.ts.map +1 -0
- package/build/tools/firmware-analysis.js +623 -0
- package/build/tools/firmware-analysis.js.map +1 -0
- package/build/tools/forwarding.d.ts +7 -0
- package/build/tools/forwarding.d.ts.map +1 -0
- package/build/tools/forwarding.js +64 -0
- package/build/tools/forwarding.js.map +1 -0
- package/build/tools/health.d.ts +7 -0
- package/build/tools/health.d.ts.map +1 -0
- package/build/tools/health.js +112 -0
- package/build/tools/health.js.map +1 -0
- package/build/tools/logcat-watch.d.ts +11 -0
- package/build/tools/logcat-watch.d.ts.map +1 -0
- package/build/tools/logcat-watch.js +209 -0
- package/build/tools/logcat-watch.js.map +1 -0
- package/build/tools/logs.d.ts +6 -0
- package/build/tools/logs.d.ts.map +1 -0
- package/build/tools/logs.js +83 -0
- package/build/tools/logs.js.map +1 -0
- package/build/tools/mirroring.d.ts +14 -0
- package/build/tools/mirroring.d.ts.map +1 -0
- package/build/tools/mirroring.js +243 -0
- package/build/tools/mirroring.js.map +1 -0
- package/build/tools/multi-device.d.ts +9 -0
- package/build/tools/multi-device.d.ts.map +1 -0
- package/build/tools/multi-device.js +138 -0
- package/build/tools/multi-device.js.map +1 -0
- package/build/tools/network-capture.d.ts +10 -0
- package/build/tools/network-capture.d.ts.map +1 -0
- package/build/tools/network-capture.js +143 -0
- package/build/tools/network-capture.js.map +1 -0
- package/build/tools/network-discovery.d.ts +21 -0
- package/build/tools/network-discovery.d.ts.map +1 -0
- package/build/tools/network-discovery.js +284 -0
- package/build/tools/network-discovery.js.map +1 -0
- package/build/tools/ota-monitor.d.ts +16 -0
- package/build/tools/ota-monitor.d.ts.map +1 -0
- package/build/tools/ota-monitor.js +211 -0
- package/build/tools/ota-monitor.js.map +1 -0
- package/build/tools/packages.d.ts +6 -0
- package/build/tools/packages.d.ts.map +1 -0
- package/build/tools/packages.js +237 -0
- package/build/tools/packages.js.map +1 -0
- package/build/tools/plugins.d.ts +22 -0
- package/build/tools/plugins.d.ts.map +1 -0
- package/build/tools/plugins.js +118 -0
- package/build/tools/plugins.js.map +1 -0
- package/build/tools/prompts.d.ts +9 -0
- package/build/tools/prompts.d.ts.map +1 -0
- package/build/tools/prompts.js +94 -0
- package/build/tools/prompts.js.map +1 -0
- package/build/tools/qemu.d.ts +18 -0
- package/build/tools/qemu.d.ts.map +1 -0
- package/build/tools/qemu.js +791 -0
- package/build/tools/qemu.js.map +1 -0
- package/build/tools/registry.d.ts +13 -0
- package/build/tools/registry.d.ts.map +1 -0
- package/build/tools/registry.js +221 -0
- package/build/tools/registry.js.map +1 -0
- package/build/tools/regression.d.ts +10 -0
- package/build/tools/regression.d.ts.map +1 -0
- package/build/tools/regression.js +215 -0
- package/build/tools/regression.js.map +1 -0
- package/build/tools/resources.d.ts +10 -0
- package/build/tools/resources.d.ts.map +1 -0
- package/build/tools/resources.js +77 -0
- package/build/tools/resources.js.map +1 -0
- package/build/tools/ril-intercept.d.ts +24 -0
- package/build/tools/ril-intercept.d.ts.map +1 -0
- package/build/tools/ril-intercept.js +273 -0
- package/build/tools/ril-intercept.js.map +1 -0
- package/build/tools/screen-record.d.ts +9 -0
- package/build/tools/screen-record.d.ts.map +1 -0
- package/build/tools/screen-record.js +95 -0
- package/build/tools/screen-record.js.map +1 -0
- package/build/tools/screenshot-diff.d.ts +13 -0
- package/build/tools/screenshot-diff.d.ts.map +1 -0
- package/build/tools/screenshot-diff.js +370 -0
- package/build/tools/screenshot-diff.js.map +1 -0
- package/build/tools/selinux-audit.d.ts +17 -0
- package/build/tools/selinux-audit.d.ts.map +1 -0
- package/build/tools/selinux-audit.js +301 -0
- package/build/tools/selinux-audit.js.map +1 -0
- package/build/tools/shell.d.ts +6 -0
- package/build/tools/shell.d.ts.map +1 -0
- package/build/tools/shell.js +63 -0
- package/build/tools/shell.js.map +1 -0
- package/build/tools/snapshot.d.ts +9 -0
- package/build/tools/snapshot.d.ts.map +1 -0
- package/build/tools/snapshot.js +192 -0
- package/build/tools/snapshot.js.map +1 -0
- package/build/tools/split-apk.d.ts +13 -0
- package/build/tools/split-apk.d.ts.map +1 -0
- package/build/tools/split-apk.js +229 -0
- package/build/tools/split-apk.js.map +1 -0
- package/build/tools/test-gen.d.ts +14 -0
- package/build/tools/test-gen.d.ts.map +1 -0
- package/build/tools/test-gen.js +252 -0
- package/build/tools/test-gen.js.map +1 -0
- package/build/tools/testing.d.ts +9 -0
- package/build/tools/testing.d.ts.map +1 -0
- package/build/tools/testing.js +144 -0
- package/build/tools/testing.js.map +1 -0
- package/build/tools/thermal-power.d.ts +19 -0
- package/build/tools/thermal-power.d.ts.map +1 -0
- package/build/tools/thermal-power.js +330 -0
- package/build/tools/thermal-power.js.map +1 -0
- package/build/tools/ui.d.ts +6 -0
- package/build/tools/ui.d.ts.map +1 -0
- package/build/tools/ui.js +266 -0
- package/build/tools/ui.js.map +1 -0
- package/build/tools/wireless.d.ts +7 -0
- package/build/tools/wireless.d.ts.map +1 -0
- package/build/tools/wireless.js +78 -0
- package/build/tools/wireless.js.map +1 -0
- package/build/tools/workflow-market.d.ts +17 -0
- package/build/tools/workflow-market.d.ts.map +1 -0
- package/build/tools/workflow-market.js +237 -0
- package/build/tools/workflow-market.js.map +1 -0
- package/build/tools/workflow.d.ts +32 -0
- package/build/tools/workflow.d.ts.map +1 -0
- package/build/tools/workflow.js +374 -0
- package/build/tools/workflow.js.map +1 -0
- package/build/ws-transport.d.ts +30 -0
- package/build/ws-transport.d.ts.map +1 -0
- package/build/ws-transport.js +133 -0
- package/build/ws-transport.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Tools — Screenshots, input events, activity inspection, and UI hierarchy analysis.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { join, basename } from "path";
|
|
6
|
+
import { OutputProcessor } from "../middleware/output-processor.js";
|
|
7
|
+
import { shellEscape } from "../middleware/sanitize.js";
|
|
8
|
+
import { captureUiDump, UI_ATTR_REGEXES } from "../middleware/ui-dump.js";
|
|
9
|
+
import { isOnDevice } from "../config/config.js";
|
|
10
|
+
function sanitizeFilename(name) {
|
|
11
|
+
const base = basename(name);
|
|
12
|
+
const sanitized = base.replace(/[^a-zA-Z0-9._-]/g, "_");
|
|
13
|
+
return sanitized || `file_${Date.now()}`;
|
|
14
|
+
}
|
|
15
|
+
export function registerUiTools(ctx) {
|
|
16
|
+
ctx.server.tool("adb_screencap", "Take a screenshot and save to local filesystem. Returns the file path.", {
|
|
17
|
+
filename: z.string().optional().describe("Output filename (default: screenshot_<timestamp>.png)"),
|
|
18
|
+
device: z.string().optional().describe("Device serial"),
|
|
19
|
+
}, async ({ filename, device }) => {
|
|
20
|
+
try {
|
|
21
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
22
|
+
const fname = sanitizeFilename(filename ?? `screenshot_${Date.now()}.png`);
|
|
23
|
+
const localPath = join(ctx.config.tempDir, fname);
|
|
24
|
+
const remoteDir = isOnDevice() ? "/data/local/tmp" : "/sdcard";
|
|
25
|
+
const remotePath = `${remoteDir}/${fname}`;
|
|
26
|
+
try {
|
|
27
|
+
await ctx.bridge.shell(`screencap -p '${shellEscape(remotePath)}'`, { device: resolved.serial, timeout: 15000 });
|
|
28
|
+
await ctx.bridge.exec(["pull", remotePath, localPath], { device: resolved.serial, timeout: 30000 });
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await ctx.bridge.shell(`rm '${shellEscape(remotePath)}'`, { device: resolved.serial, ignoreExitCode: true }).catch(() => { });
|
|
32
|
+
}
|
|
33
|
+
return { content: [{ type: "text", text: `Screenshot saved: ${localPath}` }] };
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
ctx.server.tool("adb_current_activity", "Get the currently focused activity and window stack", { device: z.string().optional().describe("Device serial") }, async ({ device }) => {
|
|
40
|
+
try {
|
|
41
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
42
|
+
const [focused, stack] = await Promise.allSettled([
|
|
43
|
+
ctx.bridge.shell("dumpsys activity activities | grep -E 'mResumedActivity|mFocusedActivity'", {
|
|
44
|
+
device: resolved.serial, ignoreExitCode: true,
|
|
45
|
+
}),
|
|
46
|
+
ctx.bridge.shell("dumpsys activity top | head -20", {
|
|
47
|
+
device: resolved.serial, ignoreExitCode: true,
|
|
48
|
+
}),
|
|
49
|
+
]);
|
|
50
|
+
let output = "=== Focused Activity ===\n";
|
|
51
|
+
output += focused.status === "fulfilled" ? focused.value.stdout.trim() || "(none)" : "unavailable";
|
|
52
|
+
output += "\n\n=== Top Activity ===\n";
|
|
53
|
+
output += stack.status === "fulfilled" ? stack.value.stdout.trim() || "(none)" : "unavailable";
|
|
54
|
+
return { content: [{ type: "text", text: output }] };
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
ctx.server.tool("adb_input", "Send input events to the device (tap, swipe, text, keyevent)", {
|
|
61
|
+
type: z.enum(["tap", "swipe", "text", "keyevent"]).describe("Input type"),
|
|
62
|
+
args: z.string().describe("Arguments: tap='x y', swipe='x1 y1 x2 y2 [duration_ms]', text='string', keyevent='KEYCODE_HOME'"),
|
|
63
|
+
device: z.string().optional().describe("Device serial"),
|
|
64
|
+
}, async ({ type, args, device }) => {
|
|
65
|
+
try {
|
|
66
|
+
// Security check — input commands can execute arbitrary text on device
|
|
67
|
+
const blocked = ctx.security.checkCommand(`input ${type} ${args}`, device);
|
|
68
|
+
if (blocked) {
|
|
69
|
+
return { content: [{ type: "text", text: blocked }], isError: true };
|
|
70
|
+
}
|
|
71
|
+
// Type-specific validation to prevent shell injection via args
|
|
72
|
+
let shellCmd;
|
|
73
|
+
switch (type) {
|
|
74
|
+
case "tap":
|
|
75
|
+
case "swipe":
|
|
76
|
+
// Should only contain digits, spaces, and optional minus sign
|
|
77
|
+
if (!/^[\d\s.-]+$/.test(args)) {
|
|
78
|
+
return { content: [{ type: "text", text: `Invalid ${type} args: must contain only numbers and spaces (got: "${args}")` }], isError: true };
|
|
79
|
+
}
|
|
80
|
+
shellCmd = `input ${type} ${args}`;
|
|
81
|
+
break;
|
|
82
|
+
case "keyevent":
|
|
83
|
+
// Should only contain alphanumeric, underscore, and spaces (for multiple keycodes)
|
|
84
|
+
if (!/^[\w\s]+$/.test(args)) {
|
|
85
|
+
return { content: [{ type: "text", text: `Invalid keyevent args: must contain only alphanumeric characters and underscores (got: "${args}")` }], isError: true };
|
|
86
|
+
}
|
|
87
|
+
shellCmd = `input keyevent ${args}`;
|
|
88
|
+
break;
|
|
89
|
+
case "text":
|
|
90
|
+
// Text can contain anything — must be shell-escaped to prevent injection
|
|
91
|
+
// and to ensure special characters are typed literally on the device
|
|
92
|
+
shellCmd = `input text '${shellEscape(args)}'`;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
96
|
+
const result = await ctx.bridge.shell(shellCmd, {
|
|
97
|
+
device: resolved.serial, ignoreExitCode: true,
|
|
98
|
+
});
|
|
99
|
+
return { content: [{ type: "text", text: result.stdout.trim() || `Input ${type} sent.` }] };
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
ctx.server.tool("adb_start_activity", "Start an activity or app by intent or component name", {
|
|
106
|
+
intent: z.string().describe("Intent or component (e.g., 'com.example/.MainActivity' or '-a android.intent.action.VIEW -d https://example.com')"),
|
|
107
|
+
device: z.string().optional().describe("Device serial"),
|
|
108
|
+
}, async ({ intent, device }) => {
|
|
109
|
+
try {
|
|
110
|
+
// Security check — intents can trigger arbitrary actions
|
|
111
|
+
const blocked = ctx.security.checkCommand(`am start ${intent}`, device);
|
|
112
|
+
if (blocked) {
|
|
113
|
+
return { content: [{ type: "text", text: blocked }], isError: true };
|
|
114
|
+
}
|
|
115
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
116
|
+
const result = await ctx.bridge.shell(`am start ${intent}`, {
|
|
117
|
+
device: resolved.serial, ignoreExitCode: true,
|
|
118
|
+
});
|
|
119
|
+
return { content: [{ type: "text", text: result.stdout.trim() }] };
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
ctx.server.tool("adb_ui_dump", "Dump the current UI hierarchy. Parses the view tree into structured element data with coordinates, text, resource IDs, and interaction flags.", {
|
|
126
|
+
clickableOnly: z.boolean().optional().default(false).describe("Only show clickable/interactive elements"),
|
|
127
|
+
device: z.string().optional().describe("Device serial"),
|
|
128
|
+
}, async ({ clickableOnly, device }) => {
|
|
129
|
+
try {
|
|
130
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
131
|
+
const xml = await captureUiDump(ctx.bridge, resolved.serial);
|
|
132
|
+
if (!xml) {
|
|
133
|
+
return { content: [{ type: "text", text: "Failed to capture UI hierarchy. The screen may be in a state that doesn't support uiautomator dump (e.g., locked, transitioning)." }], isError: true };
|
|
134
|
+
}
|
|
135
|
+
const elements = parseUiNodes(xml, clickableOnly);
|
|
136
|
+
if (elements.length === 0) {
|
|
137
|
+
return { content: [{ type: "text", text: clickableOnly ? "No clickable elements found on screen." : "No UI elements found." }] };
|
|
138
|
+
}
|
|
139
|
+
const output = elements.map((el, i) => formatElement(el, i, true)).join("\n");
|
|
140
|
+
return { content: [{ type: "text", text: `${elements.length} elements:\n\n${OutputProcessor.process(output)}` }] };
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
ctx.server.tool("adb_ui_find", "Search the UI hierarchy for elements matching text, resource-id, or content-description. Returns matching elements with coordinates for precise adb_input targeting.", {
|
|
147
|
+
text: z.string().optional().describe("Match elements containing this text (case-insensitive)"),
|
|
148
|
+
resourceId: z.string().optional().describe("Match elements with this resource-id (partial match)"),
|
|
149
|
+
contentDesc: z.string().optional().describe("Match elements with this content-description (partial, case-insensitive)"),
|
|
150
|
+
device: z.string().optional().describe("Device serial"),
|
|
151
|
+
}, async ({ text, resourceId, contentDesc, device }) => {
|
|
152
|
+
if (!text && !resourceId && !contentDesc) {
|
|
153
|
+
return { content: [{ type: "text", text: "Provide at least one search parameter: text, resourceId, or contentDesc." }], isError: true };
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
157
|
+
const xml = await captureUiDump(ctx.bridge, resolved.serial);
|
|
158
|
+
if (!xml) {
|
|
159
|
+
return { content: [{ type: "text", text: "Failed to capture UI hierarchy." }], isError: true };
|
|
160
|
+
}
|
|
161
|
+
const allElements = parseUiNodes(xml, false);
|
|
162
|
+
const matches = allElements.filter((el) => {
|
|
163
|
+
if (text && !el.text.toLowerCase().includes(text.toLowerCase()))
|
|
164
|
+
return false;
|
|
165
|
+
if (resourceId && !el.resourceId.includes(resourceId))
|
|
166
|
+
return false;
|
|
167
|
+
if (contentDesc && !el.contentDesc.toLowerCase().includes(contentDesc.toLowerCase()))
|
|
168
|
+
return false;
|
|
169
|
+
return true;
|
|
170
|
+
});
|
|
171
|
+
if (matches.length === 0) {
|
|
172
|
+
const criteria = [];
|
|
173
|
+
if (text)
|
|
174
|
+
criteria.push(`text="${text}"`);
|
|
175
|
+
if (resourceId)
|
|
176
|
+
criteria.push(`resourceId="${resourceId}"`);
|
|
177
|
+
if (contentDesc)
|
|
178
|
+
criteria.push(`contentDesc="${contentDesc}"`);
|
|
179
|
+
return { content: [{ type: "text", text: `No elements found matching: ${criteria.join(", ")}` }] };
|
|
180
|
+
}
|
|
181
|
+
const output = matches.map((el, i) => formatElement(el, i, false)).join("\n");
|
|
182
|
+
return { content: [{ type: "text", text: `${matches.length} match(es):\n\n${output}` }] };
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/** Format a UI element for output. `showFlags` includes interaction flags (for dump); omit for find (shows tap coords instead). */
|
|
190
|
+
function formatElement(el, index, showFlags) {
|
|
191
|
+
const parts = [`[${index}]`];
|
|
192
|
+
if (el.resourceId)
|
|
193
|
+
parts.push(`id: ${el.resourceId}`);
|
|
194
|
+
if (el.text)
|
|
195
|
+
parts.push(`text: "${el.text}"`);
|
|
196
|
+
if (el.contentDesc)
|
|
197
|
+
parts.push(`desc: "${el.contentDesc}"`);
|
|
198
|
+
parts.push(`class: ${el.className}`);
|
|
199
|
+
if (showFlags) {
|
|
200
|
+
parts.push(`bounds: [${el.bounds.centerX},${el.bounds.centerY}] (${el.bounds.left},${el.bounds.top})-(${el.bounds.right},${el.bounds.bottom})`);
|
|
201
|
+
const flags = [];
|
|
202
|
+
if (el.clickable)
|
|
203
|
+
flags.push("clickable");
|
|
204
|
+
if (el.scrollable)
|
|
205
|
+
flags.push("scrollable");
|
|
206
|
+
if (el.focusable)
|
|
207
|
+
flags.push("focusable");
|
|
208
|
+
if (el.enabled === false)
|
|
209
|
+
flags.push("disabled");
|
|
210
|
+
if (flags.length)
|
|
211
|
+
parts.push(`[${flags.join(", ")}]`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
parts.push(`tap: ${el.bounds.centerX} ${el.bounds.centerY}`);
|
|
215
|
+
parts.push(`bounds: (${el.bounds.left},${el.bounds.top})-(${el.bounds.right},${el.bounds.bottom})`);
|
|
216
|
+
}
|
|
217
|
+
return parts.join(" | ");
|
|
218
|
+
}
|
|
219
|
+
const ATTR_REGEXES = UI_ATTR_REGEXES;
|
|
220
|
+
/** Parse <node> elements from uiautomator XML dump. */
|
|
221
|
+
function parseUiNodes(xml, clickableOnly) {
|
|
222
|
+
const elements = [];
|
|
223
|
+
const nodeRegex = /<node\s+([^>]+)\/?>/g;
|
|
224
|
+
let match;
|
|
225
|
+
while ((match = nodeRegex.exec(xml)) !== null) {
|
|
226
|
+
const attrs = match[1];
|
|
227
|
+
const get = (name) => {
|
|
228
|
+
const regex = ATTR_REGEXES[name];
|
|
229
|
+
if (!regex)
|
|
230
|
+
return "";
|
|
231
|
+
const m = attrs.match(regex);
|
|
232
|
+
return m ? m[1] : "";
|
|
233
|
+
};
|
|
234
|
+
const clickable = get("clickable") === "true";
|
|
235
|
+
const scrollable = get("scrollable") === "true";
|
|
236
|
+
const focusable = get("focusable") === "true";
|
|
237
|
+
if (clickableOnly && !clickable && !scrollable)
|
|
238
|
+
continue;
|
|
239
|
+
// Parse bounds="[left,top][right,bottom]"
|
|
240
|
+
const boundsStr = get("bounds");
|
|
241
|
+
const boundsMatch = boundsStr.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);
|
|
242
|
+
if (!boundsMatch)
|
|
243
|
+
continue;
|
|
244
|
+
const left = parseInt(boundsMatch[1], 10);
|
|
245
|
+
const top = parseInt(boundsMatch[2], 10);
|
|
246
|
+
const right = parseInt(boundsMatch[3], 10);
|
|
247
|
+
const bottom = parseInt(boundsMatch[4], 10);
|
|
248
|
+
elements.push({
|
|
249
|
+
resourceId: get("resource-id"),
|
|
250
|
+
text: get("text"),
|
|
251
|
+
contentDesc: get("content-desc"),
|
|
252
|
+
className: get("class").replace("android.widget.", "").replace("android.view.", ""),
|
|
253
|
+
clickable,
|
|
254
|
+
scrollable,
|
|
255
|
+
focusable,
|
|
256
|
+
enabled: get("enabled") !== "false",
|
|
257
|
+
bounds: {
|
|
258
|
+
left, top, right, bottom,
|
|
259
|
+
centerX: Math.round((left + right) / 2),
|
|
260
|
+
centerY: Math.round((top + bottom) / 2),
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return elements;
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/tools/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wireless Tools — WiFi-based ADB: pair, connect, disconnect.
|
|
3
|
+
* Enables untethered device interaction for field testing.
|
|
4
|
+
*/
|
|
5
|
+
import { ToolContext } from "../tool-context.js";
|
|
6
|
+
export declare function registerWirelessTools(ctx: ToolContext): void;
|
|
7
|
+
//# sourceMappingURL=wireless.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireless.d.ts","sourceRoot":"","sources":["../../src/tools/wireless.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CA6F5D"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wireless Tools — WiFi-based ADB: pair, connect, disconnect.
|
|
3
|
+
* Enables untethered device interaction for field testing.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { OutputProcessor } from "../middleware/output-processor.js";
|
|
7
|
+
export function registerWirelessTools(ctx) {
|
|
8
|
+
ctx.server.tool("adb_pair", "Pair with a device over WiFi using the pairing code from Developer Options → Wireless debugging → Pair device", {
|
|
9
|
+
host: z.string().describe("Device IP and pairing port (e.g., '192.168.1.100:37123')"),
|
|
10
|
+
code: z.string().describe("6-digit pairing code shown on the device"),
|
|
11
|
+
}, async ({ host, code }) => {
|
|
12
|
+
try {
|
|
13
|
+
const result = await ctx.bridge.exec(["pair", host, code], {
|
|
14
|
+
timeout: 30000,
|
|
15
|
+
retries: 0,
|
|
16
|
+
});
|
|
17
|
+
ctx.deviceManager.invalidateCache();
|
|
18
|
+
const output = result.stdout.trim() || result.stderr.trim();
|
|
19
|
+
return { content: [{ type: "text", text: output || "Pairing initiated." }] };
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
ctx.server.tool("adb_connect", "Connect to a device over WiFi/TCP. Device must be paired first or have TCP/IP enabled.", {
|
|
26
|
+
host: z.string().describe("Device IP and port (e.g., '192.168.1.100:5555' or '192.168.1.100:41567')"),
|
|
27
|
+
}, async ({ host }) => {
|
|
28
|
+
try {
|
|
29
|
+
const result = await ctx.bridge.exec(["connect", host], {
|
|
30
|
+
timeout: 15000,
|
|
31
|
+
retries: 0,
|
|
32
|
+
});
|
|
33
|
+
ctx.deviceManager.invalidateCache();
|
|
34
|
+
return { content: [{ type: "text", text: result.stdout.trim() }] };
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
ctx.server.tool("adb_disconnect", "Disconnect from a wireless device, or all wireless devices if no host specified", {
|
|
41
|
+
host: z.string().optional().describe("Device IP:port to disconnect (omit for all)"),
|
|
42
|
+
}, async ({ host }) => {
|
|
43
|
+
try {
|
|
44
|
+
const args = host ? ["disconnect", host] : ["disconnect"];
|
|
45
|
+
const result = await ctx.bridge.exec(args, { timeout: 10000, retries: 0 });
|
|
46
|
+
ctx.deviceManager.invalidateCache();
|
|
47
|
+
return { content: [{ type: "text", text: result.stdout.trim() || "Disconnected." }] };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
ctx.server.tool("adb_tcpip", "Switch a USB-connected device to TCP/IP mode on the specified port (default 5555). After this, you can disconnect USB and use adb_connect.", {
|
|
54
|
+
port: z.number().min(1).max(65535).optional().default(5555).describe("TCP port for ADB (1-65535, default 5555)"),
|
|
55
|
+
device: z.string().optional().describe("Device serial (must be USB-connected)"),
|
|
56
|
+
}, async ({ port, device }) => {
|
|
57
|
+
try {
|
|
58
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
59
|
+
const result = await ctx.bridge.exec(["tcpip", String(port)], {
|
|
60
|
+
device: resolved.serial,
|
|
61
|
+
timeout: 10000,
|
|
62
|
+
});
|
|
63
|
+
// Get the device IP for convenience
|
|
64
|
+
const ipResult = await ctx.bridge.shell("ip route | grep 'src' | head -1 | awk '{print $NF}'", { device: resolved.serial, ignoreExitCode: true });
|
|
65
|
+
const ip = ipResult.stdout.trim();
|
|
66
|
+
let msg = result.stdout.trim() || `Restarting in TCP mode on port ${port}`;
|
|
67
|
+
if (ip) {
|
|
68
|
+
msg += `\nDevice IP: ${ip}\nConnect with: adb_connect host="${ip}:${port}"`;
|
|
69
|
+
}
|
|
70
|
+
ctx.deviceManager.invalidateCache();
|
|
71
|
+
return { content: [{ type: "text", text: msg }] };
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=wireless.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireless.js","sourceRoot":"","sources":["../../src/tools/wireless.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Marketplace — Community-shared workflow definitions.
|
|
3
|
+
*
|
|
4
|
+
* Extends the plugin registry model to include shareable workflow JSON
|
|
5
|
+
* definitions. Community-contributed test workflows, diagnostic sequences,
|
|
6
|
+
* and audit procedures are hosted in a registry manifest alongside plugins.
|
|
7
|
+
*
|
|
8
|
+
* Workflows are downloaded as JSON files into {tempDir}/workflows/ — the
|
|
9
|
+
* same directory used by the workflow orchestration engine, so installed
|
|
10
|
+
* marketplace workflows are immediately available to adb_workflow_run.
|
|
11
|
+
*
|
|
12
|
+
* Registry: reuses DA_REGISTRY_URL or a dedicated DA_WORKFLOW_REGISTRY_URL.
|
|
13
|
+
* Manifest: JSON array of { name, description, version, url, author, tags }.
|
|
14
|
+
*/
|
|
15
|
+
import { ToolContext } from "../tool-context.js";
|
|
16
|
+
export declare function registerWorkflowMarketTools(ctx: ToolContext): void;
|
|
17
|
+
//# sourceMappingURL=workflow-market.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-market.d.ts","sourceRoot":"","sources":["../../src/tools/workflow-market.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA0CjD,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAoOlE"}
|