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.
Files changed (56) hide show
  1. package/README.md +21 -21
  2. package/dist/batch.d.cts +1 -1
  3. package/dist/batch.d.ts +1 -1
  4. package/dist/circuit-breaker.d.cts +1 -1
  5. package/dist/circuit-breaker.d.ts +1 -1
  6. package/dist/conditional.d.cts +1 -1
  7. package/dist/conditional.d.ts +1 -1
  8. package/dist/{core-jqO_iCuZ.d.cts → core-C43KM7p0.d.cts} +1 -1
  9. package/dist/{core-jqO_iCuZ.d.ts → core-C43KM7p0.d.ts} +1 -1
  10. package/dist/core.d.cts +1 -1
  11. package/dist/core.d.ts +1 -1
  12. package/dist/devtools.d.cts +1 -1
  13. package/dist/devtools.d.ts +1 -1
  14. package/dist/hitl.cjs +1 -1
  15. package/dist/hitl.cjs.map +1 -1
  16. package/dist/hitl.d.cts +3 -3
  17. package/dist/hitl.d.ts +3 -3
  18. package/dist/hitl.js +1 -1
  19. package/dist/hitl.js.map +1 -1
  20. package/dist/index.cjs +1 -1
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.js +1 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/otel.d.cts +1 -1
  27. package/dist/otel.d.ts +1 -1
  28. package/dist/persistence.cjs.map +1 -1
  29. package/dist/persistence.d.cts +4 -4
  30. package/dist/persistence.d.ts +4 -4
  31. package/dist/persistence.js.map +1 -1
  32. package/dist/policies.d.cts +1 -1
  33. package/dist/policies.d.ts +1 -1
  34. package/dist/ratelimit.d.cts +1 -1
  35. package/dist/ratelimit.d.ts +1 -1
  36. package/dist/reliability.d.cts +1 -1
  37. package/dist/reliability.d.ts +1 -1
  38. package/dist/resource.d.cts +1 -1
  39. package/dist/resource.d.ts +1 -1
  40. package/dist/saga.d.cts +1 -1
  41. package/dist/saga.d.ts +1 -1
  42. package/dist/testing.d.cts +2 -2
  43. package/dist/testing.d.ts +2 -2
  44. package/dist/visualize.d.cts +1 -1
  45. package/dist/visualize.d.ts +1 -1
  46. package/dist/webhook.d.cts +2 -2
  47. package/dist/webhook.d.ts +2 -2
  48. package/dist/{workflow-C_8aXXoo.d.ts → workflow-48TtU_mC.d.ts} +28 -24
  49. package/dist/{workflow-eAUZnVPR.d.cts → workflow-DKKBFlaH.d.cts} +28 -24
  50. package/dist/workflow.cjs +1 -1
  51. package/dist/workflow.cjs.map +1 -1
  52. package/dist/workflow.d.cts +2 -2
  53. package/dist/workflow.d.ts +2 -2
  54. package/dist/workflow.js +1 -1
  55. package/dist/workflow.js.map +1 -1
  56. 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, createStepCollector } from 'awaitly/workflow';
256
+ import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
257
257
 
258
258
  // Create a collector to automatically capture step results
259
- const collector = createStepCollector();
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.getState(); // Returns ResumeState
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, createStepCollector } from 'awaitly/workflow';
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 = createStepCollector();
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.getState();
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 = createStepCollector();
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.getState(), { userId: 'user-1' });
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, createStepCollector } from 'awaitly/workflow';
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 = createStepCollector();
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.getState();
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, createStepCollector } from 'awaitly/workflow';
829
+ import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
830
830
 
831
831
  // Collect state during execution
832
- const collector = createStepCollector();
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.getState();
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, createStepCollector } from 'awaitly/workflow';
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 = createStepCollector();
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.getState();
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/workflow';
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 only
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, run, Duration, createStepCollector, isStepComplete } from 'awaitly/workflow';
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
@@ -1,4 +1,4 @@
1
- import { A as AsyncResult } from './core-jqO_iCuZ.cjs';
1
+ import { A as AsyncResult } from './core-C43KM7p0.cjs';
2
2
 
3
3
  /**
4
4
  * awaitly/batch
package/dist/batch.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as AsyncResult } from './core-jqO_iCuZ.js';
1
+ import { A as AsyncResult } from './core-C43KM7p0.js';
2
2
 
3
3
  /**
4
4
  * awaitly/batch
@@ -1,4 +1,4 @@
1
- import { R as Result, A as AsyncResult } from './core-jqO_iCuZ.cjs';
1
+ import { R as Result, A as AsyncResult } from './core-C43KM7p0.cjs';
2
2
 
3
3
  /**
4
4
  * Circuit Breaker for Steps
@@ -1,4 +1,4 @@
1
- import { R as Result, A as AsyncResult } from './core-jqO_iCuZ.js';
1
+ import { R as Result, A as AsyncResult } from './core-C43KM7p0.js';
2
2
 
3
3
  /**
4
4
  * Circuit Breaker for Steps
@@ -1,4 +1,4 @@
1
- import { a3 as WorkflowEvent } from './core-jqO_iCuZ.cjs';
1
+ import { W as WorkflowEvent } from './core-C43KM7p0.cjs';
2
2
 
3
3
  /**
4
4
  * awaitly/conditional
@@ -1,4 +1,4 @@
1
- import { a3 as WorkflowEvent } from './core-jqO_iCuZ.js';
1
+ import { W as WorkflowEvent } from './core-C43KM7p0.js';
2
2
 
3
3
  /**
4
4
  * awaitly/conditional
@@ -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 { hydrate as $, type AsyncResult as A, tap as B, type CauseOf as C, tapError as D, type Err as E, mapTry as F, mapErrorTry as G, bimap as H, orElse as I, orElseAsync as J, recover as K, recoverAsync as L, type MaybeAsyncResult as M, all as N, type Ok as O, type PromiseRejectedError as P, allAsync as Q, type Result as R, type SettledError as S, allSettled as T, type UnexpectedError as U, allSettledAsync as V, any as W, anyAsync as X, partition as Y, zip as Z, zipAsync as _, type UnexpectedCause as a, isSerializedResult as a0, type RunStep as a1, type StepOptions as a2, type WorkflowEvent as a3, type ScopeType as a4, type RunOptions as a5, type RunOptionsWithCatch as a6, type RunOptionsWithoutCatch as a7, type BackoffStrategy as a8, type RetryOptions as a9, type TimeoutOptions as aa, type StepTimeoutError as ab, type StepTimeoutMarkerMeta as ac, STEP_TIMEOUT_MARKER as ad, isStepTimeoutError as ae, getStepTimeoutMeta as af, run 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, err as j, isOk as k, isErr as l, isUnexpectedError as m, UnwrapError as n, ok as o, unwrapOr as p, unwrapOrElse as q, from as r, fromPromise as s, tryAsync as t, unwrap as u, fromNullable as v, map as w, mapError as x, match as y, andThen as z };
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 { hydrate as $, type AsyncResult as A, tap as B, type CauseOf as C, tapError as D, type Err as E, mapTry as F, mapErrorTry as G, bimap as H, orElse as I, orElseAsync as J, recover as K, recoverAsync as L, type MaybeAsyncResult as M, all as N, type Ok as O, type PromiseRejectedError as P, allAsync as Q, type Result as R, type SettledError as S, allSettled as T, type UnexpectedError as U, allSettledAsync as V, any as W, anyAsync as X, partition as Y, zip as Z, zipAsync as _, type UnexpectedCause as a, isSerializedResult as a0, type RunStep as a1, type StepOptions as a2, type WorkflowEvent as a3, type ScopeType as a4, type RunOptions as a5, type RunOptionsWithCatch as a6, type RunOptionsWithoutCatch as a7, type BackoffStrategy as a8, type RetryOptions as a9, type TimeoutOptions as aa, type StepTimeoutError as ab, type StepTimeoutMarkerMeta as ac, STEP_TIMEOUT_MARKER as ad, isStepTimeoutError as ae, getStepTimeoutMeta as af, run 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, err as j, isOk as k, isErr as l, isUnexpectedError as m, UnwrapError as n, ok as o, unwrapOr as p, unwrapOrElse as q, from as r, fromPromise as s, tryAsync as t, unwrap as u, fromNullable as v, map as w, mapError as x, match as y, andThen as z };
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, S as SettledError, a as UnexpectedCause, U as UnexpectedError, b as UnexpectedStepFailureCause, n as UnwrapError, N as all, Q as allAsync, T as allSettled, V as allSettledAsync, z as andThen, W as any, X as anyAsync, H as bimap, j as err, r as from, v as fromNullable, s as fromPromise, $ as hydrate, l as isErr, k as isOk, a0 as isSerializedResult, m as isUnexpectedError, w as map, x as mapError, G as mapErrorTry, F as mapTry, y as match, o as ok, I as orElse, J as orElseAsync, Y as partition, K as recover, L as recoverAsync, B as tap, D as tapError, t as tryAsync, u as unwrap, p as unwrapOr, q as unwrapOrElse } from './core-jqO_iCuZ.cjs';
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, S as SettledError, a as UnexpectedCause, U as UnexpectedError, b as UnexpectedStepFailureCause, n as UnwrapError, N as all, Q as allAsync, T as allSettled, V as allSettledAsync, z as andThen, W as any, X as anyAsync, H as bimap, j as err, r as from, v as fromNullable, s as fromPromise, $ as hydrate, l as isErr, k as isOk, a0 as isSerializedResult, m as isUnexpectedError, w as map, x as mapError, G as mapErrorTry, F as mapTry, y as match, o as ok, I as orElse, J as orElseAsync, Y as partition, K as recover, L as recoverAsync, B as tap, D as tapError, t as tryAsync, u as unwrap, p as unwrapOr, q as unwrapOrElse } from './core-jqO_iCuZ.js';
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';
@@ -1,4 +1,4 @@
1
- import { a3 as WorkflowEvent } from './core-jqO_iCuZ.cjs';
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
  /**
@@ -1,4 +1,4 @@
1
- import { a3 as WorkflowEvent } from './core-jqO_iCuZ.js';
1
+ import { W as WorkflowEvent } from './core-C43KM7p0.js';
2
2
  import { CollectableEvent, VisualizerOptions, DecisionStartEvent, DecisionBranchEvent, DecisionEndEvent, OutputFormat } from './visualize.js';
3
3
 
4
4
  /**
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