@intentic/machine 1.326.0 → 1.328.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 (271) hide show
  1. package/README.md +387 -33
  2. package/dist/commands.d.ts.map +1 -1
  3. package/dist/commands.js +2 -0
  4. package/dist/commands.js.map +1 -1
  5. package/dist/daemon-base.d.ts.map +1 -1
  6. package/dist/daemon-base.js +2 -3
  7. package/dist/daemon-base.js.map +1 -1
  8. package/dist/device/audit.d.ts +2 -0
  9. package/dist/device/audit.d.ts.map +1 -1
  10. package/dist/device/audit.js +23 -3
  11. package/dist/device/audit.js.map +1 -1
  12. package/dist/device/commands.d.ts +4 -0
  13. package/dist/device/commands.d.ts.map +1 -1
  14. package/dist/device/commands.js +7 -2
  15. package/dist/device/commands.js.map +1 -1
  16. package/dist/device/connection.d.ts +12 -1
  17. package/dist/device/connection.d.ts.map +1 -1
  18. package/dist/device/connection.js +77 -3
  19. package/dist/device/connection.js.map +1 -1
  20. package/dist/device/grant.d.ts +52 -0
  21. package/dist/device/grant.d.ts.map +1 -1
  22. package/dist/device/loopback-catch.d.ts +1 -1
  23. package/dist/device/loopback-catch.d.ts.map +1 -1
  24. package/dist/device/loopback-catch.js +5 -30
  25. package/dist/device/loopback-catch.js.map +1 -1
  26. package/dist/device/mcp.d.ts.map +1 -1
  27. package/dist/device/mcp.js +190 -30
  28. package/dist/device/mcp.js.map +1 -1
  29. package/dist/device/router.d.ts +52 -0
  30. package/dist/device/router.d.ts.map +1 -1
  31. package/dist/device/router.js +21 -0
  32. package/dist/device/router.js.map +1 -1
  33. package/dist/device/sandbox-rounds/auto-backup.d.ts +3 -1
  34. package/dist/device/sandbox-rounds/auto-backup.d.ts.map +1 -1
  35. package/dist/device/sandbox-rounds/auto-backup.js +14 -5
  36. package/dist/device/sandbox-rounds/auto-backup.js.map +1 -1
  37. package/dist/device/sandbox-rounds/auto-prepare.d.ts +3 -1
  38. package/dist/device/sandbox-rounds/auto-prepare.d.ts.map +1 -1
  39. package/dist/device/sandbox-rounds/auto-prepare.js +3 -3
  40. package/dist/device/sandbox-rounds/auto-prepare.js.map +1 -1
  41. package/dist/device/sandbox-rounds/in-flight.d.ts.map +1 -0
  42. package/dist/device/sandbox-rounds/in-flight.js.map +1 -0
  43. package/dist/device/sandbox-rounds/keeper.d.ts +26 -4
  44. package/dist/device/sandbox-rounds/keeper.d.ts.map +1 -1
  45. package/dist/device/sandbox-rounds/keeper.js +129 -31
  46. package/dist/device/sandbox-rounds/keeper.js.map +1 -1
  47. package/dist/device/sandbox-rounds/probation-watch.d.ts.map +1 -1
  48. package/dist/device/sandbox-rounds/probation-watch.js.map +1 -1
  49. package/dist/device/tools/android-parse.d.ts +69 -0
  50. package/dist/device/tools/android-parse.d.ts.map +1 -0
  51. package/dist/device/tools/android-parse.js +391 -0
  52. package/dist/device/tools/android-parse.js.map +1 -0
  53. package/dist/device/tools/android.d.ts +71 -0
  54. package/dist/device/tools/android.d.ts.map +1 -0
  55. package/dist/device/tools/android.js +534 -0
  56. package/dist/device/tools/android.js.map +1 -0
  57. package/dist/device/tools/apps.d.ts +3 -3
  58. package/dist/device/tools/apps.d.ts.map +1 -1
  59. package/dist/device/tools/apps.js +16 -6
  60. package/dist/device/tools/apps.js.map +1 -1
  61. package/dist/device/tools/describe.d.ts.map +1 -1
  62. package/dist/device/tools/describe.js +10 -5
  63. package/dist/device/tools/describe.js.map +1 -1
  64. package/dist/device/tools/device.d.ts +9 -15
  65. package/dist/device/tools/device.d.ts.map +1 -1
  66. package/dist/device/tools/device.js +34 -58
  67. package/dist/device/tools/device.js.map +1 -1
  68. package/dist/device/tools/elements.d.ts +13 -0
  69. package/dist/device/tools/elements.d.ts.map +1 -0
  70. package/dist/device/tools/elements.js +84 -0
  71. package/dist/device/tools/elements.js.map +1 -0
  72. package/dist/device/tools/ic-binary.d.ts +1 -0
  73. package/dist/device/tools/ic-binary.d.ts.map +1 -1
  74. package/dist/device/tools/ic-binary.js +40 -17
  75. package/dist/device/tools/ic-binary.js.map +1 -1
  76. package/dist/device/tools/sandboxes.d.ts +1 -1
  77. package/dist/device/tools/sandboxes.d.ts.map +1 -1
  78. package/dist/device/tools/sandboxes.js +9 -8
  79. package/dist/device/tools/sandboxes.js.map +1 -1
  80. package/dist/device/tools/shell.js +1 -1
  81. package/dist/device/tools/shell.js.map +1 -1
  82. package/dist/device/tools/view.d.ts +4 -0
  83. package/dist/device/tools/view.d.ts.map +1 -0
  84. package/dist/device/tools/view.js +4 -0
  85. package/dist/device/tools/view.js.map +1 -0
  86. package/dist/environments/children.js +1 -1
  87. package/dist/environments/children.js.map +1 -1
  88. package/dist/environments/commands.js +1 -1
  89. package/dist/environments/commands.js.map +1 -1
  90. package/dist/environments/crossing.d.ts +1 -1
  91. package/dist/environments/crossing.d.ts.map +1 -1
  92. package/dist/environments/machine.js +1 -1
  93. package/dist/environments/machine.js.map +1 -1
  94. package/dist/environments/wsl.d.ts.map +1 -0
  95. package/dist/environments/wsl.js.map +1 -0
  96. package/dist/resident.d.ts.map +1 -1
  97. package/dist/resident.js +14 -8
  98. package/dist/resident.js.map +1 -1
  99. package/dist/status.d.ts.map +1 -1
  100. package/dist/status.js +16 -13
  101. package/dist/status.js.map +1 -1
  102. package/dist/sync/attach-commands.d.ts +39 -0
  103. package/dist/sync/attach-commands.d.ts.map +1 -0
  104. package/dist/sync/attach-commands.js +152 -0
  105. package/dist/sync/attach-commands.js.map +1 -0
  106. package/dist/sync/commands.d.ts +8 -4
  107. package/dist/sync/commands.d.ts.map +1 -1
  108. package/dist/sync/commands.js +137 -79
  109. package/dist/sync/commands.js.map +1 -1
  110. package/dist/sync/config.d.ts +43 -9
  111. package/dist/sync/config.d.ts.map +1 -1
  112. package/dist/sync/config.js +86 -41
  113. package/dist/sync/config.js.map +1 -1
  114. package/dist/sync/endpoint.d.ts +8 -1
  115. package/dist/sync/endpoint.d.ts.map +1 -1
  116. package/dist/sync/endpoint.js +41 -1
  117. package/dist/sync/endpoint.js.map +1 -1
  118. package/dist/sync/environment.d.ts +11 -0
  119. package/dist/sync/environment.d.ts.map +1 -0
  120. package/dist/sync/environment.js +48 -0
  121. package/dist/sync/environment.js.map +1 -0
  122. package/dist/sync/exec.d.ts +1 -0
  123. package/dist/sync/exec.d.ts.map +1 -1
  124. package/dist/sync/exec.js +4 -5
  125. package/dist/sync/exec.js.map +1 -1
  126. package/dist/sync/folders.d.ts +3 -2
  127. package/dist/sync/folders.d.ts.map +1 -1
  128. package/dist/sync/folders.js +55 -2
  129. package/dist/sync/folders.js.map +1 -1
  130. package/dist/sync/forget-command.d.ts +22 -0
  131. package/dist/sync/forget-command.d.ts.map +1 -0
  132. package/dist/sync/forget-command.js +95 -0
  133. package/dist/sync/forget-command.js.map +1 -0
  134. package/dist/sync/git-bridge.d.ts +6 -0
  135. package/dist/sync/git-bridge.d.ts.map +1 -1
  136. package/dist/sync/git-bridge.js +64 -1
  137. package/dist/sync/git-bridge.js.map +1 -1
  138. package/dist/sync/gone-watch.d.ts +18 -0
  139. package/dist/sync/gone-watch.d.ts.map +1 -0
  140. package/dist/sync/gone-watch.js +142 -0
  141. package/dist/sync/gone-watch.js.map +1 -0
  142. package/dist/sync/gone.d.ts +22 -0
  143. package/dist/sync/gone.d.ts.map +1 -0
  144. package/dist/sync/gone.js +60 -0
  145. package/dist/sync/gone.js.map +1 -0
  146. package/dist/sync/local-sandboxes.d.ts +6 -0
  147. package/dist/sync/local-sandboxes.d.ts.map +1 -0
  148. package/dist/sync/local-sandboxes.js +26 -0
  149. package/dist/sync/local-sandboxes.js.map +1 -0
  150. package/dist/sync/mirror.d.ts +7 -0
  151. package/dist/sync/mirror.d.ts.map +1 -1
  152. package/dist/sync/mirror.js +434 -111
  153. package/dist/sync/mirror.js.map +1 -1
  154. package/dist/sync/mutagen.d.ts +50 -18
  155. package/dist/sync/mutagen.d.ts.map +1 -1
  156. package/dist/sync/mutagen.js +294 -80
  157. package/dist/sync/mutagen.js.map +1 -1
  158. package/dist/sync/project/adopt.d.ts +18 -0
  159. package/dist/sync/project/adopt.d.ts.map +1 -0
  160. package/dist/sync/project/adopt.js +86 -0
  161. package/dist/sync/project/adopt.js.map +1 -0
  162. package/dist/sync/{project-commands.d.ts → project/project-commands.d.ts} +4 -1
  163. package/dist/sync/project/project-commands.d.ts.map +1 -0
  164. package/dist/sync/{project-commands.js → project/project-commands.js} +10 -10
  165. package/dist/sync/project/project-commands.js.map +1 -0
  166. package/dist/sync/project/project-delivery.d.ts +23 -0
  167. package/dist/sync/project/project-delivery.d.ts.map +1 -0
  168. package/dist/sync/project/project-delivery.js +315 -0
  169. package/dist/sync/project/project-delivery.js.map +1 -0
  170. package/dist/sync/{project-files.d.ts → project/project-files.d.ts} +1 -1
  171. package/dist/sync/project/project-files.d.ts.map +1 -0
  172. package/dist/sync/{project-files.js → project/project-files.js} +5 -2
  173. package/dist/sync/project/project-files.js.map +1 -0
  174. package/dist/sync/{project-local.d.ts → project/project-local.d.ts} +1 -1
  175. package/dist/sync/project/project-local.d.ts.map +1 -0
  176. package/dist/sync/{project-local.js → project/project-local.js} +1 -1
  177. package/dist/sync/project/project-local.js.map +1 -0
  178. package/dist/sync/{project-remote.d.ts → project/project-remote.d.ts} +1 -1
  179. package/dist/sync/project/project-remote.d.ts.map +1 -0
  180. package/dist/sync/{project-remote.js → project/project-remote.js} +1 -1
  181. package/dist/sync/project/project-remote.js.map +1 -0
  182. package/dist/sync/{project-transfer.d.ts → project/project-transfer.d.ts} +20 -6
  183. package/dist/sync/project/project-transfer.d.ts.map +1 -0
  184. package/dist/sync/{project-transfer.js → project/project-transfer.js} +26 -23
  185. package/dist/sync/project/project-transfer.js.map +1 -0
  186. package/dist/sync/report.d.ts.map +1 -1
  187. package/dist/sync/report.js +13 -7
  188. package/dist/sync/report.js.map +1 -1
  189. package/dist/sync/restore-points.d.ts +15 -11
  190. package/dist/sync/restore-points.d.ts.map +1 -1
  191. package/dist/sync/restore-points.js +25 -24
  192. package/dist/sync/restore-points.js.map +1 -1
  193. package/dist/sync/retire.d.ts +14 -0
  194. package/dist/sync/retire.d.ts.map +1 -0
  195. package/dist/sync/retire.js +66 -0
  196. package/dist/sync/retire.js.map +1 -0
  197. package/dist/sync/siblings.d.ts +27 -0
  198. package/dist/sync/siblings.d.ts.map +1 -0
  199. package/dist/sync/siblings.js +112 -0
  200. package/dist/sync/siblings.js.map +1 -0
  201. package/dist/sync/ssh.d.ts +1 -0
  202. package/dist/sync/ssh.d.ts.map +1 -1
  203. package/dist/sync/ssh.js +37 -23
  204. package/dist/sync/ssh.js.map +1 -1
  205. package/dist/sync/tunnel.d.ts +6 -2
  206. package/dist/sync/tunnel.d.ts.map +1 -1
  207. package/dist/sync/tunnel.js +45 -48
  208. package/dist/sync/tunnel.js.map +1 -1
  209. package/dist/upkeep/doctor.d.ts +5 -0
  210. package/dist/upkeep/doctor.d.ts.map +1 -0
  211. package/dist/upkeep/doctor.js +73 -0
  212. package/dist/upkeep/doctor.js.map +1 -0
  213. package/dist/upkeep/entry.d.ts +26 -0
  214. package/dist/upkeep/entry.d.ts.map +1 -0
  215. package/dist/upkeep/entry.js +2 -0
  216. package/dist/upkeep/entry.js.map +1 -0
  217. package/dist/upkeep/login.d.ts +15 -0
  218. package/dist/upkeep/login.d.ts.map +1 -0
  219. package/dist/upkeep/login.js +128 -0
  220. package/dist/upkeep/login.js.map +1 -0
  221. package/dist/upkeep/manifest.d.ts +3 -0
  222. package/dist/upkeep/manifest.d.ts.map +1 -0
  223. package/dist/upkeep/manifest.js +6 -0
  224. package/dist/upkeep/manifest.js.map +1 -0
  225. package/dist/upkeep/reconcile.d.ts +45 -0
  226. package/dist/upkeep/reconcile.d.ts.map +1 -0
  227. package/dist/upkeep/reconcile.js +159 -0
  228. package/dist/upkeep/reconcile.js.map +1 -0
  229. package/dist/upkeep/retention.d.ts +10 -0
  230. package/dist/upkeep/retention.d.ts.map +1 -0
  231. package/dist/upkeep/retention.js +71 -0
  232. package/dist/upkeep/retention.js.map +1 -0
  233. package/dist/upkeep/retired.d.ts +12 -0
  234. package/dist/upkeep/retired.d.ts.map +1 -0
  235. package/dist/upkeep/retired.js +125 -0
  236. package/dist/upkeep/retired.js.map +1 -0
  237. package/dist/upkeep/second-ic.d.ts +4 -0
  238. package/dist/upkeep/second-ic.d.ts.map +1 -0
  239. package/dist/upkeep/second-ic.js +36 -0
  240. package/dist/upkeep/second-ic.js.map +1 -0
  241. package/dist/upkeep/trash.d.ts +9 -0
  242. package/dist/upkeep/trash.d.ts.map +1 -0
  243. package/dist/upkeep/trash.js +77 -0
  244. package/dist/upkeep/trash.js.map +1 -0
  245. package/dist/watchdog.d.ts +13 -0
  246. package/dist/watchdog.d.ts.map +1 -0
  247. package/dist/watchdog.js +38 -0
  248. package/dist/watchdog.js.map +1 -0
  249. package/package.json +9 -9
  250. package/dist/autostart/legacy-autostart.d.ts +0 -4
  251. package/dist/autostart/legacy-autostart.d.ts.map +0 -1
  252. package/dist/autostart/legacy-autostart.js +0 -33
  253. package/dist/autostart/legacy-autostart.js.map +0 -1
  254. package/dist/device/tools/in-flight.d.ts.map +0 -1
  255. package/dist/device/tools/in-flight.js.map +0 -1
  256. package/dist/sync/project-commands.d.ts.map +0 -1
  257. package/dist/sync/project-commands.js.map +0 -1
  258. package/dist/sync/project-files.d.ts.map +0 -1
  259. package/dist/sync/project-files.js.map +0 -1
  260. package/dist/sync/project-local.d.ts.map +0 -1
  261. package/dist/sync/project-local.js.map +0 -1
  262. package/dist/sync/project-remote.d.ts.map +0 -1
  263. package/dist/sync/project-remote.js.map +0 -1
  264. package/dist/sync/project-transfer.d.ts.map +0 -1
  265. package/dist/sync/project-transfer.js.map +0 -1
  266. package/dist/wsl.d.ts.map +0 -1
  267. package/dist/wsl.js.map +0 -1
  268. /package/dist/device/{tools → sandbox-rounds}/in-flight.d.ts +0 -0
  269. /package/dist/device/{tools → sandbox-rounds}/in-flight.js +0 -0
  270. /package/dist/{wsl.d.ts → environments/wsl.d.ts} +0 -0
  271. /package/dist/{wsl.js → environments/wsl.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android-parse.js","sourceRoot":"","sources":["../../../src/device/tools/android-parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { type Frame, type Point } from "@intentic/desktop-automation";
2
+ import { type DeviceScopes } from "@intentic/sandbox-contract";
3
+ import { textResult } from "@intentic/sandbox-contract/peer-mcp-server";
4
+ import { type Indicator } from "../indicator.js";
5
+ import { type ScreenSize } from "./android-parse.js";
6
+ type ToolResult = ReturnType<typeof textResult>;
7
+ export interface AdbOutput {
8
+ readonly code: number | null;
9
+ readonly stdout: Buffer;
10
+ readonly stderr: string;
11
+ readonly timedOut: boolean;
12
+ }
13
+ export type AdbRunner = (args: readonly string[], timeoutMs: number) => Promise<AdbOutput>;
14
+ export declare const adbRunner: (binary: string) => AdbRunner;
15
+ export interface AndroidDeps {
16
+ readonly adb: () => AdbRunner | undefined;
17
+ readonly platform: NodeJS.Platform;
18
+ readonly indicator: () => Indicator;
19
+ readonly settle: () => Promise<void>;
20
+ }
21
+ export declare const machineAndroidDeps: () => AndroidDeps;
22
+ export declare const DEFAULT_SHELL_TIMEOUT_MS = 60000;
23
+ export declare const MAX_SHELL_TIMEOUT_MS: number;
24
+ export declare const DEFAULT_LOG_LINES = 200;
25
+ export declare const MAX_LOG_LINES = 5000;
26
+ export declare const phoneFrameId: (frame: Frame) => string;
27
+ export type AndroidAction = "tap" | "long_press" | "swipe" | "type" | "key" | "back" | "home" | "recents" | "scroll";
28
+ export type ScrollDirection = "up" | "down" | "left" | "right";
29
+ export interface AndroidActInput {
30
+ readonly serial?: string | undefined;
31
+ readonly action: AndroidAction;
32
+ readonly element?: string | undefined;
33
+ readonly coordinate?: readonly [number, number] | undefined;
34
+ readonly frame?: string | undefined;
35
+ readonly to?: readonly [number, number] | undefined;
36
+ readonly text?: string | undefined;
37
+ readonly direction?: ScrollDirection | undefined;
38
+ readonly amount?: number | undefined;
39
+ readonly ms?: number | undefined;
40
+ }
41
+ export declare const scrollSwipe: (at: Point, size: ScreenSize, direction: ScrollDirection) => readonly [Point, Point];
42
+ export type LogPriority = "V" | "D" | "I" | "W" | "E" | "F";
43
+ export interface LogcatInput {
44
+ readonly serial?: string | undefined;
45
+ readonly lines?: number | undefined;
46
+ readonly package?: string | undefined;
47
+ readonly tag?: string | undefined;
48
+ readonly priority?: LogPriority | undefined;
49
+ }
50
+ export interface Android {
51
+ readonly devices: (scopes: DeviceScopes) => Promise<string>;
52
+ readonly screenshot: (serial: string | undefined, scopes: DeviceScopes) => Promise<ToolResult>;
53
+ readonly uiElements: (input: {
54
+ readonly serial?: string | undefined;
55
+ readonly query?: string | undefined;
56
+ }, scopes: DeviceScopes) => Promise<string>;
57
+ readonly act: (input: AndroidActInput, scopes: DeviceScopes) => Promise<ToolResult>;
58
+ readonly shell: (input: {
59
+ readonly serial?: string | undefined;
60
+ readonly command: string;
61
+ readonly timeoutMs?: number | undefined;
62
+ }, scopes: DeviceScopes) => Promise<string>;
63
+ readonly install: (input: {
64
+ readonly serial?: string | undefined;
65
+ readonly path: string;
66
+ }, scopes: DeviceScopes) => Promise<string>;
67
+ readonly logcat: (input: LogcatInput, scopes: DeviceScopes) => Promise<string>;
68
+ }
69
+ export declare const createAndroid: (deps: AndroidDeps) => Android;
70
+ export {};
71
+ //# sourceMappingURL=android.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../../src/device/tools/android.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,534 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { existsSync } from "node:fs";
4
+ import { stat } from "node:fs/promises";
5
+ import { sleep } from "@intentic/base/async";
6
+ import { errorMessage, undefinedIfMissing } from "@intentic/base/errors";
7
+ import { decodePng, downscale, encodePng, fitSize, FrameLog, toDesktop, toImage } from "@intentic/desktop-automation";
8
+ import { homeDir } from "@intentic/local-agent";
9
+ import { COMMAND_CLASS_LABELS } from "@intentic/sandbox-contract";
10
+ import { textResult } from "@intentic/sandbox-contract/peer-mcp-server";
11
+ import { calling, machineIndicator } from "../indicator.js";
12
+ import { assertPath, assertScope, ScopeError } from "../policy.js";
13
+ import { adbMissing, AndroidError, androidDestructive, assertNoLockoutCommand, chooseDevice, describeElement, findAdb, inputTextCommand, keyEventFor, MAX_SHOWN, NO_DEVICE, parseAdbDevices, parseUiDump, parseWmSize, phoneElements, rotated, stateNote, } from "./android-parse.js";
14
+ import { assertTypable } from "./device.js";
15
+ import { describeResult, destructiveClasses } from "./shell.js";
16
+ const MAX_STDOUT_BYTES = 64 * 1024 * 1024;
17
+ const MAX_STDERR_BYTES = 1024 * 1024;
18
+ const PIPE_QUIET_MS = 1_000;
19
+ const PIPE_POLL_MS = 50;
20
+ const gather = (limit, heard) => {
21
+ const chunks = [];
22
+ let bytes = 0;
23
+ return {
24
+ take: (chunk) => {
25
+ heard();
26
+ if (bytes < limit) {
27
+ chunks.push(chunk);
28
+ bytes += chunk.length;
29
+ }
30
+ },
31
+ all: () => Buffer.concat(chunks),
32
+ };
33
+ };
34
+ export const adbRunner = (binary) => async (args, timeoutMs) => {
35
+ const child = spawn(binary, [...args], { stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
36
+ let lastData = Date.now();
37
+ const heard = () => {
38
+ lastData = Date.now();
39
+ };
40
+ const out = gather(MAX_STDOUT_BYTES, heard);
41
+ const err = gather(MAX_STDERR_BYTES, heard);
42
+ child.stdout.on("data", out.take);
43
+ child.stderr.on("data", err.take);
44
+ const closed = new Promise((resolve) => child.once("close", () => resolve(true)));
45
+ let timedOut = false;
46
+ const deadline = setTimeout(() => {
47
+ timedOut = true;
48
+ child.kill("SIGKILL");
49
+ }, timeoutMs);
50
+ const drained = async () => {
51
+ if (await Promise.race([closed, sleep(PIPE_POLL_MS, { unref: true }).then(() => false)])) {
52
+ return;
53
+ }
54
+ if (Date.now() - lastData >= PIPE_QUIET_MS) {
55
+ child.stdout.destroy();
56
+ child.stderr.destroy();
57
+ return;
58
+ }
59
+ await drained();
60
+ };
61
+ try {
62
+ const code = await new Promise((resolve, reject) => {
63
+ child.once("exit", (exitCode) => resolve(exitCode));
64
+ child.once("error", reject);
65
+ });
66
+ await drained();
67
+ return { code, stdout: out.all(), stderr: err.all().toString("utf8"), timedOut };
68
+ }
69
+ finally {
70
+ clearTimeout(deadline);
71
+ }
72
+ };
73
+ const PHONE_SETTLE_MS = 700;
74
+ export const machineAndroidDeps = () => ({
75
+ adb: () => {
76
+ const binary = findAdb(process.env, process.platform, homeDir(), existsSync);
77
+ return binary === undefined ? undefined : adbRunner(binary);
78
+ },
79
+ platform: process.platform,
80
+ indicator: machineIndicator,
81
+ settle: async () => await sleep(PHONE_SETTLE_MS),
82
+ });
83
+ const QUICK_MS = 15_000;
84
+ const INPUT_MS = 30_000;
85
+ const CAPTURE_MS = 30_000;
86
+ const DUMP_MS = 30_000;
87
+ const INSTALL_MS = 5 * 60_000;
88
+ export const DEFAULT_SHELL_TIMEOUT_MS = 60_000;
89
+ export const MAX_SHELL_TIMEOUT_MS = 10 * 60_000;
90
+ export const DEFAULT_LOG_LINES = 200;
91
+ export const MAX_LOG_LINES = 5_000;
92
+ const MAX_OUTPUT = 100_000;
93
+ const MAX_UNCHANGED = 2;
94
+ const clip = (text) => {
95
+ if (text.length <= MAX_OUTPUT) {
96
+ return { text, dropped: 0 };
97
+ }
98
+ const half = MAX_OUTPUT / 2;
99
+ const dropped = text.length - MAX_OUTPUT;
100
+ return { text: `${text.slice(0, half)}\n… [${dropped} characters cut] …\n${text.slice(-half)}`, dropped };
101
+ };
102
+ export const phoneFrameId = (frame) => `phone-${frame.id}`;
103
+ const named = (device) => (device.model === undefined ? device.serial : `${device.serial} (${device.model})`);
104
+ const outputText = (output) => `${output.stdout.toString("utf8")}\n${output.stderr}`.trim();
105
+ const tail = (text) => {
106
+ const lines = text.split(/\r?\n/).filter((line) => line.trim() !== "");
107
+ return lines.slice(-4).join(" / ") || "it printed nothing";
108
+ };
109
+ const isPng = (bytes) => bytes.length > 24 && bytes.subarray(0, 4).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47]));
110
+ const adbOf = (context) => {
111
+ const run = context.deps.adb();
112
+ if (run === undefined) {
113
+ throw new AndroidError(adbMissing(context.deps.platform));
114
+ }
115
+ return run;
116
+ };
117
+ const listDevices = async (run) => {
118
+ const output = await run(["devices", "-l"], QUICK_MS);
119
+ if (output.code !== 0 || output.timedOut) {
120
+ throw new AndroidError(`adb could not list the attached devices (${tail(outputText(output))}).`);
121
+ }
122
+ return parseAdbDevices(output.stdout.toString("utf8"));
123
+ };
124
+ const phoneOf = async (context, serial) => {
125
+ const run = adbOf(context);
126
+ const device = chooseDevice(await listDevices(run), serial);
127
+ let view = context.views.get(device.serial);
128
+ if (view === undefined) {
129
+ view = { frames: new FrameLog(), elements: undefined };
130
+ context.views.set(device.serial, view);
131
+ }
132
+ return { run, device, view };
133
+ };
134
+ const shellOn = async ({ run, device }, command, timeoutMs = QUICK_MS) => {
135
+ const output = await run(["-s", device.serial, "shell", command], timeoutMs);
136
+ if (output.timedOut) {
137
+ throw new AndroidError(`${named(device)} did not answer within ${Math.round(timeoutMs / 1000)}s.`);
138
+ }
139
+ if (output.code !== 0) {
140
+ throw new AndroidError(`${named(device)} refused \`${command.split(" ")[0] ?? command}\`: ${tail(outputText(output))}`);
141
+ }
142
+ return output.stdout.toString("utf8");
143
+ };
144
+ const screencap = async ({ run, device }) => {
145
+ const output = await run(["-s", device.serial, "exec-out", "screencap", "-p"], CAPTURE_MS);
146
+ if (output.timedOut || !isPng(output.stdout)) {
147
+ throw new AndroidError(`${named(device)} did not send a screenshot (${output.timedOut ? "it timed out" : tail(outputText(output))}).`);
148
+ }
149
+ return output.stdout;
150
+ };
151
+ const capture = async (phone) => {
152
+ const pixels = decodePng(await screencap(phone));
153
+ const size = fitSize(pixels.width, pixels.height);
154
+ const shown = downscale(pixels, size.width, size.height);
155
+ const digest = createHash("sha256").update(shown.data).digest("hex");
156
+ const { frame, unchanged } = phone.view.frames.record({ x: 0, y: 0, width: pixels.width, height: pixels.height }, shown.width, shown.height, digest);
157
+ return { frame, png: encodePng(shown), unchanged };
158
+ };
159
+ const shotContent = (shot, { device, view }) => {
160
+ view.frames.sent();
161
+ const { frame } = shot;
162
+ const id = phoneFrameId(frame);
163
+ const scale = frame.region.width / frame.width;
164
+ const shrunk = scale > 1.001 ? `, shown at 1/${scale.toFixed(2)} of its ${frame.region.width}×${frame.region.height} pixels` : "";
165
+ return [
166
+ {
167
+ type: "text",
168
+ text: `Phone screenshot ${id}: ${frame.width}×${frame.height}, the whole screen of ${named(device)}${shrunk}. ` +
169
+ `Coordinates you give android_act are pixels in this image; pass frame "${id}" with them so a tap is never read off an older one.`,
170
+ },
171
+ { type: "image", data: shot.png.toString("base64"), mimeType: "image/png" },
172
+ ];
173
+ };
174
+ const frameFor = ({ device, view }, given) => {
175
+ const latest = view.frames.latest();
176
+ if (latest === undefined) {
177
+ throw new AndroidError(`There is no screenshot of ${named(device)} yet: take android_screenshot and read the coordinates off it, or act on a ref from android_ui_elements.`);
178
+ }
179
+ if (given === undefined || given === phoneFrameId(latest)) {
180
+ return latest;
181
+ }
182
+ throw new AndroidError(given.startsWith("phone-")
183
+ ? `Phone screenshot ${given} is out of date, or of another phone: the newest of ${named(device)} is ${phoneFrameId(latest)}. Read the coordinates off that one.`
184
+ : `"${given}" is not a phone screenshot: android_act reads coordinates in the newest android_screenshot of the phone (${phoneFrameId(latest)}), never in a screenshot of this computer's desktop.`);
185
+ };
186
+ const screenSize = async (phone) => {
187
+ const latest = phone.view.frames.latest();
188
+ if (latest !== undefined) {
189
+ return { width: latest.region.width, height: latest.region.height };
190
+ }
191
+ const png = await screencap(phone);
192
+ return { width: png.readUInt32BE(16), height: png.readUInt32BE(20) };
193
+ };
194
+ const confirmingLook = async (context, said, phone, scopes) => {
195
+ if (scopes.screen !== "on") {
196
+ return textResult(`${said} (No screenshot: "See the screen" is off for this device.)`);
197
+ }
198
+ await context.deps.settle();
199
+ try {
200
+ const shot = await capture(phone);
201
+ if (shot.unchanged && phone.view.frames.unchangedStreak() <= MAX_UNCHANGED) {
202
+ return textResult(`${said} The phone's screen did not change: phone screenshot ${phoneFrameId(shot.frame)} is still exactly what it shows, so its coordinates still hold. If something should have happened, it did not.`);
203
+ }
204
+ return { content: [{ type: "text", text: said }, ...shotContent(shot, phone)], isError: false };
205
+ }
206
+ catch (error) {
207
+ return textResult(`${said} (No confirming screenshot: ${errorMessage(error)})`);
208
+ }
209
+ };
210
+ const dump = async ({ run, device }) => {
211
+ const direct = await run(["-s", device.serial, "exec-out", "uiautomator", "dump", "/dev/tty"], DUMP_MS);
212
+ const text = direct.stdout.toString("utf8");
213
+ if (text.includes("<hierarchy")) {
214
+ return parseUiDump(text);
215
+ }
216
+ const file = "/sdcard/window_dump.xml";
217
+ const written = await run(["-s", device.serial, "shell", `uiautomator dump ${file}`], DUMP_MS);
218
+ const read = await run(["-s", device.serial, "exec-out", "cat", file], QUICK_MS);
219
+ await run(["-s", device.serial, "shell", `rm -f ${file}`], QUICK_MS).catch(() => undefined);
220
+ const xml = read.stdout.toString("utf8");
221
+ try {
222
+ return parseUiDump(xml.includes("<hierarchy") ? xml : outputText(written));
223
+ }
224
+ catch (error) {
225
+ throw new AndroidError(`${errorMessage(error)} A screen that never stops moving (a video, a game) cannot be read this way: use android_screenshot and its coordinates.`);
226
+ }
227
+ };
228
+ const listingFrame = async (phone, hierarchy) => {
229
+ const natural = parseWmSize(await shellOn(phone, "wm size").catch(() => ""));
230
+ const size = natural === undefined ? undefined : rotated(natural, hierarchy.rotation);
231
+ const latest = phone.view.frames.latest();
232
+ if (latest !== undefined && (size === undefined || (latest.region.width === size.width && latest.region.height === size.height))) {
233
+ return latest;
234
+ }
235
+ const screen = size ?? {
236
+ width: Math.max(1, ...hierarchy.nodes.map((node) => node.bounds.x + node.bounds.width)),
237
+ height: Math.max(1, ...hierarchy.nodes.map((node) => node.bounds.y + node.bounds.height)),
238
+ };
239
+ return { id: "", region: { x: 0, y: 0, ...screen }, ...fitSize(screen.width, screen.height), digest: "" };
240
+ };
241
+ const plural = (count, noun) => `${count} ${noun}${count === 1 ? "" : "s"}`;
242
+ const listElements = async (context, input, scopes) => {
243
+ assertScope(scopes, "screen");
244
+ const phone = await phoneOf(context, input.serial);
245
+ const hierarchy = await dump(phone);
246
+ const { elements, total } = phoneElements(hierarchy, input.query);
247
+ phone.view.elements = new Map(elements.map((element) => [element.ref, element]));
248
+ const wanted = input.query?.trim() ?? "";
249
+ const packages = [...new Set(hierarchy.nodes.map((node) => node.packageName).filter((name) => name !== ""))].slice(0, 3);
250
+ const header = `${named(phone.device)}: ${wanted === "" ? `${plural(total, "element")} on screen` : `${plural(total, "element")} matching ${JSON.stringify(wanted)}`}` +
251
+ `${packages.length === 0 ? "" : ` (${packages.join(", ")})`}` +
252
+ `${elements.length < total ? `, the first ${MAX_SHOWN} shown (pass query to narrow)` : ""}.`;
253
+ if (elements.length === 0) {
254
+ return `${header} ${wanted === "" ? "Nothing on this screen offers itself to the accessibility dump; use android_screenshot and its coordinates." : "Try a shorter query, or none."}`;
255
+ }
256
+ const frame = await listingFrame(phone, hierarchy);
257
+ const rows = elements.map((element) => {
258
+ const placed = toImage(frame, { ...element.center, width: 1, height: 1 });
259
+ return describeElement(element, { x: placed.x, y: placed.y });
260
+ });
261
+ return [
262
+ header,
263
+ `Positions are pixels in ${frame.id === "" ? `a phone screenshot of this screen (${frame.width}×${frame.height})` : `phone screenshot ${phoneFrameId(frame)}`}. ` +
264
+ `Pass a ref as \`element\` to android_act to tap it where it is; refs hold until the next listing, so list again after the screen changes.`,
265
+ ...rows,
266
+ ].join("\n");
267
+ };
268
+ const NAVIGATION = new Map([
269
+ ["back", { command: "input keyevent KEYCODE_BACK", said: "Pressed Back." }],
270
+ ["home", { command: "input keyevent KEYCODE_HOME", said: "Pressed Home." }],
271
+ ["recents", { command: "input keyevent KEYCODE_APP_SWITCH", said: "Opened the recent apps." }],
272
+ ]);
273
+ const SCROLL_FRACTION = 0.45;
274
+ const SCROLL_MARGIN = 0.1;
275
+ const SCROLL_MS = 400;
276
+ const MAX_SCROLLS = 10;
277
+ const LONG_PRESS_MS = 800;
278
+ const SWIPE_MS = 300;
279
+ export const scrollSwipe = (at, size, direction) => {
280
+ const vertical = direction === "up" || direction === "down";
281
+ const extent = vertical ? size.height : size.width;
282
+ const length = extent * SCROLL_FRACTION;
283
+ const low = extent * SCROLL_MARGIN + length / 2;
284
+ const high = extent * (1 - SCROLL_MARGIN) - length / 2;
285
+ const centre = Math.min(Math.max(vertical ? at.y : at.x, low), high);
286
+ const forward = direction === "down" || direction === "right";
287
+ const from = Math.round(forward ? centre + length / 2 : centre - length / 2);
288
+ const to = Math.round(forward ? centre - length / 2 : centre + length / 2);
289
+ return vertical
290
+ ? [
291
+ { x: at.x, y: from },
292
+ { x: at.x, y: to },
293
+ ]
294
+ : [
295
+ { x: from, y: at.y },
296
+ { x: to, y: at.y },
297
+ ];
298
+ };
299
+ const elementFor = ({ device, view }, ref) => {
300
+ const found = view.elements?.get(ref.trim());
301
+ if (found !== undefined) {
302
+ return found;
303
+ }
304
+ if (view.elements === undefined) {
305
+ throw new AndroidError(`"${ref}" is not an element of ${named(device)}: list its elements first (android_ui_elements) and pass a ref from that list.`);
306
+ }
307
+ throw new AndroidError(view.elements.size === 0
308
+ ? `"${ref}" is not an element of ${named(device)}: its latest list of elements was empty. List them again if the screen changed.`
309
+ : `"${ref}" is not in the latest list of ${named(device)}'s elements (e1 to e${view.elements.size}). List them again if the screen changed.`);
310
+ };
311
+ const pointOf = (phone, input) => {
312
+ if (input.element !== undefined && input.element !== "") {
313
+ const element = elementFor(phone, input.element);
314
+ const label = element.label === "" ? "" : ` ${JSON.stringify(element.label.length > 40 ? `${element.label.slice(0, 40)}…` : element.label)}`;
315
+ return { at: element.center, where: `${element.ref}${label}` };
316
+ }
317
+ if (input.coordinate === undefined) {
318
+ return undefined;
319
+ }
320
+ return {
321
+ at: toDesktop(frameFor(phone, input.frame), { x: input.coordinate[0], y: input.coordinate[1] }),
322
+ where: `(${input.coordinate.join(", ")})`,
323
+ };
324
+ };
325
+ const requiredPoint = (phone, input) => {
326
+ const point = pointOf(phone, input);
327
+ if (point === undefined) {
328
+ throw new AndroidError(`${input.action} needs \`element\` (a ref from android_ui_elements) or \`coordinate\` ([x, y] in the newest phone screenshot).`);
329
+ }
330
+ return point;
331
+ };
332
+ const pointerInput = (phone, input) => {
333
+ const { at, where } = requiredPoint(phone, input);
334
+ if (input.action === "tap") {
335
+ return { command: `input tap ${at.x} ${at.y}`, said: `Tapped ${where}.` };
336
+ }
337
+ if (input.action === "long_press") {
338
+ return { command: `input swipe ${at.x} ${at.y} ${at.x} ${at.y} ${Math.round(input.ms ?? LONG_PRESS_MS)}`, said: `Long-pressed ${where}.` };
339
+ }
340
+ if (input.to === undefined) {
341
+ throw new AndroidError(`swipe needs \`to\`: [x, y] in the newest phone screenshot where the finger lifts.`);
342
+ }
343
+ const end = toDesktop(frameFor(phone, input.frame), { x: input.to[0], y: input.to[1] });
344
+ return {
345
+ command: `input swipe ${at.x} ${at.y} ${end.x} ${end.y} ${Math.round(input.ms ?? SWIPE_MS)}`,
346
+ said: `Swiped from ${where} to (${input.to.join(", ")}).`,
347
+ };
348
+ };
349
+ const scrollInput = async (phone, input) => {
350
+ const size = await screenSize(phone);
351
+ const point = pointOf(phone, input);
352
+ const at = point?.at ?? { x: Math.floor(size.width / 2), y: Math.floor(size.height / 2) };
353
+ const direction = input.direction ?? "down";
354
+ const times = Math.min(Math.max(1, Math.round(input.amount ?? 1)), MAX_SCROLLS);
355
+ const [from, to] = scrollSwipe(at, size, direction);
356
+ const swipe = `input swipe ${from.x} ${from.y} ${to.x} ${to.y} ${SCROLL_MS}`;
357
+ return {
358
+ command: Array.from({ length: times }, () => swipe).join(" && "),
359
+ said: `Scrolled ${direction}${times > 1 ? ` ${times} times` : ""} at ${point?.where ?? "the middle of the screen"}.`,
360
+ };
361
+ };
362
+ const requireText = (input) => {
363
+ if (input.text === undefined || input.text === "") {
364
+ throw new AndroidError(input.action === "type"
365
+ ? `"text" is required to type.`
366
+ : `"text" is required to press a key: for example "ENTER", "BACK" or "VOLUME_UP".`);
367
+ }
368
+ return input.text;
369
+ };
370
+ const keyboardInput = (input, scopes) => {
371
+ if (input.action === "type") {
372
+ const text = requireText(input);
373
+ assertTypable(text, scopes);
374
+ return { command: inputTextCommand(text), said: `Typed ${text.length} characters.` };
375
+ }
376
+ if (input.action === "key") {
377
+ const key = keyEventFor(requireText(input));
378
+ return { command: `input keyevent ${key}`, said: `Pressed ${key}.` };
379
+ }
380
+ return NAVIGATION.get(input.action);
381
+ };
382
+ const act = async (context, input, scopes) => {
383
+ assertScope(scopes, "control");
384
+ const keyboard = keyboardInput(input, scopes);
385
+ const phone = await phoneOf(context, input.serial);
386
+ const sent = keyboard ?? (input.action === "scroll" ? await scrollInput(phone, input) : pointerInput(phone, input));
387
+ await context.deps.indicator().control(calling.getStore());
388
+ await shellOn(phone, sent.command, INPUT_MS);
389
+ return await confirmingLook(context, sent.said, phone, scopes);
390
+ };
391
+ const runShell = async (context, input, scopes) => {
392
+ assertScope(scopes, "shell");
393
+ const labels = [
394
+ ...new Set([
395
+ ...destructiveClasses(input.command).map((commandClass) => COMMAND_CLASS_LABELS[commandClass]),
396
+ ...androidDestructive(input.command),
397
+ ]),
398
+ ];
399
+ if (labels.length > 0 && scopes.destructive !== "on") {
400
+ throw new ScopeError(`Refused: on the phone this command would ${labels.join(" and ")}, and "Run destructive commands" is switched off for this device. ` +
401
+ `Turn it on in its capability card to allow this, or run a command that does not.`);
402
+ }
403
+ assertNoLockoutCommand(input.command);
404
+ const { run, device } = await phoneOf(context, input.serial);
405
+ const timeout = Math.min(input.timeoutMs ?? DEFAULT_SHELL_TIMEOUT_MS, MAX_SHELL_TIMEOUT_MS);
406
+ const output = await run(["-s", device.serial, "shell", input.command], timeout);
407
+ const result = {
408
+ exitCode: output.timedOut ? null : output.code,
409
+ stdout: clip(output.stdout.toString("utf8")),
410
+ stderr: clip(output.stderr),
411
+ timedOut: output.timedOut,
412
+ lingering: false,
413
+ };
414
+ return `On ${named(device)}: ${describeResult(result, timeout)}`;
415
+ };
416
+ const install = async (context, input, scopes) => {
417
+ assertScope(scopes, "shell");
418
+ assertScope(scopes, "write");
419
+ const real = await assertPath(input.path, scopes, "install");
420
+ if (!/\.apk$/i.test(real)) {
421
+ throw new AndroidError(`"${input.path}" is not an .apk: adb install takes an APK file (an .aab has to be turned into one first, with bundletool).`);
422
+ }
423
+ if ((await stat(real).catch(undefinedIfMissing))?.isFile() !== true) {
424
+ throw new AndroidError(`There is no file "${input.path}" on this computer.`);
425
+ }
426
+ const { run, device } = await phoneOf(context, input.serial);
427
+ const output = await run(["-s", device.serial, "install", "-r", real], INSTALL_MS);
428
+ if (output.timedOut) {
429
+ throw new AndroidError(`Installing ${input.path} on ${named(device)} did not finish within ${INSTALL_MS / 60_000} minutes.`);
430
+ }
431
+ const said = outputText(output);
432
+ if (output.code !== 0 || !/\bSuccess\b/.test(said)) {
433
+ throw new AndroidError(`${named(device)} did not install ${input.path}: ${tail(said)}`);
434
+ }
435
+ return `Installed ${input.path} on ${named(device)}, replacing the app's earlier version if it had one (its data is kept).`;
436
+ };
437
+ const PRIORITY_WORDS = { V: "verbose", D: "debug", I: "info", W: "warning", E: "error", F: "fatal" };
438
+ const assertLogFilters = ({ package: app, tag }) => {
439
+ if (app !== undefined && !/^[A-Za-z]\w*(?:\.[A-Za-z_]\w*)*$/.test(app)) {
440
+ throw new AndroidError(`"${app}" is not an Android package name, like com.example.app.`);
441
+ }
442
+ if (tag !== undefined && !/^[\w.$/-]+$/.test(tag)) {
443
+ throw new AndroidError(`"${tag}" is not a log tag logcat can filter by: letters, digits and . _ $ / - only.`);
444
+ }
445
+ };
446
+ const pidOf = async (phone, app) => {
447
+ const pid = (await shellOn(phone, `pidof ${app}`).catch(() => ""))
448
+ .trim()
449
+ .split(/\s+/)
450
+ .find((word) => /^\d+$/.test(word));
451
+ if (pid === undefined) {
452
+ throw new AndroidError(`${app} is not running on ${named(phone.device)}, so it has no log of its own to show: start it, or leave out package to read the whole log.`);
453
+ }
454
+ return pid;
455
+ };
456
+ const logFilters = ({ tag, priority }) => {
457
+ if (tag !== undefined) {
458
+ return [`${tag}:${priority ?? "V"}`, "*:S"];
459
+ }
460
+ return priority === undefined ? [] : [`*:${priority}`];
461
+ };
462
+ const logScope = (input, pid) => [
463
+ input.package === undefined ? "" : ` from ${input.package} (pid ${pid ?? "?"})`,
464
+ input.tag === undefined ? "" : ` tagged ${input.tag}`,
465
+ input.priority === undefined ? "" : ` at ${PRIORITY_WORDS[input.priority]} or above`,
466
+ ].join("");
467
+ const logcat = async (context, input, scopes) => {
468
+ assertScope(scopes, "shell");
469
+ assertLogFilters(input);
470
+ const phone = await phoneOf(context, input.serial);
471
+ const { run, device } = phone;
472
+ const count = Math.min(input.lines ?? DEFAULT_LOG_LINES, MAX_LOG_LINES);
473
+ const pid = input.package === undefined ? undefined : await pidOf(phone, input.package);
474
+ const output = await run(["-s", device.serial, "logcat", "-d", "-t", String(count), ...(pid === undefined ? [] : [`--pid=${pid}`]), ...logFilters(input)], INPUT_MS);
475
+ if (output.timedOut || output.code !== 0) {
476
+ throw new AndroidError(`logcat on ${named(device)} failed: ${output.timedOut ? "it timed out" : tail(outputText(output))}`);
477
+ }
478
+ const log = clip(output.stdout.toString("utf8").replace(/\r\n/g, "\n").trimEnd());
479
+ const scope = logScope(input, pid);
480
+ if (log.text.trim() === "") {
481
+ return `Nothing in ${named(device)}'s log${scope} among its last ${count} lines.`;
482
+ }
483
+ return `Up to the last ${count} lines of ${named(device)}'s log${scope}${log.dropped === 0 ? "" : `, ${log.dropped} characters cut from the middle`}:\n${log.text}`;
484
+ };
485
+ const describeDevice = async (run, device) => {
486
+ const note = stateNote(device.state);
487
+ if (note !== undefined) {
488
+ return { ...device, ready: false, note, androidVersion: undefined, sdk: undefined, screen: undefined };
489
+ }
490
+ const props = await run(["-s", device.serial, "shell", "getprop ro.build.version.release; getprop ro.build.version.sdk; wm size"], QUICK_MS)
491
+ .then((output) => (output.code === 0 ? output.stdout.toString("utf8") : ""))
492
+ .catch(() => "");
493
+ const [release = "", sdk = ""] = props.split(/\r?\n/).map((line) => line.trim());
494
+ const screen = parseWmSize(props);
495
+ return {
496
+ ...device,
497
+ ready: true,
498
+ note: undefined,
499
+ androidVersion: release === "" ? undefined : release,
500
+ sdk: /^\d+$/.test(sdk) ? Number(sdk) : undefined,
501
+ screen: screen === undefined ? undefined : `${screen.width}×${screen.height}`,
502
+ };
503
+ };
504
+ const listAttached = async (context, scopes) => {
505
+ assertScope(scopes, "shell");
506
+ const run = adbOf(context);
507
+ const devices = await listDevices(run);
508
+ if (devices.length === 0) {
509
+ return NO_DEVICE;
510
+ }
511
+ const described = await Promise.all(devices.map(async (device) => await describeDevice(run, device)));
512
+ const ready = described.filter((device) => device.ready).length;
513
+ const head = devices.length === 1
514
+ ? `1 Android device is attached to this computer${ready === 1 ? "; the other android_* tools act on it when no serial is given" : ""}.`
515
+ : `${devices.length} Android devices are attached to this computer: pass \`serial\` to the other android_* tools to say which one.`;
516
+ return `${head}\n${JSON.stringify(described, undefined, 2)}`;
517
+ };
518
+ export const createAndroid = (deps) => {
519
+ const context = { deps, views: new Map() };
520
+ return {
521
+ devices: async (scopes) => await listAttached(context, scopes),
522
+ screenshot: async (serial, scopes) => {
523
+ assertScope(scopes, "screen");
524
+ const phone = await phoneOf(context, serial);
525
+ return { content: shotContent(await capture(phone), phone), isError: false };
526
+ },
527
+ uiElements: async (input, scopes) => await listElements(context, input, scopes),
528
+ act: async (input, scopes) => await act(context, input, scopes),
529
+ shell: async (input, scopes) => await runShell(context, input, scopes),
530
+ install: async (input, scopes) => await install(context, input, scopes),
531
+ logcat: async (input, scopes) => await logcat(context, input, scopes),
532
+ };
533
+ };
534
+ //# sourceMappingURL=android.js.map