@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,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI trace recording for `e2e run --ai-trace`: every model round trip the
|
|
3
|
+
* run makes, in the AI SDK devtools database shape (`{ runs[], steps[] }`)
|
|
4
|
+
* that trace viewers such as unbox-ai already read.
|
|
5
|
+
*
|
|
6
|
+
* This is a debugging aid, not a report: the report stays the canonical
|
|
7
|
+
* record and the trace is written next to it only on request. The recorder
|
|
8
|
+
* is an AI SDK telemetry integration, so it sees the exact prompt, tool
|
|
9
|
+
* definitions, response, and usage of each generation — including calls a
|
|
10
|
+
* custom executor makes through its own `ai` import, because the SDK
|
|
11
|
+
* resolves registered integrations process-wide. What the model saw is
|
|
12
|
+
* already redacted and size-bounded by the observation pipeline, so the
|
|
13
|
+
* trace carries no secret the model could not have seen either.
|
|
14
|
+
*
|
|
15
|
+
* Attribution comes from an async-local scope the run layer enters per
|
|
16
|
+
* attempt and per step, so no model call site needs to know it is traced.
|
|
17
|
+
*/
|
|
18
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
19
|
+
import { randomUUID } from 'node:crypto';
|
|
20
|
+
/** Longest step label quoted in a run name before truncation. */
|
|
21
|
+
const MAX_LABEL_CHARS = 80;
|
|
22
|
+
const scopeStorage = new AsyncLocalStorage();
|
|
23
|
+
/** Runs `work` with `scope` as the attribution for every model call inside. */
|
|
24
|
+
export function withAiTraceScope(scope, work) {
|
|
25
|
+
return scopeStorage.run(scope, work);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Narrows the current attempt scope to one public API step. Outside an
|
|
29
|
+
* attempt scope there is nothing to narrow, and the work runs as is.
|
|
30
|
+
*/
|
|
31
|
+
export function withAiTraceStep(api, label, work) {
|
|
32
|
+
const parent = scopeStorage.getStore();
|
|
33
|
+
if (parent === undefined)
|
|
34
|
+
return work();
|
|
35
|
+
return scopeStorage.run({ ...parent, api, label }, work);
|
|
36
|
+
}
|
|
37
|
+
/** The scope of the calling async context, when inside an attempt. */
|
|
38
|
+
function currentAiTraceScope() {
|
|
39
|
+
return scopeStorage.getStore();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Collects one process's model calls. Registered once with the AI SDK via
|
|
43
|
+
* `registerTelemetry`; `drain()` hands the completed records to the run
|
|
44
|
+
* layer, which ships them to the runner over the worker channel.
|
|
45
|
+
*/
|
|
46
|
+
export class AiTraceRecorder {
|
|
47
|
+
calls = new Map();
|
|
48
|
+
/**
|
|
49
|
+
* One run per agent step: every generation made under the same step scope
|
|
50
|
+
* — a `waitFor` poll, a judgment repair round — continues the step's run
|
|
51
|
+
* rather than starting its own, so a viewer's run list reads as the test's
|
|
52
|
+
* step list. Keyed by scope identity, which is fresh per step.
|
|
53
|
+
*/
|
|
54
|
+
stepRuns = new WeakMap();
|
|
55
|
+
runs = [];
|
|
56
|
+
steps = [];
|
|
57
|
+
/**
|
|
58
|
+
* The tool a generation is being made from, carried by async context so
|
|
59
|
+
* tools that execute in parallel each see only their own ancestry.
|
|
60
|
+
*/
|
|
61
|
+
toolAncestry = new AsyncLocalStorage();
|
|
62
|
+
disposed = false;
|
|
63
|
+
/** The integration object to hand to `registerTelemetry`. */
|
|
64
|
+
telemetry = {
|
|
65
|
+
onStart: (event) => this.onStart(event),
|
|
66
|
+
onStepStart: (event) => this.onStepStart(event),
|
|
67
|
+
onLanguageModelCallStart: (event) => this.onModelCallStart(event),
|
|
68
|
+
onLanguageModelCallEnd: (event) => this.onModelCallEnd(event),
|
|
69
|
+
onStepEnd: (event) => this.onStepEnd(event),
|
|
70
|
+
onEnd: (event) => this.onEnd(event),
|
|
71
|
+
onError: (event) => this.onError(event),
|
|
72
|
+
executeTool: ({ callId, execute }) => {
|
|
73
|
+
const state = this.calls.get(callId);
|
|
74
|
+
if (state === undefined)
|
|
75
|
+
return execute();
|
|
76
|
+
const open = [...state.openSteps.values()].at(-1);
|
|
77
|
+
return this.toolAncestry.run({ runId: state.runId, stepId: open?.id }, () => execute());
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Stops recording. The SDK offers no unregister, so a disposed recorder
|
|
82
|
+
* simply ignores every later event; the entry it leaves in the global
|
|
83
|
+
* integration list is removed when that list is where the SDK keeps it.
|
|
84
|
+
*/
|
|
85
|
+
dispose() {
|
|
86
|
+
this.disposed = true;
|
|
87
|
+
const registry = globalThis
|
|
88
|
+
.AI_SDK_TELEMETRY_INTEGRATIONS;
|
|
89
|
+
if (Array.isArray(registry)) {
|
|
90
|
+
const index = registry.indexOf(this.telemetry);
|
|
91
|
+
if (index >= 0)
|
|
92
|
+
registry.splice(index, 1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Returns every run created and every step closed since the previous
|
|
97
|
+
* drain. Open steps stay until they close, so a step that finishes after a
|
|
98
|
+
* unit boundary is never reported half-written; `drain({ all: true })` at
|
|
99
|
+
* shutdown takes them as they are.
|
|
100
|
+
*/
|
|
101
|
+
drain(options = {}) {
|
|
102
|
+
const snapshot = { runs: this.runs, steps: this.steps };
|
|
103
|
+
this.runs = [];
|
|
104
|
+
this.steps = [];
|
|
105
|
+
if (options.all === true) {
|
|
106
|
+
for (const state of this.calls.values()) {
|
|
107
|
+
for (const open of state.openSteps.values()) {
|
|
108
|
+
snapshot.steps.push(this.closeStep(open, { error: 'run ended before the model answered' }));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
this.calls.clear();
|
|
112
|
+
}
|
|
113
|
+
return snapshot;
|
|
114
|
+
}
|
|
115
|
+
/** True while any step has started and not yet ended; useful in tests. */
|
|
116
|
+
get pending() {
|
|
117
|
+
return [...this.calls.values()].some((state) => state.openSteps.size > 0);
|
|
118
|
+
}
|
|
119
|
+
onStart(event) {
|
|
120
|
+
if (this.disposed)
|
|
121
|
+
return;
|
|
122
|
+
if (event.operationId !== 'ai.generateText' && event.operationId !== 'ai.streamText')
|
|
123
|
+
return;
|
|
124
|
+
const parent = this.toolAncestry.getStore();
|
|
125
|
+
const scope = currentAiTraceScope();
|
|
126
|
+
// A generation made inside a tool is its own nested run, never a
|
|
127
|
+
// continuation of the step's run, so the parent link stays meaningful.
|
|
128
|
+
const stepScope = scope !== undefined && scope.api !== undefined && parent === undefined ? scope : undefined;
|
|
129
|
+
const existing = stepScope === undefined ? undefined : this.stepRuns.get(stepScope);
|
|
130
|
+
if (existing !== undefined) {
|
|
131
|
+
this.calls.set(event.callId, { runId: existing.runId, openSteps: new Map(), run: existing });
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const run = { runId: randomUUID(), steps: 0 };
|
|
135
|
+
if (stepScope !== undefined)
|
|
136
|
+
this.stepRuns.set(stepScope, run);
|
|
137
|
+
const runId = run.runId;
|
|
138
|
+
this.calls.set(event.callId, { runId, openSteps: new Map(), run });
|
|
139
|
+
this.runs.push({
|
|
140
|
+
id: runId,
|
|
141
|
+
started_at: new Date().toISOString(),
|
|
142
|
+
parent_run_id: parent?.runId ?? null,
|
|
143
|
+
parent_step_id: parent?.stepId ?? null,
|
|
144
|
+
function_id: runName(scope, event.functionId),
|
|
145
|
+
e2e: scope,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
onStepStart(event) {
|
|
149
|
+
const state = this.calls.get(event.callId);
|
|
150
|
+
if (state === undefined)
|
|
151
|
+
return;
|
|
152
|
+
const stepNumber = state.run.steps;
|
|
153
|
+
state.run.steps += 1;
|
|
154
|
+
const open = {
|
|
155
|
+
id: randomUUID(),
|
|
156
|
+
runId: state.runId,
|
|
157
|
+
stepNumber,
|
|
158
|
+
modelId: event.modelId,
|
|
159
|
+
provider: event.provider,
|
|
160
|
+
startedAt: new Date().toISOString(),
|
|
161
|
+
startedMs: Date.now(),
|
|
162
|
+
prompt: promptMessages(event.instructions, event.messages),
|
|
163
|
+
tools: undefined,
|
|
164
|
+
toolChoice: event.toolChoice,
|
|
165
|
+
responseTimeMs: undefined,
|
|
166
|
+
};
|
|
167
|
+
state.openSteps.set(event.stepNumber, open);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The request as actually sent: after `prepareStep`, with the prepared tool
|
|
171
|
+
* definitions carrying their JSON schemas. This supersedes the step-start
|
|
172
|
+
* view, which predates per-step message compaction and tool filtering.
|
|
173
|
+
*/
|
|
174
|
+
onModelCallStart(event) {
|
|
175
|
+
const open = this.newestOpen(event.callId);
|
|
176
|
+
if (open === undefined)
|
|
177
|
+
return;
|
|
178
|
+
if (Array.isArray(event.messages)) {
|
|
179
|
+
open.prompt = promptMessages(event.instructions, event.messages);
|
|
180
|
+
}
|
|
181
|
+
if (event.tools !== undefined) {
|
|
182
|
+
open.tools = event.tools.map((tool) => ({
|
|
183
|
+
name: tool['name'],
|
|
184
|
+
...(tool['description'] === undefined ? {} : { description: tool['description'] }),
|
|
185
|
+
...(tool['inputSchema'] === undefined ? {} : { parameters: tool['inputSchema'] }),
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
if (event.toolChoice !== undefined)
|
|
189
|
+
open.toolChoice = event.toolChoice;
|
|
190
|
+
}
|
|
191
|
+
onModelCallEnd(event) {
|
|
192
|
+
const open = this.newestOpen(event.callId);
|
|
193
|
+
if (open === undefined)
|
|
194
|
+
return;
|
|
195
|
+
const responseTimeMs = event.performance?.responseTimeMs;
|
|
196
|
+
if (typeof responseTimeMs === 'number')
|
|
197
|
+
open.responseTimeMs = responseTimeMs;
|
|
198
|
+
}
|
|
199
|
+
onStepEnd(event) {
|
|
200
|
+
const state = this.calls.get(event.callId);
|
|
201
|
+
const open = state?.openSteps.get(event.stepNumber);
|
|
202
|
+
if (state === undefined || open === undefined)
|
|
203
|
+
return;
|
|
204
|
+
state.openSteps.delete(event.stepNumber);
|
|
205
|
+
const response = event.response;
|
|
206
|
+
this.steps.push(this.closeStep(open, {
|
|
207
|
+
output: {
|
|
208
|
+
content: event.content,
|
|
209
|
+
finishReason: event.finishReason,
|
|
210
|
+
response: {
|
|
211
|
+
id: response.id,
|
|
212
|
+
modelId: response.modelId,
|
|
213
|
+
timestamp: response.timestamp,
|
|
214
|
+
messages: response.messages,
|
|
215
|
+
},
|
|
216
|
+
...(event.providerMetadata === undefined ? {} : { providerMetadata: event.providerMetadata }),
|
|
217
|
+
},
|
|
218
|
+
usage: event.usage,
|
|
219
|
+
}));
|
|
220
|
+
}
|
|
221
|
+
onEnd(event) {
|
|
222
|
+
const state = this.calls.get(event.callId);
|
|
223
|
+
if (state === undefined)
|
|
224
|
+
return;
|
|
225
|
+
// Steps that never reported an end (aborted mid-flight) close here so
|
|
226
|
+
// nothing dangles once the generation itself is over.
|
|
227
|
+
for (const open of state.openSteps.values()) {
|
|
228
|
+
this.steps.push(this.closeStep(open, { error: 'the generation ended before this step did' }));
|
|
229
|
+
}
|
|
230
|
+
this.calls.delete(event.callId);
|
|
231
|
+
}
|
|
232
|
+
onError(event) {
|
|
233
|
+
const callId = event?.callId;
|
|
234
|
+
if (callId === undefined)
|
|
235
|
+
return;
|
|
236
|
+
const state = this.calls.get(callId);
|
|
237
|
+
if (state === undefined)
|
|
238
|
+
return;
|
|
239
|
+
const cause = event?.error;
|
|
240
|
+
const message = cause instanceof Error ? cause.message : String(cause ?? 'unknown error');
|
|
241
|
+
for (const open of state.openSteps.values()) {
|
|
242
|
+
this.steps.push(this.closeStep(open, { error: message }));
|
|
243
|
+
}
|
|
244
|
+
this.calls.delete(callId);
|
|
245
|
+
}
|
|
246
|
+
newestOpen(callId) {
|
|
247
|
+
const state = this.calls.get(callId);
|
|
248
|
+
if (state === undefined)
|
|
249
|
+
return undefined;
|
|
250
|
+
return [...state.openSteps.values()].at(-1);
|
|
251
|
+
}
|
|
252
|
+
closeStep(open, outcome) {
|
|
253
|
+
return {
|
|
254
|
+
id: open.id,
|
|
255
|
+
run_id: open.runId,
|
|
256
|
+
step_number: open.stepNumber + 1,
|
|
257
|
+
type: 'generate',
|
|
258
|
+
model_id: open.modelId,
|
|
259
|
+
provider: open.provider,
|
|
260
|
+
started_at: open.startedAt,
|
|
261
|
+
duration_ms: open.responseTimeMs ?? Date.now() - open.startedMs,
|
|
262
|
+
input: stringify({
|
|
263
|
+
prompt: open.prompt,
|
|
264
|
+
...(open.tools === undefined ? {} : { tools: open.tools }),
|
|
265
|
+
...(open.toolChoice === undefined ? {} : { toolChoice: open.toolChoice }),
|
|
266
|
+
}),
|
|
267
|
+
output: outcome.output === undefined ? null : stringify(outcome.output),
|
|
268
|
+
usage: outcome.usage === undefined ? null : stringify(outcome.usage),
|
|
269
|
+
error: outcome.error ?? null,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Registers a recorder with the AI SDK. The SDK is an optional peer: when it
|
|
275
|
+
* is absent no model call can go through it, so there is nothing to record
|
|
276
|
+
* and the absence is not an error here.
|
|
277
|
+
*/
|
|
278
|
+
export async function registerAiTraceRecorder(recorder, load) {
|
|
279
|
+
let sdk;
|
|
280
|
+
try {
|
|
281
|
+
sdk = await load();
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
sdk.registerTelemetry(recorder.telemetry);
|
|
287
|
+
}
|
|
288
|
+
/** Merges drained snapshots into one document; call order is arrival order. */
|
|
289
|
+
export class AiTraceCollector {
|
|
290
|
+
runs = [];
|
|
291
|
+
steps = [];
|
|
292
|
+
merge(snapshot) {
|
|
293
|
+
this.runs.push(...snapshot.runs);
|
|
294
|
+
this.steps.push(...snapshot.steps);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* The document to write. Workers drain in batches, so records are put back
|
|
298
|
+
* in start order: viewers read file order as time order.
|
|
299
|
+
*/
|
|
300
|
+
document() {
|
|
301
|
+
const byStart = (a, b) => a.started_at < b.started_at ? -1 : a.started_at > b.started_at ? 1 : 0;
|
|
302
|
+
return {
|
|
303
|
+
runs: this.runs.toSorted(byStart),
|
|
304
|
+
steps: this.steps.toSorted(byStart),
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
get size() {
|
|
308
|
+
return this.steps.length;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* The prompt as a message list. The SDK keeps the system prompt apart from
|
|
313
|
+
* the conversation (`instructions`); viewers attribute tokens per message
|
|
314
|
+
* role, so it is put back in front as system messages.
|
|
315
|
+
*/
|
|
316
|
+
function promptMessages(instructions, messages) {
|
|
317
|
+
const system = [];
|
|
318
|
+
if (typeof instructions === 'string') {
|
|
319
|
+
system.push({ role: 'system', content: instructions });
|
|
320
|
+
}
|
|
321
|
+
else if (Array.isArray(instructions)) {
|
|
322
|
+
system.push(...instructions);
|
|
323
|
+
}
|
|
324
|
+
else if (instructions !== undefined && instructions !== null) {
|
|
325
|
+
system.push(instructions);
|
|
326
|
+
}
|
|
327
|
+
return [...system, ...messages];
|
|
328
|
+
}
|
|
329
|
+
function runName(scope, functionId) {
|
|
330
|
+
if (scope === undefined)
|
|
331
|
+
return functionId ?? null;
|
|
332
|
+
const parts = [scope.test];
|
|
333
|
+
if (scope.attempt > 0)
|
|
334
|
+
parts.push(`attempt ${scope.attempt + 1}`);
|
|
335
|
+
if (scope.api !== undefined) {
|
|
336
|
+
const label = scope.label === undefined || scope.label === '' ? '' : ` ${JSON.stringify(truncate(scope.label))}`;
|
|
337
|
+
parts.push(`${scope.api}${label}`);
|
|
338
|
+
}
|
|
339
|
+
return parts.join(' · ');
|
|
340
|
+
}
|
|
341
|
+
function truncate(text) {
|
|
342
|
+
return text.length <= MAX_LABEL_CHARS ? text : `${text.slice(0, MAX_LABEL_CHARS)}…`;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* JSON with binary payloads replaced by a size note. Image evidence travels
|
|
346
|
+
* as bytes in vision calls; the trace records that pixels were sent and how
|
|
347
|
+
* many, never the pixels, which keeps the file small and screenshot-free.
|
|
348
|
+
*/
|
|
349
|
+
export function stringify(value) {
|
|
350
|
+
return JSON.stringify(value, (_key, current) => {
|
|
351
|
+
if (current instanceof ArrayBuffer)
|
|
352
|
+
return `[binary ${current.byteLength} bytes omitted]`;
|
|
353
|
+
if (ArrayBuffer.isView(current))
|
|
354
|
+
return `[binary ${current.byteLength} bytes omitted]`;
|
|
355
|
+
if (typeof current === 'bigint')
|
|
356
|
+
return current.toString();
|
|
357
|
+
return current;
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=ai-trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-trace.js","sourceRoot":"","sources":["../../src/internal/ai-trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Internal brand symbols backing the opaque spec types. */
|
|
2
|
+
export declare const secretBrand: unique symbol;
|
|
3
|
+
export declare const credentialBrand: unique symbol;
|
|
4
|
+
export declare const testCaseBrand: unique symbol;
|
|
5
|
+
export declare const backendBrand: unique symbol;
|
|
6
|
+
export declare const locatorBrand: unique symbol;
|
|
7
|
+
/** Slot under which a fixture carries its attached expectation surface. */
|
|
8
|
+
export declare const expectationBrand: unique symbol;
|
|
9
|
+
//# sourceMappingURL=brands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brands.d.ts","sourceRoot":"","sources":["../../src/internal/brands.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,eAAO,MAAM,WAAW,EAAE,OAAO,MAAiC,CAAC;AACnE,eAAO,MAAM,eAAe,EAAE,OAAO,MAAqC,CAAC;AAC3E,eAAO,MAAM,aAAa,EAAE,OAAO,MAAmC,CAAC;AACvE,eAAO,MAAM,YAAY,EAAE,OAAO,MAAqC,CAAC;AACxE,eAAO,MAAM,YAAY,EAAE,OAAO,MAAkC,CAAC;AACrE,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,EAAE,OAAO,MAAyC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Internal brand symbols backing the opaque spec types. */
|
|
2
|
+
export const secretBrand = Symbol.for('e2e.secret');
|
|
3
|
+
export const credentialBrand = Symbol.for('e2e.credential');
|
|
4
|
+
export const testCaseBrand = Symbol.for('e2e.testCase');
|
|
5
|
+
export const backendBrand = Symbol.for('e2e.backend.v1');
|
|
6
|
+
export const locatorBrand = Symbol.for('e2e.locator');
|
|
7
|
+
/** Slot under which a fixture carries its attached expectation surface. */
|
|
8
|
+
export const expectationBrand = Symbol.for('e2e.expectation.v1');
|
|
9
|
+
//# sourceMappingURL=brands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brands.js","sourceRoot":"","sources":["../../src/internal/brands.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,eAAe,GAAkB,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,aAAa,GAAkB,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,YAAY,GAAkB,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,YAAY,GAAkB,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACrE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAkB,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Opt-in phase timing collection for `e2e run --debug`. */
|
|
2
|
+
interface DebugEntry {
|
|
3
|
+
totalMs: number;
|
|
4
|
+
count: number;
|
|
5
|
+
maxMs: number;
|
|
6
|
+
}
|
|
7
|
+
/** One aggregated phase, JSON-serializable so workers can ship it over IPC. */
|
|
8
|
+
export interface DebugEntrySnapshot extends DebugEntry {
|
|
9
|
+
readonly label: string;
|
|
10
|
+
}
|
|
11
|
+
/** Everything one trace collected, JSON-serializable for the worker channel. */
|
|
12
|
+
export interface DebugSnapshot {
|
|
13
|
+
readonly entries: readonly DebugEntrySnapshot[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Aggregates named phase durations for one run. When disabled every method is
|
|
17
|
+
* a near-zero pass-through, so call sites never need to branch.
|
|
18
|
+
*/
|
|
19
|
+
export declare class DebugTrace {
|
|
20
|
+
readonly enabled: boolean;
|
|
21
|
+
private readonly entries;
|
|
22
|
+
private readonly startedMs;
|
|
23
|
+
constructor(enabled: boolean);
|
|
24
|
+
/** Records one completed phase duration under a label. */
|
|
25
|
+
record(label: string, durationMs: number): void;
|
|
26
|
+
/** Times one async phase and records it, rethrowing any failure. */
|
|
27
|
+
time<T>(label: string, work: () => Promise<T>): Promise<T>;
|
|
28
|
+
/** Returns everything recorded so far and resets, for transport to another trace. */
|
|
29
|
+
drain(): DebugSnapshot;
|
|
30
|
+
/** Folds a drained snapshot from another trace into this one. */
|
|
31
|
+
merge(snapshot: DebugSnapshot): void;
|
|
32
|
+
/** Formats aggregated timings as one aligned table, phases sorted by total time. */
|
|
33
|
+
summary(): string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Renders one aligned table. The first column is left-aligned and the rest are
|
|
37
|
+
* right-aligned, which suits numbers; `leftAligned` names any further columns
|
|
38
|
+
* that hold prose and would be unreadable pushed to the right.
|
|
39
|
+
*/
|
|
40
|
+
export declare function table(title: string, header: readonly string[], rows: readonly (readonly string[])[], empty: string, leftAligned?: ReadonlySet<number>): string;
|
|
41
|
+
export declare function formatMs(value: number): string;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=debug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/internal/debug.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,+EAA+E;AAC/E,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACjD;AAED;;;GAGG;AACH,qBAAa,UAAU;IAIT,QAAQ,CAAC,OAAO,EAAE,OAAO;IAHrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IAExC,YAAqB,OAAO,EAAE,OAAO,EAAI;IAEzC,0DAA0D;IAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAU9C;IAED,oEAAoE;IAC9D,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAQ/D;IAED,qFAAqF;IACrF,KAAK,IAAI,aAAa,CAMrB;IAED,iEAAiE;IACjE,KAAK,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAgBnC;IAED,oFAAoF;IACpF,OAAO,IAAI,MAAM,CAgBhB;CACF;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EACpC,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,WAAW,CAAC,MAAM,CAAa,GAC3C,MAAM,CAeR;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9C"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/** Opt-in phase timing collection for `e2e run --debug`. */
|
|
2
|
+
/**
|
|
3
|
+
* Aggregates named phase durations for one run. When disabled every method is
|
|
4
|
+
* a near-zero pass-through, so call sites never need to branch.
|
|
5
|
+
*/
|
|
6
|
+
export class DebugTrace {
|
|
7
|
+
enabled;
|
|
8
|
+
entries = new Map();
|
|
9
|
+
startedMs = Date.now();
|
|
10
|
+
constructor(enabled) {
|
|
11
|
+
this.enabled = enabled;
|
|
12
|
+
}
|
|
13
|
+
/** Records one completed phase duration under a label. */
|
|
14
|
+
record(label, durationMs) {
|
|
15
|
+
if (!this.enabled)
|
|
16
|
+
return;
|
|
17
|
+
const entry = this.entries.get(label);
|
|
18
|
+
if (entry === undefined) {
|
|
19
|
+
this.entries.set(label, { totalMs: durationMs, count: 1, maxMs: durationMs });
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
entry.totalMs += durationMs;
|
|
23
|
+
entry.count += 1;
|
|
24
|
+
if (durationMs > entry.maxMs)
|
|
25
|
+
entry.maxMs = durationMs;
|
|
26
|
+
}
|
|
27
|
+
/** Times one async phase and records it, rethrowing any failure. */
|
|
28
|
+
async time(label, work) {
|
|
29
|
+
if (!this.enabled)
|
|
30
|
+
return work();
|
|
31
|
+
const started = Date.now();
|
|
32
|
+
try {
|
|
33
|
+
return await work();
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
this.record(label, Date.now() - started);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Returns everything recorded so far and resets, for transport to another trace. */
|
|
40
|
+
drain() {
|
|
41
|
+
const snapshot = {
|
|
42
|
+
entries: [...this.entries.entries()].map(([label, entry]) => ({ label, ...entry })),
|
|
43
|
+
};
|
|
44
|
+
this.entries.clear();
|
|
45
|
+
return snapshot;
|
|
46
|
+
}
|
|
47
|
+
/** Folds a drained snapshot from another trace into this one. */
|
|
48
|
+
merge(snapshot) {
|
|
49
|
+
if (!this.enabled)
|
|
50
|
+
return;
|
|
51
|
+
for (const incoming of snapshot.entries) {
|
|
52
|
+
const entry = this.entries.get(incoming.label);
|
|
53
|
+
if (entry === undefined) {
|
|
54
|
+
this.entries.set(incoming.label, {
|
|
55
|
+
totalMs: incoming.totalMs,
|
|
56
|
+
count: incoming.count,
|
|
57
|
+
maxMs: incoming.maxMs,
|
|
58
|
+
});
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
entry.totalMs += incoming.totalMs;
|
|
62
|
+
entry.count += incoming.count;
|
|
63
|
+
if (incoming.maxMs > entry.maxMs)
|
|
64
|
+
entry.maxMs = incoming.maxMs;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Formats aggregated timings as one aligned table, phases sorted by total time. */
|
|
68
|
+
summary() {
|
|
69
|
+
const rows = [...this.entries.entries()]
|
|
70
|
+
.toSorted((left, right) => right[1].totalMs - left[1].totalMs)
|
|
71
|
+
.map(([label, entry]) => [
|
|
72
|
+
label,
|
|
73
|
+
String(entry.count),
|
|
74
|
+
formatMs(entry.totalMs),
|
|
75
|
+
formatMs(entry.totalMs / entry.count),
|
|
76
|
+
formatMs(entry.maxMs),
|
|
77
|
+
]);
|
|
78
|
+
return table(`[e2e debug] phase timings (wall ${formatMs(Date.now() - this.startedMs)})`, ['phase', 'count', 'total', 'avg', 'max'], rows, '(no phases recorded)');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Renders one aligned table. The first column is left-aligned and the rest are
|
|
83
|
+
* right-aligned, which suits numbers; `leftAligned` names any further columns
|
|
84
|
+
* that hold prose and would be unreadable pushed to the right.
|
|
85
|
+
*/
|
|
86
|
+
export function table(title, header, rows, empty, leftAligned = new Set()) {
|
|
87
|
+
const widths = header.map((label, column) => Math.max(label.length, ...rows.map((row) => row[column]?.length ?? 0)));
|
|
88
|
+
const line = (row) => ` ${row
|
|
89
|
+
.map((cell, column) => column === 0 || leftAligned.has(column)
|
|
90
|
+
? cell.padEnd(widths[column] ?? 0)
|
|
91
|
+
: cell.padStart(widths[column] ?? 0))
|
|
92
|
+
.join(' ')
|
|
93
|
+
.trimEnd()}`;
|
|
94
|
+
const body = rows.length === 0 ? [` ${empty}`] : rows.map(line);
|
|
95
|
+
return [title, line(header), ...body, ''].join('\n');
|
|
96
|
+
}
|
|
97
|
+
export function formatMs(value) {
|
|
98
|
+
if (value >= 10_000)
|
|
99
|
+
return `${(value / 1000).toFixed(1)}s`;
|
|
100
|
+
return `${Math.round(value)}ms`;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/internal/debug.ts"],"names":[],"mappings":"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"}
|