@e2edev/e2e 0.6.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -11
- package/dist/agent/act-validation.d.ts +9 -3
- package/dist/agent/act-validation.d.ts.map +1 -1
- package/dist/agent/act-validation.js +23 -4
- package/dist/agent/act-validation.js.map +1 -1
- package/dist/agent/act.d.ts +2 -2
- package/dist/agent/act.d.ts.map +1 -1
- package/dist/agent/act.js +231 -41
- package/dist/agent/act.js.map +1 -1
- package/dist/agent/actions.d.ts +14 -14
- package/dist/agent/actions.d.ts.map +1 -1
- package/dist/agent/actions.js +12 -2
- package/dist/agent/actions.js.map +1 -1
- package/dist/agent/default-agent.d.ts +1 -1
- package/dist/agent/default-agent.d.ts.map +1 -1
- package/dist/agent/default-agent.js +19 -84
- package/dist/agent/default-agent.js.map +1 -1
- package/dist/agent/executor.d.ts +14 -0
- package/dist/agent/executor.d.ts.map +1 -1
- package/dist/agent/executor.js.map +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +14 -6
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/invocation.d.ts +1 -8
- package/dist/agent/invocation.d.ts.map +1 -1
- package/dist/agent/invocation.js +7 -51
- package/dist/agent/invocation.js.map +1 -1
- package/dist/agent/ledger.d.ts.map +1 -1
- package/dist/agent/ledger.js +10 -1
- package/dist/agent/ledger.js.map +1 -1
- package/dist/agent/loop-guards.d.ts +21 -0
- package/dist/agent/loop-guards.d.ts.map +1 -1
- package/dist/agent/loop-guards.js +48 -0
- package/dist/agent/loop-guards.js.map +1 -1
- package/dist/agent/model/sdk.d.ts +18 -0
- package/dist/agent/model/sdk.d.ts.map +1 -1
- package/dist/agent/model/sdk.js +10 -4
- package/dist/agent/model/sdk.js.map +1 -1
- package/dist/agent/observation-budget.d.ts +27 -0
- package/dist/agent/observation-budget.d.ts.map +1 -0
- package/dist/agent/observation-budget.js +43 -0
- package/dist/agent/observation-budget.js.map +1 -0
- package/dist/agent/observation.d.ts +40 -7
- package/dist/agent/observation.d.ts.map +1 -1
- package/dist/agent/observation.js +56 -11
- package/dist/agent/observation.js.map +1 -1
- package/dist/agent/phases.d.ts +1 -1
- package/dist/agent/phases.d.ts.map +1 -1
- package/dist/agent/phases.js +11 -13
- package/dist/agent/phases.js.map +1 -1
- package/dist/agent/primitives.d.ts +14 -2
- package/dist/agent/primitives.d.ts.map +1 -1
- package/dist/agent/primitives.js +98 -54
- package/dist/agent/primitives.js.map +1 -1
- package/dist/agent/screen-update.d.ts +47 -0
- package/dist/agent/screen-update.d.ts.map +1 -0
- package/dist/agent/screen-update.js +222 -0
- package/dist/agent/screen-update.js.map +1 -0
- package/dist/agent/step-cache.d.ts +46 -18
- package/dist/agent/step-cache.d.ts.map +1 -1
- package/dist/agent/step-cache.js +100 -60
- package/dist/agent/step-cache.js.map +1 -1
- package/dist/agent/tool-loop.d.ts.map +1 -1
- package/dist/agent/tool-loop.js +28 -4
- package/dist/agent/tool-loop.js.map +1 -1
- package/dist/cache/anchors.d.ts.map +1 -1
- package/dist/cache/anchors.js +21 -1
- package/dist/cache/anchors.js.map +1 -1
- package/dist/cache/decide.d.ts +13 -3
- package/dist/cache/decide.d.ts.map +1 -1
- package/dist/cache/decide.js +35 -0
- package/dist/cache/decide.js.map +1 -1
- package/dist/cache/relocate.d.ts +11 -1
- package/dist/cache/relocate.d.ts.map +1 -1
- package/dist/cache/relocate.js +48 -17
- package/dist/cache/relocate.js.map +1 -1
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +3 -14
- package/dist/cache/store.js.map +1 -1
- package/dist/cache/trace.d.ts +12 -0
- package/dist/cache/trace.d.ts.map +1 -1
- package/dist/cache/trace.js +21 -0
- package/dist/cache/trace.js.map +1 -1
- package/dist/cli/docs-url.d.ts +1 -1
- package/dist/cli/docs-url.d.ts.map +1 -1
- package/dist/cli/docs-url.js +1 -1
- package/dist/cli/docs-url.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +60 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/engines.d.ts +2 -3
- package/dist/cli/init/engines.d.ts.map +1 -1
- package/dist/cli/init/engines.js +3 -4
- package/dist/cli/init/engines.js.map +1 -1
- package/dist/cli/init/scaffold.d.ts.map +1 -1
- package/dist/cli/init/scaffold.js +2 -0
- package/dist/cli/init/scaffold.js.map +1 -1
- package/dist/cli/signals.d.ts +3 -3
- package/dist/cli/signals.js +3 -3
- package/dist/cli/telemetry.d.ts +12 -0
- package/dist/cli/telemetry.d.ts.map +1 -0
- package/dist/cli/telemetry.js +40 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/collect/select.d.ts +2 -0
- package/dist/collect/select.d.ts.map +1 -1
- package/dist/collect/select.js +15 -11
- package/dist/collect/select.js.map +1 -1
- package/dist/config/agent.d.ts +6 -2
- package/dist/config/agent.d.ts.map +1 -1
- package/dist/config/agent.js +30 -3
- package/dist/config/agent.js.map +1 -1
- package/dist/config/diagnose.d.ts.map +1 -1
- package/dist/config/diagnose.js +1 -0
- package/dist/config/diagnose.js.map +1 -1
- package/dist/config/load.d.ts +2 -2
- package/dist/config/load.js +2 -2
- package/dist/config/resolve.d.ts +16 -4
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +107 -44
- package/dist/config/resolve.js.map +1 -1
- package/dist/engine/contract.d.ts +6 -1
- package/dist/engine/contract.d.ts.map +1 -1
- package/dist/engine/contract.js.map +1 -1
- package/dist/engine/index.d.ts +61 -6
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +25 -5
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/session.d.ts.map +1 -1
- package/dist/engine/session.js +6 -0
- package/dist/engine/session.js.map +1 -1
- package/dist/engine/surface.d.ts +6 -2
- package/dist/engine/surface.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/ai-trace.d.ts +1 -5
- package/dist/internal/ai-trace.d.ts.map +1 -1
- package/dist/internal/ai-trace.js +82 -11
- package/dist/internal/ai-trace.js.map +1 -1
- package/dist/internal/atomic-write.d.ts +17 -0
- package/dist/internal/atomic-write.d.ts.map +1 -0
- package/dist/internal/atomic-write.js +44 -0
- package/dist/internal/atomic-write.js.map +1 -0
- package/dist/internal/env.d.ts +6 -0
- package/dist/internal/env.d.ts.map +1 -0
- package/dist/internal/env.js +12 -0
- package/dist/internal/env.js.map +1 -0
- package/dist/internal/options.d.ts +9 -0
- package/dist/internal/options.d.ts.map +1 -0
- package/dist/internal/options.js +27 -0
- package/dist/internal/options.js.map +1 -0
- package/dist/locator/expression.js +1 -1
- package/dist/locator/expression.js.map +1 -1
- package/dist/locator/screen.d.ts.map +1 -1
- package/dist/locator/screen.js +4 -2
- package/dist/locator/screen.js.map +1 -1
- package/dist/report/build.d.ts +2 -1
- package/dist/report/build.d.ts.map +1 -1
- package/dist/report/build.js +11 -4
- package/dist/report/build.js.map +1 -1
- package/dist/report/list-model.d.ts +14 -5
- package/dist/report/list-model.d.ts.map +1 -1
- package/dist/report/list.d.ts +59 -5
- package/dist/report/list.d.ts.map +1 -1
- package/dist/report/list.js +171 -31
- package/dist/report/list.js.map +1 -1
- package/dist/report/running-tree.d.ts +7 -6
- package/dist/report/running-tree.d.ts.map +1 -1
- package/dist/report/running-tree.js +13 -8
- package/dist/report/running-tree.js.map +1 -1
- package/dist/report/write.d.ts +1 -1
- package/dist/report/write.d.ts.map +1 -1
- package/dist/report/write.js +3 -6
- package/dist/report/write.js.map +1 -1
- package/dist/run/artifacts.d.ts.map +1 -1
- package/dist/run/artifacts.js +20 -2
- package/dist/run/artifacts.js.map +1 -1
- package/dist/run/events.d.ts +73 -15
- package/dist/run/events.d.ts.map +1 -1
- package/dist/run/events.js +7 -7
- package/dist/run/events.js.map +1 -1
- package/dist/run/execute.d.ts +31 -5
- package/dist/run/execute.d.ts.map +1 -1
- package/dist/run/execute.js +73 -25
- package/dist/run/execute.js.map +1 -1
- package/dist/run/fixtures.d.ts +9 -1
- package/dist/run/fixtures.d.ts.map +1 -1
- package/dist/run/fixtures.js +5 -4
- package/dist/run/fixtures.js.map +1 -1
- package/dist/run/in-process.d.ts +1 -1
- package/dist/run/in-process.d.ts.map +1 -1
- package/dist/run/in-process.js +6 -3
- package/dist/run/in-process.js.map +1 -1
- package/dist/run/managed-process.d.ts +8 -2
- package/dist/run/managed-process.d.ts.map +1 -1
- package/dist/run/managed-process.js +12 -0
- package/dist/run/managed-process.js.map +1 -1
- package/dist/run/records.d.ts +15 -1
- package/dist/run/records.d.ts.map +1 -1
- package/dist/run/runner.d.ts +16 -7
- package/dist/run/runner.d.ts.map +1 -1
- package/dist/run/runner.js +182 -98
- package/dist/run/runner.js.map +1 -1
- package/dist/run/scheduler.d.ts +6 -6
- package/dist/run/scheduler.d.ts.map +1 -1
- package/dist/run/scheduler.js +54 -23
- package/dist/run/scheduler.js.map +1 -1
- package/dist/run/serial.d.ts +2 -4
- package/dist/run/serial.d.ts.map +1 -1
- package/dist/run/serial.js +4 -2
- package/dist/run/serial.js.map +1 -1
- package/dist/run/sessions.d.ts.map +1 -1
- package/dist/run/sessions.js +3 -4
- package/dist/run/sessions.js.map +1 -1
- package/dist/run/steps.d.ts +28 -1
- package/dist/run/steps.d.ts.map +1 -1
- package/dist/run/steps.js +14 -0
- package/dist/run/steps.js.map +1 -1
- package/dist/run/unit-runner.d.ts +7 -2
- package/dist/run/unit-runner.d.ts.map +1 -1
- package/dist/run/units.d.ts +8 -0
- package/dist/run/units.d.ts.map +1 -1
- package/dist/run/units.js +11 -0
- package/dist/run/units.js.map +1 -1
- package/dist/run/worker/entry.js +1 -0
- package/dist/run/worker/entry.js.map +1 -1
- package/dist/run/worker/handle.d.ts +1 -1
- package/dist/run/worker/handle.d.ts.map +1 -1
- package/dist/run/worker/handle.js +1 -1
- package/dist/run/worker/handle.js.map +1 -1
- package/dist/run/worker/protocol.d.ts +12 -1
- package/dist/run/worker/protocol.d.ts.map +1 -1
- package/dist/run/worker/protocol.js.map +1 -1
- package/dist/run/worker/session.d.ts +2 -0
- package/dist/run/worker/session.d.ts.map +1 -1
- package/dist/run/worker/session.js +5 -0
- package/dist/run/worker/session.js.map +1 -1
- package/dist/run/worker-models.d.ts +27 -0
- package/dist/run/worker-models.d.ts.map +1 -0
- package/dist/run/worker-models.js +49 -0
- package/dist/run/worker-models.js.map +1 -0
- package/dist/telemetry/environment.d.ts +33 -0
- package/dist/telemetry/environment.d.ts.map +1 -0
- package/dist/telemetry/environment.js +96 -0
- package/dist/telemetry/environment.js.map +1 -0
- package/dist/telemetry/events.d.ts +25 -0
- package/dist/telemetry/events.d.ts.map +1 -0
- package/dist/telemetry/events.js +107 -0
- package/dist/telemetry/events.js.map +1 -0
- package/dist/telemetry/posthog.d.ts +31 -0
- package/dist/telemetry/posthog.d.ts.map +1 -0
- package/dist/telemetry/posthog.js +29 -0
- package/dist/telemetry/posthog.js.map +1 -0
- package/dist/telemetry/project.d.ts +18 -0
- package/dist/telemetry/project.d.ts.map +1 -0
- package/dist/telemetry/project.js +55 -0
- package/dist/telemetry/project.js.map +1 -0
- package/dist/telemetry/store.d.ts +53 -0
- package/dist/telemetry/store.d.ts.map +1 -0
- package/dist/telemetry/store.js +153 -0
- package/dist/telemetry/store.js.map +1 -0
- package/dist/telemetry/telemetry.d.ts +89 -0
- package/dist/telemetry/telemetry.d.ts.map +1 -0
- package/dist/telemetry/telemetry.js +187 -0
- package/dist/telemetry/telemetry.js.map +1 -0
- package/dist/types.d.ts +103 -38
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -6
- package/skills/e2e/SKILL.md +0 -2
- package/skills/e2e/references/agent.md +33 -15
- package/skills/e2e/references/debugging.md +4 -2
- package/skills/e2e/references/running.md +7 -5
- package/skills/e2e/references/setup.md +16 -10
- package/skills/e2e/references/writing-tests.md +6 -5
- package/dist/internal/trace.d.ts +0 -18
- package/dist/internal/trace.d.ts.map +0 -1
- package/dist/internal/trace.js +0 -46
- package/dist/internal/trace.js.map +0 -1
- package/dist/run/public.d.ts +0 -19
- package/dist/run/public.d.ts.map +0 -1
- package/dist/run/public.js +0 -11
- package/dist/run/public.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managed-process.d.ts","sourceRoot":"","sources":["../../src/run/managed-process.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAKrG,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA4BjD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAqBD
|
|
1
|
+
{"version":3,"file":"managed-process.d.ts","sourceRoot":"","sources":["../../src/run/managed-process.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAKrG,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA4BjD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAqBD;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,6FAA6F;IAC7F,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/E;AAED;;;;GAIG;AACH,qBAAa,cAAc;IAKvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IARxB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,cAAc,CAAS;IAE/B,YACmB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,EACpB,KAAK,GAAE,mBAAwB,EAC9C;IAEJ,0GAA0G;IAC1G,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED;;;;;;;;;;;;;OAaG;IACG,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/C;IAED,6EAA6E;YAC/D,MAAM;IA6GpB;;;;;OAKG;IACH,OAAO,CAAC,OAAO;IAef,gHAAgH;IAC1G,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB1B;CACF;AAED;;;;GAIG;AACH,qBAAa,YAAY;IAOrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IARxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGf;IAET,YACmB,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,mBAAwB,EAC9C;IAEJ;;;OAGG;IACG,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAe/C;IAED;;;;;;OAMG;IACG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7D;CACF"}
|
|
@@ -92,6 +92,18 @@ export class ManagedProcess {
|
|
|
92
92
|
* The probe spends from the same `startupTimeout` budget as the wait.
|
|
93
93
|
*/
|
|
94
94
|
async start(signal) {
|
|
95
|
+
// A function, not a narrowed local: the signal flips while `launch` awaits.
|
|
96
|
+
const aborted = () => signal?.aborted === true;
|
|
97
|
+
if (aborted())
|
|
98
|
+
return;
|
|
99
|
+
const startedAt = Date.now();
|
|
100
|
+
this.hooks.starting?.(this.label);
|
|
101
|
+
await this.launch(signal);
|
|
102
|
+
if (!aborted())
|
|
103
|
+
this.hooks.ready?.(this.label, Date.now() - startedAt, this.reusedExisting);
|
|
104
|
+
}
|
|
105
|
+
/** The preflight probe, the spawn, and the readiness wait behind `start`. */
|
|
106
|
+
async launch(signal) {
|
|
95
107
|
// A function, not a narrowed local: the signal flips while the loop awaits.
|
|
96
108
|
const aborted = () => signal?.aborted === true;
|
|
97
109
|
if (aborted())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managed-process.js","sourceRoot":"","sources":["../../src/run/managed-process.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAErG,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG5C,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,CAAU,CAAC;AAElG,qGAAqG;AACrG,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,sGAAsG;AACtG,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAErC,iGAAiG;AACjG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAgB,CAAC;AAErC;;;GAGG;AACH,SAAS,kBAAkB,CAAC,KAAmB,EAAE,MAAsB;IACrE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO;IAC9B,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;;YACxD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB;IACtC,KAAK,MAAM,KAAK,IAAI,IAAI;QAAE,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC;AAOD,SAAS,YAAY,CAAC,IAAgB;IACpC,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC;AACnG,CAAC;AAED,uFAAuF;AACvF,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,SAAiB;IACnD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClG,OAAO,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"managed-process.js","sourceRoot":"","sources":["../../src/run/managed-process.ts"],"names":[],"mappings":"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"}
|
package/dist/run/records.d.ts
CHANGED
|
@@ -19,7 +19,21 @@ export interface ArtifactRecord {
|
|
|
19
19
|
sha256?: string;
|
|
20
20
|
/** The configured `ArtifactStore`'s reference for this artifact, when one accepted it. */
|
|
21
21
|
ref?: string;
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* When a time-based artifact began recording: a video segment's first frame
|
|
24
|
+
* is at or just after this instant, so `step.startedAt - artifact.startedAt`
|
|
25
|
+
* is the step's offset into it.
|
|
26
|
+
*/
|
|
27
|
+
startedAt?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Mirrors report-1: how much of the file the runner masked. Screenshots and
|
|
30
|
+
* traces are `complete`; a video is `incomplete`, since a recording masks
|
|
31
|
+
* nothing (a secure field renders its own dots, but anything else the
|
|
32
|
+
* screen showed is in the frames), and is kept as it is. report-1 also
|
|
33
|
+
* admits an `incomplete` artifact without a `path`, one its producer
|
|
34
|
+
* withheld; this runner never writes one.
|
|
35
|
+
*/
|
|
36
|
+
redaction: 'complete' | 'not-required' | 'incomplete';
|
|
23
37
|
producer: ArtifactProducer;
|
|
24
38
|
}
|
|
25
39
|
export interface AttemptRecord {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/run/records.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAEtF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/run/records.ts"],"names":[],"mappings":"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"}
|
package/dist/run/runner.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Run orchestration: config, collection, selection, execution, reporting. */
|
|
2
2
|
import { type Report1Document } from '../report/build.ts';
|
|
3
|
-
import { type RunEventSink, type RunExitCode } from './events.ts';
|
|
3
|
+
import { type RunEventSink, type RunExitCode, type RunStatus } from './events.ts';
|
|
4
4
|
import type { ResultRecord } from './records.ts';
|
|
5
5
|
import type { E2EConfig } from '../types.ts';
|
|
6
6
|
export interface RunOptions {
|
|
@@ -23,13 +23,21 @@ export interface RunOptions {
|
|
|
23
23
|
/** Records every model call to `.e2e/ai-trace.json` (`--ai-trace`). */
|
|
24
24
|
aiTrace?: boolean | undefined;
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
|
|
26
|
+
* Records a video of every attempt (`--video`), on top of the configured
|
|
27
|
+
* artifact kinds. The engine must be able to record; one that cannot fails
|
|
28
|
+
* the run with `UNSUPPORTED_ARTIFACT` before any test starts.
|
|
29
|
+
*/
|
|
30
|
+
video?: boolean | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* A config value instead of a discovered file, for the test harness. May
|
|
33
|
+
* hold live values (executors, engine handles, model instances, cache
|
|
34
|
+
* stores, secret providers), which cannot cross a process boundary, so the
|
|
35
|
+
* run executes in-process on one worker.
|
|
30
36
|
*/
|
|
31
37
|
rawConfig?: E2EConfig | undefined;
|
|
38
|
+
/** The environment the run resolves against, instead of `process.env`. */
|
|
32
39
|
env?: NodeJS.ProcessEnv | undefined;
|
|
40
|
+
/** Suppresses the list reporter. */
|
|
33
41
|
quiet?: boolean | undefined;
|
|
34
42
|
/** Cancellation: the running test ends, its teardown runs, the run finishes as `interrupted`. */
|
|
35
43
|
interruptSignal?: AbortSignal | undefined;
|
|
@@ -40,7 +48,7 @@ export interface RunOptions {
|
|
|
40
48
|
* the CLI's Ctrl-C ladder (`cli/signals.ts`) feeds these two.
|
|
41
49
|
*/
|
|
42
50
|
forceSignal?: AbortSignal | undefined;
|
|
43
|
-
/**
|
|
51
|
+
/** A second sink on the run's event spine, beside the list reporter. */
|
|
44
52
|
onEvent?: RunEventSink | undefined;
|
|
45
53
|
}
|
|
46
54
|
/** The selection flags of `run`, without anything that would start a process. */
|
|
@@ -67,7 +75,8 @@ export declare function list(options?: ListOptions): Promise<{
|
|
|
67
75
|
}>;
|
|
68
76
|
export interface RunOutcome {
|
|
69
77
|
exitCode: RunExitCode;
|
|
70
|
-
status
|
|
78
|
+
/** The same status `report.run.status` and the `run-finished` event carry. */
|
|
79
|
+
status: RunStatus;
|
|
71
80
|
report: Report1Document;
|
|
72
81
|
reportPath: string | undefined;
|
|
73
82
|
/** Where the JUnit XML was written; undefined unless the `junit` reporter was selected. */
|
package/dist/run/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/run/runner.ts"],"names":[],"mappings":"AAAA,8EAA8E;AA4B9E,OAAO,EAA+B,KAAK,eAAe,EAAyB,MAAM,oBAAoB,CAAC;AAM9G,OAAO,EAAwC,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/run/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/run/runner.js
CHANGED
|
@@ -3,7 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import { discoverConfig, loadConfigModule, missingConfigError } from '../config/load.js';
|
|
4
4
|
import { isCiMode, resolveConfig, } from '../config/resolve.js';
|
|
5
5
|
import { collect } from '../collect/collect.js';
|
|
6
|
-
import { select } from '../collect/select.js';
|
|
6
|
+
import { select, selectTargets } from '../collect/select.js';
|
|
7
7
|
import { classifyError, combineExitCodes, ConfigurationError, E2EError, errorMessage, exitCodeForCategory, serializeError, translateProvisioningError, } from '../internal/errors.js';
|
|
8
8
|
import { loadAiSdk } from '../agent/ai-sdk.js';
|
|
9
9
|
import { AiTraceCollector, AiTraceRecorder, registerAiTraceRecorder } from '../internal/ai-trace.js';
|
|
@@ -18,6 +18,7 @@ import { ManagedProcess, ServiceStack } from './managed-process.js';
|
|
|
18
18
|
import { createRunEventEmitter, toEventResult } from './events.js';
|
|
19
19
|
import { inProcessSpawner } from './in-process.js';
|
|
20
20
|
import { runUnits } from './scheduler.js';
|
|
21
|
+
import { buildWorkPlans, plannedSlots } from './units.js';
|
|
21
22
|
import { SessionStore } from './sessions.js';
|
|
22
23
|
import { childProcessSpawner } from './worker/handle.js';
|
|
23
24
|
import { setCredentialRegistry } from '../credentials.js';
|
|
@@ -62,7 +63,13 @@ export async function run(options = {}) {
|
|
|
62
63
|
const cwd = options.cwd ?? process.cwd();
|
|
63
64
|
const env = options.env ?? process.env;
|
|
64
65
|
const runId = uuidv7();
|
|
65
|
-
|
|
66
|
+
/**
|
|
67
|
+
* When the run began executing: taken again right before `plan`, once
|
|
68
|
+
* collection and provisioning are done, so a first-run download is never
|
|
69
|
+
* part of the reported span. A run that fails before then keeps its launch
|
|
70
|
+
* time, and the span is the time it took to fail.
|
|
71
|
+
*/
|
|
72
|
+
let startedAt = timestamp();
|
|
66
73
|
const debug = new DebugTrace(options.debug === true);
|
|
67
74
|
const aiTrace = options.aiTrace === true ? new AiTraceCollector() : undefined;
|
|
68
75
|
/** The in-process recorder; child-process workers own their own. */
|
|
@@ -89,15 +96,16 @@ export async function run(options = {}) {
|
|
|
89
96
|
cli.reporters = options.reporters;
|
|
90
97
|
if (options.noCache === true)
|
|
91
98
|
cli.cache = 'off';
|
|
99
|
+
if (options.video === true)
|
|
100
|
+
cli.video = true;
|
|
92
101
|
// Config resolves before anything is emitted, and its failure is kept rather
|
|
93
102
|
// than thrown: the reporter set is config truth (CLI overrides merge during
|
|
94
103
|
// resolution), so the emitter below is built exactly once from the set
|
|
95
104
|
// actually in force. When config itself failed, the CLI's own value is the
|
|
96
105
|
// best available, and the failure still renders through it.
|
|
97
106
|
const loaded = await debug.time('config.load', () => loadRunConfig(options, cwd, env, cli)).then((config) => ({ config, error: undefined }), (cause) => ({ config: undefined, error: classifyError(cause) }));
|
|
98
|
-
// The event stream is the run's single spine: the list reporter is
|
|
99
|
-
//
|
|
100
|
-
// different stories.
|
|
107
|
+
// The event stream is the run's single spine: the list reporter is one sink
|
|
108
|
+
// on it, beside any other, so every consumer sees the same story.
|
|
101
109
|
const reporters = loaded.config?.reporters ?? options.reporters ?? ['list'];
|
|
102
110
|
const emit = createRunEventEmitter([
|
|
103
111
|
options.quiet === true || !reporters.includes('list') ? undefined : new ListReporter().handle,
|
|
@@ -114,6 +122,20 @@ export async function run(options = {}) {
|
|
|
114
122
|
const recordFailure = (cause, phase) => {
|
|
115
123
|
recordRunError({ error: serializeError(classifyError(cause), phase === undefined ? {} : { phase }) });
|
|
116
124
|
};
|
|
125
|
+
/**
|
|
126
|
+
* A worker's run-level configuration failure stops the run through the
|
|
127
|
+
* interrupt signal, recorded once: workers that meet the same failure in
|
|
128
|
+
* parallel report the one already on the way out. The work it cuts short is
|
|
129
|
+
* interrupted, but the run is not: its exit code is the error's, not 130.
|
|
130
|
+
*/
|
|
131
|
+
let runAborted = false;
|
|
132
|
+
const abortRun = (runError) => {
|
|
133
|
+
if (runAborted)
|
|
134
|
+
return;
|
|
135
|
+
runAborted = true;
|
|
136
|
+
recordRunError(runError);
|
|
137
|
+
interruptController.abort();
|
|
138
|
+
};
|
|
117
139
|
/**
|
|
118
140
|
* The exit code is a fold over run state — every result, every run error,
|
|
119
141
|
* the interrupt — never threaded through by hand. A run error recorded
|
|
@@ -124,7 +146,7 @@ export async function run(options = {}) {
|
|
|
124
146
|
...resultExitCodes(results),
|
|
125
147
|
...runErrors.map((runError) => exitCodeForCategory(runError.error.category)),
|
|
126
148
|
...(interruptController.signal.aborted ? [130] : []),
|
|
127
|
-
]);
|
|
149
|
+
].filter((code) => code !== 130 || !runAborted));
|
|
128
150
|
const buildRunReport = (exitCode) => buildReport({
|
|
129
151
|
runId,
|
|
130
152
|
config: loaded.config,
|
|
@@ -214,8 +236,11 @@ export async function run(options = {}) {
|
|
|
214
236
|
reportPath = await writeCanonicalReport(loaded.config, runErrors.length === recorded ? document : buildRunReport(currentExitCode()));
|
|
215
237
|
}
|
|
216
238
|
const exitCode = currentExitCode();
|
|
217
|
-
const status = statusOf(exitCode);
|
|
218
239
|
const report = buildRunReport(exitCode);
|
|
240
|
+
// Read back from the report rather than recomputed: the report derives
|
|
241
|
+
// `blocked` from the results, and the outcome and the event must agree
|
|
242
|
+
// with the file a host reads afterwards.
|
|
243
|
+
const status = report.run.status;
|
|
219
244
|
setCredentialRegistry(undefined);
|
|
220
245
|
emit({
|
|
221
246
|
type: 'run-finished',
|
|
@@ -245,74 +270,84 @@ export async function run(options = {}) {
|
|
|
245
270
|
runId,
|
|
246
271
|
projectId: config.projectId,
|
|
247
272
|
projectRoot: config.projectRoot,
|
|
273
|
+
artifactsRoot: resolveArtifactsRoot(config, options.artifactsDir),
|
|
248
274
|
ci: isCiMode(env),
|
|
249
275
|
targets: config.targets.map((target) => target.name),
|
|
250
|
-
...(config.agent.model === undefined
|
|
251
|
-
|
|
252
|
-
: { model: `${config.agent.model.provider}/${config.agent.model.id}` }),
|
|
276
|
+
...(config.agent.model === undefined ? {} : { model: modelName(config.agent.model) }),
|
|
277
|
+
...(config.agent.visionModel === undefined ? {} : { visionModel: modelName(config.agent.visionModel) }),
|
|
253
278
|
});
|
|
254
279
|
const executeRun = async () => {
|
|
255
280
|
const interrupted = interruptController.signal;
|
|
256
|
-
//
|
|
257
|
-
//
|
|
258
|
-
// across targets (two browsers on one dev server share one process), and
|
|
259
|
-
// every service is ready before the first app command starts. Nothing
|
|
260
|
-
// spawns once the run was interrupted. A reused process or an ignored
|
|
261
|
-
// `reuseExisting` narrates as a run notice.
|
|
262
|
-
const processHooks = {
|
|
263
|
-
ci: isCiMode(env),
|
|
264
|
-
notice: (message) => emit({ type: 'notice', target: 'app', message }),
|
|
265
|
-
};
|
|
266
|
-
const declared = declaredProcesses(config.targets);
|
|
267
|
-
if (declared.services.length > 0) {
|
|
268
|
-
const stack = new ServiceStack(declared.services, config.projectRoot, processHooks);
|
|
269
|
-
services = stack;
|
|
270
|
-
await debug.time('app.services.start', () => stack.start(interrupted));
|
|
271
|
-
if (interrupted.aborted)
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
for (const { label, command, readyUrl } of declared.commands) {
|
|
275
|
-
const app = new ManagedProcess(label, command, config.projectRoot, { readyUrl }, processHooks);
|
|
276
|
-
appProcesses.push(app);
|
|
277
|
-
await debug.time(`app.start(${label})`, () => app.start(interrupted));
|
|
278
|
-
if (interrupted.aborted)
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
// A run cancelled before any test could start collects nothing: the
|
|
282
|
-
// interrupt alone decides the outcome.
|
|
281
|
+
// A run cancelled before it began collects nothing: the interrupt alone
|
|
282
|
+
// decides the outcome.
|
|
283
283
|
if (interrupted.aborted)
|
|
284
284
|
return;
|
|
285
|
+
// Which targets the run is for, settled before anything is collected,
|
|
286
|
+
// downloaded, or started: an unknown --target is a collection failure.
|
|
287
|
+
let targets;
|
|
288
|
+
try {
|
|
289
|
+
targets = selectTargets(config.targets, options.targetIds);
|
|
290
|
+
}
|
|
291
|
+
catch (cause) {
|
|
292
|
+
recordFailure(cause, 'collection');
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
// Each selected engine declares the app it drives: the dependency
|
|
296
|
+
// processes it needs and the command that starts it. Declarations are
|
|
297
|
+
// deduplicated across targets (two browsers on one dev server share one
|
|
298
|
+
// process) and checked for consistency here, first; the processes start
|
|
299
|
+
// only after the plan, and only for the selected targets.
|
|
300
|
+
const declared = declaredProcesses(targets);
|
|
301
|
+
/**
|
|
302
|
+
* Narrates and times one setup step on the event spine. A step that
|
|
303
|
+
* throws ends as a run error, and a step the interrupt cut short reports
|
|
304
|
+
* nothing more; either way no `finished` follows.
|
|
305
|
+
*/
|
|
306
|
+
const setupStep = async (step, work) => {
|
|
307
|
+
emit({ type: 'setup', step, state: 'started' });
|
|
308
|
+
const startedMs = Date.now();
|
|
309
|
+
const result = await work();
|
|
310
|
+
if (!interrupted.aborted)
|
|
311
|
+
emit({ type: 'setup', step, state: 'finished', durationMs: Date.now() - startedMs });
|
|
312
|
+
return result;
|
|
313
|
+
};
|
|
314
|
+
// Collection comes first and starts no process: a collection failure or
|
|
315
|
+
// NO_TESTS is reported before any dev server boots or browser downloads.
|
|
285
316
|
let planned;
|
|
286
317
|
try {
|
|
287
|
-
planned = await debug.time('collect', async () => {
|
|
318
|
+
planned = await setupStep({ kind: 'collect' }, () => debug.time('collect', async () => {
|
|
288
319
|
const collection = await collect(config, options.files);
|
|
289
320
|
const selection = select(collection, config, selectionFilters(options), options.passWithNoTests !== undefined ? { passWithNoTests: options.passWithNoTests } : {});
|
|
290
321
|
return { collection, selection };
|
|
291
|
-
});
|
|
322
|
+
}));
|
|
292
323
|
}
|
|
293
324
|
catch (cause) {
|
|
294
325
|
recordFailure(cause, 'collection');
|
|
295
326
|
return;
|
|
296
327
|
}
|
|
297
328
|
const { collection, selection } = planned;
|
|
298
|
-
emit({ type: 'plan', total: selection.pairs.length, files: plannedFiles(selection) });
|
|
299
|
-
const artifactsRoot = resolveArtifactsRoot(config, options.artifactsDir);
|
|
300
|
-
const sessionsRoot = path.join(config.projectRoot, '.e2e', 'sessions');
|
|
301
|
-
const store = SessionStore.create(runId, sessionsRoot);
|
|
302
|
-
sessionStore = store;
|
|
303
329
|
// Pre-flight: grade every selected target from its engine declaration
|
|
304
330
|
// before any worker starts, so a config that asks for more than the
|
|
305
331
|
// engine offers fails here, once, instead of inside a launch budget.
|
|
306
332
|
for (const { target } of selection.perTarget) {
|
|
307
333
|
targetProvenance.set(target.name, validateEngine(target, config));
|
|
308
334
|
}
|
|
335
|
+
// The work units, built once: the same plans tell each engine's `prepare`
|
|
336
|
+
// how many worker slots to provision and the scheduler what to dispatch.
|
|
337
|
+
const plans = buildWorkPlans(selection, collection, config.projectRoot);
|
|
338
|
+
// Workers re-load the config module themselves, so a file-backed config
|
|
339
|
+
// runs across processes. A supplied `rawConfig` cannot cross a process
|
|
340
|
+
// boundary (it may hold live engine handles), so it runs in-process
|
|
341
|
+
// against one worker.
|
|
342
|
+
const runWorkers = config.configPath === undefined ? 1 : config.workers;
|
|
309
343
|
// Provisioning: an engine that must fetch something onto this machine (a
|
|
310
|
-
// first-run browser download) does it here, once per target
|
|
311
|
-
//
|
|
312
|
-
// short
|
|
313
|
-
//
|
|
344
|
+
// first-run browser download) does it here, once per target, before the
|
|
345
|
+
// app starts and before the run's clock starts. Only an interrupt cuts it
|
|
346
|
+
// short. Each target is one setup step, and the engine's progress lines
|
|
347
|
+
// stream as `notice` events under it, so the reporter prints them instead
|
|
348
|
+
// of a worker's stderr fighting the live status block.
|
|
314
349
|
try {
|
|
315
|
-
await debug.time('engine.prepare', () => prepareEngines(
|
|
350
|
+
await debug.time('engine.prepare', () => prepareEngines(plans, runWorkers, { runId, env, signal: interrupted }, emit));
|
|
316
351
|
}
|
|
317
352
|
catch (cause) {
|
|
318
353
|
if (!interrupted.aborted)
|
|
@@ -321,52 +356,85 @@ export async function run(options = {}) {
|
|
|
321
356
|
}
|
|
322
357
|
if (interrupted.aborted)
|
|
323
358
|
return;
|
|
324
|
-
//
|
|
325
|
-
//
|
|
326
|
-
//
|
|
327
|
-
//
|
|
359
|
+
// The run's clock starts here, once collection and provisioning are done.
|
|
360
|
+
// `plan` marks the moment and the report's `startedAt` agrees with it, so
|
|
361
|
+
// everything a run pays for every time (the app, the tests, the report)
|
|
362
|
+
// is on the clock and a one-off download is not.
|
|
363
|
+
startedAt = timestamp();
|
|
364
|
+
emit({ type: 'plan', total: selection.pairs.length, files: plannedFiles(selection) });
|
|
365
|
+
// Every service is ready before the first app command starts. Nothing
|
|
366
|
+
// spawns once the run was interrupted. Each process is one setup step; a
|
|
367
|
+
// reused process or an ignored `reuseExisting` narrates as a run notice.
|
|
368
|
+
const processHooks = (kind) => ({
|
|
369
|
+
ci: isCiMode(env),
|
|
370
|
+
notice: (message) => emit({ type: 'notice', target: 'app', message }),
|
|
371
|
+
starting: (label) => emit({ type: 'setup', step: { kind, label }, state: 'started' }),
|
|
372
|
+
ready: (label, durationMs, reused) => emit({
|
|
373
|
+
type: 'setup',
|
|
374
|
+
step: { kind, label },
|
|
375
|
+
state: 'finished',
|
|
376
|
+
durationMs,
|
|
377
|
+
...(reused ? { outcome: 'reused' } : {}),
|
|
378
|
+
}),
|
|
379
|
+
});
|
|
380
|
+
if (declared.services.length > 0) {
|
|
381
|
+
const stack = new ServiceStack(declared.services, config.projectRoot, processHooks('service'));
|
|
382
|
+
services = stack;
|
|
383
|
+
await debug.time('app.services.start', () => stack.start(interrupted));
|
|
384
|
+
if (interrupted.aborted)
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
for (const { label, command, readyUrl } of declared.commands) {
|
|
388
|
+
const app = new ManagedProcess(label, command, config.projectRoot, { readyUrl }, processHooks('app'));
|
|
389
|
+
appProcesses.push(app);
|
|
390
|
+
await debug.time(`app.start(${label})`, () => app.start(interrupted));
|
|
391
|
+
if (interrupted.aborted)
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
// A run cancelled while the app was starting runs no test: the interrupt
|
|
395
|
+
// alone decides the outcome.
|
|
396
|
+
if (interrupted.aborted)
|
|
397
|
+
return;
|
|
398
|
+
const artifactsRoot = resolveArtifactsRoot(config, options.artifactsDir);
|
|
399
|
+
const sessionsRoot = path.join(config.projectRoot, '.e2e', 'sessions');
|
|
400
|
+
const store = SessionStore.create(runId, sessionsRoot);
|
|
401
|
+
sessionStore = store;
|
|
402
|
+
// Both transports are reached through `SpawnUnitRunner`: the scheduler is
|
|
403
|
+
// the only engine either way.
|
|
328
404
|
if (aiTrace !== undefined && config.configPath === undefined) {
|
|
329
405
|
// In-process execution shares this process with the runner, so the
|
|
330
406
|
// recorder lives here and is drained straight into the collector.
|
|
331
407
|
aiTraceRecorder = new AiTraceRecorder();
|
|
332
408
|
await registerAiTraceRecorder(aiTraceRecorder, loadAiSdk);
|
|
333
409
|
}
|
|
334
|
-
const
|
|
335
|
-
? {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
sessionKeyBase64: store.exportKeyForWorker(),
|
|
359
|
-
debug: debug.enabled,
|
|
360
|
-
aiTrace: aiTrace !== undefined,
|
|
361
|
-
env,
|
|
362
|
-
}),
|
|
363
|
-
};
|
|
410
|
+
const spawn = config.configPath === undefined
|
|
411
|
+
? inProcessSpawner({
|
|
412
|
+
config,
|
|
413
|
+
selection,
|
|
414
|
+
runId,
|
|
415
|
+
artifactsRoot,
|
|
416
|
+
sessionStore: store,
|
|
417
|
+
headed: options.headed ?? false,
|
|
418
|
+
debug,
|
|
419
|
+
})
|
|
420
|
+
: childProcessSpawner({
|
|
421
|
+
configPath: config.configPath,
|
|
422
|
+
projectRoot: config.projectRoot,
|
|
423
|
+
configDigest: config.configDigest,
|
|
424
|
+
cli,
|
|
425
|
+
runId,
|
|
426
|
+
artifactsRoot,
|
|
427
|
+
headed: options.headed ?? false,
|
|
428
|
+
sessionsRoot,
|
|
429
|
+
sessionKeyBase64: store.exportKeyForWorker(),
|
|
430
|
+
debug: debug.enabled,
|
|
431
|
+
aiTrace: aiTrace !== undefined,
|
|
432
|
+
env,
|
|
433
|
+
});
|
|
364
434
|
await debug.time('scheduler', () => runUnits({
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
workers: transport.workers,
|
|
369
|
-
spawn: transport.spawn,
|
|
435
|
+
plans,
|
|
436
|
+
workers: runWorkers,
|
|
437
|
+
spawn,
|
|
370
438
|
interruptGraceMs: config.timeout + config.cleanupTimeout,
|
|
371
439
|
interruptSignal: interrupted,
|
|
372
440
|
forceSignal: forceController.signal,
|
|
@@ -381,6 +449,7 @@ export async function run(options = {}) {
|
|
|
381
449
|
emit({ type: 'serial-group', group });
|
|
382
450
|
},
|
|
383
451
|
onRunError: recordRunError,
|
|
452
|
+
onRunAbort: abortRun,
|
|
384
453
|
onTestStart: (start, targetName) => emit({ type: 'test-started', ...start, target: targetName }),
|
|
385
454
|
onProgress: (testId, targetName, progress) => emit({ type: 'step', testId, target: targetName, progress }),
|
|
386
455
|
onDebug: (snapshot) => debug.merge(snapshot),
|
|
@@ -446,33 +515,47 @@ export async function run(options = {}) {
|
|
|
446
515
|
}
|
|
447
516
|
}
|
|
448
517
|
/**
|
|
449
|
-
* Runs each target's `prepare` hook in turn
|
|
450
|
-
*
|
|
451
|
-
*
|
|
518
|
+
* Runs each target's `prepare` hook in turn, before `plan` is emitted and the
|
|
519
|
+
* run's clock starts, each as one `setup` step with the hook's progress lines
|
|
520
|
+
* streaming as `notice` events under it. Sequential on purpose: two engines
|
|
521
|
+
* provisioning the same toolchain would race, and the notices of one download
|
|
522
|
+
* read better than two interleaved.
|
|
452
523
|
*/
|
|
453
|
-
async function prepareEngines(
|
|
454
|
-
for (const
|
|
524
|
+
async function prepareEngines(plans, runWorkers, scope, emit) {
|
|
525
|
+
for (const plan of plans) {
|
|
526
|
+
const { target } = plan;
|
|
455
527
|
const engine = target.engine;
|
|
456
528
|
if (engine?.prepare === undefined)
|
|
457
529
|
continue;
|
|
458
530
|
if (scope.signal.aborted)
|
|
459
531
|
return;
|
|
532
|
+
const step = { kind: 'prepare', target: target.name, engine: engine.name };
|
|
533
|
+
emit({ type: 'setup', step, state: 'started' });
|
|
534
|
+
const startedMs = Date.now();
|
|
460
535
|
try {
|
|
461
536
|
// The same `env` the workers are started with: what prepare provisions
|
|
462
537
|
// must be where a worker's launch will look for it.
|
|
463
538
|
await engine.prepare({
|
|
464
539
|
runId: scope.runId,
|
|
465
540
|
targetName: target.name,
|
|
541
|
+
slots: plannedSlots(plan, runWorkers),
|
|
466
542
|
env: scope.env,
|
|
467
543
|
signal: scope.signal,
|
|
468
|
-
log: (line) => notice
|
|
544
|
+
log: (line) => emit({ type: 'notice', target: target.name, message: line }),
|
|
469
545
|
});
|
|
470
546
|
}
|
|
471
547
|
catch (cause) {
|
|
472
548
|
throw translateProvisioningError(cause, ` while preparing engine ${engine.name} for target "${target.name}"`);
|
|
473
549
|
}
|
|
550
|
+
if (!scope.signal.aborted) {
|
|
551
|
+
emit({ type: 'setup', step, state: 'finished', durationMs: Date.now() - startedMs });
|
|
552
|
+
}
|
|
474
553
|
}
|
|
475
554
|
}
|
|
555
|
+
/** A configured model as `run-started` and the reporter name it. */
|
|
556
|
+
function modelName(model) {
|
|
557
|
+
return `${model.provider}/${model.id}`;
|
|
558
|
+
}
|
|
476
559
|
function selectionFilters(options) {
|
|
477
560
|
return {
|
|
478
561
|
...(options.tags !== undefined ? { tags: options.tags } : {}),
|
|
@@ -520,6 +603,7 @@ function plannedFiles(selection) {
|
|
|
520
603
|
}
|
|
521
604
|
return [...files.values()];
|
|
522
605
|
}
|
|
606
|
+
/** The exit-code status the report builder starts from; `blocked` is derived from the results there. */
|
|
523
607
|
function statusOf(exitCode) {
|
|
524
608
|
return exitCode === 0 ? 'passed' : exitCode === 1 ? 'failed' : exitCode === 130 ? 'interrupted' : 'error';
|
|
525
609
|
}
|
|
@@ -529,10 +613,10 @@ function statusOf(exitCode) {
|
|
|
529
613
|
*/
|
|
530
614
|
function validateEngine(target, config) {
|
|
531
615
|
const provenance = describeTarget(target);
|
|
532
|
-
//
|
|
533
|
-
//
|
|
534
|
-
for (const artifact of config.
|
|
535
|
-
if (!provenance.artifactCapabilities.includes(artifact)) {
|
|
616
|
+
// A best-effort kind is captured when the engine can; a required one is a
|
|
617
|
+
// contract the engine must be able to honour before any test starts.
|
|
618
|
+
for (const [artifact, policy] of config.artifacts) {
|
|
619
|
+
if (policy === 'required' && !provenance.artifactCapabilities.includes(artifact)) {
|
|
536
620
|
throw new ConfigurationError('UNSUPPORTED_ARTIFACT', `target "${target.name}" (engine ${provenance.engine.name}) does not support the configured "${artifact}" artifact`);
|
|
537
621
|
}
|
|
538
622
|
}
|