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,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AT Command Interface — Raw modem AT command passthrough via root access.
|
|
3
|
+
*
|
|
4
|
+
* Enables direct modem interrogation beyond what the Android telephony
|
|
5
|
+
* framework exposes. Useful for advanced baseband research, cellular
|
|
6
|
+
* protocol analysis, and low-level radio diagnostics.
|
|
7
|
+
*
|
|
8
|
+
* Multi-device support: auto-detects modem device node by chipset family
|
|
9
|
+
* (Shannon/Exynos, Qualcomm, MediaTek, Unisoc, generic USB modems).
|
|
10
|
+
* Manual port override available for unknown hardware.
|
|
11
|
+
*
|
|
12
|
+
* Root access required — AT commands go through /dev/ serial device nodes.
|
|
13
|
+
*
|
|
14
|
+
* SAFETY: Certain AT commands can disable the radio (AT+CFUN=0), factory
|
|
15
|
+
* reset the modem, or alter NVRAM. A blocklist prevents accidental execution
|
|
16
|
+
* of the most dangerous commands. Use `force: true` to bypass.
|
|
17
|
+
*/
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
import { OutputProcessor } from "../middleware/output-processor.js";
|
|
20
|
+
import { MODEM_PATHS, detectChipsetFamily } from "../middleware/chipset.js";
|
|
21
|
+
/** AT commands that can brick, factory-reset, or disable the modem. */
|
|
22
|
+
const DANGEROUS_AT_COMMANDS = [
|
|
23
|
+
"AT+CFUN=0", // Minimum functionality — kills radio
|
|
24
|
+
"AT+CFUN=4", // Disable TX
|
|
25
|
+
"AT+CLCK", // Lock facility (can lock SIM permanently)
|
|
26
|
+
"AT^RESET", // Modem hard reset (vendor-specific)
|
|
27
|
+
"AT+NVRAM", // NVRAM write (vendor-specific)
|
|
28
|
+
"AT+EGMR", // Write IMEI (illegal in many jurisdictions)
|
|
29
|
+
"AT%RESTART", // Modem restart
|
|
30
|
+
"AT+QPRTPARA", // Qualcomm parameter write
|
|
31
|
+
];
|
|
32
|
+
function isDangerousCommand(cmd) {
|
|
33
|
+
const upper = cmd.toUpperCase().trim();
|
|
34
|
+
for (const dangerous of DANGEROUS_AT_COMMANDS) {
|
|
35
|
+
if (upper.startsWith(dangerous)) {
|
|
36
|
+
return `Blocked dangerous AT command: ${dangerous}. This command can disable/damage the modem. Use force=true to override.`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Characters that are dangerous inside shell double-quotes or bare interpolation.
|
|
43
|
+
* AT commands legitimately contain: + = ? , . # * but never shell operators.
|
|
44
|
+
*/
|
|
45
|
+
const AT_UNSAFE_CHARS = /["'`$\\!;|&(){}<>\n\r]/;
|
|
46
|
+
/**
|
|
47
|
+
* Validate that a device node path looks like a real /dev/ path.
|
|
48
|
+
* Rejects anything that doesn't start with /dev/ or contains shell metacharacters.
|
|
49
|
+
*/
|
|
50
|
+
function validateDeviceNode(port) {
|
|
51
|
+
if (!port.startsWith("/dev/")) {
|
|
52
|
+
return `Invalid port: must start with /dev/ (got: "${port}")`;
|
|
53
|
+
}
|
|
54
|
+
if (AT_UNSAFE_CHARS.test(port)) {
|
|
55
|
+
return `Invalid port: contains shell metacharacters`;
|
|
56
|
+
}
|
|
57
|
+
if (port.includes("..")) {
|
|
58
|
+
return `Invalid port: path traversal not allowed`;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Validate that an AT command string is safe to echo into a device node.
|
|
64
|
+
* AT commands contain alphanumeric chars plus + = ? , . # * : / but
|
|
65
|
+
* must never contain shell metacharacters that could enable injection.
|
|
66
|
+
*/
|
|
67
|
+
function validateAtCommand(cmd) {
|
|
68
|
+
if (AT_UNSAFE_CHARS.test(cmd)) {
|
|
69
|
+
return `Invalid AT command: contains shell-unsafe characters. AT commands must not include: \` " $ \\ ! ; | & ( ) { } < >`;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Send an AT command to a device node and capture the response.
|
|
75
|
+
* Uses `echo` + `cat` with timeout via root shell.
|
|
76
|
+
* Both the command and device node are validated before interpolation.
|
|
77
|
+
*/
|
|
78
|
+
async function sendAtCommand(ctx, serial, deviceNode, command, timeoutMs) {
|
|
79
|
+
// Validate device node path
|
|
80
|
+
const portErr = validateDeviceNode(deviceNode);
|
|
81
|
+
if (portErr)
|
|
82
|
+
return { response: "", error: portErr };
|
|
83
|
+
// Validate AT command for shell safety
|
|
84
|
+
const cmdErr = validateAtCommand(command);
|
|
85
|
+
if (cmdErr)
|
|
86
|
+
return { response: "", error: cmdErr };
|
|
87
|
+
const cmd = command.trimEnd();
|
|
88
|
+
// Send the command and read response with a timeout.
|
|
89
|
+
// Both cmd and deviceNode are validated above — no shell metacharacters.
|
|
90
|
+
// Use printf instead of echo -e for portable carriage return handling
|
|
91
|
+
// (echo -e is not supported by all Android shell implementations).
|
|
92
|
+
const timeoutSec = Math.max(1, Math.ceil(timeoutMs / 1000));
|
|
93
|
+
const shellCmd = `printf '${cmd}\\r' > '${deviceNode}' && timeout ${timeoutSec} cat '${deviceNode}' 2>&1 || true`;
|
|
94
|
+
try {
|
|
95
|
+
const result = await ctx.bridge.rootShell(shellCmd, {
|
|
96
|
+
device: serial,
|
|
97
|
+
timeout: timeoutMs + 3000, // Extra buffer for ADB overhead
|
|
98
|
+
ignoreExitCode: true,
|
|
99
|
+
});
|
|
100
|
+
const response = result.stdout.trim();
|
|
101
|
+
if (result.stderr && result.stderr.trim()) {
|
|
102
|
+
return { response, error: result.stderr.trim() };
|
|
103
|
+
}
|
|
104
|
+
return { response };
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
return { response: "", error: err instanceof Error ? err.message : String(err) };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export function registerAtCommandTools(ctx) {
|
|
111
|
+
ctx.server.tool("adb_at_detect", "Auto-detect the modem AT command device node. Identifies the chipset family (Shannon, Qualcomm, MediaTek, Unisoc) and probes known device node paths. Requires root. Returns the first responding node.", {
|
|
112
|
+
device: z.string().optional().describe("Device serial"),
|
|
113
|
+
}, async ({ device }) => {
|
|
114
|
+
try {
|
|
115
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
116
|
+
const serial = resolved.serial;
|
|
117
|
+
// Detect chipset family
|
|
118
|
+
const props = await ctx.deviceManager.getDeviceProps(serial);
|
|
119
|
+
const family = detectChipsetFamily(props);
|
|
120
|
+
const chipname = props["ro.hardware.chipname"] ?? "unknown";
|
|
121
|
+
const platform = props["ro.board.platform"] ?? "unknown";
|
|
122
|
+
const sections = [];
|
|
123
|
+
sections.push(`Chipset: ${chipname} (platform: ${platform})`);
|
|
124
|
+
sections.push(`Detected family: ${family}`);
|
|
125
|
+
// Probe paths for this family, then fall back to all others
|
|
126
|
+
const familyPaths = MODEM_PATHS[family] ?? [];
|
|
127
|
+
const otherPaths = Object.entries(MODEM_PATHS)
|
|
128
|
+
.filter(([k]) => k !== family)
|
|
129
|
+
.flatMap(([, v]) => v);
|
|
130
|
+
const allPaths = [...familyPaths, ...otherPaths];
|
|
131
|
+
sections.push(`\nProbing ${allPaths.length} device nodes...`);
|
|
132
|
+
// Check which device nodes exist
|
|
133
|
+
const existCmd = allPaths.map((p) => `test -e ${p} && echo "EXISTS:${p}"`).join("; ");
|
|
134
|
+
const existResult = await ctx.bridge.rootShell(existCmd, {
|
|
135
|
+
device: serial, timeout: 10000, ignoreExitCode: true,
|
|
136
|
+
});
|
|
137
|
+
const existingPaths = existResult.stdout
|
|
138
|
+
.split("\n")
|
|
139
|
+
.filter((l) => l.startsWith("EXISTS:"))
|
|
140
|
+
.map((l) => l.replace("EXISTS:", "").trim());
|
|
141
|
+
if (existingPaths.length === 0) {
|
|
142
|
+
sections.push("\nNo modem device nodes found. The device may not expose AT command interfaces, or may require a different access method.");
|
|
143
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
144
|
+
}
|
|
145
|
+
sections.push(`Found ${existingPaths.length} existing node(s): ${existingPaths.join(", ")}`);
|
|
146
|
+
// Try sending "AT" to each existing node and check for "OK" response
|
|
147
|
+
let respondingNode = null;
|
|
148
|
+
for (const nodePath of existingPaths) {
|
|
149
|
+
sections.push(`\nProbing ${nodePath}...`);
|
|
150
|
+
const { response, error } = await sendAtCommand(ctx, serial, nodePath, "AT", 3000);
|
|
151
|
+
if (error) {
|
|
152
|
+
sections.push(` Error: ${error}`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (response.includes("OK")) {
|
|
156
|
+
sections.push(` ✓ Response: OK — this node accepts AT commands`);
|
|
157
|
+
respondingNode = nodePath;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
else if (response.length > 0) {
|
|
161
|
+
sections.push(` ? Response: ${response.substring(0, 100)}`);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
sections.push(` ✗ No response (timeout)`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (respondingNode) {
|
|
168
|
+
sections.push(`\n=== Detected AT port: ${respondingNode} ===`);
|
|
169
|
+
sections.push(`Use this as the 'port' parameter in adb_at_send and adb_at_batch.`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
sections.push(`\nNo responding AT port found. Nodes exist but did not respond to "AT".`);
|
|
173
|
+
sections.push(`Try manually with adb_at_send using one of: ${existingPaths.join(", ")}`);
|
|
174
|
+
}
|
|
175
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
ctx.server.tool("adb_at_send", "Send a single AT command to the modem and capture the response. Requires root. Use adb_at_detect to find the correct port, or specify it manually.", {
|
|
182
|
+
command: z.string().describe("AT command to send (e.g., 'AT+CSQ', 'ATI', 'AT+COPS?')"),
|
|
183
|
+
port: z.string().optional().describe("Modem device node (e.g., '/dev/umts_router0'). If omitted, auto-detects."),
|
|
184
|
+
timeout: z.number().min(1000).max(30000).optional().default(5000).describe("Response timeout in ms (1000-30000, default 5000)"),
|
|
185
|
+
force: z.boolean().optional().default(false).describe("Bypass dangerous command safety check"),
|
|
186
|
+
device: z.string().optional().describe("Device serial"),
|
|
187
|
+
}, async ({ command, port, timeout, force, device }) => {
|
|
188
|
+
try {
|
|
189
|
+
// Safety check
|
|
190
|
+
if (!force) {
|
|
191
|
+
const blocked = isDangerousCommand(command);
|
|
192
|
+
if (blocked) {
|
|
193
|
+
return { content: [{ type: "text", text: blocked }], isError: true };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Pre-flight input validation (same checks as sendAtCommand, but return isError)
|
|
197
|
+
const cmdErr = validateAtCommand(command);
|
|
198
|
+
if (cmdErr) {
|
|
199
|
+
return { content: [{ type: "text", text: cmdErr }], isError: true };
|
|
200
|
+
}
|
|
201
|
+
if (port) {
|
|
202
|
+
const portErr = validateDeviceNode(port);
|
|
203
|
+
if (portErr) {
|
|
204
|
+
return { content: [{ type: "text", text: portErr }], isError: true };
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
208
|
+
const serial = resolved.serial;
|
|
209
|
+
// Auto-detect port if not specified
|
|
210
|
+
let targetPort = port;
|
|
211
|
+
if (!targetPort) {
|
|
212
|
+
const props = await ctx.deviceManager.getDeviceProps(serial);
|
|
213
|
+
const family = detectChipsetFamily(props);
|
|
214
|
+
const paths = MODEM_PATHS[family] ?? MODEM_PATHS.generic;
|
|
215
|
+
// Quick probe: find first existing node
|
|
216
|
+
const existCmd = paths.map((p) => `test -e ${p} && echo "EXISTS:${p}"`).join("; ");
|
|
217
|
+
const existResult = await ctx.bridge.rootShell(existCmd, {
|
|
218
|
+
device: serial, timeout: 5000, ignoreExitCode: true,
|
|
219
|
+
});
|
|
220
|
+
const existing = existResult.stdout.split("\n")
|
|
221
|
+
.filter((l) => l.startsWith("EXISTS:"))
|
|
222
|
+
.map((l) => l.replace("EXISTS:", "").trim());
|
|
223
|
+
if (existing.length === 0) {
|
|
224
|
+
return {
|
|
225
|
+
content: [{ type: "text", text: "No modem device node found. Use adb_at_detect to identify available ports, or specify 'port' manually." }],
|
|
226
|
+
isError: true,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
targetPort = existing[0];
|
|
230
|
+
}
|
|
231
|
+
const { response, error } = await sendAtCommand(ctx, serial, targetPort, command, timeout);
|
|
232
|
+
let output = `Port: ${targetPort}\nCommand: ${command}\n\n`;
|
|
233
|
+
if (error) {
|
|
234
|
+
output += `Error: ${error}\n`;
|
|
235
|
+
}
|
|
236
|
+
output += `Response:\n${response || "(no response)"}`;
|
|
237
|
+
return { content: [{ type: "text", text: output }] };
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
ctx.server.tool("adb_at_batch", "Send multiple AT commands sequentially and capture all responses. Useful for running a diagnostic sequence. Requires root.", {
|
|
244
|
+
commands: z.array(z.string()).min(1).max(50).describe("Array of AT commands to send in order (max 50)"),
|
|
245
|
+
port: z.string().optional().describe("Modem device node (auto-detects if omitted)"),
|
|
246
|
+
timeout: z.number().min(1000).max(30000).optional().default(5000).describe("Timeout per command in ms"),
|
|
247
|
+
delayMs: z.number().min(0).max(10000).optional().default(500).describe("Delay between commands in ms (0-10000, default 500)"),
|
|
248
|
+
force: z.boolean().optional().default(false).describe("Bypass dangerous command safety checks"),
|
|
249
|
+
device: z.string().optional().describe("Device serial"),
|
|
250
|
+
}, async ({ commands, port, timeout, delayMs, force, device }) => {
|
|
251
|
+
try {
|
|
252
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
253
|
+
const serial = resolved.serial;
|
|
254
|
+
// Safety check all commands first
|
|
255
|
+
if (!force) {
|
|
256
|
+
for (const cmd of commands) {
|
|
257
|
+
const blocked = isDangerousCommand(cmd);
|
|
258
|
+
if (blocked) {
|
|
259
|
+
return { content: [{ type: "text", text: `Batch aborted: ${blocked}` }], isError: true };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Pre-flight input validation for all commands and port
|
|
264
|
+
for (const cmd of commands) {
|
|
265
|
+
const cmdErr = validateAtCommand(cmd);
|
|
266
|
+
if (cmdErr) {
|
|
267
|
+
return { content: [{ type: "text", text: `Batch aborted: ${cmdErr}` }], isError: true };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (port) {
|
|
271
|
+
const portErr = validateDeviceNode(port);
|
|
272
|
+
if (portErr) {
|
|
273
|
+
return { content: [{ type: "text", text: portErr }], isError: true };
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Auto-detect port if not specified
|
|
277
|
+
let targetPort = port;
|
|
278
|
+
if (!targetPort) {
|
|
279
|
+
const props = await ctx.deviceManager.getDeviceProps(serial);
|
|
280
|
+
const family = detectChipsetFamily(props);
|
|
281
|
+
const paths = MODEM_PATHS[family] ?? MODEM_PATHS.generic;
|
|
282
|
+
const existCmd = paths.map((p) => `test -e ${p} && echo "EXISTS:${p}"`).join("; ");
|
|
283
|
+
const existResult = await ctx.bridge.rootShell(existCmd, {
|
|
284
|
+
device: serial, timeout: 5000, ignoreExitCode: true,
|
|
285
|
+
});
|
|
286
|
+
const existing = existResult.stdout.split("\n")
|
|
287
|
+
.filter((l) => l.startsWith("EXISTS:"))
|
|
288
|
+
.map((l) => l.replace("EXISTS:", "").trim());
|
|
289
|
+
if (existing.length === 0) {
|
|
290
|
+
return {
|
|
291
|
+
content: [{ type: "text", text: "No modem device node found. Use adb_at_detect or specify 'port'." }],
|
|
292
|
+
isError: true,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
targetPort = existing[0];
|
|
296
|
+
}
|
|
297
|
+
const results = [`Port: ${targetPort}`, `Commands: ${commands.length}`, ``];
|
|
298
|
+
for (let i = 0; i < commands.length; i++) {
|
|
299
|
+
const cmd = commands[i];
|
|
300
|
+
results.push(`--- [${i + 1}/${commands.length}] ${cmd} ---`);
|
|
301
|
+
const { response, error } = await sendAtCommand(ctx, serial, targetPort, cmd, timeout);
|
|
302
|
+
if (error) {
|
|
303
|
+
results.push(`Error: ${error}`);
|
|
304
|
+
}
|
|
305
|
+
results.push(response || "(no response)");
|
|
306
|
+
results.push("");
|
|
307
|
+
// Delay between commands (skip after last)
|
|
308
|
+
if (i < commands.length - 1 && delayMs > 0) {
|
|
309
|
+
await new Promise((r) => setTimeout(r, delayMs));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return { content: [{ type: "text", text: OutputProcessor.process(results.join("\n")) }] };
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
ctx.server.tool("adb_at_probe", "Run a standard AT diagnostic probe: modem identification, signal quality, network registration, SIM status, and supported bands. Requires root.", {
|
|
319
|
+
port: z.string().optional().describe("Modem device node (auto-detects if omitted)"),
|
|
320
|
+
device: z.string().optional().describe("Device serial"),
|
|
321
|
+
}, async ({ port, device }) => {
|
|
322
|
+
try {
|
|
323
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
324
|
+
const serial = resolved.serial;
|
|
325
|
+
// Auto-detect port
|
|
326
|
+
let targetPort = port;
|
|
327
|
+
if (!targetPort) {
|
|
328
|
+
const props = await ctx.deviceManager.getDeviceProps(serial);
|
|
329
|
+
const family = detectChipsetFamily(props);
|
|
330
|
+
const paths = MODEM_PATHS[family] ?? MODEM_PATHS.generic;
|
|
331
|
+
const existCmd = paths.map((p) => `test -e ${p} && echo "EXISTS:${p}"`).join("; ");
|
|
332
|
+
const existResult = await ctx.bridge.rootShell(existCmd, {
|
|
333
|
+
device: serial, timeout: 5000, ignoreExitCode: true,
|
|
334
|
+
});
|
|
335
|
+
const existing = existResult.stdout.split("\n")
|
|
336
|
+
.filter((l) => l.startsWith("EXISTS:"))
|
|
337
|
+
.map((l) => l.replace("EXISTS:", "").trim());
|
|
338
|
+
if (existing.length === 0) {
|
|
339
|
+
return {
|
|
340
|
+
content: [{ type: "text", text: "No modem device node found. Use adb_at_detect or specify 'port'." }],
|
|
341
|
+
isError: true,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
targetPort = existing[0];
|
|
345
|
+
}
|
|
346
|
+
// Standard diagnostic AT command sequence
|
|
347
|
+
const probeCommands = [
|
|
348
|
+
{ cmd: "ATI", label: "Modem Identification" },
|
|
349
|
+
{ cmd: "AT+CGMM", label: "Model" },
|
|
350
|
+
{ cmd: "AT+CGMR", label: "Firmware Revision" },
|
|
351
|
+
{ cmd: "AT+CGSN", label: "IMEI (serial number)" },
|
|
352
|
+
{ cmd: "AT+CSQ", label: "Signal Quality (RSSI, BER)" },
|
|
353
|
+
{ cmd: "AT+CREG?", label: "Network Registration (CS)" },
|
|
354
|
+
{ cmd: "AT+CEREG?", label: "Network Registration (EPS/LTE)" },
|
|
355
|
+
{ cmd: "AT+C5GREG?", label: "Network Registration (5G NR)" },
|
|
356
|
+
{ cmd: "AT+COPS?", label: "Current Operator" },
|
|
357
|
+
{ cmd: "AT+CPIN?", label: "SIM Status" },
|
|
358
|
+
{ cmd: "AT+CFUN?", label: "Functionality Mode" },
|
|
359
|
+
{ cmd: "AT+CNMI?", label: "SMS Notification Mode" },
|
|
360
|
+
];
|
|
361
|
+
const sections = [`=== AT Diagnostic Probe ===`, `Port: ${targetPort}`, ``];
|
|
362
|
+
for (const { cmd, label } of probeCommands) {
|
|
363
|
+
const { response, error } = await sendAtCommand(ctx, serial, targetPort, cmd, 4000);
|
|
364
|
+
const display = error ? `Error: ${error}` : (response || "(no response)");
|
|
365
|
+
sections.push(`[${label}] ${cmd}`);
|
|
366
|
+
sections.push(` ${display.replace(/\n/g, "\n ")}`);
|
|
367
|
+
sections.push("");
|
|
368
|
+
// Brief delay between commands
|
|
369
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
370
|
+
}
|
|
371
|
+
return { content: [{ type: "text", text: OutputProcessor.process(sections.join("\n")) }] };
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=at-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"at-commands.js","sourceRoot":"","sources":["../../src/tools/at-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseband/Modem Integration Tools — Deep cellular radio state inspection.
|
|
3
|
+
*
|
|
4
|
+
* Provides detailed modem and radio diagnostics for advanced Android
|
|
5
|
+
* development and cellular network research. Extracts modem identification,
|
|
6
|
+
* cell identity, signal measurements, neighboring cells, carrier config,
|
|
7
|
+
* and baseband logs.
|
|
8
|
+
*
|
|
9
|
+
* Supports Shannon/Exynos, Qualcomm, MediaTek, and Unisoc chipset families
|
|
10
|
+
* via standard Android telephony APIs. Root access enables additional
|
|
11
|
+
* kernel-level modem logging.
|
|
12
|
+
*/
|
|
13
|
+
import { ToolContext } from "../tool-context.js";
|
|
14
|
+
export declare function registerBasebandTools(ctx: ToolContext): void;
|
|
15
|
+
//# sourceMappingURL=baseband.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseband.d.ts","sourceRoot":"","sources":["../../src/tools/baseband.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKjD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAwX5D"}
|