@overkill-dev/run 0.0.92 → 0.0.94

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 (272) hide show
  1. package/baselines/calibration-reference.js +1 -1
  2. package/baselines/calibration-reference.js.map +1 -1
  3. package/baselines/performance-presentation.js +1 -1
  4. package/baselines/performance-presentation.js.map +1 -1
  5. package/baselines/performance-schema.js +1 -1
  6. package/baselines/performance-schema.js.map +1 -1
  7. package/bench/calibration-evidence.js +1 -1
  8. package/bench/calibration-evidence.js.map +1 -1
  9. package/config/config.d.ts +3 -1
  10. package/config/config.d.ts.map +1 -1
  11. package/config/config.js +10 -11
  12. package/config/config.js.map +1 -1
  13. package/config/defaults.js +4 -0
  14. package/config/defaults.js.map +1 -1
  15. package/config/history-policy.d.ts +15 -0
  16. package/config/history-policy.d.ts.map +1 -0
  17. package/config/history-policy.js +26 -0
  18. package/config/history-policy.js.map +1 -0
  19. package/config/normalized-microtest-schema.js +1 -0
  20. package/config/normalized-microtest-schema.js.map +1 -1
  21. package/config/profile-normalization.js +4 -1
  22. package/config/profile-normalization.js.map +1 -1
  23. package/config/property-corpus.js +21 -0
  24. package/config/property-corpus.js.map +1 -0
  25. package/config/schema.d.ts +76 -0
  26. package/config/schema.d.ts.map +1 -1
  27. package/config/schema.js +8 -0
  28. package/config/schema.js.map +1 -1
  29. package/config/snapshot.js +6 -0
  30. package/config/snapshot.js.map +1 -1
  31. package/config/types.d.ts +24 -0
  32. package/config/types.d.ts.map +1 -1
  33. package/config/validation.js +4 -0
  34. package/config/validation.js.map +1 -1
  35. package/package.json +13 -3
  36. package/packages/run/command-line.entry-point.d.ts +1 -1
  37. package/packages/run/command-line.entry-point.d.ts.map +1 -1
  38. package/packages/run/command-line.entry-point.js +5 -2
  39. package/packages/run/command-line.entry-point.js.map +1 -1
  40. package/packages/run/config.entry-point.d.ts +1 -0
  41. package/packages/run/config.entry-point.d.ts.map +1 -1
  42. package/packages/run/run.entry-point.d.ts +5 -1
  43. package/packages/run/run.entry-point.d.ts.map +1 -1
  44. package/packages/run/run.entry-point.js +2 -1
  45. package/packages/run/run.entry-point.js.map +1 -1
  46. package/readme.md +120 -1
  47. package/reporters/failure-summary.js +29 -0
  48. package/reporters/failure-summary.js.map +1 -1
  49. package/reporters/human-reporter-rendering.js +5 -1
  50. package/reporters/human-reporter-rendering.js.map +1 -1
  51. package/run/assertion-result-schema.js +1 -1
  52. package/run/assertion-result-schema.js.map +1 -1
  53. package/run/attachment-record.js +13 -12
  54. package/run/attachment-record.js.map +1 -1
  55. package/run/attachment-run.js +18 -7
  56. package/run/attachment-run.js.map +1 -1
  57. package/run/benchmark-result-schema.js +1 -1
  58. package/run/benchmark-result-schema.js.map +1 -1
  59. package/run/collected-run-execution.js +4 -26
  60. package/run/collected-run-execution.js.map +1 -1
  61. package/run/collected-run-invocation.js +39 -0
  62. package/run/collected-run-invocation.js.map +1 -0
  63. package/run/collected-run-plan-schema.js +1 -1
  64. package/run/collected-run-plan-schema.js.map +1 -1
  65. package/run/collected-run.js +4 -3
  66. package/run/collected-run.js.map +1 -1
  67. package/run/command-line-command-namespace.d.ts +2 -0
  68. package/run/command-line-command-namespace.d.ts.map +1 -1
  69. package/run/command-line-command-namespace.js +35 -0
  70. package/run/command-line-command-namespace.js.map +1 -1
  71. package/run/command-line-command.d.ts +5 -0
  72. package/run/command-line-command.d.ts.map +1 -1
  73. package/run/command-line-config.js +2 -0
  74. package/run/command-line-config.js.map +1 -1
  75. package/run/command-line-execution.js +5 -1
  76. package/run/command-line-execution.js.map +1 -1
  77. package/run/command-line-runner.d.ts +2 -1
  78. package/run/command-line-runner.d.ts.map +1 -1
  79. package/run/command-line-runner.js +2 -1
  80. package/run/command-line-runner.js.map +1 -1
  81. package/run/compact-history-schema.d.ts +20 -0
  82. package/run/compact-history-schema.d.ts.map +1 -0
  83. package/run/compact-history-schema.js +32 -0
  84. package/run/compact-history-schema.js.map +1 -0
  85. package/run/compact-history.js +100 -0
  86. package/run/compact-history.js.map +1 -0
  87. package/run/coverage-run-record.js +2 -9
  88. package/run/coverage-run-record.js.map +1 -1
  89. package/run/duration-history-schema.js +3 -1
  90. package/run/duration-history-schema.js.map +1 -1
  91. package/run/duration-history-storage.js +170 -0
  92. package/run/duration-history-storage.js.map +1 -0
  93. package/run/duration-history-types.js +2 -0
  94. package/run/duration-history-types.js.map +1 -0
  95. package/run/duration-history.js +24 -92
  96. package/run/duration-history.js.map +1 -1
  97. package/run/execution-session-collected.js +1 -1
  98. package/run/execution-session-collected.js.map +1 -1
  99. package/run/execution-session-supervised.js +1 -1
  100. package/run/execution-session-supervised.js.map +1 -1
  101. package/run/freeze-run-policy.js +1 -0
  102. package/run/freeze-run-policy.js.map +1 -1
  103. package/run/frozen-policy-validation.js +1 -0
  104. package/run/frozen-policy-validation.js.map +1 -1
  105. package/run/frozen-run-policy-schema.js +3 -0
  106. package/run/frozen-run-policy-schema.js.map +1 -1
  107. package/run/frozen-run-policy.d.ts.map +1 -1
  108. package/run/frozen-run-policy.js +1 -0
  109. package/run/frozen-run-policy.js.map +1 -1
  110. package/run/history-commands.d.ts +4 -0
  111. package/run/history-commands.d.ts.map +1 -0
  112. package/run/history-commands.js +76 -0
  113. package/run/history-commands.js.map +1 -0
  114. package/run/history-confirmation.js +33 -0
  115. package/run/history-confirmation.js.map +1 -0
  116. package/run/history-lock-acquisition.js +59 -0
  117. package/run/history-lock-acquisition.js.map +1 -0
  118. package/run/history-maintenance-budget.js +35 -0
  119. package/run/history-maintenance-budget.js.map +1 -0
  120. package/run/history-maintenance.js +21 -0
  121. package/run/history-maintenance.js.map +1 -0
  122. package/run/history-outcomes.js +78 -0
  123. package/run/history-outcomes.js.map +1 -0
  124. package/run/history-pruning.js +104 -0
  125. package/run/history-pruning.js.map +1 -0
  126. package/run/history-reader.js +32 -0
  127. package/run/history-reader.js.map +1 -0
  128. package/run/history-record.js +48 -0
  129. package/run/history-record.js.map +1 -0
  130. package/run/history-repair.js +158 -0
  131. package/run/history-repair.js.map +1 -0
  132. package/run/history-retention-metadata.js +54 -0
  133. package/run/history-retention-metadata.js.map +1 -0
  134. package/run/history-retention-records.js +85 -0
  135. package/run/history-retention-records.js.map +1 -0
  136. package/run/history-state-access.js +161 -0
  137. package/run/history-state-access.js.map +1 -0
  138. package/run/history-state-error.js +35 -0
  139. package/run/history-state-error.js.map +1 -0
  140. package/run/history-storage-types.d.ts +13 -0
  141. package/run/history-storage-types.d.ts.map +1 -0
  142. package/run/history-storage.js +55 -0
  143. package/run/history-storage.js.map +1 -0
  144. package/run/history-types.d.ts +40 -0
  145. package/run/history-types.d.ts.map +1 -0
  146. package/run/history.d.ts +3 -0
  147. package/run/history.d.ts.map +1 -0
  148. package/run/history.js +97 -0
  149. package/run/history.js.map +1 -0
  150. package/run/local-run-collection.js +31 -0
  151. package/run/local-run-collection.js.map +1 -0
  152. package/run/node-history-storage.js +107 -0
  153. package/run/node-history-storage.js.map +1 -0
  154. package/run/node-run-execution.js +6 -0
  155. package/run/node-run-execution.js.map +1 -1
  156. package/run/prepared-run.js +42 -0
  157. package/run/prepared-run.js.map +1 -0
  158. package/run/property-corpus-cache.js +85 -0
  159. package/run/property-corpus-cache.js.map +1 -0
  160. package/run/property-corpus-execution.js +69 -0
  161. package/run/property-corpus-execution.js.map +1 -0
  162. package/run/property-corpus-storage.js +86 -0
  163. package/run/property-corpus-storage.js.map +1 -0
  164. package/run/property-evidence-schema.js +48 -0
  165. package/run/property-evidence-schema.js.map +1 -0
  166. package/run/recorded-coverage-run.js +2 -12
  167. package/run/recorded-coverage-run.js.map +1 -1
  168. package/run/recorded-run.js +32 -0
  169. package/run/recorded-run.js.map +1 -0
  170. package/run/replay-command.js +5 -0
  171. package/run/replay-command.js.map +1 -0
  172. package/run/reporter-event-schema.js +4 -1
  173. package/run/reporter-event-schema.js.map +1 -1
  174. package/run/request-snapshot.js +1 -0
  175. package/run/request-snapshot.js.map +1 -1
  176. package/run/run-artifact-id-schema.js +1 -1
  177. package/run/run-artifact-id-schema.js.map +1 -1
  178. package/run/run-artifact-schema.d.ts.map +1 -1
  179. package/run/run-artifact-schema.js +3 -1
  180. package/run/run-artifact-schema.js.map +1 -1
  181. package/run/run-collected-resolution.js +3 -3
  182. package/run/run-collected-resolution.js.map +1 -1
  183. package/run/run-command-schema.js +8 -0
  184. package/run/run-command-schema.js.map +1 -1
  185. package/run/run-empty-shard.js.map +1 -1
  186. package/run/run-engine-primitives.d.ts.map +1 -1
  187. package/run/run-execution.js +26 -50
  188. package/run/run-execution.js.map +1 -1
  189. package/run/run-facts.js +54 -1
  190. package/run/run-facts.js.map +1 -1
  191. package/run/run-if-main.d.ts.map +1 -1
  192. package/run/run-if-main.js +5 -0
  193. package/run/run-if-main.js.map +1 -1
  194. package/run/run-in-process-execution.js.map +1 -1
  195. package/run/run-isolated-process.js +12 -3
  196. package/run/run-isolated-process.js.map +1 -1
  197. package/run/run-local-command.js +14 -33
  198. package/run/run-local-command.js.map +1 -1
  199. package/run/run-local-coverage.js +2 -1
  200. package/run/run-local-coverage.js.map +1 -1
  201. package/run/run-local-execution.js +3 -0
  202. package/run/run-local-execution.js.map +1 -1
  203. package/run/run-local-planning.js +5 -5
  204. package/run/run-local-planning.js.map +1 -1
  205. package/run/run-local-resolution.js +0 -4
  206. package/run/run-local-resolution.js.map +1 -1
  207. package/run/run-operations.d.ts.map +1 -1
  208. package/run/run-operations.js +1 -0
  209. package/run/run-operations.js.map +1 -1
  210. package/run/run-orchestrator-dependencies.d.ts +4 -2
  211. package/run/run-orchestrator-dependencies.d.ts.map +1 -1
  212. package/run/run-profile-facts.js +12 -0
  213. package/run/run-profile-facts.js.map +1 -1
  214. package/run/run-record-input.js +21 -0
  215. package/run/run-record-input.js.map +1 -1
  216. package/run/run-record-storage.js +15 -2
  217. package/run/run-record-storage.js.map +1 -1
  218. package/run/run-record.js +66 -19
  219. package/run/run-record.js.map +1 -1
  220. package/run/run-result-schema.d.ts +2 -0
  221. package/run/run-result-schema.d.ts.map +1 -1
  222. package/run/run-result-schema.js +11 -1
  223. package/run/run-result-schema.js.map +1 -1
  224. package/run/run-selection-filters.js +1 -1
  225. package/run/run-selection-filters.js.map +1 -1
  226. package/run/run-selection-schema.js +1 -1
  227. package/run/run-selection-schema.js.map +1 -1
  228. package/run/run-state-finalization.js +22 -0
  229. package/run/run-state-finalization.js.map +1 -0
  230. package/run/run-supervised-finalization.js +1 -1
  231. package/run/run-supervised-finalization.js.map +1 -1
  232. package/run/run-supervised-process.js +2 -1
  233. package/run/run-supervised-process.js.map +1 -1
  234. package/run/run-support.js +1 -19
  235. package/run/run-support.js.map +1 -1
  236. package/run/run-types.d.ts +14 -8
  237. package/run/run-types.d.ts.map +1 -1
  238. package/run/run-types.js.map +1 -1
  239. package/run/run-validation.js +3 -0
  240. package/run/run-validation.js.map +1 -1
  241. package/run/runner-result.js +10 -0
  242. package/run/runner-result.js.map +1 -0
  243. package/run/runtime-attachment-boundary.js +3 -3
  244. package/run/runtime-attachment-boundary.js.map +1 -1
  245. package/run/supervised-child-transport.js +19 -0
  246. package/run/supervised-child-transport.js.map +1 -1
  247. package/run/supervised-child.js +6 -2
  248. package/run/supervised-child.js.map +1 -1
  249. package/run/supervised-protocol-schema.js +3 -2
  250. package/run/supervised-protocol-schema.js.map +1 -1
  251. package/run/supervised-protocol.js +3 -0
  252. package/run/supervised-protocol.js.map +1 -1
  253. package/run/supervised-run-runtime.js +5 -0
  254. package/run/supervised-run-runtime.js.map +1 -1
  255. package/run/supervised-run-state.js +10 -1
  256. package/run/supervised-run-state.js.map +1 -1
  257. package/run/supervised-run.js +6 -20
  258. package/run/supervised-run.js.map +1 -1
  259. package/run/worker-pool-host-protocol-schema.js +1 -1
  260. package/run/worker-pool-host-protocol-schema.js.map +1 -1
  261. package/run/worker-pool-placement-planning.js.map +1 -1
  262. package/run/worker-pool-run.js +1 -1
  263. package/run/worker-pool-run.js.map +1 -1
  264. package/run/worker-pool-task-schema.js +1 -1
  265. package/run/worker-pool-task-schema.js.map +1 -1
  266. package/software-bill-of-materials.cyclonedx.json +26 -9
  267. package/engine/identity-schema.js +0 -38
  268. package/engine/identity-schema.js.map +0 -1
  269. package/run/attachment-eligibility.js +0 -37
  270. package/run/attachment-eligibility.js.map +0 -1
  271. package/run/duration-history.d.ts +0 -6
  272. package/run/duration-history.d.ts.map +0 -1
@@ -0,0 +1,40 @@
1
+ import type { Except } from 'type-fest';
2
+ import type { NormalizedConfig } from '../config/types.ts';
3
+ import type { HistoryRunSummary as StoredSummary } from './compact-history-schema.ts';
4
+ export type HistoryOptions = {
5
+ readonly projectRoot: string;
6
+ readonly config: Pick<NormalizedConfig, 'history' | 'runtimeStateDir'>;
7
+ };
8
+ export type HistoryRepairResult = {
9
+ readonly rebuiltRunCount: number;
10
+ readonly diagnostics: readonly string[];
11
+ readonly dataLoss: boolean;
12
+ };
13
+ export type HistoryRunSummary = Except<StoredSummary, 'replayable'> & {
14
+ readonly replay: 'available' | 'available-interrupted' | 'pruned' | 'unavailable';
15
+ };
16
+ export type HistoryPruneResult = {
17
+ readonly diagnostics: readonly string[];
18
+ readonly kind: 'applied' | 'dry-run';
19
+ readonly paths: readonly string[];
20
+ readonly removedSummaries: number;
21
+ readonly removedCases: number;
22
+ readonly removedWorkEntries: number;
23
+ };
24
+ export type HistoryClearResult = {
25
+ readonly paths: readonly string[];
26
+ readonly diagnostics: readonly string[];
27
+ };
28
+ export type HistoryPruneRequest = {
29
+ readonly dryRun: boolean;
30
+ };
31
+ export type HistoryClearRequest = {
32
+ readonly confirmed: true;
33
+ };
34
+ export type History = {
35
+ readonly list: () => Promise<readonly HistoryRunSummary[]>;
36
+ readonly prune: (request: HistoryPruneRequest) => Promise<HistoryPruneResult>;
37
+ readonly clear: (request: HistoryClearRequest) => Promise<HistoryClearResult>;
38
+ readonly compact: () => Promise<HistoryRepairResult>;
39
+ };
40
+ //# sourceMappingURL=history-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-types.d.ts","sourceRoot":"","sources":["../../../../source/run/history-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,IAAI,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEtF,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC;CAC1E,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC9B,CAAC;AACF,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG;IAClE,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,uBAAuB,GAAG,QAAQ,GAAG,aAAa,CAAC;CACrF,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACvC,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAAE,CAAC;AACjH,MAAM,MAAM,mBAAmB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAAE,CAAC;AAChE,MAAM,MAAM,mBAAmB,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAAE,CAAC;AAEhE,MAAM,MAAM,OAAO,GAAG;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9E,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACxD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { HistoryOptions, History } from './history-types.ts';
2
+ export declare function createHistory(options: HistoryOptions): History;
3
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../../source/run/history.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACR,cAAc,EAOd,OAAO,EACV,MAAM,oBAAoB,CAAC;AAqB5B,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAsF9D"}
package/run/history.js ADDED
@@ -0,0 +1,97 @@
1
+ import { rm } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { z } from 'zod';
4
+ import { createHistoryAccess, compareHistoryRuns, assertHistoryRunId, detailedRecordState } from "./history-state-access.js";
5
+ import { readCompactHistory } from "./history-storage.js";
6
+ import { historyStateError, historySchemaVersion } from "./history-state-error.js";
7
+ import { repairHistory } from "./history-repair.js";
8
+ import { pruneHistory } from "./history-pruning.js";
9
+ function replayAvailability(availability, replayable, status) {
10
+ if (availability === 'pruned') {
11
+ return 'pruned';
12
+ }
13
+ if (availability === 'unavailable' || !replayable) {
14
+ return 'unavailable';
15
+ }
16
+ return status === 'interrupted' ? 'available-interrupted' : 'available';
17
+ }
18
+ function currentTimestamp() {
19
+ const now = new Date();
20
+ return now.toISOString();
21
+ }
22
+ export function createHistory(options) {
23
+ const { directory, policy, store, runs, guarded, assertIdle, assertOwnedLocation, diagnostics, removeAbandonedOwners } = createHistoryAccess(options);
24
+ async function repair(mode) {
25
+ const result = await repairHistory({
26
+ ...store,
27
+ async withLock(operation) {
28
+ return await guarded(async function repairIdleHistory() {
29
+ await assertOwnedLocation();
30
+ await assertIdle();
31
+ const operationResult = await operation();
32
+ if (mode === 'explicit') {
33
+ await removeAbandonedOwners();
34
+ }
35
+ return operationResult;
36
+ });
37
+ }
38
+ }, { directory, policy, now: currentTimestamp(), mode });
39
+ return { ...result, diagnostics: [...diagnostics(), ...result.diagnostics] };
40
+ }
41
+ return {
42
+ async list() {
43
+ const source = await guarded(async function readHistorySource() {
44
+ return await store.read(path.join(directory, 'history', 'index.json'));
45
+ });
46
+ if (source !== null && historySchemaVersion(source) === 0) {
47
+ await repair('automatic');
48
+ }
49
+ return await guarded(async function listHistory() {
50
+ const index = await readCompactHistory(store, directory);
51
+ if (index === null) {
52
+ throw historyStateError('Compact history is missing.');
53
+ }
54
+ return await Promise.all(index
55
+ .summaries
56
+ .toSorted(compareHistoryRuns)
57
+ .map(async function publicSummary(summary) {
58
+ const { replayable, ...fields } = summary;
59
+ assertHistoryRunId(summary.id);
60
+ const availability = await detailedRecordState(path.join(runs, `${summary.id}.json`));
61
+ const replay = replayAvailability(availability, replayable, summary.status);
62
+ return { ...fields, replay };
63
+ }));
64
+ });
65
+ },
66
+ async compact() {
67
+ return await repair('explicit');
68
+ },
69
+ async clear(request) {
70
+ z.literal(true).parse(request.confirmed);
71
+ return await guarded(async function clearHistory() {
72
+ await assertOwnedLocation();
73
+ await assertIdle();
74
+ const paths = ['runs', 'history', 'duration-history', 'active-runs']
75
+ .map(function ownedPath(name) {
76
+ return path.join(directory, name);
77
+ });
78
+ for (const target of paths) {
79
+ await rm(target, { recursive: true, force: true });
80
+ }
81
+ return { paths, diagnostics: diagnostics() };
82
+ });
83
+ },
84
+ async prune(request) {
85
+ return await guarded(async function pruneIdleHistory() {
86
+ await assertOwnedLocation();
87
+ await assertIdle();
88
+ const result = await pruneHistory({ directory, policy, store }, request);
89
+ if (!request.dryRun) {
90
+ await removeAbandonedOwners();
91
+ }
92
+ return { ...result, diagnostics: diagnostics() };
93
+ });
94
+ }
95
+ };
96
+ }
97
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../../source/run/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { createResultFromResolutionError } from "./run-collection-error-result.js";
2
+ import { createLocalRunOrEmptySelectionResultFromInput } from "./run-local-resolution.js";
3
+ import { emptyTimingSpanMetadata } from "./run-timing-collection.js";
4
+ export function isRunResult(value) {
5
+ return Object.hasOwn(value, 'summary');
6
+ }
7
+ async function resolveRunWithRuntimePolicy(resolveRun, runtimePolicy) {
8
+ return runtimePolicy === null ? await resolveRun() : await runtimePolicy.runLoad(resolveRun);
9
+ }
10
+ export async function createLocalRunResult(command, dependencies, runtimePolicy, options) {
11
+ const resolveRun = async function resolveLocalRunInsidePolicy() {
12
+ return await options.timing.measureAsync('collection.resolve', emptyTimingSpanMetadata(), async function createTimedLocalRunOrEmptySelectionResult() {
13
+ const resolved = await createLocalRunOrEmptySelectionResultFromInput(command, dependencies, options.input, options.source);
14
+ await options.record?.recordFacts(resolved.facts);
15
+ return resolved.run;
16
+ });
17
+ };
18
+ try {
19
+ return await resolveRunWithRuntimePolicy(resolveRun, runtimePolicy);
20
+ }
21
+ catch (error) {
22
+ try {
23
+ return createResultFromResolutionError(error, runtimePolicy);
24
+ }
25
+ catch {
26
+ runtimePolicy?.takeRunErrors();
27
+ throw error;
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=local-run-collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-run-collection.js","sourceRoot":"","sources":["../../../../source/run/local-run-collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAEnF,OAAO,EACH,6CAA6C,EAEhD,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,uBAAuB,EAA6B,MAAM,4BAA4B,CAAC;AAYhG,MAAM,UAAU,WAAW,CAAC,KAA8B;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,2BAA2B,CACtC,UAAmC,EACnC,aAAsC;IAEtC,OAAO,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,OAAmB,EACnB,YAAyC,EACzC,aAAsC,EACtC,OAAwB;IAExB,MAAM,UAAU,GAAG,KAAK,UAAU,2BAA2B;QACzD,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,YAAY,CACpC,oBAAoB,EACpB,uBAAuB,EAAE,EACzB,KAAK,UAAU,yCAAyC;YACpD,MAAM,QAAQ,GAAG,MAAM,6CAA6C,CAChE,OAAO,EACP,YAAY,EACZ,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,MAAM,CACjB,CAAC;YACF,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClD,OAAO,QAAQ,CAAC,GAAG,CAAC;QACxB,CAAC,CACJ,CAAC;IACN,CAAC,CAAC;IAEF,IAAI,CAAC;QACD,OAAO,MAAM,2BAA2B,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACtB,IAAI,CAAC;YACD,OAAO,+BAA+B,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACL,aAAa,EAAE,aAAa,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;AACL,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { mkdir, readdir, rm } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { hostname } from 'node:os';
4
+ import lockfile from 'proper-lockfile';
5
+ import { createNodeFileStore } from "../file-store.js";
6
+ import { checkHistoryMaintenanceBudget } from "./history-maintenance-budget.js";
7
+ import { acquireHistoryLock } from "./history-lock-acquisition.js";
8
+ function createLockState() {
9
+ let error = null;
10
+ return {
11
+ error() {
12
+ return error;
13
+ },
14
+ record(value) {
15
+ error = value;
16
+ }
17
+ };
18
+ }
19
+ async function directoryNames(directory) {
20
+ try {
21
+ return await readdir(directory);
22
+ }
23
+ catch (error) {
24
+ if (error instanceof Error && Reflect.get(error, 'code') === 'ENOENT') {
25
+ return [];
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+ async function historyFiles(directory) {
31
+ const names = await directoryNames(directory);
32
+ return names
33
+ .filter(function jsonRecord(name) {
34
+ return name.endsWith('.json');
35
+ })
36
+ .map(function recordPath(name) {
37
+ return path.join(directory, name);
38
+ });
39
+ }
40
+ async function guardedHistoryOperation(operation, state) {
41
+ const result = await operation();
42
+ const error = state.error();
43
+ if (error !== null) {
44
+ throw error;
45
+ }
46
+ return result;
47
+ }
48
+ async function acquireRunLease(ownerPath, policy, state) {
49
+ try {
50
+ return await lockfile.lock(ownerPath, {
51
+ lockfilePath: `${ownerPath}.lease`,
52
+ stale: policy.staleLockMilliseconds,
53
+ onCompromised: state.record
54
+ });
55
+ }
56
+ catch (error) {
57
+ await rm(ownerPath, { force: true });
58
+ throw error;
59
+ }
60
+ }
61
+ export function createNodeHistoryStorage(directory, policy) {
62
+ const store = createNodeFileStore();
63
+ const history = {
64
+ async beginRun(id) {
65
+ const ownerPath = path.join(directory, 'active-runs', `${id}.json`);
66
+ const state = createLockState();
67
+ const release = await history.withLock(async function registerOwner() {
68
+ await store.create(ownerPath, JSON.stringify({ pid: process.pid, host: hostname() }));
69
+ return await acquireRunLease(ownerPath, policy, state);
70
+ });
71
+ return async function releaseOwner() {
72
+ await release();
73
+ await rm(ownerPath, { force: true });
74
+ const error = state.error();
75
+ if (error !== null) {
76
+ throw error;
77
+ }
78
+ };
79
+ },
80
+ async read(target) {
81
+ checkHistoryMaintenanceBudget();
82
+ return await store.read(target);
83
+ },
84
+ async write(target, content) {
85
+ checkHistoryMaintenanceBudget();
86
+ await store.write(target, content);
87
+ },
88
+ async list(target) {
89
+ checkHistoryMaintenanceBudget();
90
+ return await historyFiles(target);
91
+ },
92
+ async withLock(operation) {
93
+ checkHistoryMaintenanceBudget();
94
+ await mkdir(directory, { recursive: true });
95
+ const state = createLockState();
96
+ const release = await acquireHistoryLock(directory, policy, state.record);
97
+ try {
98
+ return await guardedHistoryOperation(operation, state);
99
+ }
100
+ finally {
101
+ await release();
102
+ }
103
+ }
104
+ };
105
+ return history;
106
+ }
107
+ //# sourceMappingURL=node-history-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-history-storage.js","sourceRoot":"","sources":["../../../../source/run/node-history-storage.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { createExecute } from "@overkill-dev/engine/engine/execution.js";
2
2
  import { createNodeFileStore } from "../file-store.js";
3
+ import { createNodeHistoryStorage } from "./node-history-storage.js";
3
4
  import { createWorkerPoolWithHostProcess } from "./node-worker-pool-factory.js";
4
5
  import { createNodeProcessUsageTracker } from "./process-usage.js";
5
6
  function readActiveResourceTypes() {
@@ -7,6 +8,11 @@ function readActiveResourceTypes() {
7
8
  }
8
9
  export function createNodeExecutionDependencies(input) {
9
10
  return {
11
+ createHistoryStorage: createNodeHistoryStorage,
12
+ async maintainHistory(options) {
13
+ const { maintainHistory } = await import("./history-maintenance.js");
14
+ return await maintainHistory(options);
15
+ },
10
16
  createProcessUsageTracker(options) {
11
17
  return createNodeProcessUsageTracker(input.wallClock, options);
12
18
  },
@@ -1 +1 @@
1
- {"version":3,"file":"node-run-execution.js","sourceRoot":"","sources":["../../../../source/run/node-run-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0CAAwB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAenE,SAAS,uBAAuB;IAC5B,OAAO,OAAO,CAAC,sBAAsB,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAyB;IACrE,OAAO;QACH,yBAAyB,CAAC,OAAO;YAC7B,OAAO,6BAA6B,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnE,CAAC;QACD,gBAAgB,CAAC,OAAO;YACpB,OAAO,+BAA+B,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,EAAE,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACxG,CAAC;QACD,OAAO,EAAE,aAAa,CAAC;YACnB,oBAAoB,EAAE,IAAI;YAC1B,oBAAoB,EAAE,SAAS;YAC/B,uBAAuB;YACvB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,SAAS,EAAE,KAAK,CAAC,SAAS;SAC7B,CAAC;QACF,iBAAiB,EAAE,mBAAmB,EAAE;KAC3C,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"node-run-execution.js","sourceRoot":"","sources":["../../../../source/run/node-run-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0CAAwB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAoBnE,SAAS,uBAAuB;IAC5B,OAAO,OAAO,CAAC,sBAAsB,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAyB;IACrE,OAAO;QACH,oBAAoB,EAAE,wBAAwB;QAC9C,KAAK,CAAC,eAAe,CAAC,OAAO;YACzB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YACrE,OAAO,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,yBAAyB,CAAC,OAAO;YAC7B,OAAO,6BAA6B,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnE,CAAC;QACD,gBAAgB,CAAC,OAAO;YACpB,OAAO,+BAA+B,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,EAAE,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACxG,CAAC;QACD,OAAO,EAAE,aAAa,CAAC;YACnB,oBAAoB,EAAE,IAAI;YAC1B,oBAAoB,EAAE,SAAS;YAC/B,uBAAuB;YACvB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,SAAS,EAAE,KAAK,CAAC,SAAS;SAC7B,CAAC;QACF,iBAAiB,EAAE,mBAAmB,EAAE;KAC3C,CAAC;AACN,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { runIsolatedProcessCommand } from "./run-isolated-process.js";
2
+ import { runLocalCommand } from "./run-local-command.js";
3
+ async function prepareRun(invocation, options) {
4
+ if (invocation.namespace === 'test') {
5
+ return { input: options.input, session: null };
6
+ }
7
+ const { prepareBenchmarkExecution } = await import("./benchmark-baseline-run.js");
8
+ return await prepareBenchmarkExecution(options);
9
+ }
10
+ async function executePreparedRun(prepared, options) {
11
+ const { command: resolvedCommand, dependencies, source, timing } = options;
12
+ const { input, session: baseline } = prepared;
13
+ const executionDependencies = baseline === null ? dependencies : {
14
+ ...dependencies,
15
+ reporterDispatcher: baseline.reporterDispatcher
16
+ };
17
+ const isolatedResult = runIsolatedProcessCommand(resolvedCommand, executionDependencies, {
18
+ baseline,
19
+ record: options.record,
20
+ source,
21
+ timing,
22
+ signal: options.signal
23
+ }, input);
24
+ if (isolatedResult !== null) {
25
+ return await isolatedResult;
26
+ }
27
+ return await runLocalCommand(resolvedCommand, executionDependencies, {
28
+ baseline,
29
+ input,
30
+ source,
31
+ timing,
32
+ record: options.record
33
+ });
34
+ }
35
+ function isRunResult(value) {
36
+ return Object.hasOwn(value, 'summary');
37
+ }
38
+ export async function executePreparedInvocation(invocation, options) {
39
+ const prepared = await prepareRun(invocation, options);
40
+ return isRunResult(prepared) ? prepared : await executePreparedRun(prepared, options);
41
+ }
42
+ //# sourceMappingURL=prepared-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepared-run.js","sourceRoot":"","sources":["../../../../source/run/prepared-run.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAczD,KAAK,UAAU,UAAU,CACrB,UAAyB,EACzB,OAA4B;IAE5B,IAAI,UAAU,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnD,CAAC;IACD,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAClF,OAAO,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACpD,CAAC;AAWD,KAAK,UAAU,kBAAkB,CAAC,QAA8B,EAAE,OAA0B;IACxF,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3E,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IAC9C,MAAM,qBAAqB,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7D,GAAG,YAAY;QACf,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;KAClD,CAAC;IACF,MAAM,cAAc,GAAG,yBAAyB,CAAC,eAAe,EAAE,qBAAqB,EAAE;QACrF,QAAQ;QACR,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM;QACN,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;KACzB,EAAE,KAAK,CAAC,CAAC;IAEV,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,MAAM,cAAc,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,eAAe,CAAC,eAAe,EAAE,qBAAqB,EAAE;QACjE,QAAQ;QACR,KAAK;QACL,MAAM;QACN,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;KACzB,CAAC,CAAC;AACP,CAAC;AAED,SAAS,WAAW,CAAC,KAAuC;IACxD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC3C,UAAyB,EACzB,OAAkE;IAElE,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { z } from 'zod/v4';
3
+ import { propertyWitnessSchema } from "@overkill-dev/engine/engine/property-corpus.js";
4
+ const cachedEntrySchema = z.strictObject({ id: z.string(), savedAt: z.string(), entry: propertyWitnessSchema });
5
+ const cacheSchema = z.strictObject({ version: z.literal(1), entries: z.array(z.unknown()) });
6
+ function validatedEntries(candidates, file) {
7
+ const entries = [];
8
+ const diagnostics = [];
9
+ for (const candidate of candidates) {
10
+ const parsed = cachedEntrySchema.safeParse(candidate);
11
+ if (parsed.success) {
12
+ entries.push(parsed.data);
13
+ }
14
+ else {
15
+ diagnostics.push({ path: file, reason: parsed.error.message });
16
+ }
17
+ }
18
+ return { entries, diagnostics };
19
+ }
20
+ function decodedCache(content, file) {
21
+ return validatedEntries(cacheSchema.parse(JSON.parse(content)).entries, file);
22
+ }
23
+ export function parseCorpusCache(content, file) {
24
+ if (content === null) {
25
+ return { entries: [], diagnostics: [] };
26
+ }
27
+ try {
28
+ return decodedCache(content, file);
29
+ }
30
+ catch (error) {
31
+ return { entries: [], diagnostics: [{ path: file, reason: String(error) }] };
32
+ }
33
+ }
34
+ function entryIdentity(entry) {
35
+ return createHash('sha256')
36
+ .update(JSON.stringify([entry.case, entry.runtimes, entry.target, entry.counterexample]))
37
+ .digest('hex');
38
+ }
39
+ function refreshedCache(current, entries, context) {
40
+ const retained = new Map(current.entries.map(function pair(entry) {
41
+ return [entry.id, entry];
42
+ }));
43
+ const diagnostics = Array.from(current.diagnostics);
44
+ for (const candidate of entries) {
45
+ const entry = propertyWitnessSchema.parse(candidate);
46
+ if (Buffer.byteLength(JSON.stringify(entry)) > context.policy.localCache.maxEntryBytes) {
47
+ diagnostics.push({
48
+ path: context.file,
49
+ reason: 'Confirmed input exceeds the local corpus entry byte limit.'
50
+ });
51
+ }
52
+ else {
53
+ const id = entryIdentity(entry);
54
+ retained.set(id, { id, entry, savedAt: context.now });
55
+ }
56
+ }
57
+ return { entries: Array.from(retained.values()), diagnostics };
58
+ }
59
+ function encodeCache(entries) {
60
+ return JSON.stringify({ version: 1, entries });
61
+ }
62
+ export function boundedCorpusCache(current, entries, context) {
63
+ const refreshed = refreshedCache(current, entries, context);
64
+ const ordered = refreshed
65
+ .entries
66
+ .toSorted(function newest(left, right) {
67
+ const time = right.savedAt.localeCompare(left.savedAt);
68
+ return time === 0 ? left.id.localeCompare(right.id) : time;
69
+ })
70
+ .slice(0, context.policy.localCache.maxEntries);
71
+ while (ordered.length > 0 && Buffer.byteLength(encodeCache(ordered)) > context.policy.localCache.maxBytes) {
72
+ ordered.pop();
73
+ }
74
+ const content = encodeCache(ordered);
75
+ return Buffer.byteLength(content) <= context.policy.localCache.maxBytes
76
+ ? { content, diagnostics: refreshed.diagnostics }
77
+ : {
78
+ content: null,
79
+ diagnostics: [...refreshed.diagnostics, {
80
+ path: context.file,
81
+ reason: 'Local corpus byte limit is smaller than its empty envelope.'
82
+ }]
83
+ };
84
+ }
85
+ //# sourceMappingURL=property-corpus-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-corpus-cache.js","sourceRoot":"","sources":["../../../../source/run/property-corpus-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import path from 'node:path';
2
+ import { emptyPropertyCorpus } from "@overkill-dev/engine/engine/property-corpus.js";
3
+ import { runStatusFromSummary } from "@overkill-dev/engine/engine/run-result.js";
4
+ import { readPropertyCorpus, savePropertyCorpus } from "./property-corpus-storage.js";
5
+ export async function resolvedPropertyCorpus(run) {
6
+ const profile = run.config.profiles[run.request.profile];
7
+ if (profile?.testFamily !== 'property') {
8
+ return emptyPropertyCorpus;
9
+ }
10
+ return await readPropertyCorpus(run.facts.environment.projectRoot, path.resolve(run.facts.environment.projectRoot, run.config.runtimeStateDir), run.request.profile, profile.corpus);
11
+ }
12
+ function confirmedWitnesses(result) {
13
+ return result.perTest.flatMap(function caseWitnesses(testCase) {
14
+ return testCase.property?.invocations.flatMap(function confirmed(invocation) {
15
+ return invocation.confirmedWitness === null ? [] : [invocation.confirmedWitness];
16
+ }) ?? [];
17
+ });
18
+ }
19
+ async function writeConfirmedCorpus(run, result) {
20
+ const profile = run.config.profiles[run.request.profile];
21
+ if (profile?.testFamily !== 'property') {
22
+ return result;
23
+ }
24
+ const diagnostics = await savePropertyCorpus(path.resolve(run.facts.environment.projectRoot, run.config.runtimeStateDir), run.request.profile, profile.corpus, confirmedWitnesses(result));
25
+ if (diagnostics.length === 0) {
26
+ return result;
27
+ }
28
+ const perTest = result.perTest.map(function diagnosed(testCase) {
29
+ if (testCase.property === null) {
30
+ return testCase;
31
+ }
32
+ const property = {
33
+ invocations: testCase.property.invocations.map(function diagnosedInvocation(invocation) {
34
+ return {
35
+ ...invocation,
36
+ diagnostics: [
37
+ ...invocation.diagnostics,
38
+ ...diagnostics.map(function diagnostic(item) {
39
+ return { reason: item.reason, observation: null };
40
+ })
41
+ ]
42
+ };
43
+ })
44
+ };
45
+ return { ...testCase, property };
46
+ });
47
+ return { ...result, perTest };
48
+ }
49
+ export async function persistPropertyCorpus(run, result) {
50
+ const profile = run.config.profiles[run.request.profile];
51
+ if (profile?.testFamily !== 'property') {
52
+ return result;
53
+ }
54
+ try {
55
+ return await writeConfirmedCorpus(run, result);
56
+ }
57
+ catch (error) {
58
+ const runnerErrors = [...result.runnerErrors, {
59
+ attributedToAttempt: null,
60
+ attributedTo: null,
61
+ cause: error,
62
+ diagnostics: [],
63
+ message: 'Failed to write property corpus.',
64
+ subtype: 'runtime-state'
65
+ }];
66
+ return { ...result, runnerErrors, status: runStatusFromSummary(result.summary, runnerErrors) };
67
+ }
68
+ }
69
+ //# sourceMappingURL=property-corpus-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-corpus-execution.js","sourceRoot":"","sources":["../../../../source/run/property-corpus-execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir, readdir, stat } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import lockfile from 'proper-lockfile';
5
+ import { createNodeFileStore } from "../file-store.js";
6
+ import { propertyWitnessSchema } from "@overkill-dev/engine/engine/property-corpus.js";
7
+ import { parseCorpusCache, boundedCorpusCache } from "./property-corpus-cache.js";
8
+ function cachePath(directory, profile) {
9
+ const identity = createHash('sha256').update(profile).digest('hex');
10
+ return path.join(directory, 'corpus', identity, 'index.json');
11
+ }
12
+ async function entryPaths(target) {
13
+ const metadata = await stat(target);
14
+ if (!metadata.isDirectory()) {
15
+ return [target];
16
+ }
17
+ const entries = await readdir(target, { withFileTypes: true });
18
+ const paths = await Promise.all(entries.map(async function discover(entry) {
19
+ const child = path.join(target, entry.name);
20
+ if (entry.isDirectory()) {
21
+ return await entryPaths(child);
22
+ }
23
+ return entry.isFile() && entry.name.endsWith('.json') ? [child] : [];
24
+ }));
25
+ return paths.flat();
26
+ }
27
+ function parsedWitness(content) {
28
+ return propertyWitnessSchema.parse(JSON.parse(content ?? 'null'));
29
+ }
30
+ async function readCheckedInEntry(file) {
31
+ try {
32
+ return parsedWitness(await createNodeFileStore().read(file));
33
+ }
34
+ catch (error) {
35
+ throw new Error(`Cannot read checked-in corpus entry ${file}.`, { cause: error });
36
+ }
37
+ }
38
+ async function readCache(file) {
39
+ try {
40
+ return parseCorpusCache(await createNodeFileStore().read(file), file);
41
+ }
42
+ catch (error) {
43
+ return { entries: [], diagnostics: [{ path: file, reason: String(error) }] };
44
+ }
45
+ }
46
+ export async function readPropertyCorpus(projectRoot, directory, profile, policy) {
47
+ const files = await Promise.all(policy.checkedIn.map(async function discover(target) {
48
+ return await entryPaths(path.resolve(projectRoot, target));
49
+ }));
50
+ const paths = Array.from(new Set(files.flat())).toSorted(function alphabetic(left, right) {
51
+ return left.localeCompare(right);
52
+ });
53
+ const checkedIn = await Promise.all(paths.map(readCheckedInEntry));
54
+ const cache = await readCache(cachePath(directory, profile));
55
+ return {
56
+ checkedIn,
57
+ localCache: cache.entries.map(function input(entry) {
58
+ return entry.entry;
59
+ }),
60
+ diagnostics: cache.diagnostics
61
+ };
62
+ }
63
+ async function commitCache(file, policy, entries) {
64
+ const now = new Date();
65
+ const next = boundedCorpusCache(await readCache(file), entries, { file, policy, now: now.toISOString() });
66
+ if (next.content !== null) {
67
+ await createNodeFileStore().write(file, next.content);
68
+ }
69
+ return next.diagnostics;
70
+ }
71
+ export async function savePropertyCorpus(directory, profile, policy, entries) {
72
+ if (entries.length === 0) {
73
+ return [];
74
+ }
75
+ const file = cachePath(directory, profile);
76
+ const parent = path.dirname(file);
77
+ await mkdir(parent, { recursive: true });
78
+ const release = await lockfile.lock(parent, { retries: { retries: 50, minTimeout: 25, maxTimeout: 100 } });
79
+ try {
80
+ return await commitCache(file, policy, entries);
81
+ }
82
+ finally {
83
+ await release();
84
+ }
85
+ }
86
+ //# sourceMappingURL=property-corpus-storage.js.map