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,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split APK Management Tools — App bundles, split APKs, and APEX modules.
|
|
3
|
+
*
|
|
4
|
+
* Modern Android apps often ship as App Bundles (AAB) which produce split
|
|
5
|
+
* APKs on the device. This module handles installation of multiple APK
|
|
6
|
+
* splits, inspection of installed splits, extraction for analysis, and
|
|
7
|
+
* APEX module listing.
|
|
8
|
+
*
|
|
9
|
+
* Extends the core package tools with modern delivery format support.
|
|
10
|
+
*/
|
|
11
|
+
import { ToolContext } from "../tool-context.js";
|
|
12
|
+
export declare function registerSplitApkTools(ctx: ToolContext): void;
|
|
13
|
+
//# sourceMappingURL=split-apk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split-apk.d.ts","sourceRoot":"","sources":["../../src/tools/split-apk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAiQ5D"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split APK Management Tools — App bundles, split APKs, and APEX modules.
|
|
3
|
+
*
|
|
4
|
+
* Modern Android apps often ship as App Bundles (AAB) which produce split
|
|
5
|
+
* APKs on the device. This module handles installation of multiple APK
|
|
6
|
+
* splits, inspection of installed splits, extraction for analysis, and
|
|
7
|
+
* APEX module listing.
|
|
8
|
+
*
|
|
9
|
+
* Extends the core package tools with modern delivery format support.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { join, resolve } from "path";
|
|
13
|
+
import { mkdirSync, existsSync, statSync } from "fs";
|
|
14
|
+
import { OutputProcessor } from "../middleware/output-processor.js";
|
|
15
|
+
import { validateShellArg, shellEscape } from "../middleware/sanitize.js";
|
|
16
|
+
export function registerSplitApkTools(ctx) {
|
|
17
|
+
ctx.server.tool("adb_install_bundle", "Install multiple APK splits (app bundle) on the device using `install-multiple`. Provide all split APK files — base APK plus config splits (language, density, ABI).", {
|
|
18
|
+
apkPaths: z.array(z.string()).min(1).describe("Array of local paths to split APK files (base + config splits)"),
|
|
19
|
+
device: z.string().optional().describe("Device serial"),
|
|
20
|
+
replace: z.boolean().optional().default(true).describe("Replace existing app (-r)"),
|
|
21
|
+
allowDowngrade: z.boolean().optional().default(false).describe("Allow version downgrade (-d)"),
|
|
22
|
+
}, async ({ apkPaths, device, replace, allowDowngrade }) => {
|
|
23
|
+
try {
|
|
24
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
25
|
+
const serial = resolved.serial;
|
|
26
|
+
const args = ["install-multiple"];
|
|
27
|
+
if (replace)
|
|
28
|
+
args.push("-r");
|
|
29
|
+
if (allowDowngrade)
|
|
30
|
+
args.push("-d");
|
|
31
|
+
args.push(...apkPaths);
|
|
32
|
+
const result = await ctx.bridge.exec(args, {
|
|
33
|
+
device: serial,
|
|
34
|
+
timeout: 180000, // 3 minutes for large bundles
|
|
35
|
+
});
|
|
36
|
+
const output = result.stdout.trim();
|
|
37
|
+
const success = output.includes("Success");
|
|
38
|
+
return {
|
|
39
|
+
content: [{
|
|
40
|
+
type: "text",
|
|
41
|
+
text: `${success ? "✓" : "✗"} Install bundle (${apkPaths.length} splits):\n${output}`,
|
|
42
|
+
}],
|
|
43
|
+
isError: !success,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
ctx.server.tool("adb_list_splits", "List all APK split paths installed for a package. Shows the base APK and any configuration splits (language, screen density, ABI).", {
|
|
51
|
+
packageName: z.string().describe("Package name (e.g., 'com.example.app')"),
|
|
52
|
+
device: z.string().optional().describe("Device serial"),
|
|
53
|
+
}, async ({ packageName, device }) => {
|
|
54
|
+
try {
|
|
55
|
+
const pkgErr = validateShellArg(packageName, "packageName");
|
|
56
|
+
if (pkgErr)
|
|
57
|
+
return { content: [{ type: "text", text: pkgErr }], isError: true };
|
|
58
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
59
|
+
const serial = resolved.serial;
|
|
60
|
+
// Get all APK paths for the package
|
|
61
|
+
const pathResult = await ctx.bridge.shell(`pm path ${packageName}`, {
|
|
62
|
+
device: serial, ignoreExitCode: true,
|
|
63
|
+
});
|
|
64
|
+
const paths = pathResult.stdout.split("\n")
|
|
65
|
+
.map((l) => l.replace("package:", "").trim())
|
|
66
|
+
.filter((l) => l.length > 0);
|
|
67
|
+
if (paths.length === 0) {
|
|
68
|
+
return { content: [{ type: "text", text: `Package "${packageName}" not found or has no APK paths.` }], isError: true };
|
|
69
|
+
}
|
|
70
|
+
// Classify splits
|
|
71
|
+
const base = paths.filter((p) => p.includes("base.apk") || !p.includes("split_"));
|
|
72
|
+
const splits = paths.filter((p) => p.includes("split_"));
|
|
73
|
+
const sections = [];
|
|
74
|
+
sections.push(`Package: ${packageName}`);
|
|
75
|
+
sections.push(`Total APKs: ${paths.length} (${base.length} base + ${splits.length} splits)\n`);
|
|
76
|
+
if (base.length > 0) {
|
|
77
|
+
sections.push("Base APK(s):");
|
|
78
|
+
for (const p of base)
|
|
79
|
+
sections.push(` ${p}`);
|
|
80
|
+
}
|
|
81
|
+
if (splits.length > 0) {
|
|
82
|
+
sections.push("\nSplit APKs:");
|
|
83
|
+
for (const p of splits) {
|
|
84
|
+
// Classify the split type
|
|
85
|
+
const filename = p.split("/").pop() ?? p;
|
|
86
|
+
let splitType = "config";
|
|
87
|
+
if (filename.includes("config.")) {
|
|
88
|
+
const configMatch = filename.match(/config\.(.+)\.apk/);
|
|
89
|
+
if (configMatch)
|
|
90
|
+
splitType = configMatch[1];
|
|
91
|
+
}
|
|
92
|
+
sections.push(` [${splitType}] ${p}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Get sizes
|
|
96
|
+
if (paths.length > 0) {
|
|
97
|
+
const sizeCmd = paths.map((p) => `stat -c '%s' '${shellEscape(p)}'`).join("; ");
|
|
98
|
+
const sizeResult = await ctx.bridge.shell(sizeCmd, {
|
|
99
|
+
device: serial, ignoreExitCode: true,
|
|
100
|
+
});
|
|
101
|
+
const sizes = sizeResult.stdout.split("\n").map((s) => parseInt(s.trim(), 10)).filter((n) => !isNaN(n));
|
|
102
|
+
const totalBytes = sizes.reduce((a, b) => a + b, 0);
|
|
103
|
+
if (totalBytes > 0) {
|
|
104
|
+
sections.push(`\nTotal size: ${(totalBytes / 1024 / 1024).toFixed(1)} MB`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
ctx.server.tool("adb_extract_apks", "Pull all APK splits for a package from the device to a local directory. Useful for analysis, backup, or transfer to another device.", {
|
|
114
|
+
packageName: z.string().describe("Package name to extract"),
|
|
115
|
+
outputDir: z.string().optional().describe("Local output directory (default: temp dir)"),
|
|
116
|
+
device: z.string().optional().describe("Device serial"),
|
|
117
|
+
}, async ({ packageName, outputDir, device }) => {
|
|
118
|
+
try {
|
|
119
|
+
const pkgErr = validateShellArg(packageName, "packageName");
|
|
120
|
+
if (pkgErr)
|
|
121
|
+
return { content: [{ type: "text", text: pkgErr }], isError: true };
|
|
122
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
123
|
+
const serial = resolved.serial;
|
|
124
|
+
// Get all APK paths
|
|
125
|
+
const pathResult = await ctx.bridge.shell(`pm path ${packageName}`, {
|
|
126
|
+
device: serial, ignoreExitCode: true,
|
|
127
|
+
});
|
|
128
|
+
const paths = pathResult.stdout.split("\n")
|
|
129
|
+
.map((l) => l.replace("package:", "").trim())
|
|
130
|
+
.filter((l) => l.length > 0);
|
|
131
|
+
if (paths.length === 0) {
|
|
132
|
+
return { content: [{ type: "text", text: `Package "${packageName}" not found.` }], isError: true };
|
|
133
|
+
}
|
|
134
|
+
// Create output directory — containment check if user-supplied
|
|
135
|
+
const safePkg = packageName.replace(/[^a-zA-Z0-9_.-]/g, "_");
|
|
136
|
+
const destDir = outputDir ?? join(ctx.config.tempDir, "extracted", safePkg);
|
|
137
|
+
if (outputDir) {
|
|
138
|
+
// User-supplied path — verify it resolves inside tempDir to prevent path traversal
|
|
139
|
+
const resolvedDest = resolve(destDir);
|
|
140
|
+
const resolvedTemp = resolve(ctx.config.tempDir);
|
|
141
|
+
if (!resolvedDest.startsWith(resolvedTemp)) {
|
|
142
|
+
return {
|
|
143
|
+
content: [{ type: "text", text: `Output directory must be inside the temp directory (${ctx.config.tempDir}). Got: ${destDir}` }],
|
|
144
|
+
isError: true,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (!existsSync(destDir))
|
|
149
|
+
mkdirSync(destDir, { recursive: true });
|
|
150
|
+
// Pull each APK
|
|
151
|
+
const results = [];
|
|
152
|
+
results.push(`Extracting ${paths.length} APK(s) for ${packageName}...\n`);
|
|
153
|
+
let totalBytes = 0;
|
|
154
|
+
for (const remotePath of paths) {
|
|
155
|
+
const filename = remotePath.split("/").pop() ?? "unknown.apk";
|
|
156
|
+
const localPath = join(destDir, filename);
|
|
157
|
+
try {
|
|
158
|
+
await ctx.bridge.exec(["pull", remotePath, localPath], {
|
|
159
|
+
device: serial, timeout: 60000,
|
|
160
|
+
});
|
|
161
|
+
const size = statSync(localPath).size;
|
|
162
|
+
totalBytes += size;
|
|
163
|
+
results.push(` ✓ ${filename} (${(size / 1024).toFixed(0)} KB)`);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
results.push(` ✗ ${filename}: ${err instanceof Error ? err.message : err}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
results.push(`\nTotal: ${(totalBytes / 1024 / 1024).toFixed(1)} MB`);
|
|
170
|
+
results.push(`Saved to: ${destDir}`);
|
|
171
|
+
return { content: [{ type: "text", text: results.join("\n") }] };
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
ctx.server.tool("adb_apex_list", "List installed APEX modules on the device. APEX (Android Pony EXpress) modules deliver updatable system components. Shows module name, version, and active/staged status.", {
|
|
178
|
+
device: z.string().optional().describe("Device serial"),
|
|
179
|
+
}, async ({ device }) => {
|
|
180
|
+
try {
|
|
181
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
182
|
+
const serial = resolved.serial;
|
|
183
|
+
// Try pm list packages --apex-only (Android 10+)
|
|
184
|
+
const apexResult = await ctx.bridge.shell("pm list packages --apex-only", {
|
|
185
|
+
device: serial, ignoreExitCode: true,
|
|
186
|
+
});
|
|
187
|
+
if (apexResult.stdout.includes("Unknown option")) {
|
|
188
|
+
// Fallback for older Android or devices that don't support the flag
|
|
189
|
+
const fallback = await ctx.bridge.shell("ls /apex/ 2>/dev/null", {
|
|
190
|
+
device: serial, ignoreExitCode: true,
|
|
191
|
+
});
|
|
192
|
+
const dirs = fallback.stdout.split("\n").map((l) => l.trim()).filter((l) => l.length > 0 && !l.startsWith("total"));
|
|
193
|
+
if (dirs.length === 0) {
|
|
194
|
+
return { content: [{ type: "text", text: "No APEX modules found (device may not support APEX)." }] };
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
content: [{
|
|
198
|
+
type: "text",
|
|
199
|
+
text: `${dirs.length} APEX module(s) in /apex/:\n\n${dirs.join("\n")}\n\nNote: --apex-only flag not supported; showing directory listing.`,
|
|
200
|
+
}],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const packages = apexResult.stdout.split("\n")
|
|
204
|
+
.map((l) => l.replace("package:", "").trim())
|
|
205
|
+
.filter((l) => l.length > 0)
|
|
206
|
+
.sort();
|
|
207
|
+
if (packages.length === 0) {
|
|
208
|
+
return { content: [{ type: "text", text: "No APEX modules installed." }] };
|
|
209
|
+
}
|
|
210
|
+
// Get version info for each APEX
|
|
211
|
+
const sections = [`${packages.length} APEX module(s):\n`];
|
|
212
|
+
// Batch query — get dumpsys for a few key ones
|
|
213
|
+
for (const pkg of packages) {
|
|
214
|
+
const infoResult = await ctx.bridge.shell(`dumpsys package ${pkg} | grep -E 'versionName|versionCode|apexModuleName' | head -3`, {
|
|
215
|
+
device: serial, timeout: 5000, ignoreExitCode: true,
|
|
216
|
+
});
|
|
217
|
+
const info = infoResult.stdout.trim();
|
|
218
|
+
const versionMatch = info.match(/versionName=(\S+)/);
|
|
219
|
+
const version = versionMatch ? ` v${versionMatch[1]}` : "";
|
|
220
|
+
sections.push(`${pkg}${version}`);
|
|
221
|
+
}
|
|
222
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=split-apk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split-apk.js","sourceRoot":"","sources":["../../src/tools/split-apk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE1E,MAAM,UAAU,qBAAqB,CAAC,GAAgB;IAEpD,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,oBAAoB,EACpB,sKAAsK,EACtK;QACE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QAC/G,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACvD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACnF,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KAC/F,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAE/B,MAAM,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAClC,IAAI,OAAO;gBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,cAAc;gBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YAEvB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;gBACzC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,MAAM,EAAE,8BAA8B;aAChD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAE3C,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,oBAAoB,QAAQ,CAAC,MAAM,cAAc,MAAM,EAAE;qBACtF,CAAC;gBACF,OAAO,EAAE,CAAC,OAAO;aAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,iBAAiB,EACjB,oIAAoI,EACpI;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QAC1E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACxD,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAC5D,IAAI,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAEhF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAE/B,oCAAoC;YACpC,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,WAAW,EAAE,EAAE;gBAClE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI;aACrC,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;iBACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAE/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,WAAW,kCAAkC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACzH,CAAC;YAED,kBAAkB;YAClB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEzD,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,WAAW,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;YAE/F,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC9B,KAAK,MAAM,CAAC,IAAI,IAAI;oBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,0BAA0B;oBAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACzC,IAAI,SAAS,GAAG,QAAQ,CAAC;oBACzB,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;wBACxD,IAAI,WAAW;4BAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;oBAC9C,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC,MAAM,SAAS,KAAK,CAAC,EAAE,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAED,YAAY;YACZ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChF,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;oBACjD,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI;iBACrC,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxG,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBACnB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,kBAAkB,EAClB,qIAAqI,EACrI;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC3D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACvF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACxD,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAC5D,IAAI,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAEhF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAE/B,oBAAoB;YACpB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,WAAW,EAAE,EAAE;gBAClE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI;aACrC,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;iBACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAE/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,WAAW,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACrG,CAAC;YAED,+DAA+D;YAC/D,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAC5E,IAAI,SAAS,EAAE,CAAC;gBACd,mFAAmF;gBACnF,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;gBACtC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACjD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC3C,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uDAAuD,GAAG,CAAC,MAAM,CAAC,OAAO,WAAW,OAAO,EAAE,EAAE,CAAC;wBAChI,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAElE,gBAAgB;YAChB,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,MAAM,eAAe,WAAW,OAAO,CAAC,CAAC;YAE1E,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,aAAa,CAAC;gBAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAE1C,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE;wBACrD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;qBAC/B,CAAC,CAAC;oBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;oBACtC,UAAU,IAAI,IAAI,CAAC;oBACnB,OAAO,CAAC,IAAI,CAAC,OAAO,QAAQ,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACnE,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,OAAO,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;YAErC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,eAAe,EACf,2KAA2K,EAC3K;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACxD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAE/B,iDAAiD;YACjD,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBACxE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI;aACrC,CAAC,CAAC;YAEH,IAAI,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACjD,oEAAoE;gBACpE,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;oBAC/D,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI;iBACrC,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;gBAEpH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sDAAsD,EAAE,CAAC,EAAE,CAAC;gBACvG,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,iCAAiC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sEAAsE;yBAC3I,CAAC;iBACH,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;iBAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC3B,IAAI,EAAE,CAAC;YAEV,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,EAAE,CAAC;YAC7E,CAAC;YAED,iCAAiC;YACjC,MAAM,QAAQ,GAAa,CAAC,GAAG,QAAQ,CAAC,MAAM,oBAAoB,CAAC,CAAC;YAEpE,+CAA+C;YAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,+DAA+D,EAAE;oBAC/H,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI;iBACpD,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACtC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,OAAO,EAAE,CAAC,CAAC;YACpC,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automated Test Generation — Generate workflow JSON from live UI and intent analysis.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes the current screen's UI hierarchy and a package's registered
|
|
5
|
+
* intents to auto-generate repeatable test workflows compatible with
|
|
6
|
+
* the workflow orchestration engine (adb_workflow_run).
|
|
7
|
+
*
|
|
8
|
+
* Combines UI dump analysis (interactive elements, navigation targets)
|
|
9
|
+
* with intent resolution (activities, services, receivers) to produce
|
|
10
|
+
* comprehensive test coverage without manual workflow authoring.
|
|
11
|
+
*/
|
|
12
|
+
import { ToolContext } from "../tool-context.js";
|
|
13
|
+
export declare function registerTestGenTools(ctx: ToolContext): void;
|
|
14
|
+
//# sourceMappingURL=test-gen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-gen.d.ts","sourceRoot":"","sources":["../../src/tools/test-gen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAkDjD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAsP3D"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automated Test Generation — Generate workflow JSON from live UI and intent analysis.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes the current screen's UI hierarchy and a package's registered
|
|
5
|
+
* intents to auto-generate repeatable test workflows compatible with
|
|
6
|
+
* the workflow orchestration engine (adb_workflow_run).
|
|
7
|
+
*
|
|
8
|
+
* Combines UI dump analysis (interactive elements, navigation targets)
|
|
9
|
+
* with intent resolution (activities, services, receivers) to produce
|
|
10
|
+
* comprehensive test coverage without manual workflow authoring.
|
|
11
|
+
*/
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
import { mkdirSync, writeFileSync, existsSync } from "fs";
|
|
15
|
+
import { OutputProcessor } from "../middleware/output-processor.js";
|
|
16
|
+
import { validateShellArg } from "../middleware/sanitize.js";
|
|
17
|
+
import { captureUiDump, getAttr } from "../middleware/ui-dump.js";
|
|
18
|
+
function parseClickableElements(xml) {
|
|
19
|
+
const elements = [];
|
|
20
|
+
const nodeRegex = /<node\s+([^>]+)\/?>/g;
|
|
21
|
+
let match;
|
|
22
|
+
while ((match = nodeRegex.exec(xml)) !== null) {
|
|
23
|
+
const attrs = match[1];
|
|
24
|
+
if (getAttr(attrs, "clickable") !== "true")
|
|
25
|
+
continue;
|
|
26
|
+
if (getAttr(attrs, "enabled") === "false")
|
|
27
|
+
continue;
|
|
28
|
+
const boundsStr = getAttr(attrs, "bounds");
|
|
29
|
+
const boundsMatch = boundsStr.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);
|
|
30
|
+
if (!boundsMatch)
|
|
31
|
+
continue;
|
|
32
|
+
const left = parseInt(boundsMatch[1], 10);
|
|
33
|
+
const top = parseInt(boundsMatch[2], 10);
|
|
34
|
+
const right = parseInt(boundsMatch[3], 10);
|
|
35
|
+
const bottom = parseInt(boundsMatch[4], 10);
|
|
36
|
+
elements.push({
|
|
37
|
+
resourceId: getAttr(attrs, "resource-id"),
|
|
38
|
+
text: getAttr(attrs, "text"),
|
|
39
|
+
contentDesc: getAttr(attrs, "content-desc"),
|
|
40
|
+
className: getAttr(attrs, "class").replace("android.widget.", "").replace("android.view.", ""),
|
|
41
|
+
centerX: Math.round((left + right) / 2),
|
|
42
|
+
centerY: Math.round((top + bottom) / 2),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return elements;
|
|
46
|
+
}
|
|
47
|
+
function getWorkflowDir(tempDir) {
|
|
48
|
+
return join(tempDir, "workflows");
|
|
49
|
+
}
|
|
50
|
+
export function registerTestGenTools(ctx) {
|
|
51
|
+
ctx.server.tool("adb_test_gen_from_ui", "Analyze the current screen and generate a test workflow that taps each interactive element, takes screenshots, and verifies the app doesn't crash. Produces a workflow JSON compatible with adb_workflow_run.", {
|
|
52
|
+
packageName: z.string().describe("Package name to monitor during test (used for logcat filtering and crash detection)"),
|
|
53
|
+
device: z.string().optional().describe("Device serial"),
|
|
54
|
+
screenshotAfterEach: z.boolean().optional().default(true).describe("Take a screenshot after each tap"),
|
|
55
|
+
returnToStart: z.boolean().optional().default(true).describe("Press Back after each tap to return to the starting screen"),
|
|
56
|
+
}, async ({ packageName, device, screenshotAfterEach, returnToStart }) => {
|
|
57
|
+
try {
|
|
58
|
+
const pkgErr = validateShellArg(packageName, "packageName");
|
|
59
|
+
if (pkgErr)
|
|
60
|
+
return { content: [{ type: "text", text: pkgErr }], isError: true };
|
|
61
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
62
|
+
const serial = resolved.serial;
|
|
63
|
+
// Capture UI hierarchy
|
|
64
|
+
const xml = await captureUiDump(ctx.bridge, serial);
|
|
65
|
+
if (!xml) {
|
|
66
|
+
return { content: [{ type: "text", text: "Failed to capture UI hierarchy." }], isError: true };
|
|
67
|
+
}
|
|
68
|
+
const targets = parseClickableElements(xml);
|
|
69
|
+
if (targets.length === 0) {
|
|
70
|
+
return { content: [{ type: "text", text: "No interactive elements found on the current screen." }], isError: true };
|
|
71
|
+
}
|
|
72
|
+
// Generate workflow
|
|
73
|
+
const steps = [];
|
|
74
|
+
// Clear logcat first
|
|
75
|
+
steps.push({ name: "clear_logcat", action: "shell", command: "logcat -c" });
|
|
76
|
+
steps.push({ name: "initial_screenshot", action: "screenshot" });
|
|
77
|
+
for (let i = 0; i < targets.length; i++) {
|
|
78
|
+
const el = targets[i];
|
|
79
|
+
const label = el.text || el.contentDesc || el.resourceId || `element_${i}`;
|
|
80
|
+
const safeLabel = label.replace(/[^a-zA-Z0-9_-]/g, "_").substring(0, 30);
|
|
81
|
+
// Tap the element
|
|
82
|
+
steps.push({
|
|
83
|
+
name: `tap_${safeLabel}`,
|
|
84
|
+
action: "shell",
|
|
85
|
+
command: `input tap ${el.centerX} ${el.centerY}`,
|
|
86
|
+
});
|
|
87
|
+
// Wait for UI to settle
|
|
88
|
+
steps.push({ name: `wait_${safeLabel}`, action: "sleep", ms: 1000 });
|
|
89
|
+
// Screenshot after tap
|
|
90
|
+
if (screenshotAfterEach) {
|
|
91
|
+
steps.push({ name: `screenshot_${safeLabel}`, action: "screenshot" });
|
|
92
|
+
}
|
|
93
|
+
// Check for crash
|
|
94
|
+
steps.push({
|
|
95
|
+
name: `crash_check_${safeLabel}`,
|
|
96
|
+
action: "shell",
|
|
97
|
+
command: `logcat -d -b crash -t 5 | grep -Fc "${packageName}" || echo 0`,
|
|
98
|
+
capture: `crash_${i}`,
|
|
99
|
+
});
|
|
100
|
+
// Press Back to return
|
|
101
|
+
if (returnToStart) {
|
|
102
|
+
steps.push({
|
|
103
|
+
name: `back_${safeLabel}`,
|
|
104
|
+
action: "shell",
|
|
105
|
+
command: "input keyevent KEYCODE_BACK",
|
|
106
|
+
});
|
|
107
|
+
steps.push({ name: `settle_${safeLabel}`, action: "sleep", ms: 500 });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Final logcat capture
|
|
111
|
+
steps.push({
|
|
112
|
+
name: "final_logcat",
|
|
113
|
+
action: "logcat",
|
|
114
|
+
tag: packageName,
|
|
115
|
+
lines: 200,
|
|
116
|
+
capture: "app_logs",
|
|
117
|
+
});
|
|
118
|
+
const workflow = {
|
|
119
|
+
name: `ui_test_${packageName.split(".").pop()}`,
|
|
120
|
+
description: `Auto-generated UI test: ${targets.length} interactive elements on current screen`,
|
|
121
|
+
variables: { pkg: packageName },
|
|
122
|
+
steps,
|
|
123
|
+
};
|
|
124
|
+
const workflowJson = JSON.stringify(workflow, null, 2);
|
|
125
|
+
// Build summary of what was found
|
|
126
|
+
const summary = [];
|
|
127
|
+
summary.push(`Generated test workflow for ${targets.length} interactive elements:\n`);
|
|
128
|
+
for (let i = 0; i < targets.length; i++) {
|
|
129
|
+
const el = targets[i];
|
|
130
|
+
const label = el.text || el.contentDesc || el.resourceId || `(unlabeled ${el.className})`;
|
|
131
|
+
summary.push(` [${i + 1}] ${label} (${el.className}) at ${el.centerX},${el.centerY}`);
|
|
132
|
+
}
|
|
133
|
+
summary.push(`\nWorkflow: ${steps.length} steps`);
|
|
134
|
+
summary.push(`\nTo execute: use adb_workflow_run with the JSON below, or save with adb_test_gen_save.`);
|
|
135
|
+
summary.push(`\n${workflowJson}`);
|
|
136
|
+
return { content: [{ type: "text", text: OutputProcessor.process(summary.join("\n")) }] };
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
ctx.server.tool("adb_test_gen_from_intents", "Analyze a package's registered activities and intent filters to generate a test workflow that launches each exported activity and verifies it renders. Produces workflow JSON compatible with adb_workflow_run.", {
|
|
143
|
+
packageName: z.string().describe("Package name to analyze"),
|
|
144
|
+
device: z.string().optional().describe("Device serial"),
|
|
145
|
+
}, async ({ packageName, device }) => {
|
|
146
|
+
try {
|
|
147
|
+
const pkgErr = validateShellArg(packageName, "packageName");
|
|
148
|
+
if (pkgErr)
|
|
149
|
+
return { content: [{ type: "text", text: pkgErr }], isError: true };
|
|
150
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
151
|
+
const serial = resolved.serial;
|
|
152
|
+
// Get package dump to find activities
|
|
153
|
+
const dumpResult = await ctx.bridge.shell(`dumpsys package ${packageName} | grep -E 'Activity|android.intent.action'`, {
|
|
154
|
+
device: serial, timeout: 15000, ignoreExitCode: true,
|
|
155
|
+
});
|
|
156
|
+
// Extract activity component names — full regex escape (not just dots)
|
|
157
|
+
const escapedPkg = packageName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
158
|
+
const activityRegex = new RegExp(`(${escapedPkg}[/.]\\S+)`, "g");
|
|
159
|
+
const rawMatches = dumpResult.stdout.match(activityRegex) ?? [];
|
|
160
|
+
const activities = [...new Set(rawMatches)]
|
|
161
|
+
.filter((a) => !a.includes("$") && !a.includes("Resolver"))
|
|
162
|
+
.slice(0, 20); // Cap at 20 activities
|
|
163
|
+
if (activities.length === 0) {
|
|
164
|
+
return { content: [{ type: "text", text: `No activities found for ${packageName}.` }], isError: true };
|
|
165
|
+
}
|
|
166
|
+
// Generate workflow
|
|
167
|
+
const steps = [];
|
|
168
|
+
steps.push({ name: "clear_logcat", action: "shell", command: "logcat -c" });
|
|
169
|
+
for (let i = 0; i < activities.length; i++) {
|
|
170
|
+
const activity = activities[i];
|
|
171
|
+
const shortName = activity.split("/").pop() ?? activity.split(".").pop() ?? `activity_${i}`;
|
|
172
|
+
const safeName = shortName.replace(/[^a-zA-Z0-9_]/g, "_").substring(0, 30);
|
|
173
|
+
// Launch the activity
|
|
174
|
+
steps.push({
|
|
175
|
+
name: `launch_${safeName}`,
|
|
176
|
+
action: "shell",
|
|
177
|
+
command: `am start -n ${activity}`,
|
|
178
|
+
});
|
|
179
|
+
steps.push({ name: `wait_${safeName}`, action: "sleep", ms: 1500 });
|
|
180
|
+
steps.push({ name: `screenshot_${safeName}`, action: "screenshot" });
|
|
181
|
+
// Crash check
|
|
182
|
+
steps.push({
|
|
183
|
+
name: `crash_check_${safeName}`,
|
|
184
|
+
action: "shell",
|
|
185
|
+
command: `logcat -d -b crash -t 5 | grep -Fc "{{pkg}}" || echo 0`,
|
|
186
|
+
capture: `crash_${i}`,
|
|
187
|
+
});
|
|
188
|
+
// Return to launcher
|
|
189
|
+
steps.push({
|
|
190
|
+
name: `back_${safeName}`,
|
|
191
|
+
action: "shell",
|
|
192
|
+
command: "input keyevent KEYCODE_HOME",
|
|
193
|
+
});
|
|
194
|
+
steps.push({ name: `settle_${safeName}`, action: "sleep", ms: 500 });
|
|
195
|
+
}
|
|
196
|
+
steps.push({
|
|
197
|
+
name: "final_logcat",
|
|
198
|
+
action: "logcat",
|
|
199
|
+
tag: packageName,
|
|
200
|
+
lines: 300,
|
|
201
|
+
capture: "app_logs",
|
|
202
|
+
});
|
|
203
|
+
const workflow = {
|
|
204
|
+
name: `intent_test_${packageName.split(".").pop()}`,
|
|
205
|
+
description: `Auto-generated intent test: ${activities.length} activities for ${packageName}`,
|
|
206
|
+
variables: { pkg: packageName },
|
|
207
|
+
steps,
|
|
208
|
+
};
|
|
209
|
+
const workflowJson = JSON.stringify(workflow, null, 2);
|
|
210
|
+
const summary = [];
|
|
211
|
+
summary.push(`Generated intent test workflow for ${activities.length} activities:\n`);
|
|
212
|
+
for (let i = 0; i < activities.length; i++) {
|
|
213
|
+
summary.push(` [${i + 1}] ${activities[i]}`);
|
|
214
|
+
}
|
|
215
|
+
summary.push(`\nWorkflow: ${steps.length} steps`);
|
|
216
|
+
summary.push(`\n${workflowJson}`);
|
|
217
|
+
return { content: [{ type: "text", text: OutputProcessor.process(summary.join("\n")) }] };
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
ctx.server.tool("adb_test_gen_save", "Save a generated workflow JSON to the workflows directory for later execution with adb_workflow_run.", {
|
|
224
|
+
name: z.string().describe("Workflow name (used as filename)"),
|
|
225
|
+
workflow: z.string().describe("Workflow JSON string to save"),
|
|
226
|
+
}, async ({ name, workflow }) => {
|
|
227
|
+
try {
|
|
228
|
+
// Validate the JSON
|
|
229
|
+
let parsed;
|
|
230
|
+
try {
|
|
231
|
+
parsed = JSON.parse(workflow);
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
return { content: [{ type: "text", text: `Invalid JSON: ${err instanceof Error ? err.message : err}` }], isError: true };
|
|
235
|
+
}
|
|
236
|
+
if (!parsed || typeof parsed !== "object" || !("name" in parsed)) {
|
|
237
|
+
return { content: [{ type: "text", text: "Invalid workflow: must be a JSON object with a 'name' field." }], isError: true };
|
|
238
|
+
}
|
|
239
|
+
const dir = getWorkflowDir(ctx.config.tempDir);
|
|
240
|
+
if (!existsSync(dir))
|
|
241
|
+
mkdirSync(dir, { recursive: true });
|
|
242
|
+
const safeName = name.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
243
|
+
const filePath = join(dir, `${safeName}.json`);
|
|
244
|
+
writeFileSync(filePath, JSON.stringify(parsed, null, 2));
|
|
245
|
+
return { content: [{ type: "text", text: `Workflow saved: ${filePath}\nRun with: adb_workflow_run workflow="${safeName}"` }] };
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=test-gen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-gen.js","sourceRoot":"","sources":["../../src/tools/test-gen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Session Tools — Structured test workflow organization.
|
|
3
|
+
*
|
|
4
|
+
* Captures numbered test steps with screenshots and logcat into
|
|
5
|
+
* organized directories for reproducibility and documentation.
|
|
6
|
+
*/
|
|
7
|
+
import { ToolContext } from "../tool-context.js";
|
|
8
|
+
export declare function registerTestingTools(ctx: ToolContext): void;
|
|
9
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/tools/testing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAkBjD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CA8J3D"}
|