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.
- package/README.md +172 -0
- package/bin/ppef.mjs +20 -0
- package/dist/__tests__/framework-pipeline.integration.test.d.ts +7 -0
- package/dist/__tests__/framework-pipeline.integration.test.d.ts.map +1 -0
- package/dist/__tests__/framework-pipeline.integration.test.js +415 -0
- package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -0
- package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
- package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
- package/dist/__tests__/index-exports.unit.test.js +127 -0
- package/dist/__tests__/index-exports.unit.test.js.map +1 -0
- package/dist/__tests__/registry-executor.integration.test.d.ts +5 -0
- package/dist/__tests__/registry-executor.integration.test.d.ts.map +1 -0
- package/dist/__tests__/registry-executor.integration.test.js +352 -0
- package/dist/__tests__/registry-executor.integration.test.js.map +1 -0
- package/dist/__tests__/test-helpers.d.ts +94 -0
- package/dist/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/__tests__/test-helpers.js +271 -0
- package/dist/__tests__/test-helpers.js.map +1 -0
- package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
- package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
- package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
- package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
- package/dist/aggregation/aggregators.d.ts +63 -0
- package/dist/aggregation/aggregators.d.ts.map +1 -0
- package/dist/aggregation/aggregators.js +228 -0
- package/dist/aggregation/aggregators.js.map +1 -0
- package/dist/aggregation/index.d.ts +8 -0
- package/dist/aggregation/index.d.ts.map +1 -0
- package/dist/aggregation/index.js +8 -0
- package/dist/aggregation/index.js.map +1 -0
- package/dist/aggregation/pipeline.d.ts +38 -0
- package/dist/aggregation/pipeline.d.ts.map +1 -0
- package/dist/aggregation/pipeline.js +198 -0
- package/dist/aggregation/pipeline.js.map +1 -0
- package/dist/claims/__tests__/evaluator.unit.test.d.ts +12 -0
- package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +1 -0
- package/dist/claims/__tests__/evaluator.unit.test.js +801 -0
- package/dist/claims/__tests__/evaluator.unit.test.js.map +1 -0
- package/dist/claims/evaluator.d.ts +33 -0
- package/dist/claims/evaluator.d.ts.map +1 -0
- package/dist/claims/evaluator.js +174 -0
- package/dist/claims/evaluator.js.map +1 -0
- package/dist/claims/index.d.ts +7 -0
- package/dist/claims/index.d.ts.map +1 -0
- package/dist/claims/index.js +7 -0
- package/dist/claims/index.js.map +1 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.js +396 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
- package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
- package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/commands.unit.test.js +217 -0
- package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
- package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
- package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/index.unit.test.js +65 -0
- package/dist/cli/__tests__/index.unit.test.js.map +1 -0
- package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
- package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/logger.unit.test.js +180 -0
- package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
- package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
- package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
- package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
- package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
- package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
- package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
- package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
- package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
- package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/run.command.unit.test.js +422 -0
- package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
- package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
- package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
- package/dist/cli/command-deps.d.ts +125 -0
- package/dist/cli/command-deps.d.ts.map +1 -0
- package/dist/cli/command-deps.js +7 -0
- package/dist/cli/command-deps.js.map +1 -0
- package/dist/cli/commands/aggregate.d.ts +35 -0
- package/dist/cli/commands/aggregate.d.ts.map +1 -0
- package/dist/cli/commands/aggregate.js +121 -0
- package/dist/cli/commands/aggregate.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +36 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +109 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/run.d.ts +33 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +185 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +27 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +88 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/config-loader.d.ts +30 -0
- package/dist/cli/config-loader.d.ts.map +1 -0
- package/dist/cli/config-loader.js +181 -0
- package/dist/cli/config-loader.js.map +1 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +58 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/logger.d.ts +75 -0
- package/dist/cli/logger.d.ts.map +1 -0
- package/dist/cli/logger.js +131 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/module-loader.d.ts +46 -0
- package/dist/cli/module-loader.d.ts.map +1 -0
- package/dist/cli/module-loader.js +116 -0
- package/dist/cli/module-loader.js.map +1 -0
- package/dist/cli/output-writer.d.ts +51 -0
- package/dist/cli/output-writer.d.ts.map +1 -0
- package/dist/cli/output-writer.js +65 -0
- package/dist/cli/output-writer.js.map +1 -0
- package/dist/cli/types.d.ts +174 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +7 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
- package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
- package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
- package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
- package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
- package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
- package/dist/collector/__tests__/schema.unit.test.js +360 -0
- package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
- package/dist/collector/index.d.ts +8 -0
- package/dist/collector/index.d.ts.map +1 -0
- package/dist/collector/index.js +8 -0
- package/dist/collector/index.js.map +1 -0
- package/dist/collector/result-collector.d.ts +159 -0
- package/dist/collector/result-collector.d.ts.map +1 -0
- package/dist/collector/result-collector.js +213 -0
- package/dist/collector/result-collector.js.map +1 -0
- package/dist/collector/schema.d.ts +34 -0
- package/dist/collector/schema.d.ts.map +1 -0
- package/dist/collector/schema.js +145 -0
- package/dist/collector/schema.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts +10 -0
- package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js +122 -0
- package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts +7 -0
- package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-manager.integration.test.js +330 -0
- package/dist/executor/__tests__/checkpoint-manager.integration.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-manager.unit.test.js +531 -0
- package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +8 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +493 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts +8 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js +164 -0
- package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/checkpoint-storage.unit.test.js +490 -0
- package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -0
- package/dist/executor/__tests__/executor.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/executor.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/executor.unit.test.js +202 -0
- package/dist/executor/__tests__/executor.unit.test.js.map +1 -0
- package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
- package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
- package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts +12 -0
- package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts.map +1 -0
- package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js +196 -0
- package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js.map +1 -0
- package/dist/executor/__tests__/parallel-executor.integration.test.d.ts +7 -0
- package/dist/executor/__tests__/parallel-executor.integration.test.d.ts.map +1 -0
- package/dist/executor/__tests__/parallel-executor.integration.test.js +249 -0
- package/dist/executor/__tests__/parallel-executor.integration.test.js.map +1 -0
- package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +8 -0
- package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/parallel-executor.unit.test.js +473 -0
- package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -0
- package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
- package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/run-id.unit.test.js +156 -0
- package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
- package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
- package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
- package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
- package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
- package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
- package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
- package/dist/executor/checkpoint-manager.d.ts +231 -0
- package/dist/executor/checkpoint-manager.d.ts.map +1 -0
- package/dist/executor/checkpoint-manager.js +395 -0
- package/dist/executor/checkpoint-manager.js.map +1 -0
- package/dist/executor/checkpoint-storage.d.ts +230 -0
- package/dist/executor/checkpoint-storage.d.ts.map +1 -0
- package/dist/executor/checkpoint-storage.js +370 -0
- package/dist/executor/checkpoint-storage.js.map +1 -0
- package/dist/executor/checkpoint-types.d.ts +48 -0
- package/dist/executor/checkpoint-types.d.ts.map +1 -0
- package/dist/executor/checkpoint-types.js +8 -0
- package/dist/executor/checkpoint-types.js.map +1 -0
- package/dist/executor/executor.d.ts +164 -0
- package/dist/executor/executor.d.ts.map +1 -0
- package/dist/executor/executor.js +408 -0
- package/dist/executor/executor.js.map +1 -0
- package/dist/executor/index.d.ts +11 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +11 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/executor/memory-monitor.d.ts +115 -0
- package/dist/executor/memory-monitor.d.ts.map +1 -0
- package/dist/executor/memory-monitor.js +168 -0
- package/dist/executor/memory-monitor.js.map +1 -0
- package/dist/executor/parallel-executor.d.ts +239 -0
- package/dist/executor/parallel-executor.d.ts.map +1 -0
- package/dist/executor/parallel-executor.js +329 -0
- package/dist/executor/parallel-executor.js.map +1 -0
- package/dist/executor/run-id.d.ts +71 -0
- package/dist/executor/run-id.d.ts.map +1 -0
- package/dist/executor/run-id.js +74 -0
- package/dist/executor/run-id.js.map +1 -0
- package/dist/executor/worker-entry.d.ts +10 -0
- package/dist/executor/worker-entry.d.ts.map +1 -0
- package/dist/executor/worker-entry.js +42 -0
- package/dist/executor/worker-entry.js.map +1 -0
- package/dist/executor/worker-executor.d.ts +156 -0
- package/dist/executor/worker-executor.d.ts.map +1 -0
- package/dist/executor/worker-executor.js +88 -0
- package/dist/executor/worker-executor.js.map +1 -0
- package/dist/index.cjs +11 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/case-registry.d.ts +113 -0
- package/dist/registry/case-registry.d.ts.map +1 -0
- package/dist/registry/case-registry.js +160 -0
- package/dist/registry/case-registry.js.map +1 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/sut-registry.d.ts +96 -0
- package/dist/registry/sut-registry.d.ts.map +1 -0
- package/dist/registry/sut-registry.js +126 -0
- package/dist/registry/sut-registry.js.map +1 -0
- package/dist/renderers/index.d.ts +10 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/renderers/index.js +9 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/latex-renderer.d.ts +84 -0
- package/dist/renderers/latex-renderer.d.ts.map +1 -0
- package/dist/renderers/latex-renderer.js +208 -0
- package/dist/renderers/latex-renderer.js.map +1 -0
- package/dist/renderers/types.d.ts +106 -0
- package/dist/renderers/types.d.ts.map +1 -0
- package/dist/renderers/types.js +23 -0
- package/dist/renderers/types.js.map +1 -0
- package/dist/robustness/__tests__/analyzer.unit.test.d.ts +11 -0
- package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +1 -0
- package/dist/robustness/__tests__/analyzer.unit.test.js +455 -0
- package/dist/robustness/__tests__/analyzer.unit.test.js.map +1 -0
- package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
- package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
- package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
- package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
- package/dist/robustness/analyzer.d.ts +61 -0
- package/dist/robustness/analyzer.d.ts.map +1 -0
- package/dist/robustness/analyzer.js +191 -0
- package/dist/robustness/analyzer.js.map +1 -0
- package/dist/robustness/index.d.ts +8 -0
- package/dist/robustness/index.d.ts.map +1 -0
- package/dist/robustness/index.js +8 -0
- package/dist/robustness/index.js.map +1 -0
- package/dist/robustness/perturbations.d.ts +46 -0
- package/dist/robustness/perturbations.d.ts.map +1 -0
- package/dist/robustness/perturbations.js +184 -0
- package/dist/robustness/perturbations.js.map +1 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
- package/dist/statistical/index.d.ts +8 -0
- package/dist/statistical/index.d.ts.map +1 -0
- package/dist/statistical/index.js +8 -0
- package/dist/statistical/index.js.map +1 -0
- package/dist/statistical/mann-whitney-u.d.ts +62 -0
- package/dist/statistical/mann-whitney-u.d.ts.map +1 -0
- package/dist/statistical/mann-whitney-u.js +127 -0
- package/dist/statistical/mann-whitney-u.js.map +1 -0
- package/dist/types/aggregate.d.ts +124 -0
- package/dist/types/aggregate.d.ts.map +1 -0
- package/dist/types/aggregate.js +9 -0
- package/dist/types/aggregate.js.map +1 -0
- package/dist/types/case.d.ts +105 -0
- package/dist/types/case.d.ts.map +1 -0
- package/dist/types/case.js +10 -0
- package/dist/types/case.js.map +1 -0
- package/dist/types/claims.d.ts +122 -0
- package/dist/types/claims.d.ts.map +1 -0
- package/dist/types/claims.js +14 -0
- package/dist/types/claims.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/perturbation.d.ts +105 -0
- package/dist/types/perturbation.d.ts.map +1 -0
- package/dist/types/perturbation.js +9 -0
- package/dist/types/perturbation.js.map +1 -0
- package/dist/types/result.d.ts +150 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +12 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/sut.d.ts +128 -0
- package/dist/types/sut.d.ts.map +1 -0
- package/dist/types/sut.js +12 -0
- package/dist/types/sut.js.map +1 -0
- 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":"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"}
|
|
@@ -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":"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"}
|