@jagreehal/workflow 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.
@@ -165,7 +165,9 @@ type AnyResultFn = (...args: any[]) => Result<any, any, any> | Promise<Result<an
165
165
  * Example: ErrorsOfDeps<{ fetchUser: typeof fetchUser, fetchPosts: typeof fetchPosts }>
166
166
  * yields: 'NOT_FOUND' | 'FETCH_ERROR'
167
167
  */
168
- type ErrorsOfDeps<Deps extends Record<string, AnyResultFn>> = ErrorOf<Deps[keyof Deps]>;
168
+ type ErrorsOfDeps<Deps extends Record<string, AnyResultFn>> = {
169
+ [K in keyof Deps]: ErrorOf<Deps[K]>;
170
+ }[keyof Deps];
169
171
  /**
170
172
  * Extract union of cause types from a deps object.
171
173
  * Example: CausesOfDeps<{ fetchUser: typeof fetchUser }> where fetchUser returns Result<User, "NOT_FOUND", Error>
@@ -165,7 +165,9 @@ type AnyResultFn = (...args: any[]) => Result<any, any, any> | Promise<Result<an
165
165
  * Example: ErrorsOfDeps<{ fetchUser: typeof fetchUser, fetchPosts: typeof fetchPosts }>
166
166
  * yields: 'NOT_FOUND' | 'FETCH_ERROR'
167
167
  */
168
- type ErrorsOfDeps<Deps extends Record<string, AnyResultFn>> = ErrorOf<Deps[keyof Deps]>;
168
+ type ErrorsOfDeps<Deps extends Record<string, AnyResultFn>> = {
169
+ [K in keyof Deps]: ErrorOf<Deps[K]>;
170
+ }[keyof Deps];
169
171
  /**
170
172
  * Extract union of cause types from a deps object.
171
173
  * Example: CausesOfDeps<{ fetchUser: typeof fetchUser }> where fetchUser returns Result<User, "NOT_FOUND", Error>
package/dist/workflow.js CHANGED
@@ -1,2 +1,2 @@
1
- var v=e=>({ok:!0,value:e}),x=(e,s)=>({ok:!1,error:e,...s?.cause!==void 0?{cause:s.cause}:{}});var Y=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",L=Symbol("early-exit");function M(e,s){return{[L]:!0,error:e,meta:s}}function K(e){return typeof e=="object"&&e!==null&&e[L]===!0}var X=Symbol("mapper-exception");function $(e){return{[X]:!0,thrown:e}}function q(e){return typeof e=="object"&&e!==null&&e[X]===!0}function B(e){return typeof e=="string"?{name:e}:e??{}}async function O(e,s){let{onError:l,onEvent:T,catchUnexpected:h,workflowId:U,context:W}=s&&typeof s=="object"?s:{},E=U??crypto.randomUUID(),g=!l&&!h,m=[],A=0,D=u=>u??`step_${++A}`,y=u=>{if(u.type==="step_success"){let C=u.stepId;for(let p=m.length-1;p>=0;p--){let c=m[p];if(c.type==="race"&&!c.winnerId){c.winnerId=C;break}}}T?.(u,W)},S=M,k=u=>K(u),I=(u,C)=>g?C?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:u,...C.resultCause!==void 0?{cause:C.resultCause}:{}}}:C?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:u,thrown:C.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:u}}:u,b=u=>u.origin==="result"?u.resultCause:u.thrown,F=u=>({type:"UNEXPECTED_ERROR",cause:u.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:u.error,...u.meta.resultCause!==void 0?{cause:u.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:u.error,thrown:u.meta.thrown}});try{let u=(c,w)=>(async()=>{let{name:r,key:o}=B(w),t=D(o),n=T?performance.now():0;T&&y({type:"step_start",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now()});let a;try{a=await(typeof c=="function"?c():c)}catch(R){let P=performance.now()-n;if(k(R))throw y({type:"step_aborted",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now(),durationMs:P}),R;if(h){let _;try{_=h(R)}catch(G){throw $(G)}throw y({type:"step_error",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now(),durationMs:P,error:_}),o&&y({type:"step_complete",workflowId:E,stepKey:o,name:r,ts:Date.now(),durationMs:P,result:x(_,{cause:R}),meta:{origin:"throw",thrown:R}}),l?.(_,r),S(_,{origin:"throw",thrown:R})}else{let _={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:R}};throw y({type:"step_error",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now(),durationMs:P,error:_}),o&&y({type:"step_complete",workflowId:E,stepKey:o,name:r,ts:Date.now(),durationMs:P,result:x(_,{cause:R}),meta:{origin:"throw",thrown:R}}),R}}let d=performance.now()-n;if(a.ok)return y({type:"step_success",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now(),durationMs:d}),o&&y({type:"step_complete",workflowId:E,stepKey:o,name:r,ts:Date.now(),durationMs:d,result:a}),a.value;let f=I(a.error,{origin:"result",resultCause:a.cause});throw y({type:"step_error",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now(),durationMs:d,error:f}),o&&y({type:"step_complete",workflowId:E,stepKey:o,name:r,ts:Date.now(),durationMs:d,result:a,meta:{origin:"result",resultCause:a.cause}}),l?.(a.error,r),S(a.error,{origin:"result",resultCause:a.cause})})();u.try=(c,w)=>{let r=w.name,o=w.key,t=D(o),i="error"in w?()=>w.error:w.onError,n=T;return(async()=>{let a=n?performance.now():0;T&&y({type:"step_start",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now()});try{let d=await c(),f=performance.now()-a;return y({type:"step_success",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now(),durationMs:f}),o&&y({type:"step_complete",workflowId:E,stepKey:o,name:r,ts:Date.now(),durationMs:f,result:v(d)}),d}catch(d){let f=i(d),R=performance.now()-a,P=I(f,{origin:"throw",thrown:d});throw y({type:"step_error",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now(),durationMs:R,error:P}),o&&y({type:"step_complete",workflowId:E,stepKey:o,name:r,ts:Date.now(),durationMs:R,result:x(f,{cause:d}),meta:{origin:"throw",thrown:d}}),l?.(f,r),S(f,{origin:"throw",thrown:d})}})()},u.fromResult=(c,w)=>{let r=w.name,o=w.key,t=D(o),i="error"in w?()=>w.error:w.onError,n=T;return(async()=>{let a=n?performance.now():0;T&&y({type:"step_start",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now()});let d=await c();if(d.ok){let f=performance.now()-a;return y({type:"step_success",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now(),durationMs:f}),o&&y({type:"step_complete",workflowId:E,stepKey:o,name:r,ts:Date.now(),durationMs:f,result:v(d.value)}),d.value}else{let f=i(d.error),R=performance.now()-a,P=I(f,{origin:"result",resultCause:d.error});throw y({type:"step_error",workflowId:E,stepId:t,stepKey:o,name:r,ts:Date.now(),durationMs:R,error:P}),o&&y({type:"step_complete",workflowId:E,stepKey:o,name:r,ts:Date.now(),durationMs:R,result:x(f,{cause:d.error}),meta:{origin:"result",resultCause:d.error}}),l?.(f,r),S(f,{origin:"result",resultCause:d.error})}})()},u.parallel=(c,w)=>{let r=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1;m.push({scopeId:r,type:"parallel"});let i=()=>{if(t)return;t=!0;let n=m.findIndex(a=>a.scopeId===r);n!==-1&&m.splice(n,1),y({type:"scope_end",workflowId:E,scopeId:r,ts:Date.now(),durationMs:performance.now()-o})};y({type:"scope_start",workflowId:E,scopeId:r,scopeType:"parallel",name:c,ts:Date.now()});try{let n=await w();if(i(),!n.ok)throw l?.(n.error,c),S(n.error,{origin:"result",resultCause:n.cause});return n.value}catch(n){throw i(),n}})()},u.race=(c,w)=>{let r=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1,i={scopeId:r,type:"race",winnerId:void 0};m.push(i);let n=()=>{if(t)return;t=!0;let a=m.findIndex(d=>d.scopeId===r);a!==-1&&m.splice(a,1),y({type:"scope_end",workflowId:E,scopeId:r,ts:Date.now(),durationMs:performance.now()-o,winnerId:i.winnerId})};y({type:"scope_start",workflowId:E,scopeId:r,scopeType:"race",name:c,ts:Date.now()});try{let a=await w();if(n(),!a.ok)throw l?.(a.error,c),S(a.error,{origin:"result",resultCause:a.cause});return a.value}catch(a){throw n(),a}})()},u.allSettled=(c,w)=>{let r=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1;m.push({scopeId:r,type:"allSettled"});let i=()=>{if(t)return;t=!0;let n=m.findIndex(a=>a.scopeId===r);n!==-1&&m.splice(n,1),y({type:"scope_end",workflowId:E,scopeId:r,ts:Date.now(),durationMs:performance.now()-o})};y({type:"scope_start",workflowId:E,scopeId:r,scopeType:"allSettled",name:c,ts:Date.now()});try{let n=await w();if(i(),!n.ok)throw l?.(n.error,c),S(n.error,{origin:"result",resultCause:n.cause});return n.value}catch(n){throw i(),n}})()};let p=await e(u);return v(p)}catch(u){if(q(u))throw u.thrown;if(k(u)){let p=b(u.meta);if(h||l)return x(u.error,{cause:p});if(Y(u.error))return x(u.error,{cause:p});let c=F(u);return x(c,{cause:p})}if(h){let p=h(u);return l?.(p,"unexpected"),x(p,{cause:u})}let C={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:u}};return l?.(C,"unexpected"),x(C,{cause:u})}}O.strict=(e,s)=>O(e,s);function Z(){let e=new Map;return{handleEvent:s=>{J(s)&&e.set(s.stepKey,{result:s.result,meta:s.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function H(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function N(e,s,l){return x(e,{cause:{__cachedMeta:!0,originalCause:l,meta:s}})}function V(e){return H(e)?e.meta:{origin:"result",resultCause:e}}function ee(e,s){async function l(T,h){let U=typeof h=="function",W=U?T:void 0,E=U?h:T,g=crypto.randomUUID(),m=s?.createContext?.(),A=p=>{s?.onEvent?.(p,m)},D=Date.now(),y=performance.now();A({type:"workflow_start",workflowId:g,ts:D});let S=s?.resumeState,k=s?.cache;if(S&&!k&&(k=new Map),S&&k){let p=typeof S=="function"?await S():S;for(let[c,w]of p.steps){let{result:r,meta:o}=w;if(r.ok)k.set(c,r);else{let t=o??{origin:"result",resultCause:r.cause};k.set(c,N(r.error,t,r.cause))}}}let I=p=>typeof p=="string"?{name:p}:p??{},b=p=>{if(!k)return p;let c=async(w,r)=>{let{name:o,key:t}=I(r);if(t&&k.has(t)){A({type:"step_cache_hit",workflowId:g,stepKey:t,name:o,ts:Date.now()});let n=k.get(t);if(n.ok)return n.value;let a=V(n.cause);throw M(n.error,a)}t&&A({type:"step_cache_miss",workflowId:g,stepKey:t,name:o,ts:Date.now()});let i=typeof w=="function"?w:()=>w;try{let n=await p(i,r);return t&&k.set(t,v(n)),n}catch(n){if(t&&K(n)){let a=n,d=a.meta.origin==="result"?a.meta.resultCause:a.meta.thrown;k.set(t,N(a.error,a.meta,d))}throw n}};return c.try=async(w,r)=>{let{name:o,key:t}=r;if(t&&k.has(t)){A({type:"step_cache_hit",workflowId:g,stepKey:t,name:o,ts:Date.now()});let i=k.get(t);if(i.ok)return i.value;let n=V(i.cause);throw M(i.error,n)}t&&A({type:"step_cache_miss",workflowId:g,stepKey:t,name:o,ts:Date.now()});try{let i=await p.try(w,r);return t&&k.set(t,v(i)),i}catch(i){if(t&&K(i)){let n=i,a=n.meta.origin==="result"?n.meta.resultCause:n.meta.thrown;k.set(t,N(n.error,n.meta,a))}throw i}},c.fromResult=async(w,r)=>{let{name:o,key:t}=r;if(t&&k.has(t)){A({type:"step_cache_hit",workflowId:g,stepKey:t,name:o,ts:Date.now()});let i=k.get(t);if(i.ok)return i.value;let n=V(i.cause);throw M(i.error,n)}t&&A({type:"step_cache_miss",workflowId:g,stepKey:t,name:o,ts:Date.now()});try{let i=await p.fromResult(w,r);return t&&k.set(t,v(i)),i}catch(i){if(t&&K(i)){let n=i,a=n.meta.origin==="result"?n.meta.resultCause:n.meta.thrown;k.set(t,N(n.error,n.meta,a))}throw i}},c.parallel=p.parallel,c.race=p.race,c.allSettled=p.allSettled,c},F=U?p=>E(b(p),e,W):p=>E(b(p),e),u;if(s?.strict===!0){let p=s;u=await O.strict(F,{onError:p.onError,onEvent:p.onEvent,catchUnexpected:p.catchUnexpected,workflowId:g,context:m})}else{let p=s;u=await O(F,{onError:p?.onError??(()=>{}),onEvent:p?.onEvent,workflowId:g,context:m})}let C=performance.now()-y;return u.ok?A({type:"workflow_success",workflowId:g,ts:Date.now(),durationMs:C}):A({type:"workflow_error",workflowId:g,ts:Date.now(),durationMs:C,error:u.error}),u}return l}function J(e){return e.type==="step_complete"}function j(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_APPROVAL"}function ne(e){return typeof e=="object"&&e!==null&&e.type==="APPROVAL_REJECTED"}function te(e,s){return x({type:"PENDING_APPROVAL",stepKey:e,reason:s?.reason,metadata:s?.metadata})}function re(e){return async()=>{let s=await e.checkApproval();switch(s.status){case"pending":return x({type:"PENDING_APPROVAL",stepKey:e.key,reason:e.pendingReason,metadata:e.metadata});case"rejected":return x({type:"APPROVAL_REJECTED",stepKey:e.key,reason:s.reason});case"approved":return v(s.value)}}}function se(e,s){let l=new Map(e.steps);return l.set(s.stepKey,{result:v(s.value)}),{steps:l}}function oe(e,s){let l=new Map(e.steps);return l.delete(s),{steps:l}}function ue(e,s){let l=e.steps.get(s);return!l||l.result.ok?!1:j(l.result.error)}function ae(e){let s=[];for(let[l,T]of e.steps)!T.result.ok&&j(T.result.error)&&s.push(l);return s}function pe(){let e=new Map;return{handleEvent:s=>{J(s)&&e.set(s.stepKey,{result:s.result,meta:s.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear(),hasPendingApprovals:()=>{for(let s of e.values())if(!s.result.ok&&j(s.result.error))return!0;return!1},getPendingApprovals:()=>{let s=[];for(let[l,T]of e)!T.result.ok&&j(T.result.error)&&s.push({stepKey:l,error:T.result.error});return s},injectApproval:(s,l)=>(e.set(s,{result:v(l)}),{steps:new Map(e)})}}export{oe as clearStep,re as createApprovalStep,pe as createHITLCollector,Z as createStepCollector,ee as createWorkflow,ae as getPendingApprovals,ue as hasPendingApproval,se as injectApproval,ne as isApprovalRejected,j as isPendingApproval,J as isStepComplete,te as pendingApproval};
1
+ var O=e=>({ok:!0,value:e}),P=(e,n)=>({ok:!1,error:e,...n?.cause!==void 0?{cause:n.cause}:{}});var ie=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",j=Symbol.for("step_timeout_marker");function ne(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:j in e}function ce(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let n=e;return{timeoutMs:n.timeoutMs,stepName:n.stepName,stepKey:n.stepKey,attempt:n.attempt}}if(j in e)return e[j]}}var se=Symbol("early-exit");function V(e,n){return{[se]:!0,error:e,meta:n}}function L(e){return typeof e=="object"&&e!==null&&e[se]===!0}var oe=Symbol("mapper-exception");function le(e){return{[oe]:!0,thrown:e}}function Ee(e){return typeof e=="object"&&e!==null&&e[oe]===!0}function ye(e){return typeof e=="string"?{name:e}:e??{}}function z(e,n){let{backoff:E,initialDelay:d,maxDelay:_,jitter:b}=n,g;switch(E){case"fixed":g=d;break;case"linear":g=d*e;break;case"exponential":g=d*Math.pow(2,e-1);break}if(g=Math.min(g,_),b){let c=g*.25*Math.random();g=g+c}return Math.floor(g)}function Q(e){return new Promise(n=>setTimeout(n,e))}var re=Symbol("timeout");async function me(e,n,E){let d=new AbortController,_=n.error??{type:"STEP_TIMEOUT",stepName:E.name,stepKey:E.key,timeoutMs:n.ms,attempt:E.attempt},b,g=new Promise((S,T)=>{b=setTimeout(()=>{d.abort(),T({[re]:!0,error:_})},n.ms)}),c;n.signal?c=Promise.resolve(e(d.signal)):c=Promise.resolve(e());try{return await Promise.race([c,g])}catch(S){if(typeof S=="object"&&S!==null&&S[re]===!0){let T=S.error;if(typeof T=="object"&&T!==null&&T.type!=="STEP_TIMEOUT"){let A={timeoutMs:n.ms,stepName:E.name,stepKey:E.key,attempt:E.attempt};j in T?T[j]=A:Object.defineProperty(T,j,{value:A,enumerable:!1,writable:!0,configurable:!1})}throw T}throw S}finally{clearTimeout(b)}}var K={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function W(e,n){let{onError:E,onEvent:d,catchUnexpected:_,workflowId:b,context:g}=n&&typeof n=="object"?n:{},c=b??crypto.randomUUID(),S=!E&&!_,T=[],A=0,F=u=>u??`step_${++A}`,m=u=>{if(u.type==="step_success"){let v=u.stepId;for(let y=T.length-1;y>=0;y--){let l=T[y];if(l.type==="race"&&!l.winnerId){l.winnerId=v;break}}}d?.(u,g)},D=V,C=u=>L(u),N=(u,v)=>S?v?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:u,...v.resultCause!==void 0?{cause:v.resultCause}:{}}}:v?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:u,thrown:v.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:u}}:u,X=u=>u.origin==="result"?u.resultCause:u.thrown,G=u=>({type:"UNEXPECTED_ERROR",cause:u.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:u.error,...u.meta.resultCause!==void 0?{cause:u.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:u.error,thrown:u.meta.thrown}});try{let u=(l,a)=>(async()=>{let s=ye(a),{name:o,key:t,retry:p,timeout:r}=s,i=F(t),f=d,k=f?performance.now():0;if(!(typeof l=="function")){if(p&&p.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(r)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 x={attempts:Math.max(1,p?.attempts??1),backoff:p?.backoff??K.backoff,initialDelay:p?.initialDelay??K.initialDelay,maxDelay:p?.maxDelay??K.maxDelay,jitter:p?.jitter??K.jitter,retryOn:p?.retryOn??K.retryOn,onRetry:p?.onRetry??K.onRetry};d&&m({type:"step_start",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now()});let ee;for(let R=1;R<=x.attempts;R++){let pe=f?performance.now():0;try{let w;if(typeof l=="function"?r?w=await me(l,r,{name:o,key:t,attempt:R}):w=await l():w=await l,w.ok){let M=performance.now()-k;return m({type:"step_success",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:M}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:M,result:w}),w.value}if(ee=w,R<x.attempts&&x.retryOn(w.error,R)){let M=z(R,x);m({type:"step_retry",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:M,error:w.error}),x.onRetry(w.error,R,M),await Q(M);continue}x.attempts>1&&m({type:"step_retries_exhausted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w.error});break}catch(w){let M=performance.now()-pe;if(C(w))throw m({type:"step_aborted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:M}),w;if(ne(w)){let h=ce(w),$=r?.ms??h?.timeoutMs??0;if(m({type:"step_timeout",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),timeoutMs:$,attempt:R}),R<x.attempts&&x.retryOn(w,R)){let H=z(R,x);m({type:"step_retry",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:H,error:w}),x.onRetry(w,R,H),await Q(H);continue}x.attempts>1&&m({type:"step_retries_exhausted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w})}if(R<x.attempts&&x.retryOn(w,R)){let h=z(R,x);m({type:"step_retry",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:h,error:w}),x.onRetry(w,R,h),await Q(h);continue}x.attempts>1&&!ne(w)&&m({type:"step_retries_exhausted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w});let Y=performance.now()-k;if(_){let h;try{h=_(w)}catch($){throw le($)}throw m({type:"step_error",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:Y,error:h}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:Y,result:P(h,{cause:w}),meta:{origin:"throw",thrown:w}}),E?.(h,o),D(h,{origin:"throw",thrown:w})}else{let h={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:w}};throw m({type:"step_error",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:Y,error:h}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:Y,result:P(h,{cause:w}),meta:{origin:"throw",thrown:w}}),w}}}let U=ee,te=performance.now()-k,ae=N(U.error,{origin:"result",resultCause:U.cause});throw m({type:"step_error",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:te,error:ae}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:te,result:U,meta:{origin:"result",resultCause:U.cause}}),E?.(U.error,o),D(U.error,{origin:"result",resultCause:U.cause})})();u.try=(l,a)=>{let s=a.name,o=a.key,t=F(o),p="error"in a?()=>a.error:a.onError,r=d;return(async()=>{let i=r?performance.now():0;d&&m({type:"step_start",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now()});try{let f=await l(),k=performance.now()-i;return m({type:"step_success",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:k}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:k,result:O(f)}),f}catch(f){let k=p(f),I=performance.now()-i,J=N(k,{origin:"throw",thrown:f});throw m({type:"step_error",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:I,error:J}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:I,result:P(k,{cause:f}),meta:{origin:"throw",thrown:f}}),E?.(k,s),D(k,{origin:"throw",thrown:f})}})()},u.fromResult=(l,a)=>{let s=a.name,o=a.key,t=F(o),p="error"in a?()=>a.error:a.onError,r=d;return(async()=>{let i=r?performance.now():0;d&&m({type:"step_start",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now()});let f=await l();if(f.ok){let k=performance.now()-i;return m({type:"step_success",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:k}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:k,result:O(f.value)}),f.value}else{let k=p(f.error),I=performance.now()-i,J=N(k,{origin:"result",resultCause:f.error});throw m({type:"step_error",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:I,error:J}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:I,result:P(k,{cause:f.error}),meta:{origin:"result",resultCause:f.error}}),E?.(k,s),D(k,{origin:"result",resultCause:f.error})}})()},u.retry=(l,a)=>u(l,{name:a.name,key:a.key,retry:{attempts:a.attempts,backoff:a.backoff,initialDelay:a.initialDelay,maxDelay:a.maxDelay,jitter:a.jitter,retryOn:a.retryOn,onRetry:a.onRetry},timeout:a.timeout}),u.withTimeout=(l,a)=>u(l,{name:a.name,key:a.key,timeout:a}),u.parallel=(l,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1;T.push({scopeId:s,type:"parallel"});let p=()=>{if(t)return;t=!0;let r=T.findIndex(i=>i.scopeId===s);r!==-1&&T.splice(r,1),m({type:"scope_end",workflowId:c,scopeId:s,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:c,scopeId:s,scopeType:"parallel",name:l,ts:Date.now()});try{let r=await a();if(p(),!r.ok)throw E?.(r.error,l),D(r.error,{origin:"result",resultCause:r.cause});return r.value}catch(r){throw p(),r}})()},u.race=(l,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1,p={scopeId:s,type:"race",winnerId:void 0};T.push(p);let r=()=>{if(t)return;t=!0;let i=T.findIndex(f=>f.scopeId===s);i!==-1&&T.splice(i,1),m({type:"scope_end",workflowId:c,scopeId:s,ts:Date.now(),durationMs:performance.now()-o,winnerId:p.winnerId})};m({type:"scope_start",workflowId:c,scopeId:s,scopeType:"race",name:l,ts:Date.now()});try{let i=await a();if(r(),!i.ok)throw E?.(i.error,l),D(i.error,{origin:"result",resultCause:i.cause});return i.value}catch(i){throw r(),i}})()},u.allSettled=(l,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1;T.push({scopeId:s,type:"allSettled"});let p=()=>{if(t)return;t=!0;let r=T.findIndex(i=>i.scopeId===s);r!==-1&&T.splice(r,1),m({type:"scope_end",workflowId:c,scopeId:s,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:c,scopeId:s,scopeType:"allSettled",name:l,ts:Date.now()});try{let r=await a();if(p(),!r.ok)throw E?.(r.error,l),D(r.error,{origin:"result",resultCause:r.cause});return r.value}catch(r){throw p(),r}})()};let y=await e(u);return O(y)}catch(u){if(Ee(u))throw u.thrown;if(C(u)){let y=X(u.meta);if(_||E)return P(u.error,{cause:y});if(ie(u.error))return P(u.error,{cause:y});let l=G(u);return P(l,{cause:y})}if(_){let y=_(u);return E?.(y,"unexpected"),P(y,{cause:u})}let v={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:u}};return E?.(v,"unexpected"),P(v,{cause:u})}}W.strict=(e,n)=>W(e,n);function fe(){let e=new Map;return{handleEvent:n=>{ue(n)&&e.set(n.stepKey,{result:n.result,meta:n.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function we(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function B(e,n,E){return P(e,{cause:{__cachedMeta:!0,originalCause:E,meta:n}})}function Z(e){return we(e)?e.meta:{origin:"result",resultCause:e}}function ke(e,n){async function E(d,_){let b=typeof _=="function",g=b?d:void 0,c=b?_:d,S=crypto.randomUUID(),T=n?.createContext?.(),A=y=>{n?.onEvent?.(y,T)},F=Date.now(),m=performance.now();A({type:"workflow_start",workflowId:S,ts:F});let D=n?.resumeState,C=n?.cache;if(D&&!C&&(C=new Map),D&&C){let y=typeof D=="function"?await D():D;for(let[l,a]of y.steps){let{result:s,meta:o}=a;if(s.ok)C.set(l,s);else{let t=o??{origin:"result",resultCause:s.cause};C.set(l,B(s.error,t,s.cause))}}}let N=y=>typeof y=="string"?{name:y}:y??{},X=y=>{if(!C)return y;let l=async(a,s)=>{let{name:o,key:t}=N(s);if(t&&C.has(t)){A({type:"step_cache_hit",workflowId:S,stepKey:t,name:o,ts:Date.now()});let r=C.get(t);if(r.ok)return r.value;let i=Z(r.cause);throw V(r.error,i)}t&&A({type:"step_cache_miss",workflowId:S,stepKey:t,name:o,ts:Date.now()});let p=typeof a=="function"?a:()=>a;try{let r=await y(p,s);return t&&C.set(t,O(r)),r}catch(r){if(t&&L(r)){let i=r,f=i.meta.origin==="result"?i.meta.resultCause:i.meta.thrown;C.set(t,B(i.error,i.meta,f))}throw r}};return l.try=async(a,s)=>{let{name:o,key:t}=s;if(t&&C.has(t)){A({type:"step_cache_hit",workflowId:S,stepKey:t,name:o,ts:Date.now()});let p=C.get(t);if(p.ok)return p.value;let r=Z(p.cause);throw V(p.error,r)}t&&A({type:"step_cache_miss",workflowId:S,stepKey:t,name:o,ts:Date.now()});try{let p=await y.try(a,s);return t&&C.set(t,O(p)),p}catch(p){if(t&&L(p)){let r=p,i=r.meta.origin==="result"?r.meta.resultCause:r.meta.thrown;C.set(t,B(r.error,r.meta,i))}throw p}},l.fromResult=async(a,s)=>{let{name:o,key:t}=s;if(t&&C.has(t)){A({type:"step_cache_hit",workflowId:S,stepKey:t,name:o,ts:Date.now()});let p=C.get(t);if(p.ok)return p.value;let r=Z(p.cause);throw V(p.error,r)}t&&A({type:"step_cache_miss",workflowId:S,stepKey:t,name:o,ts:Date.now()});try{let p=await y.fromResult(a,s);return t&&C.set(t,O(p)),p}catch(p){if(t&&L(p)){let r=p,i=r.meta.origin==="result"?r.meta.resultCause:r.meta.thrown;C.set(t,B(r.error,r.meta,i))}throw p}},l.parallel=y.parallel,l.race=y.race,l.allSettled=y.allSettled,l.retry=(a,s)=>l(a,{name:s.name,key:s.key,retry:{attempts:s.attempts,backoff:s.backoff,initialDelay:s.initialDelay,maxDelay:s.maxDelay,jitter:s.jitter,retryOn:s.retryOn,onRetry:s.onRetry},timeout:s.timeout}),l.withTimeout=(a,s)=>l(a,{name:s.name,key:s.key,timeout:s}),l},G=b?y=>c(X(y),e,g):y=>c(X(y),e),u;if(n?.strict===!0){let y=n;u=await W.strict(G,{onError:y.onError,onEvent:y.onEvent,catchUnexpected:y.catchUnexpected,workflowId:S,context:T})}else{let y=n;u=await W(G,{onError:y?.onError??(()=>{}),onEvent:y?.onEvent,workflowId:S,context:T})}let v=performance.now()-m;return u.ok?A({type:"workflow_success",workflowId:S,ts:Date.now(),durationMs:v}):A({type:"workflow_error",workflowId:S,ts:Date.now(),durationMs:v,error:u.error}),u}return E}function ue(e){return e.type==="step_complete"}function q(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_APPROVAL"}function Re(e){return typeof e=="object"&&e!==null&&e.type==="APPROVAL_REJECTED"}function Se(e,n){return P({type:"PENDING_APPROVAL",stepKey:e,reason:n?.reason,metadata:n?.metadata})}function Ce(e){return async()=>{let n=await e.checkApproval();switch(n.status){case"pending":return P({type:"PENDING_APPROVAL",stepKey:e.key,reason:e.pendingReason,metadata:e.metadata});case"rejected":return P({type:"APPROVAL_REJECTED",stepKey:e.key,reason:n.reason});case"approved":return O(n.value)}}}function xe(e,n){let E=new Map(e.steps);return E.set(n.stepKey,{result:O(n.value)}),{steps:E}}function ge(e,n){let E=new Map(e.steps);return E.delete(n),{steps:E}}function Ae(e,n){let E=e.steps.get(n);return!E||E.result.ok?!1:q(E.result.error)}function ve(e){let n=[];for(let[E,d]of e.steps)!d.result.ok&&q(d.result.error)&&n.push(E);return n}function he(){let e=new Map;return{handleEvent:n=>{ue(n)&&e.set(n.stepKey,{result:n.result,meta:n.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear(),hasPendingApprovals:()=>{for(let n of e.values())if(!n.result.ok&&q(n.result.error))return!0;return!1},getPendingApprovals:()=>{let n=[];for(let[E,d]of e)!d.result.ok&&q(d.result.error)&&n.push({stepKey:E,error:d.result.error});return n},injectApproval:(n,E)=>(e.set(n,{result:O(E)}),{steps:new Map(e)})}}export{ge as clearStep,Ce as createApprovalStep,he as createHITLCollector,fe as createStepCollector,ke as createWorkflow,ve as getPendingApprovals,Ae as hasPendingApproval,xe as injectApproval,Re as isApprovalRejected,q as isPendingApproval,ue as isStepComplete,Se as pendingApproval};
2
2
  //# sourceMappingURL=workflow.js.map