ppef 1.0.0 → 1.0.1

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 (199) hide show
  1. package/README.md +172 -0
  2. package/dist/__tests__/framework-pipeline.integration.test.d.ts +7 -0
  3. package/dist/__tests__/framework-pipeline.integration.test.d.ts.map +1 -0
  4. package/dist/__tests__/framework-pipeline.integration.test.js +413 -0
  5. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -0
  6. package/dist/__tests__/registry-executor.integration.test.d.ts +5 -0
  7. package/dist/__tests__/registry-executor.integration.test.d.ts.map +1 -0
  8. package/dist/__tests__/registry-executor.integration.test.js +349 -0
  9. package/dist/__tests__/registry-executor.integration.test.js.map +1 -0
  10. package/dist/__tests__/test-helpers.d.ts +94 -0
  11. package/dist/__tests__/test-helpers.d.ts.map +1 -0
  12. package/dist/__tests__/test-helpers.js +271 -0
  13. package/dist/__tests__/test-helpers.js.map +1 -0
  14. package/dist/aggregation/aggregators.d.ts +54 -0
  15. package/dist/aggregation/aggregators.d.ts.map +1 -0
  16. package/dist/aggregation/aggregators.js +228 -0
  17. package/dist/aggregation/aggregators.js.map +1 -0
  18. package/dist/aggregation/index.d.ts +8 -0
  19. package/dist/aggregation/index.d.ts.map +1 -0
  20. package/dist/aggregation/index.js +8 -0
  21. package/dist/aggregation/index.js.map +1 -0
  22. package/dist/aggregation/pipeline.d.ts +38 -0
  23. package/dist/aggregation/pipeline.d.ts.map +1 -0
  24. package/dist/aggregation/pipeline.js +198 -0
  25. package/dist/aggregation/pipeline.js.map +1 -0
  26. package/dist/claims/evaluator.d.ts +33 -0
  27. package/dist/claims/evaluator.d.ts.map +1 -0
  28. package/dist/claims/evaluator.js +174 -0
  29. package/dist/claims/evaluator.js.map +1 -0
  30. package/dist/claims/index.d.ts +7 -0
  31. package/dist/claims/index.d.ts.map +1 -0
  32. package/dist/claims/index.js +7 -0
  33. package/dist/claims/index.js.map +1 -0
  34. package/dist/collector/index.d.ts +8 -0
  35. package/dist/collector/index.d.ts.map +1 -0
  36. package/dist/collector/index.js +8 -0
  37. package/dist/collector/index.js.map +1 -0
  38. package/dist/collector/result-collector.d.ts +159 -0
  39. package/dist/collector/result-collector.d.ts.map +1 -0
  40. package/dist/collector/result-collector.js +213 -0
  41. package/dist/collector/result-collector.js.map +1 -0
  42. package/dist/collector/schema.d.ts +34 -0
  43. package/dist/collector/schema.d.ts.map +1 -0
  44. package/dist/collector/schema.js +145 -0
  45. package/dist/collector/schema.js.map +1 -0
  46. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts +10 -0
  47. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts.map +1 -0
  48. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js +122 -0
  49. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js.map +1 -0
  50. package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts +7 -0
  51. package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts.map +1 -0
  52. package/dist/executor/__tests__/checkpoint-manager.integration.test.js +330 -0
  53. package/dist/executor/__tests__/checkpoint-manager.integration.test.js.map +1 -0
  54. package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts +7 -0
  55. package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts.map +1 -0
  56. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +449 -0
  57. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -0
  58. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +11 -0
  59. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -0
  60. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +224 -0
  61. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -0
  62. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts +8 -0
  63. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts.map +1 -0
  64. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js +164 -0
  65. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js.map +1 -0
  66. package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts +7 -0
  67. package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts.map +1 -0
  68. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +386 -0
  69. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -0
  70. package/dist/executor/__tests__/executor.unit.test.d.ts +7 -0
  71. package/dist/executor/__tests__/executor.unit.test.d.ts.map +1 -0
  72. package/dist/executor/__tests__/executor.unit.test.js +134 -0
  73. package/dist/executor/__tests__/executor.unit.test.js.map +1 -0
  74. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts +12 -0
  75. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts.map +1 -0
  76. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js +196 -0
  77. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js.map +1 -0
  78. package/dist/executor/__tests__/parallel-executor.integration.test.d.ts +7 -0
  79. package/dist/executor/__tests__/parallel-executor.integration.test.d.ts.map +1 -0
  80. package/dist/executor/__tests__/parallel-executor.integration.test.js +249 -0
  81. package/dist/executor/__tests__/parallel-executor.integration.test.js.map +1 -0
  82. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +7 -0
  83. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -0
  84. package/dist/executor/__tests__/parallel-executor.unit.test.js +203 -0
  85. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -0
  86. package/dist/executor/checkpoint-manager.d.ts +231 -0
  87. package/dist/executor/checkpoint-manager.d.ts.map +1 -0
  88. package/dist/executor/checkpoint-manager.js +395 -0
  89. package/dist/executor/checkpoint-manager.js.map +1 -0
  90. package/dist/executor/checkpoint-storage.d.ts +230 -0
  91. package/dist/executor/checkpoint-storage.d.ts.map +1 -0
  92. package/dist/executor/checkpoint-storage.js +370 -0
  93. package/dist/executor/checkpoint-storage.js.map +1 -0
  94. package/dist/executor/checkpoint-types.d.ts +48 -0
  95. package/dist/executor/checkpoint-types.d.ts.map +1 -0
  96. package/dist/executor/checkpoint-types.js +8 -0
  97. package/dist/executor/checkpoint-types.js.map +1 -0
  98. package/dist/executor/executor.d.ts +164 -0
  99. package/dist/executor/executor.d.ts.map +1 -0
  100. package/dist/executor/executor.js +408 -0
  101. package/dist/executor/executor.js.map +1 -0
  102. package/dist/executor/index.d.ts +11 -0
  103. package/dist/executor/index.d.ts.map +1 -0
  104. package/dist/executor/index.js +11 -0
  105. package/dist/executor/index.js.map +1 -0
  106. package/dist/executor/memory-monitor.d.ts +115 -0
  107. package/dist/executor/memory-monitor.d.ts.map +1 -0
  108. package/dist/executor/memory-monitor.js +168 -0
  109. package/dist/executor/memory-monitor.js.map +1 -0
  110. package/dist/executor/parallel-executor.d.ts +53 -0
  111. package/dist/executor/parallel-executor.d.ts.map +1 -0
  112. package/dist/executor/parallel-executor.js +194 -0
  113. package/dist/executor/parallel-executor.js.map +1 -0
  114. package/dist/executor/run-id.d.ts +71 -0
  115. package/dist/executor/run-id.d.ts.map +1 -0
  116. package/dist/executor/run-id.js +67 -0
  117. package/dist/executor/run-id.js.map +1 -0
  118. package/dist/executor/worker-entry.d.ts +8 -0
  119. package/dist/executor/worker-entry.d.ts.map +1 -0
  120. package/dist/executor/worker-entry.js +67 -0
  121. package/dist/executor/worker-entry.js.map +1 -0
  122. package/dist/index.cjs +11 -0
  123. package/dist/index.d.ts +15 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +24 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/registry/case-registry.d.ts +113 -0
  128. package/dist/registry/case-registry.d.ts.map +1 -0
  129. package/dist/registry/case-registry.js +160 -0
  130. package/dist/registry/case-registry.js.map +1 -0
  131. package/dist/registry/index.d.ts +8 -0
  132. package/dist/registry/index.d.ts.map +1 -0
  133. package/dist/registry/index.js +8 -0
  134. package/dist/registry/index.js.map +1 -0
  135. package/dist/registry/sut-registry.d.ts +96 -0
  136. package/dist/registry/sut-registry.d.ts.map +1 -0
  137. package/dist/registry/sut-registry.js +126 -0
  138. package/dist/registry/sut-registry.js.map +1 -0
  139. package/dist/renderers/index.d.ts +10 -0
  140. package/dist/renderers/index.d.ts.map +1 -0
  141. package/dist/renderers/index.js +9 -0
  142. package/dist/renderers/index.js.map +1 -0
  143. package/dist/renderers/latex-renderer.d.ts +84 -0
  144. package/dist/renderers/latex-renderer.d.ts.map +1 -0
  145. package/dist/renderers/latex-renderer.js +208 -0
  146. package/dist/renderers/latex-renderer.js.map +1 -0
  147. package/dist/renderers/types.d.ts +106 -0
  148. package/dist/renderers/types.d.ts.map +1 -0
  149. package/dist/renderers/types.js +23 -0
  150. package/dist/renderers/types.js.map +1 -0
  151. package/dist/robustness/analyzer.d.ts +61 -0
  152. package/dist/robustness/analyzer.d.ts.map +1 -0
  153. package/dist/robustness/analyzer.js +191 -0
  154. package/dist/robustness/analyzer.js.map +1 -0
  155. package/dist/robustness/index.d.ts +8 -0
  156. package/dist/robustness/index.d.ts.map +1 -0
  157. package/dist/robustness/index.js +8 -0
  158. package/dist/robustness/index.js.map +1 -0
  159. package/dist/robustness/perturbations.d.ts +46 -0
  160. package/dist/robustness/perturbations.d.ts.map +1 -0
  161. package/dist/robustness/perturbations.js +184 -0
  162. package/dist/robustness/perturbations.js.map +1 -0
  163. package/dist/statistical/index.d.ts +8 -0
  164. package/dist/statistical/index.d.ts.map +1 -0
  165. package/dist/statistical/index.js +8 -0
  166. package/dist/statistical/index.js.map +1 -0
  167. package/dist/statistical/mann-whitney-u.d.ts +62 -0
  168. package/dist/statistical/mann-whitney-u.d.ts.map +1 -0
  169. package/dist/statistical/mann-whitney-u.js +127 -0
  170. package/dist/statistical/mann-whitney-u.js.map +1 -0
  171. package/dist/types/aggregate.d.ts +124 -0
  172. package/dist/types/aggregate.d.ts.map +1 -0
  173. package/dist/types/aggregate.js +9 -0
  174. package/dist/types/aggregate.js.map +1 -0
  175. package/dist/types/case.d.ts +105 -0
  176. package/dist/types/case.d.ts.map +1 -0
  177. package/dist/types/case.js +10 -0
  178. package/dist/types/case.js.map +1 -0
  179. package/dist/types/claims.d.ts +122 -0
  180. package/dist/types/claims.d.ts.map +1 -0
  181. package/dist/types/claims.js +14 -0
  182. package/dist/types/claims.js.map +1 -0
  183. package/dist/types/index.d.ts +12 -0
  184. package/dist/types/index.d.ts.map +1 -0
  185. package/dist/types/index.js +7 -0
  186. package/dist/types/index.js.map +1 -0
  187. package/dist/types/perturbation.d.ts +105 -0
  188. package/dist/types/perturbation.d.ts.map +1 -0
  189. package/dist/types/perturbation.js +9 -0
  190. package/dist/types/perturbation.js.map +1 -0
  191. package/dist/types/result.d.ts +150 -0
  192. package/dist/types/result.d.ts.map +1 -0
  193. package/dist/types/result.js +12 -0
  194. package/dist/types/result.js.map +1 -0
  195. package/dist/types/sut.d.ts +128 -0
  196. package/dist/types/sut.d.ts.map +1 -0
  197. package/dist/types/sut.js +12 -0
  198. package/dist/types/sut.js.map +1 -0
  199. package/package.json +283 -7
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Checkpoint Storage Backends
3
+ *
4
+ * Pluggable storage for experiment checkpoints:
5
+ * - FileStorage: JSON files in local filesystem (fast, no git required)
6
+ * - GitStorage: Git notes attached to commits (version controlled, shareable)
7
+ *
8
+ * Dependency Injection:
9
+ * - FileSystem interface enables mocking for tests
10
+ * - Lock interface enables pluggable concurrency control
11
+ *
12
+ * Usage:
13
+ * ```typescript
14
+ * // File-based (default)
15
+ * const fileStorage = new FileStorage("results/execute/checkpoint.json");
16
+ *
17
+ * // Git-based (stores as git notes)
18
+ * const gitStorage = new GitStorage("results-execute");
19
+ *
20
+ * // With mock file system for testing
21
+ * const mockFs = new MockFileSystem();
22
+ * const fileStorage = new FileStorage("checkpoint.json", mockFs);
23
+ *
24
+ * // Auto-detect based on mode
25
+ * const storage = createCheckpointStorage("file", "results/execute/checkpoint.json");
26
+ * const storage = createCheckpointStorage("git", "results-execute");
27
+ * ```
28
+ */
29
+ import { execSync } from "node:child_process";
30
+ import { mkdir, readdir, readFile, unlink, writeFile } from "node:fs/promises";
31
+ import { dirname, resolve } from "node:path";
32
+ /**
33
+ * Production file system implementation using node:fs/promises.
34
+ */
35
+ export class NodeFileSystem {
36
+ async readFile(path) {
37
+ return readFile(path, "utf-8");
38
+ }
39
+ async writeFile(path, content) {
40
+ await writeFile(path, content, "utf-8");
41
+ }
42
+ async mkdir(path, options) {
43
+ await mkdir(path, options);
44
+ }
45
+ async unlink(path) {
46
+ await unlink(path);
47
+ }
48
+ async access(path) {
49
+ const { constants } = await import("node:fs/promises");
50
+ const { access } = await import("node:fs/promises");
51
+ await access(path, constants.F_OK);
52
+ }
53
+ async readdir(path) {
54
+ return readdir(path);
55
+ }
56
+ }
57
+ /**
58
+ * In-memory lock for single-process use.
59
+ * Provides queue-based locking for concurrent saves within a process.
60
+ */
61
+ export class InMemoryLock {
62
+ locked = false;
63
+ queue = [];
64
+ async acquire() {
65
+ return new Promise((resolve) => {
66
+ if (this.locked) {
67
+ this.queue.push(resolve);
68
+ }
69
+ else {
70
+ this.locked = true;
71
+ resolve();
72
+ }
73
+ });
74
+ }
75
+ release() {
76
+ const next = this.queue.shift();
77
+ if (next) {
78
+ next();
79
+ }
80
+ else {
81
+ this.locked = false;
82
+ }
83
+ }
84
+ }
85
+ /**
86
+ * File-based checkpoint storage.
87
+ * Stores checkpoints as JSON files in the local filesystem.
88
+ *
89
+ * Supports dependency injection of FileSystem for testing.
90
+ */
91
+ export class FileStorage {
92
+ type = "file";
93
+ path;
94
+ fs;
95
+ constructor(path, fs) {
96
+ this.path = resolve(path);
97
+ this.fs = fs ?? new NodeFileSystem();
98
+ }
99
+ async load() {
100
+ try {
101
+ const content = await this.fs.readFile(this.path);
102
+ return JSON.parse(content);
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ async save(data) {
109
+ try {
110
+ await this.fs.mkdir(dirname(this.path), { recursive: true });
111
+ data.updatedAt = new Date().toISOString();
112
+ const content = JSON.stringify(data, null, 2);
113
+ await this.fs.writeFile(this.path, content);
114
+ }
115
+ catch (error) {
116
+ console.warn(`Failed to save checkpoint to ${this.path}: ${String(error)}`);
117
+ throw error;
118
+ }
119
+ }
120
+ async delete() {
121
+ try {
122
+ await this.fs.unlink(this.path);
123
+ }
124
+ catch {
125
+ // Ignore if file doesn't exist
126
+ }
127
+ }
128
+ async exists() {
129
+ try {
130
+ const content = await this.fs.readFile(this.path);
131
+ const data = JSON.parse(content);
132
+ return data !== null && typeof data === "object";
133
+ }
134
+ catch {
135
+ return false;
136
+ }
137
+ }
138
+ getPath() {
139
+ return this.path;
140
+ }
141
+ /**
142
+ * Find all worker checkpoint shard files in a directory.
143
+ * Looks for files matching the pattern "checkpoint-worker-*.json".
144
+ *
145
+ * @param baseDir - Directory to search for shard files
146
+ * @param fs - FileSystem implementation (defaults to NodeFileSystem)
147
+ * @returns Sorted array of shard file paths
148
+ */
149
+ static async findShards(baseDir, fs) {
150
+ const fileSystem = fs ?? new NodeFileSystem();
151
+ const shardFiles = [];
152
+ try {
153
+ const entries = await fileSystem.readdir(baseDir);
154
+ for (const entry of entries) {
155
+ if (entry.startsWith("checkpoint-worker-") && entry.endsWith(".json")) {
156
+ shardFiles.push(resolve(baseDir, entry));
157
+ }
158
+ }
159
+ }
160
+ catch {
161
+ // Directory doesn't exist or is not readable
162
+ return [];
163
+ }
164
+ // Sort by worker index (extract numeric part for proper ordering)
165
+ return shardFiles.sort((a, b) => {
166
+ const aMatch = /checkpoint-worker-(\d+)\.json/.exec(a);
167
+ const bMatch = /checkpoint-worker-(\d+)\.json/.exec(b);
168
+ const aIndex = aMatch ? Number.parseInt(aMatch[1], 10) : -1;
169
+ const bIndex = bMatch ? Number.parseInt(bMatch[1], 10) : -1;
170
+ return aIndex - bIndex;
171
+ });
172
+ }
173
+ /**
174
+ * Generate a shard file path for a specific worker.
175
+ *
176
+ * @param baseDir - Base directory for checkpoints
177
+ * @param workerIndex - Worker index (0-based)
178
+ * @returns Path to the shard checkpoint file
179
+ */
180
+ static shardPath(baseDir, workerIndex) {
181
+ return resolve(baseDir, `checkpoint-worker-${String(workerIndex).padStart(2, "0")}.json`);
182
+ }
183
+ }
184
+ /**
185
+ * Git-based checkpoint storage using git notes.
186
+ *
187
+ * Checkpoints are stored as git notes attached to the current HEAD.
188
+ * This provides:
189
+ * - Version control: Checkpoints tracked in git history
190
+ * - Shareability: Team members can access each other's checkpoints
191
+ * - Reproducibility: Linked to specific commits
192
+ * - Safety: No accidental deletion through git clean
193
+ *
194
+ * Each checkpoint is stored as a note with a unique ref based on the namespace.
195
+ */
196
+ export class GitStorage {
197
+ type = "git";
198
+ namespace;
199
+ repoRoot;
200
+ constructor(namespace, repoRoot = process.cwd()) {
201
+ this.namespace = namespace;
202
+ this.repoRoot = repoRoot;
203
+ }
204
+ /**
205
+ * Get the full notes ref for this checkpoint.
206
+ */
207
+ getNotesRef() {
208
+ return `refs/notes/checkpoints/${this.namespace}`;
209
+ }
210
+ /**
211
+ * Check if git is available and we're in a git repo.
212
+ */
213
+ checkGitAvailable() {
214
+ try {
215
+ execSync("git rev-parse --git-dir", {
216
+ cwd: this.repoRoot,
217
+ stdio: "pipe",
218
+ });
219
+ return true;
220
+ }
221
+ catch {
222
+ return false;
223
+ }
224
+ }
225
+ load() {
226
+ if (!this.checkGitAvailable()) {
227
+ console.warn("Git not available, falling back to null checkpoint");
228
+ return null;
229
+ }
230
+ try {
231
+ // Get the note content
232
+ const content = execSync(`git --work-tree="${this.repoRoot}" notes --ref=${this.getNotesRef()} show 2>/dev/null || echo ""`, { encoding: "utf-8", cwd: this.repoRoot });
233
+ if (!content.trim()) {
234
+ return null;
235
+ }
236
+ return JSON.parse(content);
237
+ }
238
+ catch {
239
+ return null;
240
+ }
241
+ }
242
+ async save(data) {
243
+ if (!this.checkGitAvailable()) {
244
+ console.warn("Git not available, skipping checkpoint save");
245
+ return;
246
+ }
247
+ try {
248
+ data.updatedAt = new Date().toISOString();
249
+ // Write to a temp file first
250
+ const temporaryPath = resolve(this.repoRoot, ".git", "checkpoint-tmp.json");
251
+ await writeFile(temporaryPath, JSON.stringify(data, null, 2), "utf-8");
252
+ // Add the note using the temp file
253
+ execSync(`git --work-tree="${this.repoRoot}" notes --ref=${this.getNotesRef()} add -F "${temporaryPath}"`, { stdio: "pipe", cwd: this.repoRoot });
254
+ // Clean up temp file
255
+ await unlink(temporaryPath).catch(() => undefined);
256
+ }
257
+ catch (error) {
258
+ console.warn(`Failed to save git checkpoint: ${String(error)}`);
259
+ throw error;
260
+ }
261
+ }
262
+ delete() {
263
+ if (!this.checkGitAvailable()) {
264
+ return undefined;
265
+ }
266
+ try {
267
+ execSync(`git --work-tree="${this.repoRoot}" notes --ref=${this.getNotesRef()} remove`, {
268
+ stdio: "pipe",
269
+ cwd: this.repoRoot,
270
+ });
271
+ }
272
+ catch {
273
+ // Ignore if note doesn't exist
274
+ }
275
+ return undefined;
276
+ }
277
+ exists() {
278
+ const data = this.load();
279
+ return data !== null;
280
+ }
281
+ /**
282
+ * List all checkpoints for this namespace across git history.
283
+ * Returns a map of commit SHA to checkpoint metadata.
284
+ */
285
+ listHistory() {
286
+ if (!this.checkGitAvailable()) {
287
+ return [];
288
+ }
289
+ try {
290
+ // Get all commits that have notes for this namespace
291
+ const output = execSync(`git --work-tree="${this.repoRoot}" notes --ref=${this.getNotesRef()} list`, { encoding: "utf-8", cwd: this.repoRoot });
292
+ const lines = output.trim().split("\n");
293
+ const results = [];
294
+ for (const line of lines) {
295
+ const [commitSha] = line.split(/\s+/);
296
+ try {
297
+ const content = execSync(`git --work-tree="${this.repoRoot}" notes --ref=${this.getNotesRef()} show ${commitSha}`, { encoding: "utf-8", cwd: this.repoRoot });
298
+ const checkpoint = JSON.parse(content);
299
+ results.push({ commit: commitSha, checkpoint });
300
+ }
301
+ catch {
302
+ // Skip invalid entries
303
+ }
304
+ }
305
+ return results;
306
+ }
307
+ catch {
308
+ return [];
309
+ }
310
+ }
311
+ /**
312
+ * Restore checkpoint from a specific commit.
313
+ * @param commitSha
314
+ */
315
+ restoreFromCommit(commitSha) {
316
+ if (!this.checkGitAvailable()) {
317
+ return null;
318
+ }
319
+ try {
320
+ const content = execSync(`git --work-tree="${this.repoRoot}" notes --ref=${this.getNotesRef()} show ${commitSha}`, { encoding: "utf-8", cwd: this.repoRoot });
321
+ return JSON.parse(content);
322
+ }
323
+ catch {
324
+ return null;
325
+ }
326
+ }
327
+ }
328
+ /**
329
+ * Create a checkpoint storage instance based on mode.
330
+ * @param mode - Storage mode ("file", "git", or "auto")
331
+ * @param pathOrNamespace - File path or git namespace
332
+ * @param repoRoot - Git repository root (for git storage)
333
+ */
334
+ export const createCheckpointStorage = (mode, pathOrNamespace, repoRoot) => {
335
+ const effectiveMode = mode === "auto" ? detectPreferredMode() : mode;
336
+ if (effectiveMode === "git") {
337
+ return new GitStorage(pathOrNamespace, repoRoot);
338
+ }
339
+ return new FileStorage(pathOrNamespace);
340
+ };
341
+ /**
342
+ * Detect preferred checkpoint mode based on environment.
343
+ * Returns "git" if in a git repo with commits, otherwise "file".
344
+ */
345
+ const detectPreferredMode = () => {
346
+ try {
347
+ // Check if we're in a git repo with commits
348
+ execSync("git rev-parse --git-dir > /dev/null 2>&1", { stdio: "pipe" });
349
+ // Check if there are any commits
350
+ try {
351
+ execSync("git rev-parse HEAD > /dev/null 2>&1", { stdio: "pipe" });
352
+ return "git";
353
+ }
354
+ catch {
355
+ // Git repo but no commits yet
356
+ return "file";
357
+ }
358
+ }
359
+ catch {
360
+ // Not a git repo
361
+ return "file";
362
+ }
363
+ };
364
+ /**
365
+ * Get default checkpoint namespace for git storage.
366
+ * Based on results directory path.
367
+ * @param resultsDir
368
+ */
369
+ export const getGitNamespace = (resultsDir) => resultsDir.replace(/[/\\]/g, "-").replace(/^\./, "").replace(/^\/+/, "");
370
+ //# sourceMappingURL=checkpoint-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-storage.js","sourceRoot":"","sources":["../../src/executor/checkpoint-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkD7C;;GAEG;AACH,MAAM,OAAO,cAAc;IAC1B,KAAK,CAAC,QAAQ,CAAC,IAAY;QAC1B,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,OAAe;QAC5C,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,OAA+B;QACxD,MAAM,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACxB,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACxB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACzB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;CACD;AAkBD;;;GAGG;AACH,MAAM,OAAO,YAAY;IAChB,MAAM,GAAG,KAAK,CAAC;IACf,KAAK,GAAmB,EAAE,CAAC;IAEnC,KAAK,CAAC,OAAO;QACZ,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACpC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,OAAO,EAAE,CAAC;YACX,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACV,IAAI,EAAE,CAAC;QACR,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACrB,CAAC;IACF,CAAC;CACD;AAuCD;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACd,IAAI,GAAG,MAAM,CAAC;IACN,IAAI,CAAS;IACb,EAAE,CAAa;IAEhC,YAAY,IAAY,EAAE,EAAe;QACxC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,cAAc,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI;QACT,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAoB;QAC9B,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,gCAAgC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5E,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM;QACX,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACR,+BAA+B;QAChC,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM;QACX,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,IAAI,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,OAAO;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,EAAe;QACvD,MAAM,UAAU,GAAG,EAAE,IAAI,IAAI,cAAc,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC1C,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,6CAA6C;YAC7C,OAAO,EAAE,CAAC;QACX,CAAC;QAED,kEAAkE;QAClE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC/B,MAAM,MAAM,GAAG,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,OAAO,MAAM,GAAG,MAAM,CAAC;QACxB,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,CAAC,OAAe,EAAE,WAAmB;QACpD,OAAO,OAAO,CAAC,OAAO,EAAE,qBAAqB,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3F,CAAC;CACD;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,UAAU;IACb,IAAI,GAAG,KAAK,CAAC;IACL,SAAS,CAAS;IAClB,QAAQ,CAAS;IAElC,YAAY,SAAiB,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QACtD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,WAAW;QAClB,OAAO,0BAA0B,IAAI,CAAC,SAAS,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,iBAAiB;QACxB,IAAI,CAAC;YACJ,QAAQ,CAAC,yBAAyB,EAAE;gBACnC,GAAG,EAAE,IAAI,CAAC,QAAQ;gBAClB,KAAK,EAAE,MAAM;aACb,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,IAAI;QACH,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IAAI,CAAC;YACJ,uBAAuB;YACvB,MAAM,OAAO,GAAG,QAAQ,CACvB,oBAAoB,IAAI,CAAC,QAAQ,iBAAiB,IAAI,CAAC,WAAW,EAAE,8BAA8B,EAClG,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CACzC,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YACb,CAAC;YAED,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAoB;QAC9B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC5D,OAAO;QACR,CAAC;QAED,IAAI,CAAC;YACJ,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAE1C,6BAA6B;YAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC;YAC5E,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAEvE,mCAAmC;YACnC,QAAQ,CACP,oBAAoB,IAAI,CAAC,QAAQ,iBAAiB,IAAI,CAAC,WAAW,EAAE,YAAY,aAAa,GAAG,EAChG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CACrC,CAAC;YAEF,qBAAqB;YACrB,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChE,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAED,MAAM;QACL,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC/B,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACJ,QAAQ,CAAC,oBAAoB,IAAI,CAAC,QAAQ,iBAAiB,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE;gBACvF,KAAK,EAAE,MAAM;gBACb,GAAG,EAAE,IAAI,CAAC,QAAQ;aAClB,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACR,+BAA+B;QAChC,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,IAAI,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,WAAW;QACV,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACX,CAAC;QAED,IAAI,CAAC;YACJ,qDAAqD;YACrD,MAAM,MAAM,GAAG,QAAQ,CACtB,oBAAoB,IAAI,CAAC,QAAQ,iBAAiB,IAAI,CAAC,WAAW,EAAE,OAAO,EAC3E,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CACzC,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,OAAO,GAAqD,EAAE,CAAC;YAErE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC1B,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC;oBACJ,MAAM,OAAO,GAAG,QAAQ,CACvB,oBAAoB,IAAI,CAAC,QAAQ,iBAAiB,IAAI,CAAC,WAAW,EAAE,SAAS,SAAS,EAAE,EACxF,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CACzC,CAAC;oBACF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;oBACzD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;gBACjD,CAAC;gBAAC,MAAM,CAAC;oBACR,uBAAuB;gBACxB,CAAC;YACF,CAAC;YAED,OAAO,OAAO,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,iBAAiB,CAAC,SAAiB;QAClC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,QAAQ,CACvB,oBAAoB,IAAI,CAAC,QAAQ,iBAAiB,IAAI,CAAC,WAAW,EAAE,SAAS,SAAS,EAAE,EACxF,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CACzC,CAAC;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACtC,IAAoB,EACpB,eAAuB,EACvB,QAAiB,EACG,EAAE;IACtB,MAAM,aAAa,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAErE,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QAC7B,OAAO,IAAI,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,WAAW,CAAC,eAAe,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,mBAAmB,GAAG,GAAmB,EAAE;IAChD,IAAI,CAAC;QACJ,4CAA4C;QAC5C,QAAQ,CAAC,0CAA0C,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAExE,iCAAiC;QACjC,IAAI,CAAC;YACJ,QAAQ,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACnE,OAAO,KAAK,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACR,8BAA8B;YAC9B,OAAO,MAAM,CAAC;QACf,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,iBAAiB;QACjB,OAAO,MAAM,CAAC;IACf,CAAC;AACF,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAU,EAAE,CAC7D,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Checkpoint Types
3
+ *
4
+ * Central type definitions for the checkpoint system.
5
+ * Separated from implementation files for clarity and testability.
6
+ */
7
+ import type { CheckpointStorage, Lock } from "./checkpoint-storage.js";
8
+ /**
9
+ * Checkpoint manager configuration options.
10
+ */
11
+ export interface CheckpointConfig {
12
+ /** Storage backend for checkpoint data */
13
+ storage: CheckpointStorage;
14
+ /** Concurrency lock for checkpoint saves */
15
+ lock?: Lock;
16
+ /** Worker identity for sharded mode */
17
+ workerIndex?: number;
18
+ /** Total number of workers in sharded mode */
19
+ totalWorkers?: number;
20
+ /** Base checkpoint path (for sharding) */
21
+ basePath?: string;
22
+ }
23
+ /**
24
+ * Worker identity for sharded checkpoint execution.
25
+ */
26
+ export interface WorkerIdentity {
27
+ /** Index of this worker (0-based) */
28
+ index: number;
29
+ /** Total number of workers */
30
+ total: number;
31
+ /** Human-readable name */
32
+ name: string;
33
+ }
34
+ /**
35
+ * Checkpoint shard information.
36
+ */
37
+ export interface CheckpointShard {
38
+ /** Path to this shard's checkpoint file */
39
+ path: string;
40
+ /** Worker index that owns this shard */
41
+ workerIndex: number;
42
+ /** Number of completed runs in this shard */
43
+ completedCount: number;
44
+ /** Whether this shard exists and is valid */
45
+ valid: boolean;
46
+ }
47
+ export { type Lock } from "./checkpoint-storage.js";
48
+ //# sourceMappingURL=checkpoint-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-types.d.ts","sourceRoot":"","sources":["../../src/executor/checkpoint-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAIvE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,0CAA0C;IAC1C,OAAO,EAAE,iBAAiB,CAAC;IAE3B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IAEd,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IAEd,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IAEb,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IAEpB,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IAEvB,6CAA6C;IAC7C,KAAK,EAAE,OAAO,CAAC;CACf;AAED,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Checkpoint Types
3
+ *
4
+ * Central type definitions for the checkpoint system.
5
+ * Separated from implementation files for clarity and testability.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=checkpoint-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-types.js","sourceRoot":"","sources":["../../src/executor/checkpoint-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Experiment Executor
3
+ *
4
+ * Orchestrates experiment execution across SUTs and cases.
5
+ * Handles error isolation, progress reporting, and result collection.
6
+ */
7
+ import type { CaseDefinition } from "../types/case.js";
8
+ import type { EvaluationResult } from "../types/result.js";
9
+ import type { SutDefinition } from "../types/sut.js";
10
+ /**
11
+ * Configuration for experiment execution.
12
+ */
13
+ export interface ExecutorConfig {
14
+ /** Continue execution if a single run fails */
15
+ continueOnError: boolean;
16
+ /** Number of repetitions per case (for statistical analysis) */
17
+ repetitions: number;
18
+ /** Random seed base (incremented per repetition) */
19
+ seedBase: number;
20
+ /** Timeout per run in milliseconds (0 = no timeout) */
21
+ timeoutMs: number;
22
+ /** Whether to collect provenance information */
23
+ collectProvenance: boolean;
24
+ /** Number of concurrent runs (1 = sequential) */
25
+ concurrency?: number;
26
+ /** Progress callback */
27
+ onProgress?: (progress: ExecutionProgress) => void;
28
+ /** Per-run callback (can be async) */
29
+ onResult?: (result: EvaluationResult) => void | Promise<void>;
30
+ /** Enable memory monitoring (default: true) */
31
+ monitorMemory?: boolean;
32
+ /** Memory warning threshold in MB (default: 1024) */
33
+ memoryWarningThresholdMb?: number;
34
+ /** Memory critical threshold in MB (default: 2048) */
35
+ memoryCriticalThresholdMb?: number;
36
+ /** Abort execution at critical memory level (default: false) */
37
+ abortOnMemoryCritical?: boolean;
38
+ }
39
+ /**
40
+ * Default executor configuration.
41
+ */
42
+ export declare const DEFAULT_EXECUTOR_CONFIG: ExecutorConfig;
43
+ /**
44
+ * Execution progress report.
45
+ */
46
+ export interface ExecutionProgress {
47
+ /** Total planned runs */
48
+ total: number;
49
+ /** Completed runs */
50
+ completed: number;
51
+ /** Failed runs */
52
+ failed: number;
53
+ /** Current SUT */
54
+ currentSut?: string;
55
+ /** Current case */
56
+ currentCase?: string;
57
+ /** Current repetition */
58
+ currentRepetition?: number;
59
+ /** Elapsed time in milliseconds */
60
+ elapsedMs: number;
61
+ }
62
+ /**
63
+ * Execution summary returned after completion.
64
+ */
65
+ export interface ExecutionSummary {
66
+ /** Total runs attempted */
67
+ totalRuns: number;
68
+ /** Successful runs */
69
+ successfulRuns: number;
70
+ /** Failed runs */
71
+ failedRuns: number;
72
+ /** Total elapsed time */
73
+ elapsedMs: number;
74
+ /** Results collected */
75
+ results: EvaluationResult[];
76
+ /** Errors encountered */
77
+ errors: {
78
+ runId: string;
79
+ error: string;
80
+ }[];
81
+ }
82
+ /**
83
+ * Execution plan for a single run.
84
+ */
85
+ export interface PlannedRun {
86
+ /** Deterministic run ID */
87
+ runId: string;
88
+ /** SUT to execute */
89
+ sutId: string;
90
+ /** Case to run against */
91
+ caseId: string;
92
+ /** Repetition number */
93
+ repetition: number;
94
+ /** Random seed */
95
+ seed: number;
96
+ /** Configuration overrides */
97
+ config?: Record<string, unknown>;
98
+ }
99
+ /**
100
+ * Experiment executor.
101
+ *
102
+ * @template TInput - The resource type (e.g., Graph, Dataset)
103
+ * @template TInputs - The algorithm inputs type
104
+ * @template TResult - The algorithm result type
105
+ */
106
+ export declare class Executor<TInput = unknown, TInputs = unknown, TResult = unknown> {
107
+ private readonly config;
108
+ private readonly inputCache;
109
+ private readonly memoryMonitor?;
110
+ constructor(config?: Partial<ExecutorConfig>);
111
+ /**
112
+ * Plan execution runs without executing.
113
+ *
114
+ * @param suts - SUTs to execute
115
+ * @param cases - Cases to run against
116
+ * @returns Array of planned runs
117
+ */
118
+ plan(suts: SutDefinition<TInputs, TResult>[], cases: CaseDefinition<TInput, TInputs>[]): PlannedRun[];
119
+ /**
120
+ * Execute all planned runs.
121
+ *
122
+ * @param suts - SUTs to execute
123
+ * @param cases - Cases to run against
124
+ * @param metricsExtractor - Function to extract metrics from result
125
+ * @param plannedRuns - Optional pre-filtered planned runs (for parallel workers)
126
+ * @returns Execution summary with all results
127
+ */
128
+ execute(suts: SutDefinition<TInputs, TResult>[], cases: CaseDefinition<TInput, TInputs>[], metricsExtractor: (result: TResult) => Record<string, number>, plannedRuns?: PlannedRun[]): Promise<ExecutionSummary>;
129
+ /**
130
+ * Execute runs sequentially (original behavior).
131
+ * @param plannedRuns
132
+ * @param sutMap
133
+ * @param caseMap
134
+ * @param metricsExtractor
135
+ * @param startTime
136
+ * @internal
137
+ */
138
+ private executeSequential;
139
+ /**
140
+ * Execute runs in parallel with a concurrency limit.
141
+ * @param plannedRuns
142
+ * @param sutMap
143
+ * @param caseMap
144
+ * @param metricsExtractor
145
+ * @param startTime
146
+ * @param concurrency
147
+ * @internal
148
+ */
149
+ private executeParallel;
150
+ /**
151
+ * Execute a single run.
152
+ * @param run
153
+ * @param sutDef
154
+ * @param caseDef
155
+ * @param metricsExtractor
156
+ */
157
+ private executeRun;
158
+ }
159
+ /**
160
+ * Create a default executor with standard configuration.
161
+ * @param config
162
+ */
163
+ export declare const createExecutor: <TInput = unknown, TInputs = unknown, TResult = unknown>(config?: Partial<ExecutorConfig>) => Executor<TInput, TInputs, TResult>;
164
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAqB,gBAAgB,EAAc,MAAM,oBAAoB,CAAC;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,+CAA+C;IAC/C,eAAe,EAAE,OAAO,CAAC;IAEzB,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IAEjB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAElB,gDAAgD;IAChD,iBAAiB,EAAE,OAAO,CAAC;IAE3B,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAEnD,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D,+CAA+C;IAC/C,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,qDAAqD;IACrD,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,sDAAsD;IACtD,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC,gEAAgE;IAChE,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAMrC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IAEd,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAElB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IAEf,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,yBAAyB;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAElB,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IAEvB,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IAEnB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAElB,wBAAwB;IACxB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAE5B,yBAAyB;IACzB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IAEd,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IAEd,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IAEf,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IAEnB,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAwCD;;;;;;GAMG;AACH,qBAAa,QAAQ,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IAC3E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAgB;gBAEnC,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAyBhD;;;;;;OAMG;IACH,IAAI,CACH,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EACvC,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACtC,UAAU,EAAE;IA4Bf;;;;;;;;OAQG;IACG,OAAO,CACZ,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EACvC,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7D,WAAW,CAAC,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,gBAAgB,CAAC;IAgC5B;;;;;;;;OAQG;YACW,iBAAiB;IAqE/B;;;;;;;;;OASG;YACW,eAAe;IAwG7B;;;;;;OAMG;YACW,UAAU;CAkHxB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACpF,SAAS,OAAO,CAAC,cAAc,CAAC,KAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAyB,CAAC"}