@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,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow validator using Zod schemas.
|
|
3
|
+
*/
|
|
4
|
+
import { ZodError } from 'zod';
|
|
5
|
+
import { WorkflowDefinitionSchema } from './schema.js';
|
|
6
|
+
/**
|
|
7
|
+
* Validation error with detailed information
|
|
8
|
+
*/
|
|
9
|
+
export class WorkflowValidationError extends Error {
|
|
10
|
+
issues;
|
|
11
|
+
constructor(message, issues) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'WorkflowValidationError';
|
|
14
|
+
this.issues = issues;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validate a workflow definition object
|
|
19
|
+
* @param data Raw workflow data (parsed from YAML)
|
|
20
|
+
* @returns Validated WorkflowDefinition
|
|
21
|
+
* @throws WorkflowValidationError if validation fails
|
|
22
|
+
*/
|
|
23
|
+
export function validateWorkflow(data) {
|
|
24
|
+
try {
|
|
25
|
+
const result = WorkflowDefinitionSchema.parse(data);
|
|
26
|
+
// Transform to our internal type format
|
|
27
|
+
return {
|
|
28
|
+
name: result.name,
|
|
29
|
+
description: result.description,
|
|
30
|
+
version: result.version,
|
|
31
|
+
inputs: result.inputs?.map(input => ({
|
|
32
|
+
name: input.name,
|
|
33
|
+
description: input.description,
|
|
34
|
+
default: input.default,
|
|
35
|
+
required: input.required,
|
|
36
|
+
type: input.type,
|
|
37
|
+
})),
|
|
38
|
+
phases: result.phases.map(phase => ({
|
|
39
|
+
name: phase.name,
|
|
40
|
+
condition: phase.condition,
|
|
41
|
+
steps: phase.steps.map(step => ({
|
|
42
|
+
name: step.name,
|
|
43
|
+
action: step.action ?? 'shell',
|
|
44
|
+
uses: step.uses,
|
|
45
|
+
with: step.with,
|
|
46
|
+
command: step.command,
|
|
47
|
+
script: step.script,
|
|
48
|
+
timeout: step.timeout,
|
|
49
|
+
continueOnError: step.continueOnError,
|
|
50
|
+
condition: step.condition,
|
|
51
|
+
env: step.env,
|
|
52
|
+
retry: step.retry ? {
|
|
53
|
+
maxAttempts: step.retry.maxAttempts,
|
|
54
|
+
delay: typeof step.retry.delay === 'number' ? step.retry.delay : parseDuration(step.retry.delay),
|
|
55
|
+
backoff: step.retry.backoff,
|
|
56
|
+
maxDelay: step.retry.maxDelay
|
|
57
|
+
? (typeof step.retry.maxDelay === 'number' ? step.retry.maxDelay : parseDuration(step.retry.maxDelay))
|
|
58
|
+
: undefined,
|
|
59
|
+
jitter: step.retry.jitter,
|
|
60
|
+
} : undefined,
|
|
61
|
+
})),
|
|
62
|
+
})),
|
|
63
|
+
env: result.env,
|
|
64
|
+
timeout: result.timeout,
|
|
65
|
+
retry: result.retry ? {
|
|
66
|
+
maxAttempts: result.retry.maxAttempts,
|
|
67
|
+
delay: typeof result.retry.delay === 'number' ? result.retry.delay : parseDuration(result.retry.delay),
|
|
68
|
+
backoff: result.retry.backoff,
|
|
69
|
+
maxDelay: result.retry.maxDelay
|
|
70
|
+
? (typeof result.retry.maxDelay === 'number' ? result.retry.maxDelay : parseDuration(result.retry.maxDelay))
|
|
71
|
+
: undefined,
|
|
72
|
+
jitter: result.retry.jitter,
|
|
73
|
+
} : undefined,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (error instanceof ZodError) {
|
|
78
|
+
const issues = error.issues.map(issue => ({
|
|
79
|
+
path: issue.path.join('.'),
|
|
80
|
+
message: issue.message,
|
|
81
|
+
code: issue.code,
|
|
82
|
+
}));
|
|
83
|
+
const message = `Workflow validation failed:\n${issues.map(i => ` - ${i.path}: ${i.message}`).join('\n')}`;
|
|
84
|
+
throw new WorkflowValidationError(message, issues);
|
|
85
|
+
}
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Parse a duration string to milliseconds
|
|
91
|
+
* @param duration Duration string (e.g., '10s', '5m', '1h', '1000ms')
|
|
92
|
+
* @returns Duration in milliseconds
|
|
93
|
+
*/
|
|
94
|
+
function parseDuration(duration) {
|
|
95
|
+
const match = duration.match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/i);
|
|
96
|
+
if (!match) {
|
|
97
|
+
throw new Error(`Invalid duration format: ${duration}`);
|
|
98
|
+
}
|
|
99
|
+
const [, value, unit] = match;
|
|
100
|
+
const numValue = parseFloat(value);
|
|
101
|
+
switch (unit?.toLowerCase()) {
|
|
102
|
+
case 'h':
|
|
103
|
+
return numValue * 60 * 60 * 1000;
|
|
104
|
+
case 'm':
|
|
105
|
+
return numValue * 60 * 1000;
|
|
106
|
+
case 's':
|
|
107
|
+
return numValue * 1000;
|
|
108
|
+
case 'ms':
|
|
109
|
+
case undefined:
|
|
110
|
+
return numValue;
|
|
111
|
+
default:
|
|
112
|
+
return numValue;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if a workflow definition is valid without throwing
|
|
117
|
+
* @param data Raw workflow data
|
|
118
|
+
* @returns Object with valid flag and optional error
|
|
119
|
+
*/
|
|
120
|
+
export function isValidWorkflow(data) {
|
|
121
|
+
try {
|
|
122
|
+
validateWorkflow(data);
|
|
123
|
+
return { valid: true };
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (error instanceof WorkflowValidationError) {
|
|
127
|
+
return { valid: false, error };
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
valid: false,
|
|
131
|
+
error: new WorkflowValidationError(error instanceof Error ? error.message : 'Unknown validation error', []),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/loader/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register a workflow by name.
|
|
3
|
+
* Validates that the file exists at registration time.
|
|
4
|
+
* Logs a warning if overwriting an existing registration.
|
|
5
|
+
*
|
|
6
|
+
* @param name The workflow name (e.g., 'speckit-feature')
|
|
7
|
+
* @param filePath The absolute path to the workflow YAML file
|
|
8
|
+
* @throws Error if filePath does not exist on disk
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerWorkflow(name: string, filePath: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Register multiple workflows at once.
|
|
13
|
+
* Each entry is validated and registered individually.
|
|
14
|
+
*
|
|
15
|
+
* @param workflows A Map or Record of workflow name → file path
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerWorkflows(workflows: Map<string, string> | Record<string, string>): void;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a workflow name to a file path from the registry.
|
|
20
|
+
*
|
|
21
|
+
* @param name The workflow name to look up
|
|
22
|
+
* @returns The absolute file path, or undefined if not registered
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveRegisteredWorkflow(name: string): string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Check if a workflow is registered.
|
|
27
|
+
*
|
|
28
|
+
* @param name The workflow name to check
|
|
29
|
+
* @returns true if a workflow is registered under this name
|
|
30
|
+
*/
|
|
31
|
+
export declare function hasRegisteredWorkflow(name: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Get all registered workflow names.
|
|
34
|
+
*
|
|
35
|
+
* @returns Array of registered workflow names
|
|
36
|
+
*/
|
|
37
|
+
export declare function getRegisteredWorkflowNames(): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Clear the workflow registry. Useful for testing.
|
|
40
|
+
*/
|
|
41
|
+
export declare function clearWorkflowRegistry(): void;
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAaA;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAcrE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAQ/F;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow registry — global singleton for plugin-provided workflow discovery.
|
|
3
|
+
* Provides centralized registration and lookup of workflow file paths by name.
|
|
4
|
+
* Follows the same pattern as the actionRegistry in actions/index.ts.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
/**
|
|
9
|
+
* Registry of workflow names to absolute file paths.
|
|
10
|
+
*/
|
|
11
|
+
const workflowRegistry = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* Register a workflow by name.
|
|
14
|
+
* Validates that the file exists at registration time.
|
|
15
|
+
* Logs a warning if overwriting an existing registration.
|
|
16
|
+
*
|
|
17
|
+
* @param name The workflow name (e.g., 'speckit-feature')
|
|
18
|
+
* @param filePath The absolute path to the workflow YAML file
|
|
19
|
+
* @throws Error if filePath does not exist on disk
|
|
20
|
+
*/
|
|
21
|
+
export function registerWorkflow(name, filePath) {
|
|
22
|
+
const absolutePath = resolve(filePath);
|
|
23
|
+
if (!existsSync(absolutePath)) {
|
|
24
|
+
throw new Error(`Cannot register workflow "${name}": file not found at ${absolutePath}`);
|
|
25
|
+
}
|
|
26
|
+
if (workflowRegistry.has(name)) {
|
|
27
|
+
console.warn(`Overwriting existing workflow registration: ${name}`);
|
|
28
|
+
}
|
|
29
|
+
workflowRegistry.set(name, absolutePath);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Register multiple workflows at once.
|
|
33
|
+
* Each entry is validated and registered individually.
|
|
34
|
+
*
|
|
35
|
+
* @param workflows A Map or Record of workflow name → file path
|
|
36
|
+
*/
|
|
37
|
+
export function registerWorkflows(workflows) {
|
|
38
|
+
const entries = workflows instanceof Map
|
|
39
|
+
? workflows.entries()
|
|
40
|
+
: Object.entries(workflows);
|
|
41
|
+
for (const [name, filePath] of entries) {
|
|
42
|
+
registerWorkflow(name, filePath);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve a workflow name to a file path from the registry.
|
|
47
|
+
*
|
|
48
|
+
* @param name The workflow name to look up
|
|
49
|
+
* @returns The absolute file path, or undefined if not registered
|
|
50
|
+
*/
|
|
51
|
+
export function resolveRegisteredWorkflow(name) {
|
|
52
|
+
return workflowRegistry.get(name);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if a workflow is registered.
|
|
56
|
+
*
|
|
57
|
+
* @param name The workflow name to check
|
|
58
|
+
* @returns true if a workflow is registered under this name
|
|
59
|
+
*/
|
|
60
|
+
export function hasRegisteredWorkflow(name) {
|
|
61
|
+
return workflowRegistry.has(name);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get all registered workflow names.
|
|
65
|
+
*
|
|
66
|
+
* @returns Array of registered workflow names
|
|
67
|
+
*/
|
|
68
|
+
export function getRegisteredWorkflowNames() {
|
|
69
|
+
return Array.from(workflowRegistry.keys());
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Clear the workflow registry. Useful for testing.
|
|
73
|
+
*/
|
|
74
|
+
export function clearWorkflowRegistry() {
|
|
75
|
+
workflowRegistry.clear();
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAAgB;IAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,wBAAwB,YAAY,EAAE,CACxE,CAAC;IACJ,CAAC;IAED,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,+CAA+C,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAuD;IACvF,MAAM,OAAO,GAAG,SAAS,YAAY,GAAG;QACtC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;QACrB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;QACvC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,gBAAgB,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry manager for workflow step execution.
|
|
3
|
+
* Wraps action execution with configurable retry and timeout behavior.
|
|
4
|
+
*/
|
|
5
|
+
import type { RetryConfig, StepDefinition } from '../types/workflow.js';
|
|
6
|
+
import type { ActionHandler, ActionContext, ActionResult } from '../types/action.js';
|
|
7
|
+
import type { RetryState, RetryResult } from '../types/retry.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parse retry configuration from step or workflow defaults
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseRetryConfig(step: StepDefinition): RetryConfig;
|
|
12
|
+
/**
|
|
13
|
+
* Retry manager class
|
|
14
|
+
* Wraps action execution with configurable retry behavior
|
|
15
|
+
*/
|
|
16
|
+
export declare class RetryManager {
|
|
17
|
+
private config;
|
|
18
|
+
private onRetry?;
|
|
19
|
+
constructor(config?: Partial<RetryConfig>, onRetry?: (state: RetryState, error: Error) => void);
|
|
20
|
+
/**
|
|
21
|
+
* Execute an action with retry logic
|
|
22
|
+
*/
|
|
23
|
+
executeWithRetry(handler: ActionHandler, step: StepDefinition, context: ActionContext): Promise<RetryResult<ActionResult>>;
|
|
24
|
+
/**
|
|
25
|
+
* Create a retry manager from step configuration
|
|
26
|
+
*/
|
|
27
|
+
static fromStep(step: StepDefinition, onRetry?: (state: RetryState, error: Error) => void): RetryManager;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a timeout wrapper for an async operation.
|
|
31
|
+
* When the timeout fires, the optional onTimeout callback is invoked so the
|
|
32
|
+
* caller can abort the underlying operation (e.g. signal an AbortController).
|
|
33
|
+
*/
|
|
34
|
+
export declare function withTimeout<T>(operation: Promise<T>, timeoutMs: number, signal?: AbortSignal, onTimeout?: () => void): Promise<T>;
|
|
35
|
+
export type { RetryState, RetryResult } from '../types/retry.js';
|
|
36
|
+
export { calculateBackoffDelay, constantDelay, linearDelay, exponentialDelay, addJitter, parseDuration, formatDuration, type BackoffStrategy, } from './strategies.js';
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/retry/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAmBjE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,WAAW,CAoBlE;AAwBD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAC,CAA4C;gBAG1D,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI;IAMrD;;OAEG;IACG,gBAAgB,CACpB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAyHrC;;OAEG;IACH,MAAM,CAAC,QAAQ,CACb,IAAI,EAAE,cAAc,EACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAClD,YAAY;CAGhB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,EACpB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,OAAO,CAAC,CAAC,CAAC,CAoDZ;AAGD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGjE,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,cAAc,EACd,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { calculateBackoffDelay, parseDuration, formatDuration, } from './strategies.js';
|
|
2
|
+
/**
|
|
3
|
+
* Default retry configuration
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
6
|
+
maxAttempts: 1,
|
|
7
|
+
delay: 1000,
|
|
8
|
+
backoff: 'exponential',
|
|
9
|
+
maxDelay: 60000,
|
|
10
|
+
jitter: 0.1,
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Parse retry configuration from step or workflow defaults
|
|
14
|
+
*/
|
|
15
|
+
export function parseRetryConfig(step) {
|
|
16
|
+
if (!step.retry) {
|
|
17
|
+
return DEFAULT_RETRY_CONFIG;
|
|
18
|
+
}
|
|
19
|
+
const config = step.retry;
|
|
20
|
+
return {
|
|
21
|
+
maxAttempts: config.maxAttempts ?? DEFAULT_RETRY_CONFIG.maxAttempts,
|
|
22
|
+
delay: typeof config.delay === 'number'
|
|
23
|
+
? config.delay
|
|
24
|
+
: parseDuration(String(config.delay)),
|
|
25
|
+
backoff: config.backoff ?? DEFAULT_RETRY_CONFIG.backoff,
|
|
26
|
+
maxDelay: config.maxDelay !== undefined
|
|
27
|
+
? (typeof config.maxDelay === 'number'
|
|
28
|
+
? config.maxDelay
|
|
29
|
+
: parseDuration(String(config.maxDelay)))
|
|
30
|
+
: DEFAULT_RETRY_CONFIG.maxDelay,
|
|
31
|
+
jitter: config.jitter ?? DEFAULT_RETRY_CONFIG.jitter,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Sleep for a specified duration
|
|
36
|
+
*/
|
|
37
|
+
function sleep(ms, signal) {
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
if (signal?.aborted) {
|
|
40
|
+
reject(new Error('Sleep aborted'));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const timeoutId = setTimeout(resolve, ms);
|
|
44
|
+
if (signal) {
|
|
45
|
+
const abortHandler = () => {
|
|
46
|
+
clearTimeout(timeoutId);
|
|
47
|
+
reject(new Error('Sleep aborted'));
|
|
48
|
+
};
|
|
49
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Retry manager class
|
|
55
|
+
* Wraps action execution with configurable retry behavior
|
|
56
|
+
*/
|
|
57
|
+
export class RetryManager {
|
|
58
|
+
config;
|
|
59
|
+
onRetry;
|
|
60
|
+
constructor(config, onRetry) {
|
|
61
|
+
this.config = { ...DEFAULT_RETRY_CONFIG, ...config };
|
|
62
|
+
this.onRetry = onRetry;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Execute an action with retry logic
|
|
66
|
+
*/
|
|
67
|
+
async executeWithRetry(handler, step, context) {
|
|
68
|
+
const stepConfig = parseRetryConfig(step);
|
|
69
|
+
const config = { ...this.config, ...stepConfig };
|
|
70
|
+
const errors = [];
|
|
71
|
+
const startTime = Date.now();
|
|
72
|
+
let attempt = 1;
|
|
73
|
+
let lastResult;
|
|
74
|
+
while (attempt <= config.maxAttempts) {
|
|
75
|
+
const state = {
|
|
76
|
+
attempt,
|
|
77
|
+
previousErrors: [...errors],
|
|
78
|
+
canRetry: attempt < config.maxAttempts,
|
|
79
|
+
nextDelay: attempt < config.maxAttempts
|
|
80
|
+
? calculateBackoffDelay(config.backoff, attempt, config.delay, config.maxDelay, config.jitter)
|
|
81
|
+
: undefined,
|
|
82
|
+
};
|
|
83
|
+
try {
|
|
84
|
+
// Check for cancellation before each attempt
|
|
85
|
+
if (context.signal.aborted) {
|
|
86
|
+
throw new Error('Execution cancelled');
|
|
87
|
+
}
|
|
88
|
+
// Log attempt
|
|
89
|
+
if (attempt > 1) {
|
|
90
|
+
context.logger.info(`Retry attempt ${attempt}/${config.maxAttempts} for step "${step.name}"`);
|
|
91
|
+
}
|
|
92
|
+
// Execute the action
|
|
93
|
+
lastResult = await handler.execute(step, context);
|
|
94
|
+
// Check if successful
|
|
95
|
+
if (lastResult.success) {
|
|
96
|
+
return {
|
|
97
|
+
result: lastResult,
|
|
98
|
+
attempts: attempt,
|
|
99
|
+
totalDuration: Date.now() - startTime,
|
|
100
|
+
errors,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Action failed but didn't throw
|
|
104
|
+
const error = new Error(lastResult.error ?? 'Action failed');
|
|
105
|
+
errors.push(error);
|
|
106
|
+
// Check if we can retry
|
|
107
|
+
if (state.canRetry) {
|
|
108
|
+
// Call retry callback
|
|
109
|
+
if (this.onRetry) {
|
|
110
|
+
this.onRetry(state, error);
|
|
111
|
+
}
|
|
112
|
+
// Wait before retrying
|
|
113
|
+
context.logger.info(`Waiting ${formatDuration(state.nextDelay)} before retry...`);
|
|
114
|
+
await sleep(state.nextDelay, context.signal);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
119
|
+
errors.push(err);
|
|
120
|
+
// Check for cancellation
|
|
121
|
+
if (err.message.includes('cancelled') || err.message.includes('aborted')) {
|
|
122
|
+
// Don't retry on cancellation
|
|
123
|
+
return {
|
|
124
|
+
result: lastResult ?? {
|
|
125
|
+
success: false,
|
|
126
|
+
output: null,
|
|
127
|
+
error: err.message,
|
|
128
|
+
duration: Date.now() - startTime,
|
|
129
|
+
},
|
|
130
|
+
attempts: attempt,
|
|
131
|
+
totalDuration: Date.now() - startTime,
|
|
132
|
+
errors,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Check if we can retry
|
|
136
|
+
if (state.canRetry) {
|
|
137
|
+
// Call retry callback
|
|
138
|
+
if (this.onRetry) {
|
|
139
|
+
this.onRetry(state, err);
|
|
140
|
+
}
|
|
141
|
+
// Wait before retrying
|
|
142
|
+
context.logger.info(`Waiting ${formatDuration(state.nextDelay)} before retry...`);
|
|
143
|
+
await sleep(state.nextDelay, context.signal);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
attempt++;
|
|
147
|
+
}
|
|
148
|
+
// All retries exhausted
|
|
149
|
+
const finalError = errors[errors.length - 1];
|
|
150
|
+
return {
|
|
151
|
+
result: lastResult ?? {
|
|
152
|
+
success: false,
|
|
153
|
+
output: null,
|
|
154
|
+
error: finalError?.message ?? 'Max retries exceeded',
|
|
155
|
+
duration: Date.now() - startTime,
|
|
156
|
+
},
|
|
157
|
+
attempts: attempt - 1,
|
|
158
|
+
totalDuration: Date.now() - startTime,
|
|
159
|
+
errors,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create a retry manager from step configuration
|
|
164
|
+
*/
|
|
165
|
+
static fromStep(step, onRetry) {
|
|
166
|
+
return new RetryManager(parseRetryConfig(step), onRetry);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Create a timeout wrapper for an async operation.
|
|
171
|
+
* When the timeout fires, the optional onTimeout callback is invoked so the
|
|
172
|
+
* caller can abort the underlying operation (e.g. signal an AbortController).
|
|
173
|
+
*/
|
|
174
|
+
export function withTimeout(operation, timeoutMs, signal, onTimeout) {
|
|
175
|
+
return new Promise((resolve, reject) => {
|
|
176
|
+
// Check if already aborted
|
|
177
|
+
if (signal?.aborted) {
|
|
178
|
+
reject(new Error('Operation aborted'));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
let settled = false;
|
|
182
|
+
const timeoutId = setTimeout(() => {
|
|
183
|
+
if (!settled) {
|
|
184
|
+
settled = true;
|
|
185
|
+
onTimeout?.(); // let caller abort the underlying operation
|
|
186
|
+
reject(new Error(`Operation timed out after ${formatDuration(timeoutMs)}`));
|
|
187
|
+
}
|
|
188
|
+
}, timeoutMs);
|
|
189
|
+
// Handle abort signal
|
|
190
|
+
const abortHandler = () => {
|
|
191
|
+
if (!settled) {
|
|
192
|
+
settled = true;
|
|
193
|
+
clearTimeout(timeoutId);
|
|
194
|
+
reject(new Error('Operation aborted'));
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
if (signal) {
|
|
198
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
199
|
+
}
|
|
200
|
+
operation
|
|
201
|
+
.then((result) => {
|
|
202
|
+
if (!settled) {
|
|
203
|
+
settled = true;
|
|
204
|
+
clearTimeout(timeoutId);
|
|
205
|
+
if (signal) {
|
|
206
|
+
signal.removeEventListener('abort', abortHandler);
|
|
207
|
+
}
|
|
208
|
+
resolve(result);
|
|
209
|
+
}
|
|
210
|
+
})
|
|
211
|
+
.catch((error) => {
|
|
212
|
+
if (!settled) {
|
|
213
|
+
settled = true;
|
|
214
|
+
clearTimeout(timeoutId);
|
|
215
|
+
if (signal) {
|
|
216
|
+
signal.removeEventListener('abort', abortHandler);
|
|
217
|
+
}
|
|
218
|
+
reject(error);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
// Re-export strategies
|
|
224
|
+
export { calculateBackoffDelay, constantDelay, linearDelay, exponentialDelay, addJitter, parseDuration, formatDuration, } from './strategies.js';
|
|
225
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/retry/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry backoff strategy calculation functions.
|
|
3
|
+
* Provides constant, linear, and exponential backoff algorithms.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Backoff strategy type
|
|
7
|
+
*/
|
|
8
|
+
export type BackoffStrategy = 'constant' | 'linear' | 'exponential';
|
|
9
|
+
/**
|
|
10
|
+
* Calculate constant backoff delay
|
|
11
|
+
* Returns the same delay for every attempt.
|
|
12
|
+
*
|
|
13
|
+
* @param _attempt Current attempt number (1-indexed)
|
|
14
|
+
* @param baseDelay Base delay in milliseconds
|
|
15
|
+
* @param maxDelay Maximum delay cap in milliseconds
|
|
16
|
+
* @returns Delay in milliseconds
|
|
17
|
+
*/
|
|
18
|
+
export declare function constantDelay(_attempt: number, baseDelay: number, maxDelay?: number): number;
|
|
19
|
+
/**
|
|
20
|
+
* Calculate linear backoff delay
|
|
21
|
+
* Delay increases linearly with each attempt: delay = baseDelay * attempt
|
|
22
|
+
*
|
|
23
|
+
* @param attempt Current attempt number (1-indexed)
|
|
24
|
+
* @param baseDelay Base delay in milliseconds
|
|
25
|
+
* @param maxDelay Maximum delay cap in milliseconds
|
|
26
|
+
* @returns Delay in milliseconds
|
|
27
|
+
*/
|
|
28
|
+
export declare function linearDelay(attempt: number, baseDelay: number, maxDelay?: number): number;
|
|
29
|
+
/**
|
|
30
|
+
* Calculate exponential backoff delay
|
|
31
|
+
* Delay doubles with each attempt: delay = baseDelay * 2^(attempt-1)
|
|
32
|
+
*
|
|
33
|
+
* @param attempt Current attempt number (1-indexed)
|
|
34
|
+
* @param baseDelay Base delay in milliseconds
|
|
35
|
+
* @param maxDelay Maximum delay cap in milliseconds
|
|
36
|
+
* @returns Delay in milliseconds
|
|
37
|
+
*/
|
|
38
|
+
export declare function exponentialDelay(attempt: number, baseDelay: number, maxDelay?: number): number;
|
|
39
|
+
/**
|
|
40
|
+
* Add jitter to a delay value
|
|
41
|
+
* Jitter helps prevent thundering herd problems.
|
|
42
|
+
*
|
|
43
|
+
* @param delay Base delay in milliseconds
|
|
44
|
+
* @param jitterFactor Jitter factor (0-1), default 0.1 (10%)
|
|
45
|
+
* @returns Delay with jitter applied
|
|
46
|
+
*/
|
|
47
|
+
export declare function addJitter(delay: number, jitterFactor?: number): number;
|
|
48
|
+
/**
|
|
49
|
+
* Calculate backoff delay based on strategy
|
|
50
|
+
*
|
|
51
|
+
* @param strategy Backoff strategy
|
|
52
|
+
* @param attempt Current attempt number (1-indexed)
|
|
53
|
+
* @param baseDelay Base delay in milliseconds
|
|
54
|
+
* @param maxDelay Maximum delay cap in milliseconds
|
|
55
|
+
* @param jitterFactor Optional jitter factor (0-1)
|
|
56
|
+
* @returns Delay in milliseconds
|
|
57
|
+
*/
|
|
58
|
+
export declare function calculateBackoffDelay(strategy: BackoffStrategy, attempt: number, baseDelay: number, maxDelay?: number, jitterFactor?: number): number;
|
|
59
|
+
/**
|
|
60
|
+
* Parse a duration string to milliseconds
|
|
61
|
+
* Supports: '10s', '5m', '1h', '1000ms', '1000'
|
|
62
|
+
*
|
|
63
|
+
* @param duration Duration string or number
|
|
64
|
+
* @returns Duration in milliseconds
|
|
65
|
+
*/
|
|
66
|
+
export declare function parseDuration(duration: string | number): number;
|
|
67
|
+
/**
|
|
68
|
+
* Format milliseconds as a human-readable duration
|
|
69
|
+
*
|
|
70
|
+
* @param ms Duration in milliseconds
|
|
71
|
+
* @returns Formatted duration string
|
|
72
|
+
*/
|
|
73
|
+
export declare function formatDuration(ms: number): string;
|
|
74
|
+
//# sourceMappingURL=strategies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategies.d.ts","sourceRoot":"","sources":["../../src/retry/strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEpE;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAGR;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAGR;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAGR;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,SAAM,GAAG,MAAM,CAInE;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAsBR;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CA0B/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAWjD"}
|