@gfdelarue/testkit 0.4.5 → 0.6.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/README.md +724 -495
- package/bin/testkit-windows-owner-arm64.exe +0 -0
- package/bin/testkit-windows-owner-x64.exe +0 -0
- package/dist/app/bugs/ci-report.js +2 -2
- package/dist/app/bugs/ci-summary.js +3 -3
- package/dist/app/bugs/draft.js +3 -3
- package/dist/app/bugs/file.js +1 -1
- package/dist/app/bugs/gate.js +1 -1
- package/dist/app/bugs/guide.js +3 -3
- package/dist/app/bugs/issue.js +4 -4
- package/dist/app/bugs/known-failures.js +1 -1
- package/dist/app/bugs/record.js +1 -1
- package/dist/app/bugs/run-reading.js +1 -1
- package/dist/app/bugs/supplied-reproduce.js +1 -0
- package/dist/app/campaigns/campaign.js +1 -1
- package/dist/app/campaigns/index.js +2 -2
- package/dist/app/cleanup/index.js +1 -1
- package/dist/app/db-schema/prepare.js +1 -1
- package/dist/app/destroy/index.js +1 -1
- package/dist/app/discover/index.js +2 -2
- package/dist/app/doctor/index.js +1 -1
- package/dist/app/environments/config-driven.js +1 -1
- package/dist/app/environments/environment-file.js +1 -0
- package/dist/app/environments/file-setup.js +1 -0
- package/dist/app/environments/routing.js +1 -1
- package/dist/app/environments/static-values.js +1 -0
- package/dist/app/environments/supplied-input.js +1 -0
- package/dist/app/environments/supplied.js +1 -1
- package/dist/app/environments/task-databases.js +2 -0
- package/dist/app/inspect/artifacts.js +1 -1
- package/dist/app/inspect/index.js +1 -1
- package/dist/app/lint/index.js +1 -1
- package/dist/app/lint/native.js +1 -1
- package/dist/app/lint/options.js +1 -1
- package/dist/app/lint/rules/engine-imports.js +1 -1
- package/dist/app/lint/rules/syntax.js +1 -1
- package/dist/app/lint/rules/unit.js +1 -1
- package/dist/app/reports/prepare.js +1 -1
- package/dist/app/run/caller-redaction.js +1 -0
- package/dist/app/run/engine-execution-failures.js +1 -1
- package/dist/app/run/engine-execution-reporting.js +1 -1
- package/dist/app/run/engine-execution.js +1 -1
- package/dist/app/run/engine-orchestration.js +1 -1
- package/dist/app/run/environment.js +1 -1
- package/dist/app/run/failure-details.js +1 -1
- package/dist/app/run/live-run.js +1 -1
- package/dist/app/run/orchestrator.js +1 -1
- package/dist/app/run/planning.js +1 -1
- package/dist/app/run/request.js +1 -1
- package/dist/app/run/results.js +1 -1
- package/dist/app/run/run-events.js +1 -1
- package/dist/app/run/run-finalization.js +1 -1
- package/dist/app/run/scheduler/estimates.js +1 -1
- package/dist/app/run/scheduler/identity.js +1 -1
- package/dist/app/run/scheduler/index.js +1 -1
- package/dist/app/run/setup/runtime-node-setup-protocol.js +1 -1
- package/dist/app/run/setup/runtime-node-setup-worker.js +1 -1
- package/dist/app/run/setup/runtime-node-setup.js +2 -2
- package/dist/app/run/task-batches.js +1 -1
- package/dist/app/run/worker-loop.js +1 -1
- package/dist/app/status/model.js +1 -1
- package/dist/app/status/runs.js +1 -1
- package/dist/app/typecheck/index.js +4 -4
- package/dist/cli/command-catalog.js +1 -1
- package/dist/cli/command-flags.js +1 -1
- package/dist/cli/commands/artifacts.js +2 -2
- package/dist/cli/commands/bug/file.js +2 -2
- package/dist/cli/commands/bug/record.js +2 -2
- package/dist/cli/commands/discover.js +1 -1
- package/dist/cli/commands/guard/unsafe-entrypoint.js +1 -1
- package/dist/cli/commands/run.js +2 -2
- package/dist/cli/commands/typecheck.js +1 -1
- package/dist/cli/commands/workspace.js +1 -1
- package/dist/cli/framework/errors.js +1 -1
- package/dist/cli/framework/execute.js +7 -6
- package/dist/cli/framework/parser.js +1 -1
- package/dist/cli/operations/run/operation.js +2 -2
- package/dist/cli/renderers/bug/text.js +1 -1
- package/dist/cli/renderers/discover/report.js +1 -1
- package/dist/cli/renderers/run/events.js +2 -2
- package/dist/cli/renderers/run/formatting.js +1 -1
- package/dist/cli/renderers/run/status.js +1 -1
- package/dist/cli/renderers/run/text-reporter.js +24 -22
- package/dist/cli/terminal/colors.js +1 -1
- package/dist/cli/terminal/layout.js +2 -2
- package/dist/config/authoring/database-fixture-discovery.js +1 -0
- package/dist/config/authoring/http-methods.js +1 -1
- package/dist/config/authoring/index.js +1 -1
- package/dist/config/loader/config-loader.js +1 -1
- package/dist/config/loader/decode-discovery.js +1 -1
- package/dist/config/loader/decode-execution.js +1 -1
- package/dist/config/loader/dependencies.js +1 -1
- package/dist/config/loader/discover-tests.js +1 -1
- package/dist/config/loader/discovery-summary.js +1 -1
- package/dist/config/loader/discovery.js +2 -2
- package/dist/config/loader/env.js +1 -1
- package/dist/config/loader/file-metadata.js +1 -1
- package/dist/config/loader/groups.js +2 -1
- package/dist/config/loader/index.js +1 -1
- package/dist/config/loader/load.js +1 -1
- package/dist/config/loader/managed-configs.js +1 -1
- package/dist/config/loader/owned-discovery.js +1 -0
- package/dist/config/loader/path-policy.js +1 -1
- package/dist/config/loader/runtime-isolation.js +1 -1
- package/dist/config/loader/runtime.js +1 -1
- package/dist/config/loader/skip-config.js +1 -1
- package/dist/config/loader/task-policy.js +1 -0
- package/dist/config/loader/test-selection.js +1 -1
- package/dist/config/loader/validation.js +1 -1
- package/dist/database/admin.js +2 -2
- package/dist/database/bindings.js +1 -0
- package/dist/database/cleanup.js +1 -1
- package/dist/database/configured-steps.js +1 -1
- package/dist/database/docker-metadata.js +3 -3
- package/dist/database/docker.js +3 -3
- package/dist/database/index.js +1 -1
- package/dist/database/local-postgres.js +1 -1
- package/dist/database/naming.js +1 -1
- package/dist/database/postgres/connection-check.js +1 -0
- package/dist/database/postgres/protocol.js +2 -0
- package/dist/database/schema-operations.js +1 -1
- package/dist/database/schema-source.js +3 -3
- package/dist/database/source-schema-env.js +1 -0
- package/dist/database/state-files.js +1 -1
- package/dist/database/state.js +1 -1
- package/dist/database/steps.js +3 -3
- package/dist/domain/file-timeout.js +1 -1
- package/dist/domain/identifiers.js +1 -1
- package/dist/domain/retired-test-types.js +1 -0
- package/dist/domain/runtime-isolation-contract.js +1 -1
- package/dist/domain/suite-selection.js +1 -1
- package/dist/domain/test-types.js +1 -1
- package/dist/engines/adapters/evidence-files.js +1 -1
- package/dist/engines/adapters/execution.js +1 -1
- package/dist/engines/adapters/json-bounds.js +2 -0
- package/dist/engines/adapters/native-report.js +1 -1
- package/dist/engines/api/execution.js +1 -1
- package/dist/engines/api/index.js +1 -1
- package/dist/engines/api/runtime-artifact.js +1 -1
- package/dist/engines/catalog.js +1 -1
- package/dist/engines/contracts/environment-values.js +1 -0
- package/dist/engines/definitions.js +1 -1
- package/dist/engines/environment/handles.js +1 -0
- package/dist/engines/environment/index.js +1 -0
- package/dist/engines/factory.js +1 -1
- package/dist/engines/installations/node-vitest.js +1 -1
- package/dist/engines/installations/package-resolution.js +1 -1
- package/dist/engines/installations/playwright.js +1 -1
- package/dist/engines/managed-module-resolution.js +8 -4
- package/dist/engines/manager.js +1 -1
- package/dist/engines/node-vitest/adapter/adapter.js +1 -1
- package/dist/engines/node-vitest/adapter/driver.js +2 -0
- package/dist/engines/node-vitest/adapter/evidence.js +2 -2
- package/dist/engines/node-vitest/adapter/failure-details.js +4 -2
- package/dist/engines/node-vitest/adapter/reporter.js +1 -1
- package/dist/engines/node-vitest/adapter/workspace.js +17 -195
- package/dist/engines/node-vitest/inventory/index.js +2 -0
- package/dist/engines/node-vitest/inventory/list-files.js +3 -0
- package/dist/engines/node-vitest/runtime/data/index.js +1 -1
- package/dist/engines/node-vitest/runtime/data/report.js +5 -6
- package/dist/engines/node-vitest/runtime/data/scenario.js +2 -2
- package/dist/engines/node-vitest/runtime/runtime-input.js +1 -1
- package/dist/engines/node-vitest/selection.js +1 -0
- package/dist/engines/playwright/adapter/adapter.js +1 -1
- package/dist/engines/playwright/adapter/config.js +3 -3
- package/dist/engines/playwright/adapter/evidence-validation.js +1 -1
- package/dist/engines/playwright/adapter/evidence.js +1 -1
- package/dist/engines/playwright/adapter/reporter.js +1 -1
- package/dist/engines/playwright/runtime/config-file.js +1 -1
- package/dist/engines/playwright/runtime/config.js +1 -1
- package/dist/engines/playwright/runtime/managed-test.js +1 -0
- package/dist/engines/playwright/runtime/runtime-input.js +29 -10
- package/dist/engines/runtime-input-file.js +1 -1
- package/dist/environment/lifecycle-controller.js +1 -1
- package/dist/environment/lifecycle.js +1 -1
- package/dist/environment/ready-environment.js +1 -1
- package/dist/environment/run-environment.js +1 -1
- package/dist/environment/run-stopping.js +1 -1
- package/dist/environment/runtime-contexts.js +1 -1
- package/dist/environment/runtime-manager.js +1 -1
- package/dist/environment/runtime-planning.js +1 -1
- package/dist/environment/runtime-preparation.js +1 -1
- package/dist/environment/services.js +3 -3
- package/dist/environment/template.js +1 -1
- package/dist/evidence/artifact-config.js +1 -1
- package/dist/evidence/artifacts.js +2 -2
- package/dist/evidence/bundles.js +1 -1
- package/dist/evidence/environment-record.js +1 -1
- package/dist/evidence/index.js +1 -1
- package/dist/evidence/maintenance.js +1 -0
- package/dist/evidence/read-run.js +1 -1
- package/dist/evidence/reading.js +1 -1
- package/dist/evidence/redaction.js +4 -0
- package/dist/evidence/reporting.js +1 -1
- package/dist/evidence/run-model.js +1 -0
- package/dist/evidence/storage.js +2 -2
- package/dist/evidence/timing.js +1 -1
- package/dist/kernel/error-serialization.js +1 -1
- package/dist/kernel/known-keys.js +1 -0
- package/dist/kernel/redaction-targets.js +1 -0
- package/dist/kernel/redaction.js +4 -1
- package/dist/kernel/unknown-values.js +1 -1
- package/dist/process/environment.js +1 -1
- package/dist/process/execa-bundle.json +3 -3
- package/dist/process/files/json-file.js +1 -1
- package/dist/process/host/platform.js +1 -1
- package/dist/process/host-process.js +1 -1
- package/dist/process/index.js +1 -1
- package/dist/process/locks.js +4 -4
- package/dist/process/port-listener.js +2 -0
- package/dist/process/process-group.js +1 -1
- package/dist/process/process.js +32 -32
- package/dist/process/readiness.js +1 -1
- package/dist/process/ready-deadline.js +1 -0
- package/dist/process/runs/ownership.js +1 -1
- package/dist/process/runs/stop.js +1 -1
- package/dist/process/service-processes.js +1 -1
- package/dist/process/windows-cli-owner.js +3 -3
- package/dist/process/windows-native.js +1 -1
- package/dist/repo/fingerprint-policy.js +1 -1
- package/dist/repo/managed-git.js +1 -1
- package/dist/repo/physical-tree.js +1 -1
- package/dist/repo/state.js +4 -4
- package/dist/steps/build-config.js +1 -1
- package/dist/steps/configured-step-testkit-modules.js +1 -1
- package/dist/steps/configured-steps.js +1 -1
- package/dist/steps/environment.js +1 -1
- package/dist/steps/index.js +1 -1
- package/dist/toolchains/index.js +3 -3
- package/dist/toolchains/semver.js +1 -1
- package/dist/toolchains/vitest/index.js +1 -1
- package/dist/tracker/redaction.js +1 -2
- package/dist/{config/runtime/build-assets.d.ts → types/config-build-assets.d.ts} +5 -3
- package/dist/{database/steps.d.ts → types/config-database-steps.d.ts} +7 -7
- package/dist/{config/runtime/next-runtime-tsconfig.d.ts → types/config-next-runtime-tsconfig.d.ts} +5 -3
- package/dist/types/config.d.ts +422 -0
- package/dist/types/drizzle.d.ts +13 -0
- package/dist/{config/runtime/env/index.d.ts → types/env.d.ts} +22 -20
- package/dist/types/environment.d.ts +46 -0
- package/dist/types/index.d.ts +21 -0
- package/dist/types/node-vitest-data.d.ts +191 -0
- package/dist/types/playwright.d.ts +130 -0
- package/dist/types/tooling-vitest.d.ts +13 -0
- package/dist/types/workspace.d.ts +633 -0
- package/docs/bug-records.md +35 -40
- package/docs/engines.md +259 -0
- package/docs/release-notes.md +2116 -0
- package/docs/test-types.md +37 -85
- package/package.json +22 -32
- package/testkit-config-schema.md +391 -260
- package/dist/app/bugs/areas.d.ts +0 -38
- package/dist/app/bugs/assessment.d.ts +0 -9
- package/dist/app/bugs/categories.d.ts +0 -41
- package/dist/app/bugs/ci-report.d.ts +0 -21
- package/dist/app/bugs/ci-summary.d.ts +0 -13
- package/dist/app/bugs/draft.d.ts +0 -70
- package/dist/app/bugs/facts.d.ts +0 -49
- package/dist/app/bugs/file.d.ts +0 -45
- package/dist/app/bugs/gate.d.ts +0 -22
- package/dist/app/bugs/guide.d.ts +0 -20
- package/dist/app/bugs/issue.d.ts +0 -18
- package/dist/app/bugs/known-failures.d.ts +0 -49
- package/dist/app/bugs/record.d.ts +0 -14
- package/dist/app/bugs/run-reading.d.ts +0 -51
- package/dist/app/bugs/store.d.ts +0 -34
- package/dist/app/campaigns/brief.d.ts +0 -7
- package/dist/app/campaigns/campaign.d.ts +0 -14
- package/dist/app/campaigns/index.d.ts +0 -38
- package/dist/app/campaigns/store.d.ts +0 -5
- package/dist/app/campaigns/summary.d.ts +0 -13
- package/dist/app/cleanup/index.d.ts +0 -52
- package/dist/app/db-schema/prepare.d.ts +0 -11
- package/dist/app/db-schema/refresh.d.ts +0 -17
- package/dist/app/db-schema/verify.d.ts +0 -11
- package/dist/app/destroy/index.d.ts +0 -16
- package/dist/app/discover/index.d.ts +0 -8
- package/dist/app/doctor/index.d.ts +0 -17
- package/dist/app/environments/config-driven.d.ts +0 -5
- package/dist/app/environments/routing.d.ts +0 -6
- package/dist/app/environments/supplied.d.ts +0 -3
- package/dist/app/file-selection.d.ts +0 -1
- package/dist/app/inspect/artifacts.d.ts +0 -30
- package/dist/app/inspect/index.d.ts +0 -112
- package/dist/app/lint/index.d.ts +0 -28
- package/dist/app/lint/native.d.ts +0 -10
- package/dist/app/lint/options.d.ts +0 -66
- package/dist/app/lint/policy.d.ts +0 -21
- package/dist/app/lint/rules/data.d.ts +0 -3
- package/dist/app/lint/rules/data.js +0 -1
- package/dist/app/lint/rules/engine-imports.d.ts +0 -3
- package/dist/app/lint/rules/syntax.d.ts +0 -4
- package/dist/app/lint/rules/unit.d.ts +0 -3
- package/dist/app/lint/shared.d.ts +0 -34
- package/dist/app/package-inspection.d.ts +0 -20
- package/dist/app/reports/files.d.ts +0 -13
- package/dist/app/reports/prepare.d.ts +0 -20
- package/dist/app/reports/publish.d.ts +0 -21
- package/dist/app/run/endpoint-readiness.d.ts +0 -43
- package/dist/app/run/endpoint-readiness.js +0 -1
- package/dist/app/run/engine-evidence-persistence.d.ts +0 -39
- package/dist/app/run/engine-execution-cleanup.d.ts +0 -8
- package/dist/app/run/engine-execution-cleanup.js +0 -1
- package/dist/app/run/engine-execution-failures.d.ts +0 -41
- package/dist/app/run/engine-execution-observer.d.ts +0 -21
- package/dist/app/run/engine-execution-reporting.d.ts +0 -17
- package/dist/app/run/engine-execution.d.ts +0 -65
- package/dist/app/run/engine-failure-stack.d.ts +0 -1
- package/dist/app/run/engine-orchestration.d.ts +0 -30
- package/dist/app/run/environment.d.ts +0 -33
- package/dist/app/run/failure-details.d.ts +0 -37
- package/dist/app/run/live-run.d.ts +0 -29
- package/dist/app/run/operation-progress.d.ts +0 -13
- package/dist/app/run/orchestrator.d.ts +0 -75
- package/dist/app/run/planning-types.d.ts +0 -68
- package/dist/app/run/planning.d.ts +0 -14
- package/dist/app/run/request.d.ts +0 -30
- package/dist/app/run/results.d.ts +0 -161
- package/dist/app/run/run-events.d.ts +0 -144
- package/dist/app/run/run-finalization.d.ts +0 -56
- package/dist/app/run/run-guards.d.ts +0 -3
- package/dist/app/run/runtime-failures.d.ts +0 -18
- package/dist/app/run/runtime-fixtures.d.ts +0 -2
- package/dist/app/run/runtime-task-types.d.ts +0 -20
- package/dist/app/run/scheduler/estimates.d.ts +0 -32
- package/dist/app/run/scheduler/identity.d.ts +0 -9
- package/dist/app/run/scheduler/index.d.ts +0 -124
- package/dist/app/run/scheduler/locks.d.ts +0 -6
- package/dist/app/run/scheduler/observations.d.ts +0 -20
- package/dist/app/run/selection.d.ts +0 -9
- package/dist/app/run/setup/runtime-node-setup-errors.d.ts +0 -13
- package/dist/app/run/setup/runtime-node-setup-protocol.d.ts +0 -85
- package/dist/app/run/setup/runtime-node-setup-worker.d.ts +0 -1
- package/dist/app/run/setup/runtime-node-setup.d.ts +0 -48
- package/dist/app/run/task-batches.d.ts +0 -23
- package/dist/app/run/task-leases.d.ts +0 -15
- package/dist/app/run/worker-loop.d.ts +0 -66
- package/dist/app/setup/playwright.d.ts +0 -22
- package/dist/app/status/index.d.ts +0 -9
- package/dist/app/status/model.d.ts +0 -29
- package/dist/app/status/runs.d.ts +0 -99
- package/dist/app/stop/index.d.ts +0 -14
- package/dist/app/tracker/index.d.ts +0 -13
- package/dist/app/tracker/remote.d.ts +0 -13
- package/dist/app/tracker/token.d.ts +0 -7
- package/dist/app/typecheck/index.d.ts +0 -63
- package/dist/cli/command-catalog.d.ts +0 -156
- package/dist/cli/command-flags.d.ts +0 -19
- package/dist/cli/command-registry.d.ts +0 -3
- package/dist/cli/commands/artifacts.d.ts +0 -48
- package/dist/cli/commands/bug/file.d.ts +0 -16
- package/dist/cli/commands/bug/guide.d.ts +0 -5
- package/dist/cli/commands/bug/record.d.ts +0 -9
- package/dist/cli/commands/campaign/finish.d.ts +0 -10
- package/dist/cli/commands/campaign/start.d.ts +0 -7
- package/dist/cli/commands/campaign/status.d.ts +0 -13
- package/dist/cli/commands/ci/report.d.ts +0 -15
- package/dist/cli/commands/cleanup.d.ts +0 -13
- package/dist/cli/commands/db/schema/refresh.d.ts +0 -2
- package/dist/cli/commands/db/schema/verify.d.ts +0 -2
- package/dist/cli/commands/destroy.d.ts +0 -9
- package/dist/cli/commands/discover.d.ts +0 -2
- package/dist/cli/commands/doctor.d.ts +0 -2
- package/dist/cli/commands/guard/unsafe-entrypoint.d.ts +0 -2
- package/dist/cli/commands/lint.d.ts +0 -2
- package/dist/cli/commands/report/prepare.d.ts +0 -12
- package/dist/cli/commands/report/publish.d.ts +0 -13
- package/dist/cli/commands/run/status.d.ts +0 -5
- package/dist/cli/commands/run/stop.d.ts +0 -7
- package/dist/cli/commands/run.d.ts +0 -9
- package/dist/cli/commands/setup/playwright.d.ts +0 -2
- package/dist/cli/commands/status.d.ts +0 -5
- package/dist/cli/commands/stop.d.ts +0 -12
- package/dist/cli/commands/typecheck.d.ts +0 -2
- package/dist/cli/commands/workspace.d.ts +0 -2
- package/dist/cli/entrypoint.d.ts +0 -1
- package/dist/cli/framework/command.d.ts +0 -21
- package/dist/cli/framework/definitions.d.ts +0 -100
- package/dist/cli/framework/errors.d.ts +0 -6
- package/dist/cli/framework/execute.d.ts +0 -14
- package/dist/cli/framework/help.d.ts +0 -11
- package/dist/cli/framework/index.d.ts +0 -3
- package/dist/cli/framework/parser.d.ts +0 -6
- package/dist/cli/index.d.ts +0 -4
- package/dist/cli/json-errors.d.ts +0 -3
- package/dist/cli/operations/db/schema/refresh/operation.d.ts +0 -7
- package/dist/cli/operations/db/schema/verify/operation.d.ts +0 -7
- package/dist/cli/operations/run/operation.d.ts +0 -26
- package/dist/cli/process-signal.d.ts +0 -1
- package/dist/cli/renderers/bug/text.d.ts +0 -8
- package/dist/cli/renderers/campaign/text.d.ts +0 -2
- package/dist/cli/renderers/ci/text.d.ts +0 -2
- package/dist/cli/renderers/cleanup/format.d.ts +0 -14
- package/dist/cli/renderers/db-schema/text.d.ts +0 -4
- package/dist/cli/renderers/destroy/text.d.ts +0 -4
- package/dist/cli/renderers/discover/report.d.ts +0 -7
- package/dist/cli/renderers/discover/text.d.ts +0 -3
- package/dist/cli/renderers/doctor/text.d.ts +0 -2
- package/dist/cli/renderers/lint/text.d.ts +0 -2
- package/dist/cli/renderers/run/events.d.ts +0 -8
- package/dist/cli/renderers/run/failure.d.ts +0 -8
- package/dist/cli/renderers/run/formatting.d.ts +0 -79
- package/dist/cli/renderers/run/status.d.ts +0 -6
- package/dist/cli/renderers/run/text-reporter.d.ts +0 -19
- package/dist/cli/renderers/status/text.d.ts +0 -2
- package/dist/cli/renderers/stop/text.d.ts +0 -7
- package/dist/cli/renderers/typecheck/text.d.ts +0 -2
- package/dist/cli/terminal/colors.d.ts +0 -10
- package/dist/cli/terminal/layout.d.ts +0 -11
- package/dist/cli/version-drift.d.ts +0 -25
- package/dist/config/authoring/build-config-contract.d.ts +0 -27
- package/dist/config/authoring/configured-step-contract.d.ts +0 -18
- package/dist/config/authoring/http-execution-contract.d.ts +0 -70
- package/dist/config/authoring/http-methods.d.ts +0 -18
- package/dist/config/authoring/index.d.ts +0 -372
- package/dist/config/authoring/preset-env.d.ts +0 -19
- package/dist/config/authoring/runtime.d.ts +0 -64
- package/dist/config/authoring/runtime.js +0 -1
- package/dist/config/loader/bugs.d.ts +0 -15
- package/dist/config/loader/config-loader.d.ts +0 -9
- package/dist/config/loader/database-materialization.d.ts +0 -19
- package/dist/config/loader/database-roles.d.ts +0 -2
- package/dist/config/loader/database.d.ts +0 -55
- package/dist/config/loader/decode-discovery.d.ts +0 -5
- package/dist/config/loader/decode-execution.d.ts +0 -7
- package/dist/config/loader/dependencies.d.ts +0 -7
- package/dist/config/loader/discover-tests.d.ts +0 -111
- package/dist/config/loader/discovery-summary.d.ts +0 -29
- package/dist/config/loader/discovery.d.ts +0 -53
- package/dist/config/loader/env.d.ts +0 -4
- package/dist/config/loader/execution-model.d.ts +0 -15
- package/dist/config/loader/file-metadata.d.ts +0 -19
- package/dist/config/loader/groups.d.ts +0 -33
- package/dist/config/loader/index.d.ts +0 -10
- package/dist/config/loader/load.d.ts +0 -89
- package/dist/config/loader/managed-configs.d.ts +0 -23
- package/dist/config/loader/path-policy.d.ts +0 -9
- package/dist/config/loader/paths.d.ts +0 -5
- package/dist/config/loader/runtime-isolation.d.ts +0 -44
- package/dist/config/loader/runtime.d.ts +0 -16
- package/dist/config/loader/skip-config.d.ts +0 -44
- package/dist/config/loader/test-selection.d.ts +0 -15
- package/dist/config/loader/validation.d.ts +0 -15
- package/dist/config/loader/values.d.ts +0 -3
- package/dist/config/loader/values.js +0 -1
- package/dist/database/activity-gate.d.ts +0 -22
- package/dist/database/admin.d.ts +0 -31
- package/dist/database/cleanup.d.ts +0 -36
- package/dist/database/configured-steps.d.ts +0 -27
- package/dist/database/constants.d.ts +0 -11
- package/dist/database/docker-metadata.d.ts +0 -3
- package/dist/database/docker.d.ts +0 -65
- package/dist/database/drizzle/index.d.ts +0 -13
- package/dist/database/fingerprint.d.ts +0 -12
- package/dist/database/index.d.ts +0 -39
- package/dist/database/lifecycle-cleanup.d.ts +0 -8
- package/dist/database/local-postgres.d.ts +0 -71
- package/dist/database/naming.d.ts +0 -17
- package/dist/database/postgres/index.d.ts +0 -71
- package/dist/database/progress.d.ts +0 -6
- package/dist/database/roles.d.ts +0 -19
- package/dist/database/runtime-config.d.ts +0 -16
- package/dist/database/runtime-reservations.d.ts +0 -19
- package/dist/database/schema-operations.d.ts +0 -18
- package/dist/database/schema-source.d.ts +0 -96
- package/dist/database/source-refresh-lock.d.ts +0 -8
- package/dist/database/source-url.d.ts +0 -21
- package/dist/database/state-files.d.ts +0 -13
- package/dist/database/state.d.ts +0 -26
- package/dist/database/template-steps.d.ts +0 -39
- package/dist/domain/file-timeout.d.ts +0 -25
- package/dist/domain/identifiers.d.ts +0 -9
- package/dist/domain/operation-display.d.ts +0 -10
- package/dist/domain/operation-reason.d.ts +0 -5
- package/dist/domain/postgres-route.d.ts +0 -4
- package/dist/domain/runtime-identity.d.ts +0 -1
- package/dist/domain/runtime-isolation-contract.d.ts +0 -5
- package/dist/domain/service-name.d.ts +0 -2
- package/dist/domain/suite-selection.d.ts +0 -20
- package/dist/domain/test-outcomes.d.ts +0 -2
- package/dist/domain/test-types.d.ts +0 -16
- package/dist/engines/adapters/evidence-files.d.ts +0 -32
- package/dist/engines/adapters/evidence-identity.d.ts +0 -12
- package/dist/engines/adapters/execution.d.ts +0 -41
- package/dist/engines/adapters/native-report.d.ts +0 -25
- package/dist/engines/adapters/node-startup-cache.d.ts +0 -8
- package/dist/engines/adapters/workspace.d.ts +0 -4
- package/dist/engines/api/capabilities.d.ts +0 -21
- package/dist/engines/api/capabilities.js +0 -1
- package/dist/engines/api/evidence.d.ts +0 -38
- package/dist/engines/api/execution-observer.d.ts +0 -8
- package/dist/engines/api/execution-scope.d.ts +0 -17
- package/dist/engines/api/execution.d.ts +0 -101
- package/dist/engines/api/index.d.ts +0 -5
- package/dist/engines/api/k6-runtime-input.d.ts +0 -26
- package/dist/engines/api/k6-runtime-input.js +0 -1
- package/dist/engines/api/runtime-artifact.d.ts +0 -19
- package/dist/engines/bundle-cache.d.ts +0 -32
- package/dist/engines/catalog.d.ts +0 -27
- package/dist/engines/contracts/fixture-manifest.d.ts +0 -34
- package/dist/engines/contracts/json-bounds.d.ts +0 -36
- package/dist/engines/contracts/json-bounds.js +0 -2
- package/dist/engines/contracts/k6-repository-configuration.d.ts +0 -12
- package/dist/engines/contracts/k6-repository-configuration.js +0 -1
- package/dist/engines/contracts/test-context.d.ts +0 -15
- package/dist/engines/contracts/test-context.js +0 -1
- package/dist/engines/definitions.d.ts +0 -23
- package/dist/engines/factory.d.ts +0 -6
- package/dist/engines/generated-performance.d.ts +0 -1
- package/dist/engines/installation-catalog.d.ts +0 -27
- package/dist/engines/installation-catalog.js +0 -1
- package/dist/engines/installations/k6.d.ts +0 -98
- package/dist/engines/installations/k6.js +0 -1
- package/dist/engines/installations/node-vitest.d.ts +0 -33
- package/dist/engines/installations/package-requirements.d.ts +0 -28
- package/dist/engines/installations/package-resolution.d.ts +0 -51
- package/dist/engines/installations/playwright-resolution-child.d.ts +0 -1
- package/dist/engines/installations/playwright.d.ts +0 -75
- package/dist/engines/installations/types.d.ts +0 -10
- package/dist/engines/k6/adapter/bundle.d.ts +0 -25
- package/dist/engines/k6/adapter/bundle.js +0 -112
- package/dist/engines/k6/adapter/evidence.d.ts +0 -15
- package/dist/engines/k6/adapter/evidence.js +0 -4
- package/dist/engines/k6/adapter/executor.d.ts +0 -13
- package/dist/engines/k6/adapter/executor.js +0 -1
- package/dist/engines/k6/adapter/index.d.ts +0 -1
- package/dist/engines/k6/adapter/index.js +0 -1
- package/dist/engines/k6/adapter/input.d.ts +0 -21
- package/dist/engines/k6/adapter/input.js +0 -1
- package/dist/engines/k6/adapter/native-summary.d.ts +0 -11
- package/dist/engines/k6/adapter/native-summary.js +0 -1
- package/dist/engines/k6/adapter/repository-configuration.d.ts +0 -2
- package/dist/engines/k6/adapter/repository-configuration.js +0 -1
- package/dist/engines/k6/authoring-type-paths.d.ts +0 -3
- package/dist/engines/k6/authoring-type-paths.js +0 -1
- package/dist/engines/k6/runtime/ambient-types/bundle-manifest.json +0 -146
- package/dist/engines/k6/runtime/ambient-types/k6/LICENSE +0 -21
- package/dist/engines/k6/runtime/ambient-types/k6/browser/index.d.ts +0 -6332
- package/dist/engines/k6/runtime/ambient-types/k6/crypto/index.d.ts +0 -218
- package/dist/engines/k6/runtime/ambient-types/k6/data/index.d.ts +0 -16
- package/dist/engines/k6/runtime/ambient-types/k6/encoding/index.d.ts +0 -46
- package/dist/engines/k6/runtime/ambient-types/k6/execution/index.d.ts +0 -127
- package/dist/engines/k6/runtime/ambient-types/k6/experimental/csv/index.d.ts +0 -96
- package/dist/engines/k6/runtime/ambient-types/k6/experimental/fs/index.d.ts +0 -104
- package/dist/engines/k6/runtime/ambient-types/k6/experimental/redis/index.d.ts +0 -821
- package/dist/engines/k6/runtime/ambient-types/k6/experimental/streams/index.d.ts +0 -198
- package/dist/engines/k6/runtime/ambient-types/k6/global.d.ts +0 -83
- package/dist/engines/k6/runtime/ambient-types/k6/html/index.d.ts +0 -1325
- package/dist/engines/k6/runtime/ambient-types/k6/http/index.d.ts +0 -806
- package/dist/engines/k6/runtime/ambient-types/k6/index.d.ts +0 -126
- package/dist/engines/k6/runtime/ambient-types/k6/metrics/index.d.ts +0 -66
- package/dist/engines/k6/runtime/ambient-types/k6/net/grpc/index.d.ts +0 -247
- package/dist/engines/k6/runtime/ambient-types/k6/options/index.d.ts +0 -459
- package/dist/engines/k6/runtime/ambient-types/k6/package.json +0 -79
- package/dist/engines/k6/runtime/ambient-types/k6/secrets/index.d.ts +0 -36
- package/dist/engines/k6/runtime/ambient-types/k6/timers/index.d.ts +0 -47
- package/dist/engines/k6/runtime/ambient-types/k6/websockets/index.d.ts +0 -324
- package/dist/engines/k6/runtime/ambient-types/k6/ws/index.d.ts +0 -283
- package/dist/engines/k6/runtime/ambient-types/xk6-sql/LICENSE +0 -201
- package/dist/engines/k6/runtime/ambient-types/xk6-sql/index.d.ts +0 -397
- package/dist/engines/k6/runtime/ambient-types/xk6-sql/package.json +0 -15
- package/dist/engines/k6/runtime/artifacts.d.ts +0 -2
- package/dist/engines/k6/runtime/artifacts.js +0 -1
- package/dist/engines/k6/runtime/checks.d.ts +0 -17
- package/dist/engines/k6/runtime/checks.js +0 -1
- package/dist/engines/k6/runtime/dal-fixtures.d.ts +0 -24
- package/dist/engines/k6/runtime/dal-fixtures.js +0 -1
- package/dist/engines/k6/runtime/dal-suite.d.ts +0 -24
- package/dist/engines/k6/runtime/dal-suite.js +0 -1
- package/dist/engines/k6/runtime/dal.d.ts +0 -10
- package/dist/engines/k6/runtime/dal.js +0 -1
- package/dist/engines/k6/runtime/fixtures.d.ts +0 -3
- package/dist/engines/k6/runtime/fixtures.js +0 -1
- package/dist/engines/k6/runtime/http-assertions.d.ts +0 -19
- package/dist/engines/k6/runtime/http-assertions.js +0 -1
- package/dist/engines/k6/runtime/http-checks.d.ts +0 -19
- package/dist/engines/k6/runtime/http-checks.js +0 -1
- package/dist/engines/k6/runtime/http-suite-runtime.d.ts +0 -103
- package/dist/engines/k6/runtime/http-suite-runtime.js +0 -1
- package/dist/engines/k6/runtime/http.d.ts +0 -15
- package/dist/engines/k6/runtime/http.js +0 -1
- package/dist/engines/k6/runtime/index.d.ts +0 -11
- package/dist/engines/k6/runtime/index.js +0 -1
- package/dist/engines/k6/runtime/input.d.ts +0 -3
- package/dist/engines/k6/runtime/input.js +0 -1
- package/dist/engines/k6/runtime/k6-repository-configuration.d.ts +0 -9
- package/dist/engines/k6/runtime/k6-repository-configuration.js +0 -1
- package/dist/engines/k6/runtime/node-setup.d.ts +0 -13
- package/dist/engines/k6/runtime/node-setup.js +0 -1
- package/dist/engines/k6/runtime/runtime-globals.d.ts +0 -10
- package/dist/engines/k6/runtime/runtime.d.ts +0 -54
- package/dist/engines/k6/runtime/runtime.js +0 -1
- package/dist/engines/k6/runtime/shared/assertion-details.d.ts +0 -19
- package/dist/engines/k6/runtime/shared/assertion-details.js +0 -2
- package/dist/engines/k6/runtime/shared/db-normalization.d.ts +0 -19
- package/dist/engines/k6/runtime/shared/db-normalization.js +0 -1
- package/dist/engines/k6/runtime/shared/error-body.d.ts +0 -3
- package/dist/engines/k6/runtime/shared/error-body.js +0 -1
- package/dist/engines/k6/runtime/shared/file-data.d.ts +0 -1
- package/dist/engines/k6/runtime/shared/file-data.js +0 -1
- package/dist/engines/k6/runtime/shared/fixture-engine.d.ts +0 -8
- package/dist/engines/k6/runtime/shared/fixture-engine.js +0 -2
- package/dist/engines/k6/runtime/shared/http-check-plan.d.ts +0 -29
- package/dist/engines/k6/runtime/shared/http-check-plan.js +0 -1
- package/dist/engines/k6/runtime/shared/http-parsing.d.ts +0 -10
- package/dist/engines/k6/runtime/shared/http-parsing.js +0 -3
- package/dist/engines/k6/runtime/shared/ordering.d.ts +0 -2
- package/dist/engines/k6/runtime/shared/ordering.js +0 -1
- package/dist/engines/k6/runtime/shared/properties.d.ts +0 -1
- package/dist/engines/k6/runtime/shared/properties.js +0 -1
- package/dist/engines/k6/runtime/suite.d.ts +0 -4
- package/dist/engines/k6/runtime/suite.js +0 -1
- package/dist/engines/k6/runtime/types.d.ts +0 -244
- package/dist/engines/k6/runtime/types.js +0 -1
- package/dist/engines/k6/runtime/xk6-sql-driver-postgres.d.ts +0 -7
- package/dist/engines/k6/runtime/xk6-sql-driver-postgres.js +0 -1
- package/dist/engines/managed-module-resolution-policy-input.d.ts +0 -8
- package/dist/engines/managed-module-resolution-policy.d.ts +0 -25
- package/dist/engines/managed-module-resolution.d.ts +0 -13
- package/dist/engines/manager.d.ts +0 -25
- package/dist/engines/node-vitest/adapter/adapter.d.ts +0 -16
- package/dist/engines/node-vitest/adapter/consumer-typescript-paths.d.ts +0 -17
- package/dist/engines/node-vitest/adapter/consumer-typescript-paths.js +0 -3
- package/dist/engines/node-vitest/adapter/evidence.d.ts +0 -33
- package/dist/engines/node-vitest/adapter/failure-details.d.ts +0 -3
- package/dist/engines/node-vitest/adapter/index.d.ts +0 -1
- package/dist/engines/node-vitest/adapter/reporter.d.ts +0 -7
- package/dist/engines/node-vitest/adapter/resolution.d.ts +0 -12
- package/dist/engines/node-vitest/adapter/resolution.js +0 -1
- package/dist/engines/node-vitest/adapter/workspace.d.ts +0 -19
- package/dist/engines/node-vitest/runtime/contract/index.d.ts +0 -64
- package/dist/engines/node-vitest/runtime/contract/index.js +0 -1
- package/dist/engines/node-vitest/runtime/data/http.d.ts +0 -4
- package/dist/engines/node-vitest/runtime/data/http.js +0 -1
- package/dist/engines/node-vitest/runtime/data/index.d.ts +0 -8
- package/dist/engines/node-vitest/runtime/data/primitives.d.ts +0 -1
- package/dist/engines/node-vitest/runtime/data/report.d.ts +0 -3
- package/dist/engines/node-vitest/runtime/data/runner.d.ts +0 -4
- package/dist/engines/node-vitest/runtime/data/runner.js +0 -1
- package/dist/engines/node-vitest/runtime/data/scenario.d.ts +0 -11
- package/dist/engines/node-vitest/runtime/data/types.d.ts +0 -384
- package/dist/engines/node-vitest/runtime/runtime-input.d.ts +0 -64
- package/dist/engines/playwright/adapter/adapter.d.ts +0 -18
- package/dist/engines/playwright/adapter/attachments.d.ts +0 -26
- package/dist/engines/playwright/adapter/config.d.ts +0 -45
- package/dist/engines/playwright/adapter/evidence-validation.d.ts +0 -9
- package/dist/engines/playwright/adapter/evidence.d.ts +0 -32
- package/dist/engines/playwright/adapter/failure-details.d.ts +0 -2
- package/dist/engines/playwright/adapter/index.d.ts +0 -3
- package/dist/engines/playwright/adapter/reporter.d.ts +0 -12
- package/dist/engines/playwright/runtime/config-file.d.ts +0 -2
- package/dist/engines/playwright/runtime/config.d.ts +0 -24
- package/dist/engines/playwright/runtime/index.d.ts +0 -4
- package/dist/engines/playwright/runtime/runtime-input.d.ts +0 -36
- package/dist/engines/playwright/runtime/sandbox.d.ts +0 -84
- package/dist/engines/runtime-input-file.d.ts +0 -27
- package/dist/environment/lifecycle-artifacts.d.ts +0 -7
- package/dist/environment/lifecycle-controller.d.ts +0 -60
- package/dist/environment/lifecycle.d.ts +0 -32
- package/dist/environment/maintenance.d.ts +0 -68
- package/dist/environment/planning-types.d.ts +0 -33
- package/dist/environment/ports.d.ts +0 -10
- package/dist/environment/ready-environment.d.ts +0 -16
- package/dist/environment/run-environment.d.ts +0 -39
- package/dist/environment/run-stopping.d.ts +0 -13
- package/dist/environment/runtime-contexts.d.ts +0 -37
- package/dist/environment/runtime-manager.d.ts +0 -87
- package/dist/environment/runtime-planning.d.ts +0 -16
- package/dist/environment/runtime-preparation.d.ts +0 -30
- package/dist/environment/runtime-service.d.ts +0 -12
- package/dist/environment/services.d.ts +0 -56
- package/dist/environment/state.d.ts +0 -15
- package/dist/environment/status-runtime.d.ts +0 -53
- package/dist/environment/template.d.ts +0 -164
- package/dist/evidence/artifact-config.d.ts +0 -14
- package/dist/evidence/artifact-validation.d.ts +0 -4
- package/dist/evidence/artifacts.d.ts +0 -75
- package/dist/evidence/bundles.d.ts +0 -27
- package/dist/evidence/ci-provenance.d.ts +0 -9
- package/dist/evidence/contracts.d.ts +0 -154
- package/dist/evidence/environment-record.d.ts +0 -22
- package/dist/evidence/file-evidence.d.ts +0 -23
- package/dist/evidence/finalization.d.ts +0 -9
- package/dist/evidence/index.d.ts +0 -8
- package/dist/evidence/logs.d.ts +0 -31
- package/dist/evidence/operation-timings.d.ts +0 -60
- package/dist/evidence/read-bundle.d.ts +0 -4
- package/dist/evidence/read-fields.d.ts +0 -21
- package/dist/evidence/read-provenance.d.ts +0 -2
- package/dist/evidence/read-redaction.d.ts +0 -2
- package/dist/evidence/read-retention.d.ts +0 -2
- package/dist/evidence/read-run.d.ts +0 -2
- package/dist/evidence/reading.d.ts +0 -28
- package/dist/evidence/reporting-types.d.ts +0 -349
- package/dist/evidence/reporting.d.ts +0 -3
- package/dist/evidence/secure-file-copy.d.ts +0 -24
- package/dist/evidence/setup-progress.d.ts +0 -63
- package/dist/evidence/step-output.d.ts +0 -16
- package/dist/evidence/storage-inventory.d.ts +0 -27
- package/dist/evidence/storage.d.ts +0 -25
- package/dist/evidence/timing.d.ts +0 -23
- package/dist/file.d.ts +0 -11
- package/dist/index.d.ts +0 -4
- package/dist/kernel/error-serialization.d.ts +0 -40
- package/dist/kernel/redaction.d.ts +0 -2
- package/dist/kernel/unknown-values.d.ts +0 -11
- package/dist/kernel/work-metrics.d.ts +0 -6
- package/dist/process/capture-output.d.ts +0 -7
- package/dist/process/command-shell.d.ts +0 -1
- package/dist/process/environment-overlay.d.ts +0 -17
- package/dist/process/environment.d.ts +0 -33
- package/dist/process/files/contained-path.d.ts +0 -8
- package/dist/process/files/directory-status.d.ts +0 -14
- package/dist/process/files/dotenv.d.ts +0 -2
- package/dist/process/files/file-snapshot.d.ts +0 -34
- package/dist/process/files/json-file.d.ts +0 -11
- package/dist/process/files/paths.d.ts +0 -3
- package/dist/process/files/product-dir.d.ts +0 -1
- package/dist/process/files/temp-dir.d.ts +0 -11
- package/dist/process/host/metadata.d.ts +0 -6
- package/dist/process/host/platform.d.ts +0 -57
- package/dist/process/host-command.d.ts +0 -4
- package/dist/process/host-inspection-command.d.ts +0 -13
- package/dist/process/host-process.d.ts +0 -19
- package/dist/process/index.d.ts +0 -9
- package/dist/process/lifecycle-fence.d.ts +0 -10
- package/dist/process/locks.d.ts +0 -28
- package/dist/process/process-contracts.d.ts +0 -78
- package/dist/process/process-group.d.ts +0 -12
- package/dist/process/process-identity.d.ts +0 -27
- package/dist/process/process-limits.d.ts +0 -6
- package/dist/process/process.d.ts +0 -12
- package/dist/process/readiness.d.ts +0 -43
- package/dist/process/recovery.d.ts +0 -3
- package/dist/process/runs/inspection.d.ts +0 -5
- package/dist/process/runs/manifest.d.ts +0 -86
- package/dist/process/runs/ownership.d.ts +0 -11
- package/dist/process/runs/product-state.d.ts +0 -2
- package/dist/process/runs/schema.d.ts +0 -3
- package/dist/process/runs/stop.d.ts +0 -19
- package/dist/process/runtime-socket.d.ts +0 -4
- package/dist/process/service-processes.d.ts +0 -13
- package/dist/process/shutdown.d.ts +0 -10
- package/dist/process/stoppable-settlement.d.ts +0 -26
- package/dist/process/url-redaction.d.ts +0 -1
- package/dist/process/windows-cli-owner.d.ts +0 -2
- package/dist/process/windows-native.d.ts +0 -12
- package/dist/process/windows-process-identity.d.ts +0 -4
- package/dist/repo/ci-environment.d.ts +0 -7
- package/dist/repo/fingerprint-policy.d.ts +0 -13
- package/dist/repo/git-path.d.ts +0 -2
- package/dist/repo/history.d.ts +0 -17
- package/dist/repo/managed-git.d.ts +0 -10
- package/dist/repo/metadata.d.ts +0 -3
- package/dist/repo/physical-tree.d.ts +0 -37
- package/dist/repo/publish-directory.d.ts +0 -20
- package/dist/repo/remote.d.ts +0 -6
- package/dist/repo/state.d.ts +0 -26
- package/dist/repo/tree-listing.d.ts +0 -10
- package/dist/steps/build-config.d.ts +0 -34
- package/dist/steps/configured-step-testkit-modules.d.ts +0 -19
- package/dist/steps/configured-steps.d.ts +0 -51
- package/dist/steps/environment.d.ts +0 -82
- package/dist/steps/index.d.ts +0 -2
- package/dist/steps/module-runner.d.ts +0 -1
- package/dist/steps/run.d.ts +0 -36
- package/dist/toolchains/archive.d.ts +0 -53
- package/dist/toolchains/esbuild.d.ts +0 -9
- package/dist/toolchains/host-node-support.d.ts +0 -3
- package/dist/toolchains/index.d.ts +0 -114
- package/dist/toolchains/managed-node-releases.d.ts +0 -28
- package/dist/toolchains/node-cache.d.ts +0 -20
- package/dist/toolchains/node-integrity.d.ts +0 -18
- package/dist/toolchains/node-provisioning.d.ts +0 -29
- package/dist/toolchains/semver.d.ts +0 -13
- package/dist/toolchains/shared-operation.d.ts +0 -11
- package/dist/toolchains/timeouts.d.ts +0 -1
- package/dist/toolchains/vitest/index.d.ts +0 -13
- package/dist/tracker/gitea.d.ts +0 -14
- package/dist/tracker/github.d.ts +0 -14
- package/dist/tracker/http.d.ts +0 -33
- package/dist/tracker/index.d.ts +0 -4
- package/dist/tracker/redaction.d.ts +0 -4
- package/dist/tracker/requests.d.ts +0 -17
- package/dist/tracker/responses.d.ts +0 -24
- package/dist/tracker/types.d.ts +0 -51
- package/docs/engine-architecture.md +0 -682
- /package/dist/engines/{k6/runtime/runtime-globals.js → api/profiles.js} +0 -0
package/dist/app/lint/native.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import m from"node:path";import{posixPath as j}from"../../process/files/paths.js";import{LINT_RULE_NAMES as b}from"./options.js";import{compareFindings as B,findingKey as C,isTypeScriptLikePath as L,matchesAnyPathPattern as p,normalizeFinding as g,SOURCE_IGNORES as M}from"./shared.js";import{createSyntaxPolicy as F}from"./rules/syntax.js";import{createUnitPolicy as R}from"./rules/unit.js";import{createEngineImportPolicy as U}from"./rules/engine-imports.js";export async function lintProject({productDir:n,files:r,trackedFiles:a,options:s}){const T=await q(),[{ESLint:y},h]=T;if(y.version!=="10.7.0"||h.version!=="8.65.0")throw new Error("Testkit lint requires its managed eslint@10.7.0 and @typescript-eslint/parser@8.65.0 installation");const k=new Map,u=b.filter(t=>s.rules[t].enabled),x=Object.fromEntries(u.filter(t=>t!=="testkitBoundary").map(t=>{const e=s.rules[t],i={meta:{type:"problem",schema:[],messages:{violation:"{{message}}"}},defaultOptions:[],create(o){return(()=>{const P=j(m.relative(n,o.filename)),f={context:o,file:P,report:(l,O,S,d)=>{const _=g({file:P,ruleName:t,ruleId:e.ruleId,kind:O,target:S,message:d,line:l.loc.start.line,snippet:o.sourceCode.getText(l).split(/\r?\n/u)[0]});k.set(E(o.filename,l.loc.start.line,l.loc.start.column+1,d),_),o.report({node:l,messageId:"violation",data:{message:d}})},options:s};return t==="engineImports"?U(f):t==="unitTestBoundaries"?R(f):F(t,f,r)})()}};return[e.ruleId,i]})),N=new y({cwd:n,overrideConfigFile:!0,allowInlineConfig:!1,errorOnUnmatchedPattern:!1,globInputPaths:!1,warnIgnored:!1,overrideConfig:[{ignores:M},{files:["**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}"],languageOptions:{parser:h,ecmaVersion:"latest",sourceType:"module"},plugins:{testkit:{rules:x}}},...u.filter(t=>t!=="testkitBoundary").map(t=>{const e=s.rules[t];return{files:e.include.length?e.include:["**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}"],ignores:e.exclude,rules:{[`testkit/${e.ruleId}`]:"error"}}})]}),I=[],v=r.filter(L);if(v.length){const t=v.map(i=>m.join(n,i)),e=await N.lintFiles(t);I.push(...e)}const w=I.flatMap(t=>t.messages.map(e=>{if(e.ruleId===null)return g({file:j(m.relative(n,t.filePath)),line:e.line,ruleName:"syntax",ruleId:"syntax",kind:"parse-error",target:e.message,message:e.message});const i=k.get(E(t.filePath,e.line,e.column,e.message));if(!i)throw new Error(`Missing Testkit finding for ${e.ruleId}: ${e.message}`);return i}));if(u.includes("testkitBoundary")){const t=s.rules.testkitBoundary,e=a&&new Set(a);for(const i of r)t.trackedOnly&&e&&!e.has(i)||!$(i,t)||!i.split("/").some(o=>o.toLowerCase().includes("testkit"))||p(i,t.allowed??[])||w.push(g({file:i,ruleName:"testkitBoundary",ruleId:t.ruleId,kind:"testkit-path",target:i,message:"Tracked Testkit plumbing must live in testkit.config.* or __testkit__/ suites, or move into @gfdelarue/testkit"}))}const c=new Map;for(const t of w.sort(B)){const e=C(t);c.has(e)||c.set(e,t)}return[...c.values()]}function E(n,r,a,s){return[n,r,a,s].join("\0")}function $(n,r){return(!r.include.length||p(n,r.include))&&!p(n,r.exclude)}function q(){return Promise.all([import("eslint"),import("@typescript-eslint/parser")])}
|
package/dist/app/lint/options.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DEFAULT_TESTKIT_BOUNDARY_ALLOWED as
|
|
1
|
+
import{DEFAULT_TESTKIT_BOUNDARY_ALLOWED as u}from"./shared.js";import{posixPath as E}from"../../process/files/paths.js";import{isUnknownRecord as s}from"../../kernel/unknown-values.js";import{migrationText as y}from"../../domain/retired-test-types.js";export const LINT_RULE_NAMES=["engineImports","uiSpecShape","configImports","testkitBoundary","unitTestBoundaries"];const b=new Set(["rules","ui"]),p=new Set(["enabled","exclude","include"]),I=new Set([...p,"allowed","trackedOnly"]),O=new Set(["maxLines","maxTests"]),d="lint levels were removed; set a rule to true or false, or use { enabled: boolean }";export const RULES={engineImports:{ruleId:"engine-imports",defaultEnabled:!0},uiSpecShape:{ruleId:"ui-spec-shape",defaultEnabled:!0},configImports:{ruleId:"config-imports",defaultEnabled:!0},testkitBoundary:{ruleId:"testkit-boundary",defaultEnabled:!1},unitTestBoundaries:{ruleId:"unit-test-boundaries",defaultEnabled:!1}};const T=220,h=8;export function normalizeLintConfig(t={}){const n=s(t)?t.lint??{}:{};return normalizeLintOptions(n)}export function normalizeLintOptions(t={}){if(!s(t))throw new Error("lint config must be an object");if(Object.prototype.hasOwnProperty.call(t,"level"))throw new Error(`lint.level was removed; ${d}`);f(t,b,"lint");const n=t.rules??{};if(!s(n))throw new Error("lint.rules must be an object");for(const o of Object.keys(n)){if(o==="missingImports")throw new Error("lint.rules.missingImports was removed; use testkit typecheck for TypeScript import diagnostics");if(o==="dataSuiteContract")throw new Error(`lint.rules.dataSuiteContract was removed with the data test type in Testkit 0.6.0. ${y("Remove the data test type")}`);if(!Object.prototype.hasOwnProperty.call(RULES,o))throw new Error(`Unknown lint rule "${o}"`)}const e=o=>{const l=RULES[o];return S({ruleName:o,ruleId:l.ruleId,value:n[o],defaultEnabled:l.defaultEnabled})},r={engineImports:e("engineImports"),configImports:e("configImports"),testkitBoundary:e("testkitBoundary"),uiSpecShape:e("uiSpecShape"),unitTestBoundaries:e("unitTestBoundaries")},i=t.ui===void 0?{}:t.ui;if(!s(i))throw new Error("lint.ui must be an object");return f(i,O,"lint.ui"),{rules:r,ui:{maxLines:w(i.maxLines,T,"lint.ui.maxLines"),maxTests:w(i.maxTests,h,"lint.ui.maxTests")}}}function S({ruleName:t,ruleId:n,value:e,defaultEnabled:r}){if(e===void 0)return a({ruleName:t,ruleId:n,enabled:r});if(typeof e=="boolean")return a({ruleName:t,ruleId:n,enabled:e});if(!s(e))throw new Error(`lint.rules.${t} must be true, false, or a rule config object; ${d}`);if(Object.prototype.hasOwnProperty.call(e,"level"))throw new Error(`lint.rules.${t}.level was removed; ${d}`);return f(e,t==="testkitBoundary"?I:p,`lint.rules.${t}`),a({ruleName:t,ruleId:n,enabled:m(e.enabled,`lint.rules.${t}.enabled`)??!0,include:c(e.include,`lint.rules.${t}.include`),exclude:c(e.exclude,`lint.rules.${t}.exclude`),allowed:t==="testkitBoundary"?k(e.allowed):void 0,trackedOnly:t==="testkitBoundary"?m(e.trackedOnly,`lint.rules.${t}.trackedOnly`):void 0})}function a({ruleName:t,ruleId:n,enabled:e,include:r=[],exclude:i=[],allowed:o,trackedOnly:l}){return{ruleName:t,ruleId:n,enabled:e,include:r,exclude:i,...t==="testkitBoundary"?{allowed:o||u}:{},...t==="testkitBoundary"?{trackedOnly:l!==!1}:{}}}function c(t,n){if(t==null)return[];if(!Array.isArray(t))throw new Error(`${n} must be an array`);return t.map((e,r)=>{const i=typeof e=="string"?e.trim():"";if(!i)throw new Error(`${n}[${String(r)}] must be a non-empty string`);return E(i)})}function k(t){if(t==null)return u;const n=c(t,"lint.rules.testkitBoundary.allowed");return n.length>0?n:u}function w(t,n,e){if(t===void 0)return n;if(typeof t!="number"||!Number.isInteger(t)||t<=0)throw new Error(`${e} must be a positive integer`);return t}function m(t,n){if(t!==void 0){if(typeof t!="boolean")throw new Error(`${n} must be a boolean`);return t}}function f(t,n,e){for(const r of Object.keys(t))if(!n.has(r))throw new Error(`Unknown ${e} option "${r}"`)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AST_NODE_TYPES as l}from"@typescript-eslint/types";import{isPublicTestType as g}from"../../../domain/identifiers.js";import{
|
|
1
|
+
import{AST_NODE_TYPES as l}from"@typescript-eslint/types";import{isPublicTestType as g}from"../../../domain/identifiers.js";import{allowsEngineAuthoringImport as E,profilesForTestType as h,expectedEngineAuthoringModule as x,invalidEngineAuthoringImport as y,requireMatchingEngineImport as I}from"../../../engines/catalog.js";import{binding as T,stringValue as a}from"../policy.js";export function createEngineImportPolicy({context:m,file:i,report:u}){const p=/\.([^.]+)\.testkit\.ts$/u.exec(i)?.[1];if(!g(p))return{};const s=h(p),o=s[0];if(s.length!==1)return{};const c={engineId:o.engineId,profileId:o.id},f=x(o.id),r=(e,t)=>{if(t!==null)try{if(I(i,c,t),!E(f,t))throw y(i,c,t)}catch(n){if(!(n instanceof Error))throw n;u(e,"engine-import",t,n.message)}};return{ImportDeclaration(e){e.importKind!=="type"&&(e.specifiers.length===0||e.specifiers.some(t=>t.type!==l.ImportSpecifier||t.importKind!=="type"))&&r(e,e.source.value)},ExportNamedDeclaration(e){e.source&&e.exportKind!=="type"&&e.specifiers.some(t=>t.exportKind!=="type")&&r(e,e.source.value)},ExportAllDeclaration(e){e.exportKind!=="type"&&r(e,e.source.value)},ImportExpression(e){r(e,a(e.source))},CallExpression(e){e.callee.type===l.Identifier&&e.callee.name==="require"&&!T(m,e.callee)?.defs.length&&r(e,a(e.arguments[0]))}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AST_NODE_TYPES as
|
|
1
|
+
import{AST_NODE_TYPES as c}from"@typescript-eslint/types";import{stringValue as m}from"../policy.js";export function createSyntaxPolicy(r,{file:n,context:a,report:l,options:i},u){if(r==="uiSpecShape"&&n.endsWith(".ui.testkit.ts")){let e=0;return{CallExpression(t){t.callee.type===c.Identifier&&t.callee.name==="test"&&m(t.arguments[0])!==null&&(e+=1)},"Program:exit"(t){const s=a.sourceCode.text.split(/\r?\n/u).length;(s>i.ui.maxLines||e>i.ui.maxTests)&&l(t,"shape-limit",`${String(s)}:${String(e)}`,`UI spec exceeds shape limit (${String(s)}/${String(i.ui.maxLines)} lines, ${String(e)}/${String(i.ui.maxTests)} tests)`)}}}return r==="configImports"&&n===u.find(e=>/^testkit\.config\.[cm]?[jt]s$/u.test(e))?{ImportDeclaration(e){const t=e.source.value;(t.startsWith(".")||t.startsWith("/"))&&t.includes("__testkit__")&&l(e,"config-helper-import",t,"testkit.config.ts must not import repo-local __testkit__ helper modules")}}:{}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AST_NODE_TYPES as
|
|
1
|
+
import{AST_NODE_TYPES as n}from"@typescript-eslint/types";import{memberName as m,stringValue as l}from"../policy.js";const u=new Set(["vi.mock","jest.mock","mock.method"]),f=new Set(["vi.fn","vi.spyOn","vi.stubGlobal","vi.useFakeTimers","jest.fn","jest.spyOn","jest.useFakeTimers"]),b=new Set(["sinon","nock","msw","jest-mock"]),h=new Set(["fetch","http.createServer","net.createServer"]),p=new Set(["fs","node:fs","child_process","node:child_process","execa"]),o=r=>`This repository's unitTestBoundaries rule forbids ${r}`;export function createUnitPolicy({file:r,report:s}){if(!/\.(test|spec)\.[cm]?[jt]sx?$/u.test(r)||r.split("/").includes("__testkit__"))return{};const i=(e,t)=>{if(!t)return;const a=t.split("/"),c=t.startsWith("@")?a.slice(0,2).join("/"):a[0];b.has(c)&&s(e,"test-double-library",c,o("test-double libraries")),(p.has(t)||p.has(c))&&s(e,"io-boundary-import",t,o("importing process, network, filesystem, or runtime boundary modules"))};return{ImportDeclaration(e){i(e,e.source.value)},ImportExpression(e){i(e,l(e.source))},CallExpression(e){const t=y(e.callee);u.has(t)&&s(e,"module-replacement",t,o("replacing modules")),f.has(t)&&s(e,"function-replacement",t,o("replacing collaborators")),h.has(t)&&s(e,"io-boundary-call",t,o("crossing process, network, filesystem, or runtime boundaries")),t==="require"&&e.arguments.length===1&&i(e,l(e.arguments[0]))},MemberExpression(e){e.object.type===n.Identifier&&e.object.name==="process"&&m(e)==="env"&&s(e,"io-boundary-global","process.env",o("reading process-global environment state"))}}}function y(r){if(r.type===n.Identifier)return r.name;if(r.type!==n.MemberExpression)return"";let s=r.object;for(;s.type===n.MemberExpression;)s=s.object;const i=m(r);return s.type===n.Identifier&&i?`${s.name}.${i}`:""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{createHash as x}from"node:crypto";import c from"node:fs";import a from"node:path";import{loadRunBundleManifest as R}from"../../evidence/bundles.js";import{makeTempDir as k,removeTempDir as T}from"../../process/files/temp-dir.js";import{readStoredDrafts as P}from"../bugs/store.js";import{inspectArtifacts as S}from"../inspect/artifacts.js";import{copyReportFile as v,REPORT_BYTES as j,REPORT_FILE_BYTES as B,REPORT_FILES as F,requireReportPath as O}from"./files.js";export function prepareReport(e){const r=e.cwd??process.cwd(),u=a.resolve(r,e.dir??"."),n=a.resolve(r,e.directory),f=[...new Set(e.bug??[])],w=f.length?P(u):{drafts:[],unreadable:[]},y=f.map(o=>{const s=w.drafts.find(m=>m.draft.id===o)?.draft;if(!s)throw new Error(`No readable recorded bug ${JSON.stringify(o)}. Use an ID from testkit bug record or campaign status.`);return s}),l=[...new Set(e.artifact??[])];if(l.length&&!e.run)throw new Error("Select an immutable --run when copying --artifact evidence.");if(e.run&&!l.length)throw new Error("Choose at least one --artifact from the run. Reports never copy all evidence implicitly.");const i=D(u,e.run,l),h=k("testkit-report-prepare-");let d=!1;try{let o=null;if(e.instructions){const t=a.join(h,"instructions");v(a.resolve(r,e.instructions),t),o={path:e.instructions,text:c.readFileSync(t,"utf8")}}c.mkdirSync(a.dirname(n),{recursive:!0});try{c.mkdirSync(n)}catch(t){throw new Error("Choose a new report directory. Preparation never overwrites an existing path.",{cause:t})}d=!0;const s=a.join(n,"report.md");let m=e.template?v(a.resolve(r,e.template),s):0;e.template||c.writeFileSync(s,"",{flag:"wx",mode:384});for(const t of i){const p=a.join(n,t.destination);if(m+=v(t.absolutePath,p,a.join(u,".testkit","results")),x("sha256").update(c.readFileSync(p)).digest("hex")!==t.sha256)throw new Error("Selected evidence changed after verification. The report was not prepared.")}const g=["report.md",...i.map(t=>t.destination)];if(y.length||i.length){const t=JSON.stringify({bugs:y,run:e.run??null,evidence:i.map(({source:E,destination:b})=>({source:E,destination:b}))},null,2)+`
|
|
2
|
-
`,p=Buffer.byteLength(t);if(p>B)throw new Error("The bug context exceeds 16 MiB. Select fewer bugs.");m+=p,c.writeFileSync(a.join(n,"context.json"),t,{flag:"wx",mode:384}),g.push("context.json")}if(m>j||g.length>F)throw new Error("The prepared report exceeds 64 MiB or 1000 files. Select fewer artifacts.");return{directory:n,files:g,bugs:f,run:e.run??null,instructions:o}}catch(o){throw d&&c.rmSync(n,{recursive:!0,force:!0}),o}finally{T(h)}}function D(e,r,u){if(!r)return[];const n={dir:e,runId:r,file:null,
|
|
2
|
+
`,p=Buffer.byteLength(t);if(p>B)throw new Error("The bug context exceeds 16 MiB. Select fewer bugs.");m+=p,c.writeFileSync(a.join(n,"context.json"),t,{flag:"wx",mode:384}),g.push("context.json")}if(m>j||g.length>F)throw new Error("The prepared report exceeds 64 MiB or 1000 files. Select fewer artifacts.");return{directory:n,files:g,bugs:f,run:e.run??null,instructions:o}}catch(o){throw d&&c.rmSync(n,{recursive:!0,force:!0}),o}finally{T(h)}}function D(e,r,u){if(!r)return[];const n={dir:e,runId:r,file:null,group:null},f=S({...n,mode:"verify"});if(f.mode!=="verify"||!f.verification.ok)throw new Error("The selected run failed integrity verification. Run testkit artifacts --verify for details.");const w=S({...n,mode:"artifacts",includePayload:!1});if(w.mode!=="artifacts")throw new Error("Could not inspect selected run artifacts.");const y=R(e,r),l=`.testkit/results/runs/${r}/`;return u.map(i=>{const h=w.entries.find(s=>s.artifactRef.path===i),d=i.startsWith(l)?i.slice(l.length):"",o=y.files.find(s=>s.path===d);if(!h||!o||!d.startsWith("files/"))throw new Error(`Artifact ${JSON.stringify(i)} is not an artifact in the selected immutable run. Use ref.path from testkit artifacts --run ${r} --json.`);return{source:i,destination:"evidence/"+O(d.slice(6)),absolutePath:h.absolutePath,sha256:o.sha256}})}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{redactedRunValue as o,runRedaction as u}from"../../evidence/redaction.js";export function createCallerRedaction(a=process.env,c=[]){let n=()=>[],e=null;return{useSourceTargets(t){n=t,e=null},redact(t){const r=n();return e?.count!==r.length&&(e={count:r.length,targets:u({env:a,redactKeys:c,redactionTargets:r}).targets}),o(t,e.targets)}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isEngineTaskDeadlineExceededReason as
|
|
1
|
+
import{isEngineTaskDeadlineExceededReason as k}from"../../engines/api/index.js";import{TaskPreparationError as g}from"./environment.js";import{toError as m}from"../../kernel/error-serialization.js";export const ENGINE_REPORTER_CALLBACK_CANCELLED_CODE="TESTKIT_ENGINE_REPORTER_CALLBACK_CANCELLED";export class EngineExecutionBridgeError extends Error{artifactReferencesByTaskId;completedOutcomesByTaskId;disposition;failingTaskId;state;cause;constructor(r,n,a,t,i=new Map,c=null,s={activeDisposition:a,observedInfraOperationFailure:!1,operationErrors:[]}){super(r,{cause:n}),this.name="EngineExecutionBridgeError",this.cause=n,this.disposition=Object.freeze({...a}),this.failingTaskId=c,this.artifactReferencesByTaskId=t,this.completedOutcomesByTaskId=i,this.state=s}}export class EngineExecutionReporterCallbackError extends Error{cancelled;cause;constructor(r,n){const a=m(n);super(`Engine reporter ${r} callback failed: ${a.message}`,{cause:n}),this.name="EngineExecutionReporterCallbackError",this.cancelled=y(a)===ENGINE_REPORTER_CALLBACK_CANCELLED_CODE,this.cause=n}}export async function executeManagedEngineRequest(e,r){return await e.execute(r)}export function buildBridgeError(e,r,n,a,t,i){const{operationErrors:c}=e,s=r.map(u=>u.error),l=[...c,...s],d=c.map(u=>u.message).join("; "),f=s.map(u=>u.message).join("; "),p=c.length===0?`Engine node setup cleanup failed: ${f}`:s.length===0?d:`${d}; node setup cleanup also failed: ${f}`,o=l.length===1?l[0]:new AggregateError(l,"Engine execution bridge failed");return new EngineExecutionBridgeError(p,o,n,a,t,r[0]?.taskId??i,e)}export function preparationFailure(e,r){const n=e instanceof g?e.cause:e;return E(n,x(e),r)}export function taskStartedFailure(e,r){return E(e,reporterBridgeDisposition(),r)}function E(e,r,n){const a={activeDisposition:r,observedInfraOperationFailure:r.classification==="infra",operationErrors:[m(e)]};return buildBridgeError(a,[],resolveBridgeDisposition(a,[]),new Map,new Map,n)}export async function settlePreparedTask(e,r,n,a){const t=r.map(o=>({...o,taskId:n})),i="error"in e?e.error:null,c="outcomes"in e?e.outcomes:[];let s=i instanceof EngineExecutionBridgeError?i.state:i!==null?{activeDisposition:infraBridgeDisposition(),observedInfraOperationFailure:!0,operationErrors:[m(i)]}:{activeDisposition:infraBridgeDisposition(c.some(o=>o.infraFailed&&o.blockedByRuntime)?"fail-graph":"none"),observedInfraOperationFailure:!1,operationErrors:[]};const l=new Map(i instanceof EngineExecutionBridgeError?i.completedOutcomesByTaskId:c.map(o=>[String(o.task.id),o])),d=i instanceof EngineExecutionBridgeError?i.artifactReferencesByTaskId:new Map(c.map(o=>[String(o.task.id),o.artifacts]));h(l,t);const f=l.get(n);let p=!1;if(f!==void 0)try{await a(f)}catch(o){p=!0;const u=i===null&&t.length===0;s={activeDisposition:u?reporterBridgeDisposition():s.activeDisposition,observedInfraOperationFailure:u||s.observedInfraOperationFailure,operationErrors:[...s.operationErrors,m(o)]}}return t.length===0&&!p?null:buildBridgeError(s,t,resolveBridgeDisposition(s,t),d,l,n)}function h(e,r){const n=new Map;for(const a of r){if(a.owner!=="consumer")continue;const t=n.get(a.taskId)??[];t.push(a.error),n.set(a.taskId,t)}for(const[a,t]of n){const i=e.get(a);if(i===void 0)continue;const c=`Runtime node setup consumer cleanup failed: ${t.map(s=>s.message).join("; ")}`;e.set(a,{...i,error:i.error===null?c:`${i.error}; ${c}`,failureDetails:[...i.failureDetails,...t.map(I)],reason:null,status:"failed"})}}function I(e){return{actual:{owner:"consumer"},classification:"product",count:1,key:"runtime_node_setup_consumer_cleanup_failed",kind:"runtime-node-setup-cleanup",message:e.message,...e.stack===void 0?{}:{stack:e.stack},title:"Runtime node setup consumer cleanup failed"}}export function resolveBridgeDisposition({activeDisposition:e,observedInfraOperationFailure:r,operationErrors:n},a){return a.length>0?e.classification==="infra"&&e.runtimeImpact==="fail-graph"?infraBridgeDisposition("fail-graph"):a.some(t=>t.owner==="testkit")?infraBridgeDisposition("invalidate-lease"):n.length>0&&n.every(t=>t instanceof EngineExecutionReporterCallbackError)?n.every(t=>t instanceof EngineExecutionReporterCallbackError&&t.cancelled)?productBridgeDisposition("invalidate-lease"):reporterBridgeDisposition("invalidate-lease"):r||n.length>0&&e.classification==="infra"?infraBridgeDisposition(e.runtimeImpact==="fail-graph"?"fail-graph":"invalidate-lease"):productBridgeDisposition("invalidate-lease"):n.length>0&&n.every(t=>t instanceof EngineExecutionReporterCallbackError)?n.every(t=>t instanceof EngineExecutionReporterCallbackError&&t.cancelled)?cancelledBridgeDisposition():reporterBridgeDisposition(e.runtimeImpact):r&&e.classification!=="infra"?infraBridgeDisposition("none"):{...e}}export function managerFailureBridgeDisposition(e,r,n){return!r.aborted||n!==r.reason?infraBridgeDisposition("none"):e.aborted&&n===e.reason?cancelledBridgeDisposition():k(r.reason)?productBridgeDisposition():infraBridgeDisposition("none")}function x(e){return e instanceof g?e.kind==="cancelled"?cancelledBridgeDisposition():e.kind==="infra"?infraBridgeDisposition("invalidate-lease"):productBridgeDisposition(e.cleanupFailures.length>0?"invalidate-lease":"none"):infraBridgeDisposition("invalidate-lease")}export function cancelledBridgeDisposition(){return{classification:void 0,notifyRuntimeError:!1,runtimeImpact:"none",status:"cancelled"}}export function infraBridgeDisposition(e="none"){return{classification:"infra",notifyRuntimeError:!0,runtimeImpact:e,status:"not_run"}}export function reporterBridgeDisposition(e="none"){return{classification:"infra",notifyRuntimeError:!1,runtimeImpact:e,status:"not_run"}}export function productBridgeDisposition(e="none"){return{classification:"product",notifyRuntimeError:!1,runtimeImpact:e,status:"failed"}}function y(e){return e.code}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ENGINE_REPORTER_CALLBACK_CANCELLED_CODE as
|
|
1
|
+
import{ENGINE_REPORTER_CALLBACK_CANCELLED_CODE as l,EngineExecutionReporterCallbackError as c}from"./engine-execution-failures.js";export const DEFAULT_ENGINE_REPORTER_CALLBACK_TIMEOUT_MS=5e3;export class EngineReporterCallbackTimeoutError extends Error{timeoutMs;constructor(n,e){super(`${n} exceeded ${e.toString()} milliseconds`),this.name="EngineReporterCallbackTimeoutError",this.timeoutMs=e}}export class EngineReporterCallbackCancelledError extends Error{code=l;cause;constructor(n,e){const t=e instanceof Error?e:new Error(String(e));super(`${n} was cancelled: ${t.message}`,{cause:e}),this.name="EngineReporterCallbackCancelledError",this.cause=e}}export async function invokeBoundedReporterCallback(r,n,e){const t=Promise.resolve(n());let i,o;const a=new Promise((E,s)=>{e.signal?.aborted?s(new EngineReporterCallbackCancelledError(r,e.signal.reason)):e.signal!==void 0&&(o=()=>{s(new EngineReporterCallbackCancelledError(r,e.signal?.reason))},e.signal.addEventListener("abort",o,{once:!0})),i=setTimeout(()=>{s(new EngineReporterCallbackTimeoutError(r,e.timeoutMs))},e.timeoutMs)});try{await Promise.race([t,a])}finally{i!==void 0&&clearTimeout(i),o!==void 0&&e.signal!==void 0&&e.signal.removeEventListener("abort",o)}}export async function invokeEngineReporterCallback(r,n,e){try{await invokeBoundedReporterCallback(`Engine reporter ${r} callback`,n,e)}catch(t){throw new c(r,t)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import J from"node:fs";import U from"node:path";import{EngineTaskDeadlineExceededError as It}from"../../engines/api/index.js";import"../../domain/identifiers.js";import"../../domain/test-outcomes.js";import{resolveEngineProfile as Mt}from"../../engines/catalog.js";import{resolveEndpointReadinessOwner as bt}from"../../engines/definitions.js";import{BUILT_IN_ENGINE_ORCHESTRATION as Ot,defaultEnvironmentValues as _t,engineInputEnvironment as Nt}from"./engine-orchestration.js";import{persistTaskArtifacts as Rt}from"../../evidence/index.js";import{createEvidenceLedger as at,persistTrackedEngineEvidence as ct,requireTaskArtifacts as Ft,requireTaskEvidenceLedger as At}from"./engine-evidence-persistence.js";import{applyConsumerNodeSetupCleanupFailures as ut,cleanupPreparedNodeSetups as dt}from"./engine-execution-cleanup.js";import{buildBridgeError as Bt,EngineExecutionBridgeError as Ct,executeManagedEngineRequest as xt,infraBridgeDisposition as j,managerFailureBridgeDisposition as Pt,productBridgeDisposition as V,reporterBridgeDisposition as z,resolveBridgeDisposition as ft,runtimeNodeSetupBridgeDisposition as Lt}from"./engine-execution-failures.js";import{captureEngineReporterCallback as lt,DEFAULT_ENGINE_REPORTER_CALLBACK_TIMEOUT_MS as $t,invokeEngineReporterCallback as pt}from"./engine-execution-reporting.js";import{createEngineExecutionObserver as Jt}from"./engine-execution-observer.js";import{toError as R}from"../../kernel/error-serialization.js";export{EngineExecutionBridgeError}from"./engine-execution-failures.js";import{waitForEndpointReadinessPreflight as Ut}from"./endpoint-readiness.js";import{collectCheckDetailsFromRuntimeArtifacts as jt,collectFailureDetailsFromRuntimeArtifacts as Vt}from"./failure-details.js";import{buildRuntimeFixtureManifest as zt}from"./runtime-fixtures.js";import{MAX_RUNTIME_NODE_SETUP_CLEANUP_TIMEOUT_MS as Gt,runRuntimeNodeSetup as Ht}from"./setup/runtime-node-setup.js";export async function executeEngineTask(t,{environment:e,lease:n,nativeConfigDirectory:s,request:o,task:r},a,k=null){const T={signal:a.signal,timeoutMs:$t},E="batchTasks"in r?r.batchTasks:[r],I=E[0],S={name:I.targetName},v=o.productDir;kt(v,"product directory"),kt(n.directory,"runtime lease directory");const O=Mt(I.testType,I.engineId),q=Ot.resolve(O.engineId),_=Qt(o.fileTimeoutSeconds),wt=Date.now(),K=mt(wt,_),W=e.baseUrl;if(W!==null&&bt(O)==="orchestrator-http"){const F=Date.now(),w=G(a.signal,K);let y;try{y=await Ut({baseUrl:W,serviceName:S.name,lifecycle:a,signal:w.signal,options:Zt(Yt(K))})}finally{w.dispose()}if(!y.ok){const M=a.isStopRequested()||a.signal.aborted,h=Date.now(),u=buildEndpointReadinessOutcomes(E,r,y,M,F,h),c=[];let p=null;for(const m of u){const f=c.length;await lt(c,"taskStarted",()=>k?.taskStarted?.(m.task,S),T),p===null&&c.length>f&&(p=String(m.task.id)),await lt(c,"taskFinished",()=>k?.taskFinished?.(m.task,m),T),p===null&&c.length>f&&(p=String(m.task.id))}if(c.length>0){const m=c.length===1?c[0]:new AggregateError(c,"Engine readiness reporting failed");throw new Ct(`${y.reason}; ${c.map(f=>f.message).join("; ")}`,m,ft(c,[],!1,M?{classification:void 0,notifyRuntimeError:!1,runtimeImpact:"none",status:"cancelled"}:z("fail-graph")),new Map(E.map(f=>[String(f.id),[]])),new Map(u.map(f=>[String(f.task.id),f])),p)}return{outcomes:u}}}return t.withEngine(O.engineId,a.signal,async F=>{const w=qt(n,v);J.mkdirSync(w.temporaryDirectory,{recursive:!0}),J.mkdirSync(w.artifactDirectory,{recursive:!0});const y=new Map(E.map(l=>[String(l.id),[]])),M=new Map(E.map(l=>[String(l.id),at()])),h=new Map,u=[];let c=V(),p=!1;const m=[],f=[],X=[];let Q=null;const Y=new Set,A=async(l,i)=>{const d=String(l.id);Y.has(d)||(Y.add(d),await pt("taskFinished",()=>k?.taskFinished?.(l,i),T))};try{for(const[l,i]of E.entries()){c=z();const d=String(i.id);Q=d,await pt("taskStarted",()=>k?.taskStarted?.(i,S),T),c=V();const tt=_t(e),N=mt(Date.now(),_),et=G(a.signal,N);let b;try{b=await Ht({cleanupTimeoutMs:Math.min(_,Gt),deadlineMs:N,targetConfig:{name:S.name,productDir:v},task:i,lease:{leaseDir:n.directory,leaseId:n.id},runtimeEnv:tt,signal:et.signal})}catch(g){throw c=Lt(g),g}finally{et.dispose()}m.push({cleanup:b.cleanup,taskId:d}),c=j();for(const g of b.artifacts){const D=Rt(v,i,[g]);y.get(String(i.id))?.push(...D)}c=V();const B={environment:e,lease:n,nativeConfigDirectory:s,request:o,runtimeEnvironment:tt,task:i},nt=q.resolveConfiguration(B),yt={...nt===void 0?{}:{configuration:nt},environment:Nt(B),fixtures:ie(zt(v,i.file),`fixture manifest for ${i.file}`),setupData:ht(b.setupData,`node setup data for ${i.file}`),supportModules:q.resolveSupportModules(B)},Tt={lease:{directory:n.directory,id:n.id},mode:"test"};c=j();const vt=u.length,rt=at(),Dt=Jt({artifactReferencesByTaskId:y,completedOutcomesByTaskId:h,errors:u,executableTask:r,invocationEvidenceLedger:rt,productDir:v,taskBatchIndex:l,taskEvidenceLedgers:M,tasks:[i],tasksById:new Map([[d,i]]),workspaceArtifactDirectory:w.artifactDirectory},mapEngineOutcome),C=G(a.signal,N);try{const g={invocationId:Wt(a,n,i),observer:Dt,profile:O,signal:C.signal,target:{endpoints:e.endpoints,inputs:Kt()},tasks:[{deadlineMs:N,id:d,file:i.file,serviceName:i.serviceName,suiteName:i.suiteName,testType:i.testType,timeoutMs:_,inputs:yt,orchestration:Tt}],workspace:w};let D;try{D=await xt(F,g)}catch(st){throw c=Pt(a.signal,C.signal,st),st}const it=mapEngineOutcomes([i],D)[0],L=Ft(y,d),St=At(M,d);ct(it.outcome.evidence,{artifactRoot:w.artifactDirectory,errors:u,ledger:St,mode:"reconcile",productDir:v,references:L,scope:"task",task:i});const $=mapEngineOutcome(it.outcome,i,L,r,l);h.set(d,$),$.infraFailed&&$.blockedByRuntime&&(c=j("fail-graph"));const ot=ne(D);re(ot)&&ct(ot,{artifactRoot:w.artifactDirectory,errors:u,ledger:rt,mode:"reconcile",productDir:v,references:L,scope:"invocation",task:i})}finally{C.dispose()}u.length>vt&&(p=!0),m.pop();const x=await dt([{cleanup:b.cleanup,taskId:d}]);if(x.length>0){f.push(...x),ut(h,x);const g=h.get(d);if(g!==void 0)try{await A(i,g)}catch(D){u.push(R(D))}break}if(u.length>0)break;const P=h.get(d);if(P===void 0){u.push(new Error(`Engine task ${d} completed without a mapped outcome`)),p=!0;break}X.push(P),c=z();try{await A(i,P)}catch(g){u.push(R(g)),p=!0;break}}}catch(l){const i=u.length;u.push(R(l)),(i>0||c.classification==="infra")&&(p=!0)}const Z=await dt(m);f.push(...Z),ut(h,Z);for(const l of E){const i=h.get(String(l.id));if(i!==void 0)try{await A(l,i)}catch(d){u.push(R(d))}}if(u.length>0||f.length>0)throw Bt(u,f,ft(u,f,p,c),y,h,Q);return{outcomes:X}})}export function mapEngineOutcomes(t,e){const n=new Map(t.map(r=>[String(r.id),r])),s=new Map;for(const r of e.outcomes){const a=n.get(r.taskId);if(!a)throw new Error(`Engine manager returned an outcome for unknown task ${r.taskId}`);if(s.has(r.taskId))throw new Error(`Engine manager returned duplicate outcomes for task ${r.taskId}`);s.set(r.taskId,{task:a,outcome:r})}const o=t.map(r=>String(r.id)).filter(r=>!s.has(r));if(o.length>0)throw new Error(`Engine manager did not return outcomes for task(s): ${o.join(", ")}`);return t.map(r=>{const a=s.get(String(r.id));if(!a)throw new Error("Engine outcome mapping invariant failed");return a})}export function buildEndpointReadinessOutcomes(t,e,n,s,o,r){const a=Math.max(0,r-o);return t.map((k,T)=>({task:k,status:s?"cancelled":"not_run",error:null,reason:n.reason,infraFailed:!s,blockedByRuntime:!s,durationMs:T===0?a:0,startedAt:o,finishedAt:r,artifacts:[],failureDetails:s?[]:[...n.failureDetails],checkDetails:[],...Et(e,k)}))}function qt(t,e){return{rootDirectory:e,cacheDirectory:t.engineCacheDirectory,temporaryDirectory:U.join(t.engineWorkspaceDirectory,"temporary"),artifactDirectory:U.join(t.engineWorkspaceDirectory,"artifacts")}}function Kt(){return{environment:{},fixtures:{},supportModules:{}}}function Wt(t,e,n){return[t.runId,e.id,Xt(n)].join(":")}function Xt(t){return"batchId"in t?t.batchId:String(t.id)}function Qt(t){const e=t*1e3;if(!Number.isSafeInteger(e)||e<=0)throw new Error("Engine task timeout must be a positive safe integer");return e}function mt(t,e){const n=t+e;if(!Number.isSafeInteger(n)||n<=t)throw new Error("Engine task deadline must be a positive safe integer");return n}function Yt(t){return Math.max(1,t-Date.now())}function Zt(t){const e=gt(process.env.TESTKIT_HTTP_ENDPOINT_PREFLIGHT_TIMEOUT_MS,3e4),n=gt(process.env.TESTKIT_HTTP_ENDPOINT_PREFLIGHT_ATTEMPT_TIMEOUT_MS,5e3);return{timeoutMs:Math.min(e,t),attemptTimeoutMs:Math.min(n,t)}}function gt(t,e){const n=Number(t);return Number.isInteger(n)&&n>0?n:e}function G(t,e){const n=new AbortController;let s=null;const o=()=>{n.abort(t.reason)},r=()=>{const a=e-Date.now();if(a<=0){n.abort(new It(e));return}s=setTimeout(r,Math.min(a,2147483647)),s.unref()};return t.aborted?o():(t.addEventListener("abort",o,{once:!0}),r()),{signal:n.signal,dispose(){s!==null&&clearTimeout(s),t.removeEventListener("abort",o)}}}export function mapEngineOutcome(t,e,n,s,o){const r=Vt(t.evidence.artifacts),a=e.engineId==="node-vitest"&&r.some(S=>S.kind==="vitest-test")&&t.failure!==null&&te(t.failure),k=[...t.failure&&!a?[ee(t.failure)]:[],...r],T=jt(t.evidence.artifacts),E=t.status==="not_run",I=E||t.failure?.classification==="infra";return{task:e,status:t.status,error:t.status==="failed"?t.failure?.message??"Engine task failed without a message":null,reason:t.status==="failed"||t.status==="passed"?null:t.failure?.message??`Engine task ${t.status}`,infraFailed:I,blockedByRuntime:E,durationMs:t.durationMs,startedAt:t.startedAtMs,finishedAt:t.finishedAtMs,artifacts:n,failureDetails:k,checkDetails:T,...Et(s,e,o)}}function Et(t,e,n){if(!("batchTasks"in t))return{};const s=n??t.batchTasks.findIndex(o=>o.id===e.id&&o.file===e.file);if(s<0)throw new Error(`Task ${String(e.id)} is missing from its engine batch`);return{runtimeBatch:{id:t.batchId,index:s,fileCount:t.batchTasks.length,files:t.batchTasks.map(o=>o.file)}}}function te(t){return t.code==="NODE_VITEST_REPORT_FAILED"?!0:t.code==="NODE_VITEST_PROCESS_FAILED"&&t.details?.exitCode===1}function ee(t){const e=t.code??"ENGINE_TASK_FAILED",n={code:e,details:t.details===void 0?null:oe(t.details)};return{kind:"engine-failure",key:e,title:e,...t.classification===void 0?{}:{classification:t.classification},count:1,message:t.message,actual:n,...t.stack===void 0?{}:{stack:t.stack}}}function ne(t){return{artifacts:H(t.evidence.artifacts,t.outcomes.flatMap(e=>e.evidence.artifacts)),logs:H(t.evidence.logs,t.outcomes.flatMap(e=>e.evidence.logs)),metrics:H(t.evidence.metrics,t.outcomes.flatMap(e=>e.evidence.metrics)),...t.evidence.native===void 0?{}:{native:t.evidence.native}}}function H(t,e){const n=new Map;for(const s of e){const o=JSON.stringify(s);n.set(o,(n.get(o)??0)+1)}return t.filter(s=>{const o=JSON.stringify(s),r=n.get(o)??0;return r===0?!0:(n.set(o,r-1),!1)})}function re(t){return t.artifacts.length>0||t.logs.length>0||t.metrics.length>0||t.native!==void 0}function ie(t,e){const n=ht(t,e);if(n===null||Array.isArray(n)||typeof n!="object")throw new TypeError(`${e} must contain a JSON object`);return n}function ht(t,e){try{const n=JSON.stringify(t);if(typeof n!="string")throw new TypeError(`${e} must be JSON-serializable`);return JSON.parse(n)}catch(n){throw new TypeError(`${e} must be JSON-serializable`,{cause:n})}}function oe(t){return JSON.parse(JSON.stringify(t))}function kt(t,e){if(!U.isAbsolute(t))throw new Error(`Engine execution ${e} must be absolute`);if(!J.statSync(t).isDirectory())throw new Error(`Engine execution ${e} must be a directory`)}
|
|
1
|
+
import B from"node:fs";import _ from"node:path";import{EngineTaskDeadlineExceededError as oe}from"../../engines/api/index.js";import"../../domain/identifiers.js";import"../../domain/test-outcomes.js";import{resolveExecutionProfile as se}from"../../engines/catalog.js";import{engineSupportInputs as ae,defaultEnvironmentValues as ce,engineInputEnvironment as de}from"./engine-orchestration.js";import{persistTaskArtifacts as ue}from"../../evidence/index.js";import{createEvidenceLedger as K,persistTrackedEngineEvidence as H,requireTaskArtifacts as Q,requireTaskEvidenceLedger as fe}from"./engine-evidence-persistence.js";import{buildBridgeError as le,executeManagedEngineRequest as pe,infraBridgeDisposition as R,managerFailureBridgeDisposition as ge,productBridgeDisposition as X,reporterBridgeDisposition as Y,resolveBridgeDisposition as me}from"./engine-execution-failures.js";import{DEFAULT_ENGINE_REPORTER_CALLBACK_TIMEOUT_MS as Ee,invokeEngineReporterCallback as Z}from"./engine-execution-reporting.js";import{createEngineExecutionObserver as he}from"./engine-execution-observer.js";import{toError as $}from"../../kernel/error-serialization.js";export{EngineExecutionBridgeError}from"./engine-execution-failures.js";import{collectFailureDetailsFromRuntimeArtifacts as ke}from"./failure-details.js";import{buildRuntimeFixtureManifest as ye}from"./runtime-fixtures.js";import{readEnvironmentValueMissingFailure as we}from"../../engines/contracts/environment-values.js";export async function executeEngineTask(e,{environment:t,lease:n,request:o,started:r,task:i},c,y=null){const T={signal:c.signal,timeoutMs:Ee},g="batchTasks"in i?i.batchTasks:[i],M=g[0],x={name:M.targetName},k=o.productDir;te(k,"product directory"),te(n.directory,"runtime lease directory");const O=se(M),ne=normalizeTimeoutMs(o.fileTimeoutSeconds);if(e.engineId!==O.engineId)throw new Error(`Engine session ${e.engineId} cannot execute ${O.engineId} tasks`);const w=ve(n,k),I=new Map(g.map(a=>[String(a.id),[]])),J=new Map(g.map(a=>[String(a.id),K()])),b=new Map,d=[];let m=X(),D=!1;const C=[];let F=null;const V=new Set,j=async(a,h)=>{const u=String(a.id);u===r?.taskId&&r.prepared!==null||V.has(u)||(V.add(u),await Z("taskFinished",()=>y?.taskFinished?.(a,h),T))};try{m=R();const a=g.find(u=>String(u.id)===r?.taskId);if(r!==null&&r.prepared!==null&&a!==void 0){F=r.taskId;for(const u of r.prepared.artifacts){const f=ue(k,a,[u]);I.get(r.taskId)?.push(...f)}}B.mkdirSync(w.temporaryDirectory,{recursive:!0}),B.mkdirSync(w.artifactDirectory,{recursive:!0});const h=O.taskBatching==="selection"?[g]:g.map(u=>[u]);for(const[u,f]of h.entries()){const P=ne*f.length,q=[];for(const s of f){m=Y();const l=String(s.id);F=l;const E=r?.taskId===l?r:null;E===null&&await Z("taskStarted",()=>y?.taskStarted?.(s,x),T),m=X();const p={environment:t,request:o,runtimeEnvironment:ce(t),task:s},{configuration:v,supportModules:S}=ae(p);q.push({id:l,file:s.file,serviceName:s.serviceName,suiteName:s.suiteName,...s.testType===void 0?{}:{testType:s.testType},timeoutMs:P,inputs:{...v===void 0?{}:{configuration:v},environment:de(p),fixtures:xe(ye(k,s.file),`fixture manifest for ${s.file}`),setupData:ee(E!==null&&E.prepared!==null?E.prepared.setupData:t.setupData,`node setup data for ${s.file}`),supportModules:S},orchestration:{lease:{directory:n.directory,id:n.id},mode:"test"}})}const z=r?.deadlineMs??buildTaskDeadline(Date.now(),P);m=R();const re=d.length,U=K(),W=f.length===1?u:void 0,ie=he({artifactReferencesByTaskId:I,completedOutcomesByTaskId:b,errors:d,executableTask:i,invocationEvidenceLedger:U,productDir:k,taskBatchIndex:W,taskEvidenceLedgers:J,tasks:f,tasksById:new Map(f.map(s=>[String(s.id),s])),workspaceArtifactDirectory:w.artifactDirectory},mapEngineOutcome),N=createDeadlineSignal(c.signal,z);try{const s={invocationId:[c.runId,n.id,be(f[0])].join(":"),observer:ie,profile:O,signal:N.signal,target:{baseUrl:t.baseUrl,databases:t.databases,endpoints:t.endpoints,handles:{...t.handles,...r===null||r.prepared===null?{}:r.prepared.handles},inputs:Ie()},tasks:q.map(p=>({...p,deadlineMs:z})),workspace:w};let l;try{l=await pe(e,s);for(const p of l.runErrors??[])c.recordRunError?.(p)}catch(p){throw m=ge(c.signal,N.signal,p),p}for(const{outcome:p,task:v}of mapEngineOutcomes(f,l)){const S=String(v.id),G=Q(I,S);H(p.evidence,{artifactRoot:w.artifactDirectory,errors:d,ledger:fe(J,S),mode:"reconcile",productDir:k,references:G,scope:"task",task:v});const A=mapEngineOutcome(p,v,G,i,W);b.set(S,A),A.infraFailed&&A.blockedByRuntime&&(m=R("fail-graph"))}const E=Me(l);Oe(E)&&H(E,{artifactRoot:w.artifactDirectory,errors:d,ledger:U,mode:"reconcile",productDir:k,references:Q(I,String(f[0].id)),scope:"invocation",task:f[0]})}finally{N.dispose()}if(d.length>re&&(D=!0),d.length>0)break;for(const s of f){const l=b.get(String(s.id));if(l===void 0){d.push(new Error(`Engine task ${String(s.id)} completed without a mapped outcome`)),D=!0;break}C.push(l),m=Y();try{await j(s,l)}catch(E){d.push($(E)),D=!0;break}}if(d.length>0)break}}catch(a){const h=d.length;d.push($(a)),(h>0||m.classification==="infra")&&(D=!0)}for(const a of g){const h=b.get(String(a.id));if(h!==void 0)try{await j(a,h)}catch(u){d.push($(u))}}if(d.length>0){const a={activeDisposition:m,observedInfraOperationFailure:D,operationErrors:d};throw le(a,[],me(a,[]),I,b,F)}return{outcomes:C}}export function mapEngineOutcomes(e,t){const n=new Map(e.map(i=>[String(i.id),i])),o=new Map;for(const i of t.outcomes){const c=n.get(i.taskId);if(!c)throw new Error(`Engine manager returned an outcome for unknown task ${i.taskId}`);if(o.has(i.taskId))throw new Error(`Engine manager returned duplicate outcomes for task ${i.taskId}`);o.set(i.taskId,{task:c,outcome:i})}const r=e.map(i=>String(i.id)).filter(i=>!o.has(i));if(r.length>0)throw new Error(`Engine manager did not return outcomes for task(s): ${r.join(", ")}`);return e.map(i=>{const c=o.get(String(i.id));if(!c)throw new Error("Engine outcome mapping invariant failed");return c})}function ve(e,t){return{rootDirectory:t,cacheDirectory:e.engineCacheDirectory,temporaryDirectory:_.join(e.engineWorkspaceDirectory,"temporary"),artifactDirectory:_.join(e.engineWorkspaceDirectory,"artifacts")}}function Ie(){return{environment:{},fixtures:{},supportModules:{}}}function be(e){return"batchId"in e?e.batchId:String(e.id)}export function normalizeTimeoutMs(e){const t=e*1e3;if(!Number.isSafeInteger(t)||t<=0)throw new Error("Engine task timeout must be a positive safe integer");return t}export function buildTaskDeadline(e,t){const n=e+t;if(!Number.isSafeInteger(n)||n<=e)throw new Error("Engine task deadline must be a positive safe integer");return n}export function createDeadlineSignal(e,t){const n=new AbortController;let o=null;const r=()=>{n.abort(e.reason)},i=()=>{const c=t-Date.now();if(c<=0){n.abort(new oe(t));return}o=setTimeout(i,Math.min(c,2147483647)),o.unref()};return e.aborted?r():(e.addEventListener("abort",r,{once:!0}),i()),{signal:n.signal,dispose(){o!==null&&clearTimeout(o),e.removeEventListener("abort",r)}}}export function mapEngineOutcome(e,t,n,o,r){const i=ke(e.evidence.artifacts),c=t.engineId==="node-vitest"&&i.some(x=>x.kind==="vitest-test")&&e.failure!==null&&Se(e.failure),y=we(e.failure),T=[...e.failure&&!c?[Te(e.failure,y===null)]:[],...i],g=e.status==="not_run",M=g||e.failure?.classification==="infra";return{task:t,status:e.status,error:e.status==="failed"?e.failure?.message??"Engine task failed without a message":null,reason:e.status==="failed"||e.status==="passed"?null:e.failure?.message??`Engine task ${e.status}`,infraFailed:M,blockedByRuntime:g,durationMs:e.durationMs,startedAt:e.startedAtMs,finishedAt:e.finishedAtMs,artifacts:n,failureDetails:T,...y===null?{}:{environmentValuesMissing:y},...De(o,t,r)}}function De(e,t,n){if(!("batchTasks"in e))return{};const o=n??e.batchTasks.findIndex(r=>r.id===t.id&&r.file===t.file);if(o<0)throw new Error(`Task ${String(t.id)} is missing from its engine batch`);return{runtimeBatch:{id:e.batchId,index:o,fileCount:e.batchTasks.length,files:e.batchTasks.map(r=>r.file)}}}function Se(e){return e.code==="NODE_VITEST_REPORT_FAILED"?!0:e.code==="NODE_VITEST_PROCESS_FAILED"&&e.details?.exitCode===1}function Te(e,t){const n=e.code??"ENGINE_TASK_FAILED",o={code:n,details:!t||e.details===void 0?null:Fe(e.details)};return{kind:"engine-failure",key:n,title:n,...e.classification===void 0?{}:{classification:e.classification},count:1,message:e.message,actual:o,...e.stack===void 0?{}:{stack:e.stack}}}function Me(e){return{artifacts:L(e.evidence.artifacts,e.outcomes.flatMap(t=>t.evidence.artifacts)),logs:L(e.evidence.logs,e.outcomes.flatMap(t=>t.evidence.logs)),metrics:L(e.evidence.metrics,e.outcomes.flatMap(t=>t.evidence.metrics)),...e.evidence.native===void 0?{}:{native:e.evidence.native}}}function L(e,t){const n=new Map;for(const o of t){const r=JSON.stringify(o);n.set(r,(n.get(r)??0)+1)}return e.filter(o=>{const r=JSON.stringify(o),i=n.get(r)??0;return i===0?!0:(n.set(r,i-1),!1)})}function Oe(e){return e.artifacts.length>0||e.logs.length>0||e.metrics.length>0||e.native!==void 0}function xe(e,t){const n=ee(e,t);if(n===null||Array.isArray(n)||typeof n!="object")throw new TypeError(`${t} must contain a JSON object`);return n}function ee(e,t){try{const n=JSON.stringify(e);if(typeof n!="string")throw new TypeError(`${t} must be JSON-serializable`);return JSON.parse(n)}catch(n){throw new TypeError(`${t} must be JSON-serializable`,{cause:n})}}function Fe(e){return JSON.parse(JSON.stringify(e))}function te(e,t){if(!_.isAbsolute(e))throw new Error(`Engine execution ${t} must be absolute`);if(!B.statSync(e).isDirectory())throw new Error(`Engine execution ${t} must be a directory`)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import"../../engines/api/index.js";import{findNearestPlaywrightConfigFile as o}from"../../engines/playwright/runtime/config-file.js";export function engineSupportInputs(e){switch(e.task.engineId){case"node-vitest":return{configuration:e.request.vitest,supportModules:{}};case"playwright":return{configuration:i(e),supportModules:s(e)}}}export function defaultEnvironmentValues(e){return{...e.baseUrl===null?{}:{BASE_URL:e.baseUrl},...e.databaseUrl===null?{}:{DATABASE_URL:e.databaseUrl}}}export function engineInputEnvironment(e){const t=Object.entries(e.runtimeEnvironment).filter(([r])=>r.toUpperCase()!=="BASE_URL"),n=new Set(t.map(([r])=>r.toUpperCase()));return{...Object.fromEntries(Object.entries(e.environment.env).filter(([r])=>!n.has(r.toUpperCase()))),...Object.fromEntries(t)}}function s(e){const t=o(e.request.productDir,e.request.ownerRoots[e.task.serviceName]??[]);return t===null?{}:{playwrightConfig:t}}function i(e){const t=e.environment.baseUrl;return t!==null&&u(t)?{...e.environment.ui,allowRemote:!0}:{...e.environment.ui}}function u(e){try{return!a(new URL(e).hostname)}catch{return!1}}function a(e){const t=e.toLowerCase();return t==="localhost"||t==="::1"||t==="0.0.0.0"||t==="127.0.0.1"||t.endsWith(".localhost")||t.startsWith("127.")}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{};
|
|
1
|
+
import{randomUUID as c}from"node:crypto";import u from"node:path";import{isDeepStrictEqual as f}from"node:util";import{isUnknownRecord as m}from"../../kernel/unknown-values.js";export function createEnvironment({group:n,setupData:t={},...e}){return{...e,databases:b(e.databases,n,e.databaseUrl,"database"),endpoints:b(e.endpoints,n,e.baseUrl,"endpoint"),env:{...e.env},setupData:t}}export class GroupDefaultConflictError extends Error{}function b(n,t,e,r){if(e===null)return{...n};if(Object.hasOwn(n,t)&&n[t]!==e)throw new GroupDefaultConflictError(`Group "${t}" has a default ${r} and a different ${r} named "${t}"; a group's default ${r} is also named after the group`);return{...n,[t]:e}}export class TaskPreparationError extends Error{cleanupFailures;kind;cause;constructor(t,e,r){super(e.message,{cause:e}),this.name="TaskPreparationError",this.cause=e,this.cleanupFailures=r,this.kind=t}}export const PREVIEW_LEASE=Object.freeze({directory:u.join(u.sep,`testkit-preview-${c()}`),id:`testkit-preview-${c()}`});export function environmentTaskIdentities(n){return("batchTasks"in n?n.batchTasks:[n]).map(environmentTaskIdentity)}const h={baseUrl:"base URL",databaseUrl:"database URL",databases:"database",endpoints:"endpoint",env:"environment value",handles:"handle",setupData:"setup data",ui:"UI values"};export function renderSharedEnvironment(n,t){const[e,...r]=[...new Set(environmentTaskIdentities(n).map(({group:o})=>o))],i=t(e);for(const o of r){const s=t(o),a=Object.keys(h).find(p=>!f(i[p],s[p]));if(a===void 0)continue;const d=l(i[a],s[a]);throw new Error(`Plain Vitest files run in one Vitest invocation, but groups ${e} and ${o} give them a different ${h[a]}${d===void 0?"":` ${d}`}; select one group with --group`)}return i}function l(n,t){if(!(!m(n)||!m(t)))return Object.keys({...n,...t}).find(e=>!f(n[e],t[e]))}export function environmentTaskIdentity({file:n,id:t,targetName:e}){return{id:t,file:n,group:e}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{normalizeOptionalString as s,asUnknownRecord as c}from"../../kernel/unknown-values.js";export function normalizeFailureDetail(t){const e=c(t);if(!e)return null;const n=s(e.kind),i=typeof e.key=="string"&&e.key.trim().length>0?e.key:null,o=s(e.title);if(!n||!i||!o)return null;const r={kind:n,key:i,title:o,count:A(e.count)??1},u=s(e.classification);u&&(r.classification=u);const a=Array.isArray(e.groupPath)?e.groupPath.filter(h=>typeof h=="string"):[];a.length>0&&(r.groupPath=a),e.sharedTitle===!0&&(r.sharedTitle=!0);const l=s(e.checkName);l&&(r.checkName=l);const p=s(e.phase);p&&(r.phase=p);const m=s(e.message);m&&(r.message=m),e.expected!==void 0&&(r.expected=f(e.expected)),e.actual!==void 0&&(r.actual=f(e.actual));const y=z(e.location);y&&(r.location=y);const g=s(e.stack);return g&&(r.stack=g),r}export function mergeFailureDetails(t){const e=new Map;for(const n of t){const i=JSON.stringify([n.kind,n.key,n.title]),o=e.get(i);if(!o){e.set(i,{...n});continue}o.count+=n.count,!o.message&&n.message&&(o.message=n.message)}return[...e.values()].sort((n,i)=>n.kind.localeCompare(i.kind)||n.key.localeCompare(i.key)||n.title.localeCompare(i.title))}export function collectFailureDetailsFromRuntimeArtifacts(t){const e=[];for(const n of Array.isArray(t)?t:[]){const i=c(n);if(!i||i.kind!=="testkit.failure-details")continue;const o=c(i.data);if(!o)continue;const r=s(o.phase);for(const u of Array.isArray(o.failures)?o.failures:[]){const a=c(u);if(!a)continue;const l=normalizeFailureDetail({...a,phase:a.phase||r||null});l&&e.push(l)}}return mergeFailureDetails(e)}function A(t){return typeof t!="number"||!Number.isInteger(t)||t<=0?null:t}function z(t){if(!c(t))return null;const e=f(t);return k(e)?e:null}function f(t){try{const e=JSON.stringify(t);if(typeof e!="string")return String(t);const n=JSON.parse(e);return d(n)?n:String(t)}catch{return String(t)}}function d(t){return t===null||typeof t=="boolean"||typeof t=="number"||typeof t=="string"?!0:Array.isArray(t)?t.every(d):k(t)}function k(t){const e=c(t);return e!==null&&Object.values(e).every(d)}
|
package/dist/app/run/live-run.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{finalizeServiceResult as
|
|
1
|
+
import{finalizeServiceResult as v}from"./results.js";import{buildLiveRunArtifact as S}from"../../evidence/reporting.js";import{writeLiveRunArtifact as R}from"../../evidence/index.js";export function createLiveSnapshotWriter({productDir:e,runId:i,configs:o,trackers:u,startedAt:r,execution:l,workerState:s,selection:t,archiveConfig:p=null,declaredEnvironmentKeys:f=[],metadata:m,environmentRecord:g,operationTimingRegistry:c=null,reporter:y=null}){return()=>{const a=Date.now(),w=o.map(n=>v(u.get(n.name),r,a));try{R(e,S({productDir:e,runId:i,results:w,startedAt:r,updatedAt:a,execution:l,workerCount:s.workerCount,typeValues:t.typeValues,suiteSelectors:t.suiteSelectors,fileNames:t.fileNames,groupFilter:t.groupFilter,planning:t.planning||null,archiveConfig:p,declaredEnvironmentKeys:f,metadata:m,environment:g.snapshot(),operationTimings:c?.listOperations()||[]}))}catch(n){y?.warning?.(`Live run artifact update skipped: ${h(b(n))}`)}}}function b(e){return(typeof e=="object"&&e!==null||typeof e=="function")&&Reflect.get(e,"message")||e}function h(e){if(typeof e=="symbol")throw new TypeError("Cannot convert a Symbol value to a string");return String(e)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveRuntimeConfigs as ce}from"../../config/loader/dependencies.js";import{buildRuntimeGraphs as me,claimNextTask as fe,collectSuites as de}from"./planning.js";import{buildRunPlanningMetadata as pe,buildScheduledQueue as ge}from"./scheduler/index.js";import{addTrackerError as U,buildServiceTrackers as ke,finalizeServiceResult as ee,recordGraphError as ve,recordTaskOutcome as he,summarizeDbBackend as Se}from"./results.js";import{loadTimings as Re,saveTimings as Ce,writeRunArtifact as ye}from"../../evidence/index.js";import{createRunEnvironmentRecord as we}from"../../evidence/environment-record.js";import{createRunLogRegistry as Fe}from"../../evidence/logs.js";import{createOperationTimingRegistry as Ae,timeOperation as D}from"../../evidence/operation-timings.js";import{createRunReporterFromListener as Ee}from"./run-events.js";import{createSetupOperationRegistry as xe}from"../../evidence/setup-progress.js";import{createLocalRunEnvironment as be}from"../../environment/run-environment.js";import{createConfigDrivenEnvironments as Ie}from"../environments/config-driven.js";import{declaresProvisioning as Te,holdBeforeRelease as ze,routeEnvironments as Oe}from"../environments/routing.js";import{createSuppliedEnvironments as qe}from"../environments/supplied.js";import{resolveServiceCwd as Me}from"../../config/loader/index.js";import{createTaskLeases as Le}from"./task-leases.js";import{createTaskLocks as De}from"./scheduler/locks.js";import{readPackageMetadata as je,safeHostname as Ne,safeUsername as Pe}from"../../process/host/metadata.js";import{collectGitMetadata as Ge}from"../../repo/metadata.js";import{resolveExecutionConfig as Ke}from"../../config/loader/decode-execution.js";import"../../environment/run-environment.js";import{createEngineManager as Be}from"../../engines/factory.js";import{createWorker as We,runWorker as $e}from"./worker-loop.js";import{ensureRequestedFilesMatch as Qe}from"./run-guards.js";import{createLiveSnapshotWriter as Ue}from"./live-run.js";import{finalizeRunArtifacts as Ve}from"./run-finalization.js";import{buildRunArtifact as He}from"../../evidence/reporting.js";import{createOperationReporterBridge as _e}from"./operation-progress.js";import{formatError as V,serializeError as te}from"../../kernel/error-serialization.js";export async function runAll(e,a,d,t,k=e){const v=t.fileNames||[];Qe(e,a,d,v);const i=e[0]?.productDir||process.cwd(),p=be(i),b=Be(i),F=new Map(k.map(r=>[r.name,r])),h=Date.now(),g=e[0]?.artifacts??null,z=[...new Set(e.flatMap(r=>Object.keys(r.testkit.serviceEnv)))].sort(),H={git:await Ge(i),host:{hostname:Ne(),username:Pe()},testkitVersion:je().version},S=t.onEvent?Ee(t.onEvent,{debug:t.debug}):null,A=Fe(i),R={workerCount:0,runtimeInstanceCount:0,runtimeStats:[]},O=resolveRunExecutionConfig(e[0],t),j=collectServicePlans(e,F,a,d,t,O,S);S?.setServicePlans?.(j);const E=ke(j,h),ne=d.map(r=>({...r})),N={typeValues:a,suiteSelectors:ne,fileNames:v,serviceFilter:t.serviceFilter||null,planning:null};let m=()=>{};const P=we({onChange:()=>{m()}}),ie=_e(S),x=Ae({onChange:r=>{ie(r),m()}}),G=xe({logRegistry:A,onChange:()=>{m()}}),q=j.filter(r=>!r.skipped),_=t.environments?.supplied??{},K=new Set(q.filter(r=>!Object.hasOwn(_,r.config.name)&&Te(r.runtimeConfigs)).map(r=>r.runtimeKey));let l;const n=await p.start({keepAlive:!0,localInfrastructure:K.size>0,resetResultsBeforePublish:!0});m=Ue({productDir:i,runId:n.runId,configs:e,trackers:E,startedAt:h,execution:O,workerState:R,selection:N,archiveConfig:g,declaredEnvironmentKeys:z,metadata:H,environmentRecord:P,logRegistry:A,setupRegistry:G,operationTimingRegistry:x,reporter:S});const M={artifacts:null},ae=async(r,f)=>(n.beginFinalization(),await n.finish(r,c=>{const s=f(c);return M.artifacts={runArtifact:s.runArtifact},s},"normal"));let C,I;const J=(r,f,o)=>({productDir:i,runId:n.runId,results:r,startedAt:h,finishedAt:f,execution:O,workerCount:R.workerCount,runtimeInstanceCount:R.runtimeInstanceCount,runtimeStats:R.runtimeStats,selection:N,archiveConfig:g,declaredEnvironmentKeys:z,metadata:H,environmentRecord:P,logRegistry:A,setupRegistry:G,operationTimingRegistry:x,reporter:S,runInterruptReason:n.getInterruptReason(),runStatus:o,publishRunFinalization:ae});m();let y=null;try{try{if(q.length>0){const o=Re(i),{graphs:c,queue:s}=await D(x,{name:"testkit.plan",kind:"planning",summary:"plan test execution",scope:{serviceCount:q.length}},()=>{const u=me(q),w=ge(q,u,{timings:o});return{graphs:u,queue:w}});N.planning=pe(s,c),m(),S?.setTotalFileCount?.(s.length),R.workerCount=Math.max(1,Math.min(O.taskConcurrency,s.length));const L=c.filter(u=>K.has(u.key));R.runtimeInstanceCount=L.reduce((u,w)=>u+w.instanceCount,0);const X=Array.from({length:R.workerCount},(u,w)=>We(w+1,i));L.length>0&&n.provision(L,{reporter:S,environmentRecord:P,logRegistry:A,setupRegistry:G,operationTimingRegistry:x,skipSchemaSourceVerify:t.skipSchemaSourceVerify});const se=Ie(n),oe=qe(Object.fromEntries(e.map(u=>[u.name,Me(i,u.testkit.local?.cwd)])),_),Y=Le(i),ue={runId:n.runId,signal:n.signal,isStopRequested:()=>n.isStopRequested(),environments:Xe(Oe(new Map(c.map(u=>[u.key,K.has(u.key)?se:oe]))),t.environments?.hold),leases:Y,locks:De(),request:Ye(i,e,O)},Z=[];try{const w=(await D(x,{name:"testkit.execute",kind:"execution",summary:"execute local worker queue",scope:{workerCount:X.length,taskCount:s.length}},async()=>Promise.allSettled(X.map(B=>$e(B,s,ue,b,E,Z,fe,(T,W,$,Q)=>{he(T,W,$,Q),m()},(T,W,$,Q,le)=>{ve(T,W,$,Q,le),m()},S))))).flatMap(workerResultErrorsForOrchestrator);for(const B of w)for(const T of E.values())T.skipped||U(T,B);w.length>0&&m(),R.runtimeStats=n.getStats(),m()}finally{L.length>0&&await D(x,{name:"testkit.cleanup",kind:"cleanup",summary:"stop managed runtimes and services"},()=>n.cleanupAll()),Y.close()}Ce(i,o,Z)}}catch(o){y=te(o);const c=y.message||V(o);for(const s of E.values())s.skipped||U(s,c);m()}l=y===null?0:n.isStopRequested()?130:1,I=Date.now(),C=e.map(o=>ee(E.get(o.name),h,I));const r=resolveRunGateFailure(C,t.allowEmpty===!0);await D(x,{name:"testkit.collect",kind:"collection",summary:"close and collect run logs"},()=>A.closeAll());const f=await Ve(J(C,I,n.isStopRequested()?"interrupted":y===null&&r===null?null:"failed"));return y!==null&&(l=1),C.some(o=>o.failed||o.infraFailed)&&(l=1),r!==null&&(l=1),f.shouldFailArchivePublication&&(l=1),f.shouldFailArchiveCleanup&&(l=1),(f.runArtifact.run.status==="interrupted"||n.isStopRequested()||n.committedFinalization?.artifactStatus==="interrupted")&&(l=Math.max(l,130)),{runArtifact:f.runArtifact,results:C,exitCode:l,...y===null?{}:{failure:y}}}catch(r){const f=te(r),o=f.message||V(r);for(const s of E.values())s.skipped||U(s,o);m(),n.beginFinalization(),l=n.isStopRequested()||n.committedFinalization?.artifactStatus==="interrupted"?130:1,I=Date.now(),C=e.map(s=>ee(E.get(s.name),h,I)),await re(A);let c=M.artifacts;if(c===null)try{c=await Je(J(C,I,n.isStopRequested()?"interrupted":"failed"),n,M,f)}catch{if(M.artifacts===null)throw r;c=M.artifacts}return(c.runArtifact.run.status==="interrupted"||n.isStopRequested()||n.committedFinalization?.artifactStatus==="interrupted")&&(l=Math.max(l,130)),{runArtifact:c.runArtifact,results:C,exitCode:l,failure:y??f}}finally{n.dispose(),await re(A)}}async function Je(e,a,d,t){return a.finish("failed",k=>{const v=k.artifactStatus==="interrupted"?k:{artifactStatus:"failed",interruptReason:null},i=e.declaredEnvironmentKeys??[],p=He({productDir:e.productDir,runId:e.runId,results:e.results,startedAt:e.startedAt,finishedAt:e.finishedAt,execution:e.execution,workerCount:e.workerCount,runtimeInstanceCount:e.runtimeInstanceCount,runtimeStats:e.runtimeStats,typeValues:e.selection.typeValues,suiteSelectors:e.selection.suiteSelectors,fileNames:e.selection.fileNames,serviceFilter:e.selection.serviceFilter,planning:e.selection.planning??null,archiveConfig:e.archiveConfig,declaredEnvironmentKeys:i,metadata:e.metadata,summarizeDbBackend:Se,environmentServices:e.environmentRecord.listServices(),serviceLogs:e.logRegistry.listServiceLogs(),setupLogs:e.logRegistry.listSetupLogs(),setupOperations:e.setupRegistry.listOperations(),operationTimings:e.operationTimingRegistry?.listOperations()??[],runInterruptReason:v.interruptReason,runStatus:v.artifactStatus});p.finalizationFailure={...t};const F={runArtifact:ye(e.productDir,p,{archiveConfig:e.archiveConfig,declaredEnvironmentKeys:i})};return d.artifacts=F,F},"recovery")}async function re(e){try{await e.closeAll()}catch{}}export function workerResultErrorsForOrchestrator(e){return e.status==="rejected"?[V(e.reason)]:[...new Set(e.value.unpersistedErrors)]}export function resolveRunGateFailure(e,a=!1){return e.some(t=>t.failed)?"test failure":e.some(t=>t.infraFailed)?"test infrastructure failure":e.some(t=>t.notRunFileCount>0)?"one or more required test files did not run":e.some(t=>t.skippedFileCount>0)?"one or more selected test files were skipped":e.reduce((t,k)=>t+k.completedFileCount,0)===0&&!a?"no runnable test files executed":null}function Xe(e,a){return a===void 0?e:ze(e,a)}function Ye(e,a,d){return{productDir:e,fileTimeoutSeconds:d.fileTimeoutSeconds,engineConfigurations:Object.fromEntries(a.flatMap(t=>Object.entries(t.engineConfigurations??{})))}}export function resolveRunExecutionConfig(e,a){return Ke({cli:{fileTimeoutSeconds:a.fileTimeoutSeconds,taskConcurrency:a.taskConcurrency},repo:e?{fileTimeoutSeconds:e.testkit.execution.fileTimeoutSeconds,taskConcurrency:e.testkit.execution.taskConcurrency}:void 0})}export function collectServicePlans(e,a,d,t,k,v,i=null){return e.map(p=>{const b=de(p,d,t,k.fileNames||[],k);if(b.length===0)return i?.serviceSkipped?.(p,`no matching files (types=${d.join(",")||"all"} suites=${t.map(g=>g.raw).join(",")||"all"} files=${(k.fileNames||[]).join(",")||"all"})`),{config:p,execution:v,skipped:!0,suites:[],runtimeConfigs:[],runtimeNames:[],runtimeKey:null};for(const g of b)for(const z of g.skippedFiles)i?.plannedSkip?.({serviceName:p.name,testType:g.testType,engineId:g.engineId,profileId:g.profileId,file:z.path,reason:z.reason});const F=ce(p,a),h=F.map(g=>g.name).sort();return{config:p,execution:v,skipped:!1,suites:b,runtimeConfigs:F,runtimeNames:h,runtimeKey:h.join("|")}})}
|
|
1
|
+
import{resolveRuntimeClosure as we}from"../../config/loader/dependencies.js";import{claimNextTask as Se,collectSuites as Ce}from"./planning.js";import{buildRunPlanningMetadata as Fe,buildScheduledQueue as Ee}from"./scheduler/index.js";import{addTrackerError as be,buildServiceTrackers as Ae,finalizeServiceResult as le,recordGraphError as Te,recordTaskOutcome as Ke}from"./results.js";import{loadTimings as xe,saveTimings as Me,writeRunArtifact as Ie}from"../../evidence/index.js";import{stableJson as qe}from"../../evidence/storage.js";import{createRunEnvironmentRecord as Oe}from"../../evidence/environment-record.js";import{createRunLogRegistry as Pe}from"../../evidence/logs.js";import{createOperationTimingRegistry as ze,timeOperation as U}from"../../evidence/operation-timings.js";import{createRunReporterFromListener as Ne}from"./run-events.js";import{createCallerRedaction as $e}from"./caller-redaction.js";import{createSetupOperationRegistry as je}from"../../evidence/setup-progress.js";import{createLocalRunEnvironment as De}from"../../environment/run-environment.js";import{writeRunMaintenance as Le}from"../../evidence/maintenance.js";import{createConfigDrivenEnvironments as Ge,planConfiguredCapacity as Ve}from"../environments/config-driven.js";import{declaresProvisioning as Be,declaresValues as me,holdBeforeRelease as We,routeEnvironments as Ue}from"../environments/routing.js";import{createStaticValueEnvironments as He}from"../environments/static-values.js";import{findRuntimeNodeSetupFile as Je}from"./setup/runtime-node-setup.js";import{createSuppliedEnvironments as Qe}from"../environments/supplied.js";import{environmentTaskIdentity as _e}from"./environment.js";import{createTaskLeases as Xe}from"./task-leases.js";import{createTaskLocks as Ye}from"./scheduler/locks.js";import{readPackageMetadata as Ze,safeHostname as et,safeUsername as tt}from"../../process/host/metadata.js";import{collectGitMetadata as rt}from"../../repo/metadata.js";import{resolveExecutionConfig as nt}from"../../config/loader/decode-execution.js";import{resolveTaskPolicy as it}from"../../config/loader/task-policy.js";import"../../environment/run-environment.js";import{createEngineManager as at}from"../../engines/factory.js";import{createWorker as ot,runWorker as st}from"./worker-loop.js";import{ensureRequestedFilesMatch as ct}from"./run-guards.js";import{createLiveSnapshotWriter as ut}from"./live-run.js";import{finalizeRunArtifacts as lt}from"./run-finalization.js";import{buildRunArtifact as mt}from"../../evidence/reporting.js";import{createOperationReporterBridge as ft}from"./operation-progress.js";import{formatError as P,serializeError as Y}from"../../kernel/error-serialization.js";export async function runAll(e,i,o,r,m=[]){const R=r.fileNames||[];ct(e,i,o,R);const{productDir:u}=r,p=De(u),y=at(u),v=new Map(m.map(n=>[n.name,n])),t=Date.now(),C=e[0]?.artifacts??null,b=[...new Set(e.flatMap(n=>n.uses.flatMap(l=>Object.keys(v.get(l)?.testkit.serviceEnv??{}))))].sort(),f={git:await rt(u),host:{hostname:et(),username:tt()},testkitVersion:Ze().version},F=e[0]?.redact??[],w=$e(process.env,F),Z=r.onEvent,k=Z?Ne(n=>{Z(w.redact(n))},{debug:r.debug}):null,M=Pe(u),B={workerCount:0},z=resolveRunExecutionConfig(e[0],r),W=collectServicePlans(e,v,i,o,r,z,k);k?.setServicePlans?.(W);const N=Ae(W,t),$=(n,l="product")=>{for(const c of N.values())c.skipped||be(c,n,{classification:l});k?.runError?.(n)},de=o.map(n=>({...n})),H={typeValues:i,suiteSelectors:de,fileNames:R,groupFilter:r.serviceFilter||null,planning:null};let S=()=>{};const pe=ft(k),K=ze({onChange:n=>{pe(n),S()}}),ee=je({logRegistry:M,onChange:()=>{S()}}),d=Oe({logRegistry:M,redactKeys:F,setupRegistry:ee,onPublishedChange:()=>{S()}});w.useSourceTargets(()=>d.redactionTargets()),d.recordGroups(W.map(n=>({dbBackend:n.dbBackend,name:n.config.name})));const J=W.filter(n=>!n.skipped),Q=r.environments?.supplied??{},{plans:I,provisionedGraphKeys:_,staticGraphKeys:te}=assignRuntimeGraphs(J,new Set(Object.keys(Q)));let g;const s=await p.start({keepAlive:!0,localInfrastructure:_.size>0,redactKeys:F,redactionTargets:()=>d.redactionTargets(),resetResultsBeforePublish:!0});S=ut({productDir:u,runId:s.runId,configs:e,trackers:N,startedAt:t,execution:z,workerState:B,selection:H,archiveConfig:C,declaredEnvironmentKeys:b,metadata:f,environmentRecord:d,operationTimingRegistry:K,reporter:k});const j={artifacts:null},D={result:null},re=n=>{const l=w.redact(n);try{return Le(u,s.runId,l),l}catch(c){const h=`Could not write the maintenance record: ${w.redact(P(c))}`;return{...l,status:"failed",error:l.error===null?h:`${l.error}; ${h}`}}},ne=n=>(D.result=n.maintenance,n.maintenance.status==="failed"&&k?.warning?.(`Post-run maintenance failed: ${n.maintenance.error??"unknown error"}`),n.sealed),ge=async(n,l)=>(s.beginFinalization(),ne(await s.finish(n,c=>{const h=l(c);return j.artifacts={runArtifact:h.runArtifact},h},"normal",re)));let A,q;const ie=(n,l,c)=>({productDir:u,runId:s.runId,results:n,startedAt:t,finishedAt:l,execution:z,workerCount:B.workerCount,selection:H,archiveConfig:C,declaredEnvironmentKeys:b,metadata:f,environmentRecord:d,operationTimingRegistry:K,reporter:k,runInterruptReason:s.getInterruptReason(),runStatus:c,publishRunFinalization:ge});S();let T=null,ae=Symbol("no release failure");try{try{if(J.length>0){const c=xe(u),{capacity:h,queue:L}=await U(K,{name:"testkit.plan",kind:"planning",summary:"plan test execution",scope:{serviceCount:J.length}},()=>({capacity:Ve(I.filter(a=>_.has(a.runtimeKey))),queue:Ee(I.map(a=>prepareSchedulerPlan(a,Object.hasOwn(Q,a.config.name)?()=>!1:E=>Je(u,E)!==null)),{timings:c})}));H.planning=Fe(L),d.recordCapacity(h),k?.setTotalFileCount?.(L.length),B.workerCount=Math.max(1,Math.min(z.taskConcurrency,L.length));const oe=Array.from({length:B.workerCount},(a,E)=>ot(E+1,u));h.graphs.length>0&&s.provision(h.graphs,{reporter:k,environmentRecord:d,logRegistry:M,setupRegistry:ee,operationTimingRegistry:K,skipSchemaSourceVerify:r.skipSchemaSourceVerify});const he=Ge(s,new Map(I.map(a=>[a.config.name,a.config.uses])),u,d),ye=He(new Map(I.filter(a=>te.has(a.runtimeKey)).map(a=>[a.config.name,a.uses])),u,d),ve=Qe(Q,{productDir:u,record:d,signal:s.signal}),se=Xe(u),ce=a=>_.has(a)?{kind:"configured",entry:he}:te.has(a)?{kind:"static",entry:ye}:{kind:"supplied",entry:ve},ke={recordRunError:$,runId:s.runId,signal:s.signal,isStopRequested:()=>s.isStopRequested(),environments:yt(Ue(new Map(I.map(({runtimeKey:a})=>[a,ce(a).entry]))),r.environments?.hold),leases:gt(se,d),locks:Ye(),request:vt(u,e,z,r.vitest),environmentKeys:new Map(I.map(({config:a,runtimeKey:E})=>{const{entry:G,kind:O}=ce(E),x=G.preview?.(a.name)??null;return[a.name,qe(x===null?[O,E,a.name]:[O,x])]}))},ue=[];try{const E=(await U(K,{name:"testkit.execute",kind:"execution",summary:"execute local worker queue",scope:{workerCount:oe.length,taskCount:L.length}},async()=>Promise.allSettled(oe.map(G=>st(G,L,ke,y,N,ue,Se,(O,x,V,X)=>{Ke(O,x,V,X),V.environmentValuesMissing!==void 0&&d.recordMissingValues(_e(x),V.environmentValuesMissing),S()},(O,x,V,X,Re)=>{Te(O,x,V,X,Re),S()},k))))).flatMap(workerResultErrorsForOrchestrator);for(const G of E)$(G);E.length>0&&S(),d.recordRuntimeStats(s.getStats())}finally{h.graphs.length>0&&await U(K,{name:"testkit.cleanup",kind:"cleanup",summary:"stop managed runtimes and services"},()=>ht(d,()=>s.cleanupAll()).catch(a=>{throw ae=a,$(Y(a).message||P(a),"infra"),a})),se.close()}Me(u,c,ue)}}catch(c){T=Y(c),c!==ae&&$(T.message||P(c)),S()}g=T===null?0:s.isStopRequested()?130:1,q=Date.now(),A=e.map(c=>le(N.get(c.name),t,q));const n=resolveRunGateFailure(A,r.allowEmpty===!0);await U(K,{name:"testkit.collect",kind:"collection",summary:"close and collect run logs"},()=>M.closeAll());const l=await lt(ie(A,q,s.isStopRequested()?"interrupted":T===null&&n===null?null:"failed"));return T!==null&&(g=1),A.some(c=>c.failed||c.infraFailed)&&(g=1),n!==null&&(g=1),l.shouldFailArchivePublication&&(g=1),l.shouldFailArchiveCleanup&&(g=1),(l.runArtifact.run.status==="interrupted"||s.isStopRequested()||s.committedFinalization?.artifactStatus==="interrupted")&&(g=Math.max(g,130)),{runArtifact:l.runArtifact,results:w.redact(A),exitCode:g,...T===null?{}:{failure:w.redact(T)},...D.result===null?{}:{maintenance:w.redact(D.result)}}}catch(n){const l=Y(n);$(l.message||P(n),"infra"),S(),s.beginFinalization(),g=s.isStopRequested()||s.committedFinalization?.artifactStatus==="interrupted"?130:1,q=Date.now(),A=e.map(h=>le(N.get(h.name),t,q)),await fe(M);let c=j.artifacts;if(c===null)try{c=await dt(ie(A,q,s.isStopRequested()?"interrupted":"failed"),s,j,l,re,ne)}catch{if(j.artifacts===null)throw n;c=j.artifacts}return(c.runArtifact.run.status==="interrupted"||s.isStopRequested()||s.committedFinalization?.artifactStatus==="interrupted")&&(g=Math.max(g,130)),{runArtifact:c.runArtifact,results:w.redact(A),exitCode:g,failure:w.redact(T??l),...D.result===null?{}:{maintenance:w.redact(D.result)}}}finally{s.dispose(),await fe(M),pt(d,r.environments?.observeRecord,k)}}async function dt(e,i,o,r,m,R){const u=await i.finish("failed",p=>{const y=p.artifactStatus==="interrupted"?p:{artifactStatus:"failed",interruptReason:null},v=e.declaredEnvironmentKeys??[],t=mt({productDir:e.productDir,runId:e.runId,results:e.results,startedAt:e.startedAt,finishedAt:e.finishedAt,execution:e.execution,workerCount:e.workerCount,typeValues:e.selection.typeValues,suiteSelectors:e.selection.suiteSelectors,fileNames:e.selection.fileNames,groupFilter:e.selection.groupFilter,planning:e.selection.planning??null,archiveConfig:e.archiveConfig,declaredEnvironmentKeys:v,metadata:e.metadata,environment:e.environmentRecord.snapshot(),operationTimings:e.operationTimingRegistry?.listOperations()??[],runInterruptReason:y.interruptReason,runStatus:y.artifactStatus});t.finalizationFailure={...r};const b={runArtifact:Ie(e.productDir,t,{archiveConfig:e.archiveConfig,declaredEnvironmentKeys:v,redactKeys:e.environmentRecord.redactKeys,redactionTargets:e.environmentRecord.redactionTargets()})};return o.artifacts=b,b},"recovery",m);return R(u)}function pt(e,i,o){if(i!==void 0)try{i(e.snapshot())}catch(r){try{o?.warning?.(`Environment record observer failed: ${P(r)}`)}catch{}}}function gt(e,i){return{...e,remove(o){const r=i.releaseFor(o.id);try{e.remove(o)}catch(m){throw r?.releaseFailed(m),m}r?.released()}}}async function ht(e,i){try{await i()}catch(o){throw e.recordCleanup(o),o}e.recordCleanup(null)}async function fe(e){try{await e.closeAll()}catch{}}export function workerResultErrorsForOrchestrator(e){return e.status==="rejected"?[P(e.reason)]:[...new Set(e.value.unpersistedErrors)]}export function resolveRunGateFailure(e,i=!1){return e.some(r=>r.failed)?"test failure":e.some(r=>r.infraFailed)?"test infrastructure failure":e.some(r=>r.notRunFileCount>0)?"one or more required test files did not run":e.some(r=>r.skippedFileCount>0)?"one or more selected test files were skipped":e.reduce((r,m)=>r+m.completedFileCount,0)===0&&!i?"no runnable test files executed":null}function yt(e,i){return i===void 0?e:We(e,i)}function vt(e,i,o,r){return{vitest:r,productDir:e,fileTimeoutSeconds:o.fileTimeoutSeconds,ownerRoots:Object.fromEntries(i.map(m=>[m.name,m.roots]))}}export function resolveRunExecutionConfig(e,i){return nt({cli:{fileTimeoutSeconds:i.fileTimeoutSeconds,taskConcurrency:i.taskConcurrency},repo:e?{fileTimeoutSeconds:e.testkit.execution.fileTimeoutSeconds,taskConcurrency:e.testkit.execution.taskConcurrency}:void 0})}export function assignRuntimeGraphs(e,i){const o=e.filter(t=>t.suites.some(C=>C.files.length>0)),r=new Set(o.filter(t=>!i.has(t.config.name)&&Be(t.runtimeConfigs))),m=new Set([...r].map(t=>t.runtimeKey)),R=t=>!r.has(t)&&!i.has(t.config.name)&&me(t.runtimeConfigs),u=new Set(o.filter(t=>R(t)&&t.runtimeKey!=="").map(t=>t.runtimeKey)),p=new Set(o.map(t=>t.runtimeKey)),y=t=>t.runtimeKey!==""&&!m.has(t.runtimeKey)&&(R(t)||!u.has(t.runtimeKey))?t.runtimeKey:p.has(t.config.name)?`group:${t.config.name}`:t.config.name,v=o.map(t=>r.has(t)?t:{...t,runtimeKey:y(t)});return{plans:v,provisionedGraphKeys:m,staticGraphKeys:new Set(v.filter(t=>!m.has(t.runtimeKey)&&!i.has(t.config.name)&&me(t.runtimeConfigs)).map(t=>t.runtimeKey))}}export function prepareSchedulerPlan(e,i){return{graphKey:e.runtimeKey,owner:e.config.name,suites:e.suites.map(o=>({...o,tasks:o.files.map(r=>({file:r,hasSetup:i(r),...it(e.config.testkit,o,r)}))}))}}export function collectServicePlans(e,i,o,r,m,R,u=null){return e.map(p=>{const y=p.uses.map(f=>{const F=i.get(f);if(F===void 0)throw new Error(`Group "${p.name}" uses unknown service "${f}"`);return F}),v=y.some(f=>f.testkit.database!==void 0)?"local":null,t=Ce(p,o,r,m.fileNames||[],m);if(t.length===0)return u?.serviceSkipped?.(p,`no matching files (types=${o.join(",")||"all"} suites=${r.map(f=>f.raw).join(",")||"all"} files=${(m.fileNames||[]).join(",")||"all"})`),{config:p,dbBackend:v,execution:R,skipped:!0,suites:[],runtimeConfigs:[],runtimeNames:[],runtimeKey:null,uses:y};for(const f of t)for(const F of f.skippedFiles)u?.plannedSkip?.({serviceName:p.name,testType:f.testType,engineId:f.engineId,profileId:f.profileId,file:F.path,reason:F.reason});const C=we(y,i),b=C.map(f=>f.name).sort();return{config:p,dbBackend:v,execution:R,skipped:!1,suites:t,runtimeConfigs:C,runtimeNames:b,runtimeKey:b.join("|"),uses:y}})}
|
package/dist/app/run/planning.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{matchesSelectedTypes as x,matchesSuiteSelectors as d}from"../../domain/suite-selection.js";import{PUBLIC_TEST_TYPES as m}from"../../domain/identifiers.js";import{resolveExecutionProfile as S}from"../../engines/catalog.js";export function collectSuites(e,l,a,o=[],r={}){const t=new Set(o.map(h)),f=[];let c=0;for(const n of[...e.suites].sort((i,s)=>k(i.testType)-k(s.testType))){const i=S(n),s=t.size===0?n.files:n.files.filter(g=>t.has(h(g)));if(!x(n.testType,l)||!d(n.testType,n.name,a)||s.length===0)continue;const{files:p,skippedFiles:u}=y(e,n.testType,n.name,s,r);f.push({...n,files:p,skippedFiles:u,orderIndex:c,weight:n.testkit?.weight||(i.taskBatching==="compatible"?Math.max(2,Math.max(1,p.length)):Math.max(1,p.length)),totalFileCount:s.length}),c+=1}return f}function k(e){return e===void 0?m.length:m.indexOf(e)}export function claimNextTask(e,l,a=()=>!0){if(e.length===0)return null;const o=[],r=[];for(let t=0;t<e.length;t+=1)l&&e[t].graphKey===l?o.push(t):r.push(t);for(const t of[...o,...r])if(a(e[t]))return e.splice(t,1)[0];return null}function y(e,l,a,o,r={}){if(r.ignoreSkipRules)return{files:o,skippedFiles:[]};const t=e.testkit.skip,f=(t?.suites||[]).find(i=>d(l,a,[i.selector]))?.reason||null,c=[],n=[];for(const i of o){const s=h(i),u=(e.testkit.fileMetadataByPath?.get(s)||null)?.skipReason||t?.fileReasonByPath?.get(s)||f;if(u){n.push({path:s,reason:u});continue}c.push(i)}return{files:c,skippedFiles:n}}function h(e){return String(e).split("\\").join("/")}
|
package/dist/app/run/request.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveProductDir as
|
|
1
|
+
import{resolveProductDir as y}from"../../process/files/product-dir.js";import{loadRunConfigs as g}from"../../config/loader/managed-configs.js";import{parseFileTimeoutOption as k}from"../../domain/file-timeout.js";import{parseSuiteOption as F,parseTypeOption as w}from"../../domain/suite-selection.js";import{resolveRequestedFiles as O}from"../file-selection.js";import{parseTaskConcurrencyOptions as R}from"../../config/loader/decode-execution.js";import{readEnvironmentFile as T}from"../environments/environment-file.js";import{hasSuppliedInput as h,projectSuppliedEnvironment as E,resolveSuppliedInput as V,suppliedBindings as j}from"../environments/supplied-input.js";import{resolveVitestSelection as C}from"../../engines/catalog.js";export async function buildRunRequest(e,l=null,o=process.cwd(),n=process.cwd(),p=process.env){const a=R(e.taskConcurrency,e.workers),f=e.fileTimeoutSeconds==null?null:k(e.fileTimeoutSeconds),c=w(e.type,l),u=F(e.suite),S=e.file??[],r=y(o,e.dir),m=O(S,r,n),s=e.supplied??{},i=h(s)?V(s,s.environmentFile===void 0?null:T(s.environmentFile,n),p):null,t=C(e.vitest??{},r,p),{groups:d,services:v}=await g({dir:r,group:e.group,testSelection:{group:e.group,fileNames:m,typeValues:c,suiteSelectors:u},vitest:i===null?t:{...t,host:{...t.host,...j(i)}}});return{groups:d,services:v,productDir:r,supplied:i===null?null:I(i,d),typeValues:c,suiteSelectors:u,runOptions:{vitest:t,allowEmpty:e.allowEmpty,fileNames:m,taskConcurrency:a,fileTimeoutSeconds:f,serviceFilter:e.group||null,ignoreSkipRules:e.ignoreSkipRules,skipSchemaSourceVerify:e.skipSchemaSourceVerify}}}function I(e,l){return Object.fromEntries(l.map(o=>[o.name,E(e,o.uses)]))}
|
package/dist/app/run/results.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{mergeFailureDetails as b}from"./failure-details.js";import{posixPath as g}from"../../process/files/paths.js";export function buildServiceTrackers(e,
|
|
1
|
+
import{suiteKey as x}from"../../domain/suite-selection.js";import{mergeFailureDetails as b}from"./failure-details.js";import{posixPath as g}from"../../process/files/paths.js";export function buildServiceTrackers(e,r){const o=new Map;for(const t of e){const a=t.skipped?[]:t.suites.map(w),l={name:t.config.name,skipped:t.skipped===!0,suiteCount:a.length,suites:a,suitesByKey:new Map(a.map(n=>[n.key,n])),errors:[],errorSet:new Set,errorDetails:[],errorDetailSet:new Set,startedAt:r,firstTaskAt:null,lastTaskAt:null,totalTaskDurationMs:0};o.set(t.config.name,l)}return o}function w(e){const r=new Map;for(const o of e.files){const t=g(o);r.set(t,F(t,"not_run",null))}for(const o of e.skippedFiles??[])r.set(o.path,F(o.path,"skipped",o.reason));return{key:x(e),name:e.name,testType:e.testType,engineId:e.engineId,profileId:e.profileId,orderIndex:e.orderIndex,failedFiles:[],failedFileSet:new Set,fileResultsByPath:r,durationMs:0,error:null}}function F(e,r,o){return{path:e,failed:r==="failed",durationMs:0,error:null,reason:o,status:r,artifacts:[],infraFailed:!1,blockedByRuntime:!1,failureDetails:[],runtimeIsolation:null,runtimeBatch:null,runtimeResets:[]}}export function recordTaskOutcome(e,r,o,t=Date.now()){const a=e.get(r.serviceName);if(!a||a.skipped)return;const l=a.suitesByKey.get(r.suiteKey);if(!l)return;const n=P(o,r,t);a.firstTaskAt=a.firstTaskAt===null?n.startedAt:Math.min(a.firstTaskAt,n.startedAt),a.lastTaskAt=a.lastTaskAt===null?n.finishedAt:Math.max(a.lastTaskAt,n.finishedAt),a.totalTaskDurationMs+=n.durationMs,l.durationMs+=n.durationMs;const f=g(r.file),s=l.fileResultsByPath.get(f),d=s??F(f,n.status,n.reason);d.failed=n.status==="failed",d.durationMs=n.durationMs,d.error=n.error,d.reason=n.reason,d.status=n.status,d.artifacts=n.artifacts,d.infraFailed=n.infraFailed,d.blockedByRuntime=n.blockedByRuntime,d.failureDetails=n.failureDetails,d.runtimeIsolation=n.runtimeIsolation,d.runtimeBatch=n.runtimeBatch,d.runtimeResets=n.runtimeResets,s||l.fileResultsByPath.set(f,{...d}),n.status==="failed"&&!l.failedFileSet.has(r.file)&&(l.failedFileSet.add(r.file),l.failedFiles.push(r.file)),n.error&&!l.error&&(l.error=n.error)}function P(e,r,o){const t=e.durationMs??0,a=e.finishedAt??o;return{artifacts:e.artifacts??[],blockedByRuntime:e.blockedByRuntime??!1,durationMs:t,error:e.error??null,failureDetails:b(e.failureDetails??[]),finishedAt:a,infraFailed:e.infraFailed??!1,reason:e.reason??null,runtimeBatch:e.runtimeBatch??null,runtimeIsolation:e.runtimeIsolation??r.runtimeIsolation??null,runtimeResets:e.runtimeResets??[],startedAt:e.startedAt??Math.max(0,a-t),status:e.status}}export function recordGraphError(e,r,o,t=Date.now(),a={}){const l=r?.targetNames||[];for(const n of l){const f=e.get(n);f&&!f.skipped&&(addTrackerError(f,o,a),f.lastTaskAt=t)}}export function addTrackerError(e,r,o={}){const t=r.trim();if(!t)return;const a=o.classification??"product";e.errorSet.has(t)||(e.errorSet.add(t),e.errors.push(t));const l=`${a}\0${t}`;e.errorDetailSet.has(l)||(e.errorDetailSet.add(l),e.errorDetails.push({message:t,classification:a}))}export function finalizeServiceResult(e,r,o){if(!e||e.skipped)return{name:e?.name||"unknown",failed:!1,skipped:!0,suiteCount:0,completedSuiteCount:0,skippedSuiteCount:0,failedSuiteCount:0,totalFileCount:0,completedFileCount:0,passedFileCount:0,failedFileCount:0,skippedFileCount:0,notRunFileCount:0,durationMs:0,totalTaskDurationMs:0,suites:[],errors:[],errorDetails:[],infraFailed:!1,blockedByRuntime:!1};const t=[...e.suites].sort((i,u)=>i.orderIndex-u.orderIndex||i.name.localeCompare(u.name)).map(i=>z(i)),a=t.filter(i=>i.completedFileCount+i.skippedFileCount===i.fileCount).length,l=t.filter(i=>i.skippedFileCount===i.fileCount&&i.fileCount>0).length,n=t.filter(i=>i.failedFileCount>0).length,f=t.reduce((i,u)=>i+u.fileCount,0),s=t.reduce((i,u)=>i+u.completedFileCount,0),d=t.reduce((i,u)=>i+u.failedFileCount,0),y=t.reduce((i,u)=>i+u.passedFileCount,0),C=t.reduce((i,u)=>i+u.skippedFileCount,0),p=f-s-C,m=t.reduce((i,u)=>i+u.files.filter(c=>c.infraFailed===!0).length,0),k=t.reduce((i,u)=>i+u.files.filter(c=>c.blockedByRuntime===!0).length,0),R=t.reduce((i,u)=>i+u.files.filter(c=>c.status==="cancelled"||c.status==="interrupted").length,0),T=p>0&&R===p,M=p>0&&m===p,h=e.errorDetails,B=h.filter(i=>i.classification!=="infra").length,D=h.filter(i=>i.classification==="infra").length,I=m>0||D>0,S=k>0,A=e.firstTaskAt!==null&&e.lastTaskAt!==null?Math.max(0,e.lastTaskAt-e.firstTaskAt):Math.max(0,o-r);return{name:e.name,failed:n>0||B>0||a<e.suiteCount&&!T&&!M,infraFailed:I,blockedByRuntime:S,infraFailedFileCount:m,blockedByRuntimeFileCount:k,skipped:!1,suiteCount:e.suiteCount,completedSuiteCount:a,skippedSuiteCount:l,failedSuiteCount:n,totalFileCount:f,completedFileCount:s,passedFileCount:y,failedFileCount:d,skippedFileCount:C,notRunFileCount:p,durationMs:A,totalTaskDurationMs:e.totalTaskDurationMs,suites:t,errors:e.errors,errorDetails:h}}function z(e){const r=[...e.fileResultsByPath.values()].sort((s,d)=>s.path.localeCompare(d.path)).map(s=>({path:s.path,failed:s.failed,status:s.status,durationMs:s.durationMs,error:s.error,reason:s.reason,...s.infraFailed?{infraFailed:!0}:{},...s.blockedByRuntime?{blockedByRuntime:!0}:{},...s.failureDetails.length>0?{failureDetails:s.failureDetails}:{},...s.artifacts.length>0?{artifacts:s.artifacts}:{},...s.runtimeIsolation?{runtimeIsolation:s.runtimeIsolation}:{},...s.runtimeBatch?{runtimeBatch:s.runtimeBatch}:{},...s.runtimeResets.length>0?{runtimeResets:s.runtimeResets}:{}})),o=r.length,t=r.filter(s=>s.status==="passed").length,a=r.filter(s=>s.status==="failed").length,l=r.filter(s=>s.status==="skipped").length,n=t+a,f=o-n-l;return{name:e.name,...e.testType===void 0?{}:{testType:e.testType},engineId:e.engineId,profileId:e.profileId,failed:a>0,fileCount:o,completedFileCount:n,passedFileCount:t,failedFileCount:a,skippedFileCount:l,notRunFileCount:f,failedFiles:e.failedFiles,durationMs:e.durationMs,error:e.error,files:r}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function createRunReporterFromListener(r,{debug:
|
|
1
|
+
export function createRunReporterFromListener(r,{debug:i=!1}={}){return{outputMode:i?"debug":"compact",setServicePlans(e){r({type:"run.group_plans",groups:e.map(p=>({group:p.config.name,skipped:!!p.skipped,suites:p.suites.map(n=>({name:n.name,...n.testType===void 0?{}:{testType:n.testType},engineId:n.engineId,profileId:n.profileId,files:n.files}))}))})},setTotalFileCount(e){r({type:"run.total_files",total:e})},phaseStarted(e){r({type:"run.phase_started",label:e})},toolchainResolved(e,p){r({type:"run.toolchain_resolved",service:e.serviceName,runtimeLabel:e.runtimeLabel,summary:p})},setupOperationFinished(e){e&&r({type:"run.setup_finished",operation:e})},operationStarted(e){r({type:"run.operation_started",operation:e})},operationProgress(e){r({type:"run.operation_progress",operation:e})},operationFinished(e){r({type:"run.operation_finished",operation:e})},localServiceStarting(e){r({type:"run.local_service_starting",service:e.serviceName,runtimeLabel:e.runtimeLabel,command:e.command})},serviceSkipped(e,p){r({type:"run.group_skipped",group:e.name,reason:p})},plannedSkip(e){r({type:"run.task_planned_skip",group:e.serviceName,file:e.file,...e.testType===void 0?{}:{testType:e.testType},engineId:e.engineId,profileId:e.profileId,reason:e.reason||null})},taskStarted(e,p){r({type:"run.task_started",group:e.serviceName,file:e.file,suite:e.suiteName,...e.testType===void 0?{}:{testType:e.testType},engineId:e.engineId,profileId:e.profileId,targetName:p.name})},taskFinished(e,p){r({type:"run.task_finished",group:e.serviceName,file:e.file,suite:e.suiteName,...e.testType===void 0?{}:{testType:e.testType},engineId:e.engineId,profileId:e.profileId,outcome:p})},runError(e){r({type:"run.error",message:e})},runtimeError(e,p){r({type:"run.runtime_error",group:e.serviceName,file:e.file,message:p})},warning(e){r({type:"run.warning",message:e})},writeDebugLine(e=""){r({type:"run.debug",line:e})},runSummary(e,p,n){r({type:"run.summary",results:e,durationMs:p,runStatus:n})}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveCommittedRunFinalization as
|
|
1
|
+
import{resolveCommittedRunFinalization as z}from"../../evidence/finalization.js";import{collectTestkitStorageInventory as T,writeRunArtifact as k}from"../../evidence/index.js";import{buildRunArtifact as w}from"../../evidence/reporting.js";import{isUnknownRecord as x}from"../../kernel/unknown-values.js";import{formatError as C}from"../../kernel/error-serialization.js";export async function finalizeRunArtifacts({productDir:t,runId:r,results:n,startedAt:a,finishedAt:u,execution:c,workerCount:e,selection:i,archiveConfig:d=null,declaredEnvironmentKeys:m=[],metadata:h,environmentRecord:f,operationTimingRegistry:F=null,reporter:b,runInterruptReason:g=null,runStatus:o=null,publishRunFinalization:y}){const l=w({productDir:t,runId:r,results:n,startedAt:a,finishedAt:u,execution:c,workerCount:e,typeValues:i.typeValues,suiteSelectors:i.suiteSelectors,fileNames:i.fileNames,groupFilter:i.groupFilter,planning:i.planning??null,archiveConfig:d,declaredEnvironmentKeys:m,metadata:h,environment:f.snapshot(),operationTimings:F?.listOperations()??[],runInterruptReason:g,runStatus:o}),S=O(l.storage),v=V(t);l.storage={...S??{},testkit:v};const A=o==="failed"||n.some(s=>s.failed||s.infraFailed)?"failed":"passed",R=s=>{N(l,s);const p=I({archiveConfig:d,declaredEnvironmentKeys:m,productDir:t,redactKeys:f.redactKeys,redactionTargets:f.redactionTargets(),runArtifact:l});return b?.runSummary?.(n,u-a,p.runArtifact.run.status==="interrupted"?"interrupted":p.runArtifact.run.status==="failed"?"failed":"passed"),p};return y?await y(A,R):R(z(A,{interrupted:o==="interrupted",interruptReason:o==="interrupted"?g:null}))}function I({archiveConfig:t,declaredEnvironmentKeys:r,productDir:n,redactKeys:a,redactionTargets:u,runArtifact:c}){const e=k(n,c,{archiveConfig:t,declaredEnvironmentKeys:r,redactKeys:a,redactionTargets:u});return{runArtifact:e,shouldFailArchiveCleanup:e.archive.cleanup?.status==="failed",shouldFailArchivePublication:e.archive.publication.status==="failed"&&e.archive.publication.required===!0}}function N(t,r){if(t.run.status=r.artifactStatus,r.artifactStatus!=="interrupted"){delete t.run.interruptReason;return}t.run.interruptReason=r.interruptReason??"run interrupted"}function O(t){return x(t)?t:null}function V(t){try{return T(t)}catch(r){return{status:"failed",error:C(r)}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const DEFAULT_ESTIMATE_SOURCE="default";export function estimateTask({task:
|
|
1
|
+
export const DEFAULT_ESTIMATE_SOURCE="default";export function estimateTask({task:e,suite:i,timings:n}){const t=s(n,e);return t||{durationMs:r(e,i),source:DEFAULT_ESTIMATE_SOURCE,confidence:"low",runs:0,key:null}}function r(e,i){const n=e.engineId==="playwright"?2e4:8e3,t=i.weight??1,u=Math.max(1,i.fileCount);return Math.max(1e3,Math.round(n*t/u))}function s(e,i){const n=i.timingKey;if(!n)return null;const t=e?.files[n],u=t?.durationMs||t?.avgDurationMs||0;if(u<=0)return null;const o=t?.runs??0;return{durationMs:Math.max(1,Math.round(u)),source:"timings",confidence:o>=3?"high":"medium",runs:o,key:n}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import l from"path";import{
|
|
1
|
+
import l from"path";import{resolveExecutionProfile as p}from"../../../engines/catalog.js";export function buildSchedulerTaskKey({serviceName:i,testType:o,engineId:r,profileId:e,file:t}){return p({engineId:r,profileId:e,testType:o}),[i,o??"",r,e,t.split(l.sep).join("/").replace(/^\.\/+/,"")].join("|")}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{suiteKey as f}from"../../../domain/suite-selection.js";import{buildSchedulerTaskKey as y}from"./identity.js";import{estimateTask as g}from"./estimates.js";export const SCHEDULER_POLICY="longest-estimated-duration-first",SCHEDULER_VERSION=2;export function buildScheduledQueue(i,{timings:e}={}){const n=[];let r=1;for(const o of i)for(const t of o.suites)for(const{file:m,hasSetup:c,locks:d,runtimeIsolation:l}of t.tasks){const u={id:r,graphKey:o.graphKey,targetName:o.owner,serviceName:o.owner,suiteKey:f(t),suiteName:t.name,testType:t.testType,engineId:t.engineId,profileId:t.profileId,orderIndex:t.orderIndex,file:m,hasSetup:c,locks:[...d],runtimeIsolation:l,resourceCost:1},p=y(u),a={...u,timingKey:p},s=g({task:a,suite:{...t,fileCount:t.tasks.length},timings:e});n.push({...a,estimatedDurationMs:s.durationMs,estimateSource:s.source,estimateConfidence:s.confidence,estimateRuns:s.runs,estimateKey:s.key}),r+=1}return n.sort(compareScheduledTasks).map((o,t)=>({...o,schedulerRank:t+1,schedulerPolicy:SCHEDULER_POLICY}))}export function buildRunPlanningMetadata(i){return{scheduler:{policy:SCHEDULER_POLICY,version:SCHEDULER_VERSION},tasks:(i||[]).map(e=>({rank:e.schedulerRank||null,id:e.id,group:e.serviceName,suite:e.suiteName,testType:e.testType,engineId:e.engineId,profileId:e.profileId,file:e.file,graphKey:e.graphKey,runtimeIsolation:e.runtimeIsolation,estimatedDurationMs:e.estimatedDurationMs,estimateSource:e.estimateSource,estimateConfidence:e.estimateConfidence,estimateRuns:e.estimateRuns||0,timingKey:e.timingKey}))}}export function compareScheduledTasks(i,e){return e.estimatedDurationMs-i.estimatedDurationMs||i.serviceName.localeCompare(e.serviceName)||i.suiteKey.localeCompare(e.suiteKey)||i.file.localeCompare(e.file)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isUnknownRecord as u}from"../../../kernel/unknown-values.js";export const MAX_RUNTIME_NODE_SETUP_DATA_BYTES=1024*1024,MAX_RUNTIME_NODE_SETUP_SIDECARS=16;export function isRuntimeNodeSetupWorkerRequest(e){return u(e)&&typeof e.sessionId=="string"&&e.sessionId.length>0&&typeof e.modulePath=="string"}export function isRuntimeNodeSetupParentMessage(e){return
|
|
1
|
+
import{isUnknownRecord as u}from"../../../kernel/unknown-values.js";export const MAX_RUNTIME_NODE_SETUP_DATA_BYTES=1024*1024,MAX_RUNTIME_NODE_SETUP_SIDECARS=16;export function isRuntimeNodeSetupWorkerRequest(e){return u(e)&&typeof e.sessionId=="string"&&e.sessionId.length>0&&typeof e.modulePath=="string"}export function isRuntimeNodeSetupParentMessage(e){return _(e)&&(e.type==="cleanup"||e.type==="abort"&&u(e.error)&&S(e.kind))}export function readRuntimeNodeSetupWorkerMessage(e){if(!_(e))return null;switch(e.type){case"abort-acknowledged":break;case"cleanup-started":if(!Array.isArray(e.owners))return null;break;case"cleanup-progress":if(e.owner!=="consumer"&&e.owner!=="testkit"||!Number.isSafeInteger(e.remainingCallbacks))return null;break;case"ready":if(!("setupData"in e)||!Array.isArray(e.sidecars))return null;break;case"sidecar-started":if(!u(e.sidecar))return null;break;case"setup-error":if(!u(e.error)||!S(e.kind)||!Array.isArray(e.cleanupFailures))return null;break;case"aborted":case"cleanup-complete":if(!Array.isArray(e.cleanupFailures))return null;break;default:return null}return e}function S(e){return e==="cancelled"||e==="deadline"||e==="infra"||e==="product"}function _(e){return u(e)&&typeof e.type=="string"&&typeof e.sessionId=="string"&&e.sessionId.length>0}export function serializeRuntimeNodeSetupError(e){const r=g(e,"message"),n=g(e,"name"),i=g(e,"stack");return{message:typeof r=="string"?r:e===null||typeof e!="object"&&typeof e!="function"?String(e):"Runtime node setup failed",name:typeof n=="string"&&n?n:"Error",...typeof i=="string"?{stack:i}:{}}}export function serializeRuntimeNodeSetupCleanupFailures(e){return e.map(({error:r,owner:n})=>({error:serializeRuntimeNodeSetupError(r),owner:n}))}function g(e,r){const n=new Set;try{for(;u(e)&&!n.has(e);){n.add(e);const i=Object.getOwnPropertyDescriptor(e,r);if(i)return"value"in i?i.value:void 0;e=Object.getPrototypeOf(e)}}catch{}}export function normalizeRuntimeNodeSetupData(e){const r={},n=new Set,i=[{value:e===void 0?{}:e,path:"$",target:r,key:"data"}];let h=0;const a=(p,t)=>{throw new TypeError(`Runtime node setup data at ${p} must be plain JSON: ${t}`)},y=(p,t)=>{h+=p,h>MAX_RUNTIME_NODE_SETUP_DATA_BYTES&&a(t,`must encode to no more than ${MAX_RUNTIME_NODE_SETUP_DATA_BYTES.toString()} bytes`)};for(;i.length;){const p=i.pop();if(!p)break;if("leave"in p){n.delete(p.leave);continue}const{value:t,path:s,target:b,key:k}=p;if(t===null||typeof t=="string"||typeof t=="boolean"||typeof t=="number"&&Number.isFinite(t)){y(Buffer.byteLength(JSON.stringify(t)),s),Object.defineProperty(b,k,{value:t,enumerable:!0,writable:!0,configurable:!0});continue}typeof t!="object"&&a(s,`unsupported ${typeof t} value`),n.has(t)&&a(s,"circular reference");const c=Array.isArray(t),w=Object.getPrototypeOf(t);!c&&w!==Object.prototype&&w!==null&&a(s,"expected a plain object");const l=Reflect.ownKeys(t).filter(o=>!c||o!=="length");c&&l.length!==t.length&&a(s,"sparse array or extra array properties");const R=c?[]:{};Object.defineProperty(b,k,{value:R,enumerable:!0,writable:!0,configurable:!0}),y(2+Math.max(0,l.length-1),s),n.add(t),i.push({leave:t});const m=[];for(const o of l){typeof o!="string"&&a(s,"symbol key");const f=c?`${s}[${o}]`:/^[A-Za-z_$][\w$]*$/u.test(o)?`${s}.${o}`:`${s}[${JSON.stringify(o)}]`;c&&(!/^(?:0|[1-9]\d*)$/u.test(o)||Number(o)>=t.length)&&a(f,"extra array property");const d=Object.getOwnPropertyDescriptor(t,o);(!d||!("value"in d)||!d.enumerable)&&a(f,"expected an enumerable data property"),c||y(Buffer.byteLength(JSON.stringify(o))+1,f),m.push({value:d.value,path:f,target:R,key:o})}for(let o=m.length-1;o>=0;o-=1)i.push(m[o])}return r.data}export function normalizeRuntimeNodeSetupSidecarId(e){const r=typeof e=="string"&&e.trim()?e.trim():"http-capture";if(!/^[A-Za-z0-9._-]+$/u.test(r))throw new TypeError("Runtime node setup sidecar id must contain only letters, numbers, dot, underscore, or hyphen");return r}export const HTTP_CAPTURE_OPERATION_PREFIX="/__testkit__/";export function normalizeRuntimeNodeSetupSidecarPath(e){const r=typeof e=="string"&&e.trim()?e.trim():"/capture";if(!r.startsWith("/")||r.startsWith("//")||/[\\?#]/u.test(r))throw new TypeError("Runtime node setup sidecar path must be an absolute URL path");if(r.startsWith(HTTP_CAPTURE_OPERATION_PREFIX))throw new TypeError(`Runtime node setup sidecar path may not start with ${HTTP_CAPTURE_OPERATION_PREFIX}`);return r}export function httpCaptureRedactionTargets({requestsUrl:e,resetUrl:r}){return[e,r].flatMap(n=>typeof n=="string"?[/\/__testkit__\/([A-Za-z0-9_-]+)\/requests$/u.exec(n)?.[1]??n]:[])}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{classifyRuntimeNodeSetupFailure as
|
|
1
|
+
import{classifyRuntimeNodeSetupFailure as j,createSetupFailure as E}from"./runtime-node-setup-errors.js";import{randomBytes as Y}from"node:crypto";import G from"node:http";import{pathToFileURL as W}from"node:url";import{parentPort as M,workerData as J}from"node:worker_threads";import{HTTP_CAPTURE_OPERATION_PREFIX as $,isRuntimeNodeSetupParentMessage as Q,isRuntimeNodeSetupWorkerRequest as K,MAX_RUNTIME_NODE_SETUP_SIDECARS as F,normalizeRuntimeNodeSetupData as V,normalizeRuntimeNodeSetupSidecarId as Z,normalizeRuntimeNodeSetupSidecarPath as ee,serializeRuntimeNodeSetupError as q,serializeRuntimeNodeSetupCleanupFailures as te}from"./runtime-node-setup-protocol.js";import{isUnknownRecord as B}from"../../../kernel/unknown-values.js";import{toError as re,errorMessage as ne}from"../../../kernel/error-serialization.js";const oe=1024*1024,se=100,ae=8*1024*1024,ie=8*1024*1024,ue=1e3,de=256,s=Re(J),H=be(),p=new AbortController,k=[],C=new Set,A=[];let P=null,D=0,u="starting",g=null;H.on("message",e=>{le(e)}),L(),ce();async function ce(){try{const t=await import(`${W(s.modulePath).href}?testkit=${encodeURIComponent(s.sessionId)}`);I();const r=Te(t);if(!r)throw new TypeError(`Runtime node setup "${s.moduleRelativePath}" must export a setup function`);const n=await r(pe()),o=he(n);o&&k.push({callback:o,owner:"consumer"}),I();const c=V(we(n));S(),u="ready",d({sessionId:s.sessionId,setupData:c,sidecars:A.map(f=>({...f})),type:"ready"})}catch(e){const t=j(e),r=await _();u="cleaned",S(),d({cleanupFailures:r,error:q(e),kind:t,sessionId:s.sessionId,type:"setup-error"})}}async function le(e){if(!Q(e)||e.sessionId!==s.sessionId){await O(E("infra","Runtime node setup worker received an invalid parent message"));return}if(e.type==="abort"){if(p.abort(E(e.kind,e.error.message)),d({sessionId:s.sessionId,type:"abort-acknowledged"}),u==="ready"){u="cleaning";const r=await _();u="cleaned",S(),d({cleanupFailures:r,sessionId:s.sessionId,type:"aborted"})}return}if(u==="cleaned"){d({cleanupFailures:[],sessionId:s.sessionId,type:"cleanup-complete"});return}if(u!=="ready"){await O(E("infra",`Runtime node setup cleanup is invalid during phase "${u}"`));return}u="cleaning";const t=await _();u="cleaned",S(),d({cleanupFailures:t,sessionId:s.sessionId,type:"cleanup-complete"})}async function O(e){p.abort(e);const t=await _();u="cleaned",S(),d({cleanupFailures:t,error:q(e),kind:"infra",sessionId:s.sessionId,type:"setup-error"})}function pe(){return{deadlineMs:s.deadlineMs,env:{...s.runtimeEnv},leaseDir:s.leaseDir,productDir:s.productDir,serviceName:s.serviceName,sidecars:{httpCapture(e={}){if(I(),A.length+D>=F)return Promise.reject(new RangeError(`Runtime node setup may create at most ${F.toString()} sidecars`));D+=1;const t=fe(e).then(r=>(k.push({callback:r.cleanup,owner:"testkit"}),A.push(r.handle),d({sessionId:s.sessionId,sidecar:{...r.handle},type:"sidecar-started"}),I(),r.handle)).finally(()=>{D-=1,C.delete(t)});return C.add(t),t}},signal:p.signal,testFile:s.testFile}}async function fe(e){const t=[],r=new Set;let n=0;const o=Z(e.id),c=ee(e.path),f=z(e.maxRequests,se,ue,"maxRequests"),m=z(e.maxBodyBytes,oe,ae,"maxBodyBytes"),b=Se(e.status,204),l=`${$}${Y(24).toString("base64url")}/requests`,a=G.createServer((i,h)=>{if(i.url===l){i.method==="GET"?R(h,200,{requests:t}):i.method==="DELETE"?(t.splice(0),n=0,R(h,200,{ok:!0})):R(h,405,{error:"HTTP capture requests allow only GET and DELETE"});return}if(i.url?.startsWith($)===!0){R(h,404,{error:"Unknown HTTP capture operation"});return}ye(i,m).then(w=>{const U={bodyBytes:w.bodyBytes,bodyText:w.retainedBody.toString("utf8"),bodyTruncated:w.bodyBytes>w.retainedBody.length,headers:i.headers,method:i.method??null,path:i.url??null,receivedAt:new Date().toISOString()};for(n+=Buffer.byteLength(U.bodyText),t.push(U);t.length>f||n>ie;){const N=t.shift();if(!N)break;n-=Buffer.byteLength(N.bodyText)}R(h,b,{ok:!0})}).catch(w=>{R(h,500,{error:ne(w)})})});a.maxConnections=de,a.requestTimeout=3e4,a.headersTimeout=3e4,a.keepAliveTimeout=1e3,a.on("connection",i=>{r.add(i),i.once("close",()=>r.delete(i))}),await me(a);const y=a.address();if(y===null||typeof y=="string")throw await x(a,r),new Error("Runtime node HTTP capture did not bind a TCP port");const T=`http://127.0.0.1:${y.port.toString()}`,X={id:o,requestsUrl:`${T}${l}`,resetUrl:`${T}${l}`,type:"http-capture",url:`${T}${c}`};return{cleanup:()=>x(a,r),handle:X}}function me(e){return new Promise((t,r)=>{const n=o=>{r(o)};e.once("error",n),e.listen(0,"127.0.0.1",()=>{e.off("error",n),t()})})}function x(e,t){if(!e.listening){for(const r of t)r.destroy();return Promise.resolve()}return new Promise((r,n)=>{e.close(o=>{o?n(o):r()}),e.closeIdleConnections(),e.closeAllConnections();for(const o of t)o.destroy()})}function ye(e,t){return new Promise((r,n)=>{const o=[];let c=0,f=0,m=!1;const b=l=>{m||(m=!0,n(re(l)))};e.on("data",l=>{if(m)return;if(typeof l!="string"&&!(l instanceof Uint8Array)){b(new TypeError("HTTP capture received an unsupported body chunk"));return}const a=Buffer.from(l);c=Math.min(Number.MAX_SAFE_INTEGER,c+a.length);const y=t-f;if(y>0){const T=a.subarray(0,y);o.push(T),f+=T.length}}),e.once("aborted",()=>{b(new Error("HTTP request was aborted"))}),e.once("error",b),e.once("end",()=>{m||(m=!0,r({bodyBytes:c,retainedBody:Buffer.concat(o,f)}))})})}function R(e,t,r){e.destroyed||e.writableEnded||(e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(r)))}function Te(e){if(!B(e))return null;const t=e.setup??e.default;return typeof t=="function"?t:null}function he(e){if(!B(e))return null;const t=v(e,"cleanup");return typeof t=="function"?t:null}function we(e){return B(e)&&("data"in e||"cleanup"in e)?Object.hasOwn(e,"data")?v(e,"data"):{}:e??{}}function v(e,t){let r=e;for(;r!==null;){const n=Object.getOwnPropertyDescriptor(r,t);if(n){if(!("value"in n))throw new TypeError(`Runtime node setup data at $.${t} must be an enumerable data property`);return n.value}r=Object.getPrototypeOf(r)}}function _(){return P!==null||(P=(async()=>{await Promise.allSettled([...C]);const e=[],t=k.splice(0).reverse();d({owners:t.map(({owner:r})=>r),sessionId:s.sessionId,type:"cleanup-started"});for(const[r,{callback:n,owner:o}]of t.entries()){d({owner:o,remainingCallbacks:t.length-r,sessionId:s.sessionId,type:"cleanup-progress"});try{await n()}catch(c){e.push({error:c,owner:o})}}return te(e)})()),P}function L(){const e=s.deadlineMs-Date.now();if(e<=0){p.abort(Ee());return}g=setTimeout(L,Math.min(e,2147483647))}function S(){g!==null&&clearTimeout(g),g=null}function Ee(){return E("deadline",`Runtime node setup exceeded its deadline ${s.deadlineMs.toString()}`)}function I(){if(p.signal.aborted)throw p.signal.reason instanceof Error?p.signal.reason:new Error(String(p.signal.reason))}function d(e){H.postMessage(e)}function Re(e){if(!K(e))throw E("infra","Runtime node setup worker received invalid worker data");return e}function be(){if(M===null)throw E("infra","Runtime node setup worker requires a parent port");return M}function z(e,t,r,n){if(e===void 0)return t;const o=Number(e);if(!Number.isInteger(o)||o<=0||o>r)throw new RangeError(`Runtime node HTTP capture ${n} must be an integer between 1 and ${r.toString()}`);return o}function Se(e,t){if(e===void 0)return t;const r=Number(e);return Number.isInteger(r)&&r>=100&&r<=599?r:t}
|