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.
Files changed (131) hide show
  1. package/README.md +211 -35
  2. package/RELEASE_NOTES.md +3 -7
  3. package/dist/bin/cli.js +41 -14
  4. package/dist/bin/cli.js.map +1 -1
  5. package/dist/bin/setup.d.ts +14 -0
  6. package/dist/bin/setup.d.ts.map +1 -0
  7. package/dist/bin/setup.js +272 -0
  8. package/dist/bin/setup.js.map +1 -0
  9. package/dist/src/figma/figma-api.d.ts +108 -0
  10. package/dist/src/figma/figma-api.d.ts.map +1 -0
  11. package/dist/src/figma/figma-api.js +284 -0
  12. package/dist/src/figma/figma-api.js.map +1 -0
  13. package/dist/src/figma/figma-cache.d.ts +57 -0
  14. package/dist/src/figma/figma-cache.d.ts.map +1 -0
  15. package/dist/src/figma/figma-cache.js +266 -0
  16. package/dist/src/figma/figma-cache.js.map +1 -0
  17. package/dist/src/figma/figma-client.d.ts +62 -0
  18. package/dist/src/figma/figma-client.d.ts.map +1 -0
  19. package/dist/src/figma/figma-client.js +224 -0
  20. package/dist/src/figma/figma-client.js.map +1 -0
  21. package/dist/src/figma/figma-rate-limiter.d.ts +46 -0
  22. package/dist/src/figma/figma-rate-limiter.d.ts.map +1 -0
  23. package/dist/src/figma/figma-rate-limiter.js +153 -0
  24. package/dist/src/figma/figma-rate-limiter.js.map +1 -0
  25. package/dist/src/figma/figma-retry.d.ts +19 -0
  26. package/dist/src/figma/figma-retry.d.ts.map +1 -0
  27. package/dist/src/figma/figma-retry.js +57 -0
  28. package/dist/src/figma/figma-retry.js.map +1 -0
  29. package/dist/src/figma/figma-structure.d.ts +1 -1
  30. package/dist/src/figma/figma-structure.d.ts.map +1 -1
  31. package/dist/src/figma/figma-structure.js +11 -1
  32. package/dist/src/figma/figma-structure.js.map +1 -1
  33. package/dist/src/figma/figma-types.d.ts +54 -0
  34. package/dist/src/figma/figma-types.d.ts.map +1 -0
  35. package/dist/src/figma/figma-types.js +33 -0
  36. package/dist/src/figma/figma-types.js.map +1 -0
  37. package/dist/src/figma/url-parser.d.ts +40 -0
  38. package/dist/src/figma/url-parser.d.ts.map +1 -0
  39. package/dist/src/figma/url-parser.js +107 -0
  40. package/dist/src/figma/url-parser.js.map +1 -0
  41. package/dist/src/platform/device-manager.d.ts +5 -0
  42. package/dist/src/platform/device-manager.d.ts.map +1 -1
  43. package/dist/src/platform/device-manager.js +18 -0
  44. package/dist/src/platform/device-manager.js.map +1 -1
  45. package/dist/src/platform/device-pool.d.ts +105 -0
  46. package/dist/src/platform/device-pool.d.ts.map +1 -0
  47. package/dist/src/platform/device-pool.js +328 -0
  48. package/dist/src/platform/device-pool.js.map +1 -0
  49. package/dist/src/platform/device-profiles.d.ts +50 -0
  50. package/dist/src/platform/device-profiles.d.ts.map +1 -0
  51. package/dist/src/platform/device-profiles.js +155 -0
  52. package/dist/src/platform/device-profiles.js.map +1 -0
  53. package/dist/src/platform/ios/ios-device.d.ts +0 -2
  54. package/dist/src/platform/ios/ios-device.d.ts.map +1 -1
  55. package/dist/src/platform/ios/ios-device.js +8 -18
  56. package/dist/src/platform/ios/ios-device.js.map +1 -1
  57. package/dist/src/platform/ios/simctl.d.ts +0 -5
  58. package/dist/src/platform/ios/simctl.d.ts.map +1 -1
  59. package/dist/src/platform/ios/simctl.js +0 -4
  60. package/dist/src/platform/ios/simctl.js.map +1 -1
  61. package/dist/src/platform/simulator-factory.d.ts +85 -0
  62. package/dist/src/platform/simulator-factory.d.ts.map +1 -0
  63. package/dist/src/platform/simulator-factory.js +396 -0
  64. package/dist/src/platform/simulator-factory.js.map +1 -0
  65. package/dist/src/platform/system-resources.d.ts +44 -0
  66. package/dist/src/platform/system-resources.d.ts.map +1 -0
  67. package/dist/src/platform/system-resources.js +103 -0
  68. package/dist/src/platform/system-resources.js.map +1 -0
  69. package/dist/src/prototype/browser-engine.d.ts +62 -0
  70. package/dist/src/prototype/browser-engine.d.ts.map +1 -0
  71. package/dist/src/prototype/browser-engine.js +199 -0
  72. package/dist/src/prototype/browser-engine.js.map +1 -0
  73. package/dist/src/prototype/figma-navigator.d.ts +40 -0
  74. package/dist/src/prototype/figma-navigator.d.ts.map +1 -0
  75. package/dist/src/prototype/figma-navigator.js +95 -0
  76. package/dist/src/prototype/figma-navigator.js.map +1 -0
  77. package/dist/src/prototype/flow-reporter.d.ts +47 -0
  78. package/dist/src/prototype/flow-reporter.d.ts.map +1 -0
  79. package/dist/src/prototype/flow-reporter.js +255 -0
  80. package/dist/src/prototype/flow-reporter.js.map +1 -0
  81. package/dist/src/prototype/screen-analyzer.d.ts +31 -0
  82. package/dist/src/prototype/screen-analyzer.d.ts.map +1 -0
  83. package/dist/src/prototype/screen-analyzer.js +114 -0
  84. package/dist/src/prototype/screen-analyzer.js.map +1 -0
  85. package/dist/src/prototype/web-crawler.d.ts +31 -0
  86. package/dist/src/prototype/web-crawler.d.ts.map +1 -0
  87. package/dist/src/prototype/web-crawler.js +88 -0
  88. package/dist/src/prototype/web-crawler.js.map +1 -0
  89. package/dist/src/reports/cross-device-report.d.ts +84 -0
  90. package/dist/src/reports/cross-device-report.d.ts.map +1 -0
  91. package/dist/src/reports/cross-device-report.js +342 -0
  92. package/dist/src/reports/cross-device-report.js.map +1 -0
  93. package/dist/src/server.d.ts.map +1 -1
  94. package/dist/src/server.js +9 -1
  95. package/dist/src/server.js.map +1 -1
  96. package/dist/src/snapshot/formatter.d.ts +5 -13
  97. package/dist/src/snapshot/formatter.d.ts.map +1 -1
  98. package/dist/src/snapshot/formatter.js +19 -28
  99. package/dist/src/snapshot/formatter.js.map +1 -1
  100. package/dist/src/tools/interaction-tools.d.ts +6 -6
  101. package/dist/src/tools/interaction-tools.d.ts.map +1 -1
  102. package/dist/src/tools/interaction-tools.js +2 -12
  103. package/dist/src/tools/interaction-tools.js.map +1 -1
  104. package/dist/src/tools/metro-tools.d.ts +2 -2
  105. package/dist/src/tools/multi-device-tools.d.ts +133 -0
  106. package/dist/src/tools/multi-device-tools.d.ts.map +1 -0
  107. package/dist/src/tools/multi-device-tools.js +365 -0
  108. package/dist/src/tools/multi-device-tools.js.map +1 -0
  109. package/dist/src/tools/navigation-tools.d.ts.map +1 -1
  110. package/dist/src/tools/navigation-tools.js +1 -6
  111. package/dist/src/tools/navigation-tools.js.map +1 -1
  112. package/dist/src/tools/prototype-tools.d.ts +102 -0
  113. package/dist/src/tools/prototype-tools.d.ts.map +1 -0
  114. package/dist/src/tools/prototype-tools.js +391 -0
  115. package/dist/src/tools/prototype-tools.js.map +1 -0
  116. package/dist/src/tools/screenshot-tools.d.ts +7 -74
  117. package/dist/src/tools/screenshot-tools.d.ts.map +1 -1
  118. package/dist/src/tools/screenshot-tools.js +19 -286
  119. package/dist/src/tools/screenshot-tools.js.map +1 -1
  120. package/dist/src/tools/vqa-tools.d.ts +2 -2
  121. package/dist/src/tools/vqa-tools.d.ts.map +1 -1
  122. package/dist/src/tools/vqa-tools.js +4 -69
  123. package/dist/src/tools/vqa-tools.js.map +1 -1
  124. package/docs/figma-workflow.md +58 -6
  125. package/docs/installation-guide.md +302 -0
  126. package/docs/setup-guide.md +77 -79
  127. package/docs/tool-reference.md +152 -69
  128. package/install.sh +119 -0
  129. package/package.json +5 -2
  130. package/setup.sh +320 -0
  131. 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"}