@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,521 @@
|
|
|
1
|
+
import { CorrelationTimeoutError } from '../../errors/correlation-timeout.js';
|
|
2
|
+
/** Default no-op logger used when none is provided. */
|
|
3
|
+
const noopLogger = {
|
|
4
|
+
info() { },
|
|
5
|
+
warn() { },
|
|
6
|
+
error() { },
|
|
7
|
+
debug() { },
|
|
8
|
+
};
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Mapping helpers
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/** Buffer added to the caller's timeout for the expiresAt field (5 minutes). */
|
|
13
|
+
const EXPIRY_BUFFER_MS = 5 * 60 * 1000;
|
|
14
|
+
/**
|
|
15
|
+
* Maps workflow-engine urgency to Humancy Cloud API urgency.
|
|
16
|
+
*/
|
|
17
|
+
function mapUrgency(urgency) {
|
|
18
|
+
switch (urgency) {
|
|
19
|
+
case 'low':
|
|
20
|
+
case 'normal':
|
|
21
|
+
return 'when_available';
|
|
22
|
+
case 'blocking_soon':
|
|
23
|
+
return 'blocking_soon';
|
|
24
|
+
case 'blocking_now':
|
|
25
|
+
return 'blocking_now';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Handler
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/**
|
|
32
|
+
* Concrete HumanDecisionHandler that communicates with the Humancy
|
|
33
|
+
* Cloud API's decision endpoints to request and await human decisions.
|
|
34
|
+
*/
|
|
35
|
+
export class HumancyApiDecisionHandler {
|
|
36
|
+
config;
|
|
37
|
+
logger;
|
|
38
|
+
constructor(config, logger) {
|
|
39
|
+
this.config = {
|
|
40
|
+
apiUrl: config.apiUrl.replace(/\/+$/, ''), // strip trailing slashes
|
|
41
|
+
agentId: config.agentId,
|
|
42
|
+
projectId: config.projectId,
|
|
43
|
+
authToken: config.authToken,
|
|
44
|
+
fallbackToSimulation: config.fallbackToSimulation ?? true,
|
|
45
|
+
sseReconnectDelay: config.sseReconnectDelay ?? 1000,
|
|
46
|
+
maxReconnectAttempts: config.maxReconnectAttempts ?? 10,
|
|
47
|
+
};
|
|
48
|
+
this.logger = logger ?? noopLogger;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Maps a workflow-engine ReviewDecisionRequest to the Humancy Cloud API's
|
|
52
|
+
* POST /decisions payload (CreateDecisionInput shape).
|
|
53
|
+
*
|
|
54
|
+
* Field mapping:
|
|
55
|
+
* title → question
|
|
56
|
+
* description → context (with workflow/step metadata)
|
|
57
|
+
* artifact → appended to context
|
|
58
|
+
* options → options (requiresComment → description hint)
|
|
59
|
+
* urgency → urgency (low/normal → when_available)
|
|
60
|
+
* type → type ('review')
|
|
61
|
+
* config.agentId → agentId
|
|
62
|
+
* config.projectId → projectId
|
|
63
|
+
* timeout+5min → expiresAt
|
|
64
|
+
*/
|
|
65
|
+
mapRequestToPayload(request, timeout) {
|
|
66
|
+
// Build context string from description, artifact, and workflow metadata
|
|
67
|
+
const contextParts = [];
|
|
68
|
+
if (request.description) {
|
|
69
|
+
contextParts.push(request.description);
|
|
70
|
+
}
|
|
71
|
+
if (request.artifact) {
|
|
72
|
+
contextParts.push(`\n---\nArtifact:\n${request.artifact}`);
|
|
73
|
+
}
|
|
74
|
+
// Include workflow/step IDs as metadata for traceability
|
|
75
|
+
contextParts.push(`\n[workflow=${request.workflowId}, step=${request.stepId}]`);
|
|
76
|
+
const context = contextParts.join('');
|
|
77
|
+
const options = request.options.map((opt) => {
|
|
78
|
+
const mapped = {
|
|
79
|
+
id: opt.id,
|
|
80
|
+
label: opt.label,
|
|
81
|
+
};
|
|
82
|
+
if (opt.requiresComment) {
|
|
83
|
+
mapped.description = 'Comment required';
|
|
84
|
+
}
|
|
85
|
+
return mapped;
|
|
86
|
+
});
|
|
87
|
+
const payload = {
|
|
88
|
+
agentId: this.config.agentId,
|
|
89
|
+
type: 'review',
|
|
90
|
+
urgency: mapUrgency(request.urgency),
|
|
91
|
+
question: request.title,
|
|
92
|
+
context,
|
|
93
|
+
options: options.length > 0 ? options : undefined,
|
|
94
|
+
expiresAt: new Date(Date.now() + timeout + EXPIRY_BUFFER_MS).toISOString(),
|
|
95
|
+
};
|
|
96
|
+
if (this.config.projectId) {
|
|
97
|
+
payload.projectId = this.config.projectId;
|
|
98
|
+
}
|
|
99
|
+
return payload;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Maps a Humancy Cloud API decision:resolved event response back to the
|
|
103
|
+
* workflow engine's ReviewDecisionResponse format.
|
|
104
|
+
*
|
|
105
|
+
* Response mapping:
|
|
106
|
+
* selectedOptionId === first option → approved: true
|
|
107
|
+
* selectedOptionId !== first option → approved: false, decision: selectedOptionId
|
|
108
|
+
* customResponse → input (free-text response)
|
|
109
|
+
* respondedAt → respondedAt
|
|
110
|
+
*/
|
|
111
|
+
mapResolvedEvent(response, request) {
|
|
112
|
+
const result = {
|
|
113
|
+
respondedBy: 'human',
|
|
114
|
+
respondedAt: response.respondedAt,
|
|
115
|
+
};
|
|
116
|
+
if (response.customResponse) {
|
|
117
|
+
result.input = response.customResponse;
|
|
118
|
+
}
|
|
119
|
+
const firstOptionId = request.options[0]?.id;
|
|
120
|
+
if (response.selectedOptionId) {
|
|
121
|
+
result.decision = response.selectedOptionId;
|
|
122
|
+
result.approved = response.selectedOptionId === firstOptionId;
|
|
123
|
+
}
|
|
124
|
+
else if (response.customResponse) {
|
|
125
|
+
// Free-text response without option selection — treat as custom input
|
|
126
|
+
result.approved = false;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// No option selected and no custom response — treat as rejection
|
|
130
|
+
result.approved = false;
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Async generator that parses SSE text protocol from a fetch Response body.
|
|
136
|
+
*
|
|
137
|
+
* Reads the streaming body via `getReader()`, splits on newlines, and
|
|
138
|
+
* interprets SSE fields:
|
|
139
|
+
* - `event: <type>` — sets the event type
|
|
140
|
+
* - `data: <payload>` — appends to data buffer (multi-line joined with \n)
|
|
141
|
+
* - `id: <value>` — sets the event ID and updates lastEventId
|
|
142
|
+
* - `:<comment>` — ignored (used for heartbeats)
|
|
143
|
+
* - empty line — dispatches the accumulated event
|
|
144
|
+
*
|
|
145
|
+
* Tracks `lastEventId` on the instance for reconnection support.
|
|
146
|
+
*/
|
|
147
|
+
lastEventId = '';
|
|
148
|
+
async *parseSSEStream(body) {
|
|
149
|
+
const reader = body.getReader();
|
|
150
|
+
const decoder = new TextDecoder();
|
|
151
|
+
// Accumulator for partial lines split across chunks
|
|
152
|
+
let buffer = '';
|
|
153
|
+
// Current event fields being accumulated
|
|
154
|
+
let eventType = '';
|
|
155
|
+
let dataLines = [];
|
|
156
|
+
let eventId = '';
|
|
157
|
+
try {
|
|
158
|
+
for (;;) {
|
|
159
|
+
const { done, value } = await reader.read();
|
|
160
|
+
if (done) {
|
|
161
|
+
// Stream ended — if there's a pending event with data, dispatch it
|
|
162
|
+
if (dataLines.length > 0) {
|
|
163
|
+
yield { event: eventType, data: dataLines.join('\n'), id: eventId };
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
buffer += decoder.decode(value, { stream: true });
|
|
168
|
+
// Process complete lines (SSE uses \n, \r\n, or \r as line endings)
|
|
169
|
+
const lines = buffer.split(/\r\n|\r|\n/);
|
|
170
|
+
// The last element may be an incomplete line — keep it in the buffer
|
|
171
|
+
buffer = lines.pop() ?? '';
|
|
172
|
+
for (const line of lines) {
|
|
173
|
+
if (line === '') {
|
|
174
|
+
// Empty line = dispatch event (only if we have data)
|
|
175
|
+
if (dataLines.length > 0) {
|
|
176
|
+
const parsed = {
|
|
177
|
+
event: eventType,
|
|
178
|
+
data: dataLines.join('\n'),
|
|
179
|
+
id: eventId,
|
|
180
|
+
};
|
|
181
|
+
// Update lastEventId for reconnection (per SSE spec:
|
|
182
|
+
// only update when id field was present in the event)
|
|
183
|
+
if (eventId) {
|
|
184
|
+
this.lastEventId = eventId;
|
|
185
|
+
}
|
|
186
|
+
yield parsed;
|
|
187
|
+
// Reset accumulators for next event
|
|
188
|
+
eventType = '';
|
|
189
|
+
dataLines = [];
|
|
190
|
+
eventId = '';
|
|
191
|
+
}
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (line.startsWith(':')) {
|
|
195
|
+
// Comment line (heartbeat) — ignore
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
// Parse field name and value
|
|
199
|
+
const colonIndex = line.indexOf(':');
|
|
200
|
+
let field;
|
|
201
|
+
let fieldValue;
|
|
202
|
+
if (colonIndex === -1) {
|
|
203
|
+
// Line with no colon — field name is the entire line, value is empty
|
|
204
|
+
field = line;
|
|
205
|
+
fieldValue = '';
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
field = line.slice(0, colonIndex);
|
|
209
|
+
// Per SSE spec: if first char after colon is a space, strip it
|
|
210
|
+
fieldValue = line[colonIndex + 1] === ' '
|
|
211
|
+
? line.slice(colonIndex + 2)
|
|
212
|
+
: line.slice(colonIndex + 1);
|
|
213
|
+
}
|
|
214
|
+
switch (field) {
|
|
215
|
+
case 'event':
|
|
216
|
+
eventType = fieldValue;
|
|
217
|
+
break;
|
|
218
|
+
case 'data':
|
|
219
|
+
dataLines.push(fieldValue);
|
|
220
|
+
break;
|
|
221
|
+
case 'id':
|
|
222
|
+
// Per SSE spec: ignore id fields containing null (\0)
|
|
223
|
+
if (!fieldValue.includes('\0')) {
|
|
224
|
+
eventId = fieldValue;
|
|
225
|
+
}
|
|
226
|
+
break;
|
|
227
|
+
case 'retry':
|
|
228
|
+
// Retry field — not used by this parser (reconnection logic
|
|
229
|
+
// is handled by connectSSE with fixed config delays)
|
|
230
|
+
break;
|
|
231
|
+
default:
|
|
232
|
+
// Unknown field — ignore per SSE spec
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
finally {
|
|
239
|
+
reader.releaseLock();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Connects to the Humancy Cloud API's SSE endpoint and yields parsed events,
|
|
244
|
+
* automatically reconnecting on stream errors or unexpected closes.
|
|
245
|
+
*
|
|
246
|
+
* Uses `GET {apiUrl}/decisions/events?token={authToken}` with:
|
|
247
|
+
* - Auth via `token` query parameter (Humancy SSE auth convention)
|
|
248
|
+
* - `Last-Event-ID` header on reconnection attempts
|
|
249
|
+
* - `Accept: text/event-stream` header
|
|
250
|
+
*
|
|
251
|
+
* The generator transparently reconnects up to `maxReconnectAttempts` times
|
|
252
|
+
* with a delay of `sseReconnectDelay` ms between attempts. Each reconnection
|
|
253
|
+
* sends the last received event ID so the server can replay missed events.
|
|
254
|
+
*
|
|
255
|
+
* Cancellation is supported via the provided `AbortSignal` — when aborted,
|
|
256
|
+
* the current fetch is cancelled and the generator returns cleanly.
|
|
257
|
+
*/
|
|
258
|
+
async *connectSSE(signal) {
|
|
259
|
+
let attempts = 0;
|
|
260
|
+
while (attempts <= this.config.maxReconnectAttempts) {
|
|
261
|
+
// Build SSE endpoint URL with token auth via query parameter
|
|
262
|
+
const sseUrl = new URL(`${this.config.apiUrl}/decisions/events`);
|
|
263
|
+
if (this.config.authToken) {
|
|
264
|
+
sseUrl.searchParams.set('token', this.config.authToken);
|
|
265
|
+
}
|
|
266
|
+
const url = sseUrl.toString();
|
|
267
|
+
// Build headers
|
|
268
|
+
const headers = {
|
|
269
|
+
Accept: 'text/event-stream',
|
|
270
|
+
'Cache-Control': 'no-cache',
|
|
271
|
+
};
|
|
272
|
+
if (this.lastEventId) {
|
|
273
|
+
headers['Last-Event-ID'] = this.lastEventId;
|
|
274
|
+
}
|
|
275
|
+
let response;
|
|
276
|
+
try {
|
|
277
|
+
response = await fetch(url, {
|
|
278
|
+
method: 'GET',
|
|
279
|
+
headers,
|
|
280
|
+
signal,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
// If the signal was aborted, exit cleanly (timeout or cancellation)
|
|
285
|
+
if (signal.aborted) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
attempts++;
|
|
289
|
+
if (attempts > this.config.maxReconnectAttempts) {
|
|
290
|
+
this.logger.error(`SSE connection failed after ${this.config.maxReconnectAttempts} reconnection attempts: ${String(err)}`);
|
|
291
|
+
throw new Error(`SSE connection failed after ${this.config.maxReconnectAttempts} attempts: ${String(err)}`);
|
|
292
|
+
}
|
|
293
|
+
this.logger.warn(`SSE connection error, reconnecting (attempt ${attempts}/${this.config.maxReconnectAttempts}): ${String(err)}`);
|
|
294
|
+
await this.delay(this.config.sseReconnectDelay, signal);
|
|
295
|
+
if (signal.aborted)
|
|
296
|
+
return;
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
// Check for non-200 responses
|
|
300
|
+
if (!response.ok) {
|
|
301
|
+
attempts++;
|
|
302
|
+
if (attempts > this.config.maxReconnectAttempts) {
|
|
303
|
+
this.logger.error(`SSE endpoint returned ${response.status} after ${this.config.maxReconnectAttempts} reconnection attempts`);
|
|
304
|
+
throw new Error(`SSE connection failed: server returned ${response.status} ${response.statusText}`);
|
|
305
|
+
}
|
|
306
|
+
this.logger.warn(`SSE endpoint returned ${response.status}, reconnecting (attempt ${attempts}/${this.config.maxReconnectAttempts})`);
|
|
307
|
+
await this.delay(this.config.sseReconnectDelay, signal);
|
|
308
|
+
if (signal.aborted)
|
|
309
|
+
return;
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
if (!response.body) {
|
|
313
|
+
throw new Error('SSE response has no body');
|
|
314
|
+
}
|
|
315
|
+
this.logger.debug(`SSE connected to ${this.config.apiUrl}/decisions/events${this.lastEventId ? ` (resuming from ${this.lastEventId})` : ''}`);
|
|
316
|
+
// Reset attempts on successful connection
|
|
317
|
+
attempts = 0;
|
|
318
|
+
// Parse and yield events from the stream
|
|
319
|
+
try {
|
|
320
|
+
for await (const event of this.parseSSEStream(response.body)) {
|
|
321
|
+
yield event;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
// If the signal was aborted, exit cleanly
|
|
326
|
+
if (signal.aborted) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
// Stream broke unexpectedly — attempt reconnection
|
|
330
|
+
attempts++;
|
|
331
|
+
if (attempts > this.config.maxReconnectAttempts) {
|
|
332
|
+
this.logger.error(`SSE stream broke after ${this.config.maxReconnectAttempts} reconnection attempts: ${String(err)}`);
|
|
333
|
+
throw new Error(`SSE stream failed after ${this.config.maxReconnectAttempts} reconnection attempts: ${String(err)}`);
|
|
334
|
+
}
|
|
335
|
+
this.logger.warn(`SSE stream error, reconnecting (attempt ${attempts}/${this.config.maxReconnectAttempts}): ${String(err)}`);
|
|
336
|
+
await this.delay(this.config.sseReconnectDelay, signal);
|
|
337
|
+
if (signal.aborted)
|
|
338
|
+
return;
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
// Stream ended cleanly (server closed connection) — reconnect
|
|
342
|
+
// This can happen if the server restarts or the connection times out
|
|
343
|
+
attempts++;
|
|
344
|
+
if (attempts > this.config.maxReconnectAttempts) {
|
|
345
|
+
this.logger.error(`SSE stream closed by server after ${this.config.maxReconnectAttempts} reconnection attempts`);
|
|
346
|
+
throw new Error(`SSE connection lost: stream closed by server after ${this.config.maxReconnectAttempts} reconnection attempts`);
|
|
347
|
+
}
|
|
348
|
+
this.logger.warn(`SSE stream closed by server, reconnecting (attempt ${attempts}/${this.config.maxReconnectAttempts})`);
|
|
349
|
+
await this.delay(this.config.sseReconnectDelay, signal);
|
|
350
|
+
if (signal.aborted)
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Delay helper that respects AbortSignal for cancellation.
|
|
356
|
+
* Resolves after `ms` milliseconds, or immediately if the signal is aborted.
|
|
357
|
+
*/
|
|
358
|
+
delay(ms, signal) {
|
|
359
|
+
return new Promise((resolve) => {
|
|
360
|
+
if (signal.aborted) {
|
|
361
|
+
resolve();
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
const timer = setTimeout(resolve, ms);
|
|
365
|
+
signal.addEventListener('abort', () => {
|
|
366
|
+
clearTimeout(timer);
|
|
367
|
+
resolve();
|
|
368
|
+
}, { once: true });
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Request a human decision via the Humancy Cloud API.
|
|
373
|
+
*
|
|
374
|
+
* Flow:
|
|
375
|
+
* 1. Map ReviewDecisionRequest → CreateDecisionPayload
|
|
376
|
+
* 2. POST /decisions to create the decision
|
|
377
|
+
* 3. On POST failure → fall back to simulation if configured
|
|
378
|
+
* 4. Connect to SSE stream and wait for decision:resolved matching the decision ID
|
|
379
|
+
* 5. Extract response from the event data
|
|
380
|
+
* 6. Map response → ReviewDecisionResponse
|
|
381
|
+
* 7. Clean up timeout timer and SSE connection
|
|
382
|
+
*
|
|
383
|
+
* Throws CorrelationTimeoutError if the timeout elapses before a response.
|
|
384
|
+
*/
|
|
385
|
+
async requestDecision(request, timeout) {
|
|
386
|
+
// --- Step 1: Map request to Humancy Cloud API payload ---
|
|
387
|
+
const payload = this.mapRequestToPayload(request, timeout);
|
|
388
|
+
// --- Step 2: Set up abort controller for timeout management ---
|
|
389
|
+
const controller = new AbortController();
|
|
390
|
+
const { signal } = controller;
|
|
391
|
+
let timeoutTimer;
|
|
392
|
+
let decisionId;
|
|
393
|
+
try {
|
|
394
|
+
// --- Step 3: POST /decisions to create the decision ---
|
|
395
|
+
const createUrl = `${this.config.apiUrl}/decisions`;
|
|
396
|
+
const headers = {
|
|
397
|
+
'Content-Type': 'application/json',
|
|
398
|
+
};
|
|
399
|
+
if (this.config.authToken) {
|
|
400
|
+
headers['Authorization'] = `Bearer ${this.config.authToken}`;
|
|
401
|
+
}
|
|
402
|
+
let createResponse;
|
|
403
|
+
try {
|
|
404
|
+
createResponse = await fetch(createUrl, {
|
|
405
|
+
method: 'POST',
|
|
406
|
+
headers,
|
|
407
|
+
body: JSON.stringify(payload),
|
|
408
|
+
signal,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
catch (err) {
|
|
412
|
+
// Network error during POST — apply fallback logic
|
|
413
|
+
return this.handlePostFailure(err, 'network');
|
|
414
|
+
}
|
|
415
|
+
if (!createResponse.ok) {
|
|
416
|
+
// HTTP error — classify and apply fallback logic
|
|
417
|
+
const status = createResponse.status;
|
|
418
|
+
const body = await createResponse.text().catch(() => '');
|
|
419
|
+
const errorMsg = `POST /decisions failed: ${status} ${createResponse.statusText}${body ? ` — ${body}` : ''}`;
|
|
420
|
+
if (status >= 400 && status < 500) {
|
|
421
|
+
// 4xx = client error / misconfiguration — always throw, never fall back
|
|
422
|
+
throw new Error(errorMsg);
|
|
423
|
+
}
|
|
424
|
+
// 5xx = server error — apply fallback logic
|
|
425
|
+
return this.handlePostFailure(new Error(errorMsg), 'server');
|
|
426
|
+
}
|
|
427
|
+
// Humancy Cloud API returns { id, status, createdAt, expiresAt, success, data }
|
|
428
|
+
const createdItem = (await createResponse.json());
|
|
429
|
+
decisionId = createdItem.id;
|
|
430
|
+
this.logger.info(`Decision created: ${decisionId} (workflow=${request.workflowId}, step=${request.stepId})`);
|
|
431
|
+
// --- Step 4: Set up timeout timer ---
|
|
432
|
+
// The timer aborts the SSE connection and rejects with CorrelationTimeoutError
|
|
433
|
+
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
434
|
+
timeoutTimer = setTimeout(() => {
|
|
435
|
+
this.logger.error(`Decision timed out: ${decisionId} after ${timeout}ms (workflow=${request.workflowId}, step=${request.stepId})`);
|
|
436
|
+
controller.abort();
|
|
437
|
+
reject(new CorrelationTimeoutError(`Decision ${decisionId} timed out after ${timeout}ms`, decisionId));
|
|
438
|
+
}, timeout);
|
|
439
|
+
});
|
|
440
|
+
// --- Step 5: Connect to SSE and wait for matching event ---
|
|
441
|
+
const resolutionPromise = this.waitForResolution(decisionId, request, signal);
|
|
442
|
+
// Race: resolution vs timeout
|
|
443
|
+
const result = await Promise.race([resolutionPromise, timeoutPromise]);
|
|
444
|
+
return result;
|
|
445
|
+
}
|
|
446
|
+
finally {
|
|
447
|
+
// --- Step 7: Clean up ---
|
|
448
|
+
if (timeoutTimer !== undefined) {
|
|
449
|
+
clearTimeout(timeoutTimer);
|
|
450
|
+
}
|
|
451
|
+
// Abort any in-flight SSE connection if still open
|
|
452
|
+
if (!signal.aborted) {
|
|
453
|
+
controller.abort();
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Connects to SSE and waits for a `decision:resolved` event whose
|
|
459
|
+
* `data.id` matches the given decisionId. Returns the mapped response.
|
|
460
|
+
*
|
|
461
|
+
* Humancy Cloud API SSE event format:
|
|
462
|
+
* event: decision:resolved
|
|
463
|
+
* id: evt_<timestamp>_<random>
|
|
464
|
+
* data: { id, type, urgency, preview, projectId, status, response }
|
|
465
|
+
*/
|
|
466
|
+
async waitForResolution(decisionId, request, signal) {
|
|
467
|
+
for await (const event of this.connectSSE(signal)) {
|
|
468
|
+
this.logger.debug(`SSE event received: ${event.event} (id=${event.id})`);
|
|
469
|
+
if (event.event !== 'decision:resolved') {
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
// Parse the event data to check if it matches our decision
|
|
473
|
+
let eventData;
|
|
474
|
+
try {
|
|
475
|
+
eventData = JSON.parse(event.data);
|
|
476
|
+
}
|
|
477
|
+
catch {
|
|
478
|
+
this.logger.warn(`Failed to parse SSE event data: ${event.data.slice(0, 200)}`);
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
if (eventData.id !== decisionId) {
|
|
482
|
+
continue;
|
|
483
|
+
}
|
|
484
|
+
// Matched! Extract the response from the event data
|
|
485
|
+
if (!eventData.response) {
|
|
486
|
+
this.logger.warn(`decision:resolved event for ${decisionId} has no response — treating as rejection`);
|
|
487
|
+
return {
|
|
488
|
+
approved: false,
|
|
489
|
+
respondedBy: 'human',
|
|
490
|
+
respondedAt: new Date().toISOString(),
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
const mapped = this.mapResolvedEvent(eventData.response, request);
|
|
494
|
+
this.logger.info(`Decision resolved: ${decisionId} (${mapped.approved ? 'approved' : 'rejected'}${mapped.decision ? `, decision=${mapped.decision}` : ''})`);
|
|
495
|
+
return mapped;
|
|
496
|
+
}
|
|
497
|
+
// SSE stream exhausted without matching event (all reconnect attempts failed)
|
|
498
|
+
throw new Error(`SSE stream ended without receiving resolution for decision ${decisionId}`);
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Handles POST /decisions failures with optional simulation fallback.
|
|
502
|
+
*
|
|
503
|
+
* Fallback rules:
|
|
504
|
+
* - Network errors (connection refused, DNS, fetch errors) → fall back if configured
|
|
505
|
+
* - 5xx server errors → fall back if configured
|
|
506
|
+
* - 4xx client errors → always throw (misconfiguration, fail loudly)
|
|
507
|
+
* - fallbackToSimulation=false → always throw
|
|
508
|
+
*/
|
|
509
|
+
handlePostFailure(err, category) {
|
|
510
|
+
if (!this.config.fallbackToSimulation) {
|
|
511
|
+
throw err instanceof Error ? err : new Error(String(err));
|
|
512
|
+
}
|
|
513
|
+
this.logger.warn(`Humancy API unreachable (${category} error), falling back to simulation mode: ${String(err)}`);
|
|
514
|
+
return {
|
|
515
|
+
approved: true,
|
|
516
|
+
respondedBy: 'simulated',
|
|
517
|
+
respondedAt: new Date().toISOString(),
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
//# sourceMappingURL=humancy-api-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"humancy-api-handler.js","sourceRoot":"","sources":["../../../src/actions/builtin/humancy-api-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { BaseAction } from '../base-action.js';
|
|
2
|
+
import type { ActionContext, ActionResult, ActionType, ValidationResult, StepDefinition, HumancyUrgency } from '../../types/index.js';
|
|
3
|
+
import type { WorkflowStore } from '../../types/store.js';
|
|
4
|
+
/**
|
|
5
|
+
* Decision request payload for HumanHandler
|
|
6
|
+
*/
|
|
7
|
+
interface ReviewDecisionRequest {
|
|
8
|
+
type: 'review';
|
|
9
|
+
title: string;
|
|
10
|
+
description: string;
|
|
11
|
+
options: Array<{
|
|
12
|
+
id: string;
|
|
13
|
+
label: string;
|
|
14
|
+
requiresComment?: boolean;
|
|
15
|
+
}>;
|
|
16
|
+
workflowId: string;
|
|
17
|
+
stepId: string;
|
|
18
|
+
urgency: HumancyUrgency;
|
|
19
|
+
artifact?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Decision response from HumanHandler
|
|
23
|
+
*/
|
|
24
|
+
interface ReviewDecisionResponse {
|
|
25
|
+
approved?: boolean;
|
|
26
|
+
decision?: string;
|
|
27
|
+
input?: string;
|
|
28
|
+
respondedBy: string;
|
|
29
|
+
respondedAt: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Human handler interface for requesting decisions.
|
|
33
|
+
* This interface allows dependency injection for testing.
|
|
34
|
+
*/
|
|
35
|
+
export interface HumanDecisionHandler {
|
|
36
|
+
requestDecision(request: ReviewDecisionRequest, timeout: number): Promise<ReviewDecisionResponse>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* HumancyReviewAction implementation.
|
|
40
|
+
* Handles humancy.request_review workflow steps.
|
|
41
|
+
*/
|
|
42
|
+
export declare class HumancyReviewAction extends BaseAction {
|
|
43
|
+
readonly type: ActionType;
|
|
44
|
+
private store;
|
|
45
|
+
private humanHandler;
|
|
46
|
+
/**
|
|
47
|
+
* Create a new HumancyReviewAction
|
|
48
|
+
* @param humanHandler Optional human handler for decision routing
|
|
49
|
+
* @param store Optional workflow store for state persistence
|
|
50
|
+
*/
|
|
51
|
+
constructor(humanHandler?: HumanDecisionHandler, store?: WorkflowStore);
|
|
52
|
+
/**
|
|
53
|
+
* Set the human handler for decision routing.
|
|
54
|
+
* This allows late binding when the handler is created after the action.
|
|
55
|
+
*/
|
|
56
|
+
setHumanHandler(handler: HumanDecisionHandler): void;
|
|
57
|
+
/**
|
|
58
|
+
* Set the workflow store for state persistence.
|
|
59
|
+
*/
|
|
60
|
+
setStore(store: WorkflowStore): void;
|
|
61
|
+
/**
|
|
62
|
+
* Check if this handler can process the given step
|
|
63
|
+
*/
|
|
64
|
+
canHandle(step: StepDefinition): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Validate step configuration
|
|
67
|
+
*/
|
|
68
|
+
validate(step: StepDefinition): ValidationResult;
|
|
69
|
+
/**
|
|
70
|
+
* Execute the humancy review action
|
|
71
|
+
*/
|
|
72
|
+
protected executeInternal(step: StepDefinition, context: ActionContext): Promise<Omit<ActionResult, 'duration'>>;
|
|
73
|
+
/**
|
|
74
|
+
* Save workflow checkpoint before waiting for human response
|
|
75
|
+
*/
|
|
76
|
+
private saveCheckpoint;
|
|
77
|
+
/**
|
|
78
|
+
* Clear workflow checkpoint after successful completion
|
|
79
|
+
*/
|
|
80
|
+
private clearCheckpoint;
|
|
81
|
+
}
|
|
82
|
+
export {};
|
|
83
|
+
//# sourceMappingURL=humancy-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"humancy-review.d.ts","sourceRoot":"","sources":["../../../src/actions/builtin/humancy-review.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EAGd,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAUzE;;GAEG;AACH,UAAU,qBAAqB;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACnG;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,UAAU;IACjD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAA4B;IACrD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,YAAY,CAA8B;IAElD;;;;OAIG;gBACS,YAAY,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,aAAa;IAMtE;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAIpD;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAIpC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAIxC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB;IAsDhD;;OAEG;cACa,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAgH1C;;OAEG;YACW,cAAc;IA8C5B;;OAEG;YACW,eAAe;CAO9B"}
|