@gfdelarue/testkit 0.4.5 → 0.5.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 +666 -463
- 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 +2 -2
- 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/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/data.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/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/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/http-methods.js +1 -1
- package/dist/config/loader/config-loader.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 +1 -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/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 +2 -2
- 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 +26 -188
- 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/contract/index.js +1 -1
- package/dist/engines/node-vitest/runtime/data/http.js +1 -1
- 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/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-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/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/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 +501 -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 +40 -0
- package/dist/types/index.d.ts +21 -0
- package/dist/types/node-vitest-contract.d.ts +75 -0
- package/dist/types/node-vitest-data.d.ts +407 -0
- package/dist/types/playwright.d.ts +130 -0
- package/dist/types/tooling-vitest.d.ts +13 -0
- package/dist/types/workspace.d.ts +617 -0
- package/docs/bug-records.md +37 -37
- package/docs/engines.md +213 -0
- package/docs/test-types.md +35 -33
- package/package.json +22 -29
- package/testkit-config-schema.md +378 -184
- 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/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/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/data/http.d.ts +0 -4
- 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/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/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 m}from"../../process/files/paths.js";import{isUnknownRecord as s}from"../../kernel/unknown-values.js";export const LINT_RULE_NAMES=["engineImports","uiSpecShape","dataSuiteContract","configImports","testkitBoundary","unitTestBoundaries"];const b=new Set(["rules","ui"]),p=new Set(["enabled","exclude","include"]),y=new Set([...p,"allowed","trackedOnly"]),I=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},dataSuiteContract:{ruleId:"data-suite-contract",defaultEnabled:!0},configImports:{ruleId:"config-imports",defaultEnabled:!0},testkitBoundary:{ruleId:"testkit-boundary",defaultEnabled:!1},unitTestBoundaries:{ruleId:"unit-test-boundaries",defaultEnabled:!1}};const O=220,S=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 i of Object.keys(n)){if(i==="missingImports")throw new Error("lint.rules.missingImports was removed; use testkit typecheck for TypeScript import diagnostics");if(!Object.prototype.hasOwnProperty.call(RULES,i))throw new Error(`Unknown lint rule "${i}"`)}const e=i=>{const l=RULES[i];return T({ruleName:i,ruleId:l.ruleId,value:n[i],defaultEnabled:l.defaultEnabled})},r={engineImports:e("engineImports"),configImports:e("configImports"),dataSuiteContract:e("dataSuiteContract"),testkitBoundary:e("testkitBoundary"),uiSpecShape:e("uiSpecShape"),unitTestBoundaries:e("unitTestBoundaries")},o=t.ui===void 0?{}:t.ui;if(!s(o))throw new Error("lint.ui must be an object");return f(o,I,"lint.ui"),{rules:r,ui:{maxLines:w(o.maxLines,O,"lint.ui.maxLines"),maxTests:w(o.maxTests,S,"lint.ui.maxTests")}}}function T({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"?y:p,`lint.rules.${t}`),a({ruleName:t,ruleId:n,enabled:E(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"?h(e.allowed):void 0,trackedOnly:t==="testkitBoundary"?E(e.trackedOnly,`lint.rules.${t}.trackedOnly`):void 0})}function a({ruleName:t,ruleId:n,enabled:e,include:r=[],exclude:o=[],allowed:i,trackedOnly:l}){return{ruleName:t,ruleId:n,enabled:e,include:r,exclude:o,...t==="testkitBoundary"?{allowed:i||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 o=typeof e=="string"?e.trim():"";if(!o)throw new Error(`${n}[${String(r)}] must be a non-empty string`);return m(o)})}function h(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 E(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 r}from"@typescript-eslint/types";import{binding as p,memberName as w,stringValue as E}from"../policy.js";const T=new Set(["addFinding","actor","budget","bytes","count","duration","event","externalCall","expectMetric","expectSequence","fixture","finding","http","metric","money","ratio","reconcile","record","recordCache","recordHttpRequest","recordLlmUsage","recordRpc","sequence","sequenceBudget","system","transition"]),N=new Set(["actor","bytes","duration","externalCall","http","money","ratio","reconcile","record","recordCache","recordHttpRequest","recordLlmUsage","recordRpc","sequence","system","transition"]),f=new Set(["bench","describe","it","suite","test","BenchmarkRunner","TestRunner","EvaluatedModules"]);export function createDataPolicy({context:o,file:C,report:n}){if(!C.endsWith(".data.testkit.ts"))return{};const d=new Set,h=new Set,v=new Map,g=new Map;let y=!1,b=!1;const u=(e,t,a="vitest-runner-import")=>{n(e,a,t,`Data suites cannot use ${t} for Vitest case registration; declare cases with dataScenario(...)`)},x=e=>{for(const t of o.sourceCode.getAncestors(e).reverse())if(t.type===r.ArrowFunctionExpression||t.type===r.FunctionExpression){const a=g.get(t);if(a)return a}},m=e=>e.startsWith("vitest/")&&e!=="vitest/package.json"||e==="@gfdelarue/testkit/node-vitest/contract",k=e=>{E(e)?.includes("{serviceContextUrl:")&&n(e,"service-namespace-url","serviceContextUrl","Data suites must not use serviceContextUrl placeholders because they run outside the deployed service namespace")};return{ImportDeclaration(e){const t=e.source.value;if(t==="@playwright/test"&&n(e,"browser-runtime-import",t,"Browser/runtime driving belongs in ui
|
|
1
|
+
import{AST_NODE_TYPES as r}from"@typescript-eslint/types";import{binding as p,memberName as w,stringValue as E}from"../policy.js";const T=new Set(["addFinding","actor","budget","bytes","count","duration","event","externalCall","expectMetric","expectSequence","fixture","finding","http","metric","money","ratio","reconcile","record","recordCache","recordHttpRequest","recordLlmUsage","recordRpc","sequence","sequenceBudget","system","transition"]),N=new Set(["actor","bytes","duration","externalCall","http","money","ratio","reconcile","record","recordCache","recordHttpRequest","recordLlmUsage","recordRpc","sequence","system","transition"]),f=new Set(["bench","describe","it","suite","test","BenchmarkRunner","TestRunner","EvaluatedModules"]);export function createDataPolicy({context:o,file:C,report:n}){if(!C.endsWith(".data.testkit.ts"))return{};const d=new Set,h=new Set,v=new Map,g=new Map;let y=!1,b=!1;const u=(e,t,a="vitest-runner-import")=>{n(e,a,t,`Data suites cannot use ${t} for Vitest case registration; declare cases with dataScenario(...)`)},x=e=>{for(const t of o.sourceCode.getAncestors(e).reverse())if(t.type===r.ArrowFunctionExpression||t.type===r.FunctionExpression){const a=g.get(t);if(a)return a}},m=e=>e.startsWith("vitest/")&&e!=="vitest/package.json"||e==="@gfdelarue/testkit/node-vitest/contract",k=e=>{E(e)?.includes("{serviceContextUrl:")&&n(e,"service-namespace-url","serviceContextUrl","Data suites must not use serviceContextUrl placeholders because they run outside the deployed service namespace")};return{ImportDeclaration(e){const t=e.source.value;if(t==="@playwright/test"&&n(e,"browser-runtime-import",t,"Browser/runtime driving belongs in ui suites, not data suites"),(t.startsWith("@testing-library/")||t==="jsdom"||t==="happy-dom")&&n(e,"dom-runtime-import","dom-runtime","DOM/rendering tests belong in ui suites, not data suites"),e.importKind==="type")return;const a=e.specifiers.filter(s=>s.type!==r.ImportSpecifier||s.importKind!=="type");if(!(e.specifiers.length&&!a.length)){m(t)&&u(e,t),t==="@gfdelarue/testkit/node-vitest/data"&&(y=!0);for(const s of a){const i=o.sourceCode.getDeclaredVariables(e).find(l=>l.name===s.local.name);if(t==="vitest"&&s.type===r.ImportNamespaceSpecifier&&i&&h.add(i),s.type!==r.ImportSpecifier)continue;const c=s.imported.type===r.Identifier?s.imported.name:s.imported.value;t==="vitest"&&f.has(c)&&u(s,c),t==="@gfdelarue/testkit/node-vitest/data"&&c==="dataScenario"&&i&&d.add(i)}}},ExportNamedDeclaration(e){if(!e.source||e.exportKind==="type")return;const t=e.specifiers.filter(a=>a.exportKind!=="type");if(!(e.specifiers.length&&!t.length)&&(m(e.source.value)&&u(e,e.source.value),e.source.value==="vitest"))for(const a of t){const s=a.local.type===r.Identifier?a.local.name:a.local.value;f.has(s)&&u(a,s)}},ExportAllDeclaration(e){e.exportKind!=="type"&&m(e.source.value)&&u(e,e.source.value)},MemberExpression(e){if(e.object.type!==r.Identifier)return;const t=p(o,e.object),a=w(e);t&&h.has(t)&&a&&f.has(a)&&u(e,a,"vitest-runner-call")},CallExpression(e){const t=e.callee.type===r.Identifier?p(o,e.callee):null;if(t&&d.has(t)){b=!0;const i=e.arguments.at(-1);if(!i||i.type!==r.ArrowFunctionExpression&&i.type!==r.FunctionExpression){n(e,"missing-scenario-callback","dataScenario","dataScenario(...) must provide a callback that receives the Testkit data context");return}const c=i.params[0]?.type===r.AssignmentPattern?i.params[0].left:i.params.at(0),l=c?.type===r.Identifier?o.sourceCode.getDeclaredVariables(i).find(D=>D.name===c.name):null;if(!l){n(e,"missing-data-context","dataScenario","dataScenario callbacks must accept the Testkit data context and record data evidence");return}const S={callback:i,context:l,contextName:l.name,methods:new Set,assertion:!1};v.set(e,S),g.set(i,S);return}const a=o.sourceCode.getText(e.callee);e.callee.type===r.MemberExpression&&a.includes(".serviceContextUrl")&&n(e,"service-namespace-url","serviceContextUrl","Data suites run in the managed Node.js runner, not inside a service namespace; use baseUrl/public endpoints or move service-namespace checks to contract");const s=x(e);if(s&&(/^(expect|assert)(?:\(|\.)/u.test(a)&&(s.assertion=!0),e.callee.type===r.MemberExpression&&e.callee.object.type===r.Identifier&&p(o,e.callee.object)===s.context)){const i=w(e.callee);i&&T.has(i)&&s.methods.add(i)}},"CallExpression:exit"(e){const t=v.get(e);if(!t)return;const{callback:a,contextName:s,methods:i,assertion:c}=t;i.size?[...i].some(l=>N.has(l))||(n(a,"weak-data-evidence",s,"Data scenarios must record product data-flow evidence such as http, bytes, sequence, record, transition, system, externalCall, recordCache, recordLlmUsage, or reconcile; ordinary Node/Vitest-style checks belong in *.contract.testkit.ts with @gfdelarue/testkit/node-vitest/contract"),c&&n(a,"vitest-shaped-data-suite",s,"This dataScenario looks like an ordinary assertion test with weak data bookkeeping; move Node-backed contract checks to *.contract.testkit.ts or model the product data flow with structured evidence")):n(a,"missing-data-evidence",s,"Data scenarios must record Testkit-owned data-flow evidence with the data context, such as http, bytes, sequence, record, transition, system, externalCall, recordCache, recordLlmUsage, or reconcile")},ThrowStatement(e){const t=x(e);t&&(t.assertion=!0)},Literal:k,TemplateLiteral:k,"Program:exit"(e){y?d.size?b||n(e,"missing-data-scenario","dataScenario","Data suites must declare at least one dataScenario(...)"):n(e,"missing-data-scenario-import","dataScenario","Data suites must import dataScenario from @gfdelarue/testkit/node-vitest/data"):n(e,"missing-data-import","@gfdelarue/testkit/node-vitest/data","Data suites must import dataScenario from @gfdelarue/testkit/node-vitest/data")}}}
|
|
@@ -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{findConfigFile as o}from"../../config/loader/index.js";import{findNearestPlaywrightConfigFile as i}from"../../engines/playwright/runtime/config-file.js";export function engineSupportInputs(e){switch(e.task.engineId){case"node-vitest":return{configuration:e.request.vitest,supportModules:s(e)};case"playwright":return{configuration:l(e),supportModules:u(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);return t===null?{}:{testkitConfig:t}}function u(e){const t=i(e.request.productDir,e.request.ownerRoots[e.task.serviceName]??[]);return t===null?{}:{playwrightConfig:t}}function l(e){const t=e.environment.baseUrl;return t!==null&&a(t)?{...e.environment.ui,allowRemote:!0}:{...e.environment.ui}}function a(e){try{return!p(new URL(e).hostname)}catch{return!1}}function p(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{isDeepStrictEqual as c}from"node:util";import{isUnknownRecord as f}from"../../kernel/unknown-values.js";export function createEnvironment({group:n,setupData:t={},...e}){return{...e,databases:p(e.databases,n,e.databaseUrl,"database"),endpoints:p(e.endpoints,n,e.baseUrl,"endpoint"),env:{...e.env},setupData:t}}export class GroupDefaultConflictError extends Error{}function p(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 function environmentTaskIdentities(n){return("batchTasks"in n?n.batchTasks:[n]).map(environmentTaskIdentity)}const b={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:a})=>a))],s=t(e);for(const a of r){const i=t(a),o=Object.keys(b).find(u=>!c(s[u],i[u]));if(o===void 0)continue;const d=h(s[o],i[o]);throw new Error(`Plain Vitest files run in one Vitest invocation, but groups ${e} and ${a} give them a different ${b[o]}${d===void 0?"":` ${d}`}; select one group with --group`)}return s}function h(n,t){if(!(!f(n)||!f(t)))return Object.keys({...n,...t}).find(e=>!c(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 he}from"../../config/loader/dependencies.js";import{claimNextTask as ve,collectSuites as ye}from"./planning.js";import{buildRunPlanningMetadata as ke,buildScheduledQueue as Re}from"./scheduler/index.js";import{requireCompatibleSelection as Se}from"./task-batches.js";import{addTrackerError as we,buildServiceTrackers as Ce,finalizeServiceResult as ie,recordGraphError as Fe,recordTaskOutcome as Ee}from"./results.js";import{loadTimings as Ae,saveTimings as Te,writeRunArtifact as be}from"../../evidence/index.js";import{createRunEnvironmentRecord as Ke}from"../../evidence/environment-record.js";import{createRunLogRegistry as xe}from"../../evidence/logs.js";import{createOperationTimingRegistry as Me,timeOperation as B}from"../../evidence/operation-timings.js";import{createRunReporterFromListener as qe}from"./run-events.js";import{createCallerRedaction as Ie}from"./caller-redaction.js";import{createSetupOperationRegistry as ze}from"../../evidence/setup-progress.js";import{createLocalRunEnvironment as Oe}from"../../environment/run-environment.js";import{createConfigDrivenEnvironments as Pe,planConfiguredCapacity as Ne}from"../environments/config-driven.js";import{declaresProvisioning as je,declaresValues as ae,holdBeforeRelease as De,routeEnvironments as Le}from"../environments/routing.js";import{createStaticValueEnvironments as Ge}from"../environments/static-values.js";import{findRuntimeNodeSetupFile as Ve}from"./setup/runtime-node-setup.js";import{createSuppliedEnvironments as Be}from"../environments/supplied.js";import{environmentTaskIdentity as $e}from"./environment.js";import{createTaskLeases as We}from"./task-leases.js";import{createTaskLocks as Ue}from"./scheduler/locks.js";import{readPackageMetadata as He,safeHostname as Qe,safeUsername as _e}from"../../process/host/metadata.js";import{collectGitMetadata as Je}from"../../repo/metadata.js";import{resolveExecutionConfig as Xe}from"../../config/loader/decode-execution.js";import{resolveTaskPolicy as Ye}from"../../config/loader/task-policy.js";import"../../environment/run-environment.js";import{createEngineManager as Ze}from"../../engines/factory.js";import{createWorker as et,runWorker as tt}from"./worker-loop.js";import{ensureRequestedFilesMatch as rt}from"./run-guards.js";import{createLiveSnapshotWriter as nt}from"./live-run.js";import{finalizeRunArtifacts as it}from"./run-finalization.js";import{buildRunArtifact as at}from"../../evidence/reporting.js";import{createOperationReporterBridge as ot}from"./operation-progress.js";import{formatError as $,serializeError as oe}from"../../kernel/error-serialization.js";export async function runAll(e,n,a,r,c=[]){const h=r.fileNames||[];rt(e,n,a,h);const{productDir:s}=r,p=Oe(s),R=Ze(s),v=new Map(c.map(i=>[i.name,i])),t=Date.now(),C=e[0]?.artifacts??null,q=[...new Set(e.flatMap(i=>i.uses.flatMap(m=>Object.keys(v.get(m)?.testkit.serviceEnv??{}))))].sort(),f={git:await Je(s),host:{hostname:Qe(),username:_e()},testkitVersion:He().version},S=e[0]?.redact??[],b=Ie(process.env,S),Y=r.onEvent,y=Y?qe(i=>{Y(b.redact(i))},{debug:r.debug}):null,K=xe(s),j={workerCount:0},I=resolveRunExecutionConfig(e[0],r),D=collectServicePlans(e,v,n,a,r,I,y);y?.setServicePlans?.(D);const z=Ce(D,t),L=i=>{for(const m of z.values())m.skipped||we(m,i);y?.runError?.(i)},ce=a.map(i=>({...i})),W={typeValues:n,suiteSelectors:ce,fileNames:h,groupFilter:r.serviceFilter||null,planning:null};let k=()=>{};const ue=ot(y),T=Me({onChange:i=>{ue(i),k()}}),Z=ze({logRegistry:K,onChange:()=>{k()}}),d=Ke({logRegistry:K,redactKeys:S,setupRegistry:Z,onPublishedChange:()=>{k()}});b.useSourceTargets(()=>d.redactionTargets()),d.recordGroups(D.map(i=>({dbBackend:i.dbBackend,name:i.config.name})));const U=D.filter(i=>!i.skipped),H=r.environments?.supplied??{},{plans:O,provisionedGraphKeys:G,staticGraphKeys:Q}=assignRuntimeGraphs(U,new Set(Object.keys(H)));let g;const o=await p.start({keepAlive:!0,localInfrastructure:G.size>0,redactKeys:S,redactionTargets:()=>d.redactionTargets(),resetResultsBeforePublish:!0});k=nt({productDir:s,runId:o.runId,configs:e,trackers:z,startedAt:t,execution:I,workerState:j,selection:W,archiveConfig:C,declaredEnvironmentKeys:q,metadata:f,environmentRecord:d,operationTimingRegistry:T,reporter:y});const P={artifacts:null},le=async(i,m)=>(o.beginFinalization(),await o.finish(i,A=>{const w=m(A);return P.artifacts={runArtifact:w.runArtifact},w},"normal"));let F,x;const ee=(i,m,u)=>({productDir:s,runId:o.runId,results:i,startedAt:t,finishedAt:m,execution:I,workerCount:j.workerCount,selection:W,archiveConfig:C,declaredEnvironmentKeys:q,metadata:f,environmentRecord:d,operationTimingRegistry:T,reporter:y,runInterruptReason:o.getInterruptReason(),runStatus:u,publishRunFinalization:le});k();let E=null;try{try{if(U.length>0){const u=Ae(s),{capacity:A,queue:w}=await B(T,{name:"testkit.plan",kind:"planning",summary:"plan test execution",scope:{serviceCount:U.length}},()=>({capacity:Ne(O.filter(l=>G.has(l.runtimeKey))),queue:Re(O.map(l=>prepareSchedulerPlan(l,Object.hasOwn(H,l.config.name)?()=>!1:M=>Ve(s,M)!==null)),{timings:u})}));Se(w,{provisioned:G,static:Q}),W.planning=ke(w),d.recordCapacity(A),y?.setTotalFileCount?.(w.length),j.workerCount=Math.max(1,Math.min(I.taskConcurrency,w.length));const te=Array.from({length:j.workerCount},(l,M)=>et(M+1,s));A.graphs.length>0&&o.provision(A.graphs,{reporter:y,environmentRecord:d,logRegistry:K,setupRegistry:Z,operationTimingRegistry:T,skipSchemaSourceVerify:r.skipSchemaSourceVerify});const me=Pe(o,new Map(O.map(l=>[l.config.name,l.config.uses])),s,d),fe=Ge(new Map(O.filter(l=>Q.has(l.runtimeKey)).map(l=>[l.config.name,l.uses])),s,d),de=Be(H,{productDir:s,record:d,signal:o.signal}),re=We(s),pe={recordRunError:L,runId:o.runId,signal:o.signal,isStopRequested:()=>o.isStopRequested(),environments:mt(Le(new Map(O.map(({runtimeKey:l})=>[l,G.has(l)?me:Q.has(l)?fe:de]))),r.environments?.hold),leases:ut(re,d),locks:Ue(),request:ft(s,e,I,r.vitest)},ne=[];try{const M=(await B(T,{name:"testkit.execute",kind:"execution",summary:"execute local worker queue",scope:{workerCount:te.length,taskCount:w.length}},async()=>Promise.allSettled(te.map(_=>tt(_,w,pe,R,z,ne,ve,(J,V,N,X)=>{Ee(J,V,N,X),N.environmentValuesMissing!==void 0&&d.recordMissingValues($e(V),N.environmentValuesMissing),k()},(J,V,N,X,ge)=>{Fe(J,V,N,X,ge),k()},y))))).flatMap(workerResultErrorsForOrchestrator);for(const _ of M)L(_);M.length>0&&k(),d.recordRuntimeStats(o.getStats())}finally{A.graphs.length>0&&await B(T,{name:"testkit.cleanup",kind:"cleanup",summary:"stop managed runtimes and services"},()=>lt(d,()=>o.cleanupAll())),re.close()}Te(s,u,ne)}}catch(u){E=oe(u),L(E.message||$(u)),k()}g=E===null?0:o.isStopRequested()?130:1,x=Date.now(),F=e.map(u=>ie(z.get(u.name),t,x));const i=resolveRunGateFailure(F,r.allowEmpty===!0);await B(T,{name:"testkit.collect",kind:"collection",summary:"close and collect run logs"},()=>K.closeAll());const m=await it(ee(F,x,o.isStopRequested()?"interrupted":E===null&&i===null?null:"failed"));return E!==null&&(g=1),F.some(u=>u.failed||u.infraFailed)&&(g=1),i!==null&&(g=1),m.shouldFailArchivePublication&&(g=1),m.shouldFailArchiveCleanup&&(g=1),(m.runArtifact.run.status==="interrupted"||o.isStopRequested()||o.committedFinalization?.artifactStatus==="interrupted")&&(g=Math.max(g,130)),{runArtifact:m.runArtifact,results:b.redact(F),exitCode:g,...E===null?{}:{failure:b.redact(E)}}}catch(i){const m=oe(i);L(m.message||$(i)),k(),o.beginFinalization(),g=o.isStopRequested()||o.committedFinalization?.artifactStatus==="interrupted"?130:1,x=Date.now(),F=e.map(A=>ie(z.get(A.name),t,x)),await se(K);let u=P.artifacts;if(u===null)try{u=await st(ee(F,x,o.isStopRequested()?"interrupted":"failed"),o,P,m)}catch{if(P.artifacts===null)throw i;u=P.artifacts}return(u.runArtifact.run.status==="interrupted"||o.isStopRequested()||o.committedFinalization?.artifactStatus==="interrupted")&&(g=Math.max(g,130)),{runArtifact:u.runArtifact,results:b.redact(F),exitCode:g,failure:b.redact(E??m)}}finally{o.dispose(),await se(K),ct(d,r.environments?.observeRecord,y)}}async function st(e,n,a,r){return n.finish("failed",c=>{const h=c.artifactStatus==="interrupted"?c:{artifactStatus:"failed",interruptReason:null},s=e.declaredEnvironmentKeys??[],p=at({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:s,metadata:e.metadata,environment:e.environmentRecord.snapshot(),operationTimings:e.operationTimingRegistry?.listOperations()??[],runInterruptReason:h.interruptReason,runStatus:h.artifactStatus});p.finalizationFailure={...r};const v={runArtifact:be(e.productDir,p,{archiveConfig:e.archiveConfig,declaredEnvironmentKeys:s,redactKeys:e.environmentRecord.redactKeys,redactionTargets:e.environmentRecord.redactionTargets()})};return a.artifacts=v,v},"recovery")}function ct(e,n,a){if(n!==void 0)try{n(e.snapshot())}catch(r){try{a?.warning?.(`Environment record observer failed: ${$(r)}`)}catch{}}}function ut(e,n){return{...e,remove(a){const r=n.releaseFor(a.id);try{e.remove(a)}catch(c){throw r?.releaseFailed(c),c}r?.released()}}}async function lt(e,n){try{await n()}catch(a){throw e.recordCleanup(a),a}e.recordCleanup(null)}async function se(e){try{await e.closeAll()}catch{}}export function workerResultErrorsForOrchestrator(e){return e.status==="rejected"?[$(e.reason)]:[...new Set(e.value.unpersistedErrors)]}export function resolveRunGateFailure(e,n=!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,c)=>r+c.completedFileCount,0)===0&&!n?"no runnable test files executed":null}function mt(e,n){return n===void 0?e:De(e,n)}function ft(e,n,a,r){return{vitest:r,productDir:e,fileTimeoutSeconds:a.fileTimeoutSeconds,ownerRoots:Object.fromEntries(n.map(c=>[c.name,c.roots]))}}export function resolveRunExecutionConfig(e,n){return Xe({cli:{fileTimeoutSeconds:n.fileTimeoutSeconds,taskConcurrency:n.taskConcurrency},repo:e?{fileTimeoutSeconds:e.testkit.execution.fileTimeoutSeconds,taskConcurrency:e.testkit.execution.taskConcurrency}:void 0})}export function assignRuntimeGraphs(e,n){const a=e.filter(t=>t.suites.some(C=>C.files.length>0)),r=new Set(a.filter(t=>!n.has(t.config.name)&&je(t.runtimeConfigs))),c=new Set([...r].map(t=>t.runtimeKey)),h=t=>!r.has(t)&&!n.has(t.config.name)&&ae(t.runtimeConfigs),s=new Set(a.filter(t=>h(t)&&t.runtimeKey!=="").map(t=>t.runtimeKey)),p=new Set(a.map(t=>t.runtimeKey)),R=t=>t.runtimeKey!==""&&!c.has(t.runtimeKey)&&(h(t)||!s.has(t.runtimeKey))?t.runtimeKey:p.has(t.config.name)?`group:${t.config.name}`:t.config.name,v=a.map(t=>r.has(t)?t:{...t,runtimeKey:R(t)});return{plans:v,provisionedGraphKeys:c,staticGraphKeys:new Set(v.filter(t=>!c.has(t.runtimeKey)&&!n.has(t.config.name)&&ae(t.runtimeConfigs)).map(t=>t.runtimeKey))}}export function prepareSchedulerPlan(e,n){return{graphKey:e.runtimeKey,owner:e.config.name,suites:e.suites.map(a=>({...a,tasks:a.files.map(r=>({file:r,hasSetup:n(r),...Ye(e.config.testkit,a,r)}))}))}}export function collectServicePlans(e,n,a,r,c,h,s=null){return e.map(p=>{const R=p.uses.map(f=>{const S=n.get(f);if(S===void 0)throw new Error(`Group "${p.name}" uses unknown service "${f}"`);return S}),v=R.some(f=>f.testkit.database!==void 0)?"local":null,t=ye(p,a,r,c.fileNames||[],c);if(t.length===0)return s?.serviceSkipped?.(p,`no matching files (types=${a.join(",")||"all"} suites=${r.map(f=>f.raw).join(",")||"all"} files=${(c.fileNames||[]).join(",")||"all"})`),{config:p,dbBackend:v,execution:h,skipped:!0,suites:[],runtimeConfigs:[],runtimeNames:[],runtimeKey:null,uses:R};for(const f of t)for(const S of f.skippedFiles)s?.plannedSkip?.({serviceName:p.name,testType:f.testType,engineId:f.engineId,profileId:f.profileId,file:S.path,reason:S.reason});const C=he(R,n),q=C.map(f=>f.name).sort();return{config:p,dbBackend:v,execution:h,skipped:!1,suites:t,runtimeConfigs:C,runtimeNames:q,runtimeKey:q.join("|"),uses:R}})}
|
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 g}from"../../process/files/product-dir.js";import{loadRunConfigs as k}from"../../config/loader/managed-configs.js";import{parseFileTimeoutOption as F}from"../../domain/file-timeout.js";import{parseSuiteOption as w,parseTypeOption as O}from"../../domain/suite-selection.js";import{resolveRequestedFiles as R}from"../file-selection.js";import{parseTaskConcurrencyOptions as T}from"../../config/loader/decode-execution.js";import{readEnvironmentFile as h}from"../environments/environment-file.js";import{hasSuppliedInput as E,projectSuppliedEnvironment as V,resolveSuppliedInput as j,suppliedBindings as C}from"../environments/supplied-input.js";import{resolveVitestSelection as I}from"../../engines/catalog.js";export async function buildRunRequest(e,l=null,o=process.cwd(),n=process.cwd(),p=process.env){const a=T(e.taskConcurrency,e.workers),f=e.fileTimeoutSeconds==null?null:F(e.fileTimeoutSeconds),c=O(e.type,l),u=w(e.suite),S=e.file??[],r=g(o,e.dir),m=R(S,r,n),s=e.supplied??{},i=E(s)?j(s,s.environmentFile===void 0?null:h(s.environmentFile,n),p):null,t=I(e.vitest??{},r,p),{groups:d,ownershipNotice:v,services:y}=await k({dir:r,group:e.group,testSelection:{group:e.group,fileNames:m,typeValues:c,suiteSelectors:u},vitest:i===null?t:{...t,host:{...t.host,...C(i)}}});return{groups:d,ownershipNotice:v,services:y,productDir:r,supplied:i===null?null:N(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 N(e,l){return Object.fromEntries(l.map(o=>[o.name,V(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";export async function finalizeRunArtifacts({productDir:t,runId:e,results:i,startedAt:a,finishedAt:u,execution:c,workerCount:r,selection:n,archiveConfig:d=null,declaredEnvironmentKeys:m=[],metadata:F,environmentRecord:p,operationTimingRegistry:b=null,reporter:h,runInterruptReason:g=null,runStatus:l=null,publishRunFinalization:A}){const o=w({productDir:t,runId:e,results:i,startedAt:a,finishedAt:u,execution:c,workerCount:r,typeValues:n.typeValues,suiteSelectors:n.suiteSelectors,fileNames:n.fileNames,groupFilter:n.groupFilter,planning:n.planning??null,archiveConfig:d,declaredEnvironmentKeys:m,metadata:F,environment:p.snapshot(),operationTimings:b?.listOperations()??[],runInterruptReason:g,runStatus:l}),S=O(o.storage),v=T(t);o.storage={...S??{},testkit:v};const R=l==="failed"||i.some(s=>s.failed||s.infraFailed)?"failed":"passed",y=s=>{N(o,s);const f=C({archiveConfig:d,declaredEnvironmentKeys:m,productDir:t,redactKeys:p.redactKeys,redactionTargets:p.redactionTargets(),runArtifact:o});return h?.runSummary?.(i,u-a,f.runArtifact.run.status==="interrupted"?"interrupted":f.runArtifact.run.status==="failed"?"failed":"passed"),f};return A?await A(R,y):y(z(R,{interrupted:l==="interrupted",interruptReason:l==="interrupted"?g:null}))}function C({archiveConfig:t,declaredEnvironmentKeys:e,productDir:i,redactKeys:a,redactionTargets:u,runArtifact:c}){const r=k(i,c,{archiveConfig:t,declaredEnvironmentKeys:e,redactKeys:a,redactionTargets:u});return{runArtifact:r,shouldFailArchiveCleanup:r.archive.cleanup?.status==="failed",shouldFailArchivePublication:r.archive.publication.status==="failed"&&r.archive.publication.required===!0}}function N(t,e){if(t.run.status=e.artifactStatus,e.artifactStatus!=="interrupted"){delete t.run.interruptReason;return}t.run.interruptReason=e.interruptReason??"run interrupted"}function O(t){return x(t)?t:null}
|
|
@@ -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}
|