@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,230 @@
|
|
|
1
|
+
/** Option resolution and test-target selection (spec 11-lifecycle.md). */
|
|
2
|
+
import { ConfigurationError, CollectionError } from '../internal/errors.js';
|
|
3
|
+
import { groupChain } from './registry.js';
|
|
4
|
+
/** Resolves effective options: test > nearest group > outer groups > config > default. */
|
|
5
|
+
export function resolveOptions(test, config) {
|
|
6
|
+
const chain = groupChain(test.group);
|
|
7
|
+
const layers = [...chain.map((group) => group.options), test.options];
|
|
8
|
+
let timeout = config.timeout;
|
|
9
|
+
let retries = config.retries;
|
|
10
|
+
let platforms;
|
|
11
|
+
let requires = [];
|
|
12
|
+
let session;
|
|
13
|
+
let skipReason;
|
|
14
|
+
const tags = new Set();
|
|
15
|
+
const agentContextParts = [];
|
|
16
|
+
for (const layer of layers) {
|
|
17
|
+
if (layer.timeout !== undefined)
|
|
18
|
+
timeout = layer.timeout;
|
|
19
|
+
if (layer.retries !== undefined)
|
|
20
|
+
retries = layer.retries;
|
|
21
|
+
if (layer.platforms !== undefined)
|
|
22
|
+
platforms = layer.platforms;
|
|
23
|
+
if (layer.requires !== undefined)
|
|
24
|
+
requires = layer.requires;
|
|
25
|
+
if (layer.session !== undefined)
|
|
26
|
+
session = layer.session;
|
|
27
|
+
if (layer.tags !== undefined)
|
|
28
|
+
for (const tag of layer.tags)
|
|
29
|
+
tags.add(tag);
|
|
30
|
+
if (layer.agentContext !== undefined)
|
|
31
|
+
agentContextParts.push(layer.agentContext);
|
|
32
|
+
if (layer.skip !== undefined && layer.skip !== false) {
|
|
33
|
+
skipReason = typeof layer.skip === 'string' ? layer.skip : 'skipped';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const serialRoot = test.serialRoot;
|
|
37
|
+
if (serialRoot !== undefined) {
|
|
38
|
+
let serialRetries = config.retries;
|
|
39
|
+
for (const group of chain) {
|
|
40
|
+
if (group.options.retries !== undefined)
|
|
41
|
+
serialRetries = group.options.retries;
|
|
42
|
+
if (group === serialRoot)
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
retries = serialRetries;
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
timeout,
|
|
49
|
+
retries,
|
|
50
|
+
tags: [...tags],
|
|
51
|
+
platforms,
|
|
52
|
+
requires,
|
|
53
|
+
session,
|
|
54
|
+
agentContext: agentContextParts.length === 0 ? undefined : agentContextParts.join('\n'),
|
|
55
|
+
skipReason,
|
|
56
|
+
serial: serialRoot !== undefined,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function matchesTags(options, tags, tagMode) {
|
|
60
|
+
if (tags === undefined || tags.length === 0)
|
|
61
|
+
return true;
|
|
62
|
+
if (tagMode === 'all')
|
|
63
|
+
return tags.every((tag) => options.tags.includes(tag));
|
|
64
|
+
return tags.some((tag) => options.tags.includes(tag));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Expands the collection into test-target pairs and applies focus, tag,
|
|
68
|
+
* platform, capability, session, and serial-closure rules.
|
|
69
|
+
*/
|
|
70
|
+
export function select(collection, config, filters = {}, flags = {}) {
|
|
71
|
+
const tagMode = filters.tagMode ?? 'any';
|
|
72
|
+
const targets = filters.targetIds === undefined || filters.targetIds.length === 0
|
|
73
|
+
? config.targets
|
|
74
|
+
: config.targets.filter((target) => filters.targetIds.includes(target.name));
|
|
75
|
+
if (filters.targetIds !== undefined) {
|
|
76
|
+
for (const id of filters.targetIds) {
|
|
77
|
+
if (!config.targets.some((target) => target.name === id)) {
|
|
78
|
+
throw new ConfigurationError('UNKNOWN_TARGET', `unknown target ID "${id}"`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const focused = collection.tests.filter((test) => test.mode === 'only');
|
|
83
|
+
if (focused.length > 0 && config.ci) {
|
|
84
|
+
throw new ConfigurationError('ONLY_IN_CI', `.only is rejected in CI: ${focused.map((test) => test.id).join(', ')}`);
|
|
85
|
+
}
|
|
86
|
+
const optionsByTest = new Map();
|
|
87
|
+
for (const test of collection.tests) {
|
|
88
|
+
optionsByTest.set(test.id, resolveOptions(test, config));
|
|
89
|
+
}
|
|
90
|
+
const sessionProducers = collectSessionProducers(collection.tests);
|
|
91
|
+
const pairs = [];
|
|
92
|
+
for (const target of targets) {
|
|
93
|
+
for (const test of collection.tests) {
|
|
94
|
+
const options = optionsByTest.get(test.id);
|
|
95
|
+
pairs.push(classifyPair(test, target, options, focused, filters, tagMode));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const withClosure = applySerialClosure(pairs);
|
|
99
|
+
const withSessions = applySessionSelection(withClosure, sessionProducers);
|
|
100
|
+
const runnableOrdinary = withSessions.filter((pair) => pair.disposition === 'run' && pair.test.kind === 'test');
|
|
101
|
+
if (runnableOrdinary.length === 0 && flags.passWithNoTests !== true) {
|
|
102
|
+
throw new ConfigurationError('NO_TESTS', 'zero runnable ordinary test-target pairs; pass --pass-with-no-tests to allow this');
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
pairs: withSessions,
|
|
106
|
+
perTarget: targets.map((target) => ({
|
|
107
|
+
target,
|
|
108
|
+
pairs: withSessions.filter((pair) => pair.target.name === target.name),
|
|
109
|
+
})),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Maps each session name to its unique producer setup test. */
|
|
113
|
+
function collectSessionProducers(tests) {
|
|
114
|
+
const producers = new Map();
|
|
115
|
+
for (const test of tests) {
|
|
116
|
+
if (test.kind !== 'setup')
|
|
117
|
+
continue;
|
|
118
|
+
for (const session of test.sessions) {
|
|
119
|
+
const existing = producers.get(session);
|
|
120
|
+
if (existing !== undefined) {
|
|
121
|
+
throw new CollectionError(`session "${session}" has duplicate producers: ${existing.id} and ${test.id}`);
|
|
122
|
+
}
|
|
123
|
+
producers.set(session, test);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return producers;
|
|
127
|
+
}
|
|
128
|
+
function classifyPair(test, target, options, focused, filters, tagMode) {
|
|
129
|
+
const base = { test, target, options };
|
|
130
|
+
if (test.kind === 'test') {
|
|
131
|
+
if (focused.length > 0 && test.mode !== 'only') {
|
|
132
|
+
return {
|
|
133
|
+
...base,
|
|
134
|
+
disposition: 'filtered',
|
|
135
|
+
skip: { cause: 'filtered', reason: 'not focused by .only' },
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
if (!matchesTags(options, filters.tags, tagMode)) {
|
|
139
|
+
return {
|
|
140
|
+
...base,
|
|
141
|
+
disposition: 'filtered',
|
|
142
|
+
skip: { cause: 'filtered', reason: 'tag filter did not match' },
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (options.platforms !== undefined && !options.platforms.includes(target.platform)) {
|
|
147
|
+
return {
|
|
148
|
+
...base,
|
|
149
|
+
disposition: 'filtered',
|
|
150
|
+
skip: {
|
|
151
|
+
cause: 'platform-unavailable',
|
|
152
|
+
reason: `test declares platforms [${options.platforms.join(', ')}]`,
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// Targets are graded from the backend's declared capability set: harness
|
|
157
|
+
// tiers plus one name per contributed fixture. Selection runs at config
|
|
158
|
+
// load, before any backend boots, which is why the manifest is synchronous.
|
|
159
|
+
const capabilities = target.backend?.capabilities;
|
|
160
|
+
const missing = options.requires.filter((capability) => capabilities?.has(capability) !== true);
|
|
161
|
+
if (missing.length > 0) {
|
|
162
|
+
return {
|
|
163
|
+
...base,
|
|
164
|
+
disposition: 'skip',
|
|
165
|
+
skip: {
|
|
166
|
+
cause: 'capability-unavailable',
|
|
167
|
+
reason: `backend lacks required capabilities: ${missing.join(', ')}`,
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
if (options.skipReason !== undefined) {
|
|
172
|
+
return {
|
|
173
|
+
...base,
|
|
174
|
+
disposition: 'skip',
|
|
175
|
+
skip: { cause: 'explicit', reason: options.skipReason },
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
if (test.kind === 'setup') {
|
|
179
|
+
return { ...base, disposition: 'filtered', skip: { cause: 'filtered', reason: 'setup test not required by selection' } };
|
|
180
|
+
}
|
|
181
|
+
return { ...base, disposition: 'run', skip: undefined };
|
|
182
|
+
}
|
|
183
|
+
function applySerialClosure(pairs) {
|
|
184
|
+
const selectedSerialUnits = new Set();
|
|
185
|
+
for (const pair of pairs) {
|
|
186
|
+
if (pair.disposition === 'run' && pair.test.serialId !== undefined) {
|
|
187
|
+
selectedSerialUnits.add(`${pair.target.name}::${pair.test.serialId}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return pairs.map((pair) => {
|
|
191
|
+
if (pair.test.serialId === undefined)
|
|
192
|
+
return pair;
|
|
193
|
+
const key = `${pair.target.name}::${pair.test.serialId}`;
|
|
194
|
+
if (!selectedSerialUnits.has(key))
|
|
195
|
+
return pair;
|
|
196
|
+
if (pair.disposition === 'run')
|
|
197
|
+
return pair;
|
|
198
|
+
if (pair.disposition === 'filtered' && pair.skip?.cause === 'filtered') {
|
|
199
|
+
return { ...pair, disposition: 'run', skip: undefined };
|
|
200
|
+
}
|
|
201
|
+
return pair;
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
function applySessionSelection(pairs, sessionProducers) {
|
|
205
|
+
const neededSetups = new Set();
|
|
206
|
+
for (const pair of pairs) {
|
|
207
|
+
if (pair.disposition !== 'run' || pair.options.session === undefined)
|
|
208
|
+
continue;
|
|
209
|
+
const producer = sessionProducers.get(pair.options.session);
|
|
210
|
+
if (producer === undefined) {
|
|
211
|
+
throw new CollectionError(`test ${pair.test.id} consumes session "${pair.options.session}" but no setup test produces it`);
|
|
212
|
+
}
|
|
213
|
+
neededSetups.add(`${pair.target.name}::${producer.id}`);
|
|
214
|
+
}
|
|
215
|
+
return pairs.map((pair) => {
|
|
216
|
+
if (pair.test.kind !== 'setup')
|
|
217
|
+
return pair;
|
|
218
|
+
const key = `${pair.target.name}::${pair.test.id}`;
|
|
219
|
+
if (!neededSetups.has(key))
|
|
220
|
+
return pair;
|
|
221
|
+
// A producer the target cannot run - skipped for a missing capability or
|
|
222
|
+
// filtered out by its own platform list - cannot be promoted; a consumer
|
|
223
|
+
// that needs it is a configuration error, not a silent run elsewhere.
|
|
224
|
+
if (pair.disposition === 'skip' || pair.skip?.cause === 'platform-unavailable') {
|
|
225
|
+
throw new CollectionError(`setup test ${pair.test.id} is required by a session consumer but cannot run on target "${pair.target.name}": ${pair.skip?.reason ?? ''}`);
|
|
226
|
+
}
|
|
227
|
+
return { ...pair, disposition: 'run', skip: undefined };
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/collect/select.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/** Agent, model, and resource-limit resolution (spec 05-config.md, 14-security.md). */
|
|
2
|
+
import type { LanguageModel } from 'ai';
|
|
3
|
+
import { type StepExecutor } from '../agent/executor.ts';
|
|
4
|
+
import type { E2EConfig, ModelInstance, VisionMode } from '../types.ts';
|
|
5
|
+
/** Gateway-native credential variable, used when apiKeyEnv holds no value. */
|
|
6
|
+
export declare const GATEWAY_API_KEY_ENV = "AI_GATEWAY_API_KEY";
|
|
7
|
+
/** A live AI SDK language model, as accepted by `generateText`. */
|
|
8
|
+
export type SdkLanguageModel = Exclude<LanguageModel, string>;
|
|
9
|
+
/**
|
|
10
|
+
* Resolved model identity. Two shapes cover every provider:
|
|
11
|
+
*
|
|
12
|
+
* - `gateway`: a `provider/model-id` reference routed through the AI Gateway.
|
|
13
|
+
* The credential is resolved from the environment here so nothing downstream
|
|
14
|
+
* needs the process environment; it never enters digests, logs, or reports.
|
|
15
|
+
* - `instance`: a caller-supplied AI SDK provider model (`openai('gpt-4o')`,
|
|
16
|
+
* `anthropic(...)`, any `LanguageModelV2+`). The instance owns its own
|
|
17
|
+
* transport and credentials. Instances never cross a process boundary:
|
|
18
|
+
* workers re-resolve the config module and construct their own.
|
|
19
|
+
*/
|
|
20
|
+
export type ResolvedModel = {
|
|
21
|
+
readonly kind: 'gateway';
|
|
22
|
+
readonly provider: string;
|
|
23
|
+
readonly id: string;
|
|
24
|
+
/** Absolute endpoint override, or undefined for the gateway default. */
|
|
25
|
+
readonly endpoint: string | undefined;
|
|
26
|
+
readonly apiKeyEnv: string;
|
|
27
|
+
/** Resolved credential; absence fails at the first model call, not here. */
|
|
28
|
+
readonly apiKey: string | undefined;
|
|
29
|
+
} | {
|
|
30
|
+
readonly kind: 'instance';
|
|
31
|
+
readonly provider: string;
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly model: SdkLanguageModel;
|
|
34
|
+
};
|
|
35
|
+
export interface ResolvedAgentConfig {
|
|
36
|
+
/**
|
|
37
|
+
* The step executor `agent.act()` dispatches to, configured as the `agent`
|
|
38
|
+
* value itself (`agent: createAgent(...)` or any StepExecutor); undefined
|
|
39
|
+
* selects the default AI SDK executor at fixture time. Like model
|
|
40
|
+
* instances, an executor never crosses a process boundary: workers
|
|
41
|
+
* re-resolve the config module.
|
|
42
|
+
*/
|
|
43
|
+
readonly executor: StepExecutor | undefined;
|
|
44
|
+
/** Undefined until a model is configured; acquiring `agent` then fails. */
|
|
45
|
+
readonly model: ResolvedModel | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Model used by calls with `vision`. Visual grounding is a much higher bar
|
|
48
|
+
* than accepting an image, so the tier that needs it can be pinned
|
|
49
|
+
* separately. Undefined falls back to `model`.
|
|
50
|
+
*/
|
|
51
|
+
readonly visionModel: ResolvedModel | undefined;
|
|
52
|
+
readonly maxSteps: number;
|
|
53
|
+
readonly maxModelCalls: number;
|
|
54
|
+
readonly maxObservationBytes: number;
|
|
55
|
+
readonly context: string | undefined;
|
|
56
|
+
/** Default for the per-call `vision` option; a per-call value always wins. */
|
|
57
|
+
readonly vision: VisionMode;
|
|
58
|
+
}
|
|
59
|
+
export interface ResolvedLimits {
|
|
60
|
+
readonly maxAgentContextBytes: number;
|
|
61
|
+
readonly maxLedgerBytes: number;
|
|
62
|
+
readonly maxObservationBytes: number;
|
|
63
|
+
readonly maxEventsPerStep: number;
|
|
64
|
+
readonly maxModelTokensPerCall: number;
|
|
65
|
+
}
|
|
66
|
+
/** `ResolvedLimits` before the agent-owned observation budget is attached. */
|
|
67
|
+
export type ResolvedBaseLimits = Omit<ResolvedLimits, 'maxObservationBytes'>;
|
|
68
|
+
/** Default observation byte budget, shared with the report's pre-config fallback limits. */
|
|
69
|
+
export declare const DEFAULT_OBSERVATION_BYTES = 1048576;
|
|
70
|
+
/**
|
|
71
|
+
* Resolves `config.agent` plus model environment fallbacks. `limits` must be
|
|
72
|
+
* resolved first: the context budget is a limits key, and the dependency runs
|
|
73
|
+
* in exactly one direction.
|
|
74
|
+
*/
|
|
75
|
+
export declare function resolveAgentConfig(raw: E2EConfig, env: NodeJS.ProcessEnv, ci: boolean, limits: ResolvedBaseLimits): ResolvedAgentConfig;
|
|
76
|
+
/** Resolves the `limits` block. The observation budget is attached by the caller. */
|
|
77
|
+
export declare function resolveLimits(raw: E2EConfig): ResolvedBaseLimits;
|
|
78
|
+
/** True for the closed `vision` value set, wherever it is supplied. */
|
|
79
|
+
export declare function isVisionMode(value: unknown): value is VisionMode;
|
|
80
|
+
/**
|
|
81
|
+
* Narrows a structurally verified model instance to the SDK model type. The
|
|
82
|
+
* one place this cast lives; everything downstream takes the checked type.
|
|
83
|
+
*/
|
|
84
|
+
export declare function asSdkLanguageModel(instance: ModelInstance): SdkLanguageModel;
|
|
85
|
+
/**
|
|
86
|
+
* True when a config value is a live AI SDK language model instance. The check
|
|
87
|
+
* is structural, exactly like the AI SDK's own model handling, so instances
|
|
88
|
+
* from any realm or provider package are accepted.
|
|
89
|
+
*/
|
|
90
|
+
export declare function isModelInstance(value: unknown): value is ModelInstance;
|
|
91
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/config/agent.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzE,OAAO,KAAK,EAAe,SAAS,EAAe,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKlG,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,uBAAuB,CAAC;AAExD,mEAAmE;AACnE,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAE9D;;;;;;;;;;GAUG;AACH,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC,CAAC;AAEN,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAC5C,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC;AAED,8EAA8E;AAC9E,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;AAe7E,4FAA4F;AAC5F,eAAO,MAAM,yBAAyB,UAAY,CAAC;AAcnD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,EAAE,EAAE,OAAO,EACX,MAAM,EAAE,kBAAkB,GACzB,mBAAmB,CAyDrB;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,kBAAkB,CAoBhE;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB,CAQ5E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAStE"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/** Agent, model, and resource-limit resolution (spec 05-config.md, 14-security.md). */
|
|
2
|
+
import { isStepExecutor } from '../agent/executor.js';
|
|
3
|
+
import { boundedInt } from './validate.js';
|
|
4
|
+
import { ConfigurationError } from '../internal/errors.js';
|
|
5
|
+
import { isLoopbackHost } from '../internal/urls.js';
|
|
6
|
+
/** Default environment variable holding the provider credential. */
|
|
7
|
+
const DEFAULT_API_KEY_ENV = 'E2E_MODEL_API_KEY';
|
|
8
|
+
/** Gateway-native credential variable, used when apiKeyEnv holds no value. */
|
|
9
|
+
export const GATEWAY_API_KEY_ENV = 'AI_GATEWAY_API_KEY';
|
|
10
|
+
const AGENT_KEYS = new Set([
|
|
11
|
+
'executor',
|
|
12
|
+
'model',
|
|
13
|
+
'visionModel',
|
|
14
|
+
'maxSteps',
|
|
15
|
+
'maxModelCalls',
|
|
16
|
+
'maxObservationBytes',
|
|
17
|
+
'context',
|
|
18
|
+
'vision',
|
|
19
|
+
]);
|
|
20
|
+
const MODEL_KEYS = new Set(['provider', 'id', 'endpoint', 'apiKeyEnv']);
|
|
21
|
+
/** Default observation byte budget, shared with the report's pre-config fallback limits. */
|
|
22
|
+
export const DEFAULT_OBSERVATION_BYTES = 1_048_576;
|
|
23
|
+
const ENV_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
24
|
+
/** Hard ceilings mirroring spec/schema/report-v1.schema.json `limits`. */
|
|
25
|
+
const LIMIT_BOUNDS = {
|
|
26
|
+
maxAgentContextBytes: [1_024, 65_536, 16_384],
|
|
27
|
+
maxLedgerBytes: [1_024, 65_536, 8_192],
|
|
28
|
+
maxEventsPerStep: [1, 10_000, 1_000],
|
|
29
|
+
maxModelTokensPerCall: [1, 1_000_000, 64_000],
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Resolves `config.agent` plus model environment fallbacks. `limits` must be
|
|
33
|
+
* resolved first: the context budget is a limits key, and the dependency runs
|
|
34
|
+
* in exactly one direction.
|
|
35
|
+
*/
|
|
36
|
+
export function resolveAgentConfig(raw, env, ci, limits) {
|
|
37
|
+
const value = raw.agent;
|
|
38
|
+
// Three accepted shapes (RFC0002): the agent itself, an options object, or
|
|
39
|
+
// an options object carrying `executor` — a custom brain no longer forfeits
|
|
40
|
+
// the model, budgets, or context.
|
|
41
|
+
const bare = value !== undefined && isStepExecutor(value) ? value : undefined;
|
|
42
|
+
const agent = bare === undefined ? value : undefined;
|
|
43
|
+
let executor = bare;
|
|
44
|
+
if (agent !== undefined) {
|
|
45
|
+
if (typeof agent !== 'object' || agent === null || Array.isArray(agent)) {
|
|
46
|
+
throw new ConfigurationError('INVALID_CONFIG', 'agent must be an options object or the agent itself: createAgent(...) or any { name, runStep(context) }');
|
|
47
|
+
}
|
|
48
|
+
for (const key of Object.keys(agent)) {
|
|
49
|
+
if (!AGENT_KEYS.has(key)) {
|
|
50
|
+
throw new ConfigurationError('INVALID_CONFIG', `unknown agent config key "${key}"`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (agent.executor !== undefined) {
|
|
54
|
+
if (!isStepExecutor(agent.executor)) {
|
|
55
|
+
throw new ConfigurationError('INVALID_CONFIG', 'agent.executor must be a StepExecutor: createAgent(...) or any { name, runStep(context) }');
|
|
56
|
+
}
|
|
57
|
+
executor = agent.executor;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const maxSteps = boundedInt(agent?.maxSteps, 'agent.maxSteps', 1, 100) ?? 25;
|
|
61
|
+
const maxModelCalls = boundedInt(agent?.maxModelCalls, 'agent.maxModelCalls', 1, 100) ?? 25;
|
|
62
|
+
const maxObservationBytes = boundedInt(agent?.maxObservationBytes, 'agent.maxObservationBytes', 1_024, 16_777_216) ??
|
|
63
|
+
DEFAULT_OBSERVATION_BYTES;
|
|
64
|
+
const context = resolveContext(agent?.context, limits.maxAgentContextBytes);
|
|
65
|
+
const vision = agent?.vision ?? false;
|
|
66
|
+
if (!isVisionMode(vision)) {
|
|
67
|
+
throw new ConfigurationError('INVALID_CONFIG', "agent.vision must be true, false, 'fallback', or 'only'");
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
executor,
|
|
71
|
+
model: resolveModel(agent?.model, env),
|
|
72
|
+
visionModel: resolveModel(agent?.visionModel, env, 'agent.visionModel', 'E2E_VISION_MODEL'),
|
|
73
|
+
maxSteps,
|
|
74
|
+
maxModelCalls,
|
|
75
|
+
maxObservationBytes,
|
|
76
|
+
context,
|
|
77
|
+
vision,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Resolves the `limits` block. The observation budget is attached by the caller. */
|
|
81
|
+
export function resolveLimits(raw) {
|
|
82
|
+
const limits = raw.limits;
|
|
83
|
+
if (limits !== undefined) {
|
|
84
|
+
if (typeof limits !== 'object' || limits === null || Array.isArray(limits)) {
|
|
85
|
+
throw new ConfigurationError('INVALID_CONFIG', 'limits must be an object');
|
|
86
|
+
}
|
|
87
|
+
for (const key of Object.keys(limits)) {
|
|
88
|
+
if (!(key in LIMIT_BOUNDS)) {
|
|
89
|
+
throw new ConfigurationError('INVALID_CONFIG', `unknown limits key "${key}"`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const resolved = {};
|
|
94
|
+
for (const key of Object.keys(LIMIT_BOUNDS)) {
|
|
95
|
+
const [min, max, fallback] = LIMIT_BOUNDS[key];
|
|
96
|
+
resolved[key] = boundedInt(limits?.[key], `limits.${key}`, min, max) ?? fallback;
|
|
97
|
+
}
|
|
98
|
+
return resolved;
|
|
99
|
+
}
|
|
100
|
+
/** True for the closed `vision` value set, wherever it is supplied. */
|
|
101
|
+
export function isVisionMode(value) {
|
|
102
|
+
return typeof value === 'boolean' || value === 'fallback' || value === 'only';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Narrows a structurally verified model instance to the SDK model type. The
|
|
106
|
+
* one place this cast lives; everything downstream takes the checked type.
|
|
107
|
+
*/
|
|
108
|
+
export function asSdkLanguageModel(instance) {
|
|
109
|
+
if (!isModelInstance(instance)) {
|
|
110
|
+
throw new ConfigurationError('INVALID_CONFIG', 'value is not an AI SDK language model instance');
|
|
111
|
+
}
|
|
112
|
+
return instance;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* True when a config value is a live AI SDK language model instance. The check
|
|
116
|
+
* is structural, exactly like the AI SDK's own model handling, so instances
|
|
117
|
+
* from any realm or provider package are accepted.
|
|
118
|
+
*/
|
|
119
|
+
export function isModelInstance(value) {
|
|
120
|
+
if (typeof value !== 'object' || value === null)
|
|
121
|
+
return false;
|
|
122
|
+
const candidate = value;
|
|
123
|
+
return (typeof candidate['specificationVersion'] === 'string' &&
|
|
124
|
+
typeof candidate['provider'] === 'string' &&
|
|
125
|
+
typeof candidate['modelId'] === 'string' &&
|
|
126
|
+
typeof candidate['doGenerate'] === 'function');
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Resolves one model reference from config or its environment override.
|
|
130
|
+
*
|
|
131
|
+
* `label` and `envName` are parameters because the same grammar serves
|
|
132
|
+
* `agent.model` and `agent.visionModel`; every diagnostic then names the key the
|
|
133
|
+
* author actually wrote. There is no implicit default model; an unconfigured
|
|
134
|
+
* model fails at its first model call, so a custom-executor run needs none.
|
|
135
|
+
*/
|
|
136
|
+
function resolveModel(model, env, label = 'agent.model', envName = 'E2E_MODEL') {
|
|
137
|
+
if (model === undefined) {
|
|
138
|
+
const fromEnv = env[envName];
|
|
139
|
+
if (fromEnv === undefined || fromEnv.trim() === '')
|
|
140
|
+
return undefined;
|
|
141
|
+
return parseModelReference(fromEnv.trim(), envName, env);
|
|
142
|
+
}
|
|
143
|
+
if (typeof model === 'string') {
|
|
144
|
+
return parseModelReference(model, label, env);
|
|
145
|
+
}
|
|
146
|
+
if (typeof model !== 'object' || model === null || Array.isArray(model)) {
|
|
147
|
+
throw new ConfigurationError('INVALID_CONFIG', `${label} must be "provider/model-id", a model object, or an AI SDK model instance`);
|
|
148
|
+
}
|
|
149
|
+
if (isModelInstance(model)) {
|
|
150
|
+
return {
|
|
151
|
+
kind: 'instance',
|
|
152
|
+
provider: model.provider,
|
|
153
|
+
id: model.modelId,
|
|
154
|
+
// Structurally verified above; the AI SDK duck-types models the same way.
|
|
155
|
+
model: model,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
for (const key of Object.keys(model)) {
|
|
159
|
+
if (!MODEL_KEYS.has(key)) {
|
|
160
|
+
throw new ConfigurationError('INVALID_CONFIG', `unknown ${label} key "${key}"`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const provider = requireNonEmpty(model.provider, `${label}.provider`);
|
|
164
|
+
const id = requireNonEmpty(model.id, `${label}.id`);
|
|
165
|
+
return gatewayModel(provider, id, model.endpoint, model.apiKeyEnv, env, label);
|
|
166
|
+
}
|
|
167
|
+
/** Splits `provider/model-id` at the first slash. */
|
|
168
|
+
function parseModelReference(reference, label, env) {
|
|
169
|
+
const separator = reference.indexOf('/');
|
|
170
|
+
if (separator <= 0 || separator === reference.length - 1) {
|
|
171
|
+
throw new ConfigurationError('INVALID_CONFIG', `${label} must be "provider/model-id", got ${JSON.stringify(reference)}`);
|
|
172
|
+
}
|
|
173
|
+
return gatewayModel(reference.slice(0, separator), reference.slice(separator + 1), undefined, undefined, env, label);
|
|
174
|
+
}
|
|
175
|
+
function gatewayModel(provider, id, endpoint, apiKeyEnv, env, label) {
|
|
176
|
+
const keyEnv = validateApiKeyEnv(apiKeyEnv, label);
|
|
177
|
+
const apiKey = firstNonEmpty(env[keyEnv], env[GATEWAY_API_KEY_ENV]);
|
|
178
|
+
return {
|
|
179
|
+
kind: 'gateway',
|
|
180
|
+
provider,
|
|
181
|
+
id,
|
|
182
|
+
endpoint: validateEndpoint(endpoint, label),
|
|
183
|
+
apiKeyEnv: keyEnv,
|
|
184
|
+
apiKey,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function firstNonEmpty(...values) {
|
|
188
|
+
return values.find((value) => value !== undefined && value.trim() !== '');
|
|
189
|
+
}
|
|
190
|
+
function validateEndpoint(endpoint, label) {
|
|
191
|
+
if (endpoint === undefined)
|
|
192
|
+
return undefined;
|
|
193
|
+
let parsed;
|
|
194
|
+
try {
|
|
195
|
+
parsed = new URL(endpoint);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
throw new ConfigurationError('INVALID_CONFIG', `invalid ${label}.endpoint "${endpoint}"`);
|
|
199
|
+
}
|
|
200
|
+
if (parsed.protocol === 'https:')
|
|
201
|
+
return parsed.href;
|
|
202
|
+
if (parsed.protocol === 'http:' && isLoopbackHost(parsed.hostname))
|
|
203
|
+
return parsed.href;
|
|
204
|
+
throw new ConfigurationError('INVALID_CONFIG', `${label}.endpoint must use HTTPS unless it is a loopback host: ${endpoint}`);
|
|
205
|
+
}
|
|
206
|
+
function validateApiKeyEnv(apiKeyEnv, label) {
|
|
207
|
+
if (apiKeyEnv === undefined)
|
|
208
|
+
return DEFAULT_API_KEY_ENV;
|
|
209
|
+
if (!ENV_NAME_PATTERN.test(apiKeyEnv)) {
|
|
210
|
+
throw new ConfigurationError('INVALID_CONFIG', `${label}.apiKeyEnv must be a valid environment variable name, got "${apiKeyEnv}"`);
|
|
211
|
+
}
|
|
212
|
+
return apiKeyEnv;
|
|
213
|
+
}
|
|
214
|
+
function resolveContext(context, maxBytes) {
|
|
215
|
+
if (context === undefined)
|
|
216
|
+
return undefined;
|
|
217
|
+
if (typeof context !== 'string') {
|
|
218
|
+
throw new ConfigurationError('INVALID_CONFIG', 'agent.context must be a string');
|
|
219
|
+
}
|
|
220
|
+
const bytes = new TextEncoder().encode(context).byteLength;
|
|
221
|
+
if (bytes > maxBytes) {
|
|
222
|
+
throw new ConfigurationError('INVALID_CONFIG', `agent.context is ${bytes} bytes; the resolved maximum is ${maxBytes}`);
|
|
223
|
+
}
|
|
224
|
+
return context;
|
|
225
|
+
}
|
|
226
|
+
function requireNonEmpty(value, label) {
|
|
227
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
228
|
+
throw new ConfigurationError('INVALID_CONFIG', `${label} is required`);
|
|
229
|
+
}
|
|
230
|
+
return value;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/config/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Config discovery and ESM/TypeScript loading (spec 05-config.md). */
|
|
2
|
+
import type { E2EConfig } from '../types.ts';
|
|
3
|
+
export interface DiscoveredConfig {
|
|
4
|
+
readonly configPath: string | undefined;
|
|
5
|
+
readonly projectRoot: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Discovers the config file. With `--config` the explicit path wins. Otherwise
|
|
9
|
+
* the search starts at cwd and inspects each parent, stopping after the
|
|
10
|
+
* repository root. The selected file's directory is the project root.
|
|
11
|
+
*/
|
|
12
|
+
export declare function discoverConfig(cwd: string, explicitPath?: string): DiscoveredConfig;
|
|
13
|
+
/**
|
|
14
|
+
* Imports a TypeScript/ESM module with erasable-syntax support. Every call
|
|
15
|
+
* evaluates the module afresh: the query carries the caller's key (what the
|
|
16
|
+
* instance is for) plus a process-unique sequence, so a realm never receives
|
|
17
|
+
* another realm's module instance and a second `run()` in one process sees
|
|
18
|
+
* the config file as it is now.
|
|
19
|
+
*/
|
|
20
|
+
export declare function importModule(absolutePath: string, cacheKey?: string): Promise<unknown>;
|
|
21
|
+
/** Loads and returns the raw default export of a config module. */
|
|
22
|
+
export declare function loadConfigModule(configPath: string): Promise<E2EConfig>;
|
|
23
|
+
//# sourceMappingURL=load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAOvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA2BnF;AAWD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAK9F;AAED,mEAAmE;AACnE,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAmB7E"}
|