ppef 1.0.0 → 1.1.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 (336) hide show
  1. package/README.md +172 -0
  2. package/bin/ppef.mjs +20 -0
  3. package/dist/__tests__/framework-pipeline.integration.test.d.ts +7 -0
  4. package/dist/__tests__/framework-pipeline.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/framework-pipeline.integration.test.js +415 -0
  6. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -0
  7. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  8. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/index-exports.unit.test.js +127 -0
  10. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  11. package/dist/__tests__/registry-executor.integration.test.d.ts +5 -0
  12. package/dist/__tests__/registry-executor.integration.test.d.ts.map +1 -0
  13. package/dist/__tests__/registry-executor.integration.test.js +352 -0
  14. package/dist/__tests__/registry-executor.integration.test.js.map +1 -0
  15. package/dist/__tests__/test-helpers.d.ts +94 -0
  16. package/dist/__tests__/test-helpers.d.ts.map +1 -0
  17. package/dist/__tests__/test-helpers.js +271 -0
  18. package/dist/__tests__/test-helpers.js.map +1 -0
  19. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  20. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  21. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  22. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  23. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  24. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  25. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  26. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  27. package/dist/aggregation/aggregators.d.ts +63 -0
  28. package/dist/aggregation/aggregators.d.ts.map +1 -0
  29. package/dist/aggregation/aggregators.js +228 -0
  30. package/dist/aggregation/aggregators.js.map +1 -0
  31. package/dist/aggregation/index.d.ts +8 -0
  32. package/dist/aggregation/index.d.ts.map +1 -0
  33. package/dist/aggregation/index.js +8 -0
  34. package/dist/aggregation/index.js.map +1 -0
  35. package/dist/aggregation/pipeline.d.ts +38 -0
  36. package/dist/aggregation/pipeline.d.ts.map +1 -0
  37. package/dist/aggregation/pipeline.js +198 -0
  38. package/dist/aggregation/pipeline.js.map +1 -0
  39. package/dist/claims/__tests__/evaluator.unit.test.d.ts +12 -0
  40. package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +1 -0
  41. package/dist/claims/__tests__/evaluator.unit.test.js +801 -0
  42. package/dist/claims/__tests__/evaluator.unit.test.js.map +1 -0
  43. package/dist/claims/evaluator.d.ts +33 -0
  44. package/dist/claims/evaluator.d.ts.map +1 -0
  45. package/dist/claims/evaluator.js +174 -0
  46. package/dist/claims/evaluator.js.map +1 -0
  47. package/dist/claims/index.d.ts +7 -0
  48. package/dist/claims/index.d.ts.map +1 -0
  49. package/dist/claims/index.js +7 -0
  50. package/dist/claims/index.js.map +1 -0
  51. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  52. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  53. package/dist/cli/__tests__/aggregate.command.unit.test.js +396 -0
  54. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  55. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  56. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  57. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  58. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  59. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  60. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  61. package/dist/cli/__tests__/index.unit.test.js +65 -0
  62. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  63. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  64. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  65. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  66. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  67. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  68. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  69. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  70. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  71. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  72. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  73. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  74. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  75. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  76. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  77. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  78. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  79. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  80. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  81. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  82. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  83. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  84. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  85. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  86. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  87. package/dist/cli/command-deps.d.ts +125 -0
  88. package/dist/cli/command-deps.d.ts.map +1 -0
  89. package/dist/cli/command-deps.js +7 -0
  90. package/dist/cli/command-deps.js.map +1 -0
  91. package/dist/cli/commands/aggregate.d.ts +35 -0
  92. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  93. package/dist/cli/commands/aggregate.js +121 -0
  94. package/dist/cli/commands/aggregate.js.map +1 -0
  95. package/dist/cli/commands/plan.d.ts +36 -0
  96. package/dist/cli/commands/plan.d.ts.map +1 -0
  97. package/dist/cli/commands/plan.js +109 -0
  98. package/dist/cli/commands/plan.js.map +1 -0
  99. package/dist/cli/commands/run.d.ts +33 -0
  100. package/dist/cli/commands/run.d.ts.map +1 -0
  101. package/dist/cli/commands/run.js +185 -0
  102. package/dist/cli/commands/run.js.map +1 -0
  103. package/dist/cli/commands/validate.d.ts +27 -0
  104. package/dist/cli/commands/validate.d.ts.map +1 -0
  105. package/dist/cli/commands/validate.js +88 -0
  106. package/dist/cli/commands/validate.js.map +1 -0
  107. package/dist/cli/config-loader.d.ts +30 -0
  108. package/dist/cli/config-loader.d.ts.map +1 -0
  109. package/dist/cli/config-loader.js +181 -0
  110. package/dist/cli/config-loader.js.map +1 -0
  111. package/dist/cli/index.d.ts +26 -0
  112. package/dist/cli/index.d.ts.map +1 -0
  113. package/dist/cli/index.js +58 -0
  114. package/dist/cli/index.js.map +1 -0
  115. package/dist/cli/logger.d.ts +75 -0
  116. package/dist/cli/logger.d.ts.map +1 -0
  117. package/dist/cli/logger.js +131 -0
  118. package/dist/cli/logger.js.map +1 -0
  119. package/dist/cli/module-loader.d.ts +46 -0
  120. package/dist/cli/module-loader.d.ts.map +1 -0
  121. package/dist/cli/module-loader.js +116 -0
  122. package/dist/cli/module-loader.js.map +1 -0
  123. package/dist/cli/output-writer.d.ts +51 -0
  124. package/dist/cli/output-writer.d.ts.map +1 -0
  125. package/dist/cli/output-writer.js +65 -0
  126. package/dist/cli/output-writer.js.map +1 -0
  127. package/dist/cli/types.d.ts +174 -0
  128. package/dist/cli/types.d.ts.map +1 -0
  129. package/dist/cli/types.js +7 -0
  130. package/dist/cli/types.js.map +1 -0
  131. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  132. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  133. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  134. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  135. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  136. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  137. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  138. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  139. package/dist/collector/index.d.ts +8 -0
  140. package/dist/collector/index.d.ts.map +1 -0
  141. package/dist/collector/index.js +8 -0
  142. package/dist/collector/index.js.map +1 -0
  143. package/dist/collector/result-collector.d.ts +159 -0
  144. package/dist/collector/result-collector.d.ts.map +1 -0
  145. package/dist/collector/result-collector.js +213 -0
  146. package/dist/collector/result-collector.js.map +1 -0
  147. package/dist/collector/schema.d.ts +34 -0
  148. package/dist/collector/schema.d.ts.map +1 -0
  149. package/dist/collector/schema.js +145 -0
  150. package/dist/collector/schema.js.map +1 -0
  151. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts +10 -0
  152. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts.map +1 -0
  153. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js +122 -0
  154. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js.map +1 -0
  155. package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts +7 -0
  156. package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts.map +1 -0
  157. package/dist/executor/__tests__/checkpoint-manager.integration.test.js +330 -0
  158. package/dist/executor/__tests__/checkpoint-manager.integration.test.js.map +1 -0
  159. package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts +7 -0
  160. package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts.map +1 -0
  161. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +531 -0
  162. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -0
  163. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +8 -0
  164. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -0
  165. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +493 -0
  166. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -0
  167. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts +8 -0
  168. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts.map +1 -0
  169. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js +164 -0
  170. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js.map +1 -0
  171. package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts +7 -0
  172. package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts.map +1 -0
  173. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +490 -0
  174. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -0
  175. package/dist/executor/__tests__/executor.unit.test.d.ts +7 -0
  176. package/dist/executor/__tests__/executor.unit.test.d.ts.map +1 -0
  177. package/dist/executor/__tests__/executor.unit.test.js +202 -0
  178. package/dist/executor/__tests__/executor.unit.test.js.map +1 -0
  179. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  180. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  181. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  182. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  183. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts +12 -0
  184. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts.map +1 -0
  185. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js +196 -0
  186. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js.map +1 -0
  187. package/dist/executor/__tests__/parallel-executor.integration.test.d.ts +7 -0
  188. package/dist/executor/__tests__/parallel-executor.integration.test.d.ts.map +1 -0
  189. package/dist/executor/__tests__/parallel-executor.integration.test.js +249 -0
  190. package/dist/executor/__tests__/parallel-executor.integration.test.js.map +1 -0
  191. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +8 -0
  192. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -0
  193. package/dist/executor/__tests__/parallel-executor.unit.test.js +473 -0
  194. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -0
  195. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  196. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  197. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  198. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  199. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  200. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  201. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  202. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  203. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  204. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  205. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  206. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  207. package/dist/executor/checkpoint-manager.d.ts +231 -0
  208. package/dist/executor/checkpoint-manager.d.ts.map +1 -0
  209. package/dist/executor/checkpoint-manager.js +395 -0
  210. package/dist/executor/checkpoint-manager.js.map +1 -0
  211. package/dist/executor/checkpoint-storage.d.ts +230 -0
  212. package/dist/executor/checkpoint-storage.d.ts.map +1 -0
  213. package/dist/executor/checkpoint-storage.js +370 -0
  214. package/dist/executor/checkpoint-storage.js.map +1 -0
  215. package/dist/executor/checkpoint-types.d.ts +48 -0
  216. package/dist/executor/checkpoint-types.d.ts.map +1 -0
  217. package/dist/executor/checkpoint-types.js +8 -0
  218. package/dist/executor/checkpoint-types.js.map +1 -0
  219. package/dist/executor/executor.d.ts +164 -0
  220. package/dist/executor/executor.d.ts.map +1 -0
  221. package/dist/executor/executor.js +408 -0
  222. package/dist/executor/executor.js.map +1 -0
  223. package/dist/executor/index.d.ts +11 -0
  224. package/dist/executor/index.d.ts.map +1 -0
  225. package/dist/executor/index.js +11 -0
  226. package/dist/executor/index.js.map +1 -0
  227. package/dist/executor/memory-monitor.d.ts +115 -0
  228. package/dist/executor/memory-monitor.d.ts.map +1 -0
  229. package/dist/executor/memory-monitor.js +168 -0
  230. package/dist/executor/memory-monitor.js.map +1 -0
  231. package/dist/executor/parallel-executor.d.ts +239 -0
  232. package/dist/executor/parallel-executor.d.ts.map +1 -0
  233. package/dist/executor/parallel-executor.js +329 -0
  234. package/dist/executor/parallel-executor.js.map +1 -0
  235. package/dist/executor/run-id.d.ts +71 -0
  236. package/dist/executor/run-id.d.ts.map +1 -0
  237. package/dist/executor/run-id.js +74 -0
  238. package/dist/executor/run-id.js.map +1 -0
  239. package/dist/executor/worker-entry.d.ts +10 -0
  240. package/dist/executor/worker-entry.d.ts.map +1 -0
  241. package/dist/executor/worker-entry.js +42 -0
  242. package/dist/executor/worker-entry.js.map +1 -0
  243. package/dist/executor/worker-executor.d.ts +156 -0
  244. package/dist/executor/worker-executor.d.ts.map +1 -0
  245. package/dist/executor/worker-executor.js +88 -0
  246. package/dist/executor/worker-executor.js.map +1 -0
  247. package/dist/index.cjs +11 -0
  248. package/dist/index.d.ts +15 -0
  249. package/dist/index.d.ts.map +1 -0
  250. package/dist/index.js +24 -0
  251. package/dist/index.js.map +1 -0
  252. package/dist/registry/case-registry.d.ts +113 -0
  253. package/dist/registry/case-registry.d.ts.map +1 -0
  254. package/dist/registry/case-registry.js +160 -0
  255. package/dist/registry/case-registry.js.map +1 -0
  256. package/dist/registry/index.d.ts +8 -0
  257. package/dist/registry/index.d.ts.map +1 -0
  258. package/dist/registry/index.js +8 -0
  259. package/dist/registry/index.js.map +1 -0
  260. package/dist/registry/sut-registry.d.ts +96 -0
  261. package/dist/registry/sut-registry.d.ts.map +1 -0
  262. package/dist/registry/sut-registry.js +126 -0
  263. package/dist/registry/sut-registry.js.map +1 -0
  264. package/dist/renderers/index.d.ts +10 -0
  265. package/dist/renderers/index.d.ts.map +1 -0
  266. package/dist/renderers/index.js +9 -0
  267. package/dist/renderers/index.js.map +1 -0
  268. package/dist/renderers/latex-renderer.d.ts +84 -0
  269. package/dist/renderers/latex-renderer.d.ts.map +1 -0
  270. package/dist/renderers/latex-renderer.js +208 -0
  271. package/dist/renderers/latex-renderer.js.map +1 -0
  272. package/dist/renderers/types.d.ts +106 -0
  273. package/dist/renderers/types.d.ts.map +1 -0
  274. package/dist/renderers/types.js +23 -0
  275. package/dist/renderers/types.js.map +1 -0
  276. package/dist/robustness/__tests__/analyzer.unit.test.d.ts +11 -0
  277. package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +1 -0
  278. package/dist/robustness/__tests__/analyzer.unit.test.js +455 -0
  279. package/dist/robustness/__tests__/analyzer.unit.test.js.map +1 -0
  280. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  281. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  282. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  283. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  284. package/dist/robustness/analyzer.d.ts +61 -0
  285. package/dist/robustness/analyzer.d.ts.map +1 -0
  286. package/dist/robustness/analyzer.js +191 -0
  287. package/dist/robustness/analyzer.js.map +1 -0
  288. package/dist/robustness/index.d.ts +8 -0
  289. package/dist/robustness/index.d.ts.map +1 -0
  290. package/dist/robustness/index.js +8 -0
  291. package/dist/robustness/index.js.map +1 -0
  292. package/dist/robustness/perturbations.d.ts +46 -0
  293. package/dist/robustness/perturbations.d.ts.map +1 -0
  294. package/dist/robustness/perturbations.js +184 -0
  295. package/dist/robustness/perturbations.js.map +1 -0
  296. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  297. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  298. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  299. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  300. package/dist/statistical/index.d.ts +8 -0
  301. package/dist/statistical/index.d.ts.map +1 -0
  302. package/dist/statistical/index.js +8 -0
  303. package/dist/statistical/index.js.map +1 -0
  304. package/dist/statistical/mann-whitney-u.d.ts +62 -0
  305. package/dist/statistical/mann-whitney-u.d.ts.map +1 -0
  306. package/dist/statistical/mann-whitney-u.js +127 -0
  307. package/dist/statistical/mann-whitney-u.js.map +1 -0
  308. package/dist/types/aggregate.d.ts +124 -0
  309. package/dist/types/aggregate.d.ts.map +1 -0
  310. package/dist/types/aggregate.js +9 -0
  311. package/dist/types/aggregate.js.map +1 -0
  312. package/dist/types/case.d.ts +105 -0
  313. package/dist/types/case.d.ts.map +1 -0
  314. package/dist/types/case.js +10 -0
  315. package/dist/types/case.js.map +1 -0
  316. package/dist/types/claims.d.ts +122 -0
  317. package/dist/types/claims.d.ts.map +1 -0
  318. package/dist/types/claims.js +14 -0
  319. package/dist/types/claims.js.map +1 -0
  320. package/dist/types/index.d.ts +12 -0
  321. package/dist/types/index.d.ts.map +1 -0
  322. package/dist/types/index.js +7 -0
  323. package/dist/types/index.js.map +1 -0
  324. package/dist/types/perturbation.d.ts +105 -0
  325. package/dist/types/perturbation.d.ts.map +1 -0
  326. package/dist/types/perturbation.js +9 -0
  327. package/dist/types/perturbation.js.map +1 -0
  328. package/dist/types/result.d.ts +150 -0
  329. package/dist/types/result.d.ts.map +1 -0
  330. package/dist/types/result.js +12 -0
  331. package/dist/types/result.js.map +1 -0
  332. package/dist/types/sut.d.ts +128 -0
  333. package/dist/types/sut.d.ts.map +1 -0
  334. package/dist/types/sut.js +12 -0
  335. package/dist/types/sut.js.map +1 -0
  336. package/package.json +290 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-entry.unit.test.js","sourceRoot":"","sources":["../../../src/executor/__tests__/worker-entry.unit.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAUN,cAAc,GACd,MAAM,uBAAuB,CAAC;AAE/B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,IAAI,cAA2B,CAAC;IAChC,IAAI,gBAA+B,CAAC;IACpC,IAAI,oBAEH,CAAC;IACF,IAAI,cAAyB,CAAC;IAC9B,IAAI,WAAmE,CAAC;IAExE,UAAU,CAAC,GAAG,EAAE;QACf,cAAc,GAAG,EAAE,CAAC;QACpB,WAAW,GAAG,EAAE,CAAC;QAEjB,kBAAkB;QAClB,cAAc,GAAG;YAChB,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,QAAiC,EAAE,EAAE;gBAChE,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvC,CAAC,CAAC;YACF,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,OAAgB,EAAE,EAAE;gBACzC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC,CAAC;SACF,CAAC;QAEF,yBAAyB;QACzB,oBAAoB,GAAG;YACtB,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC7B,OAAO,EAAE;oBACR;wBACC,GAAG,EAAE;4BACJ,KAAK,EAAE,QAAQ;4BACf,GAAG,EAAE,OAAO;4BACZ,OAAO,EAAE,SAAkB;4BAC3B,MAAM,EAAE,QAAQ;4BAChB,UAAU,EAAE,CAAC;4BACb,IAAI,EAAE,EAAE;yBACR;wBACD,WAAW,EAAE;4BACZ,cAAc,EAAE,IAAI;4BACpB,cAAc,EAAE,IAAI;4BACpB,KAAK,EAAE,IAAI;4BACX,eAAe,EAAE,IAAI;yBACrB;wBACD,OAAO,EAAE,EAAE;wBACX,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;wBACxB,UAAU,EAAE;4BACX,OAAO,EAAE;gCACR,QAAQ,EAAE,MAAM;gCAChB,IAAI,EAAE,MAAM;gCACZ,WAAW,EAAE,MAAM;6BACnB;yBACD;qBACD;iBACqB;gBACvB,MAAM,EAAE,EAAE;aACV,CAAC,CAAC;SACH,CAAC;QAEF,4BAA4B;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,oBAAoB,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,gBAAgB,GAAG;YAClB,YAAY,EAAE,KAAK,IAA8B,EAAE;gBAClD,OAAO;oBACN,QAAQ,EAAE,YAA8D;iBACrD,CAAC;YACtB,CAAC;YACD,YAAY,EAAE,KAAK,IAA8B,EAAE;gBAClD,OAAO;oBACN,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC7B,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;iBACX,CAAC;YACtB,CAAC;YACD,YAAY,EAAE,KAAK,IAA8B,EAAE;gBAClD,OAAO;oBACN,yBAAyB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;iBACxB,CAAC;YACtB,CAAC;YACD,QAAQ,EAAE,KAAK,IAA0B,EAAE;gBAC1C,OAAO;oBACN,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;iBACZ,CAAC;YAClB,CAAC;YACD,YAAY,EAAE,KAAK,IAA8B,EAAE;gBAClD,OAAO;oBACN,yBAAyB,EAAE,KAAK,IAAI,EAAE;wBACrC,OAAO;oBACR,CAAC;iBACkB,CAAC;YACtB,CAAC;SACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,QAAQ,CAAC,KAAK,EAAE,CAAC;YAEjB,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACpD,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,8CAA8C;YAC9C,MAAM,cAAc,GAAG,gBAAgB,CAAC;YACxC,gBAAgB,GAAG;gBAClB,YAAY,EAAE,KAAK,IAAI,EAAE;oBACxB,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC/B,OAAO,cAAc,CAAC,YAAY,EAAE,CAAC;gBACtC,CAAC;gBACD,YAAY,EAAE,KAAK,IAAI,EAAE;oBACxB,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC/B,OAAO,cAAc,CAAC,YAAY,EAAE,CAAC;gBACtC,CAAC;gBACD,YAAY,EAAE,KAAK,IAAI,EAAE;oBACxB,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC/B,OAAO,cAAc,CAAC,YAAY,EAAE,CAAC;gBACtC,CAAC;gBACD,QAAQ,EAAE,KAAK,IAAI,EAAE;oBACpB,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAC3B,OAAO,cAAc,CAAC,QAAQ,EAAE,CAAC;gBAClC,CAAC;gBACD,YAAY,EAAE,KAAK,IAAI,EAAE;oBACxB,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC/B,OAAO,cAAc,CAAC,YAAY,EAAE,CAAC;gBACtC,CAAC;aACD,CAAC;YAEF,MAAM,OAAO,GAAkB;gBAC9B,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBACxF,MAAM,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACxB;aACD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,8DAA8D;YAC9D,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,OAAO,GAAkB;gBAC9B,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBACxF,MAAM,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACxB;aACD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAkD,CAAC;YAClF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACvD,mCAAmC;YACnC,gBAAgB,CAAC,YAAY,GAAG,KAAK,IAA8B,EAAE;gBACpE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACrC,CAAC,CAAC;YAEF,MAAM,OAAO,GAAkB;gBAC9B,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBACxF,MAAM,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACxB;aACD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAoC,CAAC;YACpE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC5D,gBAAgB,CAAC,YAAY,GAAG,KAAK,IAA8B,EAAE;gBACpE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YACjC,CAAC,CAAC;YAEF,MAAM,OAAO,GAAkB;gBAC9B,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBACxF,MAAM,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACxB;aACD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAoC,CAAC;YACpE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,UAAyB,OAAgB;gBACrE,oBAAoB,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;oBACnD,OAAO,EAAE,EAAE;oBACX,MAAM,EAAE,EAAE;iBACV,CAAC,CAAC,CAAC;gBACJ,OAAO,oBAAoB,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,gBAAgB,CAAC,YAAY,GAAG,KAAK,IAA8B,EAAE;gBACpE,OAAO;oBACN,QAAQ,EAAE,YAA8D;iBACrD,CAAC;YACtB,CAAC,CAAC;YAEF,MAAM,OAAO,GAAkB;gBAC9B,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBACxF,MAAM,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,GAAG;oBACb,eAAe,EAAE,KAAK;oBACtB,SAAS,EAAE,KAAK;oBAChB,iBAAiB,EAAE,IAAI;iBACvB;aACD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,sDAAsD;YACtD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAM5D,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,OAAO,GAAkB;gBAC9B,IAAI,EAAE;oBACL,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;oBAChF,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;oBAChF,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;iBAChF;gBACD,MAAM,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,GAAG;oBACb,eAAe,EAAE,IAAI;oBACrB,SAAS,EAAE,KAAK;oBAChB,iBAAiB,EAAE,KAAK;iBACxB;aACD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAkD,CAAC;YAClF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACtC,OAAO;YACR,CAAC,CAAC,CAAC;YACH,gBAAgB,CAAC,YAAY,GAAG,KAAK,IAA8B,EAAE;gBACpE,OAAO;oBACN,yBAAyB,EAAE,WAAW;iBACnB,CAAC;YACtB,CAAC,CAAC;YAEF,MAAM,OAAO,GAAkB;gBAC9B,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBACxF,MAAM,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACxB;aACD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAErC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,gBAAgB,CAAC,QAAQ,GAAG,KAAK,IAA0B,EAAE;gBAC5D,OAAO;oBACN,eAAe,EAAE,WAAW;iBACb,CAAC;YAClB,CAAC,CAAC;YAEF,MAAM,OAAO,GAAkB;gBAC9B,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBACxF,MAAM,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACxB;aACD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAErC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,gBAAgB,CAAC,YAAY,GAAG,KAAK,IAA8B,EAAE;gBACpE,OAAO;oBACN,yBAAyB,EAAE,WAAW;iBACnB,CAAC;YACtB,CAAC,CAAC;YAEF,MAAM,OAAO,GAAkB;gBAC9B,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBACxF,MAAM,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACxB;aACD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAErC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC3E,IAAI,mBAA6C,CAAC;YAClD,gBAAgB,CAAC,YAAY,GAAG,KAAK,IAA8B,EAAE;gBACpE,OAAO;oBACN,iBAAiB,EAAE,CAAC,QAAsB,EAAE,EAAE;wBAC7C,mBAAmB,GAAG,QAAQ,CAAC;wBAC/B,OAAO,EAAE,CAAC;oBACX,CAAC;oBACD,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;iBACX,CAAC;YACtB,CAAC,CAAC;YAEF,MAAM,OAAO,GAAkB;gBAC9B,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBACxF,MAAM,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACxB;aACD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAErC,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;YAC/B,MAAM,CAAC,WAAW,CAAC,OAAO,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CAAC,OAAO,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Checkpoint Manager for Experiment Execution
3
+ *
4
+ * Enables resumable experiment execution by:
5
+ * 1. Writing incremental checkpoints after each completed run
6
+ * 2. Detecting configuration changes to invalidate stale checkpoints
7
+ * 3. Skipping completed runs when resuming
8
+ * 4. Supporting sharded checkpoints for parallel workers
9
+ *
10
+ * Supports pluggable storage backends:
11
+ * - FileStorage: JSON files (fast, local)
12
+ * - GitStorage: Git notes (version controlled, shareable)
13
+ *
14
+ * Dependency Injection:
15
+ * - Storage backend can be injected for testing
16
+ * - Lock implementation can be injected for custom concurrency control
17
+ *
18
+ * Usage:
19
+ * ```typescript
20
+ * // Direct instantiation with injected storage
21
+ * const storage = new FileStorage("results/execute/checkpoint.json");
22
+ * const lock = new InMemoryLock();
23
+ * const checkpoint = new CheckpointManager({ storage, lock });
24
+ *
25
+ * // Sharded mode for parallel workers
26
+ * const shardStorage = new FileStorage("results/execute/checkpoint-worker-0.json");
27
+ * const checkpoint = new CheckpointManager({
28
+ * storage: shardStorage,
29
+ * lock,
30
+ * workerIndex: 0,
31
+ * totalWorkers: 4,
32
+ * basePath: "results/execute"
33
+ * });
34
+ *
35
+ * await checkpoint.load();
36
+ *
37
+ * if (checkpoint.isStale(suts, cases, config)) {
38
+ * checkpoint.invalidate();
39
+ * }
40
+ *
41
+ * const remainingRuns = plannedRuns.filter(
42
+ * run => !checkpoint.isCompleted(run.runId)
43
+ * );
44
+ *
45
+ * executor.execute({...}, {
46
+ * onResult: (result) => checkpoint.saveIncremental(result)
47
+ * });
48
+ *
49
+ * // After all workers complete, merge shards
50
+ * await checkpoint.mergeShards([
51
+ * "results/execute/checkpoint-worker-0.json",
52
+ * "results/execute/checkpoint-worker-1.json",
53
+ * ...
54
+ * ]);
55
+ * ```
56
+ */
57
+ import type { CaseDefinition } from "../types/case.js";
58
+ import type { EvaluationResult } from "../types/result.js";
59
+ import type { SutDefinition } from "../types/sut.js";
60
+ import type { CheckpointStorage, Lock } from "./checkpoint-storage.js";
61
+ import type { ExecutorConfig, PlannedRun } from "./executor.js";
62
+ export type { CheckpointMode } from "./checkpoint-storage.js";
63
+ export type { Lock } from "./checkpoint-storage.js";
64
+ export { InMemoryLock } from "./checkpoint-storage.js";
65
+ /**
66
+ * Checkpoint file format.
67
+ */
68
+ export interface CheckpointData {
69
+ /** Hash of the execution configuration (SUTs, cases, config) */
70
+ configHash: string;
71
+ /** Timestamp when checkpoint was created */
72
+ createdAt: string;
73
+ /** Timestamp of last update */
74
+ updatedAt: string;
75
+ /** IDs of completed runs (for quick lookup) */
76
+ completedRunIds: string[];
77
+ /** Stored results by run ID */
78
+ results: Record<string, EvaluationResult>;
79
+ /** Total number of planned runs */
80
+ totalPlanned: number;
81
+ /** Git commit at checkpoint time (for reproducibility) */
82
+ gitCommit?: string;
83
+ /** Worker index (for sharded checkpoints) */
84
+ workerIndex?: number;
85
+ /** Total workers (for sharded checkpoints) */
86
+ totalWorkers?: number;
87
+ }
88
+ /**
89
+ * Checkpoint manager constructor options.
90
+ */
91
+ export interface CheckpointManagerOptions {
92
+ /** Storage backend for checkpoint data */
93
+ storage: CheckpointStorage;
94
+ /** Concurrency lock for checkpoint saves */
95
+ lock?: Lock;
96
+ /** Worker identity for sharded mode */
97
+ workerIndex?: number;
98
+ /** Total number of workers in sharded mode */
99
+ totalWorkers?: number;
100
+ /** Base checkpoint path (for sharding) */
101
+ basePath?: string;
102
+ }
103
+ /**
104
+ * Checkpoint manager for resumable execution.
105
+ *
106
+ * Uses dependency injection for storage and lock.
107
+ * Enables sharded checkpoints for parallel worker execution.
108
+ */
109
+ export declare class CheckpointManager {
110
+ private readonly storage;
111
+ private readonly lock;
112
+ private readonly workerIndex?;
113
+ private readonly totalWorkers?;
114
+ private readonly basePath?;
115
+ private data;
116
+ private dirty;
117
+ /**
118
+ * Create a new CheckpointManager.
119
+ *
120
+ * @param options - CheckpointManagerOptions with injected storage
121
+ */
122
+ constructor(options: CheckpointManagerOptions);
123
+ /**
124
+ * Get the storage backend being used.
125
+ */
126
+ getStorageType(): string;
127
+ /**
128
+ * Load checkpoint from storage if it exists.
129
+ * @returns true if checkpoint was loaded, false if not found or invalid
130
+ */
131
+ load(): Promise<boolean>;
132
+ /**
133
+ * Save checkpoint to storage.
134
+ */
135
+ save(): Promise<void>;
136
+ /**
137
+ * Save checkpoint incrementally (after each result).
138
+ * Uses the injected lock to prevent concurrent writes.
139
+ * @param result
140
+ */
141
+ saveIncremental(result: EvaluationResult): Promise<void>;
142
+ /**
143
+ * Check if checkpoint exists and is valid.
144
+ */
145
+ exists(): boolean;
146
+ /**
147
+ * Check if a specific run has been completed.
148
+ * @param runId - Run identifier
149
+ */
150
+ isCompleted(runId: string): boolean;
151
+ /**
152
+ * Get all completed results.
153
+ */
154
+ getResults(): EvaluationResult[];
155
+ /**
156
+ * Get progress information.
157
+ */
158
+ getProgress(): {
159
+ completed: number;
160
+ total: number;
161
+ percent: number;
162
+ };
163
+ /**
164
+ * Check if checkpoint is stale (configuration has changed).
165
+ * @param suts - Current SUT definitions
166
+ * @param cases - Current case definitions
167
+ * @param config - Current executor config
168
+ * @param totalRuns - Total planned runs
169
+ */
170
+ isStale<TExpander, TResult>(suts: SutDefinition<TExpander, TResult>[], cases: CaseDefinition<TExpander>[], config: Partial<ExecutorConfig>, totalRuns: number): boolean;
171
+ /**
172
+ * Invalidate checkpoint (delete and start fresh).
173
+ */
174
+ invalidate(): void;
175
+ /**
176
+ * Initialize empty checkpoint data.
177
+ * @param suts
178
+ * @param cases
179
+ * @param config
180
+ * @param totalRuns
181
+ * @param gitCommit
182
+ */
183
+ initializeEmpty<TExpander, TResult>(suts?: SutDefinition<TExpander, TResult>[], cases?: CaseDefinition<TExpander>[], config?: Partial<ExecutorConfig>, totalRuns?: number, gitCommit?: string): void;
184
+ /**
185
+ * Compute hash of execution configuration.
186
+ * Used to detect when configuration changes invalidate checkpoint.
187
+ * @param suts
188
+ * @param cases
189
+ * @param config
190
+ * @param totalRuns
191
+ */
192
+ private computeConfigHash;
193
+ /**
194
+ * Get remaining planned runs (excluding completed).
195
+ * @param plannedRuns - All planned runs
196
+ */
197
+ filterRemaining<T extends PlannedRun>(plannedRuns: T[]): T[];
198
+ /**
199
+ * Merge new results into checkpoint (for batch updates).
200
+ * @param results - New results to add
201
+ */
202
+ mergeResults(results: EvaluationResult[]): void;
203
+ /**
204
+ * Merge multiple worker checkpoint shards into a single aggregated checkpoint.
205
+ *
206
+ * This is called after all parallel workers complete to aggregate their results.
207
+ * Each worker writes to its own shard file to avoid race conditions.
208
+ *
209
+ * @param shardPaths - Array of checkpoint shard file paths
210
+ * @returns The merged checkpoint data
211
+ */
212
+ mergeShards(shardPaths: string[]): Promise<CheckpointData>;
213
+ /**
214
+ * Get checkpoint summary for logging.
215
+ */
216
+ getSummary(): string;
217
+ }
218
+ /**
219
+ * Get git commit hash for reproducibility.
220
+ */
221
+ export declare const getGitCommit: () => Promise<string | undefined>;
222
+ /**
223
+ * Create a checkpoint manager with default file storage.
224
+ *
225
+ * Convenience factory for simple cases.
226
+ *
227
+ * @param path - Checkpoint file path
228
+ * @param lock - Optional lock implementation
229
+ */
230
+ export declare const createFileCheckpointManager: (path?: string, lock?: Lock) => CheckpointManager;
231
+ //# sourceMappingURL=checkpoint-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-manager.d.ts","sourceRoot":"","sources":["../../src/executor/checkpoint-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,395 @@
1
+ /**
2
+ * Checkpoint Manager for Experiment Execution
3
+ *
4
+ * Enables resumable experiment execution by:
5
+ * 1. Writing incremental checkpoints after each completed run
6
+ * 2. Detecting configuration changes to invalidate stale checkpoints
7
+ * 3. Skipping completed runs when resuming
8
+ * 4. Supporting sharded checkpoints for parallel workers
9
+ *
10
+ * Supports pluggable storage backends:
11
+ * - FileStorage: JSON files (fast, local)
12
+ * - GitStorage: Git notes (version controlled, shareable)
13
+ *
14
+ * Dependency Injection:
15
+ * - Storage backend can be injected for testing
16
+ * - Lock implementation can be injected for custom concurrency control
17
+ *
18
+ * Usage:
19
+ * ```typescript
20
+ * // Direct instantiation with injected storage
21
+ * const storage = new FileStorage("results/execute/checkpoint.json");
22
+ * const lock = new InMemoryLock();
23
+ * const checkpoint = new CheckpointManager({ storage, lock });
24
+ *
25
+ * // Sharded mode for parallel workers
26
+ * const shardStorage = new FileStorage("results/execute/checkpoint-worker-0.json");
27
+ * const checkpoint = new CheckpointManager({
28
+ * storage: shardStorage,
29
+ * lock,
30
+ * workerIndex: 0,
31
+ * totalWorkers: 4,
32
+ * basePath: "results/execute"
33
+ * });
34
+ *
35
+ * await checkpoint.load();
36
+ *
37
+ * if (checkpoint.isStale(suts, cases, config)) {
38
+ * checkpoint.invalidate();
39
+ * }
40
+ *
41
+ * const remainingRuns = plannedRuns.filter(
42
+ * run => !checkpoint.isCompleted(run.runId)
43
+ * );
44
+ *
45
+ * executor.execute({...}, {
46
+ * onResult: (result) => checkpoint.saveIncremental(result)
47
+ * });
48
+ *
49
+ * // After all workers complete, merge shards
50
+ * await checkpoint.mergeShards([
51
+ * "results/execute/checkpoint-worker-0.json",
52
+ * "results/execute/checkpoint-worker-1.json",
53
+ * ...
54
+ * ]);
55
+ * ```
56
+ */
57
+ import { createHash } from "node:crypto";
58
+ import { FileStorage, InMemoryLock } from "./checkpoint-storage.js";
59
+ export { InMemoryLock } from "./checkpoint-storage.js";
60
+ /**
61
+ * Checkpoint manager for resumable execution.
62
+ *
63
+ * Uses dependency injection for storage and lock.
64
+ * Enables sharded checkpoints for parallel worker execution.
65
+ */
66
+ export class CheckpointManager {
67
+ storage;
68
+ lock;
69
+ workerIndex;
70
+ totalWorkers;
71
+ basePath;
72
+ data = null;
73
+ dirty = false;
74
+ /**
75
+ * Create a new CheckpointManager.
76
+ *
77
+ * @param options - CheckpointManagerOptions with injected storage
78
+ */
79
+ constructor(options) {
80
+ this.storage = options.storage;
81
+ this.lock = options.lock ?? new InMemoryLock();
82
+ this.workerIndex = options.workerIndex;
83
+ this.totalWorkers = options.totalWorkers;
84
+ this.basePath = options.basePath;
85
+ }
86
+ /**
87
+ * Get the storage backend being used.
88
+ */
89
+ getStorageType() {
90
+ return this.storage.type;
91
+ }
92
+ /**
93
+ * Load checkpoint from storage if it exists.
94
+ * @returns true if checkpoint was loaded, false if not found or invalid
95
+ */
96
+ async load() {
97
+ try {
98
+ const loaded = await this.storage.load();
99
+ if (loaded) {
100
+ this.data = loaded;
101
+ this.dirty = false;
102
+ return true;
103
+ }
104
+ this.data = null;
105
+ this.dirty = false;
106
+ return false;
107
+ }
108
+ catch {
109
+ this.data = null;
110
+ this.dirty = false;
111
+ return false;
112
+ }
113
+ }
114
+ /**
115
+ * Save checkpoint to storage.
116
+ */
117
+ async save() {
118
+ if (!this.dirty || !this.data) {
119
+ return;
120
+ }
121
+ try {
122
+ await this.storage.save(this.data);
123
+ this.dirty = false;
124
+ }
125
+ catch (error) {
126
+ console.warn(`Failed to save checkpoint: ${String(error)}`);
127
+ }
128
+ }
129
+ /**
130
+ * Save checkpoint incrementally (after each result).
131
+ * Uses the injected lock to prevent concurrent writes.
132
+ * @param result
133
+ */
134
+ async saveIncremental(result) {
135
+ // Acquire lock to prevent concurrent writes
136
+ await this.lock.acquire();
137
+ try {
138
+ // Always reload from file to get latest state (prevents stale memory corruption)
139
+ const currentData = await this.storage.load();
140
+ // Use loaded data or initialize if empty
141
+ const data = currentData ?? {
142
+ configHash: "pending",
143
+ createdAt: new Date().toISOString(),
144
+ updatedAt: new Date().toISOString(),
145
+ completedRunIds: [],
146
+ results: {},
147
+ totalPlanned: 0,
148
+ workerIndex: this.workerIndex,
149
+ totalWorkers: this.totalWorkers,
150
+ };
151
+ // Record the result (only if not already present)
152
+ if (!data.completedRunIds.includes(result.run.runId)) {
153
+ data.completedRunIds.push(result.run.runId);
154
+ }
155
+ data.results[result.run.runId] = result;
156
+ data.updatedAt = new Date().toISOString();
157
+ // Save immediately
158
+ await this.storage.save(data);
159
+ }
160
+ finally {
161
+ this.lock.release();
162
+ }
163
+ }
164
+ /**
165
+ * Check if checkpoint exists and is valid.
166
+ */
167
+ exists() {
168
+ return this.data !== null;
169
+ }
170
+ /**
171
+ * Check if a specific run has been completed.
172
+ * @param runId - Run identifier
173
+ */
174
+ isCompleted(runId) {
175
+ return this.data?.completedRunIds.includes(runId) ?? false;
176
+ }
177
+ /**
178
+ * Get all completed results.
179
+ */
180
+ getResults() {
181
+ if (!this.data) {
182
+ return [];
183
+ }
184
+ return Object.values(this.data.results);
185
+ }
186
+ /**
187
+ * Get progress information.
188
+ */
189
+ getProgress() {
190
+ if (!this.data) {
191
+ return { completed: 0, total: 0, percent: 0 };
192
+ }
193
+ const completed = this.data.completedRunIds.length;
194
+ const total = this.data.totalPlanned;
195
+ const percent = total > 0 ? (completed / total) * 100 : 0;
196
+ return { completed, total, percent: Math.round(percent) };
197
+ }
198
+ /**
199
+ * Check if checkpoint is stale (configuration has changed).
200
+ * @param suts - Current SUT definitions
201
+ * @param cases - Current case definitions
202
+ * @param config - Current executor config
203
+ * @param totalRuns - Total planned runs
204
+ */
205
+ isStale(suts, cases, config, totalRuns) {
206
+ if (!this.data) {
207
+ return false; // No checkpoint, not stale
208
+ }
209
+ const currentHash = this.computeConfigHash(suts, cases, config, totalRuns);
210
+ return this.data.configHash !== currentHash;
211
+ }
212
+ /**
213
+ * Invalidate checkpoint (delete and start fresh).
214
+ */
215
+ invalidate() {
216
+ this.data = null;
217
+ this.dirty = true;
218
+ }
219
+ /**
220
+ * Initialize empty checkpoint data.
221
+ * @param suts
222
+ * @param cases
223
+ * @param config
224
+ * @param totalRuns
225
+ * @param gitCommit
226
+ */
227
+ initializeEmpty(suts, cases, config, totalRuns, gitCommit) {
228
+ const configHash = suts && cases && config && totalRuns
229
+ ? this.computeConfigHash(suts, cases, config, totalRuns)
230
+ : "pending";
231
+ this.data = {
232
+ configHash,
233
+ createdAt: new Date().toISOString(),
234
+ updatedAt: new Date().toISOString(),
235
+ completedRunIds: [],
236
+ results: {},
237
+ totalPlanned: totalRuns ?? 0,
238
+ gitCommit,
239
+ workerIndex: this.workerIndex,
240
+ totalWorkers: this.totalWorkers,
241
+ };
242
+ this.dirty = true;
243
+ }
244
+ /**
245
+ * Compute hash of execution configuration.
246
+ * Used to detect when configuration changes invalidate checkpoint.
247
+ * @param suts
248
+ * @param cases
249
+ * @param config
250
+ * @param totalRuns
251
+ */
252
+ computeConfigHash(suts, cases, config, totalRuns) {
253
+ const signature = {
254
+ suts: suts.map((s) => ({
255
+ id: s.registration.id,
256
+ version: s.registration.version,
257
+ })),
258
+ cases: cases.map((c) => ({
259
+ id: c.case.caseId,
260
+ version: c.case.version ?? "1.0.0",
261
+ })),
262
+ executorConfig: {
263
+ repetitions: config.repetitions ?? 1,
264
+ seedBase: config.seedBase ?? 42,
265
+ timeoutMs: config.timeoutMs ?? 0,
266
+ },
267
+ totalRuns,
268
+ };
269
+ return createHash("sha256").update(JSON.stringify(signature)).digest("hex").slice(0, 16);
270
+ }
271
+ /**
272
+ * Get remaining planned runs (excluding completed).
273
+ * @param plannedRuns - All planned runs
274
+ */
275
+ filterRemaining(plannedRuns) {
276
+ if (!this.data) {
277
+ return plannedRuns;
278
+ }
279
+ const completedSet = new Set(this.data.completedRunIds);
280
+ return plannedRuns.filter((run) => !completedSet.has(run.runId));
281
+ }
282
+ /**
283
+ * Merge new results into checkpoint (for batch updates).
284
+ * @param results - New results to add
285
+ */
286
+ mergeResults(results) {
287
+ if (!this.data) {
288
+ this.initializeEmpty();
289
+ }
290
+ // Guard against null after initialization
291
+ if (!this.data) {
292
+ return;
293
+ }
294
+ for (const result of results) {
295
+ if (!this.data.completedRunIds.includes(result.run.runId)) {
296
+ this.data.completedRunIds.push(result.run.runId);
297
+ this.data.results[result.run.runId] = result;
298
+ }
299
+ }
300
+ this.dirty = true;
301
+ }
302
+ /**
303
+ * Merge multiple worker checkpoint shards into a single aggregated checkpoint.
304
+ *
305
+ * This is called after all parallel workers complete to aggregate their results.
306
+ * Each worker writes to its own shard file to avoid race conditions.
307
+ *
308
+ * @param shardPaths - Array of checkpoint shard file paths
309
+ * @returns The merged checkpoint data
310
+ */
311
+ async mergeShards(shardPaths) {
312
+ // Start with main checkpoint data, or empty if no checkpoint exists yet
313
+ const mainData = this.data;
314
+ const merged = {
315
+ configHash: mainData?.configHash ?? "",
316
+ createdAt: mainData?.createdAt ?? new Date().toISOString(),
317
+ updatedAt: new Date().toISOString(),
318
+ completedRunIds: [...(mainData?.completedRunIds ?? [])],
319
+ results: { ...mainData?.results },
320
+ totalPlanned: mainData?.totalPlanned ?? 0,
321
+ gitCommit: mainData?.gitCommit,
322
+ };
323
+ // Load and merge each shard
324
+ for (const shardPath of shardPaths) {
325
+ const shardStorage = new FileStorage(shardPath);
326
+ const shardData = await shardStorage.load();
327
+ if (shardData) {
328
+ // Merge completed run IDs
329
+ merged.completedRunIds.push(...shardData.completedRunIds);
330
+ // Merge results
331
+ Object.assign(merged.results, shardData.results);
332
+ // Keep the maximum totalPlanned
333
+ if (shardData.totalPlanned > merged.totalPlanned) {
334
+ merged.totalPlanned = shardData.totalPlanned;
335
+ }
336
+ // Keep the earliest createdAt
337
+ if (shardData.createdAt < merged.createdAt) {
338
+ merged.createdAt = shardData.createdAt;
339
+ }
340
+ // Preserve config hash from first valid shard
341
+ if (merged.configHash === "" && shardData.configHash !== "pending") {
342
+ merged.configHash = shardData.configHash;
343
+ }
344
+ // Preserve git commit if available
345
+ if (shardData.gitCommit && !merged.gitCommit) {
346
+ merged.gitCommit = shardData.gitCommit;
347
+ }
348
+ }
349
+ }
350
+ // Deduplicate completedRunIds (in case of any overlap)
351
+ merged.completedRunIds = [...new Set(merged.completedRunIds)];
352
+ merged.updatedAt = new Date().toISOString();
353
+ // Save merged checkpoint
354
+ await this.storage.save(merged);
355
+ // Update internal state
356
+ this.data = merged;
357
+ this.dirty = false;
358
+ return merged;
359
+ }
360
+ /**
361
+ * Get checkpoint summary for logging.
362
+ */
363
+ getSummary() {
364
+ if (!this.data) {
365
+ return "No checkpoint";
366
+ }
367
+ const progress = this.getProgress();
368
+ return `Checkpoint: ${progress.completed}/${progress.total} runs (${progress.percent}%)`;
369
+ }
370
+ }
371
+ /**
372
+ * Get git commit hash for reproducibility.
373
+ */
374
+ export const getGitCommit = async () => {
375
+ try {
376
+ const { execSync } = await import("node:child_process");
377
+ return execSync("git rev-parse HEAD", { encoding: "utf-8" }).trim();
378
+ }
379
+ catch {
380
+ return undefined;
381
+ }
382
+ };
383
+ /**
384
+ * Create a checkpoint manager with default file storage.
385
+ *
386
+ * Convenience factory for simple cases.
387
+ *
388
+ * @param path - Checkpoint file path
389
+ * @param lock - Optional lock implementation
390
+ */
391
+ export const createFileCheckpointManager = (path = "results/execute/checkpoint.json", lock) => {
392
+ const storage = new FileStorage(path);
393
+ return new CheckpointManager({ storage, lock });
394
+ };
395
+ //# sourceMappingURL=checkpoint-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-manager.js","sourceRoot":"","sources":["../../src/executor/checkpoint-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMpE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AA2EvD;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACZ,OAAO,CAAoB;IAC3B,IAAI,CAAO;IACX,WAAW,CAAU;IACrB,YAAY,CAAU;IACtB,QAAQ,CAAU;IAC3B,IAAI,GAA0B,IAAI,CAAC;IACnC,KAAK,GAAG,KAAK,CAAC;IAEtB;;;;OAIG;IACH,YAAY,OAAiC;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,YAAY,EAAE,CAAC;QAC/C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,cAAc;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACT,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBACnB,OAAO,IAAI,CAAC;YACb,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,OAAO,KAAK,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACT,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO;QACR,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,MAAwB;QAC7C,4CAA4C;QAC5C,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC;YACJ,iFAAiF;YACjF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAE9C,yCAAyC;YACzC,MAAM,IAAI,GAAmB,WAAW,IAAI;gBAC3C,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,eAAe,EAAE,EAAE;gBACnB,OAAO,EAAE,EAAE;gBACX,YAAY,EAAE,CAAC;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;aAC/B,CAAC;YAEF,kDAAkD;YAClD,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YACxC,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAE1C,mBAAmB;YACnB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;IACF,CAAC;IAED;;OAEG;IACH,MAAM;QACL,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,UAAU;QACT,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,WAAW;QACV,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3D,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CACN,IAAyC,EACzC,KAAkC,EAClC,MAA+B,EAC/B,SAAiB;QAEjB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,CAAC,2BAA2B;QAC1C,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,WAAW,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,UAAU;QACT,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACH,eAAe,CACd,IAA0C,EAC1C,KAAmC,EACnC,MAAgC,EAChC,SAAkB,EAClB,SAAkB;QAElB,MAAM,UAAU,GACf,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,SAAS;YACnC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;YACxD,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,CAAC,IAAI,GAAG;YACX,UAAU;YACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,eAAe,EAAE,EAAE;YACnB,OAAO,EAAE,EAAE;YACX,YAAY,EAAE,SAAS,IAAI,CAAC;YAC5B,SAAS;YACT,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;SAC/B,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACK,iBAAiB,CACxB,IAAyC,EACzC,KAAkC,EAClC,MAA+B,EAC/B,SAAiB;QAEjB,MAAM,SAAS,GAAoB;YAClC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtB,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE;gBACrB,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,OAAO;aAC/B,CAAC,CAAC;YACH,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;gBACjB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO;aAClC,CAAC,CAAC;YACH,cAAc,EAAE;gBACf,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC;gBACpC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;gBAC/B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC;aAChC;YACD,SAAS;SACT,CAAC;QAEF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED;;;OAGG;IACH,eAAe,CAAuB,WAAgB;QACrD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC;QACpB,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,OAA2B;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,eAAe,EAAE,CAAC;QACxB,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO;QACR,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YAC9C,CAAC;QACF,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,WAAW,CAAC,UAAoB;QACrC,wEAAwE;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,MAAM,MAAM,GAAmB;YAC9B,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,EAAE;YACtC,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC1D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,eAAe,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC;YACvD,OAAO,EAAE,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE;YACjC,YAAY,EAAE,QAAQ,EAAE,YAAY,IAAI,CAAC;YACzC,SAAS,EAAE,QAAQ,EAAE,SAAS;SAC9B,CAAC;QAEF,4BAA4B;QAC5B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAE5C,IAAI,SAAS,EAAE,CAAC;gBACf,0BAA0B;gBAC1B,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,eAAe,CAAC,CAAC;gBAE1D,gBAAgB;gBAChB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;gBAEjD,gCAAgC;gBAChC,IAAI,SAAS,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;oBAClD,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;gBAC9C,CAAC;gBAED,8BAA8B;gBAC9B,IAAI,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;oBAC5C,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;gBACxC,CAAC;gBAED,8CAA8C;gBAC9C,IAAI,MAAM,CAAC,UAAU,KAAK,EAAE,IAAI,SAAS,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;oBACpE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;gBAC1C,CAAC;gBAED,mCAAmC;gBACnC,IAAI,SAAS,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;oBAC9C,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;gBACxC,CAAC;YACF,CAAC;QACF,CAAC;QAED,uDAAuD;QACvD,MAAM,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE5C,yBAAyB;QACzB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhC,wBAAwB;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;OAEG;IACH,UAAU;QACT,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,eAAe,CAAC;QACxB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,eAAe,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAO,IAAI,CAAC;IAC1F,CAAC;CACD;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,IAAiC,EAAE;IACnE,IAAI,CAAC;QACJ,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACxD,OAAO,QAAQ,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAC1C,IAAI,GAAG,iCAAiC,EACxC,IAAW,EACS,EAAE;IACtB,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC"}