@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
@@ -2,6 +2,10 @@ import { hashBytes } from "../../runtime/portable.js";
2
2
  import { KEYS } from "../../storage/interface.js";
3
3
  import { decode, encode } from "../codec.js";
4
4
  import { isWorkflowLogEntry } from "../event-log-shared.js";
5
+ import {
6
+ mergeCheckpointReplayPayloads,
7
+ readCheckpointReplayPayload
8
+ } from "./checkpoint-replay.js";
5
9
  export const MAX_COMPACTION_BATCH = 1000;
6
10
  export function isEventLogWatermark(value) {
7
11
  if (typeof value !== "object" || value === null)
@@ -27,7 +31,7 @@ export async function readEventLogWatermark(storage, workflowId) {
27
31
  export async function appendCompactionOperations(storage, workflowId, headSequence, retentionWindow, operations) {
28
32
  if (retentionWindow === null)
29
33
  return null;
30
- const targetFirstSurviving = Math.max(0, headSequence - retentionWindow + 1), currentFloor = (await readEventLogWatermark(storage, workflowId))?.sequence ?? 0, batchFirstSurviving = Math.min(targetFirstSurviving, currentFloor + MAX_COMPACTION_BATCH);
34
+ const targetFirstSurviving = Math.max(0, headSequence - retentionWindow + 1), existing = await readEventLogWatermark(storage, workflowId), currentFloor = existing?.sequence ?? 0, batchFirstSurviving = Math.min(targetFirstSurviving, currentFloor + MAX_COMPACTION_BATCH);
31
35
  if (batchFirstSurviving <= currentFloor)
32
36
  return null;
33
37
  const collected = await collectDeleteRange(storage, workflowId, currentFloor, batchFirstSurviving);
@@ -38,7 +42,8 @@ export async function appendCompactionOperations(storage, workflowId, headSequen
38
42
  version: 1,
39
43
  sequence: batchFirstSurviving,
40
44
  prevHash,
41
- deletedThrough: batchFirstSurviving - 1
45
+ deletedThrough: batchFirstSurviving - 1,
46
+ ...optionalCheckpointReplay(mergeDeletedCheckpointReplayPayloads(existing?.checkpointReplay, collected.deletedEntries))
42
47
  };
43
48
  for (let sequence = currentFloor;sequence < batchFirstSurviving; sequence += 1)
44
49
  operations.push({ type: "delete", key: KEYS.event(workflowId, sequence) });
@@ -53,6 +58,19 @@ export async function appendCompactionOperations(storage, workflowId, headSequen
53
58
  deletedRange: { from: currentFloor, to: batchFirstSurviving - 1 }
54
59
  };
55
60
  }
61
+ function optionalCheckpointReplay(checkpointReplay) {
62
+ return checkpointReplay === void 0 ? {} : { checkpointReplay };
63
+ }
64
+ function mergeDeletedCheckpointReplayPayloads(existing, deletedEntries) {
65
+ let merged = existing;
66
+ for (const bytes of deletedEntries) {
67
+ const decoded = decode(bytes);
68
+ if (!isWorkflowLogEntry(decoded))
69
+ continue;
70
+ merged = mergeCheckpointReplayPayloads(merged, readCheckpointReplayPayload(decoded.payload));
71
+ }
72
+ return merged;
73
+ }
56
74
  async function collectDeleteRange(storage, workflowId, currentFloor, batchFirstSurviving) {
57
75
  const deletedEntries = [];
58
76
  let expected = currentFloor;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Step-2 epoch fencing for `ownership: 'lease'` (issue #470).
3
+ *
4
+ * Step 1 made a rolling deploy a clean lease handoff but added no correctness
5
+ * backstop: a deposed zombie instance (GC pause, partition) that emerged after
6
+ * its lease expired could still issue a plain durable write and corrupt the
7
+ * successor's state. Step 2 closes that hole by conditioning every
8
+ * engine-generator-owned per-workflow durable write on the held lease epoch, so
9
+ * a deposed instance's write loses its CAS instead of landing.
10
+ *
11
+ * The correctness guarantee lives entirely in the epoch CONDITION: a deposed
12
+ * instance's commit CAS-fails regardless of any in-process flag, because the
13
+ * successor bumped `lease:epoch` when it took over. The {@link EngineInternals.deposed}
14
+ * flag and the engine teardown are hygiene on top of that — they stop the engine
15
+ * from silently spinning on swallowed write losses, surface the deposition to the
16
+ * operator, and release resources. They are not what makes the system safe.
17
+ *
18
+ * This module is allow-listed for import only from `src/core/engine/**`.
19
+ */
20
+ import type { BatchOperation, ConditionalBatchCondition } from '../../storage/interface.ts';
21
+ import type { EngineInternals } from './internals.ts';
22
+ /**
23
+ * Reject an engine-owned work entry point (start, startOrSignal, fork, resume)
24
+ * when `ownership: 'lease'` is configured but the engine does not currently hold
25
+ * the lease. The lease is acquired at the two boot gates ({@link Engine.create}
26
+ * and {@link Engine.recoverAll}); a directly constructed engine that does engine
27
+ * work before `recoverAll()` would otherwise durably write workflow state without
28
+ * single-writer ownership and without having recovered existing runs. Placed at
29
+ * each public awaited entry so the caller gets a clean {@link EngineLeaseNotHeldError}
30
+ * — without this, fork/resume would reach `resolveFenceEpochOrHalt` with no held
31
+ * epoch and be misreported as a deposition (warn + teardown) rather than the true
32
+ * "lease not held yet" condition. A no-op under `ownership: 'none'`.
33
+ */
34
+ export declare function assertLeaseHeldForEngineWork(internals: EngineInternals): void;
35
+ /**
36
+ * Commit an engine-generator-owned durable write, fenced on the held lease epoch
37
+ * under `ownership: 'lease'` (a byte-for-byte no-op under `ownership: 'none'`). A
38
+ * lost CAS race throws the caller-supplied `onLostRace` error so existing retry
39
+ * semantics apply; a deposition halts the engine and throws
40
+ * {@link EngineDeposedError}. The helper owns the batch-vs-conditionalBatch
41
+ * decision — pass plain operations plus whatever base conditions you already need.
42
+ *
43
+ * @param internals - the engine internals (ownership mode, lease manager, deposed flag)
44
+ * @param operations - the durable operations to commit atomically
45
+ * @param baseConditions - CAS conditions the caller already requires (may be empty)
46
+ * @param onLostRace - builds the error thrown on a same-epoch lost CAS race
47
+ */
48
+ export declare function commitFencedEngineWrite(internals: EngineInternals, operations: BatchOperation[], baseConditions: ConditionalBatchCondition[], onLostRace: () => Error): Promise<void>;
49
+ /**
50
+ * Like {@link commitFencedEngineWrite}, but the caller treats a base-precondition
51
+ * failure as a legitimate outcome rather than an error — used by the idempotent
52
+ * start path, where a `false` means a concurrent same-key caller already wrote the
53
+ * record (resolve to the existing run) rather than "retry". Returns `true` when the
54
+ * batch committed and `false` when a base condition failed. Deposition is still a
55
+ * hard halt: if the epoch condition is the one that failed, this drives
56
+ * {@link handleDeposition} and throws {@link EngineDeposedError} — a deposed engine
57
+ * must never report a precondition-failure the caller would read as "already exists"
58
+ * and silently move on.
59
+ *
60
+ * @param internals - the engine internals
61
+ * @param operations - the durable operations to commit atomically
62
+ * @param baseConditions - the caller's required CAS conditions (non-empty in
63
+ * practice — this path is for conditional starts, which always carry one)
64
+ */
65
+ export declare function commitFencedEngineWriteAllowingPreconditionFailure(internals: EngineInternals, operations: BatchOperation[], baseConditions: ConditionalBatchCondition[]): Promise<boolean>;
@@ -0,0 +1,71 @@
1
+ import { KEYS, storageConditionalBatch } from "../../storage/interface.js";
2
+ import { decodeEpoch } from "./lease-codec.js";
3
+ import { handleDeposition } from "./lease-deposition.js";
4
+ import { EngineDeposedError, EngineLeaseNotHeldError } from "./lease-errors.js";
5
+ export function assertLeaseHeldForEngineWork(internals) {
6
+ if (internals.options.ownershipMode !== "lease")
7
+ return;
8
+ if (!(!internals.deposed && internals.leaseManager !== null && internals.leaseManager.currentEpochBytes() !== null))
9
+ throw new EngineLeaseNotHeldError;
10
+ }
11
+ async function fencedCommit(internals, operations, baseConditions) {
12
+ const epochBytes = resolveFenceEpochOrHalt(internals);
13
+ if (epochBytes === null) {
14
+ if (baseConditions.length === 0) {
15
+ await internals.storage.batch(operations);
16
+ return "committed";
17
+ }
18
+ return await storageConditionalBatch(internals.storage, baseConditions, operations) ? "committed" : "lost-race";
19
+ }
20
+ const conditions = [
21
+ ...baseConditions,
22
+ { key: KEYS.leaseEpoch(), expectedValue: epochBytes }
23
+ ];
24
+ if (await storageConditionalBatch(internals.storage, conditions, operations))
25
+ return "committed";
26
+ if (await isDeposed(internals, epochBytes)) {
27
+ handleDeposition(internals);
28
+ throw new EngineDeposedError;
29
+ }
30
+ return "lost-race";
31
+ }
32
+ function resolveFenceEpochOrHalt(internals) {
33
+ if (internals.deposed)
34
+ throw new EngineDeposedError;
35
+ if (internals.options.ownershipMode !== "lease")
36
+ return null;
37
+ const epochBytes = internals.leaseManager?.currentEpochBytes() ?? null;
38
+ if (epochBytes === null) {
39
+ handleDeposition(internals);
40
+ throw new EngineDeposedError;
41
+ }
42
+ return epochBytes;
43
+ }
44
+ export async function commitFencedEngineWrite(internals, operations, baseConditions, onLostRace) {
45
+ if (await fencedCommit(internals, operations, baseConditions) === "lost-race")
46
+ throw onLostRace();
47
+ }
48
+ export async function commitFencedEngineWriteAllowingPreconditionFailure(internals, operations, baseConditions) {
49
+ return await fencedCommit(internals, operations, baseConditions) === "committed";
50
+ }
51
+ function epochBytesEqual(a, b) {
52
+ if (b === null || a.byteLength !== b.byteLength)
53
+ return !1;
54
+ for (let index = 0;index < a.byteLength; index += 1)
55
+ if (a[index] !== b[index])
56
+ return !1;
57
+ return !0;
58
+ }
59
+ async function isDeposed(internals, heldEpochBytes) {
60
+ let currentEpochRaw;
61
+ try {
62
+ currentEpochRaw = await internals.storage.get(KEYS.leaseEpoch());
63
+ } catch {
64
+ return !0;
65
+ }
66
+ if (currentEpochRaw === null)
67
+ return !0;
68
+ if (decodeEpoch(currentEpochRaw) === null)
69
+ return !0;
70
+ return !epochBytesEqual(heldEpochBytes, currentEpochRaw);
71
+ }
@@ -0,0 +1,28 @@
1
+ import type { EngineInternals } from './internals.ts';
2
+ /**
3
+ * Engine-side handler for `ctx.setFinalizerState(value)` (issue #446). Durably
4
+ * records the payload associated with the workflow's definition-level
5
+ * `finalizer` activity.
6
+ *
7
+ * This handler only records the value; the engine passes the decoded payload as
8
+ * the finalizer's input when it drives cancel/timeout teardown (#446 Phase 2).
9
+ *
10
+ * The value is staged as a pending atomic side-effect — a `put` of
11
+ * {@link KEYS.finalizerState} — that commits with whichever durable write lands
12
+ * first: the next checkpoint/suspend commit, or, if no checkpoint runs before the
13
+ * workflow terminates, the terminal `updateWorkflowState` batch
14
+ * (`includePendingAtomicSideEffects` is set for terminal transitions). Either way
15
+ * the resource id is durable before teardown is driven: a cancel arriving before
16
+ * the next checkpoint still flushes the staged op in the terminal batch, so the
17
+ * finalizer always sees the resource id. The staged op inherits the lease-epoch
18
+ * fence (#470) for free, since checkpoint and terminal commits route through
19
+ * `commitFencedWorkflowStateOperations`.
20
+ *
21
+ * Oversized payloads are rejected before staging (the same hostile-input guard
22
+ * activity results use). A call made once the workflow is already terminalizing
23
+ * — e.g. from an `onCancel` handler, which runs after the terminal batch has
24
+ * already taken the pending side-effects — is a no-op: the staged op has no
25
+ * future commit to ride and is cleared on terminal cleanup. A development
26
+ * warning is emitted so the footgun is visible, but no error is thrown.
27
+ */
28
+ export declare function recordFinalizerState(internals: EngineInternals, workflowId: string, value: unknown): void;
@@ -0,0 +1,16 @@
1
+ import { KEYS } from "../../storage/interface.js";
2
+ import { encode } from "../codec.js";
3
+ import { assertPayloadWithinLimit } from "../payload-size.js";
4
+ import { stageAtomicWorkflowCommitSideEffects } from "./checkpoint-side-effects.js";
5
+ export function recordFinalizerState(internals, workflowId, value) {
6
+ if (internals.terminalizingWorkflows.has(workflowId)) {
7
+ if (internals.options.development)
8
+ console.warn(`[weft] ctx.setFinalizerState() called for workflow "${workflowId}" after it began terminalizing; the value is ignored. Record finalizer state while the workflow is still running.`);
9
+ return;
10
+ }
11
+ assertPayloadWithinLimit(value, internals.options.payloadSizePolicy.maxBytes, "finalizer state");
12
+ stageAtomicWorkflowCommitSideEffects(internals, workflowId, {
13
+ conditions: [],
14
+ operations: [{ type: "put", key: KEYS.finalizerState(workflowId), value: encode(value) }]
15
+ });
16
+ }
@@ -1,5 +1,13 @@
1
1
  import type { LaunchMetadata, QueryDefinition, SearchAttributeValue, SignalDefinition, SignalDeliveryOptions, UpdateDefinition, WorkflowState } from '../types.ts';
2
2
  import type { WorkflowSnapshot } from '../types/workflow-snapshot.ts';
3
+ /**
4
+ * Which atomic path a `startOrSignal` call took, returned alongside the
5
+ * {@link WorkflowHandle} in `StartOrSignalResult` (not a field on the handle —
6
+ * converged concurrent callers share one cached engine handle, so the outcome
7
+ * rides the per-call result instead). `'started'` when the call created the
8
+ * run, `'signalled'` when it delivered a signal to a run that already existed.
9
+ */
10
+ export type StartOrSignalOutcome = 'started' | 'signalled';
3
11
  export declare function getWorkflowExecutionStartedAt(state: Pick<WorkflowState, 'createdAt' | 'startedAt'>): number;
4
12
  export declare const HANDLE_RESULT_PROMISE: unique symbol;
5
13
  export interface WorkflowHandleEngine extends EventTarget {
@@ -1,19 +1,21 @@
1
1
  import { type Storage as WeftStorage } from '../../storage/interface.ts';
2
2
  import { type ActivityMetadata, type ActivityRegistrationOptions, type RegisteredActivityFunction } from '../activity-registry.ts';
3
3
  import type { StoredStreamChunk } from '../context.ts';
4
+ import type { TypedEventTarget, WeftEventMap } from '../events.ts';
4
5
  import type { Interceptor } from '../interceptor.ts';
5
6
  import { type ReviewRequest } from '../review/index.ts';
6
7
  import { Scheduler } from '../scheduler.ts';
7
- import { type AnyActivityDefinition, type AnyWorkflowDefinition, type AttributeFilterKey, type BulkCancelResult, type BulkDeleteResult, type BulkOperationCommitOptions, type BulkOperationDryRunOptions, type BulkOperationDryRunResult, type BulkSignalAllCommitOptions, type BulkSignalAllDryRunOptions, type BulkSignalResult, type BulkTagResult, type CheckpointState, type CheckpointSummary, type CoordinatedUpdateResult, type DefaultActivityTypes, type DefaultWorkflowRegistry, type ForkOptions, type InferActivityEntries, type InferActivityEntry, type InferWorkflowEntries, type InferWorkflowEntry, type ListFilter, type ListOptions, type PaginatedResult, type PurgeResult, type QueryDefinition, type RegisteredWorkflowDefinition, type RetentionOverview, type ReviewListEntry, type ReviewListFilter, type ScheduleDefinition, type ScheduleFilter, type ScheduleOptions, type ScheduleSpec, type ScheduleSummary, type SearchAttributeValue, type SignalDefinition, type SignalDeliveryOptions, type StartOptions, type StartOrSignalSignal, type SubmitReviewOptions, type TypedListFilter, type UpdateDefinition, type WorkflowEvent, type WorkflowInput, type WorkflowOutput, type WorkflowReplay, type WorkflowState, type WorkflowSummary, type WorkflowTimelineEntry } from '../types.ts';
8
+ import { type AnyActivityDefinition, type AnyWorkflowDefinition, type AttributeFilterKey, type BulkCancelResult, type BulkDeleteResult, type BulkOperationCommitOptions, type BulkOperationDryRunOptions, type BulkOperationDryRunResult, type BulkRetryFailedResult, type BulkSignalAllCommitOptions, type BulkSignalAllDryRunOptions, type BulkSignalResult, type BulkTagResult, type CheckpointState, type CheckpointSummary, type CoordinatedUpdateResult, type DefaultActivityTypes, type DefaultWorkflowRegistry, type ForkOptions, type InferActivityEntries, type InferActivityEntry, type InferWorkflowEntries, type InferWorkflowEntry, type ListFilter, type ListOptions, type PaginatedResult, type PurgeResult, type QueryDefinition, type RegisteredWorkflowDefinition, type RetentionOverview, type ReviewListEntry, type ReviewListFilter, type ScheduleDefinition, type ScheduleFilter, type ScheduleOptions, type ScheduleSpec, type ScheduleSummary, type SearchAttributeValue, type SignalDefinition, type SignalDeliveryOptions, type StartOptions, type StartOrSignalSignal, type StartWorkflowOptions, type SubmitReviewOptions, type TypedListFilter, type UpdateDefinition, type WorkflowEvent, type WorkflowInput, type WorkflowOutput, type WorkflowReplay, type WorkflowServices, type WorkflowServicesUnion, type WorkflowState, type WorkflowSummary, type WorkflowTimelineEntry } from '../types.ts';
8
9
  import type { TimerEntry } from '../types/checkpoint.ts';
9
10
  import type { WorkflowAlreadyRegistered } from '../types/workflow-builder.ts';
10
11
  import { type AggregateOptions, type AggregateResult } from './aggregate.ts';
11
12
  import { type EmptyActivityDefinitions, type EmptyWorkflowDefinitions, type KnownWorkflowNames } from './construction.ts';
12
- import { type ActivityDefinitionName, type EngineCreateOptions, type RegisteredActivityDefinitionExecute, type UnknownWorkflowNameWhenDefaultRegistryIsEmpty } from './engine-create-types.ts';
13
+ import { type ActivityDefinitionName, type EngineCreateOptions, type EngineCreateWorkflowRegistry, type RegisteredActivityDefinitionExecute, type UnknownWorkflowNameWhenDefaultRegistryIsEmpty } from './engine-create-types.ts';
13
14
  import type { EngineConstructorOptions } from './engine-internal-types.ts';
14
15
  import type { EngineStateNamespace } from './engine-state-namespace.ts';
15
16
  import { HANDLE_RESULT_PROMISE, WorkflowHandle } from './handles.ts';
16
- import { type RecoverAllOptions } from './lifecycle.ts';
17
+ import { ENGINE_LEASE_LOST_WARNING_NAME } from './lease-deposition.ts';
18
+ import { type RecoverAllOptions, type StartOrSignalResult } from './lifecycle.ts';
17
19
  import { assertCompatiblePersistedDataVersion } from './persisted-data-version.ts';
18
20
  import { ScheduleHandle } from './schedule-handle.ts';
19
21
  import { type WorkflowFeedListener, type WorkflowFeedRecord, type WorkflowFeedSelector } from './workflow-feed.ts';
@@ -21,8 +23,9 @@ export { ActivityReconciliationCapabilityError, ActivityReconciliationConflictEr
21
23
  export { AsyncActivityTokenNotFoundError } from './async-activity-completion.ts';
22
24
  export type { PendingAsyncActivity } from './async-activity-completion.ts';
23
25
  export type { PendingTimelineEntry, RegistrationEntry, ResolvedOptions, TrackedWaiterKeys, WorkflowResultWaiter, } from './engine-internal-types.ts';
24
- export { ActivityResolutionError, BulkDeleteRequiresTerminalWorkflowsError, BulkOperationConfirmationError, EngineCreateNameMismatchError, EngineDisposedError, IdempotencyKeyPurgedError, PersistedDataIncompatibleError, StartOrSignalConflictError, WorkflowAlreadyExistsError, WorkflowNotFoundError, WorkflowNotRegisteredError, WorkflowSuspendNotSupportedError, WorkflowTypeNotRegisteredForRecoveryError, } from './errors.ts';
26
+ export { ActivityResolutionError, BulkDeleteRequiresTerminalWorkflowsError, BulkOperationConfirmationError, EngineCreateNameMismatchError, EngineDisposedError, IdempotencyKeyPurgedError, PersistedDataIncompatibleError, StartOrSignalConflictError, WorkflowAlreadyExistsError, WorkflowConcurrencyLimitExceededError, WorkflowNotFoundError, WorkflowNotRegisteredError, WorkflowSuspendNotSupportedError, WorkflowTeardownPendingError, WorkflowTypeNotRegisteredForRecoveryError, } from './errors.ts';
25
27
  export { HANDLE_RESULT_PROMISE, WorkflowHandle } from './handles.ts';
28
+ export { EngineLeaseAcquisitionTimeoutError, EngineLeaseCorruptedError, EngineLeaseNotHeldError, } from './lease-errors.ts';
26
29
  export type { RecoverAllOptions } from './lifecycle.ts';
27
30
  export { ScheduleHandle } from './schedule-handle.ts';
28
31
  export type { WorkflowFeedListener, WorkflowFeedRecord, WorkflowFeedSelector, } from './workflow-feed.ts';
@@ -33,6 +36,7 @@ export { assertCompatiblePersistedDataVersion };
33
36
  export declare const ENGINE_PARKED_WORKFLOW_COUNT_FOR_TESTING: unique symbol;
34
37
  export declare const ENGINE_SIGNAL_WAITER_COUNT_FOR_TESTING: unique symbol;
35
38
  export declare const ENGINE_SLEEP_RESOLVER_COUNT_FOR_TESTING: unique symbol;
39
+ export { ENGINE_LEASE_LOST_WARNING_NAME };
36
40
  /**
37
41
  * Durable execution engine.
38
42
  *
@@ -75,7 +79,7 @@ export declare const ENGINE_SLEEP_RESOLVER_COUNT_FOR_TESTING: unique symbol;
75
79
  * void engine;
76
80
  * ```
77
81
  */
78
- export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry, TActivities extends object = DefaultActivityTypes> extends EventTarget implements Disposable, AsyncDisposable {
82
+ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry, TActivities extends object = DefaultActivityTypes> extends EventTarget implements Disposable, AsyncDisposable, TypedEventTarget<WeftEventMap> {
79
83
  #private;
80
84
  /**
81
85
  * Construct and register an engine in one step. Activities are registered
@@ -105,7 +109,7 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
105
109
  static create<TWorkflowDefinitions extends Record<string, AnyWorkflowDefinition>>(options: EngineCreateOptions<TWorkflowDefinitions, EmptyActivityDefinitions> & {
106
110
  activities?: undefined;
107
111
  workflows: TWorkflowDefinitions;
108
- }): Promise<Engine<InferWorkflowEntries<TWorkflowDefinitions>>>;
112
+ }): Promise<Engine<EngineCreateWorkflowRegistry<TWorkflowDefinitions>>>;
109
113
  static create<TActivityDefinitions extends Record<string, AnyActivityDefinition>>(options: EngineCreateOptions<EmptyWorkflowDefinitions, TActivityDefinitions> & {
110
114
  activities: TActivityDefinitions;
111
115
  workflows?: undefined;
@@ -113,8 +117,12 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
113
117
  static create<TWorkflowDefinitions extends Record<string, AnyWorkflowDefinition>, TActivityDefinitions extends Record<string, AnyActivityDefinition>>(options: EngineCreateOptions<TWorkflowDefinitions, TActivityDefinitions> & {
114
118
  activities: TActivityDefinitions;
115
119
  workflows: TWorkflowDefinitions;
116
- }): Promise<Engine<InferWorkflowEntries<TWorkflowDefinitions>, InferActivityEntries<TActivityDefinitions>>>;
117
- constructor(options?: EngineConstructorOptions);
120
+ }): Promise<Engine<EngineCreateWorkflowRegistry<TWorkflowDefinitions>, InferActivityEntries<TActivityDefinitions>>>;
121
+ constructor(options?: EngineConstructorOptions<WorkflowServicesUnion<TWorkflows>>);
122
+ addEventListener<K extends Extract<keyof WeftEventMap, string>>(type: K, listener: (event: WeftEventMap[K]) => void, options?: boolean | AddEventListenerOptions): void;
123
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions): void;
124
+ removeEventListener<K extends Extract<keyof WeftEventMap, string>>(type: K, listener: (event: WeftEventMap[K]) => void, options?: boolean | EventListenerOptions): void;
125
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions): void;
118
126
  get state(): EngineStateNamespace;
119
127
  /**
120
128
  * Register a workflow by name or definition, or register an activity
@@ -186,8 +194,8 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
186
194
  listWorkflowDefinitions(): RegisteredWorkflowDefinition[];
187
195
  getActivityDefinition(name: string): ActivityMetadata | undefined;
188
196
  listActivityDefinitions(): ActivityMetadata[];
189
- start<TName extends KnownWorkflowNames<TWorkflows>>(type: TName, input: WorkflowInput<TWorkflows, TName>, options?: StartOptions): Promise<WorkflowHandle<WorkflowOutput<TWorkflows, TName>>>;
190
- start<TName extends string>(type: UnknownWorkflowNameWhenDefaultRegistryIsEmpty<TWorkflows, TName>, input: unknown, options?: StartOptions): Promise<WorkflowHandle>;
197
+ start<TName extends KnownWorkflowNames<TWorkflows>>(type: TName, input: WorkflowInput<TWorkflows, TName>, options?: StartWorkflowOptions<WorkflowServices<TWorkflows, TName>>): Promise<WorkflowHandle<WorkflowOutput<TWorkflows, TName>>>;
198
+ start<TName extends string>(type: UnknownWorkflowNameWhenDefaultRegistryIsEmpty<TWorkflows, TName>, input: unknown, options?: StartWorkflowOptions): Promise<WorkflowHandle>;
191
199
  /**
192
200
  * Atomically start a workflow or signal it if it already exists
193
201
  * (signal-with-start). With an absent target, the workflow record and the
@@ -205,8 +213,8 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
205
213
  * are `options.id` and `options.idempotencyKey`. Requires a storage backend
206
214
  * with `conditionalBatch`.
207
215
  */
208
- startOrSignal<TName extends KnownWorkflowNames<TWorkflows>>(type: TName, input: WorkflowInput<TWorkflows, TName>, signal: StartOrSignalSignal, options?: StartOptions): Promise<WorkflowHandle<WorkflowOutput<TWorkflows, TName>>>;
209
- startOrSignal<TName extends string>(type: UnknownWorkflowNameWhenDefaultRegistryIsEmpty<TWorkflows, TName>, input: unknown, signal: StartOrSignalSignal, options?: StartOptions): Promise<WorkflowHandle>;
216
+ startOrSignal<TName extends KnownWorkflowNames<TWorkflows>>(type: TName, input: WorkflowInput<TWorkflows, TName>, signal: StartOrSignalSignal, options?: StartOptions<WorkflowServices<TWorkflows, TName>>): Promise<StartOrSignalResult<WorkflowOutput<TWorkflows, TName>>>;
217
+ startOrSignal<TName extends string>(type: UnknownWorkflowNameWhenDefaultRegistryIsEmpty<TWorkflows, TName>, input: unknown, signal: StartOrSignalSignal, options?: StartOptions): Promise<StartOrSignalResult>;
210
218
  getHandle(workflowId: string): WorkflowHandle;
211
219
  list<const TAttributeKeys extends readonly AttributeFilterKey[] = readonly AttributeFilterKey[]>(filter?: TypedListFilter<TAttributeKeys>, options?: ListOptions): Promise<PaginatedResult<WorkflowSummary>>;
212
220
  aggregate(filter: ListFilter | undefined, options: AggregateOptions): Promise<AggregateResult>;
@@ -214,6 +222,8 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
214
222
  purge(filter?: ListFilter): Promise<PurgeResult>;
215
223
  cancelAll(filter: ListFilter, options: BulkOperationDryRunOptions): Promise<BulkOperationDryRunResult>;
216
224
  cancelAll(filter: ListFilter, options?: BulkOperationCommitOptions): Promise<BulkCancelResult>;
225
+ retryFailedAll(filter: ListFilter, options: BulkOperationDryRunOptions): Promise<BulkOperationDryRunResult>;
226
+ retryFailedAll(filter: ListFilter, options?: BulkOperationCommitOptions): Promise<BulkRetryFailedResult>;
217
227
  signalAll(filter: ListFilter, name: string, payload: unknown, options: BulkSignalAllDryRunOptions): Promise<BulkOperationDryRunResult>;
218
228
  signalAll(filter: ListFilter, name: string, payload: unknown, options: BulkSignalAllCommitOptions): Promise<BulkSignalResult>;
219
229
  signalAll(filter: ListFilter, name: string, payload?: unknown, options?: BulkOperationCommitOptions): Promise<BulkSignalResult>;
@@ -231,7 +241,7 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
231
241
  * Two call forms:
232
242
  * - A {@link ScheduleDefinition} object: `engine.schedule({ workflow, cron, input })`.
233
243
  * Carries the workflow (definition or type name), the `cron`/`every` spec,
234
- * optional `input`, `id`, `overlapPolicy`, and `backfill`.
244
+ * optional `input`, `id`, `overlapPolicy`, `backfill`, and `jitter`.
235
245
  * - Positional: `engine.schedule(type, input, spec, options?)` where `spec` is
236
246
  * a cron string or a {@link ScheduleSpec} (`{ cron }` or `{ every }`).
237
247
  *
@@ -325,7 +335,7 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
325
335
  * registered workflow type on this engine.
326
336
  *
327
337
  * `acknowledgeUnknownWorkflowTypes` is a dangerous escape hatch for rolling
328
- * deploys or explicit storage migrations.
338
+ * deploys or explicit operator storage repair.
329
339
  * When set, unknown workflow types are skipped and reported through
330
340
  * {@link WorkflowRecoverySkippedEvent}.
331
341
  */
@@ -335,7 +345,11 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
335
345
  * have parked itself via `ActivityContext.completeAsync()`; pass the durable
336
346
  * task token announced through the `activity:async-pending` event (or
337
347
  * persisted by your callback dispatcher). The parked workflow resumes as
338
- * though the activity had returned `result` inline.
348
+ * though the activity had returned `result` inline. During recovery, a
349
+ * completion that arrives after token recovery but before replay adopts the
350
+ * workflow generator is buffered and delivered when replay reaches the same
351
+ * async-activity token. Await `recoverAll()` before accepting callback traffic
352
+ * when your application needs startup ordering to be fully deterministic.
339
353
  *
340
354
  * @throws {AsyncActivityTokenNotFoundError} when no pending activity matches
341
355
  * the token (unknown, or already completed/failed — tokens are single-use).
@@ -345,7 +359,11 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
345
359
  * Fail a deferred activity out-of-band with `error`. The error is thrown into
346
360
  * the workflow generator at the parked step — identical to an inline activity
347
361
  * that threw — so the workflow's own try/catch and any configured retry
348
- * policy apply unchanged.
362
+ * policy apply unchanged. During recovery, a failure that arrives after token
363
+ * recovery but before replay adopts the workflow generator is buffered and
364
+ * delivered when replay reaches the same async-activity token. Await
365
+ * `recoverAll()` before accepting callback traffic when your application needs
366
+ * startup ordering to be fully deterministic.
349
367
  *
350
368
  * @throws {AsyncActivityTokenNotFoundError} when no pending activity matches
351
369
  * the token (unknown, or already completed/failed — tokens are single-use).