@temelj/workflow 0.0.0-alpha.1

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 (393) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -0
  3. package/dist/attributes.d.mts +15 -0
  4. package/dist/attributes.mjs +30 -0
  5. package/dist/client/create.d.mts +31 -0
  6. package/dist/client/create.mjs +67 -0
  7. package/dist/client/facades.d.mts +21 -0
  8. package/dist/client/facades.mjs +142 -0
  9. package/dist/client/mod.d.mts +2 -0
  10. package/dist/client/mod.mjs +2 -0
  11. package/dist/client/run-handle.d.mts +66 -0
  12. package/dist/client/run-handle.mjs +156 -0
  13. package/dist/client/worker-options.d.mts +17 -0
  14. package/dist/client/worker-options.mjs +25 -0
  15. package/dist/collection.d.mts +15 -0
  16. package/dist/collection.mjs +33 -0
  17. package/dist/compiled-function.d.mts +27 -0
  18. package/dist/compiled-function.mjs +54 -0
  19. package/dist/definition.d.mts +37 -0
  20. package/dist/definition.mjs +83 -0
  21. package/dist/engine/child-workflow.d.mts +10 -0
  22. package/dist/engine/child-workflow.mjs +333 -0
  23. package/dist/engine/command-identity.d.mts +9 -0
  24. package/dist/engine/command-identity.mjs +14 -0
  25. package/dist/engine/create.d.mts +106 -0
  26. package/dist/engine/create.mjs +402 -0
  27. package/dist/engine/deterministic.d.mts +12 -0
  28. package/dist/engine/deterministic.mjs +102 -0
  29. package/dist/engine/durable-command.d.mts +10 -0
  30. package/dist/engine/durable-command.mjs +17 -0
  31. package/dist/engine/execution-api.d.mts +29 -0
  32. package/dist/engine/execution-api.mjs +33 -0
  33. package/dist/engine/execution-service.d.mts +41 -0
  34. package/dist/engine/execution-service.mjs +288 -0
  35. package/dist/engine/hooks.d.mts +56 -0
  36. package/dist/engine/hooks.mjs +237 -0
  37. package/dist/engine/inspection-api.d.mts +34 -0
  38. package/dist/engine/inspection-api.mjs +77 -0
  39. package/dist/engine/inspection.d.mts +18 -0
  40. package/dist/engine/inspection.mjs +149 -0
  41. package/dist/engine/lifecycle.d.mts +18 -0
  42. package/dist/engine/lifecycle.mjs +38 -0
  43. package/dist/engine/lock-replay.d.mts +30 -0
  44. package/dist/engine/lock-replay.mjs +38 -0
  45. package/dist/engine/lock.d.mts +21 -0
  46. package/dist/engine/lock.mjs +197 -0
  47. package/dist/engine/message.d.mts +47 -0
  48. package/dist/engine/message.mjs +357 -0
  49. package/dist/engine/mod.d.mts +4 -0
  50. package/dist/engine/mod.mjs +2 -0
  51. package/dist/engine/observation.d.mts +35 -0
  52. package/dist/engine/observation.mjs +201 -0
  53. package/dist/engine/recovery.d.mts +26 -0
  54. package/dist/engine/recovery.mjs +92 -0
  55. package/dist/engine/replay.d.mts +41 -0
  56. package/dist/engine/replay.mjs +122 -0
  57. package/dist/engine/retry-policy.d.mts +4 -0
  58. package/dist/engine/retry-policy.mjs +4 -0
  59. package/dist/engine/retry.d.mts +23 -0
  60. package/dist/engine/retry.mjs +75 -0
  61. package/dist/engine/run-data.d.mts +9 -0
  62. package/dist/engine/run-data.mjs +74 -0
  63. package/dist/engine/run-service.d.mts +38 -0
  64. package/dist/engine/run-service.mjs +133 -0
  65. package/dist/engine/run-utils.d.mts +16 -0
  66. package/dist/engine/run-utils.mjs +83 -0
  67. package/dist/engine/schedule.d.mts +25 -0
  68. package/dist/engine/schedule.mjs +207 -0
  69. package/dist/engine/serialization.d.mts +9 -0
  70. package/dist/engine/serialization.mjs +85 -0
  71. package/dist/engine/start-api.d.mts +30 -0
  72. package/dist/engine/start-api.mjs +98 -0
  73. package/dist/engine/state.d.mts +77 -0
  74. package/dist/engine/state.mjs +464 -0
  75. package/dist/engine/step-api.d.mts +9 -0
  76. package/dist/engine/step-api.mjs +25 -0
  77. package/dist/engine/stream.d.mts +55 -0
  78. package/dist/engine/stream.mjs +333 -0
  79. package/dist/engine/summary/active-events.d.mts +34 -0
  80. package/dist/engine/summary/active-events.mjs +69 -0
  81. package/dist/engine/summary/child-workflow-runs.d.mts +24 -0
  82. package/dist/engine/summary/child-workflow-runs.mjs +138 -0
  83. package/dist/engine/summary/child-workflow-waits.d.mts +21 -0
  84. package/dist/engine/summary/child-workflow-waits.mjs +67 -0
  85. package/dist/engine/summary/recovery-child-workflow-waits.d.mts +11 -0
  86. package/dist/engine/summary/recovery-child-workflow-waits.mjs +89 -0
  87. package/dist/engine/summary/recovery-due-runs.d.mts +16 -0
  88. package/dist/engine/summary/recovery-due-runs.mjs +52 -0
  89. package/dist/engine/summary/recovery-failed-runs.d.mts +14 -0
  90. package/dist/engine/summary/recovery-failed-runs.mjs +33 -0
  91. package/dist/engine/summary/recovery-lease-runs.d.mts +16 -0
  92. package/dist/engine/summary/recovery-lease-runs.mjs +69 -0
  93. package/dist/engine/summary/recovery-locks.d.mts +18 -0
  94. package/dist/engine/summary/recovery-locks.mjs +100 -0
  95. package/dist/engine/summary/recovery-message-waits.d.mts +11 -0
  96. package/dist/engine/summary/recovery-message-waits.mjs +74 -0
  97. package/dist/engine/summary/recovery-retry-runs.d.mts +17 -0
  98. package/dist/engine/summary/recovery-retry-runs.mjs +65 -0
  99. package/dist/engine/summary/recovery-run-timestamps.d.mts +13 -0
  100. package/dist/engine/summary/recovery-run-timestamps.mjs +18 -0
  101. package/dist/engine/summary/recovery-runs.d.mts +23 -0
  102. package/dist/engine/summary/recovery-runs.mjs +54 -0
  103. package/dist/engine/summary/recovery-schedules.d.mts +10 -0
  104. package/dist/engine/summary/recovery-schedules.mjs +46 -0
  105. package/dist/engine/summary/recovery-sleep-waits.d.mts +10 -0
  106. package/dist/engine/summary/recovery-sleep-waits.mjs +53 -0
  107. package/dist/engine/summary/recovery-waits.d.mts +21 -0
  108. package/dist/engine/summary/recovery-waits.mjs +29 -0
  109. package/dist/engine/summary/run-availability.d.mts +13 -0
  110. package/dist/engine/summary/run-availability.mjs +37 -0
  111. package/dist/engine/summary/run-cleanup.d.mts +14 -0
  112. package/dist/engine/summary/run-cleanup.mjs +44 -0
  113. package/dist/engine/summary/run-failure.d.mts +14 -0
  114. package/dist/engine/summary/run-failure.mjs +62 -0
  115. package/dist/engine/summary/run-hooks.d.mts +14 -0
  116. package/dist/engine/summary/run-hooks.mjs +63 -0
  117. package/dist/engine/summary/run-lease.d.mts +11 -0
  118. package/dist/engine/summary/run-lease.mjs +64 -0
  119. package/dist/engine/summary/run-message-waits.d.mts +15 -0
  120. package/dist/engine/summary/run-message-waits.mjs +62 -0
  121. package/dist/engine/summary/run-metrics.d.mts +31 -0
  122. package/dist/engine/summary/run-metrics.mjs +93 -0
  123. package/dist/engine/summary/run-retry.d.mts +9 -0
  124. package/dist/engine/summary/run-retry.mjs +69 -0
  125. package/dist/engine/summary/run-sleeps.d.mts +15 -0
  126. package/dist/engine/summary/run-sleeps.mjs +61 -0
  127. package/dist/engine/summary/run-state.d.mts +26 -0
  128. package/dist/engine/summary/run-state.mjs +48 -0
  129. package/dist/engine/summary/run-status.d.mts +16 -0
  130. package/dist/engine/summary/run-status.mjs +35 -0
  131. package/dist/engine/summary/run-streams.d.mts +14 -0
  132. package/dist/engine/summary/run-streams.mjs +46 -0
  133. package/dist/engine/summary/run-transition.d.mts +9 -0
  134. package/dist/engine/summary/run-transition.mjs +39 -0
  135. package/dist/engine/summary/run-workflow.d.mts +9 -0
  136. package/dist/engine/summary/run-workflow.mjs +47 -0
  137. package/dist/engine/summary/step-attempt-active-child-workflows.d.mts +13 -0
  138. package/dist/engine/summary/step-attempt-active-child-workflows.mjs +55 -0
  139. package/dist/engine/summary/step-attempt-active-fields.d.mts +23 -0
  140. package/dist/engine/summary/step-attempt-active-fields.mjs +14 -0
  141. package/dist/engine/summary/step-attempt-active-message-waits.d.mts +12 -0
  142. package/dist/engine/summary/step-attempt-active-message-waits.mjs +47 -0
  143. package/dist/engine/summary/step-attempt-active-sleeps.d.mts +19 -0
  144. package/dist/engine/summary/step-attempt-active-sleeps.mjs +44 -0
  145. package/dist/engine/summary/step-attempt-buckets.d.mts +22 -0
  146. package/dist/engine/summary/step-attempt-buckets.mjs +152 -0
  147. package/dist/engine/summary/step-attempt-failure.d.mts +12 -0
  148. package/dist/engine/summary/step-attempt-failure.mjs +61 -0
  149. package/dist/engine/summary/step-attempt-lifecycle.d.mts +13 -0
  150. package/dist/engine/summary/step-attempt-lifecycle.mjs +19 -0
  151. package/dist/engine/summary/step-attempts.d.mts +11 -0
  152. package/dist/engine/summary/step-attempts.mjs +43 -0
  153. package/dist/engine/summary.d.mts +32 -0
  154. package/dist/engine/summary.mjs +37 -0
  155. package/dist/engine/task.d.mts +6 -0
  156. package/dist/engine/task.mjs +207 -0
  157. package/dist/errors/base.d.mts +99 -0
  158. package/dist/errors/base.mjs +426 -0
  159. package/dist/errors/capability.d.mts +11 -0
  160. package/dist/errors/capability.mjs +23 -0
  161. package/dist/errors/definition.d.mts +21 -0
  162. package/dist/errors/definition.mjs +51 -0
  163. package/dist/errors/details.d.mts +13 -0
  164. package/dist/errors/details.mjs +65 -0
  165. package/dist/errors/failures.d.mts +81 -0
  166. package/dist/errors/failures.mjs +168 -0
  167. package/dist/errors/hook.d.mts +14 -0
  168. package/dist/errors/hook.mjs +30 -0
  169. package/dist/errors/implementation.d.mts +11 -0
  170. package/dist/errors/implementation.mjs +25 -0
  171. package/dist/errors/lock.d.mts +28 -0
  172. package/dist/errors/lock.mjs +70 -0
  173. package/dist/errors/message.d.mts +106 -0
  174. package/dist/errors/message.mjs +122 -0
  175. package/dist/errors/mod.d.mts +17 -0
  176. package/dist/errors/mod.mjs +17 -0
  177. package/dist/errors/record-view.d.mts +11 -0
  178. package/dist/errors/record-view.mjs +24 -0
  179. package/dist/errors/records.d.mts +7 -0
  180. package/dist/errors/records.mjs +280 -0
  181. package/dist/errors/run.d.mts +116 -0
  182. package/dist/errors/run.mjs +232 -0
  183. package/dist/errors/runtime.d.mts +12 -0
  184. package/dist/errors/runtime.mjs +24 -0
  185. package/dist/errors/schedule.d.mts +27 -0
  186. package/dist/errors/schedule.mjs +65 -0
  187. package/dist/errors/step.d.mts +76 -0
  188. package/dist/errors/step.mjs +113 -0
  189. package/dist/errors/stream.d.mts +24 -0
  190. package/dist/errors/stream.mjs +64 -0
  191. package/dist/esbuild.d.mts +7 -0
  192. package/dist/esbuild.mjs +6 -0
  193. package/dist/events/descriptors.d.mts +245 -0
  194. package/dist/events/descriptors.mjs +405 -0
  195. package/dist/events/mod.d.mts +3 -0
  196. package/dist/events/mod.mjs +2 -0
  197. package/dist/history/attempt-key.d.mts +6 -0
  198. package/dist/history/attempt-key.mjs +7 -0
  199. package/dist/history/mod.d.mts +71 -0
  200. package/dist/history/mod.mjs +195 -0
  201. package/dist/history/projection.d.mts +8 -0
  202. package/dist/history/projection.mjs +259 -0
  203. package/dist/history/replay-projection.d.mts +88 -0
  204. package/dist/history/replay-projection.mjs +369 -0
  205. package/dist/history/sequencer.d.mts +16 -0
  206. package/dist/history/sequencer.mjs +78 -0
  207. package/dist/history/step-attempts.d.mts +9 -0
  208. package/dist/history/step-attempts.mjs +50 -0
  209. package/dist/history/timeline.d.mts +16 -0
  210. package/dist/history/timeline.mjs +272 -0
  211. package/dist/history/validator.d.mts +9 -0
  212. package/dist/history/validator.mjs +110 -0
  213. package/dist/inspection/mod.d.mts +5 -0
  214. package/dist/inspection/mod.mjs +3 -0
  215. package/dist/message-options.d.mts +8 -0
  216. package/dist/message-options.mjs +25 -0
  217. package/dist/mod.d.mts +52 -0
  218. package/dist/mod.mjs +26 -0
  219. package/dist/otel/support.d.mts +18 -0
  220. package/dist/otel/support.mjs +102 -0
  221. package/dist/otel.d.mts +30 -0
  222. package/dist/otel.mjs +588 -0
  223. package/dist/pagination.d.mts +25 -0
  224. package/dist/pagination.mjs +73 -0
  225. package/dist/registry.d.mts +20 -0
  226. package/dist/registry.mjs +48 -0
  227. package/dist/rolldown.d.mts +7 -0
  228. package/dist/rolldown.mjs +6 -0
  229. package/dist/rollup.d.mts +7 -0
  230. package/dist/rollup.mjs +6 -0
  231. package/dist/rspack.d.mts +7 -0
  232. package/dist/rspack.mjs +6 -0
  233. package/dist/runtime.d.mts +34 -0
  234. package/dist/runtime.mjs +194 -0
  235. package/dist/step-definition.d.mts +10 -0
  236. package/dist/step-definition.mjs +15 -0
  237. package/dist/store/append-projection.d.mts +15 -0
  238. package/dist/store/append-projection.mjs +26 -0
  239. package/dist/store/capabilities.d.mts +14 -0
  240. package/dist/store/capabilities.mjs +42 -0
  241. package/dist/store/cleanup.d.mts +18 -0
  242. package/dist/store/cleanup.mjs +338 -0
  243. package/dist/store/compaction.d.mts +5 -0
  244. package/dist/store/compaction.mjs +8 -0
  245. package/dist/store/create.d.mts +52 -0
  246. package/dist/store/create.mjs +159 -0
  247. package/dist/store/event-append-project.d.mts +15 -0
  248. package/dist/store/event-append-project.mjs +77 -0
  249. package/dist/store/event-append.d.mts +37 -0
  250. package/dist/store/event-append.mjs +80 -0
  251. package/dist/store/event-history.d.mts +22 -0
  252. package/dist/store/event-history.mjs +75 -0
  253. package/dist/store/event.d.mts +10 -0
  254. package/dist/store/event.mjs +28 -0
  255. package/dist/store/idempotency.d.mts +10 -0
  256. package/dist/store/idempotency.mjs +167 -0
  257. package/dist/store/instrumentation.d.mts +7 -0
  258. package/dist/store/instrumentation.mjs +123 -0
  259. package/dist/store/lock.d.mts +8 -0
  260. package/dist/store/lock.mjs +28 -0
  261. package/dist/store/materialization.d.mts +30 -0
  262. package/dist/store/materialization.mjs +127 -0
  263. package/dist/store/message-index.d.mts +21 -0
  264. package/dist/store/message-index.mjs +121 -0
  265. package/dist/store/mod.d.mts +5 -0
  266. package/dist/store/mod.mjs +4 -0
  267. package/dist/store/query.d.mts +24 -0
  268. package/dist/store/query.mjs +82 -0
  269. package/dist/store/revision.d.mts +4 -0
  270. package/dist/store/revision.mjs +7 -0
  271. package/dist/store/run.d.mts +49 -0
  272. package/dist/store/run.mjs +236 -0
  273. package/dist/store/schedule.d.mts +12 -0
  274. package/dist/store/schedule.mjs +41 -0
  275. package/dist/store/schema.d.mts +14 -0
  276. package/dist/store/schema.mjs +17 -0
  277. package/dist/store/step-attempt.d.mts +14 -0
  278. package/dist/store/step-attempt.mjs +23 -0
  279. package/dist/store/storage-value.d.mts +5 -0
  280. package/dist/store/storage-value.mjs +6 -0
  281. package/dist/store/validation.d.mts +35 -0
  282. package/dist/store/validation.mjs +77 -0
  283. package/dist/store-keys.d.mts +49 -0
  284. package/dist/store-keys.mjs +63 -0
  285. package/dist/telemetry.d.mts +132 -0
  286. package/dist/telemetry.mjs +172 -0
  287. package/dist/temporal.d.mts +23 -0
  288. package/dist/temporal.mjs +59 -0
  289. package/dist/timer.d.mts +12 -0
  290. package/dist/timer.mjs +28 -0
  291. package/dist/types/cleanup.d.mts +112 -0
  292. package/dist/types/cleanup.mjs +22 -0
  293. package/dist/types/client.d.mts +270 -0
  294. package/dist/types/client.mjs +1 -0
  295. package/dist/types/common.d.mts +19 -0
  296. package/dist/types/common.mjs +15 -0
  297. package/dist/types/definition.d.mts +92 -0
  298. package/dist/types/definition.mjs +1 -0
  299. package/dist/types/engine-options.d.mts +76 -0
  300. package/dist/types/engine-options.mjs +1 -0
  301. package/dist/types/engine.d.mts +309 -0
  302. package/dist/types/engine.mjs +1 -0
  303. package/dist/types/error-code.d.mts +256 -0
  304. package/dist/types/error-code.mjs +131 -0
  305. package/dist/types/error.d.mts +236 -0
  306. package/dist/types/error.mjs +48 -0
  307. package/dist/types/events.d.mts +2869 -0
  308. package/dist/types/events.mjs +283 -0
  309. package/dist/types/hook.d.mts +149 -0
  310. package/dist/types/hook.mjs +66 -0
  311. package/dist/types/lock.d.mts +63 -0
  312. package/dist/types/lock.mjs +18 -0
  313. package/dist/types/message-id.d.mts +7 -0
  314. package/dist/types/message-id.mjs +5 -0
  315. package/dist/types/message.d.mts +87 -0
  316. package/dist/types/message.mjs +1 -0
  317. package/dist/types/observation.d.mts +146 -0
  318. package/dist/types/observation.mjs +1 -0
  319. package/dist/types/pagination.d.mts +32 -0
  320. package/dist/types/pagination.mjs +13 -0
  321. package/dist/types/result.d.mts +62 -0
  322. package/dist/types/result.mjs +1 -0
  323. package/dist/types/retry.d.mts +48 -0
  324. package/dist/types/retry.mjs +1 -0
  325. package/dist/types/run-id.d.mts +7 -0
  326. package/dist/types/run-id.mjs +5 -0
  327. package/dist/types/run-list.d.mts +43 -0
  328. package/dist/types/run-list.mjs +1 -0
  329. package/dist/types/run-options.d.mts +86 -0
  330. package/dist/types/run-options.mjs +1 -0
  331. package/dist/types/run.d.mts +355 -0
  332. package/dist/types/run.mjs +207 -0
  333. package/dist/types/runtime.d.mts +143 -0
  334. package/dist/types/runtime.mjs +21 -0
  335. package/dist/types/schedule.d.mts +127 -0
  336. package/dist/types/schedule.mjs +48 -0
  337. package/dist/types/step-attempts.d.mts +326 -0
  338. package/dist/types/step-attempts.mjs +43 -0
  339. package/dist/types/step-id.d.mts +7 -0
  340. package/dist/types/step-id.mjs +5 -0
  341. package/dist/types/step.d.mts +183 -0
  342. package/dist/types/step.mjs +5 -0
  343. package/dist/types/store.d.mts +254 -0
  344. package/dist/types/store.mjs +1 -0
  345. package/dist/types/stream-id.d.mts +7 -0
  346. package/dist/types/stream-id.mjs +5 -0
  347. package/dist/types/stream.d.mts +126 -0
  348. package/dist/types/stream.mjs +1 -0
  349. package/dist/types/summary.d.mts +318 -0
  350. package/dist/types/summary.mjs +1 -0
  351. package/dist/types/telemetry.d.mts +74 -0
  352. package/dist/types/telemetry.mjs +9 -0
  353. package/dist/types/timeline.d.mts +237 -0
  354. package/dist/types/timeline.mjs +1 -0
  355. package/dist/types/vite.d.mts +65 -0
  356. package/dist/types/vite.mjs +1 -0
  357. package/dist/types/worker-id.d.mts +7 -0
  358. package/dist/types/worker-id.mjs +5 -0
  359. package/dist/types/worker.d.mts +94 -0
  360. package/dist/types/worker.mjs +1 -0
  361. package/dist/utility.d.mts +49 -0
  362. package/dist/utility.mjs +122 -0
  363. package/dist/vite/ast.d.mts +23 -0
  364. package/dist/vite/ast.mjs +73 -0
  365. package/dist/vite/error.d.mts +19 -0
  366. package/dist/vite/error.mjs +47 -0
  367. package/dist/vite/generated-name.d.mts +7 -0
  368. package/dist/vite/generated-name.mjs +9 -0
  369. package/dist/vite/manifest.d.mts +7 -0
  370. package/dist/vite/manifest.mjs +106 -0
  371. package/dist/vite/plugin.d.mts +7 -0
  372. package/dist/vite/plugin.mjs +190 -0
  373. package/dist/vite/safety.d.mts +12 -0
  374. package/dist/vite/safety.mjs +96 -0
  375. package/dist/vite/source-edit.d.mts +12 -0
  376. package/dist/vite/source-edit.mjs +44 -0
  377. package/dist/vite/source-map.d.mts +11 -0
  378. package/dist/vite/source-map.mjs +53 -0
  379. package/dist/vite/source.d.mts +7 -0
  380. package/dist/vite/source.mjs +14 -0
  381. package/dist/vite/transform.d.mts +7 -0
  382. package/dist/vite/transform.mjs +405 -0
  383. package/dist/vite.d.mts +6 -0
  384. package/dist/vite.mjs +5 -0
  385. package/dist/webhook.d.mts +16 -0
  386. package/dist/webhook.mjs +17 -0
  387. package/dist/webpack.d.mts +7 -0
  388. package/dist/webpack.mjs +6 -0
  389. package/dist/worker/error.d.mts +11 -0
  390. package/dist/worker/error.mjs +40 -0
  391. package/dist/worker.d.mts +18 -0
  392. package/dist/worker.mjs +427 -0
  393. package/package.json +144 -0
@@ -0,0 +1,369 @@
1
+ import { isWorkflowRecordedStepEventKind, isWorkflowTerminalStepAttemptEvent } from "../events/descriptors.mjs";
2
+ import { workflowStartedEventMatchesTerminalEvent } from "./validator.mjs";
3
+ //#region src/history/replay-projection.ts
4
+ function createWorkflowReplayProjection(events) {
5
+ const projection = {
6
+ startedEventsByStepId: /* @__PURE__ */ new Map(),
7
+ startedStep: /* @__PURE__ */ new Map(),
8
+ completedStep: /* @__PURE__ */ new Map(),
9
+ failedSteps: /* @__PURE__ */ new Map(),
10
+ unstartedFailedStep: /* @__PURE__ */ new Map(),
11
+ metadataSet: /* @__PURE__ */ new Map(),
12
+ attributesSet: /* @__PURE__ */ new Map(),
13
+ startedStepAttempts: /* @__PURE__ */ new Map(),
14
+ nextStepAttemptByStepId: /* @__PURE__ */ new Map(),
15
+ invalidStartedStepAttempt: /* @__PURE__ */ new Map(),
16
+ startedSleep: /* @__PURE__ */ new Map(),
17
+ completedSleep: /* @__PURE__ */ new Map(),
18
+ startedChildWorkflow: /* @__PURE__ */ new Map(),
19
+ completedChildWorkflow: /* @__PURE__ */ new Map(),
20
+ failedChildWorkflow: /* @__PURE__ */ new Map(),
21
+ childWorkflowStartedByAttemptKey: /* @__PURE__ */ new Map(),
22
+ childWorkflowStartedByStepId: /* @__PURE__ */ new Map(),
23
+ childWorkflowCompletedByStepId: /* @__PURE__ */ new Map(),
24
+ childWorkflowFailedByStepId: /* @__PURE__ */ new Map(),
25
+ startedMessageWait: /* @__PURE__ */ new Map(),
26
+ messageWaitStartedByNameAndMessageId: /* @__PURE__ */ new Map(),
27
+ messageWaitStartedIndex: /* @__PURE__ */ new Map(),
28
+ latestMessageWaitStartedIndex: /* @__PURE__ */ new Map(),
29
+ completedMessageWait: /* @__PURE__ */ new Map(),
30
+ failedMessageWait: /* @__PURE__ */ new Map(),
31
+ messageSentById: /* @__PURE__ */ new Map(),
32
+ activeMessageWaitsByMessageId: /* @__PURE__ */ new Map(),
33
+ messageSentByIdempotencyKey: /* @__PURE__ */ new Map(),
34
+ latestMessageSentByIdempotencyKey: /* @__PURE__ */ new Map(),
35
+ startedMessageSend: /* @__PURE__ */ new Map(),
36
+ completedMessageSend: /* @__PURE__ */ new Map(),
37
+ failedMessageSend: /* @__PURE__ */ new Map(),
38
+ startedStream: /* @__PURE__ */ new Map(),
39
+ streamChunks: /* @__PURE__ */ new Map(),
40
+ streamChunkByIndex: /* @__PURE__ */ new Map(),
41
+ streamStartedByIdOrName: /* @__PURE__ */ new Map(),
42
+ streamChunksByStreamId: /* @__PURE__ */ new Map(),
43
+ streamClosedByStreamId: /* @__PURE__ */ new Map(),
44
+ streamFailedByStreamId: /* @__PURE__ */ new Map(),
45
+ closedStream: /* @__PURE__ */ new Map(),
46
+ failedStream: /* @__PURE__ */ new Map(),
47
+ deterministicValue: /* @__PURE__ */ new Map(),
48
+ terminalStartedBefore: /* @__PURE__ */ new Set(),
49
+ workflowStartedCount: 0,
50
+ totalStartedStepCount: 0
51
+ };
52
+ for (const [index, event] of events.entries()) appendWorkflowReplayProjectionEvent(projection, event, index);
53
+ return projection;
54
+ }
55
+ function appendWorkflowReplayProjectionEvents(projection, events, startIndex) {
56
+ for (const [offset, event] of events.entries()) appendWorkflowReplayProjectionEvent(projection, event, startIndex + offset);
57
+ return projection;
58
+ }
59
+ function appendWorkflowReplayProjectionEvent(projection, event, index) {
60
+ if (isWorkflowTerminalStepAttemptEvent(event) && (projection.startedEventsByStepId.get(event.stepId) ?? []).some((started) => workflowStartedEventMatchesTerminalEvent(started, event))) projection.terminalStartedBefore.add(event);
61
+ switch (event.kind) {
62
+ case "workflow_started":
63
+ incrementWorkflowStartedCount(projection);
64
+ break;
65
+ case "step_started":
66
+ projection.startedStep.set(event.stepId, event);
67
+ appendProjectedEvent(projection.startedStepAttempts, event.stepId, event);
68
+ recordProjectedStepAttempt(projection, event);
69
+ appendStartedEvent(projection.startedEventsByStepId, event);
70
+ incrementTotalStartedStepCount(projection);
71
+ break;
72
+ case "step_completed":
73
+ projection.completedStep.set(event.stepId, event);
74
+ break;
75
+ case "step_failed":
76
+ appendProjectedEvent(projection.failedSteps, event.stepId, event);
77
+ if (!projection.terminalStartedBefore.has(event)) {
78
+ const failedSteps = projection.unstartedFailedStep;
79
+ if (!failedSteps.has(event.stepId)) failedSteps.set(event.stepId, event);
80
+ }
81
+ break;
82
+ case "metadata_set":
83
+ projection.metadataSet.set(event.stepId, event);
84
+ break;
85
+ case "attributes_set":
86
+ projection.attributesSet.set(event.stepId, event);
87
+ break;
88
+ case "sleep_started":
89
+ projection.startedSleep.set(event.stepId, event);
90
+ appendStartedEvent(projection.startedEventsByStepId, event);
91
+ incrementTotalStartedStepCount(projection);
92
+ break;
93
+ case "sleep_completed":
94
+ projection.completedSleep.set(event.stepId, event);
95
+ break;
96
+ case "child_workflow_started": {
97
+ projection.startedChildWorkflow.set(event.stepId, event);
98
+ const startedWorkflows = projection.childWorkflowStartedByAttemptKey;
99
+ const childWorkflowKey = workflowChildWorkflowAttemptKey(event);
100
+ if (!startedWorkflows.has(childWorkflowKey)) startedWorkflows.set(childWorkflowKey, {
101
+ index,
102
+ event
103
+ });
104
+ appendProjectedEvent(projection.childWorkflowStartedByStepId, event.stepId, {
105
+ index,
106
+ event
107
+ });
108
+ appendStartedEvent(projection.startedEventsByStepId, event);
109
+ incrementTotalStartedStepCount(projection);
110
+ break;
111
+ }
112
+ case "child_workflow_completed":
113
+ projection.completedChildWorkflow.set(event.stepId, event);
114
+ appendProjectedEvent(projection.childWorkflowCompletedByStepId, event.stepId, {
115
+ index,
116
+ event
117
+ });
118
+ break;
119
+ case "child_workflow_failed":
120
+ projection.failedChildWorkflow.set(event.stepId, event);
121
+ appendProjectedEvent(projection.childWorkflowFailedByStepId, event.stepId, {
122
+ index,
123
+ event
124
+ });
125
+ break;
126
+ case "message_wait_started":
127
+ projection.startedMessageWait.set(event.stepId, event);
128
+ activeMessageWaits(projection, event.messageId).set(event.stepId, event.stepName);
129
+ appendProjectedEvent(projection.messageWaitStartedByNameAndMessageId, workflowMessageWaitNameMessageKey(event.stepName, event.messageId), {
130
+ index,
131
+ event
132
+ });
133
+ projection.messageWaitStartedIndex.set(event, index);
134
+ projection.latestMessageWaitStartedIndex.set(event.stepId, index);
135
+ appendStartedEvent(projection.startedEventsByStepId, event);
136
+ incrementTotalStartedStepCount(projection);
137
+ break;
138
+ case "message_wait_completed":
139
+ deleteActiveMessageWait(projection, event);
140
+ appendProjectedEvent(projection.completedMessageWait, event.stepId, {
141
+ index,
142
+ event
143
+ });
144
+ break;
145
+ case "message_wait_failed":
146
+ deleteActiveMessageWait(projection, event);
147
+ appendProjectedEvent(projection.failedMessageWait, event.stepId, {
148
+ index,
149
+ event
150
+ });
151
+ break;
152
+ case "message_sent":
153
+ appendProjectedEvent(projection.messageSentById, event.messageId, {
154
+ index,
155
+ event
156
+ });
157
+ if (event.idempotencyKey !== void 0) {
158
+ const messages = projection.messageSentByIdempotencyKey;
159
+ if (!messages.has(event.idempotencyKey)) messages.set(event.idempotencyKey, event);
160
+ projection.latestMessageSentByIdempotencyKey.set(event.idempotencyKey, event);
161
+ }
162
+ break;
163
+ case "message_send_started":
164
+ projection.startedMessageSend.set(event.stepId, event);
165
+ appendStartedEvent(projection.startedEventsByStepId, event);
166
+ incrementTotalStartedStepCount(projection);
167
+ break;
168
+ case "message_send_completed":
169
+ projection.completedMessageSend.set(event.stepId, event);
170
+ break;
171
+ case "message_send_failed":
172
+ projection.failedMessageSend.set(event.stepId, event);
173
+ break;
174
+ case "stream_started":
175
+ projection.startedStream.set(event.stepId, event);
176
+ setProjectedStreamStartedByIdOrName(projection, event, index);
177
+ appendStartedEvent(projection.startedEventsByStepId, event);
178
+ incrementTotalStartedStepCount(projection);
179
+ break;
180
+ case "stream_chunk":
181
+ appendProjectedEvent(projection.streamChunks, event.stepId, event);
182
+ appendProjectedEvent(projection.streamChunksByStreamId, event.streamId, {
183
+ index,
184
+ event
185
+ });
186
+ setProjectedStreamChunkByIndex(projection, event);
187
+ break;
188
+ case "stream_closed": {
189
+ projection.closedStream.set(event.stepId, event);
190
+ const closed = projection.streamClosedByStreamId;
191
+ if (!closed.has(event.streamId)) closed.set(event.streamId, {
192
+ index,
193
+ event
194
+ });
195
+ break;
196
+ }
197
+ case "stream_failed": {
198
+ projection.failedStream.set(event.stepId, event);
199
+ const failed = projection.streamFailedByStreamId;
200
+ if (!failed.has(event.streamId)) failed.set(event.streamId, {
201
+ index,
202
+ event
203
+ });
204
+ break;
205
+ }
206
+ case "deterministic_value_recorded":
207
+ projection.deterministicValue.set(event.stepId, event);
208
+ break;
209
+ }
210
+ }
211
+ function appendStartedEvent(startedEventsByStepId, event) {
212
+ if (!isWorkflowRecordedStepEventKind(event.kind) || !("stepId" in event)) return;
213
+ appendProjectedEvent(startedEventsByStepId, event.stepId, event);
214
+ }
215
+ function recordProjectedStepAttempt(projection, event) {
216
+ if (!(Number.isSafeInteger(event.attempt) && event.attempt > 0)) {
217
+ projection.invalidStartedStepAttempt.set(event.stepId, event);
218
+ return;
219
+ }
220
+ const nextAttempt = event.attempt + 1;
221
+ projection.nextStepAttemptByStepId.set(event.stepId, Math.max(projection.nextStepAttemptByStepId.get(event.stepId) ?? 1, nextAttempt));
222
+ }
223
+ function incrementTotalStartedStepCount(projection) {
224
+ asMutableProjection(projection).totalStartedStepCount++;
225
+ }
226
+ function incrementWorkflowStartedCount(projection) {
227
+ asMutableProjection(projection).workflowStartedCount++;
228
+ }
229
+ function asMutableProjection(projection) {
230
+ return projection;
231
+ }
232
+ function setProjectedStreamChunkByIndex(projection, event) {
233
+ const chunks = projection.streamChunkByIndex.get(event.stepId);
234
+ if (chunks === void 0) {
235
+ projection.streamChunkByIndex.set(event.stepId, /* @__PURE__ */ new Map([[event.index, event]]));
236
+ return;
237
+ }
238
+ if (!chunks.has(event.index)) chunks.set(event.index, event);
239
+ }
240
+ function setProjectedStreamStartedByIdOrName(projection, event, index) {
241
+ if (!projection.streamStartedByIdOrName.has(event.streamId)) projection.streamStartedByIdOrName.set(event.streamId, {
242
+ index,
243
+ event
244
+ });
245
+ if (!projection.streamStartedByIdOrName.has(event.stepName)) projection.streamStartedByIdOrName.set(event.stepName, {
246
+ index,
247
+ event
248
+ });
249
+ }
250
+ function activeMessageWaits(projection, messageId) {
251
+ const waits = projection.activeMessageWaitsByMessageId.get(messageId);
252
+ if (waits !== void 0) return waits;
253
+ const nextWaits = /* @__PURE__ */ new Map();
254
+ projection.activeMessageWaitsByMessageId.set(messageId, nextWaits);
255
+ return nextWaits;
256
+ }
257
+ function deleteActiveMessageWait(projection, event) {
258
+ const activeWaits = activeMessageWaits(projection, event.messageId);
259
+ if (activeWaits.get(event.stepId) === event.stepName) activeWaits.delete(event.stepId);
260
+ }
261
+ function findLastIndexedWorkflowEventAfter(entries, afterIndex, predicate) {
262
+ for (let index = entries.length - 1; index >= 0; index--) {
263
+ const entry = entries[index];
264
+ if (entry.index > afterIndex && predicate(entry.event)) return entry.event;
265
+ }
266
+ }
267
+ function findLastIndexedWorkflowEventEntryAfter(entries, afterIndex, predicate) {
268
+ for (let index = entries.length - 1; index >= 0; index--) {
269
+ const entry = entries[index];
270
+ const event = entry.event;
271
+ if (entry.index > afterIndex && predicate(event)) return {
272
+ index: entry.index,
273
+ event
274
+ };
275
+ }
276
+ }
277
+ function findWorkflowMessageSentForWait(projection, messageId, stepId, timeoutAt) {
278
+ const waitStartedIndex = projection.latestMessageWaitStartedIndex.get(stepId) ?? -1;
279
+ return (projection.messageSentById.get(messageId) ?? []).find(({ index, event }) => {
280
+ return index > waitStartedIndex && (event.waiterStepIds === void 0 || event.waiterStepIds.includes(stepId)) && (timeoutAt === void 0 || Temporal.Instant.compare(event.timestamp, timeoutAt) < 0);
281
+ })?.event;
282
+ }
283
+ function findWorkflowMessageSentByTimestamp(projection, messageId, timestamp) {
284
+ return findLastIndexedWorkflowEventAfter(projection.messageSentById.get(messageId) ?? [], -1, (event) => Temporal.Instant.compare(event.timestamp, timestamp) === 0);
285
+ }
286
+ function findStreamEventProjection(projection, streamIdOrName) {
287
+ const started = projection.streamStartedByIdOrName.get(streamIdOrName);
288
+ if (started === void 0) return;
289
+ return {
290
+ started: started.event,
291
+ chunks: [...projection.streamChunksByStreamId.get(started.event.streamId) ?? []].sort((left, right) => left.event.index - right.event.index),
292
+ ...projection.streamClosedByStreamId.get(started.event.streamId) === void 0 ? {} : { closed: projection.streamClosedByStreamId.get(started.event.streamId) },
293
+ ...projection.streamFailedByStreamId.get(started.event.streamId) === void 0 ? {} : { failed: projection.streamFailedByStreamId.get(started.event.streamId) }
294
+ };
295
+ }
296
+ function findLastWorkflowSleepStartedForCompleted(projection, completed) {
297
+ const started = projection.startedSleep.get(completed.stepId);
298
+ return started?.stepName === completed.stepName ? started : void 0;
299
+ }
300
+ function findLastMessageWaitStartedForCompleted(projection, completed) {
301
+ const started = projection.startedMessageWait.get(completed.stepId);
302
+ return started?.stepName === completed.stepName && started.messageId === completed.messageId ? started : void 0;
303
+ }
304
+ function findLastWorkflowChildWorkflowStartedForTerminal(projection, terminal) {
305
+ return findLastIndexedWorkflowEventAfter(projection.childWorkflowStartedByStepId.get(terminal.stepId) ?? [], -1, (event) => workflowChildWorkflowTerminalMatchesStarted(terminal, event));
306
+ }
307
+ function findWorkflowChildWorkflowLifecycleForAttempt(projection, attempt) {
308
+ const started = projection.childWorkflowStartedByAttemptKey.get(workflowChildWorkflowAttemptKey(attempt));
309
+ if (started === void 0) return { hasTerminalAfterStarted: false };
310
+ return {
311
+ started: started.event,
312
+ hasTerminalAfterStarted: hasWorkflowChildWorkflowTerminalAfterStarted(projection, started)
313
+ };
314
+ }
315
+ function hasWorkflowChildWorkflowTerminalAfterStarted(projection, started) {
316
+ return findLastIndexedWorkflowEventEntryAfter(projection.childWorkflowCompletedByStepId.get(started.event.stepId) ?? [], started.index, (event) => workflowChildWorkflowTerminalMatchesStarted(event, started.event)) !== void 0 || findLastIndexedWorkflowEventEntryAfter(projection.childWorkflowFailedByStepId.get(started.event.stepId) ?? [], started.index, (event) => workflowChildWorkflowTerminalMatchesStarted(event, started.event)) !== void 0;
317
+ }
318
+ function activeMessageWaitStepIds(projection, messageId) {
319
+ return [...projection.activeMessageWaitsByMessageId.get(messageId)?.keys() ?? []];
320
+ }
321
+ function findLastMessageWaitStartedByNameAndMessageId(projection, stepName, messageId) {
322
+ return (projection.messageWaitStartedByNameAndMessageId.get(workflowMessageWaitNameMessageKey(stepName, messageId)) ?? []).at(-1)?.event;
323
+ }
324
+ function findLastMessageWaitTerminalAfterStarted(projection, started) {
325
+ const startedIndex = projection.messageWaitStartedIndex.get(started);
326
+ if (startedIndex === void 0) return;
327
+ const completed = findLastIndexedWorkflowEventEntryAfter(projection.completedMessageWait.get(started.stepId) ?? [], startedIndex, (event) => event.stepName === started.stepName && event.messageId === started.messageId);
328
+ const failed = findLastIndexedWorkflowEventEntryAfter(projection.failedMessageWait.get(started.stepId) ?? [], startedIndex, (event) => event.stepName === started.stepName && event.messageId === started.messageId);
329
+ if (completed === void 0) return failed?.event;
330
+ if (failed === void 0) return completed.event;
331
+ return completed.index > failed.index ? completed.event : failed.event;
332
+ }
333
+ function findWorkflowMessageSentByIdempotencyKey(projection, idempotencyKey) {
334
+ return idempotencyKey === void 0 ? void 0 : projection.messageSentByIdempotencyKey.get(idempotencyKey);
335
+ }
336
+ function findLastWorkflowMessageSentById(projection, messageId) {
337
+ return (projection.messageSentById.get(messageId) ?? []).at(-1)?.event;
338
+ }
339
+ function appendProjectedEvent(map, stepId, event) {
340
+ const events = map.get(stepId);
341
+ if (events === void 0) {
342
+ map.set(stepId, [event]);
343
+ return;
344
+ }
345
+ events.push(event);
346
+ }
347
+ function workflowMessageWaitNameMessageKey(stepName, messageId) {
348
+ return `${stepName}\u0000${messageId}`;
349
+ }
350
+ function workflowChildWorkflowAttemptKey(event) {
351
+ return [
352
+ workflowProjectionKeyPart(event.childRunId),
353
+ workflowProjectionKeyPart(event.stepId),
354
+ workflowProjectionKeyPart(event.stepName),
355
+ workflowProjectionKeyPart(event.attempt),
356
+ workflowProjectionKeyPart(event.count),
357
+ workflowProjectionKeyPart(event.workflowName),
358
+ workflowProjectionKeyPart(event.workflowVersion),
359
+ workflowProjectionKeyPart(event.cancellation ?? "cascade")
360
+ ].join("\0");
361
+ }
362
+ function workflowProjectionKeyPart(value) {
363
+ return value === void 0 ? "" : String(value);
364
+ }
365
+ function workflowChildWorkflowTerminalMatchesStarted(event, started) {
366
+ return event.stepId === started.stepId && event.stepName === started.stepName && event.childRunId === started.childRunId && event.attempt === started.attempt;
367
+ }
368
+ //#endregion
369
+ export { activeMessageWaitStepIds, appendWorkflowReplayProjectionEvents, createWorkflowReplayProjection, findLastIndexedWorkflowEventAfter, findLastMessageWaitStartedByNameAndMessageId, findLastMessageWaitStartedForCompleted, findLastMessageWaitTerminalAfterStarted, findLastWorkflowChildWorkflowStartedForTerminal, findLastWorkflowMessageSentById, findLastWorkflowSleepStartedForCompleted, findStreamEventProjection, findWorkflowChildWorkflowLifecycleForAttempt, findWorkflowMessageSentByIdempotencyKey, findWorkflowMessageSentByTimestamp, findWorkflowMessageSentForWait };
@@ -0,0 +1,16 @@
1
+ import { WorkflowStepIdentity, WorkflowStepType } from "../types/run.mjs";
2
+ import { ChildWorkflowStartedEvent, DeterministicValueRecordedEvent, EventRecord, MessageSendStartedEvent, MessageWaitStartedEvent, MetadataSetEvent, SleepStartedEvent, StreamStartedEvent, WorkflowStepStartedEvent } from "../types/events.mjs";
3
+ //#region src/history/sequencer.d.ts
4
+ type WorkflowRecordedStepEvent = WorkflowStepStartedEvent | SleepStartedEvent | ChildWorkflowStartedEvent | MessageSendStartedEvent | MessageWaitStartedEvent | StreamStartedEvent | DeterministicValueRecordedEvent | MetadataSetEvent;
5
+ declare function createWorkflowStepSequencer(events: readonly EventRecord[]): WorkflowStepSequencer;
6
+ declare class WorkflowStepSequencer {
7
+ #private;
8
+ constructor(recordedSteps: readonly WorkflowRecordedStepEvent[]);
9
+ next<TType extends WorkflowStepType>(type: TType, name: string): WorkflowStepIdentity<TType>;
10
+ requireConsumed(): void;
11
+ isConsumed(): boolean;
12
+ }
13
+ declare function workflowRecordedStepEventType(event: WorkflowRecordedStepEvent): WorkflowStepType;
14
+ declare function isWorkflowRecordedStepEvent(event: EventRecord): event is WorkflowRecordedStepEvent;
15
+ //#endregion
16
+ export { WorkflowRecordedStepEvent, WorkflowStepSequencer, createWorkflowStepSequencer, isWorkflowRecordedStepEvent, workflowRecordedStepEventType };
@@ -0,0 +1,78 @@
1
+ import { WorkflowStateError } from "../errors/base.mjs";
2
+ import { WorkflowReplayDivergenceError } from "../errors/failures.mjs";
3
+ import "../errors/mod.mjs";
4
+ import { getEventDescriptor, isWorkflowRecordedStepEventKind } from "../events/descriptors.mjs";
5
+ //#region src/history/sequencer.ts
6
+ function createWorkflowStepSequencer(events) {
7
+ return new WorkflowStepSequencer(distinctRecordedStepEvents(events));
8
+ }
9
+ var WorkflowStepSequencer = class {
10
+ #counts = /* @__PURE__ */ new Map();
11
+ #recordedSteps;
12
+ #cursor = 0;
13
+ constructor(recordedSteps) {
14
+ this.#recordedSteps = recordedSteps;
15
+ }
16
+ next(type, name) {
17
+ const key = `${type}:${name}`;
18
+ const count = (this.#counts.get(key) ?? 0) + 1;
19
+ this.#counts.set(key, count);
20
+ const identity = {
21
+ id: count === 1 ? `${type}:${name}` : `${type}:${name}:${count - 1}`,
22
+ name,
23
+ count,
24
+ kind: type
25
+ };
26
+ this.#requireNextRecordedStepMatches(identity);
27
+ this.#cursor++;
28
+ return identity;
29
+ }
30
+ requireConsumed() {
31
+ const recorded = this.#recordedSteps[this.#cursor];
32
+ if (recorded === void 0) return;
33
+ WorkflowReplayDivergenceError.diverged(`recorded step ${recorded.stepId} was not encountered by the workflow handler`, { expectedStepId: recorded.stepId });
34
+ }
35
+ isConsumed() {
36
+ return this.#recordedSteps[this.#cursor] === void 0;
37
+ }
38
+ #requireNextRecordedStepMatches(identity) {
39
+ const recorded = this.#recordedSteps[this.#cursor];
40
+ if (recorded === void 0) return;
41
+ const recordedType = workflowRecordedStepEventType(recorded);
42
+ if (!(recorded.timestamp instanceof Temporal.Instant)) WorkflowReplayDivergenceError.diverged(`recorded ${recordedType} step ${recorded.stepId} has invalid start timestamp: ${String(recorded.timestamp)}`, {
43
+ expectedStepId: recorded.stepId,
44
+ actualStepId: identity.id
45
+ });
46
+ if (!(Number.isSafeInteger(recorded.count) && recorded.count > 0)) WorkflowReplayDivergenceError.diverged(`recorded ${recordedType} step ${recorded.stepId} has an invalid count`, {
47
+ expectedStepId: recorded.stepId,
48
+ actualStepId: identity.id
49
+ });
50
+ if (recordedType === identity.kind && recorded.stepId === identity.id && recorded.stepName === identity.name && recorded.count === identity.count) return;
51
+ WorkflowReplayDivergenceError.diverged(`expected recorded ${recordedType} step ${recorded.stepId}, but encountered ${identity.kind} step ${identity.id}`, {
52
+ expectedStepId: recorded.stepId,
53
+ actualStepId: identity.id
54
+ });
55
+ }
56
+ };
57
+ function workflowRecordedStepEventType(event) {
58
+ const stepType = getEventDescriptor(event.kind).stepType;
59
+ if (stepType === void 0) WorkflowStateError.unsupportedRecordedStepEventType(event.kind);
60
+ return stepType;
61
+ }
62
+ function isWorkflowRecordedStepEvent(event) {
63
+ return isWorkflowRecordedStepEventKind(event.kind) && "stepId" in event && "stepName" in event && "count" in event;
64
+ }
65
+ function distinctRecordedStepEvents(events) {
66
+ const recorded = [];
67
+ const seen = /* @__PURE__ */ new Set();
68
+ for (const event of events) {
69
+ if (!isWorkflowRecordedStepEvent(event)) continue;
70
+ const key = `${event.kind}:${event.stepId}:${event.count}`;
71
+ if (seen.has(key)) continue;
72
+ seen.add(key);
73
+ recorded.push(event);
74
+ }
75
+ return recorded;
76
+ }
77
+ //#endregion
78
+ export { WorkflowStepSequencer, createWorkflowStepSequencer, isWorkflowRecordedStepEvent, workflowRecordedStepEventType };
@@ -0,0 +1,9 @@
1
+ import { RunId } from "../types/run-id.mjs";
2
+ import { WorkflowStepAttemptRecord } from "../types/step-attempts.mjs";
3
+ import "../types/run.mjs";
4
+ import { EventRecord } from "../types/events.mjs";
5
+ //#region src/history/step-attempts.d.ts
6
+ /** Creates workflow step attempts. */
7
+ declare function createWorkflowStepAttempts(runId: RunId, events: readonly EventRecord[]): readonly WorkflowStepAttemptRecord[];
8
+ //#endregion
9
+ export { createWorkflowStepAttempts };
@@ -0,0 +1,50 @@
1
+ import { getWorkflowEventStepAttemptKey, isWorkflowTerminalStepAttemptEvent } from "../events/descriptors.mjs";
2
+ import { applyWorkflowStepAttemptEvent } from "./projection.mjs";
3
+ //#region src/history/step-attempts.ts
4
+ /** Creates workflow step attempts. */
5
+ function createWorkflowStepAttempts(runId, events) {
6
+ const attempts = /* @__PURE__ */ new Map();
7
+ for (const event of events) {
8
+ const key = reconciledWorkflowStepAttemptKeyFromEvent(event);
9
+ if (key === void 0) continue;
10
+ const attempt = applyReconciledWorkflowStepAttemptEvent(runId, event, attempts.get(key));
11
+ if (attempt === void 0 || isWorkflowTerminalStepAttemptEvent(event) && !attempts.has(key)) continue;
12
+ attempts.set(key, attempt);
13
+ }
14
+ return markSupersededRunningStepAttemptsAsAbandoned([...attempts.values()]).sort(compareStepAttempts);
15
+ }
16
+ function applyReconciledWorkflowStepAttemptEvent(runId, event, current) {
17
+ try {
18
+ return applyWorkflowStepAttemptEvent(runId, event, current);
19
+ } catch {
20
+ return;
21
+ }
22
+ }
23
+ function reconciledWorkflowStepAttemptKeyFromEvent(event) {
24
+ try {
25
+ return getWorkflowEventStepAttemptKey(event);
26
+ } catch {
27
+ return;
28
+ }
29
+ }
30
+ function markSupersededRunningStepAttemptsAsAbandoned(attempts) {
31
+ const latestAttemptByStepId = /* @__PURE__ */ new Map();
32
+ for (const attempt of attempts) latestAttemptByStepId.set(attempt.stepId, Math.max(latestAttemptByStepId.get(attempt.stepId) ?? 0, attempt.attempt));
33
+ return attempts.map((attempt) => {
34
+ if (attempt.status !== "running") return attempt;
35
+ const latestAttempt = latestAttemptByStepId.get(attempt.stepId) ?? attempt.attempt;
36
+ if (attempt.attempt >= latestAttempt) return attempt;
37
+ return {
38
+ ...attempt,
39
+ status: "abandoned"
40
+ };
41
+ });
42
+ }
43
+ function compareStepAttempts(left, right) {
44
+ const started = Temporal.Instant.compare(left.startedAt, right.startedAt);
45
+ if (started !== 0) return started;
46
+ const stepId = left.stepId.localeCompare(right.stepId);
47
+ return stepId === 0 ? left.attempt - right.attempt : stepId;
48
+ }
49
+ //#endregion
50
+ export { createWorkflowStepAttempts };
@@ -0,0 +1,16 @@
1
+ import { Timeline as Timeline$1, TimelineEntryRecord } from "../types/timeline.mjs";
2
+ import { WorkflowRunRecord } from "../types/run.mjs";
3
+ import { EventRecord } from "../types/events.mjs";
4
+ //#region src/history/timeline.d.ts
5
+ /** Creates workflow timeline. */
6
+ declare function createTimeline(run: WorkflowRunRecord, events: readonly EventRecord[]): Timeline$1;
7
+ /** Timeline projection built from a run record and its durable event history. */
8
+ declare class Timeline implements Timeline$1 {
9
+ /** @inheritdoc */
10
+ readonly run: WorkflowRunRecord;
11
+ /** @inheritdoc */
12
+ readonly entries: readonly TimelineEntryRecord[];
13
+ constructor(run: WorkflowRunRecord, events: readonly EventRecord[]);
14
+ }
15
+ //#endregion
16
+ export { Timeline, createTimeline };