@eldrforge/kodrdriv 1.2.23 → 1.2.25
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/PARALLEL-EXECUTION-FIXES.md +132 -0
- package/PARALLEL_EXECUTION_FIX.md +146 -0
- package/RECOVERY-FIXES.md +72 -0
- package/SUBMODULE-LOCK-FIX.md +132 -0
- package/dist/arguments.js +26 -3
- package/dist/arguments.js.map +1 -1
- package/dist/commands/audio-commit.js +3 -3
- package/dist/commands/audio-commit.js.map +1 -1
- package/dist/commands/audio-review.js +13 -13
- package/dist/commands/audio-review.js.map +1 -1
- package/dist/commands/link.js +13 -13
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/publish.js +200 -146
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/review.js +6 -6
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/select-audio.js +4 -4
- package/dist/commands/select-audio.js.map +1 -1
- package/dist/commands/tree.js +242 -318
- package/dist/commands/tree.js.map +1 -1
- package/dist/commands/unlink.js +8 -8
- package/dist/commands/unlink.js.map +1 -1
- package/dist/commands/versions.js +3 -3
- package/dist/commands/versions.js.map +1 -1
- package/dist/constants.js +4 -4
- package/dist/constants.js.map +1 -1
- package/dist/content/diff.js +5 -2
- package/dist/content/diff.js.map +1 -1
- package/dist/content/files.js +4 -4
- package/dist/content/files.js.map +1 -1
- package/dist/execution/CommandValidator.js +160 -0
- package/dist/execution/CommandValidator.js.map +1 -0
- package/dist/execution/DependencyChecker.js +102 -0
- package/dist/execution/DependencyChecker.js.map +1 -0
- package/dist/execution/DynamicTaskPool.js +455 -0
- package/dist/execution/DynamicTaskPool.js.map +1 -0
- package/dist/execution/RecoveryManager.js +502 -0
- package/dist/execution/RecoveryManager.js.map +1 -0
- package/dist/execution/ResourceMonitor.js +125 -0
- package/dist/execution/ResourceMonitor.js.map +1 -0
- package/dist/execution/Scheduler.js +98 -0
- package/dist/execution/Scheduler.js.map +1 -0
- package/dist/execution/TreeExecutionAdapter.js +170 -0
- package/dist/execution/TreeExecutionAdapter.js.map +1 -0
- package/dist/logging.js +3 -3
- package/dist/logging.js.map +1 -1
- package/dist/ui/ProgressFormatter.js +230 -0
- package/dist/ui/ProgressFormatter.js.map +1 -0
- package/dist/util/checkpointManager.js +168 -0
- package/dist/util/checkpointManager.js.map +1 -0
- package/dist/util/dependencyGraph.js +224 -0
- package/dist/util/dependencyGraph.js.map +1 -0
- package/dist/util/fileLock.js +241 -0
- package/dist/util/fileLock.js.map +1 -0
- package/dist/util/general.js +5 -5
- package/dist/util/general.js.map +1 -1
- package/dist/util/gitMutex.js +116 -0
- package/dist/util/gitMutex.js.map +1 -0
- package/dist/util/mutex.js +96 -0
- package/dist/util/mutex.js.map +1 -0
- package/dist/util/performance.js +4 -4
- package/dist/util/performance.js.map +1 -1
- package/dist/util/safety.js +4 -4
- package/dist/util/safety.js.map +1 -1
- package/dist/util/storage.js +2 -2
- package/dist/util/storage.js.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import { getLogger } from '../logging.js';
|
|
4
|
+
import { findAllDependents } from '../util/dependencyGraph.js';
|
|
5
|
+
import { CheckpointManager } from '../util/checkpointManager.js';
|
|
6
|
+
import { DependencyChecker } from './DependencyChecker.js';
|
|
7
|
+
import { ResourceMonitor } from './ResourceMonitor.js';
|
|
8
|
+
import { Scheduler } from './Scheduler.js';
|
|
9
|
+
|
|
10
|
+
function _define_property(obj, key, value) {
|
|
11
|
+
if (key in obj) {
|
|
12
|
+
Object.defineProperty(obj, key, {
|
|
13
|
+
value: value,
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true
|
|
17
|
+
});
|
|
18
|
+
} else {
|
|
19
|
+
obj[key] = value;
|
|
20
|
+
}
|
|
21
|
+
return obj;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* DynamicTaskPool manages parallel execution of packages with dependency awareness
|
|
25
|
+
*/ class DynamicTaskPool extends EventEmitter {
|
|
26
|
+
/**
|
|
27
|
+
* Main execution entry point
|
|
28
|
+
*/ async execute() {
|
|
29
|
+
this.logger.info(`Starting parallel execution with max concurrency: ${this.config.maxConcurrency}`);
|
|
30
|
+
this.emit('execution:started', {
|
|
31
|
+
totalPackages: this.graph.packages.size
|
|
32
|
+
});
|
|
33
|
+
try {
|
|
34
|
+
// Load checkpoint if continuing
|
|
35
|
+
if (this.config.continue) {
|
|
36
|
+
await this.loadCheckpoint();
|
|
37
|
+
}
|
|
38
|
+
// Initialize ready queue
|
|
39
|
+
this.updateReadyQueue();
|
|
40
|
+
// Main execution loop
|
|
41
|
+
while(!this.isComplete()){
|
|
42
|
+
// Schedule as many packages as we can
|
|
43
|
+
const availableSlots = this.resourceMonitor.getAvailableSlots();
|
|
44
|
+
if (availableSlots > 0 && this.state.ready.length > 0) {
|
|
45
|
+
const toSchedule = this.scheduler.getNext(availableSlots, this.state);
|
|
46
|
+
for (const packageName of toSchedule){
|
|
47
|
+
await this.schedulePackage(packageName);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Check if we're stuck
|
|
51
|
+
if (this.runningTasks.size === 0) {
|
|
52
|
+
if (this.state.ready.length > 0) {
|
|
53
|
+
throw new Error('Deadlock detected: packages ready but cannot execute');
|
|
54
|
+
}
|
|
55
|
+
break; // No more work to do
|
|
56
|
+
}
|
|
57
|
+
// Wait for next package to complete
|
|
58
|
+
const completedTask = await this.waitForNext();
|
|
59
|
+
await this.handleTaskCompletion(completedTask);
|
|
60
|
+
// Update ready queue
|
|
61
|
+
this.updateReadyQueue();
|
|
62
|
+
// Save checkpoint periodically
|
|
63
|
+
if (this.shouldCheckpoint()) {
|
|
64
|
+
await this.saveCheckpoint();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Final checkpoint and cleanup
|
|
68
|
+
// Only cleanup if everything completed (no failures, no skipped packages)
|
|
69
|
+
const allCompleted = this.state.failed.length === 0 && this.state.skipped.length === 0;
|
|
70
|
+
if (allCompleted) {
|
|
71
|
+
await this.checkpointManager.cleanup();
|
|
72
|
+
} else {
|
|
73
|
+
await this.saveCheckpoint();
|
|
74
|
+
}
|
|
75
|
+
// Build and return result
|
|
76
|
+
const result = this.buildExecutionResult();
|
|
77
|
+
this.emit('execution:completed', {
|
|
78
|
+
result
|
|
79
|
+
});
|
|
80
|
+
return result;
|
|
81
|
+
} catch (error) {
|
|
82
|
+
// Save checkpoint on error
|
|
83
|
+
await this.saveCheckpoint();
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Initialize execution state
|
|
89
|
+
*/ initializeState() {
|
|
90
|
+
const buildOrder = Array.from(this.graph.packages.keys());
|
|
91
|
+
return {
|
|
92
|
+
pending: [
|
|
93
|
+
...buildOrder
|
|
94
|
+
],
|
|
95
|
+
ready: [],
|
|
96
|
+
running: [],
|
|
97
|
+
completed: [],
|
|
98
|
+
failed: [],
|
|
99
|
+
skipped: []
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Schedule a package for execution
|
|
104
|
+
*/ async schedulePackage(packageName) {
|
|
105
|
+
// Move from ready to running
|
|
106
|
+
this.state.ready = this.state.ready.filter((p)=>p !== packageName);
|
|
107
|
+
// Allocate resource
|
|
108
|
+
if (!this.resourceMonitor.allocate()) {
|
|
109
|
+
throw new Error(`Failed to allocate resource for ${packageName}`);
|
|
110
|
+
}
|
|
111
|
+
// Record start time
|
|
112
|
+
this.packageStartTimes.set(packageName, new Date());
|
|
113
|
+
// Create abort controller
|
|
114
|
+
const controller = new AbortController();
|
|
115
|
+
// Start execution
|
|
116
|
+
const promise = this.executePackage(packageName, controller.signal);
|
|
117
|
+
// Track running task
|
|
118
|
+
const task = {
|
|
119
|
+
packageName,
|
|
120
|
+
startTime: new Date(),
|
|
121
|
+
promise,
|
|
122
|
+
controller
|
|
123
|
+
};
|
|
124
|
+
this.runningTasks.set(packageName, task);
|
|
125
|
+
// Update state
|
|
126
|
+
this.state.running.push({
|
|
127
|
+
name: packageName,
|
|
128
|
+
startTime: task.startTime.toISOString(),
|
|
129
|
+
elapsedTime: 0
|
|
130
|
+
});
|
|
131
|
+
// Emit event
|
|
132
|
+
this.emit('package:started', {
|
|
133
|
+
packageName
|
|
134
|
+
});
|
|
135
|
+
this.logger.verbose(`Scheduled ${packageName} (${this.runningTasks.size}/${this.config.maxConcurrency} slots used)`);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Execute a single package (placeholder - will be overridden or use callback)
|
|
139
|
+
*/ async executePackage(_packageName, _signal) {
|
|
140
|
+
// This is a placeholder that will be replaced with actual execution logic
|
|
141
|
+
// In the real implementation, this would call the tree.ts executePackage function
|
|
142
|
+
throw new Error('executePackage must be implemented');
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Wait for next task to complete
|
|
146
|
+
*/ async waitForNext() {
|
|
147
|
+
const runningTasks = Array.from(this.runningTasks.entries());
|
|
148
|
+
const promises = runningTasks.map(([name, task])=>task.promise.then((result)=>({
|
|
149
|
+
packageName: name,
|
|
150
|
+
result,
|
|
151
|
+
error: null
|
|
152
|
+
})).catch((error)=>({
|
|
153
|
+
packageName: name,
|
|
154
|
+
result: null,
|
|
155
|
+
error
|
|
156
|
+
})));
|
|
157
|
+
return await Promise.race(promises);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Handle task completion
|
|
161
|
+
*/ async handleTaskCompletion(task) {
|
|
162
|
+
const { packageName, result, error } = task;
|
|
163
|
+
// Remove from running
|
|
164
|
+
this.runningTasks.delete(packageName);
|
|
165
|
+
this.state.running = this.state.running.filter((r)=>r.name !== packageName);
|
|
166
|
+
this.resourceMonitor.release();
|
|
167
|
+
// Record timing
|
|
168
|
+
const endTime = new Date();
|
|
169
|
+
this.packageEndTimes.set(packageName, endTime);
|
|
170
|
+
const startTime = this.packageStartTimes.get(packageName);
|
|
171
|
+
const duration = endTime.getTime() - startTime.getTime();
|
|
172
|
+
this.packageDurations.set(packageName, duration);
|
|
173
|
+
if (error) {
|
|
174
|
+
await this.handleFailure(packageName, error);
|
|
175
|
+
} else {
|
|
176
|
+
await this.handleSuccess(packageName, result);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Handle successful package completion
|
|
181
|
+
*/ async handleSuccess(packageName, result) {
|
|
182
|
+
this.state.completed.push(packageName);
|
|
183
|
+
const duration = this.packageDurations.get(packageName);
|
|
184
|
+
this.logger.info(`✓ ${packageName} completed successfully (${this.formatDuration(duration)})`);
|
|
185
|
+
this.emit('package:completed', {
|
|
186
|
+
packageName,
|
|
187
|
+
result
|
|
188
|
+
});
|
|
189
|
+
// Track published version if applicable
|
|
190
|
+
if (result.publishedVersion) {
|
|
191
|
+
this.publishedVersions.push({
|
|
192
|
+
name: packageName,
|
|
193
|
+
version: result.publishedVersion,
|
|
194
|
+
time: new Date()
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Handle package failure
|
|
200
|
+
*/ async handleFailure(packageName, error) {
|
|
201
|
+
const attemptNumber = (this.retryAttempts.get(packageName) || 0) + 1;
|
|
202
|
+
this.retryAttempts.set(packageName, attemptNumber);
|
|
203
|
+
const isRetriable = this.isRetriableError(error);
|
|
204
|
+
const maxRetries = this.config.maxRetries || 3;
|
|
205
|
+
const canRetry = isRetriable && attemptNumber < maxRetries;
|
|
206
|
+
if (canRetry) {
|
|
207
|
+
// Schedule retry
|
|
208
|
+
this.logger.warn(`⟳ ${packageName} failed (attempt ${attemptNumber}/${maxRetries}), will retry`);
|
|
209
|
+
this.state.pending.push(packageName);
|
|
210
|
+
this.emit('package:retrying', {
|
|
211
|
+
packageName,
|
|
212
|
+
attemptNumber
|
|
213
|
+
});
|
|
214
|
+
// Apply backoff delay
|
|
215
|
+
const delay = this.calculateRetryDelay(attemptNumber);
|
|
216
|
+
await new Promise((resolve)=>setTimeout(resolve, delay));
|
|
217
|
+
} else {
|
|
218
|
+
// Permanent failure
|
|
219
|
+
const dependencies = Array.from(this.graph.edges.get(packageName) || []);
|
|
220
|
+
const dependents = Array.from(findAllDependents(packageName, this.graph));
|
|
221
|
+
const failureInfo = {
|
|
222
|
+
name: packageName,
|
|
223
|
+
error: error.message,
|
|
224
|
+
stack: error.stack,
|
|
225
|
+
isRetriable,
|
|
226
|
+
attemptNumber,
|
|
227
|
+
failedAt: new Date().toISOString(),
|
|
228
|
+
dependencies,
|
|
229
|
+
dependents
|
|
230
|
+
};
|
|
231
|
+
this.state.failed.push(failureInfo);
|
|
232
|
+
this.logger.error(`✗ ${packageName} failed permanently: ${error.message}`);
|
|
233
|
+
this.emit('package:failed', {
|
|
234
|
+
packageName,
|
|
235
|
+
error
|
|
236
|
+
});
|
|
237
|
+
// Cascade failure to dependents
|
|
238
|
+
await this.cascadeFailure(packageName);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Cascade failure to dependent packages
|
|
243
|
+
*/ async cascadeFailure(failedPackage) {
|
|
244
|
+
const toSkip = findAllDependents(failedPackage, this.graph);
|
|
245
|
+
for (const dependent of toSkip){
|
|
246
|
+
// Remove from pending/ready
|
|
247
|
+
this.state.pending = this.state.pending.filter((p)=>p !== dependent);
|
|
248
|
+
this.state.ready = this.state.ready.filter((p)=>p !== dependent);
|
|
249
|
+
// Add to skipped
|
|
250
|
+
if (!this.state.skipped.includes(dependent)) {
|
|
251
|
+
this.state.skipped.push(dependent);
|
|
252
|
+
this.logger.warn(`⊘ Skipping ${dependent} (depends on failed ${failedPackage})`);
|
|
253
|
+
this.emit('package:skipped', {
|
|
254
|
+
packageName: dependent,
|
|
255
|
+
reason: `Depends on failed ${failedPackage}`
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Update ready queue
|
|
262
|
+
*/ updateReadyQueue() {
|
|
263
|
+
const nowReady = [];
|
|
264
|
+
for (const packageName of this.state.pending){
|
|
265
|
+
if (this.dependencyChecker.isReady(packageName, this.state)) {
|
|
266
|
+
nowReady.push(packageName);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
for (const packageName of nowReady){
|
|
270
|
+
this.state.pending = this.state.pending.filter((p)=>p !== packageName);
|
|
271
|
+
this.state.ready.push(packageName);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Check if execution is complete
|
|
276
|
+
*/ isComplete() {
|
|
277
|
+
return this.state.pending.length === 0 && this.state.ready.length === 0 && this.runningTasks.size === 0;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Determine if should save checkpoint
|
|
281
|
+
*/ shouldCheckpoint() {
|
|
282
|
+
// Checkpoint after each completion for now
|
|
283
|
+
// Could be optimized to checkpoint less frequently
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Save checkpoint
|
|
288
|
+
*/ async saveCheckpoint() {
|
|
289
|
+
const checkpoint = {
|
|
290
|
+
version: '1.0.0',
|
|
291
|
+
executionId: this.executionId,
|
|
292
|
+
createdAt: this.startTime.toISOString(),
|
|
293
|
+
lastUpdated: new Date().toISOString(),
|
|
294
|
+
command: this.config.command,
|
|
295
|
+
originalConfig: this.config.config,
|
|
296
|
+
dependencyGraph: {
|
|
297
|
+
packages: Array.from(this.graph.packages.values()).map((pkg)=>({
|
|
298
|
+
name: pkg.name,
|
|
299
|
+
version: pkg.version,
|
|
300
|
+
path: pkg.path,
|
|
301
|
+
dependencies: Array.from(pkg.dependencies)
|
|
302
|
+
})),
|
|
303
|
+
edges: Array.from(this.graph.edges.entries()).map(([pkg, deps])=>[
|
|
304
|
+
pkg,
|
|
305
|
+
Array.from(deps)
|
|
306
|
+
])
|
|
307
|
+
},
|
|
308
|
+
buildOrder: [
|
|
309
|
+
...this.state.pending,
|
|
310
|
+
...this.state.ready,
|
|
311
|
+
...this.state.running.map((r)=>r.name),
|
|
312
|
+
...this.state.completed,
|
|
313
|
+
...this.state.failed.map((f)=>f.name),
|
|
314
|
+
...this.state.skipped
|
|
315
|
+
],
|
|
316
|
+
executionMode: 'parallel',
|
|
317
|
+
maxConcurrency: this.config.maxConcurrency,
|
|
318
|
+
state: this.state,
|
|
319
|
+
publishedVersions: this.publishedVersions.map((pv)=>({
|
|
320
|
+
packageName: pv.name,
|
|
321
|
+
version: pv.version,
|
|
322
|
+
publishTime: pv.time.toISOString()
|
|
323
|
+
})),
|
|
324
|
+
retryAttempts: Object.fromEntries(this.retryAttempts),
|
|
325
|
+
lastRetryTime: {},
|
|
326
|
+
packageStartTimes: Object.fromEntries(Array.from(this.packageStartTimes.entries()).map(([k, v])=>[
|
|
327
|
+
k,
|
|
328
|
+
v.toISOString()
|
|
329
|
+
])),
|
|
330
|
+
packageEndTimes: Object.fromEntries(Array.from(this.packageEndTimes.entries()).map(([k, v])=>[
|
|
331
|
+
k,
|
|
332
|
+
v.toISOString()
|
|
333
|
+
])),
|
|
334
|
+
packageDurations: Object.fromEntries(this.packageDurations),
|
|
335
|
+
totalStartTime: this.startTime.toISOString(),
|
|
336
|
+
recoveryHints: [],
|
|
337
|
+
canRecover: true
|
|
338
|
+
};
|
|
339
|
+
await this.checkpointManager.save(checkpoint);
|
|
340
|
+
this.emit('checkpoint:saved', {
|
|
341
|
+
timestamp: new Date()
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Load checkpoint
|
|
346
|
+
*/ async loadCheckpoint() {
|
|
347
|
+
const checkpoint = await this.checkpointManager.load();
|
|
348
|
+
if (!checkpoint) {
|
|
349
|
+
this.logger.warn('No checkpoint found, starting fresh');
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
this.logger.info('Loading checkpoint...');
|
|
353
|
+
this.logger.info(`Execution ID: ${checkpoint.executionId}`);
|
|
354
|
+
this.logger.info(`Completed: ${checkpoint.state.completed.length} packages`);
|
|
355
|
+
this.logger.info(`Failed: ${checkpoint.state.failed.length} packages`);
|
|
356
|
+
// Restore state
|
|
357
|
+
this.executionId = checkpoint.executionId;
|
|
358
|
+
this.startTime = new Date(checkpoint.totalStartTime);
|
|
359
|
+
this.state = checkpoint.state;
|
|
360
|
+
// Restore timing data
|
|
361
|
+
for (const [pkg, time] of Object.entries(checkpoint.packageStartTimes)){
|
|
362
|
+
this.packageStartTimes.set(pkg, new Date(time));
|
|
363
|
+
}
|
|
364
|
+
for (const [pkg, time] of Object.entries(checkpoint.packageEndTimes)){
|
|
365
|
+
this.packageEndTimes.set(pkg, new Date(time));
|
|
366
|
+
}
|
|
367
|
+
for (const [pkg, duration] of Object.entries(checkpoint.packageDurations)){
|
|
368
|
+
this.packageDurations.set(pkg, duration);
|
|
369
|
+
}
|
|
370
|
+
// Restore retry attempts
|
|
371
|
+
for (const [pkg, attempts] of Object.entries(checkpoint.retryAttempts)){
|
|
372
|
+
this.retryAttempts.set(pkg, attempts);
|
|
373
|
+
}
|
|
374
|
+
// Clear running state (cannot resume mid-execution)
|
|
375
|
+
for (const running of this.state.running){
|
|
376
|
+
this.state.pending.push(running.name);
|
|
377
|
+
}
|
|
378
|
+
this.state.running = [];
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Build execution result
|
|
382
|
+
*/ buildExecutionResult() {
|
|
383
|
+
const totalDuration = Date.now() - this.startTime.getTime();
|
|
384
|
+
const completedDurations = Array.from(this.packageDurations.values());
|
|
385
|
+
const averageDuration = completedDurations.length > 0 ? completedDurations.reduce((a, b)=>a + b, 0) / completedDurations.length : 0;
|
|
386
|
+
const metrics = {
|
|
387
|
+
totalDuration,
|
|
388
|
+
averagePackageDuration: averageDuration,
|
|
389
|
+
peakConcurrency: this.resourceMonitor.getMetrics().peakConcurrency,
|
|
390
|
+
averageConcurrency: this.resourceMonitor.getMetrics().averageConcurrency
|
|
391
|
+
};
|
|
392
|
+
return {
|
|
393
|
+
success: this.state.failed.length === 0,
|
|
394
|
+
totalPackages: this.graph.packages.size,
|
|
395
|
+
completed: this.state.completed,
|
|
396
|
+
failed: this.state.failed,
|
|
397
|
+
skipped: this.state.skipped,
|
|
398
|
+
metrics
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Check if error is retriable
|
|
403
|
+
*/ isRetriableError(error) {
|
|
404
|
+
const retriablePatterns = [
|
|
405
|
+
/ETIMEDOUT/i,
|
|
406
|
+
/ECONNRESET/i,
|
|
407
|
+
/ENOTFOUND/i,
|
|
408
|
+
/rate limit/i,
|
|
409
|
+
/temporary failure/i,
|
|
410
|
+
/try again/i,
|
|
411
|
+
/gateway timeout/i,
|
|
412
|
+
/service unavailable/i
|
|
413
|
+
];
|
|
414
|
+
return retriablePatterns.some((pattern)=>pattern.test(error.message || String(error)));
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Calculate retry delay with exponential backoff
|
|
418
|
+
*/ calculateRetryDelay(attemptNumber) {
|
|
419
|
+
const initialDelay = this.config.initialRetryDelay || 5000;
|
|
420
|
+
const maxDelay = this.config.maxRetryDelay || 60000;
|
|
421
|
+
const multiplier = this.config.backoffMultiplier || 2;
|
|
422
|
+
const delay = Math.min(initialDelay * Math.pow(multiplier, attemptNumber - 1), maxDelay);
|
|
423
|
+
// Add jitter
|
|
424
|
+
const jitter = Math.random() * 0.1 * delay;
|
|
425
|
+
return delay + jitter;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Format duration in human-readable format
|
|
429
|
+
*/ formatDuration(ms) {
|
|
430
|
+
const seconds = Math.floor(ms / 1000);
|
|
431
|
+
const minutes = Math.floor(seconds / 60);
|
|
432
|
+
if (minutes > 0) {
|
|
433
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
434
|
+
}
|
|
435
|
+
return `${seconds}s`;
|
|
436
|
+
}
|
|
437
|
+
constructor(config){
|
|
438
|
+
super(), _define_property(this, "config", void 0), _define_property(this, "graph", void 0), _define_property(this, "state", void 0), _define_property(this, "dependencyChecker", void 0), _define_property(this, "resourceMonitor", void 0), _define_property(this, "scheduler", void 0), _define_property(this, "checkpointManager", void 0), _define_property(this, "logger", getLogger()), // Execution tracking
|
|
439
|
+
_define_property(this, "executionId", void 0), _define_property(this, "startTime", void 0), _define_property(this, "runningTasks", new Map()), _define_property(this, "packageStartTimes", new Map()), _define_property(this, "packageEndTimes", new Map()), _define_property(this, "packageDurations", new Map()), _define_property(this, "retryAttempts", new Map()), _define_property(this, "publishedVersions", []);
|
|
440
|
+
this.config = config;
|
|
441
|
+
this.graph = config.graph;
|
|
442
|
+
this.executionId = randomUUID();
|
|
443
|
+
this.startTime = new Date();
|
|
444
|
+
// Initialize components
|
|
445
|
+
this.dependencyChecker = new DependencyChecker(this.graph);
|
|
446
|
+
this.resourceMonitor = new ResourceMonitor(config.maxConcurrency);
|
|
447
|
+
this.scheduler = new Scheduler(this.graph, this.dependencyChecker);
|
|
448
|
+
this.checkpointManager = new CheckpointManager(config.checkpointPath || process.cwd());
|
|
449
|
+
// Initialize state
|
|
450
|
+
this.state = this.initializeState();
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
export { DynamicTaskPool };
|
|
455
|
+
//# sourceMappingURL=DynamicTaskPool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicTaskPool.js","sources":["../../src/execution/DynamicTaskPool.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\nimport { getLogger } from '../logging';\nimport { Config } from '../types';\nimport {\n DependencyGraph,\n findAllDependents\n} from '../util/dependencyGraph';\nimport {\n ParallelExecutionCheckpoint,\n ExecutionState,\n ExecutionResult,\n PackageResult,\n ExecutionMetrics,\n FailedPackageSnapshot\n} from '../types/parallelExecution';\nimport { CheckpointManager } from '../util/checkpointManager';\nimport { DependencyChecker } from './DependencyChecker';\nimport { ResourceMonitor } from './ResourceMonitor';\nimport { Scheduler } from './Scheduler';\n\nexport interface PoolConfig {\n graph: DependencyGraph;\n maxConcurrency: number;\n command: string;\n config: Config;\n checkpointPath?: string;\n continue?: boolean;\n maxRetries?: number;\n initialRetryDelay?: number;\n maxRetryDelay?: number;\n backoffMultiplier?: number;\n}\n\ninterface CompletedTask {\n packageName: string;\n result: PackageResult | null;\n error: Error | null;\n}\n\ninterface RunningTask {\n packageName: string;\n startTime: Date;\n promise: Promise<PackageResult>;\n controller: AbortController;\n}\n\n/**\n * DynamicTaskPool manages parallel execution of packages with dependency awareness\n */\nexport class DynamicTaskPool extends EventEmitter {\n private config: PoolConfig;\n private graph: DependencyGraph;\n private state: ExecutionState;\n private dependencyChecker: DependencyChecker;\n private resourceMonitor: ResourceMonitor;\n private scheduler: Scheduler;\n private checkpointManager: CheckpointManager;\n private logger = getLogger();\n\n // Execution tracking\n private executionId: string;\n private startTime: Date;\n private runningTasks = new Map<string, RunningTask>();\n private packageStartTimes = new Map<string, Date>();\n private packageEndTimes = new Map<string, Date>();\n private packageDurations = new Map<string, number>();\n private retryAttempts = new Map<string, number>();\n private publishedVersions: Array<{name: string, version: string, time: Date}> = [];\n\n constructor(config: PoolConfig) {\n super();\n this.config = config;\n this.graph = config.graph;\n this.executionId = randomUUID();\n this.startTime = new Date();\n\n // Initialize components\n this.dependencyChecker = new DependencyChecker(this.graph);\n this.resourceMonitor = new ResourceMonitor(config.maxConcurrency);\n this.scheduler = new Scheduler(this.graph, this.dependencyChecker);\n this.checkpointManager = new CheckpointManager(\n config.checkpointPath || process.cwd()\n );\n\n // Initialize state\n this.state = this.initializeState();\n }\n\n /**\n * Main execution entry point\n */\n async execute(): Promise<ExecutionResult> {\n this.logger.info(`Starting parallel execution with max concurrency: ${this.config.maxConcurrency}`);\n this.emit('execution:started', { totalPackages: this.graph.packages.size });\n\n try {\n // Load checkpoint if continuing\n if (this.config.continue) {\n await this.loadCheckpoint();\n }\n\n // Initialize ready queue\n this.updateReadyQueue();\n\n // Main execution loop\n while (!this.isComplete()) {\n // Schedule as many packages as we can\n const availableSlots = this.resourceMonitor.getAvailableSlots();\n if (availableSlots > 0 && this.state.ready.length > 0) {\n const toSchedule = this.scheduler.getNext(availableSlots, this.state);\n\n for (const packageName of toSchedule) {\n await this.schedulePackage(packageName);\n }\n }\n\n // Check if we're stuck\n if (this.runningTasks.size === 0) {\n if (this.state.ready.length > 0) {\n throw new Error('Deadlock detected: packages ready but cannot execute');\n }\n break; // No more work to do\n }\n\n // Wait for next package to complete\n const completedTask = await this.waitForNext();\n await this.handleTaskCompletion(completedTask);\n\n // Update ready queue\n this.updateReadyQueue();\n\n // Save checkpoint periodically\n if (this.shouldCheckpoint()) {\n await this.saveCheckpoint();\n }\n }\n\n // Final checkpoint and cleanup\n // Only cleanup if everything completed (no failures, no skipped packages)\n const allCompleted = this.state.failed.length === 0 && this.state.skipped.length === 0;\n if (allCompleted) {\n await this.checkpointManager.cleanup();\n } else {\n await this.saveCheckpoint();\n }\n\n // Build and return result\n const result = this.buildExecutionResult();\n this.emit('execution:completed', { result });\n\n return result;\n } catch (error) {\n // Save checkpoint on error\n await this.saveCheckpoint();\n throw error;\n }\n }\n\n /**\n * Initialize execution state\n */\n private initializeState(): ExecutionState {\n const buildOrder = Array.from(this.graph.packages.keys());\n\n return {\n pending: [...buildOrder],\n ready: [],\n running: [],\n completed: [],\n failed: [],\n skipped: []\n };\n }\n\n /**\n * Schedule a package for execution\n */\n private async schedulePackage(packageName: string): Promise<void> {\n // Move from ready to running\n this.state.ready = this.state.ready.filter(p => p !== packageName);\n\n // Allocate resource\n if (!this.resourceMonitor.allocate()) {\n throw new Error(`Failed to allocate resource for ${packageName}`);\n }\n\n // Record start time\n this.packageStartTimes.set(packageName, new Date());\n\n // Create abort controller\n const controller = new AbortController();\n\n // Start execution\n const promise = this.executePackage(packageName, controller.signal);\n\n // Track running task\n const task: RunningTask = {\n packageName,\n startTime: new Date(),\n promise,\n controller\n };\n\n this.runningTasks.set(packageName, task);\n\n // Update state\n this.state.running.push({\n name: packageName,\n startTime: task.startTime.toISOString(),\n elapsedTime: 0\n });\n\n // Emit event\n this.emit('package:started', { packageName });\n\n this.logger.verbose(\n `Scheduled ${packageName} (${this.runningTasks.size}/${this.config.maxConcurrency} slots used)`\n );\n }\n\n /**\n * Execute a single package (placeholder - will be overridden or use callback)\n */\n private async executePackage(\n _packageName: string,\n _signal: AbortSignal\n ): Promise<PackageResult> {\n // This is a placeholder that will be replaced with actual execution logic\n // In the real implementation, this would call the tree.ts executePackage function\n throw new Error('executePackage must be implemented');\n }\n\n /**\n * Wait for next task to complete\n */\n private async waitForNext(): Promise<CompletedTask> {\n const runningTasks = Array.from(this.runningTasks.entries());\n\n const promises = runningTasks.map(([name, task]) =>\n task.promise\n .then(result => ({ packageName: name, result, error: null }))\n .catch(error => ({ packageName: name, result: null, error }))\n );\n\n return await Promise.race(promises);\n }\n\n /**\n * Handle task completion\n */\n private async handleTaskCompletion(task: CompletedTask): Promise<void> {\n const { packageName, result, error } = task;\n\n // Remove from running\n this.runningTasks.delete(packageName);\n this.state.running = this.state.running.filter(r => r.name !== packageName);\n this.resourceMonitor.release();\n\n // Record timing\n const endTime = new Date();\n this.packageEndTimes.set(packageName, endTime);\n\n const startTime = this.packageStartTimes.get(packageName)!;\n const duration = endTime.getTime() - startTime.getTime();\n this.packageDurations.set(packageName, duration);\n\n if (error) {\n await this.handleFailure(packageName, error);\n } else {\n await this.handleSuccess(packageName, result!);\n }\n }\n\n /**\n * Handle successful package completion\n */\n private async handleSuccess(packageName: string, result: PackageResult): Promise<void> {\n this.state.completed.push(packageName);\n\n const duration = this.packageDurations.get(packageName)!;\n this.logger.info(`✓ ${packageName} completed successfully (${this.formatDuration(duration)})`);\n\n this.emit('package:completed', { packageName, result });\n\n // Track published version if applicable\n if (result.publishedVersion) {\n this.publishedVersions.push({\n name: packageName,\n version: result.publishedVersion,\n time: new Date()\n });\n }\n }\n\n /**\n * Handle package failure\n */\n private async handleFailure(packageName: string, error: Error): Promise<void> {\n const attemptNumber = (this.retryAttempts.get(packageName) || 0) + 1;\n this.retryAttempts.set(packageName, attemptNumber);\n\n const isRetriable = this.isRetriableError(error);\n const maxRetries = this.config.maxRetries || 3;\n const canRetry = isRetriable && attemptNumber < maxRetries;\n\n if (canRetry) {\n // Schedule retry\n this.logger.warn(\n `⟳ ${packageName} failed (attempt ${attemptNumber}/${maxRetries}), will retry`\n );\n\n this.state.pending.push(packageName);\n this.emit('package:retrying', { packageName, attemptNumber });\n\n // Apply backoff delay\n const delay = this.calculateRetryDelay(attemptNumber);\n await new Promise(resolve => setTimeout(resolve, delay));\n } else {\n // Permanent failure\n const dependencies = Array.from(this.graph.edges.get(packageName) || []);\n const dependents = Array.from(findAllDependents(packageName, this.graph));\n\n const failureInfo: FailedPackageSnapshot = {\n name: packageName,\n error: error.message,\n stack: error.stack,\n isRetriable,\n attemptNumber,\n failedAt: new Date().toISOString(),\n dependencies,\n dependents\n };\n\n this.state.failed.push(failureInfo);\n\n this.logger.error(`✗ ${packageName} failed permanently: ${error.message}`);\n this.emit('package:failed', { packageName, error });\n\n // Cascade failure to dependents\n await this.cascadeFailure(packageName);\n }\n }\n\n /**\n * Cascade failure to dependent packages\n */\n private async cascadeFailure(failedPackage: string): Promise<void> {\n const toSkip = findAllDependents(failedPackage, this.graph);\n\n for (const dependent of toSkip) {\n // Remove from pending/ready\n this.state.pending = this.state.pending.filter(p => p !== dependent);\n this.state.ready = this.state.ready.filter(p => p !== dependent);\n\n // Add to skipped\n if (!this.state.skipped.includes(dependent)) {\n this.state.skipped.push(dependent);\n this.logger.warn(`⊘ Skipping ${dependent} (depends on failed ${failedPackage})`);\n this.emit('package:skipped', {\n packageName: dependent,\n reason: `Depends on failed ${failedPackage}`\n });\n }\n }\n }\n\n /**\n * Update ready queue\n */\n private updateReadyQueue(): void {\n const nowReady: string[] = [];\n\n for (const packageName of this.state.pending) {\n if (this.dependencyChecker.isReady(packageName, this.state)) {\n nowReady.push(packageName);\n }\n }\n\n for (const packageName of nowReady) {\n this.state.pending = this.state.pending.filter(p => p !== packageName);\n this.state.ready.push(packageName);\n }\n }\n\n /**\n * Check if execution is complete\n */\n private isComplete(): boolean {\n return (\n this.state.pending.length === 0 &&\n this.state.ready.length === 0 &&\n this.runningTasks.size === 0\n );\n }\n\n /**\n * Determine if should save checkpoint\n */\n private shouldCheckpoint(): boolean {\n // Checkpoint after each completion for now\n // Could be optimized to checkpoint less frequently\n return true;\n }\n\n /**\n * Save checkpoint\n */\n private async saveCheckpoint(): Promise<void> {\n const checkpoint: ParallelExecutionCheckpoint = {\n version: '1.0.0',\n executionId: this.executionId,\n createdAt: this.startTime.toISOString(),\n lastUpdated: new Date().toISOString(),\n command: this.config.command,\n originalConfig: this.config.config,\n dependencyGraph: {\n packages: Array.from(this.graph.packages.values()).map(pkg => ({\n name: pkg.name,\n version: pkg.version,\n path: pkg.path,\n dependencies: Array.from(pkg.dependencies)\n })),\n edges: Array.from(this.graph.edges.entries()).map(([pkg, deps]) => [\n pkg,\n Array.from(deps)\n ])\n },\n buildOrder: [\n ...this.state.pending,\n ...this.state.ready,\n ...this.state.running.map(r => r.name),\n ...this.state.completed,\n ...this.state.failed.map(f => f.name),\n ...this.state.skipped\n ],\n executionMode: 'parallel',\n maxConcurrency: this.config.maxConcurrency,\n state: this.state,\n publishedVersions: this.publishedVersions.map(pv => ({\n packageName: pv.name,\n version: pv.version,\n publishTime: pv.time.toISOString()\n })),\n retryAttempts: Object.fromEntries(this.retryAttempts),\n lastRetryTime: {},\n packageStartTimes: Object.fromEntries(\n Array.from(this.packageStartTimes.entries()).map(([k, v]) => [k, v.toISOString()])\n ),\n packageEndTimes: Object.fromEntries(\n Array.from(this.packageEndTimes.entries()).map(([k, v]) => [k, v.toISOString()])\n ),\n packageDurations: Object.fromEntries(this.packageDurations),\n totalStartTime: this.startTime.toISOString(),\n recoveryHints: [],\n canRecover: true\n };\n\n await this.checkpointManager.save(checkpoint);\n this.emit('checkpoint:saved', { timestamp: new Date() });\n }\n\n /**\n * Load checkpoint\n */\n private async loadCheckpoint(): Promise<void> {\n const checkpoint = await this.checkpointManager.load();\n\n if (!checkpoint) {\n this.logger.warn('No checkpoint found, starting fresh');\n return;\n }\n\n this.logger.info('Loading checkpoint...');\n this.logger.info(`Execution ID: ${checkpoint.executionId}`);\n this.logger.info(`Completed: ${checkpoint.state.completed.length} packages`);\n this.logger.info(`Failed: ${checkpoint.state.failed.length} packages`);\n\n // Restore state\n this.executionId = checkpoint.executionId;\n this.startTime = new Date(checkpoint.totalStartTime);\n this.state = checkpoint.state;\n\n // Restore timing data\n for (const [pkg, time] of Object.entries(checkpoint.packageStartTimes)) {\n this.packageStartTimes.set(pkg, new Date(time));\n }\n for (const [pkg, time] of Object.entries(checkpoint.packageEndTimes)) {\n this.packageEndTimes.set(pkg, new Date(time));\n }\n for (const [pkg, duration] of Object.entries(checkpoint.packageDurations)) {\n this.packageDurations.set(pkg, duration);\n }\n\n // Restore retry attempts\n for (const [pkg, attempts] of Object.entries(checkpoint.retryAttempts)) {\n this.retryAttempts.set(pkg, attempts);\n }\n\n // Clear running state (cannot resume mid-execution)\n for (const running of this.state.running) {\n this.state.pending.push(running.name);\n }\n this.state.running = [];\n }\n\n /**\n * Build execution result\n */\n private buildExecutionResult(): ExecutionResult {\n const totalDuration = Date.now() - this.startTime.getTime();\n const completedDurations = Array.from(this.packageDurations.values());\n const averageDuration = completedDurations.length > 0\n ? completedDurations.reduce((a, b) => a + b, 0) / completedDurations.length\n : 0;\n\n const metrics: ExecutionMetrics = {\n totalDuration,\n averagePackageDuration: averageDuration,\n peakConcurrency: this.resourceMonitor.getMetrics().peakConcurrency,\n averageConcurrency: this.resourceMonitor.getMetrics().averageConcurrency\n };\n\n return {\n success: this.state.failed.length === 0,\n totalPackages: this.graph.packages.size,\n completed: this.state.completed,\n failed: this.state.failed,\n skipped: this.state.skipped,\n metrics\n };\n }\n\n /**\n * Check if error is retriable\n */\n private isRetriableError(error: Error): boolean {\n const retriablePatterns = [\n /ETIMEDOUT/i,\n /ECONNRESET/i,\n /ENOTFOUND/i,\n /rate limit/i,\n /temporary failure/i,\n /try again/i,\n /gateway timeout/i,\n /service unavailable/i\n ];\n\n return retriablePatterns.some(pattern =>\n pattern.test(error.message || String(error))\n );\n }\n\n /**\n * Calculate retry delay with exponential backoff\n */\n private calculateRetryDelay(attemptNumber: number): number {\n const initialDelay = this.config.initialRetryDelay || 5000;\n const maxDelay = this.config.maxRetryDelay || 60000;\n const multiplier = this.config.backoffMultiplier || 2;\n\n const delay = Math.min(\n initialDelay * Math.pow(multiplier, attemptNumber - 1),\n maxDelay\n );\n\n // Add jitter\n const jitter = Math.random() * 0.1 * delay;\n\n return delay + jitter;\n }\n\n /**\n * Format duration in human-readable format\n */\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n }\n}\n"],"names":["DynamicTaskPool","EventEmitter","execute","logger","info","config","maxConcurrency","emit","totalPackages","graph","packages","size","continue","loadCheckpoint","updateReadyQueue","isComplete","availableSlots","resourceMonitor","getAvailableSlots","state","ready","length","toSchedule","scheduler","getNext","packageName","schedulePackage","runningTasks","Error","completedTask","waitForNext","handleTaskCompletion","shouldCheckpoint","saveCheckpoint","allCompleted","failed","skipped","checkpointManager","cleanup","result","buildExecutionResult","error","initializeState","buildOrder","Array","from","keys","pending","running","completed","filter","p","allocate","packageStartTimes","set","Date","controller","AbortController","promise","executePackage","signal","task","startTime","push","name","toISOString","elapsedTime","verbose","_packageName","_signal","entries","promises","map","then","catch","Promise","race","delete","r","release","endTime","packageEndTimes","get","duration","getTime","packageDurations","handleFailure","handleSuccess","formatDuration","publishedVersion","publishedVersions","version","time","attemptNumber","retryAttempts","isRetriable","isRetriableError","maxRetries","canRetry","warn","delay","calculateRetryDelay","resolve","setTimeout","dependencies","edges","dependents","findAllDependents","failureInfo","message","stack","failedAt","cascadeFailure","failedPackage","toSkip","dependent","includes","reason","nowReady","dependencyChecker","isReady","checkpoint","executionId","createdAt","lastUpdated","command","originalConfig","dependencyGraph","values","pkg","path","deps","f","executionMode","pv","publishTime","Object","fromEntries","lastRetryTime","k","v","totalStartTime","recoveryHints","canRecover","save","timestamp","load","attempts","totalDuration","now","completedDurations","averageDuration","reduce","a","b","metrics","averagePackageDuration","peakConcurrency","getMetrics","averageConcurrency","success","retriablePatterns","some","pattern","test","String","initialDelay","initialRetryDelay","maxDelay","maxRetryDelay","multiplier","backoffMultiplier","Math","min","pow","jitter","random","ms","seconds","floor","minutes","getLogger","Map","randomUUID","DependencyChecker","ResourceMonitor","Scheduler","CheckpointManager","checkpointPath","process","cwd"],"mappings":"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"}
|