@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,375 @@
|
|
|
1
|
+
/** Run orchestration: config, collection, selection, execution, reporting. */
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { discoverConfig, loadConfigModule } from '../config/load.js';
|
|
4
|
+
import { isCiMode, resolveConfig, } from '../config/resolve.js';
|
|
5
|
+
import { collect } from '../collect/collect.js';
|
|
6
|
+
import { select } from '../collect/select.js';
|
|
7
|
+
import { classifyError, combineExitCodes, ConfigurationError, E2EError, errorMessage, exitCodeForCategory, serializeError, } from '../internal/errors.js';
|
|
8
|
+
import { loadAiSdk } from '../agent/ai-sdk.js';
|
|
9
|
+
import { AiTraceCollector, AiTraceRecorder, registerAiTraceRecorder } from '../internal/ai-trace.js';
|
|
10
|
+
import { DebugTrace } from '../internal/debug.js';
|
|
11
|
+
import { timestamp, uuidv7 } from '../internal/ids.js';
|
|
12
|
+
import { buildReport, describeTarget } from '../report/build.js';
|
|
13
|
+
import { agentStepTable } from '../report/debug-steps.js';
|
|
14
|
+
import { ListReporter } from '../report/list.js';
|
|
15
|
+
import { writeJsonReport } from '../report/write.js';
|
|
16
|
+
import { AppProcess } from './app-process.js';
|
|
17
|
+
import { createRunEventEmitter, toEventResult } from './events.js';
|
|
18
|
+
import { inProcessSpawner } from './in-process.js';
|
|
19
|
+
import { runUnits } from './scheduler.js';
|
|
20
|
+
import { SessionStore } from './sessions.js';
|
|
21
|
+
import { childProcessSpawner } from './worker/handle.js';
|
|
22
|
+
import { setCredentialRegistry } from '../credentials.js';
|
|
23
|
+
/** Executes one complete run and returns the outcome without exiting. */
|
|
24
|
+
export async function run(options = {}) {
|
|
25
|
+
const cwd = options.cwd ?? process.cwd();
|
|
26
|
+
const env = options.env ?? process.env;
|
|
27
|
+
const runId = uuidv7();
|
|
28
|
+
const startedAt = timestamp();
|
|
29
|
+
const debug = new DebugTrace(options.debug === true);
|
|
30
|
+
const aiTrace = options.aiTrace === true ? new AiTraceCollector() : undefined;
|
|
31
|
+
/** The in-process recorder; child-process workers own their own. */
|
|
32
|
+
let aiTraceRecorder;
|
|
33
|
+
const interruptController = new AbortController();
|
|
34
|
+
const runErrors = [];
|
|
35
|
+
const results = [];
|
|
36
|
+
const serialGroups = [];
|
|
37
|
+
const targetProvenance = new Map();
|
|
38
|
+
let appProcess;
|
|
39
|
+
let sessionStore;
|
|
40
|
+
// Hoisted: workers re-resolve the same config file and need these overrides,
|
|
41
|
+
// or a flag would apply in the runner and be dropped in every worker.
|
|
42
|
+
const cli = {};
|
|
43
|
+
if (options.retries !== undefined)
|
|
44
|
+
cli.retries = options.retries;
|
|
45
|
+
if (options.workers !== undefined)
|
|
46
|
+
cli.workers = options.workers;
|
|
47
|
+
if (options.reporters !== undefined)
|
|
48
|
+
cli.reporters = options.reporters;
|
|
49
|
+
if (options.noCache === true)
|
|
50
|
+
cli.cache = 'off';
|
|
51
|
+
// Config resolves before anything is emitted, and its failure is kept rather
|
|
52
|
+
// than thrown: the reporter set is config truth (CLI overrides merge during
|
|
53
|
+
// resolution), so the emitter below is built exactly once from the set
|
|
54
|
+
// actually in force. When config itself failed, the CLI's own value is the
|
|
55
|
+
// best available, and the failure still renders through it.
|
|
56
|
+
const loaded = await debug.time('config.load', () => loadRunConfig(options, cwd, env, cli)).then((config) => ({ config, error: undefined }), (cause) => ({ config: undefined, error: classifyError(cause) }));
|
|
57
|
+
// The event stream is the run's single spine: the list reporter is just one
|
|
58
|
+
// sink on it, beside the host's, so the CLI and a host can never see
|
|
59
|
+
// different stories.
|
|
60
|
+
const reporters = loaded.config?.reporters ?? options.reporters ?? ['list'];
|
|
61
|
+
const emit = createRunEventEmitter([
|
|
62
|
+
options.quiet === true || reporters.includes('json') ? undefined : new ListReporter().handle,
|
|
63
|
+
options.onEvent,
|
|
64
|
+
]);
|
|
65
|
+
const jsonReport = reporters.includes('json');
|
|
66
|
+
/** Records one run-level error once: into the report and onto the stream. */
|
|
67
|
+
const recordRunError = (runError) => {
|
|
68
|
+
runErrors.push(runError);
|
|
69
|
+
emit({ type: 'run-error', error: runError.error });
|
|
70
|
+
};
|
|
71
|
+
/** Records a failure of the run itself, outside any test. */
|
|
72
|
+
const recordFailure = (cause, phase) => {
|
|
73
|
+
recordRunError({ error: serializeError(classifyError(cause), phase === undefined ? {} : { phase }) });
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* The exit code is a fold over run state — every result, every run error,
|
|
77
|
+
* the interrupt — never threaded through by hand. A run error recorded
|
|
78
|
+
* anywhere, including during teardown or the report write, reaches the exit
|
|
79
|
+
* code the same way.
|
|
80
|
+
*/
|
|
81
|
+
const currentExitCode = () => combineExitCodes([
|
|
82
|
+
...resultExitCodes(results),
|
|
83
|
+
...runErrors.map((runError) => exitCodeForCategory(runError.error.category)),
|
|
84
|
+
...(interruptController.signal.aborted ? [130] : []),
|
|
85
|
+
]);
|
|
86
|
+
const buildRunReport = (exitCode) => buildReport({
|
|
87
|
+
runId,
|
|
88
|
+
config: loaded.config,
|
|
89
|
+
startedAt,
|
|
90
|
+
status: statusOf(exitCode),
|
|
91
|
+
exitCode,
|
|
92
|
+
results,
|
|
93
|
+
serialGroups,
|
|
94
|
+
runErrors,
|
|
95
|
+
targetProvenance,
|
|
96
|
+
});
|
|
97
|
+
/**
|
|
98
|
+
* Writes the canonical report and returns its path only once the file
|
|
99
|
+
* exists: a host must never be handed a path to a report that was not
|
|
100
|
+
* written. A lost canonical report is an infrastructure run error, not a
|
|
101
|
+
* footnote: recorded like any other, it reaches the exit code, and the
|
|
102
|
+
* returned in-memory document becomes the only complete record. The file
|
|
103
|
+
* is not retried — the destination just failed.
|
|
104
|
+
*/
|
|
105
|
+
const writeCanonicalReport = async (config) => {
|
|
106
|
+
const target = path.join(path.dirname(resolveArtifactsRoot(config, options.artifactsDir)), 'report.json');
|
|
107
|
+
try {
|
|
108
|
+
await writeJsonReport(target, buildRunReport(currentExitCode()));
|
|
109
|
+
return target;
|
|
110
|
+
}
|
|
111
|
+
catch (cause) {
|
|
112
|
+
recordFailure(new E2EError('infrastructure', 'REPORT_WRITE_FAILED', `the canonical report could not be written: ${errorMessage(cause)}`, { cause }), 'report');
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Writes the AI trace next to the report, on the same terms: the path is
|
|
118
|
+
* returned only once the file exists, and a lost trace is a recorded run
|
|
119
|
+
* error. The in-process recorder is drained here; child-process workers
|
|
120
|
+
* already shipped theirs over the worker channel.
|
|
121
|
+
*/
|
|
122
|
+
const writeAiTrace = async (config) => {
|
|
123
|
+
if (aiTrace === undefined)
|
|
124
|
+
return undefined;
|
|
125
|
+
if (aiTraceRecorder !== undefined) {
|
|
126
|
+
aiTrace.merge(aiTraceRecorder.drain({ all: true }));
|
|
127
|
+
aiTraceRecorder.dispose();
|
|
128
|
+
aiTraceRecorder = undefined;
|
|
129
|
+
}
|
|
130
|
+
const target = path.join(path.dirname(resolveArtifactsRoot(config, options.artifactsDir)), 'ai-trace.json');
|
|
131
|
+
try {
|
|
132
|
+
await writeJsonReport(target, aiTrace.document());
|
|
133
|
+
return target;
|
|
134
|
+
}
|
|
135
|
+
catch (cause) {
|
|
136
|
+
recordFailure(new E2EError('infrastructure', 'REPORT_WRITE_FAILED', `the AI trace could not be written: ${errorMessage(cause)}`, { cause }), 'report');
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
const finish = async () => {
|
|
141
|
+
const aiTracePath = loaded.config === undefined ? undefined : await writeAiTrace(loaded.config);
|
|
142
|
+
const reportPath = loaded.config === undefined ? undefined : await writeCanonicalReport(loaded.config);
|
|
143
|
+
const exitCode = currentExitCode();
|
|
144
|
+
const status = statusOf(exitCode);
|
|
145
|
+
const report = buildRunReport(exitCode);
|
|
146
|
+
setCredentialRegistry(undefined);
|
|
147
|
+
emit({
|
|
148
|
+
type: 'run-finished',
|
|
149
|
+
status,
|
|
150
|
+
exitCode,
|
|
151
|
+
...(reportPath === undefined ? {} : { reportPath }),
|
|
152
|
+
...(aiTracePath === undefined ? {} : { aiTracePath }),
|
|
153
|
+
});
|
|
154
|
+
if (jsonReport) {
|
|
155
|
+
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
156
|
+
}
|
|
157
|
+
if (debug.enabled) {
|
|
158
|
+
process.stderr.write(debug.summary());
|
|
159
|
+
process.stderr.write(agentStepTable(results, serialGroups));
|
|
160
|
+
}
|
|
161
|
+
return { exitCode, status, report, reportPath, aiTracePath, results };
|
|
162
|
+
};
|
|
163
|
+
if (loaded.config === undefined) {
|
|
164
|
+
recordFailure(loaded.error, 'config');
|
|
165
|
+
return finish();
|
|
166
|
+
}
|
|
167
|
+
const config = loaded.config;
|
|
168
|
+
setCredentialRegistry(config.credentials);
|
|
169
|
+
emit({
|
|
170
|
+
type: 'run-started',
|
|
171
|
+
runId,
|
|
172
|
+
projectId: config.projectId,
|
|
173
|
+
projectRoot: config.projectRoot,
|
|
174
|
+
ci: isCiMode(env),
|
|
175
|
+
targets: config.targets.map((target) => target.name),
|
|
176
|
+
});
|
|
177
|
+
const executeRun = async () => {
|
|
178
|
+
const interrupted = interruptController.signal;
|
|
179
|
+
if (config.app.command !== undefined) {
|
|
180
|
+
const app = new AppProcess(config.app.command, config.projectRoot, config.app.readyUrl);
|
|
181
|
+
appProcess = app;
|
|
182
|
+
await debug.time('app.start', () => app.start(interrupted));
|
|
183
|
+
}
|
|
184
|
+
// A run cancelled before any test could start collects nothing: the
|
|
185
|
+
// interrupt alone decides the outcome.
|
|
186
|
+
if (interrupted.aborted)
|
|
187
|
+
return;
|
|
188
|
+
let planned;
|
|
189
|
+
try {
|
|
190
|
+
planned = await debug.time('collect', async () => {
|
|
191
|
+
const collection = await collect(config, options.files);
|
|
192
|
+
const filters = {
|
|
193
|
+
...(options.tags !== undefined ? { tags: options.tags } : {}),
|
|
194
|
+
...(options.tagMode !== undefined ? { tagMode: options.tagMode } : {}),
|
|
195
|
+
...(options.targetIds !== undefined ? { targetIds: options.targetIds } : {}),
|
|
196
|
+
};
|
|
197
|
+
const selection = select(collection, config, filters, options.passWithNoTests !== undefined ? { passWithNoTests: options.passWithNoTests } : {});
|
|
198
|
+
return { collection, selection };
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
catch (cause) {
|
|
202
|
+
recordFailure(cause, 'collection');
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const { collection, selection } = planned;
|
|
206
|
+
emit({ type: 'plan', total: selection.pairs.length });
|
|
207
|
+
const artifactsRoot = resolveArtifactsRoot(config, options.artifactsDir);
|
|
208
|
+
const sessionsRoot = path.join(config.projectRoot, '.e2e', 'sessions');
|
|
209
|
+
const store = SessionStore.create(runId, sessionsRoot);
|
|
210
|
+
sessionStore = store;
|
|
211
|
+
// Pre-flight: grade every selected target from its backend declaration
|
|
212
|
+
// before any worker starts, so a config that asks for more than the
|
|
213
|
+
// backend offers fails here, once, instead of inside a launch budget.
|
|
214
|
+
for (const { target } of selection.perTarget) {
|
|
215
|
+
targetProvenance.set(target.name, validateBackend(target, config));
|
|
216
|
+
}
|
|
217
|
+
// Workers re-load the config module themselves, so a file-backed config
|
|
218
|
+
// runs across processes. A programmatic `rawConfig` cannot cross a process
|
|
219
|
+
// boundary (it may hold live backend handles), so it runs in-process
|
|
220
|
+
// against one worker. Either way the scheduler is the only engine.
|
|
221
|
+
if (aiTrace !== undefined && config.configPath === undefined) {
|
|
222
|
+
// In-process execution shares this process with the runner, so the
|
|
223
|
+
// recorder lives here and is drained straight into the collector.
|
|
224
|
+
aiTraceRecorder = new AiTraceRecorder();
|
|
225
|
+
await registerAiTraceRecorder(aiTraceRecorder, loadAiSdk);
|
|
226
|
+
}
|
|
227
|
+
const transport = config.configPath === undefined
|
|
228
|
+
? {
|
|
229
|
+
workers: 1,
|
|
230
|
+
spawn: inProcessSpawner({
|
|
231
|
+
config,
|
|
232
|
+
selection,
|
|
233
|
+
runId,
|
|
234
|
+
artifactsRoot,
|
|
235
|
+
sessionStore: store,
|
|
236
|
+
headed: options.headed ?? false,
|
|
237
|
+
debug,
|
|
238
|
+
}),
|
|
239
|
+
}
|
|
240
|
+
: {
|
|
241
|
+
workers: config.workers,
|
|
242
|
+
spawn: childProcessSpawner({
|
|
243
|
+
configPath: config.configPath,
|
|
244
|
+
projectRoot: config.projectRoot,
|
|
245
|
+
configDigest: config.configDigest,
|
|
246
|
+
cli,
|
|
247
|
+
runId,
|
|
248
|
+
artifactsRoot,
|
|
249
|
+
headed: options.headed ?? false,
|
|
250
|
+
sessionsRoot,
|
|
251
|
+
sessionKeyBase64: store.exportKeyForWorker(),
|
|
252
|
+
debug: debug.enabled,
|
|
253
|
+
aiTrace: aiTrace !== undefined,
|
|
254
|
+
env,
|
|
255
|
+
}),
|
|
256
|
+
};
|
|
257
|
+
await debug.time('scheduler', () => runUnits({
|
|
258
|
+
selection,
|
|
259
|
+
collection,
|
|
260
|
+
projectRoot: config.projectRoot,
|
|
261
|
+
workers: transport.workers,
|
|
262
|
+
spawn: transport.spawn,
|
|
263
|
+
interruptGraceMs: config.timeout + config.cleanupTimeout,
|
|
264
|
+
interruptSignal: interrupted,
|
|
265
|
+
events: {
|
|
266
|
+
onResult: (result) => {
|
|
267
|
+
results.push(result);
|
|
268
|
+
emit({ type: 'test-finished', result: toEventResult(result) });
|
|
269
|
+
},
|
|
270
|
+
onSerialGroup: (group) => {
|
|
271
|
+
serialGroups.push(group);
|
|
272
|
+
emit({ type: 'serial-group', group });
|
|
273
|
+
},
|
|
274
|
+
onRunError: recordRunError,
|
|
275
|
+
onTestStart: (testId, title, targetName) => emit({ type: 'test-started', testId, title, target: targetName }),
|
|
276
|
+
onProgress: (testId, targetName, progress) => emit({ type: 'step', testId, target: targetName, progress }),
|
|
277
|
+
onDebug: (snapshot) => debug.merge(snapshot),
|
|
278
|
+
onAiTrace: (snapshot) => aiTrace?.merge(snapshot),
|
|
279
|
+
},
|
|
280
|
+
}));
|
|
281
|
+
};
|
|
282
|
+
// The interrupt bridge is armed for the whole body — app startup, collection,
|
|
283
|
+
// scheduling — so a host's cancellation lands wherever the run is, not only
|
|
284
|
+
// once the scheduler happens to be running. From here the run owns external
|
|
285
|
+
// resources. Failures anywhere are recorded, never thrown — the outcome must
|
|
286
|
+
// survive its own execution and its own cleanup — and teardown always runs
|
|
287
|
+
// before the terminal `run-finished`, so that event means the app process
|
|
288
|
+
// and session store are gone.
|
|
289
|
+
const externalSignal = options.interruptSignal;
|
|
290
|
+
const onInterrupt = () => interruptController.abort();
|
|
291
|
+
if (externalSignal?.aborted === true)
|
|
292
|
+
interruptController.abort();
|
|
293
|
+
externalSignal?.addEventListener('abort', onInterrupt, { once: true });
|
|
294
|
+
process.once('SIGINT', onInterrupt);
|
|
295
|
+
process.once('SIGTERM', onInterrupt);
|
|
296
|
+
try {
|
|
297
|
+
await executeRun();
|
|
298
|
+
}
|
|
299
|
+
catch (cause) {
|
|
300
|
+
recordFailure(cause);
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
process.removeListener('SIGINT', onInterrupt);
|
|
304
|
+
process.removeListener('SIGTERM', onInterrupt);
|
|
305
|
+
externalSignal?.removeEventListener('abort', onInterrupt);
|
|
306
|
+
}
|
|
307
|
+
for (const teardown of [() => sessionStore?.cleanup(), () => appProcess?.stop()]) {
|
|
308
|
+
try {
|
|
309
|
+
await teardown();
|
|
310
|
+
}
|
|
311
|
+
catch (cause) {
|
|
312
|
+
recordFailure(cause);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return finish();
|
|
316
|
+
}
|
|
317
|
+
/** Resolves the run's config: a supplied value, or the discovered file. */
|
|
318
|
+
async function loadRunConfig(options, cwd, env, cli) {
|
|
319
|
+
if (options.rawConfig !== undefined) {
|
|
320
|
+
return resolveConfig(options.rawConfig, { projectRoot: cwd, env, cli });
|
|
321
|
+
}
|
|
322
|
+
const discovered = discoverConfig(cwd, options.configPath);
|
|
323
|
+
const raw = discovered.configPath === undefined ? {} : await loadConfigModule(discovered.configPath);
|
|
324
|
+
return resolveConfig(raw, {
|
|
325
|
+
projectRoot: discovered.projectRoot,
|
|
326
|
+
...(discovered.configPath !== undefined ? { configPath: discovered.configPath } : {}),
|
|
327
|
+
env,
|
|
328
|
+
cli,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
function statusOf(exitCode) {
|
|
332
|
+
return exitCode === 0 ? 'passed' : exitCode === 1 ? 'failed' : exitCode === 130 ? 'interrupted' : 'error';
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Grades one target from its backend declaration and validates the configured
|
|
336
|
+
* artifacts against it; returns the report provenance.
|
|
337
|
+
*/
|
|
338
|
+
function validateBackend(target, config) {
|
|
339
|
+
const provenance = describeTarget(target);
|
|
340
|
+
// The default artifact set is best-effort: a backend without evidence
|
|
341
|
+
// capture simply records none. Asking for one explicitly is a contract.
|
|
342
|
+
for (const artifact of config.artifactsExplicit ? config.artifacts : []) {
|
|
343
|
+
if (!provenance.artifactCapabilities.includes(artifact)) {
|
|
344
|
+
throw new ConfigurationError('UNSUPPORTED_ARTIFACT', `target "${target.name}" (backend ${provenance.backend.name}) does not support the configured "${artifact}" artifact`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return provenance;
|
|
348
|
+
}
|
|
349
|
+
function resultExitCodes(results) {
|
|
350
|
+
const codes = [0];
|
|
351
|
+
for (const result of results) {
|
|
352
|
+
switch (result.status) {
|
|
353
|
+
case 'failed':
|
|
354
|
+
case 'timed-out':
|
|
355
|
+
codes.push(1);
|
|
356
|
+
for (const attempt of result.attempts) {
|
|
357
|
+
if (attempt.error !== undefined)
|
|
358
|
+
codes.push(exitCodeForCategory(attempt.error.category));
|
|
359
|
+
}
|
|
360
|
+
break;
|
|
361
|
+
case 'interrupted':
|
|
362
|
+
codes.push(130);
|
|
363
|
+
break;
|
|
364
|
+
default:
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return codes;
|
|
369
|
+
}
|
|
370
|
+
function resolveArtifactsRoot(config, override) {
|
|
371
|
+
if (override !== undefined)
|
|
372
|
+
return path.resolve(config.projectRoot, override);
|
|
373
|
+
return path.join(config.projectRoot, '.e2e', 'artifacts');
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/run/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run engine: dispatches file-target work units across workers (spec
|
|
3
|
+
* 11-lifecycle.md). Per target, setup units complete before ordinary units
|
|
4
|
+
* dispatch; a worker is bound to one target, runs one unit at a time, and is
|
|
5
|
+
* discarded after any failing unit or infrastructure fault.
|
|
6
|
+
*
|
|
7
|
+
* Workers are reached only through `SpawnUnitRunner`, so the same scheduling,
|
|
8
|
+
* gating, and reporting logic covers both child-process and in-process
|
|
9
|
+
* execution.
|
|
10
|
+
*/
|
|
11
|
+
import type { Collection } from '../collect/collect.ts';
|
|
12
|
+
import type { Selection } from '../collect/select.ts';
|
|
13
|
+
import type { AiTraceSnapshot } from '../internal/ai-trace.ts';
|
|
14
|
+
import type { DebugSnapshot } from '../internal/debug.ts';
|
|
15
|
+
import type { ResultRecord, RunError, SerialGroupRecord } from './records.ts';
|
|
16
|
+
import type { StepProgress } from './steps.ts';
|
|
17
|
+
import type { SpawnUnitRunner } from './unit-runner.ts';
|
|
18
|
+
export interface SchedulerEvents {
|
|
19
|
+
onResult(result: ResultRecord): void;
|
|
20
|
+
onSerialGroup(group: SerialGroupRecord): void;
|
|
21
|
+
onRunError(error: RunError): void;
|
|
22
|
+
/** A worker began executing one test-target pair. */
|
|
23
|
+
onTestStart?(testId: string, title: string, targetName: string): void;
|
|
24
|
+
/** Live step progress of one running attempt. */
|
|
25
|
+
onProgress?(testId: string, targetName: string, progress: StepProgress): void;
|
|
26
|
+
/** Phase timings a child-process worker drained after one unit. */
|
|
27
|
+
onDebug?(snapshot: DebugSnapshot): void;
|
|
28
|
+
/** Model calls a child-process worker drained after one unit. */
|
|
29
|
+
onAiTrace?(snapshot: AiTraceSnapshot): void;
|
|
30
|
+
}
|
|
31
|
+
export interface RunUnitsOptions {
|
|
32
|
+
readonly selection: Selection;
|
|
33
|
+
readonly collection: Collection;
|
|
34
|
+
readonly projectRoot: string;
|
|
35
|
+
/** Maximum workers alive at once across all targets. */
|
|
36
|
+
readonly workers: number;
|
|
37
|
+
/** Budget for a worker to finish an in-flight unit after an interrupt. */
|
|
38
|
+
readonly interruptGraceMs: number;
|
|
39
|
+
readonly interruptSignal: AbortSignal;
|
|
40
|
+
readonly spawn: SpawnUnitRunner;
|
|
41
|
+
readonly events: SchedulerEvents;
|
|
42
|
+
}
|
|
43
|
+
/** Runs every selected unit and streams records. */
|
|
44
|
+
export declare function runUnits(options: RunUnitsOptions): Promise<void>;
|
|
45
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/run/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,sBAAsB,CAAC;AAEtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,kBAAkB,CAAC;AAYpE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IACrC,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC9C,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClC,qDAAqD;IACrD,WAAW,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACtE,iDAAiD;IACjD,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9E,mEAAmE;IACnE,OAAO,CAAC,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC,iEAAiE;IACjE,SAAS,CAAC,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;CAClC;AAQD,oDAAoD;AACpD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE"}
|