@jagreehal/workflow 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/workflow.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var z=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var Ee=Object.prototype.hasOwnProperty;var ye=(e,t)=>{for(var c in t)z(e,c,{get:t[c],enumerable:!0})},me=(e,t,c,T)=>{if(t&&typeof t=="object"||typeof t=="function")for(let x of le(t))!Ee.call(e,x)&&x!==c&&z(e,x,{get:()=>t[x],enumerable:!(T=ce(t,x))||T.enumerable});return e};var we=e=>me(z({},"__esModule",{value:!0}),e);var Me={};ye(Me,{clearStep:()=>_e,createApprovalStep:()=>he,createHITLCollector:()=>Oe,createStepCollector:()=>Ce,createWorkflow:()=>ge,getPendingApprovals:()=>be,hasPendingApproval:()=>De,injectApproval:()=>Pe,isApprovalRejected:()=>Ae,isPendingApproval:()=>X,isStepComplete:()=>te,pendingApproval:()=>ve});module.exports=we(Me);var O=e=>({ok:!0,value:e}),_=(e,t)=>({ok:!1,error:e,...t?.cause!==void 0?{cause:t.cause}:{}});var Te=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",j=Symbol.for("step_timeout_marker");function se(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:j in e}function de(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let t=e;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if(j in e)return e[j]}}var ue=Symbol("early-exit");function V(e,t){return{[ue]:!0,error:e,meta:t}}function L(e){return typeof e=="object"&&e!==null&&e[ue]===!0}var ae=Symbol("mapper-exception");function fe(e){return{[ae]:!0,thrown:e}}function ke(e){return typeof e=="object"&&e!==null&&e[ae]===!0}function Re(e){return typeof e=="string"?{name:e}:e??{}}function Q(e,t){let{backoff:c,initialDelay:T,maxDelay:x,jitter:b}=t,A;switch(c){case"fixed":A=T;break;case"linear":A=T*e;break;case"exponential":A=T*Math.pow(2,e-1);break}if(A=Math.min(A,x),b){let l=A*.25*Math.random();A=A+l}return Math.floor(A)}function Z(e){return new Promise(t=>setTimeout(t,e))}var oe=Symbol("timeout");async function Se(e,t,c){let T=new AbortController,x=t.error??{type:"STEP_TIMEOUT",stepName:c.name,stepKey:c.key,timeoutMs:t.ms,attempt:c.attempt},b,A=new Promise((S,d)=>{b=setTimeout(()=>{T.abort(),d({[oe]:!0,error:x})},t.ms)}),l;t.signal?l=Promise.resolve(e(T.signal)):l=Promise.resolve(e());try{return await Promise.race([l,A])}catch(S){if(typeof S=="object"&&S!==null&&S[oe]===!0){let d=S.error;if(typeof d=="object"&&d!==null&&d.type!=="STEP_TIMEOUT"){let v={timeoutMs:t.ms,stepName:c.name,stepKey:c.key,attempt:c.attempt};j in d?d[j]=v:Object.defineProperty(d,j,{value:v,enumerable:!1,writable:!0,configurable:!1})}throw d}throw S}finally{clearTimeout(b)}}var K={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function W(e,t){let{onError:c,onEvent:T,catchUnexpected:x,workflowId:b,context:A}=t&&typeof t=="object"?t:{},l=b??crypto.randomUUID(),S=!c&&!x,d=[],v=0,F=u=>u??`step_${++v}`,m=u=>{if(u.type==="step_success"){let h=u.stepId;for(let y=d.length-1;y>=0;y--){let E=d[y];if(E.type==="race"&&!E.winnerId){E.winnerId=h;break}}}T?.(u,A)},D=V,C=u=>L(u),N=(u,h)=>S?h?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:u,...h.resultCause!==void 0?{cause:h.resultCause}:{}}}:h?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:u,thrown:h.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:u}}:u,G=u=>u.origin==="result"?u.resultCause:u.thrown,J=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=(E,a)=>(async()=>{let s=Re(a),{name:o,key:n,retry:p,timeout:r}=s,i=F(n),f=T,k=f?performance.now():0;if(!(typeof E=="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 g={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};T&&m({type:"step_start",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now()});let ne;for(let R=1;R<=g.attempts;R++){let ie=f?performance.now():0;try{let w;if(typeof E=="function"?r?w=await Se(E,r,{name:o,key:n,attempt:R}):w=await E():w=await E,w.ok){let M=performance.now()-k;return m({type:"step_success",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),durationMs:M}),n&&m({type:"step_complete",workflowId:l,stepKey:n,name:o,ts:Date.now(),durationMs:M,result:w}),w.value}if(ne=w,R<g.attempts&&g.retryOn(w.error,R)){let M=Q(R,g);m({type:"step_retry",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),attempt:R+1,maxAttempts:g.attempts,delayMs:M,error:w.error}),g.onRetry(w.error,R,M),await Z(M);continue}g.attempts>1&&m({type:"step_retries_exhausted",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w.error});break}catch(w){let M=performance.now()-ie;if(C(w))throw m({type:"step_aborted",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),durationMs:M}),w;if(se(w)){let P=de(w),$=r?.ms??P?.timeoutMs??0;if(m({type:"step_timeout",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),timeoutMs:$,attempt:R}),R<g.attempts&&g.retryOn(w,R)){let H=Q(R,g);m({type:"step_retry",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),attempt:R+1,maxAttempts:g.attempts,delayMs:H,error:w}),g.onRetry(w,R,H),await Z(H);continue}g.attempts>1&&m({type:"step_retries_exhausted",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w})}if(R<g.attempts&&g.retryOn(w,R)){let P=Q(R,g);m({type:"step_retry",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),attempt:R+1,maxAttempts:g.attempts,delayMs:P,error:w}),g.onRetry(w,R,P),await Z(P);continue}g.attempts>1&&!se(w)&&m({type:"step_retries_exhausted",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w});let B=performance.now()-k;if(x){let P;try{P=x(w)}catch($){throw fe($)}throw m({type:"step_error",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),durationMs:B,error:P}),n&&m({type:"step_complete",workflowId:l,stepKey:n,name:o,ts:Date.now(),durationMs:B,result:_(P,{cause:w}),meta:{origin:"throw",thrown:w}}),c?.(P,o),D(P,{origin:"throw",thrown:w})}else{let P={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:w}};throw m({type:"step_error",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),durationMs:B,error:P}),n&&m({type:"step_complete",workflowId:l,stepKey:n,name:o,ts:Date.now(),durationMs:B,result:_(P,{cause:w}),meta:{origin:"throw",thrown:w}}),w}}}let U=ne,re=performance.now()-k,pe=N(U.error,{origin:"result",resultCause:U.cause});throw m({type:"step_error",workflowId:l,stepId:i,stepKey:n,name:o,ts:Date.now(),durationMs:re,error:pe}),n&&m({type:"step_complete",workflowId:l,stepKey:n,name:o,ts:Date.now(),durationMs:re,result:U,meta:{origin:"result",resultCause:U.cause}}),c?.(U.error,o),D(U.error,{origin:"result",resultCause:U.cause})})();u.try=(E,a)=>{let s=a.name,o=a.key,n=F(o),p="error"in a?()=>a.error:a.onError,r=T;return(async()=>{let i=r?performance.now():0;T&&m({type:"step_start",workflowId:l,stepId:n,stepKey:o,name:s,ts:Date.now()});try{let f=await E(),k=performance.now()-i;return m({type:"step_success",workflowId:l,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:k}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:s,ts:Date.now(),durationMs:k,result:O(f)}),f}catch(f){let k=p(f),I=performance.now()-i,Y=N(k,{origin:"throw",thrown:f});throw m({type:"step_error",workflowId:l,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:I,error:Y}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:s,ts:Date.now(),durationMs:I,result:_(k,{cause:f}),meta:{origin:"throw",thrown:f}}),c?.(k,s),D(k,{origin:"throw",thrown:f})}})()},u.fromResult=(E,a)=>{let s=a.name,o=a.key,n=F(o),p="error"in a?()=>a.error:a.onError,r=T;return(async()=>{let i=r?performance.now():0;T&&m({type:"step_start",workflowId:l,stepId:n,stepKey:o,name:s,ts:Date.now()});let f=await E();if(f.ok){let k=performance.now()-i;return m({type:"step_success",workflowId:l,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:k}),o&&m({type:"step_complete",workflowId:l,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,Y=N(k,{origin:"result",resultCause:f.error});throw m({type:"step_error",workflowId:l,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:I,error:Y}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:s,ts:Date.now(),durationMs:I,result:_(k,{cause:f.error}),meta:{origin:"result",resultCause:f.error}}),c?.(k,s),D(k,{origin:"result",resultCause:f.error})}})()},u.retry=(E,a)=>u(E,{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=(E,a)=>u(E,{name:a.name,key:a.key,timeout:a}),u.parallel=(E,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),n=!1;d.push({scopeId:s,type:"parallel"});let p=()=>{if(n)return;n=!0;let r=d.findIndex(i=>i.scopeId===s);r!==-1&&d.splice(r,1),m({type:"scope_end",workflowId:l,scopeId:s,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:l,scopeId:s,scopeType:"parallel",name:E,ts:Date.now()});try{let r=await a();if(p(),!r.ok)throw c?.(r.error,E),D(r.error,{origin:"result",resultCause:r.cause});return r.value}catch(r){throw p(),r}})()},u.race=(E,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),n=!1,p={scopeId:s,type:"race",winnerId:void 0};d.push(p);let r=()=>{if(n)return;n=!0;let i=d.findIndex(f=>f.scopeId===s);i!==-1&&d.splice(i,1),m({type:"scope_end",workflowId:l,scopeId:s,ts:Date.now(),durationMs:performance.now()-o,winnerId:p.winnerId})};m({type:"scope_start",workflowId:l,scopeId:s,scopeType:"race",name:E,ts:Date.now()});try{let i=await a();if(r(),!i.ok)throw c?.(i.error,E),D(i.error,{origin:"result",resultCause:i.cause});return i.value}catch(i){throw r(),i}})()},u.allSettled=(E,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),n=!1;d.push({scopeId:s,type:"allSettled"});let p=()=>{if(n)return;n=!0;let r=d.findIndex(i=>i.scopeId===s);r!==-1&&d.splice(r,1),m({type:"scope_end",workflowId:l,scopeId:s,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:l,scopeId:s,scopeType:"allSettled",name:E,ts:Date.now()});try{let r=await a();if(p(),!r.ok)throw c?.(r.error,E),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(ke(u))throw u.thrown;if(C(u)){let y=G(u.meta);if(x||c)return _(u.error,{cause:y});if(Te(u.error))return _(u.error,{cause:y});let E=J(u);return _(E,{cause:y})}if(x){let y=x(u);return c?.(y,"unexpected"),_(y,{cause:u})}let h={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:u}};return c?.(h,"unexpected"),_(h,{cause:u})}}W.strict=(e,t)=>W(e,t);function Ce(){let e=new Map;return{handleEvent:t=>{te(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function xe(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function q(e,t,c){return _(e,{cause:{__cachedMeta:!0,originalCause:c,meta:t}})}function ee(e){return xe(e)?e.meta:{origin:"result",resultCause:e}}function ge(e,t){async function c(T,x){let b=typeof x=="function",A=b?T:void 0,l=b?x:T,S=crypto.randomUUID(),d=t?.createContext?.(),v=y=>{t?.onEvent?.(y,d)},F=Date.now(),m=performance.now();v({type:"workflow_start",workflowId:S,ts:F});let D=t?.resumeState,C=t?.cache;if(D&&!C&&(C=new Map),D&&C){let y=typeof D=="function"?await D():D;for(let[E,a]of y.steps){let{result:s,meta:o}=a;if(s.ok)C.set(E,s);else{let n=o??{origin:"result",resultCause:s.cause};C.set(E,q(s.error,n,s.cause))}}}let N=y=>typeof y=="string"?{name:y}:y??{},G=y=>{if(!C)return y;let E=async(a,s)=>{let{name:o,key:n}=N(s);if(n&&C.has(n)){v({type:"step_cache_hit",workflowId:S,stepKey:n,name:o,ts:Date.now()});let r=C.get(n);if(r.ok)return r.value;let i=ee(r.cause);throw V(r.error,i)}n&&v({type:"step_cache_miss",workflowId:S,stepKey:n,name:o,ts:Date.now()});let p=typeof a=="function"?a:()=>a;try{let r=await y(p,s);return n&&C.set(n,O(r)),r}catch(r){if(n&&L(r)){let i=r,f=i.meta.origin==="result"?i.meta.resultCause:i.meta.thrown;C.set(n,q(i.error,i.meta,f))}throw r}};return E.try=async(a,s)=>{let{name:o,key:n}=s;if(n&&C.has(n)){v({type:"step_cache_hit",workflowId:S,stepKey:n,name:o,ts:Date.now()});let p=C.get(n);if(p.ok)return p.value;let r=ee(p.cause);throw V(p.error,r)}n&&v({type:"step_cache_miss",workflowId:S,stepKey:n,name:o,ts:Date.now()});try{let p=await y.try(a,s);return n&&C.set(n,O(p)),p}catch(p){if(n&&L(p)){let r=p,i=r.meta.origin==="result"?r.meta.resultCause:r.meta.thrown;C.set(n,q(r.error,r.meta,i))}throw p}},E.fromResult=async(a,s)=>{let{name:o,key:n}=s;if(n&&C.has(n)){v({type:"step_cache_hit",workflowId:S,stepKey:n,name:o,ts:Date.now()});let p=C.get(n);if(p.ok)return p.value;let r=ee(p.cause);throw V(p.error,r)}n&&v({type:"step_cache_miss",workflowId:S,stepKey:n,name:o,ts:Date.now()});try{let p=await y.fromResult(a,s);return n&&C.set(n,O(p)),p}catch(p){if(n&&L(p)){let r=p,i=r.meta.origin==="result"?r.meta.resultCause:r.meta.thrown;C.set(n,q(r.error,r.meta,i))}throw p}},E.parallel=y.parallel,E.race=y.race,E.allSettled=y.allSettled,E.retry=(a,s)=>E(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}),E.withTimeout=(a,s)=>E(a,{name:s.name,key:s.key,timeout:s}),E},J=b?y=>l(G(y),e,A):y=>l(G(y),e),u;if(t?.strict===!0){let y=t;u=await W.strict(J,{onError:y.onError,onEvent:y.onEvent,catchUnexpected:y.catchUnexpected,workflowId:S,context:d})}else{let y=t;u=await W(J,{onError:y?.onError??(()=>{}),onEvent:y?.onEvent,workflowId:S,context:d})}let h=performance.now()-m;return u.ok?v({type:"workflow_success",workflowId:S,ts:Date.now(),durationMs:h}):v({type:"workflow_error",workflowId:S,ts:Date.now(),durationMs:h,error:u.error}),u}return c}function te(e){return e.type==="step_complete"}function X(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_APPROVAL"}function Ae(e){return typeof e=="object"&&e!==null&&e.type==="APPROVAL_REJECTED"}function ve(e,t){return _({type:"PENDING_APPROVAL",stepKey:e,reason:t?.reason,metadata:t?.metadata})}function he(e){return async()=>{let t=await e.checkApproval();switch(t.status){case"pending":return _({type:"PENDING_APPROVAL",stepKey:e.key,reason:e.pendingReason,metadata:e.metadata});case"rejected":return _({type:"APPROVAL_REJECTED",stepKey:e.key,reason:t.reason});case"approved":return O(t.value)}}}function Pe(e,t){let c=new Map(e.steps);return c.set(t.stepKey,{result:O(t.value)}),{steps:c}}function _e(e,t){let c=new Map(e.steps);return c.delete(t),{steps:c}}function De(e,t){let c=e.steps.get(t);return!c||c.result.ok?!1:X(c.result.error)}function be(e){let t=[];for(let[c,T]of e.steps)!T.result.ok&&X(T.result.error)&&t.push(c);return t}function Oe(){let e=new Map;return{handleEvent:t=>{te(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear(),hasPendingApprovals:()=>{for(let t of e.values())if(!t.result.ok&&X(t.result.error))return!0;return!1},getPendingApprovals:()=>{let t=[];for(let[c,T]of e)!T.result.ok&&X(T.result.error)&&t.push({stepKey:c,error:T.result.error});return t},injectApproval:(t,c)=>(e.set(t,{result:O(c)}),{steps:new Map(e)})}}0&&(module.exports={clearStep,createApprovalStep,createHITLCollector,createStepCollector,createWorkflow,getPendingApprovals,hasPendingApproval,injectApproval,isApprovalRejected,isPendingApproval,isStepComplete,pendingApproval});
1
+ "use strict";var re=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var de=Object.prototype.hasOwnProperty;var ke=(e,n)=>{for(var l in n)re(e,l,{get:n[l],enumerable:!0})},fe=(e,n,l,C)=>{if(n&&typeof n=="object"||typeof n=="function")for(let A of me(n))!de.call(e,A)&&A!==l&&re(e,A,{get:()=>n[A],enumerable:!(C=we(n,A))||C.enumerable});return e};var Te=e=>fe(re({},"__esModule",{value:!0}),e);var Ne={};ke(Ne,{clearStep:()=>Me,createApprovalStep:()=>De,createHITLCollector:()=>Ke,createStepCollector:()=>he,createWorkflow:()=>Pe,getPendingApprovals:()=>Ie,hasPendingApproval:()=>Oe,injectApproval:()=>Ue,isApprovalRejected:()=>_e,isPendingApproval:()=>Y,isStepComplete:()=>ae,pendingApproval:()=>be});module.exports=Te(Ne);var U=e=>({ok:!0,value:e}),S=(e,n)=>({ok:!1,error:e,...n?.cause!==void 0?{cause:n.cause}:{}});var Re=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",L=Symbol.for("step_timeout_marker");function pe(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:L 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(L in e)return e[L]}}var le=Symbol("early-exit");function J(e,n){return{[le]:!0,error:e,meta:n}}function H(e){return typeof e=="object"&&e!==null&&e[le]===!0}var Ee=Symbol("mapper-exception");function Se(e){return{[Ee]:!0,thrown:e}}function xe(e){return typeof e=="object"&&e!==null&&e[Ee]===!0}function ge(e){return typeof e=="string"?{name:e}:e??{}}function oe(e,n){let{backoff:l,initialDelay:C,maxDelay:A,jitter:K}=n,_;switch(l){case"fixed":_=C;break;case"linear":_=C*e;break;case"exponential":_=C*Math.pow(2,e-1);break}if(_=Math.min(_,A),K){let E=_*.25*Math.random();_=_+E}return Math.floor(_)}function se(e){return new Promise(n=>setTimeout(n,e))}var ce=Symbol("timeout");async function Ae(e,n,l){let C=new AbortController,A=n.error??{type:"STEP_TIMEOUT",stepName:l.name,stepKey:l.key,timeoutMs:n.ms,attempt:l.attempt},K,_=new Promise((T,f)=>{K=setTimeout(()=>{C.abort(),f({[ce]:!0,error:A})},n.ms)}),E;n.signal?E=Promise.resolve(e(C.signal)):E=Promise.resolve(e());try{return await Promise.race([E,_])}catch(T){if(typeof T=="object"&&T!==null&&T[ce]===!0){let f=T.error;if(typeof f=="object"&&f!==null&&f.type!=="STEP_TIMEOUT"){let g={timeoutMs:n.ms,stepName:l.name,stepKey:l.key,attempt:l.attempt};L in f?f[L]=g:Object.defineProperty(f,L,{value:g,enumerable:!1,writable:!0,configurable:!1})}throw f}throw T}finally{clearTimeout(K)}}var V={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function B(e,n){let{onError:l,onEvent:C,catchUnexpected:A,workflowId:K,context:_}=n&&typeof n=="object"?n:{},E=K??crypto.randomUUID(),T=!l&&!A,f=[],g=0,F=c=>c??`step_${++g}`,y=c=>{if(c.type==="step_success"){let h=c.stepId;for(let v=f.length-1;v>=0;v--){let M=f[v];if(M.type==="race"&&!M.winnerId){M.winnerId=h;break}}}C?.(c,_)},I=J,$=c=>H(c),X=(c,h)=>T?h?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:c,...h.resultCause!==void 0?{cause:h.resultCause}:{}}}:h?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:c,thrown:h.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:c}}:c,j=c=>c.origin==="result"?c.resultCause:c.thrown,k=c=>({type:"UNEXPECTED_ERROR",cause:c.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:c.error,...c.meta.resultCause!==void 0?{cause:c.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:c.error,thrown:c.meta.thrown}});try{let h=function(s,r){let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),i=!1;f.push({scopeId:u,type:"parallel"});let o=()=>{if(i)return;i=!0;let p=f.findIndex(a=>a.scopeId===u);p!==-1&&f.splice(p,1),y({type:"scope_end",workflowId:E,scopeId:u,ts:Date.now(),durationMs:performance.now()-t})};y({type:"scope_start",workflowId:E,scopeId:u,scopeType:"parallel",name:s,ts:Date.now()});try{let p=await r();if(o(),!p.ok)throw l?.(p.error,s),I(p.error,{origin:"result",resultCause:p.cause});return p.value}catch(p){throw o(),p}})()},v=function(s,r){let u=Object.keys(s),t=r.name??`Parallel(${u.join(", ")})`,i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),p=!1;f.push({scopeId:i,type:"parallel"});let a=()=>{if(p)return;p=!0;let w=f.findIndex(m=>m.scopeId===i);w!==-1&&f.splice(w,1),y({type:"scope_end",workflowId:E,scopeId:i,ts:Date.now(),durationMs:performance.now()-o})};y({type:"scope_start",workflowId:E,scopeId:i,scopeType:"parallel",name:t,ts:Date.now()});try{let w=await new Promise(P=>{if(u.length===0){P([]);return}let D=!1,x=u.length,G=new Array(u.length);for(let O=0;O<u.length;O++){let W=u[O],ee=O;Promise.resolve(s[W]()).catch(R=>S({type:"PROMISE_REJECTED",cause:R},{cause:{type:"PROMISE_REJECTION",reason:R}})).then(R=>{if(!D){if(!R.ok){D=!0,P([{key:W,result:R}]);return}G[ee]={key:W,result:R},x--,x===0&&P(G)}})}});a();let m={};for(let{key:P,result:D}of w){if(!D.ok)throw l?.(D.error,P),I(D.error,{origin:"result",resultCause:D.cause});m[P]=D.value}return m}catch(w){throw a(),w}})()};var ie=h,q=v;let c=(s,r)=>(async()=>{let u=ge(r),{name:t,key:i,retry:o,timeout:p}=u,a=F(i),w=C,m=w?performance.now():0;if(!(typeof s=="function")){if(o&&o.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(p)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,o?.attempts??1),backoff:o?.backoff??V.backoff,initialDelay:o?.initialDelay??V.initialDelay,maxDelay:o?.maxDelay??V.maxDelay,jitter:o?.jitter??V.jitter,retryOn:o?.retryOn??V.retryOn,onRetry:o?.onRetry??V.onRetry};C&&y({type:"step_start",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now()});let G;for(let R=1;R<=x.attempts;R++){let ye=w?performance.now():0;try{let d;if(typeof s=="function"?p?d=await Ae(s,p,{name:t,key:i,attempt:R}):d=await s():d=await s,d.ok){let N=performance.now()-m;return y({type:"step_success",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:N}),i&&y({type:"step_complete",workflowId:E,stepKey:i,name:t,ts:Date.now(),durationMs:N,result:d}),d.value}if(G=d,R<x.attempts&&x.retryOn(d.error,R)){let N=oe(R,x);y({type:"step_retry",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:N,error:d.error}),x.onRetry(d.error,R,N),await se(N);continue}x.attempts>1&&y({type:"step_retries_exhausted",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:performance.now()-m,attempts:R,lastError:d.error});break}catch(d){let N=performance.now()-ye;if($(d))throw y({type:"step_aborted",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:N}),d;if(pe(d)){let b=Ce(d),te=p?.ms??b?.timeoutMs??0;if(y({type:"step_timeout",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),timeoutMs:te,attempt:R}),R<x.attempts&&x.retryOn(d,R)){let ne=oe(R,x);y({type:"step_retry",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:ne,error:d}),x.onRetry(d,R,ne),await se(ne);continue}x.attempts>1&&y({type:"step_retries_exhausted",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:performance.now()-m,attempts:R,lastError:d})}if(R<x.attempts&&x.retryOn(d,R)){let b=oe(R,x);y({type:"step_retry",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:b,error:d}),x.onRetry(d,R,b),await se(b);continue}x.attempts>1&&!pe(d)&&y({type:"step_retries_exhausted",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:performance.now()-m,attempts:R,lastError:d});let Q=performance.now()-m;if(A){let b;try{b=A(d)}catch(te){throw Se(te)}throw y({type:"step_error",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:Q,error:b}),i&&y({type:"step_complete",workflowId:E,stepKey:i,name:t,ts:Date.now(),durationMs:Q,result:S(b,{cause:d}),meta:{origin:"throw",thrown:d}}),l?.(b,t),I(b,{origin:"throw",thrown:d})}else{let b={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:d}};throw y({type:"step_error",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:Q,error:b}),i&&y({type:"step_complete",workflowId:E,stepKey:i,name:t,ts:Date.now(),durationMs:Q,result:S(b,{cause:d}),meta:{origin:"throw",thrown:d}}),d}}}let O=G,W=performance.now()-m,ee=X(O.error,{origin:"result",resultCause:O.cause});throw y({type:"step_error",workflowId:E,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:W,error:ee}),i&&y({type:"step_complete",workflowId:E,stepKey:i,name:t,ts:Date.now(),durationMs:W,result:O,meta:{origin:"result",resultCause:O.cause}}),l?.(O.error,t),I(O.error,{origin:"result",resultCause:O.cause})})();c.try=(s,r)=>{let u=r.name,t=r.key,i=F(t),o="error"in r?()=>r.error:r.onError,p=C;return(async()=>{let a=p?performance.now():0;C&&y({type:"step_start",workflowId:E,stepId:i,stepKey:t,name:u,ts:Date.now()});try{let w=await s(),m=performance.now()-a;return y({type:"step_success",workflowId:E,stepId:i,stepKey:t,name:u,ts:Date.now(),durationMs:m}),t&&y({type:"step_complete",workflowId:E,stepKey:t,name:u,ts:Date.now(),durationMs:m,result:U(w)}),w}catch(w){let m=o(w),P=performance.now()-a,D=X(m,{origin:"throw",thrown:w});throw y({type:"step_error",workflowId:E,stepId:i,stepKey:t,name:u,ts:Date.now(),durationMs:P,error:D}),t&&y({type:"step_complete",workflowId:E,stepKey:t,name:u,ts:Date.now(),durationMs:P,result:S(m,{cause:w}),meta:{origin:"throw",thrown:w}}),l?.(m,u),I(m,{origin:"throw",thrown:w})}})()},c.fromResult=(s,r)=>{let u=r.name,t=r.key,i=F(t),o="error"in r?()=>r.error:r.onError,p=C;return(async()=>{let a=p?performance.now():0;C&&y({type:"step_start",workflowId:E,stepId:i,stepKey:t,name:u,ts:Date.now()});let w=await s();if(w.ok){let m=performance.now()-a;return y({type:"step_success",workflowId:E,stepId:i,stepKey:t,name:u,ts:Date.now(),durationMs:m}),t&&y({type:"step_complete",workflowId:E,stepKey:t,name:u,ts:Date.now(),durationMs:m,result:U(w.value)}),w.value}else{let m=o(w.error),P=performance.now()-a,D=X(m,{origin:"result",resultCause:w.error});throw y({type:"step_error",workflowId:E,stepId:i,stepKey:t,name:u,ts:Date.now(),durationMs:P,error:D}),t&&y({type:"step_complete",workflowId:E,stepKey:t,name:u,ts:Date.now(),durationMs:P,result:S(m,{cause:w.error}),meta:{origin:"result",resultCause:w.error}}),l?.(m,u),I(m,{origin:"result",resultCause:w.error})}})()},c.retry=(s,r)=>c(s,{name:r.name,key:r.key,retry:{attempts:r.attempts,backoff:r.backoff,initialDelay:r.initialDelay,maxDelay:r.maxDelay,jitter:r.jitter,retryOn:r.retryOn,onRetry:r.onRetry},timeout:r.timeout}),c.withTimeout=(s,r)=>c(s,{name:r.name,key:r.key,timeout:r}),c.parallel=((...s)=>{if(typeof s[0]=="string"){let r=s[0],u=s[1];return h(r,u)}else{let r=s[0],u=s[1]??{};return v(r,u)}}),c.race=(s,r)=>{let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),i=!1,o={scopeId:u,type:"race",winnerId:void 0};f.push(o);let p=()=>{if(i)return;i=!0;let a=f.findIndex(w=>w.scopeId===u);a!==-1&&f.splice(a,1),y({type:"scope_end",workflowId:E,scopeId:u,ts:Date.now(),durationMs:performance.now()-t,winnerId:o.winnerId})};y({type:"scope_start",workflowId:E,scopeId:u,scopeType:"race",name:s,ts:Date.now()});try{let a=await r();if(p(),!a.ok)throw l?.(a.error,s),I(a.error,{origin:"result",resultCause:a.cause});return a.value}catch(a){throw p(),a}})()},c.allSettled=(s,r)=>{let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),i=!1;f.push({scopeId:u,type:"allSettled"});let o=()=>{if(i)return;i=!0;let p=f.findIndex(a=>a.scopeId===u);p!==-1&&f.splice(p,1),y({type:"scope_end",workflowId:E,scopeId:u,ts:Date.now(),durationMs:performance.now()-t})};y({type:"scope_start",workflowId:E,scopeId:u,scopeType:"allSettled",name:s,ts:Date.now()});try{let p=await r();if(o(),!p.ok)throw l?.(p.error,s),I(p.error,{origin:"result",resultCause:p.cause});return p.value}catch(p){throw o(),p}})()};let z=await e(c);return U(z)}catch(c){if(xe(c))throw c.thrown;if($(c)){let v=j(c.meta);if(A||l)return S(c.error,{cause:v});if(Re(c.error))return S(c.error,{cause:v});let M=k(c);return S(M,{cause:v})}if(A){let v=A(c);return l?.(v,"unexpected"),S(v,{cause:c})}let h={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:c}};return l?.(h,"unexpected"),S(h,{cause:c})}}B.strict=(e,n)=>B(e,n);function he(){let e=new Map;return{handleEvent:n=>{ae(n)&&e.set(n.stepKey,{result:n.result,meta:n.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function ve(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function Z(e,n,l){return S(e,{cause:{__cachedMeta:!0,originalCause:l,meta:n}})}function ue(e){return ve(e)?e.meta:{origin:"result",resultCause:e}}function Pe(e,n){async function l(C,A){let K=typeof A=="function",_=K?C:void 0,E=K?A:C,T=crypto.randomUUID(),f=n?.createContext?.(),g=s=>{n?.onEvent?.(s,f)},F=n?.shouldRun,y=n?.catchUnexpected;if(F){let s=performance.now();try{let r=await F(T,f),u=performance.now()-s;if(g({type:"hook_should_run",workflowId:T,ts:Date.now(),durationMs:u,result:r,skipped:!r}),!r){let t=new Error("Workflow skipped by shouldRun hook");if(y){let o=y(t);return S(o)}return S({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:t}})}}catch(r){let u=performance.now()-s;if(g({type:"hook_should_run_error",workflowId:T,ts:Date.now(),durationMs:u,error:r}),y){let i=y(r);return S(i)}return S({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:r}})}}let I=n?.onBeforeStart;if(I){let s=performance.now();try{let r=await I(T,f),u=performance.now()-s;if(g({type:"hook_before_start",workflowId:T,ts:Date.now(),durationMs:u,result:r,skipped:!r}),!r){let t=new Error("Workflow skipped by onBeforeStart hook");if(y){let o=y(t);return S(o)}return S({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:t}})}}catch(r){let u=performance.now()-s;if(g({type:"hook_before_start_error",workflowId:T,ts:Date.now(),durationMs:u,error:r}),y){let i=y(r);return S(i)}return S({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:r}})}}let $=Date.now(),X=performance.now();g({type:"workflow_start",workflowId:T,ts:$});let j=n?.resumeState,k=n?.cache;if(j&&!k&&(k=new Map),j&&k){let s=typeof j=="function"?await j():j;for(let[r,u]of s.steps){let{result:t,meta:i}=u;if(t.ok)k.set(r,t);else{let o=i??{origin:"result",resultCause:t.cause};k.set(r,Z(t.error,o,t.cause))}}}let ie=s=>typeof s=="string"?{name:s}:s??{},q=n?.onAfterStep,c=async(s,r)=>{if(!q)return;let u=performance.now();try{await q(s,r,T,f);let t=performance.now()-u;g({type:"hook_after_step",workflowId:T,stepKey:s,ts:Date.now(),durationMs:t})}catch(t){let i=performance.now()-u;throw g({type:"hook_after_step_error",workflowId:T,stepKey:s,ts:Date.now(),durationMs:i,error:t}),t}},h=s=>{if(!k&&!q)return s;let r=async(u,t)=>{let{name:i,key:o}=ie(t);if(o&&k&&k.has(o)){g({type:"step_cache_hit",workflowId:T,stepKey:o,name:i,ts:Date.now()});let a=k.get(o);if(a.ok)return a.value;let w=ue(a.cause);throw J(a.error,w)}o&&k&&g({type:"step_cache_miss",workflowId:T,stepKey:o,name:i,ts:Date.now()});let p=typeof u=="function"?u:()=>u;try{let a=await s(p,t);return o&&(k&&k.set(o,U(a)),await c(o,U(a))),a}catch(a){if(o&&H(a)){let w=a,m=w.meta.origin==="result"?w.meta.resultCause:w.meta.thrown,P=Z(w.error,w.meta,m);k&&k.set(o,P),await c(o,P)}throw a}};return r.try=async(u,t)=>{let{name:i,key:o}=t;if(o&&k&&k.has(o)){g({type:"step_cache_hit",workflowId:T,stepKey:o,name:i,ts:Date.now()});let p=k.get(o);if(p.ok)return p.value;let a=ue(p.cause);throw J(p.error,a)}o&&k&&g({type:"step_cache_miss",workflowId:T,stepKey:o,name:i,ts:Date.now()});try{let p=await s.try(u,t);return o&&(k&&k.set(o,U(p)),await c(o,U(p))),p}catch(p){if(o&&H(p)){let a=p,w=a.meta.origin==="result"?a.meta.resultCause:a.meta.thrown,m=Z(a.error,a.meta,w);k&&k.set(o,m),await c(o,m)}throw p}},r.fromResult=async(u,t)=>{let{name:i,key:o}=t;if(o&&k&&k.has(o)){g({type:"step_cache_hit",workflowId:T,stepKey:o,name:i,ts:Date.now()});let p=k.get(o);if(p.ok)return p.value;let a=ue(p.cause);throw J(p.error,a)}o&&k&&g({type:"step_cache_miss",workflowId:T,stepKey:o,name:i,ts:Date.now()});try{let p=await s.fromResult(u,t);return o&&(k&&k.set(o,U(p)),await c(o,U(p))),p}catch(p){if(o&&H(p)){let a=p,w=a.meta.origin==="result"?a.meta.resultCause:a.meta.thrown,m=Z(a.error,a.meta,w);k&&k.set(o,m),await c(o,m)}throw p}},r.parallel=s.parallel,r.race=s.race,r.allSettled=s.allSettled,r.retry=(u,t)=>r(u,{name:t.name,key:t.key,retry:{attempts:t.attempts,backoff:t.backoff,initialDelay:t.initialDelay,maxDelay:t.maxDelay,jitter:t.jitter,retryOn:t.retryOn,onRetry:t.onRetry},timeout:t.timeout}),r.withTimeout=(u,t)=>r(u,{name:t.name,key:t.key,timeout:t}),r},v=K?s=>E(h(s),e,_):s=>E(h(s),e),M;if(n?.strict===!0){let s=n;M=await B.strict(v,{onError:s.onError,onEvent:s.onEvent,catchUnexpected:s.catchUnexpected,workflowId:T,context:f})}else{let s=n;M=await B(v,{onError:s?.onError??(()=>{}),onEvent:s?.onEvent,workflowId:T,context:f})}let z=performance.now()-X;return M.ok?g({type:"workflow_success",workflowId:T,ts:Date.now(),durationMs:z}):g({type:"workflow_error",workflowId:T,ts:Date.now(),durationMs:z,error:M.error}),M}return l}function ae(e){return e.type==="step_complete"}function Y(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_APPROVAL"}function _e(e){return typeof e=="object"&&e!==null&&e.type==="APPROVAL_REJECTED"}function be(e,n){return S({type:"PENDING_APPROVAL",stepKey:e,reason:n?.reason,metadata:n?.metadata})}function De(e){return async()=>{let n=await e.checkApproval();switch(n.status){case"pending":return S({type:"PENDING_APPROVAL",stepKey:e.key,reason:e.pendingReason,metadata:e.metadata});case"rejected":return S({type:"APPROVAL_REJECTED",stepKey:e.key,reason:n.reason});case"approved":return U(n.value)}}}function Ue(e,n){let l=new Map(e.steps);return l.set(n.stepKey,{result:U(n.value)}),{steps:l}}function Me(e,n){let l=new Map(e.steps);return l.delete(n),{steps:l}}function Oe(e,n){let l=e.steps.get(n);return!l||l.result.ok?!1:Y(l.result.error)}function Ie(e){let n=[];for(let[l,C]of e.steps)!C.result.ok&&Y(C.result.error)&&n.push(l);return n}function Ke(){let e=new Map;return{handleEvent:n=>{ae(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&&Y(n.result.error))return!0;return!1},getPendingApprovals:()=>{let n=[];for(let[l,C]of e)!C.result.ok&&Y(C.result.error)&&n.push({stepKey:l,error:C.result.error});return n},injectApproval:(n,l)=>(e.set(n,{result:U(l)}),{steps:new Map(e)})}}0&&(module.exports={clearStep,createApprovalStep,createHITLCollector,createStepCollector,createWorkflow,getPendingApprovals,hasPendingApproval,injectApproval,isApprovalRejected,isPendingApproval,isStepComplete,pendingApproval});
2
2
  //# sourceMappingURL=workflow.cjs.map