@lostgradient/weft 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +79 -24
  2. package/dist/cli/conformance.js +7 -1
  3. package/dist/cli/generated/operation-client.generated.d.ts +28 -13
  4. package/dist/cli/generated/operation-client.generated.js +1 -0
  5. package/dist/cli/help-text.d.ts +1 -1
  6. package/dist/cli/help-text.js +1 -0
  7. package/dist/cli/operation-catalog-snapshot.d.ts +8 -0
  8. package/dist/cli/operation-catalog-snapshot.js +11 -0
  9. package/dist/cli/parse-schedule-arguments.js +3 -1
  10. package/dist/cli/schedule.js +2 -1
  11. package/dist/cli/types.d.ts +1 -0
  12. package/dist/cli-main.js +79 -78
  13. package/dist/client/handle-delegation.d.ts +3 -2
  14. package/dist/client/handle-delegation.js +3 -1
  15. package/dist/client/http-client-requests.d.ts +2 -1
  16. package/dist/client/http-client-requests.js +7 -0
  17. package/dist/client/http-client.d.ts +9 -6
  18. package/dist/client/http-client.js +10 -1
  19. package/dist/client/http-request.d.ts +11 -1
  20. package/dist/client/http-request.js +17 -7
  21. package/dist/client/index.d.ts +1 -1
  22. package/dist/client/interface.d.ts +61 -5
  23. package/dist/client/local-handles.d.ts +22 -0
  24. package/dist/client/local-handles.js +23 -0
  25. package/dist/client/local.d.ts +6 -3
  26. package/dist/client/local.js +12 -26
  27. package/dist/client/start-body.d.ts +4 -3
  28. package/dist/core/byte-arrays.d.ts +5 -0
  29. package/dist/core/byte-arrays.js +5 -0
  30. package/dist/core/checkpoint/lifecycle.d.ts +3 -0
  31. package/dist/core/checkpoint/lifecycle.js +9 -4
  32. package/dist/core/checkpoint/serialization.js +12 -5
  33. package/dist/core/codec/extension-codec.d.ts +16 -0
  34. package/dist/core/codec/extension-codec.js +100 -6
  35. package/dist/core/context/activity-retry-state.d.ts +38 -0
  36. package/dist/core/context/activity-retry-state.js +89 -0
  37. package/dist/core/context/activity-schedule-to-close.d.ts +159 -0
  38. package/dist/core/context/activity-schedule-to-close.js +69 -0
  39. package/dist/core/context/child-workflow-pipe.d.ts +5 -5
  40. package/dist/core/context/child-workflow-pipe.js +15 -2
  41. package/dist/core/context/context-presence.d.ts +19 -0
  42. package/dist/core/context/context-presence.js +13 -0
  43. package/dist/core/context/durable-operations.d.ts +25 -0
  44. package/dist/core/context/durable-operations.js +64 -0
  45. package/dist/core/context/index.d.ts +9 -5
  46. package/dist/core/context/index.js +17 -12
  47. package/dist/core/context/internals.d.ts +20 -0
  48. package/dist/core/context/internals.js +3 -1
  49. package/dist/core/context/operation-request.d.ts +35 -0
  50. package/dist/core/context/parallel-cache-entry.d.ts +14 -5
  51. package/dist/core/context/run-operation.d.ts +6 -1
  52. package/dist/core/context/run-operation.js +41 -87
  53. package/dist/core/context/session-state.js +7 -8
  54. package/dist/core/context/speculative-child.js +2 -0
  55. package/dist/core/context/types.d.ts +15 -0
  56. package/dist/core/context/version-patching.d.ts +8 -0
  57. package/dist/core/context/version-patching.js +40 -0
  58. package/dist/core/context/workflow-logger.d.ts +98 -0
  59. package/dist/core/context/workflow-logger.js +68 -0
  60. package/dist/core/engine/activity-heartbeat-tracking.d.ts +64 -0
  61. package/dist/core/engine/activity-heartbeat-tracking.js +42 -0
  62. package/dist/core/engine/activity-per-attempt-timeout.d.ts +46 -0
  63. package/dist/core/engine/activity-per-attempt-timeout.js +36 -0
  64. package/dist/core/engine/activity-reconciliation.d.ts +1 -0
  65. package/dist/core/engine/activity-reconciliation.js +12 -1
  66. package/dist/core/engine/activity-resolution.d.ts +23 -0
  67. package/dist/core/engine/activity-resolution.js +37 -0
  68. package/dist/core/engine/aggregate.js +66 -30
  69. package/dist/core/engine/async-activity-completion.d.ts +23 -6
  70. package/dist/core/engine/async-activity-completion.js +53 -12
  71. package/dist/core/engine/attributes-tags.js +9 -4
  72. package/dist/core/engine/bulk-operations-purge.d.ts +26 -0
  73. package/dist/core/engine/bulk-operations-purge.js +38 -3
  74. package/dist/core/engine/bulk-operations-shared.d.ts +2 -0
  75. package/dist/core/engine/bulk-operations-shared.js +8 -2
  76. package/dist/core/engine/bulk-operations.d.ts +4 -1
  77. package/dist/core/engine/bulk-operations.js +235 -24
  78. package/dist/core/engine/callback-creators-bundles.d.ts +9 -0
  79. package/dist/core/engine/callback-creators-bundles.js +30 -2
  80. package/dist/core/engine/callback-creators-core.js +6 -4
  81. package/dist/core/engine/callback-creators-router.js +10 -0
  82. package/dist/core/engine/callback-creators-schedule.d.ts +2 -2
  83. package/dist/core/engine/callback-creators-schedule.js +12 -8
  84. package/dist/core/engine/candidate-read-batching.d.ts +6 -0
  85. package/dist/core/engine/candidate-read-batching.js +1 -0
  86. package/dist/core/engine/checkpoint-io.js +61 -25
  87. package/dist/core/engine/checkpoint-reads.js +3 -2
  88. package/dist/core/engine/checkpoint-replay.d.ts +20 -0
  89. package/dist/core/engine/checkpoint-replay.js +242 -0
  90. package/dist/core/engine/checkpoint-side-effects.d.ts +23 -0
  91. package/dist/core/engine/checkpoint-side-effects.js +35 -0
  92. package/dist/core/engine/child-workflow-cancellation.d.ts +10 -0
  93. package/dist/core/engine/child-workflow-cancellation.js +40 -0
  94. package/dist/core/engine/child-workflow.js +27 -4
  95. package/dist/core/engine/condition-waiters.d.ts +14 -0
  96. package/dist/core/engine/condition-waiters.js +5 -0
  97. package/dist/core/engine/construction.d.ts +3 -0
  98. package/dist/core/engine/construction.js +21 -8
  99. package/dist/core/engine/coordination-branch-executors.d.ts +70 -0
  100. package/dist/core/engine/coordination-branch-executors.js +107 -0
  101. package/dist/core/engine/deferred-consume-envelope.d.ts +59 -0
  102. package/dist/core/engine/deferred-consume-envelope.js +14 -0
  103. package/dist/core/engine/disposal.js +13 -0
  104. package/dist/core/engine/engine-create-types.d.ts +14 -4
  105. package/dist/core/engine/engine-internal-types.d.ts +26 -3
  106. package/dist/core/engine/errors.d.ts +47 -0
  107. package/dist/core/engine/errors.js +20 -0
  108. package/dist/core/engine/event-log-compaction.d.ts +8 -0
  109. package/dist/core/engine/event-log-compaction.js +20 -2
  110. package/dist/core/engine/fenced-write.d.ts +65 -0
  111. package/dist/core/engine/fenced-write.js +71 -0
  112. package/dist/core/engine/finalizer-state.d.ts +28 -0
  113. package/dist/core/engine/finalizer-state.js +16 -0
  114. package/dist/core/engine/handles.d.ts +8 -0
  115. package/dist/core/engine/index.d.ts +34 -16
  116. package/dist/core/engine/index.js +136 -9
  117. package/dist/core/engine/inline-parking.js +3 -2
  118. package/dist/core/engine/internals.d.ts +107 -3
  119. package/dist/core/engine/lease-codec.d.ts +35 -0
  120. package/dist/core/engine/lease-codec.js +32 -0
  121. package/dist/core/engine/lease-deposition.d.ts +66 -0
  122. package/dist/core/engine/lease-deposition.js +10 -0
  123. package/dist/core/engine/lease-errors.d.ts +99 -0
  124. package/dist/core/engine/lease-errors.js +30 -0
  125. package/dist/core/engine/lease-manager.d.ts +114 -0
  126. package/dist/core/engine/lease-manager.js +135 -0
  127. package/dist/core/engine/lifecycle/persist.js +10 -32
  128. package/dist/core/engine/lifecycle/recovered-services.d.ts +8 -6
  129. package/dist/core/engine/lifecycle/recovered-services.js +18 -3
  130. package/dist/core/engine/lifecycle/resume.js +16 -9
  131. package/dist/core/engine/lifecycle/shared.d.ts +8 -1
  132. package/dist/core/engine/lifecycle/start-batch.d.ts +1 -1
  133. package/dist/core/engine/lifecycle/start-batch.js +2 -1
  134. package/dist/core/engine/lifecycle/start-commit.d.ts +9 -0
  135. package/dist/core/engine/lifecycle/start-commit.js +50 -8
  136. package/dist/core/engine/lifecycle/start-or-signal-create.d.ts +58 -0
  137. package/dist/core/engine/lifecycle/start-or-signal-create.js +95 -0
  138. package/dist/core/engine/lifecycle/start-or-signal.d.ts +3 -2
  139. package/dist/core/engine/lifecycle/start-or-signal.js +11 -81
  140. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +39 -0
  141. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +28 -0
  142. package/dist/core/engine/lifecycle/start.d.ts +4 -4
  143. package/dist/core/engine/lifecycle/start.js +17 -9
  144. package/dist/core/engine/lifecycle/transition.js +17 -5
  145. package/dist/core/engine/lifecycle.d.ts +1 -1
  146. package/dist/core/engine/list-candidate-resolution.js +2 -2
  147. package/dist/core/engine/listing.js +9 -5
  148. package/dist/core/engine/operations-activity.d.ts +6 -13
  149. package/dist/core/engine/operations-activity.js +26 -53
  150. package/dist/core/engine/operations-coordination.d.ts +10 -0
  151. package/dist/core/engine/operations-coordination.js +44 -9
  152. package/dist/core/engine/operations-router.d.ts +6 -0
  153. package/dist/core/engine/operations-router.js +2 -0
  154. package/dist/core/engine/operations-speculate.js +6 -2
  155. package/dist/core/engine/operations-stream.js +12 -2
  156. package/dist/core/engine/operations-time.d.ts +4 -2
  157. package/dist/core/engine/operations-time.js +14 -2
  158. package/dist/core/engine/operations-wait-condition.d.ts +23 -0
  159. package/dist/core/engine/operations-wait-condition.js +62 -0
  160. package/dist/core/engine/ownership-options.d.ts +23 -0
  161. package/dist/core/engine/ownership-options.js +26 -0
  162. package/dist/core/engine/payload-size-policy.d.ts +3 -0
  163. package/dist/core/engine/payload-size-policy.js +4 -0
  164. package/dist/core/engine/pending-updates.d.ts +17 -0
  165. package/dist/core/engine/pending-updates.js +33 -11
  166. package/dist/core/engine/queries.js +1 -1
  167. package/dist/core/engine/registration.d.ts +1 -0
  168. package/dist/core/engine/registration.js +18 -3
  169. package/dist/core/engine/schedule-jitter.d.ts +5 -0
  170. package/dist/core/engine/schedule-jitter.js +10 -0
  171. package/dist/core/engine/schedule-run.d.ts +17 -0
  172. package/dist/core/engine/schedule-run.js +38 -0
  173. package/dist/core/engine/schedule-timer.js +81 -17
  174. package/dist/core/engine/schedules.d.ts +7 -4
  175. package/dist/core/engine/schedules.js +37 -16
  176. package/dist/core/engine/search-attribute-records.d.ts +4 -0
  177. package/dist/core/engine/search-attribute-records.js +17 -0
  178. package/dist/core/engine/signals.d.ts +18 -2
  179. package/dist/core/engine/signals.js +42 -21
  180. package/dist/core/engine/state-utilities.d.ts +49 -2
  181. package/dist/core/engine/state-utilities.js +114 -3
  182. package/dist/core/engine/storage-io.d.ts +16 -2
  183. package/dist/core/engine/storage-io.js +26 -5
  184. package/dist/core/engine/stream-chunk-loading.d.ts +2 -0
  185. package/dist/core/engine/stream-chunk-loading.js +24 -1
  186. package/dist/core/engine/sub-operation.js +25 -6
  187. package/dist/core/engine/termination/cleanup.d.ts +3 -1
  188. package/dist/core/engine/termination/cleanup.js +25 -1
  189. package/dist/core/engine/termination/complete.js +44 -6
  190. package/dist/core/engine/termination/finalizer-activity.d.ts +53 -0
  191. package/dist/core/engine/termination/finalizer-activity.js +30 -0
  192. package/dist/core/engine/termination/finalizer-claim.d.ts +110 -0
  193. package/dist/core/engine/termination/finalizer-claim.js +80 -0
  194. package/dist/core/engine/termination/finalizer.d.ts +48 -0
  195. package/dist/core/engine/termination/finalizer.js +159 -0
  196. package/dist/core/engine/termination/suspend.d.ts +3 -1
  197. package/dist/core/engine/termination.d.ts +1 -0
  198. package/dist/core/engine/termination.js +4 -0
  199. package/dist/core/engine/updates.js +5 -25
  200. package/dist/core/engine/validation/schedule.d.ts +2 -1
  201. package/dist/core/engine/validation/schedule.js +51 -2
  202. package/dist/core/engine/validation.js +32 -5
  203. package/dist/core/engine/waiting-update-response.d.ts +8 -0
  204. package/dist/core/engine/waiting-update-response.js +22 -0
  205. package/dist/core/engine/workflow-concurrency.d.ts +10 -0
  206. package/dist/core/engine/workflow-concurrency.js +136 -0
  207. package/dist/core/engine/workflow-feed.d.ts +4 -5
  208. package/dist/core/engine/workflow-feed.js +4 -1
  209. package/dist/core/engine/workflow-indexes.d.ts +9 -0
  210. package/dist/core/engine/workflow-indexes.js +10 -0
  211. package/dist/core/engine/workflow-state-stream.js +33 -13
  212. package/dist/core/engine/workflow-visibility-queries.d.ts +2 -2
  213. package/dist/core/engine-helpers.js +1 -0
  214. package/dist/core/events/activity-events.d.ts +43 -12
  215. package/dist/core/events/activity-events.js +28 -0
  216. package/dist/core/events/attribute-events.d.ts +2 -3
  217. package/dist/core/events/event-map.d.ts +18 -12
  218. package/dist/core/events/index.d.ts +1 -0
  219. package/dist/core/events/index.js +1 -0
  220. package/dist/core/events/schedule-events.d.ts +71 -0
  221. package/dist/core/events/schedule-events.js +29 -0
  222. package/dist/core/events/signal-events.d.ts +4 -6
  223. package/dist/core/events/system-events.d.ts +29 -19
  224. package/dist/core/events/system-events.js +26 -0
  225. package/dist/core/events/update-events.d.ts +6 -8
  226. package/dist/core/events/workflow-events.d.ts +88 -23
  227. package/dist/core/events/workflow-events.js +26 -0
  228. package/dist/core/failure-categories.js +5 -17
  229. package/dist/core/fault-code.d.ts +9 -3
  230. package/dist/core/fault-code.js +1 -0
  231. package/dist/core/inline-execution-strategy.context-options.d.ts +69 -0
  232. package/dist/core/inline-execution-strategy.context-options.js +56 -0
  233. package/dist/core/inline-execution-strategy.d.ts +31 -36
  234. package/dist/core/inline-execution-strategy.js +16 -27
  235. package/dist/core/list-filter-validation.d.ts +1 -1
  236. package/dist/core/payload-size.d.ts +1 -1
  237. package/dist/core/persisted-data-incompatible-error.d.ts +9 -7
  238. package/dist/core/review/events.d.ts +6 -8
  239. package/dist/core/scheduler/scheduler-class.d.ts +10 -1
  240. package/dist/core/scheduler/scheduler-class.js +38 -11
  241. package/dist/core/scheduler/timer-batch.js +9 -1
  242. package/dist/core/scheduler/timer-sources.d.ts +1 -0
  243. package/dist/core/scheduler/timer-sources.js +11 -5
  244. package/dist/core/session-state.d.ts +0 -1
  245. package/dist/core/session-state.js +2 -2
  246. package/dist/core/start-workflow-validation.d.ts +34 -0
  247. package/dist/core/start-workflow-validation.js +19 -0
  248. package/dist/core/types/activity-verification.d.ts +67 -0
  249. package/dist/core/types/activity-verification.js +0 -0
  250. package/dist/core/types/activity.d.ts +80 -61
  251. package/dist/core/types/bulk.d.ts +50 -9
  252. package/dist/core/types/checkpoint.d.ts +44 -8
  253. package/dist/core/types/list-options.d.ts +146 -0
  254. package/dist/core/types/list-options.js +0 -0
  255. package/dist/core/types/options.d.ts +121 -165
  256. package/dist/core/types/schedules.d.ts +39 -3
  257. package/dist/core/types/services-resolution.d.ts +2 -2
  258. package/dist/core/types/workflow-builder-runtime.d.ts +12 -3
  259. package/dist/core/types/workflow-builder-runtime.js +11 -2
  260. package/dist/core/types/workflow-builder.d.ts +42 -11
  261. package/dist/core/types/workflow-concurrency.d.ts +39 -0
  262. package/dist/core/types/workflow-concurrency.js +0 -0
  263. package/dist/core/types/workflow-context.d.ts +157 -14
  264. package/dist/core/types/workflow-definition.d.ts +53 -10
  265. package/dist/core/types/workflow-function.d.ts +84 -9
  266. package/dist/core/types/workflow-log.d.ts +98 -0
  267. package/dist/core/types/workflow-log.js +0 -0
  268. package/dist/core/types/workflow-registries.d.ts +14 -3
  269. package/dist/core/types/workflow-registry.d.ts +3 -0
  270. package/dist/core/types.d.ts +4 -0
  271. package/dist/core/types.js +4 -0
  272. package/dist/core/versioning.d.ts +9 -39
  273. package/dist/core/versioning.js +2 -12
  274. package/dist/core/weft-error.d.ts +44 -1
  275. package/dist/core/weft-error.js +16 -0
  276. package/dist/core/worker-execution-strategy-options.d.ts +26 -0
  277. package/dist/core/worker-execution-strategy.js +40 -36
  278. package/dist/core/worker-inbound-message.d.ts +38 -0
  279. package/dist/core/worker-inbound-message.js +37 -0
  280. package/dist/core/worker-log-abuse-counter.d.ts +175 -0
  281. package/dist/core/worker-log-abuse-counter.js +107 -0
  282. package/dist/core/worker-message-helpers.d.ts +47 -0
  283. package/dist/core/worker-message-helpers.js +26 -0
  284. package/dist/core/worker-protocol-guard.js +1 -1
  285. package/dist/core/worker-protocol-log.d.ts +56 -0
  286. package/dist/core/worker-protocol-log.js +18 -0
  287. package/dist/core/worker-protocol.d.ts +23 -0
  288. package/dist/core/worker-protocol.js +12 -2
  289. package/dist/core/workflow-version-tuple.d.ts +3 -9
  290. package/dist/core/workflow-version-tuple.js +2 -3
  291. package/dist/diagnostics/format.js +1 -6
  292. package/dist/diagnostics/types.d.ts +4 -5
  293. package/dist/diagnostics/validate.d.ts +0 -1
  294. package/dist/diagnostics/version-check.d.ts +1 -1
  295. package/dist/diagnostics/version-check.js +4 -9
  296. package/dist/index.d.ts +12 -10
  297. package/dist/index.js +29 -3
  298. package/dist/json-schema.js +3 -3
  299. package/dist/mcp/cli.js +19 -19
  300. package/dist/mcp/dispatcher.js +1 -1
  301. package/dist/mcp/http.js +16 -6
  302. package/dist/mcp/protocol.d.ts +2 -0
  303. package/dist/mcp/protocol.js +1 -1
  304. package/dist/mcp/session.d.ts +16 -0
  305. package/dist/mcp/session.js +59 -6
  306. package/dist/mcp/tools.js +73 -6
  307. package/dist/observability/index.js +2 -2
  308. package/dist/server/asyncapi-channels.js +5 -2
  309. package/dist/server/attribute-filters.d.ts +8 -3
  310. package/dist/server/attribute-filters.js +6 -1
  311. package/dist/server/authentication/api-key.d.ts +2 -1
  312. package/dist/server/authentication/api-key.js +5 -2
  313. package/dist/server/authentication/constant-time-api-key.d.ts +15 -0
  314. package/dist/server/authentication/constant-time-api-key.js +24 -0
  315. package/dist/server/authentication/index.d.ts +1 -1
  316. package/dist/server/authentication/index.js +7 -4
  317. package/dist/server/authentication/rotating-api-key-store.d.ts +5 -3
  318. package/dist/server/authentication/rotating-api-key-store.js +19 -11
  319. package/dist/server/engine-event-feed-backend.d.ts +4 -5
  320. package/dist/server/fault-to-http.js +8 -1
  321. package/dist/server/fault-to-json-rpc.js +1 -0
  322. package/dist/server/fleet-event-feed.d.ts +31 -0
  323. package/dist/server/fleet-event-feed.js +157 -0
  324. package/dist/server/handler/index.js +1 -1
  325. package/dist/server/handler/response-helpers.js +2 -1
  326. package/dist/server/handler/route-dispatch.d.ts +6 -3
  327. package/dist/server/handler/route-dispatch.js +2 -2
  328. package/dist/server/handler.js +23 -23
  329. package/dist/server/index.d.ts +32 -2
  330. package/dist/server/index.js +32 -32
  331. package/dist/server/json-rpc-transport-helpers.d.ts +1 -0
  332. package/dist/server/json-rpc-transport-helpers.js +2 -1
  333. package/dist/server/json-rpc-websocket-runtime.d.ts +11 -2
  334. package/dist/server/json-rpc-websocket-runtime.js +1 -0
  335. package/dist/server/json-rpc-websocket-subscriptions.d.ts +10 -0
  336. package/dist/server/json-rpc-websocket-subscriptions.js +29 -0
  337. package/dist/server/json-rpc-websocket-types.d.ts +22 -0
  338. package/dist/server/json-rpc-websocket-types.js +0 -0
  339. package/dist/server/json-rpc-websocket-validation.js +20 -4
  340. package/dist/server/json-rpc-websocket.d.ts +2 -43
  341. package/dist/server/json-rpc-websocket.js +57 -74
  342. package/dist/server/openapi.d.ts +2 -1
  343. package/dist/server/openapi.js +1 -3
  344. package/dist/server/openrpc-document-schema.d.ts +78 -0
  345. package/dist/server/openrpc-document-schema.js +27 -1
  346. package/dist/server/openrpc-errors.d.ts +3 -0
  347. package/dist/server/openrpc-errors.js +2 -1
  348. package/dist/server/openrpc.js +32 -0
  349. package/dist/server/operation-catalog/index.d.ts +1 -1
  350. package/dist/server/operation-catalog/pipeline-helpers.js +1 -0
  351. package/dist/server/operation-catalog/pipeline-stages.js +26 -12
  352. package/dist/server/operation-catalog/pipeline.js +8 -1
  353. package/dist/server/operation-catalog/registry.js +13 -0
  354. package/dist/server/operation-catalog/types.d.ts +20 -9
  355. package/dist/server/operation-fault.d.ts +10 -0
  356. package/dist/server/operation-fault.js +2 -0
  357. package/dist/server/operation-registry.d.ts +12 -11
  358. package/dist/server/operation-registry.js +12 -3
  359. package/dist/server/operations/aggregate-workflows.d.ts +15 -15
  360. package/dist/server/operations/async-activity.d.ts +2 -2
  361. package/dist/server/operations/async-activity.js +12 -7
  362. package/dist/server/operations/bulk-cancel-workflows.d.ts +1 -1
  363. package/dist/server/operations/bulk-cancel-workflows.js +2 -2
  364. package/dist/server/operations/bulk-delete-workflows.d.ts +1 -1
  365. package/dist/server/operations/bulk-delete-workflows.js +2 -2
  366. package/dist/server/operations/bulk-filter-helpers.d.ts +8 -6
  367. package/dist/server/operations/bulk-filter-helpers.js +54 -24
  368. package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +11 -9
  369. package/dist/server/operations/bulk-mutate-workflow-tags.js +2 -2
  370. package/dist/server/operations/bulk-operation-helpers.d.ts +2 -2
  371. package/dist/server/operations/bulk-retry-failed-workflows.d.ts +7 -0
  372. package/dist/server/operations/bulk-retry-failed-workflows.js +64 -0
  373. package/dist/server/operations/bulk-signal-workflows.d.ts +11 -9
  374. package/dist/server/operations/bulk-signal-workflows.js +2 -2
  375. package/dist/server/operations/cancel-schedule.d.ts +1 -1
  376. package/dist/server/operations/create-schedule.d.ts +3 -1
  377. package/dist/server/operations/create-schedule.js +29 -11
  378. package/dist/server/operations/fleet-events-subscription.d.ts +54 -0
  379. package/dist/server/operations/fleet-events-subscription.js +99 -0
  380. package/dist/server/operations/fork-workflow.d.ts +1 -1
  381. package/dist/server/operations/fork-workflow.js +3 -2
  382. package/dist/server/operations/get-checkpoint-at.d.ts +1 -1
  383. package/dist/server/operations/get-registry.d.ts +1 -1
  384. package/dist/server/operations/get-retention-overview.d.ts +1 -1
  385. package/dist/server/operations/get-review.d.ts +1 -1
  386. package/dist/server/operations/get-schedule.d.ts +1 -1
  387. package/dist/server/operations/get-stream-chunks.d.ts +1 -1
  388. package/dist/server/operations/get-system-metrics.d.ts +2 -2
  389. package/dist/server/operations/get-task-diagnostics.d.ts +45 -6
  390. package/dist/server/operations/get-task-diagnostics.js +101 -7
  391. package/dist/server/operations/get-update-result.d.ts +1 -1
  392. package/dist/server/operations/get-workflow-attributes.d.ts +1 -1
  393. package/dist/server/operations/get-workflow-events.d.ts +1 -1
  394. package/dist/server/operations/get-workflow-result.d.ts +1 -1
  395. package/dist/server/operations/get-workflow-timeline.d.ts +1 -1
  396. package/dist/server/operations/get-workflow.d.ts +1 -1
  397. package/dist/server/operations/list-checkpoints.d.ts +1 -1
  398. package/dist/server/operations/list-reviews.d.ts +1 -1
  399. package/dist/server/operations/list-schedules.d.ts +1 -1
  400. package/dist/server/operations/list-task-queues.d.ts +2 -2
  401. package/dist/server/operations/list-workers.d.ts +2 -2
  402. package/dist/server/operations/list-workflows.d.ts +1 -1
  403. package/dist/server/operations/operation-helpers.d.ts +16 -1
  404. package/dist/server/operations/operation-helpers.js +15 -3
  405. package/dist/server/operations/pause-schedule.d.ts +1 -1
  406. package/dist/server/operations/purge-workflows.d.ts +5 -5
  407. package/dist/server/operations/purge-workflows.js +2 -2
  408. package/dist/server/operations/query-workflow.d.ts +1 -1
  409. package/dist/server/operations/query-workflow.js +3 -2
  410. package/dist/server/operations/recover-all.d.ts +1 -1
  411. package/dist/server/operations/replay-workflow.d.ts +1 -1
  412. package/dist/server/operations/resume-schedule.d.ts +1 -1
  413. package/dist/server/operations/set-workflow-attributes.d.ts +1 -1
  414. package/dist/server/operations/set-workflow-attributes.js +6 -3
  415. package/dist/server/operations/signal-workflow.js +8 -3
  416. package/dist/server/operations/single-workflow-tag-mutation.js +13 -3
  417. package/dist/server/operations/start-or-signal-workflow.d.ts +6 -1
  418. package/dist/server/operations/start-or-signal-workflow.js +14 -24
  419. package/dist/server/operations/start-workflow-options.d.ts +6 -0
  420. package/dist/server/operations/start-workflow-rest-input.d.ts +14 -0
  421. package/dist/server/operations/start-workflow-rest-input.js +31 -0
  422. package/dist/server/operations/start-workflow.d.ts +1 -1
  423. package/dist/server/operations/start-workflow.js +8 -23
  424. package/dist/server/operations/storage.d.ts +6 -6
  425. package/dist/server/operations/storage.js +24 -14
  426. package/dist/server/operations/stream-workflow-sse.d.ts +1 -1
  427. package/dist/server/operations/submit-review-decision.d.ts +1 -1
  428. package/dist/server/operations/submit-review-decision.js +6 -3
  429. package/dist/server/operations/update-schedule.d.ts +1 -1
  430. package/dist/server/operations/update-schedule.js +7 -4
  431. package/dist/server/operations/update-workflow.d.ts +1 -1
  432. package/dist/server/operations/update-workflow.js +7 -3
  433. package/dist/server/operations/worker-drain.d.ts +8 -8
  434. package/dist/server/operations/worker-drain.js +11 -8
  435. package/dist/server/operations/workflow-events-subscription.d.ts +7 -8
  436. package/dist/server/operations/workflow-events-subscription.js +43 -8
  437. package/dist/server/rest-binding.d.ts +3 -1
  438. package/dist/server/rest-bindings.js +12 -0
  439. package/dist/server/rest-body.d.ts +10 -0
  440. package/dist/server/rest-body.js +80 -0
  441. package/dist/server/runtime/authentication-bridge.d.ts +1 -0
  442. package/dist/server/runtime/authentication-bridge.js +33 -6
  443. package/dist/server/runtime/client-visible-events.d.ts +3 -0
  444. package/dist/server/runtime/client-visible-events.js +65 -0
  445. package/dist/server/runtime/context.d.ts +7 -0
  446. package/dist/server/runtime/event-broadcasting.d.ts +6 -0
  447. package/dist/server/runtime/event-broadcasting.js +72 -38
  448. package/dist/server/runtime/retry.d.ts +1 -0
  449. package/dist/server/runtime/retry.js +14 -0
  450. package/dist/server/runtime/shutdown.d.ts +7 -6
  451. package/dist/server/runtime/shutdown.js +6 -1
  452. package/dist/server/runtime/task-polling.js +61 -20
  453. package/dist/server/runtime/task-reconciliation.js +9 -1
  454. package/dist/server/runtime/task-result-resolution.d.ts +15 -0
  455. package/dist/server/runtime/task-result-resolution.js +81 -0
  456. package/dist/server/runtime/websocket-stream.d.ts +20 -1
  457. package/dist/server/runtime/websocket-stream.js +173 -7
  458. package/dist/server/runtime/websocket-upgrade.js +22 -3
  459. package/dist/server/runtime/websocket-worker.d.ts +1 -1
  460. package/dist/server/runtime/websocket-worker.js +38 -30
  461. package/dist/server/serve-internals.d.ts +3 -1
  462. package/dist/server/serve-internals.js +18 -2
  463. package/dist/server/task-state.d.ts +30 -0
  464. package/dist/server/task-state.js +28 -0
  465. package/dist/server/workflow-event-feed.d.ts +36 -115
  466. package/dist/server/workflow-event-feed.js +92 -27
  467. package/dist/service-worker/index.js +30 -30
  468. package/dist/storage/auto.js +1 -1
  469. package/dist/storage/bun-sql.js +24 -0
  470. package/dist/storage/compressed-storage.js +1 -1
  471. package/dist/storage/default-scope.d.ts +7 -4
  472. package/dist/storage/http.js +2 -2
  473. package/dist/storage/index.d.ts +76 -4
  474. package/dist/storage/indexeddb.js +1 -1
  475. package/dist/storage/interface.d.ts +163 -0
  476. package/dist/storage/interface.js +1 -1
  477. package/dist/storage/key-prefixes.d.ts +1 -1
  478. package/dist/storage/key-prefixes.js +10 -0
  479. package/dist/storage/lmdb.d.ts +4 -3
  480. package/dist/storage/lmdb.js +1 -1
  481. package/dist/storage/memory.js +1 -1
  482. package/dist/storage/neon-batch.d.ts +30 -0
  483. package/dist/storage/neon-batch.js +30 -0
  484. package/dist/storage/neon-value-mapping.d.ts +30 -3
  485. package/dist/storage/neon-value-mapping.js +12 -0
  486. package/dist/storage/neon.d.ts +16 -0
  487. package/dist/storage/neon.js +9 -4
  488. package/dist/storage/node-sqlite.js +23 -0
  489. package/dist/storage/postgres-key-value-queries.d.ts +69 -44
  490. package/dist/storage/postgres-key-value-queries.js +62 -24
  491. package/dist/storage/resolve.js +1 -1
  492. package/dist/storage/scoped-storage.js +1 -1
  493. package/dist/storage/testing.d.ts +168 -0
  494. package/dist/storage/testing.js +2 -0
  495. package/dist/storage/turso.d.ts +8 -0
  496. package/dist/storage/turso.js +2 -2
  497. package/dist/storage/typed-storage.js +1 -1
  498. package/dist/storage/web-extension.js +1 -1
  499. package/dist/testing/index.js +20 -20
  500. package/dist/version.d.ts +1 -1
  501. package/dist/version.js +1 -1
  502. package/dist/worker/protocol.js +1 -1
  503. package/dist/workers/worker-replay-state.d.ts +32 -0
  504. package/dist/workers/worker-replay-state.js +35 -0
  505. package/dist/workers/worker-state-namespace.d.ts +21 -0
  506. package/dist/workers/worker-state-namespace.js +13 -0
  507. package/dist/workers/workflow-runner.d.ts +19 -15
  508. package/dist/workers/workflow-runner.js +72 -60
  509. package/dist/workers/workflow-worker-entry.js +5 -2
  510. package/package.json +5 -1
@@ -3,6 +3,7 @@ import type { Storage as WeftStorage } from '../../storage/interface.ts';
3
3
  import { ActivityWorkerDispatcher } from '../../workers/activity-worker-dispatcher.ts';
4
4
  import type { ComposedWorkflowInterceptor, Interceptor } from '../interceptor.ts';
5
5
  import { type AnyActivityDefinition, type AnyWorkflowDefinition, type EngineOptions, type RegisteredWorkflowDefinition } from '../types.ts';
6
+ import type { WorkflowLogRecord } from '../types/workflow-log.ts';
6
7
  import type { EngineConstructorOptions, ExecutionStrategyBundle, RegistrationEntry, ResolvedOptions } from './engine-internal-types.ts';
7
8
  export type KnownWorkflowNames<TWorkflows extends object> = Extract<keyof TWorkflows, string>;
8
9
  declare const emptyWorkflowDefinitions: unique symbol;
@@ -53,7 +54,9 @@ export declare function createExecutionStrategyBundle(parameters: {
53
54
  getComposedWorkflowInterceptor?: () => ComposedWorkflowInterceptor | null;
54
55
  resolveWorkflowType: (target: string | Function) => string;
55
56
  registerCancelHandler?: (workflowId: string, handler: () => Promise<void> | void) => () => void;
57
+ recordFinalizerState?: (workflowId: string, value: unknown) => void;
56
58
  getWorkflowServices?: (workflowId: string) => unknown;
59
+ getLogSink?: () => ((record: WorkflowLogRecord) => void) | undefined;
57
60
  }): ExecutionStrategyBundle;
58
61
  export declare function createActivityWorkerDispatcher(activityExecution: EngineConstructorOptions['activityExecution']): ActivityWorkerDispatcher | null;
59
62
  export declare function createAlertManagerForEngine(engine: EventTarget, alerts: EngineOptions['alerts'] | undefined, getNow: () => number): AlertManager | null;
@@ -3,6 +3,7 @@ import { CompressedStorage } from "../../storage/compressed-storage.js";
3
3
  import { MemoryStorage } from "../../storage/memory.js";
4
4
  import { ActivityWorkerDispatcher } from "../../workers/activity-worker-dispatcher.js";
5
5
  import { WorkerPool } from "../../workers/pool.js";
6
+ import { optionalInlineDependencies } from "../inline-execution-strategy.context-options.js";
6
7
  import { InlineExecutionStrategy } from "../inline-execution-strategy.js";
7
8
  import {
8
9
  DEFAULT_RETENTION_SWEEP_BATCH_SIZE,
@@ -14,6 +15,7 @@ import {
14
15
  DEFAULT_WORKER_TURN_TIMEOUT_MS,
15
16
  MIN_WORKER_PROTOCOL_MESSAGE_BYTES
16
17
  } from "../worker-protocol.js";
18
+ import { resolveOwnershipFields } from "./ownership-options.js";
17
19
  import {
18
20
  normalizeHistoryPolicy,
19
21
  normalizePayloadSizePolicy,
@@ -70,7 +72,8 @@ export function copyWorkflowDefinition(type, registration) {
70
72
  ...registration.description === void 0 ? {} : { description: registration.description },
71
73
  ...registration.inputSchema === void 0 ? {} : { inputSchema: registration.inputSchema },
72
74
  ...registration.outputSchema === void 0 ? {} : { outputSchema: registration.outputSchema },
73
- ...registration.searchAttributes === void 0 ? {} : { searchAttributes: registration.searchAttributes }
75
+ ...registration.searchAttributes === void 0 ? {} : { searchAttributes: registration.searchAttributes },
76
+ ...registration.concurrency === void 0 ? {} : { concurrency: registration.concurrency }
74
77
  };
75
78
  }
76
79
  function resolveRetentionFields(options) {
@@ -116,11 +119,13 @@ export function resolveEngineOptions(storage, options, getNow) {
116
119
  storage,
117
120
  getNow,
118
121
  resolveWorkflowServices: options?.resolveWorkflowServices ?? null,
122
+ onLog: options?.onLog ?? null,
119
123
  ...resolveBooleanDefaults(options),
120
124
  ...resolveNumericDefaults(options),
121
125
  ...resolveRetentionFields(options),
122
126
  ...resolveHistoryFields(options),
123
- ...resolveSecondInstanceFields(options)
127
+ ...resolveSecondInstanceFields(options),
128
+ ...resolveOwnershipFields(options)
124
129
  };
125
130
  }
126
131
  export function normalizeWorkerExecutionConfiguration(options) {
@@ -180,19 +185,23 @@ export function createExecutionStrategyBundle(parameters) {
180
185
  getComposedWorkflowInterceptor,
181
186
  resolveWorkflowType,
182
187
  registerCancelHandler,
183
- getWorkflowServices
188
+ recordFinalizerState,
189
+ getWorkflowServices,
190
+ getLogSink
184
191
  } = parameters, workerExecutionConfiguration = normalizeWorkerExecutionConfiguration(options);
185
192
  if (workerExecutionConfiguration.mode === "worker") {
186
193
  const pool = new WorkerPool({
187
194
  workerUrl: workerExecutionConfiguration.workerExecution.workerUrl,
188
195
  concurrency: workerExecutionConfiguration.workerExecution.poolSize ?? 4,
189
196
  smol: workerExecutionConfiguration.workerExecution.smol ?? !1
190
- }), strategyOptions = {
197
+ }), logSink = getLogSink?.(), strategyOptions = {
191
198
  broadcastEvents,
192
199
  requireProtocolVersion: workerExecutionConfiguration.requireProtocolVersion,
193
200
  discardOnCancel: workerExecutionConfiguration.discardOnCancel,
194
201
  workflowTurnTimeoutMs: workerExecutionConfiguration.workflowTurnTimeoutMs,
195
- maxProtocolMessageBytes: workerExecutionConfiguration.maxProtocolMessageBytes
202
+ maxProtocolMessageBytes: workerExecutionConfiguration.maxProtocolMessageBytes,
203
+ getNow,
204
+ ...logSink !== void 0 && { onLog: logSink }
196
205
  };
197
206
  return {
198
207
  strategy: new WorkerExecutionStrategy(pool, strategyOptions),
@@ -201,13 +210,17 @@ export function createExecutionStrategyBundle(parameters) {
201
210
  }
202
211
  const inlineStrategy = new InlineExecutionStrategy({
203
212
  getRegistration,
204
- ...getComposedWorkflowInterceptor !== void 0 && { getComposedWorkflowInterceptor },
205
213
  getNow,
206
214
  maxNestingDepth,
207
215
  development,
208
216
  resolveWorkflowType,
209
- ...registerCancelHandler !== void 0 && { registerCancelHandler },
210
- ...getWorkflowServices !== void 0 && { getWorkflowServices }
217
+ ...optionalInlineDependencies({
218
+ getComposedWorkflowInterceptor,
219
+ registerCancelHandler,
220
+ recordFinalizerState,
221
+ getWorkflowServices,
222
+ getLogSink
223
+ })
211
224
  });
212
225
  return { strategy: inlineStrategy, inlineStrategy };
213
226
  }
@@ -0,0 +1,70 @@
1
+ import type { ContextOperationRequest } from '../context.ts';
2
+ import type { EngineInternals } from './internals.ts';
3
+ /**
4
+ * The largest delay a host `setTimeout` can hold without overflow. Node and Bun
5
+ * store the delay in a 32-bit signed integer, so a value above this wraps and
6
+ * the timer fires almost immediately. A multi-day race-branch sleep must be
7
+ * chunked under this ceiling and re-armed, or it would win its race instantly.
8
+ */
9
+ export declare const MAX_TIMER_DELAY_MS = 2147483647;
10
+ /**
11
+ * Compute the next host-timer delay for a race-branch sleep: the milliseconds
12
+ * remaining until the deterministic `scheduledFireAt` deadline, clamped to
13
+ * `[0, MAX_TIMER_DELAY_MS]`. Clamping to the ceiling is what prevents a multi-day
14
+ * sleep from overflowing `setTimeout` and firing instantly — the caller re-arms
15
+ * against the same deadline until the remaining delay reaches `0`.
16
+ */
17
+ export declare function nextSleepTimerDelayMs(scheduledFireAt: number, now: number): number;
18
+ /**
19
+ * Abortable in-process `sleep` branch for `ctx.race` / `ctx.all`.
20
+ *
21
+ * Unlike a top-level `ctx.sleep` (which arms a durable timer and parks the whole
22
+ * generator), a sleep branch inside a coordination operation is a TRANSIENT
23
+ * in-process wait: the coordination operation as a whole is the durable unit, and
24
+ * on replay the cached winner short-circuits before any branch re-runs. So this
25
+ * must NOT touch `internals.scheduler` (a durable timer write would corrupt the
26
+ * timer index) — it waits with a plain timer that the race's AbortController can
27
+ * cancel when another branch wins.
28
+ *
29
+ * The deadline is the operation's deterministic `scheduledFireAt`, compared
30
+ * against the engine clock (`internals.options.getNow()`), not wall-clock
31
+ * `Date.now()`, so a clock-overriding deployment stays consistent. The remaining
32
+ * delay is recomputed against that absolute deadline on every chunk, which both
33
+ * chunks delays beyond {@link MAX_TIMER_DELAY_MS} (so a multi-day sleep does not
34
+ * overflow `setTimeout` and fire instantly) and self-corrects for timer drift.
35
+ *
36
+ * Note: because the timer is a real event-loop timer, a long sleep that WINS its
37
+ * race is not driven by a virtual-clock `advanceTime`; tests should use short
38
+ * real durations for sleep-wins paths (sleep-loses paths need no timing — the
39
+ * abort fires).
40
+ *
41
+ * The timer also observes the engine abort signal so a long sleep branch does
42
+ * not outlive engine disposal. `ctx.all` does not abort siblings (it has no
43
+ * loser), so without watching `internals.abortController.signal` a multi-day
44
+ * `ctx.all([ctx.sleep('30d')])` branch would keep a host timer alive after the
45
+ * engine is gone.
46
+ */
47
+ export declare function executeSleepSubOperation(internals: EngineInternals, operation: Extract<ContextOperationRequest, {
48
+ type: 'sleep';
49
+ }>, signal?: AbortSignal): Promise<void>;
50
+ /**
51
+ * Abortable in-process `wait-signal` branch for `ctx.race` / `ctx.all`.
52
+ *
53
+ * A wait-signal branch must never consume its durable signal record itself —
54
+ * when it is woken it does not yet know whether it WON its race. So on delivery
55
+ * it resolves with a {@link createDeferredConsumeEnvelope | deferred-consume
56
+ * envelope}: the single atomic {@link consumeSignalWithAtomicWorkflowCommit} is wrapped in
57
+ * `finalize` and performed ONLY by the coordinator, on the winner, strictly
58
+ * after `Promise.race` / `Promise.all` settles. A losing branch (race settled by
59
+ * a sibling → `signal` aborts) drops its envelope unfinalized and releases its
60
+ * waiter via {@link releaseSignalWaiter} WITHOUT consuming, so the signal
61
+ * survives for a later `waitForSignal` or a replay.
62
+ *
63
+ * Reads are non-destructive {@link peekSignal}s until the coordinator finalizes;
64
+ * the identity-guarded release (`expectedResolve === deliver`) ensures a loser
65
+ * never clobbers another waiter (e.g. a later top-level `waitForSignal`) that
66
+ * reused the shared `${workflowId}:${signalName}` key.
67
+ */
68
+ export declare function executeWaitSignalSubOperation(internals: EngineInternals, workflowId: string, operation: Extract<ContextOperationRequest, {
69
+ type: 'wait-signal';
70
+ }>, signal?: AbortSignal): Promise<unknown>;
@@ -0,0 +1,107 @@
1
+ import { createDeferredConsumeEnvelope } from "./deferred-consume-envelope.js";
2
+ import {
3
+ consumeSignalWithAtomicWorkflowCommit,
4
+ peekSignal,
5
+ releaseSignalWaiter,
6
+ trackWaiterKey
7
+ } from "./signals.js";
8
+ export const MAX_TIMER_DELAY_MS = 2147483647;
9
+ export function nextSleepTimerDelayMs(scheduledFireAt, now) {
10
+ return Math.min(Math.max(0, scheduledFireAt - now), MAX_TIMER_DELAY_MS);
11
+ }
12
+ export function executeSleepSubOperation(internals, operation, signal) {
13
+ signal?.throwIfAborted();
14
+ const engineAbort = internals.abortController.signal;
15
+ if (engineAbort.aborted)
16
+ return Promise.reject(engineAbort.reason ?? Error("aborted"));
17
+ if (nextSleepTimerDelayMs(operation.scheduledFireAt, internals.options.getNow()) === 0)
18
+ return Promise.resolve();
19
+ return new Promise((resolve, reject) => {
20
+ let timer;
21
+ const cleanup = () => {
22
+ signal?.removeEventListener("abort", onAbort);
23
+ engineAbort.removeEventListener("abort", onAbort);
24
+ }, onAbort = () => {
25
+ clearTimeout(timer);
26
+ cleanup();
27
+ reject(signal?.reason ?? engineAbort.reason ?? Error("aborted"));
28
+ }, arm = () => {
29
+ const remainingMs = nextSleepTimerDelayMs(operation.scheduledFireAt, internals.options.getNow());
30
+ if (remainingMs === 0) {
31
+ cleanup();
32
+ resolve();
33
+ return;
34
+ }
35
+ timer = setTimeout(arm, remainingMs);
36
+ };
37
+ signal?.addEventListener("abort", onAbort, { once: !0 });
38
+ engineAbort.addEventListener("abort", onAbort, { once: !0 });
39
+ arm();
40
+ });
41
+ }
42
+ export function executeWaitSignalSubOperation(internals, workflowId, operation, signal) {
43
+ signal?.throwIfAborted();
44
+ const { signalName } = operation, waiterKey = `${workflowId}:${signalName}`, engineAbort = internals.abortController.signal;
45
+ return new Promise((resolve, reject) => {
46
+ let settled = !1, registered = !1;
47
+ const { promise: delivered, resolve: deliver } = Promise.withResolvers(), cleanup = () => {
48
+ signal?.removeEventListener("abort", onAbort);
49
+ engineAbort.removeEventListener("abort", onAbort);
50
+ }, finalize = async () => {
51
+ const consumed = await consumeSignalWithAtomicWorkflowCommit(internals, workflowId, signalName);
52
+ return consumed.found ? consumed.payload : void 0;
53
+ }, onAbort = () => {
54
+ if (settled)
55
+ return;
56
+ settled = !0;
57
+ cleanup();
58
+ if (registered)
59
+ releaseSignalWaiter(internals, workflowId, waiterKey, deliver);
60
+ reject(signal?.reason ?? engineAbort.reason ?? Error("aborted"));
61
+ }, win = () => {
62
+ if (settled)
63
+ return;
64
+ settled = !0;
65
+ cleanup();
66
+ resolve(createDeferredConsumeEnvelope(finalize));
67
+ }, fail = (error) => {
68
+ if (settled)
69
+ return;
70
+ settled = !0;
71
+ cleanup();
72
+ if (registered)
73
+ releaseSignalWaiter(internals, workflowId, waiterKey, deliver);
74
+ reject(error);
75
+ };
76
+ signal?.addEventListener("abort", onAbort, { once: !0 });
77
+ engineAbort.addEventListener("abort", onAbort, { once: !0 });
78
+ if (engineAbort.aborted) {
79
+ onAbort();
80
+ return;
81
+ }
82
+ (async () => {
83
+ const existing = await peekSignal(internals, workflowId, signalName);
84
+ if (settled)
85
+ return;
86
+ if (existing.found) {
87
+ win();
88
+ return;
89
+ }
90
+ internals.signalWaiters.set(waiterKey, deliver);
91
+ trackWaiterKey(internals.signalWaitersByWorkflow, workflowId, waiterKey);
92
+ registered = !0;
93
+ const buffered = await peekSignal(internals, workflowId, signalName);
94
+ if (settled)
95
+ return;
96
+ if (buffered.found) {
97
+ releaseSignalWaiter(internals, workflowId, waiterKey, deliver);
98
+ win();
99
+ return;
100
+ }
101
+ await delivered;
102
+ if (settled)
103
+ return;
104
+ win();
105
+ })().catch(fail);
106
+ });
107
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Deferred-consume envelopes for `wait-signal` branches inside `ctx.race` /
3
+ * `ctx.all`.
4
+ *
5
+ * A `wait-signal` branch must NOT destructively consume its durable signal
6
+ * record when it is woken — at that moment it does not yet know whether it WON
7
+ * its race. If a losing branch consumed, it would delete a signal that a later
8
+ * `waitForSignal` (or a replay) still needs. So a woken wait-signal branch
9
+ * resolves with one of these envelopes instead of a value: the branch defers the
10
+ * single destructive {@link import('./signals.ts').consumeSignal} into
11
+ * `finalize`, and ONLY the coordinator — which authoritatively knows the race
12
+ * winner once `Promise.race` settles — calls `finalize()`, on the winner alone.
13
+ * Losing branches drop their envelope unfinalized and release their waiter
14
+ * without consuming, so the signal survives.
15
+ *
16
+ * The envelope is branded with a unique {@link DEFERRED_CONSUME_BRAND} symbol and
17
+ * detected ONLY by that symbol, never structurally — a user's signal payload can
18
+ * legitimately be an object shaped like `{ finalize }`, and a structural check
19
+ * would misfire on it.
20
+ *
21
+ * Envelopes must never reach the durable operation cache (a function cannot
22
+ * round-trip `encode`/`decode`), so the coordinator finalize-and-unwraps every
23
+ * winning branch's envelope before the operation result is written — including
24
+ * envelopes nested at arbitrary positions inside a `ctx.all` array result that a
25
+ * nested coordinator surfaces up to its parent.
26
+ */
27
+ declare const DEFERRED_CONSUME_BRAND: unique symbol;
28
+ /**
29
+ * A branch result whose real value is produced by a single deferred consume that
30
+ * only the winning coordinator performs.
31
+ */
32
+ export type DeferredConsumeEnvelope = {
33
+ readonly [DEFERRED_CONSUME_BRAND]: true;
34
+ /** Perform the single destructive consume and return the consumed payload. */
35
+ readonly finalize: () => Promise<unknown>;
36
+ };
37
+ /** Wrap a deferred consume into a branded envelope. */
38
+ export declare function createDeferredConsumeEnvelope(finalize: () => Promise<unknown>): DeferredConsumeEnvelope;
39
+ /** Detect an envelope by its brand symbol only (never structurally). */
40
+ export declare function isDeferredConsumeEnvelope(value: unknown): value is DeferredConsumeEnvelope;
41
+ /**
42
+ * Finalize-and-unwrap a coordination result before it is written to the durable
43
+ * cache. A winning `wait-signal` branch surfaces a {@link DeferredConsumeEnvelope}
44
+ * whose `finalize()` performs the single consume; a nested `ctx.all` branch
45
+ * surfaces an ARRAY that may hold envelopes at arbitrary positions, so arrays are
46
+ * walked and each element finalized. Any other value passes through untouched.
47
+ *
48
+ * This runs only on the WINNING path (race winner, or every branch of a settled
49
+ * `ctx.all`), so finalizing here is exactly the linearization point of "this
50
+ * branch won" — the consume happens strictly after the coordinator settled, and a
51
+ * losing branch's envelope is never reached, so its signal is never consumed.
52
+ *
53
+ * The array walk reconstructs arrays via `Promise.all(map(...))`. This is safe
54
+ * because coordination results are cache-safe encoded data: they round-trip
55
+ * `encode`/`decode` for the durable cache, so sparse holes, custom array
56
+ * properties, subclasses, and array identity are not preserved semantics here.
57
+ */
58
+ export declare function finalizeAndUnwrap(value: unknown): Promise<unknown>;
59
+ export {};
@@ -0,0 +1,14 @@
1
+ const DEFERRED_CONSUME_BRAND = Symbol("weft.deferredConsume");
2
+ export function createDeferredConsumeEnvelope(finalize) {
3
+ return { [DEFERRED_CONSUME_BRAND]: !0, finalize };
4
+ }
5
+ export function isDeferredConsumeEnvelope(value) {
6
+ return typeof value === "object" && value !== null && value[DEFERRED_CONSUME_BRAND] === !0;
7
+ }
8
+ export async function finalizeAndUnwrap(value) {
9
+ if (isDeferredConsumeEnvelope(value))
10
+ return value.finalize();
11
+ if (Array.isArray(value))
12
+ return Promise.all(value.map((element) => finalizeAndUnwrap(element)));
13
+ return value;
14
+ }
@@ -10,6 +10,9 @@ export function disposeEngine(internals) {
10
10
  resolveSignalWaiter();
11
11
  internals.signalWaiters.clear();
12
12
  internals.signalWaitersByWorkflow.clear();
13
+ for (const resolveConditionWaiter of internals.conditionWaiters.values())
14
+ resolveConditionWaiter();
15
+ internals.conditionWaiters.clear();
13
16
  disposeQueuedInlineWorkflowStarts(internals);
14
17
  internals.scheduler[Symbol.dispose]();
15
18
  internals.strategy[Symbol.dispose]();
@@ -23,6 +26,7 @@ export function disposeEngine(internals) {
23
26
  }
24
27
  internals.nextRetentionSweepAt = null;
25
28
  disposeSecondInstanceDetection(internals);
29
+ disposeLeaseManager(internals);
26
30
  internals.handleCache.clear();
27
31
  for (const waiter of internals.resultResolvers.values())
28
32
  waiter.reject(new EngineDisposedError);
@@ -35,6 +39,7 @@ export function disposeEngine(internals) {
35
39
  internals.workflowReviewIds.clear();
36
40
  internals.parkedInlineWorkflows.clear();
37
41
  internals.terminalizingWorkflows.clear();
42
+ internals.deliveredPendingUpdateIds.clear();
38
43
  internals.reviewTimerIds.clear();
39
44
  for (const controller of internals.pendingWebhooks)
40
45
  controller.abort();
@@ -50,6 +55,8 @@ export function disposeEngine(internals) {
50
55
  internals.pendingScheduleCreations.clear();
51
56
  internals.eventLogHeads.clear();
52
57
  internals.pendingTimelineEntries.clear();
58
+ internals.pendingAtomicWorkflowCommitSideEffects.clear();
59
+ internals.pendingAsyncActivityResolutions.clear();
53
60
  internals.workflowVersionTuples.clear();
54
61
  internals.workflowFeedListeners.clear();
55
62
  internals.activityRegistriesByWorkflow.clear();
@@ -68,3 +75,9 @@ function disposeSecondInstanceDetection(internals) {
68
75
  internals.secondInstanceDetector = null;
69
76
  }
70
77
  }
78
+ function disposeLeaseManager(internals) {
79
+ if (internals.leaseManager !== null) {
80
+ internals.leaseManager.stop();
81
+ internals.leaseManager = null;
82
+ }
83
+ }
@@ -1,4 +1,4 @@
1
- import type { AnyActivityDefinition, AnyWorkflowDefinition, IsDefaultWorkflowRegistry } from '../types.ts';
1
+ import type { AnyActivityDefinition, AnyWorkflowDefinition, DefaultWorkflowRegistry, InferWorkflowEntries, IsDefaultWorkflowRegistry, WorkflowServicesUnion } from '../types.ts';
2
2
  import type { UnknownNameWhenRegistryHasNoKnownNames } from '../types/registry-type-helpers.ts';
3
3
  import type { KnownWorkflowNames } from './construction.ts';
4
4
  import type { EngineConstructorOptions } from './engine-internal-types.ts';
@@ -24,7 +24,7 @@ import type { EngineConstructorOptions } from './engine-internal-types.ts';
24
24
  * void engine;
25
25
  * ```
26
26
  */
27
- export type EngineCreateOptions<TWorkflowDefinitions extends Record<string, AnyWorkflowDefinition> = {}, TActivityDefinitions extends Record<string, AnyActivityDefinition> = {}> = EngineConstructorOptions & {
27
+ export type EngineCreateOptions<TWorkflowDefinitions extends Record<string, AnyWorkflowDefinition> = {}, TActivityDefinitions extends Record<string, AnyActivityDefinition> = {}> = EngineConstructorOptions<WorkflowServicesUnion<EngineCreateWorkflowRegistry<TWorkflowDefinitions>>> & {
28
28
  /** Workflow definitions to register before recovery. */
29
29
  workflows?: TWorkflowDefinitions;
30
30
  /** Activity definitions to register before workflows. */
@@ -34,13 +34,13 @@ export type EngineCreateOptions<TWorkflowDefinitions extends Record<string, AnyW
34
34
  * Recover stored running workflows after registration. Defaults to
35
35
  * `true`: a fresh engine booting against durable storage resumes any
36
36
  * workflows left in flight by a previous process. Pass `recover: false`
37
- * to opt out (tests, `ScopedStorage` isolation, pre-migration
37
+ * to opt out (tests, `ScopedStorage` isolation, explicit operator
38
38
  * inspection).
39
39
  */
40
40
  recover?: true | undefined;
41
41
  /**
42
42
  * Forwarded to `Engine.recoverAll`. Only use this during rolling
43
- * deploys or explicit storage migrations.
43
+ * deploys or explicit operator storage repair.
44
44
  */
45
45
  acknowledgeUnknownWorkflowTypes?: boolean;
46
46
  } | {
@@ -49,6 +49,16 @@ export type EngineCreateOptions<TWorkflowDefinitions extends Record<string, AnyW
49
49
  /** Only valid when recovery is enabled (the default). Invalid with `recover: false`. */
50
50
  acknowledgeUnknownWorkflowTypes?: never;
51
51
  });
52
+ /**
53
+ * Resolves the workflow registry type for `Engine.create` return values.
54
+ *
55
+ * When the provided workflow definition map is empty (`{}`), the resulting
56
+ * engine carries the same `DefaultWorkflowRegistry` brand as an engine
57
+ * constructed without a `workflows` map at all — the two are semantically
58
+ * identical. A non-empty map routes to `InferWorkflowEntries` so literal
59
+ * workflow-name inference is preserved.
60
+ */
61
+ export type EngineCreateWorkflowRegistry<TWorkflowDefinitions extends Record<string, AnyWorkflowDefinition>> = [keyof TWorkflowDefinitions & string] extends [never] ? DefaultWorkflowRegistry : InferWorkflowEntries<TWorkflowDefinitions>;
52
62
  export type UnknownWorkflowNameWhenDefaultRegistryIsEmpty<TWorkflows extends object, TName extends string> = IsDefaultWorkflowRegistry<TWorkflows> extends true ? UnknownNameWhenRegistryHasNoKnownNames<TName, KnownWorkflowNames<TWorkflows>> : never;
53
63
  export type ActivityDefinitionName<TDefinition extends AnyActivityDefinition> = TDefinition extends {
54
64
  readonly name: infer TName extends string;
@@ -2,7 +2,7 @@ import type { Storage as WeftStorage } from '../../storage/interface.ts';
2
2
  import type { ConstraintDefinition } from '../constraint.ts';
3
3
  import type { ExecutionStrategy } from '../execution-strategy.ts';
4
4
  import type { InlineExecutionStrategy } from '../inline-execution-strategy.ts';
5
- import type { ArchiveAdapter, Checkpoint, DefinitionSchema, EngineOptions, NormalizedHistoryPolicy, NormalizedPayloadSizePolicy, NormalizedRetentionPolicy, SearchAttributeSchema, WorkflowFunction, WorkflowTimelineEntry } from '../types.ts';
5
+ import type { AnyActivityDefinition, ArchiveAdapter, Checkpoint, DefinitionSchema, EngineOptions, NormalizedHistoryPolicy, NormalizedPayloadSizePolicy, NormalizedRetentionPolicy, SearchAttributeSchema, WorkflowConcurrencyOptions, WorkflowFunction, WorkflowTimelineEntry } from '../types.ts';
6
6
  export interface RegistrationEntry {
7
7
  handler: WorkflowFunction;
8
8
  version: string;
@@ -10,10 +10,16 @@ export interface RegistrationEntry {
10
10
  tags?: ReadonlyArray<string>;
11
11
  inputSchema?: DefinitionSchema;
12
12
  outputSchema?: DefinitionSchema;
13
- migrate?: (checkpoint: unknown, fromVersion: string) => unknown;
14
13
  searchAttributes?: SearchAttributeSchema;
15
14
  retention?: NormalizedRetentionPolicy;
15
+ concurrency?: WorkflowConcurrencyOptions;
16
16
  constraints?: ConstraintDefinition[];
17
+ /**
18
+ * Definition-level teardown activity (issue #446), driven by the engine after a
19
+ * `cancelled`/`timed-out` terminal. Stored on the engine-lifetime registry so it
20
+ * survives per-workflow terminal cleanup; resolved at teardown by workflow type.
21
+ */
22
+ finalizer?: AnyActivityDefinition;
17
23
  }
18
24
  export interface ResolvedOptions {
19
25
  storage: WeftStorage;
@@ -33,19 +39,36 @@ export interface ResolvedOptions {
33
39
  secondInstanceDetectionEnabled: boolean;
34
40
  /** Heartbeat interval (ms) for the second-instance detector when enabled. */
35
41
  secondInstanceHeartbeatIntervalMs: number;
42
+ /**
43
+ * Single-writer ownership posture. `'none'` recovers immediately (infra owns
44
+ * mutual exclusion); `'lease'` acquires a storage lease before recovery. The
45
+ * lease tuning fields below are only meaningful when this is `'lease'`.
46
+ */
47
+ ownershipMode: 'none' | 'lease';
48
+ /** Lease time-to-live (ms) when `ownershipMode` is `'lease'`. */
49
+ leaseTtlMs: number;
50
+ /** Lease renewal interval (ms) when `ownershipMode` is `'lease'`. */
51
+ leaseRenewIntervalMs: number;
52
+ /** Boot-time lease acquisition wait window (ms) when `ownershipMode` is `'lease'`. */
53
+ leaseWaitTimeoutMs: number;
36
54
  getNow: () => number;
37
55
  /**
38
56
  * Re-provides the non-serialized per-run `services` value on recovery; `null`
39
57
  * when the engine was created without `resolveWorkflowServices`.
40
58
  */
41
59
  resolveWorkflowServices: EngineOptions['resolveWorkflowServices'] | null;
60
+ /**
61
+ * Host sink for `ctx.log` records (`EngineOptions.onLog`); `null` when the engine
62
+ * was created without one (the default console behavior).
63
+ */
64
+ onLog: EngineOptions['onLog'] | null;
42
65
  }
43
66
  export interface WorkflowResultWaiter {
44
67
  promise: Promise<unknown>;
45
68
  resolve: (value: unknown) => void;
46
69
  reject: (reason: unknown) => void;
47
70
  }
48
- export type EngineConstructorOptions = Partial<EngineOptions> & {
71
+ export type EngineConstructorOptions<TServices = unknown> = Partial<EngineOptions<TServices>> & {
49
72
  getNow?: () => number;
50
73
  };
51
74
  export type ExecutionStrategyBundle = {
@@ -27,6 +27,29 @@ export declare class WorkflowAlreadyExistsError extends WeftError<'WorkflowAlrea
27
27
  readonly workflowId: string;
28
28
  constructor(workflowId: string);
29
29
  }
30
+ /**
31
+ * Thrown by {@link Engine.start} with `onTerminalConflict: 'start-new'` when the
32
+ * prior terminal run under the requested id still owes an engine-driven finalizer
33
+ * (issue #446). Unlike {@link WorkflowAlreadyExistsError}, this is **transient**:
34
+ * the restart is refused only so the displacing purge cannot delete the finalizer
35
+ * payload before the resource is torn down. Once the finalizer completes (or
36
+ * permanently dead-letters), the marker clears and the same restart succeeds — so a
37
+ * caller should retry after a short delay rather than treat the id as permanently
38
+ * taken.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * import { WorkflowTeardownPendingError } from '@lostgradient/weft';
43
+ *
44
+ * function shouldRetryRestartLater(error: unknown): boolean {
45
+ * return error instanceof WorkflowTeardownPendingError;
46
+ * }
47
+ * ```
48
+ */
49
+ export declare class WorkflowTeardownPendingError extends WeftError<'WorkflowTeardownPendingError'> {
50
+ readonly workflowId: string;
51
+ constructor(workflowId: string);
52
+ }
30
53
  /**
31
54
  * Thrown by {@link Engine.deleteAll} when the supplied filter would match
32
55
  * non-terminal workflows. Narrow the filter to completed, failed, cancelled,
@@ -187,6 +210,30 @@ export declare class WorkflowNotRegisteredError extends WeftError<'WorkflowNotRe
187
210
  readonly workflowType: string;
188
211
  constructor(workflowType: string);
189
212
  }
213
+ /**
214
+ * Thrown by {@link Engine.start} when a workflow definition's `concurrency`
215
+ * policy has no free slot for the requested workflow type or partition key.
216
+ * Starts are rejected immediately; Weft does not queue excess starts.
217
+ *
218
+ * @example
219
+ * ```ts
220
+ * import { WorkflowConcurrencyLimitExceededError } from '@lostgradient/weft';
221
+ *
222
+ * function isCapacityRejection(error: unknown): boolean {
223
+ * return error instanceof WorkflowConcurrencyLimitExceededError;
224
+ * }
225
+ * ```
226
+ */
227
+ export declare class WorkflowConcurrencyLimitExceededError extends WeftError<'WorkflowConcurrencyLimitExceededError'> {
228
+ readonly workflowType: string;
229
+ readonly limit: number;
230
+ readonly partitionKey: string;
231
+ constructor(parameters: {
232
+ workflowType: string;
233
+ limit: number;
234
+ partitionKey: string;
235
+ });
236
+ }
190
237
  /**
191
238
  * Thrown by {@link Engine.suspend} when invoked on an engine running in worker
192
239
  * execution mode. Suspension parks the live run without aborting it, which the
@@ -8,6 +8,14 @@ export class WorkflowAlreadyExistsError extends WeftError {
8
8
  }
9
9
  }
10
10
 
11
+ export class WorkflowTeardownPendingError extends WeftError {
12
+ workflowId;
13
+ constructor(workflowId) {
14
+ super("WorkflowTeardownPendingError", `Cannot restart workflow "${workflowId}" under the same id: its prior run is tearing down a resource (finalizer in progress). Retry after the teardown completes.`);
15
+ this.workflowId = workflowId;
16
+ }
17
+ }
18
+
11
19
  export class BulkDeleteRequiresTerminalWorkflowsError extends WeftError {
12
20
  constructor() {
13
21
  super("BulkDeleteRequiresTerminalWorkflowsError", "Bulk delete matches non-terminal workflows");
@@ -78,6 +86,18 @@ export class WorkflowNotRegisteredError extends WeftError {
78
86
  }
79
87
  }
80
88
 
89
+ export class WorkflowConcurrencyLimitExceededError extends WeftError {
90
+ workflowType;
91
+ limit;
92
+ partitionKey;
93
+ constructor(parameters) {
94
+ super("WorkflowConcurrencyLimitExceededError", `Workflow "${parameters.workflowType}" concurrency limit ${parameters.limit} reached for partition key "${parameters.partitionKey}"`);
95
+ this.workflowType = parameters.workflowType;
96
+ this.limit = parameters.limit;
97
+ this.partitionKey = parameters.partitionKey;
98
+ }
99
+ }
100
+
81
101
  export class WorkflowSuspendNotSupportedError extends WeftError {
82
102
  constructor(message) {
83
103
  super("WorkflowSuspendNotSupportedError", message);
@@ -18,6 +18,7 @@
18
18
  * @module core/engine/event-log-compaction
19
19
  */
20
20
  import type { BatchOperation, Storage } from '../../storage/interface.ts';
21
+ import { type CheckpointReplayPayload } from './checkpoint-replay.ts';
21
22
  /**
22
23
  * Upper bound on event-log records deleted in a single compaction (one
23
24
  * checkpoint commit). A workflow that enables `retentionWindow` with a large
@@ -52,6 +53,13 @@ export type EventLogWatermark = {
52
53
  * deleted prefix — unambiguous across incremental batches.
53
54
  */
54
55
  deletedThrough: number;
56
+ /**
57
+ * Internal replay deltas folded from compacted checkpoint events. Canonical
58
+ * checkpoints can prune consumed results only because recovery can seed replay
59
+ * from the event log; when old events are compacted, their replay deltas move
60
+ * here before deletion.
61
+ */
62
+ checkpointReplay?: CheckpointReplayPayload;
55
63
  };
56
64
  /**
57
65
  * Narrow an unknown decoded value to {@link EventLogWatermark}, rejecting