@calmo/task-runner 4.1.0 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jules/nexus.md +5 -0
- package/.release-please-manifest.json +1 -1
- package/AGENTS.md +2 -0
- package/CHANGELOG.md +51 -0
- package/README.md +34 -0
- package/conductor/code_styleguides/general.md +23 -0
- package/conductor/code_styleguides/javascript.md +51 -0
- package/conductor/code_styleguides/typescript.md +43 -0
- package/conductor/product-guidelines.md +14 -0
- package/conductor/product.md +16 -0
- package/conductor/setup_state.json +1 -0
- package/conductor/tech-stack.md +19 -0
- package/conductor/workflow.md +334 -0
- package/dist/EventBus.js +19 -18
- package/dist/EventBus.js.map +1 -1
- package/dist/PluginManager.d.ts +22 -0
- package/dist/PluginManager.js +40 -0
- package/dist/PluginManager.js.map +1 -0
- package/dist/TaskGraphValidator.d.ts +1 -1
- package/dist/TaskGraphValidator.js +16 -21
- package/dist/TaskGraphValidator.js.map +1 -1
- package/dist/TaskRunner.d.ts +8 -1
- package/dist/TaskRunner.js +37 -25
- package/dist/TaskRunner.js.map +1 -1
- package/dist/TaskStateManager.d.ts +1 -0
- package/dist/TaskStateManager.js +22 -6
- package/dist/TaskStateManager.js.map +1 -1
- package/dist/TaskStep.d.ts +12 -0
- package/dist/WorkflowExecutor.js +19 -10
- package/dist/WorkflowExecutor.js.map +1 -1
- package/dist/contracts/Plugin.d.ts +30 -0
- package/dist/contracts/Plugin.js +2 -0
- package/dist/contracts/Plugin.js.map +1 -0
- package/dist/strategies/DryRunExecutionStrategy.js +2 -2
- package/dist/strategies/DryRunExecutionStrategy.js.map +1 -1
- package/dist/strategies/StandardExecutionStrategy.js +43 -1
- package/dist/strategies/StandardExecutionStrategy.js.map +1 -1
- package/openspec/changes/add-middleware-support/proposal.md +19 -0
- package/openspec/changes/add-middleware-support/specs/task-runner/spec.md +34 -0
- package/openspec/changes/add-middleware-support/tasks.md +9 -0
- package/openspec/changes/add-resource-concurrency/tasks.md +1 -0
- package/openspec/changes/allow-plugin-hooks/design.md +51 -0
- package/openspec/changes/allow-plugin-hooks/proposal.md +12 -0
- package/openspec/changes/allow-plugin-hooks/specs/post-task/spec.md +21 -0
- package/openspec/changes/allow-plugin-hooks/specs/pre-task/spec.md +32 -0
- package/openspec/changes/allow-plugin-hooks/tasks.md +7 -0
- package/openspec/changes/archive/2026-02-15-implement-plugin-system/design.md +45 -0
- package/openspec/changes/archive/2026-02-15-implement-plugin-system/proposal.md +13 -0
- package/openspec/changes/archive/2026-02-15-implement-plugin-system/specs/plugin-context/spec.md +17 -0
- package/openspec/changes/archive/2026-02-15-implement-plugin-system/specs/plugin-loading/spec.md +27 -0
- package/openspec/changes/archive/2026-02-15-implement-plugin-system/tasks.md +7 -0
- package/openspec/changes/feat-completion-dependencies/proposal.md +58 -0
- package/openspec/changes/feat-completion-dependencies/tasks.md +46 -0
- package/openspec/changes/feat-task-caching/design.md +34 -0
- package/openspec/changes/feat-task-caching/proposal.md +18 -0
- package/openspec/changes/feat-task-caching/specs/task-runner/spec.md +58 -0
- package/openspec/changes/feat-task-caching/tasks.md +24 -0
- package/openspec/changes/feat-task-loop/proposal.md +22 -0
- package/openspec/changes/feat-task-loop/specs/task-runner/spec.md +34 -0
- package/openspec/changes/feat-task-loop/tasks.md +8 -0
- package/openspec/proposals/feat-matrix-execution/proposal.md +23 -0
- package/openspec/proposals/feat-matrix-execution/specs/task-runner/spec.md +47 -0
- package/openspec/proposals/feat-matrix-execution/tasks.md +11 -0
- package/openspec/proposals/feat-task-observability/proposal.md +16 -0
- package/openspec/proposals/feat-task-observability/specs/task-runner/spec.md +14 -0
- package/openspec/proposals/feat-task-observability/tasks.md +7 -0
- package/openspec/specs/plugin-context/spec.md +19 -0
- package/openspec/specs/plugin-loading/spec.md +29 -0
- package/package.json +1 -1
- package/src/EventBus.ts +11 -15
- package/src/PluginManager.ts +43 -0
- package/src/TaskGraphValidator.ts +22 -24
- package/src/TaskRunner.ts +45 -28
- package/src/TaskStateManager.ts +20 -6
- package/src/TaskStep.ts +14 -0
- package/src/WorkflowExecutor.ts +24 -11
- package/src/contracts/Plugin.ts +32 -0
- package/src/strategies/DryRunExecutionStrategy.ts +2 -2
- package/src/strategies/StandardExecutionStrategy.ts +48 -1
- /package/openspec/changes/{feat-continue-on-error → archive/2026-02-18-feat-continue-on-error}/proposal.md +0 -0
- /package/openspec/changes/{feat-continue-on-error → archive/2026-02-18-feat-continue-on-error}/tasks.md +0 -0
- /package/openspec/changes/{feat-per-task-timeout → archive/2026-02-25-feat-per-task-timeout}/proposal.md +0 -0
- /package/openspec/changes/{feat-per-task-timeout → archive/2026-02-25-feat-per-task-timeout}/specs/task-runner/spec.md +0 -0
- /package/openspec/changes/{feat-per-task-timeout → archive/2026-02-25-feat-per-task-timeout}/tasks.md +0 -0
package/dist/EventBus.js
CHANGED
|
@@ -24,8 +24,9 @@ export class EventBus {
|
|
|
24
24
|
* @param callback The callback to remove.
|
|
25
25
|
*/
|
|
26
26
|
off(event, callback) {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const listeners = this.listeners[event];
|
|
28
|
+
if (listeners) {
|
|
29
|
+
listeners.delete(callback);
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
/**
|
|
@@ -37,28 +38,28 @@ export class EventBus {
|
|
|
37
38
|
const listeners = this.listeners[event];
|
|
38
39
|
if (listeners) {
|
|
39
40
|
for (const listener of listeners) {
|
|
40
|
-
// We use
|
|
41
|
+
// We use queueMicrotask() to schedule the listener on the microtask queue,
|
|
41
42
|
// ensuring the emit method remains non-blocking.
|
|
42
|
-
|
|
43
|
-
Promise.resolve()
|
|
44
|
-
.then(() => {
|
|
43
|
+
queueMicrotask(() => {
|
|
45
44
|
try {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
45
|
+
try {
|
|
46
|
+
const result = listener(data);
|
|
47
|
+
if (result instanceof Promise) {
|
|
48
|
+
// Handle async listener rejections
|
|
49
|
+
result.catch((error) => {
|
|
50
|
+
console.error(`Error in event listener for ${String(event)}:`, error);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
// Handle sync listener errors
|
|
56
|
+
console.error(`Error in event listener for ${String(event)}:`, error);
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
59
|
catch (error) {
|
|
55
|
-
//
|
|
56
|
-
console.error(`
|
|
60
|
+
// detailed handling for the microtask execution itself
|
|
61
|
+
console.error(`Unexpected error in event bus execution for ${String(event)}:`, error);
|
|
57
62
|
}
|
|
58
|
-
})
|
|
59
|
-
.catch((error) => {
|
|
60
|
-
// detailed handling for the promise chain itself
|
|
61
|
-
console.error(`Unexpected error in event bus execution for ${String(event)}:`, error);
|
|
62
63
|
});
|
|
63
64
|
}
|
|
64
65
|
}
|
package/dist/EventBus.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventBus.js","sourceRoot":"","sources":["../src/EventBus.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACX,SAAS,GAA0B,EAAE,CAAC;IAE9C;;;;OAIG;IACI,EAAE,CACP,KAAQ,EACR,QAA0C;QAE1C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,4EAA4E;YAC5E,iEAAiE;YACjE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,EAAyC,CAAC;QAC3E,CAAC;QACD,oFAAoF;QACnF,IAAI,CAAC,SAAS,CAAC,KAAK,CAA2C,CAAC,GAAG,CAClE,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,GAAG,CACR,KAAQ,EACR,QAA0C;QAE1C,
|
|
1
|
+
{"version":3,"file":"EventBus.js","sourceRoot":"","sources":["../src/EventBus.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACX,SAAS,GAA0B,EAAE,CAAC;IAE9C;;;;OAIG;IACI,EAAE,CACP,KAAQ,EACR,QAA0C;QAE1C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,4EAA4E;YAC5E,iEAAiE;YACjE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,EAAyC,CAAC;QAC3E,CAAC;QACD,oFAAoF;QACnF,IAAI,CAAC,SAAS,CAAC,KAAK,CAA2C,CAAC,GAAG,CAClE,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,GAAG,CACR,KAAQ,EACR,QAA0C;QAE1C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,IAAI,CACT,KAAQ,EACR,IAAsC;QAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,2EAA2E;gBAC3E,iDAAiD;gBACjD,cAAc,CAAC,GAAG,EAAE;oBAClB,IAAI,CAAC;wBACH,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;4BAC9B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gCAC9B,mCAAmC;gCACnC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oCACrB,OAAO,CAAC,KAAK,CACX,+BAA+B,MAAM,CAAC,KAAK,CAAC,GAAG,EAC/C,KAAK,CACN,CAAC;gCACJ,CAAC,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,8BAA8B;4BAC9B,OAAO,CAAC,KAAK,CACX,+BAA+B,MAAM,CAAC,KAAK,CAAC,GAAG,EAC/C,KAAK,CACN,CAAC;wBACJ,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,uDAAuD;wBACvD,OAAO,CAAC,KAAK,CACX,+CAA+C,MAAM,CAAC,KAAK,CAAC,GAAG,EAC/D,KAAK,CACN,CAAC;oBACJ,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Plugin, PluginContext } from "./contracts/Plugin.js";
|
|
2
|
+
/**
|
|
3
|
+
* Manages the lifecycle of plugins.
|
|
4
|
+
*/
|
|
5
|
+
export declare class PluginManager<TContext> {
|
|
6
|
+
private context;
|
|
7
|
+
private plugins;
|
|
8
|
+
constructor(context: PluginContext<TContext>);
|
|
9
|
+
/**
|
|
10
|
+
* Registers a plugin.
|
|
11
|
+
* @param plugin The plugin to register.
|
|
12
|
+
*/
|
|
13
|
+
use(plugin: Plugin<TContext>): void;
|
|
14
|
+
/**
|
|
15
|
+
* Initializes all registered plugins in parallel.
|
|
16
|
+
*/
|
|
17
|
+
initialize(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the list of registered plugins.
|
|
20
|
+
*/
|
|
21
|
+
getPlugins(): ReadonlyArray<Plugin<TContext>>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages the lifecycle of plugins.
|
|
3
|
+
*/
|
|
4
|
+
export class PluginManager {
|
|
5
|
+
context;
|
|
6
|
+
plugins = [];
|
|
7
|
+
constructor(context) {
|
|
8
|
+
this.context = context;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Registers a plugin.
|
|
12
|
+
* @param plugin The plugin to register.
|
|
13
|
+
*/
|
|
14
|
+
use(plugin) {
|
|
15
|
+
// Check if plugin is already registered
|
|
16
|
+
if (this.plugins.some((p) => p.name === plugin.name)) {
|
|
17
|
+
// For now, we allow overwriting or just warn?
|
|
18
|
+
// Let's just allow it but maybe log it if we had a logger.
|
|
19
|
+
// Strict check: don't allow duplicate names.
|
|
20
|
+
throw new Error(`Plugin with name '${plugin.name}' is already registered.`);
|
|
21
|
+
}
|
|
22
|
+
this.plugins.push(plugin);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Initializes all registered plugins in parallel.
|
|
26
|
+
*/
|
|
27
|
+
async initialize() {
|
|
28
|
+
const installPromises = this.plugins
|
|
29
|
+
.map((plugin) => plugin.install(this.context))
|
|
30
|
+
.filter((result) => result instanceof Promise);
|
|
31
|
+
await Promise.all(installPromises);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Returns the list of registered plugins.
|
|
35
|
+
*/
|
|
36
|
+
getPlugins() {
|
|
37
|
+
return this.plugins;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=PluginManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginManager.js","sourceRoot":"","sources":["../src/PluginManager.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,aAAa;IAGJ;IAFZ,OAAO,GAAuB,EAAE,CAAC;IAEzC,YAAoB,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;IAAG,CAAC;IAExD;;;OAGG;IACI,GAAG,CAAC,MAAwB;QACjC,wCAAwC;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,8CAA8C;YAC9C,2DAA2D;YAC3D,6CAA6C;YAC7C,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,IAAI,0BAA0B,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAU;QACrB,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO;aACjC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC7C,MAAM,CAAC,CAAC,MAAM,EAA2B,EAAE,CAAC,MAAM,YAAY,OAAO,CAAC,CAAC;QAE1E,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,UAAU;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -19,7 +19,7 @@ export declare class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
19
19
|
* @returns A formatted error string.
|
|
20
20
|
*/
|
|
21
21
|
createErrorMessage(result: ValidationResult): string;
|
|
22
|
-
private
|
|
22
|
+
private buildTaskMapAndCheckDuplicates;
|
|
23
23
|
private checkMissingDependencies;
|
|
24
24
|
private checkCycles;
|
|
25
25
|
private detectCycle;
|
|
@@ -12,15 +12,15 @@ export class TaskGraphValidator {
|
|
|
12
12
|
*/
|
|
13
13
|
validate(taskGraph) {
|
|
14
14
|
const errors = [];
|
|
15
|
-
// 1. Check
|
|
16
|
-
const
|
|
15
|
+
// 1. Build Map and Check Duplicates (Single Pass)
|
|
16
|
+
const taskMap = this.buildTaskMapAndCheckDuplicates(taskGraph, errors);
|
|
17
17
|
// 2. Check for missing dependencies
|
|
18
|
-
this.checkMissingDependencies(taskGraph,
|
|
18
|
+
this.checkMissingDependencies(taskGraph, taskMap, errors);
|
|
19
19
|
// 3. Check for cycles
|
|
20
20
|
// Only run cycle detection if there are no missing dependencies, otherwise we might chase non-existent nodes.
|
|
21
21
|
const hasMissingDependencies = errors.some((e) => e.type === ERROR_MISSING_DEPENDENCY);
|
|
22
22
|
if (!hasMissingDependencies) {
|
|
23
|
-
this.checkCycles(taskGraph, errors);
|
|
23
|
+
this.checkCycles(taskGraph, taskMap, errors);
|
|
24
24
|
}
|
|
25
25
|
return {
|
|
26
26
|
isValid: errors.length === 0,
|
|
@@ -36,10 +36,10 @@ export class TaskGraphValidator {
|
|
|
36
36
|
const errorDetails = result.errors.map((e) => e.message);
|
|
37
37
|
return `Task graph validation failed: ${errorDetails.join("; ")}`;
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
const
|
|
39
|
+
buildTaskMapAndCheckDuplicates(taskGraph, errors) {
|
|
40
|
+
const taskMap = new Map();
|
|
41
41
|
for (const task of taskGraph.tasks) {
|
|
42
|
-
if (
|
|
42
|
+
if (taskMap.has(task.id)) {
|
|
43
43
|
errors.push({
|
|
44
44
|
type: ERROR_DUPLICATE_TASK,
|
|
45
45
|
message: `Duplicate task detected with ID: ${task.id}`,
|
|
@@ -47,15 +47,15 @@ export class TaskGraphValidator {
|
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
else {
|
|
50
|
-
|
|
50
|
+
taskMap.set(task.id, task);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
return
|
|
53
|
+
return taskMap;
|
|
54
54
|
}
|
|
55
|
-
checkMissingDependencies(taskGraph,
|
|
55
|
+
checkMissingDependencies(taskGraph, taskMap, errors) {
|
|
56
56
|
for (const task of taskGraph.tasks) {
|
|
57
57
|
for (const dependenceId of task.dependencies) {
|
|
58
|
-
if (!
|
|
58
|
+
if (!taskMap.has(dependenceId)) {
|
|
59
59
|
errors.push({
|
|
60
60
|
type: ERROR_MISSING_DEPENDENCY,
|
|
61
61
|
message: `Task '${task.id}' depends on missing task '${dependenceId}'`,
|
|
@@ -65,12 +65,7 @@ export class TaskGraphValidator {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
-
checkCycles(taskGraph, errors) {
|
|
69
|
-
// Build adjacency list
|
|
70
|
-
const adjacencyList = new Map();
|
|
71
|
-
for (const task of taskGraph.tasks) {
|
|
72
|
-
adjacencyList.set(task.id, task.dependencies);
|
|
73
|
-
}
|
|
68
|
+
checkCycles(taskGraph, taskMap, errors) {
|
|
74
69
|
const visited = new Set();
|
|
75
70
|
const recursionStack = new Set();
|
|
76
71
|
for (const task of taskGraph.tasks) {
|
|
@@ -78,7 +73,7 @@ export class TaskGraphValidator {
|
|
|
78
73
|
continue;
|
|
79
74
|
}
|
|
80
75
|
const path = [];
|
|
81
|
-
if (this.detectCycle(task.id, path, visited, recursionStack,
|
|
76
|
+
if (this.detectCycle(task.id, path, visited, recursionStack, taskMap)) {
|
|
82
77
|
// Extract the actual cycle from the path
|
|
83
78
|
// The path might look like A -> B -> C -> B (if we started at A and found cycle B-C-B)
|
|
84
79
|
const cycleStart = path[path.length - 1];
|
|
@@ -94,7 +89,7 @@ export class TaskGraphValidator {
|
|
|
94
89
|
}
|
|
95
90
|
}
|
|
96
91
|
}
|
|
97
|
-
detectCycle(startTaskId, path, visited, recursionStack,
|
|
92
|
+
detectCycle(startTaskId, path, visited, recursionStack, taskMap) {
|
|
98
93
|
// Use an explicit stack to avoid maximum call stack size exceeded errors
|
|
99
94
|
const stack = [];
|
|
100
95
|
visited.add(startTaskId);
|
|
@@ -103,7 +98,7 @@ export class TaskGraphValidator {
|
|
|
103
98
|
stack.push({
|
|
104
99
|
taskId: startTaskId,
|
|
105
100
|
index: 0,
|
|
106
|
-
dependencies:
|
|
101
|
+
dependencies: taskMap.get(startTaskId).dependencies,
|
|
107
102
|
});
|
|
108
103
|
while (stack.length > 0) {
|
|
109
104
|
const frame = stack[stack.length - 1];
|
|
@@ -123,7 +118,7 @@ export class TaskGraphValidator {
|
|
|
123
118
|
stack.push({
|
|
124
119
|
taskId: dependenceId,
|
|
125
120
|
index: 0,
|
|
126
|
-
dependencies:
|
|
121
|
+
dependencies: taskMap.get(dependenceId).dependencies,
|
|
127
122
|
});
|
|
128
123
|
}
|
|
129
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskGraphValidator.js","sourceRoot":"","sources":["../src/TaskGraphValidator.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,OAAO,kBAAkB;IAC7B;;;;;;;;;OASG;IACH,QAAQ,CAAC,SAAoB;QAC3B,MAAM,MAAM,GAAsB,EAAE,CAAC;QAErC
|
|
1
|
+
{"version":3,"file":"TaskGraphValidator.js","sourceRoot":"","sources":["../src/TaskGraphValidator.ts"],"names":[],"mappings":"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"}
|
package/dist/TaskRunner.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { TaskResult } from "./TaskResult.js";
|
|
|
3
3
|
import { RunnerEventPayloads, RunnerEventListener } from "./contracts/RunnerEvents.js";
|
|
4
4
|
import { TaskRunnerExecutionConfig } from "./TaskRunnerExecutionConfig.js";
|
|
5
5
|
import { IExecutionStrategy } from "./strategies/IExecutionStrategy.js";
|
|
6
|
-
|
|
6
|
+
import { Plugin } from "./contracts/Plugin.js";
|
|
7
7
|
/**
|
|
8
8
|
* The main class that orchestrates the execution of a list of tasks
|
|
9
9
|
* based on their dependencies, with support for parallel execution.
|
|
@@ -14,6 +14,7 @@ export declare class TaskRunner<TContext> {
|
|
|
14
14
|
private eventBus;
|
|
15
15
|
private validator;
|
|
16
16
|
private executionStrategy;
|
|
17
|
+
private pluginManager;
|
|
17
18
|
/**
|
|
18
19
|
* @param context The shared context object to be passed to each task.
|
|
19
20
|
*/
|
|
@@ -30,6 +31,12 @@ export declare class TaskRunner<TContext> {
|
|
|
30
31
|
* @param callback The callback to remove.
|
|
31
32
|
*/
|
|
32
33
|
off<K extends keyof RunnerEventPayloads<TContext>>(event: K, callback: RunnerEventListener<TContext, K>): void;
|
|
34
|
+
/**
|
|
35
|
+
* Registers a plugin.
|
|
36
|
+
* @param plugin The plugin to register.
|
|
37
|
+
* @returns The TaskRunner instance for chaining.
|
|
38
|
+
*/
|
|
39
|
+
use(plugin: Plugin<TContext>): this;
|
|
33
40
|
/**
|
|
34
41
|
* Sets the execution strategy to be used.
|
|
35
42
|
* @param strategy The execution strategy.
|
package/dist/TaskRunner.js
CHANGED
|
@@ -5,6 +5,7 @@ import { TaskStateManager } from "./TaskStateManager.js";
|
|
|
5
5
|
import { TaskGraphValidationError } from "./TaskGraphValidationError.js";
|
|
6
6
|
import { StandardExecutionStrategy } from "./strategies/StandardExecutionStrategy.js";
|
|
7
7
|
import { RetryingExecutionStrategy } from "./strategies/RetryingExecutionStrategy.js";
|
|
8
|
+
import { PluginManager } from "./PluginManager.js";
|
|
8
9
|
import { DryRunExecutionStrategy } from "./strategies/DryRunExecutionStrategy.js";
|
|
9
10
|
/**
|
|
10
11
|
* The main class that orchestrates the execution of a list of tasks
|
|
@@ -16,11 +17,13 @@ export class TaskRunner {
|
|
|
16
17
|
eventBus = new EventBus();
|
|
17
18
|
validator = new TaskGraphValidator();
|
|
18
19
|
executionStrategy = new RetryingExecutionStrategy(new StandardExecutionStrategy());
|
|
20
|
+
pluginManager;
|
|
19
21
|
/**
|
|
20
22
|
* @param context The shared context object to be passed to each task.
|
|
21
23
|
*/
|
|
22
24
|
constructor(context) {
|
|
23
25
|
this.context = context;
|
|
26
|
+
this.pluginManager = new PluginManager({ events: this.eventBus });
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* Subscribe to an event.
|
|
@@ -36,16 +39,23 @@ export class TaskRunner {
|
|
|
36
39
|
* @param callback The callback to remove.
|
|
37
40
|
*/
|
|
38
41
|
off(event, callback) {
|
|
39
|
-
/* v8 ignore next 1 */
|
|
40
42
|
this.eventBus.off(event, callback);
|
|
41
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Registers a plugin.
|
|
46
|
+
* @param plugin The plugin to register.
|
|
47
|
+
* @returns The TaskRunner instance for chaining.
|
|
48
|
+
*/
|
|
49
|
+
use(plugin) {
|
|
50
|
+
this.pluginManager.use(plugin);
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
42
53
|
/**
|
|
43
54
|
* Sets the execution strategy to be used.
|
|
44
55
|
* @param strategy The execution strategy.
|
|
45
56
|
* @returns The TaskRunner instance for chaining.
|
|
46
57
|
*/
|
|
47
58
|
setExecutionStrategy(strategy) {
|
|
48
|
-
/* v8 ignore next 2 */
|
|
49
59
|
this.executionStrategy = strategy;
|
|
50
60
|
return this;
|
|
51
61
|
}
|
|
@@ -55,13 +65,15 @@ export class TaskRunner {
|
|
|
55
65
|
* @returns A string containing the Mermaid graph definition.
|
|
56
66
|
*/
|
|
57
67
|
static getMermaidGraph(steps) {
|
|
58
|
-
const
|
|
68
|
+
const nodeLines = ["graph TD"];
|
|
69
|
+
const edgeLines = new Set();
|
|
59
70
|
const idMap = new Map();
|
|
60
71
|
const usedIds = new Set();
|
|
61
72
|
const baseIdCounters = new Map();
|
|
62
73
|
const getUniqueId = (name) => {
|
|
63
|
-
|
|
64
|
-
|
|
74
|
+
const existingId = idMap.get(name);
|
|
75
|
+
if (existingId !== undefined) {
|
|
76
|
+
return existingId;
|
|
65
77
|
}
|
|
66
78
|
const sanitized = this.sanitizeMermaidId(name);
|
|
67
79
|
let uniqueId = sanitized;
|
|
@@ -82,27 +94,27 @@ export class TaskRunner {
|
|
|
82
94
|
idMap.set(name, uniqueId);
|
|
83
95
|
return uniqueId;
|
|
84
96
|
};
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
getUniqueId(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
// Process nodes and edges in a single pass over input steps
|
|
98
|
+
const processedNodes = new Set();
|
|
99
|
+
for (let i = 0; i < steps.length; i++) {
|
|
100
|
+
const step = steps[i];
|
|
101
|
+
const name = step.name;
|
|
102
|
+
const stepId = getUniqueId(name);
|
|
103
|
+
const sizeBefore = processedNodes.size;
|
|
104
|
+
processedNodes.add(stepId);
|
|
105
|
+
if (processedNodes.size !== sizeBefore) {
|
|
106
|
+
const escapedName = name.replaceAll("\"", """);
|
|
107
|
+
nodeLines.push(` ${stepId}["${escapedName}"]`);
|
|
108
|
+
}
|
|
97
109
|
if (step.dependencies) {
|
|
98
|
-
const
|
|
99
|
-
for (
|
|
100
|
-
const depId = getUniqueId(
|
|
101
|
-
|
|
110
|
+
const deps = step.dependencies;
|
|
111
|
+
for (let j = 0; j < deps.length; j++) {
|
|
112
|
+
const depId = getUniqueId(deps[j]);
|
|
113
|
+
edgeLines.add(` ${depId} --> ${stepId}`);
|
|
102
114
|
}
|
|
103
115
|
}
|
|
104
116
|
}
|
|
105
|
-
return [...
|
|
117
|
+
return nodeLines.concat([...edgeLines]).join("\n");
|
|
106
118
|
}
|
|
107
119
|
/**
|
|
108
120
|
* Sanitizes a string for use as a Mermaid node ID.
|
|
@@ -121,6 +133,8 @@ export class TaskRunner {
|
|
|
121
133
|
* and values are the corresponding TaskResult objects.
|
|
122
134
|
*/
|
|
123
135
|
async execute(steps, config) {
|
|
136
|
+
// Initialize plugins
|
|
137
|
+
await this.pluginManager.initialize();
|
|
124
138
|
// Validate the task graph before execution
|
|
125
139
|
const taskGraph = {
|
|
126
140
|
tasks: steps.map((step) => ({
|
|
@@ -141,9 +155,7 @@ export class TaskRunner {
|
|
|
141
155
|
if (config?.timeout !== undefined) {
|
|
142
156
|
return this.executeWithTimeout(executor, steps, config.timeout, config.signal);
|
|
143
157
|
}
|
|
144
|
-
|
|
145
|
-
return executor.execute(steps, config?.signal);
|
|
146
|
-
}
|
|
158
|
+
return executor.execute(steps, config?.signal);
|
|
147
159
|
}
|
|
148
160
|
/**
|
|
149
161
|
* Executes tasks with a timeout, ensuring resources are cleaned up.
|
package/dist/TaskRunner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../src/TaskRunner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAM7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../src/TaskRunner.ts"],"names":[],"mappings":"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"}
|
package/dist/TaskStateManager.js
CHANGED
|
@@ -11,6 +11,7 @@ export class TaskStateManager {
|
|
|
11
11
|
dependencyGraph = new Map();
|
|
12
12
|
dependencyCounts = new Map();
|
|
13
13
|
readyQueue = [];
|
|
14
|
+
taskDefinitions = new Map();
|
|
14
15
|
constructor(eventBus) {
|
|
15
16
|
this.eventBus = eventBus;
|
|
16
17
|
}
|
|
@@ -25,7 +26,9 @@ export class TaskStateManager {
|
|
|
25
26
|
this.readyQueue = [];
|
|
26
27
|
this.dependencyGraph.clear();
|
|
27
28
|
this.dependencyCounts.clear();
|
|
29
|
+
this.taskDefinitions.clear();
|
|
28
30
|
for (const step of steps) {
|
|
31
|
+
this.taskDefinitions.set(step.name, step);
|
|
29
32
|
const deps = step.dependencies ?? [];
|
|
30
33
|
this.dependencyCounts.set(step.name, deps.length);
|
|
31
34
|
if (deps.length === 0) {
|
|
@@ -33,10 +36,12 @@ export class TaskStateManager {
|
|
|
33
36
|
}
|
|
34
37
|
else {
|
|
35
38
|
for (const dep of deps) {
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
let dependents = this.dependencyGraph.get(dep);
|
|
40
|
+
if (dependents === undefined) {
|
|
41
|
+
dependents = [];
|
|
42
|
+
this.dependencyGraph.set(dep, dependents);
|
|
38
43
|
}
|
|
39
|
-
|
|
44
|
+
dependents.push(step);
|
|
40
45
|
}
|
|
41
46
|
}
|
|
42
47
|
}
|
|
@@ -47,7 +52,7 @@ export class TaskStateManager {
|
|
|
47
52
|
* @returns An array of tasks that are ready to run.
|
|
48
53
|
*/
|
|
49
54
|
processDependencies() {
|
|
50
|
-
const toRun =
|
|
55
|
+
const toRun = this.readyQueue;
|
|
51
56
|
this.readyQueue = [];
|
|
52
57
|
// Remove them from pendingSteps as they are now handed off to the executor
|
|
53
58
|
for (const step of toRun) {
|
|
@@ -76,6 +81,15 @@ export class TaskStateManager {
|
|
|
76
81
|
if (result.status === "success") {
|
|
77
82
|
this.handleSuccess(step.name);
|
|
78
83
|
}
|
|
84
|
+
else if (result.status === "failure") {
|
|
85
|
+
// If continueOnError is true, treat as success for dependents to unblock the workflow
|
|
86
|
+
if (this.taskDefinitions.get(step.name)?.continueOnError) {
|
|
87
|
+
this.handleSuccess(step.name);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.cascadeFailure(step.name);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
79
93
|
else {
|
|
80
94
|
this.cascadeFailure(step.name);
|
|
81
95
|
}
|
|
@@ -166,10 +180,12 @@ export class TaskStateManager {
|
|
|
166
180
|
*/
|
|
167
181
|
cascadeFailure(failedStepName) {
|
|
168
182
|
const queue = [failedStepName];
|
|
183
|
+
// Optimization: Use index pointer instead of shift() to avoid O(N) array re-indexing
|
|
184
|
+
let head = 0;
|
|
169
185
|
// Use a set to track visited nodes in this cascade pass to avoid redundant processing,
|
|
170
186
|
// although checking results.has() in internalMarkSkipped also prevents it.
|
|
171
|
-
while (queue.length
|
|
172
|
-
const currentName = queue
|
|
187
|
+
while (head < queue.length) {
|
|
188
|
+
const currentName = queue[head++];
|
|
173
189
|
const dependents = this.dependencyGraph.get(currentName);
|
|
174
190
|
if (!dependents)
|
|
175
191
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskStateManager.js","sourceRoot":"","sources":["../src/TaskStateManager.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,OAAO,gBAAgB;
|
|
1
|
+
{"version":3,"file":"TaskStateManager.js","sourceRoot":"","sources":["../src/TaskStateManager.ts"],"names":[],"mappings":"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"}
|
package/dist/TaskStep.d.ts
CHANGED
|
@@ -22,6 +22,18 @@ export interface TaskStep<TContext> {
|
|
|
22
22
|
* Only affects ordering when multiple tasks are ready and concurrency slots are limited.
|
|
23
23
|
*/
|
|
24
24
|
priority?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Optional flag to indicate that the workflow should continue even if this task fails.
|
|
27
|
+
* If true, dependent tasks will execute as if this task succeeded.
|
|
28
|
+
* The task result will still be marked as "failure".
|
|
29
|
+
* Default is false.
|
|
30
|
+
*/
|
|
31
|
+
continueOnError?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Optional maximum execution time in milliseconds.
|
|
34
|
+
* If the task runs longer than this, it will be cancelled and marked as failed.
|
|
35
|
+
*/
|
|
36
|
+
timeout?: number;
|
|
25
37
|
/**
|
|
26
38
|
* The core logic of the task.
|
|
27
39
|
* @param context The shared context object, allowing for state to be passed between tasks.
|