devlens-mcp 0.4.2 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +211 -35
- package/RELEASE_NOTES.md +3 -7
- package/dist/bin/cli.js +41 -14
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/setup.d.ts +14 -0
- package/dist/bin/setup.d.ts.map +1 -0
- package/dist/bin/setup.js +272 -0
- package/dist/bin/setup.js.map +1 -0
- package/dist/src/figma/figma-api.d.ts +108 -0
- package/dist/src/figma/figma-api.d.ts.map +1 -0
- package/dist/src/figma/figma-api.js +284 -0
- package/dist/src/figma/figma-api.js.map +1 -0
- package/dist/src/figma/figma-cache.d.ts +57 -0
- package/dist/src/figma/figma-cache.d.ts.map +1 -0
- package/dist/src/figma/figma-cache.js +266 -0
- package/dist/src/figma/figma-cache.js.map +1 -0
- package/dist/src/figma/figma-client.d.ts +62 -0
- package/dist/src/figma/figma-client.d.ts.map +1 -0
- package/dist/src/figma/figma-client.js +224 -0
- package/dist/src/figma/figma-client.js.map +1 -0
- package/dist/src/figma/figma-rate-limiter.d.ts +46 -0
- package/dist/src/figma/figma-rate-limiter.d.ts.map +1 -0
- package/dist/src/figma/figma-rate-limiter.js +153 -0
- package/dist/src/figma/figma-rate-limiter.js.map +1 -0
- package/dist/src/figma/figma-retry.d.ts +19 -0
- package/dist/src/figma/figma-retry.d.ts.map +1 -0
- package/dist/src/figma/figma-retry.js +57 -0
- package/dist/src/figma/figma-retry.js.map +1 -0
- package/dist/src/figma/figma-structure.d.ts +1 -1
- package/dist/src/figma/figma-structure.d.ts.map +1 -1
- package/dist/src/figma/figma-structure.js +11 -1
- package/dist/src/figma/figma-structure.js.map +1 -1
- package/dist/src/figma/figma-types.d.ts +54 -0
- package/dist/src/figma/figma-types.d.ts.map +1 -0
- package/dist/src/figma/figma-types.js +33 -0
- package/dist/src/figma/figma-types.js.map +1 -0
- package/dist/src/figma/url-parser.d.ts +40 -0
- package/dist/src/figma/url-parser.d.ts.map +1 -0
- package/dist/src/figma/url-parser.js +107 -0
- package/dist/src/figma/url-parser.js.map +1 -0
- package/dist/src/platform/device-manager.d.ts +5 -0
- package/dist/src/platform/device-manager.d.ts.map +1 -1
- package/dist/src/platform/device-manager.js +18 -0
- package/dist/src/platform/device-manager.js.map +1 -1
- package/dist/src/platform/device-pool.d.ts +105 -0
- package/dist/src/platform/device-pool.d.ts.map +1 -0
- package/dist/src/platform/device-pool.js +328 -0
- package/dist/src/platform/device-pool.js.map +1 -0
- package/dist/src/platform/device-profiles.d.ts +50 -0
- package/dist/src/platform/device-profiles.d.ts.map +1 -0
- package/dist/src/platform/device-profiles.js +155 -0
- package/dist/src/platform/device-profiles.js.map +1 -0
- package/dist/src/platform/ios/ios-device.d.ts +0 -2
- package/dist/src/platform/ios/ios-device.d.ts.map +1 -1
- package/dist/src/platform/ios/ios-device.js +8 -18
- package/dist/src/platform/ios/ios-device.js.map +1 -1
- package/dist/src/platform/ios/simctl.d.ts +0 -5
- package/dist/src/platform/ios/simctl.d.ts.map +1 -1
- package/dist/src/platform/ios/simctl.js +0 -4
- package/dist/src/platform/ios/simctl.js.map +1 -1
- package/dist/src/platform/simulator-factory.d.ts +85 -0
- package/dist/src/platform/simulator-factory.d.ts.map +1 -0
- package/dist/src/platform/simulator-factory.js +396 -0
- package/dist/src/platform/simulator-factory.js.map +1 -0
- package/dist/src/platform/system-resources.d.ts +44 -0
- package/dist/src/platform/system-resources.d.ts.map +1 -0
- package/dist/src/platform/system-resources.js +103 -0
- package/dist/src/platform/system-resources.js.map +1 -0
- package/dist/src/prototype/browser-engine.d.ts +62 -0
- package/dist/src/prototype/browser-engine.d.ts.map +1 -0
- package/dist/src/prototype/browser-engine.js +199 -0
- package/dist/src/prototype/browser-engine.js.map +1 -0
- package/dist/src/prototype/figma-navigator.d.ts +40 -0
- package/dist/src/prototype/figma-navigator.d.ts.map +1 -0
- package/dist/src/prototype/figma-navigator.js +95 -0
- package/dist/src/prototype/figma-navigator.js.map +1 -0
- package/dist/src/prototype/flow-reporter.d.ts +47 -0
- package/dist/src/prototype/flow-reporter.d.ts.map +1 -0
- package/dist/src/prototype/flow-reporter.js +255 -0
- package/dist/src/prototype/flow-reporter.js.map +1 -0
- package/dist/src/prototype/screen-analyzer.d.ts +31 -0
- package/dist/src/prototype/screen-analyzer.d.ts.map +1 -0
- package/dist/src/prototype/screen-analyzer.js +114 -0
- package/dist/src/prototype/screen-analyzer.js.map +1 -0
- package/dist/src/prototype/web-crawler.d.ts +31 -0
- package/dist/src/prototype/web-crawler.d.ts.map +1 -0
- package/dist/src/prototype/web-crawler.js +88 -0
- package/dist/src/prototype/web-crawler.js.map +1 -0
- package/dist/src/reports/cross-device-report.d.ts +84 -0
- package/dist/src/reports/cross-device-report.d.ts.map +1 -0
- package/dist/src/reports/cross-device-report.js +342 -0
- package/dist/src/reports/cross-device-report.js.map +1 -0
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +9 -1
- package/dist/src/server.js.map +1 -1
- package/dist/src/snapshot/formatter.d.ts +5 -13
- package/dist/src/snapshot/formatter.d.ts.map +1 -1
- package/dist/src/snapshot/formatter.js +19 -28
- package/dist/src/snapshot/formatter.js.map +1 -1
- package/dist/src/tools/interaction-tools.d.ts +6 -6
- package/dist/src/tools/interaction-tools.d.ts.map +1 -1
- package/dist/src/tools/interaction-tools.js +2 -12
- package/dist/src/tools/interaction-tools.js.map +1 -1
- package/dist/src/tools/metro-tools.d.ts +2 -2
- package/dist/src/tools/multi-device-tools.d.ts +133 -0
- package/dist/src/tools/multi-device-tools.d.ts.map +1 -0
- package/dist/src/tools/multi-device-tools.js +365 -0
- package/dist/src/tools/multi-device-tools.js.map +1 -0
- package/dist/src/tools/navigation-tools.d.ts.map +1 -1
- package/dist/src/tools/navigation-tools.js +1 -6
- package/dist/src/tools/navigation-tools.js.map +1 -1
- package/dist/src/tools/prototype-tools.d.ts +102 -0
- package/dist/src/tools/prototype-tools.d.ts.map +1 -0
- package/dist/src/tools/prototype-tools.js +391 -0
- package/dist/src/tools/prototype-tools.js.map +1 -0
- package/dist/src/tools/screenshot-tools.d.ts +7 -74
- package/dist/src/tools/screenshot-tools.d.ts.map +1 -1
- package/dist/src/tools/screenshot-tools.js +19 -286
- package/dist/src/tools/screenshot-tools.js.map +1 -1
- package/dist/src/tools/vqa-tools.d.ts +2 -2
- package/dist/src/tools/vqa-tools.d.ts.map +1 -1
- package/dist/src/tools/vqa-tools.js +4 -69
- package/dist/src/tools/vqa-tools.js.map +1 -1
- package/docs/figma-workflow.md +58 -6
- package/docs/installation-guide.md +302 -0
- package/docs/setup-guide.md +77 -79
- package/docs/tool-reference.md +152 -69
- package/install.sh +119 -0
- package/package.json +5 -2
- package/setup.sh +320 -0
- package/tsconfig.json +1 -1
|
@@ -173,6 +173,24 @@ class DeviceManager {
|
|
|
173
173
|
return [];
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* Get Device instances for multiple device IDs simultaneously.
|
|
178
|
+
* Used by multi-device tools for parallel operations.
|
|
179
|
+
*/
|
|
180
|
+
async getMultipleDevices(deviceIds) {
|
|
181
|
+
const discovered = await this.discoverDevices();
|
|
182
|
+
const booted = discovered.filter((d) => d.isBooted);
|
|
183
|
+
return deviceIds.map((id) => {
|
|
184
|
+
const found = booted.find((d) => d.id === id);
|
|
185
|
+
if (!found) {
|
|
186
|
+
throw new Error(`Device "${id}" not found or not booted. ` +
|
|
187
|
+
`Available: ${booted.map((d) => `${d.name} (${d.id})`).join(", ") || "none"}`);
|
|
188
|
+
}
|
|
189
|
+
return found.platform === "android"
|
|
190
|
+
? new android_device_js_1.AndroidDevice(id)
|
|
191
|
+
: new ios_device_js_1.IosDevice(id);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
176
194
|
getAdbPath() {
|
|
177
195
|
const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
|
|
178
196
|
if (androidHome) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-manager.js","sourceRoot":"","sources":["../../../src/platform/device-manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"device-manager.js","sourceRoot":"","sources":["../../../src/platform/device-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevicePool — adaptive batch orchestrator for multi-device operations.
|
|
3
|
+
*
|
|
4
|
+
* Auto-detects system resources (RAM, CPU) and splits requested device
|
|
5
|
+
* profiles into optimal batches. Each batch is booted, captured, then
|
|
6
|
+
* shut down before the next batch starts — keeping memory usage safe
|
|
7
|
+
* even on 16GB Macs.
|
|
8
|
+
*/
|
|
9
|
+
import type { DeviceInfo, SnapshotNode } from "./device.js";
|
|
10
|
+
import type { DeviceProfile } from "./device-profiles.js";
|
|
11
|
+
import { RefRegistry } from "../snapshot/ref-registry.js";
|
|
12
|
+
import { DeviceManager } from "./device-manager.js";
|
|
13
|
+
export interface CapturedDeviceData {
|
|
14
|
+
/** Device ID (UDID or emulator serial) */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Profile used for this device */
|
|
17
|
+
profile: DeviceProfile;
|
|
18
|
+
/** Device info (screen size, OS version, etc.) */
|
|
19
|
+
deviceInfo: DeviceInfo;
|
|
20
|
+
/** PNG screenshot buffer */
|
|
21
|
+
screenshot: Buffer;
|
|
22
|
+
/** Accessibility tree snapshot */
|
|
23
|
+
snapshot: SnapshotNode;
|
|
24
|
+
/** Device-scoped ref registry */
|
|
25
|
+
refRegistry: RefRegistry;
|
|
26
|
+
/** Node-to-ref mapping */
|
|
27
|
+
nodeToRef: Map<SnapshotNode, string>;
|
|
28
|
+
/** Capture timestamp */
|
|
29
|
+
capturedAt: number;
|
|
30
|
+
}
|
|
31
|
+
export interface PoolProgress {
|
|
32
|
+
phase: "analyzing" | "booting" | "capturing" | "shutting-down" | "done";
|
|
33
|
+
batch: number;
|
|
34
|
+
totalBatches: number;
|
|
35
|
+
devicesReady: number;
|
|
36
|
+
totalDevices: number;
|
|
37
|
+
currentDevice?: string;
|
|
38
|
+
systemInfo?: string;
|
|
39
|
+
strategy?: string;
|
|
40
|
+
}
|
|
41
|
+
export type ProgressCallback = (progress: PoolProgress) => void;
|
|
42
|
+
export interface CaptureOptions {
|
|
43
|
+
/** App bundle ID to launch on each device before capturing */
|
|
44
|
+
appId?: string;
|
|
45
|
+
/** URL/deep-link to open on each device before capturing */
|
|
46
|
+
url?: string;
|
|
47
|
+
/** Boot strategy override. "auto" detects system resources. */
|
|
48
|
+
strategy?: "auto" | "parallel" | "sequential";
|
|
49
|
+
/** Progress callback for real-time updates */
|
|
50
|
+
onProgress?: ProgressCallback;
|
|
51
|
+
}
|
|
52
|
+
export declare class DevicePool {
|
|
53
|
+
private factory;
|
|
54
|
+
private capturedData;
|
|
55
|
+
private allBootedDevices;
|
|
56
|
+
constructor();
|
|
57
|
+
/**
|
|
58
|
+
* Main entry point: boot devices from profiles in adaptive batches,
|
|
59
|
+
* capture screenshot + snapshot from each, then shut down.
|
|
60
|
+
*
|
|
61
|
+
* This is the safe, resource-aware path — works on any Mac.
|
|
62
|
+
*/
|
|
63
|
+
captureFromProfiles(profiles: DeviceProfile[], options?: CaptureOptions): Promise<CapturedDeviceData[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Capture from already-booted devices (skip boot/shutdown).
|
|
66
|
+
* Used when user already has devices running.
|
|
67
|
+
*/
|
|
68
|
+
captureFromBooted(deviceManager: DeviceManager, deviceIds: string[], profiles?: DeviceProfile[]): Promise<CapturedDeviceData[]>;
|
|
69
|
+
/** Get all captured data. */
|
|
70
|
+
get results(): CapturedDeviceData[];
|
|
71
|
+
/** Cleanup: shutdown all devices that DevLens booted. */
|
|
72
|
+
cleanup(deleteCreated?: boolean): Promise<string[]>;
|
|
73
|
+
/**
|
|
74
|
+
* Split profiles into batches based on system resources and strategy.
|
|
75
|
+
*/
|
|
76
|
+
private planBatches;
|
|
77
|
+
/**
|
|
78
|
+
* Boot one batch of devices with staggered delays.
|
|
79
|
+
*/
|
|
80
|
+
private bootBatch;
|
|
81
|
+
/**
|
|
82
|
+
* Capture screenshot + snapshot from all devices in a batch (parallel).
|
|
83
|
+
*/
|
|
84
|
+
private captureBatch;
|
|
85
|
+
/**
|
|
86
|
+
* Shutdown a batch of devices (parallel).
|
|
87
|
+
* Only shuts down devices that weren't already booted before DevLens.
|
|
88
|
+
*/
|
|
89
|
+
private shutdownBatch;
|
|
90
|
+
/**
|
|
91
|
+
* Wait until memory pressure drops below threshold.
|
|
92
|
+
* Gives the OS time to reclaim resources between batches.
|
|
93
|
+
*/
|
|
94
|
+
private waitForMemory;
|
|
95
|
+
/**
|
|
96
|
+
* Count how many of the requested profiles are already booted.
|
|
97
|
+
*/
|
|
98
|
+
private countAlreadyBooted;
|
|
99
|
+
/**
|
|
100
|
+
* Infer a profile from device info when no explicit profile is provided.
|
|
101
|
+
*/
|
|
102
|
+
private inferProfile;
|
|
103
|
+
private sleep;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=device-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-pool.d.ts","sourceRoot":"","sources":["../../../src/platform/device-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAU,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,OAAO,EAAE,aAAa,CAAC;IACvB,kDAAkD;IAClD,UAAU,EAAE,UAAU,CAAC;IACvB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,QAAQ,EAAE,YAAY,CAAC;IACvB,iCAAiC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,0BAA0B;IAC1B,SAAS,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACrC,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe,GAAG,MAAM,CAAC;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAC9C,8CAA8C;IAC9C,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,gBAAgB,CAAsB;;IAM9C;;;;;OAKG;IACG,mBAAmB,CACvB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAkIhC;;;OAGG;IACG,iBAAiB,CACrB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,EAAE,EACnB,QAAQ,CAAC,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAuChC,6BAA6B;IAC7B,IAAI,OAAO,IAAI,kBAAkB,EAAE,CAElC;IAED,yDAAyD;IACnD,OAAO,CAAC,aAAa,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMvD;;OAEG;IACH,OAAO,CAAC,WAAW;IA8BnB;;OAEG;YACW,SAAS;IAwBvB;;OAEG;YACW,YAAY;IAsC1B;;;OAGG;YACW,aAAa;IAO3B;;;OAGG;YACW,aAAa;IAa3B;;OAEG;YACW,kBAAkB;IAkBhC;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DevicePool — adaptive batch orchestrator for multi-device operations.
|
|
4
|
+
*
|
|
5
|
+
* Auto-detects system resources (RAM, CPU) and splits requested device
|
|
6
|
+
* profiles into optimal batches. Each batch is booted, captured, then
|
|
7
|
+
* shut down before the next batch starts — keeping memory usage safe
|
|
8
|
+
* even on 16GB Macs.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.DevicePool = void 0;
|
|
12
|
+
const system_resources_js_1 = require("./system-resources.js");
|
|
13
|
+
const simulator_factory_js_1 = require("./simulator-factory.js");
|
|
14
|
+
const ref_registry_js_1 = require("../snapshot/ref-registry.js");
|
|
15
|
+
// ─── Pool ─────────────────────────────────────────────────────────────────
|
|
16
|
+
class DevicePool {
|
|
17
|
+
factory;
|
|
18
|
+
capturedData = new Map();
|
|
19
|
+
allBootedDevices = [];
|
|
20
|
+
constructor() {
|
|
21
|
+
this.factory = new simulator_factory_js_1.SimulatorFactory();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Main entry point: boot devices from profiles in adaptive batches,
|
|
25
|
+
* capture screenshot + snapshot from each, then shut down.
|
|
26
|
+
*
|
|
27
|
+
* This is the safe, resource-aware path — works on any Mac.
|
|
28
|
+
*/
|
|
29
|
+
async captureFromProfiles(profiles, options = {}) {
|
|
30
|
+
const { appId, url, strategy = "auto", onProgress } = options;
|
|
31
|
+
// 1. Analyze system resources
|
|
32
|
+
const sysProfile = (0, system_resources_js_1.getSystemProfile)();
|
|
33
|
+
const systemInfo = (0, system_resources_js_1.formatSystemInfo)(sysProfile);
|
|
34
|
+
onProgress?.({
|
|
35
|
+
phase: "analyzing",
|
|
36
|
+
batch: 0,
|
|
37
|
+
totalBatches: 0,
|
|
38
|
+
devicesReady: 0,
|
|
39
|
+
totalDevices: profiles.length,
|
|
40
|
+
systemInfo,
|
|
41
|
+
});
|
|
42
|
+
// 2. Determine batch config
|
|
43
|
+
const alreadyBootedCount = await this.countAlreadyBooted(profiles);
|
|
44
|
+
const batchConfig = (0, system_resources_js_1.calculateBatchConfig)(sysProfile, alreadyBootedCount);
|
|
45
|
+
const batches = this.planBatches(profiles, batchConfig, strategy);
|
|
46
|
+
const totalBatches = batches.length;
|
|
47
|
+
const strategyLabel = totalBatches === 1
|
|
48
|
+
? "parallel"
|
|
49
|
+
: strategy === "sequential"
|
|
50
|
+
? "sequential"
|
|
51
|
+
: `batched (${batches.map((b) => b.length).join("+")})`;
|
|
52
|
+
onProgress?.({
|
|
53
|
+
phase: "analyzing",
|
|
54
|
+
batch: 0,
|
|
55
|
+
totalBatches,
|
|
56
|
+
devicesReady: 0,
|
|
57
|
+
totalDevices: profiles.length,
|
|
58
|
+
systemInfo,
|
|
59
|
+
strategy: strategyLabel,
|
|
60
|
+
});
|
|
61
|
+
// 3. Process each batch
|
|
62
|
+
let devicesReady = 0;
|
|
63
|
+
for (let i = 0; i < batches.length; i++) {
|
|
64
|
+
const batch = batches[i];
|
|
65
|
+
const batchNum = i + 1;
|
|
66
|
+
// Boot the batch
|
|
67
|
+
onProgress?.({
|
|
68
|
+
phase: "booting",
|
|
69
|
+
batch: batchNum,
|
|
70
|
+
totalBatches,
|
|
71
|
+
devicesReady,
|
|
72
|
+
totalDevices: profiles.length,
|
|
73
|
+
strategy: strategyLabel,
|
|
74
|
+
});
|
|
75
|
+
const booted = await this.bootBatch(batch, batchConfig.delayBetweenBootsMs);
|
|
76
|
+
this.allBootedDevices.push(...booted);
|
|
77
|
+
// Prepare devices (launch app, open URL)
|
|
78
|
+
for (const device of booted) {
|
|
79
|
+
if (appId) {
|
|
80
|
+
try {
|
|
81
|
+
await device.device.launchApp(appId);
|
|
82
|
+
await this.sleep(1000); // Let app settle
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// App might not be installed — continue
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (url) {
|
|
89
|
+
try {
|
|
90
|
+
await device.device.openUrl(url);
|
|
91
|
+
await this.sleep(1000);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// URL open failed — continue
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Capture from all devices in this batch (parallel)
|
|
99
|
+
onProgress?.({
|
|
100
|
+
phase: "capturing",
|
|
101
|
+
batch: batchNum,
|
|
102
|
+
totalBatches,
|
|
103
|
+
devicesReady,
|
|
104
|
+
totalDevices: profiles.length,
|
|
105
|
+
strategy: strategyLabel,
|
|
106
|
+
});
|
|
107
|
+
const captured = await this.captureBatch(booted);
|
|
108
|
+
for (const data of captured) {
|
|
109
|
+
this.capturedData.set(data.id, data);
|
|
110
|
+
}
|
|
111
|
+
devicesReady += captured.length;
|
|
112
|
+
// Shutdown this batch (unless it's the last one or devices were already booted)
|
|
113
|
+
onProgress?.({
|
|
114
|
+
phase: "shutting-down",
|
|
115
|
+
batch: batchNum,
|
|
116
|
+
totalBatches,
|
|
117
|
+
devicesReady,
|
|
118
|
+
totalDevices: profiles.length,
|
|
119
|
+
strategy: strategyLabel,
|
|
120
|
+
});
|
|
121
|
+
await this.shutdownBatch(booted);
|
|
122
|
+
// Wait between batches for memory to reclaim
|
|
123
|
+
if (i < batches.length - 1) {
|
|
124
|
+
await this.waitForMemory(batchConfig.memoryThresholdPercent, batchConfig.delayBetweenBatchesMs);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
onProgress?.({
|
|
128
|
+
phase: "done",
|
|
129
|
+
batch: totalBatches,
|
|
130
|
+
totalBatches,
|
|
131
|
+
devicesReady,
|
|
132
|
+
totalDevices: profiles.length,
|
|
133
|
+
strategy: strategyLabel,
|
|
134
|
+
});
|
|
135
|
+
return this.results;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Capture from already-booted devices (skip boot/shutdown).
|
|
139
|
+
* Used when user already has devices running.
|
|
140
|
+
*/
|
|
141
|
+
async captureFromBooted(deviceManager, deviceIds, profiles) {
|
|
142
|
+
const devices = await deviceManager.getMultipleDevices(deviceIds);
|
|
143
|
+
const results = [];
|
|
144
|
+
const capturePromises = devices.map(async (device, idx) => {
|
|
145
|
+
const refRegistry = new ref_registry_js_1.RefRegistry();
|
|
146
|
+
const [deviceInfo, screenshot, snapshot] = await Promise.all([
|
|
147
|
+
device.getInfo(),
|
|
148
|
+
device.takeScreenshot(),
|
|
149
|
+
device.getSnapshot(),
|
|
150
|
+
]);
|
|
151
|
+
const nodeToRef = refRegistry.assignRefs(snapshot);
|
|
152
|
+
const profile = profiles?.[idx] ?? this.inferProfile(deviceInfo);
|
|
153
|
+
const data = {
|
|
154
|
+
id: deviceIds[idx],
|
|
155
|
+
profile,
|
|
156
|
+
deviceInfo,
|
|
157
|
+
screenshot,
|
|
158
|
+
snapshot,
|
|
159
|
+
refRegistry,
|
|
160
|
+
nodeToRef,
|
|
161
|
+
capturedAt: Date.now(),
|
|
162
|
+
};
|
|
163
|
+
return data;
|
|
164
|
+
});
|
|
165
|
+
const settled = await Promise.allSettled(capturePromises);
|
|
166
|
+
for (const result of settled) {
|
|
167
|
+
if (result.status === "fulfilled") {
|
|
168
|
+
this.capturedData.set(result.value.id, result.value);
|
|
169
|
+
results.push(result.value);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return results;
|
|
173
|
+
}
|
|
174
|
+
/** Get all captured data. */
|
|
175
|
+
get results() {
|
|
176
|
+
return Array.from(this.capturedData.values());
|
|
177
|
+
}
|
|
178
|
+
/** Cleanup: shutdown all devices that DevLens booted. */
|
|
179
|
+
async cleanup(deleteCreated = false) {
|
|
180
|
+
return this.factory.cleanupAll(deleteCreated);
|
|
181
|
+
}
|
|
182
|
+
// ─── Internal ───────────────────────────────────────────────────────
|
|
183
|
+
/**
|
|
184
|
+
* Split profiles into batches based on system resources and strategy.
|
|
185
|
+
*/
|
|
186
|
+
planBatches(profiles, config, strategy) {
|
|
187
|
+
if (strategy === "parallel") {
|
|
188
|
+
return [profiles]; // All at once
|
|
189
|
+
}
|
|
190
|
+
if (strategy === "sequential") {
|
|
191
|
+
return profiles.map((p) => [p]); // One at a time
|
|
192
|
+
}
|
|
193
|
+
// Auto: split by platform-specific batch size
|
|
194
|
+
const batches = [];
|
|
195
|
+
const iosProfiles = profiles.filter((p) => p.platform === "ios");
|
|
196
|
+
const androidProfiles = profiles.filter((p) => p.platform === "android");
|
|
197
|
+
// Batch iOS profiles
|
|
198
|
+
for (let i = 0; i < iosProfiles.length; i += config.iosBatchSize) {
|
|
199
|
+
batches.push(iosProfiles.slice(i, i + config.iosBatchSize));
|
|
200
|
+
}
|
|
201
|
+
// Batch Android profiles
|
|
202
|
+
for (let i = 0; i < androidProfiles.length; i += config.androidBatchSize) {
|
|
203
|
+
batches.push(androidProfiles.slice(i, i + config.androidBatchSize));
|
|
204
|
+
}
|
|
205
|
+
return batches.length > 0 ? batches : [profiles];
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Boot one batch of devices with staggered delays.
|
|
209
|
+
*/
|
|
210
|
+
async bootBatch(batch, delayMs) {
|
|
211
|
+
const results = [];
|
|
212
|
+
for (let i = 0; i < batch.length; i++) {
|
|
213
|
+
if (i > 0 && delayMs > 0) {
|
|
214
|
+
await this.sleep(delayMs);
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
const booted = await this.factory.bootFromProfile(batch[i]);
|
|
218
|
+
results.push(booted);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
// Don't fail the whole batch — skip this device
|
|
222
|
+
console.error(`Failed to boot ${batch[i].name}: ${err.message || err}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return results;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Capture screenshot + snapshot from all devices in a batch (parallel).
|
|
229
|
+
*/
|
|
230
|
+
async captureBatch(devices) {
|
|
231
|
+
const results = [];
|
|
232
|
+
const promises = devices.map(async (booted) => {
|
|
233
|
+
const refRegistry = new ref_registry_js_1.RefRegistry();
|
|
234
|
+
const [deviceInfo, screenshot, snapshot] = await Promise.all([
|
|
235
|
+
booted.device.getInfo(),
|
|
236
|
+
booted.device.takeScreenshot(),
|
|
237
|
+
booted.device.getSnapshot(),
|
|
238
|
+
]);
|
|
239
|
+
const nodeToRef = refRegistry.assignRefs(snapshot);
|
|
240
|
+
return {
|
|
241
|
+
id: booted.id,
|
|
242
|
+
profile: booted.profile,
|
|
243
|
+
deviceInfo,
|
|
244
|
+
screenshot,
|
|
245
|
+
snapshot,
|
|
246
|
+
refRegistry,
|
|
247
|
+
nodeToRef,
|
|
248
|
+
capturedAt: Date.now(),
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
const settled = await Promise.allSettled(promises);
|
|
252
|
+
for (const result of settled) {
|
|
253
|
+
if (result.status === "fulfilled") {
|
|
254
|
+
results.push(result.value);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return results;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Shutdown a batch of devices (parallel).
|
|
261
|
+
* Only shuts down devices that weren't already booted before DevLens.
|
|
262
|
+
*/
|
|
263
|
+
async shutdownBatch(devices) {
|
|
264
|
+
const shutdownPromises = devices.map((d) => this.factory.shutdownDevice(d));
|
|
265
|
+
await Promise.allSettled(shutdownPromises);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Wait until memory pressure drops below threshold.
|
|
269
|
+
* Gives the OS time to reclaim resources between batches.
|
|
270
|
+
*/
|
|
271
|
+
async waitForMemory(thresholdPercent, minWaitMs) {
|
|
272
|
+
await this.sleep(minWaitMs);
|
|
273
|
+
// Poll up to 5 seconds if memory is still high
|
|
274
|
+
const deadline = Date.now() + 5000;
|
|
275
|
+
while (!(0, system_resources_js_1.isMemorySafe)(thresholdPercent) && Date.now() < deadline) {
|
|
276
|
+
await this.sleep(1000);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Count how many of the requested profiles are already booted.
|
|
281
|
+
*/
|
|
282
|
+
async countAlreadyBooted(profiles) {
|
|
283
|
+
let count = 0;
|
|
284
|
+
for (const profile of profiles) {
|
|
285
|
+
if (profile.platform === "ios" && profile.simctlDeviceType) {
|
|
286
|
+
try {
|
|
287
|
+
const result = await this.factory.ensureIosSimulator(profile);
|
|
288
|
+
if (result.alreadyBooted)
|
|
289
|
+
count++;
|
|
290
|
+
// Don't actually create — we just checked
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
// Ignore
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return count;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Infer a profile from device info when no explicit profile is provided.
|
|
301
|
+
*/
|
|
302
|
+
inferProfile(info) {
|
|
303
|
+
const width = info.screenWidth;
|
|
304
|
+
let category;
|
|
305
|
+
if (width < 400)
|
|
306
|
+
category = "small";
|
|
307
|
+
else if (width < 500)
|
|
308
|
+
category = "medium";
|
|
309
|
+
else if (width < 800)
|
|
310
|
+
category = "large";
|
|
311
|
+
else
|
|
312
|
+
category = "tablet";
|
|
313
|
+
return {
|
|
314
|
+
id: `inferred-${info.id}`,
|
|
315
|
+
name: info.name,
|
|
316
|
+
platform: info.platform,
|
|
317
|
+
category,
|
|
318
|
+
logicalWidth: info.screenWidth,
|
|
319
|
+
logicalHeight: info.screenHeight,
|
|
320
|
+
scaleFactor: 2, // Guess
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
sleep(ms) {
|
|
324
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
exports.DevicePool = DevicePool;
|
|
328
|
+
//# sourceMappingURL=device-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-pool.js","sourceRoot":"","sources":["../../../src/platform/device-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preset device profiles for iOS Simulators and Android Emulators.
|
|
3
|
+
* Each profile maps to a real device with known screen dimensions,
|
|
4
|
+
* scale factor, and the simulator/AVD identifiers needed to create one.
|
|
5
|
+
*/
|
|
6
|
+
export interface DeviceProfile {
|
|
7
|
+
/** Stable identifier, e.g. "iphone-se" */
|
|
8
|
+
id: string;
|
|
9
|
+
/** Human-readable name, e.g. "iPhone SE (3rd gen)" */
|
|
10
|
+
name: string;
|
|
11
|
+
platform: "ios" | "android";
|
|
12
|
+
category: "small" | "medium" | "large" | "tablet";
|
|
13
|
+
/** Logical width in points (iOS) or dp (Android) */
|
|
14
|
+
logicalWidth: number;
|
|
15
|
+
/** Logical height in points (iOS) or dp (Android) */
|
|
16
|
+
logicalHeight: number;
|
|
17
|
+
/** Display scale factor (@2x, @3x, etc.) */
|
|
18
|
+
scaleFactor: number;
|
|
19
|
+
/** iOS: simctl device type identifier */
|
|
20
|
+
simctlDeviceType?: string;
|
|
21
|
+
/** Android: avdmanager device ID */
|
|
22
|
+
avdDeviceId?: string;
|
|
23
|
+
/** Android: DPI bucket value */
|
|
24
|
+
density?: number;
|
|
25
|
+
}
|
|
26
|
+
export declare const IOS_PROFILES: DeviceProfile[];
|
|
27
|
+
export declare const ANDROID_PROFILES: DeviceProfile[];
|
|
28
|
+
export declare const ALL_PROFILES: DeviceProfile[];
|
|
29
|
+
/** Find a profile by its stable ID (e.g. "iphone-se"). */
|
|
30
|
+
export declare function getProfile(id: string): DeviceProfile | undefined;
|
|
31
|
+
/** Get all profiles for a platform. */
|
|
32
|
+
export declare function getProfilesByPlatform(platform: "ios" | "android"): DeviceProfile[];
|
|
33
|
+
/** Get profiles matching platform + size categories. */
|
|
34
|
+
export declare function getProfilesByCategory(platform: "ios" | "android", categories: string[]): DeviceProfile[];
|
|
35
|
+
/**
|
|
36
|
+
* Default test matrix: small + medium + large (3 devices).
|
|
37
|
+
* Safe on any 16GB Mac without batching concerns.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getDefaultTestMatrix(platform: "ios" | "android"): DeviceProfile[];
|
|
40
|
+
/**
|
|
41
|
+
* List all profiles as a formatted table for tool output.
|
|
42
|
+
*/
|
|
43
|
+
export declare function listAvailableProfiles(platform?: "ios" | "android"): Array<{
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
platform: string;
|
|
47
|
+
category: string;
|
|
48
|
+
resolution: string;
|
|
49
|
+
}>;
|
|
50
|
+
//# sourceMappingURL=device-profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-profiles.d.ts","sourceRoot":"","sources":["../../../src/platform/device-profiles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IAClD,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,eAAO,MAAM,YAAY,EAAE,aAAa,EAsDvC,CAAC;AAIF,eAAO,MAAM,gBAAgB,EAAE,aAAa,EA6C3C,CAAC;AAIF,eAAO,MAAM,YAAY,EAAE,aAAa,EAGvC,CAAC;AAIF,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEhE;AAED,uCAAuC;AACvC,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,KAAK,GAAG,SAAS,GAC1B,aAAa,EAAE,CAEjB;AAED,wDAAwD;AACxD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,KAAK,GAAG,SAAS,EAC3B,UAAU,EAAE,MAAM,EAAE,GACnB,aAAa,EAAE,CAKjB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,KAAK,GAAG,SAAS,GAC1B,aAAa,EAAE,CAEjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,GAC3B,KAAK,CAAC;IACP,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAYD"}
|