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,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Bridge — On-device execution without ADB.
|
|
3
|
+
*
|
|
4
|
+
* Drop-in replacement for AdbBridge when DeepADB runs directly on the Android
|
|
5
|
+
* device (e.g., inside Termux). All commands execute locally via sh/su instead
|
|
6
|
+
* of routing through adb over USB.
|
|
7
|
+
*
|
|
8
|
+
* Extends AdbBridge so it is type-compatible with the entire tool suite —
|
|
9
|
+
* no tool module changes required. The override of exec() is the single
|
|
10
|
+
* interception point; shell() and rootShell() flow through it automatically.
|
|
11
|
+
*
|
|
12
|
+
* Environment detection: see config.ts isOnDevice().
|
|
13
|
+
*/
|
|
14
|
+
import { execFile, spawn } from "child_process";
|
|
15
|
+
import { AdbBridge, AdbError } from "./adb-bridge.js";
|
|
16
|
+
import { config } from "../config/config.js";
|
|
17
|
+
import { shellEscape } from "../middleware/sanitize.js";
|
|
18
|
+
export class LocalBridge extends AdbBridge {
|
|
19
|
+
localLogger;
|
|
20
|
+
deviceInfoCache = null;
|
|
21
|
+
/**
|
|
22
|
+
* Cached root availability. null = not yet checked, true/false = checked.
|
|
23
|
+
* Probed lazily on first command that needs elevation.
|
|
24
|
+
*/
|
|
25
|
+
rootAvailable = null;
|
|
26
|
+
/**
|
|
27
|
+
* Android system commands that require shell-user (uid=2000) or root privileges.
|
|
28
|
+
* In ADB mode, all shell commands run as uid=2000 automatically.
|
|
29
|
+
* In on-device mode (Termux app user), these need su elevation.
|
|
30
|
+
*
|
|
31
|
+
* SECURITY: This is a FROZEN allowlist — hardcoded and immutable.
|
|
32
|
+
* Not configurable via environment variables or runtime API.
|
|
33
|
+
* Only commands explicitly listed here get routed through su.
|
|
34
|
+
*/
|
|
35
|
+
static ELEVATED_COMMANDS = Object.freeze(new Set([
|
|
36
|
+
"settings", // Requires INTERACT_ACROSS_USERS permission
|
|
37
|
+
"dumpsys", // Requires DUMP permission
|
|
38
|
+
"am", // Requires activity manager permissions (force-stop, broadcast)
|
|
39
|
+
"input", // Requires INJECT_EVENTS permission
|
|
40
|
+
"screencap", // Requires framebuffer access + system linker context on Android 16
|
|
41
|
+
"screenrecord", // Requires framebuffer access + system linker context
|
|
42
|
+
"uiautomator", // Requires instrumentation privileges + system linker context
|
|
43
|
+
"app_process", // Used by uiautomator — requires system linker context
|
|
44
|
+
"getenforce", // Requires SELinux status read access
|
|
45
|
+
"setenforce", // Requires SELinux policy write access
|
|
46
|
+
"cmd", // Generic binder command — most subcommands need shell user
|
|
47
|
+
"pm", // Package manager — install, dump, grant need shell-level access
|
|
48
|
+
"wm", // Window manager — display size/density need shell user
|
|
49
|
+
"svc", // Service control — wifi, data, power need shell user
|
|
50
|
+
"ip", // Network route/addr queries require netlink socket access
|
|
51
|
+
"ifconfig", // Network interface info requires similar privileges to ip
|
|
52
|
+
]));
|
|
53
|
+
constructor(logger) {
|
|
54
|
+
super(logger);
|
|
55
|
+
this.localLogger = logger;
|
|
56
|
+
}
|
|
57
|
+
/** Quote a string for safe use as a shell argument (wraps in single quotes with escaping). */
|
|
58
|
+
shellQuote(str) {
|
|
59
|
+
return `'${shellEscape(str)}'`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if root (su) is available. Result is cached after first probe.
|
|
63
|
+
* Uses a fast, side-effect-free check: `su -c id`.
|
|
64
|
+
*/
|
|
65
|
+
async checkRootAvailable() {
|
|
66
|
+
if (this.rootAvailable !== null)
|
|
67
|
+
return this.rootAvailable;
|
|
68
|
+
try {
|
|
69
|
+
const result = await this.execLocal("su -c id", { timeout: 5000, ignoreExitCode: true });
|
|
70
|
+
this.rootAvailable = result.stdout.includes("uid=0");
|
|
71
|
+
if (this.rootAvailable) {
|
|
72
|
+
this.localLogger.info("LocalBridge: root (su) available — privileged commands will be elevated");
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
this.localLogger.info("LocalBridge: root (su) not available — running in unprivileged mode");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
this.rootAvailable = false;
|
|
80
|
+
this.localLogger.info("LocalBridge: root (su) probe failed — running in unprivileged mode");
|
|
81
|
+
}
|
|
82
|
+
return this.rootAvailable;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Wrap a command in `su -c '...'` for privilege elevation.
|
|
86
|
+
* Uses shellEscape() to safely handle single quotes in the inner command.
|
|
87
|
+
* This is the same escaping path used by AdbBridge.rootShell().
|
|
88
|
+
*/
|
|
89
|
+
elevate(command) {
|
|
90
|
+
return `su -c '${shellEscape(command)}'`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Android filesystem paths that require elevated access in on-device mode.
|
|
94
|
+
* Commands referencing these paths need su to bypass scoped storage restrictions.
|
|
95
|
+
* In ADB mode (uid=2000), these paths are accessible by default.
|
|
96
|
+
*/
|
|
97
|
+
static RESTRICTED_PATH_PATTERNS = /\/sdcard\b|\/storage\b|\/system\//;
|
|
98
|
+
/**
|
|
99
|
+
* Check if a shell command needs privilege elevation.
|
|
100
|
+
* Two criteria (either triggers elevation):
|
|
101
|
+
* 1. Command name is in the frozen ELEVATED_COMMANDS allowlist (system tools)
|
|
102
|
+
* 2. Command references restricted filesystem paths (scoped storage bypass)
|
|
103
|
+
*
|
|
104
|
+
* Security note: all commands reaching this point have already been validated
|
|
105
|
+
* by validateShellArg/shellEscape at the tool layer. The su -c '...' wrapper
|
|
106
|
+
* uses shellEscape() to prevent injection within the single-quote context.
|
|
107
|
+
*/
|
|
108
|
+
commandNeedsElevation(command) {
|
|
109
|
+
// Check command name against system tool allowlist
|
|
110
|
+
const firstToken = command.trimStart().split(/\s+/)[0] ?? "";
|
|
111
|
+
// Handle absolute paths: "/system/bin/am" → "am"
|
|
112
|
+
const cmdName = firstToken.includes("/") ? firstToken.split("/").pop() ?? "" : firstToken;
|
|
113
|
+
if (LocalBridge.ELEVATED_COMMANDS.has(cmdName))
|
|
114
|
+
return true;
|
|
115
|
+
// Check if command references restricted paths that need scoped storage bypass
|
|
116
|
+
if (LocalBridge.RESTRICTED_PATH_PATTERNS.test(command))
|
|
117
|
+
return true;
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Execute an "ADB command" locally by translating the subcommand.
|
|
122
|
+
* This is the single interception point — shell(), rootShell(), and all
|
|
123
|
+
* tool calls to exec() flow through here.
|
|
124
|
+
*/
|
|
125
|
+
async exec(args, options = {}) {
|
|
126
|
+
const subcommand = args[0];
|
|
127
|
+
const hasRoot = await this.checkRootAvailable();
|
|
128
|
+
switch (subcommand) {
|
|
129
|
+
case "shell":
|
|
130
|
+
// args = ["shell", "<command>"] — execute the command directly
|
|
131
|
+
// If the command requires system-level privileges and root is available,
|
|
132
|
+
// route through su to match ADB mode behavior (which runs as uid=2000).
|
|
133
|
+
{
|
|
134
|
+
const command = args.slice(1).join(" ");
|
|
135
|
+
if (hasRoot && this.commandNeedsElevation(command)) {
|
|
136
|
+
return this.execLocal(this.elevate(command), options);
|
|
137
|
+
}
|
|
138
|
+
return this.execLocal(command, options);
|
|
139
|
+
}
|
|
140
|
+
case "devices":
|
|
141
|
+
return this.syntheticDeviceList();
|
|
142
|
+
case "version":
|
|
143
|
+
return this.makeResult("DeepADB Local Bridge (on-device mode)");
|
|
144
|
+
case "push":
|
|
145
|
+
// Local → device path. Elevate to write to restricted paths like /sdcard/.
|
|
146
|
+
{
|
|
147
|
+
const pushCmd = `cp -f ${this.shellQuote(args[1])} ${this.shellQuote(args[2])}`;
|
|
148
|
+
return this.execLocal(hasRoot ? this.elevate(pushCmd) : pushCmd, options);
|
|
149
|
+
}
|
|
150
|
+
case "pull":
|
|
151
|
+
// Device → local path. Use su-cat with redirect so the LOCAL file is
|
|
152
|
+
// owned by the Termux user (not root), enabling Node.js to read it back.
|
|
153
|
+
// The > redirect is evaluated by the outer sh (uid=Termux), so the
|
|
154
|
+
// created file inherits the Termux user's ownership.
|
|
155
|
+
if (hasRoot) {
|
|
156
|
+
const pullCmd = `su -c 'cat ${shellEscape(args[1])}' > ${this.shellQuote(args[2])}`;
|
|
157
|
+
return this.execLocal(pullCmd, options);
|
|
158
|
+
}
|
|
159
|
+
return this.execLocal(`cp -f ${this.shellQuote(args[1])} ${this.shellQuote(args[2])}`, options);
|
|
160
|
+
case "install":
|
|
161
|
+
// args = ["install", ...flags, path] → pm install
|
|
162
|
+
// Flags are hardcoded (-r, -d), only the last arg (APK path) needs quoting
|
|
163
|
+
{
|
|
164
|
+
const installCmd = `pm install ${args.slice(1, -1).join(" ")} ${this.shellQuote(args[args.length - 1])}`;
|
|
165
|
+
return this.execLocal(hasRoot ? this.elevate(installCmd) : installCmd, options);
|
|
166
|
+
}
|
|
167
|
+
case "install-multiple":
|
|
168
|
+
// args = ["install-multiple", ...flags, ...paths] → pm install-multiple
|
|
169
|
+
// Flags are hardcoded (-r, -d), paths need quoting
|
|
170
|
+
{
|
|
171
|
+
const imArgs = args.slice(1);
|
|
172
|
+
const flags = imArgs.filter(a => a.startsWith("-"));
|
|
173
|
+
const paths = imArgs.filter(a => !a.startsWith("-"));
|
|
174
|
+
const imCmd = `pm install-multiple ${flags.join(" ")} ${paths.map(p => this.shellQuote(p)).join(" ")}`;
|
|
175
|
+
return this.execLocal(hasRoot ? this.elevate(imCmd) : imCmd, options);
|
|
176
|
+
}
|
|
177
|
+
case "uninstall":
|
|
178
|
+
// args = ["uninstall", ...flags, package] → pm uninstall
|
|
179
|
+
// Package name is validated by validateShellArg before reaching here
|
|
180
|
+
{
|
|
181
|
+
const uninstallCmd = `pm uninstall ${args.slice(1).join(" ")}`;
|
|
182
|
+
return this.execLocal(hasRoot ? this.elevate(uninstallCmd) : uninstallCmd, options);
|
|
183
|
+
}
|
|
184
|
+
case "logcat":
|
|
185
|
+
// args = ["logcat", ...flags] → direct logcat
|
|
186
|
+
return this.execLocal(`logcat ${args.slice(1).join(" ")}`, options);
|
|
187
|
+
case "reboot":
|
|
188
|
+
{
|
|
189
|
+
const rebootCmd = `reboot ${args.slice(1).join(" ")}`.trim();
|
|
190
|
+
return this.execLocal(hasRoot ? this.elevate(rebootCmd) : rebootCmd, options);
|
|
191
|
+
}
|
|
192
|
+
case "forward":
|
|
193
|
+
case "reverse":
|
|
194
|
+
if (args.includes("--list")) {
|
|
195
|
+
return this.makeResult(""); // Empty list — no ADB server
|
|
196
|
+
}
|
|
197
|
+
return this.makeResult(`${subcommand}: not available in on-device mode (no ADB server)`);
|
|
198
|
+
case "connect":
|
|
199
|
+
case "disconnect":
|
|
200
|
+
case "pair":
|
|
201
|
+
case "tcpip":
|
|
202
|
+
case "emu":
|
|
203
|
+
return this.makeResult(`${subcommand}: not applicable in on-device mode (already local)`);
|
|
204
|
+
case "bugreport":
|
|
205
|
+
// ADB mode: "adb bugreport <localPath>" runs bugreportz on-device and pulls to localPath.
|
|
206
|
+
// On-device: bugreportz doesn't accept an output path — it generates a zip at an
|
|
207
|
+
// internal location and prints "OK:<path>" on stdout. We run it, parse the output
|
|
208
|
+
// path, then copy the zip to the requested destination.
|
|
209
|
+
{
|
|
210
|
+
const destPath = args[1]; // The local path the tool expects the zip at
|
|
211
|
+
const bugreportCmd = "bugreportz";
|
|
212
|
+
const bzResult = await this.execLocal(hasRoot ? this.elevate(bugreportCmd) : bugreportCmd, { ...options, ignoreExitCode: true });
|
|
213
|
+
const okMatch = bzResult.stdout.match(/OK:(.+)/);
|
|
214
|
+
if (okMatch && destPath) {
|
|
215
|
+
const generatedPath = okMatch[1].trim();
|
|
216
|
+
const cpCmd = `cp -f ${this.shellQuote(generatedPath)} ${this.shellQuote(destPath)}`;
|
|
217
|
+
const rmCmd = `rm -f ${this.shellQuote(generatedPath)}`;
|
|
218
|
+
await this.execLocal(hasRoot ? this.elevate(cpCmd) : cpCmd, { ignoreExitCode: true });
|
|
219
|
+
await this.execLocal(hasRoot ? this.elevate(rmCmd) : rmCmd, { ignoreExitCode: true });
|
|
220
|
+
}
|
|
221
|
+
return bzResult;
|
|
222
|
+
}
|
|
223
|
+
default:
|
|
224
|
+
// Unknown subcommand — attempt direct execution
|
|
225
|
+
this.localLogger.warn(`LocalBridge: unknown ADB subcommand "${subcommand}", executing as shell`);
|
|
226
|
+
return this.execLocal(args.join(" "), options);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/** Execute a command directly on the local device via sh. */
|
|
230
|
+
execLocal(command, options = {}) {
|
|
231
|
+
const timeout = options.timeout || config.commandTimeout;
|
|
232
|
+
this.localLogger.debug(`local: sh -c ${command.substring(0, 200)}`);
|
|
233
|
+
return new Promise((resolve, reject) => {
|
|
234
|
+
const execOptions = {
|
|
235
|
+
timeout,
|
|
236
|
+
maxBuffer: config.maxOutputSize * 2,
|
|
237
|
+
env: { ...process.env, PATH: `${process.env.PATH}:/system/bin:/vendor/bin` },
|
|
238
|
+
};
|
|
239
|
+
execFile("sh", ["-c", command], execOptions, (error, stdout, stderr) => {
|
|
240
|
+
const bufferExceeded = error?.code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER"
|
|
241
|
+
|| error?.message?.includes("maxBuffer") === true;
|
|
242
|
+
const timedOut = error?.killed === true && !bufferExceeded;
|
|
243
|
+
const exitCode = error?.code != null
|
|
244
|
+
? (typeof error.code === "number" ? error.code : 1)
|
|
245
|
+
: 0;
|
|
246
|
+
const result = {
|
|
247
|
+
stdout: stdout?.toString() ?? "",
|
|
248
|
+
stderr: stderr?.toString() ?? "",
|
|
249
|
+
exitCode,
|
|
250
|
+
timedOut,
|
|
251
|
+
bufferExceeded,
|
|
252
|
+
device: "local",
|
|
253
|
+
};
|
|
254
|
+
if (timedOut) {
|
|
255
|
+
reject(new AdbError(`Command timed out after ${timeout}ms: ${command.substring(0, 100)}`, result));
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (bufferExceeded) {
|
|
259
|
+
resolve(result);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (exitCode !== 0 && !options.ignoreExitCode) {
|
|
263
|
+
reject(new AdbError(`Command failed (exit ${exitCode}): ${result.stderr || result.stdout}`.trim(), result));
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
resolve(result);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Synthesize an `adb devices -l` response for DeviceManager.
|
|
272
|
+
* Reads device properties once and caches them.
|
|
273
|
+
*/
|
|
274
|
+
async syntheticDeviceList() {
|
|
275
|
+
if (!this.deviceInfoCache) {
|
|
276
|
+
try {
|
|
277
|
+
const [modelRes, productRes] = await Promise.allSettled([
|
|
278
|
+
this.execLocal("getprop ro.product.model", { ignoreExitCode: true, timeout: 3000 }),
|
|
279
|
+
this.execLocal("getprop ro.product.device", { ignoreExitCode: true, timeout: 3000 }),
|
|
280
|
+
]);
|
|
281
|
+
const model = modelRes.status === "fulfilled" ? modelRes.value.stdout.trim().replace(/\s+/g, "_") : "Android";
|
|
282
|
+
const product = productRes.status === "fulfilled" ? productRes.value.stdout.trim() : "unknown";
|
|
283
|
+
this.deviceInfoCache = `List of devices attached\nlocal device product:${product} model:${model} transport_id:0\n`;
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
this.deviceInfoCache = "List of devices attached\nlocal device product:unknown model:Android transport_id:0\n";
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return this.makeResult(this.deviceInfoCache);
|
|
290
|
+
}
|
|
291
|
+
/** Create a successful AdbResult from a string. */
|
|
292
|
+
makeResult(stdout) {
|
|
293
|
+
return {
|
|
294
|
+
stdout,
|
|
295
|
+
stderr: "",
|
|
296
|
+
exitCode: 0,
|
|
297
|
+
timedOut: false,
|
|
298
|
+
bufferExceeded: false,
|
|
299
|
+
device: "local",
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/** Always reachable — we are the device. */
|
|
303
|
+
async ping() {
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
/** Return local version info. */
|
|
307
|
+
async version() {
|
|
308
|
+
try {
|
|
309
|
+
const result = await this.execLocal("getprop ro.build.version.release", { timeout: 3000 });
|
|
310
|
+
return `DeepADB Local Bridge — Android ${result.stdout.trim()}`;
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return "DeepADB Local Bridge — on-device mode";
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Spawn a long-running streaming command locally.
|
|
318
|
+
* In ADB mode the args are ["logcat", ...flags] prefixed with "adb -s serial".
|
|
319
|
+
* Here we strip the ADB layer and spawn the command directly.
|
|
320
|
+
*/
|
|
321
|
+
spawnStreaming(args, _device) {
|
|
322
|
+
// args[0] is the ADB subcommand (logcat, shell, etc.)
|
|
323
|
+
// For logcat: args = ["logcat", "-b", "radio", "-v", "time"]
|
|
324
|
+
// For shell: args = ["shell", "logcat", ...]
|
|
325
|
+
const subcommand = args[0];
|
|
326
|
+
let cmd;
|
|
327
|
+
let cmdArgs;
|
|
328
|
+
if (subcommand === "shell") {
|
|
329
|
+
// "shell", "logcat", ...flags → spawn "logcat" with flags
|
|
330
|
+
cmd = args[1];
|
|
331
|
+
cmdArgs = args.slice(2);
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
// "logcat", ...flags → spawn directly
|
|
335
|
+
cmd = subcommand;
|
|
336
|
+
cmdArgs = args.slice(1);
|
|
337
|
+
}
|
|
338
|
+
this.localLogger.debug(`spawn local: ${cmd} ${cmdArgs.join(" ")}`);
|
|
339
|
+
return spawn(cmd, cmdArgs, {
|
|
340
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
341
|
+
env: { ...process.env, PATH: `${process.env.PATH}:/system/bin:/vendor/bin` },
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=local-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-bridge.js","sourceRoot":"","sources":["../../src/bridge/local-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAmB,KAAK,EAAgB,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,SAAS,EAA6B,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,OAAO,WAAY,SAAQ,SAAS;IAChC,WAAW,CAAS;IACpB,eAAe,GAAkB,IAAI,CAAC;IAE9C;;;OAGG;IACK,aAAa,GAAmB,IAAI,CAAC;IAE7C;;;;;;;;OAQG;IACK,MAAM,CAAU,iBAAiB,GAAwB,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QACrF,UAAU,EAAO,4CAA4C;QAC7D,SAAS,EAAQ,2BAA2B;QAC5C,IAAI,EAAa,gEAAgE;QACjF,OAAO,EAAU,oCAAoC;QACrD,WAAW,EAAM,oEAAoE;QACrF,cAAc,EAAG,sDAAsD;QACvE,aAAa,EAAI,8DAA8D;QAC/E,aAAa,EAAI,uDAAuD;QACxE,YAAY,EAAK,sCAAsC;QACvD,YAAY,EAAK,uCAAuC;QACxD,KAAK,EAAY,4DAA4D;QAC7E,IAAI,EAAa,iEAAiE;QAClF,IAAI,EAAa,wDAAwD;QACzE,KAAK,EAAY,sDAAsD;QACvE,IAAI,EAAa,2DAA2D;QAC5E,UAAU,EAAO,2DAA2D;KAC7E,CAAC,CAAC,CAAC;IAEJ,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;IAC5B,CAAC;IAED,8FAA8F;IACtF,UAAU,CAAC,GAAW;QAC5B,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,kBAAkB;QAC9B,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;YACnG,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACK,OAAO,CAAC,OAAe;QAC7B,OAAO,UAAU,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAU,wBAAwB,GAAG,mCAAmC,CAAC;IAEvF;;;;;;;;;OASG;IACK,qBAAqB,CAAC,OAAe;QAC3C,mDAAmD;QACnD,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,iDAAiD;QACjD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QAC1F,IAAI,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5D,+EAA+E;QAC/E,IAAI,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACM,KAAK,CAAC,IAAI,CAAC,IAAc,EAAE,UAA0B,EAAE;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAEhD,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,OAAO;gBACV,+DAA+D;gBAC/D,yEAAyE;gBACzE,wEAAwE;gBACxE,CAAC;oBACC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACxC,IAAI,OAAO,IAAI,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;wBACnD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;oBACxD,CAAC;oBACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC1C,CAAC;YAEH,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAEpC,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,UAAU,CAAC,uCAAuC,CAAC,CAAC;YAElE,KAAK,MAAM;gBACT,2EAA2E;gBAC3E,CAAC;oBACC,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChF,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC5E,CAAC;YAEH,KAAK,MAAM;gBACT,qEAAqE;gBACrE,yEAAyE;gBACzE,mEAAmE;gBACnE,qDAAqD;gBACrD,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,OAAO,GAAG,cAAc,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpF,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC1C,CAAC;gBACD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAElG,KAAK,SAAS;gBACZ,kDAAkD;gBAClD,2EAA2E;gBAC3E,CAAC;oBACC,MAAM,UAAU,GAAG,cAAc,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzG,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAClF,CAAC;YAEH,KAAK,kBAAkB;gBACrB,wEAAwE;gBACxE,mDAAmD;gBACnD,CAAC;oBACC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;oBACpD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;oBACrD,MAAM,KAAK,GAAG,uBAAuB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvG,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACxE,CAAC;YAEH,KAAK,WAAW;gBACd,yDAAyD;gBACzD,qEAAqE;gBACrE,CAAC;oBACC,MAAM,YAAY,GAAG,gBAAgB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACtF,CAAC;YAEH,KAAK,QAAQ;gBACX,8CAA8C;gBAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAEtE,KAAK,QAAQ;gBACX,CAAC;oBACC,MAAM,SAAS,GAAG,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;oBAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAChF,CAAC;YAEH,KAAK,SAAS,CAAC;YACf,KAAK,SAAS;gBACZ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAE,6BAA6B;gBAC5D,CAAC;gBACD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,UAAU,mDAAmD,CAAC,CAAC;YAE3F,KAAK,SAAS,CAAC;YACf,KAAK,YAAY,CAAC;YAClB,KAAK,MAAM,CAAC;YACZ,KAAK,OAAO,CAAC;YACb,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,UAAU,oDAAoD,CAAC,CAAC;YAE5F,KAAK,WAAW;gBACd,0FAA0F;gBAC1F,iFAAiF;gBACjF,kFAAkF;gBAClF,wDAAwD;gBACxD,CAAC;oBACC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,6CAA6C;oBACvE,MAAM,YAAY,GAAG,YAAY,CAAC;oBAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CACnC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,EACnD,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CACrC,CAAC;oBACF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACjD,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;wBACxB,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACxC,MAAM,KAAK,GAAG,SAAS,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACrF,MAAM,KAAK,GAAG,SAAS,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;wBACxD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;wBACtF,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxF,CAAC;oBACD,OAAO,QAAQ,CAAC;gBAClB,CAAC;YAEH;gBACE,gDAAgD;gBAChD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,wCAAwC,UAAU,uBAAuB,CAAC,CAAC;gBACjG,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,6DAA6D;IACrD,SAAS,CAAC,OAAe,EAAE,UAA0B,EAAE;QAC7D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,cAAc,CAAC;QAEzD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAEpE,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChD,MAAM,WAAW,GAAoB;gBACnC,OAAO;gBACP,SAAS,EAAE,MAAM,CAAC,aAAa,GAAG,CAAC;gBACnC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,0BAA0B,EAAE;aAC7E,CAAC;YAEF,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACrE,MAAM,cAAc,GAAG,KAAK,EAAE,IAAI,KAAK,mCAAmC;uBACrE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;gBACpD,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC;gBAE3D,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAI,IAAI,IAAI;oBAClC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnD,CAAC,CAAC,CAAC,CAAC;gBAEN,MAAM,MAAM,GAAc;oBACxB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAChC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAChC,QAAQ;oBACR,QAAQ;oBACR,cAAc;oBACd,MAAM,EAAE,OAAO;iBAChB,CAAC;gBAEF,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,QAAQ,CAAC,2BAA2B,OAAO,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;oBACnG,OAAO;gBACT,CAAC;gBAED,IAAI,cAAc,EAAE,CAAC;oBACnB,OAAO,CAAC,MAAM,CAAC,CAAC;oBAChB,OAAO;gBACT,CAAC;gBAED,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;oBAC9C,MAAM,CAAC,IAAI,QAAQ,CACjB,wBAAwB,QAAQ,MAAM,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAC7E,MAAM,CACP,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;oBACtD,IAAI,CAAC,SAAS,CAAC,0BAA0B,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACnF,IAAI,CAAC,SAAS,CAAC,2BAA2B,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;iBACrF,CAAC,CAAC;gBAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9G,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBAE/F,IAAI,CAAC,eAAe,GAAG,2DAA2D,OAAO,UAAU,KAAK,mBAAmB,CAAC;YAC9H,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,eAAe,GAAG,gGAAgG,CAAC;YAC1H,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC;IAED,mDAAmD;IAC3C,UAAU,CAAC,MAAc;QAC/B,OAAO;YACL,MAAM;YACN,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,KAAK;YACf,cAAc,EAAE,KAAK;YACrB,MAAM,EAAE,OAAO;SAChB,CAAC;IACJ,CAAC;IAED,4CAA4C;IACnC,KAAK,CAAC,IAAI;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iCAAiC;IACxB,KAAK,CAAC,OAAO;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,kCAAkC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3F,OAAO,kCAAkC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,uCAAuC,CAAC;QACjD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACM,cAAc,CAAC,IAAc,EAAE,OAAgB;QACtD,sDAAsD;QACtD,6DAA6D;QAC7D,6CAA6C;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3B,IAAI,GAAW,CAAC;QAChB,IAAI,OAAiB,CAAC;QAEtB,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YAC3B,0DAA0D;YAC1D,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,sCAAsC;YACtC,GAAG,GAAG,UAAU,CAAC;YACjB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEnE,OAAO,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE;YACzB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,0BAA0B,EAAE;SAC7E,CAAC,CAAC;IACL,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeepADB Configuration
|
|
3
|
+
*
|
|
4
|
+
* Central configuration for ADB paths, timeouts, and output limits.
|
|
5
|
+
* Adjust these values based on your environment.
|
|
6
|
+
*/
|
|
7
|
+
export interface DeepADBConfig {
|
|
8
|
+
/** Path to the ADB binary. Auto-detected if not set. */
|
|
9
|
+
adbPath: string;
|
|
10
|
+
/** Default timeout for ADB commands in milliseconds */
|
|
11
|
+
commandTimeout: number;
|
|
12
|
+
/** Maximum output size in characters before truncation */
|
|
13
|
+
maxOutputSize: number;
|
|
14
|
+
/** Maximum logcat lines to return per snapshot */
|
|
15
|
+
maxLogcatLines: number;
|
|
16
|
+
/** Default device serial (empty = auto-select single device) */
|
|
17
|
+
defaultDevice: string;
|
|
18
|
+
/** Temp directory for binary file operations (screenshots, pulls) */
|
|
19
|
+
tempDir: string;
|
|
20
|
+
/** Device list cache TTL in milliseconds (0 = no caching) */
|
|
21
|
+
deviceCacheTtl: number;
|
|
22
|
+
/** Number of retries for transient ADB failures */
|
|
23
|
+
retryCount: number;
|
|
24
|
+
/** Base delay between retries in milliseconds (doubles each retry) */
|
|
25
|
+
retryBaseDelay: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Detect if we're running directly on an Android device (e.g., Termux).
|
|
29
|
+
* Checks for /system/build.prop which exists on all Android devices
|
|
30
|
+
* but never on Windows/macOS/Linux hosts.
|
|
31
|
+
* Can be overridden with DA_LOCAL=true or DA_LOCAL=false.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isOnDevice(): boolean;
|
|
34
|
+
export declare const config: DeepADBConfig;
|
|
35
|
+
/**
|
|
36
|
+
* Validate configuration at startup. Returns warnings for non-fatal issues.
|
|
37
|
+
*/
|
|
38
|
+
export declare function validateConfig(): string[];
|
|
39
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAEhB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IAEvB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IAEtB,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IAEvB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IAEtB,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAEhB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IAEvB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IAEnB,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAKpC;AAuBD,eAAO,MAAM,MAAM,EAAE,aAUpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAoBzC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeepADB Configuration
|
|
3
|
+
*
|
|
4
|
+
* Central configuration for ADB paths, timeouts, and output limits.
|
|
5
|
+
* Adjust these values based on your environment.
|
|
6
|
+
*/
|
|
7
|
+
import { platform } from "os";
|
|
8
|
+
import { existsSync } from "fs";
|
|
9
|
+
function getDefaultAdbPath() {
|
|
10
|
+
const isWindows = platform() === "win32";
|
|
11
|
+
if (isWindows) {
|
|
12
|
+
const localAppData = process.env.LOCALAPPDATA ?? "";
|
|
13
|
+
return localAppData
|
|
14
|
+
? `${localAppData}\\Android\\Sdk\\platform-tools\\adb.exe`
|
|
15
|
+
: "adb";
|
|
16
|
+
}
|
|
17
|
+
return "adb";
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Detect if we're running directly on an Android device (e.g., Termux).
|
|
21
|
+
* Checks for /system/build.prop which exists on all Android devices
|
|
22
|
+
* but never on Windows/macOS/Linux hosts.
|
|
23
|
+
* Can be overridden with DA_LOCAL=true or DA_LOCAL=false.
|
|
24
|
+
*/
|
|
25
|
+
export function isOnDevice() {
|
|
26
|
+
const override = process.env.DA_LOCAL;
|
|
27
|
+
if (override === "true" || override === "1")
|
|
28
|
+
return true;
|
|
29
|
+
if (override === "false" || override === "0")
|
|
30
|
+
return false;
|
|
31
|
+
return existsSync("/system/build.prop");
|
|
32
|
+
}
|
|
33
|
+
function getTempDir() {
|
|
34
|
+
// On-device (Termux): use Termux home or /data/local/tmp
|
|
35
|
+
if (isOnDevice()) {
|
|
36
|
+
const home = process.env.HOME ?? "/data/local/tmp";
|
|
37
|
+
return `${home}/.deepadb`;
|
|
38
|
+
}
|
|
39
|
+
return platform() === "win32"
|
|
40
|
+
? `${process.env.TEMP ?? "C:\\Temp"}\\deepadb`
|
|
41
|
+
: "/tmp/deepadb";
|
|
42
|
+
}
|
|
43
|
+
function parseIntSafe(value, fallback) {
|
|
44
|
+
if (value === undefined)
|
|
45
|
+
return fallback;
|
|
46
|
+
const parsed = parseInt(value, 10);
|
|
47
|
+
if (isNaN(parsed) || parsed < 0) {
|
|
48
|
+
console.error(`[DeepADB] Invalid config value "${value}", using default: ${fallback}`);
|
|
49
|
+
return fallback;
|
|
50
|
+
}
|
|
51
|
+
return parsed;
|
|
52
|
+
}
|
|
53
|
+
export const config = {
|
|
54
|
+
adbPath: process.env.ADB_PATH ?? getDefaultAdbPath(),
|
|
55
|
+
commandTimeout: parseIntSafe(process.env.DA_TIMEOUT, 30000),
|
|
56
|
+
maxOutputSize: parseIntSafe(process.env.DA_MAX_OUTPUT, 50000),
|
|
57
|
+
maxLogcatLines: parseIntSafe(process.env.DA_MAX_LOGCAT, 500),
|
|
58
|
+
defaultDevice: process.env.DA_DEVICE ?? "",
|
|
59
|
+
tempDir: process.env.DA_TEMP_DIR ?? getTempDir(),
|
|
60
|
+
deviceCacheTtl: parseIntSafe(process.env.DA_CACHE_TTL, 5000),
|
|
61
|
+
retryCount: parseIntSafe(process.env.DA_RETRY_COUNT, 1),
|
|
62
|
+
retryBaseDelay: parseIntSafe(process.env.DA_RETRY_DELAY, 500),
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Validate configuration at startup. Returns warnings for non-fatal issues.
|
|
66
|
+
*/
|
|
67
|
+
export function validateConfig() {
|
|
68
|
+
const warnings = [];
|
|
69
|
+
// Skip ADB binary check in on-device mode (no ADB needed)
|
|
70
|
+
if (!isOnDevice()) {
|
|
71
|
+
if (config.adbPath !== "adb" && !existsSync(config.adbPath)) {
|
|
72
|
+
warnings.push(`ADB binary not found at configured path: ${config.adbPath}. Falling back to PATH lookup.`);
|
|
73
|
+
config.adbPath = "adb";
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (config.commandTimeout < 1000) {
|
|
77
|
+
warnings.push(`Command timeout (${config.commandTimeout}ms) is very low. Commands may fail prematurely.`);
|
|
78
|
+
}
|
|
79
|
+
if (config.maxOutputSize < 5000) {
|
|
80
|
+
warnings.push(`Max output size (${config.maxOutputSize}) is very low. Output will be heavily truncated.`);
|
|
81
|
+
}
|
|
82
|
+
return warnings;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL API — Composed device query endpoint.
|
|
3
|
+
*
|
|
4
|
+
* Optional HTTP endpoint serving a GraphQL API over device state.
|
|
5
|
+
* Enables clients to compose multiple device queries into a single
|
|
6
|
+
* request — for example, fetching device info, battery, signal, and
|
|
7
|
+
* installed packages in one round trip instead of 4+ MCP tool calls.
|
|
8
|
+
*
|
|
9
|
+
* Requires the `graphql` npm package as an optional peer dependency:
|
|
10
|
+
* npm install graphql
|
|
11
|
+
*
|
|
12
|
+
* Set DA_GRAPHQL_PORT to enable. Runs independently from the MCP
|
|
13
|
+
* transport (stdio/HTTP/WebSocket).
|
|
14
|
+
*
|
|
15
|
+
* Endpoints:
|
|
16
|
+
* POST /graphql — GraphQL query execution
|
|
17
|
+
* GET /graphql — GraphQL query via query string (for introspection tools)
|
|
18
|
+
* GET /health — Health check
|
|
19
|
+
*
|
|
20
|
+
* Example query:
|
|
21
|
+
* { devices { serial model androidVersion battery { level charging } } }
|
|
22
|
+
*/
|
|
23
|
+
import { AdbBridge } from "./bridge/adb-bridge.js";
|
|
24
|
+
import { DeviceManager } from "./bridge/device-manager.js";
|
|
25
|
+
import { Logger } from "./middleware/logger.js";
|
|
26
|
+
export interface GraphQLOptions {
|
|
27
|
+
port: number;
|
|
28
|
+
host?: string;
|
|
29
|
+
version?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Start a GraphQL API server.
|
|
33
|
+
* Requires the `graphql` npm package to be installed.
|
|
34
|
+
*/
|
|
35
|
+
export declare function startGraphQLApi(bridge: AdbBridge, deviceManager: DeviceManager, options: GraphQLOptions, logger: Logger): Promise<void>;
|
|
36
|
+
//# sourceMappingURL=graphql-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-api.d.ts","sourceRoot":"","sources":["../src/graphql-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA2JD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAqIf"}
|