@calmo/task-runner 2.0.0 → 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.
Files changed (83) hide show
  1. package/AGENTS.md +49 -0
  2. package/CHANGELOG.md +21 -0
  3. package/README.md +1 -1
  4. package/coverage/coverage-final.json +8 -4
  5. package/coverage/index.html +24 -9
  6. package/coverage/lcov-report/index.html +24 -9
  7. package/coverage/lcov-report/src/EventBus.ts.html +8 -8
  8. package/coverage/lcov-report/src/TaskGraphValidator.ts.html +53 -53
  9. package/coverage/lcov-report/src/TaskRunner.ts.html +213 -21
  10. package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +313 -0
  11. package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +124 -0
  12. package/coverage/lcov-report/src/TaskStateManager.ts.html +511 -0
  13. package/coverage/lcov-report/src/WorkflowExecutor.ts.html +119 -137
  14. package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
  15. package/coverage/lcov-report/src/contracts/index.html +1 -1
  16. package/coverage/lcov-report/src/index.html +57 -12
  17. package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +190 -0
  18. package/coverage/lcov-report/src/strategies/index.html +116 -0
  19. package/coverage/lcov.info +381 -204
  20. package/coverage/src/EventBus.ts.html +8 -8
  21. package/coverage/src/TaskGraphValidator.ts.html +53 -53
  22. package/coverage/src/TaskRunner.ts.html +213 -21
  23. package/coverage/src/TaskRunnerBuilder.ts.html +313 -0
  24. package/coverage/src/TaskRunnerExecutionConfig.ts.html +124 -0
  25. package/coverage/src/TaskStateManager.ts.html +511 -0
  26. package/coverage/src/WorkflowExecutor.ts.html +119 -137
  27. package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
  28. package/coverage/src/contracts/index.html +1 -1
  29. package/coverage/src/index.html +57 -12
  30. package/coverage/src/strategies/StandardExecutionStrategy.ts.html +190 -0
  31. package/coverage/src/strategies/index.html +116 -0
  32. package/dist/TaskRunner.d.ts +12 -2
  33. package/dist/TaskRunner.js +55 -3
  34. package/dist/TaskRunner.js.map +1 -1
  35. package/dist/TaskRunnerBuilder.d.ts +33 -0
  36. package/dist/TaskRunnerBuilder.js +54 -0
  37. package/dist/TaskRunnerBuilder.js.map +1 -0
  38. package/dist/TaskRunnerExecutionConfig.d.ts +13 -0
  39. package/dist/TaskRunnerExecutionConfig.js +2 -0
  40. package/dist/TaskRunnerExecutionConfig.js.map +1 -0
  41. package/dist/TaskStateManager.d.ts +54 -0
  42. package/dist/TaskStateManager.js +130 -0
  43. package/dist/TaskStateManager.js.map +1 -0
  44. package/dist/TaskStatus.d.ts +1 -1
  45. package/dist/TaskStep.d.ts +2 -1
  46. package/dist/WorkflowExecutor.d.ts +11 -17
  47. package/dist/WorkflowExecutor.js +67 -69
  48. package/dist/WorkflowExecutor.js.map +1 -1
  49. package/dist/index.d.ts +4 -0
  50. package/dist/index.js +3 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/strategies/IExecutionStrategy.d.ts +16 -0
  53. package/dist/strategies/IExecutionStrategy.js +2 -0
  54. package/dist/strategies/IExecutionStrategy.js.map +1 -0
  55. package/dist/strategies/StandardExecutionStrategy.d.ts +9 -0
  56. package/dist/strategies/StandardExecutionStrategy.js +25 -0
  57. package/dist/strategies/StandardExecutionStrategy.js.map +1 -0
  58. package/openspec/changes/add-concurrency-control/proposal.md +14 -0
  59. package/openspec/changes/add-concurrency-control/tasks.md +9 -0
  60. package/openspec/changes/add-task-retry-policy/proposal.md +13 -0
  61. package/openspec/changes/add-task-retry-policy/tasks.md +10 -0
  62. package/openspec/changes/add-workflow-preview/proposal.md +12 -0
  63. package/openspec/changes/add-workflow-preview/tasks.md +7 -0
  64. package/openspec/changes/archive/2026-01-18-add-external-task-cancellation/tasks.md +10 -0
  65. package/openspec/changes/archive/2026-01-18-add-integration-tests/proposal.md +18 -0
  66. package/openspec/changes/archive/2026-01-18-add-integration-tests/tasks.md +17 -0
  67. package/openspec/changes/archive/2026-01-18-refactor-core-architecture/proposal.md +14 -0
  68. package/openspec/changes/archive/2026-01-18-refactor-core-architecture/tasks.md +8 -0
  69. package/package.json +1 -1
  70. package/src/TaskRunner.ts +68 -4
  71. package/src/TaskRunnerBuilder.ts +76 -0
  72. package/src/TaskRunnerExecutionConfig.ts +13 -0
  73. package/src/TaskStateManager.ts +142 -0
  74. package/src/TaskStatus.ts +1 -1
  75. package/src/TaskStep.ts +2 -1
  76. package/src/WorkflowExecutor.ts +77 -83
  77. package/src/index.ts +4 -0
  78. package/src/strategies/IExecutionStrategy.ts +21 -0
  79. package/src/strategies/StandardExecutionStrategy.ts +35 -0
  80. package/test-report.xml +119 -45
  81. package/GEMINI.md +0 -48
  82. package/openspec/changes/add-external-task-cancellation/tasks.md +0 -10
  83. /package/openspec/changes/{add-external-task-cancellation → archive/2026-01-18-add-external-task-cancellation}/proposal.md +0 -0
@@ -158,7 +158,7 @@
158
158
  <span class="cline-any cline-neutral">&nbsp;</span>
159
159
  <span class="cline-any cline-neutral">&nbsp;</span>
160
160
  <span class="cline-any cline-neutral">&nbsp;</span>
161
- <span class="cline-any cline-yes">26x</span>
161
+ <span class="cline-any cline-yes">56x</span>
162
162
  <span class="cline-any cline-neutral">&nbsp;</span>
163
163
  <span class="cline-any cline-neutral">&nbsp;</span>
164
164
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -169,13 +169,13 @@
169
169
  <span class="cline-any cline-neutral">&nbsp;</span>
170
170
  <span class="cline-any cline-neutral">&nbsp;</span>
171
171
  <span class="cline-any cline-neutral">&nbsp;</span>
172
- <span class="cline-any cline-yes">13x</span>
172
+ <span class="cline-any cline-yes">16x</span>
173
173
  <span class="cline-any cline-neutral">&nbsp;</span>
174
174
  <span class="cline-any cline-neutral">&nbsp;</span>
175
- <span class="cline-any cline-yes">12x</span>
175
+ <span class="cline-any cline-yes">14x</span>
176
176
  <span class="cline-any cline-neutral">&nbsp;</span>
177
177
  <span class="cline-any cline-neutral">&nbsp;</span>
178
- <span class="cline-any cline-yes">13x</span>
178
+ <span class="cline-any cline-yes">16x</span>
179
179
  <span class="cline-any cline-neutral">&nbsp;</span>
180
180
  <span class="cline-any cline-neutral">&nbsp;</span>
181
181
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -189,8 +189,8 @@
189
189
  <span class="cline-any cline-neutral">&nbsp;</span>
190
190
  <span class="cline-any cline-neutral">&nbsp;</span>
191
191
  <span class="cline-any cline-neutral">&nbsp;</span>
192
+ <span class="cline-any cline-yes">3x</span>
192
193
  <span class="cline-any cline-yes">2x</span>
193
- <span class="cline-any cline-yes">1x</span>
194
194
  <span class="cline-any cline-neutral">&nbsp;</span>
195
195
  <span class="cline-any cline-neutral">&nbsp;</span>
196
196
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -205,10 +205,10 @@
205
205
  <span class="cline-any cline-neutral">&nbsp;</span>
206
206
  <span class="cline-any cline-neutral">&nbsp;</span>
207
207
  <span class="cline-any cline-neutral">&nbsp;</span>
208
- <span class="cline-any cline-yes">106x</span>
208
+ <span class="cline-any cline-yes">294x</span>
209
209
  <span class="cline-any cline-neutral">&nbsp;</span>
210
210
  <span class="cline-any cline-neutral">&nbsp;</span>
211
- <span class="cline-any cline-yes">106x</span>
211
+ <span class="cline-any cline-yes">294x</span>
212
212
  <span class="cline-any cline-yes">14x</span>
213
213
  <span class="cline-any cline-yes">14x</span>
214
214
  <span class="cline-any cline-yes">14x</span>
@@ -322,7 +322,7 @@ export class EventBus&lt;TContext&gt; {
322
322
  <div class='footer quiet pad2 space-top1 center small'>
323
323
  Code coverage generated by
324
324
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
325
- at 2026-01-18T15:13:46.748Z
325
+ at 2026-01-18T16:53:50.068Z
326
326
  </div>
327
327
  <script src="../prettify.js"></script>
328
328
  <script>
@@ -243,27 +243,27 @@
243
243
  <span class="cline-any cline-neutral">&nbsp;</span>
244
244
  <span class="cline-any cline-neutral">&nbsp;</span>
245
245
  <span class="cline-any cline-neutral">&nbsp;</span>
246
- <span class="cline-any cline-yes">30x</span>
246
+ <span class="cline-any cline-yes">54x</span>
247
247
  <span class="cline-any cline-neutral">&nbsp;</span>
248
248
  <span class="cline-any cline-neutral">&nbsp;</span>
249
- <span class="cline-any cline-yes">30x</span>
250
- <span class="cline-any cline-yes">30x</span>
251
- <span class="cline-any cline-yes">20061x</span>
249
+ <span class="cline-any cline-yes">54x</span>
250
+ <span class="cline-any cline-yes">54x</span>
251
+ <span class="cline-any cline-yes">20139x</span>
252
252
  <span class="cline-any cline-yes">3x</span>
253
253
  <span class="cline-any cline-neutral">&nbsp;</span>
254
254
  <span class="cline-any cline-neutral">&nbsp;</span>
255
255
  <span class="cline-any cline-neutral">&nbsp;</span>
256
256
  <span class="cline-any cline-neutral">&nbsp;</span>
257
257
  <span class="cline-any cline-neutral">&nbsp;</span>
258
- <span class="cline-any cline-yes">20058x</span>
258
+ <span class="cline-any cline-yes">20136x</span>
259
259
  <span class="cline-any cline-neutral">&nbsp;</span>
260
260
  <span class="cline-any cline-neutral">&nbsp;</span>
261
261
  <span class="cline-any cline-neutral">&nbsp;</span>
262
262
  <span class="cline-any cline-neutral">&nbsp;</span>
263
- <span class="cline-any cline-yes">30x</span>
264
- <span class="cline-any cline-yes">20061x</span>
265
- <span class="cline-any cline-yes">20040x</span>
266
- <span class="cline-any cline-yes">5x</span>
263
+ <span class="cline-any cline-yes">54x</span>
264
+ <span class="cline-any cline-yes">20139x</span>
265
+ <span class="cline-any cline-yes">20166x</span>
266
+ <span class="cline-any cline-yes">6x</span>
267
267
  <span class="cline-any cline-neutral">&nbsp;</span>
268
268
  <span class="cline-any cline-neutral">&nbsp;</span>
269
269
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -274,50 +274,48 @@
274
274
  <span class="cline-any cline-neutral">&nbsp;</span>
275
275
  <span class="cline-any cline-neutral">&nbsp;</span>
276
276
  <span class="cline-any cline-neutral">&nbsp;</span>
277
- <span class="cline-any cline-yes">30x</span>
277
+ <span class="cline-any cline-yes">54x</span>
278
278
  <span class="cline-any cline-neutral">&nbsp;</span>
279
- <span class="cline-any cline-yes">30x</span>
280
- <span class="cline-any cline-yes">4x</span>
279
+ <span class="cline-any cline-yes">54x</span>
280
+ <span class="cline-any cline-yes">5x</span>
281
281
  <span class="cline-any cline-neutral">&nbsp;</span>
282
282
  <span class="cline-any cline-neutral">&nbsp;</span>
283
283
  <span class="cline-any cline-neutral">&nbsp;</span>
284
284
  <span class="cline-any cline-neutral">&nbsp;</span>
285
285
  <span class="cline-any cline-neutral">&nbsp;</span>
286
286
  <span class="cline-any cline-neutral">&nbsp;</span>
287
- <span class="cline-any cline-yes">26x</span>
288
- <span class="cline-any cline-yes">26x</span>
289
- <span class="cline-any cline-yes">20054x</span>
287
+ <span class="cline-any cline-yes">49x</span>
288
+ <span class="cline-any cline-yes">49x</span>
289
+ <span class="cline-any cline-yes">20131x</span>
290
290
  <span class="cline-any cline-neutral">&nbsp;</span>
291
291
  <span class="cline-any cline-neutral">&nbsp;</span>
292
- <span class="cline-any cline-yes">26x</span>
293
- <span class="cline-any cline-yes">26x</span>
292
+ <span class="cline-any cline-yes">49x</span>
293
+ <span class="cline-any cline-yes">49x</span>
294
294
  <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-yes">26x</span>
296
- <span class="cline-any cline-yes">20049x</span>
295
+ <span class="cline-any cline-yes">49x</span>
296
+ <span class="cline-any cline-yes">20124x</span>
297
297
  <span class="cline-any cline-yes">3x</span>
298
298
  <span class="cline-any cline-neutral">&nbsp;</span>
299
299
  <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-yes">20046x</span>
301
- <span class="cline-any cline-yes">20046x</span>
302
- <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-yes">20121x</span>
301
+ <span class="cline-any cline-yes">20121x</span>
303
302
  <span class="cline-any cline-neutral">&nbsp;</span>
304
- <span class="cline-any cline-yes">4x</span>
305
- <span class="cline-any cline-yes">4x</span>
306
- <span class="cline-any cline-yes">4x</span>
307
- <span class="cline-any cline-neutral">&nbsp;</span>
308
- <span class="cline-any cline-yes">4x</span>
309
303
  <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-yes">5x</span>
305
+ <span class="cline-any cline-yes">5x</span>
306
+ <span class="cline-any cline-yes">5x</span>
310
307
  <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-yes">5x</span>
311
309
  <span class="cline-any cline-neutral">&nbsp;</span>
312
310
  <span class="cline-any cline-neutral">&nbsp;</span>
313
311
  <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-yes">4x</span>
315
312
  <span class="cline-any cline-neutral">&nbsp;</span>
316
313
  <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-yes">5x</span>
317
315
  <span class="cline-any cline-neutral">&nbsp;</span>
318
- <span class="cline-any cline-yes">26x</span>
319
316
  <span class="cline-any cline-neutral">&nbsp;</span>
320
317
  <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-yes">49x</span>
321
319
  <span class="cline-any cline-neutral">&nbsp;</span>
322
320
  <span class="cline-any cline-neutral">&nbsp;</span>
323
321
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -327,10 +325,10 @@
327
325
  <span class="cline-any cline-neutral">&nbsp;</span>
328
326
  <span class="cline-any cline-neutral">&nbsp;</span>
329
327
  <span class="cline-any cline-neutral">&nbsp;</span>
330
- <span class="cline-any cline-yes">6x</span>
331
- <span class="cline-any cline-yes">6x</span>
332
328
  <span class="cline-any cline-neutral">&nbsp;</span>
333
329
  <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-yes">8x</span>
331
+ <span class="cline-any cline-yes">8x</span>
334
332
  <span class="cline-any cline-neutral">&nbsp;</span>
335
333
  <span class="cline-any cline-neutral">&nbsp;</span>
336
334
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -339,39 +337,41 @@
339
337
  <span class="cline-any cline-neutral">&nbsp;</span>
340
338
  <span class="cline-any cline-neutral">&nbsp;</span>
341
339
  <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-yes">20046x</span>
343
340
  <span class="cline-any cline-neutral">&nbsp;</span>
344
- <span class="cline-any cline-yes">20046x</span>
345
- <span class="cline-any cline-yes">20046x</span>
346
- <span class="cline-any cline-yes">20046x</span>
347
341
  <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-yes">20046x</span>
342
+ <span class="cline-any cline-yes">20121x</span>
349
343
  <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-yes">20121x</span>
345
+ <span class="cline-any cline-yes">20121x</span>
346
+ <span class="cline-any cline-yes">20121x</span>
350
347
  <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-yes">20121x</span>
351
349
  <span class="cline-any cline-neutral">&nbsp;</span>
352
350
  <span class="cline-any cline-neutral">&nbsp;</span>
353
351
  <span class="cline-any cline-neutral">&nbsp;</span>
354
352
  <span class="cline-any cline-neutral">&nbsp;</span>
355
- <span class="cline-any cline-yes">20046x</span>
356
- <span class="cline-any cline-yes">40074x</span>
357
- <span class="cline-any cline-yes">40074x</span>
358
353
  <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-yes">40074x</span>
360
- <span class="cline-any cline-yes">20032x</span>
361
- <span class="cline-any cline-yes">20032x</span>
362
354
  <span class="cline-any cline-neutral">&nbsp;</span>
363
- <span class="cline-any cline-yes">20032x</span>
355
+ <span class="cline-any cline-yes">20121x</span>
356
+ <span class="cline-any cline-yes">40273x</span>
357
+ <span class="cline-any cline-yes">40273x</span>
364
358
  <span class="cline-any cline-neutral">&nbsp;</span>
365
- <span class="cline-any cline-yes">4x</span>
366
- <span class="cline-any cline-yes">4x</span>
359
+ <span class="cline-any cline-yes">40273x</span>
360
+ <span class="cline-any cline-yes">20157x</span>
361
+ <span class="cline-any cline-yes">20157x</span>
367
362
  <span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-yes">20157x</span>
368
364
  <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-yes">20028x</span>
370
- <span class="cline-any cline-yes">5x</span>
371
365
  <span class="cline-any cline-yes">5x</span>
372
366
  <span class="cline-any cline-yes">5x</span>
373
367
  <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-yes">5x</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-yes">20152x</span>
370
+ <span class="cline-any cline-yes">7x</span>
371
+ <span class="cline-any cline-yes">7x</span>
372
+ <span class="cline-any cline-yes">7x</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-yes">7x</span>
375
375
  <span class="cline-any cline-neutral">&nbsp;</span>
376
376
  <span class="cline-any cline-neutral">&nbsp;</span>
377
377
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -380,13 +380,13 @@
380
380
  <span class="cline-any cline-neutral">&nbsp;</span>
381
381
  <span class="cline-any cline-neutral">&nbsp;</span>
382
382
  <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-yes">20042x</span>
384
- <span class="cline-any cline-yes">20042x</span>
385
- <span class="cline-any cline-yes">20042x</span>
383
+ <span class="cline-any cline-yes">20116x</span>
384
+ <span class="cline-any cline-yes">20116x</span>
385
+ <span class="cline-any cline-yes">20116x</span>
386
386
  <span class="cline-any cline-neutral">&nbsp;</span>
387
387
  <span class="cline-any cline-neutral">&nbsp;</span>
388
388
  <span class="cline-any cline-neutral">&nbsp;</span>
389
- <span class="cline-any cline-yes">20042x</span>
389
+ <span class="cline-any cline-yes">20116x</span>
390
390
  <span class="cline-any cline-neutral">&nbsp;</span>
391
391
  <span class="cline-any cline-neutral">&nbsp;</span>
392
392
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ITaskGraphValidator } from "./contracts/ITaskGraphValidator.js";
@@ -559,7 +559,7 @@ export class TaskGraphValidator implements ITaskGraphValidator {
559
559
  <div class='footer quiet pad2 space-top1 center small'>
560
560
  Code coverage generated by
561
561
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
562
- at 2026-01-18T15:13:46.748Z
562
+ at 2026-01-18T16:53:50.068Z
563
563
  </div>
564
564
  <script src="../prettify.js"></script>
565
565
  <script>
@@ -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'>12/12</span>
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'>4/4</span>
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'>5/5</span>
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'>12/12</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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">&nbsp;</span>
141
205
  <span class="cline-any cline-neutral">&nbsp;</span>
142
206
  <span class="cline-any cline-neutral">&nbsp;</span>
143
207
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -154,28 +218,44 @@
154
218
  <span class="cline-any cline-neutral">&nbsp;</span>
155
219
  <span class="cline-any cline-neutral">&nbsp;</span>
156
220
  <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
160
222
  <span class="cline-any cline-neutral">&nbsp;</span>
161
223
  <span class="cline-any cline-neutral">&nbsp;</span>
162
224
  <span class="cline-any cline-neutral">&nbsp;</span>
163
- <span class="cline-any cline-yes">22x</span>
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">&nbsp;</span>
165
229
  <span class="cline-any cline-neutral">&nbsp;</span>
166
230
  <span class="cline-any cline-neutral">&nbsp;</span>
167
231
  <span class="cline-any cline-neutral">&nbsp;</span>
232
+ <span class="cline-any cline-yes">50x</span>
168
233
  <span class="cline-any cline-neutral">&nbsp;</span>
169
234
  <span class="cline-any cline-neutral">&nbsp;</span>
170
235
  <span class="cline-any cline-neutral">&nbsp;</span>
171
236
  <span class="cline-any cline-neutral">&nbsp;</span>
172
237
  <span class="cline-any cline-neutral">&nbsp;</span>
173
238
  <span class="cline-any cline-neutral">&nbsp;</span>
174
- <span class="cline-any cline-yes">12x</span>
175
239
  <span class="cline-any cline-neutral">&nbsp;</span>
176
240
  <span class="cline-any cline-neutral">&nbsp;</span>
177
241
  <span class="cline-any cline-neutral">&nbsp;</span>
178
242
  <span class="cline-any cline-neutral">&nbsp;</span>
243
+ <span class="cline-any cline-yes">15x</span>
244
+ <span class="cline-any cline-neutral">&nbsp;</span>
245
+ <span class="cline-any cline-neutral">&nbsp;</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-neutral">&nbsp;</span>
248
+ <span class="cline-any cline-neutral">&nbsp;</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-neutral">&nbsp;</span>
256
+ <span class="cline-any cline-yes">3x</span>
257
+ <span class="cline-any cline-neutral">&nbsp;</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
179
259
  <span class="cline-any cline-neutral">&nbsp;</span>
180
260
  <span class="cline-any cline-neutral">&nbsp;</span>
181
261
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -184,6 +264,7 @@
184
264
  <span class="cline-any cline-neutral">&nbsp;</span>
185
265
  <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
188
269
  <span class="cline-any cline-neutral">&nbsp;</span>
189
270
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -195,20 +276,67 @@
195
276
  <span class="cline-any cline-neutral">&nbsp;</span>
196
277
  <span class="cline-any cline-neutral">&nbsp;</span>
197
278
  <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
201
280
  <span class="cline-any cline-neutral">&nbsp;</span>
202
281
  <span class="cline-any cline-neutral">&nbsp;</span>
203
282
  <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</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">&nbsp;</span>
209
287
  <span class="cline-any cline-neutral">&nbsp;</span>
210
- <span class="cline-any cline-yes">15x</span>
211
- <span class="cline-any cline-yes">15x</span>
288
+ <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-neutral">&nbsp;</span>
301
+ <span class="cline-any cline-neutral">&nbsp;</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
309
+ <span class="cline-any cline-neutral">&nbsp;</span>
310
+ <span class="cline-any cline-yes">5x</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
325
+ <span class="cline-any cline-yes">2x</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</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">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-yes">32x</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
212
340
  <span class="cline-any cline-neutral">&nbsp;</span>
213
341
  <span class="cline-any cline-neutral">&nbsp;</span>
214
342
  <span class="cline-any cline-neutral">&nbsp;</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
  &nbsp;
222
354
  // Re-export types for backward compatibility
223
- export { RunnerEventPayloads, RunnerEventListener };
355
+ export { RunnerEventPayloads, RunnerEventListener, TaskRunnerExecutionConfig };
224
356
  &nbsp;
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&lt;TContext&gt; {
231
363
  private eventBus = new EventBus&lt;TContext&gt;();
232
364
  private validator = new TaskGraphValidator();
365
+ private executionStrategy: IExecutionStrategy&lt;TContext&gt; = new StandardExecutionStrategy();
233
366
  &nbsp;
234
367
  /**
235
368
  * @param context The shared context object to be passed to each task.
@@ -257,17 +390,33 @@ export class TaskRunner&lt;TContext&gt; {
257
390
  event: K,
258
391
  callback: RunnerEventListener&lt;TContext, K&gt;
259
392
  ): void {
393
+ /* v8 ignore next 1 */
260
394
  this.eventBus.off(event, callback);
261
395
  }
396
+ &nbsp;
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&lt;TContext&gt;): this {
403
+ /* v8 ignore next 2 */
404
+ this.executionStrategy = strategy;
405
+ return this;
406
+ }
262
407
  &nbsp;
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(steps: TaskStep&lt;TContext&gt;[]): Promise&lt;Map&lt;string, TaskResult&gt;&gt; {
416
+ async execute(
417
+ steps: TaskStep&lt;TContext&gt;[],
418
+ config?: TaskRunnerExecutionConfig
419
+ ): Promise&lt;Map&lt;string, TaskResult&gt;&gt; {
271
420
  // Validate the task graph before execution
272
421
  const taskGraph: TaskGraph = {
273
422
  tasks: steps.map((step) =&gt; ({
@@ -281,8 +430,51 @@ export class TaskRunner&lt;TContext&gt; {
281
430
  throw new Error(this.validator.createErrorMessage(validationResult));
282
431
  }
283
432
  &nbsp;
284
- const executor = new WorkflowExecutor(this.context, this.eventBus);
285
- return executor.execute(steps);
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
+ &nbsp;
441
+ // We need to handle the timeout cleanup properly.
442
+ if (config?.timeout !== undefined) {
443
+ const controller = new AbortController();
444
+ const timeoutId = setTimeout(() =&gt; {
445
+ controller.abort(new Error(`Workflow timed out after ${config.timeout}ms`));
446
+ }, config.timeout);
447
+ &nbsp;
448
+ let effectiveSignal = controller.signal;
449
+ let onAbort: (() =&gt; void) | undefined;
450
+ &nbsp;
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 = () =&gt; {
461
+ controller.abort(config.signal?.reason);
462
+ };
463
+ config.signal.addEventListener("abort", onAbort);
464
+ }
465
+ }
466
+ &nbsp;
467
+ try {
468
+ return await executor.execute(steps, effectiveSignal);
469
+ } finally {
470
+ clearTimeout(timeoutId);
471
+ if (config.signal &amp;&amp; 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
  &nbsp;</pre></td></tr></table></pre>
@@ -292,7 +484,7 @@ export class TaskRunner&lt;TContext&gt; {
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-18T15:13:46.748Z
487
+ at 2026-01-18T16:53:50.068Z
296
488
  </div>
297
489
  <script src="../prettify.js"></script>
298
490
  <script>