@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,186 @@
|
|
|
1
|
+
/** Runner-owned polling locator assertions (spec 03-assertions.md). */
|
|
2
|
+
import { TestError } from '../internal/errors.js';
|
|
3
|
+
import { normalizeText, containsText, matchesText, toTextPattern, describePattern } from '../internal/text.js';
|
|
4
|
+
import { Deadline, pollCondition } from '../internal/time.js';
|
|
5
|
+
import { isNodeVisible } from '../locator/engine.js';
|
|
6
|
+
import { describeExpression } from '../locator/expression.js';
|
|
7
|
+
const STATE_MATCHERS = {
|
|
8
|
+
toBeEnabled: { key: 'disabled', expected: false, describeExpected: 'enabled' },
|
|
9
|
+
toBeDisabled: { key: 'disabled', expected: true, describeExpected: 'disabled' },
|
|
10
|
+
toBeChecked: { key: 'checked', expected: true, describeExpected: 'checked' },
|
|
11
|
+
toBeSelected: { key: 'selected', expected: true, describeExpected: 'selected' },
|
|
12
|
+
toBeExpanded: { key: 'expanded', expected: true, describeExpected: 'expanded' },
|
|
13
|
+
};
|
|
14
|
+
const TEXT_MATCHERS = {
|
|
15
|
+
toHaveText: {
|
|
16
|
+
field: 'text',
|
|
17
|
+
match: matchesText,
|
|
18
|
+
describeExpected: (pattern) => `text ${pattern}`,
|
|
19
|
+
normalize: true,
|
|
20
|
+
},
|
|
21
|
+
toContainText: {
|
|
22
|
+
field: 'text',
|
|
23
|
+
match: containsText,
|
|
24
|
+
describeExpected: (pattern) => `text containing ${pattern}`,
|
|
25
|
+
normalize: true,
|
|
26
|
+
},
|
|
27
|
+
toHaveValue: {
|
|
28
|
+
field: 'value',
|
|
29
|
+
match: matchesText,
|
|
30
|
+
describeExpected: (pattern) => `value ${pattern}`,
|
|
31
|
+
normalize: false,
|
|
32
|
+
},
|
|
33
|
+
toHaveAccessibleName: {
|
|
34
|
+
field: 'name',
|
|
35
|
+
match: matchesText,
|
|
36
|
+
describeExpected: (pattern) => `accessible name ${pattern}`,
|
|
37
|
+
normalize: false,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
class AsyncExpectationImpl {
|
|
41
|
+
internals;
|
|
42
|
+
negated;
|
|
43
|
+
constructor(internals, negated) {
|
|
44
|
+
this.internals = internals;
|
|
45
|
+
this.negated = negated;
|
|
46
|
+
}
|
|
47
|
+
get not() {
|
|
48
|
+
return new AsyncExpectationImpl(this.internals, !this.negated);
|
|
49
|
+
}
|
|
50
|
+
get label() {
|
|
51
|
+
return describeExpression(this.internals.expression);
|
|
52
|
+
}
|
|
53
|
+
async poll(spec, timeout) {
|
|
54
|
+
const { engine } = this.internals.context;
|
|
55
|
+
const api = `expect.${this.negated ? 'not.' : ''}${spec.name}`;
|
|
56
|
+
await this.internals.context.steps.run('assertion', api, this.label, async () => {
|
|
57
|
+
const deadline = engine.deadline(timeout ?? engine.assertionTimeout);
|
|
58
|
+
let lastSample = { count: 0, node: null };
|
|
59
|
+
await pollCondition({
|
|
60
|
+
deadline,
|
|
61
|
+
signal: engine.signal,
|
|
62
|
+
negated: this.negated,
|
|
63
|
+
evaluate: async () => {
|
|
64
|
+
const sample = await this.sample(spec, deadline);
|
|
65
|
+
lastSample = sample;
|
|
66
|
+
if (!this.conditionEvaluable(spec, sample))
|
|
67
|
+
return undefined;
|
|
68
|
+
return spec.predicate(sample);
|
|
69
|
+
},
|
|
70
|
+
onTimeout: () => new TestError('ASSERTION_FAILED', [
|
|
71
|
+
`${api} failed`,
|
|
72
|
+
`locator: ${this.label}`,
|
|
73
|
+
`expected: ${this.negated ? 'not ' : ''}${spec.describeExpected}`,
|
|
74
|
+
`observed: ${spec.observed(lastSample)} (match count ${lastSample.count})`,
|
|
75
|
+
].join('\n')),
|
|
76
|
+
});
|
|
77
|
+
}, { verifies: true });
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Single-node matchers require an unambiguous node before their predicate
|
|
81
|
+
* means anything; visibility matchers also accept zero matches.
|
|
82
|
+
*/
|
|
83
|
+
conditionEvaluable(spec, sample) {
|
|
84
|
+
return spec.wholeSet === true || sample.node !== null || spec.evaluableWithoutNode === true;
|
|
85
|
+
}
|
|
86
|
+
async sample(spec, deadline) {
|
|
87
|
+
const { engine } = this.internals.context;
|
|
88
|
+
if (spec.wholeSet === true) {
|
|
89
|
+
const refs = await engine.resolveAll(this.internals.expression, deadline);
|
|
90
|
+
return { count: refs.length, node: null };
|
|
91
|
+
}
|
|
92
|
+
const { node, count } = await engine.tryRead(this.internals.expression, deadline);
|
|
93
|
+
return { count, node };
|
|
94
|
+
}
|
|
95
|
+
stateMatcher(name, timeout) {
|
|
96
|
+
const def = STATE_MATCHERS[name];
|
|
97
|
+
return this.poll({
|
|
98
|
+
name,
|
|
99
|
+
predicate: (sample) => sample.node !== null && (sample.node.states?.[def.key] === true) === def.expected,
|
|
100
|
+
describeExpected: def.describeExpected,
|
|
101
|
+
observed: observedState,
|
|
102
|
+
}, timeout);
|
|
103
|
+
}
|
|
104
|
+
textMatcher(name, expected, timeout) {
|
|
105
|
+
const def = TEXT_MATCHERS[name];
|
|
106
|
+
const pattern = toTextPattern(expected, { exact: true });
|
|
107
|
+
return this.poll({
|
|
108
|
+
name,
|
|
109
|
+
predicate: (sample) => sample.node !== null && def.match(sample.node[def.field] ?? '', pattern),
|
|
110
|
+
describeExpected: def.describeExpected(describePattern(pattern)),
|
|
111
|
+
observed: (sample) => {
|
|
112
|
+
if (sample.node === null)
|
|
113
|
+
return 'no node';
|
|
114
|
+
const raw = sample.node[def.field] ?? '';
|
|
115
|
+
return `${def.field} ${JSON.stringify(def.normalize ? normalizeText(raw) : raw)}`;
|
|
116
|
+
},
|
|
117
|
+
}, timeout);
|
|
118
|
+
}
|
|
119
|
+
toBeVisible(options) {
|
|
120
|
+
return this.poll({
|
|
121
|
+
name: 'toBeVisible',
|
|
122
|
+
evaluableWithoutNode: true,
|
|
123
|
+
predicate: (sample) => isNodeVisible(sample.node),
|
|
124
|
+
describeExpected: 'visible',
|
|
125
|
+
observed: observedState,
|
|
126
|
+
}, options?.timeout);
|
|
127
|
+
}
|
|
128
|
+
toBeHidden(options) {
|
|
129
|
+
return this.poll({
|
|
130
|
+
name: 'toBeHidden',
|
|
131
|
+
evaluableWithoutNode: true,
|
|
132
|
+
predicate: (sample) => !isNodeVisible(sample.node),
|
|
133
|
+
describeExpected: 'hidden or absent',
|
|
134
|
+
observed: observedState,
|
|
135
|
+
}, options?.timeout);
|
|
136
|
+
}
|
|
137
|
+
toBeEnabled(options) {
|
|
138
|
+
return this.stateMatcher('toBeEnabled', options?.timeout);
|
|
139
|
+
}
|
|
140
|
+
toBeDisabled(options) {
|
|
141
|
+
return this.stateMatcher('toBeDisabled', options?.timeout);
|
|
142
|
+
}
|
|
143
|
+
toBeChecked(options) {
|
|
144
|
+
return this.stateMatcher('toBeChecked', options?.timeout);
|
|
145
|
+
}
|
|
146
|
+
toBeSelected(options) {
|
|
147
|
+
return this.stateMatcher('toBeSelected', options?.timeout);
|
|
148
|
+
}
|
|
149
|
+
toBeExpanded(options) {
|
|
150
|
+
return this.stateMatcher('toBeExpanded', options?.timeout);
|
|
151
|
+
}
|
|
152
|
+
toHaveText(expected, options) {
|
|
153
|
+
return this.textMatcher('toHaveText', expected, options?.timeout);
|
|
154
|
+
}
|
|
155
|
+
toContainText(expected, options) {
|
|
156
|
+
return this.textMatcher('toContainText', expected, options?.timeout);
|
|
157
|
+
}
|
|
158
|
+
toHaveValue(expected, options) {
|
|
159
|
+
return this.textMatcher('toHaveValue', expected, options?.timeout);
|
|
160
|
+
}
|
|
161
|
+
toHaveAccessibleName(expected, options) {
|
|
162
|
+
return this.textMatcher('toHaveAccessibleName', expected, options?.timeout);
|
|
163
|
+
}
|
|
164
|
+
toHaveCount(expected, options) {
|
|
165
|
+
return this.poll({
|
|
166
|
+
name: 'toHaveCount',
|
|
167
|
+
wholeSet: true,
|
|
168
|
+
predicate: (sample) => sample.count === expected,
|
|
169
|
+
describeExpected: `count ${expected}`,
|
|
170
|
+
observed: (sample) => `count ${sample.count}`,
|
|
171
|
+
}, options?.timeout);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function observedState(sample) {
|
|
175
|
+
if (sample.node === null)
|
|
176
|
+
return 'no node';
|
|
177
|
+
const states = sample.node.states ?? {};
|
|
178
|
+
const active = Object.entries(states)
|
|
179
|
+
.filter(([, value]) => value === true)
|
|
180
|
+
.map(([key]) => key);
|
|
181
|
+
return active.length === 0 ? 'default states' : `states: ${active.join(', ')}`;
|
|
182
|
+
}
|
|
183
|
+
export function createAsyncExpectation(internals) {
|
|
184
|
+
return new AsyncExpectationImpl(internals, false);
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=async.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/expect/async.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Public expect() dispatcher (spec api/e2e.d.ts). */
|
|
2
|
+
import type { AsyncExpectation, Expectable, Locator, ValueExpectation } from '../types.ts';
|
|
3
|
+
/** Creates deterministic or async e2e expectations. */
|
|
4
|
+
export declare function expect(actual: Locator): AsyncExpectation;
|
|
5
|
+
export declare function expect<E extends object>(actual: Expectable<E>): E;
|
|
6
|
+
export declare function expect<T>(actual: T): ValueExpectation<T>;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/expect/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAe3F,uDAAuD;AACvD,wBAAgB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAAC;AAC1D,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACnE,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Public expect() dispatcher (spec api/e2e.d.ts). */
|
|
2
|
+
import { expectationBrand } from '../internal/brands.js';
|
|
3
|
+
import { realmSlot } from '../internal/realm-slot.js';
|
|
4
|
+
import { locatorInternals } from '../locator/screen.js';
|
|
5
|
+
import { createAsyncExpectation } from './async.js';
|
|
6
|
+
import { createValueExpectation } from './values.js';
|
|
7
|
+
/**
|
|
8
|
+
* A fixture's attached expectation surface hangs off the fixture object under
|
|
9
|
+
* a global symbol (`BackendFixtureContext.expectable`), so an expect()
|
|
10
|
+
* imported in an isolated test-module realm can still reach it. Core routes
|
|
11
|
+
* to the surface and never knows which matchers a platform contributed.
|
|
12
|
+
*/
|
|
13
|
+
const expectationSlot = realmSlot(expectationBrand);
|
|
14
|
+
export function expect(actual) {
|
|
15
|
+
const internals = locatorInternals(actual);
|
|
16
|
+
if (internals !== undefined)
|
|
17
|
+
return createAsyncExpectation(internals);
|
|
18
|
+
const attached = expectationSlot.get(actual);
|
|
19
|
+
if (attached !== undefined)
|
|
20
|
+
return attached;
|
|
21
|
+
return createValueExpectation(actual);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expect/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAGtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;GAKG;AACH,MAAM,eAAe,GAAG,SAAS,CAAS,gBAAgB,CAAC,CAAC;AAM5D,MAAM,UAAU,MAAM,CAAC,MAAe;IACpC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/expect/values.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAIhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwJpD,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAExE"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/** Synchronous plain-value matchers (spec 03-assertions.md). */
|
|
2
|
+
import { equals, iterableEquality } from '@vitest/expect';
|
|
3
|
+
import { TestError } from '../internal/errors.js';
|
|
4
|
+
function fail(message) {
|
|
5
|
+
throw new TestError('ASSERTION_FAILED', message);
|
|
6
|
+
}
|
|
7
|
+
function format(value) {
|
|
8
|
+
if (typeof value === 'string')
|
|
9
|
+
return JSON.stringify(value);
|
|
10
|
+
if (typeof value === 'bigint')
|
|
11
|
+
return `${value}n`;
|
|
12
|
+
if (typeof value === 'function')
|
|
13
|
+
return `[Function ${value.name || 'anonymous'}]`;
|
|
14
|
+
if (typeof value === 'symbol')
|
|
15
|
+
return value.toString();
|
|
16
|
+
try {
|
|
17
|
+
const json = JSON.stringify(value);
|
|
18
|
+
if (json !== undefined)
|
|
19
|
+
return json;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// fall through
|
|
23
|
+
}
|
|
24
|
+
return String(value);
|
|
25
|
+
}
|
|
26
|
+
class ValueExpectationImpl {
|
|
27
|
+
actual;
|
|
28
|
+
negated;
|
|
29
|
+
constructor(actual, negated) {
|
|
30
|
+
this.actual = actual;
|
|
31
|
+
this.negated = negated;
|
|
32
|
+
}
|
|
33
|
+
get not() {
|
|
34
|
+
return new ValueExpectationImpl(this.actual, !this.negated);
|
|
35
|
+
}
|
|
36
|
+
/** Messages are thunks: formatting large values is paid only on failure. */
|
|
37
|
+
check(condition, positive, negative) {
|
|
38
|
+
if (this.negated) {
|
|
39
|
+
if (condition)
|
|
40
|
+
fail(negative());
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (!condition)
|
|
44
|
+
fail(positive());
|
|
45
|
+
}
|
|
46
|
+
toBe(expected) {
|
|
47
|
+
this.check(Object.is(this.actual, expected), () => `expected ${format(this.actual)} to be ${format(expected)}`, () => `expected ${format(this.actual)} not to be ${format(expected)}`);
|
|
48
|
+
}
|
|
49
|
+
toEqual(expected) {
|
|
50
|
+
this.check(equals(this.actual, expected, [iterableEquality]), () => `expected ${format(this.actual)} to equal ${format(expected)}`, () => `expected ${format(this.actual)} not to equal ${format(expected)}`);
|
|
51
|
+
}
|
|
52
|
+
toBeTruthy() {
|
|
53
|
+
this.check(Boolean(this.actual), () => `expected ${format(this.actual)} to be truthy`, () => `expected ${format(this.actual)} not to be truthy`);
|
|
54
|
+
}
|
|
55
|
+
toBeFalsy() {
|
|
56
|
+
this.check(!this.actual, () => `expected ${format(this.actual)} to be falsy`, () => `expected ${format(this.actual)} not to be falsy`);
|
|
57
|
+
}
|
|
58
|
+
toBeNull() {
|
|
59
|
+
this.check(this.actual === null, () => `expected ${format(this.actual)} to be null`, () => `expected value not to be null`);
|
|
60
|
+
}
|
|
61
|
+
toBeUndefined() {
|
|
62
|
+
this.check(this.actual === undefined, () => `expected ${format(this.actual)} to be undefined`, () => `expected value not to be undefined`);
|
|
63
|
+
}
|
|
64
|
+
toBeDefined() {
|
|
65
|
+
this.check(this.actual !== undefined && this.actual !== null, () => `expected ${format(this.actual)} to be defined`, () => `expected ${format(this.actual)} not to be defined`);
|
|
66
|
+
}
|
|
67
|
+
toContain(expected) {
|
|
68
|
+
let contains;
|
|
69
|
+
const actual = this.actual;
|
|
70
|
+
if (typeof actual === 'string') {
|
|
71
|
+
if (typeof expected !== 'string') {
|
|
72
|
+
fail(`toContain on a string requires a string, got ${format(expected)}`);
|
|
73
|
+
}
|
|
74
|
+
contains = actual.includes(expected);
|
|
75
|
+
}
|
|
76
|
+
else if (typeof actual === 'object' && actual !== null && Symbol.iterator in actual) {
|
|
77
|
+
contains = [...actual].some((item) => equals(item, expected, [iterableEquality]));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
fail(`toContain requires a string or collection, got ${format(actual)}`);
|
|
81
|
+
}
|
|
82
|
+
this.check(contains, () => `expected ${format(this.actual)} to contain ${format(expected)}`, () => `expected ${format(this.actual)} not to contain ${format(expected)}`);
|
|
83
|
+
}
|
|
84
|
+
toMatch(expected) {
|
|
85
|
+
const actual = this.actual;
|
|
86
|
+
if (typeof actual !== 'string') {
|
|
87
|
+
fail(`toMatch requires a string, got ${format(actual)}`);
|
|
88
|
+
}
|
|
89
|
+
const matches = typeof expected === 'string' ? actual.includes(expected) : expected.test(actual);
|
|
90
|
+
this.check(matches, () => `expected ${format(actual)} to match ${format(expected)}`, () => `expected ${format(actual)} not to match ${format(expected)}`);
|
|
91
|
+
}
|
|
92
|
+
toBeGreaterThan(expected) {
|
|
93
|
+
const actual = this.actual;
|
|
94
|
+
if (typeof actual !== 'number')
|
|
95
|
+
fail(`toBeGreaterThan requires a number, got ${format(actual)}`);
|
|
96
|
+
this.check(actual > expected, () => `expected ${actual} to be greater than ${expected}`, () => `expected ${actual} not to be greater than ${expected}`);
|
|
97
|
+
}
|
|
98
|
+
toBeLessThan(expected) {
|
|
99
|
+
const actual = this.actual;
|
|
100
|
+
if (typeof actual !== 'number')
|
|
101
|
+
fail(`toBeLessThan requires a number, got ${format(actual)}`);
|
|
102
|
+
this.check(actual < expected, () => `expected ${actual} to be less than ${expected}`, () => `expected ${actual} not to be less than ${expected}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export function createValueExpectation(actual) {
|
|
106
|
+
return new ValueExpectationImpl(actual, false);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../src/expect/values.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Public sdk-0.1 entrypoint. */
|
|
2
|
+
import type { E2EConfig } from './types.ts';
|
|
3
|
+
export { test } from './collect/registry.ts';
|
|
4
|
+
export { expect } from './expect/index.ts';
|
|
5
|
+
export { credentials } from './credentials.ts';
|
|
6
|
+
export { AgentError } from './agent/error.ts';
|
|
7
|
+
export { BLOCKABLE_CODES, blockedCategoryOf } from './agent/executor.ts';
|
|
8
|
+
export { buildTraceEntry, readTraceEntry } from './cache/trace.ts';
|
|
9
|
+
/** Type-checks and returns an e2e configuration object. */
|
|
10
|
+
export declare function defineConfig(config: E2EConfig): E2EConfig;
|
|
11
|
+
export type * from './types.ts';
|
|
12
|
+
export type { BlockedCategory, ExecutorActions, ExecutorBudgets, ExecutorModelCall, ExecutorObservation, ExecutorStep, ExecutorTarget, ReplayedPrefix, ReplayHandOffReason, StepExecutor, StepExecutorContext, StepVerdict, StepVerdictStatus, } from './agent/executor.ts';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAIzE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEnE,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAEzD;AAED,mBAAmB,YAAY,CAAC;AAChC,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,iBAAiB,GAClB,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Public sdk-0.1 entrypoint. */
|
|
2
|
+
export { test } from './collect/registry.js';
|
|
3
|
+
export { expect } from './expect/index.js';
|
|
4
|
+
export { credentials } from './credentials.js';
|
|
5
|
+
export { AgentError } from './agent/error.js';
|
|
6
|
+
export { BLOCKABLE_CODES, blockedCategoryOf } from './agent/executor.js';
|
|
7
|
+
// Entry framing for custom TraceCacheStore implementations: a remote store
|
|
8
|
+
// serializes buildTraceEntry(payload) on write and validates documents with
|
|
9
|
+
// readTraceEntry on read — the same framing the default file store uses.
|
|
10
|
+
export { buildTraceEntry, readTraceEntry } from './cache/trace.js';
|
|
11
|
+
/** Type-checks and returns an e2e configuration object. */
|
|
12
|
+
export function defineConfig(config) {
|
|
13
|
+
return config;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAIjC,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzE,2EAA2E;AAC3E,4EAA4E;AAC5E,yEAAyE;AACzE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,151 @@
|
|
|
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 type { Telemetry } from 'ai';
|
|
19
|
+
/** A run record: one `generateText` call, which for `agent.act` is one whole step. */
|
|
20
|
+
export interface AiTraceRun {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly started_at: string;
|
|
23
|
+
readonly parent_run_id: string | null;
|
|
24
|
+
readonly parent_step_id: string | null;
|
|
25
|
+
/** Human-readable run name: test title, agent API, and step label. */
|
|
26
|
+
readonly function_id: string | null;
|
|
27
|
+
/** e2e attribution beyond what the devtools shape carries. */
|
|
28
|
+
readonly e2e: AiTraceScope | undefined;
|
|
29
|
+
}
|
|
30
|
+
/** A step record: one model round trip inside a run, JSON columns as strings. */
|
|
31
|
+
export interface AiTraceStep {
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly run_id: string;
|
|
34
|
+
readonly step_number: number;
|
|
35
|
+
readonly type: 'generate';
|
|
36
|
+
readonly model_id: string;
|
|
37
|
+
readonly provider: string | null;
|
|
38
|
+
readonly started_at: string;
|
|
39
|
+
readonly duration_ms: number | null;
|
|
40
|
+
readonly input: string;
|
|
41
|
+
readonly output: string | null;
|
|
42
|
+
readonly usage: string | null;
|
|
43
|
+
readonly error: string | null;
|
|
44
|
+
}
|
|
45
|
+
/** The on-disk document: exactly what `@ai-sdk/devtools` writes. */
|
|
46
|
+
export interface AiTraceDocument {
|
|
47
|
+
readonly runs: AiTraceRun[];
|
|
48
|
+
readonly steps: AiTraceStep[];
|
|
49
|
+
}
|
|
50
|
+
/** Records drained from one worker since its previous drain. */
|
|
51
|
+
export type AiTraceSnapshot = AiTraceDocument;
|
|
52
|
+
/** What the run layer knows about the code that is calling the model. */
|
|
53
|
+
export interface AiTraceScope {
|
|
54
|
+
readonly test: string;
|
|
55
|
+
readonly testId: string;
|
|
56
|
+
readonly target: string;
|
|
57
|
+
/** Zero-based attempt index. */
|
|
58
|
+
readonly attempt: number;
|
|
59
|
+
readonly api?: string;
|
|
60
|
+
readonly label?: string;
|
|
61
|
+
}
|
|
62
|
+
/** Runs `work` with `scope` as the attribution for every model call inside. */
|
|
63
|
+
export declare function withAiTraceScope<T>(scope: AiTraceScope, work: () => Promise<T>): Promise<T>;
|
|
64
|
+
/**
|
|
65
|
+
* Narrows the current attempt scope to one public API step. Outside an
|
|
66
|
+
* attempt scope there is nothing to narrow, and the work runs as is.
|
|
67
|
+
*/
|
|
68
|
+
export declare function withAiTraceStep<T>(api: string, label: string, work: () => Promise<T>): Promise<T>;
|
|
69
|
+
/**
|
|
70
|
+
* Collects one process's model calls. Registered once with the AI SDK via
|
|
71
|
+
* `registerTelemetry`; `drain()` hands the completed records to the run
|
|
72
|
+
* layer, which ships them to the runner over the worker channel.
|
|
73
|
+
*/
|
|
74
|
+
export declare class AiTraceRecorder {
|
|
75
|
+
private readonly calls;
|
|
76
|
+
/**
|
|
77
|
+
* One run per agent step: every generation made under the same step scope
|
|
78
|
+
* — a `waitFor` poll, a judgment repair round — continues the step's run
|
|
79
|
+
* rather than starting its own, so a viewer's run list reads as the test's
|
|
80
|
+
* step list. Keyed by scope identity, which is fresh per step.
|
|
81
|
+
*/
|
|
82
|
+
private readonly stepRuns;
|
|
83
|
+
private runs;
|
|
84
|
+
private steps;
|
|
85
|
+
/**
|
|
86
|
+
* The tool a generation is being made from, carried by async context so
|
|
87
|
+
* tools that execute in parallel each see only their own ancestry.
|
|
88
|
+
*/
|
|
89
|
+
private readonly toolAncestry;
|
|
90
|
+
private disposed;
|
|
91
|
+
/** The integration object to hand to `registerTelemetry`. */
|
|
92
|
+
readonly telemetry: Telemetry;
|
|
93
|
+
/**
|
|
94
|
+
* Stops recording. The SDK offers no unregister, so a disposed recorder
|
|
95
|
+
* simply ignores every later event; the entry it leaves in the global
|
|
96
|
+
* integration list is removed when that list is where the SDK keeps it.
|
|
97
|
+
*/
|
|
98
|
+
dispose(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Returns every run created and every step closed since the previous
|
|
101
|
+
* drain. Open steps stay until they close, so a step that finishes after a
|
|
102
|
+
* unit boundary is never reported half-written; `drain({ all: true })` at
|
|
103
|
+
* shutdown takes them as they are.
|
|
104
|
+
*/
|
|
105
|
+
drain(options?: {
|
|
106
|
+
all?: boolean;
|
|
107
|
+
}): AiTraceSnapshot;
|
|
108
|
+
/** True while any step has started and not yet ended; useful in tests. */
|
|
109
|
+
get pending(): boolean;
|
|
110
|
+
private onStart;
|
|
111
|
+
private onStepStart;
|
|
112
|
+
/**
|
|
113
|
+
* The request as actually sent: after `prepareStep`, with the prepared tool
|
|
114
|
+
* definitions carrying their JSON schemas. This supersedes the step-start
|
|
115
|
+
* view, which predates per-step message compaction and tool filtering.
|
|
116
|
+
*/
|
|
117
|
+
private onModelCallStart;
|
|
118
|
+
private onModelCallEnd;
|
|
119
|
+
private onStepEnd;
|
|
120
|
+
private onEnd;
|
|
121
|
+
private onError;
|
|
122
|
+
private newestOpen;
|
|
123
|
+
private closeStep;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Registers a recorder with the AI SDK. The SDK is an optional peer: when it
|
|
127
|
+
* is absent no model call can go through it, so there is nothing to record
|
|
128
|
+
* and the absence is not an error here.
|
|
129
|
+
*/
|
|
130
|
+
export declare function registerAiTraceRecorder(recorder: AiTraceRecorder, load: () => Promise<{
|
|
131
|
+
registerTelemetry: (...integrations: Telemetry[]) => void;
|
|
132
|
+
}>): Promise<void>;
|
|
133
|
+
/** Merges drained snapshots into one document; call order is arrival order. */
|
|
134
|
+
export declare class AiTraceCollector {
|
|
135
|
+
private readonly runs;
|
|
136
|
+
private readonly steps;
|
|
137
|
+
merge(snapshot: AiTraceSnapshot): void;
|
|
138
|
+
/**
|
|
139
|
+
* The document to write. Workers drain in batches, so records are put back
|
|
140
|
+
* in start order: viewers read file order as time order.
|
|
141
|
+
*/
|
|
142
|
+
document(): AiTraceDocument;
|
|
143
|
+
get size(): number;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* JSON with binary payloads replaced by a size note. Image evidence travels
|
|
147
|
+
* as bytes in vision calls; the trace records that pixels were sent and how
|
|
148
|
+
* many, never the pixels, which keeps the file small and screenshot-free.
|
|
149
|
+
*/
|
|
150
|
+
export declare function stringify(value: unknown): string;
|
|
151
|
+
//# sourceMappingURL=ai-trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-trace.d.ts","sourceRoot":"","sources":["../../src/internal/ai-trace.ts"],"names":[],"mappings":"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"}
|