@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,333 @@
1
+ import { WorkflowOptionsError } from "../errors/base.mjs";
2
+ import { WorkflowReplayDivergenceError } from "../errors/failures.mjs";
3
+ import { getRequiredRun, isNonNegativeSafeInteger } from "../utility.mjs";
4
+ import { WorkflowStreamError, WorkflowStreamNotFoundError } from "../errors/stream.mjs";
5
+ import "../errors/mod.mjs";
6
+ import { nonNegativeTimerDelay } from "../timer.mjs";
7
+ import { serializeError, toOptionalPersistedValue, toPersistedValue } from "./serialization.mjs";
8
+ import { WorkflowHistory } from "../history/mod.mjs";
9
+ import "./state.mjs";
10
+ import { makeStreamChunkCursorKey, pageItems } from "../pagination.mjs";
11
+ import { resolveWorkflowCommandIdentity } from "./command-identity.mjs";
12
+ import { appendDurableStepStartedEvent, appendDurableStepTerminalEvent } from "./durable-command.mjs";
13
+ import { deepEquals } from "@temelj/value";
14
+ //#region src/engine/stream.ts
15
+ const DEFAULT_MAXIMUM_STREAM_CHUNKS = 1e3;
16
+ const DEFAULT_STREAM_FOLLOW_POLL_INTERVAL = Temporal.Duration.from({ milliseconds: 100 });
17
+ async function getStreamInfoForRun(service, runId, streamIdOrName) {
18
+ await getRequiredRun(service.store, runId);
19
+ return getStreamInfoFromHistory(runId, new WorkflowHistory(await service.store.getEvents(runId)), streamIdOrName);
20
+ }
21
+ async function readStreamForRun(service, runId, streamIdOrName, readOptions) {
22
+ await getRequiredRun(service.store, runId);
23
+ return readStreamFromHistory(runId, new WorkflowHistory(await service.store.getEvents(runId)), streamIdOrName, readOptions);
24
+ }
25
+ async function readStreamPageForRun(service, runId, streamIdOrName, readOptions) {
26
+ const stream = await readStreamForRun(service, runId, streamIdOrName, readOptions);
27
+ return {
28
+ ...stream,
29
+ chunks: pageItems(stream.chunks, readOptions, "Workflow stream page", makeStreamChunkCursorKey)
30
+ };
31
+ }
32
+ function followStreamForRun(service, runId, streamIdOrName, followOptions) {
33
+ return followStream(async (readOptions) => await readStreamForRun(service, runId, streamIdOrName, readOptions), followOptions, { waitForChange: async ({ signal }) => await waitForStreamStorageChange(service, runId, signal) });
34
+ }
35
+ async function waitForStreamForRun(service, runId, streamIdOrName, waitOptions) {
36
+ return await waitForStream(async () => await getStreamInfoForRun(service, runId, streamIdOrName), waitOptions, { waitForChange: async ({ signal }) => await waitForStreamStorageChange(service, runId, signal) });
37
+ }
38
+ async function waitForStreamChunkForRun(service, runId, streamIdOrName, afterIndex, waitOptions) {
39
+ return await waitForStreamChunk(async (readOptions) => await readStreamForRun(service, runId, streamIdOrName, readOptions), afterIndex, waitOptions, { waitForChange: async ({ signal }) => await waitForStreamStorageChange(service, runId, signal) });
40
+ }
41
+ async function waitForStreamTerminalForRun(service, runId, streamIdOrName, waitOptions) {
42
+ return await waitForStreamTerminal(async () => await getStreamInfoForRun(service, runId, streamIdOrName), waitOptions, { waitForChange: async ({ signal }) => await waitForStreamStorageChange(service, runId, signal) });
43
+ }
44
+ async function waitForStreamStorageChange(service, runId, signal) {
45
+ await service.store.waitForEventHistoryChange(runId, { signal });
46
+ }
47
+ function createWorkflowStepStreamApi(environment) {
48
+ const { history } = environment;
49
+ return { create(commandId, options = {}) {
50
+ return createStream(environment, resolveWorkflowCommandIdentity(history, "stream", commandId), commandId, options);
51
+ } };
52
+ }
53
+ function createStream(environment, identity, name, options = {}) {
54
+ return new Stream(environment, identity, name, options);
55
+ }
56
+ var Stream = class {
57
+ id;
58
+ name;
59
+ contentType;
60
+ metadata;
61
+ #environment;
62
+ #identity;
63
+ #maximumChunks;
64
+ #persistedMetadata;
65
+ #nextChunkIndex = 0;
66
+ constructor(environment, identity, name, options = {}) {
67
+ const streamId = options.id ?? name;
68
+ const maximumChunks = options.maximumChunks !== void 0 ? options.maximumChunks : environment.limits.maximumStreamChunks ?? DEFAULT_MAXIMUM_STREAM_CHUNKS;
69
+ const persistedMetadata = toOptionalPersistedValue(options.metadata, `workflow stream ${streamId} metadata`, environment.limits);
70
+ const started = environment.history.startedStream(identity.id);
71
+ if (started !== void 0) requireStreamReplayMatches(identity, started, {
72
+ streamId,
73
+ contentType: options.contentType,
74
+ metadata: persistedMetadata
75
+ });
76
+ this.#environment = environment;
77
+ this.#identity = identity;
78
+ this.id = streamId;
79
+ this.name = name;
80
+ if (options.contentType !== void 0) this.contentType = options.contentType;
81
+ if (options.metadata !== void 0) this.metadata = options.metadata;
82
+ this.#maximumChunks = maximumChunks;
83
+ this.#persistedMetadata = persistedMetadata;
84
+ }
85
+ async write(chunk) {
86
+ await ensureStreamStarted(this.#environment, this.#identity, this.id, this.contentType, this.#persistedMetadata);
87
+ const persistedChunk = toPersistedValue(chunk, `workflow stream ${this.id} chunk`, this.#environment.limits);
88
+ const existing = this.#environment.history.streamChunk(this.#identity.id, this.#nextChunkIndex);
89
+ const index = this.#nextChunkIndex;
90
+ this.#nextChunkIndex++;
91
+ if (existing !== void 0) {
92
+ requireStreamChunkReplayMatches(this.#identity, existing.index, existing.chunk, persistedChunk);
93
+ return;
94
+ }
95
+ requireStreamOpen(this.#environment, this.#identity.id, this.id);
96
+ if (index >= this.#maximumChunks) WorkflowStreamError.chunkLimitExceeded(this.id, this.#maximumChunks);
97
+ await appendDurableStepTerminalEvent(this.#environment, {
98
+ kind: "stream_chunk",
99
+ timestamp: this.#environment.now(),
100
+ stepId: this.#identity.id,
101
+ stepName: this.#identity.name,
102
+ streamId: this.id,
103
+ index,
104
+ chunk: persistedChunk
105
+ });
106
+ }
107
+ async close() {
108
+ await ensureStreamStarted(this.#environment, this.#identity, this.id, this.contentType, this.#persistedMetadata);
109
+ if (this.#environment.history.closedStream(this.#identity.id) !== void 0) return;
110
+ requireStreamOpen(this.#environment, this.#identity.id, this.id);
111
+ await appendDurableStepTerminalEvent(this.#environment, {
112
+ kind: "stream_closed",
113
+ timestamp: this.#environment.now(),
114
+ stepId: this.#identity.id,
115
+ stepName: this.#identity.name,
116
+ streamId: this.id
117
+ });
118
+ }
119
+ async error(error) {
120
+ await ensureStreamStarted(this.#environment, this.#identity, this.id, this.contentType, this.#persistedMetadata);
121
+ if (this.#environment.history.failedStream(this.#identity.id) !== void 0) return;
122
+ requireStreamOpen(this.#environment, this.#identity.id, this.id);
123
+ await appendDurableStepTerminalEvent(this.#environment, {
124
+ kind: "stream_failed",
125
+ timestamp: this.#environment.now(),
126
+ stepId: this.#identity.id,
127
+ stepName: this.#identity.name,
128
+ streamId: this.id,
129
+ error: serializeError(error)
130
+ });
131
+ }
132
+ };
133
+ function readStream(runId, events, streamIdOrName, options = {}) {
134
+ return readStreamFromHistory(runId, new WorkflowHistory(events), streamIdOrName, options);
135
+ }
136
+ function readStreamFromHistory(runId, history, streamIdOrName, options = {}) {
137
+ if (options.fromIndex !== void 0 && options.fromTail !== void 0) WorkflowStreamError.readOffsetConflict();
138
+ const projection = requireStreamProjectionFromHistory(history, streamIdOrName);
139
+ const info = getStreamInfoFromProjection(runId, projection);
140
+ const fromIndex = options.fromTail === void 0 ? options.fromIndex ?? 0 : Math.max(0, info.chunkCount - options.fromTail);
141
+ const chunks = projection.chunks.filter((chunk) => chunk.event.index >= fromIndex).map((chunk) => ({
142
+ index: chunk.event.index,
143
+ timestamp: chunk.event.timestamp,
144
+ value: chunk.event.chunk
145
+ })).sort((left, right) => left.index - right.index).slice(0, options.maxChunks);
146
+ return {
147
+ ...info,
148
+ chunks
149
+ };
150
+ }
151
+ async function* followStream(read, options = {}, waitOptions = {}) {
152
+ if (options.fromIndex !== void 0 && options.fromTail !== void 0) WorkflowStreamError.readOffsetConflict();
153
+ const pollInterval = options.pollInterval ?? DEFAULT_STREAM_FOLLOW_POLL_INTERVAL;
154
+ const maxChunks = options.pageSize ?? options.maxChunks;
155
+ let nextIndex = options.fromIndex;
156
+ let initialFromTail = options.fromTail;
157
+ while (true) {
158
+ if (options.signal?.aborted) return;
159
+ const stream = await read({
160
+ ...nextIndex === void 0 ? {} : { fromIndex: nextIndex },
161
+ ...nextIndex === void 0 && initialFromTail !== void 0 ? { fromTail: initialFromTail } : {},
162
+ ...maxChunks === void 0 ? {} : { maxChunks }
163
+ });
164
+ initialFromTail = void 0;
165
+ for (const chunk of stream.chunks) {
166
+ if (options.signal?.aborted) return;
167
+ nextIndex = chunk.index + 1;
168
+ yield {
169
+ kind: "chunk",
170
+ runId: stream.runId,
171
+ streamId: stream.id,
172
+ streamName: stream.name,
173
+ chunk
174
+ };
175
+ }
176
+ if (nextIndex !== void 0 && nextIndex < stream.chunkCount) continue;
177
+ if (stream.status !== "open") {
178
+ if (options.includeTerminal !== false) yield {
179
+ kind: stream.status,
180
+ runId: stream.runId,
181
+ streamId: stream.id,
182
+ streamName: stream.name,
183
+ info: {
184
+ runId: stream.runId,
185
+ id: stream.id,
186
+ name: stream.name,
187
+ status: stream.status,
188
+ createdAt: stream.createdAt,
189
+ updatedAt: stream.updatedAt,
190
+ ...stream.contentType === void 0 ? {} : { contentType: stream.contentType },
191
+ ...stream.metadata === void 0 ? {} : { metadata: stream.metadata },
192
+ chunkCount: stream.chunkCount,
193
+ ...stream.lastIndex === void 0 ? {} : { lastIndex: stream.lastIndex },
194
+ ...stream.error === void 0 ? {} : { error: stream.error }
195
+ }
196
+ };
197
+ return;
198
+ }
199
+ await waitForStreamChangeOrPoll(nonNegativeTimerDelay(pollInterval, "Workflow stream follow pollInterval").clampedDelay, options.signal, waitOptions.waitForChange);
200
+ }
201
+ }
202
+ async function waitForStream(readInfo, options = {}, waitOptions = {}) {
203
+ while (true) {
204
+ if (options.signal?.aborted) return;
205
+ try {
206
+ return await readInfo();
207
+ } catch (error) {
208
+ if (!WorkflowStreamNotFoundError.isNotFound(error)) throw error;
209
+ }
210
+ await waitForStreamChangeOrPoll(nonNegativeTimerDelay(options.pollInterval ?? DEFAULT_STREAM_FOLLOW_POLL_INTERVAL, "Workflow stream wait pollInterval").clampedDelay, options.signal, waitOptions.waitForChange);
211
+ }
212
+ }
213
+ async function waitForStreamChunk(read, afterIndex, options = {}, waitOptions = {}) {
214
+ if (!isNonNegativeSafeInteger(afterIndex)) WorkflowOptionsError.nonNegativeSafeInteger("Workflow stream chunk wait afterIndex");
215
+ while (true) {
216
+ if (options.signal?.aborted) return;
217
+ const stream = await read({ fromIndex: afterIndex + 1 });
218
+ const chunk = stream.chunks[0];
219
+ if (chunk !== void 0) return chunk;
220
+ if (stream.status !== "open") return;
221
+ await waitForStreamChangeOrPoll(nonNegativeTimerDelay(options.pollInterval ?? DEFAULT_STREAM_FOLLOW_POLL_INTERVAL, "Workflow stream wait pollInterval").clampedDelay, options.signal, waitOptions.waitForChange);
222
+ }
223
+ }
224
+ async function waitForStreamTerminal(readInfo, options = {}, waitOptions = {}) {
225
+ while (true) {
226
+ if (options.signal?.aborted === true) return;
227
+ const info = await readInfo();
228
+ if (info.status !== "open") return info;
229
+ await waitForStreamChangeOrPoll(nonNegativeTimerDelay(options.pollInterval ?? DEFAULT_STREAM_FOLLOW_POLL_INTERVAL, "Workflow stream wait pollInterval").clampedDelay, options.signal, waitOptions.waitForChange);
230
+ }
231
+ }
232
+ function getStreamInfo(runId, events, streamIdOrName) {
233
+ return getStreamInfoFromHistory(runId, new WorkflowHistory(events), streamIdOrName);
234
+ }
235
+ function getStreamInfoFromHistory(runId, history, streamIdOrName) {
236
+ return getStreamInfoFromProjection(runId, requireStreamProjectionFromHistory(history, streamIdOrName));
237
+ }
238
+ function requireStreamProjectionFromHistory(history, streamIdOrName) {
239
+ const projection = history.streamProjection(streamIdOrName);
240
+ if (projection === void 0) WorkflowStreamNotFoundError.notFound(streamIdOrName);
241
+ return projection;
242
+ }
243
+ function getStreamInfoFromProjection(runId, projection) {
244
+ const { started, chunks, closed, failed } = projection;
245
+ requireStreamEventOrder(projection);
246
+ const latestChunk = chunks.at(-1)?.event;
247
+ return {
248
+ runId,
249
+ id: started.streamId,
250
+ name: started.stepName,
251
+ status: failed === void 0 ? closed === void 0 ? "open" : "closed" : "failed",
252
+ createdAt: started.timestamp,
253
+ updatedAt: failed?.event.timestamp ?? closed?.event.timestamp ?? latestChunk?.timestamp ?? started.timestamp,
254
+ ...started.contentType === void 0 ? {} : { contentType: started.contentType },
255
+ ...started.metadata === void 0 ? {} : { metadata: started.metadata },
256
+ chunkCount: chunks.length,
257
+ ...latestChunk === void 0 ? {} : { lastIndex: latestChunk.index },
258
+ ...failed === void 0 ? {} : { error: failed.event.error }
259
+ };
260
+ }
261
+ function requireStreamEventOrder(projection) {
262
+ const { started, chunks, closed, failed } = projection;
263
+ for (const [index, chunk] of chunks.entries()) if (chunk.event.index !== index) WorkflowStreamError.nonContiguousChunkIndex(started.streamId, chunk.event.index, index);
264
+ const terminal = earliestStreamTerminalEvent(closed, failed);
265
+ if (terminal === void 0) return;
266
+ const lateChunk = chunks.find((chunk) => chunk.index > terminal.index);
267
+ if (lateChunk !== void 0) WorkflowStreamError.chunkAfterTerminal(started.streamId, lateChunk.event.index, terminal.event.kind);
268
+ }
269
+ function earliestStreamTerminalEvent(closed, failed) {
270
+ if (closed === void 0) return failed;
271
+ if (failed === void 0) return closed;
272
+ return closed.index <= failed.index ? closed : failed;
273
+ }
274
+ async function ensureStreamStarted(environment, identity, streamId, contentType, metadata) {
275
+ if (environment.history.startedStream(identity.id) !== void 0) return;
276
+ await appendDurableStepStartedEvent(environment, {
277
+ kind: "stream_started",
278
+ timestamp: environment.now(),
279
+ stepId: identity.id,
280
+ stepName: identity.name,
281
+ count: identity.count,
282
+ streamId,
283
+ ...contentType === void 0 ? {} : { contentType },
284
+ ...metadata === void 0 ? {} : { metadata }
285
+ });
286
+ }
287
+ async function sleepForStreamFollow(milliseconds, signal) {
288
+ if (milliseconds === 0 || signal?.aborted) return;
289
+ await new Promise((resolve) => {
290
+ const timer = setTimeout(resolve, milliseconds);
291
+ signal?.addEventListener("abort", () => {
292
+ clearTimeout(timer);
293
+ resolve();
294
+ }, { once: true });
295
+ });
296
+ }
297
+ async function waitForStreamChangeOrPoll(milliseconds, signal, waitForChange) {
298
+ if (waitForChange === void 0) {
299
+ await sleepForStreamFollow(milliseconds, signal);
300
+ return;
301
+ }
302
+ const controller = new AbortController();
303
+ const abort = () => {
304
+ controller.abort();
305
+ };
306
+ signal?.addEventListener("abort", abort, { once: true });
307
+ try {
308
+ if (signal?.aborted === true) return;
309
+ await Promise.race([sleepForStreamFollow(milliseconds, controller.signal), waitForChange({ signal: controller.signal })]);
310
+ } finally {
311
+ signal?.removeEventListener("abort", abort);
312
+ controller.abort();
313
+ }
314
+ }
315
+ function requireStreamOpen(environment, stepId, streamId) {
316
+ if (environment.history.closedStream(stepId) !== void 0 || environment.history.failedStream(stepId) !== void 0) WorkflowStreamError.alreadyClosed(streamId);
317
+ }
318
+ function requireStreamReplayMatches(identity, recorded, next) {
319
+ if (recorded.stepId === identity.id && recorded.stepName === identity.name && recorded.streamId === next.streamId && recorded.contentType === next.contentType && deepEquals(recorded.metadata, next.metadata)) return;
320
+ WorkflowReplayDivergenceError.diverged(`recorded stream ${recorded.stepId} does not match replayed stream ${identity.id}`, {
321
+ expectedStepId: recorded.stepId,
322
+ actualStepId: identity.id
323
+ });
324
+ }
325
+ function requireStreamChunkReplayMatches(identity, index, recorded, next) {
326
+ if (deepEquals(recorded, next)) return;
327
+ WorkflowReplayDivergenceError.diverged(`recorded stream ${identity.id} chunk ${index} does not match replayed chunk`, {
328
+ expectedStepId: identity.id,
329
+ actualStepId: identity.id
330
+ });
331
+ }
332
+ //#endregion
333
+ export { createStream, createWorkflowStepStreamApi, followStream, followStreamForRun, getStreamInfo, getStreamInfoForRun, readStream, readStreamForRun, readStreamPageForRun, waitForStream, waitForStreamChunk, waitForStreamChunkForRun, waitForStreamForRun, waitForStreamTerminal, waitForStreamTerminalForRun };
@@ -0,0 +1,34 @@
1
+ import { MessageId } from "../../types/message-id.mjs";
2
+ import { StepId } from "../../types/step-id.mjs";
3
+ import { StreamId } from "../../types/stream-id.mjs";
4
+ import "../../types/step.mjs";
5
+ import { EventRecord } from "../../types/events.mjs";
6
+ //#region src/engine/summary/active-events.d.ts
7
+ interface ActiveWorkflowStreamSummary {
8
+ readonly stepId: StepId;
9
+ readonly stepName: string;
10
+ readonly streamId: StreamId;
11
+ readonly startedAt: Temporal.Instant;
12
+ readonly chunkCount: number;
13
+ }
14
+ interface ActiveWorkflowHookSummary {
15
+ readonly stepId: StepId;
16
+ readonly name: string;
17
+ readonly messageId: MessageId;
18
+ readonly source: "hook" | "webhook";
19
+ readonly startedAt: Temporal.Instant;
20
+ readonly timeoutAt?: Temporal.Instant;
21
+ }
22
+ interface ActiveWorkflowEventSummary {
23
+ readonly streams: readonly ActiveWorkflowStreamSummary[];
24
+ readonly hooks: readonly ActiveWorkflowHookSummary[];
25
+ }
26
+ interface ActiveWorkflowEventSummaryReducer {
27
+ addEvent(event: EventRecord): void;
28
+ finish(): ActiveWorkflowEventSummary;
29
+ }
30
+ /** Creates a reducer for active stream and hook events within a single workflow run. */
31
+ declare function createActiveWorkflowEventSummaryReducer(): ActiveWorkflowEventSummaryReducer;
32
+ declare function activeWorkflowEvents(events: readonly EventRecord[]): ActiveWorkflowEventSummary;
33
+ //#endregion
34
+ export { ActiveWorkflowEventSummary, ActiveWorkflowEventSummaryReducer, ActiveWorkflowHookSummary, ActiveWorkflowStreamSummary, activeWorkflowEvents, createActiveWorkflowEventSummaryReducer };
@@ -0,0 +1,69 @@
1
+ //#region src/engine/summary/active-events.ts
2
+ /** Creates a reducer for active stream and hook events within a single workflow run. */
3
+ function createActiveWorkflowEventSummaryReducer() {
4
+ const streams = /* @__PURE__ */ new Map();
5
+ const terminalStreamStepIds = /* @__PURE__ */ new Set();
6
+ const hooks = /* @__PURE__ */ new Map();
7
+ const terminalHookStepIds = /* @__PURE__ */ new Set();
8
+ return {
9
+ addEvent(event) {
10
+ addActiveStreamEvent(streams, terminalStreamStepIds, event);
11
+ addActiveHookEvent(hooks, terminalHookStepIds, event);
12
+ },
13
+ finish() {
14
+ return {
15
+ streams: [...streams.values()].filter((stream) => isActiveStream(stream, terminalStreamStepIds)),
16
+ hooks: [...hooks.values()].filter((hook) => isActiveHook(hook, terminalHookStepIds))
17
+ };
18
+ }
19
+ };
20
+ }
21
+ function activeWorkflowEvents(events) {
22
+ const reducer = createActiveWorkflowEventSummaryReducer();
23
+ for (const event of events) reducer.addEvent(event);
24
+ return reducer.finish();
25
+ }
26
+ function addActiveStreamEvent(streams, terminalStreamStepIds, event) {
27
+ if (event.kind === "stream_started") {
28
+ streams.set(event.stepId, {
29
+ stepId: event.stepId,
30
+ stepName: event.stepName,
31
+ streamId: event.streamId,
32
+ startedAt: event.timestamp,
33
+ chunkCount: 0
34
+ });
35
+ return;
36
+ }
37
+ if (event.kind === "stream_chunk") {
38
+ const stream = streams.get(event.stepId);
39
+ if (stream !== void 0) streams.set(event.stepId, {
40
+ ...stream,
41
+ chunkCount: stream.chunkCount + 1
42
+ });
43
+ return;
44
+ }
45
+ if (event.kind === "stream_closed" || event.kind === "stream_failed") terminalStreamStepIds.add(event.stepId);
46
+ }
47
+ function isActiveStream(stream, terminalStreamStepIds) {
48
+ return !terminalStreamStepIds.has(stream.stepId);
49
+ }
50
+ function addActiveHookEvent(hooks, terminalHookStepIds, event) {
51
+ if (event.kind === "message_wait_started") {
52
+ if (event.source !== "hook" && event.source !== "webhook") return;
53
+ hooks.set(event.stepId, {
54
+ stepId: event.stepId,
55
+ name: event.stepName,
56
+ messageId: event.messageId,
57
+ source: event.source,
58
+ startedAt: event.timestamp,
59
+ ...event.timeoutAt === void 0 ? {} : { timeoutAt: event.timeoutAt }
60
+ });
61
+ return;
62
+ }
63
+ if (event.kind === "message_wait_completed" || event.kind === "message_wait_failed") terminalHookStepIds.add(event.stepId);
64
+ }
65
+ function isActiveHook(hook, terminalHookStepIds) {
66
+ return !terminalHookStepIds.has(hook.stepId);
67
+ }
68
+ //#endregion
69
+ export { activeWorkflowEvents, createActiveWorkflowEventSummaryReducer };
@@ -0,0 +1,24 @@
1
+ import { RunId } from "../../types/run-id.mjs";
2
+ import { WorkflowRunFailureSummary, WorkflowRunRetrySummary } from "../../types/summary.mjs";
3
+ import { WorkflowStepAttemptRecord } from "../../types/step-attempts.mjs";
4
+ import { WorkflowRunRecord, WorkflowRunStatus } from "../../types/run.mjs";
5
+ import { WorkflowRunReaderRepository } from "../../types/store.mjs";
6
+ //#region src/engine/summary/child-workflow-runs.d.ts
7
+ interface WorkflowChildWorkflowRunSummaryFields {
8
+ readonly childStatus: Record<WorkflowRunStatus, number>;
9
+ readonly retryChildRunIds?: readonly string[];
10
+ readonly failedChildRunIds?: readonly string[];
11
+ readonly canceledChildRunIds?: readonly string[];
12
+ readonly childRetry?: WorkflowRunRetrySummary;
13
+ readonly childFailure?: WorkflowRunFailureSummary;
14
+ }
15
+ interface WorkflowChildWorkflowRunSummaryReducer {
16
+ addRun(run: WorkflowRunRecord): void;
17
+ finish(): WorkflowChildWorkflowRunSummaryFields;
18
+ }
19
+ declare function getChildRunsForAttempts(store: WorkflowRunReaderRepository, parentRunId: RunId, attempts: readonly WorkflowStepAttemptRecord[]): Promise<readonly WorkflowRunRecord[]>;
20
+ /** Creates a reducer for child workflow run state embedded in active child workflow waits. */
21
+ declare function createWorkflowChildWorkflowRunSummaryReducer(): WorkflowChildWorkflowRunSummaryReducer;
22
+ declare function summarizeChildWorkflowRuns(runs: readonly WorkflowRunRecord[]): WorkflowChildWorkflowRunSummaryFields;
23
+ //#endregion
24
+ export { WorkflowChildWorkflowRunSummaryFields, WorkflowChildWorkflowRunSummaryReducer, createWorkflowChildWorkflowRunSummaryReducer, getChildRunsForAttempts, summarizeChildWorkflowRuns };
@@ -0,0 +1,138 @@
1
+ import { greatestOptionalNumber, isScheduledWorkflowRunStatus, isWorkflowRunStatus } from "../../utility.mjs";
2
+ import { optionalProperty, optionalSortedStringSetProperty, sortedStringSet } from "../../collection.mjs";
3
+ import { latestOptionalTimestamp } from "../../temporal.mjs";
4
+ import { createWorkflowRunRetryReasonCounts, createWorkflowRunStatusCounts } from "./run-metrics.mjs";
5
+ //#region src/engine/summary/child-workflow-runs.ts
6
+ async function getChildRunsForAttempts(store, parentRunId, attempts) {
7
+ const childRunIds = [...new Set(attempts.flatMap((attempt) => attempt.childRunId === void 0 ? [] : [attempt.childRunId]))];
8
+ return (await Promise.all(childRunIds.map(async (runId) => await store.getRun(runId)))).filter((run) => run !== void 0 && attempts.some((attempt) => isChildRunForWorkflowStepAttempt(run, parentRunId, attempt)));
9
+ }
10
+ /** Creates a reducer for child workflow run state embedded in active child workflow waits. */
11
+ function createWorkflowChildWorkflowRunSummaryReducer() {
12
+ const childStatus = createWorkflowRunStatusCounts();
13
+ const retry = createWorkflowChildWorkflowRunRetryAccumulator();
14
+ const failure = createWorkflowChildWorkflowRunFailureAccumulator();
15
+ const failedChildRunIds = /* @__PURE__ */ new Set();
16
+ const canceledChildRunIds = /* @__PURE__ */ new Set();
17
+ return {
18
+ addRun(run) {
19
+ if (!isWorkflowRunStatus(run.status)) return;
20
+ const runStatus = run.status;
21
+ childStatus[runStatus]++;
22
+ addWorkflowChildWorkflowRunRetry(retry, run, runStatus);
23
+ if (runStatus === "failed") {
24
+ addWorkflowChildWorkflowRunFailure(failure, run);
25
+ failedChildRunIds.add(run.id);
26
+ }
27
+ if (runStatus === "canceled") canceledChildRunIds.add(run.id);
28
+ },
29
+ finish() {
30
+ return {
31
+ childStatus,
32
+ ...optionalSortedStringSetProperty("retryChildRunIds", retry.retryRunIds),
33
+ ...optionalSortedStringSetProperty("failedChildRunIds", failedChildRunIds),
34
+ ...optionalSortedStringSetProperty("canceledChildRunIds", canceledChildRunIds),
35
+ ...finishWorkflowChildWorkflowRunRetrySummary(retry),
36
+ ...finishWorkflowChildWorkflowRunFailureSummary(failure)
37
+ };
38
+ }
39
+ };
40
+ }
41
+ function summarizeChildWorkflowRuns(runs) {
42
+ const reducer = createWorkflowChildWorkflowRunSummaryReducer();
43
+ for (const run of runs) reducer.addRun(run);
44
+ return reducer.finish();
45
+ }
46
+ function isChildRunForWorkflowStepAttempt(run, parentRunId, attempt) {
47
+ return run.parentRunId === parentRunId && run.parentStepId === attempt.stepId && run.parentStepName === attempt.stepName && run.parentStepAttempt === attempt.attempt && attempt.childRunId === run.id && attempt.workflowName === run.workflowName && attempt.workflowVersion === run.workflowVersion;
48
+ }
49
+ function createWorkflowChildWorkflowRunRetryAccumulator() {
50
+ return {
51
+ total: 0,
52
+ reason: createWorkflowRunRetryReasonCounts(),
53
+ retryRunIds: /* @__PURE__ */ new Set(),
54
+ retryStepIds: /* @__PURE__ */ new Set(),
55
+ retryStepNames: /* @__PURE__ */ new Set()
56
+ };
57
+ }
58
+ function createWorkflowChildWorkflowRunFailureAccumulator() {
59
+ return {
60
+ total: 0,
61
+ errors: /* @__PURE__ */ new Map(),
62
+ failedRunIds: /* @__PURE__ */ new Set()
63
+ };
64
+ }
65
+ function addWorkflowChildWorkflowRunRetry(retry, run, runStatus) {
66
+ const retryReason = workflowChildWorkflowRunRetryReason(run);
67
+ if (!isScheduledWorkflowRunStatus(runStatus) || retryReason === void 0) return;
68
+ retry.total++;
69
+ retry.retryRunIds.add(run.id);
70
+ addWorkflowChildWorkflowRunRetryMetadata(retry, run);
71
+ retry.reason[retryReason]++;
72
+ setWorkflowChildWorkflowRunHighestAttempt(retry, run);
73
+ setWorkflowChildWorkflowRunNextRetry(retry, run);
74
+ }
75
+ function setWorkflowChildWorkflowRunHighestAttempt(retry, run) {
76
+ retry.highestAttempt = greatestOptionalNumber(retry.highestAttempt, run.retryAttempt);
77
+ }
78
+ function addWorkflowChildWorkflowRunRetryMetadata(retry, run) {
79
+ if (run.retryStepId !== void 0) retry.retryStepIds.add(run.retryStepId);
80
+ if (run.retryStepName !== void 0) retry.retryStepNames.add(run.retryStepName);
81
+ }
82
+ function setWorkflowChildWorkflowRunNextRetry(retry, run) {
83
+ if (run.retryAt === void 0 || retry.nextRetryAt !== void 0 && Temporal.Instant.compare(run.retryAt, retry.nextRetryAt) >= 0) return;
84
+ retry.nextRetryAt = run.retryAt;
85
+ retry.nextRetryRunId = run.id;
86
+ }
87
+ function workflowChildWorkflowRunRetryReason(run) {
88
+ return run.retryReason === "workflow" || run.retryReason === "step" || run.retryReason === "missing_implementation" ? run.retryReason : void 0;
89
+ }
90
+ function addWorkflowChildWorkflowRunFailure(failure, run) {
91
+ failure.total++;
92
+ failure.failedRunIds.add(run.id);
93
+ failure.latestFailedAt = latestOptionalTimestamp(failure.latestFailedAt, run.finishedAt);
94
+ addWorkflowChildWorkflowRunFailureError(failure, run);
95
+ }
96
+ function addWorkflowChildWorkflowRunFailureError(failure, run) {
97
+ const errorName = run.error?.name ?? "Error";
98
+ const current = failure.errors.get(errorName) ?? {
99
+ count: 0,
100
+ failedRunIds: /* @__PURE__ */ new Set()
101
+ };
102
+ current.count++;
103
+ current.failedRunIds.add(run.id);
104
+ current.latestFailedAt = latestOptionalTimestamp(current.latestFailedAt, run.finishedAt);
105
+ failure.errors.set(errorName, current);
106
+ }
107
+ function finishWorkflowChildWorkflowRunRetrySummary(retry) {
108
+ return retry.total === 0 ? {} : { childRetry: {
109
+ total: retry.total,
110
+ retryRunIds: sortedStringSet(retry.retryRunIds),
111
+ retryStepIds: sortedStringSet(retry.retryStepIds),
112
+ retryStepNames: sortedStringSet(retry.retryStepNames),
113
+ reason: retry.reason,
114
+ ...retry.nextRetryAt === void 0 ? {} : {
115
+ nextRetryAt: retry.nextRetryAt,
116
+ ...optionalProperty("nextRetryRunId", retry.nextRetryRunId)
117
+ },
118
+ ...optionalProperty("highestAttempt", retry.highestAttempt)
119
+ } };
120
+ }
121
+ function finishWorkflowChildWorkflowRunFailureSummary(failure) {
122
+ return failure.total === 0 ? {} : { childFailure: {
123
+ total: failure.total,
124
+ failedRunIds: sortedStringSet(failure.failedRunIds),
125
+ errors: finishWorkflowChildWorkflowRunFailureErrors(failure.errors),
126
+ ...optionalProperty("latestFailedAt", failure.latestFailedAt)
127
+ } };
128
+ }
129
+ function finishWorkflowChildWorkflowRunFailureErrors(errors) {
130
+ return [...errors.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([name, summary]) => ({
131
+ name,
132
+ count: summary.count,
133
+ failedRunIds: sortedStringSet(summary.failedRunIds),
134
+ ...optionalProperty("latestFailedAt", summary.latestFailedAt)
135
+ }));
136
+ }
137
+ //#endregion
138
+ export { createWorkflowChildWorkflowRunSummaryReducer, getChildRunsForAttempts, summarizeChildWorkflowRuns };
@@ -0,0 +1,21 @@
1
+ import { RunId } from "../../types/run-id.mjs";
2
+ import { WorkflowRunChildWorkflowSummary } from "../../types/summary.mjs";
3
+ import { WorkflowStepAttemptRecord } from "../../types/step-attempts.mjs";
4
+ import { WorkflowRunRecord } from "../../types/run.mjs";
5
+ //#region src/engine/summary/child-workflow-waits.d.ts
6
+ interface WorkflowRunChildWorkflowWaitInput {
7
+ readonly runId: RunId;
8
+ readonly attempts: readonly WorkflowStepAttemptRecord[];
9
+ readonly childRuns: readonly WorkflowRunRecord[];
10
+ }
11
+ interface WorkflowRunChildWorkflowWaitSummary {
12
+ readonly childWorkflow?: WorkflowRunChildWorkflowSummary;
13
+ }
14
+ interface WorkflowRunChildWorkflowWaitSummaryReducer {
15
+ addChildWorkflowAttempts(runId: RunId, attempts: readonly WorkflowStepAttemptRecord[], childRuns: readonly WorkflowRunRecord[]): void;
16
+ finish(): WorkflowRunChildWorkflowWaitSummary;
17
+ }
18
+ /** Creates a reducer for active child workflow waits across workflow runs. */
19
+ declare function createWorkflowRunChildWorkflowWaitSummaryReducer(): WorkflowRunChildWorkflowWaitSummaryReducer;
20
+ //#endregion
21
+ export { WorkflowRunChildWorkflowWaitInput, WorkflowRunChildWorkflowWaitSummaryReducer, createWorkflowRunChildWorkflowWaitSummaryReducer };