@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,15 @@
1
+ //#region src/collection.d.ts
2
+ /** Returns whether a value matches one expected value or any value in an expected list. */
3
+ declare function matchesOptionalValue<T>(value: T, expected: T | readonly T[]): boolean;
4
+ /** Returns the first item for each key while preserving input order. */
5
+ declare function uniqueBy<T>(items: readonly T[], key: (item: T) => string): readonly T[];
6
+ /** Returns a copy of an object without properties whose value is undefined. */
7
+ declare function omitUndefined(value: object): Record<string, unknown>;
8
+ /** Returns an object containing one property only when the value is defined. */
9
+ declare function optionalProperty<TKey extends string, TValue>(key: TKey, value: TValue | undefined): Partial<Record<TKey, TValue>>;
10
+ /** Returns sorted string values from a set. */
11
+ declare function sortedStringSet(values: ReadonlySet<string>): readonly string[];
12
+ /** Returns an object containing a sorted string set only when the set is not empty. */
13
+ declare function optionalSortedStringSetProperty<TKey extends string>(key: TKey, values: ReadonlySet<string>): Partial<Record<TKey, readonly string[]>>;
14
+ //#endregion
15
+ export { matchesOptionalValue, omitUndefined, optionalProperty, optionalSortedStringSetProperty, sortedStringSet, uniqueBy };
@@ -0,0 +1,33 @@
1
+ //#region src/collection.ts
2
+ /** Returns whether a value matches one expected value or any value in an expected list. */
3
+ function matchesOptionalValue(value, expected) {
4
+ return Array.isArray(expected) ? expected.includes(value) : Object.is(value, expected);
5
+ }
6
+ /** Returns the first item for each key while preserving input order. */
7
+ function uniqueBy(items, key) {
8
+ const seen = /* @__PURE__ */ new Set();
9
+ return items.filter((item) => {
10
+ const itemKey = key(item);
11
+ if (seen.has(itemKey)) return false;
12
+ seen.add(itemKey);
13
+ return true;
14
+ });
15
+ }
16
+ /** Returns a copy of an object without properties whose value is undefined. */
17
+ function omitUndefined(value) {
18
+ return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== void 0));
19
+ }
20
+ /** Returns an object containing one property only when the value is defined. */
21
+ function optionalProperty(key, value) {
22
+ return value === void 0 ? {} : { [key]: value };
23
+ }
24
+ /** Returns sorted string values from a set. */
25
+ function sortedStringSet(values) {
26
+ return [...values].sort();
27
+ }
28
+ /** Returns an object containing a sorted string set only when the set is not empty. */
29
+ function optionalSortedStringSetProperty(key, values) {
30
+ return values.size === 0 ? {} : { [key]: sortedStringSet(values) };
31
+ }
32
+ //#endregion
33
+ export { matchesOptionalValue, omitUndefined, optionalProperty, optionalSortedStringSetProperty, sortedStringSet, uniqueBy };
@@ -0,0 +1,27 @@
1
+ import { RegistryLike, WorkflowImplementation } from "./types/definition.mjs";
2
+ import { WorkflowStepApi, WorkflowStepDefinition } from "./types/step.mjs";
3
+ import { CompiledWorkflowFunction, WorkflowClient, WorkflowRunHandle } from "./types/client.mjs";
4
+ //#region src/compiled-function.d.ts
5
+ type AnyCompiledWorkflowFunction = (...args: never[]) => unknown;
6
+ type AnyCompiledWorkflowImplementation = WorkflowImplementation<readonly unknown[], unknown, readonly unknown[]>;
7
+ type AnyCompiledWorkflowStepDefinition = WorkflowStepDefinition<readonly unknown[], unknown>;
8
+ /** Attaches compiled workflow metadata to a directive-authored function. */
9
+ declare function attachWorkflowDefinition<TArgs extends readonly unknown[], TOutput>(fn: CompiledWorkflowFunction<TArgs, TOutput>, definition: WorkflowImplementation<TArgs, Awaited<TOutput>, TArgs>): CompiledWorkflowFunction<TArgs, TOutput>;
10
+ /** Attaches compiled step metadata to a directive-authored function. */
11
+ declare function attachWorkflowStepDefinition<TArgs extends readonly unknown[], TOutput>(fn: CompiledWorkflowFunction<TArgs, TOutput>, definition: WorkflowStepDefinition<TArgs, Awaited<TOutput>>): CompiledWorkflowFunction<TArgs, TOutput>;
12
+ /** Reads workflow metadata previously attached to a compiled workflow function. */
13
+ declare function getWorkflowFunctionDefinition<TArgs extends readonly unknown[], TOutput>(fn: CompiledWorkflowFunction<TArgs, TOutput>): WorkflowImplementation<TArgs, Awaited<TOutput>, TArgs> | undefined;
14
+ /** Reads step metadata previously attached to a compiled step function. */
15
+ declare function getWorkflowStepFunctionDefinition<TArgs extends readonly unknown[], TOutput>(fn: CompiledWorkflowFunction<TArgs, TOutput>): WorkflowStepDefinition<TArgs, Awaited<TOutput>> | undefined;
16
+ /** Reads erased workflow metadata from a function after runtime validation. */
17
+ declare function getCompiledWorkflowDefinition(fn: AnyCompiledWorkflowFunction): AnyCompiledWorkflowImplementation | undefined;
18
+ /** Reads erased step metadata from a function after runtime validation. */
19
+ declare function getCompiledWorkflowStepDefinition(fn: AnyCompiledWorkflowFunction): AnyCompiledWorkflowStepDefinition | undefined;
20
+ /** Registers compiled workflow functions with a workflow registry. */
21
+ declare function registerWorkflowFunctions(registry: RegistryLike, workflows: readonly AnyCompiledWorkflowFunction[]): void;
22
+ /** Starts a compiled workflow function through a workflow client. */
23
+ declare function runWorkflowFunction<TArgs extends readonly unknown[], TOutput>(client: WorkflowClient, workflow: CompiledWorkflowFunction<TArgs, TOutput>, ...args: TArgs): Promise<WorkflowRunHandle<Awaited<TOutput>>>;
24
+ /** Calls a compiled step function through the durable step API when metadata is present. */
25
+ declare function callWorkflowStepFunction<TArgs extends readonly unknown[], TOutput>(step: WorkflowStepApi, fn: CompiledWorkflowFunction<TArgs, TOutput>, ...args: TArgs): Promise<Awaited<TOutput>>;
26
+ //#endregion
27
+ export { attachWorkflowDefinition, attachWorkflowStepDefinition, callWorkflowStepFunction, getCompiledWorkflowDefinition, getCompiledWorkflowStepDefinition, getWorkflowFunctionDefinition, getWorkflowStepFunctionDefinition, registerWorkflowFunctions, runWorkflowFunction };
@@ -0,0 +1,54 @@
1
+ import { WorkflowDefinitionError } from "./errors/definition.mjs";
2
+ import "./errors/mod.mjs";
3
+ //#region src/compiled-function.ts
4
+ const workflowDefinitions = /* @__PURE__ */ new WeakMap();
5
+ const stepDefinitions = /* @__PURE__ */ new WeakMap();
6
+ /** Attaches compiled workflow metadata to a directive-authored function. */
7
+ function attachWorkflowDefinition(fn, definition) {
8
+ workflowDefinitions.set(fn, definition);
9
+ return fn;
10
+ }
11
+ /** Attaches compiled step metadata to a directive-authored function. */
12
+ function attachWorkflowStepDefinition(fn, definition) {
13
+ stepDefinitions.set(fn, definition);
14
+ return fn;
15
+ }
16
+ /** Reads workflow metadata previously attached to a compiled workflow function. */
17
+ function getWorkflowFunctionDefinition(fn) {
18
+ return getCompiledWorkflowDefinition(fn);
19
+ }
20
+ /** Reads step metadata previously attached to a compiled step function. */
21
+ function getWorkflowStepFunctionDefinition(fn) {
22
+ return getCompiledWorkflowStepDefinition(fn);
23
+ }
24
+ /** Reads erased workflow metadata from a function after runtime validation. */
25
+ function getCompiledWorkflowDefinition(fn) {
26
+ return workflowDefinitions.get(fn);
27
+ }
28
+ /** Reads erased step metadata from a function after runtime validation. */
29
+ function getCompiledWorkflowStepDefinition(fn) {
30
+ return stepDefinitions.get(fn);
31
+ }
32
+ /** Registers compiled workflow functions with a workflow registry. */
33
+ function registerWorkflowFunctions(registry, workflows) {
34
+ for (const workflow of workflows) {
35
+ const definition = getCompiledWorkflowDefinition(workflow);
36
+ if (definition === void 0) WorkflowDefinitionError.compiledMetadataMissing();
37
+ registry.register(definition);
38
+ }
39
+ }
40
+ /** Starts a compiled workflow function through a workflow client. */
41
+ async function runWorkflowFunction(client, workflow, ...args) {
42
+ const definition = getWorkflowFunctionDefinition(workflow);
43
+ if (definition === void 0) WorkflowDefinitionError.compiledMetadataMissing();
44
+ client.register(definition);
45
+ return await client.runs.start(definition.definition, args);
46
+ }
47
+ /** Calls a compiled step function through the durable step API when metadata is present. */
48
+ async function callWorkflowStepFunction(step, fn, ...args) {
49
+ const definition = getWorkflowStepFunctionDefinition(fn);
50
+ if (definition === void 0) return await fn(...args);
51
+ return await step.task.call(definition, ...args);
52
+ }
53
+ //#endregion
54
+ export { attachWorkflowDefinition, attachWorkflowStepDefinition, callWorkflowStepFunction, getCompiledWorkflowDefinition, getCompiledWorkflowStepDefinition, getWorkflowFunctionDefinition, getWorkflowStepFunctionDefinition, registerWorkflowFunctions, runWorkflowFunction };
@@ -0,0 +1,37 @@
1
+ import { MessageId } from "./types/message-id.mjs";
2
+ import { WorkflowDefinition, WorkflowDefinitionConfig, WorkflowHandler, WorkflowImplementation, WorkflowInputFromSchema, WorkflowRawInputFromSchema, WorkflowStartTarget } from "./types/definition.mjs";
3
+ import { MessageChannel, MessageChannelConfig, SendMessageChannelOptions, WaitForMessageChannelOptions } from "./types/message.mjs";
4
+ import { Schema, SchemaOutput } from "@temelj/standard-schema";
5
+ //#region src/definition.d.ts
6
+ /** Defines a durable workflow definition. */
7
+ declare function defineWorkflow<TInput = unknown, TOutput = unknown, TRawInput = TInput>(config: WorkflowDefinitionConfig): WorkflowDefinition<TInput, TOutput, TRawInput>;
8
+ /** Defines a durable workflow definition. */
9
+ declare function defineWorkflow<const TSchema extends Schema, TOutput = unknown>(config: WorkflowDefinitionConfig<TSchema>): WorkflowDefinition<SchemaOutput<TSchema>, TOutput, WorkflowRawInputFromSchema<TSchema, never>>;
10
+ /** Creates a workflow definition from a resolved name and optional version. */
11
+ declare function defineWorkflowFromName<TInput = unknown, TOutput = unknown, TRawInput = TInput>(name: string, version?: string): WorkflowDefinition<TInput, TOutput, TRawInput>;
12
+ /** Returns the durable definition for a workflow definition or implementation. */
13
+ declare function defineWorkflowFromTarget<TInput, TOutput, TRawInput>(target: WorkflowStartTarget<TInput, TOutput, TRawInput>): WorkflowDefinition<TInput, TOutput, TRawInput>;
14
+ /** Defines an executable workflow implementation from durable workflow config. */
15
+ declare function implementWorkflow<TInput = unknown, TOutput = unknown, TRawInput = TInput>(config: WorkflowDefinitionConfig, handler: WorkflowHandler<TInput, TOutput>): WorkflowImplementation<TInput, TOutput, TRawInput>;
16
+ /** Defines an executable workflow implementation from durable workflow config. */
17
+ declare function implementWorkflow<const TSchema extends Schema, TOutput = unknown>(config: WorkflowDefinitionConfig<TSchema>, handler: WorkflowHandler<SchemaOutput<TSchema>, TOutput>): WorkflowImplementation<SchemaOutput<TSchema>, TOutput, WorkflowRawInputFromSchema<TSchema, never>>;
18
+ /** Defines workflow message channel for durable workflow use. */
19
+ declare function defineMessageChannel<TPayload = unknown, TKey = void, const TSchema extends Schema | undefined = undefined>(config: MessageChannelConfig<TKey, TSchema>): MessageChannel<WorkflowInputFromSchema<TSchema, TPayload>, TKey>;
20
+ /** Normalizes and parses workflow message channel send. */
21
+ declare function resolveMessageChannelSend<TPayload, TKey>(channel: MessageChannel<TPayload, TKey>, options?: SendMessageChannelOptions<TPayload, TKey>): Promise<{
22
+ readonly messageId: MessageId;
23
+ readonly payload?: TPayload;
24
+ readonly idempotencyKey?: string;
25
+ }>;
26
+ /** Normalizes and parses workflow message channel wait. */
27
+ declare function resolveMessageChannelWait<TKey>(channel: MessageChannel<unknown, TKey>, options?: WaitForMessageChannelOptions<TKey>): {
28
+ commandId: string;
29
+ name: string;
30
+ messageId: string;
31
+ timeout?: Temporal.Duration | undefined;
32
+ schema?: Schema | undefined;
33
+ };
34
+ /** Parses raw workflow input against the definition schema when one is configured. */
35
+ declare function parseWorkflowInput<TInput>(definition: WorkflowDefinition<TInput, unknown, unknown>, input: unknown): Promise<TInput>;
36
+ //#endregion
37
+ export { defineMessageChannel, defineWorkflow, defineWorkflowFromName, defineWorkflowFromTarget, implementWorkflow, parseWorkflowInput, resolveMessageChannelSend, resolveMessageChannelWait };
@@ -0,0 +1,83 @@
1
+ import { validateStandardSchema } from "@temelj/standard-schema";
2
+ //#region src/definition.ts
3
+ /** Defines a durable workflow definition. */
4
+ function defineWorkflow(config) {
5
+ return {
6
+ kind: "definition",
7
+ config,
8
+ name: config.name,
9
+ ...config.version === void 0 ? {} : { version: config.version }
10
+ };
11
+ }
12
+ /** Creates a workflow definition from a resolved name and optional version. */
13
+ function defineWorkflowFromName(name, version) {
14
+ return defineWorkflow({
15
+ name,
16
+ ...version === void 0 ? {} : { version }
17
+ });
18
+ }
19
+ /** Returns the durable definition for a workflow definition or implementation. */
20
+ function defineWorkflowFromTarget(target) {
21
+ return target.kind === "implementation" ? target.definition : target;
22
+ }
23
+ /** Defines an executable workflow implementation from durable workflow config. */
24
+ function implementWorkflow(config, handler) {
25
+ const definition = {
26
+ kind: "definition",
27
+ config,
28
+ name: config.name,
29
+ ...config.version === void 0 ? {} : { version: config.version }
30
+ };
31
+ return {
32
+ kind: "implementation",
33
+ definition,
34
+ config: definition.config,
35
+ name: definition.name,
36
+ ...definition.version === void 0 ? {} : { version: definition.version },
37
+ handler
38
+ };
39
+ }
40
+ /** Defines workflow message channel for durable workflow use. */
41
+ function defineMessageChannel(config) {
42
+ const name = config.name;
43
+ return {
44
+ name,
45
+ ...config.schema === void 0 ? {} : { schema: config.schema },
46
+ resolveMessageId: (...args) => {
47
+ return config.resolveMessageId?.(...args) ?? name;
48
+ }
49
+ };
50
+ }
51
+ /** Normalizes and parses workflow message channel send. */
52
+ async function resolveMessageChannelSend(channel, options = {}) {
53
+ const payload = channel.schema === void 0 ? options.payload : await validateStandardSchema(channel.schema, options.payload, "Workflow message validation failed");
54
+ return {
55
+ messageId: resolveMessageChannelMessageId(channel, options.key),
56
+ ...payload === void 0 ? {} : { payload },
57
+ ...options.idempotencyKey === void 0 ? {} : { idempotencyKey: options.idempotencyKey }
58
+ };
59
+ }
60
+ /** Normalizes and parses workflow message channel wait. */
61
+ function resolveMessageChannelWait(channel, options = {}) {
62
+ return {
63
+ commandId: options.commandId ?? options.name ?? channel.name,
64
+ name: options.name ?? channel.name,
65
+ messageId: resolveMessageChannelMessageId(channel, options.key),
66
+ ...options.timeout === void 0 ? {} : { timeout: options.timeout },
67
+ ...channel.schema === void 0 ? {} : { schema: channel.schema }
68
+ };
69
+ }
70
+ function resolveMessageChannelMessageId(channel, key) {
71
+ return channel.resolveMessageId(...workflowMessageChannelKeyArgs(key));
72
+ }
73
+ function workflowMessageChannelKeyArgs(key) {
74
+ return key === void 0 ? [] : [key];
75
+ }
76
+ /** Parses raw workflow input against the definition schema when one is configured. */
77
+ async function parseWorkflowInput(definition, input) {
78
+ const schema = definition.config.schema;
79
+ if (schema === void 0) return input;
80
+ return await validateStandardSchema(schema, input, "Workflow input validation failed");
81
+ }
82
+ //#endregion
83
+ export { defineMessageChannel, defineWorkflow, defineWorkflowFromName, defineWorkflowFromTarget, implementWorkflow, parseWorkflowInput, resolveMessageChannelSend, resolveMessageChannelWait };
@@ -0,0 +1,10 @@
1
+ import { WorkflowDefinition } from "../types/definition.mjs";
2
+ import { WorkflowStepRunWorkflowOptions, WorkflowStepStartWorkflowOptions, WorkflowStepWorkflowApi } from "../types/step.mjs";
3
+ import { WorkflowExecutionEnvironment, WorkflowRunCanceler, WorkflowRunStarter } from "../types/engine.mjs";
4
+ //#region src/engine/child-workflow.d.ts
5
+ interface WorkflowChildWorkflowEngine extends WorkflowRunStarter, WorkflowRunCanceler {}
6
+ declare function createWorkflowStepWorkflowApi(environment: WorkflowExecutionEnvironment, engine: WorkflowChildWorkflowEngine): WorkflowStepWorkflowApi;
7
+ declare function runChildWorkflow<TInput, TOutput, TRawInput = TInput>(environment: WorkflowExecutionEnvironment, engine: WorkflowChildWorkflowEngine, definition: WorkflowDefinition<TInput, TOutput, TRawInput>, input: TRawInput, options: WorkflowStepRunWorkflowOptions | undefined): Promise<TOutput>;
8
+ declare function startBackgroundChildWorkflow<TInput, TOutput, TRawInput = TInput>(environment: WorkflowExecutionEnvironment, engine: WorkflowChildWorkflowEngine, definition: WorkflowDefinition<TInput, TOutput, TRawInput>, input: TRawInput, options: WorkflowStepStartWorkflowOptions | undefined): Promise<string>;
9
+ //#endregion
10
+ export { WorkflowChildWorkflowEngine, createWorkflowStepWorkflowApi, runChildWorkflow, startBackgroundChildWorkflow };
@@ -0,0 +1,333 @@
1
+ import { WorkflowOptionsError } from "../errors/base.mjs";
2
+ import { WorkflowDurationError, WorkflowReplayDivergenceError } from "../errors/failures.mjs";
3
+ import { WorkflowChildWorkflowTimeoutError, WorkflowRunCanceledError, WorkflowRunInvalidError } from "../errors/run.mjs";
4
+ import { getRequiredRun, isPositiveSafeInteger, nextPositiveSafeInteger, safeDuration } from "../utility.mjs";
5
+ import { WorkflowStepAttemptLimitError, WorkflowStepExecutionError } from "../errors/step.mjs";
6
+ import { defineWorkflowFromTarget } from "../definition.mjs";
7
+ import { workflowErrorFromRecord } from "../errors/records.mjs";
8
+ import { serializeError, toOptionalPersistedValue } from "./serialization.mjs";
9
+ import { enforceStepAttemptBudget, nextRetryAt, resolveChildWorkflowRetryConfig } from "./retry.mjs";
10
+ import { WorkflowSuspended, requireCurrentExecutionOwner } from "./state.mjs";
11
+ import { resolveWorkflowCommandIdentityFromCandidates } from "./command-identity.mjs";
12
+ import { appendDurableStepStartedEvent, appendDurableStepTerminalEvent } from "./durable-command.mjs";
13
+ import { requireRecordedDurableTerminalStarted } from "./replay.mjs";
14
+ import { deepEquals } from "@temelj/value";
15
+ //#region src/engine/child-workflow.ts
16
+ function createWorkflowStepWorkflowApi(environment, engine) {
17
+ return {
18
+ async run(workflow, input, options) {
19
+ return await runChildWorkflow(environment, engine, defineWorkflowFromTarget(workflow), input, options);
20
+ },
21
+ async start(workflow, input, options) {
22
+ return await startBackgroundChildWorkflow(environment, engine, defineWorkflowFromTarget(workflow), input, options);
23
+ }
24
+ };
25
+ }
26
+ async function runChildWorkflow(environment, engine, definition, input, options) {
27
+ const { store, runId, history, now, maximumStepAttemptsPerRun, limits, executionOwner } = environment;
28
+ const identity = resolveWorkflowCommandIdentityFromCandidates(history, "workflow", [
29
+ options?.commandId,
30
+ options?.name,
31
+ definition.name
32
+ ], "Workflow child commandId, name, or definition name");
33
+ const started = history.startedChildWorkflow(identity.id);
34
+ const completed = history.completedChildWorkflow(identity.id);
35
+ if (completed !== void 0) {
36
+ requireRecordedDurableTerminalStarted(identity, history.hasStartedEventBeforeTerminalEvent(completed));
37
+ if (started === void 0 || isChildWorkflowTerminalForStartedAttempt(completed, started)) {
38
+ requireChildWorkflowReplayMatches(runId, identity, started, definition, input, options, limits);
39
+ recordedChildWorkflowCompletionTimestamp(identity, completed.timestamp);
40
+ return completed.result;
41
+ }
42
+ }
43
+ const retry = resolveChildWorkflowRetryConfig(options);
44
+ const failed = history.failedChildWorkflow(identity.id);
45
+ if (failed !== void 0) requireRecordedDurableTerminalStarted(identity, history.hasStartedEventBeforeTerminalEvent(failed));
46
+ if (started !== void 0) {
47
+ requireRecordedChildWorkflowStartedAttempt(identity, started);
48
+ requireChildWorkflowReplayMatches(runId, identity, started, definition, input, options, limits);
49
+ }
50
+ const pollInterval = resolveChildWorkflowPollInterval(options);
51
+ const latestFailedAttempt = failed !== void 0 && (started === void 0 || isChildWorkflowTerminalForStartedAttempt(failed, started)) ? failed : void 0;
52
+ if (latestFailedAttempt !== void 0) {
53
+ const failedAt = recordedChildWorkflowFailureTimestamp(identity, latestFailedAttempt.timestamp);
54
+ const nextAttempt = nextChildWorkflowRetryAttempt(runId, latestFailedAttempt.attempt, maximumStepAttemptsPerRun);
55
+ if (retry.maximumAttempts !== 0 && nextAttempt > retry.maximumAttempts) WorkflowStepExecutionError.failed({
56
+ stepId: identity.id,
57
+ stepName: identity.name,
58
+ attempt: latestFailedAttempt.attempt,
59
+ cause: workflowErrorFromRecord(latestFailedAttempt.error)
60
+ });
61
+ const retryAt = nextRetryAt(failedAt, retry, latestFailedAttempt.attempt, "Workflow step retry delay");
62
+ if (retryAt !== void 0 && Temporal.Instant.compare(retryAt, now()) > 0) WorkflowSuspended.forStepRetry(retryAt, identity, nextAttempt);
63
+ }
64
+ const attempt = latestFailedAttempt === void 0 ? started?.attempt ?? 1 : latestFailedAttempt.attempt + 1;
65
+ const childRunId = started === void 0 || latestFailedAttempt !== void 0 ? await startChildWorkflow(store, engine, runId, history, now, maximumStepAttemptsPerRun, identity, definition, input, options, attempt, limits, executionOwner, environment.createRecordedId, environment.createDeterministicRandom, environment.createDeterministicUuid, environment.createDeterministicBytes, environment.telemetry, environment.logger, environment.replaying, environment.observeChildWorkflowStarted) : started.childRunId;
66
+ const childRun = await getRequiredRun(store, childRunId);
67
+ const activeStarted = history.startedChildWorkflow(identity.id);
68
+ const timeoutAt = activeStarted?.timeoutAt === void 0 ? void 0 : recordedChildWorkflowTimeoutAt(identity, activeStarted.timeoutAt);
69
+ if (!childRunMatchesParentStepAttempt(childRun, runId, identity, attempt)) WorkflowSuspended.until(childWorkflowPollAt(now(), childRun, pollInterval));
70
+ if (timeoutAt !== void 0 && Temporal.Instant.compare(timeoutAt, now()) <= 0 && childRun.status !== "completed" && childRun.status !== "failed" && childRun.status !== "canceled") {
71
+ const error = childWorkflowTimeoutErrorRecord({
72
+ runId,
73
+ childRunId,
74
+ stepId: identity.id,
75
+ timeoutAt
76
+ });
77
+ await appendDurableStepTerminalEvent(environment, {
78
+ kind: "child_workflow_failed",
79
+ timestamp: now(),
80
+ stepId: identity.id,
81
+ stepName: identity.name,
82
+ attempt,
83
+ childRunId,
84
+ error
85
+ });
86
+ await requireCurrentExecutionOwner(store, runId, executionOwner);
87
+ await engine.cancelRun(childRunId);
88
+ if (retry.maximumAttempts === 0 || attempt < retry.maximumAttempts) suspendChildWorkflowRetry(runId, timeoutAt, retry, identity, attempt, maximumStepAttemptsPerRun);
89
+ WorkflowStepExecutionError.failed({
90
+ stepId: identity.id,
91
+ stepName: identity.name,
92
+ attempt,
93
+ cause: workflowErrorFromRecord(error)
94
+ });
95
+ }
96
+ if (childRun.status === "completed") {
97
+ await appendDurableStepTerminalEvent(environment, {
98
+ kind: "child_workflow_completed",
99
+ timestamp: now(),
100
+ stepId: identity.id,
101
+ stepName: identity.name,
102
+ attempt,
103
+ childRunId,
104
+ result: childRun.output
105
+ });
106
+ return childRun.output;
107
+ }
108
+ if (childRun.status === "failed" || childRun.status === "canceled") {
109
+ const error = childRun.error ?? (childRun.status === "canceled" ? serializeError(WorkflowRunCanceledError.create(childRun.id)) : {
110
+ name: "WorkflowError",
111
+ message: `Child workflow failed: ${childRun.id}`
112
+ });
113
+ const failedAt = childRun.finishedAt === void 0 ? now() : childRun.finishedAt instanceof Temporal.Instant ? childRun.finishedAt : (() => {
114
+ WorkflowRunInvalidError.invalid(childRun.id, "Workflow child failure timestamp must be valid");
115
+ })();
116
+ await appendDurableStepTerminalEvent(environment, {
117
+ kind: "child_workflow_failed",
118
+ timestamp: failedAt,
119
+ stepId: identity.id,
120
+ stepName: identity.name,
121
+ attempt,
122
+ childRunId,
123
+ error
124
+ });
125
+ if (childRun.status === "canceled") WorkflowStepExecutionError.failed({
126
+ stepId: identity.id,
127
+ stepName: identity.name,
128
+ attempt,
129
+ cause: workflowErrorFromRecord(error)
130
+ });
131
+ if (retry.maximumAttempts === 0 || attempt < retry.maximumAttempts) {
132
+ const nextAttempt = nextChildWorkflowRetryAttempt(runId, attempt, maximumStepAttemptsPerRun);
133
+ WorkflowSuspended.forStepRetry(nextRetryAt(failedAt, retry, attempt, "Workflow step retry delay") ?? failedAt, identity, nextAttempt);
134
+ }
135
+ WorkflowStepExecutionError.failed({
136
+ stepId: identity.id,
137
+ stepName: identity.name,
138
+ attempt,
139
+ cause: workflowErrorFromRecord(error)
140
+ });
141
+ }
142
+ WorkflowSuspended.until(childWorkflowPollAt(now(), childRun, pollInterval));
143
+ }
144
+ async function startBackgroundChildWorkflow(environment, engine, definition, input, options) {
145
+ const { store, runId, history, now, maximumStepAttemptsPerRun, limits, executionOwner } = environment;
146
+ const identity = resolveWorkflowCommandIdentityFromCandidates(history, "workflow", [
147
+ options?.commandId,
148
+ options?.name,
149
+ definition.name
150
+ ], "Workflow child commandId, name, or definition name");
151
+ const started = history.startedChildWorkflow(identity.id);
152
+ if (started !== void 0) {
153
+ requireRecordedChildWorkflowStartedAttempt(identity, started);
154
+ requireChildWorkflowReplayMatches(runId, identity, started, definition, input, options, limits);
155
+ return started.childRunId;
156
+ }
157
+ return await startChildWorkflow(store, engine, runId, history, now, maximumStepAttemptsPerRun, identity, definition, input, options, 1, limits, executionOwner, environment.createRecordedId, environment.createDeterministicRandom, environment.createDeterministicUuid, environment.createDeterministicBytes, environment.telemetry, environment.logger, environment.replaying, environment.observeChildWorkflowStarted);
158
+ }
159
+ function childRunMatchesParentStepAttempt(childRun, parentRunId, identity, attempt) {
160
+ return childRun.parentRunId === parentRunId && childRun.parentStepId === identity.id && childRun.parentStepName === identity.name && childRun.parentStepAttempt === attempt;
161
+ }
162
+ function isChildWorkflowTerminalForStartedAttempt(terminal, started) {
163
+ return terminal.attempt === started.attempt && terminal.childRunId === started.childRunId;
164
+ }
165
+ function recordedChildWorkflowTimeoutAt(identity, value) {
166
+ if (value instanceof Temporal.Instant) return value;
167
+ WorkflowReplayDivergenceError.diverged(`recorded workflow step ${identity.id} has invalid timeout timestamp: ` + String(value), {
168
+ expectedStepId: identity.id,
169
+ actualStepId: identity.id
170
+ });
171
+ }
172
+ function recordedChildWorkflowCompletionTimestamp(identity, value) {
173
+ if (value instanceof Temporal.Instant) return value;
174
+ WorkflowReplayDivergenceError.diverged(`recorded workflow step ${identity.id} has invalid completion timestamp: ` + String(value), {
175
+ expectedStepId: identity.id,
176
+ actualStepId: identity.id
177
+ });
178
+ }
179
+ function recordedChildWorkflowFailureTimestamp(identity, value) {
180
+ if (value instanceof Temporal.Instant) return value;
181
+ WorkflowReplayDivergenceError.diverged(`recorded workflow step ${identity.id} has invalid failure timestamp: ` + String(value), {
182
+ expectedStepId: identity.id,
183
+ actualStepId: identity.id
184
+ });
185
+ }
186
+ function requireChildWorkflowReplayMatches(runId, identity, started, definition, input, options, limits) {
187
+ if (started === void 0) return;
188
+ const replayChildRunId = options?.id === void 0 ? void 0 : started.attempt === 1 ? options.id : `${options.id}:attempt:${started.attempt}`;
189
+ const replayIdempotencyKey = childWorkflowIdempotencyKey(runId, identity, options, started.attempt);
190
+ const replayCancellation = resolveChildWorkflowCancellationPolicy(options);
191
+ if (started.workflowName === definition.name && started.workflowVersion === definition.version && (replayChildRunId === void 0 || started.childRunId === replayChildRunId) && started.idempotencyKey === replayIdempotencyKey && (started.cancellation ?? "cascade") === replayCancellation && deepEquals(started.input, toOptionalPersistedValue(input, "child workflow input", limits)) && started.timeoutAt === void 0 === (options?.timeout === void 0)) return;
192
+ const recordedWorkflow = started.workflowVersion === void 0 ? started.workflowName : `${started.workflowName}@${started.workflowVersion}`;
193
+ const replayWorkflow = definition.version === void 0 ? definition.name : `${definition.name}@${definition.version}`;
194
+ let message;
195
+ if (recordedWorkflow !== replayWorkflow) message = `recorded workflow step ${identity.id} targeted ${recordedWorkflow}, but replay targeted ${replayWorkflow}`;
196
+ else if (replayChildRunId !== void 0 && started.childRunId !== replayChildRunId) message = `recorded workflow step ${identity.id} started child run ${started.childRunId}, but replay requested child run ${replayChildRunId}`;
197
+ else if (started.idempotencyKey !== replayIdempotencyKey) {
198
+ const recordedIdempotencyKey = started.idempotencyKey ?? "no idempotency key";
199
+ message = `recorded workflow step ${identity.id} used child idempotency key ${recordedIdempotencyKey}, but replay used ${replayIdempotencyKey}`;
200
+ } else if ((started.cancellation ?? "cascade") !== replayCancellation) message = `recorded workflow step ${identity.id} used child cancellation policy ${started.cancellation ?? "cascade"}, but replay used ${replayCancellation}`;
201
+ else if (!deepEquals(started.input, toOptionalPersistedValue(input, "child workflow input", limits))) message = `recorded workflow step ${identity.id} targeted ${recordedWorkflow} with different input`;
202
+ else {
203
+ const recordedTimeout = started.timeoutAt === void 0 ? "no timeout" : started.timeoutAt;
204
+ const replayTimeout = options?.timeout === void 0 ? "no timeout" : "a timeout";
205
+ message = `recorded workflow step ${identity.id} had ${String(recordedTimeout)}, but replay used ${replayTimeout}`;
206
+ }
207
+ WorkflowReplayDivergenceError.diverged(message, {
208
+ expectedStepId: identity.id,
209
+ actualStepId: identity.id
210
+ });
211
+ }
212
+ function requireRecordedChildWorkflowStartedAttempt(identity, started) {
213
+ if (isPositiveSafeInteger(started.attempt)) return;
214
+ WorkflowReplayDivergenceError.diverged(`recorded workflow step ${identity.id} has an invalid attempt number`, {
215
+ expectedStepId: identity.id,
216
+ actualStepId: identity.id
217
+ });
218
+ }
219
+ function suspendChildWorkflowRetry(runId, failedAt, retry, identity, attempt, maximumStepAttemptsPerRun) {
220
+ WorkflowSuspended.forStepRetry(nextRetryAt(failedAt, retry, attempt, "Workflow step retry delay") ?? failedAt, identity, nextChildWorkflowRetryAttempt(runId, attempt, maximumStepAttemptsPerRun));
221
+ }
222
+ function nextChildWorkflowRetryAttempt(runId, failedAttempt, maximumStepAttemptsPerRun) {
223
+ const nextAttempt = nextPositiveSafeInteger(failedAttempt);
224
+ if (nextAttempt === void 0) WorkflowStepAttemptLimitError.exceeded(runId, maximumStepAttemptsPerRun);
225
+ return nextAttempt;
226
+ }
227
+ async function startChildWorkflow(store, engine, runId, history, now, maximumStepAttemptsPerRun, identity, definition, input, options, attempt, limits, executionOwner, createRecordedId, createDeterministicRandom, createDeterministicUuid, createDeterministicBytes, telemetry, logger, replaying, observeChildWorkflowStarted) {
228
+ await requireCurrentExecutionOwner(store, runId, executionOwner);
229
+ enforceStepAttemptBudget(runId, history, maximumStepAttemptsPerRun);
230
+ const timeoutAt = childWorkflowTimeoutAt(now(), options);
231
+ const deadlineAt = childWorkflowDeadlineAt(timeoutAt, executionOwner.deadlineAt);
232
+ const idempotencyKey = childWorkflowIdempotencyKey(runId, identity, options, attempt);
233
+ const cancellation = resolveChildWorkflowCancellationPolicy(options);
234
+ const persistedInput = toOptionalPersistedValue(input, "child workflow input", limits);
235
+ const handle = await engine.startWorkflow(definition, input, {
236
+ ...options?.id === void 0 ? {} : { id: attempt === 1 ? options.id : `${options.id}:attempt:${attempt}` },
237
+ idempotencyKey,
238
+ ...deadlineAt === void 0 ? {} : { deadlineAt },
239
+ parent: {
240
+ runId,
241
+ stepId: identity.id,
242
+ stepName: identity.name,
243
+ stepAttempt: attempt
244
+ }
245
+ });
246
+ const startedEvent = {
247
+ kind: "child_workflow_started",
248
+ timestamp: now(),
249
+ stepId: identity.id,
250
+ stepName: identity.name,
251
+ count: identity.count,
252
+ attempt,
253
+ childRunId: handle.runId,
254
+ workflowName: definition.name,
255
+ ...definition.version === void 0 ? {} : { workflowVersion: definition.version },
256
+ cancellation,
257
+ input: persistedInput,
258
+ idempotencyKey,
259
+ ...timeoutAt === void 0 ? {} : { timeoutAt }
260
+ };
261
+ await appendDurableStepStartedEvent({
262
+ store,
263
+ runId,
264
+ history,
265
+ now,
266
+ createRecordedId,
267
+ createDeterministicRandom,
268
+ createDeterministicUuid,
269
+ createDeterministicBytes,
270
+ maximumStepAttemptsPerRun,
271
+ limits,
272
+ executionOwner,
273
+ telemetry,
274
+ logger,
275
+ replaying
276
+ }, startedEvent);
277
+ observeChildWorkflowStarted?.(runId, startedEvent);
278
+ return handle.runId;
279
+ }
280
+ function childWorkflowPollAt(now, childRun, pollInterval) {
281
+ if (hasDueChildSchedule(now, childRun)) return now.add(Temporal.Duration.from({ milliseconds: Math.min(pollInterval, 100) }));
282
+ return [
283
+ childRun.availableAt,
284
+ childRun.retryAt,
285
+ childRun.deadlineAt,
286
+ childRun.leaseExpiresAt,
287
+ now.add(Temporal.Duration.from({ milliseconds: pollInterval }))
288
+ ].filter((value) => value !== void 0).filter((value) => Temporal.Instant.compare(value, now) > 0).sort((left, right) => Temporal.Instant.compare(left, right))[0] ?? now;
289
+ }
290
+ function resolveChildWorkflowPollInterval(options) {
291
+ const pollInterval = options?.pollInterval === void 0 ? 100 : options.pollInterval.total({ unit: "millisecond" });
292
+ if (!isPositiveSafeInteger(pollInterval)) WorkflowDurationError.childPollIntervalTimerSafe();
293
+ return pollInterval;
294
+ }
295
+ function hasDueChildSchedule(now, childRun) {
296
+ return childRun.availableAt !== void 0 && Temporal.Instant.compare(childRun.availableAt, now) <= 0 || childRun.retryAt !== void 0 && Temporal.Instant.compare(childRun.retryAt, now) <= 0 || childRun.deadlineAt !== void 0 && Temporal.Instant.compare(childRun.deadlineAt, now) <= 0 || childRun.leaseExpiresAt !== void 0 && Temporal.Instant.compare(childRun.leaseExpiresAt, now) <= 0;
297
+ }
298
+ function childWorkflowTimeoutAt(now, options) {
299
+ if (options?.timeout === void 0) return;
300
+ if (safeDuration(options.timeout.total({ unit: "millisecond" }), "Workflow child timeout") <= 0) WorkflowDurationError.childTimeoutPositive();
301
+ return now.add(options.timeout);
302
+ }
303
+ function resolveChildWorkflowCancellationPolicy(options) {
304
+ const policy = options?.cancellation ?? "cascade";
305
+ if (policy !== "cascade" && policy !== "detach") WorkflowOptionsError.childCancellationPolicy();
306
+ return policy;
307
+ }
308
+ function childWorkflowDeadlineAt(timeoutAt, parentDeadlineAt) {
309
+ return [timeoutAt, parentDeadlineAt].filter((value) => value !== void 0).sort((left, right) => Temporal.Instant.compare(left, right))[0];
310
+ }
311
+ function childWorkflowTimeoutErrorRecord(options) {
312
+ const error = WorkflowChildWorkflowTimeoutError.create({
313
+ runId: options.runId,
314
+ childRunId: options.childRunId,
315
+ stepId: options.stepId,
316
+ timeoutAt: options.timeoutAt
317
+ });
318
+ return {
319
+ name: error.name,
320
+ message: error.message,
321
+ details: {
322
+ runId: error.runId,
323
+ childRunId: error.childRunId,
324
+ stepId: error.stepId,
325
+ timeoutAt: error.timeoutAt.toString()
326
+ }
327
+ };
328
+ }
329
+ function childWorkflowIdempotencyKey(runId, identity, options, attempt) {
330
+ return `${options?.idempotencyKey === void 0 ? `parent:${runId}:step:${identity.id}` : options.idempotencyKey}:attempt:${attempt}`;
331
+ }
332
+ //#endregion
333
+ export { createWorkflowStepWorkflowApi, runChildWorkflow, startBackgroundChildWorkflow };
@@ -0,0 +1,9 @@
1
+ import { WorkflowStepIdentity, WorkflowStepType } from "../types/run.mjs";
2
+ import { WorkflowHistory } from "../history/mod.mjs";
3
+ //#region src/engine/command-identity.d.ts
4
+ /** Resolves the durable identity for a workflow command occurrence. */
5
+ declare function resolveWorkflowCommandIdentity<TType extends WorkflowStepType>(history: WorkflowHistory, kind: TType, commandId: string): WorkflowStepIdentity<TType>;
6
+ /** Resolves a durable command identity from ordered command-name candidates. */
7
+ declare function resolveWorkflowCommandIdentityFromCandidates<TType extends WorkflowStepType>(history: WorkflowHistory, kind: TType, candidates: readonly (string | undefined)[], label: string): WorkflowStepIdentity<TType>;
8
+ //#endregion
9
+ export { resolveWorkflowCommandIdentity, resolveWorkflowCommandIdentityFromCandidates };
@@ -0,0 +1,14 @@
1
+ import { WorkflowOptionsError } from "../errors/base.mjs";
2
+ import "../errors/mod.mjs";
3
+ //#region src/engine/command-identity.ts
4
+ /** Resolves the durable identity for a workflow command occurrence. */
5
+ function resolveWorkflowCommandIdentity(history, kind, commandId) {
6
+ return history.nextStep(kind, commandId);
7
+ }
8
+ /** Resolves a durable command identity from ordered command-name candidates. */
9
+ function resolveWorkflowCommandIdentityFromCandidates(history, kind, candidates, label) {
10
+ for (const candidate of candidates) if (candidate !== void 0) return resolveWorkflowCommandIdentity(history, kind, candidate);
11
+ throw WorkflowOptionsError.required(label);
12
+ }
13
+ //#endregion
14
+ export { resolveWorkflowCommandIdentity, resolveWorkflowCommandIdentityFromCandidates };