@calmo/task-runner 1.2.3 → 3.0.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/sentinel.md +4 -0
- package/AGENTS.md +53 -1
- package/CHANGELOG.md +41 -15
- package/README.md +1 -1
- package/coverage/coverage-final.json +8 -4
- package/coverage/index.html +24 -9
- package/coverage/lcov-report/index.html +24 -9
- package/coverage/lcov-report/src/EventBus.ts.html +8 -8
- package/coverage/lcov-report/src/TaskGraphValidator.ts.html +143 -62
- package/coverage/lcov-report/src/TaskRunner.ts.html +213 -21
- package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +313 -0
- package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +124 -0
- package/coverage/lcov-report/src/TaskStateManager.ts.html +511 -0
- package/coverage/lcov-report/src/WorkflowExecutor.ts.html +125 -137
- package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/lcov-report/src/contracts/index.html +1 -1
- package/coverage/lcov-report/src/index.html +59 -14
- package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +190 -0
- package/coverage/lcov-report/src/strategies/index.html +116 -0
- package/coverage/lcov.info +383 -184
- package/coverage/src/EventBus.ts.html +8 -8
- package/coverage/src/TaskGraphValidator.ts.html +143 -62
- package/coverage/src/TaskRunner.ts.html +213 -21
- package/coverage/src/TaskRunnerBuilder.ts.html +313 -0
- package/coverage/src/TaskRunnerExecutionConfig.ts.html +124 -0
- package/coverage/src/TaskStateManager.ts.html +511 -0
- package/coverage/src/WorkflowExecutor.ts.html +125 -137
- package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/src/contracts/index.html +1 -1
- package/coverage/src/index.html +59 -14
- package/coverage/src/strategies/StandardExecutionStrategy.ts.html +190 -0
- package/coverage/src/strategies/index.html +116 -0
- package/dist/TaskGraphValidator.js +39 -16
- package/dist/TaskGraphValidator.js.map +1 -1
- package/dist/TaskRunner.d.ts +12 -2
- package/dist/TaskRunner.js +55 -3
- package/dist/TaskRunner.js.map +1 -1
- package/dist/TaskRunnerBuilder.d.ts +33 -0
- package/dist/TaskRunnerBuilder.js +54 -0
- package/dist/TaskRunnerBuilder.js.map +1 -0
- package/dist/TaskRunnerExecutionConfig.d.ts +13 -0
- package/dist/TaskRunnerExecutionConfig.js +2 -0
- package/dist/TaskRunnerExecutionConfig.js.map +1 -0
- package/dist/TaskStateManager.d.ts +54 -0
- package/dist/TaskStateManager.js +130 -0
- package/dist/TaskStateManager.js.map +1 -0
- package/dist/TaskStatus.d.ts +1 -1
- package/dist/TaskStep.d.ts +2 -1
- package/dist/WorkflowExecutor.d.ts +11 -10
- package/dist/WorkflowExecutor.js +64 -73
- package/dist/WorkflowExecutor.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/strategies/IExecutionStrategy.d.ts +16 -0
- package/dist/strategies/IExecutionStrategy.js +2 -0
- package/dist/strategies/IExecutionStrategy.js.map +1 -0
- package/dist/strategies/StandardExecutionStrategy.d.ts +9 -0
- package/dist/strategies/StandardExecutionStrategy.js +25 -0
- package/dist/strategies/StandardExecutionStrategy.js.map +1 -0
- package/openspec/changes/add-concurrency-control/proposal.md +14 -0
- package/openspec/changes/add-concurrency-control/tasks.md +9 -0
- package/openspec/changes/add-task-retry-policy/proposal.md +13 -0
- package/openspec/changes/add-task-retry-policy/tasks.md +10 -0
- package/openspec/changes/add-workflow-preview/proposal.md +12 -0
- package/openspec/changes/add-workflow-preview/tasks.md +7 -0
- package/openspec/changes/archive/2026-01-18-add-external-task-cancellation/tasks.md +10 -0
- package/openspec/changes/archive/2026-01-18-add-integration-tests/proposal.md +18 -0
- package/openspec/changes/archive/2026-01-18-add-integration-tests/tasks.md +17 -0
- package/openspec/changes/archive/2026-01-18-refactor-core-architecture/proposal.md +14 -0
- package/openspec/changes/archive/2026-01-18-refactor-core-architecture/tasks.md +8 -0
- package/package.json +1 -1
- package/src/TaskGraphValidator.ts +46 -19
- package/src/TaskRunner.ts +68 -4
- package/src/TaskRunnerBuilder.ts +76 -0
- package/src/TaskRunnerExecutionConfig.ts +13 -0
- package/src/TaskStateManager.ts +142 -0
- package/src/TaskStatus.ts +1 -1
- package/src/TaskStep.ts +2 -1
- package/src/WorkflowExecutor.ts +75 -79
- package/src/index.ts +4 -0
- package/src/strategies/IExecutionStrategy.ts +21 -0
- package/src/strategies/StandardExecutionStrategy.ts +35 -0
- package/test-report.xml +121 -43
- package/GEMINI.md +0 -46
- package/openspec/changes/add-external-task-cancellation/tasks.md +0 -10
- /package/openspec/changes/{add-external-task-cancellation → archive/2026-01-18-add-external-task-cancellation}/proposal.md +0 -0
|
@@ -25,28 +25,28 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">100% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>33/33</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
33
|
<span class="strong">100% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>14/14</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
40
|
<span class="strong">100% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>8/8</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
47
|
<span class="strong">100% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>33/33</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -137,7 +137,71 @@
|
|
|
137
137
|
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
138
|
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
139
|
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
-
<a name='L75'></a><a href='#L75'>75</a
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
141
205
|
<span class="cline-any cline-neutral"> </span>
|
|
142
206
|
<span class="cline-any cline-neutral"> </span>
|
|
143
207
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -154,28 +218,44 @@
|
|
|
154
218
|
<span class="cline-any cline-neutral"> </span>
|
|
155
219
|
<span class="cline-any cline-neutral"> </span>
|
|
156
220
|
<span class="cline-any cline-neutral"> </span>
|
|
157
|
-
<span class="cline-any cline-yes">22x</span>
|
|
158
|
-
<span class="cline-any cline-yes">22x</span>
|
|
159
221
|
<span class="cline-any cline-neutral"> </span>
|
|
160
222
|
<span class="cline-any cline-neutral"> </span>
|
|
161
223
|
<span class="cline-any cline-neutral"> </span>
|
|
162
224
|
<span class="cline-any cline-neutral"> </span>
|
|
163
|
-
<span class="cline-any cline-yes">
|
|
225
|
+
<span class="cline-any cline-yes">50x</span>
|
|
226
|
+
<span class="cline-any cline-yes">50x</span>
|
|
227
|
+
<span class="cline-any cline-yes">50x</span>
|
|
164
228
|
<span class="cline-any cline-neutral"> </span>
|
|
165
229
|
<span class="cline-any cline-neutral"> </span>
|
|
166
230
|
<span class="cline-any cline-neutral"> </span>
|
|
167
231
|
<span class="cline-any cline-neutral"> </span>
|
|
232
|
+
<span class="cline-any cline-yes">50x</span>
|
|
168
233
|
<span class="cline-any cline-neutral"> </span>
|
|
169
234
|
<span class="cline-any cline-neutral"> </span>
|
|
170
235
|
<span class="cline-any cline-neutral"> </span>
|
|
171
236
|
<span class="cline-any cline-neutral"> </span>
|
|
172
237
|
<span class="cline-any cline-neutral"> </span>
|
|
173
238
|
<span class="cline-any cline-neutral"> </span>
|
|
174
|
-
<span class="cline-any cline-yes">12x</span>
|
|
175
239
|
<span class="cline-any cline-neutral"> </span>
|
|
176
240
|
<span class="cline-any cline-neutral"> </span>
|
|
177
241
|
<span class="cline-any cline-neutral"> </span>
|
|
178
242
|
<span class="cline-any cline-neutral"> </span>
|
|
243
|
+
<span class="cline-any cline-yes">15x</span>
|
|
244
|
+
<span class="cline-any cline-neutral"> </span>
|
|
245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
250
|
+
<span class="cline-any cline-neutral"> </span>
|
|
251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
256
|
+
<span class="cline-any cline-yes">3x</span>
|
|
257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
179
259
|
<span class="cline-any cline-neutral"> </span>
|
|
180
260
|
<span class="cline-any cline-neutral"> </span>
|
|
181
261
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -184,6 +264,7 @@
|
|
|
184
264
|
<span class="cline-any cline-neutral"> </span>
|
|
185
265
|
<span class="cline-any cline-neutral"> </span>
|
|
186
266
|
<span class="cline-any cline-yes">2x</span>
|
|
267
|
+
<span class="cline-any cline-yes">2x</span>
|
|
187
268
|
<span class="cline-any cline-neutral"> </span>
|
|
188
269
|
<span class="cline-any cline-neutral"> </span>
|
|
189
270
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -195,20 +276,67 @@
|
|
|
195
276
|
<span class="cline-any cline-neutral"> </span>
|
|
196
277
|
<span class="cline-any cline-neutral"> </span>
|
|
197
278
|
<span class="cline-any cline-neutral"> </span>
|
|
198
|
-
<span class="cline-any cline-yes">21x</span>
|
|
199
|
-
<span class="cline-any cline-yes">43x</span>
|
|
200
279
|
<span class="cline-any cline-neutral"> </span>
|
|
201
280
|
<span class="cline-any cline-neutral"> </span>
|
|
202
281
|
<span class="cline-any cline-neutral"> </span>
|
|
203
282
|
<span class="cline-any cline-neutral"> </span>
|
|
283
|
+
<span class="cline-any cline-yes">45x</span>
|
|
284
|
+
<span class="cline-any cline-yes">121x</span>
|
|
204
285
|
<span class="cline-any cline-neutral"> </span>
|
|
205
|
-
<span class="cline-any cline-yes">21x</span>
|
|
206
|
-
<span class="cline-any cline-yes">21x</span>
|
|
207
|
-
<span class="cline-any cline-yes">6x</span>
|
|
208
286
|
<span class="cline-any cline-neutral"> </span>
|
|
209
287
|
<span class="cline-any cline-neutral"> </span>
|
|
210
|
-
<span class="cline-any cline-
|
|
211
|
-
<span class="cline-any cline-
|
|
288
|
+
<span class="cline-any cline-neutral"> </span>
|
|
289
|
+
<span class="cline-any cline-neutral"> </span>
|
|
290
|
+
<span class="cline-any cline-yes">45x</span>
|
|
291
|
+
<span class="cline-any cline-yes">45x</span>
|
|
292
|
+
<span class="cline-any cline-yes">8x</span>
|
|
293
|
+
<span class="cline-any cline-neutral"> </span>
|
|
294
|
+
<span class="cline-any cline-neutral"> </span>
|
|
295
|
+
<span class="cline-any cline-yes">37x</span>
|
|
296
|
+
<span class="cline-any cline-yes">37x</span>
|
|
297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
300
|
+
<span class="cline-any cline-neutral"> </span>
|
|
301
|
+
<span class="cline-any cline-neutral"> </span>
|
|
302
|
+
<span class="cline-any cline-neutral"> </span>
|
|
303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
304
|
+
<span class="cline-any cline-yes">37x</span>
|
|
305
|
+
<span class="cline-any cline-yes">5x</span>
|
|
306
|
+
<span class="cline-any cline-yes">5x</span>
|
|
307
|
+
<span class="cline-any cline-yes">3x</span>
|
|
308
|
+
<span class="cline-any cline-neutral"> </span>
|
|
309
|
+
<span class="cline-any cline-neutral"> </span>
|
|
310
|
+
<span class="cline-any cline-yes">5x</span>
|
|
311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
312
|
+
<span class="cline-any cline-neutral"> </span>
|
|
313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
314
|
+
<span class="cline-any cline-yes">5x</span>
|
|
315
|
+
<span class="cline-any cline-yes">3x</span>
|
|
316
|
+
<span class="cline-any cline-neutral"> </span>
|
|
317
|
+
<span class="cline-any cline-neutral"> </span>
|
|
318
|
+
<span class="cline-any cline-yes">1x</span>
|
|
319
|
+
<span class="cline-any cline-yes">1x</span>
|
|
320
|
+
<span class="cline-any cline-neutral"> </span>
|
|
321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
322
|
+
<span class="cline-any cline-yes">2x</span>
|
|
323
|
+
<span class="cline-any cline-yes">1x</span>
|
|
324
|
+
<span class="cline-any cline-neutral"> </span>
|
|
325
|
+
<span class="cline-any cline-yes">2x</span>
|
|
326
|
+
<span class="cline-any cline-neutral"> </span>
|
|
327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
328
|
+
<span class="cline-any cline-neutral"> </span>
|
|
329
|
+
<span class="cline-any cline-yes">5x</span>
|
|
330
|
+
<span class="cline-any cline-yes">5x</span>
|
|
331
|
+
<span class="cline-any cline-neutral"> </span>
|
|
332
|
+
<span class="cline-any cline-yes">5x</span>
|
|
333
|
+
<span class="cline-any cline-yes">5x</span>
|
|
334
|
+
<span class="cline-any cline-yes">2x</span>
|
|
335
|
+
<span class="cline-any cline-neutral"> </span>
|
|
336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
337
|
+
<span class="cline-any cline-neutral"> </span>
|
|
338
|
+
<span class="cline-any cline-yes">32x</span>
|
|
339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
212
340
|
<span class="cline-any cline-neutral"> </span>
|
|
213
341
|
<span class="cline-any cline-neutral"> </span>
|
|
214
342
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { TaskStep } from "./TaskStep.js";
|
|
@@ -218,9 +346,13 @@ import { TaskGraph } from "./TaskGraph.js";
|
|
|
218
346
|
import { RunnerEventPayloads, RunnerEventListener } from "./contracts/RunnerEvents.js";
|
|
219
347
|
import { EventBus } from "./EventBus.js";
|
|
220
348
|
import { WorkflowExecutor } from "./WorkflowExecutor.js";
|
|
349
|
+
import { TaskRunnerExecutionConfig } from "./TaskRunnerExecutionConfig.js";
|
|
350
|
+
import { TaskStateManager } from "./TaskStateManager.js";
|
|
351
|
+
import { IExecutionStrategy } from "./strategies/IExecutionStrategy.js";
|
|
352
|
+
import { StandardExecutionStrategy } from "./strategies/StandardExecutionStrategy.js";
|
|
221
353
|
|
|
222
354
|
// Re-export types for backward compatibility
|
|
223
|
-
export { RunnerEventPayloads, RunnerEventListener };
|
|
355
|
+
export { RunnerEventPayloads, RunnerEventListener, TaskRunnerExecutionConfig };
|
|
224
356
|
|
|
225
357
|
/**
|
|
226
358
|
* The main class that orchestrates the execution of a list of tasks
|
|
@@ -230,6 +362,7 @@ export { RunnerEventPayloads, RunnerEventListener };
|
|
|
230
362
|
export class TaskRunner<TContext> {
|
|
231
363
|
private eventBus = new EventBus<TContext>();
|
|
232
364
|
private validator = new TaskGraphValidator();
|
|
365
|
+
private executionStrategy: IExecutionStrategy<TContext> = new StandardExecutionStrategy();
|
|
233
366
|
|
|
234
367
|
/**
|
|
235
368
|
* @param context The shared context object to be passed to each task.
|
|
@@ -257,17 +390,33 @@ export class TaskRunner<TContext> {
|
|
|
257
390
|
event: K,
|
|
258
391
|
callback: RunnerEventListener<TContext, K>
|
|
259
392
|
): void {
|
|
393
|
+
/* v8 ignore next 1 */
|
|
260
394
|
this.eventBus.off(event, callback);
|
|
261
395
|
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Sets the execution strategy to be used.
|
|
399
|
+
* @param strategy The execution strategy.
|
|
400
|
+
* @returns The TaskRunner instance for chaining.
|
|
401
|
+
*/
|
|
402
|
+
public setExecutionStrategy(strategy: IExecutionStrategy<TContext>): this {
|
|
403
|
+
/* v8 ignore next 2 */
|
|
404
|
+
this.executionStrategy = strategy;
|
|
405
|
+
return this;
|
|
406
|
+
}
|
|
262
407
|
|
|
263
408
|
/**
|
|
264
409
|
* Executes a list of tasks, respecting their dependencies and running
|
|
265
410
|
* independent tasks in parallel.
|
|
266
411
|
* @param steps An array of TaskStep objects to be executed.
|
|
412
|
+
* @param config Optional configuration for execution (timeout, cancellation).
|
|
267
413
|
* @returns A Promise that resolves to a Map where keys are task names
|
|
268
414
|
* and values are the corresponding TaskResult objects.
|
|
269
415
|
*/
|
|
270
|
-
async execute(
|
|
416
|
+
async execute(
|
|
417
|
+
steps: TaskStep<TContext>[],
|
|
418
|
+
config?: TaskRunnerExecutionConfig
|
|
419
|
+
): Promise<Map<string, TaskResult>> {
|
|
271
420
|
// Validate the task graph before execution
|
|
272
421
|
const taskGraph: TaskGraph = {
|
|
273
422
|
tasks: steps.map((step) => ({
|
|
@@ -281,8 +430,51 @@ export class TaskRunner<TContext> {
|
|
|
281
430
|
throw new Error(this.validator.createErrorMessage(validationResult));
|
|
282
431
|
}
|
|
283
432
|
|
|
284
|
-
const
|
|
285
|
-
|
|
433
|
+
const stateManager = new TaskStateManager(this.eventBus);
|
|
434
|
+
const executor = new WorkflowExecutor(
|
|
435
|
+
this.context,
|
|
436
|
+
this.eventBus,
|
|
437
|
+
stateManager,
|
|
438
|
+
this.executionStrategy
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
// We need to handle the timeout cleanup properly.
|
|
442
|
+
if (config?.timeout !== undefined) {
|
|
443
|
+
const controller = new AbortController();
|
|
444
|
+
const timeoutId = setTimeout(() => {
|
|
445
|
+
controller.abort(new Error(`Workflow timed out after ${config.timeout}ms`));
|
|
446
|
+
}, config.timeout);
|
|
447
|
+
|
|
448
|
+
let effectiveSignal = controller.signal;
|
|
449
|
+
let onAbort: (() => void) | undefined;
|
|
450
|
+
|
|
451
|
+
// Handle combination of signals if user provided one
|
|
452
|
+
if (config.signal) {
|
|
453
|
+
if (config.signal.aborted) {
|
|
454
|
+
// If already aborted, use it directly (WorkflowExecutor handles early abort)
|
|
455
|
+
// We can cancel timeout immediately
|
|
456
|
+
clearTimeout(timeoutId);
|
|
457
|
+
effectiveSignal = config.signal;
|
|
458
|
+
} else {
|
|
459
|
+
// Listen to user signal to abort our controller
|
|
460
|
+
onAbort = () => {
|
|
461
|
+
controller.abort(config.signal?.reason);
|
|
462
|
+
};
|
|
463
|
+
config.signal.addEventListener("abort", onAbort);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
try {
|
|
468
|
+
return await executor.execute(steps, effectiveSignal);
|
|
469
|
+
} finally {
|
|
470
|
+
clearTimeout(timeoutId);
|
|
471
|
+
if (config.signal && onAbort) {
|
|
472
|
+
config.signal.removeEventListener("abort", onAbort);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
} else {
|
|
476
|
+
return executor.execute(steps, config?.signal);
|
|
477
|
+
}
|
|
286
478
|
}
|
|
287
479
|
}
|
|
288
480
|
</pre></td></tr></table></pre>
|
|
@@ -292,7 +484,7 @@ export class TaskRunner<TContext> {
|
|
|
292
484
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
293
485
|
Code coverage generated by
|
|
294
486
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
295
|
-
at 2026-01-
|
|
487
|
+
at 2026-01-18T16:53:50.059Z
|
|
296
488
|
</div>
|
|
297
489
|
<script src="../prettify.js"></script>
|
|
298
490
|
<script>
|