awaitly 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -21
- package/dist/batch.d.cts +1 -1
- package/dist/batch.d.ts +1 -1
- package/dist/circuit-breaker.d.cts +1 -1
- package/dist/circuit-breaker.d.ts +1 -1
- package/dist/conditional.d.cts +1 -1
- package/dist/conditional.d.ts +1 -1
- package/dist/{core-jqO_iCuZ.d.cts → core-C43KM7p0.d.cts} +1 -1
- package/dist/{core-jqO_iCuZ.d.ts → core-C43KM7p0.d.ts} +1 -1
- package/dist/core.d.cts +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/devtools.d.cts +1 -1
- package/dist/devtools.d.ts +1 -1
- package/dist/hitl.cjs +1 -1
- package/dist/hitl.cjs.map +1 -1
- package/dist/hitl.d.cts +3 -3
- package/dist/hitl.d.ts +3 -3
- package/dist/hitl.js +1 -1
- package/dist/hitl.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/otel.d.cts +1 -1
- package/dist/otel.d.ts +1 -1
- package/dist/persistence.cjs.map +1 -1
- package/dist/persistence.d.cts +4 -4
- package/dist/persistence.d.ts +4 -4
- package/dist/persistence.js.map +1 -1
- package/dist/policies.d.cts +1 -1
- package/dist/policies.d.ts +1 -1
- package/dist/ratelimit.d.cts +1 -1
- package/dist/ratelimit.d.ts +1 -1
- package/dist/reliability.d.cts +1 -1
- package/dist/reliability.d.ts +1 -1
- package/dist/resource.d.cts +1 -1
- package/dist/resource.d.ts +1 -1
- package/dist/saga.d.cts +1 -1
- package/dist/saga.d.ts +1 -1
- package/dist/testing.d.cts +2 -2
- package/dist/testing.d.ts +2 -2
- package/dist/visualize.d.cts +1 -1
- package/dist/visualize.d.ts +1 -1
- package/dist/webhook.d.cts +2 -2
- package/dist/webhook.d.ts +2 -2
- package/dist/{workflow-C_8aXXoo.d.ts → workflow-48TtU_mC.d.ts} +28 -24
- package/dist/{workflow-eAUZnVPR.d.cts → workflow-DKKBFlaH.d.cts} +28 -24
- package/dist/workflow.cjs +1 -1
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +1 -1
- package/dist/workflow.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -253,10 +253,10 @@ Save workflow state to a database and resume later from exactly where you left o
|
|
|
253
253
|
**Step 1: Collect state during execution**
|
|
254
254
|
|
|
255
255
|
```typescript
|
|
256
|
-
import { createWorkflow,
|
|
256
|
+
import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
|
|
257
257
|
|
|
258
258
|
// Create a collector to automatically capture step results
|
|
259
|
-
const collector =
|
|
259
|
+
const collector = createResumeStateCollector();
|
|
260
260
|
|
|
261
261
|
const workflow = createWorkflow({ fetchUser, fetchPosts }, {
|
|
262
262
|
onEvent: collector.handleEvent, // Automatically collects step_complete events
|
|
@@ -270,7 +270,7 @@ await workflow(async (step) => {
|
|
|
270
270
|
});
|
|
271
271
|
|
|
272
272
|
// Get the collected state
|
|
273
|
-
const state = collector.
|
|
273
|
+
const state = collector.getResumeState(); // Returns ResumeState
|
|
274
274
|
```
|
|
275
275
|
|
|
276
276
|
**Step 2: Save to database**
|
|
@@ -478,11 +478,11 @@ Save workflow state to a database and resume later. Perfect for crash recovery,
|
|
|
478
478
|
### Basic Save & Resume
|
|
479
479
|
|
|
480
480
|
```typescript
|
|
481
|
-
import { createWorkflow,
|
|
481
|
+
import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
|
|
482
482
|
import { stringifyState, parseState } from 'awaitly/persistence';
|
|
483
483
|
|
|
484
484
|
// 1. Collect state during execution
|
|
485
|
-
const collector =
|
|
485
|
+
const collector = createResumeStateCollector();
|
|
486
486
|
const workflow = createWorkflow({ fetchUser, fetchPosts }, {
|
|
487
487
|
onEvent: collector.handleEvent,
|
|
488
488
|
});
|
|
@@ -494,7 +494,7 @@ await workflow(async (step) => {
|
|
|
494
494
|
});
|
|
495
495
|
|
|
496
496
|
// 2. Save to database
|
|
497
|
-
const state = collector.
|
|
497
|
+
const state = collector.getResumeState();
|
|
498
498
|
const json = stringifyState(state, { workflowId: "123" });
|
|
499
499
|
await db.workflowStates.create({ id: "123", state: json });
|
|
500
500
|
|
|
@@ -533,11 +533,11 @@ const persistence = createStatePersistence({
|
|
|
533
533
|
}, 'workflow:state:');
|
|
534
534
|
|
|
535
535
|
// Save
|
|
536
|
-
const collector =
|
|
536
|
+
const collector = createResumeStateCollector();
|
|
537
537
|
const workflow = createWorkflow(deps, { onEvent: collector.handleEvent });
|
|
538
538
|
await workflow(async (step) => { /* ... */ });
|
|
539
539
|
|
|
540
|
-
await persistence.save('run-123', collector.
|
|
540
|
+
await persistence.save('run-123', collector.getResumeState(), { userId: 'user-1' });
|
|
541
541
|
|
|
542
542
|
// Load and resume
|
|
543
543
|
const savedState = await persistence.load('run-123');
|
|
@@ -625,7 +625,7 @@ const result = await resilientWorkflow(async (step) => {
|
|
|
625
625
|
Pause long-running workflows until an operator approves, then resume using persisted step results.
|
|
626
626
|
|
|
627
627
|
```typescript
|
|
628
|
-
import { createWorkflow,
|
|
628
|
+
import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
|
|
629
629
|
import {
|
|
630
630
|
createApprovalStep,
|
|
631
631
|
injectApproval,
|
|
@@ -633,7 +633,7 @@ import {
|
|
|
633
633
|
} from 'awaitly/hitl';
|
|
634
634
|
|
|
635
635
|
// Use collector to automatically capture state
|
|
636
|
-
const collector =
|
|
636
|
+
const collector = createResumeStateCollector();
|
|
637
637
|
const requireApproval = createApprovalStep({
|
|
638
638
|
key: 'approval:deploy',
|
|
639
639
|
checkApproval: async () => ({ status: 'pending' }),
|
|
@@ -647,7 +647,7 @@ const result = await gatedWorkflow(async (step) => step(requireApproval, { key:
|
|
|
647
647
|
|
|
648
648
|
if (!result.ok && isPendingApproval(result.error)) {
|
|
649
649
|
// Get collected state
|
|
650
|
-
const state = collector.
|
|
650
|
+
const state = collector.getResumeState();
|
|
651
651
|
|
|
652
652
|
// Later, when approval is granted, inject it and resume
|
|
653
653
|
const updatedState = injectApproval(state, {
|
|
@@ -826,10 +826,10 @@ const result = await validateAndCheckout(async (step) => {
|
|
|
826
826
|
- **State save & resume** - Persist step completions and resume later.
|
|
827
827
|
|
|
828
828
|
```typescript
|
|
829
|
-
import { createWorkflow,
|
|
829
|
+
import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
|
|
830
830
|
|
|
831
831
|
// Collect state during execution
|
|
832
|
-
const collector =
|
|
832
|
+
const collector = createResumeStateCollector();
|
|
833
833
|
const workflow = createWorkflow(deps, {
|
|
834
834
|
onEvent: collector.handleEvent, // Automatically collects step_complete events
|
|
835
835
|
});
|
|
@@ -840,7 +840,7 @@ const result = await validateAndCheckout(async (step) => {
|
|
|
840
840
|
});
|
|
841
841
|
|
|
842
842
|
// Get collected state
|
|
843
|
-
const state = collector.
|
|
843
|
+
const state = collector.getResumeState();
|
|
844
844
|
|
|
845
845
|
// Resume later
|
|
846
846
|
const resumed = createWorkflow(deps, { resumeState: state });
|
|
@@ -900,13 +900,13 @@ The scariest failure mode in payments: **charge succeeded, but persistence faile
|
|
|
900
900
|
Step keys + persistence solve this. Save state to a database, and if the workflow crashes, resume from the last successful step:
|
|
901
901
|
|
|
902
902
|
```typescript
|
|
903
|
-
import { createWorkflow,
|
|
903
|
+
import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
|
|
904
904
|
import { stringifyState, parseState } from 'awaitly/persistence';
|
|
905
905
|
|
|
906
906
|
const processPayment = createWorkflow({ validateCard, chargeProvider, persistResult });
|
|
907
907
|
|
|
908
908
|
// Collect state for persistence
|
|
909
|
-
const collector =
|
|
909
|
+
const collector = createResumeStateCollector();
|
|
910
910
|
const workflow = createWorkflow(
|
|
911
911
|
{ validateCard, chargeProvider, persistResult },
|
|
912
912
|
{ onEvent: collector.handleEvent }
|
|
@@ -929,7 +929,7 @@ const result = await workflow(async (step) => {
|
|
|
929
929
|
|
|
930
930
|
// Save state after each run (or on crash)
|
|
931
931
|
if (result.ok) {
|
|
932
|
-
const state = collector.
|
|
932
|
+
const state = collector.getResumeState();
|
|
933
933
|
const json = stringifyState(state, { orderId: input.orderId });
|
|
934
934
|
await db.workflowStates.upsert({
|
|
935
935
|
where: { idempotencyKey: input.idempotencyKey },
|
|
@@ -1125,7 +1125,7 @@ const result = await pipeline(async (step) => {
|
|
|
1125
1125
|
**`run()`** - Best for dynamic dependencies, testing, or lightweight workflows where you know the error types:
|
|
1126
1126
|
|
|
1127
1127
|
```typescript
|
|
1128
|
-
import { run } from 'awaitly
|
|
1128
|
+
import { run } from 'awaitly';
|
|
1129
1129
|
|
|
1130
1130
|
const result = await run<Output, 'NOT_FOUND' | 'FETCH_ERROR'>(
|
|
1131
1131
|
async (step) => {
|
|
@@ -1146,14 +1146,14 @@ const loadUser = createWorkflow({ fetchUser, fetchPosts });
|
|
|
1146
1146
|
### Import paths
|
|
1147
1147
|
|
|
1148
1148
|
```typescript
|
|
1149
|
-
// Main entry - result primitives
|
|
1150
|
-
import { ok, err, map, all } from 'awaitly';
|
|
1149
|
+
// Main entry - result primitives + run() for composition
|
|
1150
|
+
import { ok, err, map, all, run } from 'awaitly';
|
|
1151
1151
|
|
|
1152
1152
|
// Core layer - Result primitives + tagged errors + pattern matching
|
|
1153
1153
|
import { ok, err, map, TaggedError, Match } from 'awaitly/core';
|
|
1154
1154
|
|
|
1155
1155
|
// Workflow layer - orchestration, Duration, step collector
|
|
1156
|
-
import { createWorkflow,
|
|
1156
|
+
import { createWorkflow, Duration, createResumeStateCollector, isStepComplete } from 'awaitly/workflow';
|
|
1157
1157
|
|
|
1158
1158
|
// Visualization tools
|
|
1159
1159
|
import { createVisualizer } from 'awaitly/visualize';
|
package/dist/batch.d.cts
CHANGED
package/dist/batch.d.ts
CHANGED
package/dist/conditional.d.cts
CHANGED
package/dist/conditional.d.ts
CHANGED
|
@@ -2437,4 +2437,4 @@ declare function zip<A, EA, CA, B, EB, CB>(a: Result<A, EA, CA>, b: Result<B, EB
|
|
|
2437
2437
|
*/
|
|
2438
2438
|
declare function zipAsync<A, EA, CA, B, EB, CB>(a: Result<A, EA, CA> | Promise<Result<A, EA, CA>>, b: Result<B, EB, CB> | Promise<Result<B, EB, CB>>): AsyncResult<[A, B], EA | EB | PromiseRejectedError, CA | CB | PromiseRejectionCause>;
|
|
2439
2439
|
|
|
2440
|
-
export {
|
|
2440
|
+
export { bimap as $, type AsyncResult as A, type BackoffStrategy as B, type CauseOf as C, unwrap as D, type Err as E, unwrapOr as F, unwrapOrElse as G, from as H, fromPromise as I, tryAsync as J, fromNullable as K, map as L, type MaybeAsyncResult as M, mapError as N, type Ok as O, type PromiseRejectedError as P, match as Q, type Result as R, type StepOptions as S, type TimeoutOptions as T, type UnexpectedError as U, andThen as V, type WorkflowEvent as W, tap as X, tapError as Y, mapTry as Z, mapErrorTry as _, type UnexpectedCause as a, orElse as a0, orElseAsync as a1, recover as a2, recoverAsync as a3, type SettledError as a4, all as a5, allAsync as a6, allSettled as a7, allSettledAsync as a8, any as a9, anyAsync as aa, partition as ab, zip as ac, zipAsync as ad, run as ae, hydrate as af, isSerializedResult as ag, type StepFailureMeta as ah, type UnexpectedStepFailureCause as b, type PromiseRejectionCause as c, type EmptyInputError as d, type ErrorOf as e, type Errors as f, type ExtractValue as g, type ExtractError as h, type ExtractCause as i, type RunStep as j, type ScopeType as k, type RunOptions as l, type RunOptionsWithCatch as m, type RunOptionsWithoutCatch as n, type RetryOptions as o, type StepTimeoutError as p, type StepTimeoutMarkerMeta as q, STEP_TIMEOUT_MARKER as r, ok as s, err as t, isOk as u, isErr as v, isUnexpectedError as w, isStepTimeoutError as x, getStepTimeoutMeta as y, UnwrapError as z };
|
|
@@ -2437,4 +2437,4 @@ declare function zip<A, EA, CA, B, EB, CB>(a: Result<A, EA, CA>, b: Result<B, EB
|
|
|
2437
2437
|
*/
|
|
2438
2438
|
declare function zipAsync<A, EA, CA, B, EB, CB>(a: Result<A, EA, CA> | Promise<Result<A, EA, CA>>, b: Result<B, EB, CB> | Promise<Result<B, EB, CB>>): AsyncResult<[A, B], EA | EB | PromiseRejectedError, CA | CB | PromiseRejectionCause>;
|
|
2439
2439
|
|
|
2440
|
-
export {
|
|
2440
|
+
export { bimap as $, type AsyncResult as A, type BackoffStrategy as B, type CauseOf as C, unwrap as D, type Err as E, unwrapOr as F, unwrapOrElse as G, from as H, fromPromise as I, tryAsync as J, fromNullable as K, map as L, type MaybeAsyncResult as M, mapError as N, type Ok as O, type PromiseRejectedError as P, match as Q, type Result as R, type StepOptions as S, type TimeoutOptions as T, type UnexpectedError as U, andThen as V, type WorkflowEvent as W, tap as X, tapError as Y, mapTry as Z, mapErrorTry as _, type UnexpectedCause as a, orElse as a0, orElseAsync as a1, recover as a2, recoverAsync as a3, type SettledError as a4, all as a5, allAsync as a6, allSettled as a7, allSettledAsync as a8, any as a9, anyAsync as aa, partition as ab, zip as ac, zipAsync as ad, run as ae, hydrate as af, isSerializedResult as ag, type StepFailureMeta as ah, type UnexpectedStepFailureCause as b, type PromiseRejectionCause as c, type EmptyInputError as d, type ErrorOf as e, type Errors as f, type ExtractValue as g, type ExtractError as h, type ExtractCause as i, type RunStep as j, type ScopeType as k, type RunOptions as l, type RunOptionsWithCatch as m, type RunOptionsWithoutCatch as n, type RetryOptions as o, type StepTimeoutError as p, type StepTimeoutMarkerMeta as q, STEP_TIMEOUT_MARKER as r, ok as s, err as t, isOk as u, isErr as v, isUnexpectedError as w, isStepTimeoutError as x, getStepTimeoutMeta as y, UnwrapError as z };
|
package/dist/core.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { A as AsyncResult, C as CauseOf, d as EmptyInputError, E as Err, e as ErrorOf, f as Errors, i as ExtractCause, h as ExtractError, g as ExtractValue, M as MaybeAsyncResult, O as Ok, P as PromiseRejectedError, c as PromiseRejectionCause, R as Result,
|
|
1
|
+
export { A as AsyncResult, C as CauseOf, d as EmptyInputError, E as Err, e as ErrorOf, f as Errors, i as ExtractCause, h as ExtractError, g as ExtractValue, M as MaybeAsyncResult, O as Ok, P as PromiseRejectedError, c as PromiseRejectionCause, R as Result, a4 as SettledError, a as UnexpectedCause, U as UnexpectedError, b as UnexpectedStepFailureCause, z as UnwrapError, a5 as all, a6 as allAsync, a7 as allSettled, a8 as allSettledAsync, V as andThen, a9 as any, aa as anyAsync, $ as bimap, t as err, H as from, K as fromNullable, I as fromPromise, af as hydrate, v as isErr, u as isOk, ag as isSerializedResult, w as isUnexpectedError, L as map, N as mapError, _ as mapErrorTry, Z as mapTry, Q as match, s as ok, a0 as orElse, a1 as orElseAsync, ab as partition, a2 as recover, a3 as recoverAsync, X as tap, Y as tapError, J as tryAsync, D as unwrap, F as unwrapOr, G as unwrapOrElse } from './core-C43KM7p0.cjs';
|
|
2
2
|
export { ErrorByTag, PropsOf, TagOf, TaggedError, TaggedErrorBase, TaggedErrorConstructor, TaggedErrorCreateOptions, TaggedErrorOptions } from './tagged-error.cjs';
|
|
3
3
|
export { Match, Matcher, Tagged, exhaustive, isOneOf, isTag, matchOrElse, matchTag, matchTags, matchValue, orElseValue } from './match.cjs';
|
package/dist/core.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { A as AsyncResult, C as CauseOf, d as EmptyInputError, E as Err, e as ErrorOf, f as Errors, i as ExtractCause, h as ExtractError, g as ExtractValue, M as MaybeAsyncResult, O as Ok, P as PromiseRejectedError, c as PromiseRejectionCause, R as Result,
|
|
1
|
+
export { A as AsyncResult, C as CauseOf, d as EmptyInputError, E as Err, e as ErrorOf, f as Errors, i as ExtractCause, h as ExtractError, g as ExtractValue, M as MaybeAsyncResult, O as Ok, P as PromiseRejectedError, c as PromiseRejectionCause, R as Result, a4 as SettledError, a as UnexpectedCause, U as UnexpectedError, b as UnexpectedStepFailureCause, z as UnwrapError, a5 as all, a6 as allAsync, a7 as allSettled, a8 as allSettledAsync, V as andThen, a9 as any, aa as anyAsync, $ as bimap, t as err, H as from, K as fromNullable, I as fromPromise, af as hydrate, v as isErr, u as isOk, ag as isSerializedResult, w as isUnexpectedError, L as map, N as mapError, _ as mapErrorTry, Z as mapTry, Q as match, s as ok, a0 as orElse, a1 as orElseAsync, ab as partition, a2 as recover, a3 as recoverAsync, X as tap, Y as tapError, J as tryAsync, D as unwrap, F as unwrapOr, G as unwrapOrElse } from './core-C43KM7p0.js';
|
|
2
2
|
export { ErrorByTag, PropsOf, TagOf, TaggedError, TaggedErrorBase, TaggedErrorConstructor, TaggedErrorCreateOptions, TaggedErrorOptions } from './tagged-error.js';
|
|
3
3
|
export { Match, Matcher, Tagged, exhaustive, isOneOf, isTag, matchOrElse, matchTag, matchTags, matchValue, orElseValue } from './match.js';
|
package/dist/devtools.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { W as WorkflowEvent } from './core-C43KM7p0.cjs';
|
|
2
2
|
import { CollectableEvent, VisualizerOptions, DecisionStartEvent, DecisionBranchEvent, DecisionEndEvent, OutputFormat } from './visualize.cjs';
|
|
3
3
|
|
|
4
4
|
/**
|
package/dist/devtools.d.ts
CHANGED
package/dist/hitl.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var te=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames;var Se=Object.prototype.hasOwnProperty;var Pe=(t,e)=>{for(var n in e)te(t,n,{get:e[n],enumerable:!0})},he=(t,e,n,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of Ae(e))!Se.call(t,d)&&d!==n&&te(t,d,{get:()=>e[d],enumerable:!(u=ve(e,d))||u.enumerable});return t};var be=t=>he(te({},"__esModule",{value:!0}),t);var je={};Pe(je,{clearStep:()=>ye,createApprovalChecker:()=>Ce,createApprovalStep:()=>Ee,createApprovalWebhookHandler:()=>Re,createHITLCollector:()=>J,createHITLOrchestrator:()=>ge,createMemoryApprovalStore:()=>ke,createMemoryWorkflowStateStore:()=>Te,gatedStep:()=>we,getPendingApprovals:()=>fe,hasPendingApproval:()=>me,injectApproval:()=>G,isApprovalRejected:()=>ce,isPendingApproval:()=>N,pendingApproval:()=>de});module.exports=be(je);var F=t=>({ok:!0,value:t}),_=(t,e)=>({ok:!1,error:t,...e?.cause!==void 0?{cause:e.cause}:{}});var Oe=t=>typeof t=="object"&&t!==null&&t.type==="UNEXPECTED_ERROR",$=Symbol.for("step_timeout_marker");function se(t){return typeof t!="object"||t===null?!1:t.type==="STEP_TIMEOUT"?!0:$ in t}function _e(t){if(!(typeof t!="object"||t===null)){if(t.type==="STEP_TIMEOUT"){let e=t;return{timeoutMs:e.timeoutMs,stepName:e.stepName,stepKey:e.stepKey,attempt:e.attempt}}if($ in t)return t[$]}}var ue=Symbol("early-exit");function ie(t,e){return{[ue]:!0,error:t,meta:e}}function pe(t){return typeof t=="object"&&t!==null&&t[ue]===!0}var le=Symbol("mapper-exception");function Ie(t){return{[le]:!0,thrown:t}}function De(t){return typeof t=="object"&&t!==null&&t[le]===!0}function Ue(t){return typeof t=="string"?{name:t}:t??{}}function ne(t,e){let{backoff:n,initialDelay:u,maxDelay:d,jitter:A}=e,T;switch(n){case"fixed":T=u;break;case"linear":T=u*t;break;case"exponential":T=u*Math.pow(2,t-1);break}if(T=Math.min(T,d),A){let l=T*.25*Math.random();T=T+l}return Math.floor(T)}function re(t){return new Promise(e=>setTimeout(e,t))}var ae=Symbol("timeout");async function Me(t,e,n){let u=new AbortController,d=e.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:e.ms,attempt:n.attempt},A,T=new Promise((I,g)=>{A=setTimeout(()=>{u.abort(),g({[ae]:!0,error:d})},e.ms)}),l;e.signal?l=Promise.resolve(t(u.signal)):l=Promise.resolve(t());try{return await Promise.race([l,T])}catch(I){if(typeof I=="object"&&I!==null&&I[ae]===!0){let g=I.error;if(typeof g=="object"&&g!==null&&g.type!=="STEP_TIMEOUT"){let V={timeoutMs:e.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};$ in g?g[$]=V:Object.defineProperty(g,$,{value:V,enumerable:!1,writable:!0,configurable:!1})}throw g}throw I}finally{clearTimeout(A)}}var H={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function oe(t,e){let{onError:n,onEvent:u,catchUnexpected:d,workflowId:A,context:T}=e&&typeof e=="object"?e:{},l=A??crypto.randomUUID(),I=!n&&!d,g=[],V=0,q=r=>r??`step_${++V}`,y=r=>{let m=r.context!==void 0||T===void 0?r:{...r,context:T};if(m.type==="step_success"){let h=m.stepId;for(let D=g.length-1;D>=0;D--){let b=g[D];if(b.type==="race"&&!b.winnerId){b.winnerId=h;break}}}u?.(m,T)},K=ie,Y=r=>pe(r),w=(r,m)=>I?m?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:r,...m.resultCause!==void 0?{cause:m.resultCause}:{}}}:m?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:r,thrown:m.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:r}}:r,O=r=>({type:"UNEXPECTED_ERROR",cause:r.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:r.error,...r.meta.resultCause!==void 0?{cause:r.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:r.error,thrown:r.meta.thrown}});try{let m=function(s,o){let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),p=!1;g.push({scopeId:i,type:"parallel"});let k=()=>{if(p)return;p=!0;let c=g.findIndex(E=>E.scopeId===i);c!==-1&&g.splice(c,1),y({type:"scope_end",workflowId:l,scopeId:i,ts:Date.now(),durationMs:performance.now()-a})};y({type:"scope_start",workflowId:l,scopeId:i,scopeType:"parallel",name:s,ts:Date.now()});try{let c=await o();if(k(),!c.ok)throw n?.(c.error,s,T),K(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw k(),c}})()},h=function(s,o){let i=Object.keys(s),a=o.name??`Parallel(${i.join(", ")})`,p=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let k=performance.now(),c=!1;g.push({scopeId:p,type:"parallel"});let E=()=>{if(c)return;c=!0;let R=g.findIndex(x=>x.scopeId===p);R!==-1&&g.splice(R,1),y({type:"scope_end",workflowId:l,scopeId:p,ts:Date.now(),durationMs:performance.now()-k})};y({type:"scope_start",workflowId:l,scopeId:p,scopeType:"parallel",name:a,ts:Date.now()});try{let R=await new Promise(M=>{if(i.length===0){M([]);return}let W=!1,S=i.length,X=new Array(i.length);for(let j=0;j<i.length;j++){let L=i[j],Q=j;Promise.resolve(s[L]()).catch(C=>_({type:"PROMISE_REJECTED",cause:C},{cause:{type:"PROMISE_REJECTION",reason:C}})).then(C=>{if(!W){if(!C.ok){W=!0,M([{key:L,result:C}]);return}X[Q]={key:L,result:C},S--,S===0&&M(X)}})}});E();let x={};for(let{key:M,result:W}of R){if(!W.ok)throw n?.(W.error,M,T),K(W.error,{origin:"result",resultCause:W.cause});x[M]=W.value}return x}catch(R){throw E(),R}})()};var P=m,v=h;let r=(s,o)=>(async()=>{let i=Ue(o),{name:a,key:p,retry:k,timeout:c}=i,E=q(p),R=u,x=R?performance.now():0;if(!(typeof s=="function")){if(k&&k.attempts>1)throw new Error("step: retry options require a function operation. Direct Promise/Result values cannot be re-executed on retry. Wrap your operation in a function: step(() => yourOperation, { retry: {...} })");if(c)throw new Error("step: timeout options require a function operation. Direct Promise/Result values cannot be wrapped with timeout after they've started. Wrap your operation in a function: step(() => yourOperation, { timeout: {...} })")}let S={attempts:Math.max(1,k?.attempts??1),backoff:k?.backoff??H.backoff,initialDelay:k?.initialDelay??H.initialDelay,maxDelay:k?.maxDelay??H.maxDelay,jitter:k?.jitter??H.jitter,retryOn:k?.retryOn??H.retryOn,onRetry:k?.onRetry??H.onRetry};u&&y({type:"step_start",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now()});let X;for(let C=1;C<=S.attempts;C++){let xe=R?performance.now():0;try{let f;if(typeof s=="function"?c?f=await Me(s,c,{name:a,key:p,attempt:C}):f=await s():f=await s,f.ok){let B=performance.now()-x;return y({type:"step_success",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:B}),p&&y({type:"step_complete",workflowId:l,stepKey:p,name:a,ts:Date.now(),durationMs:B,result:f}),f.value}if(X=f,C<S.attempts&&S.retryOn(f.error,C)){let B=ne(C,S);y({type:"step_retry",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),attempt:C+1,maxAttempts:S.attempts,delayMs:B,error:f.error}),S.onRetry(f.error,C,B),await re(B);continue}S.attempts>1&&y({type:"step_retries_exhausted",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:performance.now()-x,attempts:C,lastError:f.error});break}catch(f){let B=performance.now()-xe;if(Y(f))throw y({type:"step_aborted",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:B}),f;if(se(f)){let U=_e(f),Z=c?.ms??U?.timeoutMs??0;if(y({type:"step_timeout",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),timeoutMs:Z,attempt:C}),C<S.attempts&&S.retryOn(f,C)){let ee=ne(C,S);y({type:"step_retry",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),attempt:C+1,maxAttempts:S.attempts,delayMs:ee,error:f}),S.onRetry(f,C,ee),await re(ee);continue}S.attempts>1&&y({type:"step_retries_exhausted",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:performance.now()-x,attempts:C,lastError:f})}if(C<S.attempts&&S.retryOn(f,C)){let U=ne(C,S);y({type:"step_retry",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),attempt:C+1,maxAttempts:S.attempts,delayMs:U,error:f}),S.onRetry(f,C,U),await re(U);continue}S.attempts>1&&!se(f)&&y({type:"step_retries_exhausted",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:performance.now()-x,attempts:C,lastError:f});let z=performance.now()-x;if(d){let U;try{U=d(f)}catch(Z){throw Ie(Z)}throw y({type:"step_error",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:z,error:U}),p&&y({type:"step_complete",workflowId:l,stepKey:p,name:a,ts:Date.now(),durationMs:z,result:_(U,{cause:f}),meta:{origin:"throw",thrown:f}}),n?.(U,a,T),K(U,{origin:"throw",thrown:f})}else{let U={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:f}};throw y({type:"step_error",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:z,error:U}),p&&y({type:"step_complete",workflowId:l,stepKey:p,name:a,ts:Date.now(),durationMs:z,result:_(U,{cause:f}),meta:{origin:"throw",thrown:f}}),f}}}let j=X,L=performance.now()-x,Q=w(j.error,{origin:"result",resultCause:j.cause});throw y({type:"step_error",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:L,error:Q}),p&&y({type:"step_complete",workflowId:l,stepKey:p,name:a,ts:Date.now(),durationMs:L,result:j,meta:{origin:"result",resultCause:j.cause}}),n?.(j.error,a,T),K(j.error,{origin:"result",resultCause:j.cause})})();r.try=(s,o)=>{let i=o.name,a=o.key,p=q(a),k="error"in o?()=>o.error:o.onError,c=u;return(async()=>{let E=c?performance.now():0;u&&y({type:"step_start",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now()});try{let R=await s(),x=performance.now()-E;return y({type:"step_success",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now(),durationMs:x}),a&&y({type:"step_complete",workflowId:l,stepKey:a,name:i,ts:Date.now(),durationMs:x,result:F(R)}),R}catch(R){let x=k(R),M=performance.now()-E,W=w(x,{origin:"throw",thrown:R});throw y({type:"step_error",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now(),durationMs:M,error:W}),a&&y({type:"step_complete",workflowId:l,stepKey:a,name:i,ts:Date.now(),durationMs:M,result:_(x,{cause:R}),meta:{origin:"throw",thrown:R}}),n?.(x,i,T),K(x,{origin:"throw",thrown:R})}})()},r.fromResult=(s,o)=>{let i=o.name,a=o.key,p=q(a),k="error"in o?()=>o.error:o.onError,c=u;return(async()=>{let E=c?performance.now():0;u&&y({type:"step_start",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now()});let R=await s();if(R.ok){let x=performance.now()-E;return y({type:"step_success",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now(),durationMs:x}),a&&y({type:"step_complete",workflowId:l,stepKey:a,name:i,ts:Date.now(),durationMs:x,result:F(R.value)}),R.value}else{let x=k(R.error),M=performance.now()-E,W=w(x,{origin:"result",resultCause:R.error});throw y({type:"step_error",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now(),durationMs:M,error:W}),a&&y({type:"step_complete",workflowId:l,stepKey:a,name:i,ts:Date.now(),durationMs:M,result:_(x,{cause:R.error}),meta:{origin:"result",resultCause:R.error}}),n?.(x,i,T),K(x,{origin:"result",resultCause:R.error})}})()},r.retry=(s,o)=>r(s,{name:o.name,key:o.key,retry:{attempts:o.attempts,backoff:o.backoff,initialDelay:o.initialDelay,maxDelay:o.maxDelay,jitter:o.jitter,retryOn:o.retryOn,onRetry:o.onRetry},timeout:o.timeout}),r.withTimeout=(s,o)=>r(s,{name:o.name,key:o.key,timeout:o}),r.parallel=((...s)=>{if(typeof s[0]=="string"){let o=s[0],i=s[1];return m(o,i)}else{let o=s[0],i=s[1]??{};return h(o,i)}}),r.race=(s,o)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),p=!1,k={scopeId:i,type:"race",winnerId:void 0};g.push(k);let c=()=>{if(p)return;p=!0;let E=g.findIndex(R=>R.scopeId===i);E!==-1&&g.splice(E,1),y({type:"scope_end",workflowId:l,scopeId:i,ts:Date.now(),durationMs:performance.now()-a,winnerId:k.winnerId})};y({type:"scope_start",workflowId:l,scopeId:i,scopeType:"race",name:s,ts:Date.now()});try{let E=await o();if(c(),!E.ok)throw n?.(E.error,s,T),K(E.error,{origin:"result",resultCause:E.cause});return E.value}catch(E){throw c(),E}})()},r.allSettled=(s,o)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),p=!1;g.push({scopeId:i,type:"allSettled"});let k=()=>{if(p)return;p=!0;let c=g.findIndex(E=>E.scopeId===i);c!==-1&&g.splice(c,1),y({type:"scope_end",workflowId:l,scopeId:i,ts:Date.now(),durationMs:performance.now()-a})};y({type:"scope_start",workflowId:l,scopeId:i,scopeType:"allSettled",name:s,ts:Date.now()});try{let c=await o();if(k(),!c.ok)throw n?.(c.error,s,T),K(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw k(),c}})()};let b=await t(r);return F(b)}catch(r){if(De(r))throw r.thrown;if(Y(r)){let h=r.meta.origin==="throw"?r.meta.thrown:r.meta.resultCause;if(d||n)return _(r.error,{cause:h});if(Oe(r.error))return _(r.error,{cause:h});let D=O(r);return _(D,{cause:h})}if(d){let h=d(r);return n?.(h,"unexpected",T),_(h,{cause:r})}let m={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:r}};return n?.(m,"unexpected",T),_(m,{cause:r})}}oe.strict=(t,e)=>oe(t,e);function We(t){return t.type==="step_complete"}function N(t){return typeof t=="object"&&t!==null&&t.type==="PENDING_APPROVAL"}function ce(t){return typeof t=="object"&&t!==null&&t.type==="APPROVAL_REJECTED"}function de(t,e){return _({type:"PENDING_APPROVAL",stepKey:t,reason:e?.reason,metadata:e?.metadata})}function Ee(t){return async()=>{let e=await t.checkApproval();switch(e.status){case"pending":return _({type:"PENDING_APPROVAL",stepKey:t.key,reason:t.pendingReason,metadata:t.metadata});case"rejected":return _({type:"APPROVAL_REJECTED",stepKey:t.key,reason:e.reason});case"approved":return F(e.value)}}}function we(t,e){return async n=>{if(!(typeof e.requiresApproval=="function"?await e.requiresApproval(n):e.requiresApproval))return t(n);if(e.checkApproval){let A=await e.checkApproval();switch(A.status){case"approved":return t(n);case"rejected":return _({type:"APPROVAL_REJECTED",stepKey:e.key,reason:A.reason});case"pending":break}}let d=typeof e.description=="function"?e.description(n):e.description;return _({type:"PENDING_APPROVAL",stepKey:e.key,reason:d,metadata:{...e.metadata,pendingArgs:n,gatedOperation:!0}})}}function G(t,e){let n=new Map(t.steps);return n.set(e.stepKey,{result:F(e.value)}),{steps:n}}function ye(t,e){let n=new Map(t.steps);return n.delete(e),{steps:n}}function me(t,e){let n=t.steps.get(e);return!n||n.result.ok?!1:N(n.result.error)}function fe(t){let e=[];for(let[n,u]of t.steps)!u.result.ok&&N(u.result.error)&&e.push(n);return e}function J(){let t=new Map;return{handleEvent:e=>{We(e)&&t.set(e.stepKey,{result:e.result,meta:e.meta})},getState:()=>({steps:new Map(t)}),clear:()=>t.clear(),hasPendingApprovals:()=>{for(let e of t.values())if(!e.result.ok&&N(e.result.error))return!0;return!1},getPendingApprovals:()=>{let e=[];for(let[n,u]of t)!u.result.ok&&N(u.result.error)&&e.push({stepKey:n,error:u.result.error});return e},injectApproval:(e,n)=>(t.set(e,{result:F(n)}),{steps:new Map(t)})}}function ke(){let t=new Map;return{async getApproval(e){let n=t.get(e);return n?n.expiresAt&&Date.now()>n.expiresAt?{status:"expired",expiredAt:n.expiresAt}:n:{status:"pending"}},async createApproval(e,n){t.set(e,{status:"pending",metadata:n?.metadata,expiresAt:n?.expiresAt})},async grantApproval(e,n,u){t.set(e,{status:"approved",value:n,approvedBy:u?.approvedBy,approvedAt:Date.now()})},async rejectApproval(e,n,u){t.set(e,{status:"rejected",reason:n,rejectedBy:u?.rejectedBy,rejectedAt:Date.now()})},async editApproval(e,n,u,d){t.set(e,{status:"edited",originalValue:n,editedValue:u,editedBy:d?.editedBy,editedAt:Date.now()})},async cancelApproval(e){t.delete(e)},async listPending(e){let n=[];for(let[u,d]of t)d.status==="pending"&&(!e?.prefix||u.startsWith(e.prefix))&&n.push(u);return n}}}function Te(){let t=new Map;return{async save(e){t.set(e.runId,{...e,updatedAt:Date.now()})},async load(e){return t.get(e)},async delete(e){t.delete(e)},async list(e){let n=[];for(let[u,d]of t)if(!(e?.workflowName&&d.workflowName!==e.workflowName)){if(e?.hasPendingApprovals!==void 0){let A=d.pendingApprovals.length>0;if(e.hasPendingApprovals!==A)continue}n.push(u)}return n},async findByPendingApproval(e){let n=[];for(let[u,d]of t)d.pendingApprovals.includes(e)&&n.push(u);return n}}}function ge(t){let{approvalStore:e,workflowStateStore:n,defaultExpirationMs:u=10080*60*1e3,logger:d=()=>{},notificationChannel:A}=t;async function T(w,O,P,v,r){let m=r?.runId??crypto.randomUUID(),h=J(),b=await O({onEvent:h.handleEvent})(v,P),s=h.getPendingApprovals().map(o=>o.stepKey);if(s.length>0){let o={runId:m,workflowName:w,resumeState:h.getState(),pendingApprovals:s,input:v,metadata:r?.metadata,startedAt:Date.now(),updatedAt:Date.now()};await n.save(o);let i,a;!b.ok&&N(b.error)&&(i=b.error.reason,a=b.error.metadata);let p=Date.now()+u;for(let k of s)await e.createApproval(k,{metadata:{...a,runId:m,workflowName:w},expiresAt:p});if(A)for(let k of s)try{let c=h.getPendingApprovals().find(E=>E.stepKey===k);await A.onApprovalNeeded({approvalKey:k,runId:m,workflowName:w,reason:i,metadata:{...r?.metadata,...a},expiresAt:p,summary:i??`Approval needed for ${k}`,pendingArgs:c?.error.metadata})}catch(c){d(`Failed to notify for approval ${k}: ${c}`)}return d(`Workflow ${m} paused, waiting for: ${s.join(", ")}`),{status:"paused",runId:m,pendingApprovals:s,reason:i}}return d(`Workflow ${m} completed`),{status:"completed",result:b}}async function l(w,O,P){let v=await n.load(w);if(!v)throw new Error(`Workflow run not found: ${w}`);for(let s of v.pendingApprovals){let o=await e.getApproval(s);if(o.status==="pending")return{status:"paused",runId:w,pendingApprovals:v.pendingApprovals};if(o.status,o.status==="expired")throw new Error(`Approval ${s} has expired`)}let r=v.resumeState;for(let s of v.pendingApprovals){let o=await e.getApproval(s);o.status==="approved"?r=G(r,{stepKey:s,value:o.value}):o.status==="edited"&&(r=G(r,{stepKey:s,value:o.editedValue}))}let m=J(),D=await O({resumeState:r,onEvent:m.handleEvent})(v.input,P),b=m.getPendingApprovals().map(s=>s.stepKey);if(b.length>0){let s={...v,resumeState:m.getState(),pendingApprovals:b,updatedAt:Date.now()};await n.save(s);for(let i of b)await e.createApproval(i,{metadata:{runId:w,workflowName:v.workflowName},expiresAt:Date.now()+u});d(`Workflow ${w} paused again, waiting for: ${b.join(", ")}`);let o;return!D.ok&&N(D.error)&&(o=D.error.reason),{status:"paused",runId:w,pendingApprovals:b,reason:o}}return await n.delete(w),d(`Workflow ${w} resumed and completed`),{status:"resumed",runId:w,result:D}}async function I(w,O,P){await e.grantApproval(w,O,{approvedBy:P?.approvedBy});let v=Date.now(),r=[];if(P?.autoResume!==!1){let m=await n.findByPendingApproval(w);for(let h of m)r.push(h)}return A?.onApprovalResolved&&await A.onApprovalResolved({approvalKey:w,action:"approved",actorId:P?.approvedBy,resolvedAt:v,value:O}),d(`Approval ${w} granted by ${P?.approvedBy??"unknown"}`),{grantedAt:v,resumedWorkflows:r}}async function g(w,O,P){await e.rejectApproval(w,O,{rejectedBy:P?.rejectedBy}),A?.onApprovalResolved&&await A.onApprovalResolved({approvalKey:w,action:"rejected",actorId:P?.rejectedBy,resolvedAt:Date.now(),reason:O}),d(`Approval ${w} rejected: ${O}`)}async function V(w,O,P,v){await e.editApproval(w,O,P,{editedBy:v?.editedBy});let r=Date.now();return A?.onApprovalResolved&&await A.onApprovalResolved({approvalKey:w,action:"edited",actorId:v?.editedBy,resolvedAt:r,value:P,originalValue:O}),d(`Approval ${w} edited by ${v?.editedBy??"unknown"}`),{editedAt:r}}async function q(w,O){let{intervalMs:P=1e3,maxPolls:v,timeoutMs:r,onPollStart:m,onPollComplete:h}=O??{},D=Date.now(),b=0;for(;;){m?.();let s=await e.getApproval(w);if(h?.(s),s.status!=="pending")return s;if(b++,v!==void 0&&b>=v)return{status:"pending"};if(r!==void 0&&Date.now()-D>=r)return{status:"pending"};await new Promise(o=>setTimeout(o,P))}}async function y(w){return n.load(w)}async function K(w){return n.list({workflowName:w,hasPendingApprovals:!0})}async function Y(w){let O=await n.list(),P=0,v=Date.now()-w;for(let r of O){let m=await n.load(r);m&&m.updatedAt<v&&m.pendingApprovals.length===0&&(await n.delete(r),P++)}return d(`Cleaned up ${P} old workflow states`),P}return{execute:T,resume:l,grantApproval:I,rejectApproval:g,editApproval:V,pollApproval:q,getWorkflowStatus:y,listPendingWorkflows:K,cleanup:Y}}function Re(t){return async e=>{let{key:n,action:u,value:d,originalValue:A,editedValue:T,reason:l,actorId:I}=e;try{switch(u){case"approve":return await t.grantApproval(n,d,{approvedBy:I}),{success:!0,message:`Approval ${n} granted`,data:{key:n,action:u,timestamp:Date.now()}};case"reject":return l?(await t.rejectApproval(n,l,{rejectedBy:I}),{success:!0,message:`Approval ${n} rejected`,data:{key:n,action:u,timestamp:Date.now()}}):{success:!1,message:"Reason is required for rejection"};case"edit":return A===void 0||T===void 0?{success:!1,message:"Both originalValue and editedValue are required for edit"}:(await t.editApproval(n,A,T,{editedBy:I}),{success:!0,message:`Approval ${n} edited`,data:{key:n,action:u,timestamp:Date.now()}});case"cancel":return await t.cancelApproval(n),{success:!0,message:`Approval ${n} cancelled`,data:{key:n,action:u,timestamp:Date.now()}};default:return{success:!1,message:`Unknown action: ${u}`}}}catch(g){return{success:!1,message:g instanceof Error?g.message:String(g)}}}}function Ce(t){return e=>async()=>{let n=await t.getApproval(e);switch(n.status){case"pending":return{status:"pending"};case"approved":return{status:"approved",value:n.value};case"edited":return{status:"approved",value:n.editedValue};case"rejected":return{status:"rejected",reason:n.reason};case"expired":return{status:"rejected",reason:"Approval request expired"};default:return{status:"pending"}}}}0&&(module.exports={clearStep,createApprovalChecker,createApprovalStep,createApprovalWebhookHandler,createHITLCollector,createHITLOrchestrator,createMemoryApprovalStore,createMemoryWorkflowStateStore,gatedStep,getPendingApprovals,hasPendingApproval,injectApproval,isApprovalRejected,isPendingApproval,pendingApproval});
|
|
1
|
+
"use strict";var te=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames;var Se=Object.prototype.hasOwnProperty;var Pe=(t,e)=>{for(var n in e)te(t,n,{get:e[n],enumerable:!0})},he=(t,e,n,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of Ae(e))!Se.call(t,d)&&d!==n&&te(t,d,{get:()=>e[d],enumerable:!(u=ve(e,d))||u.enumerable});return t};var be=t=>he(te({},"__esModule",{value:!0}),t);var je={};Pe(je,{clearStep:()=>ye,createApprovalChecker:()=>Ce,createApprovalStateCollector:()=>J,createApprovalStep:()=>Ee,createApprovalWebhookHandler:()=>Re,createHITLOrchestrator:()=>ge,createMemoryApprovalStore:()=>ke,createMemoryWorkflowStateStore:()=>Te,gatedStep:()=>we,getPendingApprovals:()=>fe,hasPendingApproval:()=>me,injectApproval:()=>G,isApprovalRejected:()=>ce,isPendingApproval:()=>N,pendingApproval:()=>de});module.exports=be(je);var F=t=>({ok:!0,value:t}),_=(t,e)=>({ok:!1,error:t,...e?.cause!==void 0?{cause:e.cause}:{}});var Oe=t=>typeof t=="object"&&t!==null&&t.type==="UNEXPECTED_ERROR",H=Symbol.for("step_timeout_marker");function se(t){return typeof t!="object"||t===null?!1:t.type==="STEP_TIMEOUT"?!0:H in t}function _e(t){if(!(typeof t!="object"||t===null)){if(t.type==="STEP_TIMEOUT"){let e=t;return{timeoutMs:e.timeoutMs,stepName:e.stepName,stepKey:e.stepKey,attempt:e.attempt}}if(H in t)return t[H]}}var ue=Symbol("early-exit");function ie(t,e){return{[ue]:!0,error:t,meta:e}}function pe(t){return typeof t=="object"&&t!==null&&t[ue]===!0}var le=Symbol("mapper-exception");function Ie(t){return{[le]:!0,thrown:t}}function De(t){return typeof t=="object"&&t!==null&&t[le]===!0}function Ue(t){return typeof t=="string"?{name:t}:t??{}}function ne(t,e){let{backoff:n,initialDelay:u,maxDelay:d,jitter:A}=e,T;switch(n){case"fixed":T=u;break;case"linear":T=u*t;break;case"exponential":T=u*Math.pow(2,t-1);break}if(T=Math.min(T,d),A){let l=T*.25*Math.random();T=T+l}return Math.floor(T)}function re(t){return new Promise(e=>setTimeout(e,t))}var ae=Symbol("timeout");async function Me(t,e,n){let u=new AbortController,d=e.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:e.ms,attempt:n.attempt},A,T=new Promise((I,g)=>{A=setTimeout(()=>{u.abort(),g({[ae]:!0,error:d})},e.ms)}),l;e.signal?l=Promise.resolve(t(u.signal)):l=Promise.resolve(t());try{return await Promise.race([l,T])}catch(I){if(typeof I=="object"&&I!==null&&I[ae]===!0){let g=I.error;if(typeof g=="object"&&g!==null&&g.type!=="STEP_TIMEOUT"){let V={timeoutMs:e.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};H in g?g[H]=V:Object.defineProperty(g,H,{value:V,enumerable:!1,writable:!0,configurable:!1})}throw g}throw I}finally{clearTimeout(A)}}var $={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function oe(t,e){let{onError:n,onEvent:u,catchUnexpected:d,workflowId:A,context:T}=e&&typeof e=="object"?e:{},l=A??crypto.randomUUID(),I=!n&&!d,g=[],V=0,q=r=>r??`step_${++V}`,y=r=>{let m=r.context!==void 0||T===void 0?r:{...r,context:T};if(m.type==="step_success"){let h=m.stepId;for(let D=g.length-1;D>=0;D--){let b=g[D];if(b.type==="race"&&!b.winnerId){b.winnerId=h;break}}}u?.(m,T)},K=ie,Y=r=>pe(r),w=(r,m)=>I?m?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:r,...m.resultCause!==void 0?{cause:m.resultCause}:{}}}:m?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:r,thrown:m.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:r}}:r,O=r=>({type:"UNEXPECTED_ERROR",cause:r.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:r.error,...r.meta.resultCause!==void 0?{cause:r.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:r.error,thrown:r.meta.thrown}});try{let m=function(s,o){let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),p=!1;g.push({scopeId:i,type:"parallel"});let k=()=>{if(p)return;p=!0;let c=g.findIndex(E=>E.scopeId===i);c!==-1&&g.splice(c,1),y({type:"scope_end",workflowId:l,scopeId:i,ts:Date.now(),durationMs:performance.now()-a})};y({type:"scope_start",workflowId:l,scopeId:i,scopeType:"parallel",name:s,ts:Date.now()});try{let c=await o();if(k(),!c.ok)throw n?.(c.error,s,T),K(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw k(),c}})()},h=function(s,o){let i=Object.keys(s),a=o.name??`Parallel(${i.join(", ")})`,p=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let k=performance.now(),c=!1;g.push({scopeId:p,type:"parallel"});let E=()=>{if(c)return;c=!0;let R=g.findIndex(x=>x.scopeId===p);R!==-1&&g.splice(R,1),y({type:"scope_end",workflowId:l,scopeId:p,ts:Date.now(),durationMs:performance.now()-k})};y({type:"scope_start",workflowId:l,scopeId:p,scopeType:"parallel",name:a,ts:Date.now()});try{let R=await new Promise(M=>{if(i.length===0){M([]);return}let W=!1,S=i.length,X=new Array(i.length);for(let j=0;j<i.length;j++){let L=i[j],Q=j;Promise.resolve(s[L]()).catch(C=>_({type:"PROMISE_REJECTED",cause:C},{cause:{type:"PROMISE_REJECTION",reason:C}})).then(C=>{if(!W){if(!C.ok){W=!0,M([{key:L,result:C}]);return}X[Q]={key:L,result:C},S--,S===0&&M(X)}})}});E();let x={};for(let{key:M,result:W}of R){if(!W.ok)throw n?.(W.error,M,T),K(W.error,{origin:"result",resultCause:W.cause});x[M]=W.value}return x}catch(R){throw E(),R}})()};var P=m,v=h;let r=(s,o)=>(async()=>{let i=Ue(o),{name:a,key:p,retry:k,timeout:c}=i,E=q(p),R=u,x=R?performance.now():0;if(!(typeof s=="function")){if(k&&k.attempts>1)throw new Error("step: retry options require a function operation. Direct Promise/Result values cannot be re-executed on retry. Wrap your operation in a function: step(() => yourOperation, { retry: {...} })");if(c)throw new Error("step: timeout options require a function operation. Direct Promise/Result values cannot be wrapped with timeout after they've started. Wrap your operation in a function: step(() => yourOperation, { timeout: {...} })")}let S={attempts:Math.max(1,k?.attempts??1),backoff:k?.backoff??$.backoff,initialDelay:k?.initialDelay??$.initialDelay,maxDelay:k?.maxDelay??$.maxDelay,jitter:k?.jitter??$.jitter,retryOn:k?.retryOn??$.retryOn,onRetry:k?.onRetry??$.onRetry};u&&y({type:"step_start",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now()});let X;for(let C=1;C<=S.attempts;C++){let xe=R?performance.now():0;try{let f;if(typeof s=="function"?c?f=await Me(s,c,{name:a,key:p,attempt:C}):f=await s():f=await s,f.ok){let B=performance.now()-x;return y({type:"step_success",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:B}),p&&y({type:"step_complete",workflowId:l,stepKey:p,name:a,ts:Date.now(),durationMs:B,result:f}),f.value}if(X=f,C<S.attempts&&S.retryOn(f.error,C)){let B=ne(C,S);y({type:"step_retry",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),attempt:C+1,maxAttempts:S.attempts,delayMs:B,error:f.error}),S.onRetry(f.error,C,B),await re(B);continue}S.attempts>1&&y({type:"step_retries_exhausted",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:performance.now()-x,attempts:C,lastError:f.error});break}catch(f){let B=performance.now()-xe;if(Y(f))throw y({type:"step_aborted",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:B}),f;if(se(f)){let U=_e(f),Z=c?.ms??U?.timeoutMs??0;if(y({type:"step_timeout",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),timeoutMs:Z,attempt:C}),C<S.attempts&&S.retryOn(f,C)){let ee=ne(C,S);y({type:"step_retry",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),attempt:C+1,maxAttempts:S.attempts,delayMs:ee,error:f}),S.onRetry(f,C,ee),await re(ee);continue}S.attempts>1&&y({type:"step_retries_exhausted",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:performance.now()-x,attempts:C,lastError:f})}if(C<S.attempts&&S.retryOn(f,C)){let U=ne(C,S);y({type:"step_retry",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),attempt:C+1,maxAttempts:S.attempts,delayMs:U,error:f}),S.onRetry(f,C,U),await re(U);continue}S.attempts>1&&!se(f)&&y({type:"step_retries_exhausted",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:performance.now()-x,attempts:C,lastError:f});let z=performance.now()-x;if(d){let U;try{U=d(f)}catch(Z){throw Ie(Z)}throw y({type:"step_error",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:z,error:U}),p&&y({type:"step_complete",workflowId:l,stepKey:p,name:a,ts:Date.now(),durationMs:z,result:_(U,{cause:f}),meta:{origin:"throw",thrown:f}}),n?.(U,a,T),K(U,{origin:"throw",thrown:f})}else{let U={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:f}};throw y({type:"step_error",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:z,error:U}),p&&y({type:"step_complete",workflowId:l,stepKey:p,name:a,ts:Date.now(),durationMs:z,result:_(U,{cause:f}),meta:{origin:"throw",thrown:f}}),f}}}let j=X,L=performance.now()-x,Q=w(j.error,{origin:"result",resultCause:j.cause});throw y({type:"step_error",workflowId:l,stepId:E,stepKey:p,name:a,ts:Date.now(),durationMs:L,error:Q}),p&&y({type:"step_complete",workflowId:l,stepKey:p,name:a,ts:Date.now(),durationMs:L,result:j,meta:{origin:"result",resultCause:j.cause}}),n?.(j.error,a,T),K(j.error,{origin:"result",resultCause:j.cause})})();r.try=(s,o)=>{let i=o.name,a=o.key,p=q(a),k="error"in o?()=>o.error:o.onError,c=u;return(async()=>{let E=c?performance.now():0;u&&y({type:"step_start",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now()});try{let R=await s(),x=performance.now()-E;return y({type:"step_success",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now(),durationMs:x}),a&&y({type:"step_complete",workflowId:l,stepKey:a,name:i,ts:Date.now(),durationMs:x,result:F(R)}),R}catch(R){let x=k(R),M=performance.now()-E,W=w(x,{origin:"throw",thrown:R});throw y({type:"step_error",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now(),durationMs:M,error:W}),a&&y({type:"step_complete",workflowId:l,stepKey:a,name:i,ts:Date.now(),durationMs:M,result:_(x,{cause:R}),meta:{origin:"throw",thrown:R}}),n?.(x,i,T),K(x,{origin:"throw",thrown:R})}})()},r.fromResult=(s,o)=>{let i=o.name,a=o.key,p=q(a),k="error"in o?()=>o.error:o.onError,c=u;return(async()=>{let E=c?performance.now():0;u&&y({type:"step_start",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now()});let R=await s();if(R.ok){let x=performance.now()-E;return y({type:"step_success",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now(),durationMs:x}),a&&y({type:"step_complete",workflowId:l,stepKey:a,name:i,ts:Date.now(),durationMs:x,result:F(R.value)}),R.value}else{let x=k(R.error),M=performance.now()-E,W=w(x,{origin:"result",resultCause:R.error});throw y({type:"step_error",workflowId:l,stepId:p,stepKey:a,name:i,ts:Date.now(),durationMs:M,error:W}),a&&y({type:"step_complete",workflowId:l,stepKey:a,name:i,ts:Date.now(),durationMs:M,result:_(x,{cause:R.error}),meta:{origin:"result",resultCause:R.error}}),n?.(x,i,T),K(x,{origin:"result",resultCause:R.error})}})()},r.retry=(s,o)=>r(s,{name:o.name,key:o.key,retry:{attempts:o.attempts,backoff:o.backoff,initialDelay:o.initialDelay,maxDelay:o.maxDelay,jitter:o.jitter,retryOn:o.retryOn,onRetry:o.onRetry},timeout:o.timeout}),r.withTimeout=(s,o)=>r(s,{name:o.name,key:o.key,timeout:o}),r.parallel=((...s)=>{if(typeof s[0]=="string"){let o=s[0],i=s[1];return m(o,i)}else{let o=s[0],i=s[1]??{};return h(o,i)}}),r.race=(s,o)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),p=!1,k={scopeId:i,type:"race",winnerId:void 0};g.push(k);let c=()=>{if(p)return;p=!0;let E=g.findIndex(R=>R.scopeId===i);E!==-1&&g.splice(E,1),y({type:"scope_end",workflowId:l,scopeId:i,ts:Date.now(),durationMs:performance.now()-a,winnerId:k.winnerId})};y({type:"scope_start",workflowId:l,scopeId:i,scopeType:"race",name:s,ts:Date.now()});try{let E=await o();if(c(),!E.ok)throw n?.(E.error,s,T),K(E.error,{origin:"result",resultCause:E.cause});return E.value}catch(E){throw c(),E}})()},r.allSettled=(s,o)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),p=!1;g.push({scopeId:i,type:"allSettled"});let k=()=>{if(p)return;p=!0;let c=g.findIndex(E=>E.scopeId===i);c!==-1&&g.splice(c,1),y({type:"scope_end",workflowId:l,scopeId:i,ts:Date.now(),durationMs:performance.now()-a})};y({type:"scope_start",workflowId:l,scopeId:i,scopeType:"allSettled",name:s,ts:Date.now()});try{let c=await o();if(k(),!c.ok)throw n?.(c.error,s,T),K(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw k(),c}})()};let b=await t(r);return F(b)}catch(r){if(De(r))throw r.thrown;if(Y(r)){let h=r.meta.origin==="throw"?r.meta.thrown:r.meta.resultCause;if(d||n)return _(r.error,{cause:h});if(Oe(r.error))return _(r.error,{cause:h});let D=O(r);return _(D,{cause:h})}if(d){let h=d(r);return n?.(h,"unexpected",T),_(h,{cause:r})}let m={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:r}};return n?.(m,"unexpected",T),_(m,{cause:r})}}oe.strict=(t,e)=>oe(t,e);function We(t){return t.type==="step_complete"}function N(t){return typeof t=="object"&&t!==null&&t.type==="PENDING_APPROVAL"}function ce(t){return typeof t=="object"&&t!==null&&t.type==="APPROVAL_REJECTED"}function de(t,e){return _({type:"PENDING_APPROVAL",stepKey:t,reason:e?.reason,metadata:e?.metadata})}function Ee(t){return async()=>{let e=await t.checkApproval();switch(e.status){case"pending":return _({type:"PENDING_APPROVAL",stepKey:t.key,reason:t.pendingReason,metadata:t.metadata});case"rejected":return _({type:"APPROVAL_REJECTED",stepKey:t.key,reason:e.reason});case"approved":return F(e.value)}}}function we(t,e){return async n=>{if(!(typeof e.requiresApproval=="function"?await e.requiresApproval(n):e.requiresApproval))return t(n);if(e.checkApproval){let A=await e.checkApproval();switch(A.status){case"approved":return t(n);case"rejected":return _({type:"APPROVAL_REJECTED",stepKey:e.key,reason:A.reason});case"pending":break}}let d=typeof e.description=="function"?e.description(n):e.description;return _({type:"PENDING_APPROVAL",stepKey:e.key,reason:d,metadata:{...e.metadata,pendingArgs:n,gatedOperation:!0}})}}function G(t,e){let n=new Map(t.steps);return n.set(e.stepKey,{result:F(e.value)}),{steps:n}}function ye(t,e){let n=new Map(t.steps);return n.delete(e),{steps:n}}function me(t,e){let n=t.steps.get(e);return!n||n.result.ok?!1:N(n.result.error)}function fe(t){let e=[];for(let[n,u]of t.steps)!u.result.ok&&N(u.result.error)&&e.push(n);return e}function J(){let t=new Map;return{handleEvent:e=>{We(e)&&t.set(e.stepKey,{result:e.result,meta:e.meta})},getResumeState:()=>({steps:new Map(t)}),clear:()=>t.clear(),hasPendingApprovals:()=>{for(let e of t.values())if(!e.result.ok&&N(e.result.error))return!0;return!1},getPendingApprovals:()=>{let e=[];for(let[n,u]of t)!u.result.ok&&N(u.result.error)&&e.push({stepKey:n,error:u.result.error});return e},injectApproval:(e,n)=>(t.set(e,{result:F(n)}),{steps:new Map(t)})}}function ke(){let t=new Map;return{async getApproval(e){let n=t.get(e);return n?n.expiresAt&&Date.now()>n.expiresAt?{status:"expired",expiredAt:n.expiresAt}:n:{status:"pending"}},async createApproval(e,n){t.set(e,{status:"pending",metadata:n?.metadata,expiresAt:n?.expiresAt})},async grantApproval(e,n,u){t.set(e,{status:"approved",value:n,approvedBy:u?.approvedBy,approvedAt:Date.now()})},async rejectApproval(e,n,u){t.set(e,{status:"rejected",reason:n,rejectedBy:u?.rejectedBy,rejectedAt:Date.now()})},async editApproval(e,n,u,d){t.set(e,{status:"edited",originalValue:n,editedValue:u,editedBy:d?.editedBy,editedAt:Date.now()})},async cancelApproval(e){t.delete(e)},async listPending(e){let n=[];for(let[u,d]of t)d.status==="pending"&&(!e?.prefix||u.startsWith(e.prefix))&&n.push(u);return n}}}function Te(){let t=new Map;return{async save(e){t.set(e.runId,{...e,updatedAt:Date.now()})},async load(e){return t.get(e)},async delete(e){t.delete(e)},async list(e){let n=[];for(let[u,d]of t)if(!(e?.workflowName&&d.workflowName!==e.workflowName)){if(e?.hasPendingApprovals!==void 0){let A=d.pendingApprovals.length>0;if(e.hasPendingApprovals!==A)continue}n.push(u)}return n},async findByPendingApproval(e){let n=[];for(let[u,d]of t)d.pendingApprovals.includes(e)&&n.push(u);return n}}}function ge(t){let{approvalStore:e,workflowStateStore:n,defaultExpirationMs:u=10080*60*1e3,logger:d=()=>{},notificationChannel:A}=t;async function T(w,O,P,v,r){let m=r?.runId??crypto.randomUUID(),h=J(),b=await O({onEvent:h.handleEvent})(v,P),s=h.getPendingApprovals().map(o=>o.stepKey);if(s.length>0){let o={runId:m,workflowName:w,resumeState:h.getResumeState(),pendingApprovals:s,input:v,metadata:r?.metadata,startedAt:Date.now(),updatedAt:Date.now()};await n.save(o);let i,a;!b.ok&&N(b.error)&&(i=b.error.reason,a=b.error.metadata);let p=Date.now()+u;for(let k of s)await e.createApproval(k,{metadata:{...a,runId:m,workflowName:w},expiresAt:p});if(A)for(let k of s)try{let c=h.getPendingApprovals().find(E=>E.stepKey===k);await A.onApprovalNeeded({approvalKey:k,runId:m,workflowName:w,reason:i,metadata:{...r?.metadata,...a},expiresAt:p,summary:i??`Approval needed for ${k}`,pendingArgs:c?.error.metadata})}catch(c){d(`Failed to notify for approval ${k}: ${c}`)}return d(`Workflow ${m} paused, waiting for: ${s.join(", ")}`),{status:"paused",runId:m,pendingApprovals:s,reason:i}}return d(`Workflow ${m} completed`),{status:"completed",result:b}}async function l(w,O,P){let v=await n.load(w);if(!v)throw new Error(`Workflow run not found: ${w}`);for(let s of v.pendingApprovals){let o=await e.getApproval(s);if(o.status==="pending")return{status:"paused",runId:w,pendingApprovals:v.pendingApprovals};if(o.status,o.status==="expired")throw new Error(`Approval ${s} has expired`)}let r=v.resumeState;for(let s of v.pendingApprovals){let o=await e.getApproval(s);o.status==="approved"?r=G(r,{stepKey:s,value:o.value}):o.status==="edited"&&(r=G(r,{stepKey:s,value:o.editedValue}))}let m=J(),D=await O({resumeState:r,onEvent:m.handleEvent})(v.input,P),b=m.getPendingApprovals().map(s=>s.stepKey);if(b.length>0){let s={...v,resumeState:m.getResumeState(),pendingApprovals:b,updatedAt:Date.now()};await n.save(s);for(let i of b)await e.createApproval(i,{metadata:{runId:w,workflowName:v.workflowName},expiresAt:Date.now()+u});d(`Workflow ${w} paused again, waiting for: ${b.join(", ")}`);let o;return!D.ok&&N(D.error)&&(o=D.error.reason),{status:"paused",runId:w,pendingApprovals:b,reason:o}}return await n.delete(w),d(`Workflow ${w} resumed and completed`),{status:"resumed",runId:w,result:D}}async function I(w,O,P){await e.grantApproval(w,O,{approvedBy:P?.approvedBy});let v=Date.now(),r=[];if(P?.autoResume!==!1){let m=await n.findByPendingApproval(w);for(let h of m)r.push(h)}return A?.onApprovalResolved&&await A.onApprovalResolved({approvalKey:w,action:"approved",actorId:P?.approvedBy,resolvedAt:v,value:O}),d(`Approval ${w} granted by ${P?.approvedBy??"unknown"}`),{grantedAt:v,resumedWorkflows:r}}async function g(w,O,P){await e.rejectApproval(w,O,{rejectedBy:P?.rejectedBy}),A?.onApprovalResolved&&await A.onApprovalResolved({approvalKey:w,action:"rejected",actorId:P?.rejectedBy,resolvedAt:Date.now(),reason:O}),d(`Approval ${w} rejected: ${O}`)}async function V(w,O,P,v){await e.editApproval(w,O,P,{editedBy:v?.editedBy});let r=Date.now();return A?.onApprovalResolved&&await A.onApprovalResolved({approvalKey:w,action:"edited",actorId:v?.editedBy,resolvedAt:r,value:P,originalValue:O}),d(`Approval ${w} edited by ${v?.editedBy??"unknown"}`),{editedAt:r}}async function q(w,O){let{intervalMs:P=1e3,maxPolls:v,timeoutMs:r,onPollStart:m,onPollComplete:h}=O??{},D=Date.now(),b=0;for(;;){m?.();let s=await e.getApproval(w);if(h?.(s),s.status!=="pending")return s;if(b++,v!==void 0&&b>=v)return{status:"pending"};if(r!==void 0&&Date.now()-D>=r)return{status:"pending"};await new Promise(o=>setTimeout(o,P))}}async function y(w){return n.load(w)}async function K(w){return n.list({workflowName:w,hasPendingApprovals:!0})}async function Y(w){let O=await n.list(),P=0,v=Date.now()-w;for(let r of O){let m=await n.load(r);m&&m.updatedAt<v&&m.pendingApprovals.length===0&&(await n.delete(r),P++)}return d(`Cleaned up ${P} old workflow states`),P}return{execute:T,resume:l,grantApproval:I,rejectApproval:g,editApproval:V,pollApproval:q,getWorkflowStatus:y,listPendingWorkflows:K,cleanup:Y}}function Re(t){return async e=>{let{key:n,action:u,value:d,originalValue:A,editedValue:T,reason:l,actorId:I}=e;try{switch(u){case"approve":return await t.grantApproval(n,d,{approvedBy:I}),{success:!0,message:`Approval ${n} granted`,data:{key:n,action:u,timestamp:Date.now()}};case"reject":return l?(await t.rejectApproval(n,l,{rejectedBy:I}),{success:!0,message:`Approval ${n} rejected`,data:{key:n,action:u,timestamp:Date.now()}}):{success:!1,message:"Reason is required for rejection"};case"edit":return A===void 0||T===void 0?{success:!1,message:"Both originalValue and editedValue are required for edit"}:(await t.editApproval(n,A,T,{editedBy:I}),{success:!0,message:`Approval ${n} edited`,data:{key:n,action:u,timestamp:Date.now()}});case"cancel":return await t.cancelApproval(n),{success:!0,message:`Approval ${n} cancelled`,data:{key:n,action:u,timestamp:Date.now()}};default:return{success:!1,message:`Unknown action: ${u}`}}}catch(g){return{success:!1,message:g instanceof Error?g.message:String(g)}}}}function Ce(t){return e=>async()=>{let n=await t.getApproval(e);switch(n.status){case"pending":return{status:"pending"};case"approved":return{status:"approved",value:n.value};case"edited":return{status:"approved",value:n.editedValue};case"rejected":return{status:"rejected",reason:n.reason};case"expired":return{status:"rejected",reason:"Approval request expired"};default:return{status:"pending"}}}}0&&(module.exports={clearStep,createApprovalChecker,createApprovalStateCollector,createApprovalStep,createApprovalWebhookHandler,createHITLOrchestrator,createMemoryApprovalStore,createMemoryWorkflowStateStore,gatedStep,getPendingApprovals,hasPendingApproval,injectApproval,isApprovalRejected,isPendingApproval,pendingApproval});
|
|
2
2
|
//# sourceMappingURL=hitl.cjs.map
|