devlens-mcp 0.3.0 → 0.3.1

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 (162) hide show
  1. package/README.md +10 -21
  2. package/docs/setup-guide.md +11 -31
  3. package/package.json +1 -1
  4. package/.claude/settings.json +0 -12
  5. package/.claude/settings.local.json +0 -17
  6. package/bin/cli.ts +0 -22
  7. package/bin/register.ts +0 -96
  8. package/dist/src/config/devlens-config.d.ts +0 -92
  9. package/dist/src/config/devlens-config.d.ts.map +0 -1
  10. package/dist/src/config/devlens-config.js +0 -70
  11. package/dist/src/config/devlens-config.js.map +0 -1
  12. package/dist/src/index.d.ts +0 -35
  13. package/dist/src/index.d.ts.map +0 -1
  14. package/dist/src/index.js +0 -8
  15. package/dist/src/index.js.map +0 -1
  16. package/dist/src/metro/cdp-client.d.ts +0 -48
  17. package/dist/src/metro/cdp-client.d.ts.map +0 -1
  18. package/dist/src/metro/cdp-client.js +0 -127
  19. package/dist/src/metro/cdp-client.js.map +0 -1
  20. package/dist/src/metro/log-collector.d.ts +0 -30
  21. package/dist/src/metro/log-collector.d.ts.map +0 -1
  22. package/dist/src/metro/log-collector.js +0 -114
  23. package/dist/src/metro/log-collector.js.map +0 -1
  24. package/dist/src/metro/metro-bridge.d.ts +0 -56
  25. package/dist/src/metro/metro-bridge.d.ts.map +0 -1
  26. package/dist/src/metro/metro-bridge.js +0 -255
  27. package/dist/src/metro/metro-bridge.js.map +0 -1
  28. package/dist/src/metro/network-inspector.d.ts +0 -34
  29. package/dist/src/metro/network-inspector.d.ts.map +0 -1
  30. package/dist/src/metro/network-inspector.js +0 -100
  31. package/dist/src/metro/network-inspector.js.map +0 -1
  32. package/dist/src/platform/android/adb.d.ts +0 -50
  33. package/dist/src/platform/android/adb.d.ts.map +0 -1
  34. package/dist/src/platform/android/adb.js +0 -137
  35. package/dist/src/platform/android/adb.js.map +0 -1
  36. package/dist/src/platform/android/android-device.d.ts +0 -21
  37. package/dist/src/platform/android/android-device.d.ts.map +0 -1
  38. package/dist/src/platform/android/android-device.js +0 -94
  39. package/dist/src/platform/android/android-device.js.map +0 -1
  40. package/dist/src/platform/android/ui-automator.d.ts +0 -17
  41. package/dist/src/platform/android/ui-automator.d.ts.map +0 -1
  42. package/dist/src/platform/android/ui-automator.js +0 -126
  43. package/dist/src/platform/android/ui-automator.js.map +0 -1
  44. package/dist/src/platform/device-manager.d.ts +0 -28
  45. package/dist/src/platform/device-manager.d.ts.map +0 -1
  46. package/dist/src/platform/device-manager.js +0 -185
  47. package/dist/src/platform/device-manager.js.map +0 -1
  48. package/dist/src/platform/device.d.ts +0 -86
  49. package/dist/src/platform/device.d.ts.map +0 -1
  50. package/dist/src/platform/device.js +0 -7
  51. package/dist/src/platform/device.js.map +0 -1
  52. package/dist/src/platform/ios/accessibility.d.ts +0 -17
  53. package/dist/src/platform/ios/accessibility.d.ts.map +0 -1
  54. package/dist/src/platform/ios/accessibility.js +0 -159
  55. package/dist/src/platform/ios/accessibility.js.map +0 -1
  56. package/dist/src/platform/ios/ios-device.d.ts +0 -22
  57. package/dist/src/platform/ios/ios-device.d.ts.map +0 -1
  58. package/dist/src/platform/ios/ios-device.js +0 -97
  59. package/dist/src/platform/ios/ios-device.js.map +0 -1
  60. package/dist/src/platform/ios/simctl.d.ts +0 -54
  61. package/dist/src/platform/ios/simctl.d.ts.map +0 -1
  62. package/dist/src/platform/ios/simctl.js +0 -192
  63. package/dist/src/platform/ios/simctl.js.map +0 -1
  64. package/dist/src/server.d.ts +0 -3
  65. package/dist/src/server.d.ts.map +0 -1
  66. package/dist/src/server.js +0 -176
  67. package/dist/src/server.js.map +0 -1
  68. package/dist/src/snapshot/formatter.d.ts +0 -18
  69. package/dist/src/snapshot/formatter.d.ts.map +0 -1
  70. package/dist/src/snapshot/formatter.js +0 -86
  71. package/dist/src/snapshot/formatter.js.map +0 -1
  72. package/dist/src/snapshot/ref-registry.d.ts +0 -67
  73. package/dist/src/snapshot/ref-registry.d.ts.map +0 -1
  74. package/dist/src/snapshot/ref-registry.js +0 -169
  75. package/dist/src/snapshot/ref-registry.js.map +0 -1
  76. package/dist/src/snapshot/snapshot-differ.d.ts +0 -57
  77. package/dist/src/snapshot/snapshot-differ.d.ts.map +0 -1
  78. package/dist/src/snapshot/snapshot-differ.js +0 -153
  79. package/dist/src/snapshot/snapshot-differ.js.map +0 -1
  80. package/dist/src/tools/app-tools.d.ts +0 -71
  81. package/dist/src/tools/app-tools.d.ts.map +0 -1
  82. package/dist/src/tools/app-tools.js +0 -97
  83. package/dist/src/tools/app-tools.js.map +0 -1
  84. package/dist/src/tools/device-tools.d.ts +0 -53
  85. package/dist/src/tools/device-tools.d.ts.map +0 -1
  86. package/dist/src/tools/device-tools.js +0 -86
  87. package/dist/src/tools/device-tools.js.map +0 -1
  88. package/dist/src/tools/ds-tools.d.ts +0 -65
  89. package/dist/src/tools/ds-tools.d.ts.map +0 -1
  90. package/dist/src/tools/ds-tools.js +0 -314
  91. package/dist/src/tools/ds-tools.js.map +0 -1
  92. package/dist/src/tools/interaction-tools.d.ts +0 -248
  93. package/dist/src/tools/interaction-tools.d.ts.map +0 -1
  94. package/dist/src/tools/interaction-tools.js +0 -391
  95. package/dist/src/tools/interaction-tools.js.map +0 -1
  96. package/dist/src/tools/metro-tools.d.ts +0 -115
  97. package/dist/src/tools/metro-tools.d.ts.map +0 -1
  98. package/dist/src/tools/metro-tools.js +0 -270
  99. package/dist/src/tools/metro-tools.js.map +0 -1
  100. package/dist/src/tools/navigation-tools.d.ts +0 -36
  101. package/dist/src/tools/navigation-tools.d.ts.map +0 -1
  102. package/dist/src/tools/navigation-tools.js +0 -60
  103. package/dist/src/tools/navigation-tools.js.map +0 -1
  104. package/dist/src/tools/screenshot-tools.d.ts +0 -298
  105. package/dist/src/tools/screenshot-tools.d.ts.map +0 -1
  106. package/dist/src/tools/screenshot-tools.js +0 -565
  107. package/dist/src/tools/screenshot-tools.js.map +0 -1
  108. package/dist/src/tools/snapshot-tools.d.ts +0 -161
  109. package/dist/src/tools/snapshot-tools.d.ts.map +0 -1
  110. package/dist/src/tools/snapshot-tools.js +0 -479
  111. package/dist/src/tools/snapshot-tools.js.map +0 -1
  112. package/dist/src/utils/image-preprocess.d.ts +0 -49
  113. package/dist/src/utils/image-preprocess.d.ts.map +0 -1
  114. package/dist/src/utils/image-preprocess.js +0 -322
  115. package/dist/src/utils/image-preprocess.js.map +0 -1
  116. package/dist/src/utils/retry.d.ts +0 -21
  117. package/dist/src/utils/retry.d.ts.map +0 -1
  118. package/dist/src/utils/retry.js +0 -33
  119. package/dist/src/utils/retry.js.map +0 -1
  120. package/dist/src/visual/comparator.d.ts +0 -51
  121. package/dist/src/visual/comparator.d.ts.map +0 -1
  122. package/dist/src/visual/comparator.js +0 -119
  123. package/dist/src/visual/comparator.js.map +0 -1
  124. package/dist/src/visual/layout-analyzer.d.ts +0 -64
  125. package/dist/src/visual/layout-analyzer.d.ts.map +0 -1
  126. package/dist/src/visual/layout-analyzer.js +0 -198
  127. package/dist/src/visual/layout-analyzer.js.map +0 -1
  128. package/dist/src/visual/screenshot.d.ts +0 -17
  129. package/dist/src/visual/screenshot.d.ts.map +0 -1
  130. package/dist/src/visual/screenshot.js +0 -39
  131. package/dist/src/visual/screenshot.js.map +0 -1
  132. package/src/config/devlens-config.ts +0 -76
  133. package/src/index.ts +0 -5
  134. package/src/metro/cdp-client.ts +0 -160
  135. package/src/metro/log-collector.ts +0 -137
  136. package/src/metro/metro-bridge.ts +0 -307
  137. package/src/metro/network-inspector.ts +0 -134
  138. package/src/platform/android/adb.ts +0 -200
  139. package/src/platform/android/android-device.ts +0 -116
  140. package/src/platform/android/ui-automator.ts +0 -141
  141. package/src/platform/device-manager.ts +0 -229
  142. package/src/platform/device.ts +0 -110
  143. package/src/platform/ios/accessibility.ts +0 -189
  144. package/src/platform/ios/ios-device.ts +0 -116
  145. package/src/platform/ios/simctl.ts +0 -244
  146. package/src/server.ts +0 -228
  147. package/src/snapshot/formatter.ts +0 -102
  148. package/src/snapshot/ref-registry.ts +0 -230
  149. package/src/snapshot/snapshot-differ.ts +0 -220
  150. package/src/tools/app-tools.ts +0 -111
  151. package/src/tools/device-tools.ts +0 -96
  152. package/src/tools/ds-tools.ts +0 -395
  153. package/src/tools/interaction-tools.ts +0 -467
  154. package/src/tools/metro-tools.ts +0 -320
  155. package/src/tools/navigation-tools.ts +0 -71
  156. package/src/tools/screenshot-tools.ts +0 -698
  157. package/src/tools/snapshot-tools.ts +0 -585
  158. package/src/utils/image-preprocess.ts +0 -430
  159. package/src/utils/retry.ts +0 -51
  160. package/src/visual/comparator.ts +0 -191
  161. package/src/visual/layout-analyzer.ts +0 -283
  162. package/src/visual/screenshot.ts +0 -49
@@ -1,100 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NetworkInspector = void 0;
4
- class NetworkInspector {
5
- cdp;
6
- requests = new Map();
7
- maxRequests = 200;
8
- constructor(cdp) {
9
- this.cdp = cdp;
10
- }
11
- /** Start intercepting network requests */
12
- start() {
13
- // Enable Network domain
14
- this.cdp.send("Network.enable").catch(() => {
15
- // Network domain might not be available
16
- });
17
- // Request started
18
- this.cdp.on("Network.requestWillBeSent", (msg) => {
19
- const params = msg.params;
20
- if (!params)
21
- return;
22
- const request = {
23
- id: params.requestId,
24
- url: params.request?.url || "",
25
- method: params.request?.method || "GET",
26
- type: params.type,
27
- startTime: Date.now(),
28
- requestHeaders: params.request?.headers,
29
- };
30
- this.requests.set(params.requestId, request);
31
- this.trimRequests();
32
- });
33
- // Response received
34
- this.cdp.on("Network.responseReceived", (msg) => {
35
- const params = msg.params;
36
- if (!params)
37
- return;
38
- const request = this.requests.get(params.requestId);
39
- if (request) {
40
- request.status = params.response?.status;
41
- request.statusText = params.response?.statusText;
42
- request.responseHeaders = params.response?.headers;
43
- request.endTime = Date.now();
44
- request.duration = request.endTime - request.startTime;
45
- }
46
- });
47
- // Loading finished
48
- this.cdp.on("Network.loadingFinished", (msg) => {
49
- const params = msg.params;
50
- if (!params)
51
- return;
52
- const request = this.requests.get(params.requestId);
53
- if (request) {
54
- request.size = params.encodedDataLength;
55
- if (!request.endTime) {
56
- request.endTime = Date.now();
57
- request.duration = request.endTime - request.startTime;
58
- }
59
- }
60
- });
61
- // Loading failed
62
- this.cdp.on("Network.loadingFailed", (msg) => {
63
- const params = msg.params;
64
- if (!params)
65
- return;
66
- const request = this.requests.get(params.requestId);
67
- if (request) {
68
- request.error = params.errorText || "Request failed";
69
- request.endTime = Date.now();
70
- request.duration = request.endTime - request.startTime;
71
- }
72
- });
73
- }
74
- /** Get all captured network requests, optionally filtered by URL pattern */
75
- getRequests(urlPattern) {
76
- let requests = Array.from(this.requests.values());
77
- if (urlPattern) {
78
- const pattern = urlPattern.toLowerCase();
79
- requests = requests.filter((r) => r.url.toLowerCase().includes(pattern));
80
- }
81
- // Sort by start time (newest first)
82
- return requests.sort((a, b) => b.startTime - a.startTime);
83
- }
84
- /** Clear all captured requests */
85
- clear() {
86
- this.requests.clear();
87
- }
88
- trimRequests() {
89
- if (this.requests.size > this.maxRequests) {
90
- // Remove oldest entries
91
- const entries = Array.from(this.requests.entries()).sort((a, b) => a[1].startTime - b[1].startTime);
92
- const toRemove = entries.slice(0, entries.length - Math.floor(this.maxRequests * 0.8));
93
- for (const [id] of toRemove) {
94
- this.requests.delete(id);
95
- }
96
- }
97
- }
98
- }
99
- exports.NetworkInspector = NetworkInspector;
100
- //# sourceMappingURL=network-inspector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"network-inspector.js","sourceRoot":"","sources":["../../../src/metro/network-inspector.ts"],"names":[],"mappings":"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"}
@@ -1,50 +0,0 @@
1
- /**
2
- * ADB command wrapper — handles all communication with Android devices via ADB.
3
- */
4
- export declare class Adb {
5
- private deviceId;
6
- private adbPath;
7
- constructor(deviceId: string);
8
- /** Execute an ADB shell command on the device (with retry for transient failures) */
9
- shell(command: string): Promise<string>;
10
- /** Execute an ADB command (non-shell) */
11
- exec(...args: string[]): Promise<string>;
12
- /** Take a screenshot and return the PNG buffer (with retry) */
13
- screenshot(): Promise<Buffer>;
14
- /** Dump the UI hierarchy XML (with retry) */
15
- dumpUiHierarchy(): Promise<string>;
16
- /** Tap at screen coordinates */
17
- tap(x: number, y: number): Promise<void>;
18
- /** Long press at coordinates */
19
- longPress(x: number, y: number, durationMs?: number): Promise<void>;
20
- /** Swipe between two points */
21
- swipe(startX: number, startY: number, endX: number, endY: number, durationMs?: number): Promise<void>;
22
- /** Type text using ADB input */
23
- typeText(text: string): Promise<void>;
24
- /** Press a key event */
25
- keyEvent(keyCode: number): Promise<void>;
26
- /** Get device screen size */
27
- getScreenSize(): Promise<{
28
- width: number;
29
- height: number;
30
- }>;
31
- /** Get device orientation (0=portrait, 1=landscape, 2=reverse-portrait, 3=reverse-landscape) */
32
- getOrientation(): Promise<number>;
33
- /** Get Android version */
34
- getAndroidVersion(): Promise<string>;
35
- /** Get device model name */
36
- getDeviceName(): Promise<string>;
37
- /** Launch an app by package name */
38
- launchApp(packageName: string): Promise<void>;
39
- /** Force stop an app */
40
- terminateApp(packageName: string): Promise<void>;
41
- /** Install an APK */
42
- installApp(apkPath: string): Promise<void>;
43
- /** List installed packages */
44
- listPackages(): Promise<string[]>;
45
- /** Open a URL */
46
- openUrl(url: string): Promise<void>;
47
- /** Set orientation (0=auto, 1=portrait, 2=landscape) */
48
- setRotation(rotation: number): Promise<void>;
49
- }
50
- //# sourceMappingURL=adb.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adb.d.ts","sourceRoot":"","sources":["../../../../src/platform/android/adb.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,qBAAa,GAAG;IAGF,OAAO,CAAC,QAAQ;IAF5B,OAAO,CAAC,OAAO,CAAS;gBAEJ,QAAQ,EAAE,MAAM;IAQpC,qFAAqF;IAC/E,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc7C,yCAAyC;IACnC,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAS9C,+DAA+D;IACzD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAcnC,6CAA6C;IACvC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAyBxC,gCAAgC;IAC1B,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,gCAAgC;IAC1B,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/E,+BAA+B;IACzB,KAAK,CACT,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAY,GACvB,OAAO,CAAC,IAAI,CAAC;IAMhB,gCAAgC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3C,wBAAwB;IAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,6BAA6B;IACvB,aAAa,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAOjE,gGAAgG;IAC1F,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAQvC,0BAA0B;IACpB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI1C,4BAA4B;IACtB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAItC,oCAAoC;IAC9B,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,wBAAwB;IAClB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,qBAAqB;IACf,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,8BAA8B;IACxB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQvC,iBAAiB;IACX,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC,wDAAwD;IAClD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAInD"}
@@ -1,137 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Adb = void 0;
4
- const child_process_1 = require("child_process");
5
- const util_1 = require("util");
6
- const retry_js_1 = require("../../utils/retry.js");
7
- const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
8
- /**
9
- * ADB command wrapper — handles all communication with Android devices via ADB.
10
- */
11
- class Adb {
12
- deviceId;
13
- adbPath;
14
- constructor(deviceId) {
15
- this.deviceId = deviceId;
16
- const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
17
- this.adbPath = androidHome
18
- ? `${androidHome}/platform-tools/adb`
19
- : "adb";
20
- }
21
- /** Execute an ADB shell command on the device (with retry for transient failures) */
22
- async shell(command) {
23
- return (0, retry_js_1.retry)(async () => {
24
- const { stdout } = await execFileAsync(this.adbPath, ["-s", this.deviceId, "shell", command], { maxBuffer: 10 * 1024 * 1024, timeout: 30000 });
25
- return stdout;
26
- }, { maxAttempts: 2, delayMs: 500 });
27
- }
28
- /** Execute an ADB command (non-shell) */
29
- async exec(...args) {
30
- const { stdout } = await execFileAsync(this.adbPath, ["-s", this.deviceId, ...args], { maxBuffer: 10 * 1024 * 1024, timeout: 30000 });
31
- return stdout;
32
- }
33
- /** Take a screenshot and return the PNG buffer (with retry) */
34
- async screenshot() {
35
- return (0, retry_js_1.retry)(async () => {
36
- const { stdout } = await execFileAsync(this.adbPath, ["-s", this.deviceId, "exec-out", "screencap", "-p"], { maxBuffer: 20 * 1024 * 1024, encoding: "buffer", timeout: 15000 });
37
- return stdout;
38
- }, { maxAttempts: 2, delayMs: 300 });
39
- }
40
- /** Dump the UI hierarchy XML (with retry) */
41
- async dumpUiHierarchy() {
42
- return (0, retry_js_1.retry)(async () => {
43
- const dumpPath = "/sdcard/devlens-ui-dump.xml";
44
- await execFileAsync(this.adbPath, ["-s", this.deviceId, "shell", `uiautomator dump ${dumpPath}`], { maxBuffer: 10 * 1024 * 1024, timeout: 30000 });
45
- const { stdout: xml } = await execFileAsync(this.adbPath, ["-s", this.deviceId, "shell", `cat ${dumpPath}`], { maxBuffer: 10 * 1024 * 1024, timeout: 30000 });
46
- // Clean up
47
- execFileAsync(this.adbPath, ["-s", this.deviceId, "shell", `rm ${dumpPath}`]).catch(() => { });
48
- return xml;
49
- }, { maxAttempts: 2, delayMs: 500 });
50
- }
51
- /** Tap at screen coordinates */
52
- async tap(x, y) {
53
- await this.shell(`input tap ${Math.round(x)} ${Math.round(y)}`);
54
- }
55
- /** Long press at coordinates */
56
- async longPress(x, y, durationMs = 1000) {
57
- await this.shell(`input swipe ${Math.round(x)} ${Math.round(y)} ${Math.round(x)} ${Math.round(y)} ${durationMs}`);
58
- }
59
- /** Swipe between two points */
60
- async swipe(startX, startY, endX, endY, durationMs = 300) {
61
- await this.shell(`input swipe ${Math.round(startX)} ${Math.round(startY)} ${Math.round(endX)} ${Math.round(endY)} ${durationMs}`);
62
- }
63
- /** Type text using ADB input */
64
- async typeText(text) {
65
- // Escape special characters for ADB shell
66
- const escaped = text
67
- .replace(/\\/g, "\\\\")
68
- .replace(/"/g, '\\"')
69
- .replace(/ /g, "%s")
70
- .replace(/'/g, "\\'")
71
- .replace(/&/g, "\\&")
72
- .replace(/</g, "\\<")
73
- .replace(/>/g, "\\>")
74
- .replace(/\|/g, "\\|")
75
- .replace(/;/g, "\\;")
76
- .replace(/\(/g, "\\(")
77
- .replace(/\)/g, "\\)");
78
- await this.shell(`input text "${escaped}"`);
79
- }
80
- /** Press a key event */
81
- async keyEvent(keyCode) {
82
- await this.shell(`input keyevent ${keyCode}`);
83
- }
84
- /** Get device screen size */
85
- async getScreenSize() {
86
- const output = await this.shell("wm size");
87
- const match = output.match(/(\d+)x(\d+)/);
88
- if (!match)
89
- throw new Error("Could not determine screen size");
90
- return { width: parseInt(match[1]), height: parseInt(match[2]) };
91
- }
92
- /** Get device orientation (0=portrait, 1=landscape, 2=reverse-portrait, 3=reverse-landscape) */
93
- async getOrientation() {
94
- const output = await this.shell("dumpsys input | grep 'SurfaceOrientation'");
95
- const match = output.match(/SurfaceOrientation:\s*(\d)/);
96
- return match ? parseInt(match[1]) : 0;
97
- }
98
- /** Get Android version */
99
- async getAndroidVersion() {
100
- return (await this.shell("getprop ro.build.version.release")).trim();
101
- }
102
- /** Get device model name */
103
- async getDeviceName() {
104
- return (await this.shell("getprop ro.product.model")).trim();
105
- }
106
- /** Launch an app by package name */
107
- async launchApp(packageName) {
108
- await this.shell(`monkey -p ${packageName} -c android.intent.category.LAUNCHER 1`);
109
- }
110
- /** Force stop an app */
111
- async terminateApp(packageName) {
112
- await this.shell(`am force-stop ${packageName}`);
113
- }
114
- /** Install an APK */
115
- async installApp(apkPath) {
116
- await this.exec("install", "-r", apkPath);
117
- }
118
- /** List installed packages */
119
- async listPackages() {
120
- const output = await this.shell("pm list packages -3");
121
- return output
122
- .split("\n")
123
- .filter((line) => line.startsWith("package:"))
124
- .map((line) => line.replace("package:", "").trim());
125
- }
126
- /** Open a URL */
127
- async openUrl(url) {
128
- await this.shell(`am start -a android.intent.action.VIEW -d "${url}"`);
129
- }
130
- /** Set orientation (0=auto, 1=portrait, 2=landscape) */
131
- async setRotation(rotation) {
132
- await this.shell("settings put system accelerometer_rotation 0");
133
- await this.shell(`settings put system user_rotation ${rotation}`);
134
- }
135
- }
136
- exports.Adb = Adb;
137
- //# sourceMappingURL=adb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adb.js","sourceRoot":"","sources":["../../../../src/platform/android/adb.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import type { Device, DeviceInfo, AppInfo, SnapshotNode } from "../device.js";
2
- export declare class AndroidDevice implements Device {
3
- private adb;
4
- constructor(deviceId: string);
5
- getInfo(): Promise<DeviceInfo>;
6
- getSnapshot(): Promise<SnapshotNode>;
7
- takeScreenshot(): Promise<Buffer>;
8
- tap(x: number, y: number): Promise<void>;
9
- doubleTap(x: number, y: number): Promise<void>;
10
- longPress(x: number, y: number, durationMs?: number): Promise<void>;
11
- typeText(text: string): Promise<void>;
12
- swipe(startX: number, startY: number, endX: number, endY: number, durationMs?: number): Promise<void>;
13
- pressButton(button: "home" | "back" | "enter"): Promise<void>;
14
- setOrientation(orientation: "portrait" | "landscape"): Promise<void>;
15
- launchApp(appId: string): Promise<void>;
16
- terminateApp(appId: string): Promise<void>;
17
- installApp(path: string): Promise<void>;
18
- listApps(): Promise<AppInfo[]>;
19
- openUrl(url: string): Promise<void>;
20
- }
21
- //# sourceMappingURL=android-device.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"android-device.d.ts","sourceRoot":"","sources":["../../../../src/platform/android/android-device.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAS9E,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,GAAG,CAAM;gBAEL,QAAQ,EAAE,MAAM;IAItB,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAoB9B,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC;IAKpC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,KAAK,CACT,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,SAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAIV,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7D,cAAc,CAAC,WAAW,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAS9B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG1C"}
@@ -1,94 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AndroidDevice = void 0;
4
- const adb_js_1 = require("./adb.js");
5
- const ui_automator_js_1 = require("./ui-automator.js");
6
- // Android key codes
7
- const KEY_HOME = 3;
8
- const KEY_BACK = 4;
9
- const KEY_ENTER = 66;
10
- class AndroidDevice {
11
- adb;
12
- constructor(deviceId) {
13
- this.adb = new adb_js_1.Adb(deviceId);
14
- }
15
- async getInfo() {
16
- const [screenSize, orientation, version, name] = await Promise.all([
17
- this.adb.getScreenSize(),
18
- this.adb.getOrientation(),
19
- this.adb.getAndroidVersion(),
20
- this.adb.getDeviceName(),
21
- ]);
22
- return {
23
- id: this.adb.deviceId,
24
- name,
25
- platform: "android",
26
- osVersion: version,
27
- screenWidth: screenSize.width,
28
- screenHeight: screenSize.height,
29
- orientation: orientation === 0 || orientation === 2 ? "portrait" : "landscape",
30
- isBooted: true,
31
- };
32
- }
33
- async getSnapshot() {
34
- const xml = await this.adb.dumpUiHierarchy();
35
- return (0, ui_automator_js_1.parseUiAutomatorXml)(xml);
36
- }
37
- async takeScreenshot() {
38
- return this.adb.screenshot();
39
- }
40
- async tap(x, y) {
41
- await this.adb.tap(x, y);
42
- }
43
- async doubleTap(x, y) {
44
- await this.adb.tap(x, y);
45
- await sleep(100);
46
- await this.adb.tap(x, y);
47
- }
48
- async longPress(x, y, durationMs = 1000) {
49
- await this.adb.longPress(x, y, durationMs);
50
- }
51
- async typeText(text) {
52
- await this.adb.typeText(text);
53
- }
54
- async swipe(startX, startY, endX, endY, durationMs = 300) {
55
- await this.adb.swipe(startX, startY, endX, endY, durationMs);
56
- }
57
- async pressButton(button) {
58
- const keyMap = {
59
- home: KEY_HOME,
60
- back: KEY_BACK,
61
- enter: KEY_ENTER,
62
- };
63
- await this.adb.keyEvent(keyMap[button]);
64
- }
65
- async setOrientation(orientation) {
66
- const rotation = orientation === "portrait" ? 0 : 1;
67
- await this.adb.setRotation(rotation);
68
- }
69
- async launchApp(appId) {
70
- await this.adb.launchApp(appId);
71
- }
72
- async terminateApp(appId) {
73
- await this.adb.terminateApp(appId);
74
- }
75
- async installApp(path) {
76
- await this.adb.installApp(path);
77
- }
78
- async listApps() {
79
- const packages = await this.adb.listPackages();
80
- return packages.map((pkg) => ({
81
- appId: pkg,
82
- name: pkg,
83
- isRunning: false, // Would need `ps` to determine
84
- }));
85
- }
86
- async openUrl(url) {
87
- await this.adb.openUrl(url);
88
- }
89
- }
90
- exports.AndroidDevice = AndroidDevice;
91
- function sleep(ms) {
92
- return new Promise((resolve) => setTimeout(resolve, ms));
93
- }
94
- //# sourceMappingURL=android-device.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"android-device.js","sourceRoot":"","sources":["../../../../src/platform/android/android-device.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- import type { SnapshotNode } from "../device.js";
2
- /**
3
- * Parses Android UI Automator XML dump into SnapshotNode tree.
4
- *
5
- * The XML format from `uiautomator dump` looks like:
6
- * <hierarchy rotation="0">
7
- * <node index="0" text="" resource-id="..." class="android.widget.FrameLayout"
8
- * package="com.example" content-desc="" checkable="false" checked="false"
9
- * clickable="false" enabled="true" focusable="false" focused="false"
10
- * scrollable="false" long-clickable="false" password="false" selected="false"
11
- * bounds="[0,0][1080,2340]">
12
- * <node ... />
13
- * </node>
14
- * </hierarchy>
15
- */
16
- export declare function parseUiAutomatorXml(xml: string): SnapshotNode;
17
- //# sourceMappingURL=ui-automator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ui-automator.d.ts","sourceRoot":"","sources":["../../../../src/platform/android/ui-automator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAU,MAAM,cAAc,CAAC;AAEzD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CA+B7D"}
@@ -1,126 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseUiAutomatorXml = parseUiAutomatorXml;
4
- const fast_xml_parser_1 = require("fast-xml-parser");
5
- /**
6
- * Parses Android UI Automator XML dump into SnapshotNode tree.
7
- *
8
- * The XML format from `uiautomator dump` looks like:
9
- * <hierarchy rotation="0">
10
- * <node index="0" text="" resource-id="..." class="android.widget.FrameLayout"
11
- * package="com.example" content-desc="" checkable="false" checked="false"
12
- * clickable="false" enabled="true" focusable="false" focused="false"
13
- * scrollable="false" long-clickable="false" password="false" selected="false"
14
- * bounds="[0,0][1080,2340]">
15
- * <node ... />
16
- * </node>
17
- * </hierarchy>
18
- */
19
- function parseUiAutomatorXml(xml) {
20
- const parser = new fast_xml_parser_1.XMLParser({
21
- ignoreAttributes: false,
22
- attributeNamePrefix: "@_",
23
- allowBooleanAttributes: true,
24
- isArray: (name) => name === "node",
25
- });
26
- const parsed = parser.parse(xml);
27
- const hierarchy = parsed.hierarchy;
28
- if (!hierarchy || !hierarchy.node) {
29
- throw new Error("Invalid UI Automator dump: no hierarchy or root node found");
30
- }
31
- const rootNodes = Array.isArray(hierarchy.node)
32
- ? hierarchy.node
33
- : [hierarchy.node];
34
- // Create a virtual root that contains all top-level nodes
35
- return {
36
- type: "hierarchy",
37
- text: undefined,
38
- label: undefined,
39
- description: undefined,
40
- bounds: { x: 0, y: 0, width: 0, height: 0 },
41
- interactive: false,
42
- children: rootNodes.map(convertNode),
43
- };
44
- }
45
- function convertNode(node) {
46
- const bounds = parseBounds(node["@_bounds"] || "[0,0][0,0]");
47
- const text = node["@_text"] || undefined;
48
- const description = node["@_content-desc"] || undefined;
49
- const resourceId = node["@_resource-id"] || undefined;
50
- const className = node["@_class"] || "unknown";
51
- const clickable = node["@_clickable"] === "true";
52
- const longClickable = node["@_long-clickable"] === "true";
53
- const checkable = node["@_checkable"] === "true";
54
- const scrollable = node["@_scrollable"] === "true";
55
- const focusable = node["@_focusable"] === "true";
56
- const interactive = clickable || longClickable || checkable || scrollable || focusable;
57
- const children = [];
58
- if (node.node) {
59
- const childNodes = Array.isArray(node.node) ? node.node : [node.node];
60
- for (const child of childNodes) {
61
- children.push(convertNode(child));
62
- }
63
- }
64
- return {
65
- type: simplifyClassName(className),
66
- text: text && text.length > 0 ? text : undefined,
67
- label: description && description.length > 0 ? description : undefined,
68
- description: description && description.length > 0 ? description : undefined,
69
- bounds,
70
- interactive,
71
- focused: node["@_focused"] === "true",
72
- enabled: node["@_enabled"] === "true",
73
- visible: bounds.width > 0 && bounds.height > 0,
74
- value: getElementValue(node),
75
- resourceId: resourceId && resourceId.length > 0 ? resourceId : undefined,
76
- children,
77
- rawAttributes: extractRawAttributes(node),
78
- };
79
- }
80
- /** Parse Android bounds format "[left,top][right,bottom]" into Bounds */
81
- function parseBounds(boundsStr) {
82
- const match = boundsStr.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);
83
- if (!match) {
84
- return { x: 0, y: 0, width: 0, height: 0 };
85
- }
86
- const left = parseInt(match[1]);
87
- const top = parseInt(match[2]);
88
- const right = parseInt(match[3]);
89
- const bottom = parseInt(match[4]);
90
- return {
91
- x: left,
92
- y: top,
93
- width: right - left,
94
- height: bottom - top,
95
- };
96
- }
97
- /** Simplify Android class names for readability */
98
- function simplifyClassName(className) {
99
- // "android.widget.TextView" → "TextView"
100
- // "android.view.View" → "View"
101
- const parts = className.split(".");
102
- return parts[parts.length - 1];
103
- }
104
- /** Extract element value (for checkboxes, switches, inputs, etc.) */
105
- function getElementValue(node) {
106
- if (node["@_checked"] === "true")
107
- return "checked";
108
- if (node["@_checked"] === "false" && node["@_checkable"] === "true")
109
- return "unchecked";
110
- if (node["@_selected"] === "true")
111
- return "selected";
112
- if (node["@_password"] === "true")
113
- return "•••";
114
- return undefined;
115
- }
116
- /** Extract all raw attributes for debugging */
117
- function extractRawAttributes(node) {
118
- const attrs = {};
119
- for (const key of Object.keys(node)) {
120
- if (key.startsWith("@_")) {
121
- attrs[key.replace("@_", "")] = String(node[key]);
122
- }
123
- }
124
- return attrs;
125
- }
126
- //# sourceMappingURL=ui-automator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ui-automator.js","sourceRoot":"","sources":["../../../../src/platform/android/ui-automator.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- import type { Device } from "./device.js";
2
- export interface DiscoveredDevice {
3
- id: string;
4
- name: string;
5
- platform: "ios" | "android";
6
- osVersion: string;
7
- isBooted: boolean;
8
- }
9
- /**
10
- * DeviceManager discovers running iOS Simulators and Android Emulators,
11
- * and creates Device instances for them.
12
- */
13
- export declare class DeviceManager {
14
- private activeDevice;
15
- private activeDeviceId;
16
- private activePlatform;
17
- discoverDevices(): Promise<DiscoveredDevice[]>;
18
- getDevice(deviceId?: string): Promise<Device>;
19
- /**
20
- * Quick health check to verify a cached device is still alive.
21
- * Returns false if the device is disconnected or no longer booted.
22
- */
23
- private checkDeviceHealth;
24
- private discoverAndroidDevices;
25
- private discoverIosDevices;
26
- private getAdbPath;
27
- }
28
- //# sourceMappingURL=device-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-manager.d.ts","sourceRoot":"","sources":["../../../src/platform/device-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AAMtD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAkC;IAElD,eAAe,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAkB9C,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqDnD;;;OAGG;YACW,iBAAiB;YAgCjB,sBAAsB;YAkDtB,kBAAkB;IAsChC,OAAO,CAAC,UAAU;CAQnB"}