devlens-mcp 0.4.1 → 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 +47 -13
  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
@@ -0,0 +1,396 @@
1
+ "use strict";
2
+ /**
3
+ * SimulatorFactory — create, boot, and shutdown iOS Simulators and Android
4
+ * Emulators on demand from DeviceProfile definitions.
5
+ *
6
+ * DevLens-created devices are prefixed with "DevLens-" (iOS) or "devlens-"
7
+ * (Android) for easy identification and cleanup.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SimulatorFactory = void 0;
11
+ const child_process_1 = require("child_process");
12
+ const util_1 = require("util");
13
+ const ios_device_js_1 = require("./ios/ios-device.js");
14
+ const android_device_js_1 = require("./android/android-device.js");
15
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
16
+ const DEVLENS_PREFIX_IOS = "DevLens-";
17
+ const DEVLENS_PREFIX_ANDROID = "devlens-";
18
+ // ─── Factory ──────────────────────────────────────────────────────────────
19
+ class SimulatorFactory {
20
+ createdDeviceIds = new Set();
21
+ // ── iOS ─────────────────────────────────────────────────────────────
22
+ /**
23
+ * Find an existing iOS simulator matching the profile's device type,
24
+ * or create a new one. Returns the UDID.
25
+ */
26
+ async ensureIosSimulator(profile) {
27
+ if (!profile.simctlDeviceType) {
28
+ throw new Error(`Profile "${profile.id}" has no simctlDeviceType`);
29
+ }
30
+ // List all devices
31
+ const { stdout } = await execFileAsync("xcrun", [
32
+ "simctl", "list", "devices", "--json",
33
+ ]);
34
+ const data = JSON.parse(stdout);
35
+ // Search for existing device matching the device type
36
+ for (const deviceList of Object.values(data.devices)) {
37
+ for (const device of deviceList) {
38
+ if (device.deviceTypeIdentifier === profile.simctlDeviceType) {
39
+ return {
40
+ udid: device.udid,
41
+ created: false,
42
+ alreadyBooted: device.state === "Booted",
43
+ };
44
+ }
45
+ }
46
+ }
47
+ // No matching device found — create one
48
+ const runtime = await this.getLatestIosRuntime();
49
+ const simName = `${DEVLENS_PREFIX_IOS}${profile.name}`;
50
+ const { stdout: udid } = await execFileAsync("xcrun", [
51
+ "simctl", "create", simName,
52
+ profile.simctlDeviceType,
53
+ runtime,
54
+ ]);
55
+ const newUdid = udid.trim();
56
+ this.createdDeviceIds.add(newUdid);
57
+ return { udid: newUdid, created: true, alreadyBooted: false };
58
+ }
59
+ /**
60
+ * Boot an iOS simulator by UDID and wait until it's fully ready.
61
+ */
62
+ async bootIosSimulator(udid, timeoutMs = 120_000) {
63
+ // Check if already booted
64
+ if (await this.isIosBooted(udid))
65
+ return;
66
+ await execFileAsync("xcrun", ["simctl", "boot", udid]);
67
+ // Wait for boot to complete (bootstatus blocks until springboard is up)
68
+ await execFileAsync("xcrun", ["simctl", "bootstatus", udid], {
69
+ timeout: timeoutMs,
70
+ });
71
+ }
72
+ /** Check if an iOS simulator is booted. */
73
+ async isIosBooted(udid) {
74
+ try {
75
+ const { stdout } = await execFileAsync("xcrun", [
76
+ "simctl", "list", "devices", "--json",
77
+ ]);
78
+ const data = JSON.parse(stdout);
79
+ for (const deviceList of Object.values(data.devices)) {
80
+ const found = deviceList.find((d) => d.udid === udid);
81
+ if (found)
82
+ return found.state === "Booted";
83
+ }
84
+ return false;
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
90
+ /** Shutdown an iOS simulator. */
91
+ async shutdownIos(udid) {
92
+ try {
93
+ await execFileAsync("xcrun", ["simctl", "shutdown", udid], {
94
+ timeout: 15_000,
95
+ });
96
+ }
97
+ catch {
98
+ // Already shut down or not found — ignore
99
+ }
100
+ }
101
+ /** Delete an iOS simulator (only if created by DevLens). */
102
+ async deleteIosSimulator(udid) {
103
+ await this.shutdownIos(udid);
104
+ try {
105
+ await execFileAsync("xcrun", ["simctl", "delete", udid], {
106
+ timeout: 15_000,
107
+ });
108
+ }
109
+ catch {
110
+ // Already deleted — ignore
111
+ }
112
+ this.createdDeviceIds.delete(udid);
113
+ }
114
+ /** Get the latest installed iOS runtime. */
115
+ async getLatestIosRuntime() {
116
+ const { stdout } = await execFileAsync("xcrun", [
117
+ "simctl", "list", "runtimes", "--json",
118
+ ]);
119
+ const data = JSON.parse(stdout);
120
+ const iosRuntimes = data.runtimes.filter((r) => r.isAvailable && r.identifier.includes("iOS"));
121
+ if (iosRuntimes.length === 0) {
122
+ throw new Error("No iOS runtimes installed. Install via Xcode → Settings → Platforms.");
123
+ }
124
+ // Return the last one (newest)
125
+ return iosRuntimes[iosRuntimes.length - 1].identifier;
126
+ }
127
+ // ── Android ─────────────────────────────────────────────────────────
128
+ /**
129
+ * Find an existing Android AVD matching the profile, or create one.
130
+ * Returns the AVD name.
131
+ */
132
+ async ensureAndroidAvd(profile) {
133
+ if (!profile.avdDeviceId) {
134
+ throw new Error(`Profile "${profile.id}" has no avdDeviceId`);
135
+ }
136
+ const avdName = `${DEVLENS_PREFIX_ANDROID}${profile.id}`;
137
+ // Check if AVD already exists
138
+ try {
139
+ const emulatorPath = this.getEmulatorPath();
140
+ const { stdout } = await execFileAsync(emulatorPath, ["-list-avds"]);
141
+ const avds = stdout.split("\n").map((l) => l.trim()).filter(Boolean);
142
+ if (avds.includes(avdName)) {
143
+ return { avdName, created: false };
144
+ }
145
+ }
146
+ catch {
147
+ // emulator not found — will fail later with clear error
148
+ }
149
+ // Create the AVD
150
+ const systemImage = await this.getLatestAndroidSystemImage();
151
+ const avdManagerPath = this.getAvdManagerPath();
152
+ await execFileAsync(avdManagerPath, [
153
+ "create", "avd",
154
+ "-n", avdName,
155
+ "-k", systemImage,
156
+ "--device", profile.avdDeviceId,
157
+ "--force",
158
+ ], { timeout: 60_000 });
159
+ this.createdDeviceIds.add(avdName);
160
+ return { avdName, created: true };
161
+ }
162
+ /**
163
+ * Boot an Android emulator by AVD name.
164
+ * Returns the serial number (e.g. "emulator-5554").
165
+ */
166
+ async bootAndroidEmulator(avdName, timeoutMs = 180_000) {
167
+ // Check if already running
168
+ const running = await this.findRunningAndroidEmulator(avdName);
169
+ if (running)
170
+ return running;
171
+ const port = await this.findFreeEmulatorPort();
172
+ const emulatorPath = this.getEmulatorPath();
173
+ // Spawn emulator in background (non-blocking)
174
+ const proc = (0, child_process_1.spawn)(emulatorPath, [
175
+ "-avd", avdName,
176
+ "-port", String(port),
177
+ "-no-boot-anim",
178
+ "-no-audio",
179
+ "-read-only",
180
+ ], {
181
+ detached: true,
182
+ stdio: "ignore",
183
+ });
184
+ proc.unref();
185
+ const serial = `emulator-${port}`;
186
+ // Poll adb until the device is online and booted
187
+ const adbPath = this.getAdbPath();
188
+ const deadline = Date.now() + timeoutMs;
189
+ while (Date.now() < deadline) {
190
+ try {
191
+ const { stdout } = await execFileAsync(adbPath, [
192
+ "-s", serial, "shell", "getprop", "sys.boot_completed",
193
+ ], { timeout: 5000 });
194
+ if (stdout.trim() === "1")
195
+ return serial;
196
+ }
197
+ catch {
198
+ // Not ready yet
199
+ }
200
+ await this.sleep(2000);
201
+ }
202
+ throw new Error(`Android emulator "${avdName}" did not boot within ${timeoutMs / 1000}s`);
203
+ }
204
+ /** Find serial of a running emulator by AVD name. */
205
+ async findRunningAndroidEmulator(avdName) {
206
+ try {
207
+ const adbPath = this.getAdbPath();
208
+ const { stdout } = await execFileAsync(adbPath, ["devices", "-l"]);
209
+ for (const line of stdout.split("\n")) {
210
+ const match = line.match(/^(emulator-\d+)\s+device/);
211
+ if (match) {
212
+ const serial = match[1];
213
+ try {
214
+ const { stdout: name } = await execFileAsync(adbPath, [
215
+ "-s", serial, "shell",
216
+ "getprop", "ro.boot.qemu.avd_name",
217
+ ], { timeout: 5000 });
218
+ if (name.trim() === avdName)
219
+ return serial;
220
+ }
221
+ catch {
222
+ // Not this one
223
+ }
224
+ }
225
+ }
226
+ }
227
+ catch {
228
+ // No adb — fall through
229
+ }
230
+ return null;
231
+ }
232
+ /** Find the next free emulator console port (even number starting at 5554). */
233
+ async findFreeEmulatorPort() {
234
+ const adbPath = this.getAdbPath();
235
+ const usedPorts = new Set();
236
+ try {
237
+ const { stdout } = await execFileAsync(adbPath, ["devices"]);
238
+ for (const line of stdout.split("\n")) {
239
+ const match = line.match(/^emulator-(\d+)/);
240
+ if (match)
241
+ usedPorts.add(parseInt(match[1]));
242
+ }
243
+ }
244
+ catch {
245
+ // No emulators running
246
+ }
247
+ for (let port = 5554; port <= 5584; port += 2) {
248
+ if (!usedPorts.has(port))
249
+ return port;
250
+ }
251
+ throw new Error("No free emulator ports available (5554-5584 all in use)");
252
+ }
253
+ /** Shutdown an Android emulator by serial. */
254
+ async shutdownAndroid(serial) {
255
+ try {
256
+ const adbPath = this.getAdbPath();
257
+ await execFileAsync(adbPath, ["-s", serial, "emu", "kill"], {
258
+ timeout: 15_000,
259
+ });
260
+ }
261
+ catch {
262
+ // Already dead — ignore
263
+ }
264
+ }
265
+ /** Get the latest installed Android system image. */
266
+ async getLatestAndroidSystemImage() {
267
+ const sdkManagerPath = this.getSdkManagerPath();
268
+ try {
269
+ const { stdout } = await execFileAsync(sdkManagerPath, [
270
+ "--list_installed",
271
+ ], { timeout: 30_000 });
272
+ const images = stdout
273
+ .split("\n")
274
+ .map((l) => l.trim())
275
+ .filter((l) => l.startsWith("system-images;"));
276
+ if (images.length > 0) {
277
+ // Pick the latest (last in sorted order)
278
+ const sorted = images.sort();
279
+ return sorted[sorted.length - 1].split(/\s+/)[0];
280
+ }
281
+ }
282
+ catch {
283
+ // sdkmanager not available
284
+ }
285
+ throw new Error("No Android system images installed. Run:\n" +
286
+ ' sdkmanager "system-images;android-34;google_apis;arm64-v8a"');
287
+ }
288
+ // ── Shared / Public ─────────────────────────────────────────────────
289
+ /**
290
+ * Boot a device from a profile. Returns a fully initialized BootedDevice.
291
+ * Handles both iOS and Android based on profile.platform.
292
+ */
293
+ async bootFromProfile(profile) {
294
+ if (profile.platform === "ios") {
295
+ const { udid, created, alreadyBooted } = await this.ensureIosSimulator(profile);
296
+ if (!alreadyBooted) {
297
+ await this.bootIosSimulator(udid);
298
+ }
299
+ return {
300
+ id: udid,
301
+ profile,
302
+ device: new ios_device_js_1.IosDevice(udid),
303
+ createdByDevLens: created,
304
+ wasAlreadyBooted: alreadyBooted,
305
+ };
306
+ }
307
+ else {
308
+ const { avdName, created } = await this.ensureAndroidAvd(profile);
309
+ const serial = await this.bootAndroidEmulator(avdName);
310
+ return {
311
+ id: serial,
312
+ profile,
313
+ device: new android_device_js_1.AndroidDevice(serial),
314
+ createdByDevLens: created,
315
+ wasAlreadyBooted: false, // Android boot always goes through us
316
+ };
317
+ }
318
+ }
319
+ /**
320
+ * Shutdown a device. Only shuts down if it wasn't already booted
321
+ * before DevLens touched it.
322
+ */
323
+ async shutdownDevice(booted) {
324
+ if (booted.wasAlreadyBooted)
325
+ return; // Don't touch user's device
326
+ if (booted.profile.platform === "ios") {
327
+ await this.shutdownIos(booted.id);
328
+ }
329
+ else {
330
+ await this.shutdownAndroid(booted.id);
331
+ }
332
+ }
333
+ /**
334
+ * Shutdown and optionally delete all devices created by DevLens.
335
+ */
336
+ async cleanupAll(deleteCreated = false) {
337
+ const cleaned = [];
338
+ for (const id of this.createdDeviceIds) {
339
+ try {
340
+ // Determine platform from prefix
341
+ if (id.startsWith(DEVLENS_PREFIX_ANDROID) || id.startsWith("devlens-")) {
342
+ // Android AVD — find running serial and kill
343
+ const serial = await this.findRunningAndroidEmulator(id);
344
+ if (serial)
345
+ await this.shutdownAndroid(serial);
346
+ cleaned.push(id);
347
+ }
348
+ else {
349
+ // iOS simulator UDID
350
+ if (deleteCreated) {
351
+ await this.deleteIosSimulator(id);
352
+ }
353
+ else {
354
+ await this.shutdownIos(id);
355
+ }
356
+ cleaned.push(id);
357
+ }
358
+ }
359
+ catch {
360
+ // Best effort
361
+ }
362
+ }
363
+ this.createdDeviceIds.clear();
364
+ return cleaned;
365
+ }
366
+ /** Get IDs of all devices created by DevLens in this session. */
367
+ get createdDevices() {
368
+ return Array.from(this.createdDeviceIds);
369
+ }
370
+ // ── Path helpers ────────────────────────────────────────────────────
371
+ getAdbPath() {
372
+ const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
373
+ return androidHome ? `${androidHome}/platform-tools/adb` : "adb";
374
+ }
375
+ getEmulatorPath() {
376
+ const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
377
+ return androidHome ? `${androidHome}/emulator/emulator` : "emulator";
378
+ }
379
+ getAvdManagerPath() {
380
+ const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
381
+ return androidHome
382
+ ? `${androidHome}/cmdline-tools/latest/bin/avdmanager`
383
+ : "avdmanager";
384
+ }
385
+ getSdkManagerPath() {
386
+ const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
387
+ return androidHome
388
+ ? `${androidHome}/cmdline-tools/latest/bin/sdkmanager`
389
+ : "sdkmanager";
390
+ }
391
+ sleep(ms) {
392
+ return new Promise((resolve) => setTimeout(resolve, ms));
393
+ }
394
+ }
395
+ exports.SimulatorFactory = SimulatorFactory;
396
+ //# sourceMappingURL=simulator-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulator-factory.js","sourceRoot":"","sources":["../../../src/platform/simulator-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Detect system resources (RAM, CPU) and calculate optimal batch sizes
3
+ * for multi-device operations. Ensures DevLens doesn't overwhelm
4
+ * machines with limited resources (e.g. 16GB MacBooks).
5
+ */
6
+ export interface SystemProfile {
7
+ totalMemoryGB: number;
8
+ freeMemoryGB: number;
9
+ cpuCores: number;
10
+ platform: NodeJS.Platform;
11
+ }
12
+ export interface BatchConfig {
13
+ /** Max iOS simulators to boot simultaneously in one batch */
14
+ iosBatchSize: number;
15
+ /** Max Android emulators to boot simultaneously in one batch */
16
+ androidBatchSize: number;
17
+ /** Delay between individual boot commands within a batch (ms) */
18
+ delayBetweenBootsMs: number;
19
+ /** Delay between batches to let RAM reclaim (ms) */
20
+ delayBetweenBatchesMs: number;
21
+ /** Pause booting if memory usage exceeds this % */
22
+ memoryThresholdPercent: number;
23
+ }
24
+ /**
25
+ * Read current system resource profile.
26
+ */
27
+ export declare function getSystemProfile(): SystemProfile;
28
+ /**
29
+ * Calculate optimal batch sizes based on available resources.
30
+ *
31
+ * @param profile - Current system profile
32
+ * @param alreadyBooted - Number of devices already running (don't count toward limits)
33
+ */
34
+ export declare function calculateBatchConfig(profile: SystemProfile, alreadyBooted?: number): BatchConfig;
35
+ /**
36
+ * Check if current memory usage is below the safe threshold.
37
+ * Returns true if it's safe to boot more devices.
38
+ */
39
+ export declare function isMemorySafe(thresholdPercent?: number): boolean;
40
+ /**
41
+ * Format system profile as a human-readable summary string.
42
+ */
43
+ export declare function formatSystemInfo(profile: SystemProfile): string;
44
+ //# sourceMappingURL=system-resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-resources.d.ts","sourceRoot":"","sources":["../../../src/platform/system-resources.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mDAAmD;IACnD,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAID;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAOhD;AAID;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,aAAa,EACtB,aAAa,SAAI,GAChB,WAAW,CAkDb;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,gBAAgB,SAAK,GAAG,OAAO,CAK3D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAM/D"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * Detect system resources (RAM, CPU) and calculate optimal batch sizes
4
+ * for multi-device operations. Ensures DevLens doesn't overwhelm
5
+ * machines with limited resources (e.g. 16GB MacBooks).
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.getSystemProfile = getSystemProfile;
12
+ exports.calculateBatchConfig = calculateBatchConfig;
13
+ exports.isMemorySafe = isMemorySafe;
14
+ exports.formatSystemInfo = formatSystemInfo;
15
+ const os_1 = __importDefault(require("os"));
16
+ // ─── System Detection ─────────────────────────────────────────────────────
17
+ /**
18
+ * Read current system resource profile.
19
+ */
20
+ function getSystemProfile() {
21
+ return {
22
+ totalMemoryGB: os_1.default.totalmem() / (1024 ** 3),
23
+ freeMemoryGB: os_1.default.freemem() / (1024 ** 3),
24
+ cpuCores: os_1.default.cpus().length,
25
+ platform: os_1.default.platform(),
26
+ };
27
+ }
28
+ // ─── Batch Calculation ────────────────────────────────────────────────────
29
+ /**
30
+ * Calculate optimal batch sizes based on available resources.
31
+ *
32
+ * @param profile - Current system profile
33
+ * @param alreadyBooted - Number of devices already running (don't count toward limits)
34
+ */
35
+ function calculateBatchConfig(profile, alreadyBooted = 0) {
36
+ const free = profile.freeMemoryGB;
37
+ const cores = profile.cpuCores;
38
+ // Each iOS sim ≈ 1.3-2GB, each Android emu ≈ 2.5-4GB
39
+ // Leave ~4GB headroom for OS + Xcode/Studio
40
+ let iosBatch;
41
+ let androidBatch;
42
+ let bootDelay;
43
+ let batchDelay;
44
+ if (free < 6) {
45
+ // Very tight — sequential only
46
+ iosBatch = 1;
47
+ androidBatch = 1;
48
+ bootDelay = 0;
49
+ batchDelay = 3000;
50
+ }
51
+ else if (free < 10) {
52
+ // 16GB Mac typical (6-10GB free)
53
+ iosBatch = cores < 6 ? 2 : 3;
54
+ androidBatch = cores < 6 ? 1 : 2;
55
+ bootDelay = 500;
56
+ batchDelay = 2000;
57
+ }
58
+ else if (free < 18) {
59
+ // 32GB Mac or lightly loaded (10-18GB free)
60
+ iosBatch = cores < 8 ? 3 : 4;
61
+ androidBatch = cores < 8 ? 2 : 3;
62
+ bootDelay = 300;
63
+ batchDelay = 1500;
64
+ }
65
+ else {
66
+ // 64GB+ or very free system
67
+ iosBatch = cores < 8 ? 4 : 6;
68
+ androidBatch = cores < 8 ? 3 : 4;
69
+ bootDelay = 200;
70
+ batchDelay = 1000;
71
+ }
72
+ // Reduce batch size if devices are already consuming resources
73
+ const reduction = Math.floor(alreadyBooted / 2);
74
+ iosBatch = Math.max(1, iosBatch - reduction);
75
+ androidBatch = Math.max(1, androidBatch - reduction);
76
+ return {
77
+ iosBatchSize: iosBatch,
78
+ androidBatchSize: androidBatch,
79
+ delayBetweenBootsMs: bootDelay,
80
+ delayBetweenBatchesMs: batchDelay,
81
+ memoryThresholdPercent: 85,
82
+ };
83
+ }
84
+ // ─── Memory Monitor ───────────────────────────────────────────────────────
85
+ /**
86
+ * Check if current memory usage is below the safe threshold.
87
+ * Returns true if it's safe to boot more devices.
88
+ */
89
+ function isMemorySafe(thresholdPercent = 85) {
90
+ const total = os_1.default.totalmem();
91
+ const free = os_1.default.freemem();
92
+ const usedPercent = ((total - free) / total) * 100;
93
+ return usedPercent < thresholdPercent;
94
+ }
95
+ /**
96
+ * Format system profile as a human-readable summary string.
97
+ */
98
+ function formatSystemInfo(profile) {
99
+ return (`${Math.round(profile.totalMemoryGB)}GB RAM ` +
100
+ `(${profile.freeMemoryGB.toFixed(1)}GB free), ` +
101
+ `${profile.cpuCores} cores`);
102
+ }
103
+ //# sourceMappingURL=system-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-resources.js","sourceRoot":"","sources":["../../../src/platform/system-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ export interface BrowserEngineOptions {
2
+ viewportWidth?: number;
3
+ viewportHeight?: number;
4
+ headless?: boolean;
5
+ }
6
+ export interface DomElement {
7
+ tag: string;
8
+ text: string;
9
+ href?: string;
10
+ role?: string;
11
+ bounds: {
12
+ x: number;
13
+ y: number;
14
+ width: number;
15
+ height: number;
16
+ };
17
+ }
18
+ export interface DomMetadata {
19
+ title: string;
20
+ headings: string[];
21
+ links: Array<{
22
+ text: string;
23
+ href: string;
24
+ }>;
25
+ images: Array<{
26
+ src: string;
27
+ alt: string;
28
+ }>;
29
+ interactiveElements: DomElement[];
30
+ textContent: string;
31
+ }
32
+ /**
33
+ * Thin wrapper around Puppeteer for headless Chrome lifecycle management.
34
+ * Lazily imports puppeteer so the rest of DevLens does not fail if the
35
+ * optional dependency is missing.
36
+ */
37
+ export declare class BrowserEngine {
38
+ private browser;
39
+ private page;
40
+ private readonly options;
41
+ constructor(options?: BrowserEngineOptions);
42
+ launch(): Promise<void>;
43
+ navigate(url: string): Promise<void>;
44
+ screenshot(): Promise<Buffer>;
45
+ viewportScreenshot(): Promise<Buffer>;
46
+ scrollPage(direction: "down" | "up", distance?: number): Promise<void>;
47
+ getScrollHeight(): Promise<number>;
48
+ getScrollPosition(): Promise<number>;
49
+ click(x: number, y: number): Promise<void>;
50
+ clickElement(selector: string): Promise<boolean>;
51
+ extractLinks(): Promise<Array<{
52
+ text: string;
53
+ href: string;
54
+ }>>;
55
+ extractDomMetadata(): Promise<DomMetadata>;
56
+ waitForNavigation(): Promise<void>;
57
+ waitMs(ms: number): Promise<void>;
58
+ currentUrl(): Promise<string>;
59
+ close(): Promise<void>;
60
+ private ensurePage;
61
+ }
62
+ //# sourceMappingURL=browser-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-engine.d.ts","sourceRoot":"","sources":["../../../src/prototype/browser-engine.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACjE;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5C,mBAAmB,EAAE,UAAU,EAAE,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;gBAE7C,OAAO,CAAC,EAAE,oBAAoB;IAQpC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBvB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAU7B,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAUrC,UAAU,CACd,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,QAAQ,GAAE,MAAY,GACrB,OAAO,CAAC,IAAI,CAAC;IASV,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAKlC,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhD,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAuB9D,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC;IAuD1C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYlC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAK7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,OAAO,CAAC,UAAU;CAQnB"}