@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,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker process glue. Owns nothing but the process: it loads the config
|
|
3
|
+
* itself (config modules may hold live backend handles that cannot cross
|
|
4
|
+
* IPC), resolves each unit's pairs by re-importing the file, and hands all
|
|
5
|
+
* actual execution to `TargetWorker`.
|
|
6
|
+
*/
|
|
7
|
+
import { collectFromRegistration } from '../../collect/collect.js';
|
|
8
|
+
import { collectModule } from '../../collect/registry.js';
|
|
9
|
+
import { importModule, loadConfigModule } from '../../config/load.js';
|
|
10
|
+
import { resolveConfig } from '../../config/resolve.js';
|
|
11
|
+
import { setCredentialRegistry } from '../../credentials.js';
|
|
12
|
+
import { loadAiSdk } from '../../agent/ai-sdk.js';
|
|
13
|
+
import { AiTraceRecorder, registerAiTraceRecorder } from '../../internal/ai-trace.js';
|
|
14
|
+
import { DebugTrace } from '../../internal/debug.js';
|
|
15
|
+
import { classifyError, ConfigurationError, serializeError } from '../../internal/errors.js';
|
|
16
|
+
import { SessionStore } from '../sessions.js';
|
|
17
|
+
import { TargetWorker } from './session.js';
|
|
18
|
+
/**
|
|
19
|
+
* Outbound messages in flight. `process.send` is asynchronous and a
|
|
20
|
+
* `process.exit` right behind it can drop the message, so exiting waits for
|
|
21
|
+
* the queue to flush: the runner must see the worker's last word.
|
|
22
|
+
*/
|
|
23
|
+
let outbox = Promise.resolve();
|
|
24
|
+
function send(message) {
|
|
25
|
+
outbox = outbox.then(() => new Promise((resolve) => {
|
|
26
|
+
try {
|
|
27
|
+
if (process.send === undefined)
|
|
28
|
+
resolve();
|
|
29
|
+
else
|
|
30
|
+
process.send(message, undefined, undefined, () => resolve());
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// channel already closed; nothing left to deliver
|
|
34
|
+
resolve();
|
|
35
|
+
}
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
function exitAfterFlush(code) {
|
|
39
|
+
void outbox.then(() => process.exit(code));
|
|
40
|
+
}
|
|
41
|
+
function fatal(cause) {
|
|
42
|
+
send({ type: 'fatal', error: serializeError(classifyError(cause)) });
|
|
43
|
+
exitAfterFlush(1);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Loads the config in this process and verifies it matches the runner's, then
|
|
47
|
+
* assembles everything the worker core needs.
|
|
48
|
+
*/
|
|
49
|
+
async function bootstrap(message, debug, aiTrace) {
|
|
50
|
+
// Registered before the config loads: a config module may construct an
|
|
51
|
+
// executor that imports the AI SDK itself, and the integration list is
|
|
52
|
+
// process-wide, so calls from either module instance land in one trace.
|
|
53
|
+
if (aiTrace !== undefined)
|
|
54
|
+
await registerAiTraceRecorder(aiTrace, loadAiSdk);
|
|
55
|
+
const raw = await loadConfigModule(message.configPath);
|
|
56
|
+
const config = resolveConfig(raw, {
|
|
57
|
+
projectRoot: message.projectRoot,
|
|
58
|
+
configPath: message.configPath,
|
|
59
|
+
env: process.env,
|
|
60
|
+
cli: message.cli,
|
|
61
|
+
});
|
|
62
|
+
if (config.configDigest !== message.configDigest) {
|
|
63
|
+
throw new ConfigurationError('CONFIG_NOT_DETERMINISTIC', 'worker resolved a different config digest than the runner; config must be deterministic');
|
|
64
|
+
}
|
|
65
|
+
const target = config.targets.find((candidate) => candidate.name === message.targetName);
|
|
66
|
+
if (target === undefined) {
|
|
67
|
+
throw new ConfigurationError('UNKNOWN_TARGET', `unknown target "${message.targetName}"`);
|
|
68
|
+
}
|
|
69
|
+
setCredentialRegistry(config.credentials);
|
|
70
|
+
let collectCounter = 0;
|
|
71
|
+
const resolvePairs = async (unit) => {
|
|
72
|
+
collectCounter += 1;
|
|
73
|
+
const registration = await collectModule(() => importModule(unit.absolutePath, `worker-collect-${collectCounter}`));
|
|
74
|
+
const collected = collectFromRegistration(config.projectRoot, unit.absolutePath, registration);
|
|
75
|
+
const byId = new Map(collected.tests.map((test) => [test.id, test]));
|
|
76
|
+
const pairs = [];
|
|
77
|
+
const missing = [];
|
|
78
|
+
for (const wire of unit.pairs) {
|
|
79
|
+
const test = byId.get(wire.test.id);
|
|
80
|
+
if (test === undefined) {
|
|
81
|
+
missing.push(wire.test);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
pairs.push({ test, target, options: wire.options, disposition: 'run', skip: undefined });
|
|
85
|
+
}
|
|
86
|
+
return { pairs, missing, registration };
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
config,
|
|
90
|
+
target,
|
|
91
|
+
sessionStore: SessionStore.forWorker(message.runId, message.sessionsRoot, Buffer.from(message.sessionKeyBase64, 'base64')),
|
|
92
|
+
runId: message.runId,
|
|
93
|
+
artifactsRoot: message.artifactsRoot,
|
|
94
|
+
headed: message.headed,
|
|
95
|
+
resolvePairs,
|
|
96
|
+
debug,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function main() {
|
|
100
|
+
if (process.send === undefined) {
|
|
101
|
+
process.stderr.write('e2e worker requires an IPC channel\n');
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
// Interrupts arrive over IPC; terminal signals target the runner process.
|
|
105
|
+
process.on('SIGINT', () => undefined);
|
|
106
|
+
process.on('SIGTERM', () => undefined);
|
|
107
|
+
process.on('uncaughtException', (cause) => fatal(cause));
|
|
108
|
+
process.on('unhandledRejection', (cause) => fatal(cause));
|
|
109
|
+
let worker;
|
|
110
|
+
process.on('message', (message) => {
|
|
111
|
+
if (message.type === 'bootstrap') {
|
|
112
|
+
// This worker owns its trace outright, so each drain point (unit-done,
|
|
113
|
+
// shutdown-done) ships the entries accumulated since the previous one.
|
|
114
|
+
const debug = new DebugTrace(message.bootstrap.debug);
|
|
115
|
+
const aiTrace = message.bootstrap.aiTrace ? new AiTraceRecorder() : undefined;
|
|
116
|
+
const emit = (outbound) => {
|
|
117
|
+
if (outbound.type !== 'unit-done' && outbound.type !== 'shutdown-done') {
|
|
118
|
+
send(outbound);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
send({
|
|
122
|
+
...outbound,
|
|
123
|
+
...(debug.enabled ? { debug: debug.drain() } : {}),
|
|
124
|
+
...(aiTrace === undefined
|
|
125
|
+
? {}
|
|
126
|
+
: { aiTrace: aiTrace.drain({ all: outbound.type === 'shutdown-done' }) }),
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
worker = new TargetWorker({ emit, fatal, finished: () => exitAfterFlush(0) }, () => bootstrap(message.bootstrap, debug, aiTrace));
|
|
130
|
+
worker.start();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
worker?.handle(message);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
main();
|
|
137
|
+
//# sourceMappingURL=entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../src/run/worker/entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Child-process `UnitRunner`: spawn, messaging, exit tracking. */
|
|
2
|
+
import type { SpawnUnitRunner } from '../unit-runner.ts';
|
|
3
|
+
import type { WorkerBootstrap } from './protocol.ts';
|
|
4
|
+
/** Run-wide settings every child-process worker boots with. */
|
|
5
|
+
export type ChildProcessSpawnOptions = Omit<WorkerBootstrap, 'targetName'> & {
|
|
6
|
+
readonly env: NodeJS.ProcessEnv;
|
|
7
|
+
};
|
|
8
|
+
/** Creates the spawn factory the scheduler uses for child-process execution. */
|
|
9
|
+
export declare function childProcessSpawner(options: ChildProcessSpawnOptions): SpawnUnitRunner;
|
|
10
|
+
//# sourceMappingURL=handle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../../../src/run/worker/handle.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAOnE,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAGV,eAAe,EAEhB,MAAM,eAAe,CAAC;AAcvB,+DAA+D;AAC/D,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,GAAG;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACjC,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,GAAG,eAAe,CAQtF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/** Child-process `UnitRunner`: spawn, messaging, exit tracking. */
|
|
2
|
+
import { fork } from 'node:child_process';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { InfrastructureError } from '../../internal/errors.js';
|
|
7
|
+
/** Resolves the worker entry for both src (vitest, .ts) and dist (.js) layouts. */
|
|
8
|
+
function resolveEntry() {
|
|
9
|
+
const js = fileURLToPath(new URL('./entry.js', import.meta.url));
|
|
10
|
+
if (existsSync(js))
|
|
11
|
+
return { path: js, execArgv: [] };
|
|
12
|
+
const ts = fileURLToPath(new URL('./entry.ts', import.meta.url));
|
|
13
|
+
if (existsSync(ts)) {
|
|
14
|
+
const require = createRequire(import.meta.url);
|
|
15
|
+
return { path: ts, execArgv: ['--import', require.resolve('tsx')] };
|
|
16
|
+
}
|
|
17
|
+
throw new InfrastructureError('WORKER_ENTRY_MISSING', 'e2e worker entry module not found');
|
|
18
|
+
}
|
|
19
|
+
/** Creates the spawn factory the scheduler uses for child-process execution. */
|
|
20
|
+
export function childProcessSpawner(options) {
|
|
21
|
+
const { env, ...bootstrap } = options;
|
|
22
|
+
return (targetName, events) => new ChildProcessRunner({ ...bootstrap, targetName }, { projectRoot: bootstrap.projectRoot, env }, events);
|
|
23
|
+
}
|
|
24
|
+
/** One live worker process bound to a single target. */
|
|
25
|
+
class ChildProcessRunner {
|
|
26
|
+
exit;
|
|
27
|
+
child;
|
|
28
|
+
exited = false;
|
|
29
|
+
constructor(bootstrap, spawn, events) {
|
|
30
|
+
const entry = resolveEntry();
|
|
31
|
+
this.child = fork(entry.path, [], {
|
|
32
|
+
cwd: spawn.projectRoot,
|
|
33
|
+
execArgv: entry.execArgv,
|
|
34
|
+
stdio: ['ignore', 'inherit', 'inherit', 'ipc'],
|
|
35
|
+
env: spawn.env,
|
|
36
|
+
});
|
|
37
|
+
this.child.on('message', (message) => events.onMessage(message));
|
|
38
|
+
this.exit = new Promise((resolve) => {
|
|
39
|
+
// 'close', not 'exit': it fires once the IPC channel has drained, so
|
|
40
|
+
// every message the worker sent (its shutdown-done included) has been
|
|
41
|
+
// delivered before the scheduler treats the worker as gone.
|
|
42
|
+
this.child.once('close', (code, signal) => {
|
|
43
|
+
this.exited = true;
|
|
44
|
+
events.onExit(`code ${String(code)}, signal ${String(signal)}`);
|
|
45
|
+
resolve();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
this.child.once('error', () => {
|
|
49
|
+
// spawn failures surface through the close event
|
|
50
|
+
});
|
|
51
|
+
this.post({ type: 'bootstrap', bootstrap });
|
|
52
|
+
}
|
|
53
|
+
get alive() {
|
|
54
|
+
return !this.exited;
|
|
55
|
+
}
|
|
56
|
+
send(message) {
|
|
57
|
+
this.post(message);
|
|
58
|
+
}
|
|
59
|
+
post(message) {
|
|
60
|
+
if (this.exited)
|
|
61
|
+
return;
|
|
62
|
+
try {
|
|
63
|
+
this.child.send(message);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// channel already closed; the exit event handles cleanup
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
kill() {
|
|
70
|
+
if (!this.exited)
|
|
71
|
+
this.child.kill('SIGKILL');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../../../src/run/worker/handle.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,OAAO,EAAE,IAAI,EAAqB,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAS/D,mFAAmF;AACnF,SAAS,YAAY;IACnB,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACtD,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,EAAE,mCAAmC,CAAC,CAAC;AAC7F,CAAC;AAOD,gFAAgF;AAChF,MAAM,UAAU,mBAAmB,CAAC,OAAiC;IACnE,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC;IACtC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,CAC5B,IAAI,kBAAkB,CACpB,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,EAC5B,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,GAAG,EAAE,EAC3C,MAAM,CACP,CAAC;AACN,CAAC;AAED,wDAAwD;AACxD,MAAM,kBAAkB;IACb,IAAI,CAAgB;IACZ,KAAK,CAAe;IAC7B,MAAM,GAAG,KAAK,CAAC;IAEvB,YACE,SAA0B,EAC1B,KAAsD,EACtD,MAAwB;QAExB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE;YAChC,GAAG,EAAE,KAAK,CAAC,WAAW;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC;YAC9C,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAuB,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACxC,qEAAqE;YACrE,sEAAsE;YACtE,4DAA4D;YAC5D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,MAAM,CAAC,MAAM,CAAC,QAAQ,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAChE,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YAC5B,iDAAiD;QACnD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,KAAK;QACP,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,OAAqB;QACxB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAEO,IAAI,CAAC,OAA4B;QACvC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol between the scheduler and one target worker. Every message is
|
|
3
|
+
* JSON-serializable so the same shapes work over a child-process IPC channel
|
|
4
|
+
* and in-process (see `run/unit-runner.ts`). Two things deliberately never
|
|
5
|
+
* cross: `ResolvedTarget`, which may hold a live backend handle, and test
|
|
6
|
+
* functions. Work units therefore carry `TestIdentity` and the worker pairs
|
|
7
|
+
* each identity with a locally resolved test function.
|
|
8
|
+
*/
|
|
9
|
+
import type { TestIdentity } from '../../collect/collect.ts';
|
|
10
|
+
import type { ResolvedTestOptions } from '../../collect/select.ts';
|
|
11
|
+
import type { CliOverrides, ResolvedTarget } from '../../config/resolve.ts';
|
|
12
|
+
import type { AiTraceSnapshot } from '../../internal/ai-trace.ts';
|
|
13
|
+
import type { DebugSnapshot } from '../../internal/debug.ts';
|
|
14
|
+
import type { SerializedError } from '../../internal/errors.ts';
|
|
15
|
+
import type { ResultRecord, RunError, SerialGroupRecord } from '../records.ts';
|
|
16
|
+
import type { StepProgress } from '../steps.ts';
|
|
17
|
+
/** One runnable pair on the wire; the worker resolves the test function. */
|
|
18
|
+
export interface WirePair {
|
|
19
|
+
readonly test: TestIdentity;
|
|
20
|
+
readonly options: ResolvedTestOptions;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Bootstrap payload for a child-process worker. Transport-private: the
|
|
24
|
+
* scheduler never builds one, because run-wide settings are closed over by the
|
|
25
|
+
* spawn factory rather than sent as a message.
|
|
26
|
+
*/
|
|
27
|
+
export interface WorkerBootstrapMessage {
|
|
28
|
+
readonly type: 'bootstrap';
|
|
29
|
+
readonly bootstrap: WorkerBootstrap;
|
|
30
|
+
}
|
|
31
|
+
/** Everything a child-process worker can receive. */
|
|
32
|
+
export type ChildProcessInbound = WorkerBootstrapMessage | MainToWorker;
|
|
33
|
+
export interface WorkerBootstrap {
|
|
34
|
+
readonly configPath: string;
|
|
35
|
+
readonly projectRoot: string;
|
|
36
|
+
readonly configDigest: string;
|
|
37
|
+
/**
|
|
38
|
+
* The runner's command-line overrides. A worker re-resolves the config from
|
|
39
|
+
* the same file, so without these it would silently disagree with the runner
|
|
40
|
+
* about anything a flag changed — `--retries` among them. The config digest covers only the file, so the mismatch check cannot
|
|
41
|
+
* catch it.
|
|
42
|
+
*/
|
|
43
|
+
readonly cli: CliOverrides;
|
|
44
|
+
readonly targetName: string;
|
|
45
|
+
readonly runId: string;
|
|
46
|
+
readonly artifactsRoot: string;
|
|
47
|
+
readonly headed: boolean;
|
|
48
|
+
readonly sessionsRoot: string;
|
|
49
|
+
/** Per-run AES key; transferred only over this channel, never disk or env. */
|
|
50
|
+
readonly sessionKeyBase64: string;
|
|
51
|
+
/** Whether the worker should collect `--debug` phase timings. */
|
|
52
|
+
readonly debug: boolean;
|
|
53
|
+
/** Whether the worker should record model calls for `--ai-trace`. */
|
|
54
|
+
readonly aiTrace: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface RunUnitMessage {
|
|
57
|
+
readonly type: 'run-unit';
|
|
58
|
+
readonly unitId: string;
|
|
59
|
+
readonly kind: 'setup' | 'file';
|
|
60
|
+
readonly file: string;
|
|
61
|
+
readonly absolutePath: string;
|
|
62
|
+
readonly pairs: readonly WirePair[];
|
|
63
|
+
}
|
|
64
|
+
export interface InterruptMessage {
|
|
65
|
+
readonly type: 'interrupt';
|
|
66
|
+
}
|
|
67
|
+
export interface ShutdownMessage {
|
|
68
|
+
readonly type: 'shutdown';
|
|
69
|
+
}
|
|
70
|
+
export type MainToWorker = RunUnitMessage | InterruptMessage | ShutdownMessage;
|
|
71
|
+
/**
|
|
72
|
+
* `ResultRecord` minus the live target. Serializable as-is: `test` is a
|
|
73
|
+
* `TestIdentity` and every other field is plain data.
|
|
74
|
+
*/
|
|
75
|
+
export type WireResultRecord = Omit<ResultRecord, 'target'>;
|
|
76
|
+
export interface ReadyMessage {
|
|
77
|
+
readonly type: 'ready';
|
|
78
|
+
}
|
|
79
|
+
export interface PairStartMessage {
|
|
80
|
+
readonly type: 'pair-start';
|
|
81
|
+
readonly testId: string;
|
|
82
|
+
/** Joined title path, so reporters need no side lookup by test ID. */
|
|
83
|
+
readonly title: string;
|
|
84
|
+
}
|
|
85
|
+
/** Live step progress of the running attempt; plain data, fire-and-forget. */
|
|
86
|
+
export interface ProgressMessage {
|
|
87
|
+
readonly type: 'progress';
|
|
88
|
+
readonly testId: string;
|
|
89
|
+
readonly progress: StepProgress;
|
|
90
|
+
}
|
|
91
|
+
export interface ResultMessage {
|
|
92
|
+
readonly type: 'result';
|
|
93
|
+
readonly result: WireResultRecord;
|
|
94
|
+
}
|
|
95
|
+
export interface SerialGroupMessage {
|
|
96
|
+
readonly type: 'serial-group';
|
|
97
|
+
readonly group: SerialGroupRecord;
|
|
98
|
+
}
|
|
99
|
+
export interface UnitDoneMessage {
|
|
100
|
+
readonly type: 'unit-done';
|
|
101
|
+
readonly unitId: string;
|
|
102
|
+
readonly runErrors: readonly RunError[];
|
|
103
|
+
/** Phase timings drained from this worker since the previous unit. */
|
|
104
|
+
readonly debug?: DebugSnapshot;
|
|
105
|
+
/** Model calls drained from this worker since the previous unit. */
|
|
106
|
+
readonly aiTrace?: AiTraceSnapshot;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The worker's last word before it exits: backend disposal happens after the
|
|
110
|
+
* final unit drained its errors, so its outcome rides here.
|
|
111
|
+
*/
|
|
112
|
+
export interface ShutdownDoneMessage {
|
|
113
|
+
readonly type: 'shutdown-done';
|
|
114
|
+
readonly runErrors: readonly RunError[];
|
|
115
|
+
/** Phase timings drained from this worker since the last unit. */
|
|
116
|
+
readonly debug?: DebugSnapshot;
|
|
117
|
+
/** Model calls drained from this worker since the last unit, open ones included. */
|
|
118
|
+
readonly aiTrace?: AiTraceSnapshot;
|
|
119
|
+
}
|
|
120
|
+
export interface FatalMessage {
|
|
121
|
+
readonly type: 'fatal';
|
|
122
|
+
readonly error: SerializedError;
|
|
123
|
+
}
|
|
124
|
+
export type WorkerToMain = ReadyMessage | PairStartMessage | ProgressMessage | ResultMessage | SerialGroupMessage | UnitDoneMessage | ShutdownDoneMessage | FatalMessage;
|
|
125
|
+
/** Strips the live target from a result for transport. */
|
|
126
|
+
export declare function encodeResult(record: ResultRecord): WireResultRecord;
|
|
127
|
+
/** Reattaches the scheduler's resolved target to a wire result. */
|
|
128
|
+
export declare function decodeResult(wire: WireResultRecord, target: ResolvedTarget): ResultRecord;
|
|
129
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/run/worker/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol between the scheduler and one target worker. Every message is
|
|
3
|
+
* JSON-serializable so the same shapes work over a child-process IPC channel
|
|
4
|
+
* and in-process (see `run/unit-runner.ts`). Two things deliberately never
|
|
5
|
+
* cross: `ResolvedTarget`, which may hold a live backend handle, and test
|
|
6
|
+
* functions. Work units therefore carry `TestIdentity` and the worker pairs
|
|
7
|
+
* each identity with a locally resolved test function.
|
|
8
|
+
*/
|
|
9
|
+
/** Strips the live target from a result for transport. */
|
|
10
|
+
export function encodeResult(record) {
|
|
11
|
+
const { target: _target, ...rest } = record;
|
|
12
|
+
return rest;
|
|
13
|
+
}
|
|
14
|
+
/** Reattaches the scheduler's resolved target to a wire result. */
|
|
15
|
+
export function decodeResult(wire, target) {
|
|
16
|
+
return { ...wire, target };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/run/worker/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiJH,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAC5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,YAAY,CAAC,IAAsB,EAAE,MAAsB;IACzE,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Target worker core: the single implementation of "execute work units for one
|
|
3
|
+
* target and stream records back". Both transports (child process and
|
|
4
|
+
* in-process) drive this class, so unit execution, interrupt handling, and
|
|
5
|
+
* run-error forwarding exist exactly once.
|
|
6
|
+
*/
|
|
7
|
+
import type { TestIdentity } from '../../collect/collect.ts';
|
|
8
|
+
import type { ModuleRegistration } from '../../collect/registry.ts';
|
|
9
|
+
import type { TestTargetPair } from '../../collect/select.ts';
|
|
10
|
+
import type { ResolvedConfig, ResolvedTarget } from '../../config/resolve.ts';
|
|
11
|
+
import { DebugTrace } from '../../internal/debug.ts';
|
|
12
|
+
import type { SessionStore } from '../sessions.ts';
|
|
13
|
+
import { type MainToWorker, type RunUnitMessage, type WorkerToMain } from './protocol.ts';
|
|
14
|
+
/** Pairs resolved locally for one unit, plus identities that vanished. */
|
|
15
|
+
export interface ResolvedUnitPairs {
|
|
16
|
+
readonly pairs: readonly TestTargetPair[];
|
|
17
|
+
/** Planned tests absent from this worker's view of the file. */
|
|
18
|
+
readonly missing: readonly TestIdentity[];
|
|
19
|
+
/**
|
|
20
|
+
* The module registration the resolver imported to resolve the pairs, when
|
|
21
|
+
* it imported one. Nothing has run in it, so the executor adopts it as the
|
|
22
|
+
* unit's first realm instead of importing the same file a second time.
|
|
23
|
+
*/
|
|
24
|
+
readonly registration?: ModuleRegistration;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Turns a unit's wire pairs into executable pairs. A child-process worker
|
|
28
|
+
* re-imports the file; an in-process worker looks the pairs up in the
|
|
29
|
+
* selection the runner already collected.
|
|
30
|
+
*/
|
|
31
|
+
export type ResolveUnitPairs = (unit: RunUnitMessage) => Promise<ResolvedUnitPairs>;
|
|
32
|
+
export interface TargetWorkerDeps {
|
|
33
|
+
readonly config: ResolvedConfig;
|
|
34
|
+
readonly target: ResolvedTarget;
|
|
35
|
+
readonly sessionStore: SessionStore;
|
|
36
|
+
readonly runId: string;
|
|
37
|
+
readonly artifactsRoot: string;
|
|
38
|
+
readonly headed: boolean;
|
|
39
|
+
readonly resolvePairs: ResolveUnitPairs;
|
|
40
|
+
readonly debug?: DebugTrace;
|
|
41
|
+
}
|
|
42
|
+
/** Transport callbacks a target worker needs. */
|
|
43
|
+
export interface TargetWorkerHost {
|
|
44
|
+
emit(message: WorkerToMain): void;
|
|
45
|
+
/** Unrecoverable failure: the worker must be treated as dead afterwards. */
|
|
46
|
+
fatal(cause: unknown): void;
|
|
47
|
+
/** Graceful end of life, after backend disposal. */
|
|
48
|
+
finished(): void;
|
|
49
|
+
}
|
|
50
|
+
export declare class TargetWorker {
|
|
51
|
+
private readonly host;
|
|
52
|
+
private readonly bootstrap;
|
|
53
|
+
private readonly interruptController;
|
|
54
|
+
private deps;
|
|
55
|
+
private executor;
|
|
56
|
+
private runErrorWatermark;
|
|
57
|
+
/** Serializes message handling so units never overlap on one worker. */
|
|
58
|
+
private queue;
|
|
59
|
+
constructor(host: TargetWorkerHost, bootstrap: () => Promise<TargetWorkerDeps>);
|
|
60
|
+
/** Boots the worker and announces readiness. Enqueued like any other work. */
|
|
61
|
+
start(): void;
|
|
62
|
+
handle(message: MainToWorker): void;
|
|
63
|
+
private enqueue;
|
|
64
|
+
private runUnit;
|
|
65
|
+
/** Run errors accumulate on the executor; forward only the new ones. */
|
|
66
|
+
private drainRunErrors;
|
|
67
|
+
private shutdown;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/run/worker/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAgB,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAExG,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;CAC5C;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEpF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,4EAA4E;IAC5E,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,oDAAoD;IACpD,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED,qBAAa,YAAY;IASrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAT5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,iBAAiB,CAAK;IAC9B,wEAAwE;IACxE,OAAO,CAAC,KAAK,CAAoC;IAEjD,YACmB,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,EACzD;IAEJ,8EAA8E;IAC9E,KAAK,IAAI,IAAI,CA2BZ;IAED,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAYlC;IAED,OAAO,CAAC,OAAO;YAMD,OAAO;IAsCrB,wEAAwE;IACxE,OAAO,CAAC,cAAc;YAOR,QAAQ;CAYvB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Target worker core: the single implementation of "execute work units for one
|
|
3
|
+
* target and stream records back". Both transports (child process and
|
|
4
|
+
* in-process) drive this class, so unit execution, interrupt handling, and
|
|
5
|
+
* run-error forwarding exist exactly once.
|
|
6
|
+
*/
|
|
7
|
+
import { DebugTrace } from '../../internal/debug.js';
|
|
8
|
+
import { TargetExecutor } from '../execute.js';
|
|
9
|
+
import { disappearedResult } from '../units.js';
|
|
10
|
+
import { encodeResult } from './protocol.js';
|
|
11
|
+
export class TargetWorker {
|
|
12
|
+
host;
|
|
13
|
+
bootstrap;
|
|
14
|
+
interruptController = new AbortController();
|
|
15
|
+
deps;
|
|
16
|
+
executor;
|
|
17
|
+
runErrorWatermark = 0;
|
|
18
|
+
/** Serializes message handling so units never overlap on one worker. */
|
|
19
|
+
queue = Promise.resolve();
|
|
20
|
+
constructor(host, bootstrap) {
|
|
21
|
+
this.host = host;
|
|
22
|
+
this.bootstrap = bootstrap;
|
|
23
|
+
}
|
|
24
|
+
/** Boots the worker and announces readiness. Enqueued like any other work. */
|
|
25
|
+
start() {
|
|
26
|
+
this.enqueue(async () => {
|
|
27
|
+
const deps = await this.bootstrap();
|
|
28
|
+
this.deps = deps;
|
|
29
|
+
this.executor = new TargetExecutor({
|
|
30
|
+
config: deps.config,
|
|
31
|
+
target: deps.target,
|
|
32
|
+
runId: deps.runId,
|
|
33
|
+
artifactsRoot: deps.artifactsRoot,
|
|
34
|
+
sessionStore: deps.sessionStore,
|
|
35
|
+
headed: deps.headed,
|
|
36
|
+
interruptSignal: this.interruptController.signal,
|
|
37
|
+
...(deps.debug !== undefined ? { debug: deps.debug } : {}),
|
|
38
|
+
events: {
|
|
39
|
+
onResult: (result) => this.host.emit({ type: 'result', result: encodeResult(result) }),
|
|
40
|
+
onSerialGroup: (group) => this.host.emit({ type: 'serial-group', group }),
|
|
41
|
+
onPairStart: (pair) => this.host.emit({
|
|
42
|
+
type: 'pair-start',
|
|
43
|
+
testId: pair.test.id,
|
|
44
|
+
title: pair.test.titlePath.join(' \u203a '),
|
|
45
|
+
}),
|
|
46
|
+
onProgress: (testId, progress) => this.host.emit({ type: 'progress', testId, progress }),
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
this.host.emit({ type: 'ready' });
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
handle(message) {
|
|
53
|
+
switch (message.type) {
|
|
54
|
+
case 'interrupt':
|
|
55
|
+
this.interruptController.abort();
|
|
56
|
+
return;
|
|
57
|
+
case 'run-unit':
|
|
58
|
+
this.enqueue(() => this.runUnit(message));
|
|
59
|
+
return;
|
|
60
|
+
case 'shutdown':
|
|
61
|
+
this.enqueue(() => this.shutdown());
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
enqueue(work) {
|
|
66
|
+
this.queue = this.queue.then(work).catch((cause) => {
|
|
67
|
+
this.host.fatal(cause);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async runUnit(message) {
|
|
71
|
+
const deps = this.deps;
|
|
72
|
+
const executor = this.executor;
|
|
73
|
+
if (deps === undefined || executor === undefined) {
|
|
74
|
+
throw new Error('received a work unit before the worker finished starting');
|
|
75
|
+
}
|
|
76
|
+
// `unit-done` is sent only when the unit ran to completion. A throw here
|
|
77
|
+
// (a module that fails to re-import, a realm that cannot be created) is
|
|
78
|
+
// fatal for the worker; the scheduler still holds the unit and synthesizes
|
|
79
|
+
// failed results for every pair it never heard about. Reporting the unit
|
|
80
|
+
// done first would clear that bookkeeping and drop those tests silently.
|
|
81
|
+
const { pairs, missing, registration } = await deps.resolvePairs(message);
|
|
82
|
+
for (const test of missing) {
|
|
83
|
+
executor.recordDisappeared(`test ${test.id} disappeared before execution; registration must be deterministic`);
|
|
84
|
+
executor.emit(disappearedResult(test, deps.target));
|
|
85
|
+
}
|
|
86
|
+
if (message.kind === 'setup') {
|
|
87
|
+
// The imported registration has run nothing yet, so only the first
|
|
88
|
+
// setup pair may adopt it; any later one needs its own fresh realm.
|
|
89
|
+
for (const [index, pair] of pairs.entries()) {
|
|
90
|
+
await executor.runSetupUnit(pair, index === 0 ? registration : undefined);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
await executor.runFileUnit({ file: message.file, absolutePath: message.absolutePath }, pairs, registration);
|
|
95
|
+
}
|
|
96
|
+
this.host.emit({
|
|
97
|
+
type: 'unit-done',
|
|
98
|
+
unitId: message.unitId,
|
|
99
|
+
runErrors: this.drainRunErrors(executor),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/** Run errors accumulate on the executor; forward only the new ones. */
|
|
103
|
+
drainRunErrors(executor) {
|
|
104
|
+
const runErrors = executor.collectedRunErrors();
|
|
105
|
+
const delta = runErrors.slice(this.runErrorWatermark);
|
|
106
|
+
this.runErrorWatermark = runErrors.length;
|
|
107
|
+
return delta;
|
|
108
|
+
}
|
|
109
|
+
async shutdown() {
|
|
110
|
+
// The backend belongs to this worker's executor on both transports. Its
|
|
111
|
+
// disposal records run errors after the last unit drained, so they ship
|
|
112
|
+
// on a final message of their own; dispose itself never throws.
|
|
113
|
+
const executor = this.executor;
|
|
114
|
+
if (executor !== undefined)
|
|
115
|
+
await executor.dispose();
|
|
116
|
+
this.host.emit({
|
|
117
|
+
type: 'shutdown-done',
|
|
118
|
+
runErrors: executor === undefined ? [] : this.drainRunErrors(executor),
|
|
119
|
+
});
|
|
120
|
+
this.host.finished();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/run/worker/session.ts"],"names":[],"mappings":"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"}
|