@gfdelarue/testkit 0.4.4 → 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.
Files changed (817) hide show
  1. package/README.md +752 -462
  2. package/bin/testkit-windows-owner-arm64.exe +0 -0
  3. package/bin/testkit-windows-owner-x64.exe +0 -0
  4. package/dist/app/bugs/categories.js +1 -1
  5. package/dist/app/bugs/ci-report.js +2 -2
  6. package/dist/app/bugs/ci-summary.js +3 -3
  7. package/dist/app/bugs/draft.js +4 -4
  8. package/dist/app/bugs/facts.js +2 -2
  9. package/dist/app/bugs/file.js +1 -1
  10. package/dist/app/bugs/gate.js +1 -1
  11. package/dist/app/bugs/guide.js +3 -3
  12. package/dist/app/bugs/issue.js +4 -4
  13. package/dist/app/bugs/known-failures.js +1 -1
  14. package/dist/app/bugs/record.js +2 -2
  15. package/dist/app/bugs/run-reading.js +1 -1
  16. package/dist/app/bugs/supplied-reproduce.js +1 -0
  17. package/dist/app/campaigns/campaign.js +1 -1
  18. package/dist/app/cleanup/index.js +1 -1
  19. package/dist/app/db-schema/prepare.js +1 -1
  20. package/dist/app/destroy/index.js +1 -1
  21. package/dist/app/discover/index.js +2 -2
  22. package/dist/app/doctor/index.js +1 -1
  23. package/dist/app/environments/config-driven.js +1 -0
  24. package/dist/app/environments/environment-file.js +1 -0
  25. package/dist/app/environments/file-setup.js +1 -0
  26. package/dist/app/environments/routing.js +1 -0
  27. package/dist/app/environments/static-values.js +1 -0
  28. package/dist/app/environments/supplied-input.js +1 -0
  29. package/dist/app/environments/supplied.js +1 -0
  30. package/dist/app/environments/task-databases.js +2 -0
  31. package/dist/app/file-selection.js +1 -1
  32. package/dist/app/inspect/artifacts.js +1 -1
  33. package/dist/app/inspect/index.js +1 -1
  34. package/dist/app/lint/index.js +1 -1
  35. package/dist/app/lint/native.js +1 -1
  36. package/dist/app/lint/options.js +1 -1
  37. package/dist/app/lint/rules/data.js +1 -1
  38. package/dist/app/lint/rules/engine-imports.js +1 -1
  39. package/dist/app/lint/rules/syntax.js +1 -1
  40. package/dist/app/lint/rules/unit.js +1 -1
  41. package/dist/app/lint/shared.js +1 -1
  42. package/dist/app/package-inspection.js +1 -1
  43. package/dist/app/reports/files.js +1 -0
  44. package/dist/app/reports/prepare.js +2 -0
  45. package/dist/app/reports/publish.js +1 -0
  46. package/dist/app/run/caller-redaction.js +1 -0
  47. package/dist/app/run/engine-evidence-persistence.js +1 -1
  48. package/dist/app/run/engine-execution-failures.js +1 -1
  49. package/dist/app/run/engine-execution-reporting.js +1 -1
  50. package/dist/app/run/engine-execution.js +1 -1
  51. package/dist/app/run/engine-orchestration.js +1 -1
  52. package/dist/app/run/environment.js +1 -0
  53. package/dist/app/run/failure-details.js +1 -1
  54. package/dist/app/run/live-run.js +1 -1
  55. package/dist/app/run/orchestrator.js +1 -1
  56. package/dist/app/run/planning.js +1 -1
  57. package/dist/app/run/request.js +1 -1
  58. package/dist/app/run/results.js +1 -1
  59. package/dist/app/run/run-events.js +1 -1
  60. package/dist/app/run/run-finalization.js +1 -1
  61. package/dist/app/run/runtime-fixtures.js +1 -1
  62. package/dist/app/run/scheduler/estimates.js +1 -1
  63. package/dist/app/run/scheduler/identity.js +1 -1
  64. package/dist/app/run/scheduler/index.js +1 -1
  65. package/dist/app/run/scheduler/locks.js +1 -0
  66. package/dist/app/run/selection.js +1 -1
  67. package/dist/app/run/setup/runtime-node-setup-protocol.js +1 -1
  68. package/dist/app/run/setup/runtime-node-setup-worker.js +1 -1
  69. package/dist/app/run/setup/runtime-node-setup.js +2 -2
  70. package/dist/app/run/task-batches.js +1 -1
  71. package/dist/app/run/task-leases.js +1 -0
  72. package/dist/app/run/worker-loop.js +1 -1
  73. package/dist/app/status/runs.js +1 -1
  74. package/dist/app/tracker/index.js +1 -1
  75. package/dist/app/typecheck/index.js +4 -4
  76. package/dist/cli/command-catalog.js +1 -1
  77. package/dist/cli/command-flags.js +1 -1
  78. package/dist/cli/command-registry.js +1 -1
  79. package/dist/cli/commands/artifacts.js +2 -2
  80. package/dist/cli/commands/bug/file.js +2 -2
  81. package/dist/cli/commands/bug/record.js +2 -2
  82. package/dist/cli/commands/discover.js +1 -1
  83. package/dist/cli/commands/report/prepare.js +5 -0
  84. package/dist/cli/commands/report/publish.js +2 -0
  85. package/dist/cli/commands/run.js +2 -2
  86. package/dist/cli/commands/typecheck.js +1 -1
  87. package/dist/cli/commands/workspace.js +1 -1
  88. package/dist/cli/framework/errors.js +1 -1
  89. package/dist/cli/framework/execute.js +7 -6
  90. package/dist/cli/framework/parser.js +1 -1
  91. package/dist/cli/json-errors.js +1 -1
  92. package/dist/cli/operations/run/operation.js +2 -2
  93. package/dist/cli/renderers/bug/text.js +1 -1
  94. package/dist/cli/renderers/discover/report.js +1 -1
  95. package/dist/cli/renderers/doctor/text.js +1 -1
  96. package/dist/cli/renderers/run/events.js +2 -2
  97. package/dist/cli/renderers/run/formatting.js +1 -1
  98. package/dist/cli/renderers/run/status.js +1 -1
  99. package/dist/cli/renderers/run/text-reporter.js +24 -22
  100. package/dist/cli/terminal/colors.js +1 -1
  101. package/dist/cli/terminal/layout.js +2 -2
  102. package/dist/config/authoring/http-methods.js +1 -1
  103. package/dist/config/authoring/index.js +1 -1
  104. package/dist/config/authoring/preset-env.js +1 -1
  105. package/dist/config/loader/config-loader.js +1 -1
  106. package/dist/config/loader/database.js +1 -1
  107. package/dist/config/loader/decode-execution.js +1 -1
  108. package/dist/config/loader/dependencies.js +1 -1
  109. package/dist/config/loader/discover-tests.js +1 -1
  110. package/dist/config/loader/discovery-summary.js +1 -1
  111. package/dist/config/loader/discovery.js +2 -2
  112. package/dist/config/loader/env.js +1 -1
  113. package/dist/config/loader/execution-model.js +1 -1
  114. package/dist/config/loader/file-metadata.js +1 -1
  115. package/dist/config/loader/groups.js +1 -0
  116. package/dist/config/loader/index.js +1 -1
  117. package/dist/config/loader/load.js +1 -1
  118. package/dist/config/loader/managed-configs.js +1 -1
  119. package/dist/config/loader/owned-discovery.js +1 -0
  120. package/dist/config/loader/path-policy.js +1 -1
  121. package/dist/config/loader/runtime-isolation.js +1 -1
  122. package/dist/config/loader/runtime.js +1 -1
  123. package/dist/config/loader/skip-config.js +1 -1
  124. package/dist/config/loader/task-policy.js +1 -0
  125. package/dist/config/loader/test-selection.js +1 -1
  126. package/dist/config/loader/validation.js +1 -1
  127. package/dist/database/activity-gate.js +1 -1
  128. package/dist/database/admin.js +2 -2
  129. package/dist/database/bindings.js +1 -0
  130. package/dist/database/cleanup.js +1 -1
  131. package/dist/database/docker-metadata.js +3 -3
  132. package/dist/database/docker.js +3 -3
  133. package/dist/database/index.js +1 -1
  134. package/dist/database/lifecycle-cleanup.js +1 -1
  135. package/dist/database/local-postgres.js +1 -1
  136. package/dist/database/naming.js +1 -1
  137. package/dist/database/postgres/connection-check.js +1 -0
  138. package/dist/database/postgres/protocol.js +2 -0
  139. package/dist/database/schema-operations.js +1 -1
  140. package/dist/database/schema-source.js +3 -3
  141. package/dist/database/source-schema-env.js +1 -0
  142. package/dist/database/source-url.js +2 -2
  143. package/dist/database/state-files.js +1 -1
  144. package/dist/database/state.js +1 -1
  145. package/dist/database/steps.js +3 -3
  146. package/dist/domain/file-timeout.js +1 -1
  147. package/dist/domain/identifiers.js +1 -1
  148. package/dist/domain/operation-display.js +1 -1
  149. package/dist/domain/retired-test-types.js +1 -0
  150. package/dist/domain/runtime-isolation-contract.js +1 -1
  151. package/dist/domain/suite-selection.js +1 -1
  152. package/dist/domain/test-outcomes.js +1 -1
  153. package/dist/domain/test-types.js +1 -1
  154. package/dist/engines/adapters/evidence-files.js +1 -1
  155. package/dist/engines/adapters/evidence-identity.js +1 -1
  156. package/dist/engines/adapters/execution.js +1 -1
  157. package/dist/engines/adapters/json-bounds.js +2 -0
  158. package/dist/engines/adapters/native-report.js +1 -1
  159. package/dist/engines/api/execution-scope.js +1 -1
  160. package/dist/engines/api/execution.js +1 -1
  161. package/dist/engines/api/index.js +1 -1
  162. package/dist/engines/api/runtime-artifact.js +1 -1
  163. package/dist/engines/bundle-cache.js +1 -1
  164. package/dist/engines/catalog.js +1 -1
  165. package/dist/engines/contracts/environment-values.js +1 -0
  166. package/dist/engines/contracts/fixture-manifest.js +1 -1
  167. package/dist/engines/definitions.js +1 -1
  168. package/dist/engines/environment/handles.js +1 -0
  169. package/dist/engines/environment/index.js +1 -0
  170. package/dist/engines/factory.js +1 -1
  171. package/dist/engines/installations/node-vitest.js +1 -1
  172. package/dist/engines/installations/package-resolution.js +1 -1
  173. package/dist/engines/installations/playwright-resolution-child.js +1 -1
  174. package/dist/engines/installations/playwright.js +1 -1
  175. package/dist/engines/managed-module-resolution-policy-input.js +1 -1
  176. package/dist/engines/managed-module-resolution-policy.js +1 -1
  177. package/dist/engines/managed-module-resolution.js +2 -2
  178. package/dist/engines/manager.js +1 -1
  179. package/dist/engines/node-vitest/adapter/adapter.js +1 -1
  180. package/dist/engines/node-vitest/adapter/driver.js +2 -0
  181. package/dist/engines/node-vitest/adapter/evidence.js +2 -2
  182. package/dist/engines/node-vitest/adapter/failure-details.js +4 -2
  183. package/dist/engines/node-vitest/adapter/reporter.js +1 -1
  184. package/dist/engines/node-vitest/adapter/workspace.js +31 -192
  185. package/dist/engines/node-vitest/inventory/index.js +2 -0
  186. package/dist/engines/node-vitest/inventory/list-files.js +3 -0
  187. package/dist/engines/node-vitest/runtime/contract/index.js +1 -1
  188. package/dist/engines/node-vitest/runtime/data/http.js +1 -1
  189. package/dist/engines/node-vitest/runtime/data/index.js +1 -1
  190. package/dist/engines/node-vitest/runtime/data/report.js +5 -6
  191. package/dist/engines/node-vitest/runtime/data/scenario.js +2 -2
  192. package/dist/engines/node-vitest/runtime/runtime-input.js +1 -1
  193. package/dist/engines/node-vitest/selection.js +1 -0
  194. package/dist/engines/playwright/adapter/adapter.js +1 -1
  195. package/dist/engines/playwright/adapter/config.js +4 -4
  196. package/dist/engines/playwright/adapter/evidence-validation.js +1 -1
  197. package/dist/engines/playwright/adapter/evidence.js +1 -1
  198. package/dist/engines/playwright/adapter/reporter.js +1 -1
  199. package/dist/engines/playwright/runtime/config-file.js +1 -1
  200. package/dist/engines/playwright/runtime/config.js +1 -1
  201. package/dist/engines/playwright/runtime/runtime-input.js +43 -20
  202. package/dist/engines/runtime-input-file.js +1 -1
  203. package/dist/environment/lifecycle-artifacts.js +1 -1
  204. package/dist/environment/lifecycle-controller.js +1 -1
  205. package/dist/environment/lifecycle.js +1 -1
  206. package/dist/environment/ports.js +1 -0
  207. package/dist/environment/ready-environment.js +1 -1
  208. package/dist/environment/run-environment.js +1 -1
  209. package/dist/environment/run-stopping.js +1 -1
  210. package/dist/environment/runtime-contexts.js +1 -1
  211. package/dist/environment/runtime-manager.js +1 -1
  212. package/dist/environment/runtime-planning.js +1 -1
  213. package/dist/environment/runtime-preparation.js +1 -1
  214. package/dist/environment/services.js +3 -1
  215. package/dist/environment/state.js +1 -1
  216. package/dist/environment/template.js +1 -1
  217. package/dist/evidence/artifact-config.js +1 -1
  218. package/dist/evidence/artifact-validation.js +1 -1
  219. package/dist/evidence/artifacts.js +2 -2
  220. package/dist/evidence/bundles.js +1 -1
  221. package/dist/evidence/environment-record.js +1 -0
  222. package/dist/evidence/index.js +1 -1
  223. package/dist/evidence/logs.js +2 -2
  224. package/dist/evidence/operation-timings.js +1 -1
  225. package/dist/evidence/read-fields.js +1 -1
  226. package/dist/evidence/read-run.js +1 -1
  227. package/dist/evidence/reading.js +1 -1
  228. package/dist/evidence/redaction.js +4 -0
  229. package/dist/evidence/reporting.js +1 -1
  230. package/dist/evidence/run-model.js +1 -0
  231. package/dist/evidence/storage.js +2 -2
  232. package/dist/evidence/timing.js +1 -1
  233. package/dist/kernel/error-serialization.js +1 -1
  234. package/dist/kernel/redaction-targets.js +1 -0
  235. package/dist/kernel/redaction.js +4 -1
  236. package/dist/kernel/unknown-values.js +1 -1
  237. package/dist/process/environment.js +1 -1
  238. package/dist/process/execa-bundle.json +3 -3
  239. package/dist/process/files/json-file.js +1 -1
  240. package/dist/process/files/paths.js +1 -1
  241. package/dist/process/host/metadata.js +1 -1
  242. package/dist/process/host/platform.js +1 -1
  243. package/dist/process/host-process.js +1 -1
  244. package/dist/process/index.js +1 -1
  245. package/dist/process/lifecycle-fence.js +1 -1
  246. package/dist/process/locks.js +4 -4
  247. package/dist/process/port-listener.js +2 -0
  248. package/dist/process/process-group.js +1 -1
  249. package/dist/process/process-identity.js +1 -1
  250. package/dist/process/process.js +33 -33
  251. package/dist/process/readiness.js +1 -1
  252. package/dist/process/ready-deadline.js +1 -0
  253. package/dist/process/recovery.js +1 -1
  254. package/dist/process/runs/manifest.js +1 -1
  255. package/dist/process/runs/ownership.js +1 -1
  256. package/dist/process/runs/product-state.js +1 -1
  257. package/dist/process/runs/stop.js +1 -1
  258. package/dist/process/service-processes.js +1 -1
  259. package/dist/process/stoppable-settlement.js +1 -0
  260. package/dist/process/url-redaction.js +1 -0
  261. package/dist/process/windows-cli-owner.js +3 -3
  262. package/dist/process/windows-native.js +1 -1
  263. package/dist/repo/ci-environment.js +1 -1
  264. package/dist/repo/fingerprint-policy.js +1 -1
  265. package/dist/repo/managed-git.js +1 -1
  266. package/dist/repo/physical-tree.js +1 -1
  267. package/dist/repo/publish-directory.js +3 -0
  268. package/dist/repo/state.js +4 -4
  269. package/dist/steps/build-config.js +1 -1
  270. package/dist/steps/configured-step-testkit-modules.js +1 -1
  271. package/dist/steps/configured-steps.js +1 -1
  272. package/dist/steps/environment.js +1 -1
  273. package/dist/steps/index.js +1 -1
  274. package/dist/steps/run.js +2 -2
  275. package/dist/toolchains/archive.js +1 -1
  276. package/dist/toolchains/index.js +3 -3
  277. package/dist/toolchains/node-provisioning.js +2 -2
  278. package/dist/toolchains/semver.js +1 -1
  279. package/dist/toolchains/vitest/index.js +1 -1
  280. package/dist/tracker/redaction.js +1 -2
  281. package/dist/{config/runtime/build-assets.d.ts → types/config-build-assets.d.ts} +5 -3
  282. package/dist/{database/steps.d.ts → types/config-database-steps.d.ts} +7 -7
  283. package/dist/{config/runtime/next-runtime-tsconfig.d.ts → types/config-next-runtime-tsconfig.d.ts} +5 -3
  284. package/dist/types/config.d.ts +501 -0
  285. package/dist/types/drizzle.d.ts +13 -0
  286. package/dist/{config/runtime/env/index.d.ts → types/env.d.ts} +22 -20
  287. package/dist/types/environment.d.ts +40 -0
  288. package/dist/types/index.d.ts +21 -0
  289. package/dist/types/node-vitest-contract.d.ts +75 -0
  290. package/dist/types/node-vitest-data.d.ts +407 -0
  291. package/dist/types/playwright.d.ts +130 -0
  292. package/dist/types/tooling-vitest.d.ts +13 -0
  293. package/dist/types/workspace.d.ts +617 -0
  294. package/docs/bug-records.md +83 -81
  295. package/docs/engines.md +213 -0
  296. package/docs/test-types.md +35 -33
  297. package/package.json +22 -29
  298. package/testkit-config-schema.md +403 -171
  299. package/dist/app/bugs/areas.d.ts +0 -38
  300. package/dist/app/bugs/assessment.d.ts +0 -9
  301. package/dist/app/bugs/categories.d.ts +0 -41
  302. package/dist/app/bugs/ci-report.d.ts +0 -21
  303. package/dist/app/bugs/ci-summary.d.ts +0 -13
  304. package/dist/app/bugs/draft.d.ts +0 -70
  305. package/dist/app/bugs/facts.d.ts +0 -48
  306. package/dist/app/bugs/file.d.ts +0 -45
  307. package/dist/app/bugs/gate.d.ts +0 -22
  308. package/dist/app/bugs/guide.d.ts +0 -20
  309. package/dist/app/bugs/issue.d.ts +0 -18
  310. package/dist/app/bugs/known-failures.d.ts +0 -49
  311. package/dist/app/bugs/record.d.ts +0 -14
  312. package/dist/app/bugs/run-reading.d.ts +0 -51
  313. package/dist/app/bugs/store.d.ts +0 -34
  314. package/dist/app/campaigns/brief.d.ts +0 -7
  315. package/dist/app/campaigns/campaign.d.ts +0 -14
  316. package/dist/app/campaigns/index.d.ts +0 -38
  317. package/dist/app/campaigns/store.d.ts +0 -5
  318. package/dist/app/campaigns/summary.d.ts +0 -13
  319. package/dist/app/cleanup/index.d.ts +0 -52
  320. package/dist/app/db-schema/prepare.d.ts +0 -11
  321. package/dist/app/db-schema/refresh.d.ts +0 -17
  322. package/dist/app/db-schema/verify.d.ts +0 -11
  323. package/dist/app/destroy/index.d.ts +0 -16
  324. package/dist/app/discover/index.d.ts +0 -8
  325. package/dist/app/doctor/index.d.ts +0 -17
  326. package/dist/app/file-selection.d.ts +0 -1
  327. package/dist/app/inspect/artifacts.d.ts +0 -30
  328. package/dist/app/inspect/index.d.ts +0 -112
  329. package/dist/app/lint/index.d.ts +0 -28
  330. package/dist/app/lint/native.d.ts +0 -10
  331. package/dist/app/lint/options.d.ts +0 -67
  332. package/dist/app/lint/policy.d.ts +0 -21
  333. package/dist/app/lint/rules/data.d.ts +0 -3
  334. package/dist/app/lint/rules/engine-imports.d.ts +0 -3
  335. package/dist/app/lint/rules/syntax.d.ts +0 -4
  336. package/dist/app/lint/rules/unit.d.ts +0 -3
  337. package/dist/app/lint/shared.d.ts +0 -36
  338. package/dist/app/package-inspection.d.ts +0 -20
  339. package/dist/app/run/endpoint-readiness.d.ts +0 -43
  340. package/dist/app/run/endpoint-readiness.js +0 -1
  341. package/dist/app/run/engine-evidence-persistence.d.ts +0 -39
  342. package/dist/app/run/engine-execution-cleanup.d.ts +0 -8
  343. package/dist/app/run/engine-execution-cleanup.js +0 -1
  344. package/dist/app/run/engine-execution-failures.d.ts +0 -41
  345. package/dist/app/run/engine-execution-observer.d.ts +0 -21
  346. package/dist/app/run/engine-execution-reporting.d.ts +0 -17
  347. package/dist/app/run/engine-execution.d.ts +0 -63
  348. package/dist/app/run/engine-failure-stack.d.ts +0 -1
  349. package/dist/app/run/engine-orchestration.d.ts +0 -49
  350. package/dist/app/run/failure-details.d.ts +0 -37
  351. package/dist/app/run/live-run.d.ts +0 -27
  352. package/dist/app/run/operation-progress.d.ts +0 -13
  353. package/dist/app/run/orchestrator.d.ts +0 -68
  354. package/dist/app/run/planning-types.d.ts +0 -68
  355. package/dist/app/run/planning.d.ts +0 -15
  356. package/dist/app/run/playwright-configuration.d.ts +0 -2
  357. package/dist/app/run/playwright-configuration.js +0 -1
  358. package/dist/app/run/request.d.ts +0 -30
  359. package/dist/app/run/results.d.ts +0 -161
  360. package/dist/app/run/run-events.d.ts +0 -144
  361. package/dist/app/run/run-finalization.d.ts +0 -52
  362. package/dist/app/run/run-guards.d.ts +0 -3
  363. package/dist/app/run/runtime-failures.d.ts +0 -18
  364. package/dist/app/run/runtime-fixtures.d.ts +0 -2
  365. package/dist/app/run/runtime-task-types.d.ts +0 -20
  366. package/dist/app/run/scheduler/estimates.d.ts +0 -32
  367. package/dist/app/run/scheduler/identity.d.ts +0 -9
  368. package/dist/app/run/scheduler/index.d.ts +0 -124
  369. package/dist/app/run/scheduler/observations.d.ts +0 -20
  370. package/dist/app/run/selection.d.ts +0 -10
  371. package/dist/app/run/setup/runtime-node-setup-errors.d.ts +0 -13
  372. package/dist/app/run/setup/runtime-node-setup-protocol.d.ts +0 -85
  373. package/dist/app/run/setup/runtime-node-setup-worker.d.ts +0 -1
  374. package/dist/app/run/setup/runtime-node-setup.d.ts +0 -48
  375. package/dist/app/run/task-batches.d.ts +0 -23
  376. package/dist/app/run/worker-loop.d.ts +0 -57
  377. package/dist/app/setup/playwright.d.ts +0 -22
  378. package/dist/app/status/index.d.ts +0 -9
  379. package/dist/app/status/model.d.ts +0 -29
  380. package/dist/app/status/runs.d.ts +0 -99
  381. package/dist/app/stop/index.d.ts +0 -14
  382. package/dist/app/tracker/index.d.ts +0 -8
  383. package/dist/app/tracker/remote.d.ts +0 -13
  384. package/dist/app/tracker/token.d.ts +0 -7
  385. package/dist/app/typecheck/index.d.ts +0 -63
  386. package/dist/cli/command-catalog.d.ts +0 -137
  387. package/dist/cli/command-flags.d.ts +0 -19
  388. package/dist/cli/command-registry.d.ts +0 -3
  389. package/dist/cli/commands/artifacts.d.ts +0 -48
  390. package/dist/cli/commands/bug/file.d.ts +0 -16
  391. package/dist/cli/commands/bug/guide.d.ts +0 -5
  392. package/dist/cli/commands/bug/record.d.ts +0 -9
  393. package/dist/cli/commands/campaign/finish.d.ts +0 -10
  394. package/dist/cli/commands/campaign/start.d.ts +0 -7
  395. package/dist/cli/commands/campaign/status.d.ts +0 -13
  396. package/dist/cli/commands/ci/report.d.ts +0 -15
  397. package/dist/cli/commands/cleanup.d.ts +0 -13
  398. package/dist/cli/commands/db/schema/refresh.d.ts +0 -2
  399. package/dist/cli/commands/db/schema/verify.d.ts +0 -2
  400. package/dist/cli/commands/destroy.d.ts +0 -9
  401. package/dist/cli/commands/discover.d.ts +0 -2
  402. package/dist/cli/commands/doctor.d.ts +0 -2
  403. package/dist/cli/commands/guard/unsafe-entrypoint.d.ts +0 -2
  404. package/dist/cli/commands/lint.d.ts +0 -2
  405. package/dist/cli/commands/run/status.d.ts +0 -5
  406. package/dist/cli/commands/run/stop.d.ts +0 -7
  407. package/dist/cli/commands/run.d.ts +0 -9
  408. package/dist/cli/commands/setup/playwright.d.ts +0 -2
  409. package/dist/cli/commands/status.d.ts +0 -5
  410. package/dist/cli/commands/stop.d.ts +0 -12
  411. package/dist/cli/commands/typecheck.d.ts +0 -2
  412. package/dist/cli/commands/workspace.d.ts +0 -2
  413. package/dist/cli/entrypoint.d.ts +0 -1
  414. package/dist/cli/framework/command.d.ts +0 -21
  415. package/dist/cli/framework/definitions.d.ts +0 -100
  416. package/dist/cli/framework/errors.d.ts +0 -6
  417. package/dist/cli/framework/execute.d.ts +0 -14
  418. package/dist/cli/framework/help.d.ts +0 -11
  419. package/dist/cli/framework/index.d.ts +0 -3
  420. package/dist/cli/framework/parser.d.ts +0 -6
  421. package/dist/cli/index.d.ts +0 -4
  422. package/dist/cli/json-errors.d.ts +0 -3
  423. package/dist/cli/operations/db/schema/refresh/operation.d.ts +0 -7
  424. package/dist/cli/operations/db/schema/verify/operation.d.ts +0 -7
  425. package/dist/cli/operations/run/operation.d.ts +0 -24
  426. package/dist/cli/process-signal.d.ts +0 -1
  427. package/dist/cli/renderers/bug/text.d.ts +0 -8
  428. package/dist/cli/renderers/campaign/text.d.ts +0 -2
  429. package/dist/cli/renderers/ci/text.d.ts +0 -2
  430. package/dist/cli/renderers/cleanup/format.d.ts +0 -14
  431. package/dist/cli/renderers/db-schema/text.d.ts +0 -4
  432. package/dist/cli/renderers/destroy/text.d.ts +0 -4
  433. package/dist/cli/renderers/discover/report.d.ts +0 -7
  434. package/dist/cli/renderers/discover/text.d.ts +0 -3
  435. package/dist/cli/renderers/doctor/text.d.ts +0 -2
  436. package/dist/cli/renderers/lint/text.d.ts +0 -2
  437. package/dist/cli/renderers/run/events.d.ts +0 -8
  438. package/dist/cli/renderers/run/failure.d.ts +0 -8
  439. package/dist/cli/renderers/run/formatting.d.ts +0 -79
  440. package/dist/cli/renderers/run/status.d.ts +0 -6
  441. package/dist/cli/renderers/run/text-reporter.d.ts +0 -19
  442. package/dist/cli/renderers/status/text.d.ts +0 -2
  443. package/dist/cli/renderers/stop/text.d.ts +0 -7
  444. package/dist/cli/renderers/typecheck/text.d.ts +0 -2
  445. package/dist/cli/terminal/colors.d.ts +0 -10
  446. package/dist/cli/terminal/layout.d.ts +0 -11
  447. package/dist/cli/version-drift.d.ts +0 -25
  448. package/dist/config/authoring/build-config-contract.d.ts +0 -27
  449. package/dist/config/authoring/configured-step-contract.d.ts +0 -18
  450. package/dist/config/authoring/http-execution-contract.d.ts +0 -70
  451. package/dist/config/authoring/http-methods.d.ts +0 -18
  452. package/dist/config/authoring/index.d.ts +0 -381
  453. package/dist/config/authoring/preset-env.d.ts +0 -19
  454. package/dist/config/authoring/runtime.d.ts +0 -64
  455. package/dist/config/loader/bugs.d.ts +0 -15
  456. package/dist/config/loader/config-loader.d.ts +0 -9
  457. package/dist/config/loader/database-materialization.d.ts +0 -19
  458. package/dist/config/loader/database-roles.d.ts +0 -2
  459. package/dist/config/loader/database.d.ts +0 -55
  460. package/dist/config/loader/decode-discovery.d.ts +0 -5
  461. package/dist/config/loader/decode-execution.d.ts +0 -9
  462. package/dist/config/loader/dependencies.d.ts +0 -7
  463. package/dist/config/loader/discover-tests.d.ts +0 -111
  464. package/dist/config/loader/discovery-summary.d.ts +0 -29
  465. package/dist/config/loader/discovery.d.ts +0 -54
  466. package/dist/config/loader/env.d.ts +0 -4
  467. package/dist/config/loader/execution-model.d.ts +0 -16
  468. package/dist/config/loader/file-metadata.d.ts +0 -19
  469. package/dist/config/loader/index.d.ts +0 -10
  470. package/dist/config/loader/load.d.ts +0 -91
  471. package/dist/config/loader/managed-configs.d.ts +0 -23
  472. package/dist/config/loader/path-policy.d.ts +0 -9
  473. package/dist/config/loader/paths.d.ts +0 -5
  474. package/dist/config/loader/runtime-isolation.d.ts +0 -44
  475. package/dist/config/loader/runtime.d.ts +0 -25
  476. package/dist/config/loader/skip-config.d.ts +0 -44
  477. package/dist/config/loader/test-selection.d.ts +0 -15
  478. package/dist/config/loader/validation.d.ts +0 -16
  479. package/dist/config/loader/values.d.ts +0 -4
  480. package/dist/config/loader/values.js +0 -1
  481. package/dist/database/activity-gate.d.ts +0 -22
  482. package/dist/database/admin.d.ts +0 -31
  483. package/dist/database/cleanup.d.ts +0 -36
  484. package/dist/database/configured-steps.d.ts +0 -27
  485. package/dist/database/constants.d.ts +0 -11
  486. package/dist/database/docker-metadata.d.ts +0 -3
  487. package/dist/database/docker.d.ts +0 -65
  488. package/dist/database/drizzle/index.d.ts +0 -13
  489. package/dist/database/fingerprint.d.ts +0 -12
  490. package/dist/database/index.d.ts +0 -39
  491. package/dist/database/lifecycle-cleanup.d.ts +0 -7
  492. package/dist/database/local-postgres.d.ts +0 -71
  493. package/dist/database/naming.d.ts +0 -17
  494. package/dist/database/postgres/index.d.ts +0 -71
  495. package/dist/database/progress.d.ts +0 -6
  496. package/dist/database/roles.d.ts +0 -19
  497. package/dist/database/runtime-config.d.ts +0 -16
  498. package/dist/database/runtime-reservations.d.ts +0 -19
  499. package/dist/database/schema-operations.d.ts +0 -18
  500. package/dist/database/schema-source.d.ts +0 -96
  501. package/dist/database/source-refresh-lock.d.ts +0 -8
  502. package/dist/database/source-url.d.ts +0 -22
  503. package/dist/database/state-files.d.ts +0 -13
  504. package/dist/database/state.d.ts +0 -26
  505. package/dist/database/template-steps.d.ts +0 -39
  506. package/dist/domain/file-timeout.d.ts +0 -28
  507. package/dist/domain/identifiers.d.ts +0 -9
  508. package/dist/domain/operation-display.d.ts +0 -10
  509. package/dist/domain/operation-reason.d.ts +0 -5
  510. package/dist/domain/postgres-route.d.ts +0 -4
  511. package/dist/domain/runtime-identity.d.ts +0 -1
  512. package/dist/domain/runtime-isolation-contract.d.ts +0 -5
  513. package/dist/domain/service-name.d.ts +0 -2
  514. package/dist/domain/suite-selection.d.ts +0 -20
  515. package/dist/domain/test-outcomes.d.ts +0 -3
  516. package/dist/domain/test-types.d.ts +0 -16
  517. package/dist/engines/adapters/evidence-files.d.ts +0 -32
  518. package/dist/engines/adapters/evidence-identity.d.ts +0 -12
  519. package/dist/engines/adapters/execution.d.ts +0 -42
  520. package/dist/engines/adapters/native-report.d.ts +0 -25
  521. package/dist/engines/adapters/node-startup-cache.d.ts +0 -8
  522. package/dist/engines/adapters/workspace.d.ts +0 -4
  523. package/dist/engines/api/capabilities.d.ts +0 -31
  524. package/dist/engines/api/capabilities.js +0 -1
  525. package/dist/engines/api/evidence.d.ts +0 -38
  526. package/dist/engines/api/execution-observer.d.ts +0 -8
  527. package/dist/engines/api/execution-scope.d.ts +0 -17
  528. package/dist/engines/api/execution.d.ts +0 -101
  529. package/dist/engines/api/index.d.ts +0 -5
  530. package/dist/engines/api/k6-runtime-input.d.ts +0 -26
  531. package/dist/engines/api/k6-runtime-input.js +0 -1
  532. package/dist/engines/api/runtime-artifact.d.ts +0 -19
  533. package/dist/engines/bundle-cache.d.ts +0 -32
  534. package/dist/engines/catalog.d.ts +0 -27
  535. package/dist/engines/contracts/fixture-manifest.d.ts +0 -34
  536. package/dist/engines/contracts/json-bounds.d.ts +0 -36
  537. package/dist/engines/contracts/json-bounds.js +0 -2
  538. package/dist/engines/contracts/k6-repository-configuration.d.ts +0 -12
  539. package/dist/engines/contracts/k6-repository-configuration.js +0 -1
  540. package/dist/engines/contracts/test-context.d.ts +0 -15
  541. package/dist/engines/contracts/test-context.js +0 -1
  542. package/dist/engines/definitions.d.ts +0 -22
  543. package/dist/engines/factory.d.ts +0 -6
  544. package/dist/engines/generated-performance.d.ts +0 -1
  545. package/dist/engines/installation-catalog.d.ts +0 -27
  546. package/dist/engines/installation-catalog.js +0 -1
  547. package/dist/engines/installations/k6.d.ts +0 -98
  548. package/dist/engines/installations/k6.js +0 -1
  549. package/dist/engines/installations/node-vitest.d.ts +0 -33
  550. package/dist/engines/installations/package-requirements.d.ts +0 -28
  551. package/dist/engines/installations/package-resolution.d.ts +0 -51
  552. package/dist/engines/installations/playwright-resolution-child.d.ts +0 -1
  553. package/dist/engines/installations/playwright.d.ts +0 -75
  554. package/dist/engines/installations/types.d.ts +0 -10
  555. package/dist/engines/k6/adapter/bundle.d.ts +0 -25
  556. package/dist/engines/k6/adapter/bundle.js +0 -112
  557. package/dist/engines/k6/adapter/evidence.d.ts +0 -15
  558. package/dist/engines/k6/adapter/evidence.js +0 -4
  559. package/dist/engines/k6/adapter/executor.d.ts +0 -13
  560. package/dist/engines/k6/adapter/executor.js +0 -1
  561. package/dist/engines/k6/adapter/index.d.ts +0 -1
  562. package/dist/engines/k6/adapter/index.js +0 -1
  563. package/dist/engines/k6/adapter/input.d.ts +0 -21
  564. package/dist/engines/k6/adapter/input.js +0 -1
  565. package/dist/engines/k6/adapter/native-summary.d.ts +0 -11
  566. package/dist/engines/k6/adapter/native-summary.js +0 -1
  567. package/dist/engines/k6/adapter/repository-configuration.d.ts +0 -2
  568. package/dist/engines/k6/adapter/repository-configuration.js +0 -1
  569. package/dist/engines/k6/authoring-type-paths.d.ts +0 -3
  570. package/dist/engines/k6/authoring-type-paths.js +0 -1
  571. package/dist/engines/k6/runtime/ambient-types/bundle-manifest.json +0 -146
  572. package/dist/engines/k6/runtime/ambient-types/k6/LICENSE +0 -21
  573. package/dist/engines/k6/runtime/ambient-types/k6/browser/index.d.ts +0 -6332
  574. package/dist/engines/k6/runtime/ambient-types/k6/crypto/index.d.ts +0 -218
  575. package/dist/engines/k6/runtime/ambient-types/k6/data/index.d.ts +0 -16
  576. package/dist/engines/k6/runtime/ambient-types/k6/encoding/index.d.ts +0 -46
  577. package/dist/engines/k6/runtime/ambient-types/k6/execution/index.d.ts +0 -127
  578. package/dist/engines/k6/runtime/ambient-types/k6/experimental/csv/index.d.ts +0 -96
  579. package/dist/engines/k6/runtime/ambient-types/k6/experimental/fs/index.d.ts +0 -104
  580. package/dist/engines/k6/runtime/ambient-types/k6/experimental/redis/index.d.ts +0 -821
  581. package/dist/engines/k6/runtime/ambient-types/k6/experimental/streams/index.d.ts +0 -198
  582. package/dist/engines/k6/runtime/ambient-types/k6/global.d.ts +0 -83
  583. package/dist/engines/k6/runtime/ambient-types/k6/html/index.d.ts +0 -1325
  584. package/dist/engines/k6/runtime/ambient-types/k6/http/index.d.ts +0 -806
  585. package/dist/engines/k6/runtime/ambient-types/k6/index.d.ts +0 -126
  586. package/dist/engines/k6/runtime/ambient-types/k6/metrics/index.d.ts +0 -66
  587. package/dist/engines/k6/runtime/ambient-types/k6/net/grpc/index.d.ts +0 -247
  588. package/dist/engines/k6/runtime/ambient-types/k6/options/index.d.ts +0 -459
  589. package/dist/engines/k6/runtime/ambient-types/k6/package.json +0 -79
  590. package/dist/engines/k6/runtime/ambient-types/k6/secrets/index.d.ts +0 -36
  591. package/dist/engines/k6/runtime/ambient-types/k6/timers/index.d.ts +0 -47
  592. package/dist/engines/k6/runtime/ambient-types/k6/websockets/index.d.ts +0 -324
  593. package/dist/engines/k6/runtime/ambient-types/k6/ws/index.d.ts +0 -283
  594. package/dist/engines/k6/runtime/ambient-types/xk6-sql/LICENSE +0 -201
  595. package/dist/engines/k6/runtime/ambient-types/xk6-sql/index.d.ts +0 -397
  596. package/dist/engines/k6/runtime/ambient-types/xk6-sql/package.json +0 -15
  597. package/dist/engines/k6/runtime/artifacts.d.ts +0 -2
  598. package/dist/engines/k6/runtime/artifacts.js +0 -1
  599. package/dist/engines/k6/runtime/checks.d.ts +0 -17
  600. package/dist/engines/k6/runtime/checks.js +0 -1
  601. package/dist/engines/k6/runtime/dal-fixtures.d.ts +0 -24
  602. package/dist/engines/k6/runtime/dal-fixtures.js +0 -1
  603. package/dist/engines/k6/runtime/dal-suite.d.ts +0 -24
  604. package/dist/engines/k6/runtime/dal-suite.js +0 -1
  605. package/dist/engines/k6/runtime/dal.d.ts +0 -10
  606. package/dist/engines/k6/runtime/dal.js +0 -1
  607. package/dist/engines/k6/runtime/fixtures.d.ts +0 -3
  608. package/dist/engines/k6/runtime/fixtures.js +0 -1
  609. package/dist/engines/k6/runtime/http-assertions.d.ts +0 -19
  610. package/dist/engines/k6/runtime/http-assertions.js +0 -1
  611. package/dist/engines/k6/runtime/http-checks.d.ts +0 -19
  612. package/dist/engines/k6/runtime/http-checks.js +0 -1
  613. package/dist/engines/k6/runtime/http-suite-runtime.d.ts +0 -103
  614. package/dist/engines/k6/runtime/http-suite-runtime.js +0 -1
  615. package/dist/engines/k6/runtime/http.d.ts +0 -15
  616. package/dist/engines/k6/runtime/http.js +0 -1
  617. package/dist/engines/k6/runtime/index.d.ts +0 -11
  618. package/dist/engines/k6/runtime/index.js +0 -1
  619. package/dist/engines/k6/runtime/input.d.ts +0 -3
  620. package/dist/engines/k6/runtime/input.js +0 -1
  621. package/dist/engines/k6/runtime/k6-repository-configuration.d.ts +0 -9
  622. package/dist/engines/k6/runtime/k6-repository-configuration.js +0 -1
  623. package/dist/engines/k6/runtime/node-setup.d.ts +0 -13
  624. package/dist/engines/k6/runtime/node-setup.js +0 -1
  625. package/dist/engines/k6/runtime/runtime-globals.d.ts +0 -10
  626. package/dist/engines/k6/runtime/runtime.d.ts +0 -54
  627. package/dist/engines/k6/runtime/runtime.js +0 -1
  628. package/dist/engines/k6/runtime/shared/assertion-details.d.ts +0 -19
  629. package/dist/engines/k6/runtime/shared/assertion-details.js +0 -2
  630. package/dist/engines/k6/runtime/shared/db-normalization.d.ts +0 -19
  631. package/dist/engines/k6/runtime/shared/db-normalization.js +0 -1
  632. package/dist/engines/k6/runtime/shared/error-body.d.ts +0 -3
  633. package/dist/engines/k6/runtime/shared/error-body.js +0 -1
  634. package/dist/engines/k6/runtime/shared/file-data.d.ts +0 -1
  635. package/dist/engines/k6/runtime/shared/file-data.js +0 -1
  636. package/dist/engines/k6/runtime/shared/fixture-engine.d.ts +0 -8
  637. package/dist/engines/k6/runtime/shared/fixture-engine.js +0 -2
  638. package/dist/engines/k6/runtime/shared/http-check-plan.d.ts +0 -29
  639. package/dist/engines/k6/runtime/shared/http-check-plan.js +0 -1
  640. package/dist/engines/k6/runtime/shared/http-parsing.d.ts +0 -10
  641. package/dist/engines/k6/runtime/shared/http-parsing.js +0 -3
  642. package/dist/engines/k6/runtime/shared/ordering.d.ts +0 -2
  643. package/dist/engines/k6/runtime/shared/ordering.js +0 -1
  644. package/dist/engines/k6/runtime/shared/properties.d.ts +0 -1
  645. package/dist/engines/k6/runtime/shared/properties.js +0 -1
  646. package/dist/engines/k6/runtime/suite.d.ts +0 -4
  647. package/dist/engines/k6/runtime/suite.js +0 -1
  648. package/dist/engines/k6/runtime/types.d.ts +0 -244
  649. package/dist/engines/k6/runtime/types.js +0 -1
  650. package/dist/engines/k6/runtime/xk6-sql-driver-postgres.d.ts +0 -7
  651. package/dist/engines/k6/runtime/xk6-sql-driver-postgres.js +0 -1
  652. package/dist/engines/managed-module-resolution-policy-input.d.ts +0 -9
  653. package/dist/engines/managed-module-resolution-policy.d.ts +0 -25
  654. package/dist/engines/managed-module-resolution.d.ts +0 -13
  655. package/dist/engines/manager.d.ts +0 -25
  656. package/dist/engines/node-vitest/adapter/adapter.d.ts +0 -16
  657. package/dist/engines/node-vitest/adapter/consumer-typescript-paths.d.ts +0 -17
  658. package/dist/engines/node-vitest/adapter/consumer-typescript-paths.js +0 -3
  659. package/dist/engines/node-vitest/adapter/evidence.d.ts +0 -33
  660. package/dist/engines/node-vitest/adapter/failure-details.d.ts +0 -3
  661. package/dist/engines/node-vitest/adapter/index.d.ts +0 -1
  662. package/dist/engines/node-vitest/adapter/reporter.d.ts +0 -7
  663. package/dist/engines/node-vitest/adapter/resolution.d.ts +0 -12
  664. package/dist/engines/node-vitest/adapter/resolution.js +0 -1
  665. package/dist/engines/node-vitest/adapter/workspace.d.ts +0 -19
  666. package/dist/engines/node-vitest/runtime/contract/index.d.ts +0 -64
  667. package/dist/engines/node-vitest/runtime/data/http.d.ts +0 -4
  668. package/dist/engines/node-vitest/runtime/data/index.d.ts +0 -8
  669. package/dist/engines/node-vitest/runtime/data/primitives.d.ts +0 -1
  670. package/dist/engines/node-vitest/runtime/data/report.d.ts +0 -3
  671. package/dist/engines/node-vitest/runtime/data/runner.d.ts +0 -4
  672. package/dist/engines/node-vitest/runtime/data/scenario.d.ts +0 -12
  673. package/dist/engines/node-vitest/runtime/data/types.d.ts +0 -412
  674. package/dist/engines/node-vitest/runtime/runtime-input.d.ts +0 -64
  675. package/dist/engines/playwright/adapter/adapter.d.ts +0 -18
  676. package/dist/engines/playwright/adapter/attachments.d.ts +0 -26
  677. package/dist/engines/playwright/adapter/config.d.ts +0 -45
  678. package/dist/engines/playwright/adapter/evidence-validation.d.ts +0 -12
  679. package/dist/engines/playwright/adapter/evidence.d.ts +0 -32
  680. package/dist/engines/playwright/adapter/failure-details.d.ts +0 -2
  681. package/dist/engines/playwright/adapter/index.d.ts +0 -3
  682. package/dist/engines/playwright/adapter/reporter.d.ts +0 -12
  683. package/dist/engines/playwright/runtime/config-file.d.ts +0 -2
  684. package/dist/engines/playwright/runtime/config.d.ts +0 -24
  685. package/dist/engines/playwright/runtime/index.d.ts +0 -4
  686. package/dist/engines/playwright/runtime/runtime-input.d.ts +0 -36
  687. package/dist/engines/playwright/runtime/sandbox.d.ts +0 -84
  688. package/dist/engines/runtime-input-file.d.ts +0 -27
  689. package/dist/environment/lifecycle-artifacts.d.ts +0 -7
  690. package/dist/environment/lifecycle-controller.d.ts +0 -70
  691. package/dist/environment/lifecycle.d.ts +0 -29
  692. package/dist/environment/maintenance.d.ts +0 -68
  693. package/dist/environment/planning-types.d.ts +0 -35
  694. package/dist/environment/readiness.d.ts +0 -12
  695. package/dist/environment/readiness.js +0 -1
  696. package/dist/environment/ready-environment.d.ts +0 -19
  697. package/dist/environment/run-environment.d.ts +0 -38
  698. package/dist/environment/run-stopping.d.ts +0 -13
  699. package/dist/environment/runtime-contexts.d.ts +0 -33
  700. package/dist/environment/runtime-manager.d.ts +0 -95
  701. package/dist/environment/runtime-planning.d.ts +0 -16
  702. package/dist/environment/runtime-preparation.d.ts +0 -30
  703. package/dist/environment/runtime-service.d.ts +0 -18
  704. package/dist/environment/services.d.ts +0 -48
  705. package/dist/environment/state.d.ts +0 -18
  706. package/dist/environment/status-runtime.d.ts +0 -53
  707. package/dist/environment/template.d.ts +0 -180
  708. package/dist/evidence/artifact-config.d.ts +0 -14
  709. package/dist/evidence/artifact-validation.d.ts +0 -5
  710. package/dist/evidence/artifacts.d.ts +0 -75
  711. package/dist/evidence/bundles.d.ts +0 -27
  712. package/dist/evidence/ci-provenance.d.ts +0 -9
  713. package/dist/evidence/contracts.d.ts +0 -154
  714. package/dist/evidence/file-evidence.d.ts +0 -23
  715. package/dist/evidence/finalization.d.ts +0 -9
  716. package/dist/evidence/index.d.ts +0 -8
  717. package/dist/evidence/logs.d.ts +0 -31
  718. package/dist/evidence/operation-timings.d.ts +0 -60
  719. package/dist/evidence/read-bundle.d.ts +0 -4
  720. package/dist/evidence/read-fields.d.ts +0 -22
  721. package/dist/evidence/read-provenance.d.ts +0 -2
  722. package/dist/evidence/read-redaction.d.ts +0 -2
  723. package/dist/evidence/read-retention.d.ts +0 -2
  724. package/dist/evidence/read-run.d.ts +0 -2
  725. package/dist/evidence/reading.d.ts +0 -28
  726. package/dist/evidence/reporting-types.d.ts +0 -330
  727. package/dist/evidence/reporting.d.ts +0 -3
  728. package/dist/evidence/secure-file-copy.d.ts +0 -24
  729. package/dist/evidence/setup-progress.d.ts +0 -63
  730. package/dist/evidence/step-output.d.ts +0 -16
  731. package/dist/evidence/storage-inventory.d.ts +0 -27
  732. package/dist/evidence/storage.d.ts +0 -27
  733. package/dist/evidence/timing.d.ts +0 -23
  734. package/dist/file.d.ts +0 -11
  735. package/dist/index.d.ts +0 -4
  736. package/dist/kernel/error-serialization.d.ts +0 -38
  737. package/dist/kernel/redaction.d.ts +0 -2
  738. package/dist/kernel/unknown-values.d.ts +0 -6
  739. package/dist/kernel/work-metrics.d.ts +0 -6
  740. package/dist/process/capture-output.d.ts +0 -7
  741. package/dist/process/command-shell.d.ts +0 -1
  742. package/dist/process/environment-overlay.d.ts +0 -17
  743. package/dist/process/environment.d.ts +0 -33
  744. package/dist/process/files/contained-path.d.ts +0 -8
  745. package/dist/process/files/directory-status.d.ts +0 -14
  746. package/dist/process/files/dotenv.d.ts +0 -2
  747. package/dist/process/files/file-snapshot.d.ts +0 -34
  748. package/dist/process/files/json-file.d.ts +0 -12
  749. package/dist/process/files/paths.d.ts +0 -1
  750. package/dist/process/files/product-dir.d.ts +0 -1
  751. package/dist/process/files/temp-dir.d.ts +0 -11
  752. package/dist/process/host/metadata.d.ts +0 -6
  753. package/dist/process/host/platform.d.ts +0 -57
  754. package/dist/process/host-command.d.ts +0 -4
  755. package/dist/process/host-inspection-command.d.ts +0 -13
  756. package/dist/process/host-process.d.ts +0 -19
  757. package/dist/process/index.d.ts +0 -9
  758. package/dist/process/lifecycle-fence.d.ts +0 -11
  759. package/dist/process/locks.d.ts +0 -28
  760. package/dist/process/process-contracts.d.ts +0 -78
  761. package/dist/process/process-group.d.ts +0 -12
  762. package/dist/process/process-identity.d.ts +0 -27
  763. package/dist/process/process-limits.d.ts +0 -6
  764. package/dist/process/process.d.ts +0 -12
  765. package/dist/process/readiness.d.ts +0 -37
  766. package/dist/process/recovery.d.ts +0 -3
  767. package/dist/process/runs/inspection.d.ts +0 -5
  768. package/dist/process/runs/manifest.d.ts +0 -86
  769. package/dist/process/runs/ownership.d.ts +0 -11
  770. package/dist/process/runs/product-state.d.ts +0 -2
  771. package/dist/process/runs/schema.d.ts +0 -3
  772. package/dist/process/runs/stop.d.ts +0 -19
  773. package/dist/process/runtime-socket.d.ts +0 -4
  774. package/dist/process/service-processes.d.ts +0 -13
  775. package/dist/process/shutdown.d.ts +0 -10
  776. package/dist/process/windows-cli-owner.d.ts +0 -2
  777. package/dist/process/windows-native.d.ts +0 -6
  778. package/dist/process/windows-process-identity.d.ts +0 -4
  779. package/dist/repo/ci-environment.d.ts +0 -7
  780. package/dist/repo/fingerprint-policy.d.ts +0 -15
  781. package/dist/repo/git-path.d.ts +0 -2
  782. package/dist/repo/history.d.ts +0 -17
  783. package/dist/repo/managed-git.d.ts +0 -10
  784. package/dist/repo/metadata.d.ts +0 -3
  785. package/dist/repo/physical-tree.d.ts +0 -37
  786. package/dist/repo/remote.d.ts +0 -6
  787. package/dist/repo/state.d.ts +0 -26
  788. package/dist/repo/tree-listing.d.ts +0 -10
  789. package/dist/steps/build-config.d.ts +0 -35
  790. package/dist/steps/configured-step-testkit-modules.d.ts +0 -19
  791. package/dist/steps/configured-steps.d.ts +0 -51
  792. package/dist/steps/environment.d.ts +0 -84
  793. package/dist/steps/index.d.ts +0 -2
  794. package/dist/steps/module-runner.d.ts +0 -1
  795. package/dist/steps/run.d.ts +0 -36
  796. package/dist/toolchains/archive.d.ts +0 -53
  797. package/dist/toolchains/esbuild.d.ts +0 -9
  798. package/dist/toolchains/host-node-support.d.ts +0 -3
  799. package/dist/toolchains/index.d.ts +0 -114
  800. package/dist/toolchains/managed-node-releases.d.ts +0 -28
  801. package/dist/toolchains/node-cache.d.ts +0 -20
  802. package/dist/toolchains/node-integrity.d.ts +0 -18
  803. package/dist/toolchains/node-provisioning.d.ts +0 -29
  804. package/dist/toolchains/semver.d.ts +0 -13
  805. package/dist/toolchains/shared-operation.d.ts +0 -11
  806. package/dist/toolchains/timeouts.d.ts +0 -1
  807. package/dist/toolchains/vitest/index.d.ts +0 -13
  808. package/dist/tracker/gitea.d.ts +0 -14
  809. package/dist/tracker/github.d.ts +0 -14
  810. package/dist/tracker/http.d.ts +0 -33
  811. package/dist/tracker/index.d.ts +0 -4
  812. package/dist/tracker/redaction.d.ts +0 -4
  813. package/dist/tracker/requests.d.ts +0 -17
  814. package/dist/tracker/responses.d.ts +0 -24
  815. package/dist/tracker/types.d.ts +0 -51
  816. package/docs/engine-architecture.md +0 -654
  817. /package/dist/engines/{k6/runtime/runtime-globals.js → api/profiles.js} +0 -0
@@ -1 +1 @@
1
- import b from"node:path";import{mergeFailureDetails as x}from"./failure-details.js";export function buildServiceTrackers(e,i){const l=new Map;for(const t of e){const r=t.skipped?[]:t.suites.map(w),o={name:t.config.name,dbBackend:z(t.config),skipped:t.skipped===!0,suiteCount:r.length,suites:r,suitesByKey:new Map(r.map(n=>[n.key,n])),errors:[],errorSet:new Set,errorDetails:[],errorDetailSet:new Set,startedAt:i,firstTaskAt:null,lastTaskAt:null,totalTaskDurationMs:0};l.set(t.config.name,o)}return l}function w(e){const i=new Map;for(const l of e.files){const t=g(l);i.set(t,k(t,"not_run",null))}for(const l of e.skippedFiles??[])i.set(l.path,k(l.path,"skipped",l.reason));return{key:`${e.testType}:${e.name}`,name:e.name,testType:e.testType,engineId:e.engineId,profileId:e.profileId,orderIndex:e.orderIndex,failedFiles:[],failedFileSet:new Set,fileResultsByPath:i,durationMs:0,error:null}}function k(e,i,l){return{path:e,failed:i==="failed",durationMs:0,error:null,reason:l,status:i,artifacts:[],infraFailed:!1,blockedByRuntime:!1,failureDetails:[],checkDetails:[],runtimeIsolation:null,runtimeBatch:null,runtimeResets:[]}}function z(e){return e.testkit.database?"local":null}export function recordTaskOutcome(e,i,l,t=Date.now()){const r=e.get(i.serviceName);if(!r||r.skipped)return;const o=r.suitesByKey.get(i.suiteKey);if(!o)return;const n=P(l,i,t);r.firstTaskAt=r.firstTaskAt===null?n.startedAt:Math.min(r.firstTaskAt,n.startedAt),r.lastTaskAt=r.lastTaskAt===null?n.finishedAt:Math.max(r.lastTaskAt,n.finishedAt),r.totalTaskDurationMs+=n.durationMs,o.durationMs+=n.durationMs;const f=g(i.file),s=o.fileResultsByPath.get(f),u=s??k(f,n.status,n.reason);u.failed=n.status==="failed",u.durationMs=n.durationMs,u.error=n.error,u.reason=n.reason,u.status=n.status,u.artifacts=n.artifacts,u.infraFailed=n.infraFailed,u.blockedByRuntime=n.blockedByRuntime,u.failureDetails=n.failureDetails,u.checkDetails=n.checkDetails,u.runtimeIsolation=n.runtimeIsolation,u.runtimeBatch=n.runtimeBatch,u.runtimeResets=n.runtimeResets,s||o.fileResultsByPath.set(f,{...u}),n.status==="failed"&&!o.failedFileSet.has(i.file)&&(o.failedFileSet.add(i.file),o.failedFiles.push(i.file)),n.error&&!o.error&&(o.error=n.error)}function P(e,i,l){const t=e.durationMs??0,r=e.finishedAt??l;return{artifacts:e.artifacts??[],blockedByRuntime:e.blockedByRuntime??!1,checkDetails:e.checkDetails??[],durationMs:t,error:e.error??null,failureDetails:x(e.failureDetails??[]),finishedAt:r,infraFailed:e.infraFailed??!1,reason:e.reason??null,runtimeBatch:e.runtimeBatch??null,runtimeIsolation:e.runtimeIsolation??i.runtimeIsolation??null,runtimeResets:e.runtimeResets??[],startedAt:e.startedAt??Math.max(0,r-t),status:e.status}}export function recordGraphError(e,i,l,t=Date.now(),r={}){const o=i?.targetNames||[];for(const n of o){const f=e.get(n);f&&!f.skipped&&(addTrackerError(f,l,r),f.lastTaskAt=t)}}export function addTrackerError(e,i,l={}){const t=i.trim();if(!t)return;const r=l.classification??"product";e.errorSet.has(t)||(e.errorSet.add(t),e.errors.push(t));const o=`${r}\0${t}`;e.errorDetailSet.has(o)||(e.errorDetailSet.add(o),e.errorDetails.push({message:t,classification:r}))}export function finalizeServiceResult(e,i,l){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((a,d)=>a.orderIndex-d.orderIndex||a.name.localeCompare(d.name)).map(a=>v(a)),r=t.filter(a=>a.completedFileCount+a.skippedFileCount===a.fileCount).length,o=t.filter(a=>a.skippedFileCount===a.fileCount&&a.fileCount>0).length,n=t.filter(a=>a.failedFileCount>0).length,f=t.reduce((a,d)=>a+d.fileCount,0),s=t.reduce((a,d)=>a+d.completedFileCount,0),u=t.reduce((a,d)=>a+d.failedFileCount,0),D=t.reduce((a,d)=>a+d.passedFileCount,0),F=t.reduce((a,d)=>a+d.skippedFileCount,0),p=f-s-F,m=t.reduce((a,d)=>a+d.files.filter(c=>c.infraFailed===!0).length,0),C=t.reduce((a,d)=>a+d.files.filter(c=>c.blockedByRuntime===!0).length,0),B=t.reduce((a,d)=>a+d.files.filter(c=>c.status==="cancelled"||c.status==="interrupted").length,0),y=p>0&&B===p,R=p>0&&m===p,h=e.errorDetails,T=h.filter(a=>a.classification!=="infra").length,M=h.filter(a=>a.classification==="infra").length,S=m>0||M>0,I=C>0,A=e.firstTaskAt!==null&&e.lastTaskAt!==null?Math.max(0,e.lastTaskAt-e.firstTaskAt):Math.max(0,l-i);return{name:e.name,dbBackend:e.dbBackend,failed:n>0||T>0||r<e.suiteCount&&!y&&!R,infraFailed:S,blockedByRuntime:I,infraFailedFileCount:m,blockedByRuntimeFileCount:C,skipped:!1,suiteCount:e.suiteCount,completedSuiteCount:r,skippedSuiteCount:o,failedSuiteCount:n,totalFileCount:f,completedFileCount:s,passedFileCount:D,failedFileCount:u,skippedFileCount:F,notRunFileCount:p,durationMs:A,totalTaskDurationMs:e.totalTaskDurationMs,suites:t,errors:e.errors,errorDetails:h}}export function summarizeDbBackend(e){const i=[...new Set(e.map(l=>l.dbBackend).filter(l=>typeof l=="string"))];return i.length===0?null:i.length===1?i[0]:"mixed"}function v(e){const i=[...e.fileResultsByPath.values()].sort((s,u)=>s.path.localeCompare(u.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.checkDetails.length>0?{checkDetails:s.checkDetails}:{},...s.runtimeIsolation?{runtimeIsolation:s.runtimeIsolation}:{},...s.runtimeBatch?{runtimeBatch:s.runtimeBatch}:{},...s.runtimeResets.length>0?{runtimeResets:s.runtimeResets}:{}})),l=i.length,t=i.filter(s=>s.status==="passed").length,r=i.filter(s=>s.status==="failed").length,o=i.filter(s=>s.status==="skipped").length,n=t+r,f=l-n-o;return{name:e.name,testType:e.testType,engineId:e.engineId,profileId:e.profileId,failed:r>0,fileCount:l,completedFileCount:n,passedFileCount:t,failedFileCount:r,skippedFileCount:o,notRunFileCount:f,failedFiles:e.failedFiles,durationMs:e.durationMs,error:e.error,files:i}}function g(e){return e.split(b.sep).join("/")}
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:p=!1}={}){return{outputMode:p?"debug":"compact",setServicePlans(e){r({type:"run.service_plans",services:e.map(i=>({service:i.config.name,skipped:!!i.skipped,suites:i.suites.map(n=>({name:n.name,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,i){r({type:"run.toolchain_resolved",service:e.name,runtimeLabel:e.runtimeLabel||e.name,summary:i.summary})},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,i){r({type:"run.local_service_starting",service:e.name,runtimeLabel:e.runtimeLabel||e.name,command:i})},serviceSkipped(e,i){r({type:"run.service_skipped",service:e.name,reason:i})},plannedSkip(e){r({type:"run.task_planned_skip",service:e.serviceName,file:e.file,testType:e.testType,engineId:e.engineId,profileId:e.profileId,reason:e.reason||null})},taskStarted(e,i){r({type:"run.task_started",service:e.serviceName,file:e.file,suite:e.suiteName,testType:e.testType,engineId:e.engineId,profileId:e.profileId,targetName:i.name})},taskFinished(e,i){r({type:"run.task_finished",service:e.serviceName,file:e.file,suite:e.suiteName,testType:e.testType,engineId:e.engineId,profileId:e.profileId,outcome:i})},runtimeError(e,i){r({type:"run.runtime_error",service:e.serviceName,file:e.file,message:i})},warning(e){r({type:"run.warning",message:e})},writeDebugLine(e=""){r({type:"run.debug",line:e})},runSummary(e,i,n){r({type:"run.summary",results:e,durationMs:i,runStatus:n})}}}
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 j}from"../../evidence/finalization.js";import{collectTestkitStorageInventory as k,writeRunArtifact as w}from"../../evidence/index.js";import{buildRunArtifact as x}from"../../evidence/reporting.js";import{summarizeDbBackend as C}from"./results.js";export async function finalizeRunArtifacts({productDir:t,runId:e,results:r,startedAt:a,finishedAt:i,execution:R,workerCount:b,runtimeInstanceCount:y,runtimeStats:v,selection:n,archiveConfig:c=null,declaredEnvironmentKeys:p=[],metadata:F,logRegistry:f,setupRegistry:S,operationTimingRegistry:h=null,reporter:z,runInterruptReason:d=null,runStatus:u=null,publishRunFinalization:m}){const s=x({productDir:t,runId:e,results:r,startedAt:a,finishedAt:i,execution:R,workerCount:b,runtimeInstanceCount:y,runtimeStats:v,typeValues:n.typeValues,suiteSelectors:n.suiteSelectors,fileNames:n.fileNames,serviceFilter:n.serviceFilter,planning:n.planning??null,archiveConfig:c,declaredEnvironmentKeys:p,metadata:F,summarizeDbBackend:C,serviceLogs:f.listServiceLogs(),setupLogs:f.listSetupLogs(),setupOperations:S.listOperations(),operationTimings:h?.listOperations()??[],runInterruptReason:d,runStatus:u}),O=V(s.storage),L=k(t);s.storage={...O??{},testkit:L};const A=u==="failed"||r.some(o=>o.failed||o.infraFailed)?"failed":"passed",g=o=>{T(s,o);const l=N({archiveConfig:c,declaredEnvironmentKeys:p,productDir:t,runArtifact:s});return z?.runSummary?.(r,i-a,l.runArtifact.run.status==="interrupted"?"interrupted":l.runArtifact.run.status==="failed"?"failed":"passed"),l};return m?await m(A,g):g(j(A,{interrupted:u==="interrupted",interruptReason:u==="interrupted"?d:null}))}function N({archiveConfig:t,declaredEnvironmentKeys:e,productDir:r,runArtifact:a}){const i=w(r,a,{archiveConfig:t,declaredEnvironmentKeys:e});return{runArtifact:i,shouldFailArchiveCleanup:i.archive.cleanup?.status==="failed",shouldFailArchivePublication:i.archive.publication.status==="failed"&&i.archive.publication.required===!0}}function T(t,e){if(t.run.status=e.artifactStatus,e.artifactStatus!=="interrupted"){delete t.run.interruptReason;return}t.run.interruptReason=e.interruptReason??"run interrupted"}function V(t){return q(t)?t:null}function q(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}
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
- import x from"crypto";import p from"fs";import o from"path";const g=["__testkit__/fixtures"],P=new Map([[".csv","text/csv"],[".gif","image/gif"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".json","application/json"],[".pdf","application/pdf"],[".png","image/png"],[".txt","text/plain"],[".webp","image/webp"],[".xls","application/vnd.ms-excel"],[".xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],[".zip","application/zip"]]);export function buildRuntimeFixtureManifest(t,s){const i=d(t,s),e=[],n=new Set;for(const r of i)if(p.existsSync(r.absolutePath))for(const a of u(r.absolutePath)){const c=l(o.relative(t,a));if(n.has(c))continue;n.add(c);const f=l(o.relative(r.absolutePath,a)),h=p.statSync(a),m=p.readFileSync(a);e.push({aliases:[...new Set([f,o.basename(a),c])],absolutePath:a,contentType:y(a),filename:o.basename(a),path:c,root:r.relativePath,rootRelativePath:f,sha256:x.createHash("sha256").update(m).digest("hex"),sizeBytes:h.size})}return e.sort((r,a)=>r.path.localeCompare(a.path)),{version:1,testFile:l(s),entries:e}}function d(t,s){const i=[],e=o.dirname(s);i.push({relativePath:l(o.join(e,"__fixtures__")),absolutePath:o.join(t,e,"__fixtures__")});for(const n of g)i.push({relativePath:n,absolutePath:o.join(t,n)});return i}function u(t){const s=[],i=p.readdirSync(t,{withFileTypes:!0}).sort((e,n)=>e.name.localeCompare(n.name));for(const e of i){const n=o.join(t,e.name);e.isDirectory()?s.push(...u(n)):e.isFile()&&s.push(n)}return s}function y(t){return P.get(o.extname(t).toLowerCase())??"application/octet-stream"}function l(t){return t.split(o.sep).join("/")}
1
+ import x from"crypto";import c from"fs";import s from"path";import{posixPath as l}from"../../process/files/paths.js";const g=["__testkit__/fixtures"],P=new Map([[".csv","text/csv"],[".gif","image/gif"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".json","application/json"],[".pdf","application/pdf"],[".png","image/png"],[".txt","text/plain"],[".webp","image/webp"],[".xls","application/vnd.ms-excel"],[".xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],[".zip","application/zip"]]);export function buildRuntimeFixtureManifest(e,n){const i=d(e,n),t=[],o=new Set;for(const r of i)if(c.existsSync(r.absolutePath))for(const a of h(r.absolutePath)){const p=l(s.relative(e,a));if(o.has(p))continue;o.add(p);const f=l(s.relative(r.absolutePath,a)),m=c.statSync(a),u=c.readFileSync(a);t.push({aliases:[...new Set([f,s.basename(a),p])],absolutePath:a,contentType:y(a),filename:s.basename(a),path:p,root:r.relativePath,rootRelativePath:f,sha256:x.createHash("sha256").update(u).digest("hex"),sizeBytes:m.size})}return t.sort((r,a)=>r.path.localeCompare(a.path)),{version:1,testFile:l(n),entries:t}}function d(e,n){const i=[],t=s.dirname(n);i.push({relativePath:l(s.join(t,"__fixtures__")),absolutePath:s.join(e,t,"__fixtures__")});for(const o of g)i.push({relativePath:o,absolutePath:s.join(e,o)});return i}function h(e){const n=[],i=c.readdirSync(e,{withFileTypes:!0}).sort((t,o)=>t.name.localeCompare(o.name));for(const t of i){const o=s.join(e,t.name);t.isDirectory()?n.push(...h(o)):t.isFile()&&n.push(o)}return n}function y(e){return P.get(s.extname(e).toLowerCase())??"application/octet-stream"}
@@ -1 +1 @@
1
- export const DEFAULT_ESTIMATE_SOURCE="default";export function estimateTask({task:n,suite:i,timings:e}){const t=s(e,n);return t||{durationMs:o(n,i),source:DEFAULT_ESTIMATE_SOURCE,confidence:"low",runs:0,key:null}}function o(n,i){const e=n.engineId==="playwright"?2e4:n.testType==="dal"?4e3:8e3,t=i.weight??1,r=Math.max(1,i.files?.length??1);return Math.max(1e3,Math.round(e*t/r))}function s(n,i){const e=i.timingKey;if(!e)return null;const t=n?.files[e],r=t?.durationMs||t?.avgDurationMs||0;if(r<=0)return null;const u=t?.runs??0;return{durationMs:Math.max(1,Math.round(r)),source:"timings",confidence:u>=3?"high":"medium",runs:u,key:e}}
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{resolveEngineProfile as n}from"../../../engines/catalog.js";export function buildSchedulerTaskKey({serviceName:c,testType:o,engineId:i,profileId:r,file:e}){const t=n(o,i);if(t.id!==r)throw new Error(`Task execution identity ${o}/${i}/${r} conflicts with catalog profile ${t.id}`);return[c,o,i,r,e.split(l.sep).join("/").replace(/^\.\/+/,"")].join("|")}
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{buildSchedulerTaskKey as f}from"./identity.js";import{estimateTask as y}from"./estimates.js";import{matchesSuiteSelectors as g}from"../../../domain/suite-selection.js";import{resolveRuntimeIsolationPolicy as h}from"../../../config/loader/index.js";export const SCHEDULER_POLICY="longest-estimated-duration-first",SCHEDULER_VERSION=2;const k=String;export function buildScheduledQueue(i,s,{timings:e}={}){const t=new Map;for(const o of s)t.set(o.key,o);const r=[];let c=1;for(const o of i){if(o.skipped)continue;const a=t.get(o.assignedGraphKey);if(!a)throw new Error(`Assigned graph "${String(o.assignedGraphKey)}" not found for ${o.config.name}`);for(const n of o.suites)for(const l of n.files){const d={id:c,graphKey:a.key,targetName:o.config.name,serviceName:o.config.name,suiteKey:`${n.testType}:${n.name}`,suiteName:n.name,testType:n.testType,engineId:n.engineId,profileId:n.profileId,orderIndex:n.orderIndex,file:l,locks:I(o.config,n,l),runtimeIsolation:h(o.config,n,l),resourceCost:1},p=f(d),m={...d,timingKey:p},u=y({task:m,suite:n,timings:e});r.push({...m,estimatedDurationMs:u.durationMs,estimateSource:u.source,estimateConfidence:u.confidence,estimateRuns:u.runs,estimateKey:u.key}),c+=1}}return r.sort(compareScheduledTasks).map((o,a)=>({...o,schedulerRank:a+1,schedulerPolicy:SCHEDULER_POLICY}))}export function buildRunPlanningMetadata(i,s=[]){return{scheduler:{policy:SCHEDULER_POLICY,version:SCHEDULER_VERSION},resourceBudgets:v(s),tasks:(i||[]).map(e=>({rank:e.schedulerRank||null,id:e.id,service: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}))}}function v(i){const s=new Map;for(const e of i||[])for(const t of e.resourceReservations||[]){const r=s.get(t.key)||{key:t.key,kind:t.kind,scope:t.scope,resourceName:t.resourceName,capacity:t.capacity,reserved:t.reserved,available:t.available,graphs:[]};r.capacity=Math.max(r.capacity||0,t.capacity||0),r.reserved=Math.max(r.reserved||0,t.reserved||0),r.available=Math.max(0,r.capacity-r.reserved),r.graphs.push({graphKey:e.key,services:t.services||[],perRuntime:t.perRuntime}),s.set(t.key,r)}return[...s.values()].sort((e,t)=>e.key.localeCompare(t.key))}export function compareScheduledTasks(i,s){return s.estimatedDurationMs-i.estimatedDurationMs||i.serviceName.localeCompare(s.serviceName)||i.suiteKey.localeCompare(s.suiteKey)||i.file.localeCompare(s.file)}function I(i,s,e){const t=new Set;s.testType==="dal"&&t.add(`database:${i.name}`);const r=i.testkit.requirements?.suites||[];for(const a of r)if(g(s.testType,s.name,[a.selector]))for(const n of a.locks||[])t.add(n);const c=k(e).split("\\").join("/"),o=i.testkit.fileMetadataByPath?.get(c)||null;for(const a of i.testkit.requirements?.fileLocksByPath?.get(c)||[])t.add(a);for(const a of o?.locks||[])t.add(a);return[...t].sort()}
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)}
@@ -0,0 +1 @@
1
+ export function createTaskLocks(){const e=new Map;return{available(o){return o.every(r=>!e.has(r))},acquire(o,r){const n=[...new Set(o)],t=n.find(a=>e.has(a));if(t!==void 0)throw new Error(`Lock "${t}" is already held by ${String(e.get(t))}`);for(const a of n)e.set(a,r)},release(o,r){for(const n of o)e.get(n)===r&&e.delete(n)}}}
@@ -1 +1 @@
1
- export function findUnmatchedRequestedFiles(e,n,t,o,s,l){const f=new Set;for(const i of e){const c=s(i,n,t,[],{ignoreSkipRules:!0});for(const u of c)for(const r of u.files)f.add(l(r))}return[...new Set(o.map(l))].filter(i=>!f.has(i))}export function isFullRunSelection(e,n,t,o){return e.length===1&&e[0]==="all"&&n.length===0&&t.length===0&&o===null}
1
+ export function findUnmatchedRequestedFiles(o,s,f,i,c,t){const n=new Set;for(const e of o){const u=c(e,s,f,[],{ignoreSkipRules:!0});for(const d of u)for(const r of d.files)n.add(t(r))}return[...new Set(i.map(t))].filter(e=>!n.has(e))}
@@ -1 +1 @@
1
- export const MAX_RUNTIME_NODE_SETUP_DATA_BYTES=1048576,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 k(e)&&(e.type==="cleanup"||e.type==="abort"&&u(e.error)&&N(e.kind))}export function readRuntimeNodeSetupWorkerMessage(e){if(!k(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"setup-error":if(!u(e.error)||!N(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 N(e){return e==="cancelled"||e==="deadline"||e==="infra"||e==="product"}function u(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function k(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"),o=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 o=="string"&&o?o:"Error",...typeof i=="string"?{stack:i}:{}}}export function serializeRuntimeNodeSetupCleanupFailures(e){return e.map(({error:r,owner:o})=>({error:serializeRuntimeNodeSetupError(r),owner:o}))}function g(e,r){const o=new Set;try{for(;u(e)&&!o.has(e);){o.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={},o=new Set,i=[{value:e===void 0?{}:e,path:"$",target:r,key:"data"}];let b=0;const a=(p,t)=>{throw new TypeError(`Runtime node setup data at ${p} must be plain JSON: ${t}`)},y=(p,t)=>{b+=p,b>1048576&&a(t,"must encode to no more than 1048576 bytes")};for(;i.length;){const p=i.pop();if(!p)break;if("leave"in p){o.delete(p.leave);continue}const{value:t,path:s,target:h,key:S}=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(h,S,{value:t,enumerable:!0,writable:!0,configurable:!0});continue}typeof t!="object"&&a(s,`unsupported ${typeof t} value`),o.has(t)&&a(s,"circular reference");const c=Array.isArray(t),A=Object.getPrototypeOf(t);!c&&A!==Object.prototype&&A!==null&&a(s,"expected a plain object");const l=Reflect.ownKeys(t).filter(n=>!c||n!=="length");c&&l.length!==t.length&&a(s,"sparse array or extra array properties");const E=c?[]:{};Object.defineProperty(h,S,{value:E,enumerable:!0,writable:!0,configurable:!0}),y(2+Math.max(0,l.length-1),s),o.add(t),i.push({leave:t});const m=[];for(const n of l){typeof n!="string"&&a(s,"symbol key");const f=c?`${s}[${n}]`:/^[A-Za-z_$][\w$]*$/u.test(n)?`${s}.${n}`:`${s}[${JSON.stringify(n)}]`;c&&(!/^(?:0|[1-9]\d*)$/u.test(n)||Number(n)>=t.length)&&a(f,"extra array property");const d=Object.getOwnPropertyDescriptor(t,n);(!d||!("value"in d)||!d.enumerable)&&a(f,"expected an enumerable data property"),c||y(Buffer.byteLength(JSON.stringify(n))+1,f),m.push({value:d.value,path:f,target:E,key:n})}for(let n=m.length-1;n>=0;n-=1)i.push(m[n])}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 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");return r}
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 X,createSetupFailure as w}from"./runtime-node-setup-errors.js";import Y from"node:http";import{pathToFileURL as G}from"node:url";import{parentPort as q,workerData as J}from"node:worker_threads";import{isRuntimeNodeSetupParentMessage as Q,isRuntimeNodeSetupWorkerRequest as W,MAX_RUNTIME_NODE_SETUP_SIDECARS as F,normalizeRuntimeNodeSetupData as K,normalizeRuntimeNodeSetupSidecarId as V,normalizeRuntimeNodeSetupSidecarPath as Z,serializeRuntimeNodeSetupError as $,serializeRuntimeNodeSetupCleanupFailures as ee}from"./runtime-node-setup-protocol.js";const te=1024*1024,ne=100,re=8*1024*1024,oe=8*1024*1024,se=1e3,ae=256,s=we(J),O=Te(),p=new AbortController,B=[],A=new Set,C=[];let E=null,D=0,u="starting",_=null;O.on("message",e=>{ue(e)}),L(),ie();async function ie(){try{const t=await import(`${G(s.modulePath).href}?testkit=${encodeURIComponent(s.sessionId)}`);I();const n=fe(t);if(!n)throw new TypeError(`Runtime node setup "${s.moduleRelativePath}" must export a setup function`);const r=await n(ce()),o=me(r);o&&B.push({callback:o,owner:"consumer"}),I();const c=K(ye(r));b(),u="ready",d({sessionId:s.sessionId,setupData:c,sidecars:C.map(f=>({...f})),type:"ready"})}catch(e){const t=X(e),n=await P();u="cleaned",b(),d({cleanupFailures:n,error:$(e),kind:t,sessionId:s.sessionId,type:"setup-error"})}}async function ue(e){if(!Q(e)||e.sessionId!==s.sessionId){await x(w("infra","Runtime node setup worker received an invalid parent message"));return}if(e.type==="abort"){if(p.abort(w(e.kind,e.error.message)),d({sessionId:s.sessionId,type:"abort-acknowledged"}),u==="ready"){u="cleaning";const n=await P();u="cleaned",b(),d({cleanupFailures:n,sessionId:s.sessionId,type:"aborted"})}return}if(u==="cleaned"){d({cleanupFailures:[],sessionId:s.sessionId,type:"cleanup-complete"});return}if(u!=="ready"){await x(w("infra",`Runtime node setup cleanup is invalid during phase "${u}"`));return}u="cleaning";const t=await P();u="cleaned",b(),d({cleanupFailures:t,sessionId:s.sessionId,type:"cleanup-complete"})}async function x(e){p.abort(e);const t=await P();u="cleaned",b(),d({cleanupFailures:t,error:$(e),kind:"infra",sessionId:s.sessionId,type:"setup-error"})}function ce(){return{deadlineMs:s.deadlineMs,env:{...s.runtimeEnv},leaseDir:s.leaseDir,productDir:s.productDir,serviceName:s.serviceName,sidecars:{httpCapture(e={}){if(I(),C.length+D>=F)return Promise.reject(new RangeError(`Runtime node setup may create at most ${F.toString()} sidecars`));D+=1;const t=de(e).then(n=>(B.push({callback:n.cleanup,owner:"testkit"}),C.push(n.handle),I(),n.handle)).finally(()=>{D-=1,A.delete(t)});return A.add(t),t}},signal:p.signal,testFile:s.testFile}}async function de(e){const t=[],n=new Set;let r=0;const o=V(e.id),c=Z(e.path),f=j(e.maxRequests,ne,se,"maxRequests"),m=j(e.maxBodyBytes,te,re,"maxBodyBytes"),T=Se(e.status,204),l="/__testkit__/requests",S="/__testkit__/requests",a=Y.createServer((i,R)=>{if(i.method==="GET"&&i.url===l){g(R,200,{requests:t});return}if(i.method==="DELETE"&&i.url===S){t.splice(0),r=0,g(R,200,{ok:!0});return}pe(i,m).then(h=>{const U={bodyBytes:h.bodyBytes,bodyText:h.retainedBody.toString("utf8"),bodyTruncated:h.bodyBytes>h.retainedBody.length,headers:i.headers,method:i.method??null,path:i.url??null,receivedAt:new Date().toISOString()};for(r+=Buffer.byteLength(U.bodyText),t.push(U);t.length>f||r>oe;){const M=t.shift();if(!M)break;r-=Buffer.byteLength(M.bodyText)}g(R,T,{ok:!0})}).catch(h=>{g(R,500,{error:be(h)})})});a.maxConnections=ae,a.requestTimeout=3e4,a.headersTimeout=3e4,a.keepAliveTimeout=1e3,a.on("connection",i=>{n.add(i),i.once("close",()=>n.delete(i))}),await le(a);const y=a.address();if(y===null||typeof y=="string")throw await H(a,n),new Error("Runtime node HTTP capture did not bind a TCP port");const k=`http://127.0.0.1:${y.port.toString()}`,z={id:o,requestsUrl:`${k}${l}`,resetUrl:`${k}${S}`,type:"http-capture",url:`${k}${c}`};return{cleanup:()=>H(a,n),handle:z}}function le(e){return new Promise((t,n)=>{const r=o=>{n(o)};e.once("error",r),e.listen(0,"127.0.0.1",()=>{e.off("error",r),t()})})}function H(e,t){if(!e.listening){for(const n of t)n.destroy();return Promise.resolve()}return new Promise((n,r)=>{e.close(o=>{o?r(o):n()}),e.closeIdleConnections(),e.closeAllConnections();for(const o of t)o.destroy()})}function pe(e,t){return new Promise((n,r)=>{const o=[];let c=0,f=0,m=!1;const T=l=>{m||(m=!0,r(Re(l)))};e.on("data",l=>{if(m)return;if(typeof l!="string"&&!(l instanceof Uint8Array)){T(new TypeError("HTTP capture received an unsupported body chunk"));return}const S=Buffer.from(l);c=Math.min(Number.MAX_SAFE_INTEGER,c+S.length);const a=t-f;if(a>0){const y=S.subarray(0,a);o.push(y),f+=y.length}}),e.once("aborted",()=>{T(new Error("HTTP request was aborted"))}),e.once("error",T),e.once("end",()=>{m||(m=!0,n({bodyBytes:c,retainedBody:Buffer.concat(o,f)}))})})}function g(e,t,n){e.destroyed||e.writableEnded||(e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n)))}function fe(e){if(!N(e))return null;const t=e.setup??e.default;return typeof t=="function"?t:null}function me(e){if(!N(e))return null;const t=v(e,"cleanup");return typeof t=="function"?t:null}function ye(e){return N(e)&&("data"in e||"cleanup"in e)?Object.hasOwn(e,"data")?v(e,"data"):{}:e??{}}function v(e,t){let n=e;for(;n!==null;){const r=Object.getOwnPropertyDescriptor(n,t);if(r){if(!("value"in r))throw new TypeError(`Runtime node setup data at $.${t} must be an enumerable data property`);return r.value}n=Object.getPrototypeOf(n)}}function P(){return E!==null||(E=(async()=>{await Promise.allSettled([...A]);const e=[],t=B.splice(0).reverse();d({owners:t.map(({owner:n})=>n),sessionId:s.sessionId,type:"cleanup-started"});for(const[n,{callback:r,owner:o}]of t.entries()){d({owner:o,remainingCallbacks:t.length-n,sessionId:s.sessionId,type:"cleanup-progress"});try{await r()}catch(c){e.push({error:c,owner:o})}}return ee(e)})()),E}function L(){const e=s.deadlineMs-Date.now();if(e<=0){p.abort(he());return}_=setTimeout(L,Math.min(e,2147483647))}function b(){_!==null&&clearTimeout(_),_=null}function he(){return w("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){O.postMessage(e)}function we(e){if(!W(e))throw w("infra","Runtime node setup worker received invalid worker data");return e}function Te(){if(q===null)throw w("infra","Runtime node setup worker requires a parent port");return q}function j(e,t,n,r){if(e===void 0)return t;const o=Number(e);if(!Number.isInteger(o)||o<=0||o>n)throw new RangeError(`Runtime node HTTP capture ${r} must be an integer between 1 and ${n.toString()}`);return o}function Se(e,t){if(e===void 0)return t;const n=Number(e);return Number.isInteger(n)&&n>=100&&n<=599?n:t}function N(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function be(e){return e instanceof Error?e.message:String(e)}function Re(e){return e instanceof Error?e:new Error(String(e))}
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}
@@ -1,3 +1,3 @@
1
- import{classifyRuntimeNodeSetupFailure as R,createSetupFailure as o,createSetupCleanupError as D,createSetupCleanupTimeoutError as y,createUnacknowledgedSetupCleanupError as b,withSetupCleanupFailures as h}from"./runtime-node-setup-errors.js";export{classifyRuntimeNodeSetupFailure,getRuntimeNodeSetupCleanupFailures}from"./runtime-node-setup-errors.js";import _ from"node:fs";import{randomUUID as F}from"node:crypto";import a from"node:path";import{Worker as j}from"node:worker_threads";import{isEngineTaskDeadlineExceededReason as x}from"../../../engines/api/index.js";import{readRuntimeNodeSetupWorkerMessage as M,serializeRuntimeNodeSetupError as A}from"./runtime-node-setup-protocol.js";const E=100,N=5e3;export const MAX_RUNTIME_NODE_SETUP_CLEANUP_TIMEOUT_MS=6e4;class C{#o;#m;#i;#w;#c=$();#d;#a;#R=!1;#k=null;#r=null;#s=null;#u=0;#h=null;#f=null;#$=!1;#t="starting";#v=!1;#e=null;#g=null;constructor(e,t,r){this.#w=e,this.#d=t,this.#m=e.deadlineMs,this.#i=e.moduleRelativePath,this.#o=r,this.#a=new j(new URL("./runtime-node-setup-worker.js",import.meta.url),{name:"testkit-runtime-node-setup",workerData:e}),this.#a.on("message",s=>{this.#j(s).catch(n=>{this.#T(o("infra",`Runtime node setup worker for "${this.#i}" sent an invalid message`,n))})}),this.#a.once("error",s=>{this.#T(o("infra",`Runtime node setup worker failed for "${this.#i}"`,s))}),this.#a.once("exit",s=>{this.#$||this.#T(o("infra",`Runtime node setup worker for "${this.#i}" exited unexpectedly with code ${s.toString()}`))}),this.#d.addEventListener("abort",this.#S,{once:!0}),this.#_()}start(){return this.#d.aborted?this.#p(m(this.#d.reason,this.#i)):Date.now()>=this.#m&&this.#p(c(this.#m,this.#i)),this.#c.promise}cleanup=()=>{if(this.#r!==null)return this.#r.promise;const e=$();if(this.#r=e,this.#e!==null&&this.#t==="cleaning")return e.promise;if(this.#e!==null||this.#t==="terminated")return this.#L(),e.promise;if(this.#t!=="ready")return this.#E(o("infra",`Runtime node setup cleanup is invalid during phase "${this.#t}"`)),e.promise;this.#t="cleaning",this.#h=setTimeout(()=>{this.#E(this.#O())},this.#o);try{this.#a.postMessage({sessionId:this.#w.sessionId,type:"cleanup"})}catch(t){this.#E(o("infra",`Could not request runtime node setup cleanup for "${this.#i}"`,t))}return e.promise};#S=()=>{this.#p(m(this.#d.reason,this.#i))};async#j(e){const t=M(e);if(t===null||t.sessionId!==this.#w.sessionId){this.#n(`Runtime node setup worker for "${this.#i}" sent an invalid message`);return}switch(t.type){case"abort-acknowledged":this.#x();return;case"cleanup-started":this.#M(t.owners);return;case"cleanup-progress":this.#A(t.owner,t.remainingCallbacks);return;case"ready":this.#N(t);return;case"setup-error":await this.#C(t);return;case"cleanup-complete":await this.#I(t);return;case"aborted":await this.#P(t.cleanupFailures)}}#x(){if(this.#e===null||this.#t==="terminated"){this.#n(`Runtime node setup worker acknowledged an unexpected abort during phase "${this.#t}"`);return}if(this.#R){this.#n("Runtime node setup worker acknowledged abort more than once");return}this.#R=!0,this.#y(this.#s!==null?this.#o:E)}#M(e){if(this.#s!==null||this.#t!=="starting"&&this.#t!=="cleaning"){this.#n(this.#s!==null?"Runtime node setup worker started cleanup more than once":`Runtime node setup worker started cleanup during phase "${this.#t}"`);return}this.#s=[...e],this.#u=0,this.#e!==null&&this.#y(this.#o)}#A(e,t){const r=this.#s?.[this.#u],s=(this.#s?.length??0)-this.#u;if(this.#s===null||this.#t!=="starting"&&this.#t!=="cleaning"||r!==e||s!==t){this.#n(`Runtime node setup worker reported invalid cleanup progress during phase "${this.#t}"`);return}this.#u+=1}#N(e){if(this.#t!=="starting"||this.#e!==null||this.#s!==null){this.#e!==null?this.#p(this.#e):this.#n(this.#s!==null?"Runtime node setup worker became ready after starting cleanup":`Runtime node setup worker became ready during phase "${this.#t}"`);return}const t=e.setupData,r=e.sidecars.map(s=>({...s}));l(this.#f),this.#f=null,this.#t="ready",this.#c.resolve({artifacts:[{name:"node-setup",kind:"testkit.node-setup",summary:`node setup ${this.#i}`,contentType:"application/json",data:{module:this.#i,sidecars:r,setupData:t},emittedAt:new Date().toISOString()}],cleanup:this.cleanup,setupData:t})}async#C(e){if(this.#t!=="starting"){this.#n(`Runtime node setup worker reported setup failure during phase "${this.#t}"`);return}if(!this.#b()){this.#n("Runtime node setup worker reported setup failure before acknowledging cleanup completion");return}const t=p(e.cleanupFailures),r=P(e.error,e.kind,this.#i,t),s=this.#e===null?r:h(this.#e,t);this.#e=s,await this.#l(),this.#c.reject(this.#e)}async#I(e){if(this.#t!=="cleaning"||this.#r===null||!this.#b()){this.#n(`Runtime node setup worker reported cleanup during phase "${this.#t}"`);return}const t=p(e.cleanupFailures);l(this.#h),this.#h=null,t.length>0&&(this.#e=this.#e===null?D(t):h(this.#e,t)),await this.#l(),this.#e!==null?this.#r.reject(this.#e):this.#r.resolve(void 0)}async#P(e){if(!this.#b()){this.#n("Runtime node setup worker reported abort completion before acknowledging cleanup completion");return}const t=p(e),r=h(this.#e??o("infra",`Runtime node setup worker for "${this.#i}" aborted unexpectedly`),t);this.#e=r,await this.#l();const s=this.#e;this.#c.reject(s),this.#r?.reject(s)}#p(e,t=!1){if(this.#t==="terminated")return;if(t){if(this.#v)return;this.#v=!0}if(this.#e!==null){t&&(this.#e=h(this.#e,[{error:e,owner:"testkit"}]));return}const r=this.#t==="ready",s=r||this.#t==="cleaning"?this.#o:E;this.#e=e,r&&(this.#t="cleaning"),this.#F(),l(this.#h),this.#h=null;try{this.#a.postMessage({error:A(e),kind:R(e),sessionId:this.#w.sessionId,type:"abort"})}catch{this.#D();return}this.#y(s)}async#D(){const e=this.#e??o("infra",`Runtime node setup worker for "${this.#i}" was terminated`),t=this.#U();this.#e=h(e,[t]),await this.#l();const r=this.#e;this.#c.reject(r),this.#r?.reject(r)}#y(e){l(this.#k),this.#k=setTimeout(()=>{this.#D()},e)}#U(){if(this.#s!==null){const e=this.#s.at(Math.max(0,this.#u-1))??"testkit";return{error:y(this.#o,e),owner:e}}return{error:b(this.#R),owner:"testkit"}}#O(){return this.#s===null?b(!1):y(this.#o,this.#s.at(Math.max(0,this.#u-1))??"testkit")}#b(){return this.#s!==null&&this.#u===this.#s.length}#n(e){this.#p(o("infra",e),!0)}async#L(){await this.#l();const e=this.#e??o("infra",`Runtime node setup worker for "${this.#i}" is unavailable during cleanup`);this.#r?.reject(e)}async#E(e){this.#e??=e,await this.#l(),this.#r?.reject(this.#e)}#T(e){this.#e===null&&(this.#e=e),this.#l().then(()=>{this.#c.reject(this.#e),this.#r?.reject(this.#e)})}#_(){const e=this.#m-Date.now();if(e<=0){this.#p(c(this.#m,this.#i));return}this.#f=setTimeout(()=>{this.#_()},Math.min(e,2147483647))}#F(){l(this.#f),this.#f=null,this.#d.removeEventListener("abort",this.#S)}#l(){return this.#g!==null?this.#g:(this.#$=!0,this.#t="terminated",this.#F(),l(this.#k),l(this.#h),this.#k=null,this.#h=null,this.#g=this.#a.terminate().then(()=>{}).catch(e=>{const t=o("infra",`Failed to terminate runtime node setup worker for "${this.#i}"`,e);this.#e=this.#e===null?t:h(this.#e,[{error:t,owner:"testkit"}])}),this.#g)}}export async function runRuntimeNodeSetup({cleanupTimeoutMs:i,deadlineMs:e,targetConfig:t,task:r,signal:s,lease:n,runtimeEnv:w={}}){const d=Math.min(i??N,MAX_RUNTIME_NODE_SETUP_CLEANUP_TIMEOUT_MS),u=findRuntimeNodeSetupFile(t.productDir,r.file);if(s.aborted)throw m(s.reason,u?f(t.productDir,u):r.file);if(Date.now()>=e)throw c(e,u?f(t.productDir,u):r.file);if(!u)return I();const k=f(t.productDir,u),v={deadlineMs:e,leaseDir:n?.leaseDir??null,modulePath:u,moduleRelativePath:k,productDir:t.productDir,runtimeEnv:w,serviceName:t.name.trim(),sessionId:F(),testFile:r.file.trim()};let g;try{g=new C(v,s,d)}catch(S){throw o("infra",`Could not start runtime node setup worker for "${k}"`,S)}return g.start()}export function findRuntimeNodeSetupFile(i,e){const t=a.resolve(i),r=a.resolve(t,e),s=a.relative(t,r);if(s===".."||s.startsWith(`..${a.sep}`)||a.isAbsolute(s))throw new Error("Runtime node setup test file must be inside productDir");const n=a.parse(r);return[a.join(n.dir,`${n.name}.setup.mjs`),a.join(n.dir,`${n.name}.setup.js`),a.join(n.dir,"__setup__",`${n.name}.mjs`),a.join(n.dir,"__setup__",`${n.name}.js`)].find(d=>_.existsSync(d))??null}function I(){const i=Promise.resolve();return{artifacts:[],cleanup:()=>i,setupData:{}}}function P(i,e,t,r){const s=T(i),n=o(e,`Runtime node setup "${t}" failed: ${s.message}`,s);return s.stack&&(n.stack=`${n.stack??n.message}
1
+ import{classifyRuntimeNodeSetupFailure as R,createSetupFailure as o,createSetupCleanupError as _,createSetupCleanupTimeoutError as y,createUnacknowledgedSetupCleanupError as b,withSetupCleanupFailures as h}from"./runtime-node-setup-errors.js";export{classifyRuntimeNodeSetupFailure,getRuntimeNodeSetupCleanupFailures}from"./runtime-node-setup-errors.js";import F from"node:fs";import{randomUUID as j}from"node:crypto";import a from"node:path";import{Worker as x}from"node:worker_threads";import{isEngineTaskDeadlineExceededReason as M}from"../../../engines/api/index.js";import{readRuntimeNodeSetupWorkerMessage as A,serializeRuntimeNodeSetupError as N}from"./runtime-node-setup-protocol.js";const E=100,C=5e3;export const MAX_RUNTIME_NODE_SETUP_CLEANUP_TIMEOUT_MS=6e4;class I{#o;#m;#i;#$;#w;#c=$();#d;#a;#R=!1;#k=null;#r=null;#s=null;#u=0;#h=null;#f=null;#v=!1;#t="starting";#S=!1;#e=null;#g=null;constructor(e,t,s,r){this.#$=r,this.#w=e,this.#d=t,this.#m=e.deadlineMs,this.#i=e.moduleRelativePath,this.#o=s,this.#a=new x(new URL("./runtime-node-setup-worker.js",import.meta.url),{name:"testkit-runtime-node-setup",workerData:e}),this.#a.on("message",n=>{this.#x(n).catch(c=>{this.#T(o("infra",`Runtime node setup worker for "${this.#i}" sent an invalid message`,c))})}),this.#a.once("error",n=>{this.#T(o("infra",`Runtime node setup worker failed for "${this.#i}"`,n))}),this.#a.once("exit",n=>{this.#v||this.#T(o("infra",`Runtime node setup worker for "${this.#i}" exited unexpectedly with code ${n.toString()}`))}),this.#d.addEventListener("abort",this.#D,{once:!0}),this.#F()}start(){return this.#d.aborted?this.#p(f(this.#d.reason,this.#i)):Date.now()>=this.#m&&this.#p(d(this.#m,this.#i)),this.#c.promise}cleanup=()=>{if(this.#r!==null)return this.#r.promise;const e=$();if(this.#r=e,this.#e!==null&&this.#t==="cleaning")return e.promise;if(this.#e!==null||this.#t==="terminated")return this.#W(),e.promise;if(this.#t!=="ready")return this.#E(o("infra",`Runtime node setup cleanup is invalid during phase "${this.#t}"`)),e.promise;this.#t="cleaning",this.#h=setTimeout(()=>{this.#E(this.#L())},this.#o);try{this.#a.postMessage({sessionId:this.#w.sessionId,type:"cleanup"})}catch(t){this.#E(o("infra",`Could not request runtime node setup cleanup for "${this.#i}"`,t))}return e.promise};#D=()=>{this.#p(f(this.#d.reason,this.#i))};async#x(e){const t=A(e);if(t===null||t.sessionId!==this.#w.sessionId){this.#n(`Runtime node setup worker for "${this.#i}" sent an invalid message`);return}switch(t.type){case"abort-acknowledged":this.#M();return;case"cleanup-started":this.#A(t.owners);return;case"cleanup-progress":this.#N(t.owner,t.remainingCallbacks);return;case"ready":this.#C(t);return;case"sidecar-started":this.#$(t.sidecar);return;case"setup-error":await this.#I(t);return;case"cleanup-complete":await this.#P(t);return;case"aborted":await this.#U(t.cleanupFailures)}}#M(){if(this.#e===null||this.#t==="terminated"){this.#n(`Runtime node setup worker acknowledged an unexpected abort during phase "${this.#t}"`);return}if(this.#R){this.#n("Runtime node setup worker acknowledged abort more than once");return}this.#R=!0,this.#y(this.#s!==null?this.#o:E)}#A(e){if(this.#s!==null||this.#t!=="starting"&&this.#t!=="cleaning"){this.#n(this.#s!==null?"Runtime node setup worker started cleanup more than once":`Runtime node setup worker started cleanup during phase "${this.#t}"`);return}this.#s=[...e],this.#u=0,this.#e!==null&&this.#y(this.#o)}#N(e,t){const s=this.#s?.[this.#u],r=(this.#s?.length??0)-this.#u;if(this.#s===null||this.#t!=="starting"&&this.#t!=="cleaning"||s!==e||r!==t){this.#n(`Runtime node setup worker reported invalid cleanup progress during phase "${this.#t}"`);return}this.#u+=1}#C(e){if(this.#t!=="starting"||this.#e!==null||this.#s!==null){this.#e!==null?this.#p(this.#e):this.#n(this.#s!==null?"Runtime node setup worker became ready after starting cleanup":`Runtime node setup worker became ready during phase "${this.#t}"`);return}const t=e.setupData,s=e.sidecars.map(r=>({...r}));l(this.#f),this.#f=null,this.#t="ready",this.#c.resolve({artifacts:[{name:"node-setup",kind:"testkit.node-setup",summary:`node setup ${this.#i}`,contentType:"application/json",data:{module:this.#i,sidecars:s,setupData:t},emittedAt:new Date().toISOString()}],cleanup:this.cleanup,setupData:t,sidecars:s})}async#I(e){if(this.#t!=="starting"){this.#n(`Runtime node setup worker reported setup failure during phase "${this.#t}"`);return}if(!this.#b()){this.#n("Runtime node setup worker reported setup failure before acknowledging cleanup completion");return}const t=m(e.cleanupFailures),s=U(e.error,e.kind,this.#i,t),r=this.#e===null?s:h(this.#e,t);this.#e=r,await this.#l(),this.#c.reject(this.#e)}async#P(e){if(this.#t!=="cleaning"||this.#r===null||!this.#b()){this.#n(`Runtime node setup worker reported cleanup during phase "${this.#t}"`);return}const t=m(e.cleanupFailures);l(this.#h),this.#h=null,t.length>0&&(this.#e=this.#e===null?_(t):h(this.#e,t)),await this.#l(),this.#e!==null?this.#r.reject(this.#e):this.#r.resolve(void 0)}async#U(e){if(!this.#b()){this.#n("Runtime node setup worker reported abort completion before acknowledging cleanup completion");return}const t=m(e),s=h(this.#e??o("infra",`Runtime node setup worker for "${this.#i}" aborted unexpectedly`),t);this.#e=s,await this.#l();const r=this.#e;this.#c.reject(r),this.#r?.reject(r)}#p(e,t=!1){if(this.#t==="terminated")return;if(t){if(this.#S)return;this.#S=!0}if(this.#e!==null){t&&(this.#e=h(this.#e,[{error:e,owner:"testkit"}]));return}const s=this.#t==="ready",r=s||this.#t==="cleaning"?this.#o:E;this.#e=e,s&&(this.#t="cleaning"),this.#j(),l(this.#h),this.#h=null;try{this.#a.postMessage({error:N(e),kind:R(e),sessionId:this.#w.sessionId,type:"abort"})}catch{this.#_();return}this.#y(r)}async#_(){const e=this.#e??o("infra",`Runtime node setup worker for "${this.#i}" was terminated`),t=this.#O();this.#e=h(e,[t]),await this.#l();const s=this.#e;this.#c.reject(s),this.#r?.reject(s)}#y(e){l(this.#k),this.#k=setTimeout(()=>{this.#_()},e)}#O(){if(this.#s!==null){const e=this.#s.at(Math.max(0,this.#u-1))??"testkit";return{error:y(this.#o,e),owner:e}}return{error:b(this.#R),owner:"testkit"}}#L(){return this.#s===null?b(!1):y(this.#o,this.#s.at(Math.max(0,this.#u-1))??"testkit")}#b(){return this.#s!==null&&this.#u===this.#s.length}#n(e){this.#p(o("infra",e),!0)}async#W(){await this.#l();const e=this.#e??o("infra",`Runtime node setup worker for "${this.#i}" is unavailable during cleanup`);this.#r?.reject(e)}async#E(e){this.#e??=e,await this.#l(),this.#r?.reject(this.#e)}#T(e){this.#e===null&&(this.#e=e),this.#l().then(()=>{this.#c.reject(this.#e),this.#r?.reject(this.#e)})}#F(){const e=this.#m-Date.now();if(e<=0){this.#p(d(this.#m,this.#i));return}this.#f=setTimeout(()=>{this.#F()},Math.min(e,2147483647))}#j(){l(this.#f),this.#f=null,this.#d.removeEventListener("abort",this.#D)}#l(){return this.#g!==null?this.#g:(this.#v=!0,this.#t="terminated",this.#j(),l(this.#k),l(this.#h),this.#k=null,this.#h=null,this.#g=this.#a.terminate().then(()=>{}).catch(e=>{const t=o("infra",`Failed to terminate runtime node setup worker for "${this.#i}"`,e);this.#e=this.#e===null?t:h(this.#e,[{error:t,owner:"testkit"}])}),this.#g)}}export async function runRuntimeNodeSetup({cleanupTimeoutMs:i,deadlineMs:e,targetConfig:t,task:s,signal:r,lease:n,onSidecar:c=()=>{},runtimeEnv:p={}}){const v=Math.min(i??C,MAX_RUNTIME_NODE_SETUP_CLEANUP_TIMEOUT_MS),u=findRuntimeNodeSetupFile(t.productDir,s.file);if(r.aborted)throw f(r.reason,u?w(t.productDir,u):s.file);if(Date.now()>=e)throw d(e,u?w(t.productDir,u):s.file);if(!u)return P();const k=w(t.productDir,u),S={deadlineMs:e,leaseDir:n?.leaseDir??null,modulePath:u,moduleRelativePath:k,productDir:t.productDir,runtimeEnv:p,serviceName:t.name.trim(),sessionId:j(),testFile:s.file.trim()};let g;try{g=new I(S,r,v,c)}catch(D){throw o("infra",`Could not start runtime node setup worker for "${k}"`,D)}return g.start()}export function findRuntimeNodeSetupFile(i,e){const t=a.resolve(i),s=a.resolve(t,e),r=a.relative(t,s);if(r===".."||r.startsWith(`..${a.sep}`)||a.isAbsolute(r))throw new Error("Runtime node setup test file must be inside productDir");const n=a.parse(s);return[a.join(n.dir,`${n.name}.setup.mjs`),a.join(n.dir,`${n.name}.setup.js`),a.join(n.dir,"__setup__",`${n.name}.mjs`),a.join(n.dir,"__setup__",`${n.name}.js`)].find(p=>F.existsSync(p))??null}function P(){const i=Promise.resolve();return{artifacts:[],cleanup:()=>i,setupData:{},sidecars:[]}}function U(i,e,t,s){const r=T(i),n=o(e,`Runtime node setup "${t}" failed: ${r.message}`,r);return r.stack&&(n.stack=`${n.stack??n.message}
2
2
  Remote stack:
3
- ${s.stack}`),h(n,r)}function T(i){const e=new Error(i.message);return e.name=i.name,i.stack&&(e.stack=i.stack),e}function p(i){return i.map(e=>({error:T(e.error),owner:e.owner}))}function m(i,e){return R(i)==="deadline"&&i instanceof Error?i:x(i)?c(i.deadlineMs,e):o("cancelled","Runtime node setup was cancelled",i)}function c(i,e){return o("deadline",`Runtime node setup exceeded its deadline ${i.toString()}${e?` for "${e}"`:""}`)}function f(i,e){return a.relative(i,e).split(a.sep).join("/")}function $(){let i,e;return{promise:new Promise((r,s)=>{i=r,e=s}),resolve:i,reject:e}}function l(i){i!==null&&clearTimeout(i)}
3
+ ${r.stack}`),h(n,s)}function T(i){const e=new Error(i.message);return e.name=i.name,i.stack&&(e.stack=i.stack),e}function m(i){return i.map(e=>({error:T(e.error),owner:e.owner}))}function f(i,e){return R(i)==="deadline"&&i instanceof Error?i:M(i)?d(i.deadlineMs,e):o("cancelled","Runtime node setup was cancelled",i)}function d(i,e){return o("deadline",`Runtime node setup exceeded its deadline ${i.toString()}${e?` for "${e}"`:""}`)}function w(i,e){return a.relative(i,e).split(a.sep).join("/")}function $(){let i,e;return{promise:new Promise((s,r)=>{i=s,e=r}),resolve:i,reject:e}}function l(i){i!==null&&clearTimeout(i)}
@@ -1 +1 @@
1
- import{resolveEngineProfile as p}from"../../engines/catalog.js";export const DEFAULT_COMPATIBLE_BATCH_MAX_FILES=25;export function claimCompatibleTaskBatch(e,t,o={}){const r=o.maxFiles??DEFAULT_COMPATIBLE_BATCH_MAX_FILES,i=[t];if(!isBatchableEngineTask(t)||r<=1)return i;for(let n=0;n<e.length&&i.length<r;){const l=e[n];if(!isCompatibleEngineBatchTask(t,l)){n+=1;continue}i.push(l),e.splice(n,1)}return i}export function buildTaskBatch(e){if(e.length<=1)return e[0]??null;const t=e[0];return{...t,batchId:c(e),batchTasks:[t,e[1],...e.slice(2)],batchFiles:e.map(o=>o.file)}}export function expandTaskResultOutcomes(e){return e?e.outcomes!==void 0?[...e.outcomes]:[e]:[]}export function isBatchableEngineTask(e){return p(e.testType,e.engineId).capabilities.taskBatching==="compatible"&&e.runtimeIsolation==="shared"&&e.resourceCost===1&&e.locks.length===0}export function isCompatibleEngineBatchTask(e,t){return!isBatchableEngineTask(e)||!isBatchableEngineTask(t)?!1:t.graphKey===e.graphKey&&t.targetName===e.targetName&&t.serviceName===e.serviceName&&t.testType===e.testType&&t.engineId===e.engineId&&t.profileId===e.profileId}function c(e){return`${e[0].engineId}-batch-${e.map(t=>t.id).join("-")}`}
1
+ import{isDeepStrictEqual as p}from"node:util";import{resolveExecutionProfile as u}from"../../engines/catalog.js";export const DEFAULT_COMPATIBLE_BATCH_MAX_FILES=25;export function claimCompatibleTaskBatch(e,t,o={}){const r=o.maxFiles??DEFAULT_COMPATIBLE_BATCH_MAX_FILES,s=[t],c=f(t);if(!c&&(!isBatchableEngineTask(t)||r<=1))return s;for(let i=0;i<e.length&&(c||s.length<r);){const n=e[i];if(c?n.engineId!==t.engineId||n.profileId!==t.profileId:!isCompatibleEngineBatchTask(t,n)){i+=1;continue}s.push(n),e.splice(i,1)}return s}export function buildTaskBatch(e){if(e.length<=1)return e[0]??null;const t=e[0];return{...t,batchId:a(e),batchTasks:[t,e[1],...e.slice(2)],batchFiles:e.map(o=>o.file)}}export function expandTaskResultOutcomes(e){return e?e.outcomes!==void 0?[...e.outcomes]:[e]:[]}export function isBatchableEngineTask(e){return u(e).taskBatching==="compatible"&&e.runtimeIsolation==="shared"&&e.resourceCost===1&&e.locks.length===0&&!e.hasSetup}export function isCompatibleEngineBatchTask(e,t){return!isBatchableEngineTask(e)||!isBatchableEngineTask(t)?!1:t.graphKey===e.graphKey&&t.targetName===e.targetName&&t.serviceName===e.serviceName&&t.testType===e.testType&&t.engineId===e.engineId&&t.profileId===e.profileId}const m=[["source","services"],["locks","locks"]];export function requireCompatibleSelection(e,t){const o=e.filter(f),[r]=o,s=i=>t.provisioned.has(i)?["configured",i]:[t.static.has(i)?"static":"supplied"],c=({graphKey:i,locks:n})=>({locks:n,source:s(i)});for(const i of o.length>1?o:[]){if(i.hasSetup||i.runtimeIsolation!=="shared"){const l=i.hasSetup?"a setup module":`${i.runtimeIsolation} isolation`;throw new Error(`${i.file} in group ${i.serviceName} needs ${l}, which plain Vitest files run together cannot use`)}const n=m.find(([l])=>!p(c(i)[l],c(r)[l]));if(n!==void 0)throw new Error(`Plain Vitest files run in one Vitest invocation, but ${r.file} in group ${r.serviceName} and ${i.file} in group ${i.serviceName} need different ${n[1]}; select one group with --group`)}}function f(e){return u(e).taskBatching==="selection"}function a(e){return`${e[0].engineId}-batch-${e.map(t=>t.id).join("-")}`}
@@ -0,0 +1 @@
1
+ import t from"node:fs";import r from"node:path";export function taskExecutionRoot(i){return r.join(i,".testkit","_execution")}export function createTaskLeases(i){const n=taskExecutionRoot(i),u=r.join(n,"leases"),c=r.join(n,"node_modules","testkit-engine"),a=r.join(c,"cache");t.rmSync(n,{recursive:!0,force:!0});let y=1;return{allocate(e){const o=`lease-${e.id.toString()}-${y.toString()}`;return y+=1,{id:o,directory:r.join(u,o),engineCacheDirectory:a,engineWorkspaceDirectory:r.join(c,"leases",o)}},create(e){t.mkdirSync(e.directory,{recursive:!0})},remove(e){t.rmSync(e.engineWorkspaceDirectory,{recursive:!0,force:!0}),t.rmSync(e.directory,{recursive:!0,force:!0})},close(){t.rmSync(a,{recursive:!0,force:!0});for(const e of[r.join(c,"leases"),c,r.dirname(c),u,n])try{t.rmdirSync(e)}catch(o){const s=o.code;if(s!=="ENOENT"&&s!=="ENOTEMPTY"&&s!=="EEXIST")throw o}}}}
@@ -1 +1 @@
1
- import{EngineExecutionBridgeError as b,executeEngineTask as W}from"./engine-execution.js";import{formatError as L}from"../../kernel/error-serialization.js";import{formatEngineInvocationStack as q}from"./engine-failure-stack.js";import{DEFAULT_ENGINE_REPORTER_CALLBACK_TIMEOUT_MS as P,invokeBoundedReporterCallback as j}from"./engine-execution-reporting.js";import{taskNeedsLocalRuntime as U}from"./planning.js";import{drainRuntimeFailedTasks as z}from"./runtime-failures.js";import{buildTimingObservation as J}from"./scheduler/observations.js";import{buildTaskBatch as H,claimCompatibleTaskBatch as Q,expandTaskResultOutcomes as V}from"./task-batches.js";export function createWorker(e,t){return{workerId:e,productDir:t,currentGraphKey:null,graphSwitches:0,taskCount:0}}export async function runWorker(e,t,i,r,a,u,l,h,g,d=null){const k=Date.now(),y=[],x=[];try{for(;!i.isStopRequested();){const f=l(t,e.currentGraphKey,n=>i.canAcquire(n));if(!f){const n=z(t,i);if(n.length>0){const o=Date.now(),s=new Set;for(const m of n)h(a,m.task,{status:"not_run",reason:m.reason,durationMs:0,startedAt:o,finishedAt:o,error:null,infraFailed:m.infraFailed,blockedByRuntime:m.blockedByRuntime,failureDetails:m.failureDetails}),s.has(m.graph.key)||(g(a,m.graph,m.message,o,{classification:"infra"}),s.add(m.graph.key));e.taskCount+=n.length;continue}if(t.length===0)break;await ae(10);continue}let w=null,T=[f],E=f,K=!1,O=null,B="acquire",R=[],F=null;try{T=Q(t,f),E=H(T)??f,e.currentGraphKey!==null&&e.currentGraphKey!==f.graphKey&&(e.graphSwitches+=1),e.currentGraphKey=f.graphKey,w=await i.acquire({...E,startApplicationServices:U(E)}),B="execute";const n=await W(r,w,E,i,d);B="mapping";const o=V(n);R=resolveWorkerOutcomeMappings(T,o),R.some(({outcome:s})=>s.infraFailed&&s.blockedByRuntime)&&(K=!0)}catch(n){const o=B==="acquire"?ie(n,i):te(n);O={disposition:o,error:n},K=w!==null&&o.runtimeImpact!=="none"}finally{F=await Z(i,w,K)}const c=[];let I=null;const S=()=>{if(I!==null)return I;try{I=ne(i,w,f)}catch(n){c.push(_("Runtime failure graph resolution failed",n)),I=Y(w,f)}return I};if(O===null){for(const{outcome:o,task:s}of R)await C({operationErrors:c,outcome:o,recordTaskOutcome:h,recordTiming:!0,reporter:d,reportTaskFinished:!1,task:s,timingUpdates:u,trackers:a});e.taskCount+=R.length;const n=R.filter(({outcome:o})=>o.infraFailed&&o.blockedByRuntime);if(n.length>0){const o=n.map(({outcome:s})=>s.reason??s.error??"Runtime readiness failed before engine execution").join("; ");y.push(o),await v(c,"Runtime error reporter failed",()=>d?.runtimeError?.(f,o)),await p(c,"Runtime graph failure recording failed",()=>{i.markGraphFailed(f.graphKey,o)}),await p(c,"Result graph error recording failed",()=>{g(a,S(),o,Date.now(),{classification:"infra"})})}}else{const{disposition:n,error:o}=O,s=L(o),m=X(T,o);n.status!=="cancelled"&&y.push(s),n.notifyRuntimeError&&await v(c,"Runtime error reporter failed",()=>d?.runtimeError?.(m,s)),n.status!=="cancelled"&&(n.runtimeImpact==="fail-graph"&&await p(c,"Runtime graph failure recording failed",()=>{i.markGraphFailed(f.graphKey,s)}),await p(c,"Result graph error recording failed",()=>{g(a,S(),s,Date.now(),{classification:n.classification??"product"})}));const N=Date.now();for(const D of T){const A=o instanceof b&&o.completedOutcomesByTaskId.has(String(D.id)),M=ee(D,E,o,n,s,N);await C({operationErrors:c,outcome:M,recordTaskOutcome:h,recordTiming:A,reporter:d,reportTaskFinished:!A,task:D,timingUpdates:u,trackers:a})}e.taskCount+=T.length}if(F!==null){const n=F.message;y.push(n),await v(c,"Runtime error reporter failed",()=>d?.runtimeError?.(f,n)),F.recovered||await p(c,"Runtime graph failure recording failed",()=>{i.markGraphFailed(f.graphKey,n)}),await p(c,"Result graph error recording failed",()=>{g(a,S(),n,Date.now(),{classification:"infra"})})}if(c.length>0){const n=[...c];for(const s of n)y.push(s.message);const o=n.map(s=>s.message).join("; ");await p(c,"Result graph error recording failed while reporting a Testkit operation failure",()=>{g(a,S(),o,Date.now(),{classification:"infra"})});for(const s of c.slice(n.length))y.push(s.message);c.length>n.length&&x.push(...n.map(s=>s.message),...c.slice(n.length).map(s=>s.message))}}}finally{e.currentGraphKey=null}return{workerId:e.workerId,failed:y.length>0,durationMs:Date.now()-k,taskCount:e.taskCount,graphSwitches:e.graphSwitches,errors:y,unpersistedErrors:x}}async function C({operationErrors:e,outcome:t,recordTaskOutcome:i,recordTiming:r,reporter:a,reportTaskFinished:u,task:l,timingUpdates:h,trackers:g}){await p(e,`Task outcome recording failed for ${l.file}`,()=>{i(g,l,t)}),u&&await v(e,`Task-finished reporter failed for ${l.file}`,()=>a?.taskFinished?.(l,t)),r&&await p(e,`Task timing recording failed for ${l.file}`,()=>{const d=J(l,t);d&&h.push(d)})}async function p(e,t,i){try{await i()}catch(r){e.push(_(t,r))}}async function v(e,t,i){await p(e,t,()=>j(t,i,{timeoutMs:P}))}function _(e,t){const i=G(t);return new Error(`${e}: ${i.message}`,{cause:i})}function X(e,t){const i=e[0];if(!(t instanceof b))return i;if(t.failingTaskId!==null){const r=e.find(a=>String(a.id)===t.failingTaskId);if(r!==void 0)return r}return e.find(r=>!t.completedOutcomesByTaskId.has(String(r.id)))??i}function Y(e,t){return{key:e?.graphKey??t.graphKey,targetNames:e?.targetNames??[t.targetName]}}async function Z(e,t,i){if(t===null)return null;try{return await e.release(t.leaseId,{invalidate:i}),null}catch(r){const a=G(r);try{return await e.release(t.leaseId,{invalidate:!0}),{message:`Runtime lease release failed but recovered on idempotent retry: ${a.message}`,recovered:!0}}catch(u){const l=G(u);return{message:`Runtime lease release failed: ${a.message}; idempotent retry also failed: ${l.message}`,recovered:!1}}}}function ee(e,t,i,r,a,u){const l=q(i),h={kind:"engine-invocation",key:"engine_invocation_failed",title:"Engine invocation failed",count:1,...r.classification===void 0?{}:{classification:r.classification},message:a,...l===void 0?{}:{stack:l}},g=i instanceof b?i.completedOutcomesByTaskId.get(String(e.id)):void 0;if(g!==void 0)return g;const d=i instanceof b?i.artifactReferencesByTaskId.get(String(e.id))??[]:[];return{task:e,status:r.status,error:r.status==="failed"?a:null,reason:r.status==="failed"?null:a,infraFailed:r.classification==="infra",blockedByRuntime:r.status==="not_run",durationMs:0,startedAt:u,finishedAt:u,artifacts:[...d],failureDetails:r.status==="cancelled"?[]:[h],checkDetails:[],..."batchTasks"in t?{runtimeBatch:{id:t.batchId,index:t.batchTasks.findIndex(k=>k.id===e.id&&k.file===e.file),fileCount:t.batchTasks.length,files:t.batchTasks.map(k=>k.file)}}:{}}}function te(e){return e instanceof b?e.disposition:{classification:"infra",notifyRuntimeError:!0,runtimeImpact:"none",status:"not_run"}}function ie(e,t){return t.signal.aborted&&e===t.signal.reason?{classification:void 0,notifyRuntimeError:!1,runtimeImpact:"none",status:"cancelled"}:{classification:"infra",notifyRuntimeError:!0,runtimeImpact:"fail-graph",status:"not_run"}}export function resolveWorkerOutcomeMappings(e,t){const i=new Map;for(const a of e){const u=$(a);if(i.has(u))throw new Error(`Worker claimed duplicate task ${a.id.toString()} (${a.file})`);i.set(u,a)}const r=new Map;for(const a of t){const u=$(a.task),l=i.get(u);if(!l)throw new Error(`Task runner returned an outcome for unclaimed task ${a.task.id.toString()} (${a.task.file})`);if(r.has(u))throw new Error(`Task runner returned duplicate outcomes for claimed task ${l.id.toString()} (${l.file})`);r.set(u,{outcome:a,task:l})}for(const a of e)if(!r.has($(a)))throw new Error(`Task runner did not return an outcome for claimed task ${a.id.toString()} (${a.file})`);return[...r.values()]}function $(e){return JSON.stringify([typeof e.id,e.id,e.file])}function ne(e,t,i){return e.getGraph(i.graphKey)??{key:t?.graphKey??i.graphKey,targetNames:t?.targetNames??[i.targetName]}}function ae(e){return new Promise(t=>setTimeout(t,e))}function G(e){return e instanceof Error?e:new Error(String(e))}
1
+ import{buildTaskDeadline as U,createDeadlineSignal as J,EngineExecutionBridgeError as I,executeEngineTask as H,normalizeTimeoutMs as Q}from"./engine-execution.js";import{preparationFailure as V,settlePreparedTask as X,taskStartedFailure as Y}from"./engine-execution-failures.js";import{GroupDefaultConflictError as N}from"./environment.js";import{formatError as Z,toError as x}from"../../kernel/error-serialization.js";import{formatEngineInvocationStack as ee}from"./engine-failure-stack.js";import{DEFAULT_ENGINE_REPORTER_CALLBACK_TIMEOUT_MS as _,invokeBoundedReporterCallback as te,invokeEngineReporterCallback as L}from"./engine-execution-reporting.js";import{drainRuntimeFailedTasks as ie}from"./runtime-failures.js";import{buildTimingObservation as ae}from"./scheduler/observations.js";import{buildTaskBatch as ne,claimCompatibleTaskBatch as re,expandTaskResultOutcomes as se}from"./task-batches.js";export function createWorker(e,a){return{workerId:e,productDir:a,currentGraphKey:null,graphSwitches:0,taskCount:0}}export async function runWorker(e,a,t,l,n,u,c,k,g,m=null){const v=Date.now(),w=[],q=[];try{for(;!t.isStopRequested();){const o=c(a,e.currentGraphKey,i=>t.locks.available(i.locks)&&t.environments.canAcquire(i));if(!o){const i=ie(a,t.environments);if(i.length>0){const s=Date.now(),r=new Set;for(const p of i)k(n,p.task,{status:"not_run",reason:p.reason,durationMs:0,startedAt:s,finishedAt:s,error:null,infraFailed:p.infraFailed,blockedByRuntime:p.blockedByRuntime,failureDetails:p.failureDetails}),r.has(p.graph.key)||(g(n,p.graph,p.message,s,{classification:"infra"}),r.add(p.graph.key));e.taskCount+=i.length;continue}if(a.length===0)break;await pe(10);continue}const E=t.leases.allocate(o);t.locks.acquire(o.locks,E.id);let M=null,T=[o],D=o,O=!1,R=null;const d={phase:"acquire",prepared:null};let C=[],F=[],B=null;try{T=re(a,o),D=ne(T)??o,e.currentGraphKey!==null&&e.currentGraphKey!==o.graphKey&&(e.graphSwitches+=1),e.currentGraphKey=o.graphKey;const i=await t.environments.acquire(D,E);M=i,t.leases.create(E),d.phase="execute";const s=await l.withEngine(o.engineId,t.signal,async r=>{let p=null;if(T.length===1){d.phase="start",await L("taskStarted",()=>m?.taskStarted?.(o,{name:o.targetName}),{signal:t.signal,timeoutMs:_}),d.phase="prepare";const K=Q(t.request.fileTimeoutSeconds),y=U(Date.now(),K),b=J(t.signal,y);try{d.prepared=await i.prepare(o,{deadlineMs:y,signal:b.signal,timeoutMs:K})}finally{b.dispose()}p={deadlineMs:y,prepared:d.prepared===null?null:{artifacts:d.prepared.artifacts,handles:d.prepared.handles,setupData:d.prepared.setupData},taskId:String(o.id)},d.phase="execute"}return H(r,{environment:d.prepared?.environment??i.environment,lease:E,request:t.request,started:p,task:D},t,m)});d.phase="mapping",C=se(s),F=resolveWorkerOutcomeMappings(T,C),F.some(({outcome:r})=>r.infraFailed&&r.blockedByRuntime)&&(O=!0)}catch(i){const s=d.phase==="start"?Y(i,String(o.id)):d.phase==="prepare"?V(i,String(o.id)):i,r=d.phase==="acquire"?fe(i,t):ue(s);R={disposition:r,error:s},O=M!==null&&r.runtimeImpact!=="none"}finally{if(d.prepared!==null){const i=await d.prepared.release(),s=await X(R===null?{outcomes:C}:{error:R.error},i,String(o.id),r=>L("taskFinished",()=>m?.taskFinished?.(o,r),{signal:t.signal,timeoutMs:_}));s!==null&&(R={disposition:s.disposition,error:s},O||=s.disposition.runtimeImpact!=="none")}B=await le(t.leases,M,E,O),t.locks.release(o.locks,E.id)}const f=[];let S=null;const $=()=>{if(S!==null)return S;try{S=de(t.environments,o)}catch(i){f.push(j("Runtime failure graph resolution failed",i)),S=A(o)}return S};if(R===null){for(const{outcome:s,task:r}of F)await P({operationErrors:f,outcome:s,recordTaskOutcome:k,recordTiming:!0,reporter:m,reportTaskFinished:!1,task:r,timingUpdates:u,trackers:n});e.taskCount+=F.length;const i=F.filter(({outcome:s})=>s.infraFailed&&s.blockedByRuntime);if(i.length>0){const s=i.map(({outcome:r})=>r.reason??r.error??"Runtime readiness failed before engine execution").join("; ");w.push(s),await G(f,"Runtime error reporter failed",()=>m?.runtimeError?.(o,s)),await h(f,"Runtime graph failure recording failed",()=>{t.environments.markGraphFailed(o.graphKey,s)}),await h(f,"Result graph error recording failed",()=>{g(n,$(),s,Date.now(),{classification:"infra"})})}}else{const{disposition:i,error:s}=R,r=Z(s),p=oe(T,s);if(i.status!=="cancelled"&&w.push(r),i.notifyRuntimeError&&await G(f,"Runtime error reporter failed",()=>m?.runtimeError?.(p,r)),i.status!=="cancelled"){i.runtimeImpact==="fail-graph"&&await h(f,"Runtime graph failure recording failed",()=>{t.environments.markGraphFailed(o.graphKey,r)});const y=s instanceof N?A(o):$();await h(f,"Result graph error recording failed",()=>{g(n,y,r,Date.now(),{classification:i.classification??"product"})})}const K=Date.now();for(const y of T){const b=s instanceof I&&s.completedOutcomesByTaskId.has(String(y.id)),z=ce(y,D,s,i,r,K);await P({operationErrors:f,outcome:z,recordTaskOutcome:k,recordTiming:b,reporter:m,reportTaskFinished:!b,task:y,timingUpdates:u,trackers:n})}e.taskCount+=T.length}if(B!==null){const i=B.message;w.push(i),await G(f,"Runtime error reporter failed",()=>m?.runtimeError?.(o,i)),B.recovered||await h(f,"Runtime graph failure recording failed",()=>{t.environments.markGraphFailed(o.graphKey,i)}),await h(f,"Result graph error recording failed",()=>{g(n,$(),i,Date.now(),{classification:"infra"})})}if(f.length>0){const i=[...f];for(const r of i)w.push(r.message);const s=i.map(r=>r.message).join("; ");await h(f,"Result graph error recording failed while reporting a Testkit operation failure",()=>{g(n,$(),s,Date.now(),{classification:"infra"})});for(const r of f.slice(i.length))w.push(r.message);f.length>i.length&&q.push(...i.map(r=>r.message),...f.slice(i.length).map(r=>r.message))}}}finally{e.currentGraphKey=null}return{workerId:e.workerId,failed:w.length>0,durationMs:Date.now()-v,taskCount:e.taskCount,graphSwitches:e.graphSwitches,errors:w,unpersistedErrors:q}}async function P({operationErrors:e,outcome:a,recordTaskOutcome:t,recordTiming:l,reporter:n,reportTaskFinished:u,task:c,timingUpdates:k,trackers:g}){await h(e,`Task outcome recording failed for ${c.file}`,()=>{t(g,c,a)}),u&&await G(e,`Task-finished reporter failed for ${c.file}`,()=>n?.taskFinished?.(c,a)),l&&await h(e,`Task timing recording failed for ${c.file}`,()=>{const m=ae(c,a);m&&k.push(m)})}async function h(e,a,t){try{await t()}catch(l){e.push(j(a,l))}}async function G(e,a,t){await h(e,a,()=>te(a,t,{timeoutMs:_}))}function j(e,a){const t=x(a);return new Error(`${e}: ${t.message}`,{cause:t})}function oe(e,a){const t=e[0];if(!(a instanceof I))return t;if(a.failingTaskId!==null){const l=e.find(n=>String(n.id)===a.failingTaskId);if(l!==void 0)return l}return e.find(l=>!a.completedOutcomesByTaskId.has(String(l.id)))??t}function A(e){return{key:e.graphKey,targetNames:[e.targetName]}}async function le(e,a,t,l){const n=async u=>{await a?.release({invalidate:u}),e.remove(t)};try{return await n(l),null}catch(u){const c=x(u);try{return await n(!0),{message:`Runtime lease release failed but recovered on idempotent retry: ${c.message}`,recovered:!0}}catch(k){const g=x(k);return{message:`Runtime lease release failed: ${c.message}; idempotent retry also failed: ${g.message}`,recovered:!1}}}}function ce(e,a,t,l,n,u){const c=ee(t),k={kind:"engine-invocation",key:"engine_invocation_failed",title:"Engine invocation failed",count:1,...l.classification===void 0?{}:{classification:l.classification},message:n,...c===void 0?{}:{stack:c}},g=t instanceof I?t.completedOutcomesByTaskId.get(String(e.id)):void 0;if(g!==void 0)return g;const m=t instanceof I?t.artifactReferencesByTaskId.get(String(e.id))??[]:[];return{task:e,status:l.status,error:l.status==="failed"?n:null,reason:l.status==="failed"?null:n,infraFailed:l.classification==="infra",blockedByRuntime:l.status==="not_run",durationMs:0,startedAt:u,finishedAt:u,artifacts:[...m],failureDetails:l.status==="cancelled"?[]:[k],..."batchTasks"in a?{runtimeBatch:{id:a.batchId,index:a.batchTasks.findIndex(v=>v.id===e.id&&v.file===e.file),fileCount:a.batchTasks.length,files:a.batchTasks.map(v=>v.file)}}:{}}}function ue(e){return e instanceof I?e.disposition:{classification:"infra",notifyRuntimeError:!0,runtimeImpact:"none",status:"not_run"}}function fe(e,a){return a.signal.aborted&&e===a.signal.reason?{classification:void 0,notifyRuntimeError:!1,runtimeImpact:"none",status:"cancelled"}:{classification:"infra",notifyRuntimeError:!0,runtimeImpact:e instanceof N?"none":"fail-graph",status:"not_run"}}export function resolveWorkerOutcomeMappings(e,a){const t=new Map;for(const n of e){const u=W(n);if(t.has(u))throw new Error(`Worker claimed duplicate task ${n.id.toString()} (${n.file})`);t.set(u,n)}const l=new Map;for(const n of a){const u=W(n.task),c=t.get(u);if(!c)throw new Error(`Task runner returned an outcome for unclaimed task ${n.task.id.toString()} (${n.task.file})`);if(l.has(u))throw new Error(`Task runner returned duplicate outcomes for claimed task ${c.id.toString()} (${c.file})`);l.set(u,{outcome:n,task:c})}for(const n of e)if(!l.has(W(n)))throw new Error(`Task runner did not return an outcome for claimed task ${n.id.toString()} (${n.file})`);return[...l.values()]}function W(e){return JSON.stringify([typeof e.id,e.id,e.file])}function de(e,a){return e.getGraph(a.graphKey)??A(a)}function pe(e){return new Promise(a=>setTimeout(a,e))}
@@ -1 +1 @@
1
- import c from"node:fs";import f from"node:path";import{inspectRunManifests as d}from"../../process/runs/inspection.js";import{resolveProductDir as m}from"../../process/files/product-dir.js";import{asUnknownRecord as o,displayString as l,isUnknownRecord as p,optionalString as i}from"../../kernel/unknown-values.js";export async function collectRunStatus(t){if(t.runId){const e=m(process.cwd(),t.dir);if(!c.statSync(e).isDirectory())throw new Error(`Product directory is not a directory: ${e}`);return buildRunStatus({productDir:e},t)}const{loadConfigContext:r}=await import("../../config/loader/index.js"),n=await r({dir:t.dir});return buildRunStatus(n,t)}export function buildRunStatus(t,r={}){const n=d(t.productDir,r.runId||void 0),e=S(f.join(t.productDir,".testkit","results","live.json"));if(r.full)return Promise.resolve({productDir:t.productDir,mode:"full",runs:n,live:e});const s={productDir:t.productDir,mode:"summary",runs:n.map(A),live:b(e)};return s.live&&(s.live.state=describeLiveArtifactState(s)),Promise.resolve(s)}export function latestOperation(t){if(!Array.isArray(t))return null;const r=t.filter(p);return[...r].reverse().find(n=>n.status==="running")??r.at(-1)??null}export function describeLiveArtifactState(t){const r=o(t.live),n=o(r?.run),e=l(n?.id,"unknown"),s=l(n?.status,"unknown"),a=y(t,e);return s==="running"&&!a?{runId:e,status:"stale",reason:"no active run matches this live artifact"}:{runId:e,status:s,reason:i(n?.interruptReason)}}function y(t,r){if(!r||r==="unknown")return!1;for(const n of t.runs??[])if(n.active&&v(r,n.runId))return!0;return!1}function v(t,r){if(!r)return!1;const n=typeof r=="string"?r:typeof r=="number"&&Number.isFinite(r)?r.toString():null;return n?n===t||n.startsWith(`${t}:`):!1}function A(t){const r=g(t.status);return{runId:t.runId,pid:t.pid,status:t.status||"unknown",startedAt:t.startedAt||null,heartbeatAt:t.heartbeatAt||null,interruptReason:t.interruptReason||null,active:t.active,terminal:r,stale:!t.active&&!r,session:h(t.session)}}function g(t){return typeof t=="string"&&["finished","failed","interrupted"].includes(t)}function h(t){const r=o(t);return r?{kind:i(r.kind),status:i(r.status),stage:i(r.stage)}:null}function b(t){const r=o(t);if(!r)return null;const e=o(r.timings)?.operations??[],s=Array.isArray(e)?e:[],a=o(r.product),u=o(r.run);return{present:!0,schemaVersion:k(r.schemaVersion),generatedAt:i(r.generatedAt),product:a?{name:i(a.name),directory:i(a.directory)}:null,run:u?{id:i(u.id),status:i(u.status),startedAt:i(u.startedAt),finishedAt:i(u.finishedAt),durationMs:w(u.durationMs),interruptReason:i(u.interruptReason),testkitVersion:i(u.testkitVersion)}:null,summary:r.summary??null,operation:latestOperation(s),operationCount:s.length,artifactRef:".testkit/results/live.json",truncated:!0}}function w(t){const r=Number(t);return Number.isFinite(r)?r:null}function k(t){return typeof t=="number"&&Number.isFinite(t)?t:null}function S(t){try{return JSON.parse(c.readFileSync(t,"utf8"))}catch{return null}}
1
+ import c from"node:fs";import f from"node:path";import{inspectRunManifests as d}from"../../process/runs/inspection.js";import{resolveProductDir as m}from"../../process/files/product-dir.js";import{asUnknownRecord as o,displayString as l,isUnknownRecord as p,optionalString as i}from"../../kernel/unknown-values.js";export async function collectRunStatus(t){if(t.runId){const e=m(process.cwd(),t.dir);if(!c.statSync(e).isDirectory())throw new Error(`Product directory is not a directory: ${e}`);return buildRunStatus({productDir:e},t)}const{loadConfigContext:r}=await import("../../config/loader/index.js"),n=await r({dir:t.dir,plain:!1,retired:[]});return buildRunStatus(n,t)}export function buildRunStatus(t,r={}){const n=d(t.productDir,r.runId||void 0),e=S(f.join(t.productDir,".testkit","results","live.json"));if(r.full)return Promise.resolve({productDir:t.productDir,mode:"full",runs:n,live:e});const s={productDir:t.productDir,mode:"summary",runs:n.map(A),live:b(e)};return s.live&&(s.live.state=describeLiveArtifactState(s)),Promise.resolve(s)}export function latestOperation(t){if(!Array.isArray(t))return null;const r=t.filter(p);return[...r].reverse().find(n=>n.status==="running")??r.at(-1)??null}export function describeLiveArtifactState(t){const r=o(t.live),n=o(r?.run),e=l(n?.id,"unknown"),s=l(n?.status,"unknown"),a=y(t,e);return s==="running"&&!a?{runId:e,status:"stale",reason:"no active run matches this live artifact"}:{runId:e,status:s,reason:i(n?.interruptReason)}}function y(t,r){if(!r||r==="unknown")return!1;for(const n of t.runs??[])if(n.active&&v(r,n.runId))return!0;return!1}function v(t,r){if(!r)return!1;const n=typeof r=="string"?r:typeof r=="number"&&Number.isFinite(r)?r.toString():null;return n?n===t||n.startsWith(`${t}:`):!1}function A(t){const r=g(t.status);return{runId:t.runId,pid:t.pid,status:t.status||"unknown",startedAt:t.startedAt||null,heartbeatAt:t.heartbeatAt||null,interruptReason:t.interruptReason||null,active:t.active,terminal:r,stale:!t.active&&!r,session:h(t.session)}}function g(t){return typeof t=="string"&&["finished","failed","interrupted"].includes(t)}function h(t){const r=o(t);return r?{kind:i(r.kind),status:i(r.status),stage:i(r.stage)}:null}function b(t){const r=o(t);if(!r)return null;const e=o(r.timings)?.operations??[],s=Array.isArray(e)?e:[],a=o(r.product),u=o(r.run);return{present:!0,schemaVersion:k(r.schemaVersion),generatedAt:i(r.generatedAt),product:a?{name:i(a.name),directory:i(a.directory)}:null,run:u?{id:i(u.id),status:i(u.status),startedAt:i(u.startedAt),finishedAt:i(u.finishedAt),durationMs:w(u.durationMs),interruptReason:i(u.interruptReason),testkitVersion:i(u.testkitVersion)}:null,summary:r.summary??null,operation:latestOperation(s),operationCount:s.length,artifactRef:".testkit/results/live.json",truncated:!0}}function w(t){const r=Number(t);return Number.isFinite(r)?r:null}function k(t){return typeof t=="number"&&Number.isFinite(t)?t:null}function S(t){try{return JSON.parse(c.readFileSync(t,"utf8"))}catch{return null}}
@@ -1 +1 @@
1
- import{runManagedGitCommand as l}from"../../repo/managed-git.js";import{readGiteaVersion as p}from"../../tracker/gitea.js";import{createTracker as u}from"../../tracker/index.js";import{displayRepositoryReference as m,githubActionsApiUrl as h,parseTrackerRemote as d,parseTrackerRepositoryOverride as c,TrackerTargetError as n}from"./remote.js";import{readGitCredentialToken as f,trackerTokenFromEnvironment as g,trackerTokenVariables as w}from"./token.js";export{TrackerTargetError}from"./remote.js";const v="github.com",T="https://api.github.com";export async function resolveTracker(r){const t=await k(r),{actionsRun:o,apiUrl:e,provider:i}=await U(t,r.env),a=w(i,o),s=g(a,r.env)??await f(r.productDir,t,r.env);if(s===null)throw new n(`Testkit found no token for ${t.origin}. Set ${a.join(" or ")}, or give Git a credential helper that holds one for that host.`);return u({apiUrl:e,name:t.name,owner:t.owner,provider:i,token:s})}async function k(r){const t=r.repository?.trim()??"";if(/^https?:\/\//iu.test(t))return c(t,null);const o=await y(r),e=o===null?null:d(o);if(t.length>0)return c(t,e);if(e!==null)return e;throw new n(o===null?`${r.productDir} has no origin remote, so Testkit cannot tell which repository to report to. Add the remote, or name the repository as a URL such as https://host/owner/name.`:`Testkit cannot read a host, owner, and repository name from the origin remote ${JSON.stringify(m(o))}. Name the repository as a URL such as https://host/owner/name.`)}async function y(r){const t=await l(r.productDir,["config","--get","remote.origin.url"],{env:r.env,repositoryConfigOnly:!0}),o=t.stdout.trim();return t.exitCode===0&&o.length>0?o:null}async function U(r,t){if(new URL(r.origin).host===v)return{actionsRun:!1,apiUrl:T,provider:"github"};const o=h(r.origin,t);if(await p(r.origin)!==null)return{actionsRun:o!==null,apiUrl:o??`${r.origin}/api/v1`,provider:"gitea"};if(o!==null)return{actionsRun:!0,apiUrl:o,provider:"github"};throw new n(`${r.origin} does not answer as GitHub or Gitea. Testkit supports GitHub and Gitea.`)}
1
+ import{runManagedGitCommand as l}from"../../repo/managed-git.js";import{readGiteaVersion as p}from"../../tracker/gitea.js";import{createTracker as u}from"../../tracker/index.js";import{displayRepositoryReference as m,githubActionsApiUrl as h,parseTrackerRemote as g,parseTrackerRepositoryOverride as c,TrackerTargetError as n}from"./remote.js";import{readGitCredentialToken as d,trackerTokenFromEnvironment as f,trackerTokenVariables as w}from"./token.js";export{TrackerTargetError}from"./remote.js";const v="github.com",T="https://api.github.com";export async function resolveTracker(r){return u((await resolveRepositoryConnection(r)).target)}export async function resolveRepositoryConnection(r){const t=await k(r),{actionsRun:o,apiUrl:e,provider:i}=await R(t,r.env),a=w(i,o),s=f(a,r.env)??await d(r.productDir,t,r.env);if(s===null)throw new n(`Testkit found no token for ${t.origin}. Set ${a.join(" or ")}, or give Git a credential helper that holds one for that host.`);return{location:t,target:{apiUrl:e,name:t.name,owner:t.owner,provider:i,token:s}}}async function k(r){const t=r.repository?.trim()??"";if(/^https?:\/\//iu.test(t))return c(t,null);const o=await y(r),e=o===null?null:g(o);if(t.length>0)return c(t,e);if(e!==null)return e;throw new n(o===null?`${r.productDir} has no origin remote, so Testkit cannot tell which repository to report to. Add the remote, or name the repository as a URL such as https://host/owner/name.`:`Testkit cannot read a host, owner, and repository name from the origin remote ${JSON.stringify(m(o))}. Name the repository as a URL such as https://host/owner/name.`)}async function y(r){const t=await l(r.productDir,["config","--get","remote.origin.url"],{env:r.env,repositoryConfigOnly:!0}),o=t.stdout.trim();return t.exitCode===0&&o.length>0?o:null}async function R(r,t){if(new URL(r.origin).host===v)return{actionsRun:!1,apiUrl:T,provider:"github"};const o=h(r.origin,t);if(await p(r.origin)!==null)return{actionsRun:o!==null,apiUrl:o??`${r.origin}/api/v1`,provider:"gitea"};if(o!==null)return{actionsRun:!0,apiUrl:o,provider:"github"};throw new n(`${r.origin} does not answer as GitHub or Gitea. Testkit supports GitHub and Gitea.`)}
@@ -1,4 +1,4 @@
1
- import{attachErrorDiagnostics as w}from"../../kernel/error-serialization.js";import{isPathWithin as T}from"../../process/files/paths.js";import d from"fs";import i from"path";import{createHash as j}from"crypto";import{createRequire as _}from"module";import{fileURLToPath as O}from"url";import{NODE_VITEST_PACKAGE_REQUIREMENTS as C}from"../../engines/installations/package-requirements.js";import{PLAYWRIGHT_PACKAGE_FAMILY_REQUIREMENTS as A}from"../../engines/installations/package-requirements.js";import{hasDiscoveryErrors as $,buildDiscoveryErrorFromDiagnostics as R,detectNextApp as M,loadDiscoveredConfigContext as I,resolveServiceCwd as F}from"../../config/loader/index.js";import{K6_POSTGRES_DRIVER_SPECIFIER as N,K6_POSTGRES_DRIVER_TYPE_FILE as D,K6_RUNTIME_GLOBAL_TYPE_FILE as L}from"../../engines/k6/authoring-type-paths.js";import{managedHostProcessInfrastructureError as G,runManagedHostProcess as U}from"../../process/index.js";import{CONFIGURED_STEP_TESTKIT_MODULE_DIST_PATHS as K}from"../../steps/configured-step-testkit-modules.js";import{findPlaywrightConfigFile as z}from"../../engines/playwright/runtime/config-file.js";const J=600*1e3,h=i.resolve(i.dirname(O(import.meta.url)),"..","..",".."),k=_(i.join(h,"package.json")),x=()=>k("typescript"),q={...B(["@gfdelarue/testkit","@gfdelarue/testkit/config","@gfdelarue/testkit/config/build-assets","@gfdelarue/testkit/config/next-runtime-tsconfig","@gfdelarue/testkit/config/database-steps","@gfdelarue/testkit/drizzle","@gfdelarue/testkit/env","@gfdelarue/testkit/tooling/vitest"]),"@gfdelarue/testkit/k6":["engines","k6","runtime","index.d.ts"],"@gfdelarue/testkit/playwright":["engines","playwright","runtime","index.d.ts"],"@gfdelarue/testkit/node-vitest/data":["engines","node-vitest","runtime","data","index.d.ts"],"@gfdelarue/testkit/node-vitest/contract":["engines","node-vitest","runtime","contract","index.d.ts"],"@gfdelarue/testkit/workspace":["app","inspect","index.d.ts"]};function B(e){return Object.fromEntries(e.map(n=>{const t=K[n],s=t[t.length-1];return[n,[...t.slice(0,-1),`${s}.d.ts`]]}))}export class TestkitTypecheckError extends Error{result;results;constructor(n,t,s){super(`testkit typecheck failed for ${n}`),this.result=t,this.results=s,w(this,{result:t,results:s})}}export async function runTestkitTypecheck(e={}){v(e.timeoutMs);const{context:n,discovery:t}=await I({dir:e.dir});return runTestkitTypecheckForContext(n,t,e)}export async function runTestkitTypecheckForContext(e,n,t={}){const s=v(t.timeoutMs);if($(e.discovery.diagnostics))throw R(e.discovery.diagnostics);const o=e.productDir,r=i.join(o,".testkit","_typecheck");d.mkdirSync(r,{recursive:!0});const a=[];if(e.configFile){const u=H({productDir:o,configFile:e.configFile,outputDir:r});a.push({label:"config",cwd:o,tsconfigPath:u})}const c=n.files.map(u=>({engineId:u.engineId,path:u.path})),p=new Set(n.files.filter(u=>u.engineId==="playwright").map(u=>u.service));for(const u of e.configs){if(!p.has(u.name))continue;const y=z(F(o,u.testkit.local?.cwd));y&&c.push({engineId:"playwright",path:y})}const f=W(o,c);for(const u of f){const y=Y({...u,outputDir:r,productDir:o});a.push({label:X(u.engineId,u.scopeName),cwd:u.cwd,tsconfigPath:y})}const g=[];for(const u of a){const y=await ne(u,s,t.signal);if(g.push(y),!y.ok)throw new TestkitTypecheckError(u.label,y,g)}return{ok:!0,productDir:o,results:g}}function H({productDir:e,configFile:n,outputDir:t}){const s=i.join(t,"config.tsconfig.json"),o=P(e),r={...o?{extends:l(s,o)}:{},compilerOptions:buildTypecheckCompilerOptions({tsconfigPath:s,extendsPath:o,libs:["ES2022"],rootDir:l(s,e),types:["node"]}),files:[l(s,n)],include:[],exclude:[m(s,e,"node_modules"),m(s,e,"dist"),m(s,e,".testkit")]};return d.writeFileSync(s,`${JSON.stringify(r,null,2)}
2
- `),s}function Y({productDir:e,cwd:n,engineId:t,extendsPath:s,files:o,outputDir:r,scopeName:a}){const c=i.join(r,`${t}.${te(a)}.tsconfig.json`),p=t==="playwright",f=p&&M(n),g={...s?{extends:l(c,s)}:{},compilerOptions:{...buildTypecheckCompilerOptions({engineId:t,tsconfigPath:c,extendsPath:s,libs:Z(t),...f?{extraPaths:nextRuntimeTypePaths({tsconfigPath:c,serviceDir:n})}:{},types:Q(t)}),...p?{allowJs:!0,checkJs:!1}:{}},files:[...ae(t,c),...o.map(u=>l(c,u))],include:f?[...d.existsSync(i.join(n,"next-env.d.ts"))?[l(c,i.join(n,"next-env.d.ts"))]:[],m(c,n,"tests/playwright-fixtures/**/*.ts"),m(c,n,"tests/playwright-fixtures/**/*.tsx"),m(c,n,"tests/playwright-fixtures/**/*.mts"),m(c,n,".next/types/**/*.ts"),m(c,n,".next/dev/types/**/*.ts"),m(c,e,".next-testkit/**/dist/types/**/*.ts"),m(c,e,".next-testkit/**/dist/dev/types/**/*.ts")]:[],exclude:["node_modules",".next/cache",".next/dev"]};return d.writeFileSync(c,`${JSON.stringify(g,null,2)}
3
- `),c}function W(e,n){const t=new Map,s=new Map;for(const o of n){const r=i.resolve(e,o.path),a=[o.engineId,r].join("\0");s.set(a,{...o,path:r})}for(const o of s.values()){const r=o.path,a=o.engineId==="playwright"?S(i.dirname(r),e,["tsconfig.playwright.json"]):null,c=a??S(i.dirname(r),e),p=c?i.dirname(c):e,f=ee(e,p),g=`${o.engineId}\0${c??""}\0${f}`,u=t.get(g);if(u){u.files.push(r);continue}t.set(g,{cwd:p,engineId:o.engineId,extendsPath:c,files:[r,...a?V(a):[]],scopeName:f})}return[...t.values()].map(o=>({...o,files:[...new Set(o.files)].sort((r,a)=>r.localeCompare(a))})).sort((o,r)=>b(o.engineId)-b(r.engineId)||o.scopeName.localeCompare(r.scopeName))}function V(e){const n=x(),t=o=>{throw new Error(`${e}: ${n.flattenDiagnosticMessageText(o.messageText,`
4
- `)}`)},s=n.getParsedCommandLineOfConfigFile(e,{},{...n.sys,onUnRecoverableConfigFileDiagnostic:t});for(const o of s?.errors??[])o.code!==18002&&o.code!==18003&&t(o);return s?.fileNames??[]}function Q(e){switch(e){case"k6":return["k6","xk6-sql"];case"node-vitest":case"playwright":return["node"]}}function Z(e){return e==="playwright"?["ES2022","DOM","DOM.Iterable"]:["ES2022"]}function b(e){return["k6","node-vitest","playwright"].indexOf(e)}function X(e,n){return n==="repo"?e:`${e}:${n}`}function ee(e,n){const t=i.relative(e,n);return t===""?"repo":t.split(i.sep).join("/")}function te(e){const n=e.replace(/[^a-zA-Z0-9_-]+/g,"-");if(n===e)return e;const t=j("sha256").update(e).digest("hex").slice(0,12);return`${n}-${t}`}function ne({label:e,cwd:n,tsconfigPath:t},s,o){const r=se(n);return U({args:[...r.args,"--noEmit","-p",t],cwd:n,displayLabel:`Testkit typecheck ${e}`,env:process.env,executable:r.command,signal:o,timeoutMs:s}).then(a=>{const c=G(`Testkit typecheck ${e}`,a);if(c)throw c;return{label:e,tsconfigPath:t,ok:a.exitCode===0,exitCode:a.exitCode,stdout:a.stdout,stderr:a.stderr}})}function v(e){const n=e??J;if(!Number.isSafeInteger(n)||n<=0)throw new Error("Testkit typecheck timeout must be a positive safe integer in milliseconds");return n}function se(e){let n=e;for(;;){const s=i.join(n,"node_modules","typescript","bin","tsc");if(d.existsSync(s))return{command:process.execPath,args:[s]};const o=i.dirname(n);if(o===n)break;n=o}const t=i.join(h,"node_modules","typescript","bin","tsc");if(d.existsSync(t))return{command:process.execPath,args:[t]};throw new Error(`TypeScript compiler not found from ${e} upward`)}function P(e,n=["tsconfig.json","tsconfig.build.json"]){for(const t of n){const s=i.join(e,t);if(d.existsSync(s))return s}return null}function S(e,n,t){const s=i.resolve(n);let o=i.resolve(e);for(;;){if(!T(s,o))return null;const r=P(o,t);if(r)return r;if(o===s)return null;const a=i.dirname(o);if(a===o)return null;o=a}}function l(e,n){const t=i.relative(i.dirname(e),n).split(i.sep).join("/");return t.startsWith("../")||i.isAbsolute(t)?t:`./${t}`}function m(e,n,t){return i.join(l(e,n),t).split(i.sep).join("/")}function oe(e){const n={};for(const[t,s]of Object.entries(q))n[t]=[l(e,i.join(h,"dist",...s))];return n}const re=Object.freeze({packages:Object.freeze(C.filter(({authoringResolution:e})=>e==="package-exports").map(({packageName:e})=>Object.freeze({name:e}))),supportedExports:"exact-manifest-exports"}),ie=Object.freeze({packages:Object.freeze(A.map(({packageName:e})=>Object.freeze({name:e}))),supportedExports:"exact-manifest-exports"});function ce(e,n){const t=pe(e);if(t===null)return{};const s={},o=l(n,i.join(h,"dist","app","typecheck","unavailable.d.ts"));for(const r of t.packages){const a=le(r.name),c=fe(r.name,a);s[`${r.name}/*`]=[o];for(const p of Object.keys(c).sort()){if(p!=="."&&!p.startsWith("./")||p.includes("*"))continue;const f=p==="."?r.name:`${r.name}${p.slice(1)}`,g=ge(f,r.name,a);s[f]=[g===null?o:l(n,g)]}}return s}function ae(e,n){return e==="k6"?[l(n,i.join(h,"dist",...L))]:[]}function ue(e,n){return e==="k6"?{[N]:[l(n,i.join(h,"dist",...D))]}:{}}function pe(e){switch(e){case"node-vitest":return re;case"playwright":return ie;case"k6":case void 0:return null}}function le(e){const n=de(e);let t;try{t=k.resolve(`${e}/package.json`)}catch(r){throw new Error(`Testkit typecheck requires managed public package ${e}`,{cause:r})}const s=d.realpathSync.native(i.dirname(t)),o=JSON.parse(d.readFileSync(i.join(s,"package.json"),"utf8"));return requireManagedPublicPackageIdentity(o,e,n),s}export function requireManagedPublicPackageIdentity(e,n,t){if(!E(e)||e.name!==n||e.version!==t)throw new Error(`Testkit managed public package has invalid identity: expected ${n}@${t}`)}function de(e){const n=JSON.parse(d.readFileSync(i.join(h,"package.json"),"utf8"));if(!E(n)||!E(n.dependencies))throw new Error("Testkit package has invalid dependency metadata");const t=n.dependencies[e];if(typeof t!="string"||!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u.test(t))throw new Error(`Testkit managed public package ${e} must be an exact root dependency`);return t}function E(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function fe(e,n){const t=JSON.parse(d.readFileSync(i.join(n,"package.json"),"utf8"));if(typeof t!="object"||t===null||Array.isArray(t)||!("name"in t)||t.name!==e||!("exports"in t)||typeof t.exports!="object"||t.exports===null||Array.isArray(t.exports))throw new Error(`Testkit managed public package has invalid exports: ${e}`);return t.exports}function ge(e,n,t){const s=x(),o=s.resolveModuleName(e,i.join(h,"__testkit_managed_public_types__.ts"),{module:s.ModuleKind.ESNext,moduleResolution:s.ModuleResolutionKind.Bundler,resolveJsonModule:!0,target:s.ScriptTarget.ES2022},s.sys).resolvedModule;if(o===void 0)return null;const r=d.realpathSync.native(o.resolvedFileName);if(!T(t,r))throw new Error(`Managed public package type ${e} resolved outside ${n}`);return r}export function buildTypecheckCompilerOptions({engineId:e,tsconfigPath:n,extendsPath:t,rootDir:s,extraPaths:o={},libs:r,types:a}){const p={...t?ye({tsconfigPath:n,extendsPath:t}):{},...o,...oe(n),...ce(e,n),...ue(e,n)};return{baseUrl:null,lib:[...r],module:"ESNext",moduleResolution:"Bundler",noEmit:!0,...s?{rootDir:s}:{},target:"ES2022",typeRoots:me(a,n),types:[...a],paths:p}}function me(e,n){const t=new Set;for(const s of e){if(s==="k6"||s==="xk6-sql"){const c=i.join(h,"dist","engines","k6","runtime","ambient-types");if(!d.existsSync(i.join(c,s,"index.d.ts")))throw new Error(`Testkit typecheck requires bundled ${s} authoring types; rebuild the installed Testkit package`);t.add(c);continue}const o=he(s);let r;try{r=k.resolve(`${o}/package.json`)}catch(c){throw new Error(`Testkit typecheck requires installed type package ${o}`,{cause:c})}const a=i.dirname(r);t.add(i.dirname(a))}return[...t].map(s=>l(n,s))}function he(e){return e==="node"||e==="k6"?`@types/${e}`:e}function ye({tsconfigPath:e,extendsPath:n}){const t=x(),s=t.getParsedCommandLineOfConfigFile(n,{},{...t.sys,onUnRecoverableConfigFileDiagnostic:()=>{}}),o=s?.options.paths;if(!o||Object.keys(o).length===0)return{};const r=s.options.baseUrl||(typeof s.options.pathsBasePath=="string"?s.options.pathsBasePath:i.dirname(n)),a={};for(const[c,p]of Object.entries(o))a[c]=p.map(f=>l(e,i.resolve(r,f)));return a}export function nextRuntimeTypePaths({tsconfigPath:e,serviceDir:n}){const t=ke(n,[i.join("next","types.d.ts"),i.join("next","types.js")]);if(!t)return{};const s=l(e,t);return{"next/types":[s],"next/types.js":[s]}}function ke(e,n){let t=i.resolve(e);for(;;){for(const o of n){const r=i.join(t,"node_modules",o);if(d.existsSync(r))return r}const s=i.dirname(t);if(s===t)return null;t=s}}
1
+ import{attachErrorDiagnostics as S}from"../../kernel/error-serialization.js";import{isPathWithin as b}from"../../process/files/paths.js";import{resolveProductDir as $}from"../../process/files/product-dir.js";import l from"fs";import i from"path";import{createHash as C}from"crypto";import{createRequire as O}from"module";import{fileURLToPath as _}from"url";import{resolveVitestSelection as M}from"../../engines/catalog.js";import{NODE_VITEST_PACKAGE_REQUIREMENTS as A}from"../../engines/installations/package-requirements.js";import{PLAYWRIGHT_PACKAGE_FAMILY_REQUIREMENTS as N}from"../../engines/installations/package-requirements.js";import{hasDiscoveryErrors as R,buildDiscoveryErrorFromDiagnostics as I,detectNextApp as F,loadDiscoveredConfigContext as D}from"../../config/loader/index.js";import{managedHostProcessInfrastructureError as G,runManagedHostProcess as U}from"../../process/index.js";import{findNearestPlaywrightConfigFile as J}from"../../engines/playwright/runtime/config-file.js";import{isUnknownRecord as k}from"../../kernel/unknown-values.js";const L=600*1e3,y=i.resolve(i.dirname(_(import.meta.url)),"..","..",".."),x=O(i.join(y,"package.json")),v=()=>x("typescript");export class TestkitTypecheckError extends Error{result;results;constructor(n,t,o){super(`testkit typecheck failed for ${n}`),this.result=t,this.results=o,S(this,{result:t,results:o})}}export async function runTestkitTypecheck(e={}){w(e.timeoutMs);const n=$(process.cwd(),e.dir),t=M(e.vitest??{},n),{context:o,discovery:s}=await D({dir:n,vitest:t});return o.ownershipNotice!==null&&e.notice?.(o.ownershipNotice),runTestkitTypecheckForContext(o,s,e)}export async function runTestkitTypecheckForContext(e,n,t={}){const o=w(t.timeoutMs);if(R(e.discovery.diagnostics))throw I(e.discovery.diagnostics);const s=e.productDir,r=i.join(s,".testkit","_typecheck");l.mkdirSync(r,{recursive:!0});const c=[];if(e.configFile){const p=z({productDir:s,configFile:e.configFile,outputDir:r});c.push({label:"config",cwd:s,tsconfigPath:p})}const a=n.files.filter(p=>/\.[cm]?tsx?$/u.test(p.path)).map(p=>({engineId:p.engineId,path:p.path})),u=new Set(n.files.filter(p=>p.engineId==="playwright").map(p=>p.group));for(const p of e.groups){if(!u.has(p.name))continue;const h=J(s,p.roots);h&&a.push({engineId:"playwright",path:h})}const d=q(s,a);for(const p of d){const h=K({...p,outputDir:r,productDir:s});c.push({label:W(p.engineId,p.scopeName),cwd:p.cwd,tsconfigPath:h})}const g=[];for(const p of c){const h=await Q(p,o,t.signal);if(g.push(h),!h.ok)throw new TestkitTypecheckError(p.label,h,g)}return{ok:!0,productDir:s,results:g}}function z({productDir:e,configFile:n,outputDir:t}){const o=i.join(t,"config.tsconfig.json"),s=E(e),r={...s?{extends:f(o,s)}:{},compilerOptions:buildTypecheckCompilerOptions({tsconfigPath:o,extendsPath:s,libs:["ES2022"],rootDir:f(o,e),types:["node"]}),files:[f(o,n)],include:[],exclude:[m(o,e,"node_modules"),m(o,e,"dist"),m(o,e,".testkit")]};return l.writeFileSync(o,`${JSON.stringify(r,null,2)}
2
+ `),o}function K({productDir:e,cwd:n,engineId:t,extendsPath:o,files:s,outputDir:r,scopeName:c}){const a=i.join(r,`${t}.${Y(c)}.tsconfig.json`),u=t==="playwright",d=u&&F(n),g={...o?{extends:f(a,o)}:{},compilerOptions:{...buildTypecheckCompilerOptions({engineId:t,tsconfigPath:a,extendsPath:o,libs:H(t),...d?{extraPaths:nextRuntimeTypePaths({tsconfigPath:a,serviceDir:n})}:{},types:["node"]}),...u?{allowJs:!0,checkJs:!1}:{}},files:s.map(p=>f(a,p)),include:d?[...l.existsSync(i.join(n,"next-env.d.ts"))?[f(a,i.join(n,"next-env.d.ts"))]:[],m(a,n,"tests/playwright-fixtures/**/*.ts"),m(a,n,"tests/playwright-fixtures/**/*.tsx"),m(a,n,"tests/playwright-fixtures/**/*.mts"),m(a,n,".next/types/**/*.ts"),m(a,n,".next/dev/types/**/*.ts"),m(a,e,".next-testkit/**/dist/types/**/*.ts"),m(a,e,".next-testkit/**/dist/dev/types/**/*.ts")]:[],exclude:["node_modules",".next/cache",".next/dev"]};return l.writeFileSync(a,`${JSON.stringify(g,null,2)}
3
+ `),a}function q(e,n){const t=new Map,o=new Map;for(const s of n){const r=i.resolve(e,s.path),c=[s.engineId,r].join("\0");o.set(c,{...s,path:r})}for(const s of o.values()){const r=s.path,c=s.engineId==="playwright"?T(i.dirname(r),e,["tsconfig.playwright.json"]):null,a=c??T(i.dirname(r),e),u=a?i.dirname(a):e,d=V(e,u),g=`${s.engineId}\0${a??""}\0${d}`,p=t.get(g);if(p){p.files.push(r);continue}t.set(g,{cwd:u,engineId:s.engineId,extendsPath:a,files:[r,...c?B(c):[]],scopeName:d})}return[...t.values()].map(s=>({...s,files:[...new Set(s.files)].sort((r,c)=>r.localeCompare(c))})).sort((s,r)=>P(s.engineId)-P(r.engineId)||s.scopeName.localeCompare(r.scopeName))}function B(e){const n=v(),t=s=>{throw new Error(`${e}: ${n.flattenDiagnosticMessageText(s.messageText,`
4
+ `)}`)},o=n.getParsedCommandLineOfConfigFile(e,{},{...n.sys,onUnRecoverableConfigFileDiagnostic:t});for(const s of o?.errors??[])s.code!==18002&&s.code!==18003&&t(s);return o?.fileNames??[]}function H(e){return e==="playwright"?["ES2022","DOM","DOM.Iterable"]:["ES2022"]}function P(e){return["node-vitest","playwright"].indexOf(e)}function W(e,n){return n==="repo"?e:`${e}:${n}`}function V(e,n){const t=i.relative(e,n);return t===""?"repo":t.split(i.sep).join("/")}function Y(e){const n=e.replace(/[^a-zA-Z0-9_-]+/g,"-");if(n===e)return e;const t=C("sha256").update(e).digest("hex").slice(0,12);return`${n}-${t}`}function Q({label:e,cwd:n,tsconfigPath:t},o,s){const r=Z(n);return U({args:[...r.args,"--noEmit","-p",t],cwd:n,displayLabel:`Testkit typecheck ${e}`,env:process.env,executable:r.command,signal:s,timeoutMs:o}).then(c=>{const a=G(`Testkit typecheck ${e}`,c);if(a)throw a;return{label:e,tsconfigPath:t,ok:c.exitCode===0,exitCode:c.exitCode,stdout:c.stdout,stderr:c.stderr}})}function w(e){const n=e??L;if(!Number.isSafeInteger(n)||n<=0)throw new Error("Testkit typecheck timeout must be a positive safe integer in milliseconds");return n}function Z(e){let n=e;for(;;){const o=i.join(n,"node_modules","typescript","bin","tsc");if(l.existsSync(o))return{command:process.execPath,args:[o]};const s=i.dirname(n);if(s===n)break;n=s}const t=i.join(y,"node_modules","typescript","bin","tsc");if(l.existsSync(t))return{command:process.execPath,args:[t]};throw new Error(`TypeScript compiler not found from ${e} upward`)}function E(e,n=["tsconfig.json","tsconfig.build.json"]){for(const t of n){const o=i.join(e,t);if(l.existsSync(o))return o}return null}function T(e,n,t){const o=i.resolve(n);let s=i.resolve(e);for(;;){if(!b(o,s))return null;const r=E(s,t);if(r)return r;if(s===o)return null;const c=i.dirname(s);if(c===s)return null;s=c}}function f(e,n){const t=i.relative(i.dirname(e),n).split(i.sep).join("/");return t.startsWith("../")||i.isAbsolute(t)?t:`./${t}`}function m(e,n,t){return i.join(f(e,n),t).split(i.sep).join("/")}function X(e){const n={};for(const[t,o]of Object.entries(j("@gfdelarue/testkit",y)))!k(o)||typeof o.types!="string"||(n[`@gfdelarue/testkit${t.slice(1)}`]=[f(e,i.join(y,o.types))]);return n}const ee=Object.freeze({packages:Object.freeze(A.filter(({authoringResolution:e})=>e==="package-exports").map(({packageName:e})=>Object.freeze({name:e}))),supportedExports:"exact-manifest-exports"}),te=Object.freeze({packages:Object.freeze(N.map(({packageName:e})=>Object.freeze({name:e}))),supportedExports:"exact-manifest-exports"});function ne(e,n){const t=oe(e);if(t===null)return{};const o={},s=f(n,i.join(y,"dist","app","typecheck","unavailable.d.ts"));for(const r of t.packages){const c=se(r.name),a=j(r.name,c);o[`${r.name}/*`]=[s];for(const u of Object.keys(a).sort()){if(u!=="."&&!u.startsWith("./")||u.includes("*"))continue;const d=u==="."?r.name:`${r.name}${u.slice(1)}`,g=ie(d,r.name,c);o[d]=[g===null?s:f(n,g)]}}return o}function oe(e){switch(e){case"node-vitest":return ee;case"playwright":return te;case void 0:return null}}function se(e){const n=re(e);let t;try{t=x.resolve(`${e}/package.json`)}catch(r){throw new Error(`Testkit typecheck requires managed public package ${e}`,{cause:r})}const o=l.realpathSync.native(i.dirname(t)),s=JSON.parse(l.readFileSync(i.join(o,"package.json"),"utf8"));return requireManagedPublicPackageIdentity(s,e,n),o}export function requireManagedPublicPackageIdentity(e,n,t){if(!k(e)||e.name!==n||e.version!==t)throw new Error(`Testkit managed public package has invalid identity: expected ${n}@${t}`)}function re(e){const n=JSON.parse(l.readFileSync(i.join(y,"package.json"),"utf8"));if(!k(n)||!k(n.dependencies))throw new Error("Testkit package has invalid dependency metadata");const t=n.dependencies[e];if(typeof t!="string"||!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u.test(t))throw new Error(`Testkit managed public package ${e} must be an exact root dependency`);return t}function j(e,n){const t=JSON.parse(l.readFileSync(i.join(n,"package.json"),"utf8"));if(typeof t!="object"||t===null||Array.isArray(t)||!("name"in t)||t.name!==e||!("exports"in t)||typeof t.exports!="object"||t.exports===null||Array.isArray(t.exports))throw new Error(`Testkit managed public package has invalid exports: ${e}`);return t.exports}function ie(e,n,t){const o=v(),s=o.resolveModuleName(e,i.join(y,"__testkit_managed_public_types__.ts"),{module:o.ModuleKind.ESNext,moduleResolution:o.ModuleResolutionKind.Bundler,resolveJsonModule:!0,target:o.ScriptTarget.ES2022},o.sys).resolvedModule;if(s===void 0)return null;const r=l.realpathSync.native(s.resolvedFileName);if(!b(t,r))throw new Error(`Managed public package type ${e} resolved outside ${n}`);return r}export function buildTypecheckCompilerOptions({engineId:e,tsconfigPath:n,extendsPath:t,rootDir:o,extraPaths:s={},libs:r,types:c}){const u={...t?pe({tsconfigPath:n,extendsPath:t}):{},...s,...X(n),...ne(e,n)};return{baseUrl:null,lib:[...r],module:"ESNext",moduleResolution:"Bundler",noEmit:!0,...o?{rootDir:o}:{},target:"ES2022",typeRoots:ce(c,n),types:[...c],paths:u}}function ce(e,n){const t=new Set;for(const o of e){const s=ae(o);let r;try{r=x.resolve(`${s}/package.json`)}catch(a){throw new Error(`Testkit typecheck requires installed type package ${s}`,{cause:a})}const c=i.dirname(r);t.add(i.dirname(c))}return[...t].map(o=>f(n,o))}function ae(e){return e==="node"?`@types/${e}`:e}function pe({tsconfigPath:e,extendsPath:n}){const t=v(),o=t.getParsedCommandLineOfConfigFile(n,{},{...t.sys,onUnRecoverableConfigFileDiagnostic:()=>{}}),s=o?.options.paths;if(!s||Object.keys(s).length===0)return{};const r=o.options.baseUrl||(typeof o.options.pathsBasePath=="string"?o.options.pathsBasePath:i.dirname(n)),c={};for(const[a,u]of Object.entries(s))c[a]=u.map(d=>f(e,i.resolve(r,d)));return c}export function nextRuntimeTypePaths({tsconfigPath:e,serviceDir:n}){const t=ue(n,[i.join("next","types.d.ts"),i.join("next","types.js")]);if(!t)return{};const o=f(e,t);return{"next/types":[o],"next/types.js":[o]}}function ue(e,n){let t=i.resolve(e);for(;;){for(const s of n){const r=i.join(t,"node_modules",s);if(l.existsSync(r))return r}const o=i.dirname(t);if(o===t)return null;t=o}}
@@ -1 +1 @@
1
- import{Args as s,Flags as e}from"./framework/definitions.js";import{defineCommand as t}from"./framework/command.js";import{sharedFlags as r,runFlags as i}from"./command-flags.js";import{publicTestTypeList as n,publicTestTypeListText as a}from"../domain/test-types.js";export const commandCatalog=Object.freeze({artifacts:t({summary:"List, verify, or inspect artifacts from immutable Testkit runs",enableJsonFlag:!0,args:{file:s.string({description:"Optional test file selector",required:!1})},flags:{...r,kind:e.string({description:"Limit artifacts to one kind"}),format:e.string({description:"Output format",options:["list","text"],default:"list"}),run:e.string({description:"Read one immutable run ID instead of latest"}),list:e.boolean({description:"List retained immutable runs",default:!1}),verify:e.boolean({description:"Verify the selected run manifest and checksums",default:!1})}}),"bug file":t({summary:"Run a recorded bug's test and file the bug as an issue",enableJsonFlag:!0,args:{id:s.string({description:"Draft id that `testkit bug record` printed",required:!0})},flags:{dir:e.string({description:"Product directory"})}}),"bug guide":t({summary:"Print the bug record format, the severities, and the category lists",enableJsonFlag:!0}),"bug record":t({summary:"Record a confirmed bug as a local draft",enableJsonFlag:!0,args:{file:s.string({description:"Bug record JSON file, or - to read standard input",required:!0})},flags:{dir:e.string({description:"Product directory"})}}),"campaign finish":t({summary:"Finish the active campaign and write its pull request summary",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"})}}),"campaign start":t({summary:"Start a bug-hunting campaign and print the agent's brief",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"}),id:e.string({description:"Campaign id, instead of one made from the target and the date"}),target:e.string({description:"What the agent should hunt, in one line of at most 200 characters",required:!0})}}),"campaign status":t({summary:"Show the active campaign, its recorded bugs, and the area map coverage",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"})}}),"ci report":t({summary:"Post the last run as a commit status, a step summary, and one pull request comment",enableJsonFlag:!0,flags:{context:e.string({description:"Commit status context, instead of testkit"}),dir:e.string({description:"Product directory"})}}),cleanup:t({summary:"Clean stale local testkit state",enableJsonFlag:!0,flags:{...r,"dry-run":e.boolean({description:"Show cleanup actions without deleting state",default:!1}),cache:e.string({description:"Clean cache state: runtime, bundles, or all",multiple:!0,options:["runtime","bundles","all"]}),resources:e.boolean({description:"Clean Testkit-owned Docker resources that are stale or orphaned",default:!1})}}),"db schema refresh":t({summary:"Refresh a source database schema cache",enableJsonFlag:!0,flags:r}),"db schema verify":t({summary:"Verify local schema replay against the source database schema",enableJsonFlag:!0,flags:{...r,"skip-schema-source-verify":e.boolean({description:"Skip the check that local schema replay matches the source database schema",default:!1})}}),destroy:t({summary:"Destroy local testkit state",enableJsonFlag:!0,flags:r}),discover:t({summary:"Discover managed tests and report their metadata",enableJsonFlag:!0,flags:{...r,type:e.string({char:"t",multiple:!0,description:`Filter by suite type(s): ${a({includeAll:!0})}`}),suite:e.string({char:"s",multiple:!0,description:"Filter by suite selector(s)"}),file:e.string({char:"f",multiple:!0,description:"Filter by exact file path(s)"}),"runnable-only":e.boolean({description:"Show only files not skipped by repo rules",default:!1}),strict:e.boolean({description:"Fail instead of reporting discovery/config diagnostics",default:!1}),output:e.string({description:"Write machine-readable discovery JSON to a file"}),"output-mode":e.string({description:"Human-readable output mode",options:["compact","verbose"],default:"compact"})}}),doctor:t({summary:"Run built-in config, discovery, and hygiene checks",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"}),typecheck:e.boolean({description:"Include generated TypeScript checks",default:!0,allowNo:!0})}}),"guard unsafe-entrypoint":t({summary:"Fail a local script that must be run through Testkit",flags:{command:e.string({char:"c",description:"Disabled command name shown in the error message",required:!0}),use:e.string({char:"u",description:"Replacement command shown in the error message",required:!0})}}),lint:t({summary:"Run built-in Testkit repository hygiene checks",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"})}}),"run status":t({summary:"Show active Testkit run progress",enableJsonFlag:!0,flags:{...r,run:e.string({description:"Specific run id to show"}),full:e.boolean({description:"Include the full live status payload in JSON output"})}}),"run stop":t({summary:"Stop active Testkit run work",enableJsonFlag:!0,flags:{...r,run:e.string({description:"Specific run id to stop; defaults to the newest active run"}),all:e.boolean({description:"Stop all active runs for this product",default:!1}),reason:e.string({description:"Operator-visible reason recorded with cancelled runs and dirty slots"})}}),run:t({summary:"Run test suites",enableJsonFlag:!0,args:{type:s.string({description:`Optional suite type shortcut: ${a({includeAll:!0})}`,required:!1,options:n({includeAll:!0})})},flags:i}),"setup playwright":t({summary:"Install the managed Playwright Chromium runtime",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"}),force:e.boolean({default:!1,description:"Force Playwright to repair the browser installation"}),"with-deps":e.boolean({default:!1,description:"Install required host dependencies with Chromium"})}}),status:t({summary:"Show local testkit state",enableJsonFlag:!0,flags:r}),stop:t({summary:"Stop all Testkit-owned runs",enableJsonFlag:!0,flags:{...r,reason:e.string({description:"Operator-visible reason recorded with cancelled runs"})}}),typecheck:t({summary:"Typecheck testkit config, helpers, and suites",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"})}}),workspace:t({summary:"Inspect Testkit workstation data for a product",enableJsonFlag:!0,flags:{...r,"target-limit":e.integer({description:"Maximum number of quick-run target previews",default:24}),"no-status":e.boolean({description:"Skip runtime status collection",default:!1})}})});
1
+ import{Args as i,Flags as e}from"./framework/definitions.js";import{defineCommand as t}from"./framework/command.js";import{runArgs as n,runFlags as o,sharedFlags as r,suppliedEnvironmentFlags as l,testSelectionFlags as a,vitestSelectionFlags as s}from"./command-flags.js";import{publicTestTypeListText as u}from"../domain/test-types.js";export const commandCatalog=Object.freeze({artifacts:t({summary:"List, verify, or inspect artifacts from immutable Testkit runs",enableJsonFlag:!0,args:{file:i.string({description:"Optional test file selector",required:!1})},flags:{...a,kind:e.string({description:"Limit artifacts to one kind"}),format:e.string({description:"Output format",options:["list","text"],default:"list"}),run:e.string({description:"Read one immutable run ID instead of latest"}),list:e.boolean({description:"List retained immutable runs",default:!1}),verify:e.boolean({description:"Verify the selected run manifest and checksums",default:!1})}}),"bug file":t({summary:"Run a recorded bug's test and file the bug as an issue",enableJsonFlag:!0,args:{id:i.string({description:"Draft id that `testkit bug record` printed",required:!0})},flags:{dir:e.string({description:"Product directory"}),...l,...s}}),"bug guide":t({summary:"Print the bug record format, the severities, and the category lists",enableJsonFlag:!0}),"bug record":t({summary:"Record a confirmed bug as a local draft",enableJsonFlag:!0,args:{file:i.string({description:"Bug record JSON file, or - to read standard input",required:!0})},flags:{dir:e.string({description:"Product directory"}),...s}}),"campaign finish":t({summary:"Finish the active campaign and write its pull request summary",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"})}}),"campaign start":t({summary:"Start a bug-hunting campaign and print the agent's brief",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"}),id:e.string({description:"Campaign id, instead of one made from the target and the date"}),target:e.string({description:"What the agent should hunt, in one line of at most 200 characters",required:!0})}}),"campaign status":t({summary:"Show the active campaign, its recorded bugs, and the area map coverage",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"})}}),"ci report":t({summary:"Post the last run as a commit status, a step summary, and one pull request comment",enableJsonFlag:!0,flags:{context:e.string({description:"Commit status context, instead of testkit"}),dir:e.string({description:"Product directory"})}}),cleanup:t({summary:"Clean stale local testkit state",enableJsonFlag:!0,flags:{...r,"dry-run":e.boolean({description:"Show cleanup actions without deleting state",default:!1}),cache:e.string({description:"Clean cache state: runtime, bundles, or all",multiple:!0,options:["runtime","bundles","all"]}),resources:e.boolean({description:"Clean Testkit-owned Docker resources that are stale or orphaned",default:!1})}}),"db schema refresh":t({summary:"Refresh a source database schema cache",enableJsonFlag:!0,flags:r}),"db schema verify":t({summary:"Verify local schema replay against the source database schema",enableJsonFlag:!0,flags:{...r,"skip-schema-source-verify":e.boolean({description:"Skip the check that local schema replay matches the source database schema",default:!1})}}),destroy:t({summary:"Destroy local testkit state",enableJsonFlag:!0,flags:r}),discover:t({summary:"Discover managed tests and report their metadata",enableJsonFlag:!0,flags:{...a,...s,type:e.string({char:"t",multiple:!0,description:`Filter by suite type(s): ${u({includeAll:!0})}`}),suite:e.string({char:"s",multiple:!0,description:"Filter by suite selector(s)"}),file:e.string({char:"f",multiple:!0,description:"Filter by exact file path(s)"}),"runnable-only":e.boolean({description:"Show only files not skipped by repo rules",default:!1}),strict:e.boolean({description:"Fail instead of reporting discovery/config diagnostics",default:!1}),output:e.string({description:"Write machine-readable discovery JSON to a file"}),"output-mode":e.string({description:"Human-readable output mode",options:["compact","verbose"],default:"compact"})}}),doctor:t({summary:"Run built-in config, discovery, and hygiene checks",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"}),typecheck:e.boolean({description:"Include generated TypeScript checks",default:!0,allowNo:!0})}}),"guard unsafe-entrypoint":t({summary:"Fail a local script that must be run through Testkit",flags:{command:e.string({char:"c",description:"Disabled command name shown in the error message",required:!0}),use:e.string({char:"u",description:"Replacement command shown in the error message",required:!0})}}),lint:t({summary:"Run built-in Testkit repository hygiene checks",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"})}}),"report prepare":t({summary:"Prepare a local report with optional template, bug records, and selected run evidence",enableJsonFlag:!0,args:{directory:i.string({description:"New bundle directory",required:!0})},flags:{dir:e.string({description:"Product directory containing bug records and runs"}),template:e.string({description:"Copy this file unchanged to report.md"}),instructions:e.string({description:"Print this repository-owned drafting guide for the author"}),bug:e.string({description:"Include this recorded bug ID as context",multiple:!0}),run:e.string({description:"Immutable run ID containing the selected artifacts"}),artifact:e.string({description:"Exact artifact ref.path from testkit artifacts --json",multiple:!0})}}),"report publish":t({summary:"Publish a prepared directory at one Git revision without changing your checkout",enableJsonFlag:!0,args:{directory:i.string({description:"Directory containing only the files to publish",required:!0})},flags:{dir:e.string({description:"Product directory used to resolve provider credentials"}),repository:e.string({description:"Destination GitHub or Gitea repository URL, or owner/name",required:!0}),branch:e.string({description:"Destination branch",required:!0}),path:e.string({description:"Bundle directory within the destination repository",required:!0}),message:e.string({description:"Publication commit message"})}}),"run status":t({summary:"Show active Testkit run progress",enableJsonFlag:!0,flags:{...r,run:e.string({description:"Specific run id to show"}),full:e.boolean({description:"Include the full live status payload in JSON output"})}}),"run stop":t({summary:"Stop active Testkit run work",enableJsonFlag:!0,flags:{...r,run:e.string({description:"Specific run id to stop; defaults to the newest active run"}),all:e.boolean({description:"Stop all active runs for this product",default:!1}),reason:e.string({description:"Operator-visible reason recorded with cancelled runs and dirty slots"})}}),run:t({summary:"Run test suites",enableJsonFlag:!0,args:n,flags:o}),"setup playwright":t({summary:"Install the managed Playwright Chromium runtime",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"}),force:e.boolean({default:!1,description:"Force Playwright to repair the browser installation"}),"with-deps":e.boolean({default:!1,description:"Install required host dependencies with Chromium"})}}),status:t({summary:"Show local testkit state",enableJsonFlag:!0,flags:r}),stop:t({summary:"Stop all Testkit-owned runs",enableJsonFlag:!0,flags:{...r,reason:e.string({description:"Operator-visible reason recorded with cancelled runs"})}}),typecheck:t({summary:"Typecheck testkit config, helpers, and suites",enableJsonFlag:!0,flags:{dir:e.string({description:"Product directory"}),...s}}),workspace:t({summary:"Inspect Testkit workstation data for a product",enableJsonFlag:!0,flags:{...a,"target-limit":e.integer({description:"Maximum number of quick-run target previews",default:24}),"no-status":e.boolean({description:"Skip runtime status collection",default:!1})}})});
@@ -1 +1 @@
1
- import{publicTestTypeListText as t}from"../domain/test-types.js";import{Flags as e}from"./framework/index.js";export const sharedFlags={dir:e.string({description:"Explicit product directory"}),service:e.string({description:"Limit the operation to one service"})},runFlags={...sharedFlags,type:e.string({char:"t",multiple:!0,description:`Run specific suite type(s): ${t({includeAll:!0})}`}),suite:e.string({char:"s",multiple:!0,description:"Run specific suite(s)"}),file:e.string({char:"f",multiple:!0,description:"Run specific file(s)"}),"task-concurrency":e.string({description:"Maximum number of concurrent test tasks for the whole run"}),workers:e.string({description:"Deprecated alias for --task-concurrency; removed in 0.3.0"}),"file-timeout-seconds":e.string({description:"Per-file wall-clock timeout in seconds"}),"allow-empty":e.boolean({description:"Permit a successful run when no runnable files execute",default:!1}),"ignore-skip-rules":e.boolean({description:"Run files even if testkit.config.ts marks them skipped",default:!1}),"skip-schema-source-verify":e.boolean({description:"Skip the check that local schema replay matches the source database schema",default:!1}),"output-mode":e.string({description:"Reporter mode",options:["compact","debug","events"]}),debug:e.boolean({description:"Alias for --output-mode debug",default:!1})};
1
+ import{RETIRED_TEST_TYPES as o,rejectRetiredTestType as p}from"../domain/retired-test-types.js";import{publicTestTypeList as c,publicTestTypeListText as n}from"../domain/test-types.js";import{CliUsageError as l}from"./framework/errors.js";import{Args as u,Flags as e}from"./framework/index.js";export const sharedFlags={dir:e.string({description:"Explicit product directory"}),service:e.string({description:"Limit the operation to one service"})},testSelectionFlags={dir:sharedFlags.dir,group:e.string({description:"Limit the operation to one test group"}),service:e.string({description:"Deprecated alias for --group"})};export function selectedGroup(s,i){const{group:r,service:t}=s;if(t===void 0)return r??null;if(r!==void 0&&r!==t)throw new l(`--group ${r} and --service ${t} select different groups; pass only --group`);return i(`--service selects a test group on this command and will be removed; use --group ${t}`),t}export const vitestSelectionFlags={"vitest-config":e.string({description:"Run plain test files with this Vitest config, relative to the product directory"}),"vitest-project":e.string({description:"Run plain test files from this Vitest project only"}),"vitest-runner":e.string({description:"Run plain test files with the repository's Vitest (repo) or Testkit's own (managed)",options:["repo","managed"]})},suppliedEnvironmentFlags={"base-url":e.string({description:"Supply the default endpoint, BASE_URL, instead of provisioning it"}),endpoint:e.string({multiple:!0,description:"Supply a named endpoint as NAME=URL"}),database:e.string({multiple:!0,description:"Supply a named PostgreSQL database as NAME=URL"}),env:e.string({multiple:!0,description:"Supply an environment value as NAME=VALUE"}),"env-from":e.string({multiple:!0,description:"Supply an environment value from a host variable as NAME=HOST_KEY"}),"environment-file":e.string({description:"Supply values, prepared setup data and handle descriptors from a version 1 environment file"})};export function runTypeArgument(s=o){return u.string({check:i=>{p(i,`Type "${i}"`,s)},description:`Optional suite type shortcut: ${n({includeAll:!0})}`,required:!1,options:c({includeAll:!0})})}export const runArgs={type:runTypeArgument()},runFlags={...testSelectionFlags,...suppliedEnvironmentFlags,...vitestSelectionFlags,type:e.string({char:"t",multiple:!0,description:`Run specific suite type(s): ${n({includeAll:!0})}`}),suite:e.string({char:"s",multiple:!0,description:"Run specific suite(s)"}),file:e.string({char:"f",multiple:!0,description:"Run specific file(s)"}),"task-concurrency":e.string({description:"Maximum number of concurrent test tasks for the whole run"}),workers:e.string({description:"Deprecated alias for --task-concurrency; removed in 0.3.0"}),"file-timeout-seconds":e.string({description:"Per-file wall-clock timeout in seconds"}),"allow-empty":e.boolean({description:"Permit a successful run when no runnable files execute",default:!1}),"ignore-skip-rules":e.boolean({description:"Run files even if testkit.config.ts marks them skipped",default:!1}),"skip-schema-source-verify":e.boolean({description:"Skip the check that local schema replay matches the source database schema",default:!1}),"output-mode":e.string({description:"Reporter mode",options:["compact","debug","events"]}),debug:e.boolean({description:"Alias for --output-mode debug",default:!1})};
@@ -1 +1 @@
1
- import{commandCatalog as i}from"./command-catalog.js";export const commandRegistry=Object.freeze([t("artifacts",()=>import("./commands/artifacts.js")),t("bug file",()=>import("./commands/bug/file.js")),t("bug guide",()=>import("./commands/bug/guide.js")),t("bug record",()=>import("./commands/bug/record.js")),t("campaign finish",()=>import("./commands/campaign/finish.js")),t("campaign start",()=>import("./commands/campaign/start.js")),t("campaign status",()=>import("./commands/campaign/status.js")),t("ci report",()=>import("./commands/ci/report.js")),t("cleanup",()=>import("./commands/cleanup.js")),t("db schema refresh",()=>import("./commands/db/schema/refresh.js")),t("db schema verify",()=>import("./commands/db/schema/verify.js")),t("destroy",()=>import("./commands/destroy.js")),t("discover",()=>import("./commands/discover.js")),t("doctor",()=>import("./commands/doctor.js")),t("guard unsafe-entrypoint",()=>import("./commands/guard/unsafe-entrypoint.js")),t("lint",()=>import("./commands/lint.js")),t("run status",()=>import("./commands/run/status.js")),t("run stop",()=>import("./commands/run/stop.js")),t("run",()=>import("./commands/run.js")),t("setup playwright",()=>import("./commands/setup/playwright.js")),t("status",()=>import("./commands/status.js")),t("stop",()=>import("./commands/stop.js")),t("typecheck",()=>import("./commands/typecheck.js")),t("workspace",()=>import("./commands/workspace.js"))]),removedCommands=new Map([["cloud","The testkit cloud commands were removed in Testkit 0.4.0. Testkit no longer publishes runs to Testkit Cloud."]]);function t(r,o){return Object.freeze({...i[r],id:r.split(" "),load:o})}
1
+ import{commandCatalog as i}from"./command-catalog.js";export const commandRegistry=Object.freeze([t("artifacts",()=>import("./commands/artifacts.js")),t("bug file",()=>import("./commands/bug/file.js")),t("bug guide",()=>import("./commands/bug/guide.js")),t("bug record",()=>import("./commands/bug/record.js")),t("campaign finish",()=>import("./commands/campaign/finish.js")),t("campaign start",()=>import("./commands/campaign/start.js")),t("campaign status",()=>import("./commands/campaign/status.js")),t("ci report",()=>import("./commands/ci/report.js")),t("cleanup",()=>import("./commands/cleanup.js")),t("db schema refresh",()=>import("./commands/db/schema/refresh.js")),t("db schema verify",()=>import("./commands/db/schema/verify.js")),t("destroy",()=>import("./commands/destroy.js")),t("discover",()=>import("./commands/discover.js")),t("doctor",()=>import("./commands/doctor.js")),t("guard unsafe-entrypoint",()=>import("./commands/guard/unsafe-entrypoint.js")),t("lint",()=>import("./commands/lint.js")),t("report prepare",()=>import("./commands/report/prepare.js")),t("report publish",()=>import("./commands/report/publish.js")),t("run status",()=>import("./commands/run/status.js")),t("run stop",()=>import("./commands/run/stop.js")),t("run",()=>import("./commands/run.js")),t("setup playwright",()=>import("./commands/setup/playwright.js")),t("status",()=>import("./commands/status.js")),t("stop",()=>import("./commands/stop.js")),t("typecheck",()=>import("./commands/typecheck.js")),t("workspace",()=>import("./commands/workspace.js"))]),removedCommands=new Map([["cloud","The testkit cloud commands were removed in Testkit 0.4.0. Testkit no longer publishes runs to Testkit Cloud."]]);function t(r,o){return Object.freeze({...i[r],id:r.split(" "),load:o})}