@e2edev/e2e 0.2.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/LICENSE +21 -0
- package/README.md +104 -0
- package/dist/agent/act-validation.d.ts +27 -0
- package/dist/agent/act-validation.d.ts.map +1 -0
- package/dist/agent/act-validation.js +121 -0
- package/dist/agent/act-validation.js.map +1 -0
- package/dist/agent/act.d.ts +27 -0
- package/dist/agent/act.d.ts.map +1 -0
- package/dist/agent/act.js +775 -0
- package/dist/agent/act.js.map +1 -0
- package/dist/agent/actions.d.ts +66 -0
- package/dist/agent/actions.d.ts.map +1 -0
- package/dist/agent/actions.js +82 -0
- package/dist/agent/actions.js.map +1 -0
- package/dist/agent/ai-sdk.d.ts +16 -0
- package/dist/agent/ai-sdk.d.ts.map +1 -0
- package/dist/agent/ai-sdk.js +59 -0
- package/dist/agent/ai-sdk.js.map +1 -0
- package/dist/agent/call-options.d.ts +10 -0
- package/dist/agent/call-options.d.ts.map +1 -0
- package/dist/agent/call-options.js +28 -0
- package/dist/agent/call-options.js.map +1 -0
- package/dist/agent/default-agent.d.ts +22 -0
- package/dist/agent/default-agent.d.ts.map +1 -0
- package/dist/agent/default-agent.js +354 -0
- package/dist/agent/default-agent.js.map +1 -0
- package/dist/agent/error.d.ts +53 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +94 -0
- package/dist/agent/error.js.map +1 -0
- package/dist/agent/executor.d.ts +238 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +56 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/agent/index.d.ts +15 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +304 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/invocation.d.ts +194 -0
- package/dist/agent/invocation.d.ts.map +1 -0
- package/dist/agent/invocation.js +389 -0
- package/dist/agent/invocation.js.map +1 -0
- package/dist/agent/ledger.d.ts +24 -0
- package/dist/agent/ledger.d.ts.map +1 -0
- package/dist/agent/ledger.js +48 -0
- package/dist/agent/ledger.js.map +1 -0
- package/dist/agent/loop-guards.d.ts +35 -0
- package/dist/agent/loop-guards.d.ts.map +1 -0
- package/dist/agent/loop-guards.js +110 -0
- package/dist/agent/loop-guards.js.map +1 -0
- package/dist/agent/model/adapter.d.ts +97 -0
- package/dist/agent/model/adapter.d.ts.map +1 -0
- package/dist/agent/model/adapter.js +40 -0
- package/dist/agent/model/adapter.js.map +1 -0
- package/dist/agent/model/router.d.ts +36 -0
- package/dist/agent/model/router.d.ts.map +1 -0
- package/dist/agent/model/router.js +45 -0
- package/dist/agent/model/router.js.map +1 -0
- package/dist/agent/model/schema.d.ts +16 -0
- package/dist/agent/model/schema.d.ts.map +1 -0
- package/dist/agent/model/schema.js +37 -0
- package/dist/agent/model/schema.js.map +1 -0
- package/dist/agent/model/sdk.d.ts +28 -0
- package/dist/agent/model/sdk.d.ts.map +1 -0
- package/dist/agent/model/sdk.js +258 -0
- package/dist/agent/model/sdk.js.map +1 -0
- package/dist/agent/observation.d.ts +70 -0
- package/dist/agent/observation.d.ts.map +1 -0
- package/dist/agent/observation.js +174 -0
- package/dist/agent/observation.js.map +1 -0
- package/dist/agent/phases.d.ts +71 -0
- package/dist/agent/phases.d.ts.map +1 -0
- package/dist/agent/phases.js +124 -0
- package/dist/agent/phases.js.map +1 -0
- package/dist/agent/prompts.d.ts +40 -0
- package/dist/agent/prompts.d.ts.map +1 -0
- package/dist/agent/prompts.js +104 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/protocol.d.ts +31 -0
- package/dist/agent/protocol.d.ts.map +1 -0
- package/dist/agent/protocol.js +67 -0
- package/dist/agent/protocol.js.map +1 -0
- package/dist/agent/public.d.ts +12 -0
- package/dist/agent/public.d.ts.map +1 -0
- package/dist/agent/public.js +12 -0
- package/dist/agent/public.js.map +1 -0
- package/dist/agent/replay.d.ts +61 -0
- package/dist/agent/replay.d.ts.map +1 -0
- package/dist/agent/replay.js +185 -0
- package/dist/agent/replay.js.map +1 -0
- package/dist/agent/secrets.d.ts +22 -0
- package/dist/agent/secrets.d.ts.map +1 -0
- package/dist/agent/secrets.js +63 -0
- package/dist/agent/secrets.js.map +1 -0
- package/dist/agent/step-cache.d.ts +156 -0
- package/dist/agent/step-cache.d.ts.map +1 -0
- package/dist/agent/step-cache.js +301 -0
- package/dist/agent/step-cache.js.map +1 -0
- package/dist/agent/tool-loop.d.ts +51 -0
- package/dist/agent/tool-loop.d.ts.map +1 -0
- package/dist/agent/tool-loop.js +331 -0
- package/dist/agent/tool-loop.js.map +1 -0
- package/dist/agent/tool.d.ts +39 -0
- package/dist/agent/tool.d.ts.map +1 -0
- package/dist/agent/tool.js +52 -0
- package/dist/agent/tool.js.map +1 -0
- package/dist/backend/contract.d.ts +186 -0
- package/dist/backend/contract.d.ts.map +1 -0
- package/dist/backend/contract.js +65 -0
- package/dist/backend/contract.js.map +1 -0
- package/dist/backend/index.d.ts +316 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +219 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/session.d.ts +23 -0
- package/dist/backend/session.d.ts.map +1 -0
- package/dist/backend/session.js +213 -0
- package/dist/backend/session.js.map +1 -0
- package/dist/backend/surface.d.ts +83 -0
- package/dist/backend/surface.d.ts.map +1 -0
- package/dist/backend/surface.js +11 -0
- package/dist/backend/surface.js.map +1 -0
- package/dist/cache/anchors.d.ts +37 -0
- package/dist/cache/anchors.d.ts.map +1 -0
- package/dist/cache/anchors.js +89 -0
- package/dist/cache/anchors.js.map +1 -0
- package/dist/cache/context.d.ts +74 -0
- package/dist/cache/context.d.ts.map +1 -0
- package/dist/cache/context.js +82 -0
- package/dist/cache/context.js.map +1 -0
- package/dist/cache/decide.d.ts +42 -0
- package/dist/cache/decide.d.ts.map +1 -0
- package/dist/cache/decide.js +47 -0
- package/dist/cache/decide.js.map +1 -0
- package/dist/cache/identity.d.ts +113 -0
- package/dist/cache/identity.d.ts.map +1 -0
- package/dist/cache/identity.js +109 -0
- package/dist/cache/identity.js.map +1 -0
- package/dist/cache/recorder.d.ts +76 -0
- package/dist/cache/recorder.d.ts.map +1 -0
- package/dist/cache/recorder.js +143 -0
- package/dist/cache/recorder.js.map +1 -0
- package/dist/cache/relocate.d.ts +69 -0
- package/dist/cache/relocate.d.ts.map +1 -0
- package/dist/cache/relocate.js +125 -0
- package/dist/cache/relocate.js.map +1 -0
- package/dist/cache/store.d.ts +68 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +106 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/trace.d.ts +146 -0
- package/dist/cache/trace.d.ts.map +1 -0
- package/dist/cache/trace.js +249 -0
- package/dist/cache/trace.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +4 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +108 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +6 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +101 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/collect/collect.d.ts +44 -0
- package/dist/collect/collect.d.ts.map +1 -0
- package/dist/collect/collect.js +89 -0
- package/dist/collect/collect.js.map +1 -0
- package/dist/collect/registry.d.ts +47 -0
- package/dist/collect/registry.d.ts.map +1 -0
- package/dist/collect/registry.js +262 -0
- package/dist/collect/registry.js.map +1 -0
- package/dist/collect/select.d.ts +54 -0
- package/dist/collect/select.d.ts.map +1 -0
- package/dist/collect/select.js +230 -0
- package/dist/collect/select.js.map +1 -0
- package/dist/config/agent.d.ts +91 -0
- package/dist/config/agent.d.ts.map +1 -0
- package/dist/config/agent.js +232 -0
- package/dist/config/agent.js.map +1 -0
- package/dist/config/load.d.ts +23 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +75 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/resolve.d.ts +94 -0
- package/dist/config/resolve.d.ts.map +1 -0
- package/dist/config/resolve.js +500 -0
- package/dist/config/resolve.js.map +1 -0
- package/dist/config/validate.d.ts +6 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/validate.js +21 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/credentials.d.ts +7 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +42 -0
- package/dist/credentials.js.map +1 -0
- package/dist/expect/async.d.ts +5 -0
- package/dist/expect/async.d.ts.map +1 -0
- package/dist/expect/async.js +186 -0
- package/dist/expect/async.js.map +1 -0
- package/dist/expect/index.d.ts +7 -0
- package/dist/expect/index.d.ts.map +1 -0
- package/dist/expect/index.js +23 -0
- package/dist/expect/index.js.map +1 -0
- package/dist/expect/values.d.ts +4 -0
- package/dist/expect/values.d.ts.map +1 -0
- package/dist/expect/values.js +108 -0
- package/dist/expect/values.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/ai-trace.d.ts +151 -0
- package/dist/internal/ai-trace.d.ts.map +1 -0
- package/dist/internal/ai-trace.js +360 -0
- package/dist/internal/ai-trace.js.map +1 -0
- package/dist/internal/brands.d.ts +9 -0
- package/dist/internal/brands.d.ts.map +1 -0
- package/dist/internal/brands.js +9 -0
- package/dist/internal/brands.js.map +1 -0
- package/dist/internal/debug.d.ts +43 -0
- package/dist/internal/debug.d.ts.map +1 -0
- package/dist/internal/debug.js +102 -0
- package/dist/internal/debug.js.map +1 -0
- package/dist/internal/errors.d.ts +98 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +212 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/globs.d.ts +29 -0
- package/dist/internal/globs.d.ts.map +1 -0
- package/dist/internal/globs.js +126 -0
- package/dist/internal/globs.js.map +1 -0
- package/dist/internal/ids.d.ts +32 -0
- package/dist/internal/ids.d.ts.map +1 -0
- package/dist/internal/ids.js +124 -0
- package/dist/internal/ids.js.map +1 -0
- package/dist/internal/json-value.d.ts +15 -0
- package/dist/internal/json-value.d.ts.map +1 -0
- package/dist/internal/json-value.js +61 -0
- package/dist/internal/json-value.js.map +1 -0
- package/dist/internal/package-version.d.ts +6 -0
- package/dist/internal/package-version.d.ts.map +1 -0
- package/dist/internal/package-version.js +14 -0
- package/dist/internal/package-version.js.map +1 -0
- package/dist/internal/realm-slot.d.ts +13 -0
- package/dist/internal/realm-slot.d.ts.map +1 -0
- package/dist/internal/realm-slot.js +23 -0
- package/dist/internal/realm-slot.js.map +1 -0
- package/dist/internal/redact.d.ts +33 -0
- package/dist/internal/redact.d.ts.map +1 -0
- package/dist/internal/redact.js +56 -0
- package/dist/internal/redact.js.map +1 -0
- package/dist/internal/regexp.d.ts +10 -0
- package/dist/internal/regexp.d.ts.map +1 -0
- package/dist/internal/regexp.js +27 -0
- package/dist/internal/regexp.js.map +1 -0
- package/dist/internal/text.d.ts +39 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +66 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/time.d.ts +37 -0
- package/dist/internal/time.d.ts.map +1 -0
- package/dist/internal/time.js +91 -0
- package/dist/internal/time.js.map +1 -0
- package/dist/internal/trace.d.ts +18 -0
- package/dist/internal/trace.d.ts.map +1 -0
- package/dist/internal/trace.js +46 -0
- package/dist/internal/trace.js.map +1 -0
- package/dist/internal/urls.d.ts +31 -0
- package/dist/internal/urls.d.ts.map +1 -0
- package/dist/internal/urls.js +95 -0
- package/dist/internal/urls.js.map +1 -0
- package/dist/locator/engine.d.ts +65 -0
- package/dist/locator/engine.d.ts.map +1 -0
- package/dist/locator/engine.js +164 -0
- package/dist/locator/engine.js.map +1 -0
- package/dist/locator/expression.d.ts +19 -0
- package/dist/locator/expression.d.ts.map +1 -0
- package/dist/locator/expression.js +85 -0
- package/dist/locator/expression.js.map +1 -0
- package/dist/locator/screen.d.ts +36 -0
- package/dist/locator/screen.d.ts.map +1 -0
- package/dist/locator/screen.js +281 -0
- package/dist/locator/screen.js.map +1 -0
- package/dist/report/build.d.ts +214 -0
- package/dist/report/build.d.ts.map +1 -0
- package/dist/report/build.js +346 -0
- package/dist/report/build.js.map +1 -0
- package/dist/report/code-frame.d.ts +20 -0
- package/dist/report/code-frame.d.ts.map +1 -0
- package/dist/report/code-frame.js +73 -0
- package/dist/report/code-frame.js.map +1 -0
- package/dist/report/debug-steps.d.ts +14 -0
- package/dist/report/debug-steps.d.ts.map +1 -0
- package/dist/report/debug-steps.js +85 -0
- package/dist/report/debug-steps.js.map +1 -0
- package/dist/report/list.d.ts +80 -0
- package/dist/report/list.d.ts.map +1 -0
- package/dist/report/list.js +372 -0
- package/dist/report/list.js.map +1 -0
- package/dist/report/live-status.d.ts +51 -0
- package/dist/report/live-status.d.ts.map +1 -0
- package/dist/report/live-status.js +162 -0
- package/dist/report/live-status.js.map +1 -0
- package/dist/report/write.d.ts +4 -0
- package/dist/report/write.d.ts.map +1 -0
- package/dist/report/write.js +13 -0
- package/dist/report/write.js.map +1 -0
- package/dist/run/app-process.d.ts +18 -0
- package/dist/run/app-process.d.ts.map +1 -0
- package/dist/run/app-process.js +112 -0
- package/dist/run/app-process.js.map +1 -0
- package/dist/run/artifacts.d.ts +51 -0
- package/dist/run/artifacts.d.ts.map +1 -0
- package/dist/run/artifacts.js +114 -0
- package/dist/run/artifacts.js.map +1 -0
- package/dist/run/events.d.ts +100 -0
- package/dist/run/events.d.ts.map +1 -0
- package/dist/run/events.js +59 -0
- package/dist/run/events.js.map +1 -0
- package/dist/run/execute.d.ts +119 -0
- package/dist/run/execute.d.ts.map +1 -0
- package/dist/run/execute.js +555 -0
- package/dist/run/execute.js.map +1 -0
- package/dist/run/fixtures.d.ts +40 -0
- package/dist/run/fixtures.d.ts.map +1 -0
- package/dist/run/fixtures.js +408 -0
- package/dist/run/fixtures.js.map +1 -0
- package/dist/run/in-process.d.ts +24 -0
- package/dist/run/in-process.d.ts.map +1 -0
- package/dist/run/in-process.js +120 -0
- package/dist/run/in-process.js.map +1 -0
- package/dist/run/public.d.ts +19 -0
- package/dist/run/public.d.ts.map +1 -0
- package/dist/run/public.js +11 -0
- package/dist/run/public.js.map +1 -0
- package/dist/run/realm.d.ts +52 -0
- package/dist/run/realm.d.ts.map +1 -0
- package/dist/run/realm.js +101 -0
- package/dist/run/realm.js.map +1 -0
- package/dist/run/records.d.ts +87 -0
- package/dist/run/records.d.ts.map +1 -0
- package/dist/run/records.js +3 -0
- package/dist/run/records.js.map +1 -0
- package/dist/run/retry.d.ts +18 -0
- package/dist/run/retry.d.ts.map +1 -0
- package/dist/run/retry.js +33 -0
- package/dist/run/retry.js.map +1 -0
- package/dist/run/runner.d.ts +49 -0
- package/dist/run/runner.d.ts.map +1 -0
- package/dist/run/runner.js +375 -0
- package/dist/run/runner.js.map +1 -0
- package/dist/run/scheduler.d.ts +45 -0
- package/dist/run/scheduler.d.ts.map +1 -0
- package/dist/run/scheduler.js +512 -0
- package/dist/run/scheduler.js.map +1 -0
- package/dist/run/serial.d.ts +52 -0
- package/dist/run/serial.d.ts.map +1 -0
- package/dist/run/serial.js +247 -0
- package/dist/run/serial.js.map +1 -0
- package/dist/run/sessions.d.ts +54 -0
- package/dist/run/sessions.d.ts.map +1 -0
- package/dist/run/sessions.js +221 -0
- package/dist/run/sessions.js.map +1 -0
- package/dist/run/steps.d.ts +196 -0
- package/dist/run/steps.d.ts.map +1 -0
- package/dist/run/steps.js +151 -0
- package/dist/run/steps.js.map +1 -0
- package/dist/run/unit-runner.d.ts +30 -0
- package/dist/run/unit-runner.d.ts.map +1 -0
- package/dist/run/unit-runner.js +11 -0
- package/dist/run/unit-runner.js.map +1 -0
- package/dist/run/units.d.ts +50 -0
- package/dist/run/units.d.ts.map +1 -0
- package/dist/run/units.js +103 -0
- package/dist/run/units.js.map +1 -0
- package/dist/run/worker/entry.d.ts +8 -0
- package/dist/run/worker/entry.d.ts.map +1 -0
- package/dist/run/worker/entry.js +137 -0
- package/dist/run/worker/entry.js.map +1 -0
- package/dist/run/worker/handle.d.ts +10 -0
- package/dist/run/worker/handle.d.ts.map +1 -0
- package/dist/run/worker/handle.js +74 -0
- package/dist/run/worker/handle.js.map +1 -0
- package/dist/run/worker/protocol.d.ts +129 -0
- package/dist/run/worker/protocol.d.ts.map +1 -0
- package/dist/run/worker/protocol.js +18 -0
- package/dist/run/worker/protocol.js.map +1 -0
- package/dist/run/worker/session.d.ts +69 -0
- package/dist/run/worker/session.d.ts.map +1 -0
- package/dist/run/worker/session.js +123 -0
- package/dist/run/worker/session.js.map +1 -0
- package/dist/types.d.ts +630 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/** Attempt-scoped step timeline (spec 10-determinism.md, 13-reporting.md). */
|
|
2
|
+
import type { ReplayHandOffReason } from '../agent/executor.ts';
|
|
3
|
+
import type { TraceReplayMissReason } from '../cache/decide.ts';
|
|
4
|
+
import { type SerializedError } from '../internal/errors.ts';
|
|
5
|
+
export type StepKind = 'agent' | 'locator' | 'assertion' | 'screen' | 'app' | 'session' | 'resource';
|
|
6
|
+
/**
|
|
7
|
+
* Child event of one public step: polls, model calls, policy decisions.
|
|
8
|
+
* `tool-proposal` (report-1) belongs to the planning tier and is not emitted
|
|
9
|
+
* by this milestone.
|
|
10
|
+
*/
|
|
11
|
+
export interface StepEvent {
|
|
12
|
+
kind: 'poll' | 'observation' | 'model' | 'policy' | 'backend' | 'schema';
|
|
13
|
+
startedAt: string;
|
|
14
|
+
durationMs: number;
|
|
15
|
+
status: 'passed' | 'failed' | 'cancelled';
|
|
16
|
+
name?: string;
|
|
17
|
+
count?: number;
|
|
18
|
+
bytes?: number;
|
|
19
|
+
decision?: 'allowed' | 'denied';
|
|
20
|
+
code?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Redacted human prose for what the event did — `tap button "Approve"`,
|
|
23
|
+
* `fill secret "password" into textbox "Password"`. Driver action events
|
|
24
|
+
* carry one so a live reporter can render the act without a side lookup;
|
|
25
|
+
* secret values never appear (the name stands in), and the text is bounded.
|
|
26
|
+
*/
|
|
27
|
+
detail?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Required accounting for every agent step. */
|
|
30
|
+
export interface StepMetrics {
|
|
31
|
+
modelCalls: number;
|
|
32
|
+
actionSteps: number;
|
|
33
|
+
observationBytes: number;
|
|
34
|
+
contextBytes: number;
|
|
35
|
+
ledgerBytes: number;
|
|
36
|
+
/** Largest masked image sent to the model in this step, in bytes. */
|
|
37
|
+
pixelBytes?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Why a vision step fell back to tree-only input. Pixel evidence degrades
|
|
41
|
+
* rather than failing the step (spec 14-security.md).
|
|
42
|
+
*/
|
|
43
|
+
export type VisionDegradation = 'PIXEL_TAINTED' | 'MASKING_UNPROVEN' | 'UNSUPPORTED_CAPABILITY';
|
|
44
|
+
/** Model provenance and usage for one model-backed step. */
|
|
45
|
+
export interface StepModelInfo {
|
|
46
|
+
provider: string;
|
|
47
|
+
model: string;
|
|
48
|
+
endpoint: string;
|
|
49
|
+
adapterVersion: string;
|
|
50
|
+
policyVersion: string;
|
|
51
|
+
calls: number;
|
|
52
|
+
tokenAccounting: 'provider' | 'adapter-upper-bound';
|
|
53
|
+
peakTokensPerCall: number;
|
|
54
|
+
inputTokens: number;
|
|
55
|
+
outputTokens: number;
|
|
56
|
+
estimatedCostUsd?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* How the trace cache participated in one agent step. `self-finalized` means
|
|
60
|
+
* the full trace replayed and the step passed with zero model calls;
|
|
61
|
+
* `agent-concluded` means a replayed prefix handed the step to the executor;
|
|
62
|
+
* `missed` means the executor ran the step from the top.
|
|
63
|
+
*/
|
|
64
|
+
export interface StepCacheInfo {
|
|
65
|
+
mode: 'self-finalized' | 'agent-concluded' | 'missed';
|
|
66
|
+
/** The miss or hand-off reason token; absent on `self-finalized`. */
|
|
67
|
+
reason?: TraceReplayMissReason | ReplayHandOffReason;
|
|
68
|
+
replayedActions: number;
|
|
69
|
+
totalActions: number;
|
|
70
|
+
}
|
|
71
|
+
/** Agent-specific step detail attached while the step is still running. */
|
|
72
|
+
export interface StepAgentDetails {
|
|
73
|
+
metrics?: StepMetrics;
|
|
74
|
+
model?: StepModelInfo;
|
|
75
|
+
cache?: StepCacheInfo;
|
|
76
|
+
observationRevision?: string;
|
|
77
|
+
explanation?: string;
|
|
78
|
+
/** True when masked pixel evidence was model input, not just an artifact. */
|
|
79
|
+
visionInput?: boolean;
|
|
80
|
+
visionDegraded?: VisionDegradation;
|
|
81
|
+
/**
|
|
82
|
+
* True when `vision: 'only'` withheld the semantic tree, leaving the masked
|
|
83
|
+
* screenshot as the model's only evidence. `metrics.observationBytes` is then
|
|
84
|
+
* zero, because the observation contributed nothing to the request.
|
|
85
|
+
*/
|
|
86
|
+
visionOnly?: boolean;
|
|
87
|
+
}
|
|
88
|
+
export interface StepRecord {
|
|
89
|
+
id: string;
|
|
90
|
+
index: number;
|
|
91
|
+
kind: StepKind;
|
|
92
|
+
api: string;
|
|
93
|
+
label: string;
|
|
94
|
+
status: 'passed' | 'failed' | 'blocked' | 'timed-out' | 'cancelled';
|
|
95
|
+
startedAt: string;
|
|
96
|
+
durationMs: number;
|
|
97
|
+
observationRevision?: string;
|
|
98
|
+
explanation?: string;
|
|
99
|
+
visionInput?: boolean;
|
|
100
|
+
visionDegraded?: VisionDegradation;
|
|
101
|
+
visionOnly?: boolean;
|
|
102
|
+
viewport?: {
|
|
103
|
+
width: number;
|
|
104
|
+
height: number;
|
|
105
|
+
scale: number;
|
|
106
|
+
};
|
|
107
|
+
metrics?: StepMetrics;
|
|
108
|
+
cache?: StepCacheInfo;
|
|
109
|
+
events: StepEvent[];
|
|
110
|
+
model?: StepModelInfo;
|
|
111
|
+
error?: SerializedError;
|
|
112
|
+
artifacts: string[];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Live progress notification for one step, streamed to reporters as the step
|
|
116
|
+
* runs. Derived from the same records the report persists; the report stays
|
|
117
|
+
* the canonical record.
|
|
118
|
+
*/
|
|
119
|
+
export type StepProgress = {
|
|
120
|
+
readonly phase: 'start';
|
|
121
|
+
readonly kind: StepKind;
|
|
122
|
+
readonly api: string;
|
|
123
|
+
readonly label: string;
|
|
124
|
+
} | {
|
|
125
|
+
readonly phase: 'end';
|
|
126
|
+
readonly kind: StepKind;
|
|
127
|
+
readonly api: string;
|
|
128
|
+
readonly label: string;
|
|
129
|
+
readonly status: StepRecord['status'];
|
|
130
|
+
readonly durationMs: number;
|
|
131
|
+
readonly modelCalls: number;
|
|
132
|
+
} | {
|
|
133
|
+
readonly phase: 'event';
|
|
134
|
+
readonly api: string;
|
|
135
|
+
readonly event: StepEvent;
|
|
136
|
+
};
|
|
137
|
+
/** Per-step options for `StepRecorder.run`. */
|
|
138
|
+
export interface StepRunOptions {
|
|
139
|
+
/**
|
|
140
|
+
* Whether the step checks state rather than producing it: a deterministic
|
|
141
|
+
* assertion, a locator wait, or an agent judgment. Only such a step passing
|
|
142
|
+
* can confirm a staged action trace (cache/context.ts) — an `agent.act`
|
|
143
|
+
* passing is the executor's opinion of its own work, and an `app` or
|
|
144
|
+
* `locator` action passing proves only that the action could be performed.
|
|
145
|
+
* Declared where the step is minted, so the rule cannot drift from the api
|
|
146
|
+
* names.
|
|
147
|
+
*/
|
|
148
|
+
readonly verifies?: boolean;
|
|
149
|
+
}
|
|
150
|
+
export interface StepRecorderOptions {
|
|
151
|
+
/** Caps events retained per step (resolved limits.maxEventsPerStep). */
|
|
152
|
+
readonly maxEventsPerStep?: number;
|
|
153
|
+
/** Live progress sink; omitted in contexts with no reporter to feed. */
|
|
154
|
+
readonly onProgress?: (progress: StepProgress) => void;
|
|
155
|
+
}
|
|
156
|
+
export declare class StepRecorder {
|
|
157
|
+
private readonly attemptId;
|
|
158
|
+
private readonly steps;
|
|
159
|
+
private activeStep;
|
|
160
|
+
/** IDs of steps whose bodies are still executing. */
|
|
161
|
+
private readonly running;
|
|
162
|
+
/** Highest timeline index among passed verification steps, or -1 when none has. */
|
|
163
|
+
private lastVerified;
|
|
164
|
+
private readonly maxEventsPerStep;
|
|
165
|
+
private readonly onProgress;
|
|
166
|
+
constructor(attemptId: string, options?: StepRecorderOptions);
|
|
167
|
+
/** The step currently executing, when inside StepRecorder.run. */
|
|
168
|
+
get currentStepId(): string | undefined;
|
|
169
|
+
/** Timeline index of the currently executing step. */
|
|
170
|
+
get currentStepIndex(): number | undefined;
|
|
171
|
+
/** Highest timeline index among passed verification steps, or -1 when none has. */
|
|
172
|
+
get lastVerifiedStepIndex(): number;
|
|
173
|
+
/** Runs one public API call as a recorded top-level step. */
|
|
174
|
+
run<T>(kind: StepKind, api: string, label: string, body: () => Promise<T>, options?: StepRunOptions): Promise<T>;
|
|
175
|
+
/**
|
|
176
|
+
* Attaches an artifact ID to the running step, or to the most recent step
|
|
177
|
+
* when none is running. The running step wins so a step that ran a nested
|
|
178
|
+
* step (a fixture call that clicked a link, say) still owns what it produced.
|
|
179
|
+
*/
|
|
180
|
+
attachArtifact(artifactId: string): void;
|
|
181
|
+
/** Records one child event of the running step. */
|
|
182
|
+
recordEvent(event: StepEvent): void;
|
|
183
|
+
/** Merges agent metrics, provenance, and judgment detail into the running step. */
|
|
184
|
+
attachAgentDetails(details: StepAgentDetails): void;
|
|
185
|
+
/** Records the viewport a step established. */
|
|
186
|
+
attachViewport(viewport: {
|
|
187
|
+
width: number;
|
|
188
|
+
height: number;
|
|
189
|
+
scale: number;
|
|
190
|
+
}): void;
|
|
191
|
+
all(): readonly StepRecord[];
|
|
192
|
+
/** Steps whose execution has finished, e.g. as prior-step prompt context. */
|
|
193
|
+
completed(): readonly StepRecord[];
|
|
194
|
+
private current;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=steps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../../src/run/steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/** Attempt-scoped step timeline (spec 10-determinism.md, 13-reporting.md). */
|
|
2
|
+
import { isAgentError } from '../agent/error.js';
|
|
3
|
+
import { withAiTraceStep } from '../internal/ai-trace.js';
|
|
4
|
+
import { classifyError, serializeError } from '../internal/errors.js';
|
|
5
|
+
import { timestamp } from '../internal/ids.js';
|
|
6
|
+
export class StepRecorder {
|
|
7
|
+
attemptId;
|
|
8
|
+
steps = [];
|
|
9
|
+
activeStep;
|
|
10
|
+
/** IDs of steps whose bodies are still executing. */
|
|
11
|
+
running = new Set();
|
|
12
|
+
/** Highest timeline index among passed verification steps, or -1 when none has. */
|
|
13
|
+
lastVerified = -1;
|
|
14
|
+
maxEventsPerStep;
|
|
15
|
+
onProgress;
|
|
16
|
+
constructor(attemptId, options = {}) {
|
|
17
|
+
this.attemptId = attemptId;
|
|
18
|
+
this.maxEventsPerStep = options.maxEventsPerStep ?? 1_000;
|
|
19
|
+
this.onProgress = options.onProgress;
|
|
20
|
+
}
|
|
21
|
+
/** The step currently executing, when inside StepRecorder.run. */
|
|
22
|
+
get currentStepId() {
|
|
23
|
+
return this.activeStep?.id;
|
|
24
|
+
}
|
|
25
|
+
/** Timeline index of the currently executing step. */
|
|
26
|
+
get currentStepIndex() {
|
|
27
|
+
return this.activeStep?.index;
|
|
28
|
+
}
|
|
29
|
+
/** Highest timeline index among passed verification steps, or -1 when none has. */
|
|
30
|
+
get lastVerifiedStepIndex() {
|
|
31
|
+
return this.lastVerified;
|
|
32
|
+
}
|
|
33
|
+
/** Runs one public API call as a recorded top-level step. */
|
|
34
|
+
async run(kind, api, label, body, options = {}) {
|
|
35
|
+
const index = this.steps.length;
|
|
36
|
+
const startedAt = timestamp();
|
|
37
|
+
const startedMs = Date.now();
|
|
38
|
+
const record = {
|
|
39
|
+
id: `${this.attemptId}:${index}`,
|
|
40
|
+
index,
|
|
41
|
+
kind,
|
|
42
|
+
api,
|
|
43
|
+
label,
|
|
44
|
+
status: 'passed',
|
|
45
|
+
startedAt,
|
|
46
|
+
durationMs: 0,
|
|
47
|
+
events: [],
|
|
48
|
+
artifacts: [],
|
|
49
|
+
};
|
|
50
|
+
this.steps.push(record);
|
|
51
|
+
this.running.add(record.id);
|
|
52
|
+
const previousActive = this.activeStep;
|
|
53
|
+
this.activeStep = record;
|
|
54
|
+
this.onProgress?.({ phase: 'start', kind, api, label });
|
|
55
|
+
try {
|
|
56
|
+
// Model calls made inside the body are attributed to this step.
|
|
57
|
+
const result = await withAiTraceStep(api, label, body);
|
|
58
|
+
record.durationMs = Date.now() - startedMs;
|
|
59
|
+
if (options.verifies === true)
|
|
60
|
+
this.lastVerified = Math.max(this.lastVerified, index);
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
catch (cause) {
|
|
64
|
+
record.durationMs = Date.now() - startedMs;
|
|
65
|
+
const error = classifyError(cause);
|
|
66
|
+
// A blocked verdict is a distinct outcome, not a product failure: the
|
|
67
|
+
// step's error names what stood in the way, and the report says so.
|
|
68
|
+
record.status =
|
|
69
|
+
error.code === 'CANCELLED'
|
|
70
|
+
? 'cancelled'
|
|
71
|
+
: isAgentError(cause) && cause.blocked
|
|
72
|
+
? 'blocked'
|
|
73
|
+
: 'failed';
|
|
74
|
+
record.error = serializeError(error);
|
|
75
|
+
throw cause;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
this.activeStep = previousActive;
|
|
79
|
+
this.running.delete(record.id);
|
|
80
|
+
this.onProgress?.({
|
|
81
|
+
phase: 'end',
|
|
82
|
+
kind,
|
|
83
|
+
api,
|
|
84
|
+
label,
|
|
85
|
+
status: record.status,
|
|
86
|
+
durationMs: record.durationMs,
|
|
87
|
+
modelCalls: record.events.filter((event) => event.kind === 'model').length,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Attaches an artifact ID to the running step, or to the most recent step
|
|
93
|
+
* when none is running. The running step wins so a step that ran a nested
|
|
94
|
+
* step (a fixture call that clicked a link, say) still owns what it produced.
|
|
95
|
+
*/
|
|
96
|
+
attachArtifact(artifactId) {
|
|
97
|
+
const target = this.activeStep ?? this.steps[this.steps.length - 1];
|
|
98
|
+
if (target !== undefined)
|
|
99
|
+
target.artifacts.push(artifactId);
|
|
100
|
+
}
|
|
101
|
+
/** Records one child event of the running step. */
|
|
102
|
+
recordEvent(event) {
|
|
103
|
+
const current = this.current();
|
|
104
|
+
if (current === undefined)
|
|
105
|
+
return;
|
|
106
|
+
if (current.events.length >= this.maxEventsPerStep)
|
|
107
|
+
return;
|
|
108
|
+
current.events.push(event);
|
|
109
|
+
this.onProgress?.({ phase: 'event', api: current.api, event });
|
|
110
|
+
}
|
|
111
|
+
/** Merges agent metrics, provenance, and judgment detail into the running step. */
|
|
112
|
+
attachAgentDetails(details) {
|
|
113
|
+
const current = this.current();
|
|
114
|
+
if (current === undefined)
|
|
115
|
+
return;
|
|
116
|
+
if (details.metrics !== undefined)
|
|
117
|
+
current.metrics = details.metrics;
|
|
118
|
+
if (details.model !== undefined)
|
|
119
|
+
current.model = details.model;
|
|
120
|
+
if (details.cache !== undefined)
|
|
121
|
+
current.cache = details.cache;
|
|
122
|
+
if (details.observationRevision !== undefined) {
|
|
123
|
+
current.observationRevision = details.observationRevision;
|
|
124
|
+
}
|
|
125
|
+
if (details.explanation !== undefined)
|
|
126
|
+
current.explanation = details.explanation;
|
|
127
|
+
if (details.visionInput !== undefined)
|
|
128
|
+
current.visionInput = details.visionInput;
|
|
129
|
+
if (details.visionDegraded !== undefined)
|
|
130
|
+
current.visionDegraded = details.visionDegraded;
|
|
131
|
+
if (details.visionOnly !== undefined)
|
|
132
|
+
current.visionOnly = details.visionOnly;
|
|
133
|
+
}
|
|
134
|
+
/** Records the viewport a step established. */
|
|
135
|
+
attachViewport(viewport) {
|
|
136
|
+
const current = this.current();
|
|
137
|
+
if (current !== undefined)
|
|
138
|
+
current.viewport = viewport;
|
|
139
|
+
}
|
|
140
|
+
all() {
|
|
141
|
+
return this.steps;
|
|
142
|
+
}
|
|
143
|
+
/** Steps whose execution has finished, e.g. as prior-step prompt context. */
|
|
144
|
+
completed() {
|
|
145
|
+
return this.steps.filter((step) => !this.running.has(step.id));
|
|
146
|
+
}
|
|
147
|
+
current() {
|
|
148
|
+
return this.activeStep;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=steps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/run/steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The seam between the scheduler and whatever actually executes work units.
|
|
3
|
+
*
|
|
4
|
+
* The scheduler only ever talks to a `UnitRunner`: it sends work-unit messages
|
|
5
|
+
* and reacts to record messages coming back. Two implementations exist — a
|
|
6
|
+
* child process (`worker/handle.ts`, the default) and an in-process runner
|
|
7
|
+
* (`in-process.ts`, used when the config cannot cross a process boundary).
|
|
8
|
+
* Keeping this interface narrow is what lets one scheduler own all execution.
|
|
9
|
+
*/
|
|
10
|
+
import type { MainToWorker, WorkerToMain } from './worker/protocol.ts';
|
|
11
|
+
export interface UnitRunnerEvents {
|
|
12
|
+
onMessage(message: WorkerToMain): void;
|
|
13
|
+
/**
|
|
14
|
+
* Fires exactly once when the runner reaches end of life, for any reason.
|
|
15
|
+
* `detail` describes the cause for infrastructure error reporting.
|
|
16
|
+
*/
|
|
17
|
+
onExit(detail: string): void;
|
|
18
|
+
}
|
|
19
|
+
/** One worker bound to a single target, executing at most one unit at a time. */
|
|
20
|
+
export interface UnitRunner {
|
|
21
|
+
/** Resolves when the runner has exited; never rejects. */
|
|
22
|
+
readonly exit: Promise<void>;
|
|
23
|
+
readonly alive: boolean;
|
|
24
|
+
send(message: MainToWorker): void;
|
|
25
|
+
/** Terminates without waiting for in-flight work to unwind. */
|
|
26
|
+
kill(): void;
|
|
27
|
+
}
|
|
28
|
+
/** Creates a runner for one target. Run-wide settings are closed over. */
|
|
29
|
+
export type SpawnUnitRunner = (targetName: string, events: UnitRunnerEvents) => UnitRunner;
|
|
30
|
+
//# sourceMappingURL=unit-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-runner.d.ts","sourceRoot":"","sources":["../../src/run/unit-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IACvC;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,iFAAiF;AACjF,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,+DAA+D;IAC/D,IAAI,IAAI,IAAI,CAAC;CACd;AAED,0EAA0E;AAC1E,MAAM,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,UAAU,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The seam between the scheduler and whatever actually executes work units.
|
|
3
|
+
*
|
|
4
|
+
* The scheduler only ever talks to a `UnitRunner`: it sends work-unit messages
|
|
5
|
+
* and reacts to record messages coming back. Two implementations exist — a
|
|
6
|
+
* child process (`worker/handle.ts`, the default) and an in-process runner
|
|
7
|
+
* (`in-process.ts`, used when the config cannot cross a process boundary).
|
|
8
|
+
* Keeping this interface narrow is what lets one scheduler own all execution.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=unit-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-runner.js","sourceRoot":"","sources":["../../src/run/unit-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Work-unit planning (spec 11-lifecycle.md) and the records for work the
|
|
3
|
+
* scheduler reports without dispatching it. Every `ResultRecord` built from a
|
|
4
|
+
* pair goes through `pairResult`, which narrows the pair's collected test to
|
|
5
|
+
* its serializable identity.
|
|
6
|
+
*/
|
|
7
|
+
import type { Collection, TestIdentity } from '../collect/collect.ts';
|
|
8
|
+
import type { Selection, SkipInfo, TestTargetPair } from '../collect/select.ts';
|
|
9
|
+
import type { ResolvedTarget } from '../config/resolve.ts';
|
|
10
|
+
import type { ResultRecord } from './records.ts';
|
|
11
|
+
/**
|
|
12
|
+
* One schedulable unit: either a single setup pair or every runnable ordinary
|
|
13
|
+
* pair of one file for one target. Units execute on exactly one worker.
|
|
14
|
+
*/
|
|
15
|
+
export interface WorkUnit {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly kind: 'setup' | 'file';
|
|
18
|
+
readonly targetName: string;
|
|
19
|
+
/** Normalized project-root-relative file path. */
|
|
20
|
+
readonly file: string;
|
|
21
|
+
readonly absolutePath: string;
|
|
22
|
+
/** Pairs with disposition `run`, in declaration order. */
|
|
23
|
+
readonly pairs: readonly TestTargetPair[];
|
|
24
|
+
}
|
|
25
|
+
/** Per-target schedule: setup units gate file units. */
|
|
26
|
+
export interface TargetWorkPlan {
|
|
27
|
+
readonly target: ResolvedTarget;
|
|
28
|
+
readonly setupUnits: readonly WorkUnit[];
|
|
29
|
+
readonly fileUnits: readonly WorkUnit[];
|
|
30
|
+
/** Non-run ordinary pairs the scheduler reports without dispatching. */
|
|
31
|
+
readonly immediate: readonly TestTargetPair[];
|
|
32
|
+
}
|
|
33
|
+
/** Builds per-target work plans from a selection, preserving report order. */
|
|
34
|
+
export declare function buildWorkPlans(selection: Selection, collection: Collection, projectRoot: string): TargetWorkPlan[];
|
|
35
|
+
/** Skip info for a pair whose session-producing setup did not pass. */
|
|
36
|
+
export declare function setupFailedSkip(session: string, setupTestId: string): SkipInfo;
|
|
37
|
+
/** Skip info for runnable work an interrupt cancelled before it started. */
|
|
38
|
+
export declare const INTERRUPTED_BEFORE_START: SkipInfo;
|
|
39
|
+
/**
|
|
40
|
+
* Builds a result for one pair, narrowing the collected test to its identity
|
|
41
|
+
* so no test function or realm state can reach a record or the wire.
|
|
42
|
+
*/
|
|
43
|
+
export declare function pairResult(pair: TestTargetPair, fields: Omit<ResultRecord, 'test' | 'target'>): ResultRecord;
|
|
44
|
+
/** Result for a pair reported skipped or unselected without ever dispatching. */
|
|
45
|
+
export declare function nonRunResult(pair: TestTargetPair): ResultRecord;
|
|
46
|
+
/** Result for a runnable pair the run never started. */
|
|
47
|
+
export declare function unstartedResult(pair: TestTargetPair, skip: SkipInfo): ResultRecord;
|
|
48
|
+
/** Result for a test that vanished between planning and execution. */
|
|
49
|
+
export declare function disappearedResult(test: TestIdentity, target: ResolvedTarget): ResultRecord;
|
|
50
|
+
//# sourceMappingURL=units.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"units.d.ts","sourceRoot":"","sources":["../../src/run/units.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CAC3C;AAED,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,SAAS,QAAQ,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IACxC,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;CAC/C;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAC5B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,GAClB,cAAc,EAAE,CA2ClB;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,QAAQ,CAM9E;AAED,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,EAAE,QAGtC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,CAAC,GAC5C,YAAY,CAEd;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAU/D;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,CAOlF;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,GAAG,YAAY,CAE1F"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Work-unit planning (spec 11-lifecycle.md) and the records for work the
|
|
3
|
+
* scheduler reports without dispatching it. Every `ResultRecord` built from a
|
|
4
|
+
* pair goes through `pairResult`, which narrows the pair's collected test to
|
|
5
|
+
* its serializable identity.
|
|
6
|
+
*/
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { testIdentity } from '../collect/collect.js';
|
|
9
|
+
/** Builds per-target work plans from a selection, preserving report order. */
|
|
10
|
+
export function buildWorkPlans(selection, collection, projectRoot) {
|
|
11
|
+
return selection.perTarget.map(({ target, pairs }) => {
|
|
12
|
+
// One pass sorts every pair into its bucket; files are then visited in
|
|
13
|
+
// collection order so unit order (and thus report order) is stable.
|
|
14
|
+
const setupUnits = [];
|
|
15
|
+
const runnableByFile = new Map();
|
|
16
|
+
const immediate = [];
|
|
17
|
+
for (const pair of pairs) {
|
|
18
|
+
if (pair.test.kind === 'setup') {
|
|
19
|
+
if (pair.disposition !== 'run')
|
|
20
|
+
continue;
|
|
21
|
+
setupUnits.push({
|
|
22
|
+
id: `setup::${target.name}::${pair.test.id}`,
|
|
23
|
+
kind: 'setup',
|
|
24
|
+
targetName: target.name,
|
|
25
|
+
file: pair.test.file,
|
|
26
|
+
absolutePath: path.resolve(projectRoot, pair.test.file),
|
|
27
|
+
pairs: [pair],
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
else if (pair.disposition !== 'run') {
|
|
31
|
+
immediate.push(pair);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const bucket = runnableByFile.get(pair.test.file);
|
|
35
|
+
if (bucket === undefined)
|
|
36
|
+
runnableByFile.set(pair.test.file, [pair]);
|
|
37
|
+
else
|
|
38
|
+
bucket.push(pair);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const fileUnits = [];
|
|
42
|
+
for (const file of collection.files) {
|
|
43
|
+
const filePairs = runnableByFile.get(file.file);
|
|
44
|
+
if (filePairs === undefined)
|
|
45
|
+
continue;
|
|
46
|
+
fileUnits.push({
|
|
47
|
+
id: `file::${target.name}::${file.file}`,
|
|
48
|
+
kind: 'file',
|
|
49
|
+
targetName: target.name,
|
|
50
|
+
file: file.file,
|
|
51
|
+
absolutePath: file.absolutePath,
|
|
52
|
+
pairs: filePairs.toSorted((a, b) => a.test.declarationIndex - b.test.declarationIndex),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return { target, setupUnits, fileUnits, immediate };
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** Skip info for a pair whose session-producing setup did not pass. */
|
|
59
|
+
export function setupFailedSkip(session, setupTestId) {
|
|
60
|
+
return {
|
|
61
|
+
cause: 'setup-failed',
|
|
62
|
+
reason: `setup for session "${session}" failed`,
|
|
63
|
+
relatedId: setupTestId,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Skip info for runnable work an interrupt cancelled before it started. */
|
|
67
|
+
export const INTERRUPTED_BEFORE_START = {
|
|
68
|
+
cause: 'infrastructure-unavailable',
|
|
69
|
+
reason: 'run interrupted before execution',
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Builds a result for one pair, narrowing the collected test to its identity
|
|
73
|
+
* so no test function or realm state can reach a record or the wire.
|
|
74
|
+
*/
|
|
75
|
+
export function pairResult(pair, fields) {
|
|
76
|
+
return { test: testIdentity(pair.test), target: pair.target, ...fields };
|
|
77
|
+
}
|
|
78
|
+
/** Result for a pair reported skipped or unselected without ever dispatching. */
|
|
79
|
+
export function nonRunResult(pair) {
|
|
80
|
+
if (pair.disposition === 'skip') {
|
|
81
|
+
return pairResult(pair, { status: 'skipped', selected: true, skip: pair.skip, attempts: [] });
|
|
82
|
+
}
|
|
83
|
+
return pairResult(pair, {
|
|
84
|
+
status: 'skipped',
|
|
85
|
+
selected: false,
|
|
86
|
+
skip: pair.skip ?? { cause: 'filtered', reason: 'not selected' },
|
|
87
|
+
attempts: [],
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/** Result for a runnable pair the run never started. */
|
|
91
|
+
export function unstartedResult(pair, skip) {
|
|
92
|
+
return pairResult(pair, {
|
|
93
|
+
status: 'skipped',
|
|
94
|
+
selected: pair.disposition === 'run',
|
|
95
|
+
skip,
|
|
96
|
+
attempts: [],
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/** Result for a test that vanished between planning and execution. */
|
|
100
|
+
export function disappearedResult(test, target) {
|
|
101
|
+
return { test, target, status: 'failed', selected: true, attempts: [] };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=units.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/run/units.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker process glue. Owns nothing but the process: it loads the config
|
|
3
|
+
* itself (config modules may hold live backend handles that cannot cross
|
|
4
|
+
* IPC), resolves each unit's pairs by re-importing the file, and hands all
|
|
5
|
+
* actual execution to `TargetWorker`.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../../src/run/worker/entry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|