awaitly 1.35.0 → 2.0.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 (241) hide show
  1. package/dist/{duration.d.ts → di-BDlT7InM.d.cts} +15 -1
  2. package/dist/{duration.d.cts → di-BbFFfO8y.d.ts} +15 -1
  3. package/dist/errors-DtXvrCiO.d.cts +708 -0
  4. package/dist/errors-DtXvrCiO.d.ts +708 -0
  5. package/dist/index.cjs +4594 -1
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +1970 -141
  8. package/dist/index.d.ts +1970 -141
  9. package/dist/index.js +4398 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/result.cjs +641 -1
  12. package/dist/result.cjs.map +1 -1
  13. package/dist/result.d.cts +29 -4
  14. package/dist/result.d.ts +29 -4
  15. package/dist/result.js +561 -1
  16. package/dist/result.js.map +1 -1
  17. package/dist/testing.cjs +4202 -8
  18. package/dist/testing.cjs.map +1 -1
  19. package/dist/testing.d.cts +2 -6
  20. package/dist/testing.d.ts +2 -6
  21. package/dist/testing.js +4154 -8
  22. package/dist/testing.js.map +1 -1
  23. package/dist/{run-entry-DGs0tySr.d.cts → types-B8NfNRGX.d.ts} +1078 -1502
  24. package/dist/{run-entry-BOuNyVoO.d.ts → types-BZ2f4MRR.d.cts} +1078 -1502
  25. package/dist/workflow.cjs +7096 -6
  26. package/dist/workflow.cjs.map +1 -1
  27. package/dist/workflow.d.cts +3346 -22
  28. package/dist/workflow.d.ts +3346 -22
  29. package/dist/workflow.js +6929 -6
  30. package/dist/workflow.js.map +1 -1
  31. package/package.json +3 -168
  32. package/dist/adapters.cjs +0 -7
  33. package/dist/adapters.cjs.map +0 -1
  34. package/dist/adapters.d.cts +0 -179
  35. package/dist/adapters.d.ts +0 -179
  36. package/dist/adapters.js +0 -7
  37. package/dist/adapters.js.map +0 -1
  38. package/dist/batch.cjs +0 -7
  39. package/dist/batch.cjs.map +0 -1
  40. package/dist/batch.d.cts +0 -200
  41. package/dist/batch.d.ts +0 -200
  42. package/dist/batch.js +0 -7
  43. package/dist/batch.js.map +0 -1
  44. package/dist/bind-deps.cjs +0 -2
  45. package/dist/bind-deps.cjs.map +0 -1
  46. package/dist/bind-deps.d.cts +0 -28
  47. package/dist/bind-deps.d.ts +0 -28
  48. package/dist/bind-deps.js +0 -2
  49. package/dist/bind-deps.js.map +0 -1
  50. package/dist/cache.cjs +0 -2
  51. package/dist/cache.cjs.map +0 -1
  52. package/dist/cache.d.cts +0 -269
  53. package/dist/cache.d.ts +0 -269
  54. package/dist/cache.js +0 -2
  55. package/dist/cache.js.map +0 -1
  56. package/dist/circuit-breaker.cjs +0 -7
  57. package/dist/circuit-breaker.cjs.map +0 -1
  58. package/dist/circuit-breaker.d.cts +0 -211
  59. package/dist/circuit-breaker.d.ts +0 -211
  60. package/dist/circuit-breaker.js +0 -7
  61. package/dist/circuit-breaker.js.map +0 -1
  62. package/dist/conditional.cjs +0 -2
  63. package/dist/conditional.cjs.map +0 -1
  64. package/dist/conditional.d.cts +0 -252
  65. package/dist/conditional.d.ts +0 -252
  66. package/dist/conditional.js +0 -2
  67. package/dist/conditional.js.map +0 -1
  68. package/dist/core.cjs +0 -7
  69. package/dist/core.cjs.map +0 -1
  70. package/dist/core.d.cts +0 -5
  71. package/dist/core.d.ts +0 -5
  72. package/dist/core.js +0 -7
  73. package/dist/core.js.map +0 -1
  74. package/dist/di-By77n4Fa.d.ts +0 -15
  75. package/dist/di-OJfsohf-.d.cts +0 -15
  76. package/dist/diagnostics.cjs +0 -8
  77. package/dist/diagnostics.cjs.map +0 -1
  78. package/dist/diagnostics.d.cts +0 -68
  79. package/dist/diagnostics.d.ts +0 -68
  80. package/dist/diagnostics.js +0 -8
  81. package/dist/diagnostics.js.map +0 -1
  82. package/dist/durable.cjs +0 -11
  83. package/dist/durable.cjs.map +0 -1
  84. package/dist/durable.d.cts +0 -9
  85. package/dist/durable.d.ts +0 -9
  86. package/dist/durable.js +0 -11
  87. package/dist/durable.js.map +0 -1
  88. package/dist/duration.cjs +0 -2
  89. package/dist/duration.cjs.map +0 -1
  90. package/dist/duration.js +0 -2
  91. package/dist/duration.js.map +0 -1
  92. package/dist/engine.cjs +0 -11
  93. package/dist/engine.cjs.map +0 -1
  94. package/dist/engine.d.cts +0 -115
  95. package/dist/engine.d.ts +0 -115
  96. package/dist/engine.js +0 -11
  97. package/dist/engine.js.map +0 -1
  98. package/dist/errors.cjs +0 -2
  99. package/dist/errors.cjs.map +0 -1
  100. package/dist/errors.d.cts +0 -361
  101. package/dist/errors.d.ts +0 -361
  102. package/dist/errors.js +0 -2
  103. package/dist/errors.js.map +0 -1
  104. package/dist/fetch.cjs +0 -7
  105. package/dist/fetch.cjs.map +0 -1
  106. package/dist/fetch.d.cts +0 -86
  107. package/dist/fetch.d.ts +0 -86
  108. package/dist/fetch.js +0 -7
  109. package/dist/fetch.js.map +0 -1
  110. package/dist/flow.cjs +0 -7
  111. package/dist/flow.cjs.map +0 -1
  112. package/dist/flow.d.cts +0 -163
  113. package/dist/flow.d.ts +0 -163
  114. package/dist/flow.js +0 -7
  115. package/dist/flow.js.map +0 -1
  116. package/dist/functional.cjs +0 -2
  117. package/dist/functional.cjs.map +0 -1
  118. package/dist/functional.d.cts +0 -444
  119. package/dist/functional.d.ts +0 -444
  120. package/dist/functional.js +0 -2
  121. package/dist/functional.js.map +0 -1
  122. package/dist/guards-4sV7mTqj.d.cts +0 -72
  123. package/dist/guards-BIX05ALH.d.ts +0 -72
  124. package/dist/hitl-DFn4Xa_l.d.cts +0 -468
  125. package/dist/hitl-DU5VpKq7.d.ts +0 -468
  126. package/dist/hitl.cjs +0 -7
  127. package/dist/hitl.cjs.map +0 -1
  128. package/dist/hitl.d.cts +0 -442
  129. package/dist/hitl.d.ts +0 -442
  130. package/dist/hitl.js +0 -7
  131. package/dist/hitl.js.map +0 -1
  132. package/dist/index-CnvBryQB.d.ts +0 -417
  133. package/dist/index-DEZEf8Fs.d.cts +0 -417
  134. package/dist/match-entry-DjI2bLpD.d.cts +0 -209
  135. package/dist/match-entry-DjI2bLpD.d.ts +0 -209
  136. package/dist/match.cjs +0 -2
  137. package/dist/match.cjs.map +0 -1
  138. package/dist/match.d.cts +0 -1
  139. package/dist/match.d.ts +0 -1
  140. package/dist/match.js +0 -2
  141. package/dist/match.js.map +0 -1
  142. package/dist/otel.cjs +0 -2
  143. package/dist/otel.cjs.map +0 -1
  144. package/dist/otel.d.cts +0 -188
  145. package/dist/otel.d.ts +0 -188
  146. package/dist/otel.js +0 -2
  147. package/dist/otel.js.map +0 -1
  148. package/dist/persistence-entry-B-8PjnSR.d.cts +0 -831
  149. package/dist/persistence-entry-D8zRkLiT.d.ts +0 -831
  150. package/dist/persistence.cjs +0 -2
  151. package/dist/persistence.cjs.map +0 -1
  152. package/dist/persistence.d.cts +0 -7
  153. package/dist/persistence.d.ts +0 -7
  154. package/dist/persistence.js +0 -2
  155. package/dist/persistence.js.map +0 -1
  156. package/dist/policies.cjs +0 -2
  157. package/dist/policies.cjs.map +0 -1
  158. package/dist/policies.d.cts +0 -379
  159. package/dist/policies.d.ts +0 -379
  160. package/dist/policies.js +0 -2
  161. package/dist/policies.js.map +0 -1
  162. package/dist/ratelimit.cjs +0 -7
  163. package/dist/ratelimit.cjs.map +0 -1
  164. package/dist/ratelimit.d.cts +0 -458
  165. package/dist/ratelimit.d.ts +0 -458
  166. package/dist/ratelimit.js +0 -7
  167. package/dist/ratelimit.js.map +0 -1
  168. package/dist/reliability.cjs +0 -11
  169. package/dist/reliability.cjs.map +0 -1
  170. package/dist/reliability.d.cts +0 -11
  171. package/dist/reliability.d.ts +0 -11
  172. package/dist/reliability.js +0 -11
  173. package/dist/reliability.js.map +0 -1
  174. package/dist/resolver.cjs +0 -7
  175. package/dist/resolver.cjs.map +0 -1
  176. package/dist/resolver.d.cts +0 -68
  177. package/dist/resolver.d.ts +0 -68
  178. package/dist/resolver.js +0 -7
  179. package/dist/resolver.js.map +0 -1
  180. package/dist/resource.cjs +0 -7
  181. package/dist/resource.cjs.map +0 -1
  182. package/dist/resource.d.cts +0 -174
  183. package/dist/resource.d.ts +0 -174
  184. package/dist/resource.js +0 -7
  185. package/dist/resource.js.map +0 -1
  186. package/dist/result/retry.cjs +0 -2
  187. package/dist/result/retry.cjs.map +0 -1
  188. package/dist/result/retry.d.cts +0 -70
  189. package/dist/result/retry.d.ts +0 -70
  190. package/dist/result/retry.js +0 -2
  191. package/dist/result/retry.js.map +0 -1
  192. package/dist/retry.cjs +0 -2
  193. package/dist/retry.cjs.map +0 -1
  194. package/dist/retry.d.cts +0 -388
  195. package/dist/retry.d.ts +0 -388
  196. package/dist/retry.js +0 -2
  197. package/dist/retry.js.map +0 -1
  198. package/dist/run.cjs +0 -7
  199. package/dist/run.cjs.map +0 -1
  200. package/dist/run.d.cts +0 -4
  201. package/dist/run.d.ts +0 -4
  202. package/dist/run.js +0 -7
  203. package/dist/run.js.map +0 -1
  204. package/dist/saga.cjs +0 -11
  205. package/dist/saga.cjs.map +0 -1
  206. package/dist/saga.d.cts +0 -164
  207. package/dist/saga.d.ts +0 -164
  208. package/dist/saga.js +0 -11
  209. package/dist/saga.js.map +0 -1
  210. package/dist/singleflight.cjs +0 -2
  211. package/dist/singleflight.cjs.map +0 -1
  212. package/dist/singleflight.d.cts +0 -145
  213. package/dist/singleflight.d.ts +0 -145
  214. package/dist/singleflight.js +0 -2
  215. package/dist/singleflight.js.map +0 -1
  216. package/dist/slugs.cjs +0 -2
  217. package/dist/slugs.cjs.map +0 -1
  218. package/dist/slugs.d.cts +0 -67
  219. package/dist/slugs.d.ts +0 -67
  220. package/dist/slugs.js +0 -2
  221. package/dist/slugs.js.map +0 -1
  222. package/dist/streaming.cjs +0 -9
  223. package/dist/streaming.cjs.map +0 -1
  224. package/dist/streaming.d.cts +0 -596
  225. package/dist/streaming.d.ts +0 -596
  226. package/dist/streaming.js +0 -9
  227. package/dist/streaming.js.map +0 -1
  228. package/dist/tagged-error.cjs +0 -2
  229. package/dist/tagged-error.cjs.map +0 -1
  230. package/dist/tagged-error.d.cts +0 -275
  231. package/dist/tagged-error.d.ts +0 -275
  232. package/dist/tagged-error.js +0 -2
  233. package/dist/tagged-error.js.map +0 -1
  234. package/dist/types-BziYHFkD.d.ts +0 -323
  235. package/dist/types-C5jLEUqY.d.cts +0 -323
  236. package/dist/webhook.cjs +0 -7
  237. package/dist/webhook.cjs.map +0 -1
  238. package/dist/webhook.d.cts +0 -499
  239. package/dist/webhook.d.ts +0 -499
  240. package/dist/webhook.js +0 -7
  241. package/dist/webhook.js.map +0 -1
package/dist/duration.cjs DELETED
@@ -1,2 +0,0 @@
1
- "use strict";var f=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var J=(i,t)=>{for(var n in t)f(i,n,{get:t[n],enumerable:!0})},K=(i,t,n,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of B(t))!G.call(i,r)&&r!==n&&f(i,r,{get:()=>t[r],enumerable:!(u=A(t,r))||u.enumerable});return i};var P=i=>K(f({},"__esModule",{value:!0}),i);var Q={};J(Q,{Duration:()=>N,add:()=>_,clamp:()=>w,days:()=>m,divide:()=>q,equals:()=>O,format:()=>Z,greaterThan:()=>E,greaterThanOrEqual:()=>F,hours:()=>l,infinity:()=>x,isDuration:()=>S,isFinite:()=>H,isInfinite:()=>z,isZero:()=>j,lessThan:()=>$,lessThanOrEqual:()=>I,max:()=>c,millis:()=>e,min:()=>D,minutes:()=>s,multiply:()=>M,parse:()=>k,seconds:()=>a,subtract:()=>T,toDays:()=>y,toHours:()=>g,toMillis:()=>d,toMinutes:()=>b,toSeconds:()=>h,zero:()=>p});module.exports=P(Q);function e(i){return{_tag:"Duration",millis:i}}function a(i){return{_tag:"Duration",millis:i*1e3}}function s(i){return{_tag:"Duration",millis:i*60*1e3}}function l(i){return{_tag:"Duration",millis:i*60*60*1e3}}function m(i){return{_tag:"Duration",millis:i*24*60*60*1e3}}var p={_tag:"Duration",millis:0},x={_tag:"Duration",millis:1/0};function d(i){return i.millis}function h(i){return i.millis/1e3}function b(i){return i.millis/(60*1e3)}function g(i){return i.millis/(3600*1e3)}function y(i){return i.millis/(1440*60*1e3)}function _(i,t){return{_tag:"Duration",millis:i.millis+t.millis}}function T(i,t){return{_tag:"Duration",millis:Math.max(0,i.millis-t.millis)}}function M(i,t){return{_tag:"Duration",millis:i.millis*t}}function q(i,t){return{_tag:"Duration",millis:i.millis/t}}function $(i,t){return i.millis<t.millis}function I(i,t){return i.millis<=t.millis}function E(i,t){return i.millis>t.millis}function F(i,t){return i.millis>=t.millis}function O(i,t){return i.millis===t.millis}function D(i,t){return i.millis<=t.millis?i:t}function c(i,t){return i.millis>=t.millis?i:t}function w(i,t,n){return D(c(i,t),n)}function j(i){return i.millis===0}function z(i){return i.millis===1/0}function H(i){return Number.isFinite(i.millis)&&i.millis>0}function S(i){return typeof i=="object"&&i!==null&&"_tag"in i&&i._tag==="Duration"&&"millis"in i&&typeof i.millis=="number"}function Z(i){let t=i.millis;if(t===1/0)return"\u221E";if(t===0)return"0ms";let n=Math.floor(t/(1440*60*1e3)),u=Math.floor(t%(1440*60*1e3)/(3600*1e3)),r=Math.floor(t%(3600*1e3)/(60*1e3)),C=Math.floor(t%(60*1e3)/1e3),L=t%1e3,o=[];return n>0&&o.push(`${n}d`),u>0&&o.push(`${u}h`),r>0&&o.push(`${r}m`),C>0&&o.push(`${C}s`),L>0&&o.length===0&&o.push(`${L}ms`),o.join(" ")||"0ms"}function k(i){let t=i.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let n=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return e(n);case"s":return a(n);case"m":return s(n);case"h":return l(n);case"d":return m(n);default:return}}var N={millis:e,seconds:a,minutes:s,hours:l,days:m,zero:p,infinity:x,toMillis:d,toSeconds:h,toMinutes:b,toHours:g,toDays:y,add:_,subtract:T,multiply:M,divide:q,lessThan:$,lessThanOrEqual:I,greaterThan:E,greaterThanOrEqual:F,equals:O,min:D,max:c,clamp:w,isZero:j,isInfinite:z,isFinite:H,isDuration:S,format:Z,parse:k};0&&(module.exports={Duration,add,clamp,days,divide,equals,format,greaterThan,greaterThanOrEqual,hours,infinity,isDuration,isFinite,isInfinite,isZero,lessThan,lessThanOrEqual,max,millis,min,minutes,multiply,parse,seconds,subtract,toDays,toHours,toMillis,toMinutes,toSeconds,zero});
2
- //# sourceMappingURL=duration.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/duration-entry.ts","../src/duration.ts"],"sourcesContent":["/**\n * awaitly/duration\n *\n * Type-safe time duration utilities: avoid \"is this milliseconds or seconds?\" confusion.\n *\n * @example\n * ```typescript\n * import { Duration, millis, seconds, toMillis } from 'awaitly/duration';\n *\n * const timeout = Duration.seconds(30);\n * const delay = Duration.millis(100);\n *\n * // Convert to milliseconds for setTimeout\n * setTimeout(() => {}, toMillis(timeout));\n * ```\n */\n\nexport {\n // Types\n type Duration as DurationType,\n\n // Namespace\n Duration,\n\n // Individual exports (for tree-shaking)\n millis,\n seconds,\n minutes,\n hours,\n days,\n toMillis,\n toSeconds,\n toMinutes,\n toHours,\n toDays,\n isDuration,\n\n // Arithmetic\n add,\n subtract,\n multiply,\n divide,\n\n // Comparison\n lessThan,\n lessThanOrEqual,\n greaterThan,\n greaterThanOrEqual,\n equals,\n\n // Utilities\n isZero,\n isInfinite,\n isFinite,\n min,\n max,\n clamp,\n format,\n parse,\n\n // Constants\n zero,\n infinity,\n} from \"./duration\";\n","/**\n * awaitly/duration\n *\n * Type-safe duration handling inspired by Effect's Duration module.\n * Prevents unit confusion (milliseconds vs seconds) with explicit constructors.\n */\n\n// =============================================================================\n// Duration Type\n// =============================================================================\n\n/**\n * A type-safe representation of a time duration.\n * Use the constructor functions (millis, seconds, etc.) to create durations.\n */\nexport interface Duration {\n readonly _tag: \"Duration\";\n readonly millis: number;\n}\n\n// =============================================================================\n// Constructors\n// =============================================================================\n\n/**\n * Create a Duration from milliseconds.\n *\n * @example\n * ```typescript\n * const d = Duration.millis(500)\n * ```\n */\nexport function millis(ms: number): Duration {\n return { _tag: \"Duration\", millis: ms };\n}\n\n/**\n * Create a Duration from seconds.\n *\n * @example\n * ```typescript\n * const d = Duration.seconds(5) // 5000ms\n * ```\n */\nexport function seconds(s: number): Duration {\n return { _tag: \"Duration\", millis: s * 1000 };\n}\n\n/**\n * Create a Duration from minutes.\n *\n * @example\n * ```typescript\n * const d = Duration.minutes(2) // 120000ms\n * ```\n */\nexport function minutes(m: number): Duration {\n return { _tag: \"Duration\", millis: m * 60 * 1000 };\n}\n\n/**\n * Create a Duration from hours.\n *\n * @example\n * ```typescript\n * const d = Duration.hours(1) // 3600000ms\n * ```\n */\nexport function hours(h: number): Duration {\n return { _tag: \"Duration\", millis: h * 60 * 60 * 1000 };\n}\n\n/**\n * Create a Duration from days.\n *\n * @example\n * ```typescript\n * const d = Duration.days(1) // 86400000ms\n * ```\n */\nexport function days(d: number): Duration {\n return { _tag: \"Duration\", millis: d * 24 * 60 * 60 * 1000 };\n}\n\n/**\n * Zero duration.\n */\nexport const zero: Duration = { _tag: \"Duration\", millis: 0 };\n\n/**\n * Infinite duration (represented as Infinity milliseconds).\n */\nexport const infinity: Duration = { _tag: \"Duration\", millis: Infinity };\n\n// =============================================================================\n// Conversions\n// =============================================================================\n\n/**\n * Convert a Duration to milliseconds.\n */\nexport function toMillis(duration: Duration): number {\n return duration.millis;\n}\n\n/**\n * Convert a Duration to seconds.\n */\nexport function toSeconds(duration: Duration): number {\n return duration.millis / 1000;\n}\n\n/**\n * Convert a Duration to minutes.\n */\nexport function toMinutes(duration: Duration): number {\n return duration.millis / (60 * 1000);\n}\n\n/**\n * Convert a Duration to hours.\n */\nexport function toHours(duration: Duration): number {\n return duration.millis / (60 * 60 * 1000);\n}\n\n/**\n * Convert a Duration to days.\n */\nexport function toDays(duration: Duration): number {\n return duration.millis / (24 * 60 * 60 * 1000);\n}\n\n// =============================================================================\n// Operations\n// =============================================================================\n\n/**\n * Add two durations.\n *\n * @example\n * ```typescript\n * const total = Duration.add(Duration.seconds(5), Duration.millis(500))\n * // 5500ms\n * ```\n */\nexport function add(a: Duration, b: Duration): Duration {\n return { _tag: \"Duration\", millis: a.millis + b.millis };\n}\n\n/**\n * Subtract duration b from duration a.\n * Result is clamped to zero (no negative durations).\n *\n * @example\n * ```typescript\n * const remaining = Duration.subtract(Duration.seconds(5), Duration.seconds(2))\n * // 3000ms\n * ```\n */\nexport function subtract(a: Duration, b: Duration): Duration {\n return { _tag: \"Duration\", millis: Math.max(0, a.millis - b.millis) };\n}\n\n/**\n * Multiply a duration by a factor.\n *\n * @example\n * ```typescript\n * const doubled = Duration.multiply(Duration.seconds(5), 2)\n * // 10000ms\n * ```\n */\nexport function multiply(duration: Duration, factor: number): Duration {\n return { _tag: \"Duration\", millis: duration.millis * factor };\n}\n\n/**\n * Divide a duration by a divisor.\n *\n * @example\n * ```typescript\n * const half = Duration.divide(Duration.seconds(10), 2)\n * // 5000ms\n * ```\n */\nexport function divide(duration: Duration, divisor: number): Duration {\n return { _tag: \"Duration\", millis: duration.millis / divisor };\n}\n\n// =============================================================================\n// Comparisons\n// =============================================================================\n\n/**\n * Check if duration a is less than duration b.\n */\nexport function lessThan(a: Duration, b: Duration): boolean {\n return a.millis < b.millis;\n}\n\n/**\n * Check if duration a is less than or equal to duration b.\n */\nexport function lessThanOrEqual(a: Duration, b: Duration): boolean {\n return a.millis <= b.millis;\n}\n\n/**\n * Check if duration a is greater than duration b.\n */\nexport function greaterThan(a: Duration, b: Duration): boolean {\n return a.millis > b.millis;\n}\n\n/**\n * Check if duration a is greater than or equal to duration b.\n */\nexport function greaterThanOrEqual(a: Duration, b: Duration): boolean {\n return a.millis >= b.millis;\n}\n\n/**\n * Check if two durations are equal.\n */\nexport function equals(a: Duration, b: Duration): boolean {\n return a.millis === b.millis;\n}\n\n/**\n * Get the minimum of two durations.\n */\nexport function min(a: Duration, b: Duration): Duration {\n return a.millis <= b.millis ? a : b;\n}\n\n/**\n * Get the maximum of two durations.\n */\nexport function max(a: Duration, b: Duration): Duration {\n return a.millis >= b.millis ? a : b;\n}\n\n/**\n * Clamp a duration between a minimum and maximum.\n */\nexport function clamp(duration: Duration, minimum: Duration, maximum: Duration): Duration {\n return min(max(duration, minimum), maximum);\n}\n\n// =============================================================================\n// Predicates\n// =============================================================================\n\n/**\n * Check if a duration is zero.\n */\nexport function isZero(duration: Duration): boolean {\n return duration.millis === 0;\n}\n\n/**\n * Check if a duration is infinite.\n */\nexport function isInfinite(duration: Duration): boolean {\n return duration.millis === Infinity;\n}\n\n/**\n * Check if a duration is finite and positive.\n */\nexport function isFinite(duration: Duration): boolean {\n return Number.isFinite(duration.millis) && duration.millis > 0;\n}\n\n/**\n * Type guard to check if a value is a Duration.\n */\nexport function isDuration(value: unknown): value is Duration {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"_tag\" in value &&\n value._tag === \"Duration\" &&\n \"millis\" in value &&\n typeof value.millis === \"number\"\n );\n}\n\n// =============================================================================\n// Formatting\n// =============================================================================\n\n/**\n * Format a duration as a human-readable string.\n *\n * @example\n * ```typescript\n * Duration.format(Duration.seconds(90)) // \"1m 30s\"\n * Duration.format(Duration.millis(500)) // \"500ms\"\n * ```\n */\nexport function format(duration: Duration): string {\n const ms = duration.millis;\n\n if (ms === Infinity) return \"∞\";\n if (ms === 0) return \"0ms\";\n\n const days = Math.floor(ms / (24 * 60 * 60 * 1000));\n const hours = Math.floor((ms % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));\n const minutes = Math.floor((ms % (60 * 60 * 1000)) / (60 * 1000));\n const seconds = Math.floor((ms % (60 * 1000)) / 1000);\n const millis = ms % 1000;\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (seconds > 0) parts.push(`${seconds}s`);\n if (millis > 0 && parts.length === 0) parts.push(`${millis}ms`);\n\n return parts.join(\" \") || \"0ms\";\n}\n\n// =============================================================================\n// Parsing\n// =============================================================================\n\n/**\n * Parse a duration from a string like \"100ms\", \"5s\", \"2m\", \"1h\", \"1d\".\n * Returns undefined if parsing fails.\n *\n * @example\n * ```typescript\n * Duration.parse(\"5s\") // Duration.seconds(5)\n * Duration.parse(\"100ms\") // Duration.millis(100)\n * Duration.parse(\"2m\") // Duration.minutes(2)\n * ```\n */\nexport function parse(input: string): Duration | undefined {\n const match = input.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)$/i);\n if (!match) return undefined;\n\n const value = parseFloat(match[1]);\n const unit = match[2].toLowerCase();\n\n switch (unit) {\n case \"ms\":\n return millis(value);\n case \"s\":\n return seconds(value);\n case \"m\":\n return minutes(value);\n case \"h\":\n return hours(value);\n case \"d\":\n return days(value);\n default:\n return undefined;\n }\n}\n\n// =============================================================================\n// Namespace Export\n// =============================================================================\n\n/**\n * Duration namespace with all functions for convenient access.\n *\n * @example\n * ```typescript\n * import { Duration } from \"awaitly\";\n *\n * const timeout = Duration.seconds(30);\n * const delay = Duration.millis(100);\n * const total = Duration.add(timeout, delay);\n *\n * console.log(Duration.format(total)); // \"30s 100ms\"\n * ```\n */\nexport const Duration = {\n // Constructors\n millis,\n seconds,\n minutes,\n hours,\n days,\n zero,\n infinity,\n\n // Conversions\n toMillis,\n toSeconds,\n toMinutes,\n toHours,\n toDays,\n\n // Operations\n add,\n subtract,\n multiply,\n divide,\n\n // Comparisons\n lessThan,\n lessThanOrEqual,\n greaterThan,\n greaterThanOrEqual,\n equals,\n min,\n max,\n clamp,\n\n // Predicates\n isZero,\n isInfinite,\n isFinite,\n isDuration,\n\n // Formatting\n format,\n parse,\n} as const;\n\nexport type { Duration as DurationType };\n"],"mappings":"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","names":["duration_entry_exports","__export","Duration","add","clamp","days","divide","equals","format","greaterThan","greaterThanOrEqual","hours","infinity","isDuration","isFinite","isInfinite","isZero","lessThan","lessThanOrEqual","max","millis","min","minutes","multiply","parse","seconds","subtract","toDays","toHours","toMillis","toMinutes","toSeconds","zero","__toCommonJS","millis","ms","seconds","s","minutes","m","hours","h","days","d","zero","infinity","toMillis","duration","toSeconds","toMinutes","toHours","toDays","add","a","b","subtract","multiply","factor","divide","divisor","lessThan","lessThanOrEqual","greaterThan","greaterThanOrEqual","equals","min","max","clamp","minimum","maximum","isZero","isInfinite","isFinite","isDuration","value","format","parts","parse","input","match","Duration"]}
package/dist/duration.js DELETED
@@ -1,2 +0,0 @@
1
- function u(i){return{_tag:"Duration",millis:i}}function e(i){return{_tag:"Duration",millis:i*1e3}}function a(i){return{_tag:"Duration",millis:i*60*1e3}}function s(i){return{_tag:"Duration",millis:i*60*60*1e3}}function l(i){return{_tag:"Duration",millis:i*24*60*60*1e3}}var x={_tag:"Duration",millis:0},d={_tag:"Duration",millis:1/0};function h(i){return i.millis}function b(i){return i.millis/1e3}function g(i){return i.millis/(60*1e3)}function y(i){return i.millis/(3600*1e3)}function _(i){return i.millis/(1440*60*1e3)}function T(i,t){return{_tag:"Duration",millis:i.millis+t.millis}}function M(i,t){return{_tag:"Duration",millis:Math.max(0,i.millis-t.millis)}}function q(i,t){return{_tag:"Duration",millis:i.millis*t}}function $(i,t){return{_tag:"Duration",millis:i.millis/t}}function I(i,t){return i.millis<t.millis}function E(i,t){return i.millis<=t.millis}function F(i,t){return i.millis>t.millis}function O(i,t){return i.millis>=t.millis}function w(i,t){return i.millis===t.millis}function m(i,t){return i.millis<=t.millis?i:t}function D(i,t){return i.millis>=t.millis?i:t}function j(i,t,n){return m(D(i,t),n)}function z(i){return i.millis===0}function H(i){return i.millis===1/0}function S(i){return Number.isFinite(i.millis)&&i.millis>0}function Z(i){return typeof i=="object"&&i!==null&&"_tag"in i&&i._tag==="Duration"&&"millis"in i&&typeof i.millis=="number"}function k(i){let t=i.millis;if(t===1/0)return"\u221E";if(t===0)return"0ms";let n=Math.floor(t/(1440*60*1e3)),o=Math.floor(t%(1440*60*1e3)/(3600*1e3)),c=Math.floor(t%(3600*1e3)/(60*1e3)),f=Math.floor(t%(60*1e3)/1e3),p=t%1e3,r=[];return n>0&&r.push(`${n}d`),o>0&&r.push(`${o}h`),c>0&&r.push(`${c}m`),f>0&&r.push(`${f}s`),p>0&&r.length===0&&r.push(`${p}ms`),r.join(" ")||"0ms"}function C(i){let t=i.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let n=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return u(n);case"s":return e(n);case"m":return a(n);case"h":return s(n);case"d":return l(n);default:return}}var L={millis:u,seconds:e,minutes:a,hours:s,days:l,zero:x,infinity:d,toMillis:h,toSeconds:b,toMinutes:g,toHours:y,toDays:_,add:T,subtract:M,multiply:q,divide:$,lessThan:I,lessThanOrEqual:E,greaterThan:F,greaterThanOrEqual:O,equals:w,min:m,max:D,clamp:j,isZero:z,isInfinite:H,isFinite:S,isDuration:Z,format:k,parse:C};export{L as Duration,T as add,j as clamp,l as days,$ as divide,w as equals,k as format,F as greaterThan,O as greaterThanOrEqual,s as hours,d as infinity,Z as isDuration,S as isFinite,H as isInfinite,z as isZero,I as lessThan,E as lessThanOrEqual,D as max,u as millis,m as min,a as minutes,q as multiply,C as parse,e as seconds,M as subtract,_ as toDays,y as toHours,h as toMillis,g as toMinutes,b as toSeconds,x as zero};
2
- //# sourceMappingURL=duration.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/duration.ts"],"sourcesContent":["/**\n * awaitly/duration\n *\n * Type-safe duration handling inspired by Effect's Duration module.\n * Prevents unit confusion (milliseconds vs seconds) with explicit constructors.\n */\n\n// =============================================================================\n// Duration Type\n// =============================================================================\n\n/**\n * A type-safe representation of a time duration.\n * Use the constructor functions (millis, seconds, etc.) to create durations.\n */\nexport interface Duration {\n readonly _tag: \"Duration\";\n readonly millis: number;\n}\n\n// =============================================================================\n// Constructors\n// =============================================================================\n\n/**\n * Create a Duration from milliseconds.\n *\n * @example\n * ```typescript\n * const d = Duration.millis(500)\n * ```\n */\nexport function millis(ms: number): Duration {\n return { _tag: \"Duration\", millis: ms };\n}\n\n/**\n * Create a Duration from seconds.\n *\n * @example\n * ```typescript\n * const d = Duration.seconds(5) // 5000ms\n * ```\n */\nexport function seconds(s: number): Duration {\n return { _tag: \"Duration\", millis: s * 1000 };\n}\n\n/**\n * Create a Duration from minutes.\n *\n * @example\n * ```typescript\n * const d = Duration.minutes(2) // 120000ms\n * ```\n */\nexport function minutes(m: number): Duration {\n return { _tag: \"Duration\", millis: m * 60 * 1000 };\n}\n\n/**\n * Create a Duration from hours.\n *\n * @example\n * ```typescript\n * const d = Duration.hours(1) // 3600000ms\n * ```\n */\nexport function hours(h: number): Duration {\n return { _tag: \"Duration\", millis: h * 60 * 60 * 1000 };\n}\n\n/**\n * Create a Duration from days.\n *\n * @example\n * ```typescript\n * const d = Duration.days(1) // 86400000ms\n * ```\n */\nexport function days(d: number): Duration {\n return { _tag: \"Duration\", millis: d * 24 * 60 * 60 * 1000 };\n}\n\n/**\n * Zero duration.\n */\nexport const zero: Duration = { _tag: \"Duration\", millis: 0 };\n\n/**\n * Infinite duration (represented as Infinity milliseconds).\n */\nexport const infinity: Duration = { _tag: \"Duration\", millis: Infinity };\n\n// =============================================================================\n// Conversions\n// =============================================================================\n\n/**\n * Convert a Duration to milliseconds.\n */\nexport function toMillis(duration: Duration): number {\n return duration.millis;\n}\n\n/**\n * Convert a Duration to seconds.\n */\nexport function toSeconds(duration: Duration): number {\n return duration.millis / 1000;\n}\n\n/**\n * Convert a Duration to minutes.\n */\nexport function toMinutes(duration: Duration): number {\n return duration.millis / (60 * 1000);\n}\n\n/**\n * Convert a Duration to hours.\n */\nexport function toHours(duration: Duration): number {\n return duration.millis / (60 * 60 * 1000);\n}\n\n/**\n * Convert a Duration to days.\n */\nexport function toDays(duration: Duration): number {\n return duration.millis / (24 * 60 * 60 * 1000);\n}\n\n// =============================================================================\n// Operations\n// =============================================================================\n\n/**\n * Add two durations.\n *\n * @example\n * ```typescript\n * const total = Duration.add(Duration.seconds(5), Duration.millis(500))\n * // 5500ms\n * ```\n */\nexport function add(a: Duration, b: Duration): Duration {\n return { _tag: \"Duration\", millis: a.millis + b.millis };\n}\n\n/**\n * Subtract duration b from duration a.\n * Result is clamped to zero (no negative durations).\n *\n * @example\n * ```typescript\n * const remaining = Duration.subtract(Duration.seconds(5), Duration.seconds(2))\n * // 3000ms\n * ```\n */\nexport function subtract(a: Duration, b: Duration): Duration {\n return { _tag: \"Duration\", millis: Math.max(0, a.millis - b.millis) };\n}\n\n/**\n * Multiply a duration by a factor.\n *\n * @example\n * ```typescript\n * const doubled = Duration.multiply(Duration.seconds(5), 2)\n * // 10000ms\n * ```\n */\nexport function multiply(duration: Duration, factor: number): Duration {\n return { _tag: \"Duration\", millis: duration.millis * factor };\n}\n\n/**\n * Divide a duration by a divisor.\n *\n * @example\n * ```typescript\n * const half = Duration.divide(Duration.seconds(10), 2)\n * // 5000ms\n * ```\n */\nexport function divide(duration: Duration, divisor: number): Duration {\n return { _tag: \"Duration\", millis: duration.millis / divisor };\n}\n\n// =============================================================================\n// Comparisons\n// =============================================================================\n\n/**\n * Check if duration a is less than duration b.\n */\nexport function lessThan(a: Duration, b: Duration): boolean {\n return a.millis < b.millis;\n}\n\n/**\n * Check if duration a is less than or equal to duration b.\n */\nexport function lessThanOrEqual(a: Duration, b: Duration): boolean {\n return a.millis <= b.millis;\n}\n\n/**\n * Check if duration a is greater than duration b.\n */\nexport function greaterThan(a: Duration, b: Duration): boolean {\n return a.millis > b.millis;\n}\n\n/**\n * Check if duration a is greater than or equal to duration b.\n */\nexport function greaterThanOrEqual(a: Duration, b: Duration): boolean {\n return a.millis >= b.millis;\n}\n\n/**\n * Check if two durations are equal.\n */\nexport function equals(a: Duration, b: Duration): boolean {\n return a.millis === b.millis;\n}\n\n/**\n * Get the minimum of two durations.\n */\nexport function min(a: Duration, b: Duration): Duration {\n return a.millis <= b.millis ? a : b;\n}\n\n/**\n * Get the maximum of two durations.\n */\nexport function max(a: Duration, b: Duration): Duration {\n return a.millis >= b.millis ? a : b;\n}\n\n/**\n * Clamp a duration between a minimum and maximum.\n */\nexport function clamp(duration: Duration, minimum: Duration, maximum: Duration): Duration {\n return min(max(duration, minimum), maximum);\n}\n\n// =============================================================================\n// Predicates\n// =============================================================================\n\n/**\n * Check if a duration is zero.\n */\nexport function isZero(duration: Duration): boolean {\n return duration.millis === 0;\n}\n\n/**\n * Check if a duration is infinite.\n */\nexport function isInfinite(duration: Duration): boolean {\n return duration.millis === Infinity;\n}\n\n/**\n * Check if a duration is finite and positive.\n */\nexport function isFinite(duration: Duration): boolean {\n return Number.isFinite(duration.millis) && duration.millis > 0;\n}\n\n/**\n * Type guard to check if a value is a Duration.\n */\nexport function isDuration(value: unknown): value is Duration {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"_tag\" in value &&\n value._tag === \"Duration\" &&\n \"millis\" in value &&\n typeof value.millis === \"number\"\n );\n}\n\n// =============================================================================\n// Formatting\n// =============================================================================\n\n/**\n * Format a duration as a human-readable string.\n *\n * @example\n * ```typescript\n * Duration.format(Duration.seconds(90)) // \"1m 30s\"\n * Duration.format(Duration.millis(500)) // \"500ms\"\n * ```\n */\nexport function format(duration: Duration): string {\n const ms = duration.millis;\n\n if (ms === Infinity) return \"∞\";\n if (ms === 0) return \"0ms\";\n\n const days = Math.floor(ms / (24 * 60 * 60 * 1000));\n const hours = Math.floor((ms % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));\n const minutes = Math.floor((ms % (60 * 60 * 1000)) / (60 * 1000));\n const seconds = Math.floor((ms % (60 * 1000)) / 1000);\n const millis = ms % 1000;\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (seconds > 0) parts.push(`${seconds}s`);\n if (millis > 0 && parts.length === 0) parts.push(`${millis}ms`);\n\n return parts.join(\" \") || \"0ms\";\n}\n\n// =============================================================================\n// Parsing\n// =============================================================================\n\n/**\n * Parse a duration from a string like \"100ms\", \"5s\", \"2m\", \"1h\", \"1d\".\n * Returns undefined if parsing fails.\n *\n * @example\n * ```typescript\n * Duration.parse(\"5s\") // Duration.seconds(5)\n * Duration.parse(\"100ms\") // Duration.millis(100)\n * Duration.parse(\"2m\") // Duration.minutes(2)\n * ```\n */\nexport function parse(input: string): Duration | undefined {\n const match = input.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)$/i);\n if (!match) return undefined;\n\n const value = parseFloat(match[1]);\n const unit = match[2].toLowerCase();\n\n switch (unit) {\n case \"ms\":\n return millis(value);\n case \"s\":\n return seconds(value);\n case \"m\":\n return minutes(value);\n case \"h\":\n return hours(value);\n case \"d\":\n return days(value);\n default:\n return undefined;\n }\n}\n\n// =============================================================================\n// Namespace Export\n// =============================================================================\n\n/**\n * Duration namespace with all functions for convenient access.\n *\n * @example\n * ```typescript\n * import { Duration } from \"awaitly\";\n *\n * const timeout = Duration.seconds(30);\n * const delay = Duration.millis(100);\n * const total = Duration.add(timeout, delay);\n *\n * console.log(Duration.format(total)); // \"30s 100ms\"\n * ```\n */\nexport const Duration = {\n // Constructors\n millis,\n seconds,\n minutes,\n hours,\n days,\n zero,\n infinity,\n\n // Conversions\n toMillis,\n toSeconds,\n toMinutes,\n toHours,\n toDays,\n\n // Operations\n add,\n subtract,\n multiply,\n divide,\n\n // Comparisons\n lessThan,\n lessThanOrEqual,\n greaterThan,\n greaterThanOrEqual,\n equals,\n min,\n max,\n clamp,\n\n // Predicates\n isZero,\n isInfinite,\n isFinite,\n isDuration,\n\n // Formatting\n format,\n parse,\n} as const;\n\nexport type { Duration as DurationType };\n"],"mappings":"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","names":["millis","ms","seconds","s","minutes","m","hours","h","days","d","zero","infinity","toMillis","duration","toSeconds","toMinutes","toHours","toDays","add","a","b","subtract","multiply","factor","divide","divisor","lessThan","lessThanOrEqual","greaterThan","greaterThanOrEqual","equals","min","max","clamp","minimum","maximum","isZero","isInfinite","isFinite","isDuration","value","format","parts","parse","input","match","Duration"]}
package/dist/engine.cjs DELETED
@@ -1,11 +0,0 @@
1
- "use strict";var ze=Object.defineProperty;var Nt=Object.getOwnPropertyDescriptor;var Kt=Object.getOwnPropertyNames;var jt=Object.prototype.hasOwnProperty;var Ft=(e,t)=>{for(var s in t)ze(e,s,{get:t[s],enumerable:!0})},Vt=(e,t,s,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let f of Kt(t))!jt.call(e,f)&&f!==s&&ze(e,f,{get:()=>t[f],enumerable:!(u=Nt(t,f))||u.enumerable});return e};var Lt=e=>Vt(ze({},"__esModule",{value:!0}),e);var pr={};Ft(pr,{createEngine:()=>Wt});module.exports=Lt(pr);var it=require("crypto");var Bt={"step-require-id":"step-require-id","step-no-immediate-execution":"step-no-immediate-execution","step-require-thunk-for-key":"step-require-thunk-for-key","step-no-bare-await":"step-no-bare-await","step-no-try-catch-wrap":"step-no-try-catch-wrap","step-stable-cache-keys":"step-stable-cache-keys","workflow-no-floating":"workflow-no-floating","workflow-options-position":"workflow-options-position","workflow-callback-shape":"workflow-callback-shape","workflow-no-callable-form":"workflow-no-callable-form","workflow-no-dynamic-import":"workflow-no-dynamic-import","result-no-floating":"result-no-floating","result-require-handling":"result-require-handling","result-no-double-wrap":"result-no-double-wrap","result-no-manual-propagation":"result-no-manual-propagation","result-no-direct-ok-err":"result-no-direct-ok-err","error-check-unexpected-first":"error-check-unexpected-first","error-access-cause":"error-access-cause","error-normalize":"error-normalize","error-no-throw-in-deps":"error-no-throw-in-deps","concurrency-no-promise-all":"concurrency-no-promise-all","concurrency-no-promise-race":"concurrency-no-promise-race","concurrency-no-promise-allsettled":"concurrency-no-promise-allsettled","runtime-step-timeout":"runtime-step-timeout","runtime-step-aborted":"runtime-step-aborted","runtime-retry-exhausted":"runtime-retry-exhausted","runtime-rate-limit":"runtime-rate-limit","runtime-circuit-open":"runtime-circuit-open","runtime-unexpected":"runtime-unexpected","runtime-resolver-not-found":"runtime-resolver-not-found","runtime-saga-compensation":"runtime-saga-compensation"};function lt(e){return`https://jagreehal.github.io/awaitly/rules/#${e}`}var mr=Object.keys(Bt);var Ne=class extends Error{_tag};function ke(e,t){return class extends Ne{_tag=e;constructor(s,u){let f=t?.message?t.message(s??{}):e;if(super(f),this.name=e,t?.slug!==void 0){if(!t.hint)throw new TypeError(`TaggedError: 'hint' is required when 'slug' is set (slug: "${t.slug}")`);Object.defineProperty(this,"code",{value:t.slug,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"hint",{value:t.hint,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"docsUrl",{value:lt(t.slug),enumerable:!0,writable:!1,configurable:!1})}if(Object.setPrototypeOf(this,new.target.prototype),s&&typeof s=="object"){let l;if(t?.slug!==void 0){let{_tag:W,name:D,message:K,stack:r,code:se,hint:ee,docsUrl:ge,...ne}=s;l=ne}else{let{_tag:W,name:D,message:K,stack:r,...se}=s;l=se}let w=Object.prototype.hasOwnProperty.call(l,"cause"),I=w?l.cause:void 0;w&&delete l.cause;let $=u?.cause!==void 0;if(w&&$)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,l),w&&(this.cause=I),$&&(this.cause=u?.cause)}else u?.cause!==void 0&&(this.cause=u.cause)}}}Object.defineProperty(ke,Symbol.hasInstance,{value:e=>e instanceof Ne});(f=>{function e(l){return l instanceof Error}f.isError=e;function t(l){return l instanceof Ne}f.isTaggedError=t;function s(l,w){let I=l._tag,$=w[I];return $(l)}f.match=s;function u(l,w,I){let $=l._tag,W=w[$];return W?W(l):I(l)}f.matchPartial=u})(ke||={});var ct=class extends ke("TimeoutError",{slug:"runtime-step-timeout",hint:"Increase the step's timeout option, or check why the upstream operation is slow.",message:t=>t.operation?`TimeoutError: ${t.operation} timed out after ${t.ms}ms`:`TimeoutError: Operation timed out after ${t.ms}ms`}){},pt=class extends ke("RetryExhaustedError",{slug:"runtime-retry-exhausted",hint:"All retry attempts failed. Inspect lastError and decide whether to surface it or compensate.",message:t=>t.operation?`RetryExhaustedError: ${t.operation} failed after ${t.attempts} attempts`:`RetryExhaustedError: Operation failed after ${t.attempts} attempts`}){},dt=class extends ke("RateLimitError",{slug:"runtime-rate-limit",hint:"Wait retryAfterMs before retrying, or apply step.cache to deduplicate calls.",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`:""}`}){},mt=class extends ke("CircuitBreakerOpenError",{slug:"runtime-circuit-open",hint:"The circuit is open. Wait for it to half-open or fall back to a degraded path.",message:t=>`CircuitBreakerOpenError: Circuit ${t.circuitName} is ${t.state??"OPEN"}${t.retryAfterMs?`, retry after ${Math.ceil(t.retryAfterMs/1e3)}s`:""}`}){},ft=class extends ke("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},Et=class extends ke("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},wt=class extends ke("UnauthorizedError",{message:t=>t.reason?`UnauthorizedError: ${t.reason}`:t.action&&t.resource?`UnauthorizedError: Not authorized to ${t.action} ${t.resource}`:"UnauthorizedError: Access denied"}){},yt=class extends ke("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},kt=class extends ke("CompensationError",{slug:"runtime-saga-compensation",hint:"A saga compensation step failed. Inspect compensationError and ensure compensation is idempotent.",message:t=>`CompensationError: Failed to compensate step ${t.step}`}){},Ke=class extends ke("UnexpectedError",{slug:"runtime-unexpected",hint:"An unexpected exception escaped a step. Inspect cause; consider returning a typed Result instead of throwing.",message:t=>`UnexpectedError: ${t.cause instanceof Error?t.cause.message:String(t.cause??"unknown")}`}){};function gt(e){return{ok:!0,value:e}}var $t=e=>typeof e=="object"&&e!==null&&"ok"in e&&typeof e.ok=="boolean"&&(e.ok?"value"in e:"error"in e),je=(e,t)=>{let s={},u=new Map;for(let f of Object.keys(e)){let l=e[f];typeof l=="function"&&(s[f]=(...w)=>{let I=(u.get(f)??0)+1;u.set(f,I);let $=I===1?f:`${f}#${I}`;return t($,async()=>{let W=await l(...w);return $t(W)?W:gt(W)})})}return s};function Ht(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let s=parseFloat(t[1]),u=t[2].toLowerCase();return{_tag:"Duration",millis:s*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[u]??1)}}function $e(e){return new Ke({cause:e})}function oe(e){return{ok:!0,value:e}}function A(e,t){let s=t?.cause;return{ok:!1,error:e,...s!==void 0?{cause:s}:{}}}var ht=e=>e instanceof Ke||typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="UnexpectedError";function qt(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let t=e;if(typeof t._tag=="string"){let s=t._tag.trim();if(s)return s}if(typeof t.tag=="string"){let s=t.tag.trim();if(s)return s}if(typeof t.code=="string"){let s=t.code.trim();if(s)return s}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let s=e.name.trim();if(s)return s}}return"unknown"}function zt(e,t){if(!(!t||!e))return t[e]}function Ge(e){let{intent:t,domain:s,owner:u,tags:f,stateChanges:l,emits:w,calls:I}=e;if(!t&&!s&&!u&&!f?.length&&!l?.length&&!w?.length&&!I?.length)return;let $={};return t&&($.intent=t),s&&($.domain=s),u&&($.owner=u),f?.length&&($.tags=f),l?.length&&($.stateChanges=l),w?.length&&($.emits=w),I?.length&&($.calls=I),$}function xe(e,t,s,u,f){let l=qt(e),w=zt(l,t),I={tag:l,origin:s};return w!==void 0&&(I.classification=w),u!==void 0&&(I.attempt=u),f!==void 0&&(I.cumulativeDurationMs=f),I}var Oe=Symbol.for("step_timeout_marker");function Tt(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:Oe in e}function Jt(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(Oe in e)return e[Oe]}}var St=Symbol("early-exit");function De(e,t){return{[St]:!0,error:e,meta:t}}function be(e){return typeof e=="object"&&e!==null&&e[St]===!0}var Ct=Symbol("mapper-exception");function Ae(e){return{[Ct]:!0,thrown:e}}function Yt(e){return typeof e=="object"&&e!==null&&e[Ct]===!0}function Je(e,t){let{backoff:s,initialDelay:u,maxDelay:f,jitter:l}=t,w;switch(s){case"fixed":w=u;break;case"linear":w=u*e;break;case"exponential":w=u*Math.pow(2,e-1);break}if(w=Math.min(w,f),l){let I=w*.25*Math.random();w=w+I}return Math.floor(w)}function Ye(e){return new Promise(t=>setTimeout(t,e))}var Rt=Symbol("timeout"),Be=Symbol("timeout-option");function Gt(e){return typeof e=="object"&&e!==null&&e[Be]===!0}async function Xt(e,t,s,u){let f=new AbortController,l=t.onTimeout??"error",w=()=>typeof l=="function"?l({name:s.name,key:s.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:s.name,stepKey:s.key,timeoutMs:t.ms,attempt:s.attempt},I;u?.aborted&&f.abort(u.reason);let $;u&&!u.aborted&&($=()=>f.abort(u.reason),u.addEventListener("abort",$,{once:!0}));let W=new Promise((K,r)=>{I=setTimeout(()=>{if(l!=="disconnect"&&f.abort(),l==="option"){r({[Be]:!0,ms:t.ms});return}r({[Rt]:!0,error:w()})},t.ms)}),D;t.signal?D=Promise.resolve(e(f.signal)):D=Promise.resolve(e());try{return await Promise.race([D,W])}catch(K){if(typeof K=="object"&&K!==null&&K[Be]===!0)throw{[Be]:!0,ms:t.ms};if(typeof K=="object"&&K!==null&&K[Rt]===!0){l==="disconnect"&&D.catch(()=>{});let r=K.error;if(typeof r=="object"&&r!==null&&r.type!=="STEP_TIMEOUT"){let se={timeoutMs:t.ms,stepName:s.name,stepKey:s.key,attempt:s.attempt};Oe in r?r[Oe]=se:Object.defineProperty(r,Oe,{value:se,enumerable:!1,writable:!0,configurable:!1})}throw r}throw K}finally{clearTimeout(I),$&&u&&u.removeEventListener("abort",$)}}var Pe={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,shouldRetry:()=>!0,onRetry:()=>{}};async function Fe(e,t,s){if(typeof e!="function"){let m=e,Y=t;if(typeof Y!="function")throw new TypeError("[awaitly] run(deps, fn) requires a callback as the second argument. Example: run({ getUser }, async (s) => s.getUser(id))");return Fe(({step:me})=>Y(je(m,me),{step:me}),s)}let u=e,f=t,{onError:l,onEvent:w,catchUnexpected:I,workflowId:$,workflowName:W,context:D,_workflowSignal:K}=f&&typeof f=="object"?f:{},r=$??crypto.randomUUID(),se=I??$e,ee=[],ge=0,ne=m=>m??`step_${++ge}`,n=m=>{let Y=m.context!==void 0||D===void 0?m:{...m,context:D},ue=W!==void 0&&Y.workflowName===void 0?{...Y,workflowName:W}:Y;if(ue.type==="step_success"){let me=ue.stepId;for(let Te=ee.length-1;Te>=0;Te--){let j=ee[Te];if(j.type==="race"&&!j.winnerId){j.winnerId=me;break}}}w?.(ue,D)},S=De,G=m=>be(m),ae=(m,Y)=>m,X=m=>typeof m=="function"?!1:!!(m&&typeof m=="object"&&"ok"in m||m&&typeof m=="object"&&"then"in m&&typeof m.then=="function");try{let Y=function(o){let y={};for(let[c,p]of Object.entries(o))if(typeof p=="function")y[c]=p;else if(p&&typeof p=="object"&&"fn"in p)y[c]=p.fn;else throw new TypeError(`step.all: operation "${c}" must be a function or { fn, errors? } object`);return y},ue=function(o,y){let c=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let p=performance.now(),a=!1;ee.push({scopeId:c,type:"parallel"});let i=()=>{if(a)return;a=!0;let g=ee.findIndex(x=>x.scopeId===c);g!==-1&&ee.splice(g,1),n({type:"scope_end",workflowId:r,scopeId:c,ts:Date.now(),durationMs:performance.now()-p})};n({type:"scope_start",workflowId:r,scopeId:c,scopeType:"parallel",name:o,ts:Date.now()});try{let g=await y();if(i(),!g.ok)throw l?.(g.error,o,D),S(g.error,{origin:"result",resultCause:g.cause});return g.value}catch(g){throw i(),g}})()},me=function(o,y){let c=Object.keys(o),p=y.name??`Parallel(${c.join(", ")})`,a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let i=performance.now(),g=!1;ee.push({scopeId:a,type:"parallel"});let x=()=>{if(g)return;g=!0;let b=ee.findIndex(v=>v.scopeId===a);b!==-1&&ee.splice(b,1),n({type:"scope_end",workflowId:r,scopeId:a,ts:Date.now(),durationMs:performance.now()-i})};n({type:"scope_start",workflowId:r,scopeId:a,scopeType:"parallel",name:p,ts:Date.now()});try{let b=await new Promise(M=>{if(c.length===0){M([]);return}let B=!1,te=c.length,V=new Array(c.length);for(let z=0;z<c.length;z++){let L=c[z],q=z;Promise.resolve(o[L]()).catch(P=>A({type:"PROMISE_REJECTED",cause:P},{cause:{type:"PROMISE_REJECTION",reason:P}})).then(P=>{if(!B){if(!P.ok){B=!0,M([{key:L,result:P}]);return}V[q]={key:L,result:P},te--,te===0&&M(V)}})}});x();let v={};for(let{key:M,result:B}of b){if(!B.ok)throw l?.(B.error,M,D),S(B.error,{origin:"result",resultCause:B.cause});v[M]=B.value}return v}catch(b){throw x(),b}})()};var le=Y,ye=ue,pe=me;let m=(o,y,c)=>(async()=>{if(typeof o!="string"||o.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let p=c??{},a=Ge(p),i=o,g=p.key??o,x=p.key??o,{description:b,retry:v,timeout:M}=p,B=ne(g),te=w,V=te?performance.now():0,L=X(y)?()=>y:y,P={attempts:Math.max(1,v?.attempts??1),backoff:v?.backoff??Pe.backoff,initialDelay:v?.initialDelay??Pe.initialDelay,maxDelay:v?.maxDelay??Pe.maxDelay,jitter:v?.jitter??Pe.jitter,shouldRetry:v?.shouldRetry??Pe.shouldRetry,onRetry:v?.onRetry??Pe.onRetry};w&&n({type:"step_start",workflowId:r,stepId:B,stepKey:g,name:i,description:b,ts:Date.now(),...a&&{metadata:a}});let Re;for(let C=1;C<=P.attempts;C++){let R=te?performance.now():0;try{let d;if(M?d=await Xt(L,M,{name:i,key:g,attempt:C},K):d=await L(),d.ok){let h=performance.now()-V;return n({type:"step_success",workflowId:r,stepId:B,stepKey:g,name:i,description:b,ts:Date.now(),durationMs:h,...a&&{metadata:a}}),x&&n({type:"step_complete",workflowId:r,stepKey:x,name:i,description:b,ts:Date.now(),durationMs:h,result:d,...a&&{metadata:a}}),d.value}if(Re=d,C<P.attempts&&P.shouldRetry(d.error,C)){let h=Je(C,P);n({type:"step_retry",workflowId:r,stepId:B,stepKey:g,name:i,ts:Date.now(),attempt:C+1,maxAttempts:P.attempts,delayMs:h,error:d.error,...a&&{metadata:a},diagnostics:xe(d.error,p.errorMeta,"result",C,performance.now()-V)}),P.onRetry(d.error,C,h),await Ye(h);continue}P.attempts>1&&n({type:"step_retries_exhausted",workflowId:r,stepId:B,stepKey:g,name:i,ts:Date.now(),durationMs:performance.now()-V,attempts:C,lastError:d.error,...a&&{metadata:a},diagnostics:xe(d.error,p.errorMeta,"result",C,performance.now()-V)});break}catch(d){let h=performance.now()-R;if(Gt(d)){let U=d.ms;n({type:"step_timeout",workflowId:r,stepId:B,stepKey:g,name:i,ts:Date.now(),timeoutMs:U,attempt:C,...a&&{metadata:a},diagnostics:xe(d,p.errorMeta,"timeout",C)}),n({type:"step_success",workflowId:r,stepId:B,stepKey:g,name:i,description:b,ts:Date.now(),durationMs:performance.now()-V,...a&&{metadata:a}}),x&&n({type:"step_complete",workflowId:r,stepKey:x,name:i,description:b,ts:Date.now(),durationMs:performance.now()-V,result:oe(void 0),...a&&{metadata:a}});return}if(G(d))throw n({type:"step_aborted",workflowId:r,stepId:B,stepKey:g,name:i,description:b,ts:Date.now(),durationMs:h,...a&&{metadata:a}}),d;if(Tt(d)){let U=Jt(d),T=M?.ms??U?.timeoutMs??0;if(n({type:"step_timeout",workflowId:r,stepId:B,stepKey:g,name:i,ts:Date.now(),timeoutMs:T,attempt:C,...a&&{metadata:a},diagnostics:xe(d,p.errorMeta,"timeout",C)}),C<P.attempts&&P.shouldRetry(d,C)){let Z=Je(C,P);n({type:"step_retry",workflowId:r,stepId:B,stepKey:g,name:i,ts:Date.now(),attempt:C+1,maxAttempts:P.attempts,delayMs:Z,error:d,...a&&{metadata:a},diagnostics:xe(d,p.errorMeta,"timeout",C,performance.now()-V)}),P.onRetry(d,C,Z),await Ye(Z);continue}P.attempts>1&&n({type:"step_retries_exhausted",workflowId:r,stepId:B,stepKey:g,name:i,ts:Date.now(),durationMs:performance.now()-V,attempts:C,lastError:d,...a&&{metadata:a},diagnostics:xe(d,p.errorMeta,"timeout",C,performance.now()-V)});let F=performance.now()-V;throw n({type:"step_error",workflowId:r,stepId:B,stepKey:g,name:i,description:b,ts:Date.now(),durationMs:F,error:d,...a&&{metadata:a},diagnostics:xe(d,p.errorMeta,"timeout",C,F)}),x&&n({type:"step_complete",workflowId:r,stepKey:x,name:i,description:b,ts:Date.now(),durationMs:F,result:A(d,{cause:d}),meta:{origin:"throw",thrown:d},...a&&{metadata:a}}),l?.(d,i,D),S(d,{origin:"throw",thrown:d})}if(C<P.attempts&&P.shouldRetry(d,C)){let U=Je(C,P);n({type:"step_retry",workflowId:r,stepId:B,stepKey:g,name:i,ts:Date.now(),attempt:C+1,maxAttempts:P.attempts,delayMs:U,error:d,...a&&{metadata:a},diagnostics:xe(d,p.errorMeta,"throw",C,performance.now()-V)}),P.onRetry(d,C,U),await Ye(U);continue}P.attempts>1&&!Tt(d)&&n({type:"step_retries_exhausted",workflowId:r,stepId:B,stepKey:g,name:i,ts:Date.now(),durationMs:performance.now()-V,attempts:C,lastError:d,...a&&{metadata:a},diagnostics:xe(d,p.errorMeta,"throw",C,performance.now()-V)});let _=performance.now()-V,O;try{O=se(d)}catch(U){throw Ae(U)}throw n({type:"step_error",workflowId:r,stepId:B,stepKey:g,name:i,description:b,ts:Date.now(),durationMs:_,error:O,...a&&{metadata:a},diagnostics:xe(d,p.errorMeta,"throw",C,_)}),x&&n({type:"step_complete",workflowId:r,stepKey:x,name:i,description:b,ts:Date.now(),durationMs:_,result:A(O,{cause:d}),meta:{origin:"throw",thrown:d},...a&&{metadata:a}}),l?.(O,i,D),S(O,{origin:"throw",thrown:d})}}let E=Re,k=performance.now()-V,J=ae(E.error,{origin:"result",resultCause:E.cause});throw n({type:"step_error",workflowId:r,stepId:B,stepKey:g,name:i,description:b,ts:Date.now(),durationMs:k,error:J,...a&&{metadata:a},diagnostics:xe(E.error,p.errorMeta,"result",P.attempts,k)}),x&&n({type:"step_complete",workflowId:r,stepKey:x,name:i,description:b,ts:Date.now(),durationMs:k,result:E,meta:{origin:"result",resultCause:E.cause},...a&&{metadata:a}}),l?.(J,i,D),S(J,{origin:"result",resultCause:E.cause})})();m.try=(o,y,c)=>{if(typeof o!="string"||o.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 p="error"in c?()=>c.error:c.onError;if(c.retry||c.timeout)return m.retry(o,async()=>{try{return oe(await y())}catch(b){return A(p(b),{cause:b})}},{attempts:c.retry?.attempts??1,...c.retry??{},key:c.key,timeout:c.timeout});let a=c.key??o,i=o,g=o,x=w;return(async()=>{let b=x?performance.now():0;w&&n({type:"step_start",workflowId:r,stepId:g,stepKey:a,name:i,ts:Date.now()});try{let v=await y(),M=performance.now()-b;return n({type:"step_success",workflowId:r,stepId:g,stepKey:a,name:i,ts:Date.now(),durationMs:M}),a&&n({type:"step_complete",workflowId:r,stepKey:a,name:i,ts:Date.now(),durationMs:M,result:oe(v)}),v}catch(v){let M=p(v),B=performance.now()-b,te=ae(M,{origin:"throw",thrown:v});throw n({type:"step_error",workflowId:r,stepId:g,stepKey:a,name:i,ts:Date.now(),durationMs:B,error:te}),a&&n({type:"step_complete",workflowId:r,stepKey:a,name:i,ts:Date.now(),durationMs:B,result:A(M,{cause:v}),meta:{origin:"throw",thrown:v}}),l?.(te,i,D),S(te,{origin:"throw",thrown:v})}})()},m.fromResult=(o,y,c)=>{if(typeof o!="string"||o.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 p=c.key??o,a=o,i=o,g="error"in c?()=>c.error:c.onError,x=w;return(async()=>{let b=x?performance.now():0;w&&n({type:"step_start",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now()});let v=await y();if(v.ok){let M=performance.now()-b;return n({type:"step_success",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:M}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:M,result:oe(v.value)}),v.value}else{let M=g(v.error),B=performance.now()-b,te=ae(M,{origin:"result",resultCause:v.error});throw n({type:"step_error",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:B,error:te}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:B,result:A(M,{cause:v.error}),meta:{origin:"result",resultCause:v.error}}),l?.(te,a,D),S(te,{origin:"result",resultCause:v.error})}})()},m.fromNullable=(o,y,c,p)=>{if(typeof o!="string"||o.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 m(o,async()=>{let a=await y();return a!=null?oe(a):A(c())},p)},m.retry=(o,y,c)=>{if(typeof o!="string"||o.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 m(o,y,{key:c.key??o,retry:{attempts:c.attempts,backoff:c.backoff,initialDelay:c.initialDelay,maxDelay:c.maxDelay,jitter:c.jitter,shouldRetry:c.shouldRetry,onRetry:c.onRetry},timeout:c.timeout})},m.withTimeout=(o,y,c)=>{if(typeof o!="string"||o.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 m(o,y,{key:c.key??o,timeout:c})},m.sleep=(o,y,c)=>{if(typeof o!="string"||o.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let p=typeof y=="string"?Ht(y):y;if(!p)throw new Error(`step.sleep: invalid duration '${y}'`);let a=p.millis,i=c?.signal;return m(o,async()=>{if(K?.aborted||i?.aborted){let g=new Error("Sleep aborted");throw g.name="AbortError",g}return new Promise((g,x)=>{let b={timeoutId:void 0},v=()=>{b.timeoutId&&clearTimeout(b.timeoutId);let M=new Error("Sleep aborted");M.name="AbortError",x(M)};K?.addEventListener("abort",v,{once:!0}),i?.addEventListener("abort",v,{once:!0}),b.timeoutId=setTimeout(()=>{K?.removeEventListener("abort",v),i?.removeEventListener("abort",v),g(oe(void 0))},a)})},{key:c?.key??o,description:c?.description})},m.all=((...o)=>{if(typeof o[0]!="string")throw new TypeError("step.all(name, ...): first argument must be a string (step name). Example: step.all('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let y=o[0],c=o[1];if(typeof c=="function")return ue(y,c);if(c&&typeof c=="object"&&!Array.isArray(c)){let a=Y(c);return me(a,{name:y})}throw new TypeError("step.all(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),m.race=(o,y)=>{let c=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let p=performance.now(),a=!1,i={scopeId:c,type:"race",winnerId:void 0};ee.push(i);let g=()=>{if(a)return;a=!0;let x=ee.findIndex(b=>b.scopeId===c);x!==-1&&ee.splice(x,1),n({type:"scope_end",workflowId:r,scopeId:c,ts:Date.now(),durationMs:performance.now()-p,winnerId:i.winnerId})};n({type:"scope_start",workflowId:r,scopeId:c,scopeType:"race",name:o,ts:Date.now()});try{let x=await y();if(g(),!x.ok)throw l?.(x.error,o,D),S(x.error,{origin:"result",resultCause:x.cause});return x.value}catch(x){throw g(),x}})()},m.if=(o,y,c)=>c(),m.label=m.if,m.branch=async(o,y)=>{let{condition:c,then:p,else:a}=y;if(c())return await p();if(a)return await a()},m.arm=(o,y)=>({fn:o,errors:y}),m.forEach=async(o,y,c)=>{let p=[],a=c.maxIterations,i=0,g="run"in c,x=Symbol.asyncIterator in y?y:(async function*(){yield*y})();for await(let b of x){if(a!==void 0&&i>=a)break;let v;g?v=await c.run(b,i):v=await c.item.handler(b,i,m),p.push(v),i++}return p},m.item=o=>({__forEachItemHandler:!0,handler:o}),m.dep=(o,y)=>y,m.workflow=(o,y,c)=>m(o,y,c),m.map=async(o,y,c,p)=>{let a=p?.concurrency??y.length;return m(o,()=>a>=y.length?xt(y.map((i,g)=>c(i,g))):(async()=>{let i=[];for(let g=0;g<y.length;g+=a){let x=y.slice(g,g+a),b=await xt(x.map((v,M)=>c(v,g+M)));if(!b.ok)return b;i.push(...b.value)}return oe(i)})(),{key:p?.key})},m.withFallback=(o,y,c)=>{if(typeof o!="string"||o.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 p=c.key??o,a=o,i=ne(p),g=w;return(async()=>{let x=g?performance.now():0;w&&n({type:"step_start",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now()});let b;try{b=await y()}catch(V){if(G(V))throw n({type:"step_aborted",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:performance.now()-x}),V;let z;try{z=se(V)}catch(q){throw Ae(q)}if(c.on!==void 0&&c.on!==z){let q=performance.now()-x;throw n({type:"step_error",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:q,error:z}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:q,result:A(z,{cause:V}),meta:{origin:"throw",thrown:V}}),l?.(z,a,D),S(z,{origin:"throw",thrown:V})}let L;try{L=await c.fallback()}catch(q){if(G(q))throw n({type:"step_aborted",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:performance.now()-x}),q;let P;try{P=se(q)}catch(E){throw Ae(E)}let Re=performance.now()-x;throw n({type:"step_error",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:Re,error:P}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:Re,result:A(P,{cause:q}),meta:{origin:"throw",thrown:q}}),l?.(P,a,D),S(P,{origin:"throw",thrown:q})}if(L.ok){let q=performance.now()-x;return n({type:"step_success",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:q}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:q,result:L,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(z)}}),L.value}else{let q=performance.now()-x,P=ae(L.error,{origin:"result",resultCause:L.cause});throw n({type:"step_error",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:q,error:P}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:q,result:L,meta:{origin:"result",resultCause:L.cause}}),l?.(P,a,D),S(P,{origin:"result",resultCause:L.cause})}}if(b.ok){let V=performance.now()-x;return n({type:"step_success",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:V}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:V,result:b}),b.value}let v=b.error;if(c.on!==void 0&&c.on!==v){let V=performance.now()-x,z=ae(v,{origin:"result",resultCause:b.cause});throw n({type:"step_error",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:V,error:z}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:V,result:b,meta:{origin:"result",resultCause:b.cause}}),l?.(z,a,D),S(z,{origin:"result",resultCause:b.cause})}let M;try{M=await c.fallback()}catch(V){if(G(V))throw n({type:"step_aborted",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:performance.now()-x}),V;let z;try{z=se(V)}catch(q){throw Ae(q)}let L=performance.now()-x;throw n({type:"step_error",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:L,error:z}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:L,result:A(z,{cause:V}),meta:{origin:"throw",thrown:V}}),l?.(z,a,D),S(z,{origin:"throw",thrown:V})}if(M.ok){let V=performance.now()-x;return n({type:"step_success",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:V}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:V,result:M,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(v)}}),M.value}let B=performance.now()-x,te=ae(M.error,{origin:"result",resultCause:M.cause});throw n({type:"step_error",workflowId:r,stepId:i,stepKey:p,name:a,ts:Date.now(),durationMs:B,error:te}),p&&n({type:"step_complete",workflowId:r,stepKey:p,name:a,ts:Date.now(),durationMs:B,result:M,meta:{origin:"result",resultCause:M.cause}}),l?.(te,a,D),S(te,{origin:"result",resultCause:M.cause})})()},m.withResource=(o,y)=>{if(typeof o!="string"||o.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 c=o,p=o,a=ne(c),i=w;return(async()=>{let g=i?performance.now():0;w&&n({type:"step_start",workflowId:r,stepId:a,stepKey:c,name:p,ts:Date.now()});let x;try{x=await y.acquire()}catch(L){if(G(L))throw n({type:"step_aborted",workflowId:r,stepId:a,stepKey:c,name:p,ts:Date.now(),durationMs:performance.now()-g}),L;let q;try{q=se(L)}catch(Re){throw Ae(Re)}let P=performance.now()-g;throw n({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:p,ts:Date.now(),durationMs:P,error:q}),c&&n({type:"step_complete",workflowId:r,stepKey:c,name:p,ts:Date.now(),durationMs:P,result:A(q,{cause:L}),meta:{origin:"throw",thrown:L}}),l?.(q,p,D),S(q,{origin:"throw",thrown:L})}if(!x.ok){let L=performance.now()-g,q=ae(x.error,{origin:"result",resultCause:x.cause});throw n({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:p,ts:Date.now(),durationMs:L,error:q}),c&&n({type:"step_complete",workflowId:r,stepKey:c,name:p,ts:Date.now(),durationMs:L,result:x,meta:{origin:"result",resultCause:x.cause}}),l?.(q,p,D),S(q,{origin:"result",resultCause:x.cause})}let b=x.value,v,M,B=!1;try{v=await y.use(b)}catch(L){if(G(L)){try{await y.release(b)}catch(q){console.warn(`[awaitly] step.withResource("${o}"): release threw after earlyExit:`,q)}throw L}M=L,B=!0}try{await y.release(b)}catch(L){console.warn(`[awaitly] step.withResource("${o}"): release threw:`,L)}if(B){let L;try{L=se(M)}catch(P){throw Ae(P)}let q=performance.now()-g;throw n({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:p,ts:Date.now(),durationMs:q,error:L}),c&&n({type:"step_complete",workflowId:r,stepKey:c,name:p,ts:Date.now(),durationMs:q,result:A(L,{cause:M}),meta:{origin:"throw",thrown:M}}),l?.(L,p,D),S(L,{origin:"throw",thrown:M})}let te=v;if(te.ok){let L=performance.now()-g;return n({type:"step_success",workflowId:r,stepId:a,stepKey:c,name:p,ts:Date.now(),durationMs:L}),c&&n({type:"step_complete",workflowId:r,stepKey:c,name:p,ts:Date.now(),durationMs:L,result:te}),te.value}let V=performance.now()-g,z=ae(te.error,{origin:"result",resultCause:te.cause});throw n({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:p,ts:Date.now(),durationMs:V,error:z}),c&&n({type:"step_complete",workflowId:r,stepKey:c,name:p,ts:Date.now(),durationMs:V,result:te,meta:{origin:"result",resultCause:te.cause}}),l?.(z,p,D),S(z,{origin:"result",resultCause:te.cause})})()};let j=await u({step:m});if(process.env.NODE_ENV!=="production"&&j!==null&&typeof j=="object"&&"ok"in j&&typeof j.ok=="boolean"){let o=j;(o.ok===!0&&"value"in o||o.ok===!1&&"error"in o)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
2
-
3
- Incorrect: return ok({ data });
4
- Correct: return { data };
5
-
6
- See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return oe(j)}catch(m){if(Yt(m))throw m.thrown;if(G(m)){let ue=m.meta.origin==="throw"?m.meta.thrown:m.meta.origin==="result"?m.meta.resultCause:void 0;return A(m.error,{cause:ue})}let Y=se(m);return l?.(Y,"unexpected",D),A(Y,{cause:m})}}Fe.strict=(e,t)=>Fe(e,t);async function xt(e){return e.length===0?oe([]):new Promise(t=>{let s=!1,u=e.length,f=new Array(e.length);for(let l=0;l<e.length;l++){let w=l;Promise.resolve(e[w]).catch(I=>A({type:"PROMISE_REJECTED",cause:I},{cause:{type:"PROMISE_REJECTION",reason:I}})).then(I=>{if(!s){if(!I.ok){s=!0,t(I);return}f[w]=I.value,u--,u===0&&t(oe(f))}})}})}function bt(e){return e.type==="step_complete"}function Xe(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}var ve=class extends Error{constructor(s,u=[]){super(s);this.errors=u;this.name="SnapshotFormatError"}errors};var _e=class extends Error{constructor(s,u,f){super(s);this.stepId=u;this.originalError=f;this.name="SnapshotDecodeError"}stepId;originalError};function Zt(e){let t=[];if(typeof e!="object"||e===null)return{valid:!1,errors:["Snapshot must be an object"]};let s=e;if("formatVersion"in s?s.formatVersion!==1&&t.push(`Invalid formatVersion: expected 1, got ${s.formatVersion}`):t.push("Missing required field: formatVersion"),!("steps"in s))t.push("Missing required field: steps");else if(typeof s.steps!="object"||s.steps===null)t.push("steps must be an object");else{let u=s.steps;for(let[f,l]of Object.entries(u)){if(typeof l!="object"||l===null){t.push(`steps["${f}"] must be an object`);continue}let w=l;"ok"in w?typeof w.ok!="boolean"?t.push(`steps["${f}"].ok must be a boolean`):w.ok===!1&&("error"in w||t.push(`steps["${f}"] is error result but missing error field`),"cause"in w||t.push(`steps["${f}"] is error result but missing cause field`)):t.push(`steps["${f}"] missing required field: ok`)}}if(!("execution"in s))t.push("Missing required field: execution");else if(typeof s.execution!="object"||s.execution===null)t.push("execution must be an object");else{let u=s.execution;"status"in u?["running","completed","failed"].includes(u.status)||t.push("execution.status must be one of: running, completed, failed"):t.push("execution missing required field: status"),"lastUpdated"in u?typeof u.lastUpdated!="string"&&t.push("execution.lastUpdated must be a string (ISO timestamp)"):t.push("execution missing required field: lastUpdated")}return t.length>0?{valid:!1,errors:t}:{valid:!0,snapshot:e}}function At(e){let t=Zt(e);if(!t.valid)throw new ve(`Invalid snapshot format: ${t.errors[0]}`,t.errors);return t.snapshot}function Pt(e,t){let s=Object.create(null);for(let[w,I]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,w)&&(s[w]=I);for(let[w,I]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,w)&&(s[w]=I);let u=e.metadata||t.metadata?{...e.metadata,...t.metadata}:void 0,l=[...(e.warnings||[]).filter(w=>!Object.prototype.hasOwnProperty.call(t.steps,w.stepId)),...t.warnings||[]];return{formatVersion:1,steps:s,execution:{...t.execution},metadata:u,warnings:l.length>0?l:void 0}}var vt=1e3;function Ze(e){let t={type:"error",name:e.name,message:e.message};e.stack&&(t.stack=e.stack);let s=e;return s.cause!==void 0&&(s.cause instanceof Error?t.cause=Ze(s.cause):t.cause=Qe(s.cause)),t}function Qe(e){let t,s=!1;try{t=String(e),t.length>vt&&(t=t.slice(0,vt),s=!0)}catch{t="[unable to convert to string]"}let u=e===null?"null":typeof e=="object"?e.constructor?.name??"Object":typeof e,f;try{let w=JSON.stringify(e);w!==void 0&&(f=JSON.parse(w))}catch{}let l={type:"thrown",originalType:u,stringRepresentation:t};return f!==void 0&&(l.value=f),s&&(l.truncated=!0),l}function et(e){if(e.type==="error"){let t=new Error(e.message);return t.name=e.name,e.stack&&(t.stack=e.stack),e.cause&&(t.cause=et(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function Qt(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function Ce(e,t,s){return A(e,{cause:{__cachedMeta:!0,originalCause:s,meta:t}})}function Ve(e){return Qt(e)?e.meta:{origin:"result",resultCause:e}}function Le(){let e=new Map;return{handleEvent:t=>{bt(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}var er="STREAM_WRITE_ERROR",tr="STREAM_READ_ERROR",rr="STREAM_CLOSE_ERROR";var nr="STREAM_ENDED";function He(e,t,s){return{type:er,reason:e,message:t,...s!==void 0?{cause:s}:{}}}function tt(e,t,s){return{type:tr,reason:e,message:t,...s!==void 0?{cause:s}:{}}}function rt(e,t,s){return{type:rr,reason:e,message:t,...s!==void 0?{cause:s}:{}}}function qe(e){return{type:nr,finalPosition:e}}function Ot(e={}){let t=e.highWaterMark??16,s=e.lowWaterMark??Math.floor(t/2),u=e.onStateChange,f="flowing",l=0,w=[];function I(W){if(f!==W&&(f=W,u?.(W),W==="flowing"&&w.length>0)){let D=w;w=[];for(let K of D)K()}}function $(){f==="flowing"&&l>=t?I("paused"):f==="paused"&&l<=s&&I("flowing")}return{get state(){return f},get bufferedCount(){return l},get highWaterMark(){return t},get lowWaterMark(){return s},increment(){l++,$()},decrement(){l>0&&(l--,$())},setCount(W){l=Math.max(0,W),$()},waitForDrain(){return f==="flowing"?Promise.resolve():new Promise(W=>{w.push(W)})},reset(){l=0,w=[],I("flowing")}}}function or(e){return{_tag:"Duration",millis:e}}function sr(e){return{_tag:"Duration",millis:e*1e3}}function ar(e){return{_tag:"Duration",millis:e*60*1e3}}function ir(e){return{_tag:"Duration",millis:e*60*60*1e3}}function ur(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function Dt(e){return e.millis}function _t(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let s=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return or(s);case"s":return sr(s);case"m":return ar(s);case"h":return ir(s);case"d":return ur(s);default:return}}async function It(e,t){let s=e["~standard"].validate(t),u=s instanceof Promise?await s:s;return u.issues?A({type:"INPUT_VALIDATION_ERROR",issues:u.issues.map(f=>({message:f.message,path:f.path?.map(l=>typeof l=="object"?l.key:l)})),message:`Input validation failed: ${u.issues.map(f=>f.message).join(", ")}`}):oe(u.value)}function nt(e,t){let s=u=>((...f)=>{let l=f.at(-1),w=f.length>0&&typeof l=="object"&&l!==null&&!Array.isArray(l)&&typeof l!="function",I=w?l:void 0,$=w?f.slice(0,-1):f,W={...t,...I?.deps??{}},D=I?{...I,deps:W}:{deps:W};return e[u](...$,D)});return{run:s("run"),runWithState:s("runWithState"),withDeps(u){return nt(e,{...t,...u})}}}function ot(e,t,s){if(typeof e!="string"||e.length===0)throw new TypeError("createWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createWorkflow('checkout', { chargeCard, sendEmail })");let u=t??{},f=s;async function l(W,D,K){let r=W??crypto.randomUUID(),se=K?.deps?{...u,...K.deps}:u,ee=[],ge=K?.createContext??f?.createContext,ne=ge?await ge():void 0,n=K?.signal??f?.signal,S=K?.onEvent??f?.onEvent,G=K?.onError??f?.onError,ae=K?.shouldRun??f?.shouldRun,X=K?.onBeforeStart??f?.onBeforeStart,le=K?.onAfterStep??f?.onAfterStep,ye=K?.resumeState??f?.resumeState,pe=f?.catchUnexpected??$e,m={},Y=(K?.devWarnings??f?.devWarnings)===!0&&process.env.NODE_ENV!=="production",ue=new Set,me=new Set,Te={workflowId:r,onEvent:S,context:ne!==void 0?ne:void 0,signal:n,input:{},ref:E=>m[E],set:(E,k)=>{Y&&!ue.has(E)&&(ue.add(E),console.warn(`awaitly: ctx.set('${E}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${E}' }) instead.`)),m[E]=k},get:E=>(Y&&!me.has(E)&&(me.add(E),console.warn(`awaitly: ctx.get('${E}') is deprecated for static analysis. Use ctx.ref('${E}') instead for tracked dependencies.`)),m[E])},j=E=>{let k=E.context!==void 0||ne===void 0?E:{...E,context:ne},J=k.workflowName===void 0?{...k,workflowName:e}:k;S?.(J,ne)},o=(E,k)=>{let J={type:"WORKFLOW_CANCELLED",reason:E,lastStepKey:k};return A(pe(J),{cause:J})};if(n?.aborted){let E=typeof n.reason=="string"?n.reason:n.reason instanceof Error?n.reason.message:void 0;return j({type:"workflow_cancelled",workflowId:r,ts:Date.now(),durationMs:0,reason:E}),o(E)}if(ae){let E=performance.now();try{let k=await ae(r,ne),J=performance.now()-E;if(j({type:"hook_should_run",workflowId:r,ts:Date.now(),durationMs:J,result:k,skipped:!k}),!k){let C=new Error("Workflow skipped by shouldRun hook");return A(pe(C),{cause:C})}}catch(k){let J=performance.now()-E;return j({type:"hook_should_run_error",workflowId:r,ts:Date.now(),durationMs:J,error:k}),A(pe(k),{cause:k})}}if(X){let E=performance.now();try{let k=await X(r,ne),J=performance.now()-E;if(j({type:"hook_before_start",workflowId:r,ts:Date.now(),durationMs:J,result:k,skipped:!k}),!k){let C=new Error("Workflow skipped by onBeforeStart hook");return A(pe(C),{cause:C})}}catch(k){let J=performance.now()-E;return j({type:"hook_before_start_error",workflowId:r,ts:Date.now(),durationMs:J,error:k}),A(pe(k),{cause:k})}}let y=f?.inputSchema,c=f?.input;if(y){let E=await It(y,c);if(!E.ok)return A(E.error);Te.input=E.value}else c!==void 0&&(Te.input=c);let p=Date.now(),a=performance.now();j({type:"workflow_start",workflowId:r,ts:p});let i=K?.cache??f?.cache,g=K?.streamStore??f?.streamStore;if(ye&&!i&&(i=new Map),ye&&i){let E=typeof ye=="function"?await ye():ye;E.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof E.steps}). This usually happens when state is serialized with JSON.stringify() directly.
7
- Use stringifyState() and parseState() from 'awaitly/persistence' instead:
8
- import { stringifyState, parseState } from 'awaitly/persistence';
9
- const json = stringifyState(state); // Save this
10
- const restored = parseState(json); // Load this`),typeof E.steps=="object"&&E.steps!==null&&(E.steps=new Map(Object.entries(E.steps))));for(let[k,J]of E.steps){let{result:C,meta:R}=J;if(C.ok)i.set(k,C);else{let d=R??{origin:"result",resultCause:C.cause};i.set(k,Ce(C.error,d,C.cause))}}}let x=K?.snapshot??f?.snapshot,b=f?.serialization;if(x&&!ye){i||(i=new Map);let E=x,k=b?.decode;for(let[J,C]of Object.entries(E.steps))if(Object.prototype.hasOwnProperty.call(E.steps,J))try{if(C.ok){let R=k?k(C.value):C.value;i.set(J,oe(R))}else{let R=k?k(C.error):C.error,d=et(C.cause),h=C.meta?.origin==="throw"?{origin:"throw",thrown:d}:{origin:"result",resultCause:d};i.set(J,Ce(R,h,d))}}catch(R){throw new _e(`Failed to decode step "${J}": ${R instanceof Error?R.message:String(R)}`,J,R instanceof Error?R:void 0)}}let v=!1,M,B,te=()=>{v=!0,M=typeof n?.reason=="string"?n.reason:n?.reason instanceof Error?n.reason.message:void 0};n&&!n.aborted&&n.addEventListener("abort",te,{once:!0});let V=()=>{if(v||n?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:M??(typeof n?.reason=="string"?n.reason:n?.reason instanceof Error?n.reason.message:void 0),lastStepKey:B}},z=async(E,k,J)=>{if(!le)return;let C=performance.now();try{await le(E,k,r,ne);let R=performance.now()-C;j({type:"hook_after_step",workflowId:r,stepKey:E,ts:Date.now(),durationMs:R})}catch(R){let d=performance.now()-C;throw j({type:"hook_after_step_error",workflowId:r,stepKey:E,ts:Date.now(),durationMs:d,error:R}),R}},L=E=>{let k=async(R,d,h)=>{if(typeof R!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let _=R,O=h??{},U=_,T=Object.prototype.hasOwnProperty.call(O,"key")?O.key:_,{ttl:F,out:Z}=O;V();let re=Ge(O);if(T&&i&&i.has(T)){j({type:"step_cache_hit",workflowId:r,stepKey:T,name:U,ts:Date.now(),...re&&{metadata:re}});let N=i.get(T);if(N.ok)return B=T,Z&&(m[Z]=N.value),N.value;let H=Ve(N.cause);throw De(N.error,H)}T&&i&&j({type:"step_cache_miss",workflowId:r,stepKey:T,name:U,ts:Date.now(),...re&&{metadata:re}});try{let N=await E(_,d,O);return Z&&(m[Z]=N),O.compensate&&ee.push({stepName:U,value:N,compensate:O.compensate}),T&&(B=T,i&&i.set(T,oe(N),F?{ttl:F}:void 0),await z(T,oe(N))),N}catch(N){if(T&&be(N)){let H=N,de=H.meta.origin==="result"?H.meta.resultCause:H.meta.origin==="throw"?H.meta.thrown:void 0,Q=Ce(H.error,H.meta,de);i&&i.set(T,Q,F?{ttl:F}:void 0),await z(T,Q,H.meta)}throw N}};k.try=async(R,d,h)=>{let{ttl:_}=h,O=h.key??R,U=R;if(i&&i.has(O)){j({type:"step_cache_hit",workflowId:r,stepKey:O,name:U,ts:Date.now()});let T=i.get(O);if(T.ok)return T.value;let F=Ve(T.cause);throw De(T.error,F)}i&&j({type:"step_cache_miss",workflowId:r,stepKey:O,name:U,ts:Date.now()});try{let T=await E.try(R,d,{...h,key:O});return h.compensate&&ee.push({stepName:U,value:T,compensate:h.compensate}),i&&i.set(O,oe(T),_?{ttl:_}:void 0),await z(O,oe(T)),T}catch(T){if(be(T)){let F=T,Z=F.meta.origin==="result"?F.meta.resultCause:F.meta.origin==="throw"?F.meta.thrown:void 0,re=Ce(F.error,F.meta,Z);i&&i.set(O,re,_?{ttl:_}:void 0),await z(O,re,F.meta)}throw T}},k.fromResult=async(R,d,h)=>{let{ttl:_}=h,O=h.key??R,U=R;if(i&&i.has(O)){j({type:"step_cache_hit",workflowId:r,stepKey:O,name:U,ts:Date.now()});let T=i.get(O);if(T.ok)return T.value;let F=Ve(T.cause);throw De(T.error,F)}i&&j({type:"step_cache_miss",workflowId:r,stepKey:O,name:U,ts:Date.now()});try{let T=await E.fromResult(R,d,{...h,key:O});return i&&i.set(O,oe(T),_?{ttl:_}:void 0),await z(O,oe(T)),T}catch(T){if(be(T)){let F=T,Z=F.meta.origin==="result"?F.meta.resultCause:F.meta.origin==="throw"?F.meta.thrown:void 0,re=Ce(F.error,F.meta,Z);i&&i.set(O,re,_?{ttl:_}:void 0),await z(O,re,F.meta)}throw T}},k.race=E.race,k.withFallback=async(R,d,h)=>{let _=h.key??R,O=R;if(i&&i.has(_)){j({type:"step_cache_hit",workflowId:r,stepKey:_,name:O,ts:Date.now()});let U=i.get(_);if(U.ok)return U.value;let T=Ve(U.cause);throw De(U.error,T)}i&&j({type:"step_cache_miss",workflowId:r,stepKey:_,name:O,ts:Date.now()});try{let U=await E.withFallback(R,d,h);return i&&i.set(_,oe(U)),await z(_,oe(U)),U}catch(U){if(be(U)){let T=U,F=T.meta.origin==="result"?T.meta.resultCause:T.meta.origin==="throw"?T.meta.thrown:void 0,Z=Ce(T.error,T.meta,F);i&&i.set(_,Z),await z(_,Z,T.meta)}throw U}},k.withResource=async(R,d)=>{let h=R;try{let _=await E.withResource(R,d);return await z(h,oe(_)),_}catch(_){if(be(_)){let O=_,U=O.meta.origin==="result"?O.meta.resultCause:O.meta.origin==="throw"?O.meta.thrown:void 0,T=Ce(O.error,O.meta,U);await z(h,T,O.meta)}throw _}},k.retry=(R,d,h)=>{let _={key:h.key,retry:{attempts:h.attempts,backoff:h.backoff,initialDelay:h.initialDelay,maxDelay:h.maxDelay,jitter:h.jitter,shouldRetry:h.shouldRetry,onRetry:h.onRetry},timeout:h.timeout,ttl:h.ttl};return k(R,d,_)},k.withTimeout=(R,d,h)=>{let _={key:h.key,timeout:h,ttl:h.ttl};return k(R,d,_)},k.sleep=(R,d,h)=>{if(typeof R!="string"||R.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let _=typeof d=="string"?_t(d):d;if(!_)throw new Error(`step.sleep: invalid duration '${d}'`);let O=Dt(_),U=h?.signal;return k(R,async()=>{if(n?.aborted||U?.aborted){let F=new Error("Sleep aborted");throw F.name="AbortError",F}return new Promise((F,Z)=>{let re={timeoutId:void 0},N=()=>{re.timeoutId&&clearTimeout(re.timeoutId);let H=new Error("Sleep aborted");H.name="AbortError",Z(H)};n?.addEventListener("abort",N,{once:!0}),U?.addEventListener("abort",N,{once:!0}),re.timeoutId=setTimeout(()=>{n?.removeEventListener("abort",N),U?.removeEventListener("abort",N),F(oe(void 0))},O)})},{key:h?.key,ttl:h?.ttl,description:h?.description})};let J=new Map,C=new Map;return k.getWritable=R=>{let d=R?.namespace??"default",h=R?.highWaterMark??16;if(!g)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let _=`${r}:${d}`,O=J.get(_);if(O&&!O.closed&&!O.aborted)return O.writer;let U=Ot({highWaterMark:h,onStateChange:H=>{j({type:"stream_backpressure",workflowId:r,namespace:d,bufferedCount:U.bufferedCount,state:H,ts:Date.now()})}}),T=0,F=!0,Z=!1,re=!1;j({type:"stream_created",workflowId:r,namespace:d,ts:Date.now()});let N={async write(H){if(re)return A(He("closed","Stream is closed"));if(Z)return A(He("aborted","Stream was aborted"));U.state==="paused"&&await U.waitForDrain();let de={value:H,position:T,ts:Date.now()},Q=await g.append(r,d,de);return Q.ok?(j({type:"stream_write",workflowId:r,namespace:d,position:T,ts:Date.now()}),T++,U.increment(),oe(void 0)):(j({type:"stream_error",workflowId:r,namespace:d,error:Q.error,position:T,ts:Date.now()}),A(He("store_error",Q.error.message,Q.error)))},async close(){if(re)return A(rt("already_closed","Stream is already closed"));let H=await g.closeStream(r,d);return H.ok?(re=!0,F=!1,j({type:"stream_close",workflowId:r,namespace:d,finalPosition:T,ts:Date.now()}),J.delete(_),oe(void 0)):A(rt("store_error",H.error.message,H.error))},abort(H){Z=!0,F=!1,re=!0,j({type:"stream_error",workflowId:r,namespace:d,error:H,position:T,ts:Date.now()}),J.delete(_)},get writable(){return F},get position(){return T},get namespace(){return d}};return J.set(_,{writer:N,backpressure:U,aborted:Z,closed:re}),N},k.getReadable=R=>{let d=R?.namespace??"default",h=R?.startIndex??0,_=R?.pollInterval??10,O=R?.pollTimeout??3e4;if(!g)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let U=`${r}:${d}:${h}`,T=C.get(U);if(T&&!T.closed)return T.reader;let F=()=>{let he=`${r}:${d}`,ce=J.get(he);ce&&ce.backpressure.decrement()},Z=h,re=!0,N=!1,H=[],de=0,Q={async read(){if(N)return A(tt("closed","Reader is closed"));if(de<H.length){let we=H[de++];return Z=we.position+1,F(),j({type:"stream_read",workflowId:r,namespace:d,position:we.position,ts:Date.now()}),oe(we.value)}let he=`${r}:${d}`,ce=Date.now(),Ee=J.has(he),ie=await g.getMetadata(r,d),fe=ie.ok&&ie.value!==void 0;for(;Date.now()-ce<O;){let we=await g.read(r,d,Z,100);if(!we.ok)return A(tt("store_error",we.error.message,we.error));let Me=we.value;if(Me.length>0){H=Me,de=1;let We=Me[0];return Z=We.position+1,F(),j({type:"stream_read",workflowId:r,namespace:d,position:We.position,ts:Date.now()}),oe(We.value)}let Ue=J.has(he),Se=await g.getMetadata(r,d),ut=Se.ok&&Se.value!==void 0;if(Ue&&(Ee=!0),ut&&(fe=!0),Se.ok&&Se.value?.closed)return re=!1,A(qe(Z));if(Ee&&!Ue&&!ut)return re=!1,A(qe(Z));fe&&!Ue&&Se.ok&&Se.value?.closed,await new Promise(We=>setTimeout(We,_))}return re=!1,A(qe(Z))},close(){N=!0,re=!1,H=[],C.delete(U)},get readable(){return re},get position(){return Z},get namespace(){return d}};return C.set(U,{reader:Q,position:Z,closed:N}),Q},k.streamForEach=async(R,d,h)=>{let _=h?.checkpointInterval??1,O=h?.concurrency??1,U=[],T=0,F=-1,Z=N=>typeof N=="object"&&N!==null&&"read"in N&&typeof N.read=="function",re=async(N,H,de,Q)=>{let ce=_>0&&H%_===0?`stream-foreach:${Q}:pos-${de}`:void 0,Ee=ce??`stream-item-${de}`,ie=await k(Ee,()=>d(N,H),{key:ce});return{index:H,position:de,result:ie}};if(Z(R))if(O<=1){let N=R.position,H=await R.read();for(;H.ok;){let de=H.value,{result:Q}=await re(de,T,N,R.namespace);U.push(Q),F=N,T++,N=R.position,H=await R.read()}}else{let N=new Map,H=0,de=0,Q=new Array(O).fill(null),he=async()=>{for(let we=0;we<Q.length;we++)if(Q[we]===null)return we;let ie=Q.filter(we=>we!==null),fe=await Promise.race(ie);return N.set(fe.index,{position:fe.position,result:fe.result}),Q[fe.slotIndex]=null,fe.slotIndex},ce=R.position,Ee=await R.read();for(;Ee.ok;){let ie=await he(),fe=H,we=ce,Me=Ee.value,Ue=ie;Q[ie]=re(Me,fe,we,R.namespace).then(Se=>({slotIndex:Ue,...Se})),de++,H++,ce=R.position,Ee=await R.read()}for(let ie=0;ie<Q.length;ie++)if(Q[ie]!==null){let fe=await Q[ie];N.set(fe.index,{position:fe.position,result:fe.result})}for(let ie=0;ie<de;ie++){let fe=N.get(ie);fe&&(U.push(fe.result),F=fe.position,T++)}}else if(O<=1){let N=0;for await(let H of R){let{result:de}=await re(H,N,N,"async-iterable");U.push(de),F=N,T++,N++}}else{let N=new Map,H=0,de=0,Q=new Array(O).fill(null),he=async()=>{for(let ie=0;ie<Q.length;ie++)if(Q[ie]===null)return ie;let ce=Q.filter(ie=>ie!==null),Ee=await Promise.race(ce);return N.set(Ee.index,Ee.result),Q[Ee.slotIndex]=null,Ee.slotIndex};for await(let ce of R){let Ee=await he(),ie=H,fe=Ee;Q[Ee]=re(ce,ie,ie,"async-iterable").then(we=>({slotIndex:fe,...we})),de++,H++}for(let ce=0;ce<Q.length;ce++)if(Q[ce]!==null){let Ee=await Q[ce];N.set(Ee.index,Ee.result)}for(let ce=0;ce<de;ce++)N.has(ce)&&(U.push(N.get(ce)),F=ce,T++)}return{results:U,processedCount:T,lastPosition:F}},k.if=E.if,k.label=E.label,k.branch=E.branch,k.arm=E.arm,k.forEach=E.forEach,k.item=E.item,k.dep=E.dep,k.workflow=(R,d,h)=>k(R,d,h),k.all=(R,d,h)=>{let _=h!==void 0&&Object.prototype.hasOwnProperty.call(h,"key")?h:{...h,key:void 0};return k(R,async()=>oe(await E.all(R,d)),_)},k.map=(R,d,h,_)=>{let O=_!==void 0&&Object.prototype.hasOwnProperty.call(_,"key")?_:{..._,key:void 0};return k(R,async()=>oe(await E.map(R,d,h,_)),O)},k},q=({step:E})=>{let k=L(E);return D({step:k,steps:je(se??{},k),deps:se,ctx:Te})},P;try{P=await Fe(q,{onError:G,onEvent:S,catchUnexpected:pe,workflowId:r,workflowName:e,context:ne,_workflowSignal:n})}finally{n&&n.removeEventListener("abort",te)}if(!P.ok&&ee.length>0){let E=[];for(let k=ee.length-1;k>=0;k--){let J=ee[k];try{await J.compensate(J.value)}catch(C){E.push({stepName:J.stepName,error:C})}}if(E.length>0){let k={type:"SAGA_COMPENSATION_ERROR",originalError:P.error,compensationErrors:E};P=A(k,{cause:P.cause})}}let Re=performance.now()-a;if(!P.ok){let E;if(Xe(P.cause)&&(E=P.cause),!E&&v&&ht(P.error)){let k=P.cause;k!=null&&typeof k=="object"&&"name"in k&&k.name==="AbortError"&&(E={type:"WORKFLOW_CANCELLED",reason:M??(typeof n?.reason=="string"?n.reason:n?.reason instanceof Error?n.reason.message:void 0),lastStepKey:B})}if(E)return j({type:"workflow_cancelled",workflowId:r,ts:Date.now(),durationMs:Re,reason:E.reason,lastStepKey:E.lastStepKey}),E&&!Xe(P.cause)?A(P.error,{cause:E}):P}if(P.ok&&v){let E=M??(typeof n?.reason=="string"?n.reason:n?.reason instanceof Error?n.reason.message:void 0);j({type:"workflow_cancelled",workflowId:r,ts:Date.now(),durationMs:Re,reason:E,lastStepKey:B});let k={type:"WORKFLOW_CANCELLED",reason:E,lastStepKey:B};return A(pe(k),{cause:k})}return P.ok?j({type:"workflow_success",workflowId:r,ts:Date.now(),durationMs:Re}):j({type:"workflow_error",workflowId:r,ts:Date.now(),durationMs:Re,error:P.error}),P}function w(W,D,K){let r,se,ee;return typeof W=="string"?(r=W,se=D,ee=K):(se=W,ee=D),l(r,se,ee)}async function I(W,D,K){let r,se,ee;typeof W=="string"?(r=W,se=D,ee=K):(se=W,ee=D);let ge=Le(),ne=ee?.onEvent,S={...ee,onEvent:(X,le)=>{ge.handleEvent(X);try{ne?.(X,le)}catch{}}},G,ae;try{G=await l(r,se,S)}catch(X){let le=f?.catchUnexpected??$e;G=A(le(X),{cause:X})}finally{ae=ge.getResumeState()}return{result:G,resumeState:ae}}let $={withDeps:W=>nt($,W),run:w,runWithState:I};return $}var st;function lr(){let e=new Map;return{async save(t,s){e.set(t,{snapshot:s,updatedAt:new Date})},async load(t){return e.get(t)?.snapshot??null},async delete(t){e.delete(t)},async list(t){let s=t?.prefix??"",u=t?.limit??100,f=[];for(let[l,w]of e.entries())if(!(s&&!l.startsWith(s))&&(f.push({id:l,updatedAt:w.updatedAt.toISOString()}),f.length>=u))break;return f.sort((l,w)=>w.updatedAt.localeCompare(l.updatedAt)),f},async close(){}}}function cr(){return st===void 0&&(st=lr()),st}function Mt(e){return typeof e.tryAcquire=="function"&&typeof e.release=="function"}var at=new Set,Ie=new Map,Ut={async run(e,t,s){let{id:u,store:f,version:l=1,allowConcurrent:w=!1,lockTtlMs:I=6e4,heartbeatIntervalMs:$,abortOnLeaseLoss:W,metadata:D,signal:K,createContext:r,onEvent:se,onError:ee,onVersionMismatch:ge,idempotencyKey:ne,input:n}=s,S=f??cr(),G;if(ne){let m=`idem:${ne}`,Y=Ie.get(m);if(Y)return await Y;Ie.set(m,new Promise(ue=>{G=ue}));try{let ue=await S.load(m);if(ue){if(n!==void 0&&ue.metadata?.input!==void 0){let me=JSON.stringify(ue.metadata.input),Te=JSON.stringify(n);if(me!==Te){let j=A({type:"IDEMPOTENCY_CONFLICT",idempotencyKey:ne,workflowId:u,message:`Idempotency key '${ne}' already used with different input for workflow '${u}'.`});return G(j),Ie.delete(m),G=void 0,j}}if(ue.execution.status==="completed"&&ue.metadata?.finalResult!==void 0){let me=ue.metadata.finalResult;return G(me),Ie.delete(m),G=void 0,me}if(ue.execution.status==="running"){let me=A({type:"CONCURRENT_EXECUTION",workflowId:u,message:`Workflow '${u}' with idempotency key '${ne}' is already running.`,reason:"cross-process"});return G(me),Ie.delete(m),G=void 0,me}}}catch{}try{await S.save(m,{formatVersion:1,steps:{},execution:{status:"running",lastUpdated:new Date().toISOString()},metadata:{workflowId:u,idempotencyKey:ne,input:n}})}catch{}}if(!w&&at.has(u)){let m={type:"CONCURRENT_EXECUTION",workflowId:u,message:`Workflow '${u}' is already running. Set allowConcurrent: true to allow parallel executions.`,reason:"in-process"};return A(m)}let ae=null;if(!w&&Mt(S)){let m;try{m=await S.tryAcquire(u,{ttlMs:I})}catch(Y){let ue={type:"PERSISTENCE_ERROR",operation:"load",workflowId:u,cause:Y,message:`Failed to acquire lock for workflow '${u}': ${Y instanceof Error?Y.message:String(Y)}`};return A(ue)}if(m===null){let Y={type:"CONCURRENT_EXECUTION",workflowId:u,message:`Workflow '${u}' is already running (lease held by another process). Set allowConcurrent: true to allow parallel executions.`,reason:"cross-process"};return A(Y)}ae=m.ownerToken}let X,le,ye=S;if(ae&&typeof ye.renew=="function"){let m=$??Math.floor(I/3);le=new AbortController,X=setInterval(async()=>{try{await ye.renew(u,ae,{ttlMs:I})||le.abort(new Error("Lease expired"))}catch{le.abort(new Error("Lease renewal failed"))}},m)}at.add(u);let pe;try{let m=null;try{m=await S.load(u)}catch(o){let y={type:"PERSISTENCE_ERROR",operation:"load",workflowId:u,cause:o,message:`Failed to load state for workflow '${u}': ${o instanceof Error?o.message:String(o)}`};return pe=A(y),A(y)}if(m)try{At(m)}catch(o){if(o instanceof ve){let y={type:"PERSISTENCE_ERROR",operation:"load",workflowId:u,cause:o,message:`Invalid snapshot format for workflow '${u}': ${o.message}`};return pe=A(y),A(y)}throw o}if(m){let o=typeof m.metadata?.version=="number"?m.metadata.version:1;if(o!==l){let y={type:"VERSION_MISMATCH",workflowId:u,storedVersion:o,requestedVersion:l,currentVersion:l,message:`Workflow '${u}' has stored state at version ${o} but this run requested version ${l}. Migrate the stored state to the new version, or clear state for this id (e.g. durable.deleteState(store, '${u}')) and re-run.`};if(!ge)return pe=A(y),A(y);let c=await Promise.resolve(ge({id:u,storedVersion:o,requestedVersion:l}));if(c==="throw")return pe=A(y),A(y);if(c==="clear"){try{await S.delete(u)}catch{}m=null}else m=c.migratedSnapshot}}let Y=(o,y)=>{se&&se(o,y)},ue=Le(),me={snapshot:m,onAfterStep:async(o,y,c,p)=>{try{let a=ue.getResumeState(),i={};for(let[b,v]of a.steps)if(v.result.ok)i[b]={ok:!0,value:v.result.value};else{let M=v.result.cause,B=M instanceof Error?Ze(M):Qe(M),te=v.meta?.origin==="throw"?"throw":"result";i[b]={ok:!1,error:v.result.error,cause:B,meta:{origin:te}}}let g={formatVersion:1,workflowName:u,steps:i,execution:{status:"running",lastUpdated:new Date().toISOString(),currentStepId:o},metadata:{...m?.metadata??{},...D,version:l,lastStepKey:o}},x=m?Pt(m,g):g;if(x.warnings&&x.warnings.length>0){let b=new Set(Object.keys(g.steps)),v=x.warnings.filter(M=>!b.has(M.stepId));x={...x,warnings:v.length>0?v:void 0}}await S.save(u,x),Y({type:"persist_success",workflowId:c,stepKey:o,ts:Date.now(),context:p},p)}catch(a){Y({type:"persist_error",workflowId:c,stepKey:o,error:a,ts:Date.now(),context:p},p)}},onEvent:(o,y)=>{ue.handleEvent(o),Y(o,y)},onError:ee,signal:le&&K?AbortSignal.any([K,le.signal]):le?.signal??K,createContext:r},Te;try{Te=ot(u,e,me)}catch(o){if(o instanceof ve){let y={type:"PERSISTENCE_ERROR",operation:"load",workflowId:u,cause:o,message:`Invalid snapshot format for workflow '${u}': ${o.message}`};return pe=A(y),A(y)}throw o}let j;try{j=await Te.run(t)}catch(o){if(o instanceof ve||o instanceof _e){let y={type:"PERSISTENCE_ERROR",operation:"load",workflowId:u,cause:o,message:`Invalid snapshot format for workflow '${u}': ${o.message}`};return pe=A(y),A(y)}throw o}if(W!==!1&&le?.signal.aborted){let o=A({type:"LEASE_EXPIRED",workflowId:u,message:`Lease expired for workflow '${u}' during execution. The workflow may have been reclaimed by another process.`});return pe=o,o}if(j.ok){try{await S.delete(u)}catch(o){let y={type:"PERSISTENCE_ERROR",operation:"delete",workflowId:u,cause:o,message:`Failed to delete state for workflow '${u}': ${o instanceof Error?o.message:String(o)}`};return pe=A(y),A(y)}if(ne){let o=`idem:${ne}`;try{await S.save(o,{formatVersion:1,steps:{},execution:{status:"completed",lastUpdated:new Date().toISOString(),completedAt:new Date().toISOString()},metadata:{workflowId:u,idempotencyKey:ne,input:n,finalResult:j}})}catch{}}}return pe=j,j}finally{if(at.delete(u),G&&(G(pe),Ie.delete(`idem:${ne}`)),X&&clearInterval(X),ae!==null&&Mt(S))try{await S.release(u,ae)}catch{}}},async clearState(e){let t=e;if(typeof t.clear=="function"){await t.clear();return}let s=100;for(;;){let u=await e.list({limit:s});if(u.length===0)break;let f=u.map(l=>l.id);if(await this.deleteStates(e,f,{continueOnError:!0}),u.length<s)break}},async hasState(e,t){try{return await e.load(t)!==null}catch{return!1}},async deleteState(e,t){try{return await e.delete(t),!0}catch{return!1}},async deleteStates(e,t,s={}){let{concurrency:u=10,continueOnError:f=!0}=s;if(t.length===0)return{deleted:0};let l=[],w=0,I=async W=>{try{await e.delete(W),w++}catch(D){if(f)l.push({id:W,error:D});else throw D}},$=Math.max(1,u);for(let W=0;W<t.length;W+=$){let D=t.slice(W,W+$);await Promise.all(D.map(K=>I(K)))}return l.length>0?{deleted:w,errors:l}:{deleted:w}},async listPending(e,t){try{return await e.list(t)}catch{return[]}}};function Wt(e){let{store:t,workflows:s,concurrency:u=5,onEvent:f,onError:l}=e,w=new Map,I,$=!1,W=!1;function D(n){try{f?.(n)}catch{}}async function K(n,S){if(!s[n])throw new Error(`Unknown workflow: '${n}'. Registered: ${Object.keys(s).join(", ")}`);let ae=S?.id??`${n}:${(0,it.randomUUID)()}`,X={formatVersion:1,workflowName:n,steps:{},execution:{status:"running",lastUpdated:new Date().toISOString()},metadata:{engineState:"queued",workflowName:n,input:S?.input??null,idempotencyKey:S?.idempotencyKey,enqueuedAt:new Date().toISOString(),...S?.metadata}};return await t.save(ae,X),D({type:"workflow_enqueued",workflowName:n,id:ae,ts:Date.now()}),ae}async function r(){if(W)return 0;W=!0;try{let n=await t.list({limit:u*2}),S=0,G=[];for(let X of n){if(G.length>=u)break;let le=await t.load(X.id);le&&le.metadata?.engineState==="queued"&&typeof le.metadata?.workflowName=="string"&&G.push({id:X.id,workflowName:le.metadata.workflowName,snapshot:le})}let ae=await Promise.allSettled(G.map(async({id:X,workflowName:le,snapshot:ye})=>{let pe=s[le];if(!pe)return;let m={...ye,metadata:{...ye.metadata,engineState:"processing"}};await t.save(X,m),D({type:"workflow_started",workflowName:le,id:X,ts:Date.now()});let Y=await Ut.run(pe.deps,pe.fn,{id:X,store:t,idempotencyKey:ye.metadata?.idempotencyKey,input:ye.metadata?.input,...pe.durableDefaults});Y.ok?D({type:"workflow_completed",workflowName:le,id:X,ts:Date.now()}):D({type:"workflow_failed",workflowName:le,id:X,error:Y.error,ts:Date.now()}),S++}));for(let X of ae)if(X.status==="rejected")try{l?.(X.reason)}catch{}return D({type:"engine_tick",ts:Date.now(),processed:S}),S}finally{W=!1}}function se(n,S){let G=S?.id?`schedule:${S.id}`:`schedule:${(0,it.randomUUID)()}`;S.immediate&&K(n,S).catch(X=>{try{l?.(X)}catch{}});let ae=setInterval(()=>{K(n,S).catch(X=>{try{l?.(X)}catch{}})},S.intervalMs);return w.set(G,ae),D({type:"schedule_created",workflowName:n,scheduleId:G,intervalMs:S.intervalMs,ts:Date.now()}),G}function ee(n){let S=w.get(n);return S?(clearInterval(S),w.delete(n),D({type:"schedule_removed",scheduleId:n,ts:Date.now()}),!0):!1}function ge(n=1e3){$||($=!0,D({type:"engine_start",ts:Date.now()}),r().catch(S=>{try{l?.(S)}catch{}}),I=setInterval(()=>{r().catch(S=>{try{l?.(S)}catch{}})},n))}async function ne(){if($){$=!1,I&&(clearInterval(I),I=void 0);for(let[n,S]of w)clearInterval(S),w.delete(n);for(;W;)await new Promise(n=>setTimeout(n,50));D({type:"engine_stop",ts:Date.now()})}}return{enqueue:K,schedule:se,unschedule:ee,start:ge,stop:ne,tick:r,status:()=>({running:$,pendingSchedules:w.size})}}0&&(module.exports={createEngine});
11
- //# sourceMappingURL=engine.cjs.map