@e2edev/e2e 0.11.0 → 0.13.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 +7 -7
- package/dist/agent/act.d.ts +43 -9
- package/dist/agent/act.d.ts.map +1 -1
- package/dist/agent/act.js +126 -734
- package/dist/agent/act.js.map +1 -1
- package/dist/agent/action-dispatcher.d.ts +98 -0
- package/dist/agent/action-dispatcher.d.ts.map +1 -0
- package/dist/agent/action-dispatcher.js +319 -0
- package/dist/agent/action-dispatcher.js.map +1 -0
- package/dist/agent/actions.d.ts +16 -1
- package/dist/agent/actions.d.ts.map +1 -1
- package/dist/agent/actions.js +5 -1
- package/dist/agent/actions.js.map +1 -1
- package/dist/agent/default-agent.d.ts +17 -8
- package/dist/agent/default-agent.d.ts.map +1 -1
- package/dist/agent/default-agent.js +65 -43
- package/dist/agent/default-agent.js.map +1 -1
- package/dist/agent/executor.d.ts +30 -2
- package/dist/agent/executor.d.ts.map +1 -1
- package/dist/agent/executor.js.map +1 -1
- package/dist/agent/index.js +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/interactive-step.d.ts +38 -0
- package/dist/agent/interactive-step.d.ts.map +1 -0
- package/dist/agent/interactive-step.js +131 -0
- package/dist/agent/interactive-step.js.map +1 -0
- package/dist/agent/invocation.d.ts +4 -9
- package/dist/agent/invocation.d.ts.map +1 -1
- package/dist/agent/invocation.js +1 -6
- package/dist/agent/invocation.js.map +1 -1
- package/dist/agent/model/sdk.d.ts +1 -1
- package/dist/agent/model/sdk.js +1 -1
- package/dist/agent/model/tool-choice.d.ts +21 -0
- package/dist/agent/model/tool-choice.d.ts.map +1 -0
- package/dist/agent/model/tool-choice.js +49 -0
- package/dist/agent/model/tool-choice.js.map +1 -0
- package/dist/agent/observation-feed.d.ts +123 -0
- package/dist/agent/observation-feed.d.ts.map +1 -0
- package/dist/agent/observation-feed.js +281 -0
- package/dist/agent/observation-feed.js.map +1 -0
- package/dist/agent/observation.d.ts +14 -1
- package/dist/agent/observation.d.ts.map +1 -1
- package/dist/agent/observation.js +58 -2
- package/dist/agent/observation.js.map +1 -1
- package/dist/agent/operation-queue.d.ts +21 -0
- package/dist/agent/operation-queue.d.ts.map +1 -0
- package/dist/agent/operation-queue.js +27 -0
- package/dist/agent/operation-queue.js.map +1 -0
- package/dist/agent/pixels.d.ts +21 -0
- package/dist/agent/pixels.d.ts.map +1 -0
- package/dist/agent/pixels.js +85 -0
- package/dist/agent/pixels.js.map +1 -0
- package/dist/agent/point-tap.d.ts +52 -0
- package/dist/agent/point-tap.d.ts.map +1 -0
- package/dist/agent/point-tap.js +88 -0
- package/dist/agent/point-tap.js.map +1 -0
- package/dist/agent/primitives.d.ts +7 -1
- package/dist/agent/primitives.d.ts.map +1 -1
- package/dist/agent/primitives.js +96 -25
- package/dist/agent/primitives.js.map +1 -1
- package/dist/agent/replay.d.ts +8 -3
- package/dist/agent/replay.d.ts.map +1 -1
- package/dist/agent/replay.js +44 -15
- package/dist/agent/replay.js.map +1 -1
- package/dist/agent/screen-update.d.ts +50 -18
- package/dist/agent/screen-update.d.ts.map +1 -1
- package/dist/agent/screen-update.js +76 -94
- package/dist/agent/screen-update.js.map +1 -1
- package/dist/agent/step-accounting.d.ts +95 -0
- package/dist/agent/step-accounting.d.ts.map +1 -0
- package/dist/agent/step-accounting.js +201 -0
- package/dist/agent/step-accounting.js.map +1 -0
- package/dist/agent/step-cache.d.ts.map +1 -1
- package/dist/agent/step-cache.js +2 -2
- package/dist/agent/step-cache.js.map +1 -1
- package/dist/agent/tool-loop.d.ts +4 -4
- package/dist/agent/tool-loop.d.ts.map +1 -1
- package/dist/agent/tool-loop.js +109 -25
- package/dist/agent/tool-loop.js.map +1 -1
- package/dist/agent/transcript-compaction.d.ts +38 -0
- package/dist/agent/transcript-compaction.d.ts.map +1 -0
- package/dist/agent/transcript-compaction.js +165 -0
- package/dist/agent/transcript-compaction.js.map +1 -0
- package/dist/cache/recorder.d.ts.map +1 -1
- package/dist/cache/recorder.js +20 -0
- package/dist/cache/recorder.js.map +1 -1
- package/dist/cache/trace.d.ts +28 -1
- package/dist/cache/trace.d.ts.map +1 -1
- package/dist/cache/trace.js +44 -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 +71 -26
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/engine-versions.json +1 -1
- package/dist/cli/init/engines.d.ts +26 -16
- package/dist/cli/init/engines.d.ts.map +1 -1
- package/dist/cli/init/engines.js +33 -24
- package/dist/cli/init/engines.js.map +1 -1
- package/dist/cli/init/gateways.js +3 -3
- package/dist/cli/init/mcp-config.d.ts +31 -0
- package/dist/cli/init/mcp-config.d.ts.map +1 -0
- package/dist/cli/init/mcp-config.js +72 -0
- package/dist/cli/init/mcp-config.js.map +1 -0
- package/dist/cli/init/scaffold.d.ts +1 -1
- package/dist/cli/init/scaffold.js +2 -2
- package/dist/cli/init/scaffold.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +65 -29
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/mcp.d.ts +15 -0
- package/dist/cli/mcp.d.ts.map +1 -0
- package/dist/cli/mcp.js +63 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/collect/collect.d.ts +8 -3
- package/dist/collect/collect.d.ts.map +1 -1
- package/dist/collect/collect.js +29 -5
- package/dist/collect/collect.js.map +1 -1
- package/dist/collect/registry.d.ts +20 -5
- package/dist/collect/registry.d.ts.map +1 -1
- package/dist/collect/registry.js +162 -56
- package/dist/collect/registry.js.map +1 -1
- package/dist/collect/select.d.ts +9 -2
- package/dist/collect/select.d.ts.map +1 -1
- package/dist/collect/select.js +60 -12
- package/dist/collect/select.js.map +1 -1
- package/dist/config/agent.d.ts +1 -7
- package/dist/config/agent.d.ts.map +1 -1
- package/dist/config/agent.js +5 -8
- package/dist/config/agent.js.map +1 -1
- package/dist/config/app.d.ts +24 -2
- package/dist/config/app.d.ts.map +1 -1
- package/dist/config/app.js +82 -15
- package/dist/config/app.js.map +1 -1
- package/dist/config/resolve.d.ts +23 -6
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +34 -14
- package/dist/config/resolve.js.map +1 -1
- package/dist/credentials.d.ts +6 -0
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +9 -0
- package/dist/credentials.js.map +1 -1
- package/dist/engine/contract.d.ts +9 -2
- package/dist/engine/contract.d.ts.map +1 -1
- package/dist/engine/contract.js.map +1 -1
- package/dist/engine/index.d.ts +18 -4
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +8 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/session.d.ts.map +1 -1
- package/dist/engine/session.js +3 -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/engine/surface.js.map +1 -1
- package/dist/expect/attempt.d.ts +15 -0
- package/dist/expect/attempt.d.ts.map +1 -0
- package/dist/expect/attempt.js +33 -0
- package/dist/expect/attempt.js.map +1 -0
- package/dist/expect/index.d.ts +7 -5
- package/dist/expect/index.d.ts.map +1 -1
- package/dist/expect/index.js +8 -1
- package/dist/expect/index.js.map +1 -1
- package/dist/expect/poll.d.ts +5 -0
- package/dist/expect/poll.d.ts.map +1 -0
- package/dist/expect/poll.js +118 -0
- package/dist/expect/poll.js.map +1 -0
- package/dist/expect/values.d.ts.map +1 -1
- package/dist/expect/values.js +6 -1
- package/dist/expect/values.js.map +1 -1
- package/dist/explore/body.d.ts.map +1 -1
- package/dist/explore/body.js +2 -0
- package/dist/explore/body.js.map +1 -1
- package/dist/explore/executor.js +16 -11
- package/dist/explore/executor.js.map +1 -1
- package/dist/explore/index.d.ts +3 -2
- package/dist/explore/index.d.ts.map +1 -1
- package/dist/explore/index.js +11 -9
- package/dist/explore/index.js.map +1 -1
- package/dist/explore/plan.d.ts.map +1 -1
- package/dist/explore/plan.js +16 -5
- package/dist/explore/plan.js.map +1 -1
- package/dist/explore/progress.d.ts +43 -0
- package/dist/explore/progress.d.ts.map +1 -0
- package/dist/explore/progress.js +9 -0
- package/dist/explore/progress.js.map +1 -0
- package/dist/explore/state.d.ts +13 -12
- package/dist/explore/state.d.ts.map +1 -1
- package/dist/explore/state.js +28 -11
- package/dist/explore/state.js.map +1 -1
- package/dist/internal/ai-trace.d.ts +2 -0
- package/dist/internal/ai-trace.d.ts.map +1 -1
- package/dist/internal/ai-trace.js +3 -0
- package/dist/internal/ai-trace.js.map +1 -1
- package/dist/internal/brands.d.ts +2 -0
- package/dist/internal/brands.d.ts.map +1 -1
- package/dist/internal/brands.js +2 -0
- package/dist/internal/brands.js.map +1 -1
- package/dist/internal/geometry.d.ts +13 -0
- package/dist/internal/geometry.d.ts.map +1 -0
- package/dist/internal/geometry.js +16 -0
- package/dist/internal/geometry.js.map +1 -0
- package/dist/internal/ids.d.ts +2 -2
- package/dist/internal/ids.d.ts.map +1 -1
- package/dist/internal/ids.js +3 -3
- package/dist/internal/ids.js.map +1 -1
- package/dist/internal/package-manager.d.ts +4 -0
- package/dist/internal/package-manager.d.ts.map +1 -1
- package/dist/internal/package-manager.js +26 -0
- package/dist/internal/package-manager.js.map +1 -1
- package/dist/internal/urls.d.ts +6 -0
- package/dist/internal/urls.d.ts.map +1 -1
- package/dist/internal/urls.js +28 -0
- package/dist/internal/urls.js.map +1 -1
- package/dist/mcp/catalog.d.ts +51 -0
- package/dist/mcp/catalog.d.ts.map +1 -0
- package/dist/mcp/catalog.js +141 -0
- package/dist/mcp/catalog.js.map +1 -0
- package/dist/mcp/config.d.ts +11 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +16 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/server.d.ts +29 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +86 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +68 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +319 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/tools.d.ts +77 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +179 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/report/build.d.ts +8 -0
- package/dist/report/build.d.ts.map +1 -1
- package/dist/report/build.js +3 -1
- package/dist/report/build.js.map +1 -1
- package/dist/report/format.d.ts +19 -0
- package/dist/report/format.d.ts.map +1 -1
- package/dist/report/format.js +42 -0
- package/dist/report/format.js.map +1 -1
- package/dist/report/junit.d.ts.map +1 -1
- package/dist/report/junit.js +4 -1
- package/dist/report/junit.js.map +1 -1
- package/dist/report/list-explore.d.ts +109 -0
- package/dist/report/list-explore.d.ts.map +1 -0
- package/dist/report/list-explore.js +388 -0
- package/dist/report/list-explore.js.map +1 -0
- package/dist/report/list.d.ts +31 -1
- package/dist/report/list.d.ts.map +1 -1
- package/dist/report/list.js +114 -16
- package/dist/report/list.js.map +1 -1
- package/dist/report/running-tree.d.ts +7 -7
- package/dist/report/running-tree.d.ts.map +1 -1
- package/dist/report/running-tree.js +12 -13
- package/dist/report/running-tree.js.map +1 -1
- package/dist/run/app-ports.d.ts +17 -0
- package/dist/run/app-ports.d.ts.map +1 -0
- package/dist/run/app-ports.js +74 -0
- package/dist/run/app-ports.js.map +1 -0
- package/dist/run/events.d.ts +21 -7
- package/dist/run/events.d.ts.map +1 -1
- package/dist/run/events.js.map +1 -1
- package/dist/run/execute.d.ts +2 -2
- package/dist/run/execute.d.ts.map +1 -1
- package/dist/run/execute.js +42 -20
- package/dist/run/execute.js.map +1 -1
- package/dist/run/extended-fixtures.d.ts +33 -0
- package/dist/run/extended-fixtures.d.ts.map +1 -0
- package/dist/run/extended-fixtures.js +91 -0
- package/dist/run/extended-fixtures.js.map +1 -0
- package/dist/run/fixtures.d.ts +10 -4
- package/dist/run/fixtures.d.ts.map +1 -1
- package/dist/run/fixtures.js +40 -27
- package/dist/run/fixtures.js.map +1 -1
- package/dist/run/in-process.d.ts.map +1 -1
- package/dist/run/in-process.js +4 -3
- package/dist/run/in-process.js.map +1 -1
- package/dist/run/managed-process.d.ts +18 -0
- package/dist/run/managed-process.d.ts.map +1 -1
- package/dist/run/managed-process.js +101 -6
- package/dist/run/managed-process.js.map +1 -1
- package/dist/run/provision.d.ts +51 -0
- package/dist/run/provision.d.ts.map +1 -0
- package/dist/run/provision.js +94 -0
- package/dist/run/provision.js.map +1 -0
- package/dist/run/realm.d.ts +5 -4
- package/dist/run/realm.d.ts.map +1 -1
- package/dist/run/realm.js +8 -7
- package/dist/run/realm.js.map +1 -1
- package/dist/run/records.d.ts +4 -0
- package/dist/run/records.d.ts.map +1 -1
- package/dist/run/runner.d.ts +14 -5
- package/dist/run/runner.d.ts.map +1 -1
- package/dist/run/runner.js +28 -71
- package/dist/run/runner.js.map +1 -1
- package/dist/run/scheduler.d.ts +5 -2
- package/dist/run/scheduler.d.ts.map +1 -1
- package/dist/run/scheduler.js +13 -10
- package/dist/run/scheduler.js.map +1 -1
- package/dist/run/serial.d.ts +1 -1
- package/dist/run/serial.d.ts.map +1 -1
- package/dist/run/serial.js +7 -2
- package/dist/run/serial.js.map +1 -1
- package/dist/run/standalone.d.ts +63 -0
- package/dist/run/standalone.d.ts.map +1 -0
- package/dist/run/standalone.js +152 -0
- package/dist/run/standalone.js.map +1 -0
- package/dist/run/units.d.ts +6 -3
- package/dist/run/units.d.ts.map +1 -1
- package/dist/run/units.js +0 -0
- package/dist/run/units.js.map +1 -1
- package/dist/run/worker/entry.js +4 -3
- package/dist/run/worker/entry.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 +3 -4
- package/dist/run/worker/session.d.ts.map +1 -1
- package/dist/run/worker/session.js +5 -4
- package/dist/run/worker/session.js.map +1 -1
- package/dist/types.d.ts +77 -17
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -7
- package/skills/e2e/SKILL.md +9 -7
- package/skills/e2e/references/agent.md +27 -12
- package/skills/e2e/references/debugging.md +5 -5
- package/skills/e2e/references/explore.md +15 -9
- package/skills/e2e/references/mcp.md +88 -0
- package/skills/e2e/references/running.md +23 -18
- package/skills/e2e/references/setup.md +32 -18
- package/skills/e2e/references/writing-tests.md +12 -5
- package/dist/agent/model/router.d.ts +0 -36
- package/dist/agent/model/router.d.ts.map +0 -1
- package/dist/agent/model/router.js +0 -45
- package/dist/agent/model/router.js.map +0 -1
- package/dist/explore/reporter.d.ts +0 -11
- package/dist/explore/reporter.d.ts.map +0 -1
- package/dist/explore/reporter.js +0 -54
- package/dist/explore/reporter.js.map +0 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a run and a standalone attempt both do before the first engine
|
|
3
|
+
* session: grade each target against its engine declaration, run the
|
|
4
|
+
* engines' `prepare` hooks, and start the app processes the engines declare.
|
|
5
|
+
* One owner, so the dev-loop session (`e2e mcp`) and a test run can never
|
|
6
|
+
* provision differently.
|
|
7
|
+
*/
|
|
8
|
+
import { ConfigurationError, translateProvisioningError } from '../internal/errors.js';
|
|
9
|
+
import { describeTarget } from '../report/build.js';
|
|
10
|
+
import { declaredProcesses } from './declared-processes.js';
|
|
11
|
+
import { ManagedProcess, ServiceStack } from './managed-process.js';
|
|
12
|
+
/**
|
|
13
|
+
* Grades one target from its engine declaration and validates the configured
|
|
14
|
+
* artifacts against it; returns the report provenance.
|
|
15
|
+
*/
|
|
16
|
+
export function validateEngine(target, config) {
|
|
17
|
+
const provenance = describeTarget(target);
|
|
18
|
+
// A best-effort kind is captured when the engine can; a required one is a
|
|
19
|
+
// contract the engine must be able to honour before any test starts.
|
|
20
|
+
for (const [artifact, policy] of config.artifacts) {
|
|
21
|
+
if (policy === 'required' && !provenance.artifactCapabilities.includes(artifact)) {
|
|
22
|
+
throw new ConfigurationError('UNSUPPORTED_ARTIFACT', `target "${target.name}" (engine ${provenance.engine.name}) does not support the configured "${artifact}" artifact`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return provenance;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Runs one target's `prepare` hook for `slots` worker slots, streaming its
|
|
29
|
+
* progress lines to `log`. Resolves to nothing when the engine declares no
|
|
30
|
+
* hook. Callers run targets in turn: two engines provisioning the same
|
|
31
|
+
* toolchain would race, and the notices of one download read better than
|
|
32
|
+
* two interleaved.
|
|
33
|
+
*/
|
|
34
|
+
export async function prepareEngine(target, slots, scope, log) {
|
|
35
|
+
const engine = target.engine;
|
|
36
|
+
if (engine?.prepare === undefined)
|
|
37
|
+
return;
|
|
38
|
+
try {
|
|
39
|
+
return await engine.prepare({ runId: scope.runId, targetName: target.name, slots, env: scope.env, signal: scope.signal, log });
|
|
40
|
+
}
|
|
41
|
+
catch (cause) {
|
|
42
|
+
throw translateProvisioningError(cause, ` while preparing engine ${engine.name} for target "${target.name}"`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Starts what the targets' engines declare: the dependency services first,
|
|
47
|
+
* then every distinct app command. Declarations are deduplicated across
|
|
48
|
+
* targets (two browsers on one dev server share one process), and every
|
|
49
|
+
* service is ready before the first app command starts. Nothing spawns once
|
|
50
|
+
* `signal` aborted; what did start is returned for teardown either way.
|
|
51
|
+
*/
|
|
52
|
+
export async function startDeclaredProcesses(targets, projectRoot, hooks, signal, debug) {
|
|
53
|
+
const declared = declaredProcesses(targets);
|
|
54
|
+
let services;
|
|
55
|
+
const apps = [];
|
|
56
|
+
const processes = {
|
|
57
|
+
async stop(onFailure) {
|
|
58
|
+
for (const app of apps.splice(0).toReversed()) {
|
|
59
|
+
try {
|
|
60
|
+
await app.stop();
|
|
61
|
+
}
|
|
62
|
+
catch (cause) {
|
|
63
|
+
onFailure(cause);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
await services?.stop(onFailure);
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
try {
|
|
70
|
+
if (declared.services.length > 0) {
|
|
71
|
+
const stack = new ServiceStack(declared.services, projectRoot, hooks('service'));
|
|
72
|
+
services = stack;
|
|
73
|
+
await debug.time('app.services.start', () => stack.start(signal));
|
|
74
|
+
if (signal.aborted)
|
|
75
|
+
return processes;
|
|
76
|
+
}
|
|
77
|
+
for (const { label, command, readyUrl } of declared.commands) {
|
|
78
|
+
const app = new ManagedProcess(label, command, projectRoot, { readyUrl }, hooks('app'));
|
|
79
|
+
apps.push(app);
|
|
80
|
+
await debug.time(`app.start(${label})`, () => app.start(signal));
|
|
81
|
+
if (signal.aborted)
|
|
82
|
+
return processes;
|
|
83
|
+
}
|
|
84
|
+
return processes;
|
|
85
|
+
}
|
|
86
|
+
catch (cause) {
|
|
87
|
+
// A service or command that failed to start must not leave the earlier
|
|
88
|
+
// ones running; the startup failure is the one reported, so a cleanup
|
|
89
|
+
// failure here is a notice at most.
|
|
90
|
+
await processes.stop((failure) => hooks('app').notice?.(`cleanup after a failed start: ${String(failure)}`));
|
|
91
|
+
throw cause;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=provision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/run/provision.ts"],"names":[],"mappings":"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"}
|
package/dist/run/realm.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { type SerializedError } from '../internal/errors.ts';
|
|
3
3
|
import { DebugTrace } from '../internal/debug.ts';
|
|
4
4
|
import type { CollectedTest } from '../collect/collect.ts';
|
|
5
|
-
import { type GroupNode, type
|
|
5
|
+
import { type GroupNode, type ModuleRegistration, type RegisteredTest, type TestHook } from '../collect/registry.ts';
|
|
6
6
|
import type { TestTargetPair } from '../collect/select.ts';
|
|
7
7
|
import type { Platform } from '../types.ts';
|
|
8
8
|
import type { RunError } from './records.ts';
|
|
@@ -28,10 +28,11 @@ export interface Realm {
|
|
|
28
28
|
/** Finds a registered test in a re-imported realm by its exact title path. */
|
|
29
29
|
export declare function findRegistered(realm: Realm, test: CollectedTest): RegisteredTest | undefined;
|
|
30
30
|
/**
|
|
31
|
-
* Runs one hook within its budget.
|
|
32
|
-
* runner's timeout error
|
|
31
|
+
* Runs one hook, or a fixture teardown, within its budget. One that overruns
|
|
32
|
+
* fails with the runner's timeout error naming `label`; `onTimeout` lets the
|
|
33
|
+
* caller cancel what it started.
|
|
33
34
|
*/
|
|
34
|
-
export declare function runHook(
|
|
35
|
+
export declare function runHook(label: string, run: () => void | Promise<void>, timeoutMs: number, onTimeout?: () => void): Promise<void>;
|
|
35
36
|
export interface RealmManagerOptions {
|
|
36
37
|
readonly targetName: string;
|
|
37
38
|
readonly platform: Platform;
|
package/dist/run/realm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realm.d.ts","sourceRoot":"","sources":["../../src/run/realm.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAGlF,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,
|
|
1
|
+
{"version":3,"file":"realm.d.ts","sourceRoot":"","sources":["../../src/run/realm.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAGlF,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,kBAAkB,EAEvB,KAAK,cAAc,EAEnB,KAAK,QAAQ,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C;;;;GAIG;AACH,KAAK,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnC,MAAM,WAAW,KAAK;IACpB,YAAY,EAAE,kBAAkB,CAAC;IACjC,kEAAkE;IAClE,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAChD;;;;OAIG;IACH,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;CAC9D;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAE5F;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,+EAA+E;AAC/E,qBAAa,YAAY;IAIX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IAEnC,YAA6B,OAAO,EAAE,mBAAmB,EAExD;IAED,mDAAmD;IAC7C,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CASjD;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,EAAE,kBAAkB,GAAG,KAAK,CAI7C;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAK/E;IAED,uEAAuE;IACjE,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAyB1F;IAED;;;;;;;;;;OAUG;IACG,aAAa,CACjB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA0BtC;IAED,uDAAuD;IACjD,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvC;IAED,2DAA2D;IAC3D,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;CAGtB"}
|
package/dist/run/realm.js
CHANGED
|
@@ -10,13 +10,14 @@ export function findRegistered(realm, test) {
|
|
|
10
10
|
return realm.testsByKey.get(titlePathKey(test.titlePath));
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* Runs one hook within its budget.
|
|
14
|
-
* runner's timeout error
|
|
13
|
+
* Runs one hook, or a fixture teardown, within its budget. One that overruns
|
|
14
|
+
* fails with the runner's timeout error naming `label`; `onTimeout` lets the
|
|
15
|
+
* caller cancel what it started.
|
|
15
16
|
*/
|
|
16
|
-
export function runHook(
|
|
17
|
+
export function runHook(label, run, timeoutMs, onTimeout) {
|
|
17
18
|
return withTimeout(Promise.resolve().then(run), timeoutMs, () => {
|
|
18
19
|
onTimeout?.();
|
|
19
|
-
return new TestTimeoutError(`${
|
|
20
|
+
return new TestTimeoutError(`${label} timed out`);
|
|
20
21
|
});
|
|
21
22
|
}
|
|
22
23
|
/** Creates realms and runs suite-scope hooks with per-realm entry tracking. */
|
|
@@ -31,7 +32,7 @@ export class RealmManager {
|
|
|
31
32
|
/** Re-imports one test module in a fresh realm. */
|
|
32
33
|
async create(absolutePath) {
|
|
33
34
|
this.realmCounter += 1;
|
|
34
|
-
const registration = await this.debug.time('realm.import', () => collectModule(() => importModule(absolutePath, `${this.options.targetName}-${this.realmCounter}`)));
|
|
35
|
+
const registration = await this.debug.time('realm.import', () => collectModule(() => importModule(absolutePath, `${this.options.targetName}-${this.realmCounter}`), absolutePath));
|
|
35
36
|
return this.adopt(registration);
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
@@ -68,7 +69,7 @@ export class RealmManager {
|
|
|
68
69
|
let failed;
|
|
69
70
|
for (const hook of this.scopeHooks(realm, scope, 'beforeAll')) {
|
|
70
71
|
try {
|
|
71
|
-
await runHook(hook.kind
|
|
72
|
+
await runHook(`${hook.kind} hook`, () => hook.fn(this.suiteFixtures()), this.options.timeout);
|
|
72
73
|
}
|
|
73
74
|
catch (cause) {
|
|
74
75
|
const error = classifyError(cause);
|
|
@@ -110,7 +111,7 @@ export class RealmManager {
|
|
|
110
111
|
realm.entered.delete(scope);
|
|
111
112
|
for (const hook of this.scopeHooks(realm, scope, 'afterAll').toReversed()) {
|
|
112
113
|
try {
|
|
113
|
-
await runHook(hook.kind
|
|
114
|
+
await runHook(`${hook.kind} hook`, () => hook.fn(this.suiteFixtures()), this.options.cleanupTimeout);
|
|
114
115
|
}
|
|
115
116
|
catch (cause) {
|
|
116
117
|
const error = classifyError(cause);
|
package/dist/run/realm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realm.js","sourceRoot":"","sources":["../../src/run/realm.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,aAAa,EACb,QAAQ,EACR,cAAc,EACd,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EACL,aAAa,EACb,UAAU,EACV,WAAW,
|
|
1
|
+
{"version":3,"file":"realm.js","sourceRoot":"","sources":["../../src/run/realm.ts"],"names":[],"mappings":"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"}
|
package/dist/run/records.d.ts
CHANGED
|
@@ -82,6 +82,8 @@ export interface SerialGroupRecord {
|
|
|
82
82
|
titlePath: string[];
|
|
83
83
|
targetId: string;
|
|
84
84
|
platform: string;
|
|
85
|
+
/** The configured agent this variant of the group ran as. */
|
|
86
|
+
agent: string;
|
|
85
87
|
memberTestIds: string[];
|
|
86
88
|
status: 'passed' | 'flaky' | 'failed' | 'timed-out' | 'interrupted' | 'skipped';
|
|
87
89
|
skip?: SkipInfo;
|
|
@@ -91,6 +93,8 @@ export type ResultStatus = 'passed' | 'flaky' | 'failed' | 'timed-out' | 'interr
|
|
|
91
93
|
export interface ResultRecord {
|
|
92
94
|
test: TestIdentity;
|
|
93
95
|
target: ResolvedTarget;
|
|
96
|
+
/** The configured agent the test ran as; with a test run as several, one record each. */
|
|
97
|
+
agent: string;
|
|
94
98
|
status: ResultStatus;
|
|
95
99
|
selected: boolean;
|
|
96
100
|
skip?: SkipInfo | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/run/records.ts"],"names":[],"mappings":"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"}
|
|
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;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;OASG;IACH,SAAS,EAAE,UAAU,GAAG,cAAc,GAAG,YAAY,CAAC;IACtD,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,CAAC;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,eAAe,EAAE,eAAe,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,CAAC;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;IAChF,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;AAEnG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,yFAAyF;IACzF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,eAAe,CAAC;CACxB"}
|
package/dist/run/runner.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Run orchestration: config, collection, selection, execution, reporting. */
|
|
2
2
|
import type { ModuleRegistration } from '../collect/registry.ts';
|
|
3
|
+
import type { ExploreProgress } from '../explore/progress.ts';
|
|
3
4
|
import { type Report1Document, type ReportExplore } from '../report/build.ts';
|
|
4
5
|
import { type RunEventSink, type RunExitCode, type RunStatus } from './events.ts';
|
|
5
6
|
import type { ResultRecord } from './records.ts';
|
|
@@ -19,8 +20,11 @@ export interface RunOptions {
|
|
|
19
20
|
passWithNoTests?: boolean | undefined;
|
|
20
21
|
/** Runs with the trace cache off (`--no-cache`), overriding the config. */
|
|
21
22
|
noCache?: boolean | undefined;
|
|
22
|
-
/**
|
|
23
|
-
|
|
23
|
+
/**
|
|
24
|
+
* The configured agents unpinned tests run as (`--agent`), instead of
|
|
25
|
+
* `agents.default`. Several names run every such test once per agent.
|
|
26
|
+
*/
|
|
27
|
+
agent?: string | readonly string[] | undefined;
|
|
24
28
|
/** Prints aggregated phase timings to stderr after the run. */
|
|
25
29
|
debug?: boolean | undefined;
|
|
26
30
|
/** Records every model call to `.e2e/ai-trace.json` (`--ai-trace`). */
|
|
@@ -69,10 +73,15 @@ export interface InMemoryTests {
|
|
|
69
73
|
readonly file: string;
|
|
70
74
|
readonly registration: ModuleRegistration;
|
|
71
75
|
/**
|
|
72
|
-
* The exploration
|
|
73
|
-
* read once the run is over
|
|
76
|
+
* The exploration behind `e2e explore`: its progress becomes `explore` run
|
|
77
|
+
* events, and its record is read once the run is over, as `run.explore`.
|
|
74
78
|
*/
|
|
75
|
-
readonly explore?:
|
|
79
|
+
readonly explore?: InMemoryExplore | undefined;
|
|
80
|
+
}
|
|
81
|
+
/** What the runner needs from an exploration: its moments as they happen, and its record at the end. */
|
|
82
|
+
export interface InMemoryExplore {
|
|
83
|
+
snapshot(): ReportExplore;
|
|
84
|
+
subscribe(listener: (progress: ExploreProgress) => void): void;
|
|
76
85
|
}
|
|
77
86
|
/** The selection flags of `run`, without anything that would start a process. */
|
|
78
87
|
export type ListOptions = Pick<RunOptions, 'cwd' | 'configPath' | 'files' | 'tags' | 'tagMode' | 'targetIds' | 'passWithNoTests' | 'rawConfig' | 'env'>;
|
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;
|
|
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
|
@@ -4,19 +4,19 @@ import { discoverConfig, loadConfigModule, missingConfigError } from '../config/
|
|
|
4
4
|
import { isCiMode, resolveConfig, } from '../config/resolve.js';
|
|
5
5
|
import { collect, collectInMemory } from '../collect/collect.js';
|
|
6
6
|
import { select, selectTargets } from '../collect/select.js';
|
|
7
|
-
import { classifyError, combineExitCodes,
|
|
7
|
+
import { classifyError, combineExitCodes, InfrastructureError, E2EError, errorMessage, exitCodeForCategory, serializeError, } from '../internal/errors.js';
|
|
8
8
|
import { loadAiSdk } from '../agent/ai-sdk.js';
|
|
9
9
|
import { AiTraceCollector, AiTraceRecorder, registerAiTraceRecorder } from '../internal/ai-trace.js';
|
|
10
10
|
import { DebugTrace } from '../internal/debug.js';
|
|
11
11
|
import { timestamp, uuidv7 } from '../internal/ids.js';
|
|
12
|
-
import { buildReport
|
|
12
|
+
import { buildReport } from '../report/build.js';
|
|
13
13
|
import { agentStepTable } from '../report/debug-steps.js';
|
|
14
14
|
import { jsonReporter } from '../report/json.js';
|
|
15
15
|
import { junitReporter } from '../report/junit.js';
|
|
16
16
|
import { ListReporter } from '../report/list.js';
|
|
17
17
|
import { writeJsonReport } from '../report/write.js';
|
|
18
|
-
import { ManagedProcess, ServiceStack } from './managed-process.js';
|
|
19
18
|
import { createRunEventEmitter, toEventResult } from './events.js';
|
|
19
|
+
import { allocateAppPorts, assignedPorts } from './app-ports.js';
|
|
20
20
|
import { inProcessSpawner } from './in-process.js';
|
|
21
21
|
import { runUnits } from './scheduler.js';
|
|
22
22
|
import { buildWorkPlans, plannedSlots } from './units.js';
|
|
@@ -25,7 +25,7 @@ import { childProcessSpawner } from './worker/handle.js';
|
|
|
25
25
|
import { setCredentialRegistry } from '../credentials.js';
|
|
26
26
|
import { withAbort } from '../internal/time.js';
|
|
27
27
|
import { modelLabel } from '../config/agent.js';
|
|
28
|
-
import {
|
|
28
|
+
import { prepareEngine, startDeclaredProcesses, validateEngine } from './provision.js';
|
|
29
29
|
/** How long a reporter's `onRunFinished` may take before the run stops waiting for it. */
|
|
30
30
|
const REPORTER_TIMEOUT_MS = 60_000;
|
|
31
31
|
/**
|
|
@@ -85,10 +85,8 @@ export async function run(options = {}) {
|
|
|
85
85
|
const results = [];
|
|
86
86
|
const serialGroups = [];
|
|
87
87
|
const targetProvenance = new Map();
|
|
88
|
-
/**
|
|
89
|
-
let
|
|
90
|
-
/** App processes started for this run, one per distinct declared command. */
|
|
91
|
-
const appProcesses = [];
|
|
88
|
+
/** The services and app commands the targets' engines declared, once started. */
|
|
89
|
+
let processes;
|
|
92
90
|
let sessionStore;
|
|
93
91
|
// Hoisted: workers re-resolve the same config file and need these overrides,
|
|
94
92
|
// or a flag would apply in the runner and be dropped in every worker.
|
|
@@ -104,13 +102,18 @@ export async function run(options = {}) {
|
|
|
104
102
|
if (options.video === true)
|
|
105
103
|
cli.video = true;
|
|
106
104
|
if (options.agent !== undefined)
|
|
107
|
-
cli.
|
|
105
|
+
cli.agents = typeof options.agent === 'string' ? [options.agent] : options.agent;
|
|
108
106
|
// Config resolves before anything is emitted, and its failure is kept rather
|
|
109
107
|
// than thrown: the reporter set is config truth (CLI overrides merge during
|
|
110
108
|
// resolution), so the emitter below is built exactly once from the set
|
|
111
109
|
// actually in force. When config itself failed, the CLI's own value is the
|
|
112
110
|
// best available, and the failure still renders through it.
|
|
113
|
-
|
|
111
|
+
//
|
|
112
|
+
// Free ports for URLs declared with port 0 are chosen here, once: workers
|
|
113
|
+
// re-resolve the config and get the assignments in their bootstrap.
|
|
114
|
+
const loaded = await debug
|
|
115
|
+
.time('config.load', () => loadRunConfig(options, cwd, env, cli).then(allocateAppPorts))
|
|
116
|
+
.then((config) => ({ config, error: undefined }), (cause) => ({ config: undefined, error: classifyError(cause) }));
|
|
114
117
|
// Every reporter, built-in or configured, is one `Reporter` on one spine:
|
|
115
118
|
// the ids name the shipped ones, and a config failure still leaves the ids
|
|
116
119
|
// the CLI asked for, so the failure renders through them.
|
|
@@ -170,7 +173,7 @@ export async function run(options = {}) {
|
|
|
170
173
|
serialGroups,
|
|
171
174
|
runErrors,
|
|
172
175
|
targetProvenance,
|
|
173
|
-
explore: options.tests?.explore?.(),
|
|
176
|
+
explore: options.tests?.explore?.snapshot(),
|
|
174
177
|
});
|
|
175
178
|
/**
|
|
176
179
|
* Writes the canonical report and returns its path only once the file
|
|
@@ -273,9 +276,9 @@ export async function run(options = {}) {
|
|
|
273
276
|
artifactsRoot: resolveArtifactsRoot(config, options.artifactsDir),
|
|
274
277
|
ci: isCiMode(env),
|
|
275
278
|
targets: config.targets.map((target) => target.name),
|
|
276
|
-
...(config.
|
|
277
|
-
|
|
278
|
-
...(config.agent.
|
|
279
|
+
...(config.agentNames.length === 1 && config.agentNames[0] === 'default' ? {} : { agents: config.agentNames }),
|
|
280
|
+
// Several run agents have no one model to name; each step names its own.
|
|
281
|
+
...(config.agentNames.length !== 1 || config.agent.model === undefined ? {} : { model: modelLabel(config.agent.model) }),
|
|
279
282
|
});
|
|
280
283
|
const executeRun = async () => {
|
|
281
284
|
const interrupted = interruptController.signal;
|
|
@@ -293,12 +296,6 @@ export async function run(options = {}) {
|
|
|
293
296
|
recordFailure(cause, 'collection');
|
|
294
297
|
return;
|
|
295
298
|
}
|
|
296
|
-
// Each selected engine declares the app it drives: the dependency
|
|
297
|
-
// processes it needs and the command that starts it. Declarations are
|
|
298
|
-
// deduplicated across targets (two browsers on one dev server share one
|
|
299
|
-
// process) and checked for consistency here, first; the processes start
|
|
300
|
-
// only after the plan, and only for the selected targets.
|
|
301
|
-
const declared = declaredProcesses(targets);
|
|
302
299
|
/**
|
|
303
300
|
* Narrates and times one setup step on the event spine. A step that
|
|
304
301
|
* throws ends as a run error, and a step the interrupt cut short reports
|
|
@@ -369,9 +366,12 @@ export async function run(options = {}) {
|
|
|
369
366
|
// is on the clock and a one-off download is not.
|
|
370
367
|
startedAt = timestamp();
|
|
371
368
|
emit({ type: 'plan', total: selection.pairs.length, files: plannedFiles(selection) });
|
|
372
|
-
|
|
373
|
-
//
|
|
374
|
-
//
|
|
369
|
+
options.tests?.explore?.subscribe((progress) => emit({ type: 'explore', progress }));
|
|
370
|
+
// Each selected engine declares the app it drives: the dependency
|
|
371
|
+
// processes it needs and the command that starts it. Every service is
|
|
372
|
+
// ready before the first app command starts, and nothing spawns once the
|
|
373
|
+
// run was interrupted. Each process is one setup step; a reused process
|
|
374
|
+
// or an ignored `reuseExisting` narrates as a run notice.
|
|
375
375
|
const processHooks = (kind) => ({
|
|
376
376
|
ci: isCiMode(env),
|
|
377
377
|
notice: (message) => emit({ type: 'notice', target: 'app', message }),
|
|
@@ -384,20 +384,7 @@ export async function run(options = {}) {
|
|
|
384
384
|
...(reused ? { outcome: 'reused' } : {}),
|
|
385
385
|
}),
|
|
386
386
|
});
|
|
387
|
-
|
|
388
|
-
const stack = new ServiceStack(declared.services, config.projectRoot, processHooks('service'));
|
|
389
|
-
services = stack;
|
|
390
|
-
await debug.time('app.services.start', () => stack.start(interrupted));
|
|
391
|
-
if (interrupted.aborted)
|
|
392
|
-
return;
|
|
393
|
-
}
|
|
394
|
-
for (const { label, command, readyUrl } of declared.commands) {
|
|
395
|
-
const app = new ManagedProcess(label, command, config.projectRoot, { readyUrl }, processHooks('app'));
|
|
396
|
-
appProcesses.push(app);
|
|
397
|
-
await debug.time(`app.start(${label})`, () => app.start(interrupted));
|
|
398
|
-
if (interrupted.aborted)
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
387
|
+
processes = await startDeclaredProcesses(targets, config.projectRoot, processHooks, interrupted, debug);
|
|
401
388
|
// A run cancelled while the app was starting runs no test: the interrupt
|
|
402
389
|
// alone decides the outcome.
|
|
403
390
|
if (interrupted.aborted)
|
|
@@ -430,6 +417,7 @@ export async function run(options = {}) {
|
|
|
430
417
|
projectRoot: config.projectRoot,
|
|
431
418
|
configDigest: config.configDigest,
|
|
432
419
|
cli,
|
|
420
|
+
ports: assignedPorts(config),
|
|
433
421
|
runId,
|
|
434
422
|
artifactsRoot,
|
|
435
423
|
headed: options.headed ?? false,
|
|
@@ -459,7 +447,7 @@ export async function run(options = {}) {
|
|
|
459
447
|
onRunError: recordRunError,
|
|
460
448
|
onRunAbort: abortRun,
|
|
461
449
|
onTestStart: (start, targetName) => emit({ type: 'test-started', ...start, target: targetName }),
|
|
462
|
-
onProgress: (
|
|
450
|
+
onProgress: (pair, targetName, progress) => emit({ type: 'step', testId: pair.testId, agent: pair.agent, target: targetName, progress }),
|
|
463
451
|
onDebug: (snapshot) => debug.merge(snapshot),
|
|
464
452
|
onAiTrace: (snapshot) => aiTrace?.merge(snapshot),
|
|
465
453
|
},
|
|
@@ -505,8 +493,7 @@ export async function run(options = {}) {
|
|
|
505
493
|
// teardown command is a cleanup error of the run, not a crash.
|
|
506
494
|
for (const teardown of [
|
|
507
495
|
() => sessionStore?.cleanup(),
|
|
508
|
-
|
|
509
|
-
() => services?.stop((cause) => recordFailure(cause, 'cleanup')),
|
|
496
|
+
() => processes?.stop((cause) => recordFailure(cause, 'cleanup')),
|
|
510
497
|
]) {
|
|
511
498
|
try {
|
|
512
499
|
await teardown();
|
|
@@ -542,22 +529,7 @@ async function prepareEngines(plans, runWorkers, scope, emit) {
|
|
|
542
529
|
emit({ type: 'setup', step, state: 'started' });
|
|
543
530
|
const startedMs = Date.now();
|
|
544
531
|
const slots = plannedSlots(plan, runWorkers);
|
|
545
|
-
|
|
546
|
-
try {
|
|
547
|
-
// The same `env` the workers are started with: what prepare provisions
|
|
548
|
-
// must be where a worker's launch will look for it.
|
|
549
|
-
result = await engine.prepare({
|
|
550
|
-
runId: scope.runId,
|
|
551
|
-
targetName: target.name,
|
|
552
|
-
slots,
|
|
553
|
-
env: scope.env,
|
|
554
|
-
signal: scope.signal,
|
|
555
|
-
log: (line) => emit({ type: 'notice', target: target.name, message: line }),
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
catch (cause) {
|
|
559
|
-
throw translateProvisioningError(cause, ` while preparing engine ${engine.name} for target "${target.name}"`);
|
|
560
|
-
}
|
|
532
|
+
const result = await prepareEngine(target, slots, scope, (line) => emit({ type: 'notice', target: target.name, message: line }));
|
|
561
533
|
prepared.push(withPreparedWorkers(plan, engine.name, slots, result));
|
|
562
534
|
if (!scope.signal.aborted) {
|
|
563
535
|
emit({ type: 'setup', step, state: 'finished', durationMs: Date.now() - startedMs });
|
|
@@ -629,21 +601,6 @@ function plannedFiles(selection) {
|
|
|
629
601
|
function statusOf(exitCode) {
|
|
630
602
|
return exitCode === 0 ? 'passed' : exitCode === 1 ? 'failed' : exitCode === 130 ? 'interrupted' : 'error';
|
|
631
603
|
}
|
|
632
|
-
/**
|
|
633
|
-
* Grades one target from its engine declaration and validates the configured
|
|
634
|
-
* artifacts against it; returns the report provenance.
|
|
635
|
-
*/
|
|
636
|
-
function validateEngine(target, config) {
|
|
637
|
-
const provenance = describeTarget(target);
|
|
638
|
-
// A best-effort kind is captured when the engine can; a required one is a
|
|
639
|
-
// contract the engine must be able to honour before any test starts.
|
|
640
|
-
for (const [artifact, policy] of config.artifacts) {
|
|
641
|
-
if (policy === 'required' && !provenance.artifactCapabilities.includes(artifact)) {
|
|
642
|
-
throw new ConfigurationError('UNSUPPORTED_ARTIFACT', `target "${target.name}" (engine ${provenance.engine.name}) does not support the configured "${artifact}" artifact`);
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
return provenance;
|
|
646
|
-
}
|
|
647
604
|
function resultExitCodes(results) {
|
|
648
605
|
const codes = [0];
|
|
649
606
|
for (const result of results) {
|