@generacy-ai/workflow-engine 0.0.0-preview-20260304013206
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/LICENSE +191 -0
- package/README.md +265 -0
- package/dist/actions/base-action.d.ts +63 -0
- package/dist/actions/base-action.d.ts.map +1 -0
- package/dist/actions/base-action.js +130 -0
- package/dist/actions/base-action.js.map +1 -0
- package/dist/actions/builtin/agent-invoke.d.ts +16 -0
- package/dist/actions/builtin/agent-invoke.d.ts.map +1 -0
- package/dist/actions/builtin/agent-invoke.js +108 -0
- package/dist/actions/builtin/agent-invoke.js.map +1 -0
- package/dist/actions/builtin/humancy-api-handler.d.ts +191 -0
- package/dist/actions/builtin/humancy-api-handler.d.ts.map +1 -0
- package/dist/actions/builtin/humancy-api-handler.js +521 -0
- package/dist/actions/builtin/humancy-api-handler.js.map +1 -0
- package/dist/actions/builtin/humancy-review.d.ts +83 -0
- package/dist/actions/builtin/humancy-review.d.ts.map +1 -0
- package/dist/actions/builtin/humancy-review.js +250 -0
- package/dist/actions/builtin/humancy-review.js.map +1 -0
- package/dist/actions/builtin/pr-create.d.ts +16 -0
- package/dist/actions/builtin/pr-create.d.ts.map +1 -0
- package/dist/actions/builtin/pr-create.js +110 -0
- package/dist/actions/builtin/pr-create.js.map +1 -0
- package/dist/actions/builtin/shell.d.ts +16 -0
- package/dist/actions/builtin/shell.d.ts.map +1 -0
- package/dist/actions/builtin/shell.js +80 -0
- package/dist/actions/builtin/shell.js.map +1 -0
- package/dist/actions/builtin/speckit/index.d.ts +47 -0
- package/dist/actions/builtin/speckit/index.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/index.js +347 -0
- package/dist/actions/builtin/speckit/index.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/feature.d.ts +17 -0
- package/dist/actions/builtin/speckit/lib/feature.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/feature.js +430 -0
- package/dist/actions/builtin/speckit/lib/feature.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/fs.d.ts +62 -0
- package/dist/actions/builtin/speckit/lib/fs.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/fs.js +181 -0
- package/dist/actions/builtin/speckit/lib/fs.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/paths.d.ts +7 -0
- package/dist/actions/builtin/speckit/lib/paths.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/paths.js +161 -0
- package/dist/actions/builtin/speckit/lib/paths.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/prereqs.d.ts +8 -0
- package/dist/actions/builtin/speckit/lib/prereqs.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/prereqs.js +194 -0
- package/dist/actions/builtin/speckit/lib/prereqs.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/stream-batcher.d.ts +14 -0
- package/dist/actions/builtin/speckit/lib/stream-batcher.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/stream-batcher.js +31 -0
- package/dist/actions/builtin/speckit/lib/stream-batcher.js.map +1 -0
- package/dist/actions/builtin/speckit/lib/templates.d.ts +15 -0
- package/dist/actions/builtin/speckit/lib/templates.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/lib/templates.js +176 -0
- package/dist/actions/builtin/speckit/lib/templates.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/check-prereqs.d.ts +11 -0
- package/dist/actions/builtin/speckit/operations/check-prereqs.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/check-prereqs.js +22 -0
- package/dist/actions/builtin/speckit/operations/check-prereqs.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/clarify.d.ts +7 -0
- package/dist/actions/builtin/speckit/operations/clarify.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/clarify.js +302 -0
- package/dist/actions/builtin/speckit/operations/clarify.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/copy-template.d.ts +11 -0
- package/dist/actions/builtin/speckit/operations/copy-template.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/copy-template.js +23 -0
- package/dist/actions/builtin/speckit/operations/copy-template.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/create-feature.d.ts +11 -0
- package/dist/actions/builtin/speckit/operations/create-feature.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/create-feature.js +25 -0
- package/dist/actions/builtin/speckit/operations/create-feature.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/get-paths.d.ts +11 -0
- package/dist/actions/builtin/speckit/operations/get-paths.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/get-paths.js +17 -0
- package/dist/actions/builtin/speckit/operations/get-paths.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/implement.d.ts +7 -0
- package/dist/actions/builtin/speckit/operations/implement.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/implement.js +246 -0
- package/dist/actions/builtin/speckit/operations/implement.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/plan.d.ts +7 -0
- package/dist/actions/builtin/speckit/operations/plan.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/plan.js +253 -0
- package/dist/actions/builtin/speckit/operations/plan.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/specify.d.ts +7 -0
- package/dist/actions/builtin/speckit/operations/specify.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/specify.js +178 -0
- package/dist/actions/builtin/speckit/operations/specify.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/tasks-to-issues.d.ts +42 -0
- package/dist/actions/builtin/speckit/operations/tasks-to-issues.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/tasks-to-issues.js +386 -0
- package/dist/actions/builtin/speckit/operations/tasks-to-issues.js.map +1 -0
- package/dist/actions/builtin/speckit/operations/tasks.d.ts +7 -0
- package/dist/actions/builtin/speckit/operations/tasks.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/operations/tasks.js +234 -0
- package/dist/actions/builtin/speckit/operations/tasks.js.map +1 -0
- package/dist/actions/builtin/speckit/types.d.ts +268 -0
- package/dist/actions/builtin/speckit/types.d.ts.map +1 -0
- package/dist/actions/builtin/speckit/types.js +11 -0
- package/dist/actions/builtin/speckit/types.js.map +1 -0
- package/dist/actions/builtin/verification-check.d.ts +16 -0
- package/dist/actions/builtin/verification-check.d.ts.map +1 -0
- package/dist/actions/builtin/verification-check.js +99 -0
- package/dist/actions/builtin/verification-check.js.map +1 -0
- package/dist/actions/builtin/workspace-prepare.d.ts +16 -0
- package/dist/actions/builtin/workspace-prepare.d.ts.map +1 -0
- package/dist/actions/builtin/workspace-prepare.js +108 -0
- package/dist/actions/builtin/workspace-prepare.js.map +1 -0
- package/dist/actions/cli-utils.d.ts +76 -0
- package/dist/actions/cli-utils.d.ts.map +1 -0
- package/dist/actions/cli-utils.js +278 -0
- package/dist/actions/cli-utils.js.map +1 -0
- package/dist/actions/epic/check-completion.d.ts +14 -0
- package/dist/actions/epic/check-completion.d.ts.map +1 -0
- package/dist/actions/epic/check-completion.js +57 -0
- package/dist/actions/epic/check-completion.js.map +1 -0
- package/dist/actions/epic/close.d.ts +18 -0
- package/dist/actions/epic/close.d.ts.map +1 -0
- package/dist/actions/epic/close.js +76 -0
- package/dist/actions/epic/close.js.map +1 -0
- package/dist/actions/epic/create-pr.d.ts +22 -0
- package/dist/actions/epic/create-pr.d.ts.map +1 -0
- package/dist/actions/epic/create-pr.js +140 -0
- package/dist/actions/epic/create-pr.js.map +1 -0
- package/dist/actions/epic/dispatch-children.d.ts +16 -0
- package/dist/actions/epic/dispatch-children.d.ts.map +1 -0
- package/dist/actions/epic/dispatch-children.js +95 -0
- package/dist/actions/epic/dispatch-children.js.map +1 -0
- package/dist/actions/epic/find-children.d.ts +16 -0
- package/dist/actions/epic/find-children.d.ts.map +1 -0
- package/dist/actions/epic/find-children.js +92 -0
- package/dist/actions/epic/find-children.js.map +1 -0
- package/dist/actions/epic/index.d.ts +20 -0
- package/dist/actions/epic/index.d.ts.map +1 -0
- package/dist/actions/epic/index.js +35 -0
- package/dist/actions/epic/index.js.map +1 -0
- package/dist/actions/epic/post-tasks-summary.d.ts +18 -0
- package/dist/actions/epic/post-tasks-summary.d.ts.map +1 -0
- package/dist/actions/epic/post-tasks-summary.js +123 -0
- package/dist/actions/epic/post-tasks-summary.js.map +1 -0
- package/dist/actions/epic/update-status.d.ts +22 -0
- package/dist/actions/epic/update-status.d.ts.map +1 -0
- package/dist/actions/epic/update-status.js +105 -0
- package/dist/actions/epic/update-status.js.map +1 -0
- package/dist/actions/github/add-comment.d.ts +14 -0
- package/dist/actions/github/add-comment.d.ts.map +1 -0
- package/dist/actions/github/add-comment.js +44 -0
- package/dist/actions/github/add-comment.js.map +1 -0
- package/dist/actions/github/client/gh-cli.d.ts +68 -0
- package/dist/actions/github/client/gh-cli.d.ts.map +1 -0
- package/dist/actions/github/client/gh-cli.js +781 -0
- package/dist/actions/github/client/gh-cli.js.map +1 -0
- package/dist/actions/github/client/index.d.ts +12 -0
- package/dist/actions/github/client/index.d.ts.map +1 -0
- package/dist/actions/github/client/index.js +10 -0
- package/dist/actions/github/client/index.js.map +1 -0
- package/dist/actions/github/client/interface.d.ts +270 -0
- package/dist/actions/github/client/interface.d.ts.map +1 -0
- package/dist/actions/github/client/interface.js +2 -0
- package/dist/actions/github/client/interface.js.map +1 -0
- package/dist/actions/github/commit-and-push.d.ts +19 -0
- package/dist/actions/github/commit-and-push.d.ts.map +1 -0
- package/dist/actions/github/commit-and-push.js +86 -0
- package/dist/actions/github/commit-and-push.js.map +1 -0
- package/dist/actions/github/create-draft-pr.d.ts +18 -0
- package/dist/actions/github/create-draft-pr.d.ts.map +1 -0
- package/dist/actions/github/create-draft-pr.js +76 -0
- package/dist/actions/github/create-draft-pr.js.map +1 -0
- package/dist/actions/github/get-context.d.ts +23 -0
- package/dist/actions/github/get-context.d.ts.map +1 -0
- package/dist/actions/github/get-context.js +109 -0
- package/dist/actions/github/get-context.js.map +1 -0
- package/dist/actions/github/index.d.ts +32 -0
- package/dist/actions/github/index.d.ts.map +1 -0
- package/dist/actions/github/index.js +67 -0
- package/dist/actions/github/index.js.map +1 -0
- package/dist/actions/github/label-definitions.d.ts +19 -0
- package/dist/actions/github/label-definitions.d.ts.map +1 -0
- package/dist/actions/github/label-definitions.js +71 -0
- package/dist/actions/github/label-definitions.js.map +1 -0
- package/dist/actions/github/mark-pr-ready.d.ts +14 -0
- package/dist/actions/github/mark-pr-ready.d.ts.map +1 -0
- package/dist/actions/github/mark-pr-ready.js +43 -0
- package/dist/actions/github/mark-pr-ready.js.map +1 -0
- package/dist/actions/github/merge-from-base.d.ts +15 -0
- package/dist/actions/github/merge-from-base.d.ts.map +1 -0
- package/dist/actions/github/merge-from-base.js +120 -0
- package/dist/actions/github/merge-from-base.js.map +1 -0
- package/dist/actions/github/preflight.d.ts +36 -0
- package/dist/actions/github/preflight.d.ts.map +1 -0
- package/dist/actions/github/preflight.js +292 -0
- package/dist/actions/github/preflight.js.map +1 -0
- package/dist/actions/github/read-pr-feedback.d.ts +14 -0
- package/dist/actions/github/read-pr-feedback.d.ts.map +1 -0
- package/dist/actions/github/read-pr-feedback.js +53 -0
- package/dist/actions/github/read-pr-feedback.js.map +1 -0
- package/dist/actions/github/respond-pr-feedback.d.ts +14 -0
- package/dist/actions/github/respond-pr-feedback.d.ts.map +1 -0
- package/dist/actions/github/respond-pr-feedback.js +58 -0
- package/dist/actions/github/respond-pr-feedback.js.map +1 -0
- package/dist/actions/github/review-changes.d.ts +19 -0
- package/dist/actions/github/review-changes.d.ts.map +1 -0
- package/dist/actions/github/review-changes.js +95 -0
- package/dist/actions/github/review-changes.js.map +1 -0
- package/dist/actions/github/sync-labels.d.ts +14 -0
- package/dist/actions/github/sync-labels.d.ts.map +1 -0
- package/dist/actions/github/sync-labels.js +81 -0
- package/dist/actions/github/sync-labels.js.map +1 -0
- package/dist/actions/github/update-pr.d.ts +14 -0
- package/dist/actions/github/update-pr.d.ts.map +1 -0
- package/dist/actions/github/update-pr.js +63 -0
- package/dist/actions/github/update-pr.js.map +1 -0
- package/dist/actions/index.d.ts +109 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +233 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/workflow/check-gate.d.ts +15 -0
- package/dist/actions/workflow/check-gate.d.ts.map +1 -0
- package/dist/actions/workflow/check-gate.js +75 -0
- package/dist/actions/workflow/check-gate.js.map +1 -0
- package/dist/actions/workflow/index.d.ts +21 -0
- package/dist/actions/workflow/index.d.ts.map +1 -0
- package/dist/actions/workflow/index.js +31 -0
- package/dist/actions/workflow/index.js.map +1 -0
- package/dist/actions/workflow/update-phase.d.ts +15 -0
- package/dist/actions/workflow/update-phase.d.ts.map +1 -0
- package/dist/actions/workflow/update-phase.js +143 -0
- package/dist/actions/workflow/update-phase.js.map +1 -0
- package/dist/actions/workflow/update-stage.d.ts +19 -0
- package/dist/actions/workflow/update-stage.d.ts.map +1 -0
- package/dist/actions/workflow/update-stage.js +137 -0
- package/dist/actions/workflow/update-stage.js.map +1 -0
- package/dist/errors/base-workflow-not-found.d.ts +10 -0
- package/dist/errors/base-workflow-not-found.d.ts.map +1 -0
- package/dist/errors/base-workflow-not-found.js +18 -0
- package/dist/errors/base-workflow-not-found.js.map +1 -0
- package/dist/errors/circular-extends.d.ts +9 -0
- package/dist/errors/circular-extends.d.ts.map +1 -0
- package/dist/errors/circular-extends.js +13 -0
- package/dist/errors/circular-extends.js.map +1 -0
- package/dist/errors/correlation-timeout.d.ts +9 -0
- package/dist/errors/correlation-timeout.d.ts.map +1 -0
- package/dist/errors/correlation-timeout.js +13 -0
- package/dist/errors/correlation-timeout.js.map +1 -0
- package/dist/errors/workflow-override.d.ts +9 -0
- package/dist/errors/workflow-override.d.ts.map +1 -0
- package/dist/errors/workflow-override.js +12 -0
- package/dist/errors/workflow-override.js.map +1 -0
- package/dist/executor/events.d.ts +55 -0
- package/dist/executor/events.d.ts.map +1 -0
- package/dist/executor/events.js +72 -0
- package/dist/executor/events.js.map +1 -0
- package/dist/executor/gate-handler.d.ts +55 -0
- package/dist/executor/gate-handler.d.ts.map +1 -0
- package/dist/executor/gate-handler.js +139 -0
- package/dist/executor/gate-handler.js.map +1 -0
- package/dist/executor/index.d.ts +140 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +681 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolation/context.d.ts +117 -0
- package/dist/interpolation/context.d.ts.map +1 -0
- package/dist/interpolation/context.js +256 -0
- package/dist/interpolation/context.js.map +1 -0
- package/dist/interpolation/index.d.ts +76 -0
- package/dist/interpolation/index.d.ts.map +1 -0
- package/dist/interpolation/index.js +264 -0
- package/dist/interpolation/index.js.map +1 -0
- package/dist/loader/extends.d.ts +48 -0
- package/dist/loader/extends.d.ts.map +1 -0
- package/dist/loader/extends.js +140 -0
- package/dist/loader/extends.js.map +1 -0
- package/dist/loader/index.d.ts +50 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +190 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/schema.d.ts +506 -0
- package/dist/loader/schema.d.ts.map +1 -0
- package/dist/loader/schema.js +63 -0
- package/dist/loader/schema.js.map +1 -0
- package/dist/loader/validator.d.ts +33 -0
- package/dist/loader/validator.d.ts.map +1 -0
- package/dist/loader/validator.js +135 -0
- package/dist/loader/validator.js.map +1 -0
- package/dist/registry/index.d.ts +42 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +77 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/retry/index.d.ts +37 -0
- package/dist/retry/index.d.ts.map +1 -0
- package/dist/retry/index.js +225 -0
- package/dist/retry/index.js.map +1 -0
- package/dist/retry/strategies.d.ts +74 -0
- package/dist/retry/strategies.d.ts.map +1 -0
- package/dist/retry/strategies.js +136 -0
- package/dist/retry/strategies.js.map +1 -0
- package/dist/store/filesystem-store.d.ts +52 -0
- package/dist/store/filesystem-store.d.ts.map +1 -0
- package/dist/store/filesystem-store.js +230 -0
- package/dist/store/filesystem-store.js.map +1 -0
- package/dist/store/index.d.ts +7 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +6 -0
- package/dist/store/index.js.map +1 -0
- package/dist/types/action.d.ts +358 -0
- package/dist/types/action.d.ts.map +1 -0
- package/dist/types/action.js +96 -0
- package/dist/types/action.js.map +1 -0
- package/dist/types/events.d.ts +25 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/execution.d.ts +145 -0
- package/dist/types/execution.d.ts.map +1 -0
- package/dist/types/execution.js +2 -0
- package/dist/types/execution.js.map +1 -0
- package/dist/types/gate.d.ts +98 -0
- package/dist/types/gate.d.ts.map +1 -0
- package/dist/types/gate.js +41 -0
- package/dist/types/gate.js.map +1 -0
- package/dist/types/github.d.ts +706 -0
- package/dist/types/github.d.ts.map +1 -0
- package/dist/types/github.js +6 -0
- package/dist/types/github.js.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/logger.d.ts +60 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/types/logger.js +66 -0
- package/dist/types/logger.js.map +1 -0
- package/dist/types/retry.d.ts +36 -0
- package/dist/types/retry.d.ts.map +1 -0
- package/dist/types/retry.js +6 -0
- package/dist/types/retry.js.map +1 -0
- package/dist/types/store.d.ts +88 -0
- package/dist/types/store.d.ts.map +1 -0
- package/dist/types/store.js +6 -0
- package/dist/types/store.js.map +1 -0
- package/dist/types/workflow.d.ts +105 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +6 -0
- package/dist/types/workflow.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry backoff strategy calculation functions.
|
|
3
|
+
* Provides constant, linear, and exponential backoff algorithms.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Calculate constant backoff delay
|
|
7
|
+
* Returns the same delay for every attempt.
|
|
8
|
+
*
|
|
9
|
+
* @param _attempt Current attempt number (1-indexed)
|
|
10
|
+
* @param baseDelay Base delay in milliseconds
|
|
11
|
+
* @param maxDelay Maximum delay cap in milliseconds
|
|
12
|
+
* @returns Delay in milliseconds
|
|
13
|
+
*/
|
|
14
|
+
export function constantDelay(_attempt, baseDelay, maxDelay) {
|
|
15
|
+
const delay = baseDelay;
|
|
16
|
+
return maxDelay !== undefined ? Math.min(delay, maxDelay) : delay;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Calculate linear backoff delay
|
|
20
|
+
* Delay increases linearly with each attempt: delay = baseDelay * attempt
|
|
21
|
+
*
|
|
22
|
+
* @param attempt Current attempt number (1-indexed)
|
|
23
|
+
* @param baseDelay Base delay in milliseconds
|
|
24
|
+
* @param maxDelay Maximum delay cap in milliseconds
|
|
25
|
+
* @returns Delay in milliseconds
|
|
26
|
+
*/
|
|
27
|
+
export function linearDelay(attempt, baseDelay, maxDelay) {
|
|
28
|
+
const delay = baseDelay * attempt;
|
|
29
|
+
return maxDelay !== undefined ? Math.min(delay, maxDelay) : delay;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculate exponential backoff delay
|
|
33
|
+
* Delay doubles with each attempt: delay = baseDelay * 2^(attempt-1)
|
|
34
|
+
*
|
|
35
|
+
* @param attempt Current attempt number (1-indexed)
|
|
36
|
+
* @param baseDelay Base delay in milliseconds
|
|
37
|
+
* @param maxDelay Maximum delay cap in milliseconds
|
|
38
|
+
* @returns Delay in milliseconds
|
|
39
|
+
*/
|
|
40
|
+
export function exponentialDelay(attempt, baseDelay, maxDelay) {
|
|
41
|
+
const delay = baseDelay * Math.pow(2, attempt - 1);
|
|
42
|
+
return maxDelay !== undefined ? Math.min(delay, maxDelay) : delay;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Add jitter to a delay value
|
|
46
|
+
* Jitter helps prevent thundering herd problems.
|
|
47
|
+
*
|
|
48
|
+
* @param delay Base delay in milliseconds
|
|
49
|
+
* @param jitterFactor Jitter factor (0-1), default 0.1 (10%)
|
|
50
|
+
* @returns Delay with jitter applied
|
|
51
|
+
*/
|
|
52
|
+
export function addJitter(delay, jitterFactor = 0.1) {
|
|
53
|
+
const jitterAmount = delay * jitterFactor;
|
|
54
|
+
const jitter = (Math.random() * 2 - 1) * jitterAmount; // -jitter to +jitter
|
|
55
|
+
return Math.max(0, Math.round(delay + jitter));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Calculate backoff delay based on strategy
|
|
59
|
+
*
|
|
60
|
+
* @param strategy Backoff strategy
|
|
61
|
+
* @param attempt Current attempt number (1-indexed)
|
|
62
|
+
* @param baseDelay Base delay in milliseconds
|
|
63
|
+
* @param maxDelay Maximum delay cap in milliseconds
|
|
64
|
+
* @param jitterFactor Optional jitter factor (0-1)
|
|
65
|
+
* @returns Delay in milliseconds
|
|
66
|
+
*/
|
|
67
|
+
export function calculateBackoffDelay(strategy, attempt, baseDelay, maxDelay, jitterFactor) {
|
|
68
|
+
let delay;
|
|
69
|
+
switch (strategy) {
|
|
70
|
+
case 'constant':
|
|
71
|
+
delay = constantDelay(attempt, baseDelay, maxDelay);
|
|
72
|
+
break;
|
|
73
|
+
case 'linear':
|
|
74
|
+
delay = linearDelay(attempt, baseDelay, maxDelay);
|
|
75
|
+
break;
|
|
76
|
+
case 'exponential':
|
|
77
|
+
delay = exponentialDelay(attempt, baseDelay, maxDelay);
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
delay = baseDelay;
|
|
81
|
+
}
|
|
82
|
+
if (jitterFactor !== undefined && jitterFactor > 0) {
|
|
83
|
+
delay = addJitter(delay, jitterFactor);
|
|
84
|
+
}
|
|
85
|
+
return delay;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parse a duration string to milliseconds
|
|
89
|
+
* Supports: '10s', '5m', '1h', '1000ms', '1000'
|
|
90
|
+
*
|
|
91
|
+
* @param duration Duration string or number
|
|
92
|
+
* @returns Duration in milliseconds
|
|
93
|
+
*/
|
|
94
|
+
export function parseDuration(duration) {
|
|
95
|
+
if (typeof duration === 'number') {
|
|
96
|
+
return duration;
|
|
97
|
+
}
|
|
98
|
+
const match = duration.match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/i);
|
|
99
|
+
if (!match) {
|
|
100
|
+
throw new Error(`Invalid duration format: ${duration}`);
|
|
101
|
+
}
|
|
102
|
+
const [, value, unit] = match;
|
|
103
|
+
const numValue = parseFloat(value);
|
|
104
|
+
switch (unit?.toLowerCase()) {
|
|
105
|
+
case 'h':
|
|
106
|
+
return numValue * 60 * 60 * 1000;
|
|
107
|
+
case 'm':
|
|
108
|
+
return numValue * 60 * 1000;
|
|
109
|
+
case 's':
|
|
110
|
+
return numValue * 1000;
|
|
111
|
+
case 'ms':
|
|
112
|
+
case undefined:
|
|
113
|
+
return numValue;
|
|
114
|
+
default:
|
|
115
|
+
return numValue;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Format milliseconds as a human-readable duration
|
|
120
|
+
*
|
|
121
|
+
* @param ms Duration in milliseconds
|
|
122
|
+
* @returns Formatted duration string
|
|
123
|
+
*/
|
|
124
|
+
export function formatDuration(ms) {
|
|
125
|
+
if (ms < 1000) {
|
|
126
|
+
return `${ms}ms`;
|
|
127
|
+
}
|
|
128
|
+
if (ms < 60000) {
|
|
129
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
130
|
+
}
|
|
131
|
+
if (ms < 3600000) {
|
|
132
|
+
return `${(ms / 60000).toFixed(1)}m`;
|
|
133
|
+
}
|
|
134
|
+
return `${(ms / 3600000).toFixed(1)}h`;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=strategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/retry/strategies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { WorkflowState, WorkflowStore, StateValidationResult } from '../types/store.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validate workflow state schema
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateWorkflowState(data: unknown): StateValidationResult;
|
|
6
|
+
/**
|
|
7
|
+
* Filesystem-based workflow store implementation.
|
|
8
|
+
* Persists workflow state to local filesystem for pause/resume support.
|
|
9
|
+
*/
|
|
10
|
+
export declare class FilesystemWorkflowStore implements WorkflowStore {
|
|
11
|
+
private stateDir;
|
|
12
|
+
private workdir;
|
|
13
|
+
/**
|
|
14
|
+
* Create a new filesystem store
|
|
15
|
+
* @param workdir Working directory (defaults to process.cwd())
|
|
16
|
+
* @param stateDir State directory name (defaults to .generacy)
|
|
17
|
+
*/
|
|
18
|
+
constructor(workdir?: string, stateDir?: string);
|
|
19
|
+
/**
|
|
20
|
+
* Get the full path to the state directory
|
|
21
|
+
*/
|
|
22
|
+
private getStateDirectoryPath;
|
|
23
|
+
/**
|
|
24
|
+
* Get the full path to a state file
|
|
25
|
+
*/
|
|
26
|
+
private getStateFilePath;
|
|
27
|
+
/**
|
|
28
|
+
* Ensure state directory exists
|
|
29
|
+
*/
|
|
30
|
+
private ensureStateDirectory;
|
|
31
|
+
/**
|
|
32
|
+
* Save workflow state to filesystem
|
|
33
|
+
*/
|
|
34
|
+
save(state: WorkflowState): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Load workflow state from filesystem
|
|
37
|
+
*/
|
|
38
|
+
load(workflowId: string): Promise<WorkflowState | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Delete workflow state from filesystem
|
|
41
|
+
*/
|
|
42
|
+
delete(workflowId: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* List all pending workflow states
|
|
45
|
+
*/
|
|
46
|
+
listPending(): Promise<WorkflowState[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Check if a pending state exists for a workflow
|
|
49
|
+
*/
|
|
50
|
+
hasPendingState(workflowId: string): Promise<boolean>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=filesystem-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-store.d.ts","sourceRoot":"","sources":["../../src/store/filesystem-store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAO3B;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,qBAAqB,CAiF1E;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IAC3D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IAExB;;;;OAIG;gBACS,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAK/C;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAI7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;YACW,oBAAoB;IAKlC;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB/C;;OAEG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAuB7D;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/C;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAsC7C;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAI5D"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem-based workflow state persistence.
|
|
3
|
+
* Stores workflow state in .generacy/workflow-state.json files.
|
|
4
|
+
*/
|
|
5
|
+
import { promises as fs } from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
/** Default state file location */
|
|
8
|
+
const DEFAULT_STATE_DIR = '.generacy';
|
|
9
|
+
const STATE_FILE_PREFIX = 'workflow-state-';
|
|
10
|
+
const STATE_FILE_EXT = '.json';
|
|
11
|
+
/**
|
|
12
|
+
* Validate workflow state schema
|
|
13
|
+
*/
|
|
14
|
+
export function validateWorkflowState(data) {
|
|
15
|
+
const errors = [];
|
|
16
|
+
if (!data || typeof data !== 'object') {
|
|
17
|
+
return { valid: false, errors: ['State must be an object'] };
|
|
18
|
+
}
|
|
19
|
+
const state = data;
|
|
20
|
+
// Version check
|
|
21
|
+
if (state.version !== '1.0') {
|
|
22
|
+
errors.push(`Invalid version: expected '1.0', got '${state.version}'`);
|
|
23
|
+
}
|
|
24
|
+
// Required string fields
|
|
25
|
+
const requiredStrings = ['workflowId', 'workflowFile', 'currentPhase', 'currentStep', 'startedAt', 'updatedAt'];
|
|
26
|
+
for (const field of requiredStrings) {
|
|
27
|
+
if (typeof state[field] !== 'string' || state[field].length === 0) {
|
|
28
|
+
errors.push(`${field} must be a non-empty string`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Validate inputs is an object
|
|
32
|
+
if (typeof state.inputs !== 'object' || state.inputs === null) {
|
|
33
|
+
errors.push('inputs must be an object');
|
|
34
|
+
}
|
|
35
|
+
// Validate stepOutputs is an object
|
|
36
|
+
if (typeof state.stepOutputs !== 'object' || state.stepOutputs === null) {
|
|
37
|
+
errors.push('stepOutputs must be an object');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Validate each step output
|
|
41
|
+
const stepOutputs = state.stepOutputs;
|
|
42
|
+
for (const [stepId, output] of Object.entries(stepOutputs)) {
|
|
43
|
+
if (typeof output !== 'object' || output === null) {
|
|
44
|
+
errors.push(`stepOutputs.${stepId} must be an object`);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const stepOutput = output;
|
|
48
|
+
if (typeof stepOutput.raw !== 'string') {
|
|
49
|
+
errors.push(`stepOutputs.${stepId}.raw must be a string`);
|
|
50
|
+
}
|
|
51
|
+
if (typeof stepOutput.exitCode !== 'number') {
|
|
52
|
+
errors.push(`stepOutputs.${stepId}.exitCode must be a number`);
|
|
53
|
+
}
|
|
54
|
+
if (typeof stepOutput.completedAt !== 'string') {
|
|
55
|
+
errors.push(`stepOutputs.${stepId}.completedAt must be a string`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Validate pendingReview if present
|
|
60
|
+
if (state.pendingReview !== undefined) {
|
|
61
|
+
if (typeof state.pendingReview !== 'object' || state.pendingReview === null) {
|
|
62
|
+
errors.push('pendingReview must be an object');
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const review = state.pendingReview;
|
|
66
|
+
if (typeof review.reviewId !== 'string') {
|
|
67
|
+
errors.push('pendingReview.reviewId must be a string');
|
|
68
|
+
}
|
|
69
|
+
if (typeof review.artifact !== 'string') {
|
|
70
|
+
errors.push('pendingReview.artifact must be a string');
|
|
71
|
+
}
|
|
72
|
+
if (typeof review.requestedAt !== 'string') {
|
|
73
|
+
errors.push('pendingReview.requestedAt must be a string');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Validate ISO timestamps
|
|
78
|
+
const timestamps = ['startedAt', 'updatedAt'];
|
|
79
|
+
for (const field of timestamps) {
|
|
80
|
+
if (typeof state[field] === 'string') {
|
|
81
|
+
const date = new Date(state[field]);
|
|
82
|
+
if (isNaN(date.getTime())) {
|
|
83
|
+
errors.push(`${field} must be a valid ISO timestamp`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { valid: errors.length === 0, errors };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Filesystem-based workflow store implementation.
|
|
91
|
+
* Persists workflow state to local filesystem for pause/resume support.
|
|
92
|
+
*/
|
|
93
|
+
export class FilesystemWorkflowStore {
|
|
94
|
+
stateDir;
|
|
95
|
+
workdir;
|
|
96
|
+
/**
|
|
97
|
+
* Create a new filesystem store
|
|
98
|
+
* @param workdir Working directory (defaults to process.cwd())
|
|
99
|
+
* @param stateDir State directory name (defaults to .generacy)
|
|
100
|
+
*/
|
|
101
|
+
constructor(workdir, stateDir) {
|
|
102
|
+
this.workdir = workdir ?? process.cwd();
|
|
103
|
+
this.stateDir = stateDir ?? DEFAULT_STATE_DIR;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get the full path to the state directory
|
|
107
|
+
*/
|
|
108
|
+
getStateDirectoryPath() {
|
|
109
|
+
return path.join(this.workdir, this.stateDir);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get the full path to a state file
|
|
113
|
+
*/
|
|
114
|
+
getStateFilePath(workflowId) {
|
|
115
|
+
// Sanitize workflow ID for use in filename
|
|
116
|
+
const safeId = workflowId.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
117
|
+
return path.join(this.getStateDirectoryPath(), `${STATE_FILE_PREFIX}${safeId}${STATE_FILE_EXT}`);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Ensure state directory exists
|
|
121
|
+
*/
|
|
122
|
+
async ensureStateDirectory() {
|
|
123
|
+
const dirPath = this.getStateDirectoryPath();
|
|
124
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Save workflow state to filesystem
|
|
128
|
+
*/
|
|
129
|
+
async save(state) {
|
|
130
|
+
// Validate state before saving
|
|
131
|
+
const validation = validateWorkflowState(state);
|
|
132
|
+
if (!validation.valid) {
|
|
133
|
+
throw new Error(`Invalid workflow state: ${validation.errors.join(', ')}`);
|
|
134
|
+
}
|
|
135
|
+
// Update timestamp
|
|
136
|
+
const stateToSave = {
|
|
137
|
+
...state,
|
|
138
|
+
updatedAt: new Date().toISOString(),
|
|
139
|
+
};
|
|
140
|
+
await this.ensureStateDirectory();
|
|
141
|
+
const filePath = this.getStateFilePath(state.workflowId);
|
|
142
|
+
// Write to temp file first, then rename for atomic operation
|
|
143
|
+
const tempPath = `${filePath}.tmp`;
|
|
144
|
+
await fs.writeFile(tempPath, JSON.stringify(stateToSave, null, 2), 'utf-8');
|
|
145
|
+
await fs.rename(tempPath, filePath);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Load workflow state from filesystem
|
|
149
|
+
*/
|
|
150
|
+
async load(workflowId) {
|
|
151
|
+
const filePath = this.getStateFilePath(workflowId);
|
|
152
|
+
try {
|
|
153
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
154
|
+
const data = JSON.parse(content);
|
|
155
|
+
// Validate loaded state
|
|
156
|
+
const validation = validateWorkflowState(data);
|
|
157
|
+
if (!validation.valid) {
|
|
158
|
+
console.error(`Invalid workflow state in ${filePath}: ${validation.errors.join(', ')}`);
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
return data;
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
if (error.code === 'ENOENT') {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Delete workflow state from filesystem
|
|
172
|
+
*/
|
|
173
|
+
async delete(workflowId) {
|
|
174
|
+
const filePath = this.getStateFilePath(workflowId);
|
|
175
|
+
try {
|
|
176
|
+
await fs.unlink(filePath);
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
// Ignore if file doesn't exist
|
|
180
|
+
if (error.code !== 'ENOENT') {
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* List all pending workflow states
|
|
187
|
+
*/
|
|
188
|
+
async listPending() {
|
|
189
|
+
const dirPath = this.getStateDirectoryPath();
|
|
190
|
+
const pending = [];
|
|
191
|
+
try {
|
|
192
|
+
const files = await fs.readdir(dirPath);
|
|
193
|
+
for (const file of files) {
|
|
194
|
+
if (file.startsWith(STATE_FILE_PREFIX) && file.endsWith(STATE_FILE_EXT)) {
|
|
195
|
+
const filePath = path.join(dirPath, file);
|
|
196
|
+
try {
|
|
197
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
198
|
+
const data = JSON.parse(content);
|
|
199
|
+
const validation = validateWorkflowState(data);
|
|
200
|
+
if (validation.valid) {
|
|
201
|
+
pending.push(data);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Skip invalid files
|
|
206
|
+
console.warn(`Skipping invalid state file: ${file}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
// Return empty if directory doesn't exist
|
|
213
|
+
if (error.code === 'ENOENT') {
|
|
214
|
+
return [];
|
|
215
|
+
}
|
|
216
|
+
throw error;
|
|
217
|
+
}
|
|
218
|
+
// Sort by updatedAt descending (most recent first)
|
|
219
|
+
pending.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
220
|
+
return pending;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Check if a pending state exists for a workflow
|
|
224
|
+
*/
|
|
225
|
+
async hasPendingState(workflowId) {
|
|
226
|
+
const state = await this.load(workflowId);
|
|
227
|
+
return state !== null && state.pendingReview !== undefined;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=filesystem-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-store.js","sourceRoot":"","sources":["../../src/store/filesystem-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store module exports.
|
|
3
|
+
* Provides workflow state persistence implementations.
|
|
4
|
+
*/
|
|
5
|
+
export { FilesystemWorkflowStore, validateWorkflowState } from './filesystem-store.js';
|
|
6
|
+
export type { WorkflowState, WorkflowStore, PendingReview, StepOutputData, StateValidationResult, } from '../types/store.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACvF,YAAY,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,cAAc,EACd,qBAAqB,GACtB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
|