@calmo/task-runner 4.1.0 → 4.2.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 +27 -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 +16 -16
- package/dist/EventBus.js.map +1 -1
- package/dist/PluginManager.d.ts +22 -0
- package/dist/PluginManager.js +39 -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 +29 -19
- package/dist/TaskRunner.js.map +1 -1
- package/dist/TaskStateManager.js +9 -5
- package/dist/TaskStateManager.js.map +1 -1
- 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/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-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/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 +7 -8
- package/src/PluginManager.ts +41 -0
- package/src/TaskGraphValidator.ts +22 -24
- package/src/TaskRunner.ts +36 -23
- package/src/TaskStateManager.ts +9 -5
- package/src/WorkflowExecutor.ts +24 -11
- package/src/contracts/Plugin.ts +32 -0
package/dist/EventBus.js
CHANGED
|
@@ -37,28 +37,28 @@ export class EventBus {
|
|
|
37
37
|
const listeners = this.listeners[event];
|
|
38
38
|
if (listeners) {
|
|
39
39
|
for (const listener of listeners) {
|
|
40
|
-
// We use
|
|
40
|
+
// We use queueMicrotask() to schedule the listener on the microtask queue,
|
|
41
41
|
// ensuring the emit method remains non-blocking.
|
|
42
|
-
|
|
43
|
-
Promise.resolve()
|
|
44
|
-
.then(() => {
|
|
42
|
+
queueMicrotask(() => {
|
|
45
43
|
try {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
try {
|
|
45
|
+
const result = listener(data);
|
|
46
|
+
if (result instanceof Promise) {
|
|
47
|
+
// Handle async listener rejections
|
|
48
|
+
result.catch((error) => {
|
|
49
|
+
console.error(`Error in event listener for ${String(event)}:`, error);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
// Handle sync listener errors
|
|
55
|
+
console.error(`Error in event listener for ${String(event)}:`, error);
|
|
52
56
|
}
|
|
53
57
|
}
|
|
54
58
|
catch (error) {
|
|
55
|
-
//
|
|
56
|
-
console.error(`
|
|
59
|
+
// detailed handling for the microtask execution itself
|
|
60
|
+
console.error(`Unexpected error in event bus execution for ${String(event)}:`, error);
|
|
57
61
|
}
|
|
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
62
|
});
|
|
63
63
|
}
|
|
64
64
|
}
|
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,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,KAAK,CAA2C,CAAC,MAAM,CACrE,QAAQ,CACT,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,IAAI,CACT,KAAQ,EACR,IAAsC;QAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAEzB,CAAC;QACd,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,
|
|
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,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,KAAK,CAA2C,CAAC,MAAM,CACrE,QAAQ,CACT,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,IAAI,CACT,KAAQ,EACR,IAAsC;QAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAEzB,CAAC;QACd,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.
|
|
16
|
+
*/
|
|
17
|
+
initialize(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the list of registered plugins.
|
|
20
|
+
*/
|
|
21
|
+
getPlugins(): ReadonlyArray<Plugin<TContext>>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
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.
|
|
26
|
+
*/
|
|
27
|
+
async initialize() {
|
|
28
|
+
for (const plugin of this.plugins) {
|
|
29
|
+
await plugin.install(this.context);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns the list of registered plugins.
|
|
34
|
+
*/
|
|
35
|
+
getPlugins() {
|
|
36
|
+
return this.plugins;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# 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,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,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,14 @@ export class TaskRunner {
|
|
|
55
65
|
* @returns A string containing the Mermaid graph definition.
|
|
56
66
|
*/
|
|
57
67
|
static getMermaidGraph(steps) {
|
|
58
|
-
const graphLines = ["graph TD"];
|
|
68
|
+
const graphLines = new Set(["graph TD"]);
|
|
59
69
|
const idMap = new Map();
|
|
60
70
|
const usedIds = new Set();
|
|
61
71
|
const baseIdCounters = new Map();
|
|
62
72
|
const getUniqueId = (name) => {
|
|
63
|
-
|
|
64
|
-
|
|
73
|
+
const existingId = idMap.get(name);
|
|
74
|
+
if (existingId !== undefined) {
|
|
75
|
+
return existingId;
|
|
65
76
|
}
|
|
66
77
|
const sanitized = this.sanitizeMermaidId(name);
|
|
67
78
|
let uniqueId = sanitized;
|
|
@@ -82,27 +93,26 @@ export class TaskRunner {
|
|
|
82
93
|
idMap.set(name, uniqueId);
|
|
83
94
|
return uniqueId;
|
|
84
95
|
};
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
// However, we must process all step NAMES first.
|
|
96
|
+
// We process nodes in input order to ensure deterministic ID generation
|
|
97
|
+
// (getUniqueId is called for each unique step name in order, populating the cache).
|
|
98
|
+
const processedNamesForNodes = new Set();
|
|
89
99
|
for (const step of steps) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
100
|
+
if (!processedNamesForNodes.has(step.name)) {
|
|
101
|
+
const stepId = getUniqueId(step.name);
|
|
102
|
+
graphLines.add(` ${stepId}[${JSON.stringify(step.name)}]`);
|
|
103
|
+
processedNamesForNodes.add(step.name);
|
|
104
|
+
}
|
|
95
105
|
}
|
|
96
106
|
for (const step of steps) {
|
|
97
107
|
if (step.dependencies) {
|
|
98
108
|
const stepId = getUniqueId(step.name);
|
|
99
109
|
for (const dep of step.dependencies) {
|
|
100
110
|
const depId = getUniqueId(dep);
|
|
101
|
-
graphLines.
|
|
111
|
+
graphLines.add(` ${depId} --> ${stepId}`);
|
|
102
112
|
}
|
|
103
113
|
}
|
|
104
114
|
}
|
|
105
|
-
return [...
|
|
115
|
+
return [...graphLines].join("\n");
|
|
106
116
|
}
|
|
107
117
|
/**
|
|
108
118
|
* Sanitizes a string for use as a Mermaid node ID.
|
|
@@ -121,6 +131,8 @@ export class TaskRunner {
|
|
|
121
131
|
* and values are the corresponding TaskResult objects.
|
|
122
132
|
*/
|
|
123
133
|
async execute(steps, config) {
|
|
134
|
+
// Initialize plugins
|
|
135
|
+
await this.pluginManager.initialize();
|
|
124
136
|
// Validate the task graph before execution
|
|
125
137
|
const taskGraph = {
|
|
126
138
|
tasks: steps.map((step) => ({
|
|
@@ -141,9 +153,7 @@ export class TaskRunner {
|
|
|
141
153
|
if (config?.timeout !== undefined) {
|
|
142
154
|
return this.executeWithTimeout(executor, steps, config.timeout, config.signal);
|
|
143
155
|
}
|
|
144
|
-
|
|
145
|
-
return executor.execute(steps, config?.signal);
|
|
146
|
-
}
|
|
156
|
+
return executor.execute(steps, config?.signal);
|
|
147
157
|
}
|
|
148
158
|
/**
|
|
149
159
|
* 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
|
@@ -33,10 +33,12 @@ export class TaskStateManager {
|
|
|
33
33
|
}
|
|
34
34
|
else {
|
|
35
35
|
for (const dep of deps) {
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
let dependents = this.dependencyGraph.get(dep);
|
|
37
|
+
if (dependents === undefined) {
|
|
38
|
+
dependents = [];
|
|
39
|
+
this.dependencyGraph.set(dep, dependents);
|
|
38
40
|
}
|
|
39
|
-
|
|
41
|
+
dependents.push(step);
|
|
40
42
|
}
|
|
41
43
|
}
|
|
42
44
|
}
|
|
@@ -166,10 +168,12 @@ export class TaskStateManager {
|
|
|
166
168
|
*/
|
|
167
169
|
cascadeFailure(failedStepName) {
|
|
168
170
|
const queue = [failedStepName];
|
|
171
|
+
// Optimization: Use index pointer instead of shift() to avoid O(N) array re-indexing
|
|
172
|
+
let head = 0;
|
|
169
173
|
// Use a set to track visited nodes in this cascade pass to avoid redundant processing,
|
|
170
174
|
// although checking results.has() in internalMarkSkipped also prevents it.
|
|
171
|
-
while (queue.length
|
|
172
|
-
const currentName = queue
|
|
175
|
+
while (head < queue.length) {
|
|
176
|
+
const currentName = queue[head++];
|
|
173
177
|
const dependents = this.dependencyGraph.get(currentName);
|
|
174
178
|
if (!dependents)
|
|
175
179
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskStateManager.js","sourceRoot":"","sources":["../src/TaskStateManager.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAUP;IATZ,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IACxC,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,0BAA0B;IAClB,eAAe,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC1D,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,UAAU,GAAyB,EAAE,CAAC;IAE9C,YAAoB,QAA4B;QAA5B,aAAQ,GAAR,QAAQ,CAAoB;IAAG,CAAC;IAEpD;;;OAGG;IACH,UAAU,CAAC,KAA2B;QACpC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QAErB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;YACrC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAElD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,IAAI,
|
|
1
|
+
{"version":3,"file":"TaskStateManager.js","sourceRoot":"","sources":["../src/TaskStateManager.ts"],"names":[],"mappings":"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"}
|
package/dist/WorkflowExecutor.js
CHANGED
|
@@ -50,8 +50,20 @@ export class WorkflowExecutor {
|
|
|
50
50
|
signal.addEventListener("abort", onAbort);
|
|
51
51
|
}
|
|
52
52
|
try {
|
|
53
|
+
// Create a signal mechanism to wait for any task completion
|
|
54
|
+
let signalResolver;
|
|
55
|
+
let signalPromise = new Promise((resolve) => {
|
|
56
|
+
signalResolver = resolve;
|
|
57
|
+
});
|
|
58
|
+
const signalWork = () => {
|
|
59
|
+
signalResolver();
|
|
60
|
+
// Reset the promise for the next wait
|
|
61
|
+
signalPromise = new Promise((resolve) => {
|
|
62
|
+
signalResolver = resolve;
|
|
63
|
+
});
|
|
64
|
+
};
|
|
53
65
|
// Initial pass
|
|
54
|
-
this.processLoop(executingPromises, signal);
|
|
66
|
+
this.processLoop(executingPromises, signalWork, signal);
|
|
55
67
|
while (this.stateManager.hasPendingTasks() ||
|
|
56
68
|
this.stateManager.hasRunningTasks() ||
|
|
57
69
|
executingPromises.size > 0) {
|
|
@@ -63,15 +75,11 @@ export class WorkflowExecutor {
|
|
|
63
75
|
}
|
|
64
76
|
else {
|
|
65
77
|
// Wait for the next task to finish
|
|
66
|
-
await
|
|
78
|
+
await signalPromise;
|
|
67
79
|
}
|
|
68
80
|
if (signal?.aborted) {
|
|
69
81
|
this.stateManager.cancelAllPending(ExecutionConstants.WORKFLOW_CANCELLED);
|
|
70
82
|
}
|
|
71
|
-
else {
|
|
72
|
-
// After a task finishes, check for new work
|
|
73
|
-
this.processLoop(executingPromises, signal);
|
|
74
|
-
}
|
|
75
83
|
}
|
|
76
84
|
// Ensure everything is accounted for (e.g. if loop exited early)
|
|
77
85
|
this.stateManager.cancelAllPending(ExecutionConstants.WORKFLOW_CANCELLED);
|
|
@@ -88,7 +96,7 @@ export class WorkflowExecutor {
|
|
|
88
96
|
/**
|
|
89
97
|
* Logic to identify tasks that can be started and run them.
|
|
90
98
|
*/
|
|
91
|
-
processLoop(executingPromises, signal) {
|
|
99
|
+
processLoop(executingPromises, signalWork, signal) {
|
|
92
100
|
const newlyReady = this.stateManager.processDependencies();
|
|
93
101
|
// Add newly ready tasks to the queue
|
|
94
102
|
for (const task of newlyReady) {
|
|
@@ -101,11 +109,12 @@ export class WorkflowExecutor {
|
|
|
101
109
|
break;
|
|
102
110
|
}
|
|
103
111
|
const step = this.readyQueue.pop();
|
|
104
|
-
const taskPromise = this.executeTaskStep(step, signal)
|
|
105
|
-
.finally(() => {
|
|
112
|
+
const taskPromise = this.executeTaskStep(step, signal).finally(() => {
|
|
106
113
|
executingPromises.delete(taskPromise);
|
|
107
114
|
// When a task finishes, we try to run more
|
|
108
|
-
this.processLoop(executingPromises, signal);
|
|
115
|
+
this.processLoop(executingPromises, signalWork, signal);
|
|
116
|
+
// Signal that a task has completed
|
|
117
|
+
signalWork();
|
|
109
118
|
});
|
|
110
119
|
executingPromises.add(taskPromise);
|
|
111
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowExecutor.js","sourceRoot":"","sources":["../src/WorkflowExecutor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAWjB;IACA;IACA;IACA;IACA;IAdF,UAAU,GAAG,IAAI,aAAa,EAAsB,CAAC;IAE7D;;;;;;OAMG;IACH,YACU,OAAiB,EACjB,QAA4B,EAC5B,YAAwC,EACxC,QAAsC,EACtC,WAAoB;QAJpB,YAAO,GAAP,OAAO,CAAU;QACjB,aAAQ,GAAR,QAAQ,CAAoB;QAC5B,iBAAY,GAAZ,YAAY,CAA4B;QACxC,aAAQ,GAAR,QAAQ,CAA8B;QACtC,gBAAW,GAAX,WAAW,CAAS;IAC3B,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CACX,KAA2B,EAC3B,MAAoB;QAEpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAEpC,2BAA2B;QAC3B,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAChC,kBAAkB,CAAC,sBAAsB,CAC1C,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACtE,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAiB,CAAC;QAEnD,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,sCAAsC;YACtC,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QAC5E,CAAC,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC;YACH,eAAe;YACf,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkflowExecutor.js","sourceRoot":"","sources":["../src/WorkflowExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { EventBus } from "../EventBus.js";
|
|
2
|
+
/**
|
|
3
|
+
* Context provided to a plugin during installation.
|
|
4
|
+
* exposes capabilities to hook into the runner lifecycle and context.
|
|
5
|
+
*/
|
|
6
|
+
export interface PluginContext<TContext> {
|
|
7
|
+
/**
|
|
8
|
+
* The event bus instance to subscribe to runner events.
|
|
9
|
+
*/
|
|
10
|
+
events: EventBus<TContext>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Interface that all plugins must implement.
|
|
14
|
+
*/
|
|
15
|
+
export interface Plugin<TContext> {
|
|
16
|
+
/**
|
|
17
|
+
* Unique name of the plugin.
|
|
18
|
+
*/
|
|
19
|
+
name: string;
|
|
20
|
+
/**
|
|
21
|
+
* Semantic version of the plugin.
|
|
22
|
+
*/
|
|
23
|
+
version: string;
|
|
24
|
+
/**
|
|
25
|
+
* Called when the plugin is installed into the runner.
|
|
26
|
+
* This is where the plugin should subscribe to events or perform setup.
|
|
27
|
+
* @param context The plugin context exposing runner capabilities.
|
|
28
|
+
*/
|
|
29
|
+
install(context: PluginContext<TContext>): void | Promise<void>;
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plugin.js","sourceRoot":"","sources":["../../src/contracts/Plugin.ts"],"names":[],"mappings":""}
|