@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,346 @@
|
|
|
1
|
+
/** report-1 document construction (spec 13-reporting.md). */
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import { BACKEND_SPI_VERSION } from '../backend/contract.js';
|
|
4
|
+
import { BLOCKABLE_CODES } from '../agent/executor.js';
|
|
5
|
+
import { DEFAULT_OBSERVATION_BYTES, resolveLimits } from '../config/agent.js';
|
|
6
|
+
import { resultId, timestamp } from '../internal/ids.js';
|
|
7
|
+
import { packageVersion } from '../internal/package-version.js';
|
|
8
|
+
/**
|
|
9
|
+
* What a target's backend declaration says about it: the one description the
|
|
10
|
+
* runner grades against and the report records. A target without a backend is
|
|
11
|
+
* agent-tools-only and honestly reports no capabilities.
|
|
12
|
+
*/
|
|
13
|
+
export function describeTarget(target) {
|
|
14
|
+
const backend = target.backend;
|
|
15
|
+
const artifactCapabilities = [];
|
|
16
|
+
if (backend?.artifacts !== undefined) {
|
|
17
|
+
artifactCapabilities.push('screenshot');
|
|
18
|
+
if (backend.artifacts.startTrace !== undefined)
|
|
19
|
+
artifactCapabilities.push('trace');
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
backend: {
|
|
23
|
+
name: backend?.name ?? 'none',
|
|
24
|
+
version: backend?.version ?? 'unversioned',
|
|
25
|
+
spiVersion: backend?.spiVersion ?? BACKEND_SPI_VERSION,
|
|
26
|
+
},
|
|
27
|
+
capabilities: [...(backend?.capabilities ?? [])].toSorted(),
|
|
28
|
+
artifactCapabilities,
|
|
29
|
+
stateCapability: backend?.state !== undefined,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function relativeSource(config, source, fallbackFile) {
|
|
33
|
+
if (source === undefined)
|
|
34
|
+
return { file: fallbackFile, line: 1, column: 1 };
|
|
35
|
+
let file = source.file;
|
|
36
|
+
if (config !== undefined && file.startsWith(config.projectRoot)) {
|
|
37
|
+
file = file.slice(config.projectRoot.length).replace(/^[/\\]/, '').split('\\').join('/');
|
|
38
|
+
}
|
|
39
|
+
if (file.startsWith('/') || /^[A-Za-z]:/.test(file)) {
|
|
40
|
+
file = fallbackFile;
|
|
41
|
+
}
|
|
42
|
+
return { file, line: Math.max(1, source.line), column: Math.max(1, source.column) };
|
|
43
|
+
}
|
|
44
|
+
/** Step source capture is not implemented yet (spec 13-reporting.md). */
|
|
45
|
+
const UNIMPLEMENTED_STEP_SOURCE = { file: 'unknown', line: 1, column: 1 };
|
|
46
|
+
function serializeStep(step) {
|
|
47
|
+
const { error, ...rest } = step;
|
|
48
|
+
return {
|
|
49
|
+
...rest,
|
|
50
|
+
source: UNIMPLEMENTED_STEP_SOURCE,
|
|
51
|
+
error: error === undefined ? undefined : serializeErrorRecord(error),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** SerializedError minus the stack, which never enters the report. */
|
|
55
|
+
function serializeErrorRecord(error) {
|
|
56
|
+
const { stack, ...report } = error;
|
|
57
|
+
void stack;
|
|
58
|
+
return report;
|
|
59
|
+
}
|
|
60
|
+
function serializeAttemptBase(attempt) {
|
|
61
|
+
return {
|
|
62
|
+
id: attempt.id,
|
|
63
|
+
index: attempt.index,
|
|
64
|
+
status: attempt.status,
|
|
65
|
+
startedAt: attempt.startedAt,
|
|
66
|
+
durationMs: attempt.durationMs,
|
|
67
|
+
artifacts: attempt.artifacts,
|
|
68
|
+
error: attempt.error === undefined ? undefined : serializeErrorRecord(attempt.error),
|
|
69
|
+
secondaryErrors: attempt.secondaryErrors.map(serializeErrorRecord),
|
|
70
|
+
cleanup: attempt.cleanup,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function serializeAttempt(attempt) {
|
|
74
|
+
return { ...serializeAttemptBase(attempt), steps: attempt.steps.map(serializeStep) };
|
|
75
|
+
}
|
|
76
|
+
function serializeSerialMember(member) {
|
|
77
|
+
return {
|
|
78
|
+
id: member.id,
|
|
79
|
+
index: member.index,
|
|
80
|
+
testId: member.testId,
|
|
81
|
+
status: member.status,
|
|
82
|
+
startedAt: member.startedAt,
|
|
83
|
+
durationMs: member.durationMs,
|
|
84
|
+
steps: member.status === 'skipped' ? [] : member.steps.map(serializeStep),
|
|
85
|
+
error: member.error === undefined ? undefined : serializeErrorRecord(member.error),
|
|
86
|
+
skip: member.status === 'skipped' ? member.skip : undefined,
|
|
87
|
+
secondaryErrors: member.secondaryErrors.map(serializeErrorRecord),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function serializeSerialAttempt(attempt) {
|
|
91
|
+
return { ...serializeAttemptBase(attempt), members: attempt.members.map(serializeSerialMember) };
|
|
92
|
+
}
|
|
93
|
+
function serializeSerialGroup(group) {
|
|
94
|
+
return {
|
|
95
|
+
id: group.id,
|
|
96
|
+
serialId: group.serialId,
|
|
97
|
+
declarationIndex: group.declarationIndex,
|
|
98
|
+
file: group.file,
|
|
99
|
+
source: { file: group.file, line: 1, column: 1 },
|
|
100
|
+
titlePath: group.titlePath,
|
|
101
|
+
targetId: group.targetId,
|
|
102
|
+
platform: group.platform,
|
|
103
|
+
memberTestIds: group.memberTestIds,
|
|
104
|
+
status: group.status,
|
|
105
|
+
skip: group.status === 'skipped' ? group.skip : undefined,
|
|
106
|
+
attempts: group.attempts.map(serializeSerialAttempt),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function serializeResult(config, result) {
|
|
110
|
+
return {
|
|
111
|
+
id: resultId(result.test.id, result.target.name),
|
|
112
|
+
testId: result.test.id,
|
|
113
|
+
kind: result.test.kind,
|
|
114
|
+
declarationIndex: result.test.declarationIndex,
|
|
115
|
+
titlePath: result.test.titlePath,
|
|
116
|
+
file: result.test.file,
|
|
117
|
+
source: relativeSource(config, result.test.source, result.test.file),
|
|
118
|
+
targetId: result.target.name,
|
|
119
|
+
platform: result.target.platform,
|
|
120
|
+
serialGroupId: result.serialGroupId,
|
|
121
|
+
status: result.status,
|
|
122
|
+
skip: result.status === 'skipped' ? result.skip : undefined,
|
|
123
|
+
attempts: result.serialGroupId !== undefined ? [] : result.attempts.map(serializeAttempt),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function serializeTarget(config, target, provenance) {
|
|
127
|
+
// Provenance exists for every selected target; an unselected one is
|
|
128
|
+
// described from its declaration the same way.
|
|
129
|
+
return {
|
|
130
|
+
id: target.name,
|
|
131
|
+
index: target.index,
|
|
132
|
+
platform: target.platform,
|
|
133
|
+
baseOrigin: config.app.base.origin,
|
|
134
|
+
environment: config.app.environment,
|
|
135
|
+
allowProduction: config.app.allowProduction,
|
|
136
|
+
testIdAttribute: config.testIdAttribute,
|
|
137
|
+
...(provenance ?? describeTarget(target)),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** Computes report-1 summary counts from results. */
|
|
141
|
+
function computeSummary(results) {
|
|
142
|
+
let selected = 0;
|
|
143
|
+
let executed = 0;
|
|
144
|
+
let passed = 0;
|
|
145
|
+
let failed = 0;
|
|
146
|
+
let flaky = 0;
|
|
147
|
+
let skipped = 0;
|
|
148
|
+
for (const result of results) {
|
|
149
|
+
if (result.selected)
|
|
150
|
+
selected += 1;
|
|
151
|
+
if (result.attempts.length > 0 || (result.serialGroupId !== undefined && result.status !== 'skipped')) {
|
|
152
|
+
executed += 1;
|
|
153
|
+
}
|
|
154
|
+
switch (result.status) {
|
|
155
|
+
case 'passed':
|
|
156
|
+
passed += 1;
|
|
157
|
+
break;
|
|
158
|
+
case 'flaky':
|
|
159
|
+
flaky += 1;
|
|
160
|
+
break;
|
|
161
|
+
case 'failed':
|
|
162
|
+
case 'timed-out':
|
|
163
|
+
case 'interrupted':
|
|
164
|
+
failed += 1;
|
|
165
|
+
break;
|
|
166
|
+
case 'skipped':
|
|
167
|
+
skipped += 1;
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { discovered: results.length, selected, executed, passed, failed, flaky, skipped };
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* A run is `blocked` — not failed — when it did not pass and *every*
|
|
175
|
+
* non-passing result carries a blockable error code: credentials, the
|
|
176
|
+
* environment, or the agent's own budget prevented a product verdict, and
|
|
177
|
+
* nothing contradicts that. One genuine failure keeps the run failed;
|
|
178
|
+
* derivation requires positive evidence, never absence of it.
|
|
179
|
+
*/
|
|
180
|
+
function deriveRunStatus(status, results, serialGroups) {
|
|
181
|
+
if (status !== 'failed' && status !== 'error')
|
|
182
|
+
return status;
|
|
183
|
+
// Serial members carry no attempts of their own; their failing error lives
|
|
184
|
+
// on the group's last attempt (or its failing member).
|
|
185
|
+
const groupCode = new Map();
|
|
186
|
+
for (const group of serialGroups) {
|
|
187
|
+
const attempt = group.attempts.at(-1);
|
|
188
|
+
const member = attempt?.members.find((candidate) => candidate.status !== 'passed' && candidate.status !== 'skipped');
|
|
189
|
+
groupCode.set(group.id, member?.error?.code ?? attempt?.error?.code);
|
|
190
|
+
}
|
|
191
|
+
let sawFailure = false;
|
|
192
|
+
for (const result of results) {
|
|
193
|
+
if (result.status !== 'failed' &&
|
|
194
|
+
result.status !== 'timed-out' &&
|
|
195
|
+
result.status !== 'interrupted') {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
sawFailure = true;
|
|
199
|
+
const code = result.serialGroupId === undefined
|
|
200
|
+
? result.attempts.at(-1)?.error?.code
|
|
201
|
+
: groupCode.get(result.serialGroupId);
|
|
202
|
+
if (code === undefined || !BLOCKABLE_CODES.has(code))
|
|
203
|
+
return status;
|
|
204
|
+
}
|
|
205
|
+
return sawFailure ? 'blocked' : status;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Fallback limits used when the run failed before config resolution: the
|
|
209
|
+
* resolver's own defaults, so the report never disagrees with the config.
|
|
210
|
+
*/
|
|
211
|
+
const DEFAULT_LIMITS = {
|
|
212
|
+
...resolveLimits({}),
|
|
213
|
+
maxObservationBytes: DEFAULT_OBSERVATION_BYTES,
|
|
214
|
+
};
|
|
215
|
+
/** Aggregates observed usage against the resolved limits (13-reporting.md). */
|
|
216
|
+
function computeUsage(options) {
|
|
217
|
+
const usage = {
|
|
218
|
+
discoveredResults: options.discovered,
|
|
219
|
+
maxAgentContextBytes: 0,
|
|
220
|
+
maxLedgerBytes: 0,
|
|
221
|
+
maxObservationBytes: 0,
|
|
222
|
+
artifactBytes: 0,
|
|
223
|
+
downloads: 0,
|
|
224
|
+
events: 0,
|
|
225
|
+
modelTokens: 0,
|
|
226
|
+
maxModelCallsInStep: 0,
|
|
227
|
+
maxActionStepsInStep: 0,
|
|
228
|
+
};
|
|
229
|
+
let cost = 0;
|
|
230
|
+
let costSeen = false;
|
|
231
|
+
const countStep = (step) => {
|
|
232
|
+
usage.events += step.events.length;
|
|
233
|
+
const metrics = step.metrics;
|
|
234
|
+
if (metrics !== undefined) {
|
|
235
|
+
usage.maxAgentContextBytes = Math.max(usage.maxAgentContextBytes, metrics.contextBytes);
|
|
236
|
+
usage.maxLedgerBytes = Math.max(usage.maxLedgerBytes, metrics.ledgerBytes);
|
|
237
|
+
usage.maxObservationBytes = Math.max(usage.maxObservationBytes, metrics.observationBytes);
|
|
238
|
+
usage.maxModelCallsInStep = Math.max(usage.maxModelCallsInStep, metrics.modelCalls);
|
|
239
|
+
usage.maxActionStepsInStep = Math.max(usage.maxActionStepsInStep, metrics.actionSteps);
|
|
240
|
+
}
|
|
241
|
+
const model = step.model;
|
|
242
|
+
if (model !== undefined) {
|
|
243
|
+
usage.modelTokens += model.inputTokens + model.outputTokens;
|
|
244
|
+
if (model.estimatedCostUsd !== undefined) {
|
|
245
|
+
cost += model.estimatedCostUsd;
|
|
246
|
+
costSeen = true;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
const countArtifacts = (artifacts) => {
|
|
251
|
+
for (const artifact of artifacts) {
|
|
252
|
+
usage.artifactBytes += artifact.size ?? 0;
|
|
253
|
+
if (artifact.kind === 'download')
|
|
254
|
+
usage.downloads += 1;
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
for (const result of options.results) {
|
|
258
|
+
for (const attempt of result.attempts) {
|
|
259
|
+
countArtifacts(attempt.artifacts);
|
|
260
|
+
for (const step of attempt.steps)
|
|
261
|
+
countStep(step);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
for (const group of options.serialGroups) {
|
|
265
|
+
for (const attempt of group.attempts) {
|
|
266
|
+
countArtifacts(attempt.artifacts);
|
|
267
|
+
for (const member of attempt.members) {
|
|
268
|
+
for (const step of member.steps)
|
|
269
|
+
countStep(step);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return costSeen ? { ...usage, estimatedCostUsd: cost } : usage;
|
|
274
|
+
}
|
|
275
|
+
/** Builds the complete report-1 document. */
|
|
276
|
+
export function buildReport(options) {
|
|
277
|
+
const { config } = options;
|
|
278
|
+
const targets = config === undefined
|
|
279
|
+
? []
|
|
280
|
+
: config.targets.map((target) => serializeTarget(config, target, options.targetProvenance.get(target.name)));
|
|
281
|
+
const results = options.results
|
|
282
|
+
.toSorted(compareResults)
|
|
283
|
+
.map((result) => serializeResult(config, result));
|
|
284
|
+
const targetIndex = new Map();
|
|
285
|
+
for (const target of config?.targets ?? [])
|
|
286
|
+
targetIndex.set(target.name, target.index);
|
|
287
|
+
const serialGroups = options.serialGroups
|
|
288
|
+
.toSorted((a, b) => compareSerialGroups(a, b, targetIndex))
|
|
289
|
+
.map(serializeSerialGroup);
|
|
290
|
+
const summary = computeSummary(options.results);
|
|
291
|
+
return {
|
|
292
|
+
schemaVersion: 'report-1',
|
|
293
|
+
run: {
|
|
294
|
+
id: options.runId,
|
|
295
|
+
specVersion: '0.1',
|
|
296
|
+
runner: {
|
|
297
|
+
name: 'e2e',
|
|
298
|
+
version: packageVersion(import.meta.url, '../../package.json', '0.0.0'),
|
|
299
|
+
},
|
|
300
|
+
status: deriveRunStatus(options.status, options.results, options.serialGroups),
|
|
301
|
+
exitCode: options.exitCode,
|
|
302
|
+
startedAt: options.startedAt,
|
|
303
|
+
finishedAt: timestamp(),
|
|
304
|
+
project: {
|
|
305
|
+
id: config?.projectId ?? 'unknown',
|
|
306
|
+
configDigest: config?.configDigest ?? '0'.repeat(64),
|
|
307
|
+
},
|
|
308
|
+
environment: {
|
|
309
|
+
ci: config?.ci ?? false,
|
|
310
|
+
// The trust model is documented and report-recorded, never printed.
|
|
311
|
+
trustNoticeShown: false,
|
|
312
|
+
os: `${os.platform()} ${os.release()}`,
|
|
313
|
+
arch: os.arch(),
|
|
314
|
+
runtime: `node ${process.version}`,
|
|
315
|
+
},
|
|
316
|
+
targets,
|
|
317
|
+
serialGroups,
|
|
318
|
+
results,
|
|
319
|
+
errors: options.runErrors.map((runError) => serializeErrorRecord(runError.error)),
|
|
320
|
+
summary,
|
|
321
|
+
limits: config?.limits ?? DEFAULT_LIMITS,
|
|
322
|
+
usage: computeUsage({
|
|
323
|
+
results: options.results,
|
|
324
|
+
serialGroups: options.serialGroups,
|
|
325
|
+
discovered: summary.discovered,
|
|
326
|
+
}),
|
|
327
|
+
},
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
function compareResults(a, b) {
|
|
331
|
+
if (a.test.file !== b.test.file)
|
|
332
|
+
return a.test.file < b.test.file ? -1 : 1;
|
|
333
|
+
if (a.test.declarationIndex !== b.test.declarationIndex) {
|
|
334
|
+
return a.test.declarationIndex - b.test.declarationIndex;
|
|
335
|
+
}
|
|
336
|
+
return a.target.index - b.target.index;
|
|
337
|
+
}
|
|
338
|
+
/** Report order is completion-time independent (spec 13-reporting.md). */
|
|
339
|
+
function compareSerialGroups(a, b, targetIndex) {
|
|
340
|
+
if (a.file !== b.file)
|
|
341
|
+
return a.file < b.file ? -1 : 1;
|
|
342
|
+
if (a.declarationIndex !== b.declarationIndex)
|
|
343
|
+
return a.declarationIndex - b.declarationIndex;
|
|
344
|
+
return (targetIndex.get(a.targetId) ?? 0) - (targetIndex.get(b.targetId) ?? 0);
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/report/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Failure-location presentation: finds the user's failing line in a stack and
|
|
3
|
+
* renders a small annotated code frame around it. Generic over reporters; the
|
|
4
|
+
* list reporter is simply its first consumer.
|
|
5
|
+
*/
|
|
6
|
+
export interface StackFrame {
|
|
7
|
+
readonly file: string;
|
|
8
|
+
readonly line: number;
|
|
9
|
+
readonly column: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* First stack frame inside the project and outside node_modules: the line in
|
|
13
|
+
* the user's test file that the failure unwound through. Runner frames never
|
|
14
|
+
* match because the runner lives in node_modules (or outside the project root
|
|
15
|
+
* in a workspace).
|
|
16
|
+
*/
|
|
17
|
+
export declare function userFrame(stack: string | undefined, projectRoot: string | undefined): StackFrame | undefined;
|
|
18
|
+
/** Renders the failing line with one line of context and a column caret. */
|
|
19
|
+
export declare function codeFrame(frame: StackFrame): string[];
|
|
20
|
+
//# sourceMappingURL=code-frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-frame.d.ts","sourceRoot":"","sources":["../../src/report/code-frame.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,UAAU,GAAG,SAAS,CAkBxB;AAED,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAyBrD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Failure-location presentation: finds the user's failing line in a stack and
|
|
3
|
+
* renders a small annotated code frame around it. Generic over reporters; the
|
|
4
|
+
* list reporter is simply its first consumer.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync } from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import pc from 'picocolors';
|
|
10
|
+
import { sanitizeText, truncateUtf8 } from '../internal/errors.js';
|
|
11
|
+
const MAX_FIELD_BYTES = 8192;
|
|
12
|
+
const FRAME_PATTERN = /((?:file:\/\/)?\/[^):]+):(\d+):(\d+)\)?\s*$/;
|
|
13
|
+
/**
|
|
14
|
+
* First stack frame inside the project and outside node_modules: the line in
|
|
15
|
+
* the user's test file that the failure unwound through. Runner frames never
|
|
16
|
+
* match because the runner lives in node_modules (or outside the project root
|
|
17
|
+
* in a workspace).
|
|
18
|
+
*/
|
|
19
|
+
export function userFrame(stack, projectRoot) {
|
|
20
|
+
if (stack === undefined || projectRoot === undefined)
|
|
21
|
+
return undefined;
|
|
22
|
+
for (const raw of stack.split('\n')) {
|
|
23
|
+
const match = FRAME_PATTERN.exec(raw);
|
|
24
|
+
if (match === null)
|
|
25
|
+
continue;
|
|
26
|
+
const [, location, line, column] = match;
|
|
27
|
+
const withoutQuery = location.split('?')[0];
|
|
28
|
+
let file;
|
|
29
|
+
try {
|
|
30
|
+
file = withoutQuery.startsWith('file://') ? fileURLToPath(withoutQuery) : withoutQuery;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (!file.startsWith(`${projectRoot}${path.sep}`))
|
|
36
|
+
continue;
|
|
37
|
+
if (file.includes(`${path.sep}node_modules${path.sep}`))
|
|
38
|
+
continue;
|
|
39
|
+
return { file, line: Number(line), column: Number(column) };
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
/** Renders the failing line with one line of context and a column caret. */
|
|
44
|
+
export function codeFrame(frame) {
|
|
45
|
+
let source;
|
|
46
|
+
try {
|
|
47
|
+
source = readFileSync(frame.file, 'utf8');
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
const lines = source.split('\n');
|
|
53
|
+
const index = frame.line - 1;
|
|
54
|
+
if (index < 0 || index >= lines.length)
|
|
55
|
+
return [];
|
|
56
|
+
const start = Math.max(0, index - 1);
|
|
57
|
+
const end = Math.min(lines.length - 1, index + 1);
|
|
58
|
+
const width = String(end + 1).length;
|
|
59
|
+
const rows = [];
|
|
60
|
+
for (let i = start; i <= end; i += 1) {
|
|
61
|
+
const text = truncateUtf8(sanitizeText(lines[i] ?? ''), MAX_FIELD_BYTES);
|
|
62
|
+
const number = String(i + 1).padStart(width);
|
|
63
|
+
if (i === index) {
|
|
64
|
+
rows.push(`${pc.red('>')} ${number} | ${text}`);
|
|
65
|
+
rows.push(` ${' '.repeat(width)} | ${' '.repeat(Math.max(0, frame.column - 1))}${pc.red('^')}`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
rows.push(pc.dim(` ${number} | ${text}`));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return rows;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=code-frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-frame.js","sourceRoot":"","sources":["../../src/report/code-frame.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--debug` presentation of agent steps, derived entirely from the step
|
|
3
|
+
* records every run already collects for the report. There is no separate
|
|
4
|
+
* debug telemetry channel for agent steps: the timeline is the single account
|
|
5
|
+
* of what happened.
|
|
6
|
+
*/
|
|
7
|
+
import type { ResultRecord, SerialGroupRecord } from '../run/records.ts';
|
|
8
|
+
/**
|
|
9
|
+
* Renders one aligned table of every agent step in the run, in execution
|
|
10
|
+
* order, with per-phase splits summed from the step's child events. Returns
|
|
11
|
+
* the empty string when the run performed no agent steps.
|
|
12
|
+
*/
|
|
13
|
+
export declare function agentStepTable(results: readonly ResultRecord[], serialGroups: readonly SerialGroupRecord[]): string;
|
|
14
|
+
//# sourceMappingURL=debug-steps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-steps.d.ts","sourceRoot":"","sources":["../../src/report/debug-steps.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGzE;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,YAAY,EAAE,SAAS,iBAAiB,EAAE,GACzC,MAAM,CAoDR"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--debug` presentation of agent steps, derived entirely from the step
|
|
3
|
+
* records every run already collects for the report. There is no separate
|
|
4
|
+
* debug telemetry channel for agent steps: the timeline is the single account
|
|
5
|
+
* of what happened.
|
|
6
|
+
*/
|
|
7
|
+
import { formatMs, table } from '../internal/debug.js';
|
|
8
|
+
/**
|
|
9
|
+
* Renders one aligned table of every agent step in the run, in execution
|
|
10
|
+
* order, with per-phase splits summed from the step's child events. Returns
|
|
11
|
+
* the empty string when the run performed no agent steps.
|
|
12
|
+
*/
|
|
13
|
+
export function agentStepTable(results, serialGroups) {
|
|
14
|
+
const steps = collectAgentSteps(results, serialGroups);
|
|
15
|
+
if (steps.length === 0)
|
|
16
|
+
return '';
|
|
17
|
+
const models = new Set(steps
|
|
18
|
+
.map((step) => (step.model === undefined ? undefined : `${step.model.provider}/${step.model.model}`))
|
|
19
|
+
.filter((model) => model !== undefined));
|
|
20
|
+
const mixedModels = models.size > 1;
|
|
21
|
+
const rows = steps.map((step) => [
|
|
22
|
+
truncate(step.label === '' ? step.api : `${step.api} ${JSON.stringify(step.label)}`, 64),
|
|
23
|
+
...(mixedModels
|
|
24
|
+
? [step.model === undefined ? '-' : `${step.model.provider}/${step.model.model}`]
|
|
25
|
+
: []),
|
|
26
|
+
formatMs(step.durationMs),
|
|
27
|
+
formatMs(eventMs(step, 'model')),
|
|
28
|
+
formatMs(eventMs(step, 'observation')),
|
|
29
|
+
formatMs(eventMs(step, 'backend')),
|
|
30
|
+
String(step.model?.calls ?? 0),
|
|
31
|
+
`${String(step.model?.inputTokens ?? 0)}/${String(step.model?.outputTokens ?? 0)}`,
|
|
32
|
+
step.model?.estimatedCostUsd === undefined ? '-' : formatUsd(step.model.estimatedCostUsd),
|
|
33
|
+
]);
|
|
34
|
+
const knownCosts = steps
|
|
35
|
+
.map((step) => step.model?.estimatedCostUsd)
|
|
36
|
+
.filter((cost) => cost !== undefined);
|
|
37
|
+
const total = knownCosts.length === 0
|
|
38
|
+
? ''
|
|
39
|
+
: `, total ${formatUsd(knownCosts.reduce((sum, cost) => sum + cost, 0))}${knownCosts.length < steps.length ? '+' : ''}`;
|
|
40
|
+
const sharedModel = mixedModels || models.size === 0 ? '' : `, model ${[...models][0] ?? ''}`;
|
|
41
|
+
return table(`[e2e debug] agent steps (execution order${sharedModel}${total})`, [
|
|
42
|
+
'step',
|
|
43
|
+
...(mixedModels ? ['via'] : []),
|
|
44
|
+
'total',
|
|
45
|
+
'model',
|
|
46
|
+
'observe',
|
|
47
|
+
'action',
|
|
48
|
+
'calls',
|
|
49
|
+
'tokens in/out',
|
|
50
|
+
'cost',
|
|
51
|
+
], rows, '(no agent steps recorded)');
|
|
52
|
+
}
|
|
53
|
+
/** Agent steps from every attempt and serial member, in record order. */
|
|
54
|
+
function collectAgentSteps(results, serialGroups) {
|
|
55
|
+
const steps = [];
|
|
56
|
+
for (const result of results) {
|
|
57
|
+
for (const attempt of result.attempts) {
|
|
58
|
+
steps.push(...attempt.steps.filter((step) => step.kind === 'agent'));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const group of serialGroups) {
|
|
62
|
+
for (const attempt of group.attempts) {
|
|
63
|
+
for (const member of attempt.members) {
|
|
64
|
+
steps.push(...member.steps.filter((step) => step.kind === 'agent'));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return steps;
|
|
69
|
+
}
|
|
70
|
+
function eventMs(step, kind) {
|
|
71
|
+
return step.events
|
|
72
|
+
.filter((event) => event.kind === kind)
|
|
73
|
+
.reduce((total, event) => total + event.durationMs, 0);
|
|
74
|
+
}
|
|
75
|
+
function truncate(value, maxLength) {
|
|
76
|
+
if (value.length <= maxLength)
|
|
77
|
+
return value;
|
|
78
|
+
return `${value.slice(0, maxLength - 1)}…`;
|
|
79
|
+
}
|
|
80
|
+
function formatUsd(value) {
|
|
81
|
+
const digits = value >= 0.1 ? 2 : 6;
|
|
82
|
+
const trimmed = value.toFixed(digits).replace(/(\.\d*?)0+$/, '$1').replace(/\.$/, '');
|
|
83
|
+
return `$${trimmed}`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=debug-steps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-steps.js","sourceRoot":"","sources":["../../src/report/debug-steps.ts"],"names":[],"mappings":"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"}
|