mcp-adr-analysis-server 2.7.24 → 2.7.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/dist/.tsbuildinfo +1 -1
- package/dist/src/tools/bootstrap-validation-loop-tool.d.ts +0 -178
- package/dist/src/tools/bootstrap-validation-loop-tool.d.ts.map +1 -1
- package/dist/src/tools/bootstrap-validation-loop-tool.js +0 -1580
- package/dist/src/tools/bootstrap-validation-loop-tool.js.map +1 -1
- package/package.json +1 -2
- package/dist/src/utils/dag-executor.d.ts +0 -106
- package/dist/src/utils/dag-executor.d.ts.map +0 -1
- package/dist/src/utils/dag-executor.js +0 -453
- package/dist/src/utils/dag-executor.js.map +0 -1
- package/dist/src/utils/deployment-task-integration.d.ts +0 -260
- package/dist/src/utils/deployment-task-integration.d.ts.map +0 -1
- package/dist/src/utils/deployment-task-integration.js +0 -393
- package/dist/src/utils/deployment-task-integration.js.map +0 -1
- package/dist/src/utils/dynamic-deployment-intelligence.d.ts +0 -117
- package/dist/src/utils/dynamic-deployment-intelligence.d.ts.map +0 -1
- package/dist/src/utils/dynamic-deployment-intelligence.js +0 -445
- package/dist/src/utils/dynamic-deployment-intelligence.js.map +0 -1
- package/dist/src/utils/pattern-contribution-helper.d.ts +0 -60
- package/dist/src/utils/pattern-contribution-helper.d.ts.map +0 -1
- package/dist/src/utils/pattern-contribution-helper.js +0 -308
- package/dist/src/utils/pattern-contribution-helper.js.map +0 -1
- package/dist/src/utils/pattern-loader.d.ts +0 -183
- package/dist/src/utils/pattern-loader.d.ts.map +0 -1
- package/dist/src/utils/pattern-loader.js +0 -198
- package/dist/src/utils/pattern-loader.js.map +0 -1
- package/dist/src/utils/pattern-to-dag-converter.d.ts +0 -62
- package/dist/src/utils/pattern-to-dag-converter.d.ts.map +0 -1
- package/dist/src/utils/pattern-to-dag-converter.js +0 -265
- package/dist/src/utils/pattern-to-dag-converter.js.map +0 -1
- package/dist/src/utils/resource-extractor.d.ts +0 -57
- package/dist/src/utils/resource-extractor.d.ts.map +0 -1
- package/dist/src/utils/resource-extractor.js +0 -323
- package/dist/src/utils/resource-extractor.js.map +0 -1
- package/dist/src/utils/system-card-manager.d.ts +0 -194
- package/dist/src/utils/system-card-manager.d.ts.map +0 -1
- package/dist/src/utils/system-card-manager.js +0 -336
- package/dist/src/utils/system-card-manager.js.map +0 -1
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DAG Executor for Bootstrap Validation Loop
|
|
3
|
-
*
|
|
4
|
-
* Executes tasks in a Directed Acyclic Graph (DAG) with:
|
|
5
|
-
* - Dependency resolution via topological sort
|
|
6
|
-
* - Parallel execution within layers
|
|
7
|
-
* - Fine-grained error handling and retry logic
|
|
8
|
-
* - Task-level validation and timeout support
|
|
9
|
-
*/
|
|
10
|
-
import { exec } from 'node:child_process';
|
|
11
|
-
import { promisify } from 'util';
|
|
12
|
-
import { EnhancedLogger } from './enhanced-logging.js';
|
|
13
|
-
import { ResourceExtractor } from './resource-extractor.js';
|
|
14
|
-
const execAsync = promisify(exec);
|
|
15
|
-
/**
|
|
16
|
-
* DAG Executor with dependency resolution and parallel execution
|
|
17
|
-
*/
|
|
18
|
-
export class DAGExecutor {
|
|
19
|
-
logger;
|
|
20
|
-
maxParallelism;
|
|
21
|
-
systemCardManager;
|
|
22
|
-
resourceExtractor;
|
|
23
|
-
constructor(maxParallelism = 5, systemCardManager) {
|
|
24
|
-
this.logger = new EnhancedLogger();
|
|
25
|
-
this.maxParallelism = maxParallelism;
|
|
26
|
-
this.systemCardManager = systemCardManager;
|
|
27
|
-
this.resourceExtractor = new ResourceExtractor();
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Execute DAG with topological sort and parallel execution
|
|
31
|
-
*/
|
|
32
|
-
async execute(tasks) {
|
|
33
|
-
const startTime = Date.now();
|
|
34
|
-
this.logger.info(`🔄 Starting DAG execution with ${tasks.length} tasks`, 'DAGExecutor');
|
|
35
|
-
// 1. Validate DAG structure
|
|
36
|
-
this.validateDAG(tasks);
|
|
37
|
-
// 2. Build dependency graph
|
|
38
|
-
const graph = this.buildDependencyGraph(tasks);
|
|
39
|
-
// 3. Topological sort to determine execution layers
|
|
40
|
-
const sortedLayers = this.topologicalSort(graph);
|
|
41
|
-
this.logger.info(`📊 DAG topology: ${sortedLayers.length} layers, max parallelism: ${this.maxParallelism}`, 'DAGExecutor');
|
|
42
|
-
// 4. Execute layer by layer (parallel within layer)
|
|
43
|
-
const results = new Map();
|
|
44
|
-
const failedTasks = [];
|
|
45
|
-
const skippedTasks = [];
|
|
46
|
-
for (let layerIndex = 0; layerIndex < sortedLayers.length; layerIndex++) {
|
|
47
|
-
const layer = sortedLayers[layerIndex];
|
|
48
|
-
if (!layer) {
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
this.logger.info(`🔹 Executing layer ${layerIndex + 1}/${sortedLayers.length} with ${layer.length} tasks`, 'DAGExecutor');
|
|
52
|
-
// Execute all tasks in this layer in parallel (up to maxParallelism)
|
|
53
|
-
const layerResults = await this.executeLayer(layer, results, tasks);
|
|
54
|
-
for (const [taskId, result] of layerResults) {
|
|
55
|
-
results.set(taskId, result);
|
|
56
|
-
if (result.skipped) {
|
|
57
|
-
skippedTasks.push(taskId);
|
|
58
|
-
}
|
|
59
|
-
else if (!result.success) {
|
|
60
|
-
failedTasks.push(taskId);
|
|
61
|
-
// Mark dependent tasks as skipped
|
|
62
|
-
const task = tasks.find(t => t.id === taskId);
|
|
63
|
-
if (task && !task.canFailSafely) {
|
|
64
|
-
const dependents = this.getDependentTasks(taskId, tasks);
|
|
65
|
-
for (const depId of dependents) {
|
|
66
|
-
if (!results.has(depId)) {
|
|
67
|
-
results.set(depId, {
|
|
68
|
-
taskId: depId,
|
|
69
|
-
success: false,
|
|
70
|
-
stdout: '',
|
|
71
|
-
stderr: '',
|
|
72
|
-
duration: 0,
|
|
73
|
-
skipped: true,
|
|
74
|
-
skipReason: `Dependency ${taskId} failed`,
|
|
75
|
-
});
|
|
76
|
-
skippedTasks.push(depId);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// Stop if critical task failed
|
|
83
|
-
const criticalTaskFailed = layer.some(task => !results.get(task.id)?.success && task.severity === 'critical');
|
|
84
|
-
if (criticalTaskFailed) {
|
|
85
|
-
this.logger.error('❌ Critical task failed, stopping DAG execution', 'DAGExecutor');
|
|
86
|
-
// Mark other tasks in the same layer as skipped
|
|
87
|
-
for (const task of layer) {
|
|
88
|
-
const result = results.get(task.id);
|
|
89
|
-
if (result && result.success && task.severity !== 'critical') {
|
|
90
|
-
// Mark successful tasks in same layer as skipped when critical task fails
|
|
91
|
-
const skippedResult = {
|
|
92
|
-
...result,
|
|
93
|
-
skipped: true,
|
|
94
|
-
skipReason: 'Critical task failed in same layer',
|
|
95
|
-
};
|
|
96
|
-
results.set(task.id, skippedResult);
|
|
97
|
-
if (!skippedTasks.includes(task.id)) {
|
|
98
|
-
skippedTasks.push(task.id);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
// Mark remaining tasks (not yet executed) as skipped
|
|
103
|
-
for (const task of tasks) {
|
|
104
|
-
if (!results.has(task.id)) {
|
|
105
|
-
results.set(task.id, {
|
|
106
|
-
taskId: task.id,
|
|
107
|
-
success: false,
|
|
108
|
-
stdout: '',
|
|
109
|
-
stderr: '',
|
|
110
|
-
duration: 0,
|
|
111
|
-
skipped: true,
|
|
112
|
-
skipReason: 'Critical task failed in earlier layer',
|
|
113
|
-
});
|
|
114
|
-
skippedTasks.push(task.id);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
const duration = Date.now() - startTime;
|
|
121
|
-
const executedTasks = Array.from(results.keys()).filter(id => !results.get(id)?.skipped);
|
|
122
|
-
const success = failedTasks.length === 0;
|
|
123
|
-
this.logger.info(`${success ? '✅' : '❌'} DAG execution ${success ? 'completed' : 'failed'}: ${executedTasks.length} executed, ${failedTasks.length} failed, ${skippedTasks.length} skipped (${duration}ms)`, 'DAGExecutor');
|
|
124
|
-
return {
|
|
125
|
-
success,
|
|
126
|
-
executedTasks,
|
|
127
|
-
failedTasks,
|
|
128
|
-
skippedTasks,
|
|
129
|
-
duration,
|
|
130
|
-
taskResults: results,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Execute all tasks in a layer in parallel (with concurrency limit)
|
|
135
|
-
*/
|
|
136
|
-
async executeLayer(layer, previousResults, allTasks) {
|
|
137
|
-
const results = new Map();
|
|
138
|
-
// Filter tasks whose dependencies are met
|
|
139
|
-
const executableTasks = [];
|
|
140
|
-
for (const task of layer) {
|
|
141
|
-
const dependenciesMet = task.dependsOn.every(depId => {
|
|
142
|
-
const depResult = previousResults.get(depId);
|
|
143
|
-
if (!depResult)
|
|
144
|
-
return false;
|
|
145
|
-
// If dependency succeeded, it's met
|
|
146
|
-
if (depResult.success === true)
|
|
147
|
-
return true;
|
|
148
|
-
// If dependency failed, check if it can fail safely
|
|
149
|
-
const depTask = allTasks.find(t => t.id === depId);
|
|
150
|
-
return depTask?.canFailSafely === true;
|
|
151
|
-
});
|
|
152
|
-
if (!dependenciesMet) {
|
|
153
|
-
// Check if any dependency failed and wasn't safe to fail
|
|
154
|
-
const failedDep = task.dependsOn.find(depId => {
|
|
155
|
-
const depResult = previousResults.get(depId);
|
|
156
|
-
if (!depResult || depResult.success)
|
|
157
|
-
return false;
|
|
158
|
-
// Check if this failed dependency can fail safely
|
|
159
|
-
const depTask = allTasks.find(t => t.id === depId);
|
|
160
|
-
return !depTask?.canFailSafely;
|
|
161
|
-
});
|
|
162
|
-
if (failedDep) {
|
|
163
|
-
results.set(task.id, {
|
|
164
|
-
taskId: task.id,
|
|
165
|
-
success: false,
|
|
166
|
-
stdout: '',
|
|
167
|
-
stderr: `Dependencies not met: ${failedDep || 'unknown'}`,
|
|
168
|
-
duration: 0,
|
|
169
|
-
skipped: true,
|
|
170
|
-
skipReason: `Dependency ${failedDep} failed`,
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
// All failed dependencies can fail safely, so we can execute this task
|
|
175
|
-
executableTasks.push(task);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
executableTasks.push(task);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
if (executableTasks.length === 0) {
|
|
183
|
-
return results;
|
|
184
|
-
}
|
|
185
|
-
// Execute tasks with concurrency limit
|
|
186
|
-
const taskResults = await this.executeWithConcurrencyLimit(executableTasks, this.maxParallelism);
|
|
187
|
-
for (let i = 0; i < executableTasks.length; i++) {
|
|
188
|
-
const task = executableTasks[i];
|
|
189
|
-
const result = taskResults[i];
|
|
190
|
-
if (task && result) {
|
|
191
|
-
results.set(task.id, result);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
return results;
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Execute tasks with concurrency limit
|
|
198
|
-
*/
|
|
199
|
-
async executeWithConcurrencyLimit(tasks, concurrencyLimit) {
|
|
200
|
-
const promises = [];
|
|
201
|
-
const executing = [];
|
|
202
|
-
for (const task of tasks) {
|
|
203
|
-
const promise = this.executeTask(task).then(result => {
|
|
204
|
-
executing.splice(executing.indexOf(promise), 1);
|
|
205
|
-
return result;
|
|
206
|
-
});
|
|
207
|
-
executing.push(promise);
|
|
208
|
-
promises.push(promise);
|
|
209
|
-
if (executing.length >= concurrencyLimit) {
|
|
210
|
-
await Promise.race(executing);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return Promise.all(promises);
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Execute a single task with retry logic
|
|
217
|
-
*/
|
|
218
|
-
async executeTask(task) {
|
|
219
|
-
const startTime = Date.now();
|
|
220
|
-
this.logger.info(`▶️ Executing: ${task.name}`, 'DAGExecutor');
|
|
221
|
-
try {
|
|
222
|
-
if (!task.command) {
|
|
223
|
-
throw new Error(`Task ${task.id} has no command defined`);
|
|
224
|
-
}
|
|
225
|
-
// Build full command
|
|
226
|
-
const fullCommand = task.commandArgs
|
|
227
|
-
? `${task.command} ${task.commandArgs.join(' ')}`
|
|
228
|
-
: task.command;
|
|
229
|
-
// Execute command with timeout
|
|
230
|
-
const timeout = task.timeout || 30000;
|
|
231
|
-
const { stdout, stderr } = await this.executeCommand(fullCommand, timeout);
|
|
232
|
-
const duration = Date.now() - startTime;
|
|
233
|
-
// Check exit code (execAsync throws on non-zero exit)
|
|
234
|
-
const success = true;
|
|
235
|
-
// Run custom validation if defined
|
|
236
|
-
let validationPassed = true;
|
|
237
|
-
if (task.validationCheck) {
|
|
238
|
-
validationPassed = task.validationCheck(stdout);
|
|
239
|
-
if (!validationPassed) {
|
|
240
|
-
this.logger.warn(`❌ Validation failed for task: ${task.name}`, 'DAGExecutor');
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
const finalSuccess = success && validationPassed;
|
|
244
|
-
if (finalSuccess) {
|
|
245
|
-
this.logger.info(`✅ Completed: ${task.name} (${duration}ms)`, 'DAGExecutor');
|
|
246
|
-
// Extract resources from command output and update SystemCard
|
|
247
|
-
if (this.systemCardManager) {
|
|
248
|
-
try {
|
|
249
|
-
const extractionResult = this.resourceExtractor.extract(fullCommand, stdout, stderr, task.id);
|
|
250
|
-
if (extractionResult.resources.length > 0) {
|
|
251
|
-
await this.systemCardManager.addResources(extractionResult.resources, {
|
|
252
|
-
phase: task.category,
|
|
253
|
-
taskId: task.id,
|
|
254
|
-
});
|
|
255
|
-
this.logger.info(`📝 Tracked ${extractionResult.resources.length} resources from task: ${task.name}`, 'DAGExecutor');
|
|
256
|
-
}
|
|
257
|
-
if (extractionResult.warnings.length > 0) {
|
|
258
|
-
this.logger.warn(`Resource extraction warnings: ${extractionResult.warnings.join(', ')}`, 'DAGExecutor');
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
catch (error) {
|
|
262
|
-
// Log but don't fail the task if resource extraction fails
|
|
263
|
-
this.logger.warn(`Failed to extract resources from task ${task.name}: ${error.message}`, 'DAGExecutor');
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
this.logger.error(`❌ Failed: ${task.name} (${duration}ms)`, 'DAGExecutor');
|
|
269
|
-
}
|
|
270
|
-
return {
|
|
271
|
-
taskId: task.id,
|
|
272
|
-
success: finalSuccess,
|
|
273
|
-
exitCode: 0,
|
|
274
|
-
stdout,
|
|
275
|
-
stderr,
|
|
276
|
-
duration,
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
catch (error) {
|
|
280
|
-
const duration = Date.now() - startTime;
|
|
281
|
-
// Retry logic
|
|
282
|
-
if (task.retryCount && task.retryCount > 0) {
|
|
283
|
-
this.logger.warn(`🔄 Task ${task.name} failed, retrying (${task.retryCount} retries left)...`, 'DAGExecutor');
|
|
284
|
-
if (task.retryDelay) {
|
|
285
|
-
await new Promise(resolve => setTimeout(resolve, task.retryDelay));
|
|
286
|
-
}
|
|
287
|
-
// Recursively retry with decremented retry count
|
|
288
|
-
const retryTask = { ...task, retryCount: task.retryCount - 1 };
|
|
289
|
-
return this.executeTask(retryTask);
|
|
290
|
-
}
|
|
291
|
-
this.logger.error(`❌ Task failed: ${task.name} - ${error.message}`, 'DAGExecutor');
|
|
292
|
-
return {
|
|
293
|
-
taskId: task.id,
|
|
294
|
-
success: false,
|
|
295
|
-
exitCode: error.code || 1,
|
|
296
|
-
stdout: error.stdout || '',
|
|
297
|
-
stderr: error.stderr || error.message,
|
|
298
|
-
duration,
|
|
299
|
-
error,
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Execute shell command with timeout
|
|
305
|
-
*/
|
|
306
|
-
async executeCommand(command, timeout) {
|
|
307
|
-
try {
|
|
308
|
-
const { stdout, stderr } = await execAsync(command, {
|
|
309
|
-
timeout,
|
|
310
|
-
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
311
|
-
});
|
|
312
|
-
return { stdout, stderr };
|
|
313
|
-
}
|
|
314
|
-
catch (error) {
|
|
315
|
-
// Re-throw with consistent structure
|
|
316
|
-
throw {
|
|
317
|
-
code: error.code,
|
|
318
|
-
message: error.message,
|
|
319
|
-
stdout: error.stdout || '',
|
|
320
|
-
stderr: error.stderr || '',
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
/**
|
|
325
|
-
* Validate DAG structure (no cycles, valid dependencies)
|
|
326
|
-
*/
|
|
327
|
-
validateDAG(tasks) {
|
|
328
|
-
const taskIds = new Set(tasks.map(t => t.id));
|
|
329
|
-
// Check for duplicate task IDs
|
|
330
|
-
if (taskIds.size !== tasks.length) {
|
|
331
|
-
throw new Error('Duplicate task IDs detected in DAG');
|
|
332
|
-
}
|
|
333
|
-
// Check all dependencies exist
|
|
334
|
-
for (const task of tasks) {
|
|
335
|
-
for (const depId of task.dependsOn) {
|
|
336
|
-
if (!taskIds.has(depId)) {
|
|
337
|
-
throw new Error(`Task ${task.id} depends on non-existent task: ${depId}`);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
// Check for cycles using depth-first search
|
|
342
|
-
this.detectCycles(tasks);
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* Detect cycles in DAG using DFS
|
|
346
|
-
*/
|
|
347
|
-
detectCycles(tasks) {
|
|
348
|
-
const visited = new Set();
|
|
349
|
-
const recursionStack = new Set();
|
|
350
|
-
const graph = this.buildDependencyGraph(tasks);
|
|
351
|
-
const dfs = (taskId) => {
|
|
352
|
-
visited.add(taskId);
|
|
353
|
-
recursionStack.add(taskId);
|
|
354
|
-
const task = graph.get(taskId);
|
|
355
|
-
if (!task) {
|
|
356
|
-
return false;
|
|
357
|
-
}
|
|
358
|
-
for (const depId of task.dependsOn) {
|
|
359
|
-
if (!visited.has(depId)) {
|
|
360
|
-
if (dfs(depId)) {
|
|
361
|
-
return true;
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
else if (recursionStack.has(depId)) {
|
|
365
|
-
throw new Error(`Circular dependency detected: ${taskId} -> ${depId}`);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
recursionStack.delete(taskId);
|
|
369
|
-
return false;
|
|
370
|
-
};
|
|
371
|
-
for (const task of tasks) {
|
|
372
|
-
if (!visited.has(task.id)) {
|
|
373
|
-
dfs(task.id);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
/**
|
|
378
|
-
* Build dependency graph from tasks
|
|
379
|
-
*/
|
|
380
|
-
buildDependencyGraph(tasks) {
|
|
381
|
-
const graph = new Map();
|
|
382
|
-
for (const task of tasks) {
|
|
383
|
-
graph.set(task.id, task);
|
|
384
|
-
}
|
|
385
|
-
return graph;
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* Topological sort to determine execution order (Kahn's algorithm)
|
|
389
|
-
*/
|
|
390
|
-
topologicalSort(graph) {
|
|
391
|
-
const layers = [];
|
|
392
|
-
const inDegree = new Map();
|
|
393
|
-
const visited = new Set();
|
|
394
|
-
// Calculate in-degrees
|
|
395
|
-
for (const [id, task] of graph) {
|
|
396
|
-
if (!inDegree.has(id)) {
|
|
397
|
-
inDegree.set(id, 0);
|
|
398
|
-
}
|
|
399
|
-
for (const _depId of task.dependsOn) {
|
|
400
|
-
inDegree.set(id, (inDegree.get(id) || 0) + 1);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
// Process nodes layer by layer
|
|
404
|
-
while (visited.size < graph.size) {
|
|
405
|
-
const layer = [];
|
|
406
|
-
// Find all nodes with in-degree 0 (no unmet dependencies)
|
|
407
|
-
for (const [id, task] of graph) {
|
|
408
|
-
if (!visited.has(id) && (inDegree.get(id) || 0) === 0) {
|
|
409
|
-
layer.push(task);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
if (layer.length === 0) {
|
|
413
|
-
// This shouldn't happen if cycle detection works
|
|
414
|
-
throw new Error('Cannot resolve DAG - circular dependency detected');
|
|
415
|
-
}
|
|
416
|
-
layers.push(layer);
|
|
417
|
-
// Mark layer as visited and update in-degrees
|
|
418
|
-
for (const task of layer) {
|
|
419
|
-
visited.add(task.id);
|
|
420
|
-
// Decrease in-degree for dependent tasks
|
|
421
|
-
for (const [id, t] of graph) {
|
|
422
|
-
if (t.dependsOn.includes(task.id)) {
|
|
423
|
-
inDegree.set(id, (inDegree.get(id) || 0) - 1);
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
return layers;
|
|
429
|
-
}
|
|
430
|
-
/**
|
|
431
|
-
* Get all tasks that depend on the given task (recursively)
|
|
432
|
-
*/
|
|
433
|
-
getDependentTasks(taskId, allTasks) {
|
|
434
|
-
const dependents = [];
|
|
435
|
-
const queue = [taskId];
|
|
436
|
-
const visited = new Set();
|
|
437
|
-
while (queue.length > 0) {
|
|
438
|
-
const current = queue.shift();
|
|
439
|
-
if (visited.has(current)) {
|
|
440
|
-
continue;
|
|
441
|
-
}
|
|
442
|
-
visited.add(current);
|
|
443
|
-
for (const task of allTasks) {
|
|
444
|
-
if (task.dependsOn.includes(current) && !visited.has(task.id)) {
|
|
445
|
-
dependents.push(task.id);
|
|
446
|
-
queue.push(task.id);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
return dependents;
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
//# sourceMappingURL=dag-executor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dag-executor.js","sourceRoot":"","sources":["../../../src/utils/dag-executor.ts"],"names":[],"mappings":"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"}
|