@temelj/workflow 0.0.0-alpha.2 → 0.0.0-alpha.4

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 (461) hide show
  1. package/README.md +394 -2
  2. package/dist/attributes.d.mts +11 -9
  3. package/dist/attributes.mjs +23 -5
  4. package/dist/bundle.d.mts +5 -23
  5. package/dist/bundle.mjs +2 -18
  6. package/dist/client/create.d.mts +26 -23
  7. package/dist/client/create.mjs +26 -32
  8. package/dist/client/facades.d.mts +12 -18
  9. package/dist/client/facades.mjs +102 -93
  10. package/dist/client/mod.mjs +1 -2
  11. package/dist/client/run-handle.d.mts +17 -54
  12. package/dist/client/run-handle.mjs +35 -105
  13. package/dist/client/worker-options.d.mts +8 -8
  14. package/dist/client/worker-options.mjs +11 -11
  15. package/dist/cloudflare/cloudflare.d.mts +4 -5
  16. package/dist/cloudflare/codec.d.mts +28 -13
  17. package/dist/cloudflare/codec.mjs +40 -17
  18. package/dist/cloudflare/entrypoint.d.mts +3 -4
  19. package/dist/cloudflare/entrypoint.mjs +4 -3
  20. package/dist/cloudflare/execution.d.mts +3 -4
  21. package/dist/cloudflare/execution.mjs +20 -13
  22. package/dist/cloudflare/host.d.mts +6 -7
  23. package/dist/cloudflare/host.mjs +7 -6
  24. package/dist/cloudflare/mod.d.mts +4 -4
  25. package/dist/cloudflare/mod.mjs +2 -2
  26. package/dist/cloudflare/name.d.mts +3 -4
  27. package/dist/cloudflare/name.mjs +3 -3
  28. package/dist/cloudflare/registry.d.mts +3 -23
  29. package/dist/cloudflare/registry.mjs +2 -20
  30. package/dist/cloudflare/runtime.d.mts +11 -18
  31. package/dist/cloudflare/runtime.mjs +52 -73
  32. package/dist/cloudflare/step.d.mts +6 -6
  33. package/dist/cloudflare/step.mjs +69 -57
  34. package/dist/cloudflare/types.d.mts +17 -36
  35. package/dist/collection.d.mts +8 -11
  36. package/dist/collection.mjs +10 -14
  37. package/dist/compiled-function.d.mts +14 -19
  38. package/dist/compiled-function.mjs +12 -24
  39. package/dist/compiled.d.mts +4 -0
  40. package/dist/compiled.mjs +4 -0
  41. package/dist/compiler/ast.d.mts +26 -0
  42. package/dist/{vite → compiler}/ast.mjs +24 -16
  43. package/dist/{vite → compiler}/error.d.mts +4 -6
  44. package/dist/{vite → compiler}/error.mjs +14 -16
  45. package/dist/compiler/manifest.d.mts +6 -0
  46. package/dist/{vite → compiler}/manifest.mjs +9 -7
  47. package/dist/compiler/plugin.d.mts +7 -0
  48. package/dist/{vite → compiler}/plugin.mjs +45 -46
  49. package/dist/compiler/safety.d.mts +12 -0
  50. package/dist/{vite → compiler}/safety.mjs +5 -11
  51. package/dist/{vite → compiler}/source-edit.d.mts +3 -4
  52. package/dist/{vite → compiler}/source-edit.mjs +1 -1
  53. package/dist/{vite → compiler}/source-map.d.mts +4 -3
  54. package/dist/{vite → compiler}/source-map.mjs +3 -3
  55. package/dist/compiler/source.d.mts +7 -0
  56. package/dist/{vite → compiler}/source.mjs +1 -1
  57. package/dist/compiler/transform.d.mts +12 -0
  58. package/dist/{vite → compiler}/transform.mjs +37 -38
  59. package/dist/definition.d.mts +17 -25
  60. package/dist/definition.mjs +19 -35
  61. package/dist/engine/child-workflow.d.mts +5 -9
  62. package/dist/engine/child-workflow.mjs +46 -67
  63. package/dist/engine/command-identity.d.mts +5 -6
  64. package/dist/engine/command-identity.mjs +9 -5
  65. package/dist/engine/context.d.mts +17 -0
  66. package/dist/engine/create.d.mts +36 -94
  67. package/dist/engine/create.mjs +55 -260
  68. package/dist/engine/deterministic.d.mts +6 -11
  69. package/dist/engine/deterministic.mjs +47 -68
  70. package/dist/engine/durable-command.d.mts +5 -5
  71. package/dist/engine/durable-command.mjs +2 -2
  72. package/dist/engine/execution-service.d.mts +20 -24
  73. package/dist/engine/execution-service.mjs +54 -52
  74. package/dist/engine/hooks.d.mts +17 -39
  75. package/dist/engine/hooks.mjs +73 -94
  76. package/dist/engine/inspection.d.mts +23 -15
  77. package/dist/engine/inspection.mjs +55 -29
  78. package/dist/engine/lifecycle.d.mts +6 -12
  79. package/dist/engine/lifecycle.mjs +5 -5
  80. package/dist/engine/lock-replay.d.mts +8 -15
  81. package/dist/engine/lock-replay.mjs +12 -25
  82. package/dist/engine/lock.d.mts +10 -15
  83. package/dist/engine/lock.mjs +65 -51
  84. package/dist/engine/message.d.mts +14 -34
  85. package/dist/engine/message.mjs +94 -127
  86. package/dist/engine/observation.d.mts +9 -11
  87. package/dist/engine/observation.mjs +18 -27
  88. package/dist/engine/replay.d.mts +18 -19
  89. package/dist/engine/replay.mjs +32 -56
  90. package/dist/engine/resume.d.mts +16 -0
  91. package/dist/engine/resume.mjs +24 -0
  92. package/dist/engine/retry.d.mts +15 -19
  93. package/dist/engine/retry.mjs +17 -17
  94. package/dist/engine/run-data.d.mts +4 -8
  95. package/dist/engine/run-data.mjs +24 -22
  96. package/dist/engine/run-service.d.mts +24 -33
  97. package/dist/engine/run-service.mjs +125 -93
  98. package/dist/engine/run-utils.d.mts +11 -13
  99. package/dist/engine/run-utils.mjs +23 -46
  100. package/dist/engine/schedule.d.mts +8 -22
  101. package/dist/engine/schedule.mjs +37 -34
  102. package/dist/engine/serialization.d.mts +9 -6
  103. package/dist/engine/serialization.mjs +30 -21
  104. package/dist/engine/signals.d.mts +23 -0
  105. package/dist/engine/signals.mjs +41 -0
  106. package/dist/engine/start.d.mts +18 -0
  107. package/dist/engine/start.mjs +88 -0
  108. package/dist/engine/state.d.mts +37 -67
  109. package/dist/engine/state.mjs +127 -282
  110. package/dist/engine/step-api.d.mts +5 -8
  111. package/dist/engine/step-api.mjs +16 -16
  112. package/dist/engine/stream-reader.d.mts +12 -0
  113. package/dist/engine/stream-reader.mjs +154 -0
  114. package/dist/engine/stream.d.mts +9 -54
  115. package/dist/engine/stream.mjs +54 -196
  116. package/dist/engine/summary/recovery.d.mts +35 -0
  117. package/dist/engine/summary/recovery.mjs +363 -0
  118. package/dist/engine/summary/runs.d.mts +43 -0
  119. package/dist/engine/summary/runs.mjs +294 -0
  120. package/dist/engine/summary/step-attempts.d.mts +5 -10
  121. package/dist/engine/summary/step-attempts.mjs +157 -36
  122. package/dist/engine/summary/tally.d.mts +44 -0
  123. package/dist/engine/summary/tally.mjs +142 -0
  124. package/dist/engine/task.d.mts +4 -5
  125. package/dist/engine/task.mjs +40 -48
  126. package/dist/errors/base.d.mts +17 -77
  127. package/dist/errors/base.mjs +26 -327
  128. package/dist/errors/capability.d.mts +3 -6
  129. package/dist/errors/capability.mjs +4 -8
  130. package/dist/errors/codes.d.mts +116 -0
  131. package/dist/{types/error-code.mjs → errors/codes.mjs} +2 -17
  132. package/dist/errors/definition.d.mts +3 -17
  133. package/dist/errors/definition.mjs +5 -42
  134. package/dist/errors/failures.d.mts +17 -51
  135. package/dist/errors/failures.mjs +35 -102
  136. package/dist/errors/hook.d.mts +5 -9
  137. package/dist/errors/hook.mjs +4 -16
  138. package/dist/errors/implementation.d.mts +3 -6
  139. package/dist/errors/implementation.mjs +7 -12
  140. package/dist/errors/lock.d.mts +7 -20
  141. package/dist/errors/lock.mjs +8 -44
  142. package/dist/errors/message.d.mts +14 -59
  143. package/dist/errors/message.mjs +13 -39
  144. package/dist/errors/mod.d.mts +4 -5
  145. package/dist/errors/mod.mjs +5 -7
  146. package/dist/errors/records.d.mts +10 -4
  147. package/dist/errors/records.mjs +256 -256
  148. package/dist/errors/run.d.mts +27 -68
  149. package/dist/errors/run.mjs +31 -85
  150. package/dist/errors/schedule.d.mts +7 -18
  151. package/dist/errors/schedule.mjs +7 -39
  152. package/dist/errors/step.d.mts +12 -45
  153. package/dist/errors/step.mjs +13 -34
  154. package/dist/errors/stream.d.mts +8 -16
  155. package/dist/errors/stream.mjs +7 -41
  156. package/dist/esbuild.d.mts +6 -4
  157. package/dist/esbuild.mjs +2 -1
  158. package/dist/events/descriptors.d.mts +12 -241
  159. package/dist/events/descriptors.mjs +12 -5
  160. package/dist/history/projection.d.mts +4 -6
  161. package/dist/history/projection.mjs +22 -26
  162. package/dist/history/replay-projection.d.mts +44 -48
  163. package/dist/history/replay-projection.mjs +41 -50
  164. package/dist/history/{mod.d.mts → replay.d.mts} +16 -21
  165. package/dist/history/{mod.mjs → replay.mjs} +21 -25
  166. package/dist/history/sequencer.d.mts +10 -11
  167. package/dist/history/sequencer.mjs +11 -7
  168. package/dist/history/step-attempts.d.mts +4 -7
  169. package/dist/history/step-attempts.mjs +8 -9
  170. package/dist/history/timeline.d.mts +4 -13
  171. package/dist/history/timeline.mjs +46 -265
  172. package/dist/history/validator.d.mts +5 -7
  173. package/dist/history/validator.mjs +9 -24
  174. package/dist/hook-token.d.mts +7 -0
  175. package/dist/hook-token.mjs +32 -0
  176. package/dist/ids.d.mts +8 -0
  177. package/dist/ids.mjs +21 -0
  178. package/dist/message-options.d.mts +11 -5
  179. package/dist/message-options.mjs +9 -7
  180. package/dist/mod.d.mts +32 -36
  181. package/dist/mod.mjs +9 -13
  182. package/dist/otel/metrics.d.mts +31 -0
  183. package/dist/otel/metrics.mjs +60 -0
  184. package/dist/otel/mod.d.mts +3 -0
  185. package/dist/otel/mod.mjs +3 -0
  186. package/dist/otel/spans.d.mts +24 -0
  187. package/dist/otel/spans.mjs +218 -0
  188. package/dist/otel/support.d.mts +15 -8
  189. package/dist/otel/support.mjs +18 -40
  190. package/dist/{otel.d.mts → otel/telemetry.d.mts} +5 -6
  191. package/dist/otel/telemetry.mjs +305 -0
  192. package/dist/pagination.d.mts +6 -12
  193. package/dist/pagination.mjs +10 -14
  194. package/dist/registry.d.mts +8 -5
  195. package/dist/registry.mjs +19 -10
  196. package/dist/rolldown.d.mts +6 -4
  197. package/dist/rolldown.mjs +2 -1
  198. package/dist/rollup.d.mts +6 -4
  199. package/dist/rollup.mjs +2 -1
  200. package/dist/rspack.d.mts +6 -4
  201. package/dist/rspack.mjs +2 -1
  202. package/dist/run-status.d.mts +29 -0
  203. package/dist/run-status.mjs +42 -0
  204. package/dist/schema/common.d.mts +22 -0
  205. package/dist/schema/common.mjs +54 -0
  206. package/dist/schema/error.d.mts +17 -0
  207. package/dist/schema/error.mjs +39 -0
  208. package/dist/schema/events.d.mts +446 -0
  209. package/dist/schema/events.mjs +235 -0
  210. package/dist/schema/pagination.d.mts +5 -0
  211. package/dist/schema/pagination.mjs +11 -0
  212. package/dist/schema/persisted-value.d.mts +8 -0
  213. package/dist/schema/persisted-value.mjs +94 -0
  214. package/dist/schema/run.d.mts +51 -0
  215. package/dist/schema/run.mjs +88 -0
  216. package/dist/schema/store.d.mts +94 -0
  217. package/dist/schema/store.mjs +116 -0
  218. package/dist/step-definition.d.mts +4 -9
  219. package/dist/step-definition.mjs +2 -2
  220. package/dist/store/capabilities.d.mts +8 -9
  221. package/dist/store/capabilities.mjs +7 -7
  222. package/dist/store/cleanup.d.mts +9 -14
  223. package/dist/store/cleanup.mjs +86 -85
  224. package/dist/store/create.d.mts +28 -29
  225. package/dist/store/create.mjs +10 -11
  226. package/dist/store/events.d.mts +48 -0
  227. package/dist/store/events.mjs +263 -0
  228. package/dist/store/indexes.d.mts +25 -0
  229. package/dist/store/indexes.mjs +282 -0
  230. package/dist/store/instrumentation.d.mts +2 -3
  231. package/dist/store/instrumentation.mjs +30 -30
  232. package/dist/store/lock.d.mts +4 -5
  233. package/dist/store/lock.mjs +5 -7
  234. package/dist/store/materialization.d.mts +10 -17
  235. package/dist/store/materialization.mjs +39 -33
  236. package/dist/store/mod.d.mts +3 -3
  237. package/dist/store/mod.mjs +2 -2
  238. package/dist/store/query.d.mts +13 -17
  239. package/dist/store/query.mjs +13 -13
  240. package/dist/store/run.d.mts +25 -34
  241. package/dist/store/run.mjs +67 -108
  242. package/dist/store/schedule.d.mts +6 -8
  243. package/dist/store/schedule.mjs +11 -11
  244. package/dist/store/step-attempt.d.mts +9 -12
  245. package/dist/store/step-attempt.mjs +9 -9
  246. package/dist/store/storage-value.d.mts +3 -3
  247. package/dist/store/storage-value.mjs +17 -1
  248. package/dist/store/validation.d.mts +17 -20
  249. package/dist/store/validation.mjs +30 -33
  250. package/dist/store-keys.d.mts +35 -47
  251. package/dist/store-keys.mjs +9 -17
  252. package/dist/telemetry.d.mts +16 -16
  253. package/dist/telemetry.mjs +3 -3
  254. package/dist/temporal.d.mts +11 -16
  255. package/dist/temporal.mjs +8 -9
  256. package/dist/timer.d.mts +12 -10
  257. package/dist/timer.mjs +11 -3
  258. package/dist/types/cleanup.d.mts +13 -50
  259. package/dist/types/cleanup.mjs +1 -22
  260. package/dist/types/client.d.mts +101 -162
  261. package/dist/types/{vite.d.mts → compiler.d.mts} +17 -24
  262. package/dist/types/compiler.mjs +1 -0
  263. package/dist/types/definition.d.mts +22 -34
  264. package/dist/types/engine-options.d.mts +10 -17
  265. package/dist/types/engine.d.mts +15 -274
  266. package/dist/types/error.d.mts +15 -217
  267. package/dist/types/error.mjs +1 -48
  268. package/dist/types/events.d.mts +59 -2730
  269. package/dist/types/events.mjs +1 -283
  270. package/dist/types/hook.d.mts +27 -85
  271. package/dist/types/hook.mjs +1 -66
  272. package/dist/types/ids.d.mts +9 -0
  273. package/dist/types/ids.mjs +1 -0
  274. package/dist/types/lock.d.mts +8 -26
  275. package/dist/types/lock.mjs +1 -18
  276. package/dist/types/message.d.mts +29 -43
  277. package/dist/types/observation.d.mts +43 -58
  278. package/dist/types/pagination.d.mts +6 -22
  279. package/dist/types/pagination.mjs +1 -13
  280. package/dist/types/result.d.mts +11 -43
  281. package/dist/types/retry.d.mts +7 -14
  282. package/dist/types/run-list.d.mts +9 -11
  283. package/dist/types/run-options.d.mts +25 -32
  284. package/dist/types/run.d.mts +35 -315
  285. package/dist/types/run.mjs +1 -207
  286. package/dist/types/runtime.d.mts +33 -145
  287. package/dist/types/runtime.mjs +1 -21
  288. package/dist/types/schedule.d.mts +13 -72
  289. package/dist/types/schedule.mjs +1 -48
  290. package/dist/types/step-attempts.d.mts +65 -261
  291. package/dist/types/step-attempts.mjs +1 -43
  292. package/dist/types/step.d.mts +66 -77
  293. package/dist/types/step.mjs +1 -5
  294. package/dist/types/store.d.mts +50 -182
  295. package/dist/types/stream.d.mts +19 -40
  296. package/dist/types/summary.d.mts +174 -278
  297. package/dist/types/telemetry.d.mts +23 -28
  298. package/dist/types/telemetry.mjs +1 -9
  299. package/dist/types/timeline.d.mts +46 -233
  300. package/dist/types/worker.d.mts +22 -29
  301. package/dist/values.d.mts +15 -0
  302. package/dist/values.mjs +57 -0
  303. package/dist/vite.d.mts +5 -6
  304. package/dist/vite.mjs +3 -4
  305. package/dist/webpack.d.mts +6 -4
  306. package/dist/webpack.mjs +2 -1
  307. package/dist/worker/error.d.mts +2 -9
  308. package/dist/worker/error.mjs +20 -32
  309. package/dist/worker/missing-implementation.d.mts +19 -0
  310. package/dist/worker/missing-implementation.mjs +62 -0
  311. package/dist/worker/worker.d.mts +18 -0
  312. package/dist/{worker.mjs → worker/worker.mjs} +64 -118
  313. package/package.json +28 -47
  314. package/dist/engine/execution-api.d.mts +0 -29
  315. package/dist/engine/execution-api.mjs +0 -33
  316. package/dist/engine/inspection-api.d.mts +0 -34
  317. package/dist/engine/inspection-api.mjs +0 -78
  318. package/dist/engine/mod.d.mts +0 -4
  319. package/dist/engine/mod.mjs +0 -2
  320. package/dist/engine/recovery.d.mts +0 -26
  321. package/dist/engine/recovery.mjs +0 -92
  322. package/dist/engine/retry-policy.d.mts +0 -4
  323. package/dist/engine/retry-policy.mjs +0 -4
  324. package/dist/engine/start-api.d.mts +0 -30
  325. package/dist/engine/start-api.mjs +0 -99
  326. package/dist/engine/summary/active-events.d.mts +0 -34
  327. package/dist/engine/summary/active-events.mjs +0 -69
  328. package/dist/engine/summary/child-workflow-runs.d.mts +0 -24
  329. package/dist/engine/summary/child-workflow-runs.mjs +0 -138
  330. package/dist/engine/summary/child-workflow-waits.d.mts +0 -21
  331. package/dist/engine/summary/child-workflow-waits.mjs +0 -67
  332. package/dist/engine/summary/recovery-child-workflow-waits.d.mts +0 -11
  333. package/dist/engine/summary/recovery-child-workflow-waits.mjs +0 -89
  334. package/dist/engine/summary/recovery-due-runs.d.mts +0 -16
  335. package/dist/engine/summary/recovery-due-runs.mjs +0 -52
  336. package/dist/engine/summary/recovery-failed-runs.d.mts +0 -14
  337. package/dist/engine/summary/recovery-failed-runs.mjs +0 -33
  338. package/dist/engine/summary/recovery-lease-runs.d.mts +0 -16
  339. package/dist/engine/summary/recovery-lease-runs.mjs +0 -69
  340. package/dist/engine/summary/recovery-locks.d.mts +0 -18
  341. package/dist/engine/summary/recovery-locks.mjs +0 -100
  342. package/dist/engine/summary/recovery-message-waits.d.mts +0 -11
  343. package/dist/engine/summary/recovery-message-waits.mjs +0 -74
  344. package/dist/engine/summary/recovery-retry-runs.d.mts +0 -17
  345. package/dist/engine/summary/recovery-retry-runs.mjs +0 -65
  346. package/dist/engine/summary/recovery-run-timestamps.d.mts +0 -13
  347. package/dist/engine/summary/recovery-run-timestamps.mjs +0 -18
  348. package/dist/engine/summary/recovery-runs.d.mts +0 -23
  349. package/dist/engine/summary/recovery-runs.mjs +0 -54
  350. package/dist/engine/summary/recovery-schedules.d.mts +0 -10
  351. package/dist/engine/summary/recovery-schedules.mjs +0 -46
  352. package/dist/engine/summary/recovery-sleep-waits.d.mts +0 -10
  353. package/dist/engine/summary/recovery-sleep-waits.mjs +0 -53
  354. package/dist/engine/summary/recovery-waits.d.mts +0 -21
  355. package/dist/engine/summary/recovery-waits.mjs +0 -29
  356. package/dist/engine/summary/run-availability.d.mts +0 -13
  357. package/dist/engine/summary/run-availability.mjs +0 -37
  358. package/dist/engine/summary/run-cleanup.d.mts +0 -14
  359. package/dist/engine/summary/run-cleanup.mjs +0 -44
  360. package/dist/engine/summary/run-failure.d.mts +0 -14
  361. package/dist/engine/summary/run-failure.mjs +0 -62
  362. package/dist/engine/summary/run-hooks.d.mts +0 -14
  363. package/dist/engine/summary/run-hooks.mjs +0 -63
  364. package/dist/engine/summary/run-lease.d.mts +0 -11
  365. package/dist/engine/summary/run-lease.mjs +0 -64
  366. package/dist/engine/summary/run-message-waits.d.mts +0 -15
  367. package/dist/engine/summary/run-message-waits.mjs +0 -62
  368. package/dist/engine/summary/run-metrics.d.mts +0 -31
  369. package/dist/engine/summary/run-metrics.mjs +0 -93
  370. package/dist/engine/summary/run-retry.d.mts +0 -9
  371. package/dist/engine/summary/run-retry.mjs +0 -69
  372. package/dist/engine/summary/run-sleeps.d.mts +0 -15
  373. package/dist/engine/summary/run-sleeps.mjs +0 -61
  374. package/dist/engine/summary/run-state.d.mts +0 -26
  375. package/dist/engine/summary/run-state.mjs +0 -48
  376. package/dist/engine/summary/run-status.d.mts +0 -16
  377. package/dist/engine/summary/run-status.mjs +0 -35
  378. package/dist/engine/summary/run-streams.d.mts +0 -14
  379. package/dist/engine/summary/run-streams.mjs +0 -46
  380. package/dist/engine/summary/run-transition.d.mts +0 -9
  381. package/dist/engine/summary/run-transition.mjs +0 -39
  382. package/dist/engine/summary/run-workflow.d.mts +0 -9
  383. package/dist/engine/summary/run-workflow.mjs +0 -47
  384. package/dist/engine/summary/step-attempt-active-child-workflows.d.mts +0 -13
  385. package/dist/engine/summary/step-attempt-active-child-workflows.mjs +0 -55
  386. package/dist/engine/summary/step-attempt-active-fields.d.mts +0 -23
  387. package/dist/engine/summary/step-attempt-active-fields.mjs +0 -14
  388. package/dist/engine/summary/step-attempt-active-message-waits.d.mts +0 -12
  389. package/dist/engine/summary/step-attempt-active-message-waits.mjs +0 -47
  390. package/dist/engine/summary/step-attempt-active-sleeps.d.mts +0 -19
  391. package/dist/engine/summary/step-attempt-active-sleeps.mjs +0 -44
  392. package/dist/engine/summary/step-attempt-buckets.d.mts +0 -22
  393. package/dist/engine/summary/step-attempt-buckets.mjs +0 -152
  394. package/dist/engine/summary/step-attempt-failure.d.mts +0 -12
  395. package/dist/engine/summary/step-attempt-failure.mjs +0 -61
  396. package/dist/engine/summary/step-attempt-lifecycle.d.mts +0 -13
  397. package/dist/engine/summary/step-attempt-lifecycle.mjs +0 -19
  398. package/dist/engine/summary.d.mts +0 -32
  399. package/dist/engine/summary.mjs +0 -37
  400. package/dist/errors/details.d.mts +0 -13
  401. package/dist/errors/details.mjs +0 -66
  402. package/dist/errors/record-view.d.mts +0 -11
  403. package/dist/errors/record-view.mjs +0 -24
  404. package/dist/errors/runtime.d.mts +0 -12
  405. package/dist/errors/runtime.mjs +0 -24
  406. package/dist/events/mod.d.mts +0 -3
  407. package/dist/events/mod.mjs +0 -2
  408. package/dist/history/attempt-key.d.mts +0 -6
  409. package/dist/history/attempt-key.mjs +0 -7
  410. package/dist/inspection/mod.d.mts +0 -5
  411. package/dist/inspection/mod.mjs +0 -3
  412. package/dist/otel.mjs +0 -590
  413. package/dist/runtime.d.mts +0 -35
  414. package/dist/runtime.mjs +0 -198
  415. package/dist/store/append-projection.d.mts +0 -15
  416. package/dist/store/append-projection.mjs +0 -26
  417. package/dist/store/compaction.d.mts +0 -5
  418. package/dist/store/compaction.mjs +0 -8
  419. package/dist/store/event-append-project.d.mts +0 -15
  420. package/dist/store/event-append-project.mjs +0 -77
  421. package/dist/store/event-append.d.mts +0 -37
  422. package/dist/store/event-append.mjs +0 -80
  423. package/dist/store/event-history.d.mts +0 -22
  424. package/dist/store/event-history.mjs +0 -75
  425. package/dist/store/event.d.mts +0 -10
  426. package/dist/store/event.mjs +0 -28
  427. package/dist/store/idempotency.d.mts +0 -10
  428. package/dist/store/idempotency.mjs +0 -167
  429. package/dist/store/message-index.d.mts +0 -21
  430. package/dist/store/message-index.mjs +0 -122
  431. package/dist/store/revision.d.mts +0 -4
  432. package/dist/store/revision.mjs +0 -7
  433. package/dist/store/schema.d.mts +0 -14
  434. package/dist/store/schema.mjs +0 -17
  435. package/dist/types/common.d.mts +0 -20
  436. package/dist/types/common.mjs +0 -16
  437. package/dist/types/error-code.d.mts +0 -256
  438. package/dist/types/message-id.d.mts +0 -7
  439. package/dist/types/message-id.mjs +0 -5
  440. package/dist/types/run-id.d.mts +0 -7
  441. package/dist/types/run-id.mjs +0 -5
  442. package/dist/types/step-id.d.mts +0 -7
  443. package/dist/types/step-id.mjs +0 -5
  444. package/dist/types/stream-id.d.mts +0 -7
  445. package/dist/types/stream-id.mjs +0 -5
  446. package/dist/types/worker-id.d.mts +0 -7
  447. package/dist/types/worker-id.mjs +0 -5
  448. package/dist/utility.d.mts +0 -49
  449. package/dist/utility.mjs +0 -122
  450. package/dist/vite/ast.d.mts +0 -23
  451. package/dist/vite/generated-name.d.mts +0 -7
  452. package/dist/vite/generated-name.mjs +0 -9
  453. package/dist/vite/manifest.d.mts +0 -7
  454. package/dist/vite/plugin.d.mts +0 -7
  455. package/dist/vite/safety.d.mts +0 -12
  456. package/dist/vite/source.d.mts +0 -7
  457. package/dist/vite/transform.d.mts +0 -7
  458. package/dist/webhook.d.mts +0 -16
  459. package/dist/webhook.mjs +0 -17
  460. package/dist/worker.d.mts +0 -19
  461. /package/dist/{types/vite.mjs → engine/context.mjs} +0 -0
package/README.md CHANGED
@@ -26,6 +26,10 @@
26
26
  <br/>
27
27
  <br/>
28
28
 
29
+ <p align="center">
30
+ 🚨Alpha state; things are in high flux🚨
31
+ </p>
32
+
29
33
  ## Installation
30
34
 
31
35
  ```sh
@@ -33,6 +37,394 @@
33
37
  $ npm install @temelj/workflow
34
38
  # pnpm
35
39
  $ pnpm add @temelj/workflow
36
- # jsr
37
- $ deno add jsr:@temelj/workflow # or jsr add @temelj/workflow
38
40
  ```
41
+
42
+ ## Overview
43
+
44
+ A workflow can pause and continue after a worker restarts.
45
+ The worker replays its event history, returning saved results for completed steps.
46
+ Code outside those steps runs again during replay.
47
+
48
+ The default client stores history in memory.
49
+ To retain runs across restarts, configure persistent [storage](#storage).
50
+
51
+ ## Quick start
52
+
53
+ Implement a workflow:
54
+
55
+ ```ts
56
+ import { implementWorkflow } from "@temelj/workflow";
57
+
58
+ export const greet = implementWorkflow<{ readonly name: string }, string>(
59
+ { name: "greet", version: "v1" },
60
+ ({ input, step }) => step.run({ name: "greeting" }, () => `Hello, ${input.name}`),
61
+ );
62
+ ```
63
+
64
+ Start a run, then have a worker execute it:
65
+
66
+ ```ts
67
+ import { createWorkflowClient } from "@temelj/workflow";
68
+
69
+ const client = createWorkflowClient();
70
+ const handle = await client.runs.start(greet, { name: "Verso" });
71
+ // Starting registers the implementation and stores a pending run.
72
+
73
+ await client.workers.processRun(handle.runId); // Process this run once.
74
+ console.log(await handle.result()); // "Hello, Verso"
75
+ await client.close();
76
+ ```
77
+
78
+ `result()` waits for completion and it doesn't run the workflow.
79
+
80
+ A service can run a worker loop to claim pending runs and resume waits as they become ready:
81
+
82
+ ```ts
83
+ import type { WorkflowClient } from "@temelj/workflow";
84
+
85
+ export async function runWorker(client: WorkflowClient, signal: AbortSignal): Promise<void> {
86
+ // Register workflow implementations on this client before starting the worker.
87
+ try {
88
+ await client.workers.create().run({ concurrency: 8, signal });
89
+ } finally {
90
+ await client.close();
91
+ }
92
+ }
93
+ ```
94
+
95
+ Producers and workers must share the same storage.
96
+ Each in-memory client has its own runs.
97
+ Use a persistent backend when they run in separate processes.
98
+
99
+ You can find examples in [examples/workflow](../../examples/workflow).
100
+
101
+ ## Writing workflows
102
+
103
+ Use `step.run()` for an inline task, or declare a reusable step with `defineWorkflowStep()`:
104
+
105
+ ```ts
106
+ import { defineWorkflowStep, implementWorkflow } from "@temelj/workflow";
107
+
108
+ const formatGreeting = defineWorkflowStep({ name: "format-greeting" }, ({ log }, name: string) => {
109
+ log.info("formatting greeting", { name });
110
+ return `Hello, ${name}`;
111
+ });
112
+
113
+ export const reminder = implementWorkflow<{ readonly name: string }, string>(
114
+ { name: "reminder", version: "v1" },
115
+ async ({ input, step }) => {
116
+ const greeting = await step.call(formatGreeting, input.name);
117
+ await step.sleep("reminder-delay", Temporal.Duration.from({ minutes: 5 }));
118
+ // The worker pauses here. On replay, formatGreeting returns its saved result.
119
+
120
+ const sentAt = await step.deterministic.now("sent-at");
121
+ step.log.info("reminder ready", { sentAt: sentAt.toString() });
122
+ return greeting;
123
+ },
124
+ );
125
+ ```
126
+
127
+ We call this "Explicit API."
128
+
129
+ You should put network calls and external writes inside steps.
130
+ A step can run again if it fails or the worker stops before its result is saved, so make external writes idempotent.
131
+ Use `step.deterministic` for time or random values that affect later commands.
132
+ `step.log` suppresses repeated log lines during replay.
133
+
134
+ Note, this package avoids patching globals so you shouldn't use `Math.random()` or `Date.now()` if you want deterministic runs.
135
+
136
+ Workflows are versioned.
137
+ Keep command names and their order stable for a workflow version.
138
+ Give changed input contracts or command sequences a new version, and retain implementations needed by existing runs.
139
+
140
+ ### Directive syntax
141
+
142
+ With the bundler plugin, directives turn ordinary async functions into workflows:
143
+
144
+ ```ts
145
+ export async function createGreeting(name: string): Promise<string> {
146
+ "use step";
147
+ return `Hello, ${name}`;
148
+ }
149
+
150
+ export async function greetingWorkflow(name: string): Promise<string> {
151
+ "use workflow";
152
+ return await createGreeting(name);
153
+ }
154
+
155
+ // After the transform: await client.runs.start(greetingWorkflow, "Verso").
156
+ ```
157
+
158
+ Configure the transform in your build, for example with Vite:
159
+
160
+ ```ts
161
+ import { workflow } from "@temelj/workflow/vite";
162
+
163
+ export default { plugins: [workflow()] };
164
+ ```
165
+
166
+ We call this alternative way of declaring workflows "directive" syntax that requires a bundler, which itself produces a "compiled workflow."
167
+
168
+ Adapters also exist for Rollup, Rolldown, esbuild, webpack, and Rspack.
169
+ See the [compiled example](../../examples/workflow/basic/src/compiled-workflows.ts).
170
+
171
+ Other commands use the same recorded history.
172
+ `step.workflow.run()` waits for a child workflow.
173
+ `step.workflow.start()` starts one without waiting for its result.
174
+ Use `step.lock.with()` for a leased lock and `step.stream.create()` to publish chunks a reader can follow.
175
+ `step.runData` records metadata and searchable attributes.
176
+ The [step API](./src/types/step.ts) lists their options.
177
+
178
+ ## Observing runs
179
+
180
+ ```ts
181
+ import { createWorkflowClient } from "@temelj/workflow";
182
+
183
+ const client = createWorkflowClient();
184
+ const unsubscribe = client.on("workflow:run-completed", ({ run }) => {
185
+ console.log("completed", run.id); // In-process notification.
186
+ });
187
+
188
+ const handle = await client.runs.start(greet, { name: "Verso" });
189
+ await client.workers.processRun(handle.runId);
190
+ console.log(await handle.status()); // "completed"
191
+ console.log(await handle.events()); // Stored event history.
192
+ console.log(await handle.timeline()); // Steps and waits reconstructed from that history.
193
+
194
+ console.log(await client.runs.summary()); // Counts grouped by status and workflow.
195
+ console.log(await client.runs.recoverySummary()); // Due or stale runs that may need attention.
196
+ unsubscribe();
197
+ await client.close();
198
+ ```
199
+
200
+ For an existing run, use `await client.runs.getHandle(runId)`.
201
+ Handles also expose `cancel()` and `streams`.
202
+ Use `handle.streams.follow(name)` to read chunk updates until that stream closes or fails.
203
+ Pass an abort signal to stop following early.
204
+
205
+ ## Messages and hooks
206
+
207
+ This run pauses until an approval message arrives:
208
+
209
+ ```ts
210
+ import { ss } from "@temelj/standard-schema";
211
+ import { createWorkflowClient, defineMessageChannel, implementWorkflow } from "@temelj/workflow";
212
+
213
+ const approval = defineMessageChannel({
214
+ name: "approval",
215
+ schema: ss.object({ approved: ss.boolean() }),
216
+ });
217
+ const review = implementWorkflow<undefined, boolean>(
218
+ { name: "review" },
219
+ async ({ step }) => (await step.message.wait(approval)).approved,
220
+ );
221
+
222
+ const client = createWorkflowClient();
223
+ const handle = await client.runs.start(review);
224
+ await client.workers.processRun(handle.runId);
225
+ console.log(await handle.status()); // "waiting"
226
+
227
+ // Send from an API handler or another process sharing the same storage.
228
+ await client.messages.send(handle.runId, approval, { payload: { approved: true } });
229
+ await client.workers.processRun(handle.runId); // Resume the waiting run.
230
+ console.log(await handle.result()); // true
231
+ await client.close();
232
+ ```
233
+
234
+ For an external callback, create a hook and give its token to the caller:
235
+
236
+ ```ts
237
+ import type { StepApi, WorkflowClient } from "@temelj/workflow";
238
+
239
+ import { ss } from "@temelj/standard-schema";
240
+
241
+ // Call inside a workflow handler.
242
+ async function waitForApproval(step: StepApi): Promise<boolean> {
243
+ const hook = step.hook.create({
244
+ name: "approval",
245
+ schema: ss.object({ approved: ss.boolean() }),
246
+ });
247
+ await step.runData.setMetadata("callback-token", { token: hook.token });
248
+ // The application can read the token from the run metadata and send it to the caller.
249
+ return (await hook.wait()).approved;
250
+ }
251
+
252
+ // Call from the callback handler, using the token the application supplied.
253
+ async function approve(client: WorkflowClient, token: string): Promise<void> {
254
+ await client.hooks.resume(token, { payload: { approved: true } });
255
+ }
256
+ ```
257
+
258
+ `step.hook.createWebhook()` adds webhook metadata to the same token-based flow.
259
+ It doesn't create an actual HTTP endpoint.
260
+ `parseHookToken()` decodes a token without resuming the run.
261
+ Message payloads are validated again on replay, preserving the input to schema transforms.
262
+
263
+ ## Errors
264
+
265
+ A retryable failure schedules another attempt according to the step's retry policy.
266
+
267
+ For example, retry a rate-limited HTTP request:
268
+
269
+ ```ts
270
+ import {
271
+ defineWorkflowStep,
272
+ WorkflowNonRetryableError,
273
+ WorkflowRetryableError,
274
+ } from "@temelj/workflow";
275
+
276
+ export const loadText = defineWorkflowStep(
277
+ { name: "load-text", retry: { maximumAttempts: 3 } },
278
+ async ({ signal }, url: string) => {
279
+ const response = await fetch(url, { signal }); // Attempt cancellation or timeout.
280
+ if (response.status === 429 || response.status >= 500) {
281
+ throw new WorkflowRetryableError(`HTTP ${response.status}`, {
282
+ retryDelay: Temporal.Duration.from({ seconds: 10 }),
283
+ });
284
+ }
285
+ if (!response.ok) {
286
+ throw new WorkflowNonRetryableError(`HTTP ${response.status}`);
287
+ }
288
+ return response.text();
289
+ },
290
+ );
291
+ ```
292
+
293
+ `WorkflowRetryableError` accepts `retryAt` or `retryDelay`.
294
+ Set one, not both.
295
+ `WorkflowNonRetryableError` fails without another attempt.
296
+
297
+ Stored failures are error records.
298
+ Match their codes with the same helper you use for live exceptions:
299
+
300
+ ```ts
301
+ import { matchesWorkflowError, WorkflowErrorCode } from "@temelj/workflow";
302
+
303
+ export function isInvoiceLockConflict(error: unknown): boolean {
304
+ return matchesWorkflowError(error, WorkflowErrorCode.LOCK_ALREADY_HELD, { key: "invoice:1" });
305
+ }
306
+ ```
307
+
308
+ Workflow errors expose `code` and optional `details`.
309
+ Match those instead of parsing error messages.
310
+
311
+ ## Stored values
312
+
313
+ Inputs and results use `StorageValue` from `@temelj/storage`.
314
+ That includes JSON-like data and values such as `Date`, `Map`, and `Uint8Array`.
315
+ Metadata and stream chunks included.
316
+
317
+ Functions, cyclic objects, sparse arrays and symbols are rejected before writing.
318
+
319
+ A typed workflow gives `runs.start()` a typed result.
320
+ A run ID alone doesn't establish an output type, so validate results read through `getHandle()`:
321
+
322
+ ```ts
323
+ import type { WorkflowClient } from "@temelj/workflow";
324
+
325
+ import { ss } from "@temelj/standard-schema";
326
+
327
+ export async function readGreeting(client: WorkflowClient, runId: string): Promise<string> {
328
+ const handle = await client.runs.getHandle(runId);
329
+ return ss.parseSync(ss.string(), await handle.result());
330
+ }
331
+ ```
332
+
333
+ Stream readers also return `StorageValue`.
334
+ Validate chunks before using their shape.
335
+
336
+ ## Storage
337
+
338
+ This Node.js example stores run history on disk:
339
+
340
+ ```ts
341
+ import { createStorage, createSuperJsonStorageCodec } from "@temelj/storage";
342
+ import { FileSystemStorageEngine } from "@temelj/storage/filesystem";
343
+ import { createWorkflowClient } from "@temelj/workflow";
344
+
345
+ function openClient() {
346
+ return createWorkflowClient({
347
+ storage: createStorage({
348
+ codec: createSuperJsonStorageCodec({ format: "bytes" }),
349
+ engine: new FileSystemStorageEngine({ directory: "./workflow-data" }),
350
+ }),
351
+ });
352
+ }
353
+
354
+ const first = openClient();
355
+ const handle = await first.runs.start(greet, { name: "Verso" });
356
+ await first.close(); // The pending run stays on disk.
357
+
358
+ const second = openClient();
359
+ second.register(greet); // Implementations live in code, not in storage.
360
+ await second.workers.processRun(handle.runId);
361
+ const recovered = await second.runs.getHandle(handle.runId);
362
+ console.log(await recovered.result()); // "Hello, Verso"
363
+ await second.close();
364
+ ```
365
+
366
+ Use another [`@temelj/storage` backend](../storage/README.md) when needed.
367
+ `@temelj/workflow/store` exposes the store contract for custom adapters.
368
+
369
+ ## Cloudflare Workflows
370
+
371
+ @temelj/workflow workflows can run on [Cloudflare Workflows](https://www.cloudflare.com/products/workflows/).
372
+
373
+ Define a host around the same `greet` implementation:
374
+
375
+ ```ts
376
+ import type { CloudflareWorkflowBinding } from "@temelj/workflow/cloudflare";
377
+
378
+ import { defineWorkflowBundle } from "@temelj/workflow";
379
+ import { createCloudflareWorkflowHost } from "@temelj/workflow/cloudflare";
380
+
381
+ import { greet } from "./greet.ts";
382
+
383
+ interface Env {
384
+ readonly TEMELJ_WORKFLOW: CloudflareWorkflowBinding;
385
+ }
386
+
387
+ const host = createCloudflareWorkflowHost<Env>({ workflows: defineWorkflowBundle([greet]) });
388
+ export class TemeljWorkflow extends host.Entrypoint {}
389
+
390
+ // Call from a Worker request handler with the configured workflow binding.
391
+ export async function startGreeting(env: Env) {
392
+ const runtime = host.createRuntime(env.TEMELJ_WORKFLOW);
393
+ return runtime.runs.start(greet, { name: "Verso" });
394
+ }
395
+ ```
396
+
397
+ Configure the Worker binding and entrypoint as shown in the [Cloudflare example](../../examples/workflow/cloudflare/).
398
+
399
+ Both hosts implement `WorkflowRuntime`, so code using `runs.start()` and run handles can work with either.
400
+ The Cloudflare runtime also has `runs.get(workflow, runId)` and `messages.send()`.
401
+ Cloudflare manages worker execution.
402
+ Schedules, locks, streams, and run-history inspection belong to the local client.
403
+
404
+ > Note, some features from @temelj/workflow that Cloudflare doesn't support might throw an error.
405
+
406
+ ## OpenTelemetry
407
+
408
+ Configure your OpenTelemetry SDK before creating the client:
409
+
410
+ ```ts
411
+ import { createWorkflowClient } from "@temelj/workflow";
412
+ import { createOpenTelemetryTelemetry } from "@temelj/workflow/otel";
413
+
414
+ const client = createWorkflowClient({
415
+ telemetry: createOpenTelemetryTelemetry({
416
+ includeNamesInSpanNames: true, // Include workflow and step names in trace UIs.
417
+ includeStorageOperationSpans: false, // Omit a span for each storage operation.
418
+ }),
419
+ });
420
+
421
+ // Close the client when the worker stops.
422
+ await client.close();
423
+ ```
424
+
425
+ The adapter emits workflow spans and metrics through your configured providers.
426
+ `@temelj/workflow/otel` exports the span and metric names, with attribute constants for queries.
427
+ Pass `forceFlush` and `shutdown` callbacks if the client should also flush and close your telemetry providers.
428
+ See the [instrumented example](../../examples/workflow/basic/src/instrumentation.ts) for SDK setup and exporter shutdown.
429
+
430
+ > Note, OTEL is experimental and how telemetry data is exported isn't yet strongly defined.
@@ -1,15 +1,17 @@
1
- import { WorkflowAttributePatch, WorkflowRunAttributes } from "./types/run.mjs";
1
+ import { AttributePatch, RunAttributes } from "./types/run.mjs";
2
2
  import { EventRecord } from "./types/events.mjs";
3
3
  //#region src/attributes.d.ts
4
- interface WorkflowAttributeEventPatch {
5
- readonly attributes?: WorkflowRunAttributes;
4
+ interface AttributeEventPatch {
5
+ readonly attributes?: RunAttributes;
6
6
  readonly removeAttributes?: readonly string[];
7
7
  }
8
- declare function normalizeWorkflowAttributePatch(value: WorkflowAttributePatch): WorkflowAttributePatch;
9
- declare function workflowAttributeEventPatch(patch: WorkflowAttributePatch): WorkflowAttributeEventPatch;
10
- declare function workflowAttributePatchFromEvent(event: Extract<EventRecord, {
8
+ export declare function normalizeAttributePatch(value: AttributePatch): AttributePatch;
9
+ export declare function workflowAttributeEventPatch(patch: AttributePatch): AttributeEventPatch;
10
+ export declare function workflowAttributePatchFromEvent(event: Extract<EventRecord, {
11
11
  readonly kind: "attributes_set";
12
- }>): WorkflowAttributePatch;
13
- declare function applyWorkflowAttributePatch(current: WorkflowRunAttributes | undefined, patch: WorkflowAttributePatch): WorkflowRunAttributes | undefined;
12
+ }>): AttributePatch;
13
+ export declare function applyAttributePatch(current: RunAttributes | undefined, patch: AttributePatch): RunAttributes | undefined;
14
+ export declare const attributeValueSchema: import("@temelj/standard-schema").Schema<unknown, string | number | boolean | null>;
15
+ export declare const runAttributesSchema: import("@temelj/standard-schema").Schema<unknown, Record<string, string | number | boolean | null>>;
14
16
  //#endregion
15
- export { WorkflowAttributeEventPatch, applyWorkflowAttributePatch, normalizeWorkflowAttributePatch, workflowAttributeEventPatch, workflowAttributePatchFromEvent };
17
+ export {};
@@ -1,7 +1,8 @@
1
- import { workflowAttributePatchSchema } from "./types/run.mjs";
1
+ import { keyedRecord, parse } from "./schema/common.mjs";
2
+ import { ss } from "@temelj/standard-schema";
2
3
  //#region src/attributes.ts
3
- function normalizeWorkflowAttributePatch(value) {
4
- workflowAttributePatchSchema.parse(value);
4
+ function normalizeAttributePatch(value) {
5
+ parse(attributePatchSchema, value);
5
6
  return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)));
6
7
  }
7
8
  function workflowAttributeEventPatch(patch) {
@@ -18,7 +19,7 @@ function workflowAttributePatchFromEvent(event) {
18
19
  ...Object.fromEntries((event.removeAttributes ?? []).map((key) => [key, void 0]))
19
20
  };
20
21
  }
21
- function applyWorkflowAttributePatch(current, patch) {
22
+ function applyAttributePatch(current, patch) {
22
23
  const next = { ...current };
23
24
  for (const [key, value] of Object.entries(patch)) if (value === void 0) delete next[key];
24
25
  else next[key] = value;
@@ -26,5 +27,22 @@ function applyWorkflowAttributePatch(current, patch) {
26
27
  if (entries.length === 0) return;
27
28
  return Object.fromEntries(entries);
28
29
  }
30
+ const WORKFLOW_ATTRIBUTE_MAX_KEY_LENGTH = 128;
31
+ const WORKFLOW_ATTRIBUTE_MAX_COUNT = 64;
32
+ const WORKFLOW_ATTRIBUTE_MAX_VALUE_BYTES = 1024;
33
+ const WORKFLOW_ATTRIBUTE_RESERVED_PREFIX = "$";
34
+ const attributeKeySchema = ss.refine(ss.refine(ss.refine(ss.string(), (key) => key.trim() !== "", "Workflow run attribute keys must not be empty"), (key) => key.length <= WORKFLOW_ATTRIBUTE_MAX_KEY_LENGTH, `Workflow run attribute key must not exceed ${WORKFLOW_ATTRIBUTE_MAX_KEY_LENGTH} characters`), (key) => !key.startsWith(WORKFLOW_ATTRIBUTE_RESERVED_PREFIX), `Workflow run attribute key uses reserved prefix ${WORKFLOW_ATTRIBUTE_RESERVED_PREFIX}`);
35
+ const attributePrimitiveValueSchema = ss.union([
36
+ ss.string(),
37
+ ss.number(),
38
+ ss.boolean(),
39
+ ss.literal(null)
40
+ ]);
41
+ const attributeValueSchema = ss.refine(attributePrimitiveValueSchema, (value) => encodedAttributeByteLength(value) <= WORKFLOW_ATTRIBUTE_MAX_VALUE_BYTES, `Workflow run attribute value must not exceed ${WORKFLOW_ATTRIBUTE_MAX_VALUE_BYTES} encoded bytes`);
42
+ const runAttributesSchema = ss.refine(keyedRecord(attributeKeySchema, attributeValueSchema), (attributes) => Object.keys(attributes).length <= WORKFLOW_ATTRIBUTE_MAX_COUNT, `Workflow run attributes must not include more than ${WORKFLOW_ATTRIBUTE_MAX_COUNT} keys`);
43
+ const attributePatchSchema = ss.refine(keyedRecord(attributeKeySchema, ss.optional(attributeValueSchema)), (attributes) => Object.keys(attributes).length <= WORKFLOW_ATTRIBUTE_MAX_COUNT, `Workflow run attributes must not include more than ${WORKFLOW_ATTRIBUTE_MAX_COUNT} keys`);
44
+ function encodedAttributeByteLength(value) {
45
+ return new TextEncoder().encode(JSON.stringify(value)).byteLength;
46
+ }
29
47
  //#endregion
30
- export { applyWorkflowAttributePatch, normalizeWorkflowAttributePatch, workflowAttributeEventPatch, workflowAttributePatchFromEvent };
48
+ export { applyAttributePatch, attributeValueSchema, normalizeAttributePatch, runAttributesSchema, workflowAttributeEventPatch, workflowAttributePatchFromEvent };
package/dist/bundle.d.mts CHANGED
@@ -1,29 +1,11 @@
1
- import { Registry, WorkflowDefinitionConfig, WorkflowImplementation } from "./types/definition.mjs";
2
- import { Schema } from "@temelj/standard-schema";
1
+ import { WorkflowImplementation } from "./types/definition.mjs";
2
+ import { RegistryEntry } from "./registry.mjs";
3
3
  //#region src/bundle.d.ts
4
- interface WorkflowImplementationLike {
5
- readonly kind: "implementation";
6
- readonly definition: {
7
- readonly kind: "definition";
8
- readonly config: WorkflowDefinitionConfig<Schema | undefined>;
9
- readonly name: string;
10
- readonly version?: string;
11
- };
12
- readonly config: WorkflowDefinitionConfig<Schema | undefined>;
13
- readonly name: string;
14
- readonly version?: string;
15
- readonly handler: (...args: never[]) => unknown;
16
- }
17
- /** Workflow value accepted by an immutable workflow bundle. */
18
- type WorkflowBundleEntry = WorkflowImplementationLike | ((...args: never[]) => unknown);
19
4
  /** Immutable collection of workflow implementations shared by workflow hosts. */
20
- interface WorkflowBundle {
5
+ export interface WorkflowBundle {
21
6
  readonly kind: "workflow-bundle";
22
7
  readonly workflows: readonly WorkflowImplementation<unknown, unknown>[];
23
8
  }
24
9
  /** Defines an immutable workflow collection for local and deployed workflow hosts. */
25
- declare function defineWorkflowBundle(entries: readonly WorkflowBundleEntry[]): WorkflowBundle;
26
- /** Creates an independent mutable registry populated from a workflow bundle. */
27
- declare function createWorkflowBundleRegistry(bundle: WorkflowBundle): Registry;
28
- //#endregion
29
- export { WorkflowBundle, WorkflowBundleEntry, createWorkflowBundleRegistry, defineWorkflowBundle };
10
+ export declare function defineWorkflowBundle(entries: readonly RegistryEntry[]): WorkflowBundle;
11
+ //#endregion
package/dist/bundle.mjs CHANGED
@@ -1,28 +1,12 @@
1
- import { WorkflowDefinitionError } from "./errors/definition.mjs";
2
- import "./errors/mod.mjs";
3
- import { getCompiledWorkflowDefinition } from "./compiled-function.mjs";
4
1
  import { Registry } from "./registry.mjs";
5
2
  //#region src/bundle.ts
6
3
  /** Defines an immutable workflow collection for local and deployed workflow hosts. */
7
4
  function defineWorkflowBundle(entries) {
8
- const registry = new Registry();
9
- for (const entry of entries) registry.register(workflowImplementationFromBundleEntry(entry));
5
+ const registry = new Registry(entries);
10
6
  return Object.freeze({
11
7
  kind: "workflow-bundle",
12
8
  workflows: Object.freeze([...registry.entries()])
13
9
  });
14
10
  }
15
- /** Creates an independent mutable registry populated from a workflow bundle. */
16
- function createWorkflowBundleRegistry(bundle) {
17
- const registry = new Registry();
18
- for (const workflow of bundle.workflows) registry.register(workflow);
19
- return registry;
20
- }
21
- function workflowImplementationFromBundleEntry(entry) {
22
- if (typeof entry !== "function") return entry;
23
- const implementation = getCompiledWorkflowDefinition(entry);
24
- if (implementation === void 0) WorkflowDefinitionError.compiledMetadataMissing();
25
- return implementation;
26
- }
27
11
  //#endregion
28
- export { createWorkflowBundleRegistry, defineWorkflowBundle };
12
+ export { defineWorkflowBundle };
@@ -1,39 +1,42 @@
1
1
  import { RegistryLike, WorkflowDefinition, WorkflowHandler, WorkflowImplementation } from "../types/definition.mjs";
2
+ import { ObservationEventHandler, ObservationEventPattern } from "../types/observation.mjs";
2
3
  import { WorkflowBundle } from "../bundle.mjs";
3
4
  import { CreateWorkflowEngineOptions } from "../types/engine-options.mjs";
4
- import { WorkflowClientEngine, WorkflowWorkerEngine } from "../types/engine.mjs";
5
- import { WorkflowClient as WorkflowClient$1, WorkflowClientAdminApi, WorkflowClientHooksApi, WorkflowClientLocksApi, WorkflowClientMessagesApi, WorkflowClientRunsApi, WorkflowClientSchedulesApi, WorkflowClientStreamsApi, WorkflowClientWorkersApi, WorkflowRunnable } from "../types/client.mjs";
5
+ import { WorkflowEngine } from "../engine/create.mjs";
6
+ import { ClientAdminApi, ClientHooksApi, ClientLocksApi, ClientMessagesApi, ClientRunsApi, ClientSchedulesApi, ClientStreamsApi, ClientWorkersApi, WorkflowClient as WorkflowClient$1 } from "../types/client.mjs";
7
+ import { Unsubscribe } from "@temelj/event";
6
8
  //#region src/client/create.d.ts
7
- type WorkflowClientEngineOptions = Omit<CreateWorkflowEngineOptions, "storage" | "store">;
8
- interface CreateWorkflowClientBaseOptions extends WorkflowClientEngineOptions {
9
- readonly engine?: WorkflowClientEngine;
10
- readonly workerEngine?: WorkflowWorkerEngine;
9
+ /** Engine options, such as `storage` or `store`, plus the workflows the client starts with. */
10
+ export interface CreateWorkflowClientOptions extends CreateWorkflowEngineOptions {
11
+ readonly workflows?: WorkflowBundle;
11
12
  }
12
- /** Options for creating a workflow client with either a registry or an immutable bundle. */
13
- type CreateWorkflowClientOptions = CreateWorkflowClientBaseOptions & ({
13
+ /** Client options that share a registry with workers built over the same engine. Internal. */
14
+ export type ClientForEngineOptions = CreateWorkflowEngineOptions & ({
14
15
  readonly registry?: RegistryLike;
15
16
  readonly workflows?: never;
16
17
  } | {
17
18
  readonly registry?: never;
18
19
  readonly workflows?: WorkflowBundle;
19
20
  });
20
- declare function createWorkflowClient(options?: CreateWorkflowClientOptions): WorkflowClient$1;
21
- /** Workflow client facade implementation. */
22
- declare class WorkflowClient implements WorkflowClient$1 {
21
+ export declare function createWorkflowClient(options?: CreateWorkflowClientOptions): WorkflowClient$1;
22
+ /** A client over an existing engine, so several clients and workers share one engine. Internal. */
23
+ export declare function clientForEngine(engine: WorkflowEngine, options?: ClientForEngineOptions): WorkflowClient$1;
24
+ export declare class WorkflowClient implements WorkflowClient$1 {
23
25
  #private;
24
- readonly runs: WorkflowClientRunsApi;
25
- readonly admin: WorkflowClientAdminApi;
26
- readonly schedules: WorkflowClientSchedulesApi;
27
- readonly locks: WorkflowClientLocksApi;
28
- readonly hooks: WorkflowClientHooksApi;
29
- readonly streams: WorkflowClientStreamsApi;
30
- readonly messages: WorkflowClientMessagesApi;
31
- readonly workers: WorkflowClientWorkersApi;
32
- constructor(options?: CreateWorkflowClientOptions);
26
+ readonly runs: ClientRunsApi;
27
+ readonly admin: ClientAdminApi;
28
+ readonly schedules: ClientSchedulesApi;
29
+ readonly locks: ClientLocksApi;
30
+ readonly hooks: ClientHooksApi;
31
+ readonly streams: ClientStreamsApi;
32
+ readonly messages: ClientMessagesApi;
33
+ readonly workers: ClientWorkersApi;
34
+ constructor(options?: ClientForEngineOptions, engine?: WorkflowEngine);
35
+ on<Pattern extends ObservationEventPattern>(pattern: Pattern, handler: ObservationEventHandler<Pattern>): Unsubscribe;
36
+ once<Pattern extends ObservationEventPattern>(pattern: Pattern, handler: ObservationEventHandler<Pattern>): Unsubscribe;
37
+ off<Pattern extends ObservationEventPattern>(pattern: Pattern, handler: ObservationEventHandler<Pattern>): void;
33
38
  close(): Promise<void>;
34
39
  implementWorkflow<TInput, TOutput, TRawInput = TInput>(definition: WorkflowDefinition<TInput, TOutput, TRawInput>, handler: WorkflowHandler<TInput, TOutput>): WorkflowImplementation<TInput, TOutput, TRawInput>;
35
40
  register<TInput, TOutput, TRawInput = TInput>(implementation: WorkflowImplementation<TInput, TOutput, TRawInput>): void;
36
- workflow<TInput, TOutput, TRawInput = TInput>(definition: WorkflowDefinition<TInput, TOutput, TRawInput>, handler: WorkflowHandler<TInput, TOutput>): WorkflowRunnable<TInput, TOutput, TRawInput>;
37
41
  }
38
- //#endregion
39
- export { CreateWorkflowClientOptions, WorkflowClient, createWorkflowClient };
42
+ //#endregion