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,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADB-over-Network Device Discovery — Scan for ADB devices on the local network.
|
|
3
|
+
*
|
|
4
|
+
* Discovers Android devices with ADB enabled over WiFi/TCP by scanning
|
|
5
|
+
* common ADB ports on the local subnet. Replaces manual IP entry for
|
|
6
|
+
* wireless debugging workflows.
|
|
7
|
+
*
|
|
8
|
+
* Discovery methods:
|
|
9
|
+
* 1. ARP table scan — check known hosts for open ADB ports
|
|
10
|
+
* 2. Subnet sweep — probe a configurable IP range for ADB responses
|
|
11
|
+
* 3. Connected device IP extraction — get IPs of already-connected WiFi devices
|
|
12
|
+
*
|
|
13
|
+
* Does NOT require root. Uses standard TCP connection attempts to detect
|
|
14
|
+
* ADB listeners on ports 5555 (default), 5554, and custom ports.
|
|
15
|
+
*
|
|
16
|
+
* Security: Only scans local network subnets. Connection attempts use
|
|
17
|
+
* short timeouts (2s) to avoid hanging on unresponsive hosts.
|
|
18
|
+
*/
|
|
19
|
+
import { ToolContext } from "../tool-context.js";
|
|
20
|
+
export declare function registerNetworkDiscoveryTools(ctx: ToolContext): void;
|
|
21
|
+
//# sourceMappingURL=network-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-discovery.d.ts","sourceRoot":"","sources":["../../src/tools/network-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAqDjD,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CA4QpE"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADB-over-Network Device Discovery — Scan for ADB devices on the local network.
|
|
3
|
+
*
|
|
4
|
+
* Discovers Android devices with ADB enabled over WiFi/TCP by scanning
|
|
5
|
+
* common ADB ports on the local subnet. Replaces manual IP entry for
|
|
6
|
+
* wireless debugging workflows.
|
|
7
|
+
*
|
|
8
|
+
* Discovery methods:
|
|
9
|
+
* 1. ARP table scan — check known hosts for open ADB ports
|
|
10
|
+
* 2. Subnet sweep — probe a configurable IP range for ADB responses
|
|
11
|
+
* 3. Connected device IP extraction — get IPs of already-connected WiFi devices
|
|
12
|
+
*
|
|
13
|
+
* Does NOT require root. Uses standard TCP connection attempts to detect
|
|
14
|
+
* ADB listeners on ports 5555 (default), 5554, and custom ports.
|
|
15
|
+
*
|
|
16
|
+
* Security: Only scans local network subnets. Connection attempts use
|
|
17
|
+
* short timeouts (2s) to avoid hanging on unresponsive hosts.
|
|
18
|
+
*/
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
import { createConnection } from "net";
|
|
21
|
+
import { OutputProcessor } from "../middleware/output-processor.js";
|
|
22
|
+
/** Default ADB TCP ports to probe. */
|
|
23
|
+
const ADB_PORTS = [5555, 5554, 5556, 5557, 5558];
|
|
24
|
+
/** Check if a TCP port is open on a given host. */
|
|
25
|
+
function probePort(host, port, timeoutMs) {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
const socket = createConnection({ host, port, timeout: timeoutMs });
|
|
28
|
+
let resolved = false;
|
|
29
|
+
const done = (result) => {
|
|
30
|
+
if (!resolved) {
|
|
31
|
+
resolved = true;
|
|
32
|
+
socket.destroy();
|
|
33
|
+
resolve(result);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
socket.on("connect", () => done(true));
|
|
37
|
+
socket.on("timeout", () => done(false));
|
|
38
|
+
socket.on("error", () => done(false));
|
|
39
|
+
// Safety timeout in case none of the events fire
|
|
40
|
+
setTimeout(() => done(false), timeoutMs + 500);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/** Parse an IP range string like "192.168.1.1-254" into individual IPs. */
|
|
44
|
+
function expandIpRange(range) {
|
|
45
|
+
const match = range.match(/^(\d+\.\d+\.\d+\.)(\d+)-(\d+)$/);
|
|
46
|
+
if (!match)
|
|
47
|
+
return [range]; // Not a range, treat as single IP
|
|
48
|
+
const prefix = match[1];
|
|
49
|
+
const start = parseInt(match[2], 10);
|
|
50
|
+
const end = parseInt(match[3], 10);
|
|
51
|
+
if (start > end || start < 0 || end > 255)
|
|
52
|
+
return [];
|
|
53
|
+
const ips = [];
|
|
54
|
+
for (let i = start; i <= end; i++) {
|
|
55
|
+
ips.push(`${prefix}${i}`);
|
|
56
|
+
}
|
|
57
|
+
return ips;
|
|
58
|
+
}
|
|
59
|
+
export function registerNetworkDiscoveryTools(ctx) {
|
|
60
|
+
ctx.server.tool("adb_network_scan", "Scan the local network for Android devices with ADB enabled over WiFi/TCP. Probes common ADB ports (5555-5558) on hosts from the ARP table and optionally a custom IP range. Discovered devices can be connected with adb_connect.", {
|
|
61
|
+
ipRange: z.string().optional().describe("IP range to scan (e.g., '192.168.1.1-254'). If omitted, scans hosts from the ARP table only."),
|
|
62
|
+
ports: z.array(z.number().min(1).max(65535)).max(20).optional().describe("Custom ports to probe (default: [5555, 5554, 5556, 5557, 5558], max 20)"),
|
|
63
|
+
timeoutMs: z.number().min(500).max(10000).optional().default(2000).describe("Connection timeout per host in ms (500-10000, default 2000)"),
|
|
64
|
+
device: z.string().optional().describe("Device serial (used to determine the local subnet if no ipRange given)"),
|
|
65
|
+
}, async ({ ipRange, ports, timeoutMs, device }) => {
|
|
66
|
+
try {
|
|
67
|
+
const probePorts = ports ?? ADB_PORTS;
|
|
68
|
+
const timeout = Math.min(Math.max(timeoutMs, 500), 10000);
|
|
69
|
+
const discovered = [];
|
|
70
|
+
const sections = [];
|
|
71
|
+
sections.push("=== ADB Network Discovery ===\n");
|
|
72
|
+
// Collect candidate IPs
|
|
73
|
+
const candidates = new Set();
|
|
74
|
+
// Method 1: ARP table — query a connected device for its network neighbors
|
|
75
|
+
let arpSource = "host";
|
|
76
|
+
try {
|
|
77
|
+
// Try to get the device's own IP and subnet
|
|
78
|
+
const resolved = device ? await ctx.deviceManager.resolveDevice(device) : await ctx.deviceManager.resolveDevice();
|
|
79
|
+
const serial = resolved.serial;
|
|
80
|
+
const ipResult = await ctx.bridge.shell("ip neigh show 2>/dev/null || arp -a 2>/dev/null", {
|
|
81
|
+
device: serial, timeout: 5000, ignoreExitCode: true,
|
|
82
|
+
});
|
|
83
|
+
const ipMatches = ipResult.stdout.matchAll(/(\d+\.\d+\.\d+\.\d+)/g);
|
|
84
|
+
for (const m of ipMatches) {
|
|
85
|
+
const ip = m[1];
|
|
86
|
+
// Skip broadcast, loopback, and link-local
|
|
87
|
+
if (!ip.startsWith("127.") && !ip.startsWith("169.254.") && !ip.endsWith(".255")) {
|
|
88
|
+
candidates.add(ip);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
arpSource = `device (${serial})`;
|
|
92
|
+
}
|
|
93
|
+
catch { /* no device available, skip */ }
|
|
94
|
+
// Method 2: User-specified IP range
|
|
95
|
+
if (ipRange) {
|
|
96
|
+
const rangeIps = expandIpRange(ipRange);
|
|
97
|
+
for (const ip of rangeIps)
|
|
98
|
+
candidates.add(ip);
|
|
99
|
+
sections.push(`IP range: ${ipRange} (${rangeIps.length} hosts)`);
|
|
100
|
+
}
|
|
101
|
+
if (candidates.size === 0) {
|
|
102
|
+
sections.push("No candidate IPs found. Provide an ipRange to scan a specific subnet.");
|
|
103
|
+
sections.push("Example: ipRange='192.168.1.1-254'");
|
|
104
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
105
|
+
}
|
|
106
|
+
sections.push(`Candidates: ${candidates.size} hosts (from ${arpSource}${ipRange ? " + IP range" : ""})`);
|
|
107
|
+
sections.push(`Ports: ${probePorts.join(", ")}`);
|
|
108
|
+
sections.push(`Timeout: ${timeout}ms per probe\n`);
|
|
109
|
+
sections.push("Scanning...");
|
|
110
|
+
// Probe all candidates in parallel batches (limit concurrency to avoid overwhelming)
|
|
111
|
+
const allIps = Array.from(candidates);
|
|
112
|
+
const BATCH_SIZE = 20;
|
|
113
|
+
for (let batch = 0; batch < allIps.length; batch += BATCH_SIZE) {
|
|
114
|
+
const batchIps = allIps.slice(batch, batch + BATCH_SIZE);
|
|
115
|
+
const probes = [];
|
|
116
|
+
for (const ip of batchIps) {
|
|
117
|
+
for (const port of probePorts) {
|
|
118
|
+
probes.push(probePort(ip, port, timeout).then((open) => {
|
|
119
|
+
if (open) {
|
|
120
|
+
discovered.push({ ip, port, source: ipRange && expandIpRange(ipRange).includes(ip) ? "range" : "arp" });
|
|
121
|
+
}
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
await Promise.all(probes);
|
|
126
|
+
}
|
|
127
|
+
if (discovered.length === 0) {
|
|
128
|
+
sections.push("\nNo ADB listeners found on the scanned hosts.");
|
|
129
|
+
sections.push("Ensure target devices have wireless debugging enabled:");
|
|
130
|
+
sections.push(" Settings → Developer Options → Wireless debugging");
|
|
131
|
+
sections.push(" Or run: adb_tcpip to switch a USB-connected device to TCP mode.");
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
sections.push(`\nDiscovered ${discovered.length} ADB listener(s):\n`);
|
|
135
|
+
for (const d of discovered) {
|
|
136
|
+
sections.push(` ${d.ip}:${d.port} (found via ${d.source})`);
|
|
137
|
+
}
|
|
138
|
+
sections.push(`\nConnect with: adb_connect host="${discovered[0].ip}:${discovered[0].port}"`);
|
|
139
|
+
}
|
|
140
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
ctx.server.tool("adb_network_device_ip", "Get the WiFi IP address of a connected device. Useful for switching from USB to wireless debugging without needing to find the IP manually on the device.", {
|
|
147
|
+
device: z.string().optional().describe("Device serial"),
|
|
148
|
+
}, async ({ device }) => {
|
|
149
|
+
try {
|
|
150
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
151
|
+
const serial = resolved.serial;
|
|
152
|
+
// Try multiple methods to get the device IP
|
|
153
|
+
const methods = [
|
|
154
|
+
{ cmd: "ip route | grep 'src' | head -1", regex: /src\s+(\d+\.\d+\.\d+\.\d+)/ },
|
|
155
|
+
{ cmd: "ip addr show wlan0 | grep 'inet '", regex: /inet\s+(\d+\.\d+\.\d+\.\d+)/ },
|
|
156
|
+
{ cmd: "ifconfig wlan0 2>/dev/null | grep 'inet '", regex: /inet\s+(?:addr:)?(\d+\.\d+\.\d+\.\d+)/ },
|
|
157
|
+
{ cmd: "getprop dhcp.wlan0.ipaddress", regex: /(\d+\.\d+\.\d+\.\d+)/ },
|
|
158
|
+
];
|
|
159
|
+
let ip = null;
|
|
160
|
+
let method = "";
|
|
161
|
+
for (const m of methods) {
|
|
162
|
+
const result = await ctx.bridge.shell(m.cmd, {
|
|
163
|
+
device: serial, ignoreExitCode: true,
|
|
164
|
+
});
|
|
165
|
+
const match = result.stdout.match(m.regex);
|
|
166
|
+
if (match && match[1] && !match[1].startsWith("127.")) {
|
|
167
|
+
ip = match[1];
|
|
168
|
+
method = m.cmd.split("|")[0].trim().split(" ")[0];
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (!ip) {
|
|
173
|
+
return {
|
|
174
|
+
content: [{ type: "text", text: `Could not determine WiFi IP for ${serial}. Device may not be connected to WiFi.` }],
|
|
175
|
+
isError: true,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
// Check if ADB TCP is already enabled
|
|
179
|
+
const propsResult = await ctx.bridge.shell("getprop service.adb.tcp.port", {
|
|
180
|
+
device: serial, ignoreExitCode: true,
|
|
181
|
+
});
|
|
182
|
+
const tcpPort = propsResult.stdout.trim();
|
|
183
|
+
const adbTcpEnabled = tcpPort && tcpPort !== "0" && tcpPort !== "-1";
|
|
184
|
+
const sections = [];
|
|
185
|
+
sections.push(`Device: ${serial}`);
|
|
186
|
+
sections.push(`WiFi IP: ${ip} (via ${method})`);
|
|
187
|
+
sections.push(`ADB TCP: ${adbTcpEnabled ? `enabled on port ${tcpPort}` : "not enabled"}`);
|
|
188
|
+
if (adbTcpEnabled) {
|
|
189
|
+
sections.push(`\nConnect wirelessly: adb_connect host="${ip}:${tcpPort}"`);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
sections.push(`\nTo enable wireless debugging:`);
|
|
193
|
+
sections.push(` 1. adb_tcpip (switches USB device to TCP mode on port 5555)`);
|
|
194
|
+
sections.push(` 2. adb_connect host="${ip}:5555"`);
|
|
195
|
+
}
|
|
196
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
ctx.server.tool("adb_network_auto_connect", "Discover and automatically connect to ADB devices on the local network. Combines network scanning with adb connect in one step.", {
|
|
203
|
+
ipRange: z.string().optional().describe("IP range to scan (e.g., '192.168.1.1-254')"),
|
|
204
|
+
port: z.number().min(1).max(65535).optional().default(5555).describe("ADB port to probe and connect (1-65535, default 5555)"),
|
|
205
|
+
device: z.string().optional().describe("Device serial (used to determine local subnet for ARP-based discovery)"),
|
|
206
|
+
}, async ({ ipRange, port, device }) => {
|
|
207
|
+
try {
|
|
208
|
+
const sections = [];
|
|
209
|
+
sections.push("=== Auto-Connect Discovery ===\n");
|
|
210
|
+
// Collect candidate IPs
|
|
211
|
+
const candidates = new Set();
|
|
212
|
+
if (ipRange) {
|
|
213
|
+
const ips = expandIpRange(ipRange);
|
|
214
|
+
for (const ip of ips)
|
|
215
|
+
candidates.add(ip);
|
|
216
|
+
}
|
|
217
|
+
// ARP-based discovery
|
|
218
|
+
try {
|
|
219
|
+
const resolved = device ? await ctx.deviceManager.resolveDevice(device) : await ctx.deviceManager.resolveDevice();
|
|
220
|
+
const arpResult = await ctx.bridge.shell("ip neigh show 2>/dev/null || arp -a 2>/dev/null", {
|
|
221
|
+
device: resolved.serial, timeout: 5000, ignoreExitCode: true,
|
|
222
|
+
});
|
|
223
|
+
for (const m of arpResult.stdout.matchAll(/(\d+\.\d+\.\d+\.\d+)/g)) {
|
|
224
|
+
if (!m[1].startsWith("127.") && !m[1].endsWith(".255"))
|
|
225
|
+
candidates.add(m[1]);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch { /* no device for ARP */ }
|
|
229
|
+
if (candidates.size === 0) {
|
|
230
|
+
sections.push("No candidate IPs. Provide ipRange (e.g., '192.168.1.1-254').");
|
|
231
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
232
|
+
}
|
|
233
|
+
sections.push(`Scanning ${candidates.size} hosts on port ${port}...`);
|
|
234
|
+
// Probe all candidates
|
|
235
|
+
const found = [];
|
|
236
|
+
const allIps = Array.from(candidates);
|
|
237
|
+
const BATCH_SIZE = 20;
|
|
238
|
+
for (let batch = 0; batch < allIps.length; batch += BATCH_SIZE) {
|
|
239
|
+
const batchIps = allIps.slice(batch, batch + BATCH_SIZE);
|
|
240
|
+
const probes = batchIps.map((ip) => probePort(ip, port, 2000).then((open) => {
|
|
241
|
+
if (open)
|
|
242
|
+
found.push(ip);
|
|
243
|
+
}));
|
|
244
|
+
await Promise.all(probes);
|
|
245
|
+
}
|
|
246
|
+
if (found.length === 0) {
|
|
247
|
+
sections.push("\nNo ADB listeners found.");
|
|
248
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
249
|
+
}
|
|
250
|
+
sections.push(`\nFound ${found.length} device(s). Connecting...\n`);
|
|
251
|
+
// Try to connect to each discovered device
|
|
252
|
+
let connected = 0;
|
|
253
|
+
for (const ip of found) {
|
|
254
|
+
const target = `${ip}:${port}`;
|
|
255
|
+
try {
|
|
256
|
+
const result = await ctx.bridge.exec(["connect", target], { timeout: 10000 });
|
|
257
|
+
const output = result.stdout.trim();
|
|
258
|
+
const success = output.includes("connected") && !output.includes("failed");
|
|
259
|
+
if (success) {
|
|
260
|
+
connected++;
|
|
261
|
+
sections.push(` ✓ Connected: ${target}`);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
sections.push(` ✗ Failed: ${target} — ${output}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
sections.push(` ✗ Error: ${target} — ${err instanceof Error ? err.message : err}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Invalidate device cache after connections
|
|
272
|
+
ctx.deviceManager.invalidateCache();
|
|
273
|
+
sections.push(`\nResult: ${connected} device(s) connected out of ${found.length} found.`);
|
|
274
|
+
if (connected > 0) {
|
|
275
|
+
sections.push("Use adb_devices to see all connected devices.");
|
|
276
|
+
}
|
|
277
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=network-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-discovery.js","sourceRoot":"","sources":["../../src/tools/network-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTA Update Monitoring — Track system updates across sessions.
|
|
3
|
+
*
|
|
4
|
+
* Captures a comprehensive system fingerprint (build ID, security patch,
|
|
5
|
+
* bootloader version, kernel, baseband firmware) and compares against
|
|
6
|
+
* previously saved state to detect when a device has been updated.
|
|
7
|
+
*
|
|
8
|
+
* Useful for: detecting post-OTA behavioral changes in apps under test,
|
|
9
|
+
* verifying security patch currency, and triggering automatic re-baselining
|
|
10
|
+
* of performance and screenshots after updates.
|
|
11
|
+
*
|
|
12
|
+
* Fingerprints are saved as JSON in {tempDir}/ota-fingerprints/.
|
|
13
|
+
*/
|
|
14
|
+
import { ToolContext } from "../tool-context.js";
|
|
15
|
+
export declare function registerOtaMonitorTools(ctx: ToolContext): void;
|
|
16
|
+
//# sourceMappingURL=ota-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ota-monitor.d.ts","sourceRoot":"","sources":["../../src/tools/ota-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAuFjD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAiK9D"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTA Update Monitoring — Track system updates across sessions.
|
|
3
|
+
*
|
|
4
|
+
* Captures a comprehensive system fingerprint (build ID, security patch,
|
|
5
|
+
* bootloader version, kernel, baseband firmware) and compares against
|
|
6
|
+
* previously saved state to detect when a device has been updated.
|
|
7
|
+
*
|
|
8
|
+
* Useful for: detecting post-OTA behavioral changes in apps under test,
|
|
9
|
+
* verifying security patch currency, and triggering automatic re-baselining
|
|
10
|
+
* of performance and screenshots after updates.
|
|
11
|
+
*
|
|
12
|
+
* Fingerprints are saved as JSON in {tempDir}/ota-fingerprints/.
|
|
13
|
+
*/
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
import { join } from "path";
|
|
16
|
+
import { mkdirSync, writeFileSync, readFileSync, existsSync, readdirSync } from "fs";
|
|
17
|
+
import { OutputProcessor } from "../middleware/output-processor.js";
|
|
18
|
+
function getFingerprintDir(tempDir) {
|
|
19
|
+
return join(tempDir, "ota-fingerprints");
|
|
20
|
+
}
|
|
21
|
+
async function captureFingerprint(ctx, serial) {
|
|
22
|
+
const props = await ctx.deviceManager.getDeviceProps(serial);
|
|
23
|
+
// Get kernel version separately (not in getprop)
|
|
24
|
+
const kernelResult = await ctx.bridge.shell("uname -r", {
|
|
25
|
+
device: serial, ignoreExitCode: true,
|
|
26
|
+
});
|
|
27
|
+
// Check A/B partition slot
|
|
28
|
+
const slotResult = await ctx.bridge.shell("getprop ro.boot.slot_suffix", {
|
|
29
|
+
device: serial, ignoreExitCode: true,
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
timestamp: new Date().toISOString(),
|
|
33
|
+
device: serial,
|
|
34
|
+
model: props["ro.product.model"] ?? "unknown",
|
|
35
|
+
buildFingerprint: props["ro.build.fingerprint"] ?? "unknown",
|
|
36
|
+
buildId: props["ro.build.display.id"] ?? "unknown",
|
|
37
|
+
buildType: props["ro.build.type"] ?? "unknown",
|
|
38
|
+
androidVersion: props["ro.build.version.release"] ?? "unknown",
|
|
39
|
+
sdkLevel: props["ro.build.version.sdk"] ?? "unknown",
|
|
40
|
+
securityPatch: props["ro.build.version.security_patch"] ?? "unknown",
|
|
41
|
+
bootloaderVersion: props["ro.bootimage.build.fingerprint"] ?? props["ro.bootloader"] ?? "unknown",
|
|
42
|
+
basebandVersion: props["gsm.version.baseband"] ?? "unknown",
|
|
43
|
+
kernelVersion: kernelResult.stdout.trim() || "unknown",
|
|
44
|
+
buildDate: props["ro.build.date"] ?? "unknown",
|
|
45
|
+
incrementalBuild: props["ro.build.version.incremental"] ?? "unknown",
|
|
46
|
+
abUpdatePartition: slotResult.stdout.trim() || "none",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function compareFingerprints(saved, current) {
|
|
50
|
+
const fields = [
|
|
51
|
+
{ key: "buildFingerprint", label: "Build Fingerprint" },
|
|
52
|
+
{ key: "buildId", label: "Build ID" },
|
|
53
|
+
{ key: "androidVersion", label: "Android Version" },
|
|
54
|
+
{ key: "sdkLevel", label: "SDK Level" },
|
|
55
|
+
{ key: "securityPatch", label: "Security Patch" },
|
|
56
|
+
{ key: "bootloaderVersion", label: "Bootloader" },
|
|
57
|
+
{ key: "basebandVersion", label: "Baseband Firmware" },
|
|
58
|
+
{ key: "kernelVersion", label: "Kernel" },
|
|
59
|
+
{ key: "incrementalBuild", label: "Incremental Build" },
|
|
60
|
+
{ key: "abUpdatePartition", label: "A/B Slot" },
|
|
61
|
+
];
|
|
62
|
+
const changed = [];
|
|
63
|
+
const unchanged = [];
|
|
64
|
+
for (const { key, label } of fields) {
|
|
65
|
+
const oldVal = saved[key];
|
|
66
|
+
const newVal = current[key];
|
|
67
|
+
if (oldVal !== newVal) {
|
|
68
|
+
changed.push(`${label}: "${oldVal}" → "${newVal}"`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
unchanged.push(`${label}: ${newVal}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { changed, unchanged };
|
|
75
|
+
}
|
|
76
|
+
export function registerOtaMonitorTools(ctx) {
|
|
77
|
+
ctx.server.tool("adb_ota_fingerprint", "Capture and save the current system fingerprint: build ID, Android version, security patch, bootloader, baseband firmware, kernel version, and A/B partition slot. Saves to a timestamped JSON file for later comparison.", {
|
|
78
|
+
label: z.string().optional().default("current").describe("Label for this fingerprint (e.g., 'pre-update', 'post-ota')"),
|
|
79
|
+
device: z.string().optional().describe("Device serial"),
|
|
80
|
+
}, async ({ label, device }) => {
|
|
81
|
+
try {
|
|
82
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
83
|
+
const serial = resolved.serial;
|
|
84
|
+
const fp = await captureFingerprint(ctx, serial);
|
|
85
|
+
const dir = getFingerprintDir(ctx.config.tempDir);
|
|
86
|
+
if (!existsSync(dir))
|
|
87
|
+
mkdirSync(dir, { recursive: true });
|
|
88
|
+
const safeLabel = label.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
89
|
+
const safeDevice = serial.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
90
|
+
const filename = `${safeDevice}_${safeLabel}_${Date.now()}.json`;
|
|
91
|
+
const filePath = join(dir, filename);
|
|
92
|
+
writeFileSync(filePath, JSON.stringify(fp, null, 2));
|
|
93
|
+
const summary = [];
|
|
94
|
+
summary.push(`System fingerprint captured: ${label}`);
|
|
95
|
+
summary.push(`Device: ${fp.model} (${serial})`);
|
|
96
|
+
summary.push(`Android: ${fp.androidVersion} (SDK ${fp.sdkLevel})`);
|
|
97
|
+
summary.push(`Build: ${fp.buildId}`);
|
|
98
|
+
summary.push(`Security Patch: ${fp.securityPatch}`);
|
|
99
|
+
summary.push(`Baseband: ${fp.basebandVersion}`);
|
|
100
|
+
summary.push(`Bootloader: ${fp.bootloaderVersion}`);
|
|
101
|
+
summary.push(`Kernel: ${fp.kernelVersion}`);
|
|
102
|
+
summary.push(`A/B Slot: ${fp.abUpdatePartition}`);
|
|
103
|
+
summary.push(`Saved: ${filePath}`);
|
|
104
|
+
return { content: [{ type: "text", text: summary.join("\n") }] };
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
ctx.server.tool("adb_ota_check", "Compare the current system state against a saved fingerprint. Detects OTA updates by identifying changes in build ID, security patch, baseband firmware, bootloader, or kernel version.", {
|
|
111
|
+
fingerprintPath: z.string().optional().describe("Path to saved fingerprint JSON. If omitted, compares against the most recent fingerprint for this device."),
|
|
112
|
+
device: z.string().optional().describe("Device serial"),
|
|
113
|
+
}, async ({ fingerprintPath, device }) => {
|
|
114
|
+
try {
|
|
115
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
116
|
+
const serial = resolved.serial;
|
|
117
|
+
// Find the fingerprint to compare against
|
|
118
|
+
let savedPath = fingerprintPath;
|
|
119
|
+
if (!savedPath) {
|
|
120
|
+
const dir = getFingerprintDir(ctx.config.tempDir);
|
|
121
|
+
if (!existsSync(dir)) {
|
|
122
|
+
return { content: [{ type: "text", text: "No saved fingerprints. Use adb_ota_fingerprint to capture one first." }], isError: true };
|
|
123
|
+
}
|
|
124
|
+
const safeDevice = serial.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
125
|
+
const files = readdirSync(dir)
|
|
126
|
+
.filter((f) => f.startsWith(safeDevice) && f.endsWith(".json"))
|
|
127
|
+
.sort()
|
|
128
|
+
.reverse();
|
|
129
|
+
if (files.length === 0) {
|
|
130
|
+
return { content: [{ type: "text", text: `No saved fingerprints for device ${serial}. Use adb_ota_fingerprint first.` }], isError: true };
|
|
131
|
+
}
|
|
132
|
+
savedPath = join(dir, files[0]);
|
|
133
|
+
}
|
|
134
|
+
if (!existsSync(savedPath)) {
|
|
135
|
+
return { content: [{ type: "text", text: `Fingerprint file not found: ${savedPath}` }], isError: true };
|
|
136
|
+
}
|
|
137
|
+
const saved = JSON.parse(readFileSync(savedPath, "utf-8"));
|
|
138
|
+
const current = await captureFingerprint(ctx, serial);
|
|
139
|
+
const { changed, unchanged } = compareFingerprints(saved, current);
|
|
140
|
+
const sections = [];
|
|
141
|
+
sections.push(`=== OTA Update Check ===`);
|
|
142
|
+
sections.push(`Saved: ${saved.timestamp} (${saved.buildId})`);
|
|
143
|
+
sections.push(`Current: ${current.buildId}`);
|
|
144
|
+
sections.push(`Device: ${current.model} (${serial})\n`);
|
|
145
|
+
if (changed.length === 0) {
|
|
146
|
+
sections.push("Result: ✓ NO UPDATE DETECTED — system state unchanged.\n");
|
|
147
|
+
sections.push(`Unchanged fields (${unchanged.length}):`);
|
|
148
|
+
for (const u of unchanged)
|
|
149
|
+
sections.push(` ✓ ${u}`);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
sections.push(`Result: ⚠ UPDATE DETECTED — ${changed.length} field(s) changed.\n`);
|
|
153
|
+
sections.push("Changed:");
|
|
154
|
+
for (const c of changed)
|
|
155
|
+
sections.push(` ✗ ${c}`);
|
|
156
|
+
if (unchanged.length > 0) {
|
|
157
|
+
sections.push("\nUnchanged:");
|
|
158
|
+
for (const u of unchanged)
|
|
159
|
+
sections.push(` ✓ ${u}`);
|
|
160
|
+
}
|
|
161
|
+
sections.push("\nRecommendation: Re-baseline performance (adb_regression_baseline) and screenshots (adb_screenshot_baseline) after an OTA update.");
|
|
162
|
+
}
|
|
163
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
ctx.server.tool("adb_ota_history", "List all saved system fingerprints for a device, showing version progression over time. Highlights changes between consecutive snapshots.", {
|
|
170
|
+
device: z.string().optional().describe("Device serial (filters to this device). Omit for all devices."),
|
|
171
|
+
}, async ({ device }) => {
|
|
172
|
+
try {
|
|
173
|
+
const dir = getFingerprintDir(ctx.config.tempDir);
|
|
174
|
+
if (!existsSync(dir)) {
|
|
175
|
+
return { content: [{ type: "text", text: "No fingerprint history. Use adb_ota_fingerprint to start tracking." }] };
|
|
176
|
+
}
|
|
177
|
+
let deviceFilter = "";
|
|
178
|
+
if (device) {
|
|
179
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
180
|
+
deviceFilter = resolved.serial.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
181
|
+
}
|
|
182
|
+
const files = readdirSync(dir)
|
|
183
|
+
.filter((f) => f.endsWith(".json") && (!deviceFilter || f.startsWith(deviceFilter)))
|
|
184
|
+
.sort();
|
|
185
|
+
if (files.length === 0) {
|
|
186
|
+
return { content: [{ type: "text", text: device ? `No fingerprints for device ${device}.` : "No fingerprints saved." }] };
|
|
187
|
+
}
|
|
188
|
+
const fingerprints = [];
|
|
189
|
+
for (const file of files) {
|
|
190
|
+
try {
|
|
191
|
+
fingerprints.push(JSON.parse(readFileSync(join(dir, file), "utf-8")));
|
|
192
|
+
}
|
|
193
|
+
catch { /* skip corrupt */ }
|
|
194
|
+
}
|
|
195
|
+
const lines = [`${fingerprints.length} fingerprint(s):\n`];
|
|
196
|
+
for (let i = 0; i < fingerprints.length; i++) {
|
|
197
|
+
const fp = fingerprints[i];
|
|
198
|
+
const changeMarker = i > 0 && fp.buildFingerprint !== fingerprints[i - 1].buildFingerprint
|
|
199
|
+
? " ⚠ UPDATE"
|
|
200
|
+
: "";
|
|
201
|
+
lines.push(`[${i + 1}] ${fp.timestamp.substring(0, 19)} | ${fp.model} | Android ${fp.androidVersion} | ${fp.buildId} | Patch: ${fp.securityPatch}${changeMarker}`);
|
|
202
|
+
}
|
|
203
|
+
lines.push(`\nDirectory: ${dir}`);
|
|
204
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=ota-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ota-monitor.js","sourceRoot":"","sources":["../../src/tools/ota-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../../src/tools/packages.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAiR3D"}
|