doc-detective 4.24.0 → 4.25.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 (31) hide show
  1. package/dist/common/src/schemas/schemas.json +2272 -242
  2. package/dist/common/src/types/generated/record_v3.d.ts +38 -5
  3. package/dist/common/src/types/generated/record_v3.d.ts.map +1 -1
  4. package/dist/common/src/types/generated/step_v3.d.ts +106 -73
  5. package/dist/common/src/types/generated/step_v3.d.ts.map +1 -1
  6. package/dist/common/src/types/generated/test_v3.d.ts +266 -200
  7. package/dist/common/src/types/generated/test_v3.d.ts.map +1 -1
  8. package/dist/core/tests/appSurface.d.ts.map +1 -1
  9. package/dist/core/tests/appSurface.js +52 -13
  10. package/dist/core/tests/appSurface.js.map +1 -1
  11. package/dist/core/tests/ffmpegRecorder.d.ts +29 -2
  12. package/dist/core/tests/ffmpegRecorder.d.ts.map +1 -1
  13. package/dist/core/tests/ffmpegRecorder.js +154 -8
  14. package/dist/core/tests/ffmpegRecorder.js.map +1 -1
  15. package/dist/core/tests/startRecording.d.ts +9 -1
  16. package/dist/core/tests/startRecording.d.ts.map +1 -1
  17. package/dist/core/tests/startRecording.js +187 -19
  18. package/dist/core/tests/startRecording.js.map +1 -1
  19. package/dist/core/tests/stopRecording.d.ts +8 -1
  20. package/dist/core/tests/stopRecording.d.ts.map +1 -1
  21. package/dist/core/tests/stopRecording.js +108 -3
  22. package/dist/core/tests/stopRecording.js.map +1 -1
  23. package/dist/core/tests.d.ts +2 -1
  24. package/dist/core/tests.d.ts.map +1 -1
  25. package/dist/core/tests.js +152 -16
  26. package/dist/core/tests.js.map +1 -1
  27. package/dist/hints/hints.d.ts.map +1 -1
  28. package/dist/hints/hints.js +7 -2
  29. package/dist/hints/hints.js.map +1 -1
  30. package/dist/index.cjs +2623 -283
  31. package/package.json +1 -1
@@ -2,11 +2,15 @@ import { validate } from "../../common/src/validate.js";
2
2
  import { log } from "../utils.js";
3
3
  import { syncHandles } from "./browserSurface.js";
4
4
  import { spawn } from "node:child_process";
5
+ import { randomUUID } from "node:crypto";
5
6
  import path from "node:path";
6
7
  import fs from "node:fs";
7
- import { getFfmpegPath, selectRecordingToStop, stopRecordTargetName, } from "./ffmpegRecorder.js";
8
+ import os from "node:os";
9
+ import { getFfmpegPath, selectRecordingToStop, stopRecordTargetName, deriveCropScale, detectDisplayPointSize, } from "./ffmpegRecorder.js";
8
10
  export { stopRecording };
9
- async function stopRecording({ config, step, driver }) {
11
+ // `deps` is a test seam for the pending-scale crop derivation (platform +
12
+ // display probe); production callers omit it.
13
+ async function stopRecording({ config, step, driver, deps = {}, }) {
10
14
  let result = {
11
15
  status: "PASS",
12
16
  description: "Stopped recording.",
@@ -84,6 +88,23 @@ async function stopRecording({ config, step, driver }) {
84
88
  if (idx !== -1)
85
89
  recordings.splice(idx, 1);
86
90
  };
91
+ // A pending device recording never actually started. If the late-start
92
+ // attempt errored, surface that as the FAIL; otherwise no app surface ever
93
+ // opened a device session — there's nothing to save.
94
+ if (recording.type === "appium-pending") {
95
+ dropHandle();
96
+ if (recording.startError) {
97
+ // An environment gap (missing host ffmpeg) is a gated SKIP; anything
98
+ // else is a real start failure.
99
+ result.status = recording.startSkip ? "SKIPPED" : "FAIL";
100
+ result.description = recording.startError;
101
+ return result;
102
+ }
103
+ result.status = "SKIPPED";
104
+ result.description =
105
+ "The device recording never started (no app surface opened a device session), so there is nothing to save.";
106
+ return result;
107
+ }
87
108
  try {
88
109
  if (recording.type === "MediaRecorder") {
89
110
  // Browser engine.
@@ -202,15 +223,99 @@ async function stopRecording({ config, step, driver }) {
202
223
  finish();
203
224
  });
204
225
  });
226
+ // Pending-scale crops (app windows, phase A7): the rect is in native
227
+ // driver units; scale it to capture pixels using the frame size parsed
228
+ // from the capture's stderr over the display's size in points. Any
229
+ // missing input degrades to scale 1 — correct on scale-1 displays, and
230
+ // the transcode's min/max expressions clamp the rest.
231
+ let crop = recording.crop ?? null;
232
+ if (!crop && recording.cropRect && recording.cropPendingScale) {
233
+ const platform = deps.platform ?? process.platform;
234
+ let scale = 1;
235
+ try {
236
+ const displayPointSize = platform === "darwin"
237
+ ? await (deps.detectDisplayPointSize ?? detectDisplayPointSize)()
238
+ : null;
239
+ scale = deriveCropScale({
240
+ platform,
241
+ frameSize: recording.captureInfo?.frameSize ?? null,
242
+ displayPointSize,
243
+ });
244
+ }
245
+ catch {
246
+ // A probe failure keeps the initial scale of 1 — today's behavior,
247
+ // correct on scale-1 displays.
248
+ }
249
+ crop = {
250
+ x: Math.round(recording.cropRect.x * scale),
251
+ y: Math.round(recording.cropRect.y * scale),
252
+ w: Math.round(recording.cropRect.w * scale),
253
+ h: Math.round(recording.cropRect.h * scale),
254
+ };
255
+ }
205
256
  await transcode({
206
257
  config,
207
258
  sourcePath: recording.tempPath,
208
259
  targetPath: recording.targetPath,
209
260
  deleteSource: true,
210
- crop: recording.crop,
261
+ crop,
211
262
  });
212
263
  dropHandle();
213
264
  }
265
+ else if (recording.type === "appium") {
266
+ // Device engine (phase A7): the whole video arrives base64 from the
267
+ // driver (adb screenrecord / simctl). Write it out; non-mp4 targets go
268
+ // through the shared transcode (which also applies the gif scale
269
+ // filter). No crop — the device frame IS the content.
270
+ const b64 = await recording.driver.stopRecordingScreen();
271
+ if (typeof b64 !== "string" || b64.length === 0) {
272
+ result.status = "FAIL";
273
+ result.description =
274
+ "The device recording returned no data; nothing was saved.";
275
+ dropHandle();
276
+ return result;
277
+ }
278
+ // The whole video arrives in one base64 string; a very long recording
279
+ // (the drivers cap at 30 minutes) can make this allocation fail. Name
280
+ // the cause instead of surfacing a bare out-of-memory error.
281
+ // Buffer.from(…, "base64") is permissive — characters outside the
282
+ // alphabet are dropped — so an invalid payload can decode to zero bytes
283
+ // without throwing. An empty decode is "no data", not a valid video.
284
+ let buffer;
285
+ try {
286
+ buffer = Buffer.from(b64, "base64");
287
+ }
288
+ catch (error) {
289
+ result.status = "FAIL";
290
+ result.description = `Couldn't buffer the device recording (${Math.round(b64.length / 1024 / 1024)} MB base64) — device recordings transfer in one payload, so long recordings can exhaust memory. Keep device recordings short (they cap at 30 minutes). ${error?.message ?? error}`;
291
+ dropHandle();
292
+ return result;
293
+ }
294
+ if (buffer.length === 0) {
295
+ result.status = "FAIL";
296
+ result.description =
297
+ "The device recording decoded to an empty payload (no data); nothing was saved.";
298
+ dropHandle();
299
+ return result;
300
+ }
301
+ if (path.extname(recording.targetPath) === ".mp4") {
302
+ fs.writeFileSync(recording.targetPath, buffer);
303
+ }
304
+ else {
305
+ const tempDir = path.join(os.tmpdir(), "doc-detective", "recordings");
306
+ if (!fs.existsSync(tempDir))
307
+ fs.mkdirSync(tempDir, { recursive: true });
308
+ const tempPath = path.join(tempDir, `device-${randomUUID().slice(0, 8)}.mp4`);
309
+ fs.writeFileSync(tempPath, buffer);
310
+ await transcode({
311
+ config,
312
+ sourcePath: tempPath,
313
+ targetPath: recording.targetPath,
314
+ deleteSource: true,
315
+ });
316
+ }
317
+ dropHandle();
318
+ }
214
319
  }
215
320
  catch (error) {
216
321
  // Couldn't stop recording
@@ -1 +1 @@
1
- {"version":3,"file":"stopRecording.js","sourceRoot":"","sources":["../../../src/core/tests/stopRecording.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stopRecording.js","sourceRoot":"","sources":["../../../src/core/tests/stopRecording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,0EAA0E;AAC1E,8CAA8C;AAC9C,KAAK,UAAU,aAAa,CAAC,EAC3B,MAAM,EACN,IAAI,EACJ,MAAM,EACN,IAAI,GAAG,EAAE,GASV;IACC,IAAI,MAAM,GAAQ;QAChB,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,oBAAoB;KAClC,CAAC;IAEF,wEAAwE;IACxE,uEAAuE;IACvE,+CAA+C;IAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,MAAM,CAAC,WAAW,GAAG,4BAA4B,WAAW,CAAC,MAAM,EAAE,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8EAA8E;IAC9E,8EAA8E;IAC9E,uEAAuE;IACvE,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,MAAM,CAAC,WAAW,GAAG,iDAAiD,CAAC;QACvE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,2EAA2E;IAC3E,0EAA0E;IAC1E,yEAAyE;IACzE,8DAA8D;IAC9D,IAAI,UAAU,GAAU,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC;QAC9D,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU;QACzB,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,SAAS,GAAG,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;QACjE,gBAAgB,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI;KAC3C,CAAC,CAAC;IACH,yEAAyE;IACzE,wEAAwE;IACxE,yEAAyE;IACzE,0DAA0D;IAC1D,IAAI,CAAC,SAAS,IAAI,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACnE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;gBAAE,SAAS;YACtC,MAAM,iBAAiB,GAAU,KAAK,CAAC,OAAO,CAC5C,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAChC;gBACC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU;gBAC/B,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,KAAK,GAAG,qBAAqB,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,EAAE;gBACtE,gBAAgB,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI;aAC3C,CAAC,CAAC;YACH,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBACtB,UAAU,GAAG,iBAAiB,CAAC;gBAC/B,SAAS,GAAG,KAAK,CAAC;gBAClB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,WAAW,GAAG,8BAA8B,MAAM,IAAI,CAAC;QAChE,CAAC;aAAM,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,0EAA0E;YAC1E,6EAA6E;YAC7E,MAAM,CAAC,WAAW,GAAG,kIAAkI,CAAC;QAC1J,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,WAAW,GAAG,0BAA0B,CAAC;QAClD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,6EAA6E;IAC7E,uEAAuE;IACvE,8CAA8C;IAC9C,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,uEAAuE;IACvE,2EAA2E;IAC3E,qDAAqD;IACrD,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACxC,UAAU,EAAE,CAAC;QACb,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YACzB,qEAAqE;YACrE,gCAAgC;YAChC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;YACzD,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC;YAC1C,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,MAAM,CAAC,WAAW;YAChB,2GAA2G,CAAC;QAC9G,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,IAAI,SAAS,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACvC,kBAAkB;YAElB,wEAAwE;YACxE,mDAAmD;YACnD,IAAI,SAAS,GAAkB,IAAI,CAAC;YACpC,IAAI,CAAC;gBACH,SAAS,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,kDAAkD;YACpD,CAAC;YACD,MAAM,gBAAgB,GAAG,CAAC,SAAmB,EAAE,EAAE,CAC/C,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAExE,yEAAyE;YACzE,yEAAyE;YACzE,sEAAsE;YACtE,mEAAmE;YACnE,wEAAwE;YACxE,qBAAqB;YACrB,MAAM,+BAA+B,GAAG,KAAK,IAAI,EAAE;gBACjD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACnD,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC3B,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,GAAG,CACnC,CAAC;gBACF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,MAAM,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAClE,CAAC;gBACD,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC,CAAC;YAEF,0BAA0B;YAC1B,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAE3C,+CAA+C;YAC/C,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC/C,OAAO,OAAQ,MAAc,CAAC,QAAQ,KAAK,WAAW,IAAK,MAAc,CAAC,QAAQ,KAAK,IAAI,CAAC;YAC9F,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,MAAM,CAAC,WAAW;oBAChB,+FAA+F,CAAC;gBAClG,MAAM,+BAA+B,EAAE,CAAC;gBACxC,UAAU,EAAE,CAAC;gBACb,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,iBAAiB;YACjB,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;gBACvB,MAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClC,CAAC,CAAC,CAAC;YACH,yEAAyE;YACzE,oEAAoE;YACpE,qEAAqE;YACrE,2DAA2D;YAC3D,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,MAAM,CAAC,WAAW,GAAG,+BAA+B,CAAC;gBACrD,mEAAmE;gBACnE,qEAAqE;gBACrE,uCAAuC;gBACvC,MAAM,+BAA+B,EAAE,CAAC;gBACxC,mEAAmE;gBACnE,gEAAgE;gBAChE,UAAU,EAAE,CAAC;gBACb,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,mEAAmE;YACnE,MAAM,+BAA+B,EAAE,CAAC;YAExC,gEAAgE;YAChE,MAAM,SAAS,CAAC;gBACd,MAAM;gBACN,UAAU,EAAE,SAAS,CAAC,YAAY;gBAClC,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YACH,UAAU,EAAE,CAAC;QACf,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvC,wEAAwE;YACxE,wEAAwE;YACxE,yEAAyE;YACzE,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC;YAC/B,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,mEAAmE;gBACnE,sDAAsD;gBACtD,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;oBACvD,OAAO,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBACD,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,MAAM,MAAM,GAAG,GAAG,EAAE;oBAClB,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,GAAG,IAAI,CAAC;wBACf,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,CAAC;gBACF,uEAAuE;gBACvE,uCAAuC;gBACvC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;oBAChC,IAAI,CAAC;wBACH,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACvB,CAAC;oBAAC,MAAM,CAAC;wBACP,YAAY;oBACd,CAAC;oBACD,qEAAqE;oBACrE,0CAA0C;oBAC1C,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC3B,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;oBACtB,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,MAAM,EAAE,CAAC;gBACX,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,qEAAqE;YACrE,uEAAuE;YACvE,mEAAmE;YACnE,uEAAuE;YACvE,sDAAsD;YACtD,IAAI,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC;YAClC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;gBAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;gBACnD,IAAI,KAAK,GAAG,CAAC,CAAC;gBACd,IAAI,CAAC;oBACH,MAAM,gBAAgB,GACpB,QAAQ,KAAK,QAAQ;wBACnB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,IAAI,sBAAsB,CAAC,EAAE;wBACjE,CAAC,CAAC,IAAI,CAAC;oBACX,KAAK,GAAG,eAAe,CAAC;wBACtB,QAAQ;wBACR,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE,SAAS,IAAI,IAAI;wBACnD,gBAAgB;qBACjB,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,mEAAmE;oBACnE,+BAA+B;gBACjC,CAAC;gBACD,IAAI,GAAG;oBACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC;oBAC3C,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC;oBAC3C,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC;oBAC3C,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC;iBAC5C,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,CAAC;gBACd,MAAM;gBACN,UAAU,EAAE,SAAS,CAAC,QAAQ;gBAC9B,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,YAAY,EAAE,IAAI;gBAClB,IAAI;aACL,CAAC,CAAC;YACH,UAAU,EAAE,CAAC;QACf,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvC,oEAAoE;YACpE,uEAAuE;YACvE,iEAAiE;YACjE,sDAAsD;YACtD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACzD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,MAAM,CAAC,WAAW;oBAChB,2DAA2D,CAAC;gBAC9D,UAAU,EAAE,CAAC;gBACb,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,sEAAsE;YACtE,sEAAsE;YACtE,6DAA6D;YAC7D,kEAAkE;YAClE,wEAAwE;YACxE,qEAAqE;YACrE,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,MAAM,CAAC,WAAW,GAAG,yCAAyC,IAAI,CAAC,KAAK,CACtE,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CACzB,0JAA0J,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC;gBACrL,UAAU,EAAE,CAAC;gBACb,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,MAAM,CAAC,WAAW;oBAChB,gFAAgF,CAAC;gBACnF,UAAU,EAAE,CAAC;gBACb,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;gBAClD,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;gBACtE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;oBAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,OAAO,EACP,UAAU,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CACzC,CAAC;gBACF,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACnC,MAAM,SAAS,CAAC;oBACd,MAAM;oBACN,UAAU,EAAE,QAAQ;oBACpB,UAAU,EAAE,SAAS,CAAC,UAAU;oBAChC,YAAY,EAAE,IAAI;iBACnB,CAAC,CAAC;YACL,CAAC;YACD,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0BAA0B;QAC1B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,MAAM,CAAC,WAAW,GAAG,4BAA4B,KAAK,EAAE,CAAC;QACzD,qEAAqE;QACrE,sBAAsB;QACtB,UAAU,EAAE,CAAC;QACb,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;IACP,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,uEAAuE;AACvE,0EAA0E;AAC1E,0EAA0E;AAC1E,KAAK,UAAU,SAAS,CAAC,EACvB,MAAM,EACN,UAAU,EACV,UAAU,EACV,YAAY,EACZ,IAAI,GAOL;IACC,wEAAwE;IACxE,4EAA4E;IAC5E,kEAAkE;IAClE,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,IAAI,EAAE,CAAC;QACT,yEAAyE;QACzE,wEAAwE;QACxE,uEAAuE;QACvE,yEAAyE;QACzE,MAAM,EAAE,GAAG,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC;QACjC,MAAM,EAAE,GAAG,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC;QACjC,MAAM,EAAE,GAAG,eAAe,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC;QAChD,MAAM,EAAE,GAAG,eAAe,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,yEAAyE;QACzE,yEAAyE;QACzE,6EAA6E;QAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC5C,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YAC7B,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,KAAK;aACF,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACpB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,IAAI,YAAY,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;oBAC9C,IAAI,CAAC;wBACH,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;oBAC5B,CAAC;oBAAC,MAAM,CAAC;wBACP,YAAY;oBACd,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,6BAA6B,UAAU,EAAE,CAAC,CAAC;gBAChE,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CACJ,IAAI,KAAK,CAAC,2BAA2B,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CACpE,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;aACD,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,KAAK,UAAU,iBAAiB,CAC9B,QAAgB,EAChB,UAAkB;IAElB,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,wBAAwB;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;QACd,IAAI,CAAC;YACH,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,CAAC,CAAC,CAAC;QACZ,CAAC;QACD,oEAAoE;QACpE,4DAA4D;QAC5D,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,WAAW,EAAE,CAAC;YACd,IAAI,WAAW,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,0EAA0E;IAC1E,4EAA4E;IAC5E,uCAAuC;IACvC,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { type BrowserAssetName } from "../runtime/browsers.js";
2
2
  import { type AppSessionState } from "./tests/appSurface.js";
3
- export { runSpecs, runViaApi, getRunner, ensureChromeAvailable, ensureContextBrowserInstalled, combinationKey, warmUpDecision, selectWarmUpTargets, getDriverCapabilities, getDefaultBrowser, buildFallbackCandidates, driverSkipDiagnostic, resolveBrowserFallbackPolicy, shouldRepairBeforeFallback, isSupportedContext, contextRequirementsSkipMessage, resolveAutoScreenshot, resolveAutoRecord, buildAutoRecordStep, specIsRouted, killTree, jobDisplayResources, };
3
+ export { runSpecs, runViaApi, getRunner, ensureChromeAvailable, ensureContextBrowserInstalled, combinationKey, warmUpDecision, selectWarmUpTargets, getDriverCapabilities, withChromedriverPort, getDefaultBrowser, buildFallbackCandidates, driverSkipDiagnostic, resolveBrowserFallbackPolicy, shouldRepairBeforeFallback, isSupportedContext, contextRequirementsSkipMessage, resolveAutoScreenshot, resolveAutoRecord, buildAutoRecordStep, specIsRouted, killTree, jobDisplayResources, };
4
4
  declare function killTree(pid?: number, timeoutMs?: number): Promise<void>;
5
5
  /**
6
6
  * Stable identity for a "context combination" — the platform + browser pairing
@@ -25,6 +25,7 @@ declare function getDriverCapabilities({ runnerDetails, name, options }: {
25
25
  name: any;
26
26
  options: any;
27
27
  }): any;
28
+ declare function withChromedriverPort(capabilities: any, port: number): any;
28
29
  declare function jobDisplayResources(job: any, ctx: {
29
30
  platform: string;
30
31
  xvfbAvailable: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"tests.d.ts","sourceRoot":"","sources":["../../src/core/tests.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tests.d.ts","sourceRoot":"","sources":["../../src/core/tests.ts"],"names":[],"mappings":"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"}
@@ -26,7 +26,7 @@ import { wait } from "./tests/wait.js";
26
26
  import { saveScreenshot } from "./tests/saveScreenshot.js";
27
27
  import { startRecording } from "./tests/startRecording.js";
28
28
  import { stopRecording } from "./tests/stopRecording.js";
29
- import { browserCaptureTitle, browserDownloadDir, coerceRecordContextBrowser, jobIsFfmpegRecording, computeEffectiveConcurrency, jobExclusiveResources, checkSystemBinary, xvfbDisplay, startXvfb, XVFB_SCREEN_SIZE, isRecordingActive, recordStepName, detectRecordingNameConflict, } from "./tests/ffmpegRecorder.js";
29
+ import { browserCaptureTitle, browserDownloadDir, coerceRecordContextBrowser, jobIsFfmpegRecording, computeEffectiveConcurrency, jobExclusiveResources, checkSystemBinary, xvfbDisplay, startXvfb, XVFB_SCREEN_SIZE, isRecordingActive, recordStepName, detectRecordingNameConflict, getFfmpegPath, ffmpegPathEnv, } from "./tests/ffmpegRecorder.js";
30
30
  import { loadVariables } from "./tests/loadVariables.js";
31
31
  import { saveCookie } from "./tests/saveCookie.js";
32
32
  import { loadCookie } from "./tests/loadCookie.js";
@@ -58,7 +58,7 @@ import http from "node:http";
58
58
  import https from "node:https";
59
59
  import { fileURLToPath } from "node:url";
60
60
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
61
- export { runSpecs, runViaApi, getRunner, ensureChromeAvailable, ensureContextBrowserInstalled, combinationKey, warmUpDecision, selectWarmUpTargets, getDriverCapabilities, getDefaultBrowser, buildFallbackCandidates, driverSkipDiagnostic, resolveBrowserFallbackPolicy, shouldRepairBeforeFallback, isSupportedContext, contextRequirementsSkipMessage, resolveAutoScreenshot, resolveAutoRecord, buildAutoRecordStep, specIsRouted, killTree, jobDisplayResources, };
61
+ export { runSpecs, runViaApi, getRunner, ensureChromeAvailable, ensureContextBrowserInstalled, combinationKey, warmUpDecision, selectWarmUpTargets, getDriverCapabilities, withChromedriverPort, getDefaultBrowser, buildFallbackCandidates, driverSkipDiagnostic, resolveBrowserFallbackPolicy, shouldRepairBeforeFallback, isSupportedContext, contextRequirementsSkipMessage, resolveAutoScreenshot, resolveAutoRecord, buildAutoRecordStep, specIsRouted, killTree, jobDisplayResources, };
62
62
  // exports.appiumStart = appiumStart;
63
63
  // exports.appiumIsReady = appiumIsReady;
64
64
  // exports.driverStart = driverStart;
@@ -270,6 +270,26 @@ function getDriverCapabilities({ runnerDetails, name, options }) {
270
270
  }
271
271
  return capabilities;
272
272
  }
273
+ // Bind a Chromium (chromedriver-backed) session to a specific chromedriver
274
+ // port. appium-chromium-driver hands `chromedriverPort` straight to
275
+ // appium-chromedriver; when it is undefined, appium-chromedriver falls back to
276
+ // its fixed DEFAULT_PORT (9515). Two concurrent browser contexts (own Appium
277
+ // server each, from the pool) then both spawn chromedriver on 9515 — one binds,
278
+ // the other's connection is REFUSED, surfacing later as a mid-session
279
+ // `ECONNREFUSED 127.0.0.1:9515` when a command proxies to the wrong/dead
280
+ // chromedriver (ADR 01039). Assigning a unique free port per session removes the
281
+ // collision. Gecko/Safari are unaffected — geckodriver auto-selects a free
282
+ // `systemPort` from a range, and Safari has no such port — so this only touches
283
+ // Chromium caps, leaving every other engine's caps byte-identical. An explicit
284
+ // `appium:chromedriverPort` (a caller opting into a fixed port) is preserved.
285
+ function withChromedriverPort(capabilities, port) {
286
+ if (!capabilities ||
287
+ capabilities["appium:automationName"] !== "Chromium" ||
288
+ capabilities["appium:chromedriverPort"] !== undefined) {
289
+ return capabilities;
290
+ }
291
+ return { ...capabilities, "appium:chromedriverPort": port };
292
+ }
273
293
  function isDriverRequired({ test }) {
274
294
  let driverRequired = false;
275
295
  // The resolved shape doesn't guarantee `steps` — treat a stepless test or
@@ -283,6 +303,14 @@ function isDriverRequired({ test }) {
283
303
  });
284
304
  return driverRequired;
285
305
  }
306
+ // Non-android platforms whose native app surface is driven by a shared,
307
+ // per-host Appium driver server (macOS Mac2, Windows NovaWindows, iOS/xcuitest
308
+ // simulator). Two concurrent sessions against one of these clobber the shared
309
+ // server, so app-driver contexts on these platforms serialize on the
310
+ // "native-app-driver" resource. Mirrors the non-android keys of
311
+ // APP_DRIVER_PLATFORMS in tests/appSurface.ts; android is excluded because it
312
+ // already has its own "android-emulator" bound.
313
+ const NATIVE_APP_DRIVER_PLATFORMS = ["mac", "windows", "ios"];
286
314
  // The exclusive resources a context job must hold to run safely under
287
315
  // concurrency. A shared-display ffmpeg recording holds "display" exclusively
288
316
  // (jobExclusiveResources). And once ANY such recording is in the run
@@ -310,14 +338,77 @@ function jobDisplayResources(job, ctx) {
310
338
  hasBrowserStep: isBrowserRequired({ test: job.context }),
311
339
  hasAppStep: isAppDriverRequired({ test: job.context }),
312
340
  }).action === "proceed";
313
- const extra = attemptsEmulator ? ["android-emulator"] : [];
314
- if (base.length || extra.length)
315
- return [...new Set([...base, ...extra])];
316
- if (ctx.runHasDisplayRecording &&
317
- isDriverRequired({ test: { steps: job.context?.steps } })) {
318
- return ["display"];
319
- }
320
- return [];
341
+ // Non-android native app-driver contexts share a per-host driver stack that
342
+ // two concurrent sessions clobber (a proxied step fails because the driver
343
+ // "process is not running (probably crashed)" / "Session does not exist" /
344
+ // ECONNREFUSED to WebDriverAgent on :8100). Serialize them against each other
345
+ // on one exclusive resource the non-android sibling of the android-emulator
346
+ // bound (extending ADR 01001 the way ADR 01025 did for emulators). Android
347
+ // already has its own bound above, so it's excluded here (never double-tagged).
348
+ //
349
+ // Which contexts contend depends on the platform:
350
+ // - macOS Mac2 / Windows: only contexts that drive a NATIVE APP contend —
351
+ // the driver launches the app under test, but a plain desktop browser
352
+ // (firefox/chrome) uses a separate browser session and must STILL
353
+ // parallelize. So these require isAppDriverRequired.
354
+ // - iOS: the single per-host iOS simulator + WebDriverAgent is shared by
355
+ // BOTH native-app (xcuitest) AND mobile-web (Safari-on-sim) contexts, so
356
+ // two of EITHER kind clobber each other. So an ios context contends
357
+ // whether or not it has an app step (mobile-web-ios failed the same way
358
+ // apps-ios did under concurrency).
359
+ // As with attemptsEmulator, the context must also clear the mobile browser
360
+ // gate, so a context that deterministically SKIPs/FAILs (mixed app+web on
361
+ // mobile, unsupported browser, device-fixed config) boots nothing and never
362
+ // needlessly serializes other jobs.
363
+ const platform = job.context?.platform;
364
+ const contendsForNativeDriver = platform === "ios"
365
+ ? true // any ios context boots the shared simulator (app OR web)
366
+ : isAppDriverRequired({ test: job.context }); // mac/windows: app only
367
+ // The mobileBrowserGate check only makes sense on MOBILE targets (ios/android):
368
+ // it SKIPs a context that deterministically won't boot the shared driver
369
+ // (mixed native-app + device-browser, unsupported/misconfigured mobile
370
+ // browser). On DESKTOP (mac/windows) there is no device browser to mix with, so
371
+ // the gate must NOT run: a desktop app context that also RECORDS carries
372
+ // `record`/`stopRecord` steps (BROWSER_STEP_KEYS) whose non-object payloads
373
+ // aren't app-targeting, so isBrowserRequired reports a "browser step" and the
374
+ // gate would wrongly SKIP — dropping the native-app-driver bound and letting a
375
+ // recording app context run concurrently with another native app context,
376
+ // clobbering the single per-host Mac2 / NovaWindows driver. Desktop app
377
+ // contexts always boot that driver, so they always contend. (ADR 01040.)
378
+ const isMobileTarget = platform === "ios" || platform === "android";
379
+ const gateProceeds = !isMobileTarget ||
380
+ mobileBrowserGate({
381
+ platform,
382
+ browser: job.context?.browser,
383
+ hasBrowserStep: isBrowserRequired({ test: job.context }),
384
+ hasAppStep: isAppDriverRequired({ test: job.context }),
385
+ }).action === "proceed";
386
+ const attemptsNativeAppDriver = platform !== "android" &&
387
+ NATIVE_APP_DRIVER_PLATFORMS.includes(platform) &&
388
+ contendsForNativeDriver &&
389
+ gateProceeds;
390
+ const extra = [
391
+ ...(attemptsEmulator ? ["android-emulator"] : []),
392
+ ...(attemptsNativeAppDriver ? ["native-app-driver"] : []),
393
+ ];
394
+ // A run-wide shared-display recording promotes every driver context onto the
395
+ // "display" resource so its ffmpeg capture doesn't include their windows.
396
+ // This composes with the native-app-driver bound above — a native app
397
+ // context in such a run holds BOTH (e.g. ["native-app-driver","display"]).
398
+ // Android emulator contexts are exempt: an emulator renders off the host
399
+ // display, so it neither pollutes a screen capture nor needs the display
400
+ // mutex (it stays on "android-emulator" only, as before).
401
+ const displayPromotion = !attemptsEmulator &&
402
+ ctx.runHasDisplayRecording &&
403
+ isDriverRequired({ test: { steps: job.context?.steps } })
404
+ ? ["display"]
405
+ : [];
406
+ // Order the union driver-bound first (native-app-driver / android-emulator),
407
+ // then the display resource — whether "display" arrived via `base` (this job's
408
+ // own ffmpeg recording) or `displayPromotion` (a recording elsewhere in the
409
+ // run). This keeps the canonical `["native-app-driver", "display"]` shape
410
+ // stable regardless of which path added the display bound.
411
+ return [...new Set([...extra, ...base, ...displayPromotion])];
321
412
  }
322
413
  // Check if context is supported by current platform and available apps
323
414
  function isSupportedContext({ context, apps, platform }) {
@@ -2307,7 +2398,16 @@ function buildAutoRecordStep({ config, spec, test, context, }) {
2307
2398
  const contextSegment = capPathSegment(sanitizeFilesystemName(String(context.contextId ?? ""), "context"));
2308
2399
  const recordPath = path.join(runDir, "specs", capPathSegment(sanitizeFilesystemName(String(spec.specId ?? ""), "spec")), "tests", capPathSegment(sanitizeFilesystemName(String(test.testId ?? ""), "test")), "contexts", contextSegment, "recordings", `${contextSegment}.mp4`);
2309
2400
  return {
2310
- record: { path: recordPath, overwrite: "true", engine: "ffmpeg" },
2401
+ // Mobile-target contexts record the device screen through the app driver
2402
+ // (the internal device plan, resolved from the platform) — pinning ffmpeg
2403
+ // there would host-capture the emulator window, or nothing when headless.
2404
+ record: {
2405
+ path: recordPath,
2406
+ overwrite: "true",
2407
+ ...(isMobileTargetPlatform(context?.platform)
2408
+ ? {}
2409
+ : { engine: "ffmpeg" }),
2410
+ },
2311
2411
  description: "Automatic full-context recording",
2312
2412
  stepId: `${sanitizeFilesystemName(String(test.testId ?? ""), "test")}~autorecord`,
2313
2413
  // Internal marker — the runStep record dispatch flags the started handle as
@@ -3622,6 +3722,7 @@ async function runStep({ config = {}, context = {}, step, driver, metaValues = {
3622
3722
  step: step,
3623
3723
  driver: driver,
3624
3724
  recordingHost,
3725
+ appSession,
3625
3726
  });
3626
3727
  // Push the started recording onto the per-context stack so several can
3627
3728
  // overlap. Carry the step's `id`/`name` so a later stopRecord can target
@@ -3649,11 +3750,16 @@ async function runStep({ config = {}, context = {}, step, driver, metaValues = {
3649
3750
  handle.name = handle.name ?? recordStepName(step.record);
3650
3751
  if (step.__autoRecord) {
3651
3752
  handle.synthetic = true;
3652
- // App-only context: no window exists yet to crop to. Mark the handle
3653
- // so the first app surface to open late-binds its window rect as the
3654
- // crop (startAppSurface), scoping the capture to the app under test.
3655
- if (!driver && appSession)
3753
+ // Desktop app-only context: no window exists yet to crop to. Mark the
3754
+ // handle so the first app surface to open late-binds its window rect
3755
+ // as the crop (startAppSurface), scoping the capture to the app under
3756
+ // test. Mobile contexts don't crop — their pending handles late-START
3757
+ // the device recording instead (appium-pending).
3758
+ if (!driver &&
3759
+ appSession &&
3760
+ !isMobileTargetPlatform(context?.platform)) {
3656
3761
  handle.pendingAppWindowCrop = true;
3762
+ }
3657
3763
  }
3658
3764
  recordingHost.state.recordings.push(handle);
3659
3765
  }
@@ -3700,6 +3806,24 @@ async function runStep({ config = {}, context = {}, step, driver, metaValues = {
3700
3806
  env.ANDROID_HOME = appSession.androidSdkRoot;
3701
3807
  env.ANDROID_SDK_ROOT = appSession.androidSdkRoot;
3702
3808
  }
3809
+ // iOS device recording: the XCUITest driver's
3810
+ // startRecordingScreen shells out to a bare `ffmpeg` on the
3811
+ // server's PATH for encoding, and hosted runners don't reliably
3812
+ // ship one. Put the bundled @ffmpeg-installer binary's directory
3813
+ // first. Best-effort — the session must start even when the
3814
+ // ffmpeg install isn't available (recording then SKIPs with
3815
+ // guidance).
3816
+ if (isMobileTargetPlatform(context?.platform) === "ios") {
3817
+ try {
3818
+ const ffmpegPath = await getFfmpegPath({
3819
+ cacheDir: config?.cacheDir,
3820
+ });
3821
+ Object.assign(env, ffmpegPathEnv(ffmpegPath));
3822
+ }
3823
+ catch {
3824
+ /* best-effort */
3825
+ }
3826
+ }
3703
3827
  const server = await startAppiumServer(appiumEntry, config, undefined, env);
3704
3828
  return { port: server.port, process: server.process };
3705
3829
  },
@@ -3897,13 +4021,25 @@ async function driverStart(capabilities, port, maxAttempts = 4, ctx = {}) {
3897
4021
  let lastError;
3898
4022
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
3899
4023
  try {
4024
+ // Chromium sessions get a unique free chromedriver port so concurrent
4025
+ // browser contexts never collide on chromedriver's fixed default (9515);
4026
+ // see withChromedriverPort (ADR 01039). A FRESH port is allocated per
4027
+ // attempt so a retryable ECONNREFUSED — the very rebind-race the Appium
4028
+ // path already retries — moves to a new free port instead of re-racing
4029
+ // the same one. Only Chromium caps need a port; every other engine skips
4030
+ // the allocation and keeps a byte-identical wdio.remote payload.
4031
+ const needsChromedriverPort = capabilities?.["appium:automationName"] === "Chromium" &&
4032
+ capabilities?.["appium:chromedriverPort"] === undefined;
4033
+ const attemptCaps = needsChromedriverPort
4034
+ ? withChromedriverPort(capabilities, await findFreePort())
4035
+ : capabilities;
3900
4036
  const driver = await wdio.remote({
3901
4037
  protocol: "http",
3902
4038
  hostname: "127.0.0.1",
3903
4039
  port,
3904
4040
  path: "/",
3905
4041
  logLevel: "error",
3906
- capabilities,
4042
+ capabilities: attemptCaps,
3907
4043
  connectionRetryTimeout: startupCeiling,
3908
4044
  waitforTimeout: 120000, // 2 minutes
3909
4045
  });