@xenon-device-management/xenon 2.17.0 → 2.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/lib/package.json +2 -3
  2. package/lib/public/assets/{AnnotationOverlay-CjmMCS0S.js → AnnotationOverlay-CB8njQvS.js} +1 -1
  3. package/lib/public/assets/{ApiKeyGate-B4Ob0v3C.js → ApiKeyGate-B-804QBS.js} +1 -1
  4. package/lib/public/assets/DeviceMosaicView-BsDvfjR1.js +2 -0
  5. package/lib/public/assets/{EmptyState-DcEG-oAi.js → EmptyState-WzLw1cEV.js} +1 -1
  6. package/lib/public/assets/{FieldGroup-CtnCDshE.js → FieldGroup-CaQNXgcE.js} +1 -1
  7. package/lib/public/assets/{FilterMenu-BK0dE9cc.js → FilterMenu-C9gAiypL.js} +1 -1
  8. package/lib/public/assets/{Menu-eKsmLpKS.js → Menu-CfTti3rw.js} +1 -1
  9. package/lib/public/assets/{Modal-DPwop3Lz.js → Modal-BcZUFhDm.js} +1 -1
  10. package/lib/public/assets/{RecordingPage-CfgSkZkB.js → RecordingPage-B_pbl3UE.js} +1 -1
  11. package/lib/public/assets/{RecordingsPage-Bzl9pTUY.js → RecordingsPage-BkVhplE3.js} +1 -1
  12. package/lib/public/assets/{SegmentedControl-B_TZTrPm.js → SegmentedControl-CDLMLNl5.js} +1 -1
  13. package/lib/public/assets/{SettingCard-DlmvZJPM.js → SettingCard-Lyw5CB1F.js} +1 -1
  14. package/lib/public/assets/{Table-BigPWKXi.js → Table-CK414bOU.js} +1 -1
  15. package/lib/public/assets/{activity-CvuZdQYu.js → activity-pEyAdE-M.js} +1 -1
  16. package/lib/public/assets/{ai-settings-lI2UJ2n7.js → ai-settings-CIhS7MMq.js} +1 -1
  17. package/lib/public/assets/{api-keys-CPgf9XJM.js → api-keys-D2J44Ebv.js} +1 -1
  18. package/lib/public/assets/{apps-DIzOvtUp.js → apps-CCV3RZY8.js} +1 -1
  19. package/lib/public/assets/{arrow-left-DiP5ywBT.js → arrow-left-DaEUmERk.js} +1 -1
  20. package/lib/public/assets/{arrow-right-DtW_8hm5.js → arrow-right-CnRXHXit.js} +1 -1
  21. package/lib/public/assets/{arrow-up-right-C89FbNU0.js → arrow-up-right-BGCS7zhi.js} +1 -1
  22. package/lib/public/assets/{auth-shell-B7sUDb--.js → auth-shell-CpW1zsxD.js} +2 -2
  23. package/lib/public/assets/{builds-page-BBhvrMfA.js → builds-page-B-xdzjMx.js} +1 -1
  24. package/lib/public/assets/{button-DugsdUw1.js → button-B5QkOVa4.js} +1 -1
  25. package/lib/public/assets/{calendar-grKd08ZH.js → calendar-gX_1EKue.js} +1 -1
  26. package/lib/public/assets/{check-ORjyNfnX.js → check-MIM4THvH.js} +1 -1
  27. package/lib/public/assets/{chevron-right-Ei2FxUXq.js → chevron-right-BZIp3-9t.js} +1 -1
  28. package/lib/public/assets/{circle-check-Day0HjW4.js → circle-check-Crt-G_uy.js} +1 -1
  29. package/lib/public/assets/{circle-x-CHxSRLHp.js → circle-x-C8GvvXVt.js} +1 -1
  30. package/lib/public/assets/{clock-BDHewWTx.js → clock-MFKV4qGa.js} +1 -1
  31. package/lib/public/assets/{copy-CTwT4I3D.js → copy-BU-Z7mBK.js} +1 -1
  32. package/lib/public/assets/device-explorer-D-78Twa0.js +282 -0
  33. package/lib/public/assets/{download-D3bjz_vr.js → download-DIoLCCYv.js} +1 -1
  34. package/lib/public/assets/{forgot-password-BNBLi023.js → forgot-password-vNYlPnia.js} +1 -1
  35. package/lib/public/assets/{h264Stream-C51Au2i_.js → h264Stream-BLcSplMU.js} +1 -1
  36. package/lib/public/assets/{index-Dk5J6HB1.js → index-BpqyclNY.js} +2 -2
  37. package/lib/public/assets/{index-DncSz5LG.js → index-Hl1OL-k_.js} +1 -1
  38. package/lib/public/assets/{index-Z7_BY3pJ.js → index-QbukVVrl.js} +1 -1
  39. package/lib/public/assets/{input-bTXM4l09.js → input-DHH3fHer.js} +1 -1
  40. package/lib/public/assets/{line-chart-B3YmVYyr.js → line-chart-PdViEphw.js} +1 -1
  41. package/lib/public/assets/{list-checks-BClKEj1-.js → list-checks-DI_heIg9.js} +1 -1
  42. package/lib/public/assets/{lock-CZsenX3D.js → lock-DVP_dL6J.js} +1 -1
  43. package/lib/public/assets/{login-B6A6tOp9.js → login-B8vtTDcr.js} +1 -1
  44. package/lib/public/assets/{maintenance-settings-CmCJGy7O.js → maintenance-settings-BMa5EfgI.js} +1 -1
  45. package/lib/public/assets/{monitor-BdTNEglU.js → monitor-CtzX_RkD.js} +1 -1
  46. package/lib/public/assets/{mouse-pointer-2-BM8CaLtt.js → mouse-pointer-2-BA09sdS9.js} +1 -1
  47. package/lib/public/assets/{network-BS6vUc1x.js → network-B_F9Nox-.js} +1 -1
  48. package/lib/public/assets/{overview-Yfk_Y7g3.js → overview-kWCYMHMV.js} +1 -1
  49. package/lib/public/assets/{page-header-DhXCwpml.js → page-header-CAbH1O1a.js} +1 -1
  50. package/lib/public/assets/{play-D08gP1td.js → play-sg95hLqA.js} +1 -1
  51. package/lib/public/assets/{plus-BKboorfa.js → plus-BT9mk2gj.js} +1 -1
  52. package/lib/public/assets/{profile-page-Cd9NodrA.js → profile-page-DZOz5Ypc.js} +1 -1
  53. package/lib/public/assets/{reset-password-acLDyyDW.js → reset-password-CqeImlEO.js} +1 -1
  54. package/lib/public/assets/{runbook-page-CWLkC1Fd.js → runbook-page-U_8TSysj.js} +1 -1
  55. package/lib/public/assets/{select-DZoRKNti.js → select-Cx4JDzsR.js} +1 -1
  56. package/lib/public/assets/{selector-detail-redirect-DS4qrt84.js → selector-detail-redirect-DiMRe7DW.js} +1 -1
  57. package/lib/public/assets/{selector-health-page-TpmN61G3.js → selector-health-page-CKR5URll.js} +1 -1
  58. package/lib/public/assets/{session-detail-page-C0wYaXqy.js → session-detail-page-DuIVzTW_.js} +1 -1
  59. package/lib/public/assets/{settings-CxPGEY2j.js → settings-B5fuvgTP.js} +1 -1
  60. package/lib/public/assets/{stat-tile-DUpyYgl-.js → stat-tile-CtHX1dkh.js} +1 -1
  61. package/lib/public/assets/{tablet-SA02BJNQ.js → tablet-DCGD0GQt.js} +1 -1
  62. package/lib/public/assets/{teams-jamD0Kxr.js → teams-MzlELlw9.js} +1 -1
  63. package/lib/public/assets/{trash-2-DO8fv6w4.js → trash-2-BIRm2KVs.js} +1 -1
  64. package/lib/public/assets/{upload-CaiGCStb.js → upload-C-lgyswH.js} +1 -1
  65. package/lib/public/assets/{use-builds-data-jS-fcvVf.js → use-builds-data-IOydXA8d.js} +1 -1
  66. package/lib/public/assets/{use-password-reset-mode-BzoenegM.js → use-password-reset-mode-CIVXG7Me.js} +1 -1
  67. package/lib/public/assets/{users-Bnw7Vs_B.js → users-hwK5XGIy.js} +1 -1
  68. package/lib/public/assets/{users-DHvDrriG.js → users-ivNCjeus.js} +1 -1
  69. package/lib/public/assets/{video-off-FEvy0w5U.js → video-off-DvcIEsdZ.js} +1 -1
  70. package/lib/public/assets/{webhook-settings-CBVB5lxi.js → webhook-settings-DukgCe1u.js} +1 -1
  71. package/lib/public/assets/{zap-BMrTJO6M.js → zap-BE9gacFj.js} +1 -1
  72. package/lib/public/index.html +1 -1
  73. package/lib/src/app/openapi/control.yaml +69 -4
  74. package/lib/src/app/routers/control.js +24 -5
  75. package/lib/src/device-managers/ios/IOSStreamService.js +147 -18
  76. package/lib/src/device-utils.js +50 -22
  77. package/lib/src/gateway/internalCall.js +33 -5
  78. package/lib/src/gateway/sessionGateway.js +9 -4
  79. package/lib/src/helpers/index.js +9 -6
  80. package/lib/src/interceptors/CommandInterceptor.js +10 -0
  81. package/lib/src/services/ServerManager.js +25 -4
  82. package/lib/src/services/UserService.js +8 -3
  83. package/lib/src/sessions/appiumUmbrella.js +11 -0
  84. package/lib/src/sessions/sessionMemory.js +11 -2
  85. package/lib/test/unit/UserService.test.js +8 -0
  86. package/lib/test/unit/boot-device-sync.spec.js +195 -0
  87. package/lib/test/unit/hub-node-gateway-appium-server.spec.js +21 -0
  88. package/lib/test/unit/install-scripts.spec.js +98 -0
  89. package/lib/test/unit/internal-call.spec.js +99 -0
  90. package/lib/test/unit/internal-calls-session-record.spec.js +312 -0
  91. package/lib/test/unit/ios-simulator-preview.spec.js +315 -0
  92. package/lib/test/unit/is-xenon-running.spec.js +10 -0
  93. package/lib/tsconfig.tsbuildinfo +1 -1
  94. package/package.json +2 -3
  95. package/lib/public/assets/DeviceMosaicView-DTVOB_NO.js +0 -2
  96. package/lib/public/assets/device-explorer-DlhrKJ-g.js +0 -282
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ require("reflect-metadata");
49
+ const chai_1 = require("chai");
50
+ const child_process_1 = __importDefault(require("child_process"));
51
+ const events_1 = require("events");
52
+ const express_1 = __importDefault(require("express"));
53
+ const sinon_1 = __importDefault(require("sinon"));
54
+ const typedi_1 = require("typedi");
55
+ const control_1 = __importDefault(require("../../src/app/routers/control"));
56
+ const device_store_1 = require("../../src/data-service/device-store");
57
+ const deviceService = __importStar(require("../../src/data-service/device-service"));
58
+ const IOSStreamService_1 = __importStar(require("../../src/device-managers/ios/IOSStreamService"));
59
+ const SessionOwnerResolver_1 = require("../../src/services/device-access/SessionOwnerResolver");
60
+ const IOSTunnels_1 = require("../../src/device-managers/ios/IOSTunnels");
61
+ const singleFlight_1 = require("../../src/helpers/singleFlight");
62
+ const PortAllocator_1 = require("../../src/services/PortAllocator");
63
+ const ProcessRegistry_1 = require("../../src/services/ProcessRegistry");
64
+ const recording_store_1 = require("../../src/services/recording/recording-store");
65
+ const appiumUmbrella_1 = require("../../src/sessions/appiumUmbrella");
66
+ const sessionMemory_1 = require("../../src/sessions/sessionMemory");
67
+ const container_registration_1 = require("../helpers/container-registration");
68
+ const loopbackRequest_1 = __importDefault(require("../helpers/loopbackRequest"));
69
+ const loopbackServer_1 = require("../helpers/loopbackServer");
70
+ const own_node_id_1 = require("../helpers/own-node-id");
71
+ /**
72
+ * The live preview of an iOS simulator.
73
+ *
74
+ * Every iOS preview went through the iPhone's stream: a go-ios tunnel, iproxy
75
+ * USB forwards and go-ios `runwda`, none of which reach a simulator. With no
76
+ * test running, the start failed (go-ios: "Device not found"), and its two
77
+ * forwards stayed on the ports it had leased to the simulator; a test started
78
+ * meanwhile was given those ports, and its WebDriverAgent couldn't open them
79
+ * ("Unable to start WebDriverAgent session"). With a test running, the start
80
+ * attached to the test's WebDriverAgent but read the picture through a new
81
+ * forward that carries nothing, so a Live devices tile stayed empty.
82
+ *
83
+ * A simulator's picture is its running test's: the XCUITest driver's
84
+ * WebDriverAgent serves it on this Mac at the session's mjpegServerPort.
85
+ * The preview reads it there, starts nothing and leases no port, and ends
86
+ * with the test. With no test running it is refused in plain words.
87
+ */
88
+ const SIMULATOR = '35429994-B029-4AF4-9634-880B89DAC782';
89
+ const IPHONE = '00008150-000E78612168C01C';
90
+ describe('iOS simulator live preview', () => {
91
+ (0, own_node_id_1.useOwnNodeId)();
92
+ const loopback = (0, loopbackServer_1.loopbackServers)();
93
+ let row;
94
+ let spawned;
95
+ let commands;
96
+ let allocator;
97
+ let tunnels;
98
+ let driverOptions;
99
+ let svc;
100
+ let restoreRegs;
101
+ let blockDevice;
102
+ function iosService() {
103
+ // Bypass the constructor: it starts watchdog intervals.
104
+ const s = Object.create(IOSStreamService_1.default.prototype);
105
+ s.sessions = new Map();
106
+ s.endedSimulatorSessions = new Set();
107
+ s.startFlight = new singleFlight_1.SingleFlight();
108
+ s.recoveryCooldowns = new Map();
109
+ s.RECOVERY_COOLDOWN_MS = 30000;
110
+ s.goIOSPath = '/nonexistent/go-ios';
111
+ return s;
112
+ }
113
+ const simulator = (over = {}) => (Object.assign({ udid: SIMULATOR, host: 'http://127.0.0.1:4723', nodeId: own_node_id_1.OWN_NODE_ID, platform: 'ios', realDevice: false, deviceType: 'simulator', busy: false, session_id: null, wdaLocalPort: 8101, mjpegServerPort: 9101, screenWidth: '402', screenHeight: '874' }, over));
114
+ const runningTest = (sessionId = 'sess-1') => ({ busy: true, session_id: sessionId });
115
+ beforeEach(() => {
116
+ restoreRegs = (0, container_registration_1.saveRegistrations)(IOSStreamService_1.default, recording_store_1.RecordingStore);
117
+ row = simulator();
118
+ spawned = [];
119
+ commands = [];
120
+ sinon_1.default.stub(process, 'kill');
121
+ sinon_1.default.stub(child_process_1.default, 'spawn').callsFake(((cmd, args) => {
122
+ spawned.push([cmd, ...(args !== null && args !== void 0 ? args : [])].join(' '));
123
+ const p = new events_1.EventEmitter();
124
+ p.stdout = new events_1.EventEmitter();
125
+ p.stderr = new events_1.EventEmitter();
126
+ p.kill = () => true;
127
+ return p;
128
+ }));
129
+ sinon_1.default.stub(child_process_1.default, 'execFile').callsFake(((cmd, _o, cb) => {
130
+ commands.push(cmd);
131
+ const done = typeof cb === 'function' ? cb : () => undefined;
132
+ process.nextTick(() => done(Object.assign(new Error('exit 1'), { code: 1 }), '', ''));
133
+ return new events_1.EventEmitter();
134
+ }));
135
+ allocator = {
136
+ claim: sinon_1.default.stub().resolves(true),
137
+ acquire: sinon_1.default.stub().resolves(8150),
138
+ tryAcquire: sinon_1.default.stub().resolves(8150),
139
+ release: sinon_1.default.stub().resolves(),
140
+ touch: sinon_1.default.stub().resolves(),
141
+ releasePurpose: sinon_1.default.stub().resolves(),
142
+ };
143
+ tunnels = {
144
+ ensure: sinon_1.default.stub().resolves(null),
145
+ envFor: sinon_1.default.stub().returns({}),
146
+ stop: sinon_1.default.stub().resolves(),
147
+ touch: sinon_1.default.stub().resolves(),
148
+ isOnDemand: sinon_1.default.stub().returns(false),
149
+ };
150
+ driverOptions = {};
151
+ svc = iosService();
152
+ typedi_1.Container.set(IOSStreamService_1.default, svc);
153
+ typedi_1.Container.set(recording_store_1.RecordingStore, { isRecording: () => __awaiter(void 0, void 0, void 0, function* () { return false; }) });
154
+ const real = typedi_1.Container.get.bind(typedi_1.Container);
155
+ sinon_1.default.stub(typedi_1.Container, 'get').callsFake((token) => {
156
+ if (token === PortAllocator_1.PortAllocator)
157
+ return allocator;
158
+ if (token === IOSTunnels_1.IOSTunnels)
159
+ return tunnels;
160
+ if (token === ProcessRegistry_1.ProcessRegistry)
161
+ return { track: () => undefined };
162
+ if (token === appiumUmbrella_1.AppiumUmbrella)
163
+ return { driverOptions: (id) => driverOptions[id] };
164
+ return real(token);
165
+ });
166
+ sinon_1.default.stub(device_store_1.DeviceStoreFactory, 'getStore').returns({
167
+ findDevice: () => __awaiter(void 0, void 0, void 0, function* () { return row; }),
168
+ updateDevice: () => __awaiter(void 0, void 0, void 0, function* () { return undefined; }),
169
+ });
170
+ blockDevice = sinon_1.default.stub(deviceService, 'blockDevice').resolves();
171
+ sinon_1.default.stub(deviceService, 'unblockDevice').resolves();
172
+ sinon_1.default.stub(SessionOwnerResolver_1.SessionOwnerResolver.prototype, 'ownerOf').resolves(null);
173
+ });
174
+ afterEach(() => __awaiter(void 0, void 0, void 0, function* () {
175
+ sinon_1.default.restore();
176
+ restoreRegs();
177
+ yield loopback.closeAll();
178
+ }));
179
+ /** Nothing of the iPhone's stream ran: no process, no go-ios, no port leased. */
180
+ const startedNothing = () => {
181
+ (0, chai_1.expect)(spawned, 'processes started').to.deep.equal([]);
182
+ (0, chai_1.expect)(commands, 'commands run').to.deep.equal([]);
183
+ (0, chai_1.expect)(tunnels.ensure.called, 'go-ios tunnel').to.equal(false);
184
+ (0, chai_1.expect)(allocator.acquire.called, 'port leased').to.equal(false);
185
+ (0, chai_1.expect)(allocator.claim.called, 'port claimed').to.equal(false);
186
+ };
187
+ describe('the stream service', () => {
188
+ it('refuses a simulator no test runs on, in plain words, and starts nothing', () => __awaiter(void 0, void 0, void 0, function* () {
189
+ const err = yield svc.startStream(SIMULATOR).then(() => null, (e) => e);
190
+ (0, chai_1.expect)(err === null || err === void 0 ? void 0 : err.message).to.equal(IOSStreamService_1.SIMULATOR_PREVIEW_NEEDS_TEST);
191
+ startedNothing();
192
+ (0, chai_1.expect)(svc.getStreamStatus(SIMULATOR)).to.equal(undefined);
193
+ }));
194
+ it('refuses it again at once: no cool-down after a refusal', () => __awaiter(void 0, void 0, void 0, function* () {
195
+ yield svc.startStream(SIMULATOR).catch(() => undefined);
196
+ const err = yield svc.startStream(SIMULATOR).catch((e) => e);
197
+ (0, chai_1.expect)(err.message).to.equal(IOSStreamService_1.SIMULATOR_PREVIEW_NEEDS_TEST);
198
+ }));
199
+ it("shows a running test's own picture, at the ports its driver runs WebDriverAgent on", () => __awaiter(void 0, void 0, void 0, function* () {
200
+ Object.assign(row, runningTest());
201
+ driverOptions['sess-1'] = { wdaLocalPort: 8100, mjpegServerPort: 9100 };
202
+ const ports = yield svc.startStream(SIMULATOR);
203
+ (0, chai_1.expect)(ports).to.deep.equal({ wdaPort: 8100, mjpegPort: 9100 });
204
+ startedNothing();
205
+ (0, chai_1.expect)(svc.getStreamStatus(SIMULATOR)).to.deep.include({
206
+ status: 'running',
207
+ wdaPort: 8100,
208
+ mjpegPort: 9100,
209
+ });
210
+ }));
211
+ it('refuses a test Appium no longer has: it is ending, and its row not yet released', () => __awaiter(void 0, void 0, void 0, function* () {
212
+ Object.assign(row, runningTest());
213
+ const err = yield svc.startStream(SIMULATOR).catch((e) => e);
214
+ (0, chai_1.expect)(err.message).to.equal(IOSStreamService_1.SIMULATOR_PREVIEW_NEEDS_TEST);
215
+ (0, chai_1.expect)(svc.getStreamStatus(SIMULATOR)).to.equal(undefined);
216
+ startedNothing();
217
+ }));
218
+ it('never shows a test that has ended, though a start lands while it is torn down', () => __awaiter(void 0, void 0, void 0, function* () {
219
+ Object.assign(row, runningTest('sess-1'));
220
+ driverOptions['sess-1'] = { wdaLocalPort: 8100, mjpegServerPort: 9100 };
221
+ yield svc.startStream(SIMULATOR);
222
+ // The test's end, before Appium drops the session and the phone is released.
223
+ yield svc.endSimulatorPreviews('sess-1');
224
+ const err = yield svc.startStream(SIMULATOR).catch((e) => e);
225
+ (0, chai_1.expect)(err.message).to.equal(IOSStreamService_1.SIMULATOR_PREVIEW_NEEDS_TEST);
226
+ (0, chai_1.expect)(svc.getStreamStatus(SIMULATOR)).to.equal(undefined);
227
+ }));
228
+ it('leaves an Android emulator alone: it is no simulator', () => {
229
+ const emulator = { platform: 'android', realDevice: false, busy: false, session_id: null };
230
+ (0, chai_1.expect)((0, IOSStreamService_1.simulatorPreviewRefusal)(emulator)).to.equal(undefined);
231
+ (0, chai_1.expect)((0, IOSStreamService_1.simulatorPreviewRefusal)(Object.assign(Object.assign({}, emulator), { platform: 'ios' }))).to.equal(IOSStreamService_1.SIMULATOR_PREVIEW_NEEDS_TEST);
232
+ (0, chai_1.expect)((0, IOSStreamService_1.simulatorPreviewRefusal)(Object.assign(Object.assign({}, emulator), { platform: 'tvos' }))).to.equal(IOSStreamService_1.SIMULATOR_PREVIEW_NEEDS_TEST);
233
+ });
234
+ it("follows a new test on the simulator, never an earlier test's picture", () => __awaiter(void 0, void 0, void 0, function* () {
235
+ Object.assign(row, runningTest('sess-1'));
236
+ driverOptions['sess-1'] = { wdaLocalPort: 8100, mjpegServerPort: 9100 };
237
+ yield svc.startStream(SIMULATOR);
238
+ Object.assign(row, runningTest('sess-2'));
239
+ driverOptions['sess-2'] = { wdaLocalPort: 8102, mjpegServerPort: 9102 };
240
+ (0, chai_1.expect)(yield svc.startStream(SIMULATOR)).to.deep.equal({ wdaPort: 8102, mjpegPort: 9102 });
241
+ }));
242
+ it('ends with its test, however the test ends, and gives back no port it never leased', () => __awaiter(void 0, void 0, void 0, function* () {
243
+ Object.assign(row, runningTest('sess-1'));
244
+ driverOptions['sess-1'] = { wdaLocalPort: 8100, mjpegServerPort: 9100 };
245
+ yield svc.startStream(SIMULATOR);
246
+ (0, sessionMemory_1.forgetSessionMemory)('another-session');
247
+ yield new Promise((r) => setImmediate(r));
248
+ (0, chai_1.expect)(svc.getStreamStatus(SIMULATOR), "another test's end").to.not.equal(undefined);
249
+ (0, sessionMemory_1.forgetSessionMemory)('sess-1');
250
+ yield new Promise((r) => setImmediate(r));
251
+ (0, chai_1.expect)(svc.getStreamStatus(SIMULATOR)).to.equal(undefined);
252
+ (0, chai_1.expect)(allocator.release.called, 'port released').to.equal(false);
253
+ (0, chai_1.expect)(commands, 'go-ios clean-up').to.deep.equal([]);
254
+ }));
255
+ it('still runs the iPhone stream for an iPhone', () => __awaiter(void 0, void 0, void 0, function* () {
256
+ row = Object.assign(Object.assign({}, simulator()), { udid: IPHONE, realDevice: true, deviceType: 'real' });
257
+ const err = yield svc.startStream(IPHONE).catch((e) => e);
258
+ (0, chai_1.expect)(err.message).to.not.equal(IOSStreamService_1.SIMULATOR_PREVIEW_NEEDS_TEST);
259
+ (0, chai_1.expect)(allocator.acquire.called, 'iPhone stream leases its ports').to.equal(true);
260
+ }));
261
+ });
262
+ describe('the dashboard routes', () => {
263
+ function app() {
264
+ const a = (0, express_1.default)();
265
+ a.use(express_1.default.json());
266
+ const api = express_1.default.Router();
267
+ api.use((req, _res, next) => {
268
+ req.auth = {
269
+ kind: 'user-session',
270
+ userId: 'usr_alice',
271
+ role: 'ADMIN',
272
+ scopes: 'admin,devices,sessions,read',
273
+ rateLimit: 100,
274
+ };
275
+ next();
276
+ });
277
+ control_1.default.register(api);
278
+ a.use('/xenon/api', api);
279
+ return a;
280
+ }
281
+ const client = () => __awaiter(void 0, void 0, void 0, function* () { return (0, loopbackRequest_1.default)(yield loopback.serve(app())); });
282
+ it('stream/start says why a simulator with no test shows nothing', () => __awaiter(void 0, void 0, void 0, function* () {
283
+ const res = yield (yield client())
284
+ .post(`/xenon/api/control/${SIMULATOR}/stream/start`)
285
+ .send({ player: 'mjpeg' });
286
+ (0, chai_1.expect)(res.status, JSON.stringify(res.body)).to.equal(409);
287
+ (0, chai_1.expect)(res.body).to.deep.include({
288
+ error: 'simulator_needs_test',
289
+ message: IOSStreamService_1.SIMULATOR_PREVIEW_NEEDS_TEST,
290
+ });
291
+ startedNothing();
292
+ }));
293
+ it('stream/status gives the reason, for the Live devices tile', () => __awaiter(void 0, void 0, void 0, function* () {
294
+ const res = yield (yield client()).get(`/xenon/api/control/${SIMULATOR}/stream/status`);
295
+ (0, chai_1.expect)(res.status).to.equal(200);
296
+ (0, chai_1.expect)(res.body).to.deep.include({
297
+ status: 'stopped',
298
+ lastError: IOSStreamService_1.SIMULATOR_PREVIEW_NEEDS_TEST,
299
+ reason: 'simulator_needs_test',
300
+ });
301
+ }));
302
+ it("stream/start answers with the running test's picture", () => __awaiter(void 0, void 0, void 0, function* () {
303
+ Object.assign(row, runningTest());
304
+ driverOptions['sess-1'] = { wdaLocalPort: 8100, mjpegServerPort: 9100 };
305
+ const res = yield (yield client())
306
+ .post(`/xenon/api/control/${SIMULATOR}/stream/start`)
307
+ .send({ player: 'mjpeg' });
308
+ (0, chai_1.expect)(res.status, JSON.stringify(res.body)).to.equal(200);
309
+ (0, chai_1.expect)(res.body).to.deep.include({ type: 'mjpeg', mjpegPort: 9100 });
310
+ startedNothing();
311
+ // The test holds the simulator; a preview hold could outlive it.
312
+ (0, chai_1.expect)(blockDevice.called, 'held the simulator').to.equal(false);
313
+ }));
314
+ });
315
+ });
@@ -58,6 +58,16 @@ describe('isXenonRunning', () => {
58
58
  yield new Promise((resolve) => gone.close(() => resolve()));
59
59
  (0, chai_1.expect)(yield (0, helpers_1.isXenonRunning)(`http://127.0.0.1:${port}`)).to.equal(false);
60
60
  }));
61
+ it('asks once and gives up at its own limit when told to, as a start does', () => __awaiter(void 0, void 0, void 0, function* () {
62
+ server.removeAllListeners('request');
63
+ server.on('request', (req) => {
64
+ hits.push(String(req.url)); // and never answers
65
+ });
66
+ const started = Date.now();
67
+ (0, chai_1.expect)(yield (0, helpers_1.isXenonRunning)(base, undefined, { timeoutMs: 200, retry: false })).to.equal(false);
68
+ (0, chai_1.expect)(Date.now() - started).to.be.lessThan(1500);
69
+ (0, chai_1.expect)(hits).to.deep.equal(['/xenon/api/health']);
70
+ }));
61
71
  it('calls a server whose health route fails not running', () => __awaiter(void 0, void 0, void 0, function* () {
62
72
  server.removeAllListeners('request');
63
73
  server.on('request', (_req, res) => {
@@ -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/apiErrors.ts","../src/app/appiumBasePath.ts","../src/app/dashboardPluginLink.ts","../src/app/index.ts","../src/app/insertBeforeRoutes.ts","../src/app/registerCommandAuth.ts","../src/app/swagger.ts","../src/app/routers/androidH264Config.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/iosStreamPort.ts","../src/app/routers/nodePhoneControl.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/recordingRequests.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/selector-health.ts","../src/app/routers/sessionInsights.ts","../src/app/routers/streamLeave.ts","../src/app/routers/streamStartConflict.ts","../src/app/routers/streamType.ts","../src/app/routers/teams.ts","../src/app/routers/users.ts","../src/app/routers/webhook.ts","../src/app/ws/h264StreamWs.ts","../src/app/ws/logcatWs.ts","../src/app/ws/nodeSocketRelay.ts","../src/app/ws/upgradeRouter.ts","../src/commands/handle.ts","../src/commands/index.ts","../src/dashboard/asset-manager.ts","../src/dashboard/commandLogFields.ts","../src/dashboard/commands.ts","../src/dashboard/event-manager.ts","../src/dashboard/sessionCommandSummary.ts","../src/dashboard/services/app-service.ts","../src/dashboard/services/failure-analysis-service.ts","../src/dashboard/services/failureCategories.ts","../src/dashboard/services/session-service.ts","../src/data-service/CircuitBreaker.ts","../src/data-service/appleFamily.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/deviceClaims.ts","../src/data-service/deviceColumns.ts","../src/data-service/deviceFieldOwners.ts","../src/data-service/deviceSettings.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/clipboardErrors.ts","../src/device-managers/deviceIdentity.ts","../src/device-managers/iOSTracker.ts","../src/device-managers/index.ts","../src/device-managers/localDeviceHosts.ts","../src/device-managers/ownDeviceRow.ts","../src/device-managers/shellCommands.ts","../src/device-managers/android/AndroidH264StreamService.ts","../src/device-managers/android/AndroidStreamService.ts","../src/device-managers/android/DeviceLockManager.ts","../src/device-managers/android/H264Multiplexer.ts","../src/device-managers/android/LogcatMultiplexer.ts","../src/device-managers/android/LogcatStreamService.ts","../src/device-managers/android/ScrcpyServerSession.ts","../src/device-managers/android/androidIdentity.ts","../src/device-managers/android/androidStreamReuse.ts","../src/device-managers/android/clipboardBroadcast.ts","../src/device-managers/android/displayState.ts","../src/device-managers/android/h264NalParser.ts","../src/device-managers/android/previewHold.ts","../src/device-managers/android/scrcpyVersion.ts","../src/device-managers/cloud/CapabilityManager.ts","../src/device-managers/cloud/Devices.ts","../src/device-managers/ios/IOSDiscoveryService.ts","../src/device-managers/ios/IOSLogStreamService.ts","../src/device-managers/ios/IOSStreamService.ts","../src/device-managers/ios/IOSTunnels.ts","../src/device-managers/ios/WDAClient.ts","../src/device-managers/ios/appleIdentity.ts","../src/device-managers/ios/goIosBinary.ts","../src/device-managers/ios/iosAppIds.ts","../src/device-managers/ios/iosBattery.ts","../src/device-managers/ios/iosStreamDiagnostics.ts","../src/device-managers/ios/tunnelProcess.ts","../src/device-managers/ios/usbmuxd.ts","../src/enums/Capabilities.ts","../src/enums/Cloud.ts","../src/enums/Platform.ts","../src/enums/SessionType.ts","../src/enums/SocketEvents.ts","../src/gateway/createHandoff.ts","../src/gateway/defaultGateway.ts","../src/gateway/forwardToNode.ts","../src/gateway/healReport.ts","../src/gateway/hubSessionToken.ts","../src/gateway/internalCall.ts","../src/gateway/nodeAsk.ts","../src/gateway/nodeSessionDeviceLogs.ts","../src/gateway/nodeSessionMetrics.ts","../src/gateway/nodeSessionStatus.ts","../src/gateway/nodeWebDriverUrl.ts","../src/gateway/sessionCreate.ts","../src/gateway/sessionGateway.ts","../src/gateway/sessionLocator.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/ffmpegPath.ts","../src/helpers/index.ts","../src/helpers/networkAddresses.ts","../src/helpers/outboundProxy.ts","../src/helpers/singleFlight.ts","../src/interceptors/CommandInterceptor.ts","../src/interceptors/xenonScripts.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/commandAuth.ts","../src/middleware/commandCaller.ts","../src/middleware/controlDevice.ts","../src/middleware/csrfMiddleware.ts","../src/middleware/deviceAccessGuard.ts","../src/middleware/deviceTeamGuard.ts","../src/middleware/leaseTokenMiddleware.ts","../src/middleware/loginRateLimiter.ts","../src/middleware/rateLimitMiddleware.ts","../src/middleware/roleGuard.ts","../src/middleware/scopeGuard.ts","../src/middleware/sessionListingFilter.ts","../src/middleware/sessionUpgradeGuard.ts","../src/middleware/verifyCredential.ts","../src/scripts/database-check.ts","../src/scripts/generate-database-migration.ts","../src/scripts/goIosVersion.ts","../src/scripts/initialize-database.ts","../src/scripts/install-go-ios.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/DisplayStateService.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/fillMissingScreenSize.ts","../src/services/passwordResetLink.ts","../src/services/passwordResetMode.ts","../src/services/publicUrl.ts","../src/services/sessionTokenGate.ts","../src/services/webhookEvents.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/device-access/DeviceTeamResolver.ts","../src/services/device-access/LiveSessionOwners.ts","../src/services/device-access/SessionOwnerResolver.ts","../src/services/device-access/actor.ts","../src/services/device-access/appVisibility.ts","../src/services/device-access/callerTeamIds.ts","../src/services/device-access/deviceAccessPolicy.ts","../src/services/device-access/deviceVisibility.ts","../src/services/device-access/leaseHold.ts","../src/services/device-access/leaseOverride.ts","../src/services/device-access/queueVisibility.ts","../src/services/device-access/sessionVisibility.ts","../src/services/device-access/ticketActorAccess.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/fingerprintIdentity.ts","../src/services/healing/resilioPath.ts","../src/services/healing/types.ts","../src/services/identity/bootstrap.ts","../src/services/identity/identityChanges.ts","../src/services/identity/sessionCleanupCron.ts","../src/services/identity/userAuthorization.ts","../src/services/inspector/verifyLocator.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/interceptorOptions.ts","../src/services/interceptor/types.ts","../src/services/lease/LeaseOrphanSweeper.ts","../src/services/lease/LeaseService.ts","../src/services/lease/activeLeases.ts","../src/services/lease/buildCapabilityBag.ts","../src/services/lease/leaseSessionCaps.ts","../src/services/lease/leaseToken.ts","../src/services/logcat/NodeDeviceLogStore.ts","../src/services/logcat/NodeDeviceLogsCollector.ts","../src/services/logcat/PackageResolver.ts","../src/services/logcat/SessionDeviceLogs.ts","../src/services/logcat/deviceLogBook.ts","../src/services/logcat/iosDriverLog.ts","../src/services/logcat/logSource.ts","../src/services/logcat/logcatParse.ts","../src/services/logcat/nodeDeviceLogs.ts","../src/services/logcat/ostraceParse.ts","../src/services/metrics/AndroidMetricsSampler.ts","../src/services/metrics/IOSMetricsSampler.ts","../src/services/metrics/NodeMetricsCollector.ts","../src/services/metrics/NodeMetricsStore.ts","../src/services/metrics/SessionMetricsService.ts","../src/services/metrics/androidMetrics.ts","../src/services/metrics/iosMetrics.ts","../src/services/metrics/metricsBody.ts","../src/services/metrics/nodeMetrics.ts","../src/services/metrics/types.ts","../src/services/network/AndroidRadios.ts","../src/services/network/PhoneNetworkLedger.ts","../src/services/network/PhoneNetworkRestore.ts","../src/services/network/adbForPhone.ts","../src/services/network/phoneNetworkLock.ts","../src/services/network/xenonProxy.ts","../src/services/ocr/ocrData.ts","../src/services/omni-vision/OmniVisionService.ts","../src/services/omni-vision/VisionAssertionService.ts","../src/services/omni-vision/ocrTextMatch.ts","../src/services/omni-vision/screenScale.ts","../src/services/ports/PortAllocatorClient.ts","../src/services/ports/PortAllocatorService.ts","../src/services/recording/RecordingOrchestrator.ts","../src/services/recording/activeRecordings.ts","../src/services/recording/annotation-render.ts","../src/services/recording/annotationImage.ts","../src/services/recording/busy-precheck.ts","../src/services/recording/concurrency-gate.ts","../src/services/recording/ensureMjpegForRecording.ts","../src/services/recording/manualLock.ts","../src/services/recording/nodeRecordingSource.ts","../src/services/recording/probeDuration.ts","../src/services/recording/proof-bundle.ts","../src/services/recording/recording-store.ts","../src/services/recording/recordingCleanup.ts","../src/services/recording/recordingFiles.ts","../src/services/recording/recordingSummary.ts","../src/services/recording/recordingTiming.ts","../src/services/selector-health/SelectorVisibilityResolver.ts","../src/services/selector-health/access.ts","../src/services/selector-health/healingTrend.ts","../src/services/selector-health/people.ts","../src/services/selector-health/selectorDetail.ts","../src/services/selector-health/selectorKeys.ts","../src/services/selector-health/selectorList.ts","../src/services/selector-health/stateView.ts","../src/services/session/appCapability.ts","../src/services/session/nodeCreateCaps.ts","../src/services/session/sessionCredentials.ts","../src/services/session/sessionIdentity.ts","../src/services/session/shutdownReason.ts","../src/services/session/xenonOptions.ts","../src/services/settings/SelfHealingSwitch.ts","../src/services/settings/aiEngineSettings.ts","../src/services/settings/labSettings.ts","../src/services/telemetry/attributes.ts","../src/services/token/AppDownloadTicketService.ts","../src/services/token/JwtKeyService.ts","../src/services/token/StreamTicketService.ts","../src/services/token/mcpScopes.ts","../src/services/token/mcpTokenTtl.ts","../src/services/token/mintedLifetime.ts","../src/services/token/singleUseLedger.ts","../src/sessions/CloudSession.ts","../src/sessions/LocalSession.ts","../src/sessions/RemoteSession.ts","../src/sessions/SessionManager.ts","../src/sessions/XenonSession.ts","../src/sessions/appiumUmbrella.ts","../src/sessions/sessionMemory.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/appium-umbrella.ts","../test/helpers/artifact-store.ts","../test/helpers/container-registration.ts","../test/helpers/driver-log.ts","../test/helpers/expressRoutes.ts","../test/helpers/fake-adb.ts","../test/helpers/fake-ai-provider.ts","../test/helpers/fake-device-table.ts","../test/helpers/fake-http-proxy.ts","../test/helpers/fake-logcat.ts","../test/helpers/hub-node-pair.ts","../test/helpers/loki-stores.ts","../test/helpers/loopbackRequest.ts","../test/helpers/loopbackServer.ts","../test/helpers/otlp-probe.ts","../test/helpers/own-node-id.ts","../test/helpers/page-sources.ts","../test/helpers/scratch-database.ts","../test/helpers/scratch-port-leases.ts","../test/helpers/seedUser.ts","../test/helpers/selector-health-fixture.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/prisma-device-store-add-devices.spec.ts","../test/integration/prisma-device-store-team-filter.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-apps.spec.ts","../test/integration/team-visibility-control.spec.ts","../test/integration/team-visibility-dashboard.spec.ts","../test/integration/team-visibility-grid.spec.ts","../test/integration/team-visibility-leases.spec.ts","../test/integration/team-visibility-recordings.spec.ts","../test/integration/team-visibility-sessions.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/setup/scratch-default-database.js","../test/unit/AndroidDeviceManager.spec.ts","../test/unit/ApiKeyService.test.ts","../test/unit/AppDownloadTicketService.spec.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/access-scopes.spec.ts","../test/unit/active-recordings.spec.ts","../test/unit/aggregate-hotspots-session-scope.spec.ts","../test/unit/aggregate-hotspots-tuple-key.spec.ts","../test/unit/ai-call-time-limit.spec.ts","../test/unit/ai-engine-settings.spec.ts","../test/unit/ai-provider-switch.spec.ts","../test/unit/ai-rate-limit.spec.ts","../test/unit/android-adb-retry.spec.ts","../test/unit/android-clipboard.spec.ts","../test/unit/android-h264-config.spec.ts","../test/unit/android-h264-service.spec.ts","../test/unit/android-h264-viewers.spec.ts","../test/unit/android-identity.spec.ts","../test/unit/android-preview-hold.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/android-stream-reuse-service.spec.ts","../test/unit/android-stream-reuse.spec.ts","../test/unit/android-stream-stall-eof.spec.ts","../test/unit/annotation-image.spec.ts","../test/unit/annotation-render.spec.ts","../test/unit/api-error-handling.spec.ts","../test/unit/apikeys-router.spec.ts","../test/unit/apple-family.spec.ts","../test/unit/apple-identity.spec.ts","../test/unit/apps-download.spec.ts","../test/unit/apps-team-visibility.spec.ts","../test/unit/auth-disabled-resolution.spec.ts","../test/unit/auth-me-auth-disabled.test.ts","../test/unit/authMiddleware.appTicket.spec.ts","../test/unit/authMiddleware.bearer.spec.ts","../test/unit/authMiddleware.credentialLifetime.spec.ts","../test/unit/authMiddleware.mcpAudience.spec.ts","../test/unit/authMiddleware.streamTicket.spec.ts","../test/unit/authMiddleware.test.ts","../test/unit/boot-go-ios-reap.spec.ts","../test/unit/bootstrap-identity.test.ts","../test/unit/build-export.spec.ts","../test/unit/busy-precheck.spec.ts","../test/unit/cleanup-settings-db.spec.ts","../test/unit/cleanup-settings.spec.ts","../test/unit/cliargs-admin-only.spec.ts","../test/unit/clipboard-route.spec.ts","../test/unit/command-auth-appium-server.spec.ts","../test/unit/command-auth.spec.ts","../test/unit/command-caller.spec.ts","../test/unit/command-log-network-capture.spec.ts","../test/unit/commands.spec.js","../test/unit/composite-geometry.spec.ts","../test/unit/concurrency-gate.spec.ts","../test/unit/config.spec.js","../test/unit/container-registration.spec.ts","../test/unit/control-device-lookup.spec.ts","../test/unit/control-forward-decision.spec.ts","../test/unit/control-honest-answers.spec.ts","../test/unit/control-lookup-failure.spec.ts","../test/unit/create-error-message.spec.ts","../test/unit/create-handoff.spec.ts","../test/unit/dashboard-api-paths.spec.ts","../test/unit/dashboard-commands.spec.ts","../test/unit/dashboard-events-device-logs.spec.ts","../test/unit/dashboard-events-metrics.spec.ts","../test/unit/dashboard-events-team-scope.spec.ts","../test/unit/dashboard-plugin-link.spec.ts","../test/unit/database-check.spec.ts","../test/unit/default-plugin-args.spec.ts","../test/unit/device-access-guard.spec.ts","../test/unit/device-access-lease.spec.ts","../test/unit/device-access-policy.spec.ts","../test/unit/device-allocation-routes.spec.ts","../test/unit/device-columns.spec.ts","../test/unit/device-log-book.spec.ts","../test/unit/device-offline-webhook.spec.ts","../test/unit/device-service.spec.ts","../test/unit/device-setting-columns.spec.ts","../test/unit/device-settings-loki.spec.ts","../test/unit/device-settings-survive.spec.ts","../test/unit/device-store-clear-at-boot.spec.ts","../test/unit/device-sync-lost-update.spec.ts","../test/unit/device-team-guard.spec.ts","../test/unit/device-team-resolver.spec.ts","../test/unit/device-utils.spec.ts","../test/unit/display-state.spec.ts","../test/unit/emulator-boot.spec.ts","../test/unit/enable-dashboard-option.spec.ts","../test/unit/enrich-devices-team-names.test.ts","../test/unit/event-log-session-data.spec.ts","../test/unit/event-manager-regression-hook.spec.ts","../test/unit/extract-access-key-token-pair.test.ts","../test/unit/extract-team-cap.spec.ts","../test/unit/failure-analysis.spec.ts","../test/unit/failure-categories.spec.ts","../test/unit/failure-categorization.spec.ts","../test/unit/ffmpeg-path.spec.ts","../test/unit/fill-missing-screen-size.spec.ts","../test/unit/findAndLockDevice-leasemerge.spec.ts","../test/unit/fingerprint-identity.spec.ts","../test/unit/go-ios-version.spec.ts","../test/unit/grid-admin-only.spec.ts","../test/unit/h264-multiplexer.spec.ts","../test/unit/h264-nal-parser.spec.ts","../test/unit/h264-ws-frame.spec.ts","../test/unit/heal-report.spec.ts","../test/unit/healing-instrumentation.spec.ts","../test/unit/healing-no-cost.spec.ts","../test/unit/healing-state-endpoints.spec.ts","../test/unit/healing-tier-gate.spec.ts","../test/unit/healing-tiers-every-session.spec.ts","../test/unit/healing-trend.spec.ts","../test/unit/health-monitor-own-phones.spec.ts","../test/unit/health-monitor-stream-lookup.spec.ts","../test/unit/helpers.spec.ts","../test/unit/hub-boot-sweep-recovery.spec.ts","../test/unit/hub-create-once.spec.ts","../test/unit/hub-create-session-umbrella.spec.ts","../test/unit/hub-gateway-create-appium-server.spec.ts","../test/unit/hub-node-control-forward.spec.ts","../test/unit/hub-node-gateway-appium-server.spec.ts","../test/unit/hub-node-iphone-readiness.spec.ts","../test/unit/hub-node-race.spec.ts","../test/unit/hub-node-same-host.spec.ts","../test/unit/hub-node-session-device-logs.spec.ts","../test/unit/hub-node-session-metrics.spec.ts","../test/unit/hub-register-removal.spec.ts","../test/unit/hub-remote-session-heartbeat.spec.ts","../test/unit/hub-routed-session-recovery.spec.ts","../test/unit/hub-session-token.spec.ts","../test/unit/insert-before-routes.spec.ts","../test/unit/inspector-hierarchy.spec.ts","../test/unit/install-repository-app-team.spec.ts","../test/unit/interceptor-visual-elements.spec.ts","../test/unit/internal-call.spec.ts","../test/unit/ios-discovery-same-host.spec.ts","../test/unit/ios-driver-log.spec.ts","../test/unit/ios-go-ios-tunnel-env.spec.ts","../test/unit/ios-idle-hold.spec.ts","../test/unit/ios-no-network-fallback.spec.ts","../test/unit/ios-simulator-session-readiness.spec.ts","../test/unit/ios-simulator-session-teardown.spec.ts","../test/unit/ios-stream-appium-tunnel.spec.ts","../test/unit/ios-stream-port-leases.spec.ts","../test/unit/ios-stream-port.spec.ts","../test/unit/ios-tunnel-process.spec.ts","../test/unit/ios-tunnels.spec.ts","../test/unit/ios-usbmuxd-missing.spec.ts","../test/unit/ios-wda-status-identity.spec.ts","../test/unit/iosBattery.spec.ts","../test/unit/iosStreamDiagnostics.spec.ts","../test/unit/iphone-ipad-only.spec.ts","../test/unit/is-xenon-running.spec.ts","../test/unit/json-logging-option.spec.ts","../test/unit/lab-settings.spec.ts","../test/unit/lease-held-phone.spec.ts","../test/unit/logcat-multiplexer.spec.ts","../test/unit/logcat-parse.spec.ts","../test/unit/logcat-stream-service.spec.ts","../test/unit/logcat-ws.spec.ts","../test/unit/logger-json-levels.spec.ts","../test/unit/loginRateLimiter.test.ts","../test/unit/loopback-request.spec.ts","../test/unit/manualLock.test.ts","../test/unit/mark-node-busy-loki.spec.ts","../test/unit/max-sessions.spec.ts","../test/unit/mcp-token-ttl.spec.ts","../test/unit/mjpeg-proxy-cache.spec.ts","../test/unit/network-addresses.test.ts","../test/unit/node-create-caps.spec.ts","../test/unit/node-device-log-store.spec.ts","../test/unit/node-device-logs-collector.spec.ts","../test/unit/node-gateway-create-appium-server.spec.ts","../test/unit/node-hub-session-owner.spec.ts","../test/unit/node-metrics-collector.spec.ts","../test/unit/node-metrics-store.spec.ts","../test/unit/node-phone-control.spec.ts","../test/unit/node-recording-relay.spec.ts","../test/unit/node-session-device-logs-route.spec.ts","../test/unit/node-session-metrics-route.spec.ts","../test/unit/node-socket-relay.spec.ts","../test/unit/normalize-eol.spec.js","../test/unit/observability-example-loki.spec.ts","../test/unit/ocr-healing-tier-real-ocr.spec.ts","../test/unit/ocr-healing-tier.spec.ts","../test/unit/ocr-offline.spec.ts","../test/unit/ocr-text-match.spec.ts","../test/unit/omni-virtual-element-store.spec.ts","../test/unit/omni-vision-analyze-screen.spec.ts","../test/unit/omni-vision-failures.spec.ts","../test/unit/omni-vision-ios-points.spec.ts","../test/unit/omni-vision-tap-text.spec.ts","../test/unit/omni-vision.spec.ts","../test/unit/openapi-coverage.spec.ts","../test/unit/openapi-for-site.spec.ts","../test/unit/ostrace-parse.spec.ts","../test/unit/outbound-proxy.spec.ts","../test/unit/package-engines.spec.ts","../test/unit/package-resolver.spec.ts","../test/unit/partial-config-file.spec.ts","../test/unit/passwordResetMode.test.ts","../test/unit/plugin.spec.ts","../test/unit/port-allocator-os-probe.spec.ts","../test/unit/port-allocator-pairs.spec.ts","../test/unit/port-exhaustion.spec.ts","../test/unit/prisma.spec.ts","../test/unit/probe-duration.spec.ts","../test/unit/profile-router.test.ts","../test/unit/profileIdentity.spec.ts","../test/unit/proof-bundle.spec.ts","../test/unit/proxy-option.spec.ts","../test/unit/queue-requester.spec.ts","../test/unit/queue-team-scope-routes.spec.ts","../test/unit/queue-visibility.spec.ts","../test/unit/rateLimitMiddleware.test.ts","../test/unit/recording-cleanup.spec.ts","../test/unit/recording-downloads-visibility.spec.ts","../test/unit/recording-files.spec.ts","../test/unit/recording-instrumentation.spec.ts","../test/unit/recording-options.spec.ts","../test/unit/recording-orchestrator.spec.ts","../test/unit/recording-requests.spec.ts","../test/unit/recording-source-ended.spec.ts","../test/unit/recording-store.spec.ts","../test/unit/recording-summary.spec.ts","../test/unit/recording-timing.spec.ts","../test/unit/recordings-library-routes.spec.ts","../test/unit/recordings-write-visibility.spec.ts","../test/unit/remote-session-create.spec.ts","../test/unit/remux-to-standard-mp4.spec.ts","../test/unit/reservation-team-visibility.spec.ts","../test/unit/reset-link-address.spec.ts","../test/unit/reset-link.test.ts","../test/unit/resilio-path-healing.spec.ts","../test/unit/roleGuard.test.ts","../test/unit/run-migrations-database.spec.ts","../test/unit/run-migrations-fail-fast.test.ts","../test/unit/run-migrations.test.ts","../test/unit/schema-required-args.spec.ts","../test/unit/scrcpy-server-session.spec.ts","../test/unit/scrcpy-version.spec.ts","../test/unit/screenshot-route.spec.ts","../test/unit/selector-event-model.spec.ts","../test/unit/selector-health-actions.spec.ts","../test/unit/selector-health-detail.spec.ts","../test/unit/selector-health-list.spec.ts","../test/unit/selector-learning-every-session.spec.ts","../test/unit/selector-state-service.spec.ts","../test/unit/selector-verification-clean-build.spec.ts","../test/unit/selector-verification-job.spec.ts","../test/unit/selector-verification-missed-regression.spec.ts","../test/unit/selector-visibility-resolver.spec.ts","../test/unit/self-healing-boot.spec.ts","../test/unit/self-healing-setting.spec.ts","../test/unit/session-app-resolution.spec.ts","../test/unit/session-assets.spec.ts","../test/unit/session-attribution-wiring.spec.ts","../test/unit/session-create-credential-owner.spec.ts","../test/unit/session-create-layer.spec.ts","../test/unit/session-credential-strip.spec.ts","../test/unit/session-credentials.spec.ts","../test/unit/session-device-logs-hub-node.spec.ts","../test/unit/session-device-logs-ios.spec.ts","../test/unit/session-device-logs-lifecycle.spec.ts","../test/unit/session-device-logs.spec.ts","../test/unit/session-end-failure-analysis.spec.ts","../test/unit/session-failed-webhook.spec.ts","../test/unit/session-identity.spec.ts","../test/unit/session-list-insights.spec.ts","../test/unit/session-listing-auth.spec.ts","../test/unit/session-locator.spec.ts","../test/unit/session-log-indexes.spec.ts","../test/unit/session-metrics-lifecycle.spec.ts","../test/unit/session-metrics-parse.spec.ts","../test/unit/session-metrics-route.spec.ts","../test/unit/session-metrics-samplers.spec.ts","../test/unit/session-metrics-service.spec.ts","../test/unit/session-node-calls.spec.ts","../test/unit/session-owner-resolver.spec.ts","../test/unit/session-recovery-metrics.spec.ts","../test/unit/session-recovery-routing.spec.ts","../test/unit/session-upgrade-guard.spec.ts","../test/unit/session-visibility.spec.ts","../test/unit/shell-commands.spec.ts","../test/unit/shutdown-drain-remote.spec.ts","../test/unit/shutdown-sync-nets.spec.ts","../test/unit/single-flight.spec.ts","../test/unit/socket-team-scope.integration.spec.ts","../test/unit/socketServer.bearer.spec.ts","../test/unit/socketServer.scopedEmit.spec.ts","../test/unit/socketServer.sessionCookie.spec.ts","../test/unit/stored-session-capabilities.spec.ts","../test/unit/stream-leave-route.spec.ts","../test/unit/stream-leave.spec.ts","../test/unit/stream-own-device-row.spec.ts","../test/unit/stream-start-conflict.spec.ts","../test/unit/stream-start-pipelines.spec.ts","../test/unit/stream-status-type.spec.ts","../test/unit/stream-stop-ownership.spec.ts","../test/unit/stream-stop-recording.spec.ts","../test/unit/stream-ticket-identity.spec.ts","../test/unit/stream-viewer-hangup.spec.ts","../test/unit/stream-watchdog-timers.spec.ts","../test/unit/sync-dir.spec.ts","../test/unit/team-filter.test.ts","../test/unit/token-mint-limits.spec.ts","../test/unit/tracing-export-routing.spec.ts","../test/unit/tracing-service-init.spec.ts","../test/unit/tracing-session-spans.spec.ts","../test/unit/unexpected-shutdown-reason.spec.ts","../test/unit/upgrade-router.spec.ts","../test/unit/upload-install-route.spec.ts","../test/unit/userAuthorization.test.ts","../test/unit/users-router.test.ts","../test/unit/verify-credential.spec.ts","../test/unit/verify-locator.spec.ts","../test/unit/video-pipeline-args.spec.ts","../test/unit/video-pipeline-exit.spec.ts","../test/unit/video-pipeline-outputpath.spec.ts","../test/unit/vision-assertion.spec.ts","../test/unit/wda-cap-injection.spec.ts","../test/unit/wda-client-failures.spec.ts","../test/unit/wda-client-session.spec.ts","../test/unit/wda-client-shell.spec.ts","../test/unit/wda-clipboard-write.spec.ts","../test/unit/web-config-service.spec.ts","../test/unit/webdriver-info-route.spec.ts","../test/unit/webhook-delivery.spec.ts","../test/unit/webhook-payloads.spec.ts","../test/unit/ws-upgrade-routing-appium-server.spec.ts","../test/unit/xenon-execute-scripts.spec.ts","../test/unit/xenon-options.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/allocate-lease-branch.spec.ts","../test/unit/lease/buildCapabilityBag.spec.ts","../test/unit/lease/lease-device-match.spec.ts","../test/unit/lease/lease-override.spec.ts","../test/unit/lease/lease-reap-held-phone.spec.ts","../test/unit/lease/lease-session-ownership.spec.ts","../test/unit/lease/lease-sweeper-expiry.spec.ts","../test/unit/lease/lease-team-visibility.spec.ts","../test/unit/lease/lease-token-log-filter.spec.ts","../test/unit/lease/lease-token-oracle.spec.ts","../test/unit/lease/leaseToken.spec.ts","../test/unit/lease/nodePairAuth.spec.ts","../test/unit/lease/session-lease-proof.spec.ts","../test/unit/phone-network/boot-clean-up.spec.ts","../test/unit/phone-network/interceptor-options.spec.ts","../test/unit/phone-network/interceptor-proxy-restore.spec.ts","../test/unit/phone-network/network-conditioning.spec.ts","../test/unit/phone-network/phone-network-restore.spec.ts","../test/unit/phone-network/session-end-paths.spec.ts","../test/unit/phone-network/session-start.spec.ts","../test/unit/phone-network/xenon-proxy.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/apiErrors.ts","../src/app/appiumBasePath.ts","../src/app/dashboardPluginLink.ts","../src/app/index.ts","../src/app/insertBeforeRoutes.ts","../src/app/registerCommandAuth.ts","../src/app/swagger.ts","../src/app/routers/androidH264Config.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/iosStreamPort.ts","../src/app/routers/nodePhoneControl.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/recordingRequests.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/selector-health.ts","../src/app/routers/sessionInsights.ts","../src/app/routers/streamLeave.ts","../src/app/routers/streamStartConflict.ts","../src/app/routers/streamType.ts","../src/app/routers/teams.ts","../src/app/routers/users.ts","../src/app/routers/webhook.ts","../src/app/ws/h264StreamWs.ts","../src/app/ws/logcatWs.ts","../src/app/ws/nodeSocketRelay.ts","../src/app/ws/upgradeRouter.ts","../src/commands/handle.ts","../src/commands/index.ts","../src/dashboard/asset-manager.ts","../src/dashboard/commandLogFields.ts","../src/dashboard/commands.ts","../src/dashboard/event-manager.ts","../src/dashboard/sessionCommandSummary.ts","../src/dashboard/services/app-service.ts","../src/dashboard/services/failure-analysis-service.ts","../src/dashboard/services/failureCategories.ts","../src/dashboard/services/session-service.ts","../src/data-service/CircuitBreaker.ts","../src/data-service/appleFamily.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/deviceClaims.ts","../src/data-service/deviceColumns.ts","../src/data-service/deviceFieldOwners.ts","../src/data-service/deviceSettings.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/clipboardErrors.ts","../src/device-managers/deviceIdentity.ts","../src/device-managers/iOSTracker.ts","../src/device-managers/index.ts","../src/device-managers/localDeviceHosts.ts","../src/device-managers/ownDeviceRow.ts","../src/device-managers/shellCommands.ts","../src/device-managers/android/AndroidH264StreamService.ts","../src/device-managers/android/AndroidStreamService.ts","../src/device-managers/android/DeviceLockManager.ts","../src/device-managers/android/H264Multiplexer.ts","../src/device-managers/android/LogcatMultiplexer.ts","../src/device-managers/android/LogcatStreamService.ts","../src/device-managers/android/ScrcpyServerSession.ts","../src/device-managers/android/androidIdentity.ts","../src/device-managers/android/androidStreamReuse.ts","../src/device-managers/android/clipboardBroadcast.ts","../src/device-managers/android/displayState.ts","../src/device-managers/android/h264NalParser.ts","../src/device-managers/android/previewHold.ts","../src/device-managers/android/scrcpyVersion.ts","../src/device-managers/cloud/CapabilityManager.ts","../src/device-managers/cloud/Devices.ts","../src/device-managers/ios/IOSDiscoveryService.ts","../src/device-managers/ios/IOSLogStreamService.ts","../src/device-managers/ios/IOSStreamService.ts","../src/device-managers/ios/IOSTunnels.ts","../src/device-managers/ios/WDAClient.ts","../src/device-managers/ios/appleIdentity.ts","../src/device-managers/ios/goIosBinary.ts","../src/device-managers/ios/iosAppIds.ts","../src/device-managers/ios/iosBattery.ts","../src/device-managers/ios/iosStreamDiagnostics.ts","../src/device-managers/ios/tunnelProcess.ts","../src/device-managers/ios/usbmuxd.ts","../src/enums/Capabilities.ts","../src/enums/Cloud.ts","../src/enums/Platform.ts","../src/enums/SessionType.ts","../src/enums/SocketEvents.ts","../src/gateway/createHandoff.ts","../src/gateway/defaultGateway.ts","../src/gateway/forwardToNode.ts","../src/gateway/healReport.ts","../src/gateway/hubSessionToken.ts","../src/gateway/internalCall.ts","../src/gateway/nodeAsk.ts","../src/gateway/nodeSessionDeviceLogs.ts","../src/gateway/nodeSessionMetrics.ts","../src/gateway/nodeSessionStatus.ts","../src/gateway/nodeWebDriverUrl.ts","../src/gateway/sessionCreate.ts","../src/gateway/sessionGateway.ts","../src/gateway/sessionLocator.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/ffmpegPath.ts","../src/helpers/index.ts","../src/helpers/networkAddresses.ts","../src/helpers/outboundProxy.ts","../src/helpers/singleFlight.ts","../src/interceptors/CommandInterceptor.ts","../src/interceptors/xenonScripts.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/commandAuth.ts","../src/middleware/commandCaller.ts","../src/middleware/controlDevice.ts","../src/middleware/csrfMiddleware.ts","../src/middleware/deviceAccessGuard.ts","../src/middleware/deviceTeamGuard.ts","../src/middleware/leaseTokenMiddleware.ts","../src/middleware/loginRateLimiter.ts","../src/middleware/rateLimitMiddleware.ts","../src/middleware/roleGuard.ts","../src/middleware/scopeGuard.ts","../src/middleware/sessionListingFilter.ts","../src/middleware/sessionUpgradeGuard.ts","../src/middleware/verifyCredential.ts","../src/scripts/database-check.ts","../src/scripts/generate-database-migration.ts","../src/scripts/goIosVersion.ts","../src/scripts/initialize-database.ts","../src/scripts/install-go-ios.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/DisplayStateService.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/fillMissingScreenSize.ts","../src/services/passwordResetLink.ts","../src/services/passwordResetMode.ts","../src/services/publicUrl.ts","../src/services/sessionTokenGate.ts","../src/services/webhookEvents.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/device-access/DeviceTeamResolver.ts","../src/services/device-access/LiveSessionOwners.ts","../src/services/device-access/SessionOwnerResolver.ts","../src/services/device-access/actor.ts","../src/services/device-access/appVisibility.ts","../src/services/device-access/callerTeamIds.ts","../src/services/device-access/deviceAccessPolicy.ts","../src/services/device-access/deviceVisibility.ts","../src/services/device-access/leaseHold.ts","../src/services/device-access/leaseOverride.ts","../src/services/device-access/queueVisibility.ts","../src/services/device-access/sessionVisibility.ts","../src/services/device-access/ticketActorAccess.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/fingerprintIdentity.ts","../src/services/healing/resilioPath.ts","../src/services/healing/types.ts","../src/services/identity/bootstrap.ts","../src/services/identity/identityChanges.ts","../src/services/identity/sessionCleanupCron.ts","../src/services/identity/userAuthorization.ts","../src/services/inspector/verifyLocator.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/interceptorOptions.ts","../src/services/interceptor/types.ts","../src/services/lease/LeaseOrphanSweeper.ts","../src/services/lease/LeaseService.ts","../src/services/lease/activeLeases.ts","../src/services/lease/buildCapabilityBag.ts","../src/services/lease/leaseSessionCaps.ts","../src/services/lease/leaseToken.ts","../src/services/logcat/NodeDeviceLogStore.ts","../src/services/logcat/NodeDeviceLogsCollector.ts","../src/services/logcat/PackageResolver.ts","../src/services/logcat/SessionDeviceLogs.ts","../src/services/logcat/deviceLogBook.ts","../src/services/logcat/iosDriverLog.ts","../src/services/logcat/logSource.ts","../src/services/logcat/logcatParse.ts","../src/services/logcat/nodeDeviceLogs.ts","../src/services/logcat/ostraceParse.ts","../src/services/metrics/AndroidMetricsSampler.ts","../src/services/metrics/IOSMetricsSampler.ts","../src/services/metrics/NodeMetricsCollector.ts","../src/services/metrics/NodeMetricsStore.ts","../src/services/metrics/SessionMetricsService.ts","../src/services/metrics/androidMetrics.ts","../src/services/metrics/iosMetrics.ts","../src/services/metrics/metricsBody.ts","../src/services/metrics/nodeMetrics.ts","../src/services/metrics/types.ts","../src/services/network/AndroidRadios.ts","../src/services/network/PhoneNetworkLedger.ts","../src/services/network/PhoneNetworkRestore.ts","../src/services/network/adbForPhone.ts","../src/services/network/phoneNetworkLock.ts","../src/services/network/xenonProxy.ts","../src/services/ocr/ocrData.ts","../src/services/omni-vision/OmniVisionService.ts","../src/services/omni-vision/VisionAssertionService.ts","../src/services/omni-vision/ocrTextMatch.ts","../src/services/omni-vision/screenScale.ts","../src/services/ports/PortAllocatorClient.ts","../src/services/ports/PortAllocatorService.ts","../src/services/recording/RecordingOrchestrator.ts","../src/services/recording/activeRecordings.ts","../src/services/recording/annotation-render.ts","../src/services/recording/annotationImage.ts","../src/services/recording/busy-precheck.ts","../src/services/recording/concurrency-gate.ts","../src/services/recording/ensureMjpegForRecording.ts","../src/services/recording/manualLock.ts","../src/services/recording/nodeRecordingSource.ts","../src/services/recording/probeDuration.ts","../src/services/recording/proof-bundle.ts","../src/services/recording/recording-store.ts","../src/services/recording/recordingCleanup.ts","../src/services/recording/recordingFiles.ts","../src/services/recording/recordingSummary.ts","../src/services/recording/recordingTiming.ts","../src/services/selector-health/SelectorVisibilityResolver.ts","../src/services/selector-health/access.ts","../src/services/selector-health/healingTrend.ts","../src/services/selector-health/people.ts","../src/services/selector-health/selectorDetail.ts","../src/services/selector-health/selectorKeys.ts","../src/services/selector-health/selectorList.ts","../src/services/selector-health/stateView.ts","../src/services/session/appCapability.ts","../src/services/session/nodeCreateCaps.ts","../src/services/session/sessionCredentials.ts","../src/services/session/sessionIdentity.ts","../src/services/session/shutdownReason.ts","../src/services/session/xenonOptions.ts","../src/services/settings/SelfHealingSwitch.ts","../src/services/settings/aiEngineSettings.ts","../src/services/settings/labSettings.ts","../src/services/telemetry/attributes.ts","../src/services/token/AppDownloadTicketService.ts","../src/services/token/JwtKeyService.ts","../src/services/token/StreamTicketService.ts","../src/services/token/mcpScopes.ts","../src/services/token/mcpTokenTtl.ts","../src/services/token/mintedLifetime.ts","../src/services/token/singleUseLedger.ts","../src/sessions/CloudSession.ts","../src/sessions/LocalSession.ts","../src/sessions/RemoteSession.ts","../src/sessions/SessionManager.ts","../src/sessions/XenonSession.ts","../src/sessions/appiumUmbrella.ts","../src/sessions/sessionMemory.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/appium-umbrella.ts","../test/helpers/artifact-store.ts","../test/helpers/container-registration.ts","../test/helpers/driver-log.ts","../test/helpers/expressRoutes.ts","../test/helpers/fake-adb.ts","../test/helpers/fake-ai-provider.ts","../test/helpers/fake-device-table.ts","../test/helpers/fake-http-proxy.ts","../test/helpers/fake-logcat.ts","../test/helpers/hub-node-pair.ts","../test/helpers/loki-stores.ts","../test/helpers/loopbackRequest.ts","../test/helpers/loopbackServer.ts","../test/helpers/otlp-probe.ts","../test/helpers/own-node-id.ts","../test/helpers/page-sources.ts","../test/helpers/scratch-database.ts","../test/helpers/scratch-port-leases.ts","../test/helpers/seedUser.ts","../test/helpers/selector-health-fixture.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/prisma-device-store-add-devices.spec.ts","../test/integration/prisma-device-store-team-filter.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-apps.spec.ts","../test/integration/team-visibility-control.spec.ts","../test/integration/team-visibility-dashboard.spec.ts","../test/integration/team-visibility-grid.spec.ts","../test/integration/team-visibility-leases.spec.ts","../test/integration/team-visibility-recordings.spec.ts","../test/integration/team-visibility-sessions.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/setup/scratch-default-database.js","../test/unit/AndroidDeviceManager.spec.ts","../test/unit/ApiKeyService.test.ts","../test/unit/AppDownloadTicketService.spec.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/access-scopes.spec.ts","../test/unit/active-recordings.spec.ts","../test/unit/aggregate-hotspots-session-scope.spec.ts","../test/unit/aggregate-hotspots-tuple-key.spec.ts","../test/unit/ai-call-time-limit.spec.ts","../test/unit/ai-engine-settings.spec.ts","../test/unit/ai-provider-switch.spec.ts","../test/unit/ai-rate-limit.spec.ts","../test/unit/android-adb-retry.spec.ts","../test/unit/android-clipboard.spec.ts","../test/unit/android-h264-config.spec.ts","../test/unit/android-h264-service.spec.ts","../test/unit/android-h264-viewers.spec.ts","../test/unit/android-identity.spec.ts","../test/unit/android-preview-hold.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/android-stream-reuse-service.spec.ts","../test/unit/android-stream-reuse.spec.ts","../test/unit/android-stream-stall-eof.spec.ts","../test/unit/annotation-image.spec.ts","../test/unit/annotation-render.spec.ts","../test/unit/api-error-handling.spec.ts","../test/unit/apikeys-router.spec.ts","../test/unit/apple-family.spec.ts","../test/unit/apple-identity.spec.ts","../test/unit/apps-download.spec.ts","../test/unit/apps-team-visibility.spec.ts","../test/unit/auth-disabled-resolution.spec.ts","../test/unit/auth-me-auth-disabled.test.ts","../test/unit/authMiddleware.appTicket.spec.ts","../test/unit/authMiddleware.bearer.spec.ts","../test/unit/authMiddleware.credentialLifetime.spec.ts","../test/unit/authMiddleware.mcpAudience.spec.ts","../test/unit/authMiddleware.streamTicket.spec.ts","../test/unit/authMiddleware.test.ts","../test/unit/boot-device-sync.spec.ts","../test/unit/boot-go-ios-reap.spec.ts","../test/unit/bootstrap-identity.test.ts","../test/unit/build-export.spec.ts","../test/unit/busy-precheck.spec.ts","../test/unit/cleanup-settings-db.spec.ts","../test/unit/cleanup-settings.spec.ts","../test/unit/cliargs-admin-only.spec.ts","../test/unit/clipboard-route.spec.ts","../test/unit/command-auth-appium-server.spec.ts","../test/unit/command-auth.spec.ts","../test/unit/command-caller.spec.ts","../test/unit/command-log-network-capture.spec.ts","../test/unit/commands.spec.js","../test/unit/composite-geometry.spec.ts","../test/unit/concurrency-gate.spec.ts","../test/unit/config.spec.js","../test/unit/container-registration.spec.ts","../test/unit/control-device-lookup.spec.ts","../test/unit/control-forward-decision.spec.ts","../test/unit/control-honest-answers.spec.ts","../test/unit/control-lookup-failure.spec.ts","../test/unit/create-error-message.spec.ts","../test/unit/create-handoff.spec.ts","../test/unit/dashboard-api-paths.spec.ts","../test/unit/dashboard-commands.spec.ts","../test/unit/dashboard-events-device-logs.spec.ts","../test/unit/dashboard-events-metrics.spec.ts","../test/unit/dashboard-events-team-scope.spec.ts","../test/unit/dashboard-plugin-link.spec.ts","../test/unit/database-check.spec.ts","../test/unit/default-plugin-args.spec.ts","../test/unit/device-access-guard.spec.ts","../test/unit/device-access-lease.spec.ts","../test/unit/device-access-policy.spec.ts","../test/unit/device-allocation-routes.spec.ts","../test/unit/device-columns.spec.ts","../test/unit/device-log-book.spec.ts","../test/unit/device-offline-webhook.spec.ts","../test/unit/device-service.spec.ts","../test/unit/device-setting-columns.spec.ts","../test/unit/device-settings-loki.spec.ts","../test/unit/device-settings-survive.spec.ts","../test/unit/device-store-clear-at-boot.spec.ts","../test/unit/device-sync-lost-update.spec.ts","../test/unit/device-team-guard.spec.ts","../test/unit/device-team-resolver.spec.ts","../test/unit/device-utils.spec.ts","../test/unit/display-state.spec.ts","../test/unit/emulator-boot.spec.ts","../test/unit/enable-dashboard-option.spec.ts","../test/unit/enrich-devices-team-names.test.ts","../test/unit/event-log-session-data.spec.ts","../test/unit/event-manager-regression-hook.spec.ts","../test/unit/extract-access-key-token-pair.test.ts","../test/unit/extract-team-cap.spec.ts","../test/unit/failure-analysis.spec.ts","../test/unit/failure-categories.spec.ts","../test/unit/failure-categorization.spec.ts","../test/unit/ffmpeg-path.spec.ts","../test/unit/fill-missing-screen-size.spec.ts","../test/unit/findAndLockDevice-leasemerge.spec.ts","../test/unit/fingerprint-identity.spec.ts","../test/unit/go-ios-version.spec.ts","../test/unit/grid-admin-only.spec.ts","../test/unit/h264-multiplexer.spec.ts","../test/unit/h264-nal-parser.spec.ts","../test/unit/h264-ws-frame.spec.ts","../test/unit/heal-report.spec.ts","../test/unit/healing-instrumentation.spec.ts","../test/unit/healing-no-cost.spec.ts","../test/unit/healing-state-endpoints.spec.ts","../test/unit/healing-tier-gate.spec.ts","../test/unit/healing-tiers-every-session.spec.ts","../test/unit/healing-trend.spec.ts","../test/unit/health-monitor-own-phones.spec.ts","../test/unit/health-monitor-stream-lookup.spec.ts","../test/unit/helpers.spec.ts","../test/unit/hub-boot-sweep-recovery.spec.ts","../test/unit/hub-create-once.spec.ts","../test/unit/hub-create-session-umbrella.spec.ts","../test/unit/hub-gateway-create-appium-server.spec.ts","../test/unit/hub-node-control-forward.spec.ts","../test/unit/hub-node-gateway-appium-server.spec.ts","../test/unit/hub-node-iphone-readiness.spec.ts","../test/unit/hub-node-race.spec.ts","../test/unit/hub-node-same-host.spec.ts","../test/unit/hub-node-session-device-logs.spec.ts","../test/unit/hub-node-session-metrics.spec.ts","../test/unit/hub-register-removal.spec.ts","../test/unit/hub-remote-session-heartbeat.spec.ts","../test/unit/hub-routed-session-recovery.spec.ts","../test/unit/hub-session-token.spec.ts","../test/unit/insert-before-routes.spec.ts","../test/unit/inspector-hierarchy.spec.ts","../test/unit/install-repository-app-team.spec.ts","../test/unit/install-scripts.spec.ts","../test/unit/interceptor-visual-elements.spec.ts","../test/unit/internal-call.spec.ts","../test/unit/internal-calls-session-record.spec.ts","../test/unit/ios-discovery-same-host.spec.ts","../test/unit/ios-driver-log.spec.ts","../test/unit/ios-go-ios-tunnel-env.spec.ts","../test/unit/ios-idle-hold.spec.ts","../test/unit/ios-no-network-fallback.spec.ts","../test/unit/ios-simulator-preview.spec.ts","../test/unit/ios-simulator-session-readiness.spec.ts","../test/unit/ios-simulator-session-teardown.spec.ts","../test/unit/ios-stream-appium-tunnel.spec.ts","../test/unit/ios-stream-port-leases.spec.ts","../test/unit/ios-stream-port.spec.ts","../test/unit/ios-tunnel-process.spec.ts","../test/unit/ios-tunnels.spec.ts","../test/unit/ios-usbmuxd-missing.spec.ts","../test/unit/ios-wda-status-identity.spec.ts","../test/unit/iosBattery.spec.ts","../test/unit/iosStreamDiagnostics.spec.ts","../test/unit/iphone-ipad-only.spec.ts","../test/unit/is-xenon-running.spec.ts","../test/unit/json-logging-option.spec.ts","../test/unit/lab-settings.spec.ts","../test/unit/lease-held-phone.spec.ts","../test/unit/logcat-multiplexer.spec.ts","../test/unit/logcat-parse.spec.ts","../test/unit/logcat-stream-service.spec.ts","../test/unit/logcat-ws.spec.ts","../test/unit/logger-json-levels.spec.ts","../test/unit/loginRateLimiter.test.ts","../test/unit/loopback-request.spec.ts","../test/unit/manualLock.test.ts","../test/unit/mark-node-busy-loki.spec.ts","../test/unit/max-sessions.spec.ts","../test/unit/mcp-token-ttl.spec.ts","../test/unit/mjpeg-proxy-cache.spec.ts","../test/unit/network-addresses.test.ts","../test/unit/node-create-caps.spec.ts","../test/unit/node-device-log-store.spec.ts","../test/unit/node-device-logs-collector.spec.ts","../test/unit/node-gateway-create-appium-server.spec.ts","../test/unit/node-hub-session-owner.spec.ts","../test/unit/node-metrics-collector.spec.ts","../test/unit/node-metrics-store.spec.ts","../test/unit/node-phone-control.spec.ts","../test/unit/node-recording-relay.spec.ts","../test/unit/node-session-device-logs-route.spec.ts","../test/unit/node-session-metrics-route.spec.ts","../test/unit/node-socket-relay.spec.ts","../test/unit/normalize-eol.spec.js","../test/unit/observability-example-loki.spec.ts","../test/unit/ocr-healing-tier-real-ocr.spec.ts","../test/unit/ocr-healing-tier.spec.ts","../test/unit/ocr-offline.spec.ts","../test/unit/ocr-text-match.spec.ts","../test/unit/omni-virtual-element-store.spec.ts","../test/unit/omni-vision-analyze-screen.spec.ts","../test/unit/omni-vision-failures.spec.ts","../test/unit/omni-vision-ios-points.spec.ts","../test/unit/omni-vision-tap-text.spec.ts","../test/unit/omni-vision.spec.ts","../test/unit/openapi-coverage.spec.ts","../test/unit/openapi-for-site.spec.ts","../test/unit/ostrace-parse.spec.ts","../test/unit/outbound-proxy.spec.ts","../test/unit/package-engines.spec.ts","../test/unit/package-resolver.spec.ts","../test/unit/partial-config-file.spec.ts","../test/unit/passwordResetMode.test.ts","../test/unit/plugin.spec.ts","../test/unit/port-allocator-os-probe.spec.ts","../test/unit/port-allocator-pairs.spec.ts","../test/unit/port-exhaustion.spec.ts","../test/unit/prisma.spec.ts","../test/unit/probe-duration.spec.ts","../test/unit/profile-router.test.ts","../test/unit/profileIdentity.spec.ts","../test/unit/proof-bundle.spec.ts","../test/unit/proxy-option.spec.ts","../test/unit/queue-requester.spec.ts","../test/unit/queue-team-scope-routes.spec.ts","../test/unit/queue-visibility.spec.ts","../test/unit/rateLimitMiddleware.test.ts","../test/unit/recording-cleanup.spec.ts","../test/unit/recording-downloads-visibility.spec.ts","../test/unit/recording-files.spec.ts","../test/unit/recording-instrumentation.spec.ts","../test/unit/recording-options.spec.ts","../test/unit/recording-orchestrator.spec.ts","../test/unit/recording-requests.spec.ts","../test/unit/recording-source-ended.spec.ts","../test/unit/recording-store.spec.ts","../test/unit/recording-summary.spec.ts","../test/unit/recording-timing.spec.ts","../test/unit/recordings-library-routes.spec.ts","../test/unit/recordings-write-visibility.spec.ts","../test/unit/remote-session-create.spec.ts","../test/unit/remux-to-standard-mp4.spec.ts","../test/unit/reservation-team-visibility.spec.ts","../test/unit/reset-link-address.spec.ts","../test/unit/reset-link.test.ts","../test/unit/resilio-path-healing.spec.ts","../test/unit/roleGuard.test.ts","../test/unit/run-migrations-database.spec.ts","../test/unit/run-migrations-fail-fast.test.ts","../test/unit/run-migrations.test.ts","../test/unit/schema-required-args.spec.ts","../test/unit/scrcpy-server-session.spec.ts","../test/unit/scrcpy-version.spec.ts","../test/unit/screenshot-route.spec.ts","../test/unit/selector-event-model.spec.ts","../test/unit/selector-health-actions.spec.ts","../test/unit/selector-health-detail.spec.ts","../test/unit/selector-health-list.spec.ts","../test/unit/selector-learning-every-session.spec.ts","../test/unit/selector-state-service.spec.ts","../test/unit/selector-verification-clean-build.spec.ts","../test/unit/selector-verification-job.spec.ts","../test/unit/selector-verification-missed-regression.spec.ts","../test/unit/selector-visibility-resolver.spec.ts","../test/unit/self-healing-boot.spec.ts","../test/unit/self-healing-setting.spec.ts","../test/unit/session-app-resolution.spec.ts","../test/unit/session-assets.spec.ts","../test/unit/session-attribution-wiring.spec.ts","../test/unit/session-create-credential-owner.spec.ts","../test/unit/session-create-layer.spec.ts","../test/unit/session-credential-strip.spec.ts","../test/unit/session-credentials.spec.ts","../test/unit/session-device-logs-hub-node.spec.ts","../test/unit/session-device-logs-ios.spec.ts","../test/unit/session-device-logs-lifecycle.spec.ts","../test/unit/session-device-logs.spec.ts","../test/unit/session-end-failure-analysis.spec.ts","../test/unit/session-failed-webhook.spec.ts","../test/unit/session-identity.spec.ts","../test/unit/session-list-insights.spec.ts","../test/unit/session-listing-auth.spec.ts","../test/unit/session-locator.spec.ts","../test/unit/session-log-indexes.spec.ts","../test/unit/session-metrics-lifecycle.spec.ts","../test/unit/session-metrics-parse.spec.ts","../test/unit/session-metrics-route.spec.ts","../test/unit/session-metrics-samplers.spec.ts","../test/unit/session-metrics-service.spec.ts","../test/unit/session-node-calls.spec.ts","../test/unit/session-owner-resolver.spec.ts","../test/unit/session-recovery-metrics.spec.ts","../test/unit/session-recovery-routing.spec.ts","../test/unit/session-upgrade-guard.spec.ts","../test/unit/session-visibility.spec.ts","../test/unit/shell-commands.spec.ts","../test/unit/shutdown-drain-remote.spec.ts","../test/unit/shutdown-sync-nets.spec.ts","../test/unit/single-flight.spec.ts","../test/unit/socket-team-scope.integration.spec.ts","../test/unit/socketServer.bearer.spec.ts","../test/unit/socketServer.scopedEmit.spec.ts","../test/unit/socketServer.sessionCookie.spec.ts","../test/unit/stored-session-capabilities.spec.ts","../test/unit/stream-leave-route.spec.ts","../test/unit/stream-leave.spec.ts","../test/unit/stream-own-device-row.spec.ts","../test/unit/stream-start-conflict.spec.ts","../test/unit/stream-start-pipelines.spec.ts","../test/unit/stream-status-type.spec.ts","../test/unit/stream-stop-ownership.spec.ts","../test/unit/stream-stop-recording.spec.ts","../test/unit/stream-ticket-identity.spec.ts","../test/unit/stream-viewer-hangup.spec.ts","../test/unit/stream-watchdog-timers.spec.ts","../test/unit/sync-dir.spec.ts","../test/unit/team-filter.test.ts","../test/unit/token-mint-limits.spec.ts","../test/unit/tracing-export-routing.spec.ts","../test/unit/tracing-service-init.spec.ts","../test/unit/tracing-session-spans.spec.ts","../test/unit/unexpected-shutdown-reason.spec.ts","../test/unit/upgrade-router.spec.ts","../test/unit/upload-install-route.spec.ts","../test/unit/userAuthorization.test.ts","../test/unit/users-router.test.ts","../test/unit/verify-credential.spec.ts","../test/unit/verify-locator.spec.ts","../test/unit/video-pipeline-args.spec.ts","../test/unit/video-pipeline-exit.spec.ts","../test/unit/video-pipeline-outputpath.spec.ts","../test/unit/vision-assertion.spec.ts","../test/unit/wda-cap-injection.spec.ts","../test/unit/wda-client-failures.spec.ts","../test/unit/wda-client-session.spec.ts","../test/unit/wda-client-shell.spec.ts","../test/unit/wda-clipboard-write.spec.ts","../test/unit/web-config-service.spec.ts","../test/unit/webdriver-info-route.spec.ts","../test/unit/webhook-delivery.spec.ts","../test/unit/webhook-payloads.spec.ts","../test/unit/ws-upgrade-routing-appium-server.spec.ts","../test/unit/xenon-execute-scripts.spec.ts","../test/unit/xenon-options.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/allocate-lease-branch.spec.ts","../test/unit/lease/buildCapabilityBag.spec.ts","../test/unit/lease/lease-device-match.spec.ts","../test/unit/lease/lease-override.spec.ts","../test/unit/lease/lease-reap-held-phone.spec.ts","../test/unit/lease/lease-session-ownership.spec.ts","../test/unit/lease/lease-sweeper-expiry.spec.ts","../test/unit/lease/lease-team-visibility.spec.ts","../test/unit/lease/lease-token-log-filter.spec.ts","../test/unit/lease/lease-token-oracle.spec.ts","../test/unit/lease/leaseToken.spec.ts","../test/unit/lease/nodePairAuth.spec.ts","../test/unit/lease/session-lease-proof.spec.ts","../test/unit/phone-network/boot-clean-up.spec.ts","../test/unit/phone-network/interceptor-options.spec.ts","../test/unit/phone-network/interceptor-proxy-restore.spec.ts","../test/unit/phone-network/network-conditioning.spec.ts","../test/unit/phone-network/phone-network-restore.spec.ts","../test/unit/phone-network/session-end-paths.spec.ts","../test/unit/phone-network/session-start.spec.ts","../test/unit/phone-network/xenon-proxy.spec.ts","../test/unit/ports/PortAllocatorService.spec.ts"],"version":"5.9.3"}