awaitly 1.31.1 → 1.32.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 (169) hide show
  1. package/dist/adapters.cjs +2 -2
  2. package/dist/adapters.cjs.map +1 -1
  3. package/dist/adapters.d.cts +3 -1
  4. package/dist/adapters.d.ts +3 -1
  5. package/dist/adapters.js +2 -2
  6. package/dist/adapters.js.map +1 -1
  7. package/dist/batch.cjs +2 -2
  8. package/dist/batch.cjs.map +1 -1
  9. package/dist/batch.d.cts +3 -1
  10. package/dist/batch.d.ts +3 -1
  11. package/dist/batch.js +2 -2
  12. package/dist/batch.js.map +1 -1
  13. package/dist/circuit-breaker.cjs +2 -2
  14. package/dist/circuit-breaker.cjs.map +1 -1
  15. package/dist/circuit-breaker.d.cts +3 -1
  16. package/dist/circuit-breaker.d.ts +3 -1
  17. package/dist/circuit-breaker.js +2 -2
  18. package/dist/circuit-breaker.js.map +1 -1
  19. package/dist/conditional.d.cts +3 -1
  20. package/dist/conditional.d.ts +3 -1
  21. package/dist/core.cjs +2 -2
  22. package/dist/core.cjs.map +1 -1
  23. package/dist/core.d.cts +2 -1
  24. package/dist/core.d.ts +2 -1
  25. package/dist/core.js +2 -2
  26. package/dist/core.js.map +1 -1
  27. package/dist/diagnostics.cjs +3 -3
  28. package/dist/diagnostics.cjs.map +1 -1
  29. package/dist/diagnostics.d.cts +3 -1
  30. package/dist/diagnostics.d.ts +3 -1
  31. package/dist/diagnostics.js +3 -3
  32. package/dist/diagnostics.js.map +1 -1
  33. package/dist/durable.cjs +3 -3
  34. package/dist/durable.cjs.map +1 -1
  35. package/dist/durable.d.cts +8 -361
  36. package/dist/durable.d.ts +8 -361
  37. package/dist/durable.js +3 -3
  38. package/dist/durable.js.map +1 -1
  39. package/dist/engine.cjs +11 -0
  40. package/dist/engine.cjs.map +1 -0
  41. package/dist/engine.d.cts +114 -0
  42. package/dist/engine.d.ts +114 -0
  43. package/dist/engine.js +11 -0
  44. package/dist/engine.js.map +1 -0
  45. package/dist/errors-entry-CMH73Eym.d.cts +339 -0
  46. package/dist/errors-entry-DOt5UUl4.d.ts +339 -0
  47. package/dist/errors.cjs +1 -1
  48. package/dist/errors.cjs.map +1 -1
  49. package/dist/errors.d.cts +2 -318
  50. package/dist/errors.d.ts +2 -318
  51. package/dist/errors.js +1 -1
  52. package/dist/errors.js.map +1 -1
  53. package/dist/fetch.cjs +2 -2
  54. package/dist/fetch.cjs.map +1 -1
  55. package/dist/fetch.d.cts +3 -1
  56. package/dist/fetch.d.ts +3 -1
  57. package/dist/fetch.js +2 -2
  58. package/dist/fetch.js.map +1 -1
  59. package/dist/functional.cjs +1 -1
  60. package/dist/functional.cjs.map +1 -1
  61. package/dist/functional.d.cts +2 -0
  62. package/dist/functional.d.ts +2 -0
  63. package/dist/functional.js +1 -1
  64. package/dist/functional.js.map +1 -1
  65. package/dist/{guards-PU64_GKv.d.cts → guards-B79mP5Q8.d.cts} +3 -3
  66. package/dist/{guards-B5lgMJq0.d.ts → guards-BUq6NJCM.d.ts} +3 -3
  67. package/dist/{hitl-Dyiy0R1v.d.cts → hitl-BCqkMAHw.d.cts} +2 -2
  68. package/dist/{hitl-BjeSm1sJ.d.ts → hitl-BZtPx0aU.d.ts} +2 -2
  69. package/dist/hitl.cjs +2 -2
  70. package/dist/hitl.cjs.map +1 -1
  71. package/dist/hitl.d.cts +9 -6
  72. package/dist/hitl.d.ts +9 -6
  73. package/dist/hitl.js +2 -2
  74. package/dist/hitl.js.map +1 -1
  75. package/dist/index-BVUAOWGG.d.ts +417 -0
  76. package/dist/index-CQnpmUcC.d.cts +417 -0
  77. package/dist/index.cjs +1 -1
  78. package/dist/index.cjs.map +1 -1
  79. package/dist/index.d.cts +4 -3
  80. package/dist/index.d.ts +4 -3
  81. package/dist/index.js +1 -1
  82. package/dist/index.js.map +1 -1
  83. package/dist/otel.d.cts +3 -1
  84. package/dist/otel.d.ts +3 -1
  85. package/dist/{persistence-entry-B3ukwbb5.d.ts → persistence-entry-ClFhxd2Q.d.ts} +11 -5
  86. package/dist/{persistence-entry-CgVzswbg.d.cts → persistence-entry-jflY61az.d.cts} +11 -5
  87. package/dist/persistence.d.cts +6 -3
  88. package/dist/persistence.d.ts +6 -3
  89. package/dist/policies.d.cts +3 -1
  90. package/dist/policies.d.ts +3 -1
  91. package/dist/ratelimit.cjs +2 -2
  92. package/dist/ratelimit.cjs.map +1 -1
  93. package/dist/ratelimit.d.cts +3 -1
  94. package/dist/ratelimit.d.ts +3 -1
  95. package/dist/ratelimit.js +2 -2
  96. package/dist/ratelimit.js.map +1 -1
  97. package/dist/reliability.cjs +2 -2
  98. package/dist/reliability.cjs.map +1 -1
  99. package/dist/reliability.d.cts +3 -1
  100. package/dist/reliability.d.ts +3 -1
  101. package/dist/reliability.js +2 -2
  102. package/dist/reliability.js.map +1 -1
  103. package/dist/resolver.cjs +2 -2
  104. package/dist/resolver.cjs.map +1 -1
  105. package/dist/resolver.d.cts +5 -3
  106. package/dist/resolver.d.ts +5 -3
  107. package/dist/resolver.js +2 -2
  108. package/dist/resolver.js.map +1 -1
  109. package/dist/resource.cjs +2 -2
  110. package/dist/resource.cjs.map +1 -1
  111. package/dist/resource.d.cts +3 -1
  112. package/dist/resource.d.ts +3 -1
  113. package/dist/resource.js +2 -2
  114. package/dist/resource.js.map +1 -1
  115. package/dist/result/retry.cjs +1 -1
  116. package/dist/result/retry.cjs.map +1 -1
  117. package/dist/result/retry.d.cts +2 -0
  118. package/dist/result/retry.d.ts +2 -0
  119. package/dist/result/retry.js +1 -1
  120. package/dist/result/retry.js.map +1 -1
  121. package/dist/result.cjs +1 -1
  122. package/dist/result.cjs.map +1 -1
  123. package/dist/result.d.cts +8 -23
  124. package/dist/result.d.ts +8 -23
  125. package/dist/result.js +1 -1
  126. package/dist/result.js.map +1 -1
  127. package/dist/{run-entry-C1uFytM6.d.cts → run-entry-rw7zll_G.d.ts} +16 -45
  128. package/dist/{run-entry-C1uFytM6.d.ts → run-entry-yQu63Yj9.d.cts} +16 -45
  129. package/dist/run.cjs +2 -2
  130. package/dist/run.cjs.map +1 -1
  131. package/dist/run.d.cts +3 -1
  132. package/dist/run.d.ts +3 -1
  133. package/dist/run.js +2 -2
  134. package/dist/run.js.map +1 -1
  135. package/dist/saga.cjs +2 -2
  136. package/dist/saga.cjs.map +1 -1
  137. package/dist/saga.d.cts +3 -1
  138. package/dist/saga.d.ts +3 -1
  139. package/dist/saga.js +2 -2
  140. package/dist/saga.js.map +1 -1
  141. package/dist/singleflight.d.cts +3 -1
  142. package/dist/singleflight.d.ts +3 -1
  143. package/dist/streaming.cjs +4 -4
  144. package/dist/streaming.cjs.map +1 -1
  145. package/dist/streaming.d.cts +5 -3
  146. package/dist/streaming.d.ts +5 -3
  147. package/dist/streaming.js +4 -4
  148. package/dist/streaming.js.map +1 -1
  149. package/dist/testing.cjs +8 -4
  150. package/dist/testing.cjs.map +1 -1
  151. package/dist/testing.d.cts +87 -4
  152. package/dist/testing.d.ts +87 -4
  153. package/dist/testing.js +8 -4
  154. package/dist/testing.js.map +1 -1
  155. package/dist/{types-wa_wTOn3.d.ts → types-CuWK5AlK.d.ts} +1 -1
  156. package/dist/{types-DUWrNIJu.d.cts → types-uR3JpwvF.d.cts} +1 -1
  157. package/dist/webhook.cjs +2 -2
  158. package/dist/webhook.cjs.map +1 -1
  159. package/dist/webhook.d.cts +7 -4
  160. package/dist/webhook.d.ts +7 -4
  161. package/dist/webhook.js +2 -2
  162. package/dist/webhook.js.map +1 -1
  163. package/dist/workflow.cjs +3 -3
  164. package/dist/workflow.cjs.map +1 -1
  165. package/dist/workflow.d.cts +47 -11
  166. package/dist/workflow.d.ts +47 -11
  167. package/dist/workflow.js +3 -3
  168. package/dist/workflow.js.map +1 -1
  169. package/package.json +15 -1
@@ -1,4 +1,6 @@
1
- import { e as ErrorClassification, ah as WorkflowEvent } from './run-entry-C1uFytM6.cjs';
1
+ import { e as ErrorClassification, ad as WorkflowEvent } from './run-entry-yQu63Yj9.cjs';
2
+ import './errors-entry-CMH73Eym.cjs';
3
+ import './tagged-error.cjs';
2
4
 
3
5
  interface WorkflowWideEvent {
4
6
  workflowId: string;
@@ -1,4 +1,6 @@
1
- import { e as ErrorClassification, ah as WorkflowEvent } from './run-entry-C1uFytM6.js';
1
+ import { e as ErrorClassification, ad as WorkflowEvent } from './run-entry-rw7zll_G.js';
2
+ import './errors-entry-DOt5UUl4.js';
3
+ import './tagged-error.js';
2
4
 
3
5
  interface WorkflowWideEvent {
4
6
  workflowId: string;
@@ -1,8 +1,8 @@
1
- function be(s){let E=s.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!E)return;let c=parseFloat(E[1]),a=E[2].toLowerCase();return{_tag:"Duration",millis:c*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[a]??1)}}var he="UNEXPECTED_ERROR";function Se(s){return he}function $(s){return{ok:!0,value:s}}function q(s,E){let c=E?.cause;return{ok:!1,error:s,...c!==void 0?{cause:c}:{}}}function de(s){if(s==null)return"unknown";if(typeof s=="string")return s.trim()||"unknown";if(typeof s=="object"){let E=s;if(typeof E._tag=="string"){let c=E._tag.trim();if(c)return c}if(typeof E.tag=="string"){let c=E.tag.trim();if(c)return c}if(typeof E.code=="string"){let c=E.code.trim();if(c)return c}else if(typeof E.code=="number")return String(E.code);if(s instanceof Error&&s.name){let c=s.name.trim();if(c)return c}}return"unknown"}function Ae(s,E){if(!(!E||!s))return E[s]}function _e(s){let{intent:E,domain:c,owner:a,tags:P,stateChanges:I,emits:O,calls:i}=s;if(!E&&!c&&!a&&!P?.length&&!I?.length&&!O?.length&&!i?.length)return;let M={};return E&&(M.intent=E),c&&(M.domain=c),a&&(M.owner=a),P?.length&&(M.tags=P),I?.length&&(M.stateChanges=I),O?.length&&(M.emits=O),i?.length&&(M.calls=i),M}function Y(s,E,c,a,P){let I=de(s),O=Ae(I,E),i={tag:I,origin:c};return O!==void 0&&(i.classification=O),a!==void 0&&(i.attempt=a),P!==void 0&&(i.cumulativeDurationMs=P),i}var ne=Symbol.for("step_timeout_marker");function Ee(s){return typeof s!="object"||s===null?!1:s.type==="STEP_TIMEOUT"?!0:ne in s}function Pe(s){if(!(typeof s!="object"||s===null)){if(s.type==="STEP_TIMEOUT"){let E=s;return{timeoutMs:E.timeoutMs,stepName:E.stepName,stepKey:E.stepKey,attempt:E.attempt}}if(ne in s)return s[ne]}}var ke=Symbol("early-exit");function Oe(s,E){return{[ke]:!0,error:s,meta:E}}function Me(s){return typeof s=="object"&&s!==null&&s[ke]===!0}var Te=Symbol("mapper-exception");function te(s){return{[Te]:!0,thrown:s}}function ve(s){return typeof s=="object"&&s!==null&&s[Te]===!0}function pe(s,E){let{backoff:c,initialDelay:a,maxDelay:P,jitter:I}=E,O;switch(c){case"fixed":O=a;break;case"linear":O=a*s;break;case"exponential":O=a*Math.pow(2,s-1);break}if(O=Math.min(O,P),I){let i=O*.25*Math.random();O=O+i}return Math.floor(O)}function me(s){return new Promise(E=>setTimeout(E,s))}var we=Symbol("timeout"),se=Symbol("timeout-option");function De(s){return typeof s=="object"&&s!==null&&s[se]===!0}async function Ie(s,E,c,a){let P=new AbortController,I=E.onTimeout??"error",O=()=>typeof I=="function"?I({name:c.name,key:c.key,ms:E.ms}):E.error??{type:"STEP_TIMEOUT",stepName:c.name,stepKey:c.key,timeoutMs:E.ms,attempt:c.attempt},i;a?.aborted&&P.abort(a.reason);let M;a&&!a.aborted&&(M=()=>P.abort(a.reason),a.addEventListener("abort",M,{once:!0}));let o=new Promise((A,j)=>{i=setTimeout(()=>{if(I!=="disconnect"&&P.abort(),I==="option"){j({[se]:!0,ms:E.ms});return}j({[we]:!0,error:O()})},E.ms)}),N;E.signal?N=Promise.resolve(s(P.signal)):N=Promise.resolve(s());try{return await Promise.race([N,o])}catch(A){if(typeof A=="object"&&A!==null&&A[se]===!0)throw{[se]:!0,ms:E.ms};if(typeof A=="object"&&A!==null&&A[we]===!0){I==="disconnect"&&N.catch(()=>{});let j=A.error;if(typeof j=="object"&&j!==null&&j.type!=="STEP_TIMEOUT"){let X={timeoutMs:E.ms,stepName:c.name,stepKey:c.key,attempt:c.attempt};ne in j?j[ne]=X:Object.defineProperty(j,ne,{value:X,enumerable:!1,writable:!0,configurable:!1})}throw j}throw A}finally{clearTimeout(i),M&&a&&a.removeEventListener("abort",M)}}var re={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function fe(s,E){let{onError:c,onEvent:a,catchUnexpected:P,workflowId:I,workflowName:O,context:i,_workflowSignal:M}=E&&typeof E=="object"?E:{},o=I??crypto.randomUUID(),N=P??Se,A=[],j=0,X=p=>p??`step_${++j}`,u=p=>{let F=p.context!==void 0||i===void 0?p:{...p,context:i},L=O!==void 0&&F.workflowName===void 0?{...F,workflowName:O}:F;if(L.type==="step_success"){let Q=L.stepId;for(let B=A.length-1;B>=0;B--){let v=A[B];if(v.type==="race"&&!v.winnerId){v.winnerId=Q;break}}}a?.(L,i)},U=Oe,V=p=>Me(p),K=(p,F)=>p,S=p=>typeof p=="function"?!1:!!(p&&typeof p=="object"&&"ok"in p||p&&typeof p=="object"&&"then"in p&&typeof p.then=="function");try{let F=function(n){let d={};for(let[r,t]of Object.entries(n))if(typeof t=="function")d[r]=t;else if(t&&typeof t=="object"&&"fn"in t)d[r]=t.fn;else throw new TypeError(`step.parallel: operation "${r}" must be a function or { fn, errors? } object`);return d},L=function(n,d){let r=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1;A.push({scopeId:r,type:"parallel"});let l=()=>{if(e)return;e=!0;let m=A.findIndex(w=>w.scopeId===r);m!==-1&&A.splice(m,1),u({type:"scope_end",workflowId:o,scopeId:r,ts:Date.now(),durationMs:performance.now()-t})};u({type:"scope_start",workflowId:o,scopeId:r,scopeType:"parallel",name:n,ts:Date.now()});try{let m=await d();if(l(),!m.ok)throw c?.(m.error,n,i),U(m.error,{origin:"result",resultCause:m.cause});return m.value}catch(m){throw l(),m}})()},Q=function(n,d){let r=Object.keys(n),t=d.name??`Parallel(${r.join(", ")})`,e=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let l=performance.now(),m=!1;A.push({scopeId:e,type:"parallel"});let w=()=>{if(m)return;m=!0;let f=A.findIndex(y=>y.scopeId===e);f!==-1&&A.splice(f,1),u({type:"scope_end",workflowId:o,scopeId:e,ts:Date.now(),durationMs:performance.now()-l})};u({type:"scope_start",workflowId:o,scopeId:e,scopeType:"parallel",name:t,ts:Date.now()});try{let f=await new Promise(T=>{if(r.length===0){T([]);return}let b=!1,D=r.length,g=new Array(r.length);for(let _=0;_<r.length;_++){let R=r[_],x=_;Promise.resolve(n[R]()).catch(C=>q({type:"PROMISE_REJECTED",cause:C},{cause:{type:"PROMISE_REJECTION",reason:C}})).then(C=>{if(!b){if(!C.ok){b=!0,T([{key:R,result:C}]);return}g[x]={key:R,result:C},D--,D===0&&T(g)}})}});w();let y={};for(let{key:T,result:b}of f){if(!b.ok)throw c?.(b.error,T,i),U(b.error,{origin:"result",resultCause:b.cause});y[T]=b.value}return y}catch(f){throw w(),f}})()};var W=F,ee=L,H=Q;let p=(n,d,r)=>(async()=>{if(typeof n!="string"||n.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let t=r??{},e=_e(t),l=n,m=t.key??n,w=t.key??n,{description:f,retry:y,timeout:T}=t,b=X(m),D=a,g=D?performance.now():0,R=S(d)?()=>d:d,C={attempts:Math.max(1,y?.attempts??1),backoff:y?.backoff??re.backoff,initialDelay:y?.initialDelay??re.initialDelay,maxDelay:y?.maxDelay??re.maxDelay,jitter:y?.jitter??re.jitter,retryOn:y?.retryOn??re.retryOn,onRetry:y?.onRetry??re.onRetry};a&&u({type:"step_start",workflowId:o,stepId:b,stepKey:m,name:l,description:f,ts:Date.now(),...e&&{metadata:e}});let Z;for(let h=1;h<=C.attempts;h++){let Ce=D?performance.now():0;try{let k;if(T?k=await Ie(R,T,{name:l,key:m,attempt:h},M):k=await R(),k.ok){let G=performance.now()-g;return u({type:"step_success",workflowId:o,stepId:b,stepKey:m,name:l,description:f,ts:Date.now(),durationMs:G,...e&&{metadata:e}}),w&&u({type:"step_complete",workflowId:o,stepKey:w,name:l,description:f,ts:Date.now(),durationMs:G,result:k,...e&&{metadata:e}}),k.value}if(Z=k,h<C.attempts&&C.retryOn(k.error,h)){let G=pe(h,C);u({type:"step_retry",workflowId:o,stepId:b,stepKey:m,name:l,ts:Date.now(),attempt:h+1,maxAttempts:C.attempts,delayMs:G,error:k.error,...e&&{metadata:e},diagnostics:Y(k.error,t.errorMeta,"result",h,performance.now()-g)}),C.onRetry(k.error,h,G),await me(G);continue}C.attempts>1&&u({type:"step_retries_exhausted",workflowId:o,stepId:b,stepKey:m,name:l,ts:Date.now(),durationMs:performance.now()-g,attempts:h,lastError:k.error,...e&&{metadata:e},diagnostics:Y(k.error,t.errorMeta,"result",h,performance.now()-g)});break}catch(k){let G=performance.now()-Ce;if(De(k)){let J=k.ms;u({type:"step_timeout",workflowId:o,stepId:b,stepKey:m,name:l,ts:Date.now(),timeoutMs:J,attempt:h,...e&&{metadata:e},diagnostics:Y(k,t.errorMeta,"timeout",h)}),u({type:"step_success",workflowId:o,stepId:b,stepKey:m,name:l,description:f,ts:Date.now(),durationMs:performance.now()-g,...e&&{metadata:e}}),w&&u({type:"step_complete",workflowId:o,stepKey:w,name:l,description:f,ts:Date.now(),durationMs:performance.now()-g,result:$(void 0),...e&&{metadata:e}});return}if(V(k))throw u({type:"step_aborted",workflowId:o,stepId:b,stepKey:m,name:l,description:f,ts:Date.now(),durationMs:G,...e&&{metadata:e}}),k;if(Ee(k)){let J=Pe(k),xe=T?.ms??J?.timeoutMs??0;if(u({type:"step_timeout",workflowId:o,stepId:b,stepKey:m,name:l,ts:Date.now(),timeoutMs:xe,attempt:h,...e&&{metadata:e},diagnostics:Y(k,t.errorMeta,"timeout",h)}),h<C.attempts&&C.retryOn(k,h)){let le=pe(h,C);u({type:"step_retry",workflowId:o,stepId:b,stepKey:m,name:l,ts:Date.now(),attempt:h+1,maxAttempts:C.attempts,delayMs:le,error:k,...e&&{metadata:e},diagnostics:Y(k,t.errorMeta,"timeout",h,performance.now()-g)}),C.onRetry(k,h,le),await me(le);continue}C.attempts>1&&u({type:"step_retries_exhausted",workflowId:o,stepId:b,stepKey:m,name:l,ts:Date.now(),durationMs:performance.now()-g,attempts:h,lastError:k,...e&&{metadata:e},diagnostics:Y(k,t.errorMeta,"timeout",h,performance.now()-g)});let ce=performance.now()-g;throw u({type:"step_error",workflowId:o,stepId:b,stepKey:m,name:l,description:f,ts:Date.now(),durationMs:ce,error:k,...e&&{metadata:e},diagnostics:Y(k,t.errorMeta,"timeout",h,ce)}),w&&u({type:"step_complete",workflowId:o,stepKey:w,name:l,description:f,ts:Date.now(),durationMs:ce,result:q(k,{cause:k}),meta:{origin:"throw",thrown:k},...e&&{metadata:e}}),c?.(k,l,i),U(k,{origin:"throw",thrown:k})}if(h<C.attempts&&C.retryOn(k,h)){let J=pe(h,C);u({type:"step_retry",workflowId:o,stepId:b,stepKey:m,name:l,ts:Date.now(),attempt:h+1,maxAttempts:C.attempts,delayMs:J,error:k,...e&&{metadata:e},diagnostics:Y(k,t.errorMeta,"throw",h,performance.now()-g)}),C.onRetry(k,h,J),await me(J);continue}C.attempts>1&&!Ee(k)&&u({type:"step_retries_exhausted",workflowId:o,stepId:b,stepKey:m,name:l,ts:Date.now(),durationMs:performance.now()-g,attempts:h,lastError:k,...e&&{metadata:e},diagnostics:Y(k,t.errorMeta,"throw",h,performance.now()-g)});let ue=performance.now()-g,oe;try{oe=N(k)}catch(J){throw te(J)}throw u({type:"step_error",workflowId:o,stepId:b,stepKey:m,name:l,description:f,ts:Date.now(),durationMs:ue,error:oe,...e&&{metadata:e},diagnostics:Y(k,t.errorMeta,"throw",h,ue)}),w&&u({type:"step_complete",workflowId:o,stepKey:w,name:l,description:f,ts:Date.now(),durationMs:ue,result:q(oe,{cause:k}),meta:{origin:"throw",thrown:k},...e&&{metadata:e}}),c?.(oe,l,i),U(oe,{origin:"throw",thrown:k})}}let z=Z,ae=performance.now()-g,ie=K(z.error,{origin:"result",resultCause:z.cause});throw u({type:"step_error",workflowId:o,stepId:b,stepKey:m,name:l,description:f,ts:Date.now(),durationMs:ae,error:ie,...e&&{metadata:e},diagnostics:Y(z.error,t.errorMeta,"result",C.attempts,ae)}),w&&u({type:"step_complete",workflowId:o,stepKey:w,name:l,description:f,ts:Date.now(),durationMs:ae,result:z,meta:{origin:"result",resultCause:z.cause},...e&&{metadata:e}}),c?.(ie,l,i),U(ie,{origin:"result",resultCause:z.cause})})();p.try=(n,d,r)=>{if(typeof n!="string"||n.length===0)throw new Error('[awaitly] step.try() requires an explicit string ID as the first argument. Example: step.try("parse", () => JSON.parse(str), { error: "PARSE_ERROR" })');let t=r.key??n,e=n,l=n,m="error"in r?()=>r.error:r.onError,w=a;return(async()=>{let f=w?performance.now():0;a&&u({type:"step_start",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now()});try{let y=await d(),T=performance.now()-f;return u({type:"step_success",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:T}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:T,result:$(y)}),y}catch(y){let T=m(y),b=performance.now()-f,D=K(T,{origin:"throw",thrown:y});throw u({type:"step_error",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:b,error:D}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:b,result:q(T,{cause:y}),meta:{origin:"throw",thrown:y}}),c?.(D,e,i),U(D,{origin:"throw",thrown:y})}})()},p.fromResult=(n,d,r)=>{if(typeof n!="string"||n.length===0)throw new Error('[awaitly] step.fromResult() requires an explicit string ID as the first argument. Example: step.fromResult("callProvider", () => callProvider(input), { onError: (e) => ({ type: "FAILED" }) })');let t=r.key??n,e=n,l=n,m="error"in r?()=>r.error:r.onError,w=a;return(async()=>{let f=w?performance.now():0;a&&u({type:"step_start",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now()});let y=await d();if(y.ok){let T=performance.now()-f;return u({type:"step_success",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:T}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:T,result:$(y.value)}),y.value}else{let T=m(y.error),b=performance.now()-f,D=K(T,{origin:"result",resultCause:y.error});throw u({type:"step_error",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:b,error:D}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:b,result:q(T,{cause:y.error}),meta:{origin:"result",resultCause:y.error}}),c?.(D,e,i),U(D,{origin:"result",resultCause:y.error})}})()},p.fromNullable=(n,d,r,t)=>{if(typeof n!="string"||n.length===0)throw new Error('[awaitly] step.fromNullable() requires an explicit string ID as the first argument. Example: step.fromNullable("getUser", () => db.find(id), () => ({ type: "NOT_FOUND" }))');return p(n,async()=>{let e=await d();return e!=null?$(e):q(r())},t)},p.retry=(n,d,r)=>{if(typeof n!="string"||n.length===0)throw new Error('[awaitly] step.retry() requires an explicit string ID as the first argument. Example: step.retry("fetchData", () => fetchData(), { attempts: 3 })');return p(n,d,{key:r.key??n,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})},p.withTimeout=(n,d,r)=>{if(typeof n!="string"||n.length===0)throw new Error('[awaitly] step.withTimeout() requires an explicit string ID as the first argument. Example: step.withTimeout("slowOp", () => slowOp(), { ms: 5000 })');return p(n,d,{key:r.key??n,timeout:r})},p.sleep=(n,d,r)=>{if(typeof n!="string"||n.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let t=typeof d=="string"?be(d):d;if(!t)throw new Error(`step.sleep: invalid duration '${d}'`);let e=t.millis,l=r?.signal;return p(n,async()=>{if(M?.aborted||l?.aborted){let m=new Error("Sleep aborted");throw m.name="AbortError",m}return new Promise((m,w)=>{let f={timeoutId:void 0},y=()=>{f.timeoutId&&clearTimeout(f.timeoutId);let T=new Error("Sleep aborted");T.name="AbortError",w(T)};M?.addEventListener("abort",y,{once:!0}),l?.addEventListener("abort",y,{once:!0}),f.timeoutId=setTimeout(()=>{M?.removeEventListener("abort",y),l?.removeEventListener("abort",y),m($(void 0))},e)})},{key:r?.key??n,description:r?.description})},p.parallel=((...n)=>{if(typeof n[0]!="string")throw new TypeError("step.parallel(name, ...): first argument must be a string (step name). Example: step.parallel('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let d=n[0],r=n[1];if(typeof r=="function")return L(d,r);if(r&&typeof r=="object"&&!Array.isArray(r)){let e=F(r);return Q(e,{name:d})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),p.race=(n,d)=>{let r=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1,l={scopeId:r,type:"race",winnerId:void 0};A.push(l);let m=()=>{if(e)return;e=!0;let w=A.findIndex(f=>f.scopeId===r);w!==-1&&A.splice(w,1),u({type:"scope_end",workflowId:o,scopeId:r,ts:Date.now(),durationMs:performance.now()-t,winnerId:l.winnerId})};u({type:"scope_start",workflowId:o,scopeId:r,scopeType:"race",name:n,ts:Date.now()});try{let w=await d();if(m(),!w.ok)throw c?.(w.error,n,i),U(w.error,{origin:"result",resultCause:w.cause});return w.value}catch(w){throw m(),w}})()},p.allSettled=(n,d)=>{let r=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1;A.push({scopeId:r,type:"allSettled"});let l=()=>{if(e)return;e=!0;let m=A.findIndex(w=>w.scopeId===r);m!==-1&&A.splice(m,1),u({type:"scope_end",workflowId:o,scopeId:r,ts:Date.now(),durationMs:performance.now()-t})};u({type:"scope_start",workflowId:o,scopeId:r,scopeType:"allSettled",name:n,ts:Date.now()});try{let m=await d();if(l(),!m.ok)throw c?.(m.error,n,i),U(m.error,{origin:"result",resultCause:m.cause});return m.value}catch(m){throw l(),m}})()},p.if=(n,d,r)=>r(),p.label=p.if,p.branch=async(n,d)=>{let{condition:r,then:t,else:e}=d;if(r())return await t();if(e)return await e()},p.arm=(n,d)=>({fn:n,errors:d}),p.forEach=async(n,d,r)=>{let t=[],e=r.maxIterations,l=0,m="run"in r,w=Symbol.asyncIterator in d?d:(async function*(){yield*d})();for await(let f of w){if(e!==void 0&&l>=e)break;let y;m?y=await r.run(f,l):y=await r.item.handler(f,l,p),t.push(y),l++}return t},p.item=n=>({__forEachItemHandler:!0,handler:n}),p.dep=(n,d)=>d,p.run=(n,d,r)=>p(n,()=>d,r),p.workflow=(n,d,r)=>p(n,d,r),p.andThen=(n,d,r,t)=>p(n,()=>r(d),t),p.match=async(n,d,r,t)=>p(n,async()=>{let e=await d;return e.ok?$(await r.ok(e.value)):$(await r.err(e.error,e.cause))},t),p.all=p.parallel,p.map=async(n,d,r,t)=>{let e=t?.concurrency??d.length;return p(n,()=>e>=d.length?ye(d.map((l,m)=>r(l,m))):(async()=>{let l=[];for(let m=0;m<d.length;m+=e){let w=d.slice(m,m+e),f=await ye(w.map((y,T)=>r(y,m+T)));if(!f.ok)return f;l.push(...f.value)}return $(l)})(),{key:t?.key})},p.withFallback=(n,d,r)=>{if(typeof n!="string"||n.length===0)throw new Error('[awaitly] step.withFallback() requires an explicit string ID as the first argument. Example: step.withFallback("getUser", () => fetchUser(id), { fallback: () => fetchFromCache(id) })');let t=r.key??n,e=n,l=X(t),m=a;return(async()=>{let w=m?performance.now():0;a&&u({type:"step_start",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now()});let f;try{f=await d()}catch(g){if(V(g))throw u({type:"step_aborted",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-w}),g;let _;try{_=N(g)}catch(x){throw te(x)}if(r.on!==void 0&&r.on!==_){let x=performance.now()-w;throw u({type:"step_error",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:x,error:_}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:x,result:q(_,{cause:g}),meta:{origin:"throw",thrown:g}}),c?.(_,e,i),U(_,{origin:"throw",thrown:g})}let R;try{R=await r.fallback()}catch(x){if(V(x))throw u({type:"step_aborted",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-w}),x;let C;try{C=N(x)}catch(z){throw te(z)}let Z=performance.now()-w;throw u({type:"step_error",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:Z,error:C}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:Z,result:q(C,{cause:x}),meta:{origin:"throw",thrown:x}}),c?.(C,e,i),U(C,{origin:"throw",thrown:x})}if(R.ok){let x=performance.now()-w;return u({type:"step_success",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:x}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:x,result:R,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(_)}}),R.value}else{let x=performance.now()-w,C=K(R.error,{origin:"result",resultCause:R.cause});throw u({type:"step_error",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:x,error:C}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:x,result:R,meta:{origin:"result",resultCause:R.cause}}),c?.(C,e,i),U(C,{origin:"result",resultCause:R.cause})}}if(f.ok){let g=performance.now()-w;return u({type:"step_success",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:g}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:g,result:f}),f.value}let y=f.error;if(r.on!==void 0&&r.on!==y){let g=performance.now()-w,_=K(y,{origin:"result",resultCause:f.cause});throw u({type:"step_error",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:g,error:_}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:g,result:f,meta:{origin:"result",resultCause:f.cause}}),c?.(_,e,i),U(_,{origin:"result",resultCause:f.cause})}let T;try{T=await r.fallback()}catch(g){if(V(g))throw u({type:"step_aborted",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-w}),g;let _;try{_=N(g)}catch(x){throw te(x)}let R=performance.now()-w;throw u({type:"step_error",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:R,error:_}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:R,result:q(_,{cause:g}),meta:{origin:"throw",thrown:g}}),c?.(_,e,i),U(_,{origin:"throw",thrown:g})}if(T.ok){let g=performance.now()-w;return u({type:"step_success",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:g}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:g,result:T,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(y)}}),T.value}let b=performance.now()-w,D=K(T.error,{origin:"result",resultCause:T.cause});throw u({type:"step_error",workflowId:o,stepId:l,stepKey:t,name:e,ts:Date.now(),durationMs:b,error:D}),t&&u({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:b,result:T,meta:{origin:"result",resultCause:T.cause}}),c?.(D,e,i),U(D,{origin:"result",resultCause:T.cause})})()},p.withResource=(n,d)=>{if(typeof n!="string"||n.length===0)throw new Error('[awaitly] step.withResource() requires an explicit string ID as the first argument. Example: step.withResource("useDb", { acquire: () => connect(), use: (db) => query(db), release: (db) => db.close() })');let r=n,t=n,e=X(r),l=a;return(async()=>{let m=l?performance.now():0;a&&u({type:"step_start",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now()});let w;try{w=await d.acquire()}catch(R){if(V(R))throw u({type:"step_aborted",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:performance.now()-m}),R;let x;try{x=N(R)}catch(Z){throw te(Z)}let C=performance.now()-m;throw u({type:"step_error",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:C,error:x}),r&&u({type:"step_complete",workflowId:o,stepKey:r,name:t,ts:Date.now(),durationMs:C,result:q(x,{cause:R}),meta:{origin:"throw",thrown:R}}),c?.(x,t,i),U(x,{origin:"throw",thrown:R})}if(!w.ok){let R=performance.now()-m,x=K(w.error,{origin:"result",resultCause:w.cause});throw u({type:"step_error",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:R,error:x}),r&&u({type:"step_complete",workflowId:o,stepKey:r,name:t,ts:Date.now(),durationMs:R,result:w,meta:{origin:"result",resultCause:w.cause}}),c?.(x,t,i),U(x,{origin:"result",resultCause:w.cause})}let f=w.value,y,T,b=!1;try{y=await d.use(f)}catch(R){if(V(R)){try{await d.release(f)}catch(x){console.warn(`[awaitly] step.withResource("${n}"): release threw after earlyExit:`,x)}throw R}T=R,b=!0}try{await d.release(f)}catch(R){console.warn(`[awaitly] step.withResource("${n}"): release threw:`,R)}if(b){let R;try{R=N(T)}catch(C){throw te(C)}let x=performance.now()-m;throw u({type:"step_error",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:x,error:R}),r&&u({type:"step_complete",workflowId:o,stepKey:r,name:t,ts:Date.now(),durationMs:x,result:q(R,{cause:T}),meta:{origin:"throw",thrown:T}}),c?.(R,t,i),U(R,{origin:"throw",thrown:T})}let D=y;if(D.ok){let R=performance.now()-m;return u({type:"step_success",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:R}),r&&u({type:"step_complete",workflowId:o,stepKey:r,name:t,ts:Date.now(),durationMs:R,result:D}),D.value}let g=performance.now()-m,_=K(D.error,{origin:"result",resultCause:D.cause});throw u({type:"step_error",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:g,error:_}),r&&u({type:"step_complete",workflowId:o,stepKey:r,name:t,ts:Date.now(),durationMs:g,result:D,meta:{origin:"result",resultCause:D.cause}}),c?.(_,t,i),U(_,{origin:"result",resultCause:D.cause})})()};let v=await s({step:p});if(process.env.NODE_ENV!=="production"&&v!==null&&typeof v=="object"&&"ok"in v&&typeof v.ok=="boolean"){let n=v;(n.ok===!0&&"value"in n||n.ok===!1&&"error"in n)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
1
+ var ae=class extends Error{_tag};function V(o,t){return class extends ae{_tag=o;constructor(c,i){let M=t?.message?t.message(c??{}):o;if(super(M),this.name=o,Object.setPrototypeOf(this,new.target.prototype),c&&typeof c=="object"){let{_tag:b,name:_,message:u,stack:P,...a}=c,v=Object.prototype.hasOwnProperty.call(a,"cause"),A=v?a.cause:void 0;v&&delete a.cause;let F=i?.cause!==void 0;if(v&&F)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,a),v&&(this.cause=A),F&&(this.cause=i?.cause)}else i?.cause!==void 0&&(this.cause=i.cause)}}}Object.defineProperty(V,Symbol.hasInstance,{value:o=>o instanceof ae});(M=>{function o(b){return b instanceof Error}M.isError=o;function t(b){return b instanceof ae}M.isTaggedError=t;function c(b,_){let u=b._tag,P=_[u];return P(b)}M.match=c;function i(b,_,u){let P=b._tag,a=_[P];return a?a(b):u(b)}M.matchPartial=i})(V||={});var ye=class extends V("TimeoutError",{message:t=>t.operation?`TimeoutError: ${t.operation} timed out after ${t.ms}ms`:`TimeoutError: Operation timed out after ${t.ms}ms`}){},ge=class extends V("RetryExhaustedError",{message:t=>t.operation?`RetryExhaustedError: ${t.operation} failed after ${t.attempts} attempts`:`RetryExhaustedError: Operation failed after ${t.attempts} attempts`}){},ke=class extends V("RateLimitError",{message:t=>t.limiterName?`RateLimitError: Rate limit exceeded for ${t.limiterName}${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`}){},Te=class extends V("CircuitBreakerOpenError",{message:t=>`CircuitBreakerOpenError: Circuit ${t.circuitName} is ${t.state??"OPEN"}${t.retryAfterMs?`, retry after ${Math.ceil(t.retryAfterMs/1e3)}s`:""}`}){},Re=class extends V("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},xe=class extends V("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},Ce=class extends V("UnauthorizedError",{message:t=>t.reason?`UnauthorizedError: ${t.reason}`:t.action&&t.resource?`UnauthorizedError: Not authorized to ${t.action} ${t.resource}`:"UnauthorizedError: Access denied"}){},be=class extends V("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},he=class extends V("CompensationError",{message:t=>`CompensationError: Failed to compensate step ${t.step}`}){},ie=class extends V("UnexpectedError",{message:t=>`UnexpectedError: ${t.cause instanceof Error?t.cause.message:String(t.cause??"unknown")}`}){};function Ne(o){let t=o.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let c=parseFloat(t[1]),i=t[2].toLowerCase();return{_tag:"Duration",millis:c*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[i]??1)}}function Ke(o){return new ie({cause:o})}function z(o){return{ok:!0,value:o}}function H(o,t){let c=t?.cause;return{ok:!1,error:o,...c!==void 0?{cause:c}:{}}}function fe(o){if(o==null)return"unknown";if(typeof o=="string")return o.trim()||"unknown";if(typeof o=="object"){let t=o;if(typeof t._tag=="string"){let c=t._tag.trim();if(c)return c}if(typeof t.tag=="string"){let c=t.tag.trim();if(c)return c}if(typeof t.code=="string"){let c=t.code.trim();if(c)return c}else if(typeof t.code=="number")return String(t.code);if(o instanceof Error&&o.name){let c=o.name.trim();if(c)return c}}return"unknown"}function Fe(o,t){if(!(!t||!o))return t[o]}function je(o){let{intent:t,domain:c,owner:i,tags:M,stateChanges:b,emits:_,calls:u}=o;if(!t&&!c&&!i&&!M?.length&&!b?.length&&!_?.length&&!u?.length)return;let P={};return t&&(P.intent=t),c&&(P.domain=c),i&&(P.owner=i),M?.length&&(P.tags=M),b?.length&&(P.stateChanges=b),_?.length&&(P.emits=_),u?.length&&(P.calls=u),P}function Y(o,t,c,i,M){let b=fe(o),_=Fe(b,t),u={tag:b,origin:c};return _!==void 0&&(u.classification=_),i!==void 0&&(u.attempt=i),M!==void 0&&(u.cumulativeDurationMs=M),u}var oe=Symbol.for("step_timeout_marker");function Se(o){return typeof o!="object"||o===null?!1:o.type==="STEP_TIMEOUT"?!0:oe in o}function We(o){if(!(typeof o!="object"||o===null)){if(o.type==="STEP_TIMEOUT"){let t=o;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if(oe in o)return o[oe]}}var Oe=Symbol("early-exit");function Be(o,t){return{[Oe]:!0,error:o,meta:t}}function Le(o){return typeof o=="object"&&o!==null&&o[Oe]===!0}var Me=Symbol("mapper-exception");function re(o){return{[Me]:!0,thrown:o}}function $e(o){return typeof o=="object"&&o!==null&&o[Me]===!0}function Ee(o,t){let{backoff:c,initialDelay:i,maxDelay:M,jitter:b}=t,_;switch(c){case"fixed":_=i;break;case"linear":_=i*o;break;case"exponential":_=i*Math.pow(2,o-1);break}if(_=Math.min(_,M),b){let u=_*.25*Math.random();_=_+u}return Math.floor(_)}function we(o){return new Promise(t=>setTimeout(t,o))}var Ae=Symbol("timeout"),ue=Symbol("timeout-option");function Ve(o){return typeof o=="object"&&o!==null&&o[ue]===!0}async function He(o,t,c,i){let M=new AbortController,b=t.onTimeout??"error",_=()=>typeof b=="function"?b({name:c.name,key:c.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:c.name,stepKey:c.key,timeoutMs:t.ms,attempt:c.attempt},u;i?.aborted&&M.abort(i.reason);let P;i&&!i.aborted&&(P=()=>M.abort(i.reason),i.addEventListener("abort",P,{once:!0}));let a=new Promise((A,F)=>{u=setTimeout(()=>{if(b!=="disconnect"&&M.abort(),b==="option"){F({[ue]:!0,ms:t.ms});return}F({[Ae]:!0,error:_()})},t.ms)}),v;t.signal?v=Promise.resolve(o(M.signal)):v=Promise.resolve(o());try{return await Promise.race([v,a])}catch(A){if(typeof A=="object"&&A!==null&&A[ue]===!0)throw{[ue]:!0,ms:t.ms};if(typeof A=="object"&&A!==null&&A[Ae]===!0){b==="disconnect"&&v.catch(()=>{});let F=A.error;if(typeof F=="object"&&F!==null&&F.type!=="STEP_TIMEOUT"){let q={timeoutMs:t.ms,stepName:c.name,stepKey:c.key,attempt:c.attempt};oe in F?F[oe]=q:Object.defineProperty(F,oe,{value:q,enumerable:!1,writable:!0,configurable:!1})}throw F}throw A}finally{clearTimeout(u),P&&i&&i.removeEventListener("abort",P)}}var ne={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function _e(o,t){let{onError:c,onEvent:i,catchUnexpected:M,workflowId:b,workflowName:_,context:u,_workflowSignal:P}=t&&typeof t=="object"?t:{},a=b??crypto.randomUUID(),v=M??Ke,A=[],F=0,q=d=>d??`step_${++F}`,l=d=>{let W=d.context!==void 0||u===void 0?d:{...d,context:u},B=_!==void 0&&W.workflowName===void 0?{...W,workflowName:_}:W;if(B.type==="step_success"){let Z=B.stepId;for(let L=A.length-1;L>=0;L--){let D=A[L];if(D.type==="race"&&!D.winnerId){D.winnerId=Z;break}}}i?.(B,u)},N=Be,$=d=>Le(d),K=(d,W)=>d,O=d=>typeof d=="function"?!1:!!(d&&typeof d=="object"&&"ok"in d||d&&typeof d=="object"&&"then"in d&&typeof d.then=="function");try{let W=function(s){let E={};for(let[n,r]of Object.entries(s))if(typeof r=="function")E[n]=r;else if(r&&typeof r=="object"&&"fn"in r)E[n]=r.fn;else throw new TypeError(`step.parallel: operation "${n}" must be a function or { fn, errors? } object`);return E},B=function(s,E){let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),e=!1;A.push({scopeId:n,type:"parallel"});let p=()=>{if(e)return;e=!0;let m=A.findIndex(w=>w.scopeId===n);m!==-1&&A.splice(m,1),l({type:"scope_end",workflowId:a,scopeId:n,ts:Date.now(),durationMs:performance.now()-r})};l({type:"scope_start",workflowId:a,scopeId:n,scopeType:"parallel",name:s,ts:Date.now()});try{let m=await E();if(p(),!m.ok)throw c?.(m.error,s,u),N(m.error,{origin:"result",resultCause:m.cause});return m.value}catch(m){throw p(),m}})()},Z=function(s,E){let n=Object.keys(s),r=E.name??`Parallel(${n.join(", ")})`,e=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let p=performance.now(),m=!1;A.push({scopeId:e,type:"parallel"});let w=()=>{if(m)return;m=!0;let f=A.findIndex(y=>y.scopeId===e);f!==-1&&A.splice(f,1),l({type:"scope_end",workflowId:a,scopeId:e,ts:Date.now(),durationMs:performance.now()-p})};l({type:"scope_start",workflowId:a,scopeId:e,scopeType:"parallel",name:r,ts:Date.now()});try{let f=await new Promise(k=>{if(n.length===0){k([]);return}let h=!1,U=n.length,T=new Array(n.length);for(let I=0;I<n.length;I++){let R=n[I],C=I;Promise.resolve(s[R]()).catch(x=>H({type:"PROMISE_REJECTED",cause:x},{cause:{type:"PROMISE_REJECTION",reason:x}})).then(x=>{if(!h){if(!x.ok){h=!0,k([{key:R,result:x}]);return}T[C]={key:R,result:x},U--,U===0&&k(T)}})}});w();let y={};for(let{key:k,result:h}of f){if(!h.ok)throw c?.(h.error,k,u),N(h.error,{origin:"result",resultCause:h.cause});y[k]=h.value}return y}catch(f){throw w(),f}})()};var j=W,te=B,J=Z;let d=(s,E,n)=>(async()=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let r=n??{},e=je(r),p=s,m=r.key??s,w=r.key??s,{description:f,retry:y,timeout:k}=r,h=q(m),U=i,T=U?performance.now():0,R=O(E)?()=>E:E,x={attempts:Math.max(1,y?.attempts??1),backoff:y?.backoff??ne.backoff,initialDelay:y?.initialDelay??ne.initialDelay,maxDelay:y?.maxDelay??ne.maxDelay,jitter:y?.jitter??ne.jitter,retryOn:y?.retryOn??ne.retryOn,onRetry:y?.onRetry??ne.onRetry};i&&l({type:"step_start",workflowId:a,stepId:h,stepKey:m,name:p,description:f,ts:Date.now(),...e&&{metadata:e}});let ee;for(let S=1;S<=x.attempts;S++){let De=U?performance.now():0;try{let g;if(k?g=await He(R,k,{name:p,key:m,attempt:S},P):g=await R(),g.ok){let Q=performance.now()-T;return l({type:"step_success",workflowId:a,stepId:h,stepKey:m,name:p,description:f,ts:Date.now(),durationMs:Q,...e&&{metadata:e}}),w&&l({type:"step_complete",workflowId:a,stepKey:w,name:p,description:f,ts:Date.now(),durationMs:Q,result:g,...e&&{metadata:e}}),g.value}if(ee=g,S<x.attempts&&x.retryOn(g.error,S)){let Q=Ee(S,x);l({type:"step_retry",workflowId:a,stepId:h,stepKey:m,name:p,ts:Date.now(),attempt:S+1,maxAttempts:x.attempts,delayMs:Q,error:g.error,...e&&{metadata:e},diagnostics:Y(g.error,r.errorMeta,"result",S,performance.now()-T)}),x.onRetry(g.error,S,Q),await we(Q);continue}x.attempts>1&&l({type:"step_retries_exhausted",workflowId:a,stepId:h,stepKey:m,name:p,ts:Date.now(),durationMs:performance.now()-T,attempts:S,lastError:g.error,...e&&{metadata:e},diagnostics:Y(g.error,r.errorMeta,"result",S,performance.now()-T)});break}catch(g){let Q=performance.now()-De;if(Ve(g)){let G=g.ms;l({type:"step_timeout",workflowId:a,stepId:h,stepKey:m,name:p,ts:Date.now(),timeoutMs:G,attempt:S,...e&&{metadata:e},diagnostics:Y(g,r.errorMeta,"timeout",S)}),l({type:"step_success",workflowId:a,stepId:h,stepKey:m,name:p,description:f,ts:Date.now(),durationMs:performance.now()-T,...e&&{metadata:e}}),w&&l({type:"step_complete",workflowId:a,stepKey:w,name:p,description:f,ts:Date.now(),durationMs:performance.now()-T,result:z(void 0),...e&&{metadata:e}});return}if($(g))throw l({type:"step_aborted",workflowId:a,stepId:h,stepKey:m,name:p,description:f,ts:Date.now(),durationMs:Q,...e&&{metadata:e}}),g;if(Se(g)){let G=We(g),Ue=k?.ms??G?.timeoutMs??0;if(l({type:"step_timeout",workflowId:a,stepId:h,stepKey:m,name:p,ts:Date.now(),timeoutMs:Ue,attempt:S,...e&&{metadata:e},diagnostics:Y(g,r.errorMeta,"timeout",S)}),S<x.attempts&&x.retryOn(g,S)){let me=Ee(S,x);l({type:"step_retry",workflowId:a,stepId:h,stepKey:m,name:p,ts:Date.now(),attempt:S+1,maxAttempts:x.attempts,delayMs:me,error:g,...e&&{metadata:e},diagnostics:Y(g,r.errorMeta,"timeout",S,performance.now()-T)}),x.onRetry(g,S,me),await we(me);continue}x.attempts>1&&l({type:"step_retries_exhausted",workflowId:a,stepId:h,stepKey:m,name:p,ts:Date.now(),durationMs:performance.now()-T,attempts:S,lastError:g,...e&&{metadata:e},diagnostics:Y(g,r.errorMeta,"timeout",S,performance.now()-T)});let de=performance.now()-T;throw l({type:"step_error",workflowId:a,stepId:h,stepKey:m,name:p,description:f,ts:Date.now(),durationMs:de,error:g,...e&&{metadata:e},diagnostics:Y(g,r.errorMeta,"timeout",S,de)}),w&&l({type:"step_complete",workflowId:a,stepKey:w,name:p,description:f,ts:Date.now(),durationMs:de,result:H(g,{cause:g}),meta:{origin:"throw",thrown:g},...e&&{metadata:e}}),c?.(g,p,u),N(g,{origin:"throw",thrown:g})}if(S<x.attempts&&x.retryOn(g,S)){let G=Ee(S,x);l({type:"step_retry",workflowId:a,stepId:h,stepKey:m,name:p,ts:Date.now(),attempt:S+1,maxAttempts:x.attempts,delayMs:G,error:g,...e&&{metadata:e},diagnostics:Y(g,r.errorMeta,"throw",S,performance.now()-T)}),x.onRetry(g,S,G),await we(G);continue}x.attempts>1&&!Se(g)&&l({type:"step_retries_exhausted",workflowId:a,stepId:h,stepKey:m,name:p,ts:Date.now(),durationMs:performance.now()-T,attempts:S,lastError:g,...e&&{metadata:e},diagnostics:Y(g,r.errorMeta,"throw",S,performance.now()-T)});let pe=performance.now()-T,se;try{se=v(g)}catch(G){throw re(G)}throw l({type:"step_error",workflowId:a,stepId:h,stepKey:m,name:p,description:f,ts:Date.now(),durationMs:pe,error:se,...e&&{metadata:e},diagnostics:Y(g,r.errorMeta,"throw",S,pe)}),w&&l({type:"step_complete",workflowId:a,stepKey:w,name:p,description:f,ts:Date.now(),durationMs:pe,result:H(se,{cause:g}),meta:{origin:"throw",thrown:g},...e&&{metadata:e}}),c?.(se,p,u),N(se,{origin:"throw",thrown:g})}}let X=ee,ce=performance.now()-T,le=K(X.error,{origin:"result",resultCause:X.cause});throw l({type:"step_error",workflowId:a,stepId:h,stepKey:m,name:p,description:f,ts:Date.now(),durationMs:ce,error:le,...e&&{metadata:e},diagnostics:Y(X.error,r.errorMeta,"result",x.attempts,ce)}),w&&l({type:"step_complete",workflowId:a,stepKey:w,name:p,description:f,ts:Date.now(),durationMs:ce,result:X,meta:{origin:"result",resultCause:X.cause},...e&&{metadata:e}}),c?.(le,p,u),N(le,{origin:"result",resultCause:X.cause})})();d.try=(s,E,n)=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step.try() requires an explicit string ID as the first argument. Example: step.try("parse", () => JSON.parse(str), { error: "PARSE_ERROR" })');let r=n.key??s,e=s,p=s,m="error"in n?()=>n.error:n.onError,w=i;return(async()=>{let f=w?performance.now():0;i&&l({type:"step_start",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now()});try{let y=await E(),k=performance.now()-f;return l({type:"step_success",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:k}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:k,result:z(y)}),y}catch(y){let k=m(y),h=performance.now()-f,U=K(k,{origin:"throw",thrown:y});throw l({type:"step_error",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:h,error:U}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:h,result:H(k,{cause:y}),meta:{origin:"throw",thrown:y}}),c?.(U,e,u),N(U,{origin:"throw",thrown:y})}})()},d.fromResult=(s,E,n)=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step.fromResult() requires an explicit string ID as the first argument. Example: step.fromResult("callProvider", () => callProvider(input), { onError: (e) => ({ type: "FAILED" }) })');let r=n.key??s,e=s,p=s,m="error"in n?()=>n.error:n.onError,w=i;return(async()=>{let f=w?performance.now():0;i&&l({type:"step_start",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now()});let y=await E();if(y.ok){let k=performance.now()-f;return l({type:"step_success",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:k}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:k,result:z(y.value)}),y.value}else{let k=m(y.error),h=performance.now()-f,U=K(k,{origin:"result",resultCause:y.error});throw l({type:"step_error",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:h,error:U}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:h,result:H(k,{cause:y.error}),meta:{origin:"result",resultCause:y.error}}),c?.(U,e,u),N(U,{origin:"result",resultCause:y.error})}})()},d.fromNullable=(s,E,n,r)=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step.fromNullable() requires an explicit string ID as the first argument. Example: step.fromNullable("getUser", () => db.find(id), () => ({ type: "NOT_FOUND" }))');return d(s,async()=>{let e=await E();return e!=null?z(e):H(n())},r)},d.retry=(s,E,n)=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step.retry() requires an explicit string ID as the first argument. Example: step.retry("fetchData", () => fetchData(), { attempts: 3 })');return d(s,E,{key:n.key??s,retry:{attempts:n.attempts,backoff:n.backoff,initialDelay:n.initialDelay,maxDelay:n.maxDelay,jitter:n.jitter,retryOn:n.retryOn,onRetry:n.onRetry},timeout:n.timeout})},d.withTimeout=(s,E,n)=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step.withTimeout() requires an explicit string ID as the first argument. Example: step.withTimeout("slowOp", () => slowOp(), { ms: 5000 })');return d(s,E,{key:n.key??s,timeout:n})},d.sleep=(s,E,n)=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let r=typeof E=="string"?Ne(E):E;if(!r)throw new Error(`step.sleep: invalid duration '${E}'`);let e=r.millis,p=n?.signal;return d(s,async()=>{if(P?.aborted||p?.aborted){let m=new Error("Sleep aborted");throw m.name="AbortError",m}return new Promise((m,w)=>{let f={timeoutId:void 0},y=()=>{f.timeoutId&&clearTimeout(f.timeoutId);let k=new Error("Sleep aborted");k.name="AbortError",w(k)};P?.addEventListener("abort",y,{once:!0}),p?.addEventListener("abort",y,{once:!0}),f.timeoutId=setTimeout(()=>{P?.removeEventListener("abort",y),p?.removeEventListener("abort",y),m(z(void 0))},e)})},{key:n?.key??s,description:n?.description})},d.parallel=((...s)=>{if(typeof s[0]!="string")throw new TypeError("step.parallel(name, ...): first argument must be a string (step name). Example: step.parallel('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let E=s[0],n=s[1];if(typeof n=="function")return B(E,n);if(n&&typeof n=="object"&&!Array.isArray(n)){let e=W(n);return Z(e,{name:E})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),d.race=(s,E)=>{let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),e=!1,p={scopeId:n,type:"race",winnerId:void 0};A.push(p);let m=()=>{if(e)return;e=!0;let w=A.findIndex(f=>f.scopeId===n);w!==-1&&A.splice(w,1),l({type:"scope_end",workflowId:a,scopeId:n,ts:Date.now(),durationMs:performance.now()-r,winnerId:p.winnerId})};l({type:"scope_start",workflowId:a,scopeId:n,scopeType:"race",name:s,ts:Date.now()});try{let w=await E();if(m(),!w.ok)throw c?.(w.error,s,u),N(w.error,{origin:"result",resultCause:w.cause});return w.value}catch(w){throw m(),w}})()},d.allSettled=(s,E)=>{let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),e=!1;A.push({scopeId:n,type:"allSettled"});let p=()=>{if(e)return;e=!0;let m=A.findIndex(w=>w.scopeId===n);m!==-1&&A.splice(m,1),l({type:"scope_end",workflowId:a,scopeId:n,ts:Date.now(),durationMs:performance.now()-r})};l({type:"scope_start",workflowId:a,scopeId:n,scopeType:"allSettled",name:s,ts:Date.now()});try{let m=await E();if(p(),!m.ok)throw c?.(m.error,s,u),N(m.error,{origin:"result",resultCause:m.cause});return m.value}catch(m){throw p(),m}})()},d.if=(s,E,n)=>n(),d.label=d.if,d.branch=async(s,E)=>{let{condition:n,then:r,else:e}=E;if(n())return await r();if(e)return await e()},d.arm=(s,E)=>({fn:s,errors:E}),d.forEach=async(s,E,n)=>{let r=[],e=n.maxIterations,p=0,m="run"in n,w=Symbol.asyncIterator in E?E:(async function*(){yield*E})();for await(let f of w){if(e!==void 0&&p>=e)break;let y;m?y=await n.run(f,p):y=await n.item.handler(f,p,d),r.push(y),p++}return r},d.item=s=>({__forEachItemHandler:!0,handler:s}),d.dep=(s,E)=>E,d.run=(s,E,n)=>d(s,()=>E,n),d.workflow=(s,E,n)=>d(s,E,n),d.andThen=(s,E,n,r)=>d(s,()=>n(E),r),d.match=async(s,E,n,r)=>d(s,async()=>{let e=await E;return e.ok?z(await n.ok(e.value)):z(await n.err(e.error,e.cause))},r),d.all=d.parallel,d.map=async(s,E,n,r)=>{let e=r?.concurrency??E.length;return d(s,()=>e>=E.length?Pe(E.map((p,m)=>n(p,m))):(async()=>{let p=[];for(let m=0;m<E.length;m+=e){let w=E.slice(m,m+e),f=await Pe(w.map((y,k)=>n(y,m+k)));if(!f.ok)return f;p.push(...f.value)}return z(p)})(),{key:r?.key})},d.withFallback=(s,E,n)=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step.withFallback() requires an explicit string ID as the first argument. Example: step.withFallback("getUser", () => fetchUser(id), { fallback: () => fetchFromCache(id) })');let r=n.key??s,e=s,p=q(r),m=i;return(async()=>{let w=m?performance.now():0;i&&l({type:"step_start",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now()});let f;try{f=await E()}catch(T){if($(T))throw l({type:"step_aborted",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:performance.now()-w}),T;let I;try{I=v(T)}catch(C){throw re(C)}if(n.on!==void 0&&n.on!==I){let C=performance.now()-w;throw l({type:"step_error",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:C,error:I}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:C,result:H(I,{cause:T}),meta:{origin:"throw",thrown:T}}),c?.(I,e,u),N(I,{origin:"throw",thrown:T})}let R;try{R=await n.fallback()}catch(C){if($(C))throw l({type:"step_aborted",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:performance.now()-w}),C;let x;try{x=v(C)}catch(X){throw re(X)}let ee=performance.now()-w;throw l({type:"step_error",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:ee,error:x}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:ee,result:H(x,{cause:C}),meta:{origin:"throw",thrown:C}}),c?.(x,e,u),N(x,{origin:"throw",thrown:C})}if(R.ok){let C=performance.now()-w;return l({type:"step_success",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:C}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:C,result:R,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(I)}}),R.value}else{let C=performance.now()-w,x=K(R.error,{origin:"result",resultCause:R.cause});throw l({type:"step_error",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:C,error:x}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:C,result:R,meta:{origin:"result",resultCause:R.cause}}),c?.(x,e,u),N(x,{origin:"result",resultCause:R.cause})}}if(f.ok){let T=performance.now()-w;return l({type:"step_success",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:T}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:T,result:f}),f.value}let y=f.error;if(n.on!==void 0&&n.on!==y){let T=performance.now()-w,I=K(y,{origin:"result",resultCause:f.cause});throw l({type:"step_error",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:T,error:I}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:T,result:f,meta:{origin:"result",resultCause:f.cause}}),c?.(I,e,u),N(I,{origin:"result",resultCause:f.cause})}let k;try{k=await n.fallback()}catch(T){if($(T))throw l({type:"step_aborted",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:performance.now()-w}),T;let I;try{I=v(T)}catch(C){throw re(C)}let R=performance.now()-w;throw l({type:"step_error",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:R,error:I}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:R,result:H(I,{cause:T}),meta:{origin:"throw",thrown:T}}),c?.(I,e,u),N(I,{origin:"throw",thrown:T})}if(k.ok){let T=performance.now()-w;return l({type:"step_success",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:T}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:T,result:k,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(y)}}),k.value}let h=performance.now()-w,U=K(k.error,{origin:"result",resultCause:k.cause});throw l({type:"step_error",workflowId:a,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:h,error:U}),r&&l({type:"step_complete",workflowId:a,stepKey:r,name:e,ts:Date.now(),durationMs:h,result:k,meta:{origin:"result",resultCause:k.cause}}),c?.(U,e,u),N(U,{origin:"result",resultCause:k.cause})})()},d.withResource=(s,E)=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step.withResource() requires an explicit string ID as the first argument. Example: step.withResource("useDb", { acquire: () => connect(), use: (db) => query(db), release: (db) => db.close() })');let n=s,r=s,e=q(n),p=i;return(async()=>{let m=p?performance.now():0;i&&l({type:"step_start",workflowId:a,stepId:e,stepKey:n,name:r,ts:Date.now()});let w;try{w=await E.acquire()}catch(R){if($(R))throw l({type:"step_aborted",workflowId:a,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:performance.now()-m}),R;let C;try{C=v(R)}catch(ee){throw re(ee)}let x=performance.now()-m;throw l({type:"step_error",workflowId:a,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:x,error:C}),n&&l({type:"step_complete",workflowId:a,stepKey:n,name:r,ts:Date.now(),durationMs:x,result:H(C,{cause:R}),meta:{origin:"throw",thrown:R}}),c?.(C,r,u),N(C,{origin:"throw",thrown:R})}if(!w.ok){let R=performance.now()-m,C=K(w.error,{origin:"result",resultCause:w.cause});throw l({type:"step_error",workflowId:a,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:R,error:C}),n&&l({type:"step_complete",workflowId:a,stepKey:n,name:r,ts:Date.now(),durationMs:R,result:w,meta:{origin:"result",resultCause:w.cause}}),c?.(C,r,u),N(C,{origin:"result",resultCause:w.cause})}let f=w.value,y,k,h=!1;try{y=await E.use(f)}catch(R){if($(R)){try{await E.release(f)}catch(C){console.warn(`[awaitly] step.withResource("${s}"): release threw after earlyExit:`,C)}throw R}k=R,h=!0}try{await E.release(f)}catch(R){console.warn(`[awaitly] step.withResource("${s}"): release threw:`,R)}if(h){let R;try{R=v(k)}catch(x){throw re(x)}let C=performance.now()-m;throw l({type:"step_error",workflowId:a,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:C,error:R}),n&&l({type:"step_complete",workflowId:a,stepKey:n,name:r,ts:Date.now(),durationMs:C,result:H(R,{cause:k}),meta:{origin:"throw",thrown:k}}),c?.(R,r,u),N(R,{origin:"throw",thrown:k})}let U=y;if(U.ok){let R=performance.now()-m;return l({type:"step_success",workflowId:a,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:R}),n&&l({type:"step_complete",workflowId:a,stepKey:n,name:r,ts:Date.now(),durationMs:R,result:U}),U.value}let T=performance.now()-m,I=K(U.error,{origin:"result",resultCause:U.cause});throw l({type:"step_error",workflowId:a,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:T,error:I}),n&&l({type:"step_complete",workflowId:a,stepKey:n,name:r,ts:Date.now(),durationMs:T,result:U,meta:{origin:"result",resultCause:U.cause}}),c?.(I,r,u),N(I,{origin:"result",resultCause:U.cause})})()};let D=await o({step:d});if(process.env.NODE_ENV!=="production"&&D!==null&&typeof D=="object"&&"ok"in D&&typeof D.ok=="boolean"){let s=D;(s.ok===!0&&"value"in s||s.ok===!1&&"error"in s)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
2
2
 
3
3
  Incorrect: return ok({ data });
4
4
  Correct: return { data };
5
5
 
6
- See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return $(v)}catch(p){if(ve(p))throw p.thrown;if(V(p)){let L=p.meta.origin==="throw"?p.meta.thrown:p.meta.origin==="result"?p.meta.resultCause:void 0;return q(p.error,{cause:L})}let F=N(p);return c?.(F,"unexpected",i),q(F,{cause:p})}}fe.strict=(s,E)=>fe(s,E);async function ye(s){return s.length===0?$([]):new Promise(E=>{let c=!1,a=s.length,P=new Array(s.length);for(let I=0;I<s.length;I++){let O=I;Promise.resolve(s[O]).catch(i=>q({type:"PROMISE_REJECTED",cause:i},{cause:{type:"PROMISE_REJECTION",reason:i}})).then(i=>{if(!c){if(!i.ok){c=!0,E(i);return}P[O]=i.value,a--,a===0&&E($(P))}})}})}function ge(){return{terminalSeen:!1,steps:new Map,stepKeyToId:new Map,counters:{errors:0,retries:0,cacheHits:0,timeouts:0},integrityWarnings:[]}}function Ue(s,E){let c=s.steps.get(E);return c||(c={events:[],terminalSeen:!1},s.steps.set(E,c)),c}function Ne(s,E){if("stepId"in s&&typeof s.stepId=="string")return s.stepId;if("stepKey"in s&&typeof s.stepKey=="string"){let c=E.stepKeyToId.get(s.stepKey);return c?E.steps.get(c)?.terminalSeen?(E.stepKeyToId.delete(s.stepKey),s.stepKey):c:s.stepKey}}var Ke=new Set(["step_success","step_error","step_cache_hit","step_skipped","step_aborted"]);function Re(s,E,c){let P={tag:c?.tag??de(s)};return c?.classification&&(P.classification=c.classification),c?.origin&&(P.origin=c.origin),E&&s instanceof Error&&s.stack&&(P.stack=s.stack.split(`
7
- `).map(I=>I.trim())),P}function We(s){let E=s?.includeStacks??!1,c=s?.redact,a=ge();function P(i){switch(i.type){case"workflow_start":a.workflowId=i.workflowId,a.workflowName=i.workflowName,a.startedAt=i.ts;break;case"workflow_success":a.terminalSeen&&a.integrityWarnings.push("Duplicate workflow terminal event: workflow_success"),a.status="success",a.endedAt=i.ts,a.terminalSeen=!0;break;case"workflow_error":a.terminalSeen&&a.integrityWarnings.push("Duplicate workflow terminal event: workflow_error"),a.status="error",a.endedAt=i.ts,a.workflowError=i.error,a.terminalSeen=!0;break;case"workflow_cancelled":a.terminalSeen&&a.integrityWarnings.push("Duplicate workflow terminal event: workflow_cancelled"),a.status="cancelled",a.endedAt=i.ts,a.terminalSeen=!0;break;default:{let M=Ne(i,a);if(!M)break;let o=Ue(a,M);switch(o.events.push(i),i.type){case"step_start":if(o.metadata=i.metadata,o.startTs=i.ts,o.name=i.name,o.key=i.stepKey,i.stepKey&&i.stepId!==i.stepKey){a.stepKeyToId.set(i.stepKey,M);let N=a.steps.get(i.stepKey);N&&N!==o&&N.startTs===void 0&&(o.events.unshift(...N.events),N.terminalSeen&&(o.terminalSeen=!0),a.steps.delete(i.stepKey))}break;case"step_success":case"step_error":case"step_cache_hit":case"step_skipped":case"step_aborted":o.terminalSeen&&a.integrityWarnings.push(`Duplicate step terminal event for step "${M}": ${i.type}`),o.terminalSeen=!0,i.type==="step_error"&&a.counters.errors++,i.type==="step_cache_hit"&&a.counters.cacheHits++,!o.name&&"name"in i&&i.name&&(o.name=i.name),!o.key&&"stepKey"in i&&i.stepKey&&(o.key=i.stepKey),!o.metadata&&"metadata"in i&&i.metadata&&(o.metadata=i.metadata);break;case"step_retry":a.counters.retries++;break;case"step_timeout":a.counters.timeouts++;break}break}}}function I(){let i=[...a.integrityWarnings];a.terminalSeen||i.push("wideEvent() called before workflow terminal event");let M=a.startedAt??0,o=a.endedAt??0,N=[],A=new Map,j=new Map,X=new Map;for(let[K,S]of a.steps){S.events.some(v=>v.type==="step_start")||i.push(`No step_start seen for step "${K}"`);let W="error",ee,H,p,F=[...S.events].reverse().find(v=>Ke.has(v.type));if(F){switch(F.type){case"step_success":W="success";break;case"step_error":W="error";break;case"step_cache_hit":W="cached";break;case"step_skipped":W="skipped";break;case"step_aborted":W="aborted";break}"durationMs"in F&&typeof F.durationMs=="number"&&(ee=F.durationMs)}else S.events.some(n=>n.type==="step_timeout")&&(W="error",p=!0);let L=[...S.events].reverse().find(v=>v.type==="step_error"||v.type==="step_retries_exhausted");if(L){let v="error"in L?L.error:"lastError"in L?L.lastError:void 0,n="diagnostics"in L?L.diagnostics:void 0;if(H=Re(v,E,n),H?.tag&&X.set(H.tag,(X.get(H.tag)??0)+1),H?.classification?.severity){let d=H.classification.severity;j.set(d,(j.get(d)??0)+1)}}p===void 0&&S.events.some(n=>n.type==="step_timeout")&&(p=!0);let Q=S.events.filter(v=>v.type==="step_retry").length;if(S.metadata?.domain&&(W==="success"||W==="error")){let v=S.metadata.domain,n=A.get(v);n||(n={total:0,errors:0,totalDuration:0,counted:0},A.set(v,n)),n.total++,W==="error"&&n.errors++,ee!==void 0&&(n.totalDuration+=ee,n.counted++)}let B={stepId:K,name:S.name??K,status:W};S.key&&(B.key=S.key),ee!==void 0&&(B.durationMs=ee),S.metadata?.domain&&(B.domain=S.metadata.domain),S.metadata?.owner&&(B.owner=S.metadata.owner),S.metadata?.intent&&(B.intent=S.metadata.intent),S.metadata?.tags?.length&&(B.tags=S.metadata.tags),S.metadata?.calls?.length&&(B.calls=S.metadata.calls),H&&(B.error=H),Q>0&&(B.retryCount=Q),p&&(B.timedOut=p),N.push(B)}let u={totalSteps:N.length,errors:a.counters.errors,retries:a.counters.retries,cacheHits:a.counters.cacheHits,timeouts:a.counters.timeouts};if(A.size>0){let K={};for(let[S,W]of A)K[S]={total:W.total,errors:W.errors,avgDurationMs:W.counted>0?W.totalDuration/W.counted:0};u.byDomain=K}if(j.size>0){let K={};for(let[S,W]of j)K[S]=W;u.bySeverity=K}X.size>0&&(u.topFailingTags=[...X.entries()].map(([K,S])=>({tag:K,count:S})).sort((K,S)=>S.count-K.count));let U;a.status==="error"&&a.workflowError!==void 0&&(U=Re(a.workflowError,E));let V={workflowId:a.workflowId??"unknown",startedAt:new Date(M).toISOString(),endedAt:new Date(o).toISOString(),durationMs:o-M,status:a.status??"error",steps:N,summary:u};return a.workflowName&&(V.workflowName=a.workflowName),U&&(V.error=U),i.length>0&&(V.integrityWarnings=i),c&&(V=c(V)),V}function O(){a=ge()}return{handleEvent:P,wideEvent:I,reset:O}}export{We as createDiagnosticsCollector};
6
+ See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return z(D)}catch(d){if($e(d))throw d.thrown;if($(d)){let B=d.meta.origin==="throw"?d.meta.thrown:d.meta.origin==="result"?d.meta.resultCause:void 0;return H(d.error,{cause:B})}let W=v(d);return c?.(W,"unexpected",u),H(W,{cause:d})}}_e.strict=(o,t)=>_e(o,t);async function Pe(o){return o.length===0?z([]):new Promise(t=>{let c=!1,i=o.length,M=new Array(o.length);for(let b=0;b<o.length;b++){let _=b;Promise.resolve(o[_]).catch(u=>H({type:"PROMISE_REJECTED",cause:u},{cause:{type:"PROMISE_REJECTION",reason:u}})).then(u=>{if(!c){if(!u.ok){c=!0,t(u);return}M[_]=u.value,i--,i===0&&t(z(M))}})}})}function ve(){return{terminalSeen:!1,steps:new Map,stepKeyToId:new Map,counters:{errors:0,retries:0,cacheHits:0,timeouts:0},integrityWarnings:[]}}function qe(o,t){let c=o.steps.get(t);return c||(c={events:[],terminalSeen:!1},o.steps.set(t,c)),c}function Ye(o,t){if("stepId"in o&&typeof o.stepId=="string")return o.stepId;if("stepKey"in o&&typeof o.stepKey=="string"){let c=t.stepKeyToId.get(o.stepKey);return c?t.steps.get(c)?.terminalSeen?(t.stepKeyToId.delete(o.stepKey),o.stepKey):c:o.stepKey}}var ze=new Set(["step_success","step_error","step_cache_hit","step_skipped","step_aborted"]);function Ie(o,t,c){let M={tag:c?.tag??fe(o)};return c?.classification&&(M.classification=c.classification),c?.origin&&(M.origin=c.origin),t&&o instanceof Error&&o.stack&&(M.stack=o.stack.split(`
7
+ `).map(b=>b.trim())),M}function Je(o){let t=o?.includeStacks??!1,c=o?.redact,i=ve();function M(u){switch(u.type){case"workflow_start":i.workflowId=u.workflowId,i.workflowName=u.workflowName,i.startedAt=u.ts;break;case"workflow_success":i.terminalSeen&&i.integrityWarnings.push("Duplicate workflow terminal event: workflow_success"),i.status="success",i.endedAt=u.ts,i.terminalSeen=!0;break;case"workflow_error":i.terminalSeen&&i.integrityWarnings.push("Duplicate workflow terminal event: workflow_error"),i.status="error",i.endedAt=u.ts,i.workflowError=u.error,i.terminalSeen=!0;break;case"workflow_cancelled":i.terminalSeen&&i.integrityWarnings.push("Duplicate workflow terminal event: workflow_cancelled"),i.status="cancelled",i.endedAt=u.ts,i.terminalSeen=!0;break;default:{let P=Ye(u,i);if(!P)break;let a=qe(i,P);switch(a.events.push(u),u.type){case"step_start":if(a.metadata=u.metadata,a.startTs=u.ts,a.name=u.name,a.key=u.stepKey,u.stepKey&&u.stepId!==u.stepKey){i.stepKeyToId.set(u.stepKey,P);let v=i.steps.get(u.stepKey);v&&v!==a&&v.startTs===void 0&&(a.events.unshift(...v.events),v.terminalSeen&&(a.terminalSeen=!0),i.steps.delete(u.stepKey))}break;case"step_success":case"step_error":case"step_cache_hit":case"step_skipped":case"step_aborted":a.terminalSeen&&i.integrityWarnings.push(`Duplicate step terminal event for step "${P}": ${u.type}`),a.terminalSeen=!0,u.type==="step_error"&&i.counters.errors++,u.type==="step_cache_hit"&&i.counters.cacheHits++,!a.name&&"name"in u&&u.name&&(a.name=u.name),!a.key&&"stepKey"in u&&u.stepKey&&(a.key=u.stepKey),!a.metadata&&"metadata"in u&&u.metadata&&(a.metadata=u.metadata);break;case"step_retry":i.counters.retries++;break;case"step_timeout":i.counters.timeouts++;break}break}}}function b(){let u=[...i.integrityWarnings];i.terminalSeen||u.push("wideEvent() called before workflow terminal event");let P=i.startedAt??0,a=i.endedAt??0,v=[],A=new Map,F=new Map,q=new Map;for(let[K,O]of i.steps){O.events.some(D=>D.type==="step_start")||u.push(`No step_start seen for step "${K}"`);let j="error",te,J,d,W=[...O.events].reverse().find(D=>ze.has(D.type));if(W){switch(W.type){case"step_success":j="success";break;case"step_error":j="error";break;case"step_cache_hit":j="cached";break;case"step_skipped":j="skipped";break;case"step_aborted":j="aborted";break}"durationMs"in W&&typeof W.durationMs=="number"&&(te=W.durationMs)}else O.events.some(s=>s.type==="step_timeout")&&(j="error",d=!0);let B=[...O.events].reverse().find(D=>D.type==="step_error"||D.type==="step_retries_exhausted");if(B){let D="error"in B?B.error:"lastError"in B?B.lastError:void 0,s="diagnostics"in B?B.diagnostics:void 0;if(J=Ie(D,t,s),J?.tag&&q.set(J.tag,(q.get(J.tag)??0)+1),J?.classification?.severity){let E=J.classification.severity;F.set(E,(F.get(E)??0)+1)}}d===void 0&&O.events.some(s=>s.type==="step_timeout")&&(d=!0);let Z=O.events.filter(D=>D.type==="step_retry").length;if(O.metadata?.domain&&(j==="success"||j==="error")){let D=O.metadata.domain,s=A.get(D);s||(s={total:0,errors:0,totalDuration:0,counted:0},A.set(D,s)),s.total++,j==="error"&&s.errors++,te!==void 0&&(s.totalDuration+=te,s.counted++)}let L={stepId:K,name:O.name??K,status:j};O.key&&(L.key=O.key),te!==void 0&&(L.durationMs=te),O.metadata?.domain&&(L.domain=O.metadata.domain),O.metadata?.owner&&(L.owner=O.metadata.owner),O.metadata?.intent&&(L.intent=O.metadata.intent),O.metadata?.tags?.length&&(L.tags=O.metadata.tags),O.metadata?.calls?.length&&(L.calls=O.metadata.calls),J&&(L.error=J),Z>0&&(L.retryCount=Z),d&&(L.timedOut=d),v.push(L)}let l={totalSteps:v.length,errors:i.counters.errors,retries:i.counters.retries,cacheHits:i.counters.cacheHits,timeouts:i.counters.timeouts};if(A.size>0){let K={};for(let[O,j]of A)K[O]={total:j.total,errors:j.errors,avgDurationMs:j.counted>0?j.totalDuration/j.counted:0};l.byDomain=K}if(F.size>0){let K={};for(let[O,j]of F)K[O]=j;l.bySeverity=K}q.size>0&&(l.topFailingTags=[...q.entries()].map(([K,O])=>({tag:K,count:O})).sort((K,O)=>O.count-K.count));let N;i.status==="error"&&i.workflowError!==void 0&&(N=Ie(i.workflowError,t));let $={workflowId:i.workflowId??"unknown",startedAt:new Date(P).toISOString(),endedAt:new Date(a).toISOString(),durationMs:a-P,status:i.status??"error",steps:v,summary:l};return i.workflowName&&($.workflowName=i.workflowName),N&&($.error=N),u.length>0&&($.integrityWarnings=u),c&&($=c($)),$}function _(){i=ve()}return{handleEvent:M,wideEvent:b,reset:_}}export{Je as createDiagnosticsCollector};
8
8
  //# sourceMappingURL=diagnostics.js.map