@xenon-device-management/xenon 1.8.2 → 1.8.4
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/lib/package.json
CHANGED
|
@@ -56,6 +56,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
56
56
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
57
|
const child_process_1 = require("child_process");
|
|
58
58
|
const http_1 = __importDefault(require("http"));
|
|
59
|
+
const sharp_1 = __importDefault(require("sharp"));
|
|
59
60
|
const logger_1 = __importDefault(require("../../logger"));
|
|
60
61
|
const device_store_1 = require("../../data-service/device-store");
|
|
61
62
|
const device_service_1 = require("../../data-service/device-service");
|
|
@@ -63,7 +64,10 @@ const DeviceLockManager_1 = require("./DeviceLockManager");
|
|
|
63
64
|
const typedi_1 = require("typedi");
|
|
64
65
|
const ResourceIsolationService_1 = require("../../services/ResourceIsolationService");
|
|
65
66
|
const PortAllocator_1 = require("../../services/PortAllocator");
|
|
66
|
-
//
|
|
67
|
+
// JPEG quality for the in-process sharp encoder (0-100). ~78 approximates the
|
|
68
|
+
// old ffmpeg `-q:v 8` (mjpeg quantizer scale) — the low-lag/quality knob.
|
|
69
|
+
const JPEG_QUALITY = 78;
|
|
70
|
+
// FFmpeg is optional - only used for the rgb565 fallback raw-to-JPEG conversion
|
|
67
71
|
let FFMPEG_PATH = null;
|
|
68
72
|
try {
|
|
69
73
|
// Dynamic require for optional dependency
|
|
@@ -77,6 +81,9 @@ let AndroidStreamService = class AndroidStreamService {
|
|
|
77
81
|
constructor() {
|
|
78
82
|
this.sessions = new Map();
|
|
79
83
|
this.startPromises = new Map();
|
|
84
|
+
// UDIDs for which a sharp encode failure has already been warned, so a
|
|
85
|
+
// systemic problem is visible once without per-frame log spam.
|
|
86
|
+
this.sharpFailureWarned = new Set();
|
|
80
87
|
this.startWatchdog();
|
|
81
88
|
}
|
|
82
89
|
startWatchdog() {
|
|
@@ -117,12 +124,25 @@ let AndroidStreamService = class AndroidStreamService {
|
|
|
117
124
|
}
|
|
118
125
|
});
|
|
119
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Whether the capture loop should idle this iteration instead of grabbing a
|
|
129
|
+
* frame. We idle only when the stream is live ('running') and nobody is
|
|
130
|
+
* watching. During 'starting' warmup we always capture, so the first frame is
|
|
131
|
+
* cached before any viewer attaches — otherwise startStream's first-frame
|
|
132
|
+
* wait times out against a loop that refuses to capture (the old ~5s dead
|
|
133
|
+
* startup).
|
|
134
|
+
*/
|
|
135
|
+
shouldIdleCapture(session) {
|
|
136
|
+
return session.status === 'running' && session.viewerCount === 0;
|
|
137
|
+
}
|
|
120
138
|
captureLoop(udid, session) {
|
|
121
139
|
return __awaiter(this, void 0, void 0, function* () {
|
|
122
140
|
logger_1.default.info(`[${udid}] Background capture loop started.`);
|
|
123
141
|
while (session.status === 'running' || session.status === 'starting') {
|
|
124
|
-
if (
|
|
125
|
-
|
|
142
|
+
if (this.shouldIdleCapture(session)) {
|
|
143
|
+
// Live but unwatched — idle briefly so the next frame resumes quickly
|
|
144
|
+
// once a viewer attaches.
|
|
145
|
+
yield new Promise((r) => setTimeout(r, 250));
|
|
126
146
|
continue;
|
|
127
147
|
}
|
|
128
148
|
// Respect device interaction lock
|
|
@@ -179,7 +199,7 @@ let AndroidStreamService = class AndroidStreamService {
|
|
|
179
199
|
targetW--;
|
|
180
200
|
if (targetH % 2 !== 0)
|
|
181
201
|
targetH--;
|
|
182
|
-
session.latestFrame = yield this.
|
|
202
|
+
session.latestFrame = yield this.encodeFrame(pixels, w, h, targetW, targetH, pixFmt, udid);
|
|
183
203
|
if (!session.latestFrameTimestamp) {
|
|
184
204
|
logger_1.default.info(`[${udid}] First Android frame successfully captured and converted.`);
|
|
185
205
|
}
|
|
@@ -294,21 +314,23 @@ let AndroidStreamService = class AndroidStreamService {
|
|
|
294
314
|
catch (e) {
|
|
295
315
|
logger_1.default.warn(`[${udid}] MJPEG port check timed out, proceeding anyway: ${e}`);
|
|
296
316
|
}
|
|
297
|
-
|
|
317
|
+
// Start capturing while status is still 'starting' so the loop warms
|
|
318
|
+
// the first frame eagerly. shouldIdleCapture() only idles once we're
|
|
319
|
+
// 'running', so keeping 'starting' here avoids the old ~5s dead startup
|
|
320
|
+
// where the loop skipped capture (0 viewers) until this wait timed out.
|
|
298
321
|
this.captureLoop(udid, session);
|
|
299
|
-
// Principal Resilience: Wait for the FIRST FRAME to be captured
|
|
300
|
-
// FFMPEG often fails to "open" the input if there
|
|
322
|
+
// Principal Resilience: Wait for the FIRST FRAME to be captured before
|
|
323
|
+
// serving the stream. FFMPEG often fails to "open" the input if there
|
|
324
|
+
// is no data immediately available.
|
|
301
325
|
const firstFrameStartTime = Date.now();
|
|
302
326
|
const firstFrameTimeout = 5000;
|
|
303
|
-
let frameCount = 0;
|
|
304
327
|
while (Date.now() - firstFrameStartTime < firstFrameTimeout) {
|
|
305
|
-
if (session.latestFrame)
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
break; // We have at least one frame ready to serve
|
|
309
|
-
}
|
|
310
|
-
yield new Promise((r) => setTimeout(r, 200));
|
|
328
|
+
if (session.latestFrame)
|
|
329
|
+
break; // We have a frame ready to serve
|
|
330
|
+
yield new Promise((r) => setTimeout(r, 50));
|
|
311
331
|
}
|
|
332
|
+
// Now go live: from here an unwatched stream idles between frames.
|
|
333
|
+
session.status = 'running';
|
|
312
334
|
if (!session.latestFrame) {
|
|
313
335
|
logger_1.default.warn(`[${udid}] Stream started but no frames captured after ${firstFrameTimeout}ms. Downstream video might be unstable.`);
|
|
314
336
|
}
|
|
@@ -396,7 +418,46 @@ let AndroidStreamService = class AndroidStreamService {
|
|
|
396
418
|
}
|
|
397
419
|
});
|
|
398
420
|
}
|
|
399
|
-
|
|
421
|
+
/**
|
|
422
|
+
* Encode one raw screencap frame to a JPEG buffer. RGBA (the modern screencap
|
|
423
|
+
* format, effectively all devices) is encoded in-process with sharp — no
|
|
424
|
+
* subprocess, no per-frame ffmpeg spawn. Legacy rgb565 keeps the proven ffmpeg
|
|
425
|
+
* path. Same raw-pixels-in / JPEG-buffer-out contract either way.
|
|
426
|
+
*/
|
|
427
|
+
encodeFrame(pixels, srcW, srcH, dstW, dstH, pixFmt, udid) {
|
|
428
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
429
|
+
if (pixFmt === 'rgba')
|
|
430
|
+
return this.encodeRgbaWithSharp(pixels, srcW, srcH, dstW, udid);
|
|
431
|
+
// rgb565 (legacy/rare) keeps the proven ffmpeg conversion, unchanged.
|
|
432
|
+
return this.convertRawToJpegFfmpeg(pixels, srcW, srcH, dstW, dstH, pixFmt);
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* In-process RGBA→JPEG via sharp (libvips threadpool, off the event loop).
|
|
437
|
+
* Handles per-frame dimensions natively, so rotation needs no special-casing.
|
|
438
|
+
*/
|
|
439
|
+
encodeRgbaWithSharp(pixels, srcW, srcH, dstW, udid) {
|
|
440
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
441
|
+
try {
|
|
442
|
+
// screencap rows are tightly packed (w*4/row), matching the ffmpeg
|
|
443
|
+
// -video_size assumption; take exactly that many bytes for sharp's raw input.
|
|
444
|
+
return yield (0, sharp_1.default)(pixels.subarray(0, srcW * srcH * 4), {
|
|
445
|
+
raw: { width: srcW, height: srcH, channels: 4 },
|
|
446
|
+
})
|
|
447
|
+
.resize({ width: dstW }) // height auto-derived; preserves aspect ratio
|
|
448
|
+
.jpeg({ quality: JPEG_QUALITY })
|
|
449
|
+
.toBuffer();
|
|
450
|
+
}
|
|
451
|
+
catch (e) {
|
|
452
|
+
if (!this.sharpFailureWarned.has(udid)) {
|
|
453
|
+
this.sharpFailureWarned.add(udid);
|
|
454
|
+
logger_1.default.warn(`[${udid}] sharp JPEG encode failed (${e.message}); skipping frames.`);
|
|
455
|
+
}
|
|
456
|
+
throw e; // let captureLoop's catch skip the frame and back off
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
convertRawToJpegFfmpeg(pixels, srcW, srcH, dstW, dstH, pixFmt) {
|
|
400
461
|
return __awaiter(this, void 0, void 0, function* () {
|
|
401
462
|
return new Promise((resolve, reject) => {
|
|
402
463
|
if (!FFMPEG_PATH)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
require("reflect-metadata");
|
|
16
|
+
const chai_1 = require("chai");
|
|
17
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
18
|
+
const sharp_1 = __importDefault(require("sharp"));
|
|
19
|
+
const AndroidStreamService_1 = __importDefault(require("../../src/device-managers/android/AndroidStreamService"));
|
|
20
|
+
// Encoder follow-up: the capture loop used to spawn a fresh ffmpeg process per
|
|
21
|
+
// frame. This replaces the RGBA path with in-process sharp encoding, keeping the
|
|
22
|
+
// raw-pixels-in / JPEG-buffer-out contract. rgb565 keeps the ffmpeg fallback.
|
|
23
|
+
// See docs/superpowers/specs/2026-07-23-android-stream-encoder-design.md.
|
|
24
|
+
function makeService() {
|
|
25
|
+
// Instantiate without the constructor (which starts a watchdog interval).
|
|
26
|
+
return Object.create(AndroidStreamService_1.default.prototype);
|
|
27
|
+
}
|
|
28
|
+
// A tightly packed solid-colour RGBA buffer of w*h*4 bytes.
|
|
29
|
+
function rgbaBuffer(w, h) {
|
|
30
|
+
const buf = Buffer.alloc(w * h * 4);
|
|
31
|
+
for (let i = 0; i < buf.length; i += 4) {
|
|
32
|
+
buf[i] = 40; // R
|
|
33
|
+
buf[i + 1] = 120; // G
|
|
34
|
+
buf[i + 2] = 200; // B
|
|
35
|
+
buf[i + 3] = 255; // A (opaque)
|
|
36
|
+
}
|
|
37
|
+
return buf;
|
|
38
|
+
}
|
|
39
|
+
const JPEG_SOI = 0xffd8;
|
|
40
|
+
const JPEG_EOI = 0xffd9;
|
|
41
|
+
describe('AndroidStreamService sharp encoder', () => {
|
|
42
|
+
const svc = makeService();
|
|
43
|
+
it('encodes RGBA to a valid JPEG, preserving dimensions when no downscale', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
44
|
+
const w = 240;
|
|
45
|
+
const h = 160;
|
|
46
|
+
const out = yield svc.encodeRgbaWithSharp(rgbaBuffer(w, h), w, h, /*targetW*/ w);
|
|
47
|
+
(0, chai_1.expect)(out.readUInt16BE(0), 'JPEG SOI marker').to.equal(JPEG_SOI);
|
|
48
|
+
(0, chai_1.expect)(out.readUInt16BE(out.length - 2), 'JPEG EOI marker').to.equal(JPEG_EOI);
|
|
49
|
+
const meta = yield (0, sharp_1.default)(out).metadata();
|
|
50
|
+
(0, chai_1.expect)(meta.format).to.equal('jpeg');
|
|
51
|
+
(0, chai_1.expect)(meta.width).to.equal(240);
|
|
52
|
+
(0, chai_1.expect)(meta.height).to.equal(160);
|
|
53
|
+
}));
|
|
54
|
+
it('downscales to the target width, preserving aspect ratio', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
55
|
+
const w = 960;
|
|
56
|
+
const h = 540;
|
|
57
|
+
const out = yield svc.encodeRgbaWithSharp(rgbaBuffer(w, h), w, h, /*targetW*/ 720);
|
|
58
|
+
const meta = yield (0, sharp_1.default)(out).metadata();
|
|
59
|
+
(0, chai_1.expect)(meta.width).to.equal(720);
|
|
60
|
+
(0, chai_1.expect)(meta.height).to.equal(405); // 540 * 720/960
|
|
61
|
+
}));
|
|
62
|
+
});
|
|
63
|
+
describe('AndroidStreamService encodeFrame routing', () => {
|
|
64
|
+
afterEach(() => sinon_1.default.restore());
|
|
65
|
+
it('routes RGBA frames to the sharp encoder', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
66
|
+
const svc = makeService();
|
|
67
|
+
const sharpStub = sinon_1.default.stub(svc, 'encodeRgbaWithSharp').resolves(Buffer.from([0xff, 0xd8]));
|
|
68
|
+
const ffmpegStub = sinon_1.default
|
|
69
|
+
.stub(svc, 'convertRawToJpegFfmpeg')
|
|
70
|
+
.resolves(Buffer.from([0xff, 0xd8]));
|
|
71
|
+
yield svc.encodeFrame(Buffer.alloc(16), 2, 2, 2, 2, 'rgba', 'udid-1');
|
|
72
|
+
(0, chai_1.expect)(sharpStub.calledOnce, 'sharp encoder used for rgba').to.be.true;
|
|
73
|
+
(0, chai_1.expect)(ffmpegStub.called, 'ffmpeg not used for rgba').to.be.false;
|
|
74
|
+
}));
|
|
75
|
+
it('routes rgb565 frames to the ffmpeg fallback', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
76
|
+
const svc = makeService();
|
|
77
|
+
const sharpStub = sinon_1.default.stub(svc, 'encodeRgbaWithSharp').resolves(Buffer.from([0xff, 0xd8]));
|
|
78
|
+
const ffmpegStub = sinon_1.default
|
|
79
|
+
.stub(svc, 'convertRawToJpegFfmpeg')
|
|
80
|
+
.resolves(Buffer.from([0xff, 0xd8]));
|
|
81
|
+
yield svc.encodeFrame(Buffer.alloc(16), 2, 2, 2, 2, 'rgb565', 'udid-1');
|
|
82
|
+
(0, chai_1.expect)(ffmpegStub.calledOnce, 'ffmpeg fallback used for rgb565').to.be.true;
|
|
83
|
+
(0, chai_1.expect)(sharpStub.called, 'sharp not used for rgb565').to.be.false;
|
|
84
|
+
}));
|
|
85
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
require("reflect-metadata");
|
|
7
|
+
const chai_1 = require("chai");
|
|
8
|
+
const AndroidStreamService_1 = __importDefault(require("../../src/device-managers/android/AndroidStreamService"));
|
|
9
|
+
// Fast-start regression: startStream used to flip status to 'running' BEFORE the
|
|
10
|
+
// first-frame warmup. The capture loop skips capturing whenever
|
|
11
|
+
// (viewerCount === 0 && status === 'running'), and at startup no browser has
|
|
12
|
+
// attached yet — so the loop idled through the entire 5s first-frame budget,
|
|
13
|
+
// producing a ~5s dead startup. The fix keeps status 'starting' through warmup
|
|
14
|
+
// (so the loop captures eagerly) and flips to 'running' only after a frame is
|
|
15
|
+
// cached. This test pins the idle predicate that encodes that intent.
|
|
16
|
+
function makeService() {
|
|
17
|
+
// Instantiate without the constructor (which starts a watchdog interval).
|
|
18
|
+
return Object.create(AndroidStreamService_1.default.prototype);
|
|
19
|
+
}
|
|
20
|
+
describe('AndroidStreamService fast-start idle predicate', () => {
|
|
21
|
+
const svc = makeService();
|
|
22
|
+
it('does NOT idle during warmup (status "starting") even with zero viewers', () => {
|
|
23
|
+
// The whole point: warm the first frame before any viewer attaches.
|
|
24
|
+
(0, chai_1.expect)(svc.shouldIdleCapture({ status: 'starting', viewerCount: 0 })).to.equal(false);
|
|
25
|
+
});
|
|
26
|
+
it('idles when live ("running") and nobody is watching', () => {
|
|
27
|
+
(0, chai_1.expect)(svc.shouldIdleCapture({ status: 'running', viewerCount: 0 })).to.equal(true);
|
|
28
|
+
});
|
|
29
|
+
it('captures when live and at least one viewer is attached', () => {
|
|
30
|
+
(0, chai_1.expect)(svc.shouldIdleCapture({ status: 'running', viewerCount: 1 })).to.equal(false);
|
|
31
|
+
});
|
|
32
|
+
});
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/InternalHttpClient.ts","../src/PluginContext.ts","../src/XenonCapabilityManager.ts","../src/chromeUtils.ts","../src/config.ts","../src/device-utils.ts","../src/index.ts","../src/logger.ts","../src/plugin.ts","../src/prisma.ts","../src/app/index.ts","../src/app/swagger-docs.ts","../src/app/swagger.ts","../src/app/routers/apikeys.ts","../src/app/routers/apps.ts","../src/app/routers/audit.ts","../src/app/routers/auth.ts","../src/app/routers/bug-report.ts","../src/app/routers/build-export.ts","../src/app/routers/capabilities.ts","../src/app/routers/config.ts","../src/app/routers/control.ts","../src/app/routers/dashboard.ts","../src/app/routers/grid.ts","../src/app/routers/interceptor.ts","../src/app/routers/ports.ts","../src/app/routers/processes.ts","../src/app/routers/profile.ts","../src/app/routers/profileIdentity.ts","../src/app/routers/projects.ts","../src/app/routers/recordings.ts","../src/app/routers/reservation.ts","../src/app/routers/sdk-leases.ts","../src/app/routers/sdk-version.ts","../src/app/routers/teams.ts","../src/app/routers/users.ts","../src/app/routers/webhook.ts","../src/commands/handle.ts","../src/commands/index.ts","../src/dashboard/asset-manager.ts","../src/dashboard/commands.ts","../src/dashboard/event-manager.ts","../src/dashboard/services/app-service.ts","../src/dashboard/services/failure-analysis-service.ts","../src/dashboard/services/session-service.ts","../src/data-service/CircuitBreaker.ts","../src/data-service/config-service.ts","../src/data-service/db.ts","../src/data-service/device-service.ts","../src/data-service/device-store.interface.ts","../src/data-service/device-store.ts","../src/data-service/pending-sessions-service.ts","../src/data-service/pluginArgs.ts","../src/data-service/prisma-service.ts","../src/data-service/prisma-store.ts","../src/data-service/queue-service.ts","../src/data-service/web-config-service.ts","../src/device-managers/AndroidDeviceManager.ts","../src/device-managers/ChromeDriverManager.ts","../src/device-managers/HealthMonitorService.ts","../src/device-managers/IOSDeviceManager.ts","../src/device-managers/NodeDevices.ts","../src/device-managers/iOSTracker.ts","../src/device-managers/index.ts","../src/device-managers/android/AndroidStreamService.ts","../src/device-managers/android/DeviceLockManager.ts","../src/device-managers/cloud/CapabilityManager.ts","../src/device-managers/cloud/Devices.ts","../src/device-managers/ios/IOSDiscoveryService.ts","../src/device-managers/ios/IOSStreamService.ts","../src/device-managers/ios/WDAClient.ts","../src/device-managers/ios/iosBattery.ts","../src/device-managers/ios/iosStreamDiagnostics.ts","../src/enums/Capabilities.ts","../src/enums/Cloud.ts","../src/enums/Platform.ts","../src/enums/SessionType.ts","../src/enums/SocketEvents.ts","../src/generated/client/default.d.ts","../src/generated/client/default.js","../src/generated/client/edge.d.ts","../src/generated/client/edge.js","../src/generated/client/index-browser.js","../src/generated/client/index.d.ts","../src/generated/client/index.js","../src/generated/client/wasm.d.ts","../src/generated/client/wasm.js","../src/generated/client/runtime/edge-esm.js","../src/generated/client/runtime/edge.js","../src/generated/client/runtime/index-browser.d.ts","../src/generated/client/runtime/index-browser.js","../src/generated/client/runtime/library.d.ts","../src/generated/client/runtime/library.js","../src/generated/client/runtime/react-native.js","../src/generated/client/runtime/wasm.js","../src/helpers/UniversalMjpegProxy.ts","../src/helpers/index.ts","../src/interceptors/CommandInterceptor.ts","../src/interfaces/ICloudManager.ts","../src/interfaces/IDevice.ts","../src/interfaces/IDeviceFilterOptions.ts","../src/interfaces/IDeviceManager.ts","../src/interfaces/IOptions.ts","../src/interfaces/IPluginArgs.ts","../src/interfaces/ISessionCapability.ts","../src/logging/sessionContext.ts","../src/middleware/authMiddleware.ts","../src/middleware/csrfMiddleware.ts","../src/middleware/leaseTokenMiddleware.ts","../src/middleware/loginRateLimiter.ts","../src/middleware/rateLimitMiddleware.ts","../src/middleware/roleGuard.ts","../src/middleware/scopeGuard.ts","../src/profiling/AndroidAppProfiler.ts","../src/proxy/wd-command-proxy.ts","../src/scripts/generate-database-migration.ts","../src/scripts/initialize-database.ts","../src/scripts/install-go-ios.ts","../src/scripts/prepare-prisma.ts","../src/scripts/run-migrations.ts","../src/services/AICommandService.ts","../src/services/AIService.ts","../src/services/ApiKeyService.ts","../src/services/CircuitBreaker.ts","../src/services/CleanupService.ts","../src/services/DeviceReconciler.ts","../src/services/EmailService.ts","../src/services/EventBus.ts","../src/services/EventLogService.ts","../src/services/InspectorService.ts","../src/services/InterceptorService.ts","../src/services/MetricsService.ts","../src/services/NetworkConditioningService.ts","../src/services/NotificationService.ts","../src/services/OrphanSweeper.ts","../src/services/PasswordResetService.ts","../src/services/PortAllocator.ts","../src/services/ProcessMetricsService.ts","../src/services/ProcessRegistry.ts","../src/services/RequestLogService.ts","../src/services/ResourceIsolationService.ts","../src/services/SecurityService.ts","../src/services/SelectorStateService.ts","../src/services/SelectorVerificationJob.ts","../src/services/ServerManager.ts","../src/services/SessionHeartbeatService.ts","../src/services/SessionLifecycleService.ts","../src/services/ShutdownCoordinator.ts","../src/services/SocketClient.ts","../src/services/SocketServer.ts","../src/services/TeamService.ts","../src/services/TracingService.ts","../src/services/UserService.ts","../src/services/UserSessionService.ts","../src/services/VideoPipelineService.ts","../src/services/sessionTokenGate.ts","../src/services/artifacts/ArtifactStore.ts","../src/services/autowait/AutowaitService.ts","../src/services/autowait/waitFor.ts","../src/services/bug-report/BugReportService.ts","../src/services/bug-report/archive.ts","../src/services/bug-report/har-collector.ts","../src/services/bug-report/manifest.ts","../src/services/bug-report/readme.ts","../src/services/bug-report/types.ts","../src/services/bug-report/video-slice.ts","../src/services/bug-report/window.ts","../src/services/healing/FuzzyXmlHealingProvider.ts","../src/services/healing/HealEtalonService.ts","../src/services/healing/HealedLocatorGenerator.ts","../src/services/healing/HealingMetrics.ts","../src/services/healing/HealingOrchestrator.ts","../src/services/healing/LlmHealingProvider.ts","../src/services/healing/OcrHealingProvider.ts","../src/services/healing/ResilioTreeHealingProvider.ts","../src/services/healing/VisualAiHealingProvider.ts","../src/services/healing/types.ts","../src/services/identity/bootstrap.ts","../src/services/identity/sessionCleanupCron.ts","../src/services/identity/userAuthorization.ts","../src/services/interceptor/AndroidProxyAdapter.ts","../src/services/interceptor/CertManager.ts","../src/services/interceptor/HarBuilder.ts","../src/services/interceptor/HostFilter.ts","../src/services/interceptor/MitmProxyHost.ts","../src/services/interceptor/MockEngine.ts","../src/services/interceptor/RequestBuffer.ts","../src/services/interceptor/SessionArchive.ts","../src/services/interceptor/types.ts","../src/services/lease/LeaseOrphanSweeper.ts","../src/services/lease/LeaseService.ts","../src/services/lease/buildCapabilityBag.ts","../src/services/lease/leaseToken.ts","../src/services/omni-vision/OmniVisionService.ts","../src/services/omni-vision/VisionAssertionService.ts","../src/services/ports/PortAllocatorClient.ts","../src/services/ports/PortAllocatorService.ts","../src/services/recording/RecordingOrchestrator.ts","../src/services/recording/annotation-render.ts","../src/services/recording/busy-precheck.ts","../src/services/recording/concurrency-gate.ts","../src/services/recording/manualLock.ts","../src/services/recording/proof-bundle.ts","../src/services/recording/recording-store.ts","../src/services/telemetry/attributes.ts","../src/services/token/JwtKeyService.ts","../src/services/token/StreamTicketService.ts","../src/services/token/mcpScopes.ts","../src/sessions/CloudSession.ts","../src/sessions/LocalSession.ts","../src/sessions/RemoteSession.ts","../src/sessions/SessionManager.ts","../src/sessions/XenonSession.ts","../src/types/CLIArgs.ts","../src/types/CloudArgs.ts","../src/types/CloudSchema.ts","../src/types/DeviceType.ts","../src/types/DeviceUpdate.ts","../src/types/IOSDevice.ts","../src/types/Platform.ts","../src/types/SessionStatus.ts","../src/types/express.d.ts","../src/types/healing.d.ts","../src/types/identity.ts","../src/validators/CapabilityValidator.ts","../test/e2e/e2ehelper.ts","../test/e2e/plugin-harness.ts","../test/e2e/plugin.spec.ts","../test/e2e/startup-verification.spec.ts","../test/e2e/telemetry_verification.spec.ts","../test/e2e/video-recording-test.spec.js","../test/e2e/android/conf.spec.js","../test/e2e/android/conf2.spec.js","../test/e2e/android/conf3.spec.js","../test/e2e/hubnode/forward-request.spec.ts","../test/e2e/hubnode/hubnode.spec.ts","../test/e2e/ios/conf1.spec.js","../test/e2e/ios/conf2.spec.js","../test/helpers/seedUser.ts","../test/helpers/test-container.ts","../test/integration/androidDevices.spec.ts","../test/integration/audit-ingest.spec.ts","../test/integration/auth-flow.spec.ts","../test/integration/auth-rate-limit.spec.ts","../test/integration/bug-report-route.spec.ts","../test/integration/cliArgs.js","../test/integration/cross-workflow.spec.ts","../test/integration/forgot-password-rate-limit.spec.ts","../test/integration/forgot-password.spec.ts","../test/integration/healing-events-sessionfilter.spec.ts","../test/integration/legacy-deprecation-headers.spec.ts","../test/integration/migration.spec.ts","../test/integration/node-pair-auth-rest.spec.ts","../test/integration/ports-router.spec.ts","../test/integration/profile-tokens.spec.ts","../test/integration/recordings-router.spec.ts","../test/integration/reset-revokes-sessions.spec.ts","../test/integration/role-matrix.spec.ts","../test/integration/sdk-leases-router.spec.ts","../test/integration/sdk-version.spec.ts","../test/integration/selector-health-endpoint.spec.ts","../test/integration/selector-state-flow.spec.ts","../test/integration/team-membership-migration.spec.ts","../test/integration/team-visibility-dashboard.spec.ts","../test/integration/team-visibility-grid.spec.ts","../test/integration/team-visibility-recordings.spec.ts","../test/integration/users-flow.spec.ts","../test/integration/users-lockout.spec.ts","../test/integration/ios/01iOSSimulator.spec.ts","../test/integration/ios/02iOSDevices.spec.ts","../test/unit/AndroidDeviceManager.spec.ts","../test/unit/ApiKeyService.test.ts","../test/unit/ArtifactStore.spec.ts","../test/unit/AutowaitService.spec.ts","../test/unit/CapabilitiesRouter.spec.ts","../test/unit/ChromeDriverManager.spec.js","../test/unit/CleanupService.spec.ts","../test/unit/CommandInterceptor.autowait.spec.ts","../test/unit/DeviceModel.spec.ts","../test/unit/EmailService.test.ts","../test/unit/EventLogService.spec.ts","../test/unit/FuzzyXmlHealingProvider.test.ts","../test/unit/GetAdbOriginal.js","../test/unit/HealingCascade.test.ts","../test/unit/IOSDeviceManager.spec.js","../test/unit/JwtKeyService.spec.ts","../test/unit/McpScopes.spec.ts","../test/unit/OrphanSweeper.test.ts","../test/unit/PasswordResetService.test.ts","../test/unit/PortAllocator.test.ts","../test/unit/ProcessRegistry.test.ts","../test/unit/ProjectsRouter.spec.ts","../test/unit/RemoteIOs.spec.js","../test/unit/ResilioTreeHealingProvider.test.ts","../test/unit/SessionHeartbeatWrite.test.ts","../test/unit/SessionLifecycleCaps.spec.ts","../test/unit/SessionTokenGate.spec.ts","../test/unit/StreamTicketService.spec.ts","../test/unit/TeamService.test.ts","../test/unit/TokenEndpoint.spec.ts","../test/unit/UserService.test.ts","../test/unit/UserSessionService.test.ts","../test/unit/XenonCapabilityManager.spec.ts","../test/unit/aggregate-hotspots-tuple-key.spec.ts","../test/unit/android-stream-adb-path.spec.ts","../test/unit/android-stream-release.spec.ts","../test/unit/auth-me-auth-disabled.test.ts","../test/unit/authMiddleware.bearer.spec.ts","../test/unit/authMiddleware.mcpAudience.spec.ts","../test/unit/authMiddleware.streamTicket.spec.ts","../test/unit/authMiddleware.test.ts","../test/unit/bootstrap-identity.test.ts","../test/unit/build-export.spec.ts","../test/unit/busy-precheck.spec.ts","../test/unit/commands.spec.js","../test/unit/concurrency-gate.spec.ts","../test/unit/config.spec.js","../test/unit/device-service.spec.ts","../test/unit/device-utils.spec.ts","../test/unit/event-manager-regression-hook.spec.ts","../test/unit/extract-access-key-token-pair.test.ts","../test/unit/findAndLockDevice-leasemerge.spec.ts","../test/unit/healing-instrumentation.spec.ts","../test/unit/healing-state-endpoints.spec.ts","../test/unit/healing-tier-gate.spec.ts","../test/unit/helpers.spec.ts","../test/unit/iosBattery.spec.ts","../test/unit/iosStreamDiagnostics.spec.ts","../test/unit/loginRateLimiter.test.ts","../test/unit/manualLock.test.ts","../test/unit/omni-vision.spec.ts","../test/unit/plugin.spec.ts","../test/unit/prisma.spec.ts","../test/unit/profile-router.test.ts","../test/unit/profileIdentity.spec.ts","../test/unit/proof-bundle.spec.ts","../test/unit/rateLimitMiddleware.test.ts","../test/unit/recording-instrumentation.spec.ts","../test/unit/recording-orchestrator.spec.ts","../test/unit/recording-store.spec.ts","../test/unit/roleGuard.test.ts","../test/unit/run-migrations-fail-fast.test.ts","../test/unit/run-migrations.test.ts","../test/unit/selector-state-service.spec.ts","../test/unit/selector-verification-job.spec.ts","../test/unit/socketServer.bearer.spec.ts","../test/unit/team-filter.test.ts","../test/unit/tracing-service-init.spec.ts","../test/unit/userAuthorization.test.ts","../test/unit/users-router.test.ts","../test/unit/video-pipeline-args.spec.ts","../test/unit/video-pipeline-outputpath.spec.ts","../test/unit/bug-report/archive.spec.ts","../test/unit/bug-report/har-collector.spec.ts","../test/unit/bug-report/manifest.spec.ts","../test/unit/bug-report/readme.spec.ts","../test/unit/bug-report/route.spec.ts","../test/unit/bug-report/service.spec.ts","../test/unit/bug-report/video-slice.spec.ts","../test/unit/bug-report/window.spec.ts","../test/unit/fixtures/device.config.js","../test/unit/fixtures/devices.js","../test/unit/interceptor/AndroidProxyAdapter.spec.ts","../test/unit/interceptor/CertManager.spec.ts","../test/unit/interceptor/HarBuilder.spec.ts","../test/unit/interceptor/HostFilter.spec.ts","../test/unit/interceptor/MitmProxyHost.spec.ts","../test/unit/interceptor/MockEngine.spec.ts","../test/unit/interceptor/RequestBuffer.spec.ts","../test/unit/interceptor/SessionArchive.spec.ts","../test/unit/lease/LeaseOrphanSweeper.spec.ts","../test/unit/lease/LeaseService.spec.ts","../test/unit/lease/buildCapabilityBag.spec.ts","../test/unit/lease/leaseToken.spec.ts","../test/unit/lease/nodePairAuth.spec.ts","../test/unit/ports/PortAllocatorService.spec.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/InternalHttpClient.ts","../src/PluginContext.ts","../src/XenonCapabilityManager.ts","../src/chromeUtils.ts","../src/config.ts","../src/device-utils.ts","../src/index.ts","../src/logger.ts","../src/plugin.ts","../src/prisma.ts","../src/app/index.ts","../src/app/swagger-docs.ts","../src/app/swagger.ts","../src/app/routers/apikeys.ts","../src/app/routers/apps.ts","../src/app/routers/audit.ts","../src/app/routers/auth.ts","../src/app/routers/bug-report.ts","../src/app/routers/build-export.ts","../src/app/routers/capabilities.ts","../src/app/routers/config.ts","../src/app/routers/control.ts","../src/app/routers/dashboard.ts","../src/app/routers/grid.ts","../src/app/routers/interceptor.ts","../src/app/routers/ports.ts","../src/app/routers/processes.ts","../src/app/routers/profile.ts","../src/app/routers/profileIdentity.ts","../src/app/routers/projects.ts","../src/app/routers/recordings.ts","../src/app/routers/reservation.ts","../src/app/routers/sdk-leases.ts","../src/app/routers/sdk-version.ts","../src/app/routers/teams.ts","../src/app/routers/users.ts","../src/app/routers/webhook.ts","../src/commands/handle.ts","../src/commands/index.ts","../src/dashboard/asset-manager.ts","../src/dashboard/commands.ts","../src/dashboard/event-manager.ts","../src/dashboard/services/app-service.ts","../src/dashboard/services/failure-analysis-service.ts","../src/dashboard/services/session-service.ts","../src/data-service/CircuitBreaker.ts","../src/data-service/config-service.ts","../src/data-service/db.ts","../src/data-service/device-service.ts","../src/data-service/device-store.interface.ts","../src/data-service/device-store.ts","../src/data-service/pending-sessions-service.ts","../src/data-service/pluginArgs.ts","../src/data-service/prisma-service.ts","../src/data-service/prisma-store.ts","../src/data-service/queue-service.ts","../src/data-service/web-config-service.ts","../src/device-managers/AndroidDeviceManager.ts","../src/device-managers/ChromeDriverManager.ts","../src/device-managers/HealthMonitorService.ts","../src/device-managers/IOSDeviceManager.ts","../src/device-managers/NodeDevices.ts","../src/device-managers/iOSTracker.ts","../src/device-managers/index.ts","../src/device-managers/android/AndroidStreamService.ts","../src/device-managers/android/DeviceLockManager.ts","../src/device-managers/cloud/CapabilityManager.ts","../src/device-managers/cloud/Devices.ts","../src/device-managers/ios/IOSDiscoveryService.ts","../src/device-managers/ios/IOSStreamService.ts","../src/device-managers/ios/WDAClient.ts","../src/device-managers/ios/iosBattery.ts","../src/device-managers/ios/iosStreamDiagnostics.ts","../src/enums/Capabilities.ts","../src/enums/Cloud.ts","../src/enums/Platform.ts","../src/enums/SessionType.ts","../src/enums/SocketEvents.ts","../src/generated/client/default.d.ts","../src/generated/client/default.js","../src/generated/client/edge.d.ts","../src/generated/client/edge.js","../src/generated/client/index-browser.js","../src/generated/client/index.d.ts","../src/generated/client/index.js","../src/generated/client/wasm.d.ts","../src/generated/client/wasm.js","../src/generated/client/runtime/edge-esm.js","../src/generated/client/runtime/edge.js","../src/generated/client/runtime/index-browser.d.ts","../src/generated/client/runtime/index-browser.js","../src/generated/client/runtime/library.d.ts","../src/generated/client/runtime/library.js","../src/generated/client/runtime/react-native.js","../src/generated/client/runtime/wasm.js","../src/helpers/UniversalMjpegProxy.ts","../src/helpers/index.ts","../src/interceptors/CommandInterceptor.ts","../src/interfaces/ICloudManager.ts","../src/interfaces/IDevice.ts","../src/interfaces/IDeviceFilterOptions.ts","../src/interfaces/IDeviceManager.ts","../src/interfaces/IOptions.ts","../src/interfaces/IPluginArgs.ts","../src/interfaces/ISessionCapability.ts","../src/logging/sessionContext.ts","../src/middleware/authMiddleware.ts","../src/middleware/csrfMiddleware.ts","../src/middleware/leaseTokenMiddleware.ts","../src/middleware/loginRateLimiter.ts","../src/middleware/rateLimitMiddleware.ts","../src/middleware/roleGuard.ts","../src/middleware/scopeGuard.ts","../src/profiling/AndroidAppProfiler.ts","../src/proxy/wd-command-proxy.ts","../src/scripts/generate-database-migration.ts","../src/scripts/initialize-database.ts","../src/scripts/install-go-ios.ts","../src/scripts/prepare-prisma.ts","../src/scripts/run-migrations.ts","../src/services/AICommandService.ts","../src/services/AIService.ts","../src/services/ApiKeyService.ts","../src/services/CircuitBreaker.ts","../src/services/CleanupService.ts","../src/services/DeviceReconciler.ts","../src/services/EmailService.ts","../src/services/EventBus.ts","../src/services/EventLogService.ts","../src/services/InspectorService.ts","../src/services/InterceptorService.ts","../src/services/MetricsService.ts","../src/services/NetworkConditioningService.ts","../src/services/NotificationService.ts","../src/services/OrphanSweeper.ts","../src/services/PasswordResetService.ts","../src/services/PortAllocator.ts","../src/services/ProcessMetricsService.ts","../src/services/ProcessRegistry.ts","../src/services/RequestLogService.ts","../src/services/ResourceIsolationService.ts","../src/services/SecurityService.ts","../src/services/SelectorStateService.ts","../src/services/SelectorVerificationJob.ts","../src/services/ServerManager.ts","../src/services/SessionHeartbeatService.ts","../src/services/SessionLifecycleService.ts","../src/services/ShutdownCoordinator.ts","../src/services/SocketClient.ts","../src/services/SocketServer.ts","../src/services/TeamService.ts","../src/services/TracingService.ts","../src/services/UserService.ts","../src/services/UserSessionService.ts","../src/services/VideoPipelineService.ts","../src/services/sessionTokenGate.ts","../src/services/artifacts/ArtifactStore.ts","../src/services/autowait/AutowaitService.ts","../src/services/autowait/waitFor.ts","../src/services/bug-report/BugReportService.ts","../src/services/bug-report/archive.ts","../src/services/bug-report/har-collector.ts","../src/services/bug-report/manifest.ts","../src/services/bug-report/readme.ts","../src/services/bug-report/types.ts","../src/services/bug-report/video-slice.ts","../src/services/bug-report/window.ts","../src/services/healing/FuzzyXmlHealingProvider.ts","../src/services/healing/HealEtalonService.ts","../src/services/healing/HealedLocatorGenerator.ts","../src/services/healing/HealingMetrics.ts","../src/services/healing/HealingOrchestrator.ts","../src/services/healing/LlmHealingProvider.ts","../src/services/healing/OcrHealingProvider.ts","../src/services/healing/ResilioTreeHealingProvider.ts","../src/services/healing/VisualAiHealingProvider.ts","../src/services/healing/types.ts","../src/services/identity/bootstrap.ts","../src/services/identity/sessionCleanupCron.ts","../src/services/identity/userAuthorization.ts","../src/services/interceptor/AndroidProxyAdapter.ts","../src/services/interceptor/CertManager.ts","../src/services/interceptor/HarBuilder.ts","../src/services/interceptor/HostFilter.ts","../src/services/interceptor/MitmProxyHost.ts","../src/services/interceptor/MockEngine.ts","../src/services/interceptor/RequestBuffer.ts","../src/services/interceptor/SessionArchive.ts","../src/services/interceptor/types.ts","../src/services/lease/LeaseOrphanSweeper.ts","../src/services/lease/LeaseService.ts","../src/services/lease/buildCapabilityBag.ts","../src/services/lease/leaseToken.ts","../src/services/omni-vision/OmniVisionService.ts","../src/services/omni-vision/VisionAssertionService.ts","../src/services/ports/PortAllocatorClient.ts","../src/services/ports/PortAllocatorService.ts","../src/services/recording/RecordingOrchestrator.ts","../src/services/recording/annotation-render.ts","../src/services/recording/busy-precheck.ts","../src/services/recording/concurrency-gate.ts","../src/services/recording/manualLock.ts","../src/services/recording/proof-bundle.ts","../src/services/recording/recording-store.ts","../src/services/telemetry/attributes.ts","../src/services/token/JwtKeyService.ts","../src/services/token/StreamTicketService.ts","../src/services/token/mcpScopes.ts","../src/sessions/CloudSession.ts","../src/sessions/LocalSession.ts","../src/sessions/RemoteSession.ts","../src/sessions/SessionManager.ts","../src/sessions/XenonSession.ts","../src/types/CLIArgs.ts","../src/types/CloudArgs.ts","../src/types/CloudSchema.ts","../src/types/DeviceType.ts","../src/types/DeviceUpdate.ts","../src/types/IOSDevice.ts","../src/types/Platform.ts","../src/types/SessionStatus.ts","../src/types/express.d.ts","../src/types/healing.d.ts","../src/types/identity.ts","../src/validators/CapabilityValidator.ts","../test/e2e/e2ehelper.ts","../test/e2e/plugin-harness.ts","../test/e2e/plugin.spec.ts","../test/e2e/startup-verification.spec.ts","../test/e2e/telemetry_verification.spec.ts","../test/e2e/video-recording-test.spec.js","../test/e2e/android/conf.spec.js","../test/e2e/android/conf2.spec.js","../test/e2e/android/conf3.spec.js","../test/e2e/hubnode/forward-request.spec.ts","../test/e2e/hubnode/hubnode.spec.ts","../test/e2e/ios/conf1.spec.js","../test/e2e/ios/conf2.spec.js","../test/helpers/seedUser.ts","../test/helpers/test-container.ts","../test/integration/androidDevices.spec.ts","../test/integration/audit-ingest.spec.ts","../test/integration/auth-flow.spec.ts","../test/integration/auth-rate-limit.spec.ts","../test/integration/bug-report-route.spec.ts","../test/integration/cliArgs.js","../test/integration/cross-workflow.spec.ts","../test/integration/forgot-password-rate-limit.spec.ts","../test/integration/forgot-password.spec.ts","../test/integration/healing-events-sessionfilter.spec.ts","../test/integration/legacy-deprecation-headers.spec.ts","../test/integration/migration.spec.ts","../test/integration/node-pair-auth-rest.spec.ts","../test/integration/ports-router.spec.ts","../test/integration/profile-tokens.spec.ts","../test/integration/recordings-router.spec.ts","../test/integration/reset-revokes-sessions.spec.ts","../test/integration/role-matrix.spec.ts","../test/integration/sdk-leases-router.spec.ts","../test/integration/sdk-version.spec.ts","../test/integration/selector-health-endpoint.spec.ts","../test/integration/selector-state-flow.spec.ts","../test/integration/team-membership-migration.spec.ts","../test/integration/team-visibility-dashboard.spec.ts","../test/integration/team-visibility-grid.spec.ts","../test/integration/team-visibility-recordings.spec.ts","../test/integration/users-flow.spec.ts","../test/integration/users-lockout.spec.ts","../test/integration/ios/01iOSSimulator.spec.ts","../test/integration/ios/02iOSDevices.spec.ts","../test/unit/AndroidDeviceManager.spec.ts","../test/unit/ApiKeyService.test.ts","../test/unit/ArtifactStore.spec.ts","../test/unit/AutowaitService.spec.ts","../test/unit/CapabilitiesRouter.spec.ts","../test/unit/ChromeDriverManager.spec.js","../test/unit/CleanupService.spec.ts","../test/unit/CommandInterceptor.autowait.spec.ts","../test/unit/DeviceModel.spec.ts","../test/unit/EmailService.test.ts","../test/unit/EventLogService.spec.ts","../test/unit/FuzzyXmlHealingProvider.test.ts","../test/unit/GetAdbOriginal.js","../test/unit/HealingCascade.test.ts","../test/unit/IOSDeviceManager.spec.js","../test/unit/JwtKeyService.spec.ts","../test/unit/McpScopes.spec.ts","../test/unit/OrphanSweeper.test.ts","../test/unit/PasswordResetService.test.ts","../test/unit/PortAllocator.test.ts","../test/unit/ProcessRegistry.test.ts","../test/unit/ProjectsRouter.spec.ts","../test/unit/RemoteIOs.spec.js","../test/unit/ResilioTreeHealingProvider.test.ts","../test/unit/SessionHeartbeatWrite.test.ts","../test/unit/SessionLifecycleCaps.spec.ts","../test/unit/SessionTokenGate.spec.ts","../test/unit/StreamTicketService.spec.ts","../test/unit/TeamService.test.ts","../test/unit/TokenEndpoint.spec.ts","../test/unit/UserService.test.ts","../test/unit/UserSessionService.test.ts","../test/unit/XenonCapabilityManager.spec.ts","../test/unit/aggregate-hotspots-tuple-key.spec.ts","../test/unit/android-stream-adb-path.spec.ts","../test/unit/android-stream-encoder.spec.ts","../test/unit/android-stream-fast-start.spec.ts","../test/unit/android-stream-release.spec.ts","../test/unit/auth-me-auth-disabled.test.ts","../test/unit/authMiddleware.bearer.spec.ts","../test/unit/authMiddleware.mcpAudience.spec.ts","../test/unit/authMiddleware.streamTicket.spec.ts","../test/unit/authMiddleware.test.ts","../test/unit/bootstrap-identity.test.ts","../test/unit/build-export.spec.ts","../test/unit/busy-precheck.spec.ts","../test/unit/commands.spec.js","../test/unit/concurrency-gate.spec.ts","../test/unit/config.spec.js","../test/unit/device-service.spec.ts","../test/unit/device-utils.spec.ts","../test/unit/event-manager-regression-hook.spec.ts","../test/unit/extract-access-key-token-pair.test.ts","../test/unit/findAndLockDevice-leasemerge.spec.ts","../test/unit/healing-instrumentation.spec.ts","../test/unit/healing-state-endpoints.spec.ts","../test/unit/healing-tier-gate.spec.ts","../test/unit/helpers.spec.ts","../test/unit/iosBattery.spec.ts","../test/unit/iosStreamDiagnostics.spec.ts","../test/unit/loginRateLimiter.test.ts","../test/unit/manualLock.test.ts","../test/unit/omni-vision.spec.ts","../test/unit/plugin.spec.ts","../test/unit/prisma.spec.ts","../test/unit/profile-router.test.ts","../test/unit/profileIdentity.spec.ts","../test/unit/proof-bundle.spec.ts","../test/unit/rateLimitMiddleware.test.ts","../test/unit/recording-instrumentation.spec.ts","../test/unit/recording-orchestrator.spec.ts","../test/unit/recording-store.spec.ts","../test/unit/roleGuard.test.ts","../test/unit/run-migrations-fail-fast.test.ts","../test/unit/run-migrations.test.ts","../test/unit/selector-state-service.spec.ts","../test/unit/selector-verification-job.spec.ts","../test/unit/socketServer.bearer.spec.ts","../test/unit/team-filter.test.ts","../test/unit/tracing-service-init.spec.ts","../test/unit/userAuthorization.test.ts","../test/unit/users-router.test.ts","../test/unit/video-pipeline-args.spec.ts","../test/unit/video-pipeline-outputpath.spec.ts","../test/unit/bug-report/archive.spec.ts","../test/unit/bug-report/har-collector.spec.ts","../test/unit/bug-report/manifest.spec.ts","../test/unit/bug-report/readme.spec.ts","../test/unit/bug-report/route.spec.ts","../test/unit/bug-report/service.spec.ts","../test/unit/bug-report/video-slice.spec.ts","../test/unit/bug-report/window.spec.ts","../test/unit/fixtures/device.config.js","../test/unit/fixtures/devices.js","../test/unit/interceptor/AndroidProxyAdapter.spec.ts","../test/unit/interceptor/CertManager.spec.ts","../test/unit/interceptor/HarBuilder.spec.ts","../test/unit/interceptor/HostFilter.spec.ts","../test/unit/interceptor/MitmProxyHost.spec.ts","../test/unit/interceptor/MockEngine.spec.ts","../test/unit/interceptor/RequestBuffer.spec.ts","../test/unit/interceptor/SessionArchive.spec.ts","../test/unit/lease/LeaseOrphanSweeper.spec.ts","../test/unit/lease/LeaseService.spec.ts","../test/unit/lease/buildCapabilityBag.spec.ts","../test/unit/lease/leaseToken.spec.ts","../test/unit/lease/nodePairAuth.spec.ts","../test/unit/ports/PortAllocatorService.spec.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED