@lostgradient/weft 0.3.0 → 0.4.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 (508) 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 +46 -5
  23. package/dist/client/local.d.ts +4 -1
  24. package/dist/client/local.js +12 -4
  25. package/dist/client/start-body.d.ts +4 -3
  26. package/dist/core/byte-arrays.d.ts +5 -0
  27. package/dist/core/byte-arrays.js +5 -0
  28. package/dist/core/checkpoint/lifecycle.d.ts +3 -0
  29. package/dist/core/checkpoint/lifecycle.js +9 -4
  30. package/dist/core/checkpoint/serialization.js +12 -5
  31. package/dist/core/codec/extension-codec.d.ts +16 -0
  32. package/dist/core/codec/extension-codec.js +100 -6
  33. package/dist/core/context/activity-retry-state.d.ts +38 -0
  34. package/dist/core/context/activity-retry-state.js +89 -0
  35. package/dist/core/context/activity-schedule-to-close.d.ts +159 -0
  36. package/dist/core/context/activity-schedule-to-close.js +69 -0
  37. package/dist/core/context/child-workflow-pipe.d.ts +5 -5
  38. package/dist/core/context/child-workflow-pipe.js +15 -2
  39. package/dist/core/context/context-presence.d.ts +19 -0
  40. package/dist/core/context/context-presence.js +13 -0
  41. package/dist/core/context/durable-operations.d.ts +25 -0
  42. package/dist/core/context/durable-operations.js +64 -0
  43. package/dist/core/context/index.d.ts +9 -5
  44. package/dist/core/context/index.js +17 -12
  45. package/dist/core/context/internals.d.ts +20 -0
  46. package/dist/core/context/internals.js +3 -1
  47. package/dist/core/context/operation-request.d.ts +35 -0
  48. package/dist/core/context/parallel-cache-entry.d.ts +14 -5
  49. package/dist/core/context/run-operation.d.ts +6 -1
  50. package/dist/core/context/run-operation.js +41 -87
  51. package/dist/core/context/session-state.js +7 -8
  52. package/dist/core/context/speculative-child.js +2 -0
  53. package/dist/core/context/types.d.ts +15 -0
  54. package/dist/core/context/version-patching.d.ts +8 -0
  55. package/dist/core/context/version-patching.js +40 -0
  56. package/dist/core/context/workflow-logger.d.ts +98 -0
  57. package/dist/core/context/workflow-logger.js +68 -0
  58. package/dist/core/engine/activity-heartbeat-tracking.d.ts +64 -0
  59. package/dist/core/engine/activity-heartbeat-tracking.js +42 -0
  60. package/dist/core/engine/activity-per-attempt-timeout.d.ts +41 -0
  61. package/dist/core/engine/activity-per-attempt-timeout.js +36 -0
  62. package/dist/core/engine/activity-reconciliation.d.ts +1 -0
  63. package/dist/core/engine/activity-reconciliation.js +12 -1
  64. package/dist/core/engine/activity-resolution.d.ts +23 -0
  65. package/dist/core/engine/activity-resolution.js +37 -0
  66. package/dist/core/engine/aggregate.js +66 -30
  67. package/dist/core/engine/async-activity-completion.d.ts +23 -6
  68. package/dist/core/engine/async-activity-completion.js +53 -12
  69. package/dist/core/engine/attributes-tags.js +9 -4
  70. package/dist/core/engine/bulk-operations-purge.d.ts +26 -0
  71. package/dist/core/engine/bulk-operations-purge.js +38 -3
  72. package/dist/core/engine/bulk-operations-shared.d.ts +2 -0
  73. package/dist/core/engine/bulk-operations-shared.js +8 -2
  74. package/dist/core/engine/bulk-operations.d.ts +4 -1
  75. package/dist/core/engine/bulk-operations.js +235 -24
  76. package/dist/core/engine/callback-creators-bundles.d.ts +9 -0
  77. package/dist/core/engine/callback-creators-bundles.js +30 -2
  78. package/dist/core/engine/callback-creators-core.js +6 -4
  79. package/dist/core/engine/callback-creators-router.js +10 -0
  80. package/dist/core/engine/callback-creators-schedule.d.ts +2 -2
  81. package/dist/core/engine/callback-creators-schedule.js +12 -8
  82. package/dist/core/engine/candidate-read-batching.d.ts +6 -0
  83. package/dist/core/engine/candidate-read-batching.js +1 -0
  84. package/dist/core/engine/checkpoint-io.js +61 -25
  85. package/dist/core/engine/checkpoint-reads.js +3 -2
  86. package/dist/core/engine/checkpoint-replay.d.ts +20 -0
  87. package/dist/core/engine/checkpoint-replay.js +242 -0
  88. package/dist/core/engine/checkpoint-side-effects.d.ts +23 -0
  89. package/dist/core/engine/checkpoint-side-effects.js +35 -0
  90. package/dist/core/engine/child-workflow-cancellation.d.ts +10 -0
  91. package/dist/core/engine/child-workflow-cancellation.js +40 -0
  92. package/dist/core/engine/child-workflow.js +27 -4
  93. package/dist/core/engine/condition-waiters.d.ts +14 -0
  94. package/dist/core/engine/condition-waiters.js +5 -0
  95. package/dist/core/engine/construction.d.ts +3 -0
  96. package/dist/core/engine/construction.js +21 -8
  97. package/dist/core/engine/coordination-branch-executors.d.ts +70 -0
  98. package/dist/core/engine/coordination-branch-executors.js +107 -0
  99. package/dist/core/engine/deferred-consume-envelope.d.ts +59 -0
  100. package/dist/core/engine/deferred-consume-envelope.js +14 -0
  101. package/dist/core/engine/disposal.js +13 -0
  102. package/dist/core/engine/engine-create-types.d.ts +14 -4
  103. package/dist/core/engine/engine-internal-types.d.ts +26 -3
  104. package/dist/core/engine/errors.d.ts +47 -0
  105. package/dist/core/engine/errors.js +20 -0
  106. package/dist/core/engine/event-log-compaction.d.ts +8 -0
  107. package/dist/core/engine/event-log-compaction.js +20 -2
  108. package/dist/core/engine/fenced-write.d.ts +65 -0
  109. package/dist/core/engine/fenced-write.js +71 -0
  110. package/dist/core/engine/finalizer-state.d.ts +28 -0
  111. package/dist/core/engine/finalizer-state.js +16 -0
  112. package/dist/core/engine/handles.d.ts +8 -0
  113. package/dist/core/engine/index.d.ts +34 -16
  114. package/dist/core/engine/index.js +133 -8
  115. package/dist/core/engine/inline-parking.js +3 -2
  116. package/dist/core/engine/internals.d.ts +107 -3
  117. package/dist/core/engine/lease-codec.d.ts +35 -0
  118. package/dist/core/engine/lease-codec.js +32 -0
  119. package/dist/core/engine/lease-deposition.d.ts +66 -0
  120. package/dist/core/engine/lease-deposition.js +10 -0
  121. package/dist/core/engine/lease-errors.d.ts +99 -0
  122. package/dist/core/engine/lease-errors.js +30 -0
  123. package/dist/core/engine/lease-manager.d.ts +114 -0
  124. package/dist/core/engine/lease-manager.js +135 -0
  125. package/dist/core/engine/lifecycle/persist.js +10 -32
  126. package/dist/core/engine/lifecycle/recovered-services.d.ts +8 -6
  127. package/dist/core/engine/lifecycle/recovered-services.js +18 -3
  128. package/dist/core/engine/lifecycle/resume.js +16 -9
  129. package/dist/core/engine/lifecycle/shared.d.ts +8 -1
  130. package/dist/core/engine/lifecycle/start-batch.d.ts +1 -1
  131. package/dist/core/engine/lifecycle/start-batch.js +2 -1
  132. package/dist/core/engine/lifecycle/start-commit.d.ts +9 -0
  133. package/dist/core/engine/lifecycle/start-commit.js +50 -8
  134. package/dist/core/engine/lifecycle/start-or-signal-create.d.ts +58 -0
  135. package/dist/core/engine/lifecycle/start-or-signal-create.js +95 -0
  136. package/dist/core/engine/lifecycle/start-or-signal.d.ts +3 -2
  137. package/dist/core/engine/lifecycle/start-or-signal.js +11 -81
  138. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +39 -0
  139. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +28 -0
  140. package/dist/core/engine/lifecycle/start.d.ts +4 -4
  141. package/dist/core/engine/lifecycle/start.js +17 -9
  142. package/dist/core/engine/lifecycle/transition.js +17 -5
  143. package/dist/core/engine/lifecycle.d.ts +1 -1
  144. package/dist/core/engine/list-candidate-resolution.js +2 -2
  145. package/dist/core/engine/listing.js +9 -5
  146. package/dist/core/engine/operations-activity.d.ts +4 -11
  147. package/dist/core/engine/operations-activity.js +22 -49
  148. package/dist/core/engine/operations-coordination.d.ts +10 -0
  149. package/dist/core/engine/operations-coordination.js +43 -8
  150. package/dist/core/engine/operations-router.d.ts +6 -0
  151. package/dist/core/engine/operations-router.js +2 -0
  152. package/dist/core/engine/operations-speculate.js +6 -2
  153. package/dist/core/engine/operations-stream.js +12 -2
  154. package/dist/core/engine/operations-time.d.ts +4 -2
  155. package/dist/core/engine/operations-time.js +14 -2
  156. package/dist/core/engine/operations-wait-condition.d.ts +23 -0
  157. package/dist/core/engine/operations-wait-condition.js +62 -0
  158. package/dist/core/engine/ownership-options.d.ts +23 -0
  159. package/dist/core/engine/ownership-options.js +26 -0
  160. package/dist/core/engine/payload-size-policy.d.ts +3 -0
  161. package/dist/core/engine/payload-size-policy.js +4 -0
  162. package/dist/core/engine/pending-updates.d.ts +17 -0
  163. package/dist/core/engine/pending-updates.js +33 -11
  164. package/dist/core/engine/queries.js +1 -1
  165. package/dist/core/engine/registration.d.ts +1 -0
  166. package/dist/core/engine/registration.js +18 -3
  167. package/dist/core/engine/schedule-jitter.d.ts +5 -0
  168. package/dist/core/engine/schedule-jitter.js +10 -0
  169. package/dist/core/engine/schedule-run.d.ts +17 -0
  170. package/dist/core/engine/schedule-run.js +38 -0
  171. package/dist/core/engine/schedule-timer.js +81 -17
  172. package/dist/core/engine/schedules.d.ts +7 -4
  173. package/dist/core/engine/schedules.js +37 -16
  174. package/dist/core/engine/search-attribute-records.d.ts +4 -0
  175. package/dist/core/engine/search-attribute-records.js +17 -0
  176. package/dist/core/engine/signals.d.ts +18 -2
  177. package/dist/core/engine/signals.js +42 -21
  178. package/dist/core/engine/state-utilities.d.ts +49 -2
  179. package/dist/core/engine/state-utilities.js +114 -3
  180. package/dist/core/engine/storage-io.d.ts +16 -2
  181. package/dist/core/engine/storage-io.js +26 -5
  182. package/dist/core/engine/stream-chunk-loading.d.ts +2 -0
  183. package/dist/core/engine/stream-chunk-loading.js +24 -1
  184. package/dist/core/engine/sub-operation.js +22 -3
  185. package/dist/core/engine/termination/cleanup.d.ts +3 -1
  186. package/dist/core/engine/termination/cleanup.js +25 -1
  187. package/dist/core/engine/termination/complete.js +44 -6
  188. package/dist/core/engine/termination/finalizer-activity.d.ts +53 -0
  189. package/dist/core/engine/termination/finalizer-activity.js +30 -0
  190. package/dist/core/engine/termination/finalizer-claim.d.ts +110 -0
  191. package/dist/core/engine/termination/finalizer-claim.js +80 -0
  192. package/dist/core/engine/termination/finalizer.d.ts +48 -0
  193. package/dist/core/engine/termination/finalizer.js +159 -0
  194. package/dist/core/engine/termination/suspend.d.ts +3 -1
  195. package/dist/core/engine/termination.d.ts +1 -0
  196. package/dist/core/engine/termination.js +4 -0
  197. package/dist/core/engine/updates.js +5 -25
  198. package/dist/core/engine/validation/schedule.d.ts +2 -1
  199. package/dist/core/engine/validation/schedule.js +51 -2
  200. package/dist/core/engine/validation.js +32 -5
  201. package/dist/core/engine/waiting-update-response.d.ts +8 -0
  202. package/dist/core/engine/waiting-update-response.js +22 -0
  203. package/dist/core/engine/workflow-concurrency.d.ts +10 -0
  204. package/dist/core/engine/workflow-concurrency.js +136 -0
  205. package/dist/core/engine/workflow-feed.d.ts +4 -5
  206. package/dist/core/engine/workflow-feed.js +4 -1
  207. package/dist/core/engine/workflow-indexes.d.ts +9 -0
  208. package/dist/core/engine/workflow-indexes.js +10 -0
  209. package/dist/core/engine/workflow-state-stream.js +33 -13
  210. package/dist/core/engine/workflow-visibility-queries.d.ts +2 -2
  211. package/dist/core/engine-helpers.js +1 -0
  212. package/dist/core/events/activity-events.d.ts +43 -12
  213. package/dist/core/events/activity-events.js +28 -0
  214. package/dist/core/events/attribute-events.d.ts +2 -3
  215. package/dist/core/events/event-map.d.ts +18 -12
  216. package/dist/core/events/index.d.ts +1 -0
  217. package/dist/core/events/index.js +1 -0
  218. package/dist/core/events/schedule-events.d.ts +71 -0
  219. package/dist/core/events/schedule-events.js +29 -0
  220. package/dist/core/events/signal-events.d.ts +4 -6
  221. package/dist/core/events/system-events.d.ts +29 -19
  222. package/dist/core/events/system-events.js +26 -0
  223. package/dist/core/events/update-events.d.ts +6 -8
  224. package/dist/core/events/workflow-events.d.ts +88 -23
  225. package/dist/core/events/workflow-events.js +26 -0
  226. package/dist/core/failure-categories.js +5 -17
  227. package/dist/core/fault-code.d.ts +9 -3
  228. package/dist/core/fault-code.js +1 -0
  229. package/dist/core/inline-execution-strategy.context-options.d.ts +69 -0
  230. package/dist/core/inline-execution-strategy.context-options.js +56 -0
  231. package/dist/core/inline-execution-strategy.d.ts +31 -36
  232. package/dist/core/inline-execution-strategy.js +16 -27
  233. package/dist/core/list-filter-validation.d.ts +1 -1
  234. package/dist/core/payload-size.d.ts +1 -1
  235. package/dist/core/persisted-data-incompatible-error.d.ts +9 -7
  236. package/dist/core/review/events.d.ts +6 -8
  237. package/dist/core/scheduler/scheduler-class.d.ts +10 -1
  238. package/dist/core/scheduler/scheduler-class.js +38 -11
  239. package/dist/core/scheduler/timer-batch.js +9 -1
  240. package/dist/core/scheduler/timer-sources.d.ts +1 -0
  241. package/dist/core/scheduler/timer-sources.js +11 -5
  242. package/dist/core/session-state.d.ts +0 -1
  243. package/dist/core/session-state.js +2 -2
  244. package/dist/core/start-workflow-validation.d.ts +34 -0
  245. package/dist/core/start-workflow-validation.js +19 -0
  246. package/dist/core/types/activity-verification.d.ts +67 -0
  247. package/dist/core/types/activity-verification.js +0 -0
  248. package/dist/core/types/activity.d.ts +80 -61
  249. package/dist/core/types/bulk.d.ts +50 -9
  250. package/dist/core/types/checkpoint.d.ts +44 -8
  251. package/dist/core/types/list-options.d.ts +146 -0
  252. package/dist/core/types/list-options.js +0 -0
  253. package/dist/core/types/options.d.ts +121 -165
  254. package/dist/core/types/schedules.d.ts +39 -3
  255. package/dist/core/types/services-resolution.d.ts +2 -2
  256. package/dist/core/types/workflow-builder-runtime.d.ts +12 -3
  257. package/dist/core/types/workflow-builder-runtime.js +11 -2
  258. package/dist/core/types/workflow-builder.d.ts +42 -11
  259. package/dist/core/types/workflow-concurrency.d.ts +39 -0
  260. package/dist/core/types/workflow-concurrency.js +0 -0
  261. package/dist/core/types/workflow-context.d.ts +157 -14
  262. package/dist/core/types/workflow-definition.d.ts +53 -10
  263. package/dist/core/types/workflow-function.d.ts +84 -9
  264. package/dist/core/types/workflow-log.d.ts +98 -0
  265. package/dist/core/types/workflow-log.js +0 -0
  266. package/dist/core/types/workflow-registries.d.ts +14 -3
  267. package/dist/core/types/workflow-registry.d.ts +3 -0
  268. package/dist/core/types.d.ts +4 -0
  269. package/dist/core/types.js +4 -0
  270. package/dist/core/versioning.d.ts +9 -39
  271. package/dist/core/versioning.js +2 -12
  272. package/dist/core/weft-error.d.ts +44 -1
  273. package/dist/core/weft-error.js +16 -0
  274. package/dist/core/worker-execution-strategy-options.d.ts +26 -0
  275. package/dist/core/worker-execution-strategy.js +40 -36
  276. package/dist/core/worker-inbound-message.d.ts +38 -0
  277. package/dist/core/worker-inbound-message.js +37 -0
  278. package/dist/core/worker-log-abuse-counter.d.ts +175 -0
  279. package/dist/core/worker-log-abuse-counter.js +107 -0
  280. package/dist/core/worker-message-helpers.d.ts +47 -0
  281. package/dist/core/worker-message-helpers.js +26 -0
  282. package/dist/core/worker-protocol-guard.js +1 -1
  283. package/dist/core/worker-protocol-log.d.ts +56 -0
  284. package/dist/core/worker-protocol-log.js +18 -0
  285. package/dist/core/worker-protocol.d.ts +23 -0
  286. package/dist/core/worker-protocol.js +12 -2
  287. package/dist/core/workflow-version-tuple.d.ts +3 -9
  288. package/dist/core/workflow-version-tuple.js +2 -3
  289. package/dist/diagnostics/format.js +1 -6
  290. package/dist/diagnostics/types.d.ts +4 -5
  291. package/dist/diagnostics/validate.d.ts +0 -1
  292. package/dist/diagnostics/version-check.d.ts +1 -1
  293. package/dist/diagnostics/version-check.js +4 -9
  294. package/dist/index.d.ts +12 -10
  295. package/dist/index.js +29 -3
  296. package/dist/json-schema.js +3 -3
  297. package/dist/mcp/cli.js +27 -27
  298. package/dist/mcp/dispatcher.js +1 -1
  299. package/dist/mcp/http.js +16 -6
  300. package/dist/mcp/protocol.d.ts +2 -0
  301. package/dist/mcp/protocol.js +1 -1
  302. package/dist/mcp/session.d.ts +16 -0
  303. package/dist/mcp/session.js +59 -6
  304. package/dist/mcp/tools.js +73 -6
  305. package/dist/observability/index.js +2 -2
  306. package/dist/server/asyncapi-channels.js +5 -2
  307. package/dist/server/attribute-filters.d.ts +8 -3
  308. package/dist/server/attribute-filters.js +6 -1
  309. package/dist/server/authentication/api-key.d.ts +2 -1
  310. package/dist/server/authentication/api-key.js +5 -2
  311. package/dist/server/authentication/constant-time-api-key.d.ts +15 -0
  312. package/dist/server/authentication/constant-time-api-key.js +24 -0
  313. package/dist/server/authentication/index.d.ts +1 -1
  314. package/dist/server/authentication/index.js +7 -4
  315. package/dist/server/authentication/rotating-api-key-store.d.ts +5 -3
  316. package/dist/server/authentication/rotating-api-key-store.js +19 -11
  317. package/dist/server/engine-event-feed-backend.d.ts +4 -5
  318. package/dist/server/fault-to-http.js +8 -1
  319. package/dist/server/fault-to-json-rpc.js +1 -0
  320. package/dist/server/fleet-event-feed.d.ts +31 -0
  321. package/dist/server/fleet-event-feed.js +157 -0
  322. package/dist/server/handler/index.js +1 -1
  323. package/dist/server/handler/response-helpers.js +2 -1
  324. package/dist/server/handler/route-dispatch.d.ts +6 -3
  325. package/dist/server/handler/route-dispatch.js +2 -2
  326. package/dist/server/handler.js +23 -23
  327. package/dist/server/index.d.ts +32 -2
  328. package/dist/server/index.js +26 -26
  329. package/dist/server/json-rpc-transport-helpers.d.ts +1 -0
  330. package/dist/server/json-rpc-transport-helpers.js +2 -1
  331. package/dist/server/json-rpc-websocket-runtime.d.ts +11 -2
  332. package/dist/server/json-rpc-websocket-runtime.js +1 -0
  333. package/dist/server/json-rpc-websocket-subscriptions.d.ts +10 -0
  334. package/dist/server/json-rpc-websocket-subscriptions.js +29 -0
  335. package/dist/server/json-rpc-websocket-types.d.ts +22 -0
  336. package/dist/server/json-rpc-websocket-types.js +0 -0
  337. package/dist/server/json-rpc-websocket-validation.js +20 -4
  338. package/dist/server/json-rpc-websocket.d.ts +2 -43
  339. package/dist/server/json-rpc-websocket.js +57 -74
  340. package/dist/server/openapi.d.ts +2 -1
  341. package/dist/server/openapi.js +1 -3
  342. package/dist/server/openrpc-document-schema.d.ts +78 -0
  343. package/dist/server/openrpc-document-schema.js +27 -1
  344. package/dist/server/openrpc-errors.d.ts +3 -0
  345. package/dist/server/openrpc-errors.js +2 -1
  346. package/dist/server/openrpc.js +32 -0
  347. package/dist/server/operation-catalog/index.d.ts +1 -1
  348. package/dist/server/operation-catalog/pipeline-helpers.js +1 -0
  349. package/dist/server/operation-catalog/pipeline-stages.js +26 -12
  350. package/dist/server/operation-catalog/pipeline.js +8 -1
  351. package/dist/server/operation-catalog/registry.js +13 -0
  352. package/dist/server/operation-catalog/types.d.ts +20 -9
  353. package/dist/server/operation-fault.d.ts +10 -0
  354. package/dist/server/operation-fault.js +2 -0
  355. package/dist/server/operation-registry.d.ts +12 -11
  356. package/dist/server/operation-registry.js +12 -3
  357. package/dist/server/operations/aggregate-workflows.d.ts +15 -15
  358. package/dist/server/operations/async-activity.d.ts +2 -2
  359. package/dist/server/operations/async-activity.js +12 -7
  360. package/dist/server/operations/bulk-cancel-workflows.d.ts +1 -1
  361. package/dist/server/operations/bulk-cancel-workflows.js +2 -2
  362. package/dist/server/operations/bulk-delete-workflows.d.ts +1 -1
  363. package/dist/server/operations/bulk-delete-workflows.js +2 -2
  364. package/dist/server/operations/bulk-filter-helpers.d.ts +8 -6
  365. package/dist/server/operations/bulk-filter-helpers.js +54 -24
  366. package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +11 -9
  367. package/dist/server/operations/bulk-mutate-workflow-tags.js +2 -2
  368. package/dist/server/operations/bulk-operation-helpers.d.ts +2 -2
  369. package/dist/server/operations/bulk-retry-failed-workflows.d.ts +7 -0
  370. package/dist/server/operations/bulk-retry-failed-workflows.js +64 -0
  371. package/dist/server/operations/bulk-signal-workflows.d.ts +11 -9
  372. package/dist/server/operations/bulk-signal-workflows.js +2 -2
  373. package/dist/server/operations/cancel-schedule.d.ts +1 -1
  374. package/dist/server/operations/create-schedule.d.ts +3 -1
  375. package/dist/server/operations/create-schedule.js +29 -11
  376. package/dist/server/operations/fleet-events-subscription.d.ts +54 -0
  377. package/dist/server/operations/fleet-events-subscription.js +99 -0
  378. package/dist/server/operations/fork-workflow.d.ts +1 -1
  379. package/dist/server/operations/fork-workflow.js +3 -2
  380. package/dist/server/operations/get-checkpoint-at.d.ts +1 -1
  381. package/dist/server/operations/get-registry.d.ts +1 -1
  382. package/dist/server/operations/get-retention-overview.d.ts +1 -1
  383. package/dist/server/operations/get-review.d.ts +1 -1
  384. package/dist/server/operations/get-schedule.d.ts +1 -1
  385. package/dist/server/operations/get-stream-chunks.d.ts +1 -1
  386. package/dist/server/operations/get-system-metrics.d.ts +2 -2
  387. package/dist/server/operations/get-task-diagnostics.d.ts +45 -6
  388. package/dist/server/operations/get-task-diagnostics.js +101 -7
  389. package/dist/server/operations/get-update-result.d.ts +1 -1
  390. package/dist/server/operations/get-workflow-attributes.d.ts +1 -1
  391. package/dist/server/operations/get-workflow-events.d.ts +1 -1
  392. package/dist/server/operations/get-workflow-result.d.ts +1 -1
  393. package/dist/server/operations/get-workflow-timeline.d.ts +1 -1
  394. package/dist/server/operations/get-workflow.d.ts +1 -1
  395. package/dist/server/operations/list-checkpoints.d.ts +1 -1
  396. package/dist/server/operations/list-reviews.d.ts +1 -1
  397. package/dist/server/operations/list-schedules.d.ts +1 -1
  398. package/dist/server/operations/list-task-queues.d.ts +2 -2
  399. package/dist/server/operations/list-workers.d.ts +2 -2
  400. package/dist/server/operations/list-workflows.d.ts +1 -1
  401. package/dist/server/operations/operation-helpers.d.ts +16 -1
  402. package/dist/server/operations/operation-helpers.js +15 -3
  403. package/dist/server/operations/pause-schedule.d.ts +1 -1
  404. package/dist/server/operations/purge-workflows.d.ts +5 -5
  405. package/dist/server/operations/purge-workflows.js +2 -2
  406. package/dist/server/operations/query-workflow.d.ts +1 -1
  407. package/dist/server/operations/query-workflow.js +3 -2
  408. package/dist/server/operations/recover-all.d.ts +1 -1
  409. package/dist/server/operations/replay-workflow.d.ts +1 -1
  410. package/dist/server/operations/resume-schedule.d.ts +1 -1
  411. package/dist/server/operations/set-workflow-attributes.d.ts +1 -1
  412. package/dist/server/operations/set-workflow-attributes.js +6 -3
  413. package/dist/server/operations/signal-workflow.js +8 -3
  414. package/dist/server/operations/single-workflow-tag-mutation.js +13 -3
  415. package/dist/server/operations/start-or-signal-workflow.d.ts +6 -1
  416. package/dist/server/operations/start-or-signal-workflow.js +14 -24
  417. package/dist/server/operations/start-workflow-options.d.ts +6 -0
  418. package/dist/server/operations/start-workflow-rest-input.d.ts +14 -0
  419. package/dist/server/operations/start-workflow-rest-input.js +31 -0
  420. package/dist/server/operations/start-workflow.d.ts +1 -1
  421. package/dist/server/operations/start-workflow.js +8 -23
  422. package/dist/server/operations/storage.d.ts +6 -6
  423. package/dist/server/operations/storage.js +24 -14
  424. package/dist/server/operations/stream-workflow-sse.d.ts +1 -1
  425. package/dist/server/operations/submit-review-decision.d.ts +1 -1
  426. package/dist/server/operations/submit-review-decision.js +6 -3
  427. package/dist/server/operations/update-schedule.d.ts +1 -1
  428. package/dist/server/operations/update-schedule.js +7 -4
  429. package/dist/server/operations/update-workflow.d.ts +1 -1
  430. package/dist/server/operations/update-workflow.js +7 -3
  431. package/dist/server/operations/worker-drain.d.ts +8 -8
  432. package/dist/server/operations/worker-drain.js +11 -8
  433. package/dist/server/operations/workflow-events-subscription.d.ts +7 -8
  434. package/dist/server/operations/workflow-events-subscription.js +43 -8
  435. package/dist/server/rest-binding.d.ts +3 -1
  436. package/dist/server/rest-bindings.js +12 -0
  437. package/dist/server/rest-body.d.ts +10 -0
  438. package/dist/server/rest-body.js +80 -0
  439. package/dist/server/runtime/authentication-bridge.d.ts +1 -0
  440. package/dist/server/runtime/authentication-bridge.js +33 -6
  441. package/dist/server/runtime/client-visible-events.d.ts +3 -0
  442. package/dist/server/runtime/client-visible-events.js +65 -0
  443. package/dist/server/runtime/context.d.ts +7 -0
  444. package/dist/server/runtime/event-broadcasting.d.ts +6 -0
  445. package/dist/server/runtime/event-broadcasting.js +72 -38
  446. package/dist/server/runtime/retry.d.ts +1 -0
  447. package/dist/server/runtime/retry.js +14 -0
  448. package/dist/server/runtime/shutdown.d.ts +7 -6
  449. package/dist/server/runtime/shutdown.js +6 -1
  450. package/dist/server/runtime/task-polling.js +61 -20
  451. package/dist/server/runtime/task-reconciliation.js +9 -1
  452. package/dist/server/runtime/task-result-resolution.d.ts +15 -0
  453. package/dist/server/runtime/task-result-resolution.js +81 -0
  454. package/dist/server/runtime/websocket-stream.d.ts +20 -1
  455. package/dist/server/runtime/websocket-stream.js +173 -7
  456. package/dist/server/runtime/websocket-upgrade.js +22 -3
  457. package/dist/server/runtime/websocket-worker.d.ts +1 -1
  458. package/dist/server/runtime/websocket-worker.js +38 -30
  459. package/dist/server/serve-internals.d.ts +3 -1
  460. package/dist/server/serve-internals.js +18 -2
  461. package/dist/server/task-state.d.ts +30 -0
  462. package/dist/server/task-state.js +28 -0
  463. package/dist/server/workflow-event-feed.d.ts +36 -115
  464. package/dist/server/workflow-event-feed.js +92 -27
  465. package/dist/service-worker/index.js +30 -30
  466. package/dist/storage/auto.js +1 -1
  467. package/dist/storage/bun-sql.js +24 -0
  468. package/dist/storage/compressed-storage.js +1 -1
  469. package/dist/storage/default-scope.d.ts +7 -4
  470. package/dist/storage/http.js +2 -2
  471. package/dist/storage/index.d.ts +76 -4
  472. package/dist/storage/indexeddb.js +1 -1
  473. package/dist/storage/interface.d.ts +163 -0
  474. package/dist/storage/interface.js +1 -1
  475. package/dist/storage/key-prefixes.d.ts +1 -1
  476. package/dist/storage/key-prefixes.js +10 -0
  477. package/dist/storage/lmdb.d.ts +4 -3
  478. package/dist/storage/lmdb.js +1 -1
  479. package/dist/storage/memory.js +1 -1
  480. package/dist/storage/neon-batch.d.ts +30 -0
  481. package/dist/storage/neon-batch.js +30 -0
  482. package/dist/storage/neon-value-mapping.d.ts +30 -3
  483. package/dist/storage/neon-value-mapping.js +12 -0
  484. package/dist/storage/neon.d.ts +16 -0
  485. package/dist/storage/neon.js +9 -4
  486. package/dist/storage/node-sqlite.js +23 -0
  487. package/dist/storage/postgres-key-value-queries.d.ts +69 -44
  488. package/dist/storage/postgres-key-value-queries.js +62 -24
  489. package/dist/storage/resolve.js +1 -1
  490. package/dist/storage/scoped-storage.js +1 -1
  491. package/dist/storage/testing.d.ts +168 -0
  492. package/dist/storage/testing.js +2 -0
  493. package/dist/storage/turso.d.ts +8 -0
  494. package/dist/storage/turso.js +2 -2
  495. package/dist/storage/typed-storage.js +1 -1
  496. package/dist/storage/web-extension.js +1 -1
  497. package/dist/testing/index.js +28 -28
  498. package/dist/version.d.ts +1 -1
  499. package/dist/version.js +1 -1
  500. package/dist/worker/protocol.js +1 -1
  501. package/dist/workers/worker-replay-state.d.ts +32 -0
  502. package/dist/workers/worker-replay-state.js +35 -0
  503. package/dist/workers/worker-state-namespace.d.ts +21 -0
  504. package/dist/workers/worker-state-namespace.js +13 -0
  505. package/dist/workers/workflow-runner.d.ts +19 -15
  506. package/dist/workers/workflow-runner.js +72 -60
  507. package/dist/workers/workflow-worker-entry.js +5 -2
  508. package/package.json +5 -1
@@ -1,5 +1,15 @@
1
+ import {
2
+ KEYS,
3
+ requireStorageCapability,
4
+ storageConditionalBatch,
5
+ storageHas
6
+ } from "../../storage/interface.js";
1
7
  import { assertScopedBulkWorkflowFilter } from "../bulk-workflow-filter.js";
2
- import { bulkMutateWorkflowTags } from "./attributes-tags.js";
8
+ import { deserializeCheckpoint } from "../checkpoint.js";
9
+ import { decode, encode } from "../codec.js";
10
+ import { buildTimerBatchOperations } from "../scheduler.js";
11
+ import { buildIndexOperations } from "../search-attributes.js";
12
+ import { buildTerminalWorkflowIndexOperations, bulkMutateWorkflowTags } from "./attributes-tags.js";
3
13
  import { purgeInternal, purgeWorkflow } from "./bulk-operations-purge.js";
4
14
  import {
5
15
  buildActionableBulkWorkflowFilter,
@@ -7,6 +17,7 @@ import {
7
17
  collectTerminalWorkflowSnapshots,
8
18
  normalizeBulkOperationOptions,
9
19
  prepareBulkOperation,
20
+ resolveBulkOperationConcurrency,
10
21
  shouldPersistBulkAudit,
11
22
  toBulkOperationError,
12
23
  validateBulkConfirmation,
@@ -14,10 +25,27 @@ import {
14
25
  } from "./bulk-operations-shared.js";
15
26
  import { BulkDeleteRequiresTerminalWorkflowsError } from "./errors.js";
16
27
  import { BULK_OPERATION_BATCH_SIZE } from "./listing.js";
17
- import { loadWorkflowState } from "./storage-io.js";
18
- import { isTerminalWorkflowStatus } from "./validation.js";
28
+ import { createTerminalCleanupTimerId } from "./state-utilities.js";
29
+ import { loadWorkflowState, runSerializedWorkflowStateWrite } from "./storage-io.js";
30
+ import { decodeWorkflowState, isTerminalWorkflowStatus } from "./validation.js";
31
+ import { buildWorkflowConcurrencyStartOperations } from "./workflow-concurrency.js";
32
+ import { buildWorkflowVisibilityIndexTransition } from "./workflow-indexes.js";
19
33
  export { purgeInternal, TERMINAL_CLEANUP_DELAY_MS } from "./bulk-operations-purge.js";
20
- const ACTIVE_WORKFLOW_STATUSES = ["pending", "running", "suspended"];
34
+ const ACTIVE_WORKFLOW_STATUSES = ["pending", "running", "suspended"], FAILED_WORKFLOW_STATUSES = ["failed"], CHECKPOINT_RETRY_CONCURRENCY_ADMISSION_MAX_ATTEMPTS = 5;
35
+ async function runBulkWorkflowPool(items, concurrencyLimit, operation) {
36
+ const results = [];
37
+ for (let batchStart = 0;batchStart < items.length; batchStart += concurrencyLimit) {
38
+ const batchItems = items.slice(batchStart, batchStart + concurrencyLimit);
39
+ results.push(...await Promise.all(batchItems.map(async (item) => {
40
+ try {
41
+ return { item, status: "fulfilled", value: await operation(item) };
42
+ } catch (reason) {
43
+ return { item, status: "rejected", reason };
44
+ }
45
+ })));
46
+ }
47
+ return results;
48
+ }
21
49
  export async function purge(internals, filter, cleanupWaiters) {
22
50
  return purgeInternal(internals, filter, { expiredOnly: !1, now: internals.options.getNow() }, cleanupWaiters);
23
51
  }
@@ -28,20 +56,36 @@ async function runBulkCancellation(internals, filter, options = {}) {
28
56
  if (options.dryRun === !0)
29
57
  return preparation.preview;
30
58
  validateBulkConfirmation(options, preparation);
31
- const workflowIdsToCancel = preparation.workflowIds;
59
+ const workflowIdsToCancel = preparation.workflowIds, bulkConcurrency = resolveBulkOperationConcurrency(options);
32
60
  let cancelled = 0;
33
- const errors = [];
34
- for (const workflowId of workflowIdsToCancel)
61
+ const errors = [], cancellationResults = await runBulkWorkflowPool(workflowIdsToCancel, bulkConcurrency, async (workflowId) => {
35
62
  try {
36
63
  await internals.engine.cancel(workflowId);
37
- if ((await loadWorkflowState(internals, workflowId))?.status === "cancelled") {
38
- cancelled += 1;
39
- continue;
40
- }
41
- errors.push({ id: workflowId, error: "Workflow no longer cancellable" });
64
+ if ((await loadWorkflowState(internals, workflowId))?.status === "cancelled")
65
+ return { status: "cancelled" };
66
+ return {
67
+ status: "failed",
68
+ error: { id: workflowId, error: "Workflow no longer cancellable" }
69
+ };
42
70
  } catch (error) {
43
- errors.push(toBulkOperationError(internals, workflowId, error));
71
+ return {
72
+ status: "failed",
73
+ error: toBulkOperationError(internals, workflowId, error)
74
+ };
75
+ }
76
+ });
77
+ for (const cancellationResult of cancellationResults) {
78
+ if (cancellationResult.status === "rejected") {
79
+ errors.push(toBulkOperationError(internals, cancellationResult.item, cancellationResult.reason));
80
+ continue;
81
+ }
82
+ const { value } = cancellationResult;
83
+ if (value.status === "cancelled") {
84
+ cancelled += 1;
85
+ continue;
44
86
  }
87
+ errors.push(value.error);
88
+ }
45
89
  const result = { cancelled, failed: errors.length, errors };
46
90
  if (!shouldPersistBulkAudit(options))
47
91
  return result;
@@ -50,6 +94,145 @@ async function runBulkCancellation(internals, filter, options = {}) {
50
94
  export async function cancelAll(internals, filter, options = {}) {
51
95
  return runBulkCancellation(internals, filter, options);
52
96
  }
97
+ async function runBulkFailedWorkflowRetry(internals, filter, options = {}) {
98
+ options = normalizeBulkOperationOptions(options);
99
+ assertScopedBulkWorkflowFilter(filter);
100
+ const actionableFilter = buildActionableBulkWorkflowFilter(internals, filter, FAILED_WORKFLOW_STATUSES), preparation = await prepareBulkOperation(internals, "retry-failed", actionableFilter, filter, {}, options);
101
+ if (options.dryRun === !0)
102
+ return preparation.preview;
103
+ validateBulkConfirmation(options, preparation);
104
+ const bulkConcurrency = resolveBulkOperationConcurrency(options);
105
+ let retried = 0;
106
+ const errors = [], retryResults = await runBulkWorkflowPool(preparation.workflowIds, bulkConcurrency, async (workflowId) => {
107
+ try {
108
+ await retryFailedWorkflow(internals, workflowId);
109
+ return { status: "retried" };
110
+ } catch (error) {
111
+ return {
112
+ status: "failed",
113
+ error: toBulkOperationError(internals, workflowId, error)
114
+ };
115
+ }
116
+ });
117
+ for (const retryResult of retryResults) {
118
+ if (retryResult.status === "rejected") {
119
+ errors.push(toBulkOperationError(internals, retryResult.item, retryResult.reason));
120
+ continue;
121
+ }
122
+ const { value } = retryResult;
123
+ if (value.status === "retried") {
124
+ retried += 1;
125
+ continue;
126
+ }
127
+ errors.push(value.error);
128
+ }
129
+ const result = { retried, failed: errors.length, errors };
130
+ if (!shouldPersistBulkAudit(options))
131
+ return result;
132
+ return withBulkAuditEvent(internals, preparation, options, result, retried);
133
+ }
134
+ export async function retryFailedAll(internals, filter, options = {}) {
135
+ return runBulkFailedWorkflowRetry(internals, filter, options);
136
+ }
137
+ async function retryFailedWorkflow(internals, workflowId) {
138
+ const state = await loadWorkflowState(internals, workflowId);
139
+ if (state === null)
140
+ throw Error("Workflow no longer exists");
141
+ if (state.status !== "failed")
142
+ throw Error(`Workflow is ${state.status}, not failed`);
143
+ if (await internals.storage.get(KEYS.checkpoint(workflowId)) !== null) {
144
+ await reactivateFailedWorkflowFromCheckpoint(internals, state);
145
+ await internals.engine.resume(workflowId);
146
+ return;
147
+ }
148
+ await internals.engine.start(state.type, state.input, {
149
+ id: workflowId,
150
+ onTerminalConflict: "start-new",
151
+ ...state.tags !== void 0 ? { tags: state.tags } : {}
152
+ });
153
+ }
154
+ async function reactivateFailedWorkflowFromCheckpoint(internals, state) {
155
+ const reactivated = await runSerializedWorkflowStateWrite(internals, state.id, async () => reactivateFailedWorkflowFromCheckpointSerialized(internals, state.id));
156
+ if (reactivated.terminalCleanupTimerId !== void 0)
157
+ await internals.scheduler.cancel(reactivated.terminalCleanupTimerId, state.id);
158
+ }
159
+ async function reactivateFailedWorkflowFromCheckpointSerialized(internals, workflowId) {
160
+ let lastConcurrencyStateKey;
161
+ for (let attempt = 0;attempt < CHECKPOINT_RETRY_CONCURRENCY_ADMISSION_MAX_ATTEMPTS; attempt += 1) {
162
+ const currentStateBytes = await internals.storage.get(KEYS.workflow(workflowId));
163
+ if (currentStateBytes === null)
164
+ throw Error("Workflow no longer exists");
165
+ const currentState = decodeWorkflowState(currentStateBytes);
166
+ if (currentState.status !== "failed")
167
+ throw Error(`Workflow is ${currentState.status}, not failed`);
168
+ const currentCheckpointBytes = await internals.storage.get(KEYS.checkpoint(workflowId));
169
+ if (currentCheckpointBytes === null)
170
+ throw Error("Checkpoint no longer exists");
171
+ const checkpoint = deserializeCheckpoint(currentCheckpointBytes), registration = internals.registrations.get(currentState.type);
172
+ if (registration === void 0)
173
+ throw Error(`No workflow registered with name "${currentState.type}" (needed to retry "${workflowId}")`);
174
+ const concurrencyStartOperations = registration.concurrency === void 0 ? void 0 : await buildWorkflowConcurrencyStartOperations(internals, currentState.type, workflowId, currentState.input, registration.concurrency);
175
+ lastConcurrencyStateKey = concurrencyStartOperations?.stateKey ?? lastConcurrencyStateKey;
176
+ const reactivatedState = buildReactivatedWorkflowState(internals, currentState), currentAttributes = await loadSearchAttributes(internals, workflowId), operations = [
177
+ ...buildTerminalWorkflowIndexOperations(currentState, reactivatedState),
178
+ { type: "put", key: KEYS.workflow(workflowId), value: encode(reactivatedState) },
179
+ ...buildWorkflowVisibilityIndexTransition(workflowId, currentState, reactivatedState).batchOps,
180
+ ...buildRetrySearchAttributeOperations(workflowId, currentAttributes, checkpoint.searchAttributes),
181
+ ...reactivatedState.executionDeadline === void 0 ? [] : buildTimerBatchOperations({
182
+ id: `deadline:${workflowId}`,
183
+ workflowId,
184
+ fireAt: reactivatedState.executionDeadline,
185
+ kind: "execution-deadline"
186
+ }),
187
+ ...concurrencyStartOperations?.operations ?? []
188
+ ], conditions = concurrencyStartOperations?.conditions ?? [];
189
+ if (await commitFailedWorkflowReactivation(internals, operations, conditions))
190
+ return {
191
+ terminalCleanupTimerId: currentState.terminalCleanupToken === void 0 ? void 0 : createTerminalCleanupTimerId(!1, currentState.terminalCleanupToken)
192
+ };
193
+ }
194
+ throw Error(`Workflow concurrency admission for "${lastConcurrencyStateKey ?? workflowId}" changed too many times while retrying failed workflow "${workflowId}"`);
195
+ }
196
+ async function commitFailedWorkflowReactivation(internals, operations, conditions) {
197
+ if (conditions.length === 0) {
198
+ await internals.storage.batch(operations);
199
+ return !0;
200
+ }
201
+ requireStorageCapability(internals.storage, "conditionalBatch", "retry failed workflow");
202
+ return storageConditionalBatch(internals.storage, conditions, operations);
203
+ }
204
+ function buildReactivatedWorkflowState(internals, state) {
205
+ const reactivatedState = {
206
+ ...state,
207
+ status: "running",
208
+ updatedAt: internals.options.getNow()
209
+ };
210
+ delete reactivatedState.error;
211
+ delete reactivatedState.errorStack;
212
+ delete reactivatedState.failureCategory;
213
+ delete reactivatedState.result;
214
+ delete reactivatedState.terminationReason;
215
+ delete reactivatedState.terminalCleanupToken;
216
+ return reactivatedState;
217
+ }
218
+ async function loadSearchAttributes(internals, workflowId) {
219
+ const attributeBytes = await internals.storage.get(KEYS.attribute(workflowId));
220
+ if (attributeBytes === null)
221
+ return {};
222
+ return decode(attributeBytes);
223
+ }
224
+ function buildRetrySearchAttributeOperations(workflowId, currentAttributes, checkpointAttributes) {
225
+ const operations = buildIndexOperations(workflowId, currentAttributes, checkpointAttributes);
226
+ if (Object.keys(checkpointAttributes).length === 0)
227
+ operations.push({ type: "delete", key: KEYS.attribute(workflowId) });
228
+ else
229
+ operations.push({
230
+ type: "put",
231
+ key: KEYS.attribute(workflowId),
232
+ value: encode(checkpointAttributes)
233
+ });
234
+ return operations;
235
+ }
53
236
  export async function signalAll(internals, filter, name, payload, maybeOptions) {
54
237
  const options = normalizeBulkOperationOptions(maybeOptions ?? {});
55
238
  assertScopedBulkWorkflowFilter(filter);
@@ -59,15 +242,21 @@ export async function signalAll(internals, filter, name, payload, maybeOptions)
59
242
  if (options.dryRun === !0)
60
243
  return preparation.preview;
61
244
  validateBulkConfirmation(options, preparation);
62
- const workflowIdsToSignal = preparation.workflowIds;
245
+ const workflowIdsToSignal = preparation.workflowIds, bulkConcurrency = resolveBulkOperationConcurrency(options);
63
246
  let signalled = 0, failed = 0;
64
- for (const workflowId of workflowIdsToSignal)
247
+ const signalResults = await runBulkWorkflowPool(workflowIdsToSignal, bulkConcurrency, async (workflowId) => {
65
248
  try {
66
249
  await internals.engine.signal(workflowId, name, payload);
67
- signalled += 1;
250
+ return { status: "signalled" };
68
251
  } catch {
69
- failed += 1;
252
+ return { status: "failed" };
70
253
  }
254
+ });
255
+ for (const signalResult of signalResults)
256
+ if (signalResult.status === "fulfilled" && signalResult.value.status === "signalled")
257
+ signalled += 1;
258
+ else
259
+ failed += 1;
71
260
  const result = { signalled, failed };
72
261
  if (!shouldPersistBulkAudit(options))
73
262
  return result;
@@ -77,18 +266,40 @@ async function runBulkDeletion(internals, filter, cleanupWaiters, options = {})
77
266
  options = normalizeBulkOperationOptions(options);
78
267
  assertScopedBulkWorkflowFilter(filter);
79
268
  const candidateWorkflowSnapshots = await collectTerminalWorkflowSnapshots(internals, filter), preparation = buildBulkOperationPreparation("delete", filter, {}, candidateWorkflowSnapshots, options);
80
- if (options.dryRun === !0)
81
- return preparation.preview;
269
+ if (options.dryRun === !0) {
270
+ const skippedTeardownPending = [];
271
+ for (const workflowId of preparation.workflowIds)
272
+ if (await storageHas(internals.storage, KEYS.teardownOwed(workflowId)))
273
+ skippedTeardownPending.push(workflowId);
274
+ return skippedTeardownPending.length > 0 ? { ...preparation.preview, skippedTeardownPending } : preparation.preview;
275
+ }
82
276
  validateBulkConfirmation(options, preparation);
277
+ const bulkConcurrency = resolveBulkOperationConcurrency(options);
83
278
  let deleted = 0;
279
+ const skippedTeardownPending = [];
84
280
  for (let batchStart = 0;batchStart < preparation.workflowIds.length; batchStart += BULK_OPERATION_BATCH_SIZE) {
85
- const batchWorkflowIds = preparation.workflowIds.slice(batchStart, batchStart + BULK_OPERATION_BATCH_SIZE), workflowStatesToDelete = await loadTerminalWorkflowStatesForBatch(internals, batchWorkflowIds);
86
- for (const workflowState of workflowStatesToDelete) {
281
+ const batchWorkflowIds = preparation.workflowIds.slice(batchStart, batchStart + BULK_OPERATION_BATCH_SIZE), workflowStatesToDelete = await loadTerminalWorkflowStatesForBatch(internals, batchWorkflowIds), deletableStates = [];
282
+ for (const workflowState of workflowStatesToDelete)
283
+ if (await storageHas(internals.storage, KEYS.teardownOwed(workflowState.id)))
284
+ skippedTeardownPending.push(workflowState.id);
285
+ else
286
+ deletableStates.push(workflowState);
287
+ const deletionResults = await runBulkWorkflowPool(deletableStates, bulkConcurrency, async (workflowState) => {
87
288
  await purgeWorkflow(internals, workflowState, cleanupWaiters);
88
- deleted += 1;
89
- }
289
+ return workflowState.id;
290
+ }), deletionErrors = [];
291
+ for (const deletionResult of deletionResults)
292
+ if (deletionResult.status === "fulfilled")
293
+ deleted += 1;
294
+ else
295
+ deletionErrors.push(deletionResult.reason);
296
+ if (deletionErrors.length > 0)
297
+ throw AggregateError(deletionErrors, `Bulk delete failed for ${deletionErrors.length} workflow(s) after deleting ${deleted} workflow(s)`);
90
298
  }
91
- const result = { deleted };
299
+ const result = {
300
+ deleted,
301
+ ...skippedTeardownPending.length > 0 ? { skippedTeardownPending } : {}
302
+ };
92
303
  if (!shouldPersistBulkAudit(options))
93
304
  return result;
94
305
  return withBulkAuditEvent(internals, preparation, options, result, deleted);
@@ -9,16 +9,25 @@ import { type OperationWithCallerStack } from './operations-router.ts';
9
9
  import type { StateOperationCallbacks } from './operations-state.ts';
10
10
  import type { StreamOperationCallbacks } from './operations-stream.ts';
11
11
  import type { TimeOperationCallbacks } from './operations-time.ts';
12
+ import type { ConditionOperationCallbacks } from './operations-wait-condition.ts';
12
13
  import { type UpdateCallbacks } from './updates.ts';
13
14
  export declare function createChildWorkflowOperationCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): ChildWorkflowOperationCallbacks;
14
15
  export declare function createActivityOperationCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): ActivityOperationCallbacks;
15
16
  export declare function createCoordinationOperationCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): CoordinationOperationCallbacks;
17
+ export declare function createConditionOperationCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): ConditionOperationCallbacks;
16
18
  export declare function createDataOperationCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): DataOperationCallbacks;
17
19
  export declare function createStateOperationCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): StateOperationCallbacks;
18
20
  export declare function createStreamOperationCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): StreamOperationCallbacks;
19
21
  export declare function createTimeOperationCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): TimeOperationCallbacks;
20
22
  export declare function createUpdateCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): UpdateCallbacks;
21
23
  export declare function completeOperationForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, workflowId: string, value: unknown): void;
24
+ /**
25
+ * Fail the pending operation for a workflow, feeding the error to the generator
26
+ * so it re-throws at the `yield*` site (catchable by the workflow body). Used by
27
+ * the wait-condition processor when the user predicate throws, so a throwing
28
+ * predicate surfaces as a workflow failure instead of parking the run forever.
29
+ */
30
+ export declare function failOperationForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, workflowId: string, operation: OperationWithCallerStack, error: unknown): void;
22
31
  export declare function runOperationWithResultForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, workflowId: string, operation: OperationWithCallerStack, execute: () => Promise<unknown>): Promise<void>;
23
32
  export declare function runOperationWithoutResultForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, workflowId: string, operation: OperationWithCallerStack, execute: () => Promise<void>): Promise<void>;
24
33
  export declare function executeSubOperationForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, workflowId: string, operation: ContextOperationRequest, signal?: AbortSignal, speculativeState?: import('./speculative-execution-state.ts').SpeculativeExecutionState): Promise<unknown>;
@@ -15,6 +15,7 @@ import {
15
15
  createReviewOperationCallbacks,
16
16
  handleScheduleTimerForEngine
17
17
  } from "./callback-creators-schedule.js";
18
+ import { commitFencedEngineWrite } from "./fenced-write.js";
18
19
  import { guardTerminalWorkflow, guardTerminalWorkflowAfterCoordinatedRequest } from "./guards.js";
19
20
  import { getInternals } from "./internals.js";
20
21
  import {
@@ -27,6 +28,7 @@ import {
27
28
  } from "./lifecycle.js";
28
29
  import {
29
30
  completeOperation,
31
+ failOperation,
30
32
  runOperationWithResult,
31
33
  runOperationWithoutResult
32
34
  } from "./operations-router.js";
@@ -34,6 +36,7 @@ import { schedulePendingInlineUpdateDrain } from "./pending-updates.js";
34
36
  import { processReviewOperation } from "./reviews.js";
35
37
  import { loadWorkflowState, runSerializedWorkflowStateWrite } from "./storage-io.js";
36
38
  import {
39
+ feedOperationResult,
37
40
  getComposedActivityInterceptor,
38
41
  getComposedWorkflowInterceptor
39
42
  } from "./strategy-helpers.js";
@@ -41,7 +44,9 @@ import { executeSubOperation } from "./sub-operation.js";
41
44
  import {
42
45
  ensureTerminalCleanupTracked,
43
46
  failWorkflow,
44
- runDeferredTerminalCleanup
47
+ finalizePendingTimelineEntry,
48
+ runDeferredTerminalCleanup,
49
+ runWorkflowFinalizer
45
50
  } from "./termination.js";
46
51
  import {
47
52
  createCoordinatedUpdateResponder,
@@ -60,6 +65,8 @@ export function createChildWorkflowOperationCallbacks(engine) {
60
65
  export function createActivityOperationCallbacks(engine) {
61
66
  return {
62
67
  runOperationWithResult: (workflowId, operation, execute) => runOperationWithResultForEngine(engine, workflowId, operation, execute),
68
+ finalizePendingTimelineEntry: (workflowId, status, value) => finalizePendingTimelineEntry(getInternals(engine), workflowId, status, value),
69
+ feedOperationResult: (workflowId, result, error) => feedOperationResult(getInternals(engine), workflowId, result, error),
63
70
  getComposedActivityInterceptor: () => getComposedActivityInterceptor(getInternals(engine)),
64
71
  getComposedWorkflowInterceptor: () => getComposedWorkflowInterceptor(getInternals(engine))
65
72
  };
@@ -72,6 +79,22 @@ export function createCoordinationOperationCallbacks(engine) {
72
79
  getActivityOperationCallbacks: () => createActivityOperationCallbacks(engine)
73
80
  };
74
81
  }
82
+ export function createConditionOperationCallbacks(engine) {
83
+ return {
84
+ completeOperation: (workflowId, value) => completeOperationForEngine(engine, workflowId, value),
85
+ failOperation: (workflowId, operation, error) => failOperationForEngine(engine, workflowId, operation, error),
86
+ isWorkflowRunning: async (workflowId) => {
87
+ return (await loadWorkflowState(getInternals(engine), workflowId))?.status === "running";
88
+ },
89
+ scheduleConditionDeadline: (workflowId, step, fireAt) => getInternals(engine).scheduler.schedule({
90
+ id: `cond:${workflowId}:${step}`,
91
+ workflowId,
92
+ fireAt,
93
+ kind: "wait-condition"
94
+ }),
95
+ cancelConditionDeadline: (workflowId, step) => getInternals(engine).scheduler.cancel(`cond:${workflowId}:${step}`, workflowId)
96
+ };
97
+ }
75
98
  export function createDataOperationCallbacks(engine) {
76
99
  return {
77
100
  runOperationWithResult: (workflowId, operation, execute) => runOperationWithResultForEngine(engine, workflowId, operation, execute)
@@ -92,6 +115,7 @@ export function createStreamOperationCallbacks(engine) {
92
115
  export function createTimeOperationCallbacks(engine) {
93
116
  return {
94
117
  completeOperation: (workflowId, value) => completeOperationForEngine(engine, workflowId, value),
118
+ dispatchEvent: (event) => engine.dispatchEvent(event),
95
119
  loadWorkflowState: (workflowId) => loadWorkflowState(getInternals(engine), workflowId),
96
120
  failWorkflow: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine)),
97
121
  runSerializedWorkflowStateWrite: (workflowId, writeOperation) => runSerializedWorkflowStateWrite(getInternals(engine), workflowId, writeOperation),
@@ -101,6 +125,7 @@ export function createTimeOperationCallbacks(engine) {
101
125
  loadWorkflowStartHeaders: (workflowId) => loadWorkflowStartHeaders(getInternals(engine), workflowId, createLifecycleCallbacks(engine)),
102
126
  parseStartOptionDuration: (value, fieldName) => parseStartOptionDuration(getInternals(engine), value, fieldName, createLifecycleCallbacks(engine)),
103
127
  runDeferredTerminalCleanup: (workflowId, timerId) => runDeferredTerminalCleanup(getInternals(engine), workflowId, timerId, createTerminationCallbacks(engine)),
128
+ runWorkflowFinalizer: (workflowId, timerId) => runWorkflowFinalizer(getInternals(engine), workflowId, timerId, createTerminationCallbacks(engine)),
104
129
  handleScheduleTimer: (entry) => handleScheduleTimerForEngine(engine, entry),
105
130
  timeout: (workflowId) => engine.timeout(workflowId),
106
131
  handleCleanupError: (source, error, workflowId) => createTerminationCallbacks(engine).handleCleanupError(source, error, workflowId)
@@ -126,7 +151,7 @@ export function createUpdateCallbacks(engine) {
126
151
  async function persistCoordinatedUpdateResponse(engine, workflowId, updateName, updateId, idempotencyKey, value) {
127
152
  const internals = getInternals(engine), responseOperations = internals.updateCoordinator.buildResponseOperations(updateId, workflowId, value, void 0, idempotencyKey);
128
153
  try {
129
- await internals.storage.batch(responseOperations);
154
+ await commitFencedEngineWrite(internals, responseOperations, [], () => Error(`Coordinated update response for workflow "${workflowId}" lost its CAS race.`));
130
155
  engine.dispatchEvent(new UpdateCompletedEvent(updateId, workflowId, updateName, value));
131
156
  broadcastFromInternals(internals, { type: "update:completed", workflowId, updateId }, createBroadcastCallbacks(engine));
132
157
  } catch (error) {
@@ -136,6 +161,9 @@ async function persistCoordinatedUpdateResponse(engine, workflowId, updateName,
136
161
  export function completeOperationForEngine(engine, workflowId, value) {
137
162
  return completeOperation(getInternals(engine), workflowId, value, callRouterCallbacks(engine));
138
163
  }
164
+ export function failOperationForEngine(engine, workflowId, operation, error) {
165
+ return failOperation(getInternals(engine), workflowId, operation, error, callRouterCallbacks(engine));
166
+ }
139
167
  export async function runOperationWithResultForEngine(engine, workflowId, operation, execute) {
140
168
  return runOperationWithResult(getInternals(engine), workflowId, operation, execute, callRouterCallbacks(engine));
141
169
  }
@@ -18,7 +18,7 @@ import {
18
18
  import { resolveWorkflowTypeTarget } from "./registration.js";
19
19
  import { cleanupReviews } from "./reviews.js";
20
20
  import {
21
- commitWorkflowStateOperations,
21
+ commitFencedWorkflowStateOperations,
22
22
  loadWorkflowState,
23
23
  runSerializedWorkflowStateWrite
24
24
  } from "./storage-io.js";
@@ -75,7 +75,8 @@ export function createLifecycleCallbacks(engine) {
75
75
  handleCleanupError: (source, error, workflowId) => createTerminationCallbacks(engine).handleCleanupError(source, error, workflowId),
76
76
  swallowPromiseRejection: (promise) => swallowPromiseRejection(promise),
77
77
  enforceHistoryCircuitBreaker: (workflowId) => terminateWorkflow(getInternals(engine), workflowId, "timed-out", createTerminationCallbacks(engine), HISTORY_CIRCUIT_BREAKER_REASON),
78
- failWorkflowForUnavailableServices: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system")
78
+ failWorkflowForUnavailableServices: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
79
+ failWorkflowForCheckpointDecodeError: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system")
79
80
  };
80
81
  }
81
82
  export function createTerminationCallbacksWith(engine, handleScheduledWorkflowTerminal) {
@@ -91,7 +92,7 @@ export function createTerminationCallbacksWith(engine, handleScheduledWorkflowTe
91
92
  handleScheduledWorkflowTerminal,
92
93
  loadWorkflowState: (workflowId) => loadWorkflowState(getInternals(engine), workflowId),
93
94
  runSerializedWorkflowStateWrite: (workflowId, writeOperation) => runSerializedWorkflowStateWrite(getInternals(engine), workflowId, writeOperation),
94
- commitWorkflowStateOperations: (state, operations) => commitWorkflowStateOperations(getInternals(engine), state, operations),
95
+ commitWorkflowStateOperations: (state, operations, options) => commitFencedWorkflowStateOperations(getInternals(engine), state, operations, options),
95
96
  cleanupReviews: (workflowId) => cleanupReviews(getInternals(engine), workflowId)
96
97
  };
97
98
  }
@@ -106,7 +107,8 @@ export function createTerminationCallbacks(engine) {
106
107
  }
107
108
  export function createRegistrationCallbacks(engine) {
108
109
  return {
109
- ensureRetentionSweepInterval: () => ensureRetentionSweepIntervalCallable(engine)
110
+ ensureRetentionSweepInterval: () => ensureRetentionSweepIntervalCallable(engine),
111
+ dispatchEvent: (event) => engine.dispatchEvent(event)
110
112
  };
111
113
  }
112
114
  let retentionSweepIntervalCallable = () => {
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  createActivityOperationCallbacks,
3
3
  createChildWorkflowOperationCallbacks,
4
+ createConditionOperationCallbacks,
4
5
  createCoordinationOperationCallbacks,
5
6
  createDataOperationCallbacks,
6
7
  createStateOperationCallbacks,
@@ -28,10 +29,12 @@ import {
28
29
  processMemoOperation,
29
30
  processOffloadOperation
30
31
  } from "./operations-data.js";
32
+ import { completeOperation } from "./operations-router.js";
31
33
  import { processSpeculateOperation } from "./operations-speculate.js";
32
34
  import { processStateCommitOperation, processStateReadOperation } from "./operations-state.js";
33
35
  import { processStreamOperation } from "./operations-stream.js";
34
36
  import { processSleepOperation } from "./operations-time.js";
37
+ import { processWaitConditionOperation } from "./operations-wait-condition.js";
35
38
  import { feedOperationResult } from "./strategy-helpers.js";
36
39
  import { processWaitReviewOperation } from "./sub-operation.js";
37
40
  import { finalizePendingTimelineEntry } from "./termination.js";
@@ -42,6 +45,13 @@ export function createOperationRouterCallbacks(engine) {
42
45
  processSleepOperation: (workflowId, operation) => processSleepOperation(getInternals(engine), workflowId, operation, createTimeOperationCallbacks(engine)),
43
46
  processWaitSignalOperation: (workflowId, operation) => processWaitSignalOperation(getInternals(engine), workflowId, operation, createCoordinationOperationCallbacks(engine)),
44
47
  processWaitUpdateOperation: (workflowId, operation) => processWaitUpdateOperation(getInternals(engine), workflowId, operation, createUpdateCallbacks(engine)),
48
+ processWaitConditionOperation: (workflowId, operation) => processWaitConditionOperation(getInternals(engine), workflowId, operation, createConditionOperationCallbacks(engine)),
49
+ processGetVersionOperation: async (workflowId, operation) => {
50
+ completeOperation(getInternals(engine), workflowId, operation.version, {
51
+ finalizePendingTimelineEntry: (id, status, value) => finalizePendingTimelineEntry(getInternals(engine), id, status, value),
52
+ feedOperationResult: (id, result, error) => feedOperationResult(getInternals(engine), id, result, error)
53
+ });
54
+ },
45
55
  processParallelOperation: (workflowId, operation) => processParallelOperation(getInternals(engine), workflowId, operation, createCoordinationOperationCallbacks(engine)),
46
56
  processRaceOperation: (workflowId, operation) => processRaceOperation(getInternals(engine), workflowId, operation, createCoordinationOperationCallbacks(engine)),
47
57
  processMemoOperation: (workflowId, operation) => processMemoOperation(getInternals(engine), workflowId, operation, createDataOperationCallbacks(engine)),
@@ -6,8 +6,8 @@ export declare function createScheduleCallbacks<TWorkflows extends object, TActi
6
6
  export declare function createReviewOperationCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): ReviewOperationCallbacks;
7
7
  export declare function createSubmitReviewCallbacks<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>): SubmitReviewCallbacks;
8
8
  export declare function refreshScheduledWorkflowStateForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, state: ScheduleState): Promise<RefreshedScheduleState>;
9
- export declare function startScheduledRunForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, state: ScheduleState): Promise<string>;
10
- export declare function applyScheduleOccurrenceForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, state: ScheduleState): Promise<ScheduleState>;
9
+ export declare function startScheduledRunForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, state: ScheduleState, occurrence?: number): Promise<string>;
10
+ export declare function applyScheduleOccurrenceForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, state: ScheduleState, occurrence?: number): Promise<ScheduleState>;
11
11
  export declare function settleBackfillScheduleStateForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, state: ScheduleState): Promise<ScheduleState>;
12
12
  export declare function handleScheduleTimerForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, entry: TimerEntry): Promise<void>;
13
13
  export declare function handleScheduledWorkflowTerminalForEngine<TWorkflows extends object, TActivities extends object>(engine: Engine<TWorkflows, TActivities>, workflowId: string): Promise<void>;
@@ -17,7 +17,7 @@ import {
17
17
  } from "./schedules.js";
18
18
  import { loadWorkflowState } from "./storage-io.js";
19
19
  import { feedOperationResult } from "./strategy-helpers.js";
20
- import { ensureTerminalCleanupTracked, failWorkflow } from "./termination.js";
20
+ import { ensureTerminalCleanupTracked, failWorkflow, handleCleanupError } from "./termination.js";
21
21
  export function createScheduleCallbacks(engine) {
22
22
  return {
23
23
  startWorkflow: async (type, input, options, additionalStartOperations) => {
@@ -27,10 +27,14 @@ export function createScheduleCallbacks(engine) {
27
27
  cancelWorkflow: (workflowId) => engine.cancel(workflowId),
28
28
  getWorkflowResult: (workflowId) => engine.getHandle(workflowId).result(),
29
29
  refreshScheduledWorkflowState: (state) => refreshScheduledWorkflowStateForEngine(engine, state),
30
- startScheduledRun: (state) => startScheduledRunForEngine(engine, state),
31
- applyScheduleOccurrence: (state) => applyScheduleOccurrenceForEngine(engine, state),
30
+ startScheduledRun: (state, occurrence) => startScheduledRunForEngine(engine, state, occurrence),
31
+ applyScheduleOccurrence: (state, occurrence) => applyScheduleOccurrenceForEngine(engine, state, occurrence),
32
32
  settleBackfillScheduleState: (state) => settleBackfillScheduleStateForEngine(engine, state),
33
- flushQueuedInlineWorkflowStartsDirectly: () => flushQueuedInlineWorkflowStartsDirectly(getInternals(engine), createInlineLaunchQueueCallbacks(engine))
33
+ flushQueuedInlineWorkflowStartsDirectly: () => flushQueuedInlineWorkflowStartsDirectly(getInternals(engine), createInlineLaunchQueueCallbacks(engine)),
34
+ failWorkflow: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine)),
35
+ handleCleanupError: (source, error, workflowId) => handleCleanupError(getInternals(engine), source, error, workflowId, {
36
+ dispatchEvent: (event) => engine.dispatchEvent(event)
37
+ })
34
38
  };
35
39
  }
36
40
  export function createReviewOperationCallbacks(engine) {
@@ -47,11 +51,11 @@ export function createSubmitReviewCallbacks(engine) {
47
51
  export async function refreshScheduledWorkflowStateForEngine(engine, state) {
48
52
  return refreshScheduledWorkflowState(getInternals(engine), state, createScheduleCallbacks(engine));
49
53
  }
50
- export async function startScheduledRunForEngine(engine, state) {
51
- return startScheduledRun(getInternals(engine), state, createScheduleCallbacks(engine));
54
+ export async function startScheduledRunForEngine(engine, state, occurrence) {
55
+ return startScheduledRun(getInternals(engine), state, createScheduleCallbacks(engine), occurrence);
52
56
  }
53
- export async function applyScheduleOccurrenceForEngine(engine, state) {
54
- return applyScheduleOccurrence(getInternals(engine), state, createScheduleCallbacks(engine));
57
+ export async function applyScheduleOccurrenceForEngine(engine, state, occurrence) {
58
+ return applyScheduleOccurrence(getInternals(engine), state, createScheduleCallbacks(engine), occurrence);
55
59
  }
56
60
  export async function settleBackfillScheduleStateForEngine(engine, state) {
57
61
  return settleBackfillScheduleState(getInternals(engine), state, createScheduleCallbacks(engine));
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shared bounded-concurrency size for materializing candidate workflow states.
3
+ * Keep this internal to engine query paths; it limits storage fan-out without
4
+ * changing result ordering.
5
+ */
6
+ export declare const CONSTRAINED_ID_CHUNK_SIZE = 64;
@@ -0,0 +1 @@
1
+ export const CONSTRAINED_ID_CHUNK_SIZE = 64;