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.
Files changed (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +631 -0
  3. package/build/bridge/adb-bridge.d.ts +65 -0
  4. package/build/bridge/adb-bridge.d.ts.map +1 -0
  5. package/build/bridge/adb-bridge.js +164 -0
  6. package/build/bridge/adb-bridge.js.map +1 -0
  7. package/build/bridge/device-manager.d.ts +41 -0
  8. package/build/bridge/device-manager.d.ts.map +1 -0
  9. package/build/bridge/device-manager.js +109 -0
  10. package/build/bridge/device-manager.js.map +1 -0
  11. package/build/bridge/local-bridge.d.ts +92 -0
  12. package/build/bridge/local-bridge.d.ts.map +1 -0
  13. package/build/bridge/local-bridge.js +345 -0
  14. package/build/bridge/local-bridge.js.map +1 -0
  15. package/build/config/config.d.ts +39 -0
  16. package/build/config/config.d.ts.map +1 -0
  17. package/build/config/config.js +84 -0
  18. package/build/config/config.js.map +1 -0
  19. package/build/graphql-api.d.ts +36 -0
  20. package/build/graphql-api.d.ts.map +1 -0
  21. package/build/graphql-api.js +296 -0
  22. package/build/graphql-api.js.map +1 -0
  23. package/build/http-transport.d.ts +26 -0
  24. package/build/http-transport.d.ts.map +1 -0
  25. package/build/http-transport.js +105 -0
  26. package/build/http-transport.js.map +1 -0
  27. package/build/index.d.ts +14 -0
  28. package/build/index.d.ts.map +1 -0
  29. package/build/index.js +66 -0
  30. package/build/index.js.map +1 -0
  31. package/build/middleware/chipset.d.ts +29 -0
  32. package/build/middleware/chipset.d.ts.map +1 -0
  33. package/build/middleware/chipset.js +123 -0
  34. package/build/middleware/chipset.js.map +1 -0
  35. package/build/middleware/cleanup.d.ts +24 -0
  36. package/build/middleware/cleanup.d.ts.map +1 -0
  37. package/build/middleware/cleanup.js +53 -0
  38. package/build/middleware/cleanup.js.map +1 -0
  39. package/build/middleware/fetch-utils.d.ts +19 -0
  40. package/build/middleware/fetch-utils.d.ts.map +1 -0
  41. package/build/middleware/fetch-utils.js +64 -0
  42. package/build/middleware/fetch-utils.js.map +1 -0
  43. package/build/middleware/logger.d.ts +17 -0
  44. package/build/middleware/logger.d.ts.map +1 -0
  45. package/build/middleware/logger.js +38 -0
  46. package/build/middleware/logger.js.map +1 -0
  47. package/build/middleware/output-processor.d.ts +57 -0
  48. package/build/middleware/output-processor.d.ts.map +1 -0
  49. package/build/middleware/output-processor.js +162 -0
  50. package/build/middleware/output-processor.js.map +1 -0
  51. package/build/middleware/sanitize.d.ts +30 -0
  52. package/build/middleware/sanitize.d.ts.map +1 -0
  53. package/build/middleware/sanitize.js +46 -0
  54. package/build/middleware/sanitize.js.map +1 -0
  55. package/build/middleware/security.d.ts +52 -0
  56. package/build/middleware/security.d.ts.map +1 -0
  57. package/build/middleware/security.js +123 -0
  58. package/build/middleware/security.js.map +1 -0
  59. package/build/middleware/ui-dump.d.ts +23 -0
  60. package/build/middleware/ui-dump.d.ts.map +1 -0
  61. package/build/middleware/ui-dump.js +59 -0
  62. package/build/middleware/ui-dump.js.map +1 -0
  63. package/build/server.d.ts +18 -0
  64. package/build/server.d.ts.map +1 -0
  65. package/build/server.js +133 -0
  66. package/build/server.js.map +1 -0
  67. package/build/tool-context.d.ts +22 -0
  68. package/build/tool-context.d.ts.map +1 -0
  69. package/build/tool-context.js +9 -0
  70. package/build/tool-context.js.map +1 -0
  71. package/build/tools/accessibility.d.ts +10 -0
  72. package/build/tools/accessibility.d.ts.map +1 -0
  73. package/build/tools/accessibility.js +259 -0
  74. package/build/tools/accessibility.js.map +1 -0
  75. package/build/tools/at-commands.d.ts +20 -0
  76. package/build/tools/at-commands.d.ts.map +1 -0
  77. package/build/tools/at-commands.js +378 -0
  78. package/build/tools/at-commands.js.map +1 -0
  79. package/build/tools/baseband.d.ts +15 -0
  80. package/build/tools/baseband.d.ts.map +1 -0
  81. package/build/tools/baseband.js +323 -0
  82. package/build/tools/baseband.js.map +1 -0
  83. package/build/tools/build.d.ts +6 -0
  84. package/build/tools/build.d.ts.map +1 -0
  85. package/build/tools/build.js +80 -0
  86. package/build/tools/build.js.map +1 -0
  87. package/build/tools/ci.d.ts +9 -0
  88. package/build/tools/ci.d.ts.map +1 -0
  89. package/build/tools/ci.js +163 -0
  90. package/build/tools/ci.js.map +1 -0
  91. package/build/tools/control.d.ts +10 -0
  92. package/build/tools/control.d.ts.map +1 -0
  93. package/build/tools/control.js +197 -0
  94. package/build/tools/control.js.map +1 -0
  95. package/build/tools/device-farm.d.ts +10 -0
  96. package/build/tools/device-farm.d.ts.map +1 -0
  97. package/build/tools/device-farm.js +140 -0
  98. package/build/tools/device-farm.js.map +1 -0
  99. package/build/tools/device-profiles.d.ts +16 -0
  100. package/build/tools/device-profiles.d.ts.map +1 -0
  101. package/build/tools/device-profiles.js +272 -0
  102. package/build/tools/device-profiles.js.map +1 -0
  103. package/build/tools/device.d.ts +6 -0
  104. package/build/tools/device.d.ts.map +1 -0
  105. package/build/tools/device.js +72 -0
  106. package/build/tools/device.js.map +1 -0
  107. package/build/tools/diagnostics.d.ts +7 -0
  108. package/build/tools/diagnostics.d.ts.map +1 -0
  109. package/build/tools/diagnostics.js +153 -0
  110. package/build/tools/diagnostics.js.map +1 -0
  111. package/build/tools/emulator.d.ts +9 -0
  112. package/build/tools/emulator.d.ts.map +1 -0
  113. package/build/tools/emulator.js +223 -0
  114. package/build/tools/emulator.js.map +1 -0
  115. package/build/tools/files.d.ts +6 -0
  116. package/build/tools/files.d.ts.map +1 -0
  117. package/build/tools/files.js +78 -0
  118. package/build/tools/files.js.map +1 -0
  119. package/build/tools/firmware-analysis.d.ts +24 -0
  120. package/build/tools/firmware-analysis.d.ts.map +1 -0
  121. package/build/tools/firmware-analysis.js +623 -0
  122. package/build/tools/firmware-analysis.js.map +1 -0
  123. package/build/tools/forwarding.d.ts +7 -0
  124. package/build/tools/forwarding.d.ts.map +1 -0
  125. package/build/tools/forwarding.js +64 -0
  126. package/build/tools/forwarding.js.map +1 -0
  127. package/build/tools/health.d.ts +7 -0
  128. package/build/tools/health.d.ts.map +1 -0
  129. package/build/tools/health.js +112 -0
  130. package/build/tools/health.js.map +1 -0
  131. package/build/tools/logcat-watch.d.ts +11 -0
  132. package/build/tools/logcat-watch.d.ts.map +1 -0
  133. package/build/tools/logcat-watch.js +209 -0
  134. package/build/tools/logcat-watch.js.map +1 -0
  135. package/build/tools/logs.d.ts +6 -0
  136. package/build/tools/logs.d.ts.map +1 -0
  137. package/build/tools/logs.js +83 -0
  138. package/build/tools/logs.js.map +1 -0
  139. package/build/tools/mirroring.d.ts +14 -0
  140. package/build/tools/mirroring.d.ts.map +1 -0
  141. package/build/tools/mirroring.js +243 -0
  142. package/build/tools/mirroring.js.map +1 -0
  143. package/build/tools/multi-device.d.ts +9 -0
  144. package/build/tools/multi-device.d.ts.map +1 -0
  145. package/build/tools/multi-device.js +138 -0
  146. package/build/tools/multi-device.js.map +1 -0
  147. package/build/tools/network-capture.d.ts +10 -0
  148. package/build/tools/network-capture.d.ts.map +1 -0
  149. package/build/tools/network-capture.js +143 -0
  150. package/build/tools/network-capture.js.map +1 -0
  151. package/build/tools/network-discovery.d.ts +21 -0
  152. package/build/tools/network-discovery.d.ts.map +1 -0
  153. package/build/tools/network-discovery.js +284 -0
  154. package/build/tools/network-discovery.js.map +1 -0
  155. package/build/tools/ota-monitor.d.ts +16 -0
  156. package/build/tools/ota-monitor.d.ts.map +1 -0
  157. package/build/tools/ota-monitor.js +211 -0
  158. package/build/tools/ota-monitor.js.map +1 -0
  159. package/build/tools/packages.d.ts +6 -0
  160. package/build/tools/packages.d.ts.map +1 -0
  161. package/build/tools/packages.js +237 -0
  162. package/build/tools/packages.js.map +1 -0
  163. package/build/tools/plugins.d.ts +22 -0
  164. package/build/tools/plugins.d.ts.map +1 -0
  165. package/build/tools/plugins.js +118 -0
  166. package/build/tools/plugins.js.map +1 -0
  167. package/build/tools/prompts.d.ts +9 -0
  168. package/build/tools/prompts.d.ts.map +1 -0
  169. package/build/tools/prompts.js +94 -0
  170. package/build/tools/prompts.js.map +1 -0
  171. package/build/tools/qemu.d.ts +18 -0
  172. package/build/tools/qemu.d.ts.map +1 -0
  173. package/build/tools/qemu.js +791 -0
  174. package/build/tools/qemu.js.map +1 -0
  175. package/build/tools/registry.d.ts +13 -0
  176. package/build/tools/registry.d.ts.map +1 -0
  177. package/build/tools/registry.js +221 -0
  178. package/build/tools/registry.js.map +1 -0
  179. package/build/tools/regression.d.ts +10 -0
  180. package/build/tools/regression.d.ts.map +1 -0
  181. package/build/tools/regression.js +215 -0
  182. package/build/tools/regression.js.map +1 -0
  183. package/build/tools/resources.d.ts +10 -0
  184. package/build/tools/resources.d.ts.map +1 -0
  185. package/build/tools/resources.js +77 -0
  186. package/build/tools/resources.js.map +1 -0
  187. package/build/tools/ril-intercept.d.ts +24 -0
  188. package/build/tools/ril-intercept.d.ts.map +1 -0
  189. package/build/tools/ril-intercept.js +273 -0
  190. package/build/tools/ril-intercept.js.map +1 -0
  191. package/build/tools/screen-record.d.ts +9 -0
  192. package/build/tools/screen-record.d.ts.map +1 -0
  193. package/build/tools/screen-record.js +95 -0
  194. package/build/tools/screen-record.js.map +1 -0
  195. package/build/tools/screenshot-diff.d.ts +13 -0
  196. package/build/tools/screenshot-diff.d.ts.map +1 -0
  197. package/build/tools/screenshot-diff.js +370 -0
  198. package/build/tools/screenshot-diff.js.map +1 -0
  199. package/build/tools/selinux-audit.d.ts +17 -0
  200. package/build/tools/selinux-audit.d.ts.map +1 -0
  201. package/build/tools/selinux-audit.js +301 -0
  202. package/build/tools/selinux-audit.js.map +1 -0
  203. package/build/tools/shell.d.ts +6 -0
  204. package/build/tools/shell.d.ts.map +1 -0
  205. package/build/tools/shell.js +63 -0
  206. package/build/tools/shell.js.map +1 -0
  207. package/build/tools/snapshot.d.ts +9 -0
  208. package/build/tools/snapshot.d.ts.map +1 -0
  209. package/build/tools/snapshot.js +192 -0
  210. package/build/tools/snapshot.js.map +1 -0
  211. package/build/tools/split-apk.d.ts +13 -0
  212. package/build/tools/split-apk.d.ts.map +1 -0
  213. package/build/tools/split-apk.js +229 -0
  214. package/build/tools/split-apk.js.map +1 -0
  215. package/build/tools/test-gen.d.ts +14 -0
  216. package/build/tools/test-gen.d.ts.map +1 -0
  217. package/build/tools/test-gen.js +252 -0
  218. package/build/tools/test-gen.js.map +1 -0
  219. package/build/tools/testing.d.ts +9 -0
  220. package/build/tools/testing.d.ts.map +1 -0
  221. package/build/tools/testing.js +144 -0
  222. package/build/tools/testing.js.map +1 -0
  223. package/build/tools/thermal-power.d.ts +19 -0
  224. package/build/tools/thermal-power.d.ts.map +1 -0
  225. package/build/tools/thermal-power.js +330 -0
  226. package/build/tools/thermal-power.js.map +1 -0
  227. package/build/tools/ui.d.ts +6 -0
  228. package/build/tools/ui.d.ts.map +1 -0
  229. package/build/tools/ui.js +266 -0
  230. package/build/tools/ui.js.map +1 -0
  231. package/build/tools/wireless.d.ts +7 -0
  232. package/build/tools/wireless.d.ts.map +1 -0
  233. package/build/tools/wireless.js +78 -0
  234. package/build/tools/wireless.js.map +1 -0
  235. package/build/tools/workflow-market.d.ts +17 -0
  236. package/build/tools/workflow-market.d.ts.map +1 -0
  237. package/build/tools/workflow-market.js +237 -0
  238. package/build/tools/workflow-market.js.map +1 -0
  239. package/build/tools/workflow.d.ts +32 -0
  240. package/build/tools/workflow.d.ts.map +1 -0
  241. package/build/tools/workflow.js +374 -0
  242. package/build/tools/workflow.js.map +1 -0
  243. package/build/ws-transport.d.ts +30 -0
  244. package/build/ws-transport.d.ts.map +1 -0
  245. package/build/ws-transport.js +133 -0
  246. package/build/ws-transport.js.map +1 -0
  247. 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":"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"}
@@ -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"}