@calmo/task-runner 3.8.1 → 3.8.3

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 (52) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/coverage/coverage-final.json +4 -3
  3. package/coverage/index.html +7 -7
  4. package/coverage/lcov-report/index.html +7 -7
  5. package/coverage/lcov-report/src/EventBus.ts.html +70 -34
  6. package/coverage/lcov-report/src/ExecutionConstants.ts.html +121 -0
  7. package/coverage/lcov-report/src/TaskGraphValidationError.ts.html +1 -1
  8. package/coverage/lcov-report/src/TaskGraphValidator.ts.html +1 -1
  9. package/coverage/lcov-report/src/TaskRunner.ts.html +1 -1
  10. package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +1 -1
  11. package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +1 -1
  12. package/coverage/lcov-report/src/TaskStateManager.ts.html +34 -34
  13. package/coverage/lcov-report/src/WorkflowExecutor.ts.html +151 -97
  14. package/coverage/lcov-report/src/contracts/ErrorTypes.ts.html +1 -1
  15. package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
  16. package/coverage/lcov-report/src/contracts/index.html +1 -1
  17. package/coverage/lcov-report/src/index.html +26 -11
  18. package/coverage/lcov-report/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
  19. package/coverage/lcov-report/src/strategies/RetryingExecutionStrategy.ts.html +1 -1
  20. package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +1 -1
  21. package/coverage/lcov-report/src/strategies/index.html +1 -1
  22. package/coverage/lcov.info +216 -200
  23. package/coverage/src/EventBus.ts.html +70 -34
  24. package/coverage/src/ExecutionConstants.ts.html +121 -0
  25. package/coverage/src/TaskGraphValidationError.ts.html +1 -1
  26. package/coverage/src/TaskGraphValidator.ts.html +1 -1
  27. package/coverage/src/TaskRunner.ts.html +1 -1
  28. package/coverage/src/TaskRunnerBuilder.ts.html +1 -1
  29. package/coverage/src/TaskRunnerExecutionConfig.ts.html +1 -1
  30. package/coverage/src/TaskStateManager.ts.html +34 -34
  31. package/coverage/src/WorkflowExecutor.ts.html +151 -97
  32. package/coverage/src/contracts/ErrorTypes.ts.html +1 -1
  33. package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
  34. package/coverage/src/contracts/index.html +1 -1
  35. package/coverage/src/index.html +26 -11
  36. package/coverage/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
  37. package/coverage/src/strategies/RetryingExecutionStrategy.ts.html +1 -1
  38. package/coverage/src/strategies/StandardExecutionStrategy.ts.html +1 -1
  39. package/coverage/src/strategies/index.html +1 -1
  40. package/dist/EventBus.js +11 -2
  41. package/dist/EventBus.js.map +1 -1
  42. package/dist/ExecutionConstants.d.ts +12 -0
  43. package/dist/ExecutionConstants.js +13 -0
  44. package/dist/ExecutionConstants.js.map +1 -0
  45. package/dist/WorkflowExecutor.d.ts +4 -0
  46. package/dist/WorkflowExecutor.js +62 -49
  47. package/dist/WorkflowExecutor.js.map +1 -1
  48. package/package.json +1 -1
  49. package/src/EventBus.ts +27 -15
  50. package/src/ExecutionConstants.ts +12 -0
  51. package/src/WorkflowExecutor.ts +69 -51
  52. package/test-report.xml +155 -131
@@ -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'>66/66</span>
28
+ <span class='fraction'>69/69</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/35</span>
35
+ <span class='fraction'>37/37</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'>8/8</span>
42
+ <span class='fraction'>7/7</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'>65/65</span>
49
+ <span class='fraction'>68/68</span>
50
50
  </div>
51
51
 
52
52
 
@@ -254,7 +254,25 @@
254
254
  <a name='L189'></a><a href='#L189'>189</a>
255
255
  <a name='L190'></a><a href='#L190'>190</a>
256
256
  <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
258
276
  <span class="cline-any cline-neutral">&nbsp;</span>
259
277
  <span class="cline-any cline-neutral">&nbsp;</span>
260
278
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -265,8 +283,8 @@
265
283
  <span class="cline-any cline-neutral">&nbsp;</span>
266
284
  <span class="cline-any cline-neutral">&nbsp;</span>
267
285
  <span class="cline-any cline-neutral">&nbsp;</span>
268
- <span class="cline-any cline-yes">64x</span>
269
286
  <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-yes">66x</span>
270
288
  <span class="cline-any cline-neutral">&nbsp;</span>
271
289
  <span class="cline-any cline-neutral">&nbsp;</span>
272
290
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -275,12 +293,12 @@
275
293
  <span class="cline-any cline-neutral">&nbsp;</span>
276
294
  <span class="cline-any cline-neutral">&nbsp;</span>
277
295
  <span class="cline-any cline-neutral">&nbsp;</span>
278
- <span class="cline-any cline-yes">64x</span>
279
- <span class="cline-any cline-yes">64x</span>
280
- <span class="cline-any cline-yes">64x</span>
281
- <span class="cline-any cline-yes">64x</span>
282
- <span class="cline-any cline-yes">64x</span>
283
296
  <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-yes">66x</span>
298
+ <span class="cline-any cline-yes">66x</span>
299
+ <span class="cline-any cline-yes">66x</span>
300
+ <span class="cline-any cline-yes">66x</span>
301
+ <span class="cline-any cline-yes">66x</span>
284
302
  <span class="cline-any cline-neutral">&nbsp;</span>
285
303
  <span class="cline-any cline-neutral">&nbsp;</span>
286
304
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -292,11 +310,12 @@
292
310
  <span class="cline-any cline-neutral">&nbsp;</span>
293
311
  <span class="cline-any cline-neutral">&nbsp;</span>
294
312
  <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-yes">64x</span>
296
- <span class="cline-any cline-yes">64x</span>
297
313
  <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-yes">66x</span>
315
+ <span class="cline-any cline-yes">66x</span>
298
316
  <span class="cline-any cline-neutral">&nbsp;</span>
299
- <span class="cline-any cline-yes">64x</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-yes">66x</span>
300
319
  <span class="cline-any cline-yes">3x</span>
301
320
  <span class="cline-any cline-neutral">&nbsp;</span>
302
321
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -305,22 +324,22 @@
305
324
  <span class="cline-any cline-yes">3x</span>
306
325
  <span class="cline-any cline-neutral">&nbsp;</span>
307
326
  <span class="cline-any cline-neutral">&nbsp;</span>
308
- <span class="cline-any cline-yes">61x</span>
327
+ <span class="cline-any cline-yes">63x</span>
309
328
  <span class="cline-any cline-neutral">&nbsp;</span>
310
- <span class="cline-any cline-yes">61x</span>
329
+ <span class="cline-any cline-yes">63x</span>
311
330
  <span class="cline-any cline-neutral">&nbsp;</span>
312
331
  <span class="cline-any cline-yes">11x</span>
313
332
  <span class="cline-any cline-neutral">&nbsp;</span>
314
333
  <span class="cline-any cline-neutral">&nbsp;</span>
315
- <span class="cline-any cline-yes">61x</span>
334
+ <span class="cline-any cline-yes">63x</span>
316
335
  <span class="cline-any cline-yes">11x</span>
317
336
  <span class="cline-any cline-neutral">&nbsp;</span>
318
337
  <span class="cline-any cline-neutral">&nbsp;</span>
319
- <span class="cline-any cline-yes">61x</span>
338
+ <span class="cline-any cline-yes">63x</span>
320
339
  <span class="cline-any cline-neutral">&nbsp;</span>
321
- <span class="cline-any cline-yes">61x</span>
340
+ <span class="cline-any cline-yes">63x</span>
322
341
  <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-yes">61x</span>
342
+ <span class="cline-any cline-yes">63x</span>
324
343
  <span class="cline-any cline-neutral">&nbsp;</span>
325
344
  <span class="cline-any cline-neutral">&nbsp;</span>
326
345
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -328,29 +347,31 @@
328
347
  <span class="cline-any cline-neutral">&nbsp;</span>
329
348
  <span class="cline-any cline-neutral">&nbsp;</span>
330
349
  <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-yes">122x</span>
350
+ <span class="cline-any cline-yes">111x</span>
332
351
  <span class="cline-any cline-yes">2x</span>
333
352
  <span class="cline-any cline-neutral">&nbsp;</span>
334
353
  <span class="cline-any cline-neutral">&nbsp;</span>
335
- <span class="cline-any cline-yes">120x</span>
354
+ <span class="cline-any cline-yes">109x</span>
336
355
  <span class="cline-any cline-neutral">&nbsp;</span>
337
356
  <span class="cline-any cline-neutral">&nbsp;</span>
338
- <span class="cline-any cline-yes">120x</span>
357
+ <span class="cline-any cline-yes">109x</span>
339
358
  <span class="cline-any cline-yes">11x</span>
340
359
  <span class="cline-any cline-neutral">&nbsp;</span>
341
360
  <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-yes">109x</span>
343
361
  <span class="cline-any cline-neutral">&nbsp;</span>
344
362
  <span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-yes">98x</span>
345
364
  <span class="cline-any cline-neutral">&nbsp;</span>
346
365
  <span class="cline-any cline-neutral">&nbsp;</span>
347
- <span class="cline-any cline-yes">61x</span>
348
366
  <span class="cline-any cline-neutral">&nbsp;</span>
349
- <span class="cline-any cline-yes">61x</span>
350
- <span class="cline-any cline-yes">61x</span>
351
- <span class="cline-any cline-yes">61x</span>
352
367
  <span class="cline-any cline-neutral">&nbsp;</span>
353
- <span class="cline-any cline-yes">61x</span>
368
+ <span class="cline-any cline-yes">63x</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-yes">63x</span>
371
+ <span class="cline-any cline-yes">63x</span>
372
+ <span class="cline-any cline-yes">63x</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-yes">63x</span>
354
375
  <span class="cline-any cline-yes">11x</span>
355
376
  <span class="cline-any cline-neutral">&nbsp;</span>
356
377
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -363,30 +384,47 @@
363
384
  <span class="cline-any cline-neutral">&nbsp;</span>
364
385
  <span class="cline-any cline-neutral">&nbsp;</span>
365
386
  <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-yes">319x</span>
387
+ <span class="cline-any cline-yes">312x</span>
367
388
  <span class="cline-any cline-neutral">&nbsp;</span>
368
389
  <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-yes">319x</span>
370
- <span class="cline-any cline-yes">149x</span>
390
+ <span class="cline-any cline-yes">312x</span>
391
+ <span class="cline-any cline-yes">151x</span>
371
392
  <span class="cline-any cline-neutral">&nbsp;</span>
372
393
  <span class="cline-any cline-neutral">&nbsp;</span>
373
394
  <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-yes">319x</span>
395
+ <span class="cline-any cline-yes">312x</span>
375
396
  <span class="cline-any cline-neutral">&nbsp;</span>
376
397
  <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-yes">319x</span>
378
- <span class="cline-any cline-yes">177x</span>
398
+ <span class="cline-any cline-yes">312x</span>
399
+ <span class="cline-any cline-yes">179x</span>
379
400
  <span class="cline-any cline-neutral">&nbsp;</span>
380
401
  <span class="cline-any cline-neutral">&nbsp;</span>
381
402
  <span class="cline-any cline-neutral">&nbsp;</span>
382
403
  <span class="cline-any cline-yes">28x</span>
383
404
  <span class="cline-any cline-neutral">&nbsp;</span>
384
405
  <span class="cline-any cline-neutral">&nbsp;</span>
385
- <span class="cline-any cline-yes">149x</span>
406
+ <span class="cline-any cline-yes">151x</span>
407
+ <span class="cline-any cline-neutral">&nbsp;</span>
408
+ <span class="cline-any cline-yes">151x</span>
409
+ <span class="cline-any cline-neutral">&nbsp;</span>
410
+ <span class="cline-any cline-yes">151x</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-yes">151x</span>
413
+ <span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-neutral">&nbsp;</span>
415
+ <span class="cline-any cline-yes">151x</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
418
  <span class="cline-any cline-neutral">&nbsp;</span>
387
- <span class="cline-any cline-yes">149x</span>
388
- <span class="cline-any cline-yes">149x</span>
389
- <span class="cline-any cline-yes">149x</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-yes">151x</span>
427
+ <span class="cline-any cline-yes">151x</span>
390
428
  <span class="cline-any cline-yes">7x</span>
391
429
  <span class="cline-any cline-yes">7x</span>
392
430
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -420,7 +458,7 @@
420
458
  <span class="cline-any cline-yes">2x</span>
421
459
  <span class="cline-any cline-neutral">&nbsp;</span>
422
460
  <span class="cline-any cline-neutral">&nbsp;</span>
423
- <span class="cline-any cline-yes">143x</span>
461
+ <span class="cline-any cline-yes">145x</span>
424
462
  <span class="cline-any cline-yes">1x</span>
425
463
  <span class="cline-any cline-neutral">&nbsp;</span>
426
464
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -428,20 +466,18 @@
428
466
  <span class="cline-any cline-yes">1x</span>
429
467
  <span class="cline-any cline-neutral">&nbsp;</span>
430
468
  <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-yes">142x</span>
432
- <span class="cline-any cline-neutral">&nbsp;</span>
433
- <span class="cline-any cline-yes">142x</span>
434
- <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-yes">144x</span>
435
470
  <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-yes">144x</span>
472
+ <span class="cline-any cline-yes">144x</span>
436
473
  <span class="cline-any cline-yes">142x</span>
437
474
  <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-yes">2x</span>
438
476
  <span class="cline-any cline-neutral">&nbsp;</span>
439
- <span class="cline-any cline-yes">149x</span>
440
477
  <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-yes">149x</span>
442
478
  <span class="cline-any cline-neutral">&nbsp;</span>
443
479
  <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-yes">149x</span>
480
+ <span class="cline-any cline-yes">2x</span>
445
481
  <span class="cline-any cline-neutral">&nbsp;</span>
446
482
  <span class="cline-any cline-neutral">&nbsp;</span>
447
483
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -450,6 +486,7 @@ import { TaskResult } from "./TaskResult.js";
450
486
  import { EventBus } from "./EventBus.js";
451
487
  import { TaskStateManager } from "./TaskStateManager.js";
452
488
  import { IExecutionStrategy } from "./strategies/IExecutionStrategy.js";
489
+ import { ExecutionConstants } from "./ExecutionConstants.js";
453
490
  &nbsp;
454
491
  /**
455
492
  * Handles the execution of the workflow steps.
@@ -489,7 +526,7 @@ export class WorkflowExecutor&lt;TContext&gt; {
489
526
  // Check if already aborted
490
527
  if (signal?.aborted) {
491
528
  this.stateManager.cancelAllPending(
492
- "Workflow cancelled before execution started."
529
+ ExecutionConstants.CANCELLED_BEFORE_START
493
530
  );
494
531
  const results = this.stateManager.getResults();
495
532
  this.eventBus.emit("workflowEnd", { context: this.context, results });
@@ -500,7 +537,7 @@ export class WorkflowExecutor&lt;TContext&gt; {
500
537
  &nbsp;
501
538
  const onAbort = () =&gt; {
502
539
  // Mark all pending tasks as cancelled
503
- this.stateManager.cancelAllPending("Workflow cancelled.");
540
+ this.stateManager.cancelAllPending(ExecutionConstants.WORKFLOW_CANCELLED);
504
541
  };
505
542
  &nbsp;
506
543
  if (signal) {
@@ -527,7 +564,9 @@ export class WorkflowExecutor&lt;TContext&gt; {
527
564
  }
528
565
  &nbsp;
529
566
  if (signal?.aborted) {
530
- this.stateManager.cancelAllPending("Workflow cancelled.");
567
+ this.stateManager.cancelAllPending(
568
+ ExecutionConstants.WORKFLOW_CANCELLED
569
+ );
531
570
  } else {
532
571
  // After a task finishes, check for new work
533
572
  this.processLoop(executingPromises, signal);
@@ -535,7 +574,7 @@ export class WorkflowExecutor&lt;TContext&gt; {
535
574
  }
536
575
  &nbsp;
537
576
  // Ensure everything is accounted for (e.g. if loop exited early)
538
- this.stateManager.cancelAllPending("Workflow cancelled.");
577
+ this.stateManager.cancelAllPending(ExecutionConstants.WORKFLOW_CANCELLED);
539
578
  &nbsp;
540
579
  const results = this.stateManager.getResults();
541
580
  this.eventBus.emit("workflowEnd", { context: this.context, results });
@@ -575,64 +614,79 @@ export class WorkflowExecutor&lt;TContext&gt; {
575
614
  &nbsp;
576
615
  const step = this.readyQueue.shift()!;
577
616
  &nbsp;
578
- const taskPromise = (async () =&gt; {
579
- try {
580
- if (step.condition) {
581
- const check = step.condition(this.context);
582
- const shouldRun = check instanceof Promise ? await check : check;
617
+ const taskPromise = this.executeTaskStep(step, signal)
618
+ .finally(() =&gt; {
619
+ executingPromises.delete(taskPromise);
620
+ // When a task finishes, we try to run more
621
+ this.processLoop(executingPromises, signal);
622
+ });
583
623
  &nbsp;
584
- if (signal?.aborted) {
585
- this.stateManager.markCompleted(step, {
586
- status: "cancelled",
587
- message: "Cancelled during condition evaluation.",
588
- });
589
- return;
590
- }
624
+ executingPromises.add(taskPromise);
625
+ }
626
+ }
591
627
  &nbsp;
592
- if (!shouldRun) {
593
- const result: TaskResult = {
594
- status: "skipped",
595
- message: "Skipped by condition evaluation.",
596
- };
597
- this.stateManager.markSkipped(step, result);
598
- return;
599
- }
600
- }
601
- } catch (error) {
602
- const result: TaskResult = {
603
- status: "failure",
604
- message:
605
- error instanceof Error
606
- ? error.message
607
- : "Condition evaluation failed",
608
- error: error instanceof Error ? error.message : String(error),
609
- };
610
- this.stateManager.markCompleted(step, result);
611
- return;
612
- }
628
+ /**
629
+ * Executes a single task step, handling conditions and status updates.
630
+ */
631
+ private async executeTaskStep(
632
+ step: TaskStep&lt;TContext&gt;,
633
+ signal?: AbortSignal
634
+ ): Promise&lt;void&gt; {
635
+ try {
636
+ if (step.condition) {
637
+ const check = step.condition(this.context);
638
+ const shouldRun = check instanceof Promise ? await check : check;
613
639
  &nbsp;
614
640
  if (signal?.aborted) {
615
641
  this.stateManager.markCompleted(step, {
616
642
  status: "cancelled",
617
- message: "Cancelled before execution started.",
643
+ message: ExecutionConstants.CANCELLED_DURING_CONDITION,
618
644
  });
619
645
  return;
620
646
  }
621
647
  &nbsp;
622
- this.stateManager.markRunning(step);
648
+ if (!shouldRun) {
649
+ const result: TaskResult = {
650
+ status: "skipped",
651
+ message: ExecutionConstants.SKIPPED_BY_CONDITION,
652
+ };
653
+ this.stateManager.markSkipped(step, result);
654
+ return;
655
+ }
656
+ }
657
+ } catch (error) {
658
+ const result: TaskResult = {
659
+ status: "failure",
660
+ message:
661
+ error instanceof Error
662
+ ? error.message
663
+ : ExecutionConstants.CONDITION_EVALUATION_FAILED,
664
+ error: error instanceof Error ? error.message : String(error),
665
+ };
666
+ this.stateManager.markCompleted(step, result);
667
+ return;
668
+ }
623
669
  &nbsp;
624
- await this.strategy
625
- .execute(step, this.context, signal)
626
- .then((result) =&gt; {
627
- this.stateManager.markCompleted(step, result);
628
- });
629
- })().finally(() =&gt; {
630
- executingPromises.delete(taskPromise);
631
- // When a task finishes, we try to run more
632
- this.processLoop(executingPromises, signal);
670
+ if (signal?.aborted) {
671
+ this.stateManager.markCompleted(step, {
672
+ status: "cancelled",
673
+ message: ExecutionConstants.TASK_CANCELLED_BEFORE_START,
633
674
  });
675
+ return;
676
+ }
634
677
  &nbsp;
635
- executingPromises.add(taskPromise);
678
+ this.stateManager.markRunning(step);
679
+ &nbsp;
680
+ try {
681
+ const result = await this.strategy.execute(step, this.context, signal);
682
+ this.stateManager.markCompleted(step, result);
683
+ } catch (error) {
684
+ const result: TaskResult = {
685
+ status: "failure",
686
+ message: ExecutionConstants.EXECUTION_STRATEGY_FAILED,
687
+ error: error instanceof Error ? error.message : String(error),
688
+ };
689
+ this.stateManager.markCompleted(step, result);
636
690
  }
637
691
  }
638
692
  }
@@ -643,7 +697,7 @@ export class WorkflowExecutor&lt;TContext&gt; {
643
697
  <div class='footer quiet pad2 space-top1 center small'>
644
698
  Code coverage generated by
645
699
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
646
- at 2026-01-21T01:05:21.402Z
700
+ at 2026-01-21T01:20:30.163Z
647
701
  </div>
648
702
  <script src="../prettify.js"></script>
649
703
  <script>
@@ -88,7 +88,7 @@ export const ERROR_CYCLE = "cycle" as const;
88
88
  <div class='footer quiet pad2 space-top1 center small'>
89
89
  Code coverage generated by
90
90
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
91
- at 2026-01-21T01:05:21.402Z
91
+ at 2026-01-21T01:20:30.163Z
92
92
  </div>
93
93
  <script src="../../prettify.js"></script>
94
94
  <script>
@@ -202,7 +202,7 @@ export type ListenerMap&lt;TContext&gt; = {
202
202
  <div class='footer quiet pad2 space-top1 center small'>
203
203
  Code coverage generated by
204
204
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
205
- at 2026-01-21T01:05:21.402Z
205
+ at 2026-01-21T01:20:30.163Z
206
206
  </div>
207
207
  <script src="../../prettify.js"></script>
208
208
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-01-21T01:05:21.402Z
119
+ at 2026-01-21T01:20:30.163Z
120
120
  </div>
121
121
  <script src="../../prettify.js"></script>
122
122
  <script>
@@ -25,14 +25,14 @@
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'>256/256</span>
28
+ <span class='fraction'>261/261</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'>97/97</span>
35
+ <span class='fraction'>99/99</span>
36
36
  </div>
37
37
 
38
38
 
@@ -46,7 +46,7 @@
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'>253/253</span>
49
+ <span class='fraction'>258/258</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,28 @@
84
84
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
85
85
  </td>
86
86
  <td data-value="100" class="pct high">100%</td>
87
- <td data-value="16" class="abs high">16/16</td>
87
+ <td data-value="17" class="abs high">17/17</td>
88
88
  <td data-value="100" class="pct high">100%</td>
89
89
  <td data-value="8" class="abs high">8/8</td>
90
90
  <td data-value="100" class="pct high">100%</td>
91
- <td data-value="5" class="abs high">5/5</td>
91
+ <td data-value="6" class="abs high">6/6</td>
92
92
  <td data-value="100" class="pct high">100%</td>
93
- <td data-value="16" class="abs high">16/16</td>
93
+ <td data-value="17" class="abs high">17/17</td>
94
+ </tr>
95
+
96
+ <tr>
97
+ <td class="file high" data-value="ExecutionConstants.ts"><a href="ExecutionConstants.ts.html">ExecutionConstants.ts</a></td>
98
+ <td data-value="100" class="pic high">
99
+ <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
100
+ </td>
101
+ <td data-value="100" class="pct high">100%</td>
102
+ <td data-value="1" class="abs high">1/1</td>
103
+ <td data-value="100" class="pct high">100%</td>
104
+ <td data-value="0" class="abs high">0/0</td>
105
+ <td data-value="100" class="pct high">100%</td>
106
+ <td data-value="0" class="abs high">0/0</td>
107
+ <td data-value="100" class="pct high">100%</td>
108
+ <td data-value="1" class="abs high">1/1</td>
94
109
  </tr>
95
110
 
96
111
  <tr>
@@ -189,13 +204,13 @@
189
204
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
190
205
  </td>
191
206
  <td data-value="100" class="pct high">100%</td>
192
- <td data-value="66" class="abs high">66/66</td>
207
+ <td data-value="69" class="abs high">69/69</td>
193
208
  <td data-value="100" class="pct high">100%</td>
194
- <td data-value="35" class="abs high">35/35</td>
209
+ <td data-value="37" class="abs high">37/37</td>
195
210
  <td data-value="100" class="pct high">100%</td>
196
- <td data-value="8" class="abs high">8/8</td>
211
+ <td data-value="7" class="abs high">7/7</td>
197
212
  <td data-value="100" class="pct high">100%</td>
198
- <td data-value="65" class="abs high">65/65</td>
213
+ <td data-value="68" class="abs high">68/68</td>
199
214
  </tr>
200
215
 
201
216
  </tbody>
@@ -206,7 +221,7 @@
206
221
  <div class='footer quiet pad2 space-top1 center small'>
207
222
  Code coverage generated by
208
223
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
209
- at 2026-01-21T01:05:21.402Z
224
+ at 2026-01-21T01:20:30.163Z
210
225
  </div>
211
226
  <script src="../prettify.js"></script>
212
227
  <script>
@@ -163,7 +163,7 @@ export class DryRunExecutionStrategy&lt;
163
163
  <div class='footer quiet pad2 space-top1 center small'>
164
164
  Code coverage generated by
165
165
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
166
- at 2026-01-21T01:05:21.402Z
166
+ at 2026-01-21T01:20:30.163Z
167
167
  </div>
168
168
  <script src="../../prettify.js"></script>
169
169
  <script>
@@ -358,7 +358,7 @@ export class RetryingExecutionStrategy&lt;
358
358
  <div class='footer quiet pad2 space-top1 center small'>
359
359
  Code coverage generated by
360
360
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
361
- at 2026-01-21T01:05:21.402Z
361
+ at 2026-01-21T01:20:30.163Z
362
362
  </div>
363
363
  <script src="../../prettify.js"></script>
364
364
  <script>
@@ -175,7 +175,7 @@ export class StandardExecutionStrategy&lt;
175
175
  <div class='footer quiet pad2 space-top1 center small'>
176
176
  Code coverage generated by
177
177
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
178
- at 2026-01-21T01:05:21.402Z
178
+ at 2026-01-21T01:20:30.163Z
179
179
  </div>
180
180
  <script src="../../prettify.js"></script>
181
181
  <script>
@@ -131,7 +131,7 @@
131
131
  <div class='footer quiet pad2 space-top1 center small'>
132
132
  Code coverage generated by
133
133
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2026-01-21T01:05:21.402Z
134
+ at 2026-01-21T01:20:30.163Z
135
135
  </div>
136
136
  <script src="../../prettify.js"></script>
137
137
  <script>