@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,408 @@
|
|
|
1
|
+
/** Attempt-scoped fixture graph (spec 02-test-api.md, 08-platforms.md). */
|
|
2
|
+
import { createAgentFixture } from '../agent/index.js';
|
|
3
|
+
import { createModelRouter } from '../agent/model/router.js';
|
|
4
|
+
import { createModelAdapter } from '../agent/model/sdk.js';
|
|
5
|
+
import { expectationBrand } from '../internal/brands.js';
|
|
6
|
+
import { ConfigurationError, TestError } from '../internal/errors.js';
|
|
7
|
+
import { SecretLedger } from '../internal/redact.js';
|
|
8
|
+
import { resolveNavigationUrl } from '../internal/urls.js';
|
|
9
|
+
import { Deadline, withTimeout } from '../internal/time.js';
|
|
10
|
+
import { LocatorEngine } from '../locator/engine.js';
|
|
11
|
+
import { createLocator, createScopedScreen, createScreen, } from '../locator/screen.js';
|
|
12
|
+
/** Builds the lazy fixture graph for one attempt. */
|
|
13
|
+
export function createFixtures(environment) {
|
|
14
|
+
const engine = new LocatorEngine({
|
|
15
|
+
session: environment.session,
|
|
16
|
+
signal: environment.signal,
|
|
17
|
+
runId: environment.runId,
|
|
18
|
+
attemptId: environment.attemptId,
|
|
19
|
+
actionTimeout: environment.config.actionTimeout,
|
|
20
|
+
assertionTimeout: environment.config.assertionTimeout,
|
|
21
|
+
testDeadline: environment.testDeadline,
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Any resolved secret leaves the viewport pixel-tainted for the rest of the
|
|
25
|
+
* attempt: an untrusted app may mirror the value anywhere on screen.
|
|
26
|
+
*/
|
|
27
|
+
const taint = { value: false };
|
|
28
|
+
const ledger = attemptSecretLedger(environment);
|
|
29
|
+
const secrets = {
|
|
30
|
+
async resolve(secret) {
|
|
31
|
+
const credential = environment.config.credentials.get(secret.name);
|
|
32
|
+
if (credential === undefined) {
|
|
33
|
+
throw new ConfigurationError('AUTH_CREDENTIAL_UNAVAILABLE', `credential "${secret.name}" is not configured`);
|
|
34
|
+
}
|
|
35
|
+
const password = credential.password;
|
|
36
|
+
const plaintext = typeof password === 'function' ? await password() : password;
|
|
37
|
+
if (typeof plaintext !== 'string' || plaintext === '') {
|
|
38
|
+
throw new ConfigurationError('AUTH_CREDENTIAL_UNAVAILABLE', `credential "${secret.name}" provider did not return a non-empty string`);
|
|
39
|
+
}
|
|
40
|
+
// Only a value that exists can reach the screen: a failed provider
|
|
41
|
+
// leaves nothing to taint the viewport with.
|
|
42
|
+
taint.value = true;
|
|
43
|
+
// A provider-resolved value joins redaction the moment it exists.
|
|
44
|
+
ledger.register(secret.name, plaintext);
|
|
45
|
+
return plaintext;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
const screenContext = {
|
|
49
|
+
engine,
|
|
50
|
+
steps: environment.steps,
|
|
51
|
+
secrets,
|
|
52
|
+
projectRoot: environment.config.projectRoot,
|
|
53
|
+
};
|
|
54
|
+
const screen = createScreen(screenContext);
|
|
55
|
+
const app = createApp(environment, engine);
|
|
56
|
+
let agent;
|
|
57
|
+
const fixtures = {
|
|
58
|
+
get agent() {
|
|
59
|
+
agent ??= createAgentFixture({
|
|
60
|
+
engine,
|
|
61
|
+
steps: environment.steps,
|
|
62
|
+
executor: environment.config.agent.executor ?? lazyDefaultExecutor(),
|
|
63
|
+
customExecutor: environment.config.agent.executor !== undefined,
|
|
64
|
+
models: createModelRouter(environment.config.agent, createModelAdapter),
|
|
65
|
+
config: environment.config,
|
|
66
|
+
target: {
|
|
67
|
+
name: environment.target.name,
|
|
68
|
+
platform: environment.target.platform,
|
|
69
|
+
verbs: environment.session.verbs,
|
|
70
|
+
},
|
|
71
|
+
priorSteps: environment.priorSteps,
|
|
72
|
+
agentContext: joinAgentContext(environment.config.agent.context, environment.agentContext),
|
|
73
|
+
secrets,
|
|
74
|
+
redact: ledger.redact,
|
|
75
|
+
taint,
|
|
76
|
+
artifacts: environment.artifacts,
|
|
77
|
+
signal: environment.signal,
|
|
78
|
+
...(environment.cache !== undefined ? { cache: environment.cache } : {}),
|
|
79
|
+
...(environment.debug !== undefined ? { debug: environment.debug } : {}),
|
|
80
|
+
});
|
|
81
|
+
return agent;
|
|
82
|
+
},
|
|
83
|
+
app,
|
|
84
|
+
screen,
|
|
85
|
+
platform: environment.target.platform,
|
|
86
|
+
session: {
|
|
87
|
+
save: async (name) => {
|
|
88
|
+
const saveSession = environment.saveSession;
|
|
89
|
+
if (saveSession === undefined) {
|
|
90
|
+
throw new ConfigurationError('INVALID_CONFIG', 'session.save() is only available inside setup tests');
|
|
91
|
+
}
|
|
92
|
+
await environment.steps.run('session', 'session.save', name, () => saveSession(name));
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
// Defined as accessors, not spread: spreading would invoke every factory
|
|
97
|
+
// eagerly, before the test body and whether or not it touches the fixture.
|
|
98
|
+
Object.defineProperties(fixtures, Object.getOwnPropertyDescriptors(contributedFixtures(environment, engine, screenContext)));
|
|
99
|
+
return gateUnknownFixtures(fixtures, environment);
|
|
100
|
+
}
|
|
101
|
+
/** Keys a test body may probe without meaning a fixture. */
|
|
102
|
+
const PROBED_KEYS = new Set(['then', 'constructor', 'toJSON', 'toString', 'valueOf', 'inspect']);
|
|
103
|
+
/**
|
|
104
|
+
* Reaching for a fixture the target's backend does not contribute fails at
|
|
105
|
+
* the first touch with the earliest honest error: the backend's name and what
|
|
106
|
+
* it does declare, instead of a TypeError three lines later.
|
|
107
|
+
*/
|
|
108
|
+
function gateUnknownFixtures(fixtures, environment) {
|
|
109
|
+
return new Proxy(fixtures, {
|
|
110
|
+
get(target, property, receiver) {
|
|
111
|
+
if (typeof property !== 'string' || property in target || PROBED_KEYS.has(property)) {
|
|
112
|
+
return Reflect.get(target, property, receiver);
|
|
113
|
+
}
|
|
114
|
+
const backend = environment.target.backend;
|
|
115
|
+
const declared = Object.keys(backend?.fixtures ?? {});
|
|
116
|
+
throw new ConfigurationError('UNSUPPORTED_CAPABILITY', `target "${environment.target.name}" has no "${property}" fixture: backend ${backend?.name ?? 'none'} contributes ${declared.length === 0 ? 'no fixtures' : declared.join(', ')}`);
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Backend-contributed fixtures (RFC0002): the backend declares what calls
|
|
122
|
+
* exist, the harness owns how every call runs. Each async method becomes a
|
|
123
|
+
* recorded step named `<fixture>.<method>`, bounded by the action timeout (or
|
|
124
|
+
* the call's own `timeout` option) and the attempt signal; a synchronous
|
|
125
|
+
* member is an accessor and passes through. Core validates shape, never
|
|
126
|
+
* meaning.
|
|
127
|
+
*/
|
|
128
|
+
function contributedFixtures(environment, engine, screenContext) {
|
|
129
|
+
const declared = environment.target.backend?.fixtures;
|
|
130
|
+
if (declared === undefined)
|
|
131
|
+
return {};
|
|
132
|
+
const contributed = {};
|
|
133
|
+
const attachments = new StepAttachments();
|
|
134
|
+
const context = fixtureContext(environment, engine, screenContext, attachments);
|
|
135
|
+
for (const [name, factory] of Object.entries(declared)) {
|
|
136
|
+
let instance;
|
|
137
|
+
Object.defineProperty(contributed, name, {
|
|
138
|
+
enumerable: true,
|
|
139
|
+
get() {
|
|
140
|
+
instance ??= recordedSurface(factory(context), environment, attachments, {
|
|
141
|
+
path: [name],
|
|
142
|
+
kind: 'resource',
|
|
143
|
+
bounded: true,
|
|
144
|
+
});
|
|
145
|
+
return instance;
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
return contributed;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Attributes what a fixture method records to the step that wraps the call.
|
|
153
|
+
* The method runs before its step opens (that is what lets a synchronous
|
|
154
|
+
* accessor stay an accessor), so anything it attaches synchronously is held
|
|
155
|
+
* here and released into the step once the step exists, or into the current
|
|
156
|
+
* step when the call turns out to be synchronous.
|
|
157
|
+
*/
|
|
158
|
+
class StepAttachments {
|
|
159
|
+
deferred = null;
|
|
160
|
+
/** Runs `attach` now, or holds it while a fixture call is being invoked. */
|
|
161
|
+
record(attach) {
|
|
162
|
+
if (this.deferred === null)
|
|
163
|
+
attach();
|
|
164
|
+
else
|
|
165
|
+
this.deferred.push(attach);
|
|
166
|
+
}
|
|
167
|
+
/** Invokes `call` with attachments held, returning them for release. */
|
|
168
|
+
collect(call) {
|
|
169
|
+
const outer = this.deferred;
|
|
170
|
+
const held = [];
|
|
171
|
+
this.deferred = held;
|
|
172
|
+
try {
|
|
173
|
+
const result = call();
|
|
174
|
+
return {
|
|
175
|
+
result,
|
|
176
|
+
release: () => {
|
|
177
|
+
for (const attach of held)
|
|
178
|
+
attach();
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
this.deferred = outer;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function fixtureContext(environment, engine, screenContext, attachments) {
|
|
188
|
+
const { config, steps } = environment;
|
|
189
|
+
return {
|
|
190
|
+
targetName: environment.target.name,
|
|
191
|
+
app: {
|
|
192
|
+
...(config.app.configured ? { baseUrl: config.app.base.href } : {}),
|
|
193
|
+
allowedOrigins: config.app.allowedOrigins,
|
|
194
|
+
resolveUrl: (url) => {
|
|
195
|
+
requireAppUrl(config);
|
|
196
|
+
return resolveNavigationUrl(url, config.app.base, config.app.allowedOrigins).url;
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
timeouts: {
|
|
200
|
+
test: config.timeout,
|
|
201
|
+
action: config.actionTimeout,
|
|
202
|
+
assertion: config.assertionTimeout,
|
|
203
|
+
},
|
|
204
|
+
signal: environment.signal,
|
|
205
|
+
operation: (timeoutMs) => engine.operation(timeoutMs),
|
|
206
|
+
attachArtifact: (kind, relativePath) => attachments.record(() => steps.attachArtifact(environment.artifacts.register(kind, relativePath))),
|
|
207
|
+
attachViewport: (viewport) => attachments.record(() => steps.attachViewport(viewport)),
|
|
208
|
+
locator: (expression) => createLocator(screenContext, expression),
|
|
209
|
+
screen: (wrap) => createScopedScreen(screenContext, wrap),
|
|
210
|
+
expectable(target, factory) {
|
|
211
|
+
let surface;
|
|
212
|
+
Object.defineProperty(target, expectationBrand, {
|
|
213
|
+
enumerable: false,
|
|
214
|
+
configurable: true,
|
|
215
|
+
get: () => {
|
|
216
|
+
surface ??= recordedSurface(factory(), environment, attachments, {
|
|
217
|
+
path: ['expect'],
|
|
218
|
+
kind: 'assertion',
|
|
219
|
+
bounded: false,
|
|
220
|
+
});
|
|
221
|
+
return surface;
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
return target;
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function isThenable(value) {
|
|
229
|
+
return (typeof value === 'object' &&
|
|
230
|
+
value !== null &&
|
|
231
|
+
typeof value.then === 'function');
|
|
232
|
+
}
|
|
233
|
+
/** Longest label a fixture argument may contribute to the report. */
|
|
234
|
+
const LABEL_LIMIT = 80;
|
|
235
|
+
/** Method names whose string argument is typed input, labelled by length only. */
|
|
236
|
+
const INPUT_METHODS = new Set(['type', 'fill', 'insertText']);
|
|
237
|
+
/**
|
|
238
|
+
* Step label heuristic: the first string or pattern argument, if any. Fixture
|
|
239
|
+
* arguments are report-visible by this rule; secret material travels as
|
|
240
|
+
* `Secret` handles, never as strings, so it cannot land here. Typed input is
|
|
241
|
+
* the exception: it is user data, so only its length is recorded.
|
|
242
|
+
*/
|
|
243
|
+
function labelFor(api, args) {
|
|
244
|
+
const method = api.slice(api.lastIndexOf('.') + 1);
|
|
245
|
+
if (INPUT_METHODS.has(method) && typeof args[0] === 'string')
|
|
246
|
+
return `${args[0].length} chars`;
|
|
247
|
+
for (const arg of args) {
|
|
248
|
+
if (typeof arg === 'string')
|
|
249
|
+
return arg.length > LABEL_LIMIT ? `${arg.slice(0, LABEL_LIMIT)}...` : arg;
|
|
250
|
+
if (arg instanceof RegExp)
|
|
251
|
+
return String(arg);
|
|
252
|
+
}
|
|
253
|
+
return '';
|
|
254
|
+
}
|
|
255
|
+
/** A call's own `timeout` option wins over the action timeout, as on Locator. */
|
|
256
|
+
function timeoutFor(args, fallback) {
|
|
257
|
+
for (const arg of args) {
|
|
258
|
+
if (typeof arg !== 'object' || arg === null || Array.isArray(arg))
|
|
259
|
+
continue;
|
|
260
|
+
const timeout = arg.timeout;
|
|
261
|
+
if (typeof timeout === 'number' && Number.isFinite(timeout) && timeout > 0)
|
|
262
|
+
return timeout;
|
|
263
|
+
}
|
|
264
|
+
return fallback;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Wraps a contributed surface so every async method call is one recorded
|
|
268
|
+
* step. Nested plain objects (namespaces such as `keyboard`) are wrapped
|
|
269
|
+
* recursively with a dotted path; symbol-keyed members and synchronous
|
|
270
|
+
* results pass through untouched.
|
|
271
|
+
*
|
|
272
|
+
* The member is invoked first and the step opens around the promise it
|
|
273
|
+
* returns, which is what lets a synchronous accessor stay an accessor. A
|
|
274
|
+
* synchronous throw is recorded as the failed step it would have been, and
|
|
275
|
+
* anything the call attached through the context is released into that step,
|
|
276
|
+
* however early in the call it happened.
|
|
277
|
+
*/
|
|
278
|
+
function recordedSurface(surface, environment, attachments, options) {
|
|
279
|
+
return new Proxy(surface, {
|
|
280
|
+
get(target, property, receiver) {
|
|
281
|
+
const value = Reflect.get(target, property, receiver);
|
|
282
|
+
if (typeof property !== 'string')
|
|
283
|
+
return value;
|
|
284
|
+
if (typeof value === 'function') {
|
|
285
|
+
return (...args) => {
|
|
286
|
+
const api = [...options.path, property].join('.');
|
|
287
|
+
let collected;
|
|
288
|
+
try {
|
|
289
|
+
collected = attachments.collect(() => value.apply(target, args));
|
|
290
|
+
}
|
|
291
|
+
catch (cause) {
|
|
292
|
+
// Recorded as the failed step it was, then rethrown as it was thrown:
|
|
293
|
+
// a synchronous caller must not receive a promise in place of a throw.
|
|
294
|
+
environment.steps
|
|
295
|
+
.run(options.kind, api, labelFor(api, args), () => Promise.reject(cause))
|
|
296
|
+
.catch(() => undefined);
|
|
297
|
+
throw cause;
|
|
298
|
+
}
|
|
299
|
+
const { result, release } = collected;
|
|
300
|
+
if (!isThenable(result)) {
|
|
301
|
+
release();
|
|
302
|
+
return result;
|
|
303
|
+
}
|
|
304
|
+
return environment.steps.run(options.kind, api, labelFor(api, args), () => {
|
|
305
|
+
release();
|
|
306
|
+
const pending = Promise.resolve(result);
|
|
307
|
+
if (!options.bounded)
|
|
308
|
+
return pending;
|
|
309
|
+
const timeout = timeoutFor(args, environment.config.actionTimeout);
|
|
310
|
+
// A call that outlives its budget is a failed action, like a
|
|
311
|
+
// locator action that never became actionable; the test clock is
|
|
312
|
+
// a separate matter.
|
|
313
|
+
return withTimeout(pending, timeout, () => new TestError('ACTION_FAILED', `${api} exceeded its timeout of ${timeout}ms`));
|
|
314
|
+
});
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
if (typeof value === 'object' &&
|
|
318
|
+
value !== null &&
|
|
319
|
+
!Array.isArray(value) &&
|
|
320
|
+
!isThenable(value) &&
|
|
321
|
+
Object.getPrototypeOf(value) === Object.prototype) {
|
|
322
|
+
return recordedSurface(value, environment, attachments, {
|
|
323
|
+
...options,
|
|
324
|
+
path: [...options.path, property],
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
return value;
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* The built-in executor behind a dynamic import, so the optional `ai` peer
|
|
333
|
+
* dependency loads only if an `agent.act()` step actually runs. Deterministic
|
|
334
|
+
* suites and custom-executor projects never pay for - or fail on - it.
|
|
335
|
+
*/
|
|
336
|
+
function lazyDefaultExecutor() {
|
|
337
|
+
let executor;
|
|
338
|
+
return {
|
|
339
|
+
name: 'e2e-default-agent',
|
|
340
|
+
// Keep in lockstep with createAgent's version: cache provenance and model
|
|
341
|
+
// policyVersion record this wrapper, not the delegate it constructs.
|
|
342
|
+
version: '2',
|
|
343
|
+
async runStep(context) {
|
|
344
|
+
if (executor === undefined) {
|
|
345
|
+
const { createAgent } = await import('../agent/default-agent.js');
|
|
346
|
+
executor = createAgent();
|
|
347
|
+
}
|
|
348
|
+
return executor.runStep(context);
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
/** Trusted config context first, then test/group context. */
|
|
353
|
+
function joinAgentContext(configContext, testContext) {
|
|
354
|
+
const parts = [configContext, testContext].filter((part) => part !== undefined && part.trim() !== '');
|
|
355
|
+
return parts.length === 0 ? undefined : parts.join('\n');
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* The attempt's secret ledger, seeded with the passwords known up front.
|
|
359
|
+
* Provider-backed values join through the resolver at fill time.
|
|
360
|
+
*/
|
|
361
|
+
function attemptSecretLedger(environment) {
|
|
362
|
+
return new SecretLedger([...environment.config.credentials].flatMap(([name, { password }]) => typeof password === 'string' ? [[name, password]] : []));
|
|
363
|
+
}
|
|
364
|
+
/** Navigation needs a real app URL; the placeholder base never leaves the harness. */
|
|
365
|
+
function requireAppUrl(config) {
|
|
366
|
+
if (config.app.configured)
|
|
367
|
+
return;
|
|
368
|
+
throw new ConfigurationError('APP_URL_REQUIRED', 'navigation needs an app URL: set app.url in e2e.config.ts or the APP_URL environment variable');
|
|
369
|
+
}
|
|
370
|
+
function createApp(environment, engine) {
|
|
371
|
+
const { config, steps } = environment;
|
|
372
|
+
const allowed = config.app.allowedOrigins;
|
|
373
|
+
/** One recorded navigation: policy-resolved against the base URL, on the test budget. */
|
|
374
|
+
const navigate = (api, label, target) => steps.run('app', api, label, async () => {
|
|
375
|
+
requireAppUrl(config);
|
|
376
|
+
const resolved = target === undefined
|
|
377
|
+
? config.app.base.href
|
|
378
|
+
: resolveNavigationUrl(target, config.app.base, allowed).url;
|
|
379
|
+
await engine.session.app.open(resolved, engine.operation(config.timeout));
|
|
380
|
+
});
|
|
381
|
+
return {
|
|
382
|
+
open: (openPath) => navigate('app.open', openPath ?? '/', openPath),
|
|
383
|
+
deepLink: (url) => navigate('app.deepLink', url, url),
|
|
384
|
+
async restart() {
|
|
385
|
+
await steps.run('app', 'app.restart', '', async () => {
|
|
386
|
+
await engine.session.app.restart(engine.operation(config.timeout));
|
|
387
|
+
});
|
|
388
|
+
},
|
|
389
|
+
async clearState() {
|
|
390
|
+
await steps.run('app', 'app.clearState', '', async () => {
|
|
391
|
+
await engine.session.app.clearState(engine.operation(config.timeout));
|
|
392
|
+
});
|
|
393
|
+
},
|
|
394
|
+
async back() {
|
|
395
|
+
await steps.run('app', 'app.back', '', async () => {
|
|
396
|
+
await engine.session.app.back(engine.operation());
|
|
397
|
+
});
|
|
398
|
+
},
|
|
399
|
+
async screenshot(label) {
|
|
400
|
+
return steps.run('app', 'app.screenshot', label ?? '', async () => {
|
|
401
|
+
const relative = await engine.session.artifacts.screenshot(label, engine.operation());
|
|
402
|
+
environment.steps.attachArtifact(environment.artifacts.register('screenshot', relative));
|
|
403
|
+
return relative;
|
|
404
|
+
});
|
|
405
|
+
},
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/run/fixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process `UnitRunner`, used when the config cannot cross a process
|
|
3
|
+
* boundary — a programmatic `rawConfig` may hold live backend handles and
|
|
4
|
+
* closures. Execution still goes through the scheduler and the same
|
|
5
|
+
* `TargetWorker` core; only the transport and pair resolution differ, and the
|
|
6
|
+
* scheduler is capped at one worker so nothing overlaps in this process.
|
|
7
|
+
*/
|
|
8
|
+
import type { Selection } from '../collect/select.ts';
|
|
9
|
+
import type { ResolvedConfig } from '../config/resolve.ts';
|
|
10
|
+
import type { DebugTrace } from '../internal/debug.ts';
|
|
11
|
+
import type { SessionStore } from './sessions.ts';
|
|
12
|
+
import type { SpawnUnitRunner } from './unit-runner.ts';
|
|
13
|
+
export interface InProcessRunnerOptions {
|
|
14
|
+
readonly config: ResolvedConfig;
|
|
15
|
+
readonly selection: Selection;
|
|
16
|
+
readonly runId: string;
|
|
17
|
+
readonly artifactsRoot: string;
|
|
18
|
+
readonly sessionStore: SessionStore;
|
|
19
|
+
readonly headed: boolean;
|
|
20
|
+
readonly debug: DebugTrace;
|
|
21
|
+
}
|
|
22
|
+
/** Creates the spawn factory the scheduler uses for in-process execution. */
|
|
23
|
+
export declare function inProcessSpawner(options: InProcessRunnerOptions): SpawnUnitRunner;
|
|
24
|
+
//# sourceMappingURL=in-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-process.d.ts","sourceRoot":"","sources":["../../src/run/in-process.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,sBAAsB,CAAC;AAE3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,kBAAkB,CAAC;AAItF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAkHD,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAEjF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process `UnitRunner`, used when the config cannot cross a process
|
|
3
|
+
* boundary — a programmatic `rawConfig` may hold live backend handles and
|
|
4
|
+
* closures. Execution still goes through the scheduler and the same
|
|
5
|
+
* `TargetWorker` core; only the transport and pair resolution differ, and the
|
|
6
|
+
* scheduler is capped at one worker so nothing overlaps in this process.
|
|
7
|
+
*/
|
|
8
|
+
import { classifyError, ConfigurationError, serializeError } from '../internal/errors.js';
|
|
9
|
+
import { TargetWorker } from './worker/session.js';
|
|
10
|
+
class InProcessRunner {
|
|
11
|
+
targetName;
|
|
12
|
+
events;
|
|
13
|
+
options;
|
|
14
|
+
exit;
|
|
15
|
+
worker;
|
|
16
|
+
finish;
|
|
17
|
+
exited = false;
|
|
18
|
+
closing = false;
|
|
19
|
+
constructor(targetName, events, options) {
|
|
20
|
+
this.targetName = targetName;
|
|
21
|
+
this.events = events;
|
|
22
|
+
this.options = options;
|
|
23
|
+
let finish = () => undefined;
|
|
24
|
+
this.exit = new Promise((resolve) => {
|
|
25
|
+
finish = resolve;
|
|
26
|
+
});
|
|
27
|
+
this.finish = finish;
|
|
28
|
+
this.worker = new TargetWorker({
|
|
29
|
+
emit: (message) => {
|
|
30
|
+
if (!this.exited)
|
|
31
|
+
this.events.onMessage(message);
|
|
32
|
+
},
|
|
33
|
+
fatal: (cause) => {
|
|
34
|
+
if (this.exited)
|
|
35
|
+
return;
|
|
36
|
+
this.events.onMessage({
|
|
37
|
+
type: 'fatal',
|
|
38
|
+
error: serializeError(classifyError(cause)),
|
|
39
|
+
});
|
|
40
|
+
this.close();
|
|
41
|
+
},
|
|
42
|
+
finished: () => this.end('shut down'),
|
|
43
|
+
}, () => this.bootstrap());
|
|
44
|
+
this.worker.start();
|
|
45
|
+
}
|
|
46
|
+
get alive() {
|
|
47
|
+
return !this.exited;
|
|
48
|
+
}
|
|
49
|
+
send(message) {
|
|
50
|
+
if (this.exited)
|
|
51
|
+
return;
|
|
52
|
+
// Interrupts must land even while winding down, so in-flight work aborts.
|
|
53
|
+
if (this.closing && message.type !== 'interrupt')
|
|
54
|
+
return;
|
|
55
|
+
this.worker.handle(message);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* There is no process to signal, so an in-process worker cannot be forced to
|
|
59
|
+
* stop mid-test: the best available equivalent is to stop accepting units and
|
|
60
|
+
* wind down after the current one. `exit` therefore always means "this
|
|
61
|
+
* worker's work has actually stopped", which the scheduler relies on when
|
|
62
|
+
* draining and when synthesizing results for a lost unit.
|
|
63
|
+
*/
|
|
64
|
+
kill() {
|
|
65
|
+
this.close();
|
|
66
|
+
}
|
|
67
|
+
/** Stops accepting work and asks the queue to wind down. */
|
|
68
|
+
close() {
|
|
69
|
+
if (this.exited || this.closing)
|
|
70
|
+
return;
|
|
71
|
+
this.closing = true;
|
|
72
|
+
this.worker.handle({ type: 'shutdown' });
|
|
73
|
+
}
|
|
74
|
+
end(detail) {
|
|
75
|
+
if (this.exited)
|
|
76
|
+
return;
|
|
77
|
+
this.exited = true;
|
|
78
|
+
this.events.onExit(detail);
|
|
79
|
+
this.finish();
|
|
80
|
+
}
|
|
81
|
+
async bootstrap() {
|
|
82
|
+
const { config } = this.options;
|
|
83
|
+
const target = config.targets.find((candidate) => candidate.name === this.targetName);
|
|
84
|
+
if (target === undefined) {
|
|
85
|
+
throw new ConfigurationError('UNKNOWN_TARGET', `unknown target "${this.targetName}"`);
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
config,
|
|
89
|
+
target,
|
|
90
|
+
sessionStore: this.options.sessionStore,
|
|
91
|
+
runId: this.options.runId,
|
|
92
|
+
artifactsRoot: this.options.artifactsRoot,
|
|
93
|
+
headed: this.options.headed,
|
|
94
|
+
debug: this.options.debug,
|
|
95
|
+
resolvePairs: (unit) => resolveFromSelection(this.options.selection, target, unit),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Looks the unit's pairs up in the selection the runner already collected. */
|
|
100
|
+
async function resolveFromSelection(selection, target, unit) {
|
|
101
|
+
const selected = selection.perTarget.find((entry) => entry.target.name === target.name);
|
|
102
|
+
const available = new Map();
|
|
103
|
+
for (const pair of selected?.pairs ?? [])
|
|
104
|
+
available.set(pair.test.id, pair);
|
|
105
|
+
const pairs = [];
|
|
106
|
+
const missing = [];
|
|
107
|
+
for (const wire of unit.pairs) {
|
|
108
|
+
const pair = available.get(wire.test.id);
|
|
109
|
+
if (pair === undefined)
|
|
110
|
+
missing.push(wire.test);
|
|
111
|
+
else
|
|
112
|
+
pairs.push(pair);
|
|
113
|
+
}
|
|
114
|
+
return { pairs, missing };
|
|
115
|
+
}
|
|
116
|
+
/** Creates the spawn factory the scheduler uses for in-process execution. */
|
|
117
|
+
export function inProcessSpawner(options) {
|
|
118
|
+
return (targetName, events) => new InProcessRunner(targetName, events, options);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=in-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-process.js","sourceRoot":"","sources":["../../src/run/in-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic host surface (`@e2edev/e2e/run`): run the runner in-process and stream
|
|
3
|
+
* structured events, without shelling out to the CLI. This is how an
|
|
4
|
+
* embedding host — a hosted platform, a CI wrapper, an IDE — drives runs.
|
|
5
|
+
*
|
|
6
|
+
* The CLI is a thin consumer of exactly this surface; nothing here is
|
|
7
|
+
* CLI-only. The surface is host tooling, not part of sdk-0.1: it can grow in
|
|
8
|
+
* minors, and `report.json` (report-1) stays the canonical record of a run.
|
|
9
|
+
*/
|
|
10
|
+
export { run } from './runner.ts';
|
|
11
|
+
export type { RunOptions, RunOutcome } from './runner.ts';
|
|
12
|
+
export type { RunEvent, RunEventFact, RunEventHeader, RunEventOf, RunEventResult, RunEventSink, RunExitCode, } from './events.ts';
|
|
13
|
+
export type { ArtifactProducer, ArtifactRecord, AttemptRecord, ResultRecord, ResultStatus, RunError, SerialAttemptRecord, SerialGroupRecord, SerialMemberRecord, } from './records.ts';
|
|
14
|
+
export type { StepAgentDetails, StepCacheInfo, StepEvent, StepKind, StepMetrics, StepModelInfo, StepProgress, StepRecord, } from './steps.ts';
|
|
15
|
+
export type { Report1Document } from '../report/build.ts';
|
|
16
|
+
export type { ErrorCategory, ErrorPhase, SerializedError } from '../internal/errors.ts';
|
|
17
|
+
export type { TestIdentity } from '../collect/collect.ts';
|
|
18
|
+
export type { SkipInfo } from '../collect/select.ts';
|
|
19
|
+
//# sourceMappingURL=public.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/run/public.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,QAAQ,EACR,WAAW,EACX,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1D,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxF,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic host surface (`@e2edev/e2e/run`): run the runner in-process and stream
|
|
3
|
+
* structured events, without shelling out to the CLI. This is how an
|
|
4
|
+
* embedding host — a hosted platform, a CI wrapper, an IDE — drives runs.
|
|
5
|
+
*
|
|
6
|
+
* The CLI is a thin consumer of exactly this surface; nothing here is
|
|
7
|
+
* CLI-only. The surface is host tooling, not part of sdk-0.1: it can grow in
|
|
8
|
+
* minors, and `report.json` (report-1) stays the canonical record of a run.
|
|
9
|
+
*/
|
|
10
|
+
export { run } from './runner.js';
|
|
11
|
+
//# sourceMappingURL=public.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/run/public.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC"}
|