@calmo/task-runner 3.5.0 → 3.7.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/.github/ISSUE_TEMPLATE/bug_report.yml +35 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +25 -0
- package/.github/workflows/ci.yml +1 -1
- package/.github/workflows/codeql.yml +101 -0
- package/.github/workflows/release.yml +2 -2
- package/.jules/nexus.md +5 -0
- package/CHANGELOG.md +18 -0
- package/coverage/index.html +1 -1
- package/coverage/lcov-report/index.html +1 -1
- package/coverage/lcov-report/src/EventBus.ts.html +1 -1
- package/coverage/lcov-report/src/TaskGraphValidationError.ts.html +1 -1
- package/coverage/lcov-report/src/TaskGraphValidator.ts.html +1 -1
- package/coverage/lcov-report/src/TaskRunner.ts.html +1 -1
- package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +1 -1
- package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +1 -1
- package/coverage/lcov-report/src/TaskStateManager.ts.html +1 -1
- package/coverage/lcov-report/src/WorkflowExecutor.ts.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
- package/coverage/lcov-report/src/strategies/RetryingExecutionStrategy.ts.html +1 -1
- package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +1 -1
- package/coverage/lcov-report/src/strategies/index.html +1 -1
- package/coverage/src/EventBus.ts.html +1 -1
- package/coverage/src/TaskGraphValidationError.ts.html +1 -1
- package/coverage/src/TaskGraphValidator.ts.html +1 -1
- package/coverage/src/TaskRunner.ts.html +1 -1
- package/coverage/src/TaskRunnerBuilder.ts.html +1 -1
- package/coverage/src/TaskRunnerExecutionConfig.ts.html +1 -1
- package/coverage/src/TaskStateManager.ts.html +1 -1
- package/coverage/src/WorkflowExecutor.ts.html +1 -1
- package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/src/contracts/index.html +1 -1
- package/coverage/src/index.html +1 -1
- package/coverage/src/strategies/DryRunExecutionStrategy.ts.html +1 -1
- package/coverage/src/strategies/RetryingExecutionStrategy.ts.html +1 -1
- package/coverage/src/strategies/StandardExecutionStrategy.ts.html +1 -1
- package/coverage/src/strategies/index.html +1 -1
- package/openspec/changes/feat-state-persistence/proposal.md +33 -0
- package/openspec/changes/feat-state-persistence/tasks.md +35 -0
- package/package.json +1 -1
- package/test-report.xml +125 -125
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: File a bug report
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for taking the time to fill out this bug report!
|
|
10
|
+
- type: textarea
|
|
11
|
+
attributes:
|
|
12
|
+
label: Description
|
|
13
|
+
description: What happened?
|
|
14
|
+
placeholder: Describe the bug...
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
- type: textarea
|
|
18
|
+
attributes:
|
|
19
|
+
label: Reproduction Steps
|
|
20
|
+
description: How do we reproduce it?
|
|
21
|
+
placeholder: |
|
|
22
|
+
1. Go to '...'
|
|
23
|
+
2. Click on '...'
|
|
24
|
+
3. Scroll down to '...'
|
|
25
|
+
4. See error
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
- type: textarea
|
|
29
|
+
attributes:
|
|
30
|
+
label: Expected Behavior
|
|
31
|
+
description: What did you expect to happen?
|
|
32
|
+
- type: textarea
|
|
33
|
+
attributes:
|
|
34
|
+
label: Environment
|
|
35
|
+
description: OS, Node version, etc.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a new feature
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for suggesting a new feature!
|
|
10
|
+
- type: textarea
|
|
11
|
+
attributes:
|
|
12
|
+
label: Description
|
|
13
|
+
description: What is the problem you are trying to solve?
|
|
14
|
+
validations:
|
|
15
|
+
required: true
|
|
16
|
+
- type: textarea
|
|
17
|
+
attributes:
|
|
18
|
+
label: Proposed Solution
|
|
19
|
+
description: Describe the solution you'd like
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
- type: textarea
|
|
23
|
+
attributes:
|
|
24
|
+
label: Alternatives Considered
|
|
25
|
+
description: Any other approaches?
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# For most projects, this workflow file will not need changing; you simply need
|
|
2
|
+
# to commit it to your repository.
|
|
3
|
+
#
|
|
4
|
+
# You may wish to alter this file to override the set of languages analyzed,
|
|
5
|
+
# or to provide custom queries or build logic.
|
|
6
|
+
#
|
|
7
|
+
# ******** NOTE ********
|
|
8
|
+
# We have attempted to detect the languages in your repository. Please check
|
|
9
|
+
# the `language` matrix defined below to confirm you have the correct set of
|
|
10
|
+
# supported CodeQL languages.
|
|
11
|
+
#
|
|
12
|
+
name: "CodeQL Advanced"
|
|
13
|
+
|
|
14
|
+
on:
|
|
15
|
+
push:
|
|
16
|
+
branches: [ "main" ]
|
|
17
|
+
pull_request:
|
|
18
|
+
branches: [ "main" ]
|
|
19
|
+
schedule:
|
|
20
|
+
- cron: '18 8 * * 3'
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
analyze:
|
|
24
|
+
name: Analyze (${{ matrix.language }})
|
|
25
|
+
# Runner size impacts CodeQL analysis time. To learn more, please see:
|
|
26
|
+
# - https://gh.io/recommended-hardware-resources-for-running-codeql
|
|
27
|
+
# - https://gh.io/supported-runners-and-hardware-resources
|
|
28
|
+
# - https://gh.io/using-larger-runners (GitHub.com only)
|
|
29
|
+
# Consider using larger runners or machines with greater resources for possible analysis time improvements.
|
|
30
|
+
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
|
|
31
|
+
permissions:
|
|
32
|
+
# required for all workflows
|
|
33
|
+
security-events: write
|
|
34
|
+
|
|
35
|
+
# required to fetch internal or private CodeQL packs
|
|
36
|
+
packages: read
|
|
37
|
+
|
|
38
|
+
# only required for workflows in private repositories
|
|
39
|
+
actions: read
|
|
40
|
+
contents: read
|
|
41
|
+
|
|
42
|
+
strategy:
|
|
43
|
+
fail-fast: false
|
|
44
|
+
matrix:
|
|
45
|
+
include:
|
|
46
|
+
- language: actions
|
|
47
|
+
build-mode: none
|
|
48
|
+
- language: javascript-typescript
|
|
49
|
+
build-mode: none
|
|
50
|
+
# CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift'
|
|
51
|
+
# Use `c-cpp` to analyze code written in C, C++ or both
|
|
52
|
+
# Use 'java-kotlin' to analyze code written in Java, Kotlin or both
|
|
53
|
+
# Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
|
|
54
|
+
# To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
|
|
55
|
+
# see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
|
|
56
|
+
# If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
|
|
57
|
+
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
|
|
58
|
+
steps:
|
|
59
|
+
- name: Checkout repository
|
|
60
|
+
uses: actions/checkout@v4
|
|
61
|
+
|
|
62
|
+
# Add any setup steps before running the `github/codeql-action/init` action.
|
|
63
|
+
# This includes steps like installing compilers or runtimes (`actions/setup-node`
|
|
64
|
+
# or others). This is typically only required for manual builds.
|
|
65
|
+
# - name: Setup runtime (example)
|
|
66
|
+
# uses: actions/setup-example@v1
|
|
67
|
+
|
|
68
|
+
# Initializes the CodeQL tools for scanning.
|
|
69
|
+
- name: Initialize CodeQL
|
|
70
|
+
uses: github/codeql-action/init@v4
|
|
71
|
+
with:
|
|
72
|
+
languages: ${{ matrix.language }}
|
|
73
|
+
build-mode: ${{ matrix.build-mode }}
|
|
74
|
+
# If you wish to specify custom queries, you can do so here or in a config file.
|
|
75
|
+
# By default, queries listed here will override any specified in a config file.
|
|
76
|
+
# Prefix the list here with "+" to use these queries and those in the config file.
|
|
77
|
+
|
|
78
|
+
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
|
79
|
+
# queries: security-extended,security-and-quality
|
|
80
|
+
|
|
81
|
+
# If the analyze step fails for one of the languages you are analyzing with
|
|
82
|
+
# "We were unable to automatically build your code", modify the matrix above
|
|
83
|
+
# to set the build mode to "manual" for that language. Then modify this step
|
|
84
|
+
# to build your code.
|
|
85
|
+
# ℹ️ Command-line programs to run using the OS shell.
|
|
86
|
+
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
|
87
|
+
- name: Run manual build steps
|
|
88
|
+
if: matrix.build-mode == 'manual'
|
|
89
|
+
shell: bash
|
|
90
|
+
run: |
|
|
91
|
+
echo 'If you are using a "manual" build mode for one or more of the' \
|
|
92
|
+
'languages you are analyzing, replace this with the commands to build' \
|
|
93
|
+
'your code, for example:'
|
|
94
|
+
echo ' make bootstrap'
|
|
95
|
+
echo ' make release'
|
|
96
|
+
exit 1
|
|
97
|
+
|
|
98
|
+
- name: Perform CodeQL Analysis
|
|
99
|
+
uses: github/codeql-action/analyze@v4
|
|
100
|
+
with:
|
|
101
|
+
category: "/language:${{matrix.language}}"
|
|
@@ -16,12 +16,12 @@ jobs:
|
|
|
16
16
|
id-token: write # to enable use of OIDC for npm provenance
|
|
17
17
|
steps:
|
|
18
18
|
- name: Checkout
|
|
19
|
-
uses: actions/checkout@
|
|
19
|
+
uses: actions/checkout@v6
|
|
20
20
|
with:
|
|
21
21
|
fetch-depth: 0
|
|
22
22
|
|
|
23
23
|
- name: Setup pnpm
|
|
24
|
-
uses: pnpm/action-setup@
|
|
24
|
+
uses: pnpm/action-setup@v4
|
|
25
25
|
with:
|
|
26
26
|
version: 10.28.0
|
|
27
27
|
|
package/.jules/nexus.md
CHANGED
|
@@ -4,3 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
**Insight:** Users often confuse "Workflow Timeout" with "Task Timeout". A workflow might allow 5 minutes, but a single HTTP request shouldn't hang for 4 minutes.
|
|
6
6
|
**Action:** By pushing timeout logic down to the `TaskStep` level (and the Strategy layer), we remove the burden of "cooperative cancellation" from the user's business logic, enforcing it at the runner level. This makes the system "secure by default" against zombie tasks.
|
|
7
|
+
|
|
8
|
+
## 2024-05-24 - The Value of Resumability
|
|
9
|
+
|
|
10
|
+
**Insight:** In distributed systems or long-running local scripts, "Retry from scratch" is a naive default. Users fear side effects (double-billing, double-emailing).
|
|
11
|
+
**Action:** Treating the `TaskResult` map as a portable "Save Game" file transforms the library from a simple runner into a resilient engine. The key is separating "Execution State" (which tasks passed) from "Runtime Context" (variables in memory). By persisting only the former, we avoid the nightmare of serializing closures/sockets while still solving the user's primary pain point: "Don't do the hard work twice."
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
## 3.7.0 (2026-01-19)
|
|
2
|
+
|
|
3
|
+
* Merge pull request #82 from thalesraymond/nexus-feature-state-persistence-17975676824428491411 ([1137981](https://github.com/thalesraymond/task-runner/commit/1137981)), closes [#82](https://github.com/thalesraymond/task-runner/issues/82)
|
|
4
|
+
* feat: add workflow state persistence proposal ([b62769e](https://github.com/thalesraymond/task-runner/commit/b62769e))
|
|
5
|
+
|
|
6
|
+
## 3.6.0 (2026-01-19)
|
|
7
|
+
|
|
8
|
+
* Add CodeQL analysis workflow configuration ([b2ee976](https://github.com/thalesraymond/task-runner/commit/b2ee976))
|
|
9
|
+
* Merge pull request #66 from thalesraymond/dependabot/github_actions/actions/checkout-6 ([cb6e75f](https://github.com/thalesraymond/task-runner/commit/cb6e75f)), closes [#66](https://github.com/thalesraymond/task-runner/issues/66)
|
|
10
|
+
* Merge pull request #67 from thalesraymond/dependabot/github_actions/pnpm/action-setup-4 ([4c9e9f3](https://github.com/thalesraymond/task-runner/commit/4c9e9f3)), closes [#67](https://github.com/thalesraymond/task-runner/issues/67)
|
|
11
|
+
* Merge pull request #68 from thalesraymond/dependabot/github_actions/SonarSource/sonarqube-scan-actio ([9980f4d](https://github.com/thalesraymond/task-runner/commit/9980f4d)), closes [#68](https://github.com/thalesraymond/task-runner/issues/68)
|
|
12
|
+
* Merge pull request #71 from thalesraymond/chore/codeQLworkflow ([db4f46a](https://github.com/thalesraymond/task-runner/commit/db4f46a)), closes [#71](https://github.com/thalesraymond/task-runner/issues/71)
|
|
13
|
+
* Merge pull request #72 from thalesraymond/setup-issue-templates-6661562951039014259 ([f3281bf](https://github.com/thalesraymond/task-runner/commit/f3281bf)), closes [#72](https://github.com/thalesraymond/task-runner/issues/72)
|
|
14
|
+
* feat: add issue templates ([6ff97f1](https://github.com/thalesraymond/task-runner/commit/6ff97f1))
|
|
15
|
+
* chore(deps): bump actions/checkout from 4 to 6 ([f0b2f0e](https://github.com/thalesraymond/task-runner/commit/f0b2f0e))
|
|
16
|
+
* chore(deps): bump pnpm/action-setup from 2 to 4 ([2a5c3e1](https://github.com/thalesraymond/task-runner/commit/2a5c3e1))
|
|
17
|
+
* chore(deps): bump SonarSource/sonarqube-scan-action from 6 to 7 ([df236cd](https://github.com/thalesraymond/task-runner/commit/df236cd))
|
|
18
|
+
|
|
1
19
|
## 3.5.0 (2026-01-18)
|
|
2
20
|
|
|
3
21
|
* Merge pull request #69 from thalesraymond/feat/conditional-execution ([dd1dd8d](https://github.com/thalesraymond/task-runner/commit/dd1dd8d)), closes [#69](https://github.com/thalesraymond/task-runner/issues/69)
|
package/coverage/index.html
CHANGED
|
@@ -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-
|
|
134
|
+
at 2026-01-19T22:41:01.764Z
|
|
135
135
|
</div>
|
|
136
136
|
<script src="prettify.js"></script>
|
|
137
137
|
<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-
|
|
134
|
+
at 2026-01-19T22:41:01.775Z
|
|
135
135
|
</div>
|
|
136
136
|
<script src="prettify.js"></script>
|
|
137
137
|
<script>
|
|
@@ -328,7 +328,7 @@ export class EventBus<TContext> {
|
|
|
328
328
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
329
329
|
Code coverage generated by
|
|
330
330
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
331
|
-
at 2026-01-
|
|
331
|
+
at 2026-01-19T22:41:01.775Z
|
|
332
332
|
</div>
|
|
333
333
|
<script src="../prettify.js"></script>
|
|
334
334
|
<script>
|
|
@@ -115,7 +115,7 @@ export class TaskGraphValidationError extends Error {
|
|
|
115
115
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
116
116
|
Code coverage generated by
|
|
117
117
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
118
|
-
at 2026-01-
|
|
118
|
+
at 2026-01-19T22:41:01.775Z
|
|
119
119
|
</div>
|
|
120
120
|
<script src="../prettify.js"></script>
|
|
121
121
|
<script>
|
|
@@ -574,7 +574,7 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
574
574
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
575
575
|
Code coverage generated by
|
|
576
576
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
577
|
-
at 2026-01-
|
|
577
|
+
at 2026-01-19T22:41:01.775Z
|
|
578
578
|
</div>
|
|
579
579
|
<script src="../prettify.js"></script>
|
|
580
580
|
<script>
|
|
@@ -676,7 +676,7 @@ export class TaskRunner<TContext> {
|
|
|
676
676
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
677
677
|
Code coverage generated by
|
|
678
678
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
679
|
-
at 2026-01-
|
|
679
|
+
at 2026-01-19T22:41:01.775Z
|
|
680
680
|
</div>
|
|
681
681
|
<script src="../prettify.js"></script>
|
|
682
682
|
<script>
|
|
@@ -322,7 +322,7 @@ export class TaskRunnerBuilder<TContext> {
|
|
|
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-
|
|
325
|
+
at 2026-01-19T22:41:01.775Z
|
|
326
326
|
</div>
|
|
327
327
|
<script src="../prettify.js"></script>
|
|
328
328
|
<script>
|
|
@@ -139,7 +139,7 @@ export interface TaskRunnerExecutionConfig {
|
|
|
139
139
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
140
140
|
Code coverage generated by
|
|
141
141
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
142
|
-
at 2026-01-
|
|
142
|
+
at 2026-01-19T22:41:01.775Z
|
|
143
143
|
</div>
|
|
144
144
|
<script src="../prettify.js"></script>
|
|
145
145
|
<script>
|
|
@@ -526,7 +526,7 @@ export class TaskStateManager<TContext> {
|
|
|
526
526
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
527
527
|
Code coverage generated by
|
|
528
528
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
529
|
-
at 2026-01-
|
|
529
|
+
at 2026-01-19T22:41:01.775Z
|
|
530
530
|
</div>
|
|
531
531
|
<script src="../prettify.js"></script>
|
|
532
532
|
<script>
|
|
@@ -634,7 +634,7 @@ export class WorkflowExecutor<TContext> {
|
|
|
634
634
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
635
635
|
Code coverage generated by
|
|
636
636
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
637
|
-
at 2026-01-
|
|
637
|
+
at 2026-01-19T22:41:01.775Z
|
|
638
638
|
</div>
|
|
639
639
|
<script src="../prettify.js"></script>
|
|
640
640
|
<script>
|
|
@@ -202,7 +202,7 @@ export type ListenerMap<TContext> = {
|
|
|
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-
|
|
205
|
+
at 2026-01-19T22:41:01.775Z
|
|
206
206
|
</div>
|
|
207
207
|
<script src="../../prettify.js"></script>
|
|
208
208
|
<script>
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
102
102
|
Code coverage generated by
|
|
103
103
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
104
|
-
at 2026-01-
|
|
104
|
+
at 2026-01-19T22:41:01.775Z
|
|
105
105
|
</div>
|
|
106
106
|
<script src="../../prettify.js"></script>
|
|
107
107
|
<script>
|
|
@@ -206,7 +206,7 @@
|
|
|
206
206
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
207
207
|
Code coverage generated by
|
|
208
208
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
209
|
-
at 2026-01-
|
|
209
|
+
at 2026-01-19T22:41:01.775Z
|
|
210
210
|
</div>
|
|
211
211
|
<script src="../prettify.js"></script>
|
|
212
212
|
<script>
|
|
@@ -163,7 +163,7 @@ export class DryRunExecutionStrategy<
|
|
|
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-
|
|
166
|
+
at 2026-01-19T22:41:01.775Z
|
|
167
167
|
</div>
|
|
168
168
|
<script src="../../prettify.js"></script>
|
|
169
169
|
<script>
|
|
@@ -358,7 +358,7 @@ export class RetryingExecutionStrategy<
|
|
|
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-
|
|
361
|
+
at 2026-01-19T22:41:01.775Z
|
|
362
362
|
</div>
|
|
363
363
|
<script src="../../prettify.js"></script>
|
|
364
364
|
<script>
|
|
@@ -175,7 +175,7 @@ export class StandardExecutionStrategy<
|
|
|
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-
|
|
178
|
+
at 2026-01-19T22:41:01.775Z
|
|
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-
|
|
134
|
+
at 2026-01-19T22:41:01.775Z
|
|
135
135
|
</div>
|
|
136
136
|
<script src="../../prettify.js"></script>
|
|
137
137
|
<script>
|
|
@@ -328,7 +328,7 @@ export class EventBus<TContext> {
|
|
|
328
328
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
329
329
|
Code coverage generated by
|
|
330
330
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
331
|
-
at 2026-01-
|
|
331
|
+
at 2026-01-19T22:41:01.764Z
|
|
332
332
|
</div>
|
|
333
333
|
<script src="../prettify.js"></script>
|
|
334
334
|
<script>
|
|
@@ -115,7 +115,7 @@ export class TaskGraphValidationError extends Error {
|
|
|
115
115
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
116
116
|
Code coverage generated by
|
|
117
117
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
118
|
-
at 2026-01-
|
|
118
|
+
at 2026-01-19T22:41:01.764Z
|
|
119
119
|
</div>
|
|
120
120
|
<script src="../prettify.js"></script>
|
|
121
121
|
<script>
|
|
@@ -574,7 +574,7 @@ export class TaskGraphValidator implements ITaskGraphValidator {
|
|
|
574
574
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
575
575
|
Code coverage generated by
|
|
576
576
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
577
|
-
at 2026-01-
|
|
577
|
+
at 2026-01-19T22:41:01.764Z
|
|
578
578
|
</div>
|
|
579
579
|
<script src="../prettify.js"></script>
|
|
580
580
|
<script>
|
|
@@ -676,7 +676,7 @@ export class TaskRunner<TContext> {
|
|
|
676
676
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
677
677
|
Code coverage generated by
|
|
678
678
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
679
|
-
at 2026-01-
|
|
679
|
+
at 2026-01-19T22:41:01.764Z
|
|
680
680
|
</div>
|
|
681
681
|
<script src="../prettify.js"></script>
|
|
682
682
|
<script>
|
|
@@ -322,7 +322,7 @@ export class TaskRunnerBuilder<TContext> {
|
|
|
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-
|
|
325
|
+
at 2026-01-19T22:41:01.764Z
|
|
326
326
|
</div>
|
|
327
327
|
<script src="../prettify.js"></script>
|
|
328
328
|
<script>
|
|
@@ -139,7 +139,7 @@ export interface TaskRunnerExecutionConfig {
|
|
|
139
139
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
140
140
|
Code coverage generated by
|
|
141
141
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
142
|
-
at 2026-01-
|
|
142
|
+
at 2026-01-19T22:41:01.764Z
|
|
143
143
|
</div>
|
|
144
144
|
<script src="../prettify.js"></script>
|
|
145
145
|
<script>
|
|
@@ -526,7 +526,7 @@ export class TaskStateManager<TContext> {
|
|
|
526
526
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
527
527
|
Code coverage generated by
|
|
528
528
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
529
|
-
at 2026-01-
|
|
529
|
+
at 2026-01-19T22:41:01.764Z
|
|
530
530
|
</div>
|
|
531
531
|
<script src="../prettify.js"></script>
|
|
532
532
|
<script>
|
|
@@ -634,7 +634,7 @@ export class WorkflowExecutor<TContext> {
|
|
|
634
634
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
635
635
|
Code coverage generated by
|
|
636
636
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
637
|
-
at 2026-01-
|
|
637
|
+
at 2026-01-19T22:41:01.764Z
|
|
638
638
|
</div>
|
|
639
639
|
<script src="../prettify.js"></script>
|
|
640
640
|
<script>
|
|
@@ -202,7 +202,7 @@ export type ListenerMap<TContext> = {
|
|
|
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-
|
|
205
|
+
at 2026-01-19T22:41:01.764Z
|
|
206
206
|
</div>
|
|
207
207
|
<script src="../../prettify.js"></script>
|
|
208
208
|
<script>
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
102
102
|
Code coverage generated by
|
|
103
103
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
104
|
-
at 2026-01-
|
|
104
|
+
at 2026-01-19T22:41:01.764Z
|
|
105
105
|
</div>
|
|
106
106
|
<script src="../../prettify.js"></script>
|
|
107
107
|
<script>
|
package/coverage/src/index.html
CHANGED
|
@@ -206,7 +206,7 @@
|
|
|
206
206
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
207
207
|
Code coverage generated by
|
|
208
208
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
209
|
-
at 2026-01-
|
|
209
|
+
at 2026-01-19T22:41:01.764Z
|
|
210
210
|
</div>
|
|
211
211
|
<script src="../prettify.js"></script>
|
|
212
212
|
<script>
|
|
@@ -163,7 +163,7 @@ export class DryRunExecutionStrategy<
|
|
|
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-
|
|
166
|
+
at 2026-01-19T22:41:01.764Z
|
|
167
167
|
</div>
|
|
168
168
|
<script src="../../prettify.js"></script>
|
|
169
169
|
<script>
|
|
@@ -358,7 +358,7 @@ export class RetryingExecutionStrategy<
|
|
|
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-
|
|
361
|
+
at 2026-01-19T22:41:01.764Z
|
|
362
362
|
</div>
|
|
363
363
|
<script src="../../prettify.js"></script>
|
|
364
364
|
<script>
|
|
@@ -175,7 +175,7 @@ export class StandardExecutionStrategy<
|
|
|
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-
|
|
178
|
+
at 2026-01-19T22:41:01.764Z
|
|
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-
|
|
134
|
+
at 2026-01-19T22:41:01.764Z
|
|
135
135
|
</div>
|
|
136
136
|
<script src="../../prettify.js"></script>
|
|
137
137
|
<script>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Feature: Workflow State Persistence (Checkpoint/Resume)
|
|
2
|
+
|
|
3
|
+
## 🎯 User Story
|
|
4
|
+
|
|
5
|
+
"As a DevOps engineer, I want to save the state of a running workflow and resume it later from where it left off (e.g., after a server crash, deployment, or manual pause), so that I don't have to re-run expensive or side-effect-heavy tasks."
|
|
6
|
+
|
|
7
|
+
## ❓ Why
|
|
8
|
+
|
|
9
|
+
1. **Cost Efficiency**: Re-running tasks like AI model training, large data ingestion, or paid API calls wastes money and resources.
|
|
10
|
+
2. **Safety & Idempotency**: Some tasks are not idempotent (e.g., "Charge Credit Card", "Send Email"). If a workflow crashes after these steps but before completion, re-running from scratch is dangerous.
|
|
11
|
+
3. **Resilience**: Long-running workflows (minutes to hours) are vulnerable to transient infrastructure failures. Resuming from the last successful step allows recovery without total data loss.
|
|
12
|
+
|
|
13
|
+
## 🛠️ What Changes
|
|
14
|
+
|
|
15
|
+
1. **State Exposure**: `TaskRunner` and `TaskStateManager` need to expose the current execution state (results of completed tasks).
|
|
16
|
+
2. **Hydration**: `TaskRunnerBuilder` and `TaskStateManager` need a way to initialize with a pre-existing state (the snapshot).
|
|
17
|
+
3. **Execution Logic**: `WorkflowExecutor` needs to respect the hydrated state—skipping tasks that are already marked as `success` in the snapshot, while treating them as satisfied dependencies for downstream tasks.
|
|
18
|
+
|
|
19
|
+
## ✅ Acceptance Criteria
|
|
20
|
+
|
|
21
|
+
- [ ] `TaskRunner` (or `TaskStateManager`) must expose a method to get a serializable snapshot of the current state (`results`).
|
|
22
|
+
- [ ] `TaskRunnerBuilder` must accept a snapshot to initialize the runner.
|
|
23
|
+
- [ ] When `execute` is called with a hydrated state:
|
|
24
|
+
- Tasks marked as `success` in the snapshot MUST NOT run again.
|
|
25
|
+
- Tasks marked as `success` in the snapshot MUST be treated as completed dependencies for pending tasks.
|
|
26
|
+
- Tasks marked as `failure`, `cancelled`, or `skipped` in the snapshot SHOULD be re-evaluated (run again).
|
|
27
|
+
- [ ] Context (`TContext`) changes made by tasks in the previous run must be manually restored by the user (since context can contain non-serializable objects), OR the snapshot must include a mechanism to warn/handle context.
|
|
28
|
+
- *Decision*: For MVP, the user is responsible for providing the initial `context` to the `TaskRunnerBuilder`. The *state* snapshot only tracks task status/results. If the context needs to be in a certain state for step N+1, the user must provide that context.
|
|
29
|
+
- *Refinement*: The snapshot should strictly contain `Record<string, TaskResult>`.
|
|
30
|
+
|
|
31
|
+
## ⚠️ Constraints
|
|
32
|
+
|
|
33
|
+
- The `TContext` object is often non-serializable (contains functions, sockets, etc.). Therefore, this feature **only** persists the *execution graph state* (which tasks finished). The user is responsible for re-hydrating the `context` to a state suitable for resumption if necessary.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Engineering Tasks
|
|
2
|
+
|
|
3
|
+
- [ ] **Task 1: Update TaskStateManager to support Hydration**
|
|
4
|
+
- Modify `src/TaskStateManager.ts`.
|
|
5
|
+
- Add `hydrate(results: Map<string, TaskResult>): void` method.
|
|
6
|
+
- This method should populate `this.results` with the provided map.
|
|
7
|
+
- Ensure `processDependencies` can handle tasks being in `results` but not physically having just run (logic should already support this, but verify).
|
|
8
|
+
|
|
9
|
+
- [ ] **Task 2: Expose State in TaskRunner**
|
|
10
|
+
- Modify `src/TaskRunner.ts`.
|
|
11
|
+
- Add `getSnapshot(): Record<string, TaskResult>` method.
|
|
12
|
+
- Converts the internal Map to a plain object for JSON serialization.
|
|
13
|
+
|
|
14
|
+
- [ ] **Task 3: Update TaskRunnerBuilder**
|
|
15
|
+
- Modify `src/TaskRunnerBuilder.ts`.
|
|
16
|
+
- Add `.loadState(snapshot: Record<string, TaskResult>)` method.
|
|
17
|
+
- Store this state in the builder.
|
|
18
|
+
- When `.build()` is called, pass this state to the `TaskRunner` (which might need a new method `runner.hydrate(...)` or constructor arg).
|
|
19
|
+
|
|
20
|
+
- [ ] **Task 4: Update WorkflowExecutor / TaskStateManager Interaction**
|
|
21
|
+
- Ensure that when `TaskStateManager.initialize(steps)` is called, it respects the hydrated state.
|
|
22
|
+
- If a step is in `results` (from hydration) and is `success`, it should NOT be added to `pendingSteps` (or `processDependencies` should immediately treat it as done).
|
|
23
|
+
- *Refinement*: The `TaskStateManager.initialize` currently overwrites `pendingSteps`. It should probably filter out steps that are already in `results` with `success` status?
|
|
24
|
+
- logic: `pendingSteps = new Set(steps.filter(s => !this.results.get(s.name) || this.results.get(s.name).status !== 'success'))`.
|
|
25
|
+
- Check implications for `processDependencies`: If Step A is done (in results, not pending), and Step B depends on A. `processDependencies` checks `results.get('A')`. It finds it. It marks B as ready. This works.
|
|
26
|
+
|
|
27
|
+
- [ ] **Task 5: Unit Tests**
|
|
28
|
+
- Create `tests/StatePersistence.test.ts`.
|
|
29
|
+
- Test: Run A->B. Fail B. Snapshot.
|
|
30
|
+
- Create new Runner with snapshot. Run.
|
|
31
|
+
- Verify A does not run. B runs.
|
|
32
|
+
- Test: Hydration with non-success status (should re-run).
|
|
33
|
+
|
|
34
|
+
- [ ] **Task 6: Documentation**
|
|
35
|
+
- Update `README.md` with "Checkpointing & Resumption" section.
|
package/package.json
CHANGED
package/test-report.xml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8" ?>
|
|
2
|
-
<testsuites name="vitest tests" tests="98" failures="0" errors="0" time="1.
|
|
3
|
-
<testsuite name="tests/ComplexScenario.test.ts" timestamp="2026-01-
|
|
4
|
-
<testcase classname="tests/ComplexScenario.test.ts" name="Complex Scenario Integration Tests > 1. All steps execute when all succeed and context is hydrated" time="0.
|
|
2
|
+
<testsuites name="vitest tests" tests="98" failures="0" errors="0" time="1.218391983">
|
|
3
|
+
<testsuite name="tests/ComplexScenario.test.ts" timestamp="2026-01-19T22:41:01.734Z" hostname="runnervmmtnos" tests="2" failures="0" errors="0" skipped="0" time="0.012285213">
|
|
4
|
+
<testcase classname="tests/ComplexScenario.test.ts" name="Complex Scenario Integration Tests > 1. All steps execute when all succeed and context is hydrated" time="0.008392178">
|
|
5
5
|
<system-out>
|
|
6
6
|
Running StepA
|
|
7
7
|
Running StepB
|
|
@@ -15,239 +15,239 @@ Running StepG
|
|
|
15
15
|
|
|
16
16
|
</system-out>
|
|
17
17
|
</testcase>
|
|
18
|
-
<testcase classname="tests/ComplexScenario.test.ts" name="Complex Scenario Integration Tests > 2. The 'skip' propagation works as intended if something breaks up in the tree" time="0.
|
|
18
|
+
<testcase classname="tests/ComplexScenario.test.ts" name="Complex Scenario Integration Tests > 2. The 'skip' propagation works as intended if something breaks up in the tree" time="0.00178463">
|
|
19
19
|
</testcase>
|
|
20
20
|
</testsuite>
|
|
21
|
-
<testsuite name="tests/DryRunExecutionStrategy.test.ts" timestamp="2026-01-
|
|
22
|
-
<testcase classname="tests/DryRunExecutionStrategy.test.ts" name="DryRunExecutionStrategy > should return success without running the task" time="0.
|
|
21
|
+
<testsuite name="tests/DryRunExecutionStrategy.test.ts" timestamp="2026-01-19T22:41:01.736Z" hostname="runnervmmtnos" tests="1" failures="0" errors="0" skipped="0" time="0.003717627">
|
|
22
|
+
<testcase classname="tests/DryRunExecutionStrategy.test.ts" name="DryRunExecutionStrategy > should return success without running the task" time="0.002088076">
|
|
23
23
|
</testcase>
|
|
24
24
|
</testsuite>
|
|
25
|
-
<testsuite name="tests/EventBus.test.ts" timestamp="2026-01-
|
|
26
|
-
<testcase classname="tests/EventBus.test.ts" name="EventBus > should handle async listeners throwing errors without crashing" time="0.
|
|
25
|
+
<testsuite name="tests/EventBus.test.ts" timestamp="2026-01-19T22:41:01.736Z" hostname="runnervmmtnos" tests="1" failures="0" errors="0" skipped="0" time="0.017142335">
|
|
26
|
+
<testcase classname="tests/EventBus.test.ts" name="EventBus > should handle async listeners throwing errors without crashing" time="0.015071521">
|
|
27
27
|
</testcase>
|
|
28
28
|
</testsuite>
|
|
29
|
-
<testsuite name="tests/TaskGraphValidator.test.ts" timestamp="2026-01-
|
|
30
|
-
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should be instantiated" time="0.
|
|
29
|
+
<testsuite name="tests/TaskGraphValidator.test.ts" timestamp="2026-01-19T22:41:01.737Z" hostname="runnervmmtnos" tests="9" failures="0" errors="0" skipped="0" time="0.009905473">
|
|
30
|
+
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should be instantiated" time="0.001981367">
|
|
31
31
|
</testcase>
|
|
32
|
-
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should return valid result for empty graph" time="0.
|
|
32
|
+
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should return valid result for empty graph" time="0.001464352">
|
|
33
33
|
</testcase>
|
|
34
|
-
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should detect duplicate tasks" time="0.
|
|
34
|
+
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should detect duplicate tasks" time="0.001791663">
|
|
35
35
|
</testcase>
|
|
36
|
-
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should detect missing dependencies" time="0.
|
|
36
|
+
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should detect missing dependencies" time="0.000486548">
|
|
37
37
|
</testcase>
|
|
38
|
-
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should detect cycles" time="0.
|
|
38
|
+
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should detect cycles" time="0.000473743">
|
|
39
39
|
</testcase>
|
|
40
|
-
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should return valid for a correct graph" time="0.
|
|
40
|
+
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should return valid for a correct graph" time="0.000387353">
|
|
41
41
|
</testcase>
|
|
42
|
-
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should not detect cycles if missing dependencies are present" time="0.
|
|
42
|
+
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should not detect cycles if missing dependencies are present" time="0.00030566">
|
|
43
43
|
</testcase>
|
|
44
|
-
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should detect more complex cycles" time="0.
|
|
44
|
+
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should detect more complex cycles" time="0.000282818">
|
|
45
45
|
</testcase>
|
|
46
|
-
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should handle cycle detection with no cycles but shared dependencies" time="0.
|
|
46
|
+
<testcase classname="tests/TaskGraphValidator.test.ts" name="TaskGraphValidator > should handle cycle detection with no cycles but shared dependencies" time="0.000254264">
|
|
47
47
|
</testcase>
|
|
48
48
|
</testsuite>
|
|
49
|
-
<testsuite name="tests/TaskGraphValidatorDoS.test.ts" timestamp="2026-01-
|
|
50
|
-
<testcase classname="tests/TaskGraphValidatorDoS.test.ts" name="TaskGraphValidator - Deep Recursion > should handle deep graphs without stack overflow" time="0.
|
|
49
|
+
<testsuite name="tests/TaskGraphValidatorDoS.test.ts" timestamp="2026-01-19T22:41:01.739Z" hostname="runnervmmtnos" tests="1" failures="0" errors="0" skipped="0" time="0.062786106">
|
|
50
|
+
<testcase classname="tests/TaskGraphValidatorDoS.test.ts" name="TaskGraphValidator - Deep Recursion > should handle deep graphs without stack overflow" time="0.060876753">
|
|
51
51
|
</testcase>
|
|
52
52
|
</testsuite>
|
|
53
|
-
<testsuite name="tests/TaskRunner.test.ts" timestamp="2026-01-
|
|
54
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should run tasks in the correct sequential order" time="0.
|
|
53
|
+
<testsuite name="tests/TaskRunner.test.ts" timestamp="2026-01-19T22:41:01.739Z" hostname="runnervmmtnos" tests="11" failures="0" errors="0" skipped="0" time="0.114562883">
|
|
54
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should run tasks in the correct sequential order" time="0.004123734">
|
|
55
55
|
</testcase>
|
|
56
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should handle an empty list of tasks gracefully" time="0.
|
|
56
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should handle an empty list of tasks gracefully" time="0.000463455">
|
|
57
57
|
</testcase>
|
|
58
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should run independent tasks in parallel" time="0.
|
|
58
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should run independent tasks in parallel" time="0.100082195">
|
|
59
59
|
</testcase>
|
|
60
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should skip dependent tasks if a root task fails" time="0.
|
|
60
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should skip dependent tasks if a root task fails" time="0.000557149">
|
|
61
61
|
</testcase>
|
|
62
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should throw an error for 'circular dependency'" time="0.
|
|
62
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should throw an error for 'circular dependency'" time="0.002963168">
|
|
63
63
|
</testcase>
|
|
64
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should throw an error for 'missing dependency'" time="0.
|
|
64
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should throw an error for 'missing dependency'" time="0.000381843">
|
|
65
65
|
</testcase>
|
|
66
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should handle tasks that throw an error during execution" time="0.
|
|
66
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should handle tasks that throw an error during execution" time="0.000407561">
|
|
67
67
|
</testcase>
|
|
68
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should skip tasks whose dependencies are skipped" time="0.
|
|
68
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should skip tasks whose dependencies are skipped" time="0.000442766">
|
|
69
69
|
</testcase>
|
|
70
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should handle tasks that throw a non-Error object during execution" time="0.
|
|
70
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should handle tasks that throw a non-Error object during execution" time="0.001151038">
|
|
71
71
|
</testcase>
|
|
72
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should handle duplicate steps where one gets skipped due to failed dependency" time="0.
|
|
72
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should handle duplicate steps where one gets skipped due to failed dependency" time="0.000881875">
|
|
73
73
|
</testcase>
|
|
74
|
-
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should throw TaskGraphValidationError with detailed result" time="0.
|
|
74
|
+
<testcase classname="tests/TaskRunner.test.ts" name="TaskRunner > should throw TaskGraphValidationError with detailed result" time="0.000877226">
|
|
75
75
|
</testcase>
|
|
76
76
|
</testsuite>
|
|
77
|
-
<testsuite name="tests/TaskRunnerEvents.test.ts" timestamp="2026-01-
|
|
78
|
-
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should fire all lifecycle events in a successful run" time="0.
|
|
77
|
+
<testsuite name="tests/TaskRunnerEvents.test.ts" timestamp="2026-01-19T22:41:01.741Z" hostname="runnervmmtnos" tests="7" failures="0" errors="0" skipped="0" time="0.020672211">
|
|
78
|
+
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should fire all lifecycle events in a successful run" time="0.00810352">
|
|
79
79
|
</testcase>
|
|
80
|
-
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should fire taskSkipped event when dependency fails" time="0.
|
|
80
|
+
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should fire taskSkipped event when dependency fails" time="0.005544575">
|
|
81
81
|
</testcase>
|
|
82
|
-
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should not crash if a listener throws an error" time="0.
|
|
82
|
+
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should not crash if a listener throws an error" time="0.001602109">
|
|
83
83
|
</testcase>
|
|
84
|
-
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should fire workflow events even for empty step list" time="0.
|
|
84
|
+
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should fire workflow events even for empty step list" time="0.000568551">
|
|
85
85
|
</testcase>
|
|
86
|
-
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should handle unsubscribe correctly" time="0.
|
|
86
|
+
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should handle unsubscribe correctly" time="0.001260832">
|
|
87
87
|
</testcase>
|
|
88
|
-
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should safely handle off() when no listeners exist" time="0.
|
|
88
|
+
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should safely handle off() when no listeners exist" time="0.000425624">
|
|
89
89
|
</testcase>
|
|
90
|
-
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should support multiple listeners for the same event" time="0.
|
|
90
|
+
<testcase classname="tests/TaskRunnerEvents.test.ts" name="TaskRunner Events > should support multiple listeners for the same event" time="0.000689978">
|
|
91
91
|
</testcase>
|
|
92
92
|
</testsuite>
|
|
93
|
-
<testsuite name="tests/TaskRunnerMermaid.test.ts" timestamp="2026-01-
|
|
94
|
-
<testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph > should generate a simple graph with no dependencies" time="0.
|
|
93
|
+
<testsuite name="tests/TaskRunnerMermaid.test.ts" timestamp="2026-01-19T22:41:01.742Z" hostname="runnervmmtnos" tests="4" failures="0" errors="0" skipped="0" time="0.007660925">
|
|
94
|
+
<testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph > should generate a simple graph with no dependencies" time="0.00348373">
|
|
95
95
|
</testcase>
|
|
96
|
-
<testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph > should generate a graph with dependencies" time="0.
|
|
96
|
+
<testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph > should generate a graph with dependencies" time="0.000861708">
|
|
97
97
|
</testcase>
|
|
98
|
-
<testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph > should handle mixed independent and dependent tasks" time="0.
|
|
98
|
+
<testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph > should handle mixed independent and dependent tasks" time="0.000448287">
|
|
99
99
|
</testcase>
|
|
100
|
-
<testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph > should handle special characters in task names" time="0.
|
|
100
|
+
<testcase classname="tests/TaskRunnerMermaid.test.ts" name="TaskRunner Mermaid Graph > should handle special characters in task names" time="0.000603146">
|
|
101
101
|
</testcase>
|
|
102
102
|
</testsuite>
|
|
103
|
-
<testsuite name="tests/TaskRunnerRefactor.test.ts" timestamp="2026-01-
|
|
104
|
-
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > should allow setting execution strategy" time="0.
|
|
103
|
+
<testsuite name="tests/TaskRunnerRefactor.test.ts" timestamp="2026-01-19T22:41:01.743Z" hostname="runnervmmtnos" tests="6" failures="0" errors="0" skipped="0" time="0.009812966">
|
|
104
|
+
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > should allow setting execution strategy" time="0.00220279">
|
|
105
105
|
</testcase>
|
|
106
|
-
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > should allow unsubscribing from events" time="0.
|
|
106
|
+
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > should allow unsubscribing from events" time="0.001253609">
|
|
107
107
|
</testcase>
|
|
108
|
-
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > TaskStateManager.cancelAllPending should handle non-existing tasks gracefully" time="0.
|
|
108
|
+
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > TaskStateManager.cancelAllPending should handle non-existing tasks gracefully" time="0.000545748">
|
|
109
109
|
</testcase>
|
|
110
|
-
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > TaskRunnerBuilder should build a TaskRunner" time="0.
|
|
110
|
+
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > TaskRunnerBuilder should build a TaskRunner" time="0.000723249">
|
|
111
111
|
</testcase>
|
|
112
|
-
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > TaskRunnerBuilder should build a TaskRunner with no listeners" time="0.
|
|
112
|
+
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > TaskRunnerBuilder should build a TaskRunner with no listeners" time="0.000216313">
|
|
113
113
|
</testcase>
|
|
114
|
-
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > WorkflowExecutor should break infinite loop if no progress can be made" time="0.
|
|
114
|
+
<testcase classname="tests/TaskRunnerRefactor.test.ts" name="TaskRunner Refactor Coverage > WorkflowExecutor should break infinite loop if no progress can be made" time="0.002769475">
|
|
115
115
|
</testcase>
|
|
116
116
|
</testsuite>
|
|
117
|
-
<testsuite name="tests/WorkflowExecutor.test.ts" timestamp="2026-01-
|
|
118
|
-
<testcase classname="tests/WorkflowExecutor.test.ts" name="WorkflowExecutor > should execute steps sequentially when dependencies exist" time="0.
|
|
117
|
+
<testsuite name="tests/WorkflowExecutor.test.ts" timestamp="2026-01-19T22:41:01.744Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.057016151">
|
|
118
|
+
<testcase classname="tests/WorkflowExecutor.test.ts" name="WorkflowExecutor > should execute steps sequentially when dependencies exist" time="0.003279559">
|
|
119
119
|
</testcase>
|
|
120
|
-
<testcase classname="tests/WorkflowExecutor.test.ts" name="WorkflowExecutor > should skip dependent steps if dependency fails" time="0.
|
|
120
|
+
<testcase classname="tests/WorkflowExecutor.test.ts" name="WorkflowExecutor > should skip dependent steps if dependency fails" time="0.000525381">
|
|
121
121
|
</testcase>
|
|
122
|
-
<testcase classname="tests/WorkflowExecutor.test.ts" name="WorkflowExecutor > should run independent steps in parallel" time="0.
|
|
122
|
+
<testcase classname="tests/WorkflowExecutor.test.ts" name="WorkflowExecutor > should run independent steps in parallel" time="0.05104526">
|
|
123
123
|
</testcase>
|
|
124
124
|
</testsuite>
|
|
125
|
-
<testsuite name="tests/cancellation.test.ts" timestamp="2026-01-
|
|
126
|
-
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should execute tasks normally without cancellation" time="0.
|
|
125
|
+
<testsuite name="tests/cancellation.test.ts" timestamp="2026-01-19T22:41:01.745Z" hostname="runnervmmtnos" tests="10" failures="0" errors="0" skipped="0" time="0.163640877">
|
|
126
|
+
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should execute tasks normally without cancellation" time="0.003528133">
|
|
127
127
|
</testcase>
|
|
128
|
-
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should cancel workflow via AbortSignal" time="0.
|
|
128
|
+
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should cancel workflow via AbortSignal" time="0.011728543">
|
|
129
129
|
</testcase>
|
|
130
|
-
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should cancel workflow via global timeout" time="0.
|
|
130
|
+
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should cancel workflow via global timeout" time="0.051121623">
|
|
131
131
|
</testcase>
|
|
132
|
-
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should handle pre-aborted signal" time="0.
|
|
132
|
+
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should handle pre-aborted signal" time="0.000600691">
|
|
133
133
|
</testcase>
|
|
134
|
-
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should propagate cancellation to running task" time="0.
|
|
134
|
+
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should propagate cancellation to running task" time="0.010898895">
|
|
135
135
|
</testcase>
|
|
136
|
-
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should respect timeout over signal if timeout happens first" time="0.
|
|
136
|
+
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should respect timeout over signal if timeout happens first" time="0.050026453">
|
|
137
137
|
</testcase>
|
|
138
|
-
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should handle case where timeout is set AND signal is already aborted" time="0.
|
|
138
|
+
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should handle case where timeout is set AND signal is already aborted" time="0.000561908">
|
|
139
139
|
</testcase>
|
|
140
|
-
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should cancel workflow via AbortSignal when timeout is also set" time="0.
|
|
140
|
+
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should cancel workflow via AbortSignal when timeout is also set" time="0.010814468">
|
|
141
141
|
</testcase>
|
|
142
|
-
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should fail task if it throws non-abort error during cancellation" time="0.
|
|
142
|
+
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should fail task if it throws non-abort error during cancellation" time="0.01102441">
|
|
143
143
|
</testcase>
|
|
144
|
-
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should cancel task if it rejects with signal.reason" time="0.
|
|
144
|
+
<testcase classname="tests/cancellation.test.ts" name="TaskRunner Cancellation > should cancel task if it rejects with signal.reason" time="0.010899366">
|
|
145
145
|
</testcase>
|
|
146
146
|
</testsuite>
|
|
147
|
-
<testsuite name="tests/concurrency.test.ts" timestamp="2026-01-
|
|
148
|
-
<testcase classname="tests/concurrency.test.ts" name="Concurrency Control > should limit concurrency to 1" time="0.
|
|
147
|
+
<testsuite name="tests/concurrency.test.ts" timestamp="2026-01-19T22:41:01.746Z" hostname="runnervmmtnos" tests="4" failures="0" errors="0" skipped="0" time="0.351252575">
|
|
148
|
+
<testcase classname="tests/concurrency.test.ts" name="Concurrency Control > should limit concurrency to 1" time="0.154717615">
|
|
149
149
|
</testcase>
|
|
150
|
-
<testcase classname="tests/concurrency.test.ts" name="Concurrency Control > should limit concurrency to 2" time="0.
|
|
150
|
+
<testcase classname="tests/concurrency.test.ts" name="Concurrency Control > should limit concurrency to 2" time="0.101212023">
|
|
151
151
|
</testcase>
|
|
152
|
-
<testcase classname="tests/concurrency.test.ts" name="Concurrency Control > should handle unlimited concurrency (default)" time="0.
|
|
152
|
+
<testcase classname="tests/concurrency.test.ts" name="Concurrency Control > should handle unlimited concurrency (default)" time="0.051015727">
|
|
153
153
|
</testcase>
|
|
154
|
-
<testcase classname="tests/concurrency.test.ts" name="Concurrency Control > should run each task exactly once even when queued" time="0.
|
|
154
|
+
<testcase classname="tests/concurrency.test.ts" name="Concurrency Control > should run each task exactly once even when queued" time="0.041602924">
|
|
155
155
|
</testcase>
|
|
156
156
|
</testsuite>
|
|
157
|
-
<testsuite name="tests/conditional.test.ts" timestamp="2026-01-
|
|
158
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should execute task when condition is undefined" time="0.
|
|
157
|
+
<testsuite name="tests/conditional.test.ts" timestamp="2026-01-19T22:41:01.747Z" hostname="runnervmmtnos" tests="11" failures="0" errors="0" skipped="0" time="0.052501754">
|
|
158
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should execute task when condition is undefined" time="0.003418428">
|
|
159
159
|
</testcase>
|
|
160
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should execute task when condition returns true" time="0.
|
|
160
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should execute task when condition returns true" time="0.000437146">
|
|
161
161
|
</testcase>
|
|
162
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should skip task when condition returns false" time="0.
|
|
162
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should skip task when condition returns false" time="0.001717665">
|
|
163
163
|
</testcase>
|
|
164
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle async condition" time="0.
|
|
164
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle async condition" time="0.000311651">
|
|
165
165
|
</testcase>
|
|
166
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should skip dependent tasks if parent is skipped due to condition" time="0.
|
|
166
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should skip dependent tasks if parent is skipped due to condition" time="0.00065388">
|
|
167
167
|
</testcase>
|
|
168
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle condition throwing error" time="0.
|
|
168
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle condition throwing error" time="0.000399375">
|
|
169
169
|
</testcase>
|
|
170
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle condition throwing non-Error object" time="0.
|
|
170
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle condition throwing non-Error object" time="0.000409263">
|
|
171
171
|
</testcase>
|
|
172
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle cancellation during async condition evaluation" time="0.
|
|
172
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle cancellation during async condition evaluation" time="0.02073067">
|
|
173
173
|
</testcase>
|
|
174
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle cancellation between condition and execution (or before execution if no condition)" time="0.
|
|
174
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle cancellation between condition and execution (or before execution if no condition)" time="0.020669911">
|
|
175
175
|
</testcase>
|
|
176
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle immediate cancellation" time="0.
|
|
176
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should handle immediate cancellation" time="0.000488882">
|
|
177
177
|
</testcase>
|
|
178
|
-
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should break loop if stuck (e.g. cycle)" time="0.
|
|
178
|
+
<testcase classname="tests/conditional.test.ts" name="WorkflowExecutor Conditional Execution > should break loop if stuck (e.g. cycle)" time="0.000335446">
|
|
179
179
|
</testcase>
|
|
180
180
|
</testsuite>
|
|
181
|
-
<testsuite name="tests/integration.test.ts" timestamp="2026-01-
|
|
182
|
-
<testcase classname="tests/integration.test.ts" name="TaskRunner Validation Integration > should throw validation error with clear message for duplicate tasks" time="0.
|
|
181
|
+
<testsuite name="tests/integration.test.ts" timestamp="2026-01-19T22:41:01.749Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.008342737">
|
|
182
|
+
<testcase classname="tests/integration.test.ts" name="TaskRunner Validation Integration > should throw validation error with clear message for duplicate tasks" time="0.004924208">
|
|
183
183
|
</testcase>
|
|
184
|
-
<testcase classname="tests/integration.test.ts" name="TaskRunner Validation Integration > should throw validation error with clear message for missing dependencies" time="0.
|
|
184
|
+
<testcase classname="tests/integration.test.ts" name="TaskRunner Validation Integration > should throw validation error with clear message for missing dependencies" time="0.000550167">
|
|
185
185
|
</testcase>
|
|
186
|
-
<testcase classname="tests/integration.test.ts" name="TaskRunner Validation Integration > should throw validation error with clear message for cycles" time="0.
|
|
186
|
+
<testcase classname="tests/integration.test.ts" name="TaskRunner Validation Integration > should throw validation error with clear message for cycles" time="0.000507166">
|
|
187
187
|
</testcase>
|
|
188
188
|
</testsuite>
|
|
189
|
-
<testsuite name="tests/
|
|
190
|
-
<testcase classname="tests/
|
|
189
|
+
<testsuite name="tests/strategies/RetryingExecutionStrategy.test.ts" timestamp="2026-01-19T22:41:01.750Z" hostname="runnervmmtnos" tests="9" failures="0" errors="0" skipped="0" time="0.020499609">
|
|
190
|
+
<testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy > should execute successfully without retry if task succeeds" time="0.006538891">
|
|
191
191
|
</testcase>
|
|
192
|
-
<testcase classname="tests/
|
|
192
|
+
<testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy > should execute successfully without retry if task has no retry config" time="0.000609006">
|
|
193
193
|
</testcase>
|
|
194
|
-
<testcase classname="tests/
|
|
194
|
+
<testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy > should retry task if it fails and has retry config (fixed backoff)" time="0.00214406">
|
|
195
195
|
</testcase>
|
|
196
|
-
<testcase classname="tests/
|
|
196
|
+
<testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy > should fail after max attempts reached" time="0.000838886">
|
|
197
197
|
</testcase>
|
|
198
|
-
|
|
199
|
-
<testsuite name="tests/integration-tests/concurrency-timing.test.ts" timestamp="2026-01-18T23:00:28.551Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.127557348">
|
|
200
|
-
<testcase classname="tests/integration-tests/concurrency-timing.test.ts" name="Integration: Concurrency and Timing > Scenario 6: Mixed duration tasks (verifying parallel efficiency)" time="0.053477318">
|
|
201
|
-
</testcase>
|
|
202
|
-
<testcase classname="tests/integration-tests/concurrency-timing.test.ts" name="Integration: Concurrency and Timing > Scenario 7: Cancellation via AbortSignal" time="0.021674301">
|
|
198
|
+
<testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy > should use exponential backoff" time="0.000937188">
|
|
203
199
|
</testcase>
|
|
204
|
-
<testcase classname="tests/
|
|
200
|
+
<testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy > should handle cancellation during delay" time="0.001664566">
|
|
205
201
|
</testcase>
|
|
206
|
-
|
|
207
|
-
<testsuite name="tests/integration-tests/context-state.test.ts" timestamp="2026-01-18T23:00:28.551Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.019375159">
|
|
208
|
-
<testcase classname="tests/integration-tests/context-state.test.ts" name="Integration: Context and State > Scenario 4: Shared context mutation (A writes, B reads)" time="0.005192887">
|
|
202
|
+
<testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy > should handle cancellation before execution" time="0.000620377">
|
|
209
203
|
</testcase>
|
|
210
|
-
<testcase classname="tests/
|
|
204
|
+
<testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy > should propagate error if sleep throws non-abort error" time="0.003623391">
|
|
211
205
|
</testcase>
|
|
212
|
-
<testcase classname="tests/
|
|
206
|
+
<testcase classname="tests/strategies/RetryingExecutionStrategy.test.ts" name="RetryingExecutionStrategy > should handle cancellation if signal is aborted right before sleep (covering fast-fail in sleep)" time="0.000899358">
|
|
213
207
|
</testcase>
|
|
214
208
|
</testsuite>
|
|
215
|
-
<testsuite name="tests/integration-tests/
|
|
216
|
-
<testcase classname="tests/integration-tests/
|
|
209
|
+
<testsuite name="tests/integration-tests/basic-structure.test.ts" timestamp="2026-01-19T22:41:01.751Z" hostname="runnervmmtnos" tests="4" failures="0" errors="0" skipped="0" time="0.133508673">
|
|
210
|
+
<testcase classname="tests/integration-tests/basic-structure.test.ts" name="Integration: Basic Structure > Scenario 1: Basic linear workflow (A -> B -> C)" time="0.035058533">
|
|
217
211
|
</testcase>
|
|
218
|
-
<testcase classname="tests/integration-tests/
|
|
219
|
-
</testcase>
|
|
220
|
-
</testsuite>
|
|
221
|
-
<testsuite name="tests/integration-tests/error-handling.test.ts" timestamp="2026-01-18T23:00:28.552Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.011760517">
|
|
222
|
-
<testcase classname="tests/integration-tests/error-handling.test.ts" name="Integration: Error Handling > Scenario 3: Task failure and downstream skipping" time="0.004512651">
|
|
212
|
+
<testcase classname="tests/integration-tests/basic-structure.test.ts" name="Integration: Basic Structure > Scenario 2: Branching workflow (A -> [B, C] -> D)" time="0.033075643">
|
|
223
213
|
</testcase>
|
|
224
|
-
<testcase classname="tests/integration-tests/
|
|
214
|
+
<testcase classname="tests/integration-tests/basic-structure.test.ts" name="Integration: Basic Structure > Scenario 12: Complex 'Diamond' dependency graph (A -> B -> D, A -> C -> D)" time="0.041682802">
|
|
225
215
|
</testcase>
|
|
226
|
-
<testcase classname="tests/integration-tests/
|
|
216
|
+
<testcase classname="tests/integration-tests/basic-structure.test.ts" name="Integration: Basic Structure > Scenario 14: Zero-dependency parallel burst" time="0.021443149">
|
|
227
217
|
</testcase>
|
|
228
218
|
</testsuite>
|
|
229
|
-
<testsuite name="tests/integration-tests/
|
|
230
|
-
<testcase classname="tests/integration-tests/
|
|
219
|
+
<testsuite name="tests/integration-tests/concurrency-timing.test.ts" timestamp="2026-01-19T22:41:01.752Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.127226088">
|
|
220
|
+
<testcase classname="tests/integration-tests/concurrency-timing.test.ts" name="Integration: Concurrency and Timing > Scenario 6: Mixed duration tasks (verifying parallel efficiency)" time="0.052992092">
|
|
221
|
+
</testcase>
|
|
222
|
+
<testcase classname="tests/integration-tests/concurrency-timing.test.ts" name="Integration: Concurrency and Timing > Scenario 7: Cancellation via AbortSignal" time="0.021513841">
|
|
223
|
+
</testcase>
|
|
224
|
+
<testcase classname="tests/integration-tests/concurrency-timing.test.ts" name="Integration: Concurrency and Timing > Scenario 8: Global timeout interrupting long tasks" time="0.050830811">
|
|
231
225
|
</testcase>
|
|
232
226
|
</testsuite>
|
|
233
|
-
<testsuite name="tests/
|
|
234
|
-
<testcase classname="tests/
|
|
227
|
+
<testsuite name="tests/integration-tests/context-state.test.ts" timestamp="2026-01-19T22:41:01.753Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.018831541">
|
|
228
|
+
<testcase classname="tests/integration-tests/context-state.test.ts" name="Integration: Context and State > Scenario 4: Shared context mutation (A writes, B reads)" time="0.005043741">
|
|
235
229
|
</testcase>
|
|
236
|
-
<testcase classname="tests/
|
|
230
|
+
<testcase classname="tests/integration-tests/context-state.test.ts" name="Integration: Context and State > Scenario 9: Dynamic context validation" time="0.000610138">
|
|
237
231
|
</testcase>
|
|
238
|
-
<testcase classname="tests/
|
|
232
|
+
<testcase classname="tests/integration-tests/context-state.test.ts" name="Integration: Context and State > Scenario 13: Tasks with side-effects" time="0.010996623">
|
|
239
233
|
</testcase>
|
|
240
|
-
|
|
234
|
+
</testsuite>
|
|
235
|
+
<testsuite name="tests/integration-tests/dryRun.test.ts" timestamp="2026-01-19T22:41:01.753Z" hostname="runnervmmtnos" tests="2" failures="0" errors="0" skipped="0" time="0.008724669">
|
|
236
|
+
<testcase classname="tests/integration-tests/dryRun.test.ts" name="Integration: Dry Run > should execute successfully without side effects" time="0.005779674">
|
|
241
237
|
</testcase>
|
|
242
|
-
<testcase classname="tests/
|
|
238
|
+
<testcase classname="tests/integration-tests/dryRun.test.ts" name="Integration: Dry Run > should respect dependencies (topological order is maintained even in dry run)" time="0.000479695">
|
|
243
239
|
</testcase>
|
|
244
|
-
|
|
240
|
+
</testsuite>
|
|
241
|
+
<testsuite name="tests/integration-tests/error-handling.test.ts" timestamp="2026-01-19T22:41:01.754Z" hostname="runnervmmtnos" tests="3" failures="0" errors="0" skipped="0" time="0.009848758">
|
|
242
|
+
<testcase classname="tests/integration-tests/error-handling.test.ts" name="Integration: Error Handling > Scenario 3: Task failure and downstream skipping" time="0.004516129">
|
|
245
243
|
</testcase>
|
|
246
|
-
<testcase classname="tests/
|
|
244
|
+
<testcase classname="tests/integration-tests/error-handling.test.ts" name="Integration: Error Handling > Scenario 10: Circular dependency detection" time="0.002820813">
|
|
247
245
|
</testcase>
|
|
248
|
-
<testcase classname="tests/
|
|
246
|
+
<testcase classname="tests/integration-tests/error-handling.test.ts" name="Integration: Error Handling > Scenario 11: Missing dependency handling" time="0.000479334">
|
|
249
247
|
</testcase>
|
|
250
|
-
|
|
248
|
+
</testsuite>
|
|
249
|
+
<testsuite name="tests/integration-tests/stress.test.ts" timestamp="2026-01-19T22:41:01.754Z" hostname="runnervmmtnos" tests="1" failures="0" errors="0" skipped="0" time="0.008452812">
|
|
250
|
+
<testcase classname="tests/integration-tests/stress.test.ts" name="Integration: Stress Tests > Scenario 5: Large graph execution (e.g., 20+ nodes)" time="0.00645324">
|
|
251
251
|
</testcase>
|
|
252
252
|
</testsuite>
|
|
253
253
|
</testsuites>
|