@lostgradient/weft 0.2.1 → 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 (579) hide show
  1. package/README.md +123 -43
  2. package/dist/cli/conformance.js +7 -1
  3. package/dist/cli/generated/operation-client.generated.d.ts +55 -13
  4. package/dist/cli/generated/operation-client.generated.js +3 -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 +80 -79
  13. package/dist/client/handle-delegation.d.ts +7 -2
  14. package/dist/client/handle-delegation.js +9 -1
  15. package/dist/client/http-client-requests.d.ts +4 -1
  16. package/dist/client/http-client-requests.js +10 -0
  17. package/dist/client/http-client.d.ts +10 -4
  18. package/dist/client/http-client.js +18 -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 +100 -4
  23. package/dist/client/local.d.ts +7 -1
  24. package/dist/client/local.js +17 -2
  25. package/dist/client/start-body.d.ts +9 -2
  26. package/dist/client/start-body.js +13 -4
  27. package/dist/core/byte-arrays.d.ts +5 -0
  28. package/dist/core/byte-arrays.js +5 -0
  29. package/dist/core/checkpoint/lifecycle.d.ts +3 -0
  30. package/dist/core/checkpoint/lifecycle.js +9 -4
  31. package/dist/core/checkpoint/serialization.js +12 -5
  32. package/dist/core/codec/extension-codec.d.ts +16 -0
  33. package/dist/core/codec/extension-codec.js +104 -8
  34. package/dist/core/codec/index.d.ts +1 -0
  35. package/dist/core/codec/index.js +1 -0
  36. package/dist/core/codec/serializer-registry.d.ts +122 -0
  37. package/dist/core/codec/serializer-registry.js +51 -0
  38. package/dist/core/context/activity-retry-state.d.ts +38 -0
  39. package/dist/core/context/activity-retry-state.js +89 -0
  40. package/dist/core/context/activity-schedule-to-close.d.ts +159 -0
  41. package/dist/core/context/activity-schedule-to-close.js +69 -0
  42. package/dist/core/context/child-workflow-pipe.d.ts +5 -5
  43. package/dist/core/context/child-workflow-pipe.js +15 -2
  44. package/dist/core/context/context-presence.d.ts +19 -0
  45. package/dist/core/context/context-presence.js +13 -0
  46. package/dist/core/context/durable-operations.d.ts +25 -0
  47. package/dist/core/context/durable-operations.js +64 -0
  48. package/dist/core/context/index.d.ts +18 -5
  49. package/dist/core/context/index.js +17 -12
  50. package/dist/core/context/internals.d.ts +29 -0
  51. package/dist/core/context/internals.js +6 -1
  52. package/dist/core/context/operation-request.d.ts +35 -0
  53. package/dist/core/context/parallel-cache-entry.d.ts +14 -5
  54. package/dist/core/context/run-operation.d.ts +21 -3
  55. package/dist/core/context/run-operation.js +56 -93
  56. package/dist/core/context/session-state.js +7 -8
  57. package/dist/core/context/speculative-child.js +2 -0
  58. package/dist/core/context/types.d.ts +15 -0
  59. package/dist/core/context/version-patching.d.ts +8 -0
  60. package/dist/core/context/version-patching.js +40 -0
  61. package/dist/core/context/workflow-logger.d.ts +98 -0
  62. package/dist/core/context/workflow-logger.js +68 -0
  63. package/dist/core/engine/activity-heartbeat-tracking.d.ts +64 -0
  64. package/dist/core/engine/activity-heartbeat-tracking.js +42 -0
  65. package/dist/core/engine/activity-per-attempt-timeout.d.ts +41 -0
  66. package/dist/core/engine/activity-per-attempt-timeout.js +36 -0
  67. package/dist/core/engine/activity-reconciliation.d.ts +1 -0
  68. package/dist/core/engine/activity-reconciliation.js +12 -1
  69. package/dist/core/engine/activity-resolution.d.ts +23 -0
  70. package/dist/core/engine/activity-resolution.js +37 -0
  71. package/dist/core/engine/aggregate.js +66 -30
  72. package/dist/core/engine/async-activity-completion.d.ts +23 -6
  73. package/dist/core/engine/async-activity-completion.js +53 -12
  74. package/dist/core/engine/attributes-tags.js +9 -4
  75. package/dist/core/engine/bulk-operations-purge.d.ts +26 -0
  76. package/dist/core/engine/bulk-operations-purge.js +38 -3
  77. package/dist/core/engine/bulk-operations-shared.d.ts +2 -0
  78. package/dist/core/engine/bulk-operations-shared.js +8 -2
  79. package/dist/core/engine/bulk-operations.d.ts +4 -1
  80. package/dist/core/engine/bulk-operations.js +235 -24
  81. package/dist/core/engine/callback-creators-bundles.d.ts +9 -0
  82. package/dist/core/engine/callback-creators-bundles.js +30 -2
  83. package/dist/core/engine/callback-creators-core.js +6 -4
  84. package/dist/core/engine/callback-creators-router.js +10 -0
  85. package/dist/core/engine/callback-creators-schedule.d.ts +2 -2
  86. package/dist/core/engine/callback-creators-schedule.js +12 -8
  87. package/dist/core/engine/candidate-read-batching.d.ts +6 -0
  88. package/dist/core/engine/candidate-read-batching.js +1 -0
  89. package/dist/core/engine/checkpoint-io.js +61 -25
  90. package/dist/core/engine/checkpoint-reads.js +3 -2
  91. package/dist/core/engine/checkpoint-replay.d.ts +20 -0
  92. package/dist/core/engine/checkpoint-replay.js +242 -0
  93. package/dist/core/engine/checkpoint-side-effects.d.ts +23 -0
  94. package/dist/core/engine/checkpoint-side-effects.js +35 -0
  95. package/dist/core/engine/child-workflow-cancellation.d.ts +10 -0
  96. package/dist/core/engine/child-workflow-cancellation.js +40 -0
  97. package/dist/core/engine/child-workflow.js +27 -4
  98. package/dist/core/engine/condition-waiters.d.ts +14 -0
  99. package/dist/core/engine/condition-waiters.js +5 -0
  100. package/dist/core/engine/construction.d.ts +3 -1
  101. package/dist/core/engine/construction.js +30 -8
  102. package/dist/core/engine/coordination-branch-executors.d.ts +70 -0
  103. package/dist/core/engine/coordination-branch-executors.js +107 -0
  104. package/dist/core/engine/deferred-consume-envelope.d.ts +59 -0
  105. package/dist/core/engine/deferred-consume-envelope.js +14 -0
  106. package/dist/core/engine/disposal.js +25 -0
  107. package/dist/core/engine/engine-create-types.d.ts +14 -18
  108. package/dist/core/engine/engine-internal-types.d.ts +38 -3
  109. package/dist/core/engine/engine-leak-warnings.d.ts +6 -0
  110. package/dist/core/engine/engine-leak-warnings.js +4 -0
  111. package/dist/core/engine/engine-runtime-helpers.d.ts +17 -0
  112. package/dist/core/engine/engine-runtime-helpers.js +26 -5
  113. package/dist/core/engine/errors.d.ts +121 -0
  114. package/dist/core/engine/errors.js +45 -1
  115. package/dist/core/engine/event-log-compaction.d.ts +8 -0
  116. package/dist/core/engine/event-log-compaction.js +20 -2
  117. package/dist/core/engine/fenced-write.d.ts +65 -0
  118. package/dist/core/engine/fenced-write.js +71 -0
  119. package/dist/core/engine/finalizer-state.d.ts +28 -0
  120. package/dist/core/engine/finalizer-state.js +16 -0
  121. package/dist/core/engine/handle-result.js +1 -1
  122. package/dist/core/engine/handles.d.ts +97 -40
  123. package/dist/core/engine/handles.js +25 -27
  124. package/dist/core/engine/index.d.ts +125 -15
  125. package/dist/core/engine/index.js +207 -11
  126. package/dist/core/engine/inline-launch-queue.d.ts +14 -0
  127. package/dist/core/engine/inline-launch-queue.js +32 -7
  128. package/dist/core/engine/inline-parking.js +3 -2
  129. package/dist/core/engine/internals.d.ts +125 -13
  130. package/dist/core/engine/lease-codec.d.ts +35 -0
  131. package/dist/core/engine/lease-codec.js +32 -0
  132. package/dist/core/engine/lease-deposition.d.ts +66 -0
  133. package/dist/core/engine/lease-deposition.js +10 -0
  134. package/dist/core/engine/lease-errors.d.ts +99 -0
  135. package/dist/core/engine/lease-errors.js +30 -0
  136. package/dist/core/engine/lease-manager.d.ts +114 -0
  137. package/dist/core/engine/lease-manager.js +135 -0
  138. package/dist/core/engine/lifecycle/fork-helpers.js +1 -7
  139. package/dist/core/engine/lifecycle/persist.js +15 -52
  140. package/dist/core/engine/lifecycle/recovered-services.d.ts +8 -6
  141. package/dist/core/engine/lifecycle/recovered-services.js +18 -3
  142. package/dist/core/engine/lifecycle/resume.js +39 -11
  143. package/dist/core/engine/lifecycle/shared.d.ts +8 -1
  144. package/dist/core/engine/lifecycle/start-batch.d.ts +1 -1
  145. package/dist/core/engine/lifecycle/start-batch.js +2 -1
  146. package/dist/core/engine/lifecycle/start-commit.d.ts +56 -0
  147. package/dist/core/engine/lifecycle/start-commit.js +69 -0
  148. package/dist/core/engine/lifecycle/start-exec.d.ts +30 -2
  149. package/dist/core/engine/lifecycle/start-exec.js +38 -0
  150. package/dist/core/engine/lifecycle/start-or-signal-create.d.ts +58 -0
  151. package/dist/core/engine/lifecycle/start-or-signal-create.js +95 -0
  152. package/dist/core/engine/lifecycle/start-or-signal-resolution.d.ts +79 -0
  153. package/dist/core/engine/lifecycle/start-or-signal-resolution.js +60 -0
  154. package/dist/core/engine/lifecycle/start-or-signal.d.ts +46 -0
  155. package/dist/core/engine/lifecycle/start-or-signal.js +71 -0
  156. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +39 -0
  157. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +28 -0
  158. package/dist/core/engine/lifecycle/start.d.ts +6 -6
  159. package/dist/core/engine/lifecycle/start.js +47 -45
  160. package/dist/core/engine/lifecycle/transition.js +17 -5
  161. package/dist/core/engine/lifecycle.d.ts +3 -2
  162. package/dist/core/engine/lifecycle.js +9 -2
  163. package/dist/core/engine/list-candidate-resolution.js +2 -2
  164. package/dist/core/engine/listing.js +10 -6
  165. package/dist/core/engine/operations-activity.d.ts +4 -11
  166. package/dist/core/engine/operations-activity.js +22 -49
  167. package/dist/core/engine/operations-coordination.d.ts +10 -0
  168. package/dist/core/engine/operations-coordination.js +43 -8
  169. package/dist/core/engine/operations-router.d.ts +6 -0
  170. package/dist/core/engine/operations-router.js +2 -0
  171. package/dist/core/engine/operations-speculate.js +6 -2
  172. package/dist/core/engine/operations-stream.js +12 -2
  173. package/dist/core/engine/operations-time.d.ts +4 -2
  174. package/dist/core/engine/operations-time.js +14 -2
  175. package/dist/core/engine/operations-wait-condition.d.ts +23 -0
  176. package/dist/core/engine/operations-wait-condition.js +62 -0
  177. package/dist/core/engine/ownership-options.d.ts +23 -0
  178. package/dist/core/engine/ownership-options.js +26 -0
  179. package/dist/core/engine/payload-size-policy.d.ts +3 -0
  180. package/dist/core/engine/payload-size-policy.js +4 -0
  181. package/dist/core/engine/pending-updates.d.ts +17 -0
  182. package/dist/core/engine/pending-updates.js +33 -11
  183. package/dist/core/engine/persisted-data-version.d.ts +5 -9
  184. package/dist/core/engine/persisted-data-version.js +4 -5
  185. package/dist/core/engine/queries.js +1 -1
  186. package/dist/core/engine/registration.d.ts +1 -0
  187. package/dist/core/engine/registration.js +18 -3
  188. package/dist/core/engine/schedule-handle.d.ts +45 -0
  189. package/dist/core/engine/schedule-handle.js +26 -0
  190. package/dist/core/engine/schedule-jitter.d.ts +5 -0
  191. package/dist/core/engine/schedule-jitter.js +10 -0
  192. package/dist/core/engine/schedule-run.d.ts +17 -0
  193. package/dist/core/engine/schedule-run.js +38 -0
  194. package/dist/core/engine/schedule-timer.js +81 -17
  195. package/dist/core/engine/schedules.d.ts +8 -5
  196. package/dist/core/engine/schedules.js +44 -19
  197. package/dist/core/engine/search-attribute-records.d.ts +4 -0
  198. package/dist/core/engine/search-attribute-records.js +17 -0
  199. package/dist/core/engine/second-instance-detector.d.ts +96 -0
  200. package/dist/core/engine/second-instance-detector.js +108 -0
  201. package/dist/core/engine/signals.d.ts +38 -0
  202. package/dist/core/engine/signals.js +55 -19
  203. package/dist/core/engine/state-utilities.d.ts +49 -2
  204. package/dist/core/engine/state-utilities.js +114 -3
  205. package/dist/core/engine/storage-io.d.ts +16 -2
  206. package/dist/core/engine/storage-io.js +26 -5
  207. package/dist/core/engine/stream-chunk-loading.d.ts +2 -0
  208. package/dist/core/engine/stream-chunk-loading.js +24 -1
  209. package/dist/core/engine/sub-operation.js +22 -3
  210. package/dist/core/engine/termination/cleanup.d.ts +28 -1
  211. package/dist/core/engine/termination/cleanup.js +44 -2
  212. package/dist/core/engine/termination/complete.js +48 -9
  213. package/dist/core/engine/termination/finalizer-activity.d.ts +53 -0
  214. package/dist/core/engine/termination/finalizer-activity.js +30 -0
  215. package/dist/core/engine/termination/finalizer-claim.d.ts +110 -0
  216. package/dist/core/engine/termination/finalizer-claim.js +80 -0
  217. package/dist/core/engine/termination/finalizer.d.ts +48 -0
  218. package/dist/core/engine/termination/finalizer.js +159 -0
  219. package/dist/core/engine/termination/suspend.d.ts +70 -0
  220. package/dist/core/engine/termination/suspend.js +41 -0
  221. package/dist/core/engine/termination.d.ts +5 -2
  222. package/dist/core/engine/termination.js +6 -0
  223. package/dist/core/engine/updates.js +5 -25
  224. package/dist/core/engine/validation/schedule.d.ts +2 -1
  225. package/dist/core/engine/validation/schedule.js +51 -2
  226. package/dist/core/engine/validation.js +54 -3
  227. package/dist/core/engine/waiting-update-response.d.ts +8 -0
  228. package/dist/core/engine/waiting-update-response.js +22 -0
  229. package/dist/core/engine/workflow-concurrency.d.ts +10 -0
  230. package/dist/core/engine/workflow-concurrency.js +136 -0
  231. package/dist/core/engine/workflow-feed.d.ts +9 -8
  232. package/dist/core/engine/workflow-feed.js +4 -1
  233. package/dist/core/engine/workflow-indexes.d.ts +9 -0
  234. package/dist/core/engine/workflow-indexes.js +10 -0
  235. package/dist/core/engine/workflow-state-stream.js +33 -13
  236. package/dist/core/engine/workflow-visibility-queries.d.ts +2 -2
  237. package/dist/core/engine-helpers.js +1 -0
  238. package/dist/core/events/activity-events.d.ts +43 -12
  239. package/dist/core/events/activity-events.js +28 -0
  240. package/dist/core/events/attribute-events.d.ts +2 -3
  241. package/dist/core/events/event-map.d.ts +19 -12
  242. package/dist/core/events/index.d.ts +1 -0
  243. package/dist/core/events/index.js +1 -0
  244. package/dist/core/events/schedule-events.d.ts +71 -0
  245. package/dist/core/events/schedule-events.js +29 -0
  246. package/dist/core/events/signal-events.d.ts +4 -6
  247. package/dist/core/events/system-events.d.ts +29 -19
  248. package/dist/core/events/system-events.js +26 -0
  249. package/dist/core/events/update-events.d.ts +6 -8
  250. package/dist/core/events/workflow-events.d.ts +108 -20
  251. package/dist/core/events/workflow-events.js +35 -0
  252. package/dist/core/failure-categories.js +5 -17
  253. package/dist/core/fault-code.d.ts +9 -3
  254. package/dist/core/fault-code.js +1 -0
  255. package/dist/core/inline-execution-strategy.context-options.d.ts +69 -0
  256. package/dist/core/inline-execution-strategy.context-options.js +56 -0
  257. package/dist/core/inline-execution-strategy.d.ts +31 -36
  258. package/dist/core/inline-execution-strategy.js +16 -27
  259. package/dist/core/list-filter-validation.d.ts +1 -1
  260. package/dist/core/list-filter-validation.js +2 -1
  261. package/dist/core/payload-size.d.ts +1 -1
  262. package/dist/core/persisted-data-incompatible-error.d.ts +9 -7
  263. package/dist/core/review/events.d.ts +6 -8
  264. package/dist/core/scheduler/scheduler-class.d.ts +10 -1
  265. package/dist/core/scheduler/scheduler-class.js +38 -11
  266. package/dist/core/scheduler/timer-batch.js +9 -1
  267. package/dist/core/scheduler/timer-sources.d.ts +1 -0
  268. package/dist/core/scheduler/timer-sources.js +11 -5
  269. package/dist/core/session-state.d.ts +0 -1
  270. package/dist/core/session-state.js +2 -2
  271. package/dist/core/start-workflow-validation.d.ts +56 -0
  272. package/dist/core/start-workflow-validation.js +30 -1
  273. package/dist/core/step-context.d.ts +10 -6
  274. package/dist/core/step-context.js +7 -15
  275. package/dist/core/types/activity-verification.d.ts +67 -0
  276. package/dist/core/types/activity-verification.js +0 -0
  277. package/dist/core/types/activity.d.ts +86 -64
  278. package/dist/core/types/bulk.d.ts +50 -9
  279. package/dist/core/types/checkpoint.d.ts +44 -8
  280. package/dist/core/types/identity.d.ts +8 -1
  281. package/dist/core/types/launch-metadata.d.ts +33 -0
  282. package/dist/core/types/launch-metadata.js +0 -0
  283. package/dist/core/types/list-options.d.ts +146 -0
  284. package/dist/core/types/list-options.js +0 -0
  285. package/dist/core/types/message-handles.d.ts +25 -0
  286. package/dist/core/types/options.d.ts +165 -215
  287. package/dist/core/types/reviews.d.ts +2 -1
  288. package/dist/core/types/schedules.d.ts +39 -3
  289. package/dist/core/types/services-resolution.d.ts +47 -0
  290. package/dist/core/types/services-resolution.js +0 -0
  291. package/dist/core/types/state.d.ts +11 -11
  292. package/dist/core/types/workflow-builder-runtime.d.ts +12 -3
  293. package/dist/core/types/workflow-builder-runtime.js +11 -2
  294. package/dist/core/types/workflow-builder.d.ts +47 -15
  295. package/dist/core/types/workflow-concurrency.d.ts +39 -0
  296. package/dist/core/types/workflow-concurrency.js +0 -0
  297. package/dist/core/types/workflow-context.d.ts +157 -14
  298. package/dist/core/types/workflow-definition.d.ts +53 -10
  299. package/dist/core/types/workflow-function.d.ts +101 -9
  300. package/dist/core/types/workflow-log.d.ts +98 -0
  301. package/dist/core/types/workflow-log.js +0 -0
  302. package/dist/core/types/workflow-registries.d.ts +14 -3
  303. package/dist/core/types/workflow-registry.d.ts +3 -0
  304. package/dist/core/types/workflow-snapshot.d.ts +29 -0
  305. package/dist/core/types/workflow-snapshot.js +0 -0
  306. package/dist/core/types.d.ts +7 -0
  307. package/dist/core/types.js +7 -0
  308. package/dist/core/versioning.d.ts +9 -39
  309. package/dist/core/versioning.js +2 -12
  310. package/dist/core/weft-error.d.ts +44 -1
  311. package/dist/core/weft-error.js +19 -1
  312. package/dist/core/worker-execution-strategy-options.d.ts +26 -0
  313. package/dist/core/worker-execution-strategy.js +40 -36
  314. package/dist/core/worker-inbound-message.d.ts +38 -0
  315. package/dist/core/worker-inbound-message.js +37 -0
  316. package/dist/core/worker-log-abuse-counter.d.ts +175 -0
  317. package/dist/core/worker-log-abuse-counter.js +107 -0
  318. package/dist/core/worker-message-helpers.d.ts +47 -0
  319. package/dist/core/worker-message-helpers.js +26 -0
  320. package/dist/core/worker-protocol-guard.js +1 -1
  321. package/dist/core/worker-protocol-log.d.ts +56 -0
  322. package/dist/core/worker-protocol-log.js +18 -0
  323. package/dist/core/worker-protocol.d.ts +23 -0
  324. package/dist/core/worker-protocol.js +12 -2
  325. package/dist/core/workflow-version-tuple.d.ts +3 -9
  326. package/dist/core/workflow-version-tuple.js +2 -3
  327. package/dist/diagnostics/doctor.js +6 -3
  328. package/dist/diagnostics/format.js +3 -8
  329. package/dist/diagnostics/types.d.ts +5 -5
  330. package/dist/diagnostics/validate.d.ts +0 -1
  331. package/dist/diagnostics/version-check.d.ts +1 -1
  332. package/dist/diagnostics/version-check.js +10 -13
  333. package/dist/index.d.ts +13 -11
  334. package/dist/index.js +39 -4
  335. package/dist/json-schema.js +3 -3
  336. package/dist/mcp/cli.js +35 -35
  337. package/dist/mcp/dispatcher.js +1 -1
  338. package/dist/mcp/http.js +16 -6
  339. package/dist/mcp/list-filter.js +2 -1
  340. package/dist/mcp/protocol.d.ts +2 -0
  341. package/dist/mcp/protocol.js +1 -1
  342. package/dist/mcp/session.d.ts +16 -0
  343. package/dist/mcp/session.js +60 -6
  344. package/dist/mcp/tools.js +73 -6
  345. package/dist/observability/index.js +2 -2
  346. package/dist/server/asyncapi-channels.js +5 -2
  347. package/dist/server/attribute-filters.d.ts +8 -3
  348. package/dist/server/attribute-filters.js +6 -1
  349. package/dist/server/authentication/api-key.d.ts +2 -1
  350. package/dist/server/authentication/api-key.js +5 -2
  351. package/dist/server/authentication/constant-time-api-key.d.ts +15 -0
  352. package/dist/server/authentication/constant-time-api-key.js +24 -0
  353. package/dist/server/authentication/index.d.ts +1 -1
  354. package/dist/server/authentication/index.js +7 -4
  355. package/dist/server/authentication/rotating-api-key-store.d.ts +5 -3
  356. package/dist/server/authentication/rotating-api-key-store.js +19 -11
  357. package/dist/server/engine-event-feed-backend.d.ts +4 -5
  358. package/dist/server/fault-to-http.js +8 -1
  359. package/dist/server/fault-to-json-rpc.js +1 -0
  360. package/dist/server/fleet-event-feed.d.ts +31 -0
  361. package/dist/server/fleet-event-feed.js +157 -0
  362. package/dist/server/handler/index.js +1 -1
  363. package/dist/server/handler/response-helpers.js +2 -1
  364. package/dist/server/handler/route-dispatch.d.ts +6 -3
  365. package/dist/server/handler/route-dispatch.js +2 -2
  366. package/dist/server/handler.js +31 -31
  367. package/dist/server/index.d.ts +32 -2
  368. package/dist/server/index.js +35 -35
  369. package/dist/server/interactive-operations.js +1 -0
  370. package/dist/server/json-rpc-transport-helpers.d.ts +1 -0
  371. package/dist/server/json-rpc-transport-helpers.js +2 -1
  372. package/dist/server/json-rpc-websocket-runtime.d.ts +11 -2
  373. package/dist/server/json-rpc-websocket-runtime.js +1 -0
  374. package/dist/server/json-rpc-websocket-subscriptions.d.ts +10 -0
  375. package/dist/server/json-rpc-websocket-subscriptions.js +29 -0
  376. package/dist/server/json-rpc-websocket-types.d.ts +22 -0
  377. package/dist/server/json-rpc-websocket-types.js +0 -0
  378. package/dist/server/json-rpc-websocket-validation.js +20 -4
  379. package/dist/server/json-rpc-websocket.d.ts +2 -43
  380. package/dist/server/json-rpc-websocket.js +57 -74
  381. package/dist/server/openapi.d.ts +2 -1
  382. package/dist/server/openapi.js +1 -3
  383. package/dist/server/openrpc-document-schema.d.ts +78 -0
  384. package/dist/server/openrpc-document-schema.js +27 -1
  385. package/dist/server/openrpc-errors.d.ts +3 -0
  386. package/dist/server/openrpc-errors.js +2 -1
  387. package/dist/server/openrpc.js +32 -0
  388. package/dist/server/operation-catalog/index.d.ts +1 -1
  389. package/dist/server/operation-catalog/pipeline-helpers.js +1 -0
  390. package/dist/server/operation-catalog/pipeline-stages.js +26 -12
  391. package/dist/server/operation-catalog/pipeline.js +8 -1
  392. package/dist/server/operation-catalog/registry.js +13 -0
  393. package/dist/server/operation-catalog/types.d.ts +20 -9
  394. package/dist/server/operation-fault.d.ts +10 -0
  395. package/dist/server/operation-fault.js +2 -0
  396. package/dist/server/operation-registry.d.ts +12 -11
  397. package/dist/server/operation-registry.js +12 -3
  398. package/dist/server/operations/aggregate-workflows.d.ts +15 -15
  399. package/dist/server/operations/async-activity.d.ts +2 -2
  400. package/dist/server/operations/async-activity.js +12 -7
  401. package/dist/server/operations/bulk-cancel-workflows.d.ts +1 -1
  402. package/dist/server/operations/bulk-cancel-workflows.js +2 -2
  403. package/dist/server/operations/bulk-delete-workflows.d.ts +1 -1
  404. package/dist/server/operations/bulk-delete-workflows.js +2 -2
  405. package/dist/server/operations/bulk-filter-helpers.d.ts +8 -6
  406. package/dist/server/operations/bulk-filter-helpers.js +54 -24
  407. package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +11 -9
  408. package/dist/server/operations/bulk-mutate-workflow-tags.js +2 -2
  409. package/dist/server/operations/bulk-operation-helpers.d.ts +2 -2
  410. package/dist/server/operations/bulk-retry-failed-workflows.d.ts +7 -0
  411. package/dist/server/operations/bulk-retry-failed-workflows.js +64 -0
  412. package/dist/server/operations/bulk-signal-workflows.d.ts +11 -9
  413. package/dist/server/operations/bulk-signal-workflows.js +2 -2
  414. package/dist/server/operations/cancel-schedule.d.ts +1 -1
  415. package/dist/server/operations/create-schedule.d.ts +3 -1
  416. package/dist/server/operations/create-schedule.js +29 -11
  417. package/dist/server/operations/fleet-events-subscription.d.ts +54 -0
  418. package/dist/server/operations/fleet-events-subscription.js +99 -0
  419. package/dist/server/operations/fork-workflow.d.ts +1 -1
  420. package/dist/server/operations/fork-workflow.js +3 -2
  421. package/dist/server/operations/get-checkpoint-at.d.ts +1 -1
  422. package/dist/server/operations/get-registry.d.ts +1 -1
  423. package/dist/server/operations/get-retention-overview.d.ts +1 -1
  424. package/dist/server/operations/get-review.d.ts +1 -1
  425. package/dist/server/operations/get-schedule.d.ts +1 -1
  426. package/dist/server/operations/get-stream-chunks.d.ts +1 -1
  427. package/dist/server/operations/get-system-metrics.d.ts +2 -2
  428. package/dist/server/operations/get-task-diagnostics.d.ts +45 -6
  429. package/dist/server/operations/get-task-diagnostics.js +101 -7
  430. package/dist/server/operations/get-update-result.d.ts +1 -1
  431. package/dist/server/operations/get-workflow-attributes.d.ts +1 -1
  432. package/dist/server/operations/get-workflow-events.d.ts +1 -1
  433. package/dist/server/operations/get-workflow-result.d.ts +1 -1
  434. package/dist/server/operations/get-workflow-timeline.d.ts +1 -1
  435. package/dist/server/operations/get-workflow.d.ts +1 -1
  436. package/dist/server/operations/list-checkpoints.d.ts +1 -1
  437. package/dist/server/operations/list-reviews.d.ts +1 -1
  438. package/dist/server/operations/list-schedules.d.ts +1 -1
  439. package/dist/server/operations/list-task-queues.d.ts +2 -2
  440. package/dist/server/operations/list-workers.d.ts +2 -2
  441. package/dist/server/operations/list-workflows.d.ts +1 -1
  442. package/dist/server/operations/operation-helpers.d.ts +16 -1
  443. package/dist/server/operations/operation-helpers.js +15 -3
  444. package/dist/server/operations/pause-schedule.d.ts +1 -1
  445. package/dist/server/operations/purge-workflows.d.ts +5 -5
  446. package/dist/server/operations/purge-workflows.js +2 -2
  447. package/dist/server/operations/query-workflow.d.ts +1 -1
  448. package/dist/server/operations/query-workflow.js +3 -2
  449. package/dist/server/operations/recover-all.d.ts +1 -1
  450. package/dist/server/operations/replay-workflow.d.ts +1 -1
  451. package/dist/server/operations/resume-schedule.d.ts +1 -1
  452. package/dist/server/operations/resume-workflow.js +2 -2
  453. package/dist/server/operations/set-workflow-attributes.d.ts +1 -1
  454. package/dist/server/operations/set-workflow-attributes.js +6 -3
  455. package/dist/server/operations/signal-workflow.js +8 -3
  456. package/dist/server/operations/single-workflow-tag-mutation.js +13 -3
  457. package/dist/server/operations/start-or-signal-workflow.d.ts +44 -0
  458. package/dist/server/operations/start-or-signal-workflow.js +130 -0
  459. package/dist/server/operations/start-workflow-options.d.ts +38 -0
  460. package/dist/server/operations/start-workflow-options.js +63 -0
  461. package/dist/server/operations/start-workflow-rest-input.d.ts +14 -0
  462. package/dist/server/operations/start-workflow-rest-input.js +31 -0
  463. package/dist/server/operations/start-workflow.d.ts +1 -1
  464. package/dist/server/operations/start-workflow.js +15 -92
  465. package/dist/server/operations/storage.d.ts +6 -6
  466. package/dist/server/operations/storage.js +24 -14
  467. package/dist/server/operations/stream-workflow-sse.d.ts +1 -1
  468. package/dist/server/operations/submit-review-decision.d.ts +1 -1
  469. package/dist/server/operations/submit-review-decision.js +6 -3
  470. package/dist/server/operations/suspend-workflow.d.ts +13 -0
  471. package/dist/server/operations/suspend-workflow.js +36 -0
  472. package/dist/server/operations/update-schedule.d.ts +1 -1
  473. package/dist/server/operations/update-schedule.js +7 -4
  474. package/dist/server/operations/update-workflow.d.ts +1 -1
  475. package/dist/server/operations/update-workflow.js +7 -3
  476. package/dist/server/operations/worker-drain.d.ts +8 -8
  477. package/dist/server/operations/worker-drain.js +11 -8
  478. package/dist/server/operations/workflow-events-subscription.d.ts +7 -8
  479. package/dist/server/operations/workflow-events-subscription.js +43 -8
  480. package/dist/server/rest-binding.d.ts +21 -8
  481. package/dist/server/rest-bindings.js +24 -0
  482. package/dist/server/rest-body.d.ts +10 -0
  483. package/dist/server/rest-body.js +80 -0
  484. package/dist/server/runtime/authentication-bridge.d.ts +1 -0
  485. package/dist/server/runtime/authentication-bridge.js +33 -6
  486. package/dist/server/runtime/client-visible-events.d.ts +3 -0
  487. package/dist/server/runtime/client-visible-events.js +65 -0
  488. package/dist/server/runtime/context.d.ts +7 -0
  489. package/dist/server/runtime/event-broadcasting.d.ts +6 -0
  490. package/dist/server/runtime/event-broadcasting.js +72 -38
  491. package/dist/server/runtime/retry.d.ts +1 -0
  492. package/dist/server/runtime/retry.js +14 -0
  493. package/dist/server/runtime/shutdown.d.ts +7 -6
  494. package/dist/server/runtime/shutdown.js +6 -1
  495. package/dist/server/runtime/task-dispatch.js +5 -3
  496. package/dist/server/runtime/task-polling.d.ts +16 -2
  497. package/dist/server/runtime/task-polling.js +80 -24
  498. package/dist/server/runtime/task-reconciliation.js +9 -1
  499. package/dist/server/runtime/task-result-resolution.d.ts +15 -0
  500. package/dist/server/runtime/task-result-resolution.js +81 -0
  501. package/dist/server/runtime/websocket-stream.d.ts +20 -1
  502. package/dist/server/runtime/websocket-stream.js +173 -7
  503. package/dist/server/runtime/websocket-upgrade.js +22 -3
  504. package/dist/server/runtime/websocket-worker.d.ts +1 -1
  505. package/dist/server/runtime/websocket-worker.js +46 -30
  506. package/dist/server/serve-internals.d.ts +11 -1
  507. package/dist/server/serve-internals.js +20 -2
  508. package/dist/server/task-state.d.ts +38 -0
  509. package/dist/server/task-state.js +28 -0
  510. package/dist/server/workflow-event-feed.d.ts +36 -115
  511. package/dist/server/workflow-event-feed.js +92 -27
  512. package/dist/service-worker/index.js +31 -31
  513. package/dist/storage/auto.js +1 -1
  514. package/dist/storage/bun-sql.js +24 -0
  515. package/dist/storage/capabilities.d.ts +10 -2
  516. package/dist/storage/capabilities.js +2 -2
  517. package/dist/storage/compressed-storage.js +1 -1
  518. package/dist/storage/default-scope.d.ts +7 -4
  519. package/dist/storage/http.js +2 -2
  520. package/dist/storage/index.d.ts +81 -4
  521. package/dist/storage/indexeddb.js +1 -1
  522. package/dist/storage/interface.d.ts +189 -0
  523. package/dist/storage/interface.js +1 -1
  524. package/dist/storage/key-prefixes.d.ts +1 -1
  525. package/dist/storage/key-prefixes.js +12 -0
  526. package/dist/storage/lmdb.d.ts +4 -3
  527. package/dist/storage/lmdb.js +1 -1
  528. package/dist/storage/memory.js +1 -1
  529. package/dist/storage/neon-batch.d.ts +30 -0
  530. package/dist/storage/neon-batch.js +30 -0
  531. package/dist/storage/neon-value-mapping.d.ts +74 -0
  532. package/dist/storage/neon-value-mapping.js +23 -0
  533. package/dist/storage/neon.d.ts +124 -0
  534. package/dist/storage/neon.js +15 -0
  535. package/dist/storage/node-sqlite-loader.d.ts +71 -0
  536. package/dist/storage/node-sqlite-loader.js +41 -0
  537. package/dist/storage/node-sqlite.d.ts +1 -19
  538. package/dist/storage/node-sqlite.js +61 -32
  539. package/dist/storage/postgres-key-value-queries.d.ts +104 -0
  540. package/dist/storage/postgres-key-value-queries.js +101 -0
  541. package/dist/storage/resolve.d.ts +2 -165
  542. package/dist/storage/resolve.js +1 -1
  543. package/dist/storage/scoped-storage.js +1 -1
  544. package/dist/storage/storage-configuration.d.ts +209 -0
  545. package/dist/storage/storage-configuration.js +0 -0
  546. package/dist/storage/testing.d.ts +168 -0
  547. package/dist/storage/testing.js +2 -0
  548. package/dist/storage/text-value-store.d.ts +9 -9
  549. package/dist/storage/turso.d.ts +8 -0
  550. package/dist/storage/turso.js +2 -2
  551. package/dist/storage/typed-storage.js +1 -1
  552. package/dist/storage/web-extension.js +1 -1
  553. package/dist/testing/index.js +35 -35
  554. package/dist/version.d.ts +1 -1
  555. package/dist/version.js +1 -1
  556. package/dist/worker/index.js +9 -5
  557. package/dist/worker/long-poll.js +4 -0
  558. package/dist/worker/protocol-messages.d.ts +20 -0
  559. package/dist/worker/protocol-schemas.d.ts +32 -0
  560. package/dist/worker/protocol-schemas.js +8 -4
  561. package/dist/worker/protocol-task-result.d.ts +28 -0
  562. package/dist/worker/protocol-task-result.js +76 -0
  563. package/dist/worker/protocol.d.ts +4 -15
  564. package/dist/worker/protocol.js +1 -1
  565. package/dist/worker/registry/fair-share.d.ts +29 -0
  566. package/dist/worker/registry/fair-share.js +30 -0
  567. package/dist/worker/registry/routing.d.ts +18 -0
  568. package/dist/worker/registry/routing.js +14 -0
  569. package/dist/worker/registry/types.d.ts +7 -0
  570. package/dist/worker/registry.d.ts +16 -1
  571. package/dist/worker/registry.js +24 -36
  572. package/dist/workers/worker-replay-state.d.ts +32 -0
  573. package/dist/workers/worker-replay-state.js +35 -0
  574. package/dist/workers/worker-state-namespace.d.ts +21 -0
  575. package/dist/workers/worker-state-namespace.js +13 -0
  576. package/dist/workers/workflow-runner.d.ts +19 -15
  577. package/dist/workers/workflow-runner.js +72 -60
  578. package/dist/workers/workflow-worker-entry.js +5 -2
  579. package/package.json +21 -4
@@ -0,0 +1,136 @@
1
+ import { KEYS } from "../../storage/interface.js";
2
+ import { AtomicState, atomicStateVersionKey, readAtomicStateSnapshot } from "../atomic-state.js";
3
+ import { decode, encode } from "../codec.js";
4
+ import {
5
+ initialLockRecord,
6
+ reduceRelease
7
+ } from "../concurrency.js";
8
+ import { WorkflowConcurrencyLimitExceededError } from "./errors.js";
9
+ const WORKFLOW_CONCURRENCY_HOLDER_VERSION = 1, NON_EXPIRING_WORKFLOW_CONCURRENCY_LEASE = Number.MAX_SAFE_INTEGER;
10
+ function encodeVersionCondition(dataKey, version) {
11
+ return {
12
+ key: atomicStateVersionKey(dataKey),
13
+ expectedValue: version === 0 ? null : encode(version)
14
+ };
15
+ }
16
+ function normalizeLockRecord(record) {
17
+ if (record === void 0)
18
+ return initialLockRecord();
19
+ return {
20
+ holders: Array.isArray(record.holders) ? record.holders : [],
21
+ waiters: Array.isArray(record.waiters) ? record.waiters : []
22
+ };
23
+ }
24
+ function liveWorkflowConcurrencyHolders(holders, now) {
25
+ return holders.filter((holder) => holder.leaseExpiresAt > now);
26
+ }
27
+ function acquireWorkflowConcurrencySlot(current, options) {
28
+ const record = normalizeLockRecord(current), holders = liveWorkflowConcurrencyHolders(record.holders, options.now);
29
+ if (holders.some((holder) => holder.holderId === options.workflowId))
30
+ return {
31
+ acquired: !0,
32
+ record: {
33
+ holders: holders.map((holder) => holder.holderId === options.workflowId ? {
34
+ holderId: options.workflowId,
35
+ leaseExpiresAt: NON_EXPIRING_WORKFLOW_CONCURRENCY_LEASE
36
+ } : holder),
37
+ waiters: []
38
+ }
39
+ };
40
+ if (holders.length >= options.limit)
41
+ return { acquired: !1, record: { holders, waiters: [] } };
42
+ return {
43
+ acquired: !0,
44
+ record: {
45
+ holders: [
46
+ ...holders,
47
+ {
48
+ holderId: options.workflowId,
49
+ leaseExpiresAt: NON_EXPIRING_WORKFLOW_CONCURRENCY_LEASE
50
+ }
51
+ ],
52
+ waiters: []
53
+ }
54
+ };
55
+ }
56
+ function resolveWorkflowConcurrencyPartitionKey(workflowType, input, concurrency) {
57
+ if (concurrency.key === void 0)
58
+ return workflowType;
59
+ let partitionKey;
60
+ try {
61
+ partitionKey = concurrency.key(input);
62
+ } catch (error) {
63
+ throw Error(`workflow("${workflowType}").concurrency.key threw while resolving the partition key: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
64
+ }
65
+ if (typeof partitionKey !== "string")
66
+ throw TypeError(`workflow("${workflowType}").concurrency.key must return a string partition key`);
67
+ return partitionKey;
68
+ }
69
+ function encodeHolderRecord(workflowType, partitionKey) {
70
+ return {
71
+ version: WORKFLOW_CONCURRENCY_HOLDER_VERSION,
72
+ workflowType,
73
+ partitionKey
74
+ };
75
+ }
76
+ function decodeHolderRecord(bytes) {
77
+ const decoded = decode(bytes);
78
+ if (typeof decoded !== "object" || decoded === null)
79
+ return null;
80
+ const record = decoded;
81
+ if (record.version !== WORKFLOW_CONCURRENCY_HOLDER_VERSION || typeof record.workflowType !== "string" || typeof record.partitionKey !== "string")
82
+ return null;
83
+ return {
84
+ version: WORKFLOW_CONCURRENCY_HOLDER_VERSION,
85
+ workflowType: record.workflowType,
86
+ partitionKey: record.partitionKey
87
+ };
88
+ }
89
+ export async function buildWorkflowConcurrencyStartOperations(internals, workflowType, workflowId, input, concurrency) {
90
+ const partitionKey = resolveWorkflowConcurrencyPartitionKey(workflowType, input, concurrency), stateKey = KEYS.workflowConcurrency(workflowType, partitionKey), snapshot = await readAtomicStateSnapshot(internals.storage, stateKey, {
91
+ initial: initialLockRecord()
92
+ }), acquired = acquireWorkflowConcurrencySlot(snapshot.value, {
93
+ workflowId,
94
+ now: internals.options.getNow(),
95
+ limit: concurrency.max
96
+ });
97
+ if (!acquired.acquired)
98
+ throw new WorkflowConcurrencyLimitExceededError({
99
+ workflowType,
100
+ limit: concurrency.max,
101
+ partitionKey
102
+ });
103
+ return {
104
+ stateKey,
105
+ conditions: [encodeVersionCondition(stateKey, snapshot.version)],
106
+ operations: [
107
+ { type: "put", key: stateKey, value: encode(acquired.record) },
108
+ { type: "put", key: atomicStateVersionKey(stateKey), value: encode(snapshot.version + 1) },
109
+ {
110
+ type: "put",
111
+ key: KEYS.workflowConcurrencyHolder(workflowId),
112
+ value: encode(encodeHolderRecord(workflowType, partitionKey))
113
+ },
114
+ {
115
+ type: "put",
116
+ key: KEYS.terminalCleanupNeeded(workflowId),
117
+ value: new Uint8Array(0)
118
+ }
119
+ ]
120
+ };
121
+ }
122
+ export async function releaseWorkflowConcurrencySlot(internals, workflowId) {
123
+ const holderKey = KEYS.workflowConcurrencyHolder(workflowId), markerBytes = await internals.storage.get(holderKey);
124
+ if (markerBytes === null)
125
+ return;
126
+ const marker = decodeHolderRecord(markerBytes);
127
+ if (marker === null) {
128
+ await internals.storage.delete(holderKey);
129
+ return;
130
+ }
131
+ const stateKey = KEYS.workflowConcurrency(marker.workflowType, marker.partitionKey);
132
+ await new AtomicState(internals.storage, stateKey, {
133
+ initial: initialLockRecord()
134
+ }).update((current) => reduceRelease(current, { holderId: workflowId, now: internals.options.getNow() }));
135
+ await internals.storage.delete(holderKey);
136
+ }
@@ -7,9 +7,11 @@ import type { EngineInternals } from './internals.ts';
7
7
  */
8
8
  export type WorkflowFeedSelector = 'events' | 'tokens';
9
9
  /**
10
- * Hard-coded stream key for the `tokens` selector. Matches the
11
- * legacy REST SSE endpoint's key so resumption cursors round-trip
12
- * across transports.
10
+ * Hard-coded stream key for the `tokens` selector. Every transport that
11
+ * exposes the token feed `engine.getStreamChunks(id, 'tokens')` and the REST
12
+ * SSE / WebSocket stream-chunk routes layered on it — keys its stored chunks
13
+ * under this single value, so a resumption cursor issued by one transport
14
+ * round-trips through another.
13
15
  */
14
16
  export declare const TOKENS_STREAM_KEY = "tokens";
15
17
  /** Record `kind` for every token stream chunk emitted by the feed. */
@@ -24,11 +26,10 @@ export declare const STREAM_CHUNK_KIND = "stream:chunk";
24
26
  export declare const COMPACTION_BOUNDARY_KIND = "workflow:compaction-boundary";
25
27
  /**
26
28
  * A committed workflow-feed record surfaced to subscribers of
27
- * `subscribeWorkflowFeedCommits()`. Fires after `storage.batch()`
28
- * (events) or `storage.put()` (tokens) resolves, so replay and live
29
- * delivery share the same committed sequence authority. The same
30
- * shape covers both selectors — consumers filter on `selector`
31
- * before interpreting `payload`.
29
+ * `subscribeWorkflowFeedCommits()`. Fires after the storage commit resolves, so
30
+ * replay and live delivery share the same committed sequence authority. The
31
+ * same shape covers both selectors consumers filter on `selector` before
32
+ * interpreting `payload`.
32
33
  *
33
34
  * - `events` selector: `kind` is the durable log entry type
34
35
  * (e.g. `'workflow:checkpoint'`). `sequence` / `timestamp` come
@@ -1,7 +1,7 @@
1
1
  import { EventLog } from "../event-log.js";
2
2
  import { readEventLogWatermark } from "./event-log-compaction.js";
3
3
  import { workflowFeedListenerKey } from "./state-utilities.js";
4
- import { loadStoredStreamChunks } from "./stream-chunk-loading.js";
4
+ import { loadStoredStreamChunks, loadStoredStreamTailSequence } from "./stream-chunk-loading.js";
5
5
  export const TOKENS_STREAM_KEY = "tokens", STREAM_CHUNK_KIND = "stream:chunk", COMPACTION_BOUNDARY_KIND = "workflow:compaction-boundary";
6
6
  export async function* replayWorkflowFeed(internals, workflowId, selector, afterSequence) {
7
7
  if (selector === "events") {
@@ -17,6 +17,9 @@ export async function snapshotWorkflowFeedTail(internals, workflowId, selector)
17
17
  return head.sequence;
18
18
  return (await new EventLog(internals.storage, workflowId).loadHead()).sequence;
19
19
  }
20
+ const tail = await loadStoredStreamTailSequence(internals.storage, workflowId, TOKENS_STREAM_KEY);
21
+ if (tail !== null)
22
+ return tail;
20
23
  const chunks = await loadStoredStreamChunks(internals.storage, workflowId, TOKENS_STREAM_KEY);
21
24
  if (chunks.length === 0)
22
25
  return -1;
@@ -14,6 +14,7 @@
14
14
  import { type BatchOperation, type Storage } from '../../storage/interface.ts';
15
15
  import type { WorkflowState } from '../types.ts';
16
16
  import { WeftError } from '../weft-error.ts';
17
+ import type { EngineInternals } from './internals.ts';
17
18
  /**
18
19
  * Bumped whenever the index layout or population rules change. The engine
19
20
  * compares this to the watermark stored at `wf-idx-meta:version` to decide
@@ -96,8 +97,16 @@ export declare function buildWorkflowVisibilityIndexTransition(workflowId: strin
96
97
  * consult the new `wf-idx-*` rows when the watermark is `current`.
97
98
  */
98
99
  export type WorkflowVisibilityWatermark = 'current' | 'stale';
100
+ export declare const WORKFLOW_VISIBILITY_WATERMARK_CACHE_TTL_MS = 1000;
99
101
  /**
100
102
  * Read the visibility-index watermark. Returns `'current'` when the
101
103
  * persisted version is at or above {@link WORKFLOW_VISIBILITY_INDEX_VERSION}.
102
104
  */
103
105
  export declare function getWorkflowVisibilityWatermark(storage: Storage): Promise<WorkflowVisibilityWatermark>;
106
+ /**
107
+ * Read the visibility-index watermark through the engine-local query cache.
108
+ * The short freshness window avoids repeated metadata reads during bursts of
109
+ * list/aggregate queries without pinning an external backfill or drop decision
110
+ * until process restart.
111
+ */
112
+ export declare function getCachedWorkflowVisibilityWatermark(internals: EngineInternals): Promise<WorkflowVisibilityWatermark>;
@@ -77,6 +77,7 @@ function buildWorkflowVisibilityIndexOperationsInternal(workflowId, previousKeys
77
77
  return { batchOps, nextManifestKeys: nextKeys };
78
78
  }
79
79
  const EMPTY_INDEX_VALUE = new Uint8Array(0);
80
+ export const WORKFLOW_VISIBILITY_WATERMARK_CACHE_TTL_MS = 1000;
80
81
  export async function getWorkflowVisibilityWatermark(storage) {
81
82
  const bytes = await storage.get(KEYS.workflowVisibilityMetaVersion());
82
83
  if (!bytes)
@@ -91,3 +92,12 @@ export async function getWorkflowVisibilityWatermark(storage) {
91
92
  return "stale";
92
93
  return payload >= WORKFLOW_VISIBILITY_INDEX_VERSION ? "current" : "stale";
93
94
  }
95
+ export async function getCachedWorkflowVisibilityWatermark(internals) {
96
+ const { workflowVisibilityWatermark: cachedWatermark, workflowVisibilityWatermarkExpiresAt: expiresAt } = internals, now = Date.now();
97
+ if (cachedWatermark !== void 0 && expiresAt !== void 0 && now < expiresAt)
98
+ return cachedWatermark;
99
+ const watermark = await getWorkflowVisibilityWatermark(internals.storage);
100
+ internals.workflowVisibilityWatermark = watermark;
101
+ internals.workflowVisibilityWatermarkExpiresAt = now + WORKFLOW_VISIBILITY_WATERMARK_CACHE_TTL_MS;
102
+ return watermark;
103
+ }
@@ -6,25 +6,35 @@ import {
6
6
  import { failureCategorySearchValues, isFailureCategory } from "../failure-categories.js";
7
7
  import { encodeAttributeValue, searchAttributeName } from "../search-attributes.js";
8
8
  import { normalizeWorkflowTags } from "../workflow-tags.js";
9
- import { intersectIdentifierSets, matchesListFilter } from "./state-utilities.js";
9
+ import { CONSTRAINED_ID_CHUNK_SIZE } from "./candidate-read-batching.js";
10
+ import {
11
+ attributeFilterExactValues,
12
+ decodeSearchAttributeRecord,
13
+ intersectIdentifierSets,
14
+ listFilterHasAttributeFilters,
15
+ matchesListFilter
16
+ } from "./state-utilities.js";
10
17
  import { decodeWorkflowState } from "./validation.js";
11
18
  const ATTRIBUTE_SCAN_CONCURRENCY = 8;
12
19
  export async function* streamMatchingWorkflowStates(internals, filter) {
13
20
  const normalizedTagFilters = normalizeWorkflowTags(filter?.tags), constrainedIds = await resolveConstrainedIds(internals, filter, normalizedTagFilters);
14
21
  if (constrainedIds !== null) {
15
- for (const workflowId of constrainedIds) {
16
- const state = await loadMatchingWorkflowState(internals, workflowId, filter, constrainedIds, normalizedTagFilters);
17
- if (state === null)
18
- continue;
19
- yield state;
22
+ const orderedIds = [...constrainedIds];
23
+ for (let start = 0;start < orderedIds.length; start += CONSTRAINED_ID_CHUNK_SIZE) {
24
+ const chunkIds = orderedIds.slice(start, start + CONSTRAINED_ID_CHUNK_SIZE), chunkStates = await Promise.all(chunkIds.map((workflowId) => loadMatchingWorkflowState(internals, workflowId, filter, constrainedIds, normalizedTagFilters)));
25
+ for (const state of chunkStates) {
26
+ if (state === null)
27
+ continue;
28
+ yield state;
29
+ }
20
30
  }
21
31
  return;
22
32
  }
23
33
  for await (const [key, value] of internals.storage.scan("wf:")) {
24
34
  if (!isTopLevelWorkflowStateKey(key))
25
35
  continue;
26
- const state = decodeWorkflowState(value);
27
- if (!matchesListFilter(state, filter, constrainedIds, normalizedTagFilters))
36
+ const state = decodeWorkflowState(value), searchAttributes = await readSearchAttributesForFilter(internals, state.id, filter);
37
+ if (!matchesListFilter(state, filter, constrainedIds, normalizedTagFilters, searchAttributes))
28
38
  continue;
29
39
  yield state;
30
40
  }
@@ -33,11 +43,16 @@ async function loadMatchingWorkflowState(internals, workflowId, filter, constrai
33
43
  const stateBytes = await internals.storage.get(KEYS.workflow(workflowId));
34
44
  if (!stateBytes)
35
45
  return null;
36
- const state = decodeWorkflowState(stateBytes);
37
- if (!matchesListFilter(state, filter, constrainedIds, normalizedTagFilters))
46
+ const state = decodeWorkflowState(stateBytes), searchAttributes = await readSearchAttributesForFilter(internals, workflowId, filter);
47
+ if (!matchesListFilter(state, filter, constrainedIds, normalizedTagFilters, searchAttributes))
38
48
  return null;
39
49
  return state;
40
50
  }
51
+ async function readSearchAttributesForFilter(internals, workflowId, filter) {
52
+ if (!listFilterHasAttributeFilters(filter))
53
+ return null;
54
+ return decodeSearchAttributeRecord(await internals.storage.get(KEYS.attribute(workflowId)));
55
+ }
41
56
  export async function resolveConstrainedIds(internals, filter, normalizedTagFilters) {
42
57
  const attributeFilters = filter?.attributes, hasAttributeFilters = attributeFilters !== void 0 && attributeFilters.length > 0, hasTagFilters = normalizedTagFilters !== void 0 && normalizedTagFilters.length > 0;
43
58
  if (!hasAttributeFilters && !hasTagFilters)
@@ -78,10 +93,15 @@ function requireConstrainedIdSet(idSet) {
78
93
  return idSet;
79
94
  }
80
95
  async function collectExactAttributeMatches(internals, filter, attributeName, ids) {
81
- const exactValue = filter.value;
82
- if (exactValue === void 0)
96
+ const exactValues = attributeFilterExactValues(filter);
97
+ if (exactValues === null)
83
98
  return;
84
- const values = filter.key === "failureCategory" && isFailureCategory(exactValue) ? failureCategorySearchValues(exactValue) : [exactValue];
99
+ const values = [];
100
+ for (const exactValue of exactValues)
101
+ if (filter.key === "failureCategory" && isFailureCategory(exactValue))
102
+ values.push(...failureCategorySearchValues(exactValue));
103
+ else
104
+ values.push(exactValue);
85
105
  for (const value of values) {
86
106
  const exactPrefix = `idx:${attributeName}:${encodeAttributeValue(value)}:`;
87
107
  for await (const [key] of internals.storage.scan(exactPrefix))
@@ -6,13 +6,13 @@
6
6
  *
7
7
  * Every helper assumes the visibility-index watermark is `current` — the
8
8
  * caller checks {@link getWorkflowVisibilityWatermark} once per query and
9
- * falls back to the legacy scan path when it is `stale`.
9
+ * uses the current full-scan correctness path when it is `stale`.
10
10
  *
11
11
  * @module core/engine/workflow-visibility-queries
12
12
  */
13
13
  import { type Storage } from '../../storage/interface.ts';
14
14
  import type { FailureCategory, WorkflowStatus } from '../types/identity.ts';
15
- import type { TimeRange } from '../types/options.ts';
15
+ import type { TimeRange } from '../types/list-options.ts';
16
16
  /**
17
17
  * Match every workflow whose `status` appears in `statuses`. Empty input
18
18
  * returns an empty set (intersection short-circuits to "no matches").
@@ -25,6 +25,7 @@ export async function cleanupPartialStreamChunks(storage, workflowId, key, writt
25
25
  return;
26
26
  const deleteOperations = [
27
27
  ...writtenKeys.map((writtenKey) => ({ type: "delete", key: writtenKey })),
28
+ { type: "delete", key: KEYS.streamTail(workflowId, key) },
28
29
  { type: "delete", key: KEYS.streamMetadata(workflowId, key) }
29
30
  ];
30
31
  await storage.batch(deleteOperations).catch((deleteError) => {
@@ -8,9 +8,8 @@
8
8
  * import { Engine, ActivityStartedEvent } from '@lostgradient/weft';
9
9
  *
10
10
  * const engine = new Engine();
11
- * engine.addEventListener('activity:started', (e: Event) => {
12
- * const ev = e as ActivityStartedEvent;
13
- * console.log('activity started:', ev.activityName, 'attempt', ev.attempt);
11
+ * engine.addEventListener(ActivityStartedEvent.type, (event) => {
12
+ * console.log('activity started:', event.activityName, 'attempt', event.attempt);
14
13
  * });
15
14
  * ```
16
15
  */
@@ -32,9 +31,8 @@ export declare class ActivityStartedEvent extends Event {
32
31
  * import { Engine, ActivityCompletedEvent } from '@lostgradient/weft';
33
32
  *
34
33
  * const engine = new Engine();
35
- * engine.addEventListener('activity:completed', (e: Event) => {
36
- * const ev = e as ActivityCompletedEvent;
37
- * console.log(ev.activityName, 'completed in', ev.duration, 'ms');
34
+ * engine.addEventListener(ActivityCompletedEvent.type, (event) => {
35
+ * console.log(event.activityName, 'completed in', event.duration, 'ms');
38
36
  * });
39
37
  * ```
40
38
  */
@@ -61,9 +59,8 @@ export declare class ActivityCompletedEvent extends Event {
61
59
  * import { Engine, ActivityAsyncPendingEvent } from '@lostgradient/weft';
62
60
  *
63
61
  * const engine = new Engine();
64
- * engine.addEventListener('activity:async-pending', (e: Event) => {
65
- * const ev = e as ActivityAsyncPendingEvent;
66
- * console.log('awaiting external completion of', ev.activityName, 'token', ev.token);
62
+ * engine.addEventListener(ActivityAsyncPendingEvent.type, (event) => {
63
+ * console.log('awaiting external completion of', event.activityName, 'token', event.token);
67
64
  * });
68
65
  * ```
69
66
  */
@@ -87,9 +84,8 @@ export declare class ActivityAsyncPendingEvent extends Event {
87
84
  * import { Engine, ActivityFailedEvent } from '@lostgradient/weft';
88
85
  *
89
86
  * const engine = new Engine();
90
- * engine.addEventListener('activity:failed', (e: Event) => {
91
- * const ev = e as ActivityFailedEvent;
92
- * console.error(ev.activityName, 'attempt', ev.attempt, 'failed:', ev.error.message);
87
+ * engine.addEventListener(ActivityFailedEvent.type, (event) => {
88
+ * console.error(event.activityName, 'attempt', event.attempt, 'failed:', event.error.message);
93
89
  * });
94
90
  * ```
95
91
  */
@@ -102,3 +98,38 @@ export declare class ActivityFailedEvent extends Event {
102
98
  readonly attempt: number;
103
99
  constructor(operationId: string, workflowId: string, activityName: string, error: Error, attempt: number);
104
100
  }
101
+ /**
102
+ * Fired on the {@link Engine} when a remote worker task result cannot be
103
+ * durably moved from in-flight to resolved after storage retries are exhausted.
104
+ * The durable dead-letter guard prevents reconciliation from silently
105
+ * re-dispatching the already-completed worker attempt until an operator clears
106
+ * the diagnostic entry.
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * import { Engine, TaskResultDeadLetteredEvent } from '@lostgradient/weft';
111
+ *
112
+ * const engine = new Engine();
113
+ * engine.addEventListener(TaskResultDeadLetteredEvent.type, (event) => {
114
+ * console.warn('task dead-lettered:', event.operationId, event.reason);
115
+ * });
116
+ * ```
117
+ */
118
+ export declare class TaskResultDeadLetteredEvent extends Event {
119
+ static readonly type: "task:dead-lettered";
120
+ readonly operationId: string;
121
+ readonly workflowId: string | undefined;
122
+ readonly activityName: string | undefined;
123
+ readonly queue: string | undefined;
124
+ readonly workerId: string | undefined;
125
+ readonly reason: 'result-resolution-storage-exhausted';
126
+ readonly errorMessage: string;
127
+ constructor({ operationId, workflowId, activityName, queue, workerId, errorMessage, }: {
128
+ operationId: string;
129
+ workflowId?: string | undefined;
130
+ activityName?: string | undefined;
131
+ queue?: string | undefined;
132
+ workerId?: string | undefined;
133
+ errorMessage: string;
134
+ });
135
+ }
@@ -61,3 +61,31 @@ export class ActivityFailedEvent extends Event {
61
61
  this.attempt = attempt;
62
62
  }
63
63
  }
64
+
65
+ export class TaskResultDeadLetteredEvent extends Event {
66
+ static type = "task:dead-lettered";
67
+ operationId;
68
+ workflowId;
69
+ activityName;
70
+ queue;
71
+ workerId;
72
+ reason;
73
+ errorMessage;
74
+ constructor({
75
+ operationId,
76
+ workflowId,
77
+ activityName,
78
+ queue,
79
+ workerId,
80
+ errorMessage
81
+ }) {
82
+ super(TaskResultDeadLetteredEvent.type);
83
+ this.operationId = operationId;
84
+ this.workflowId = workflowId;
85
+ this.activityName = activityName;
86
+ this.queue = queue;
87
+ this.workerId = workerId;
88
+ this.reason = "result-resolution-storage-exhausted";
89
+ this.errorMessage = errorMessage;
90
+ }
91
+ }
@@ -8,9 +8,8 @@
8
8
  * import { Engine, AttributesChangedEvent } from '@lostgradient/weft';
9
9
  *
10
10
  * const engine = new Engine();
11
- * engine.addEventListener('attributes:changed', (e: Event) => {
12
- * const ev = e as AttributesChangedEvent;
13
- * console.log('attributes changed for', ev.workflowId, ev.changes);
11
+ * engine.addEventListener(AttributesChangedEvent.type, (event) => {
12
+ * console.log('attributes changed for', event.workflowId, event.changes);
14
13
  * });
15
14
  * ```
16
15
  */
@@ -1,52 +1,59 @@
1
1
  import type { ReviewCompletedEvent, ReviewRequestedEvent } from '../review/events.ts';
2
- import type { ActivityAsyncPendingEvent, ActivityCompletedEvent, ActivityFailedEvent, ActivityStartedEvent } from './activity-events.ts';
2
+ import type { ActivityAsyncPendingEvent, ActivityCompletedEvent, ActivityFailedEvent, ActivityStartedEvent, TaskResultDeadLetteredEvent } from './activity-events.ts';
3
3
  import type { AttributesChangedEvent } from './attribute-events.ts';
4
+ import type { ScheduleFiredEvent, ScheduleMissedFireEvent } from './schedule-events.ts';
4
5
  import type { SignalDeliveredEvent, SignalReceivedEvent } from './signal-events.ts';
5
- import type { AlertFiredEvent, AlertResolvedEvent, CheckpointSizeWarningEvent, CleanupWarningEvent, ConstraintViolatedEvent, DevelopmentWarningEvent, StorageSizeReportedEvent } from './system-events.ts';
6
+ import type { AlertFiredEvent, AlertResolvedEvent, CheckpointSizeWarningEvent, CleanupWarningEvent, ConstraintViolatedEvent, DevelopmentWarningEvent, StorageSizeReportedEvent, WorkerConnectedEvent, WorkerDisconnectedEvent } from './system-events.ts';
6
7
  import type { UpdateCompletedEvent, UpdateReceivedEvent } from './update-events.ts';
7
- import type { WorkflowCancelledEvent, WorkflowCompletedEvent, WorkflowFailedEvent, WorkflowRecoverySkippedEvent, WorkflowResumedEvent, WorkflowStartedEvent, WorkflowTimedOutEvent } from './workflow-events.ts';
8
+ import type { WorkflowCancelledEvent, WorkflowCompletedEvent, WorkflowDefinitionRegisteredEvent, WorkflowFailedEvent, WorkflowRecoverySkippedEvent, WorkflowResumedEvent, WorkflowStartedEvent, WorkflowSuspendedEvent, WorkflowTeardownEvent, WorkflowTimedOutEvent } from './workflow-events.ts';
8
9
  /**
9
10
  * Record mapping each event-name string the {@link Engine} dispatches to its
10
- * corresponding typed `Event` subclass. Use this as the type parameter for
11
- * {@link TypedEventTarget} to get type-safe `addEventListener` /
12
- * `removeEventListener` on the engine.
11
+ * corresponding typed `Event` subclass.
13
12
  *
14
13
  * @example
15
14
  * ```ts
16
- * import { Engine, type TypedEventTarget, type WeftEventMap } from '@lostgradient/weft';
15
+ * import { Engine, type WeftEventMap } from '@lostgradient/weft';
17
16
  *
18
17
  * function listenAll(engine: Engine) {
19
- * (engine as TypedEventTarget<WeftEventMap>)
20
- * .addEventListener('workflow:completed', (e) => {
21
- * console.log('done', e.workflowId, e.result);
22
- * });
18
+ * engine.addEventListener('workflow:completed', (event) => {
19
+ * const completed: WeftEventMap['workflow:completed'] = event;
20
+ * console.log('done', completed.workflowId, completed.result);
21
+ * });
23
22
  * }
24
23
  * void listenAll;
25
24
  * ```
26
25
  */
27
26
  export type WeftEventMap = {
27
+ 'workflow:definition-registered': WorkflowDefinitionRegisteredEvent;
28
28
  'workflow:started': WorkflowStartedEvent;
29
29
  'workflow:completed': WorkflowCompletedEvent;
30
30
  'workflow:failed': WorkflowFailedEvent;
31
31
  'workflow:cancelled': WorkflowCancelledEvent;
32
32
  'workflow:timed-out': WorkflowTimedOutEvent;
33
33
  'workflow:resumed': WorkflowResumedEvent;
34
+ 'workflow:suspended': WorkflowSuspendedEvent;
34
35
  'workflow:recovery-skipped': WorkflowRecoverySkippedEvent;
36
+ 'workflow:teardown': WorkflowTeardownEvent;
35
37
  'activity:started': ActivityStartedEvent;
36
38
  'activity:completed': ActivityCompletedEvent;
37
39
  'activity:failed': ActivityFailedEvent;
38
40
  'activity:async-pending': ActivityAsyncPendingEvent;
41
+ 'task:dead-lettered': TaskResultDeadLetteredEvent;
39
42
  'signal:received': SignalReceivedEvent;
40
43
  'signal:delivered': SignalDeliveredEvent;
44
+ 'schedule:fired': ScheduleFiredEvent;
41
45
  'human-review:requested': ReviewRequestedEvent;
42
46
  'human-review:completed': ReviewCompletedEvent;
43
47
  'attributes:changed': AttributesChangedEvent;
48
+ 'schedule:missed-fire': ScheduleMissedFireEvent;
44
49
  'update:received': UpdateReceivedEvent;
45
50
  'update:completed': UpdateCompletedEvent;
46
51
  'checkpoint:size-warning': CheckpointSizeWarningEvent;
47
52
  'development:warning': DevelopmentWarningEvent;
48
53
  'cleanup:warning': CleanupWarningEvent;
49
54
  'storage:size-reported': StorageSizeReportedEvent;
55
+ 'worker:connected': WorkerConnectedEvent;
56
+ 'worker:disconnected': WorkerDisconnectedEvent;
50
57
  'alert:fired': AlertFiredEvent;
51
58
  'alert:resolved': AlertResolvedEvent;
52
59
  'constraint:violated': ConstraintViolatedEvent;
@@ -68,7 +75,7 @@ export type WeftEventMap = {
68
75
  * });
69
76
  * }
70
77
  * const engine = new Engine();
71
- * addTypedListener(engine as TypedEventTarget<WeftEventMap>);
78
+ * addTypedListener(engine);
72
79
  * void engine;
73
80
  * ```
74
81
  */
@@ -1,6 +1,7 @@
1
1
  export * from './activity-events.ts';
2
2
  export * from './attribute-events.ts';
3
3
  export * from './event-map.ts';
4
+ export * from './schedule-events.ts';
4
5
  export * from './signal-events.ts';
5
6
  export * from './system-events.ts';
6
7
  export * from './update-events.ts';
@@ -1,6 +1,7 @@
1
1
  export * from "./activity-events.js";
2
2
  export * from "./attribute-events.js";
3
3
  export * from "./event-map.js";
4
+ export * from "./schedule-events.js";
4
5
  export * from "./signal-events.js";
5
6
  export * from "./system-events.js";
6
7
  export * from "./update-events.js";
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Fired on the {@link Engine} each time a schedule launches an occurrence — i.e.
3
+ * whenever a scheduled run is actually started, whether that is a fresh cadence
4
+ * tick, a `cancel-running` replacement, or a `queue`d run draining after the
5
+ * previous one finished. A fire means a workflow was launched: the blocked
6
+ * policies (`skip`, and `queue` while a run is already active) intentionally do
7
+ * **not** emit, since nothing started.
8
+ *
9
+ * Delivery is process-local and best-effort — listen via
10
+ * `engine.addEventListener('schedule:fired', handler)` on the live engine that
11
+ * owns the schedule. The durable part (the cadence, and the launched run itself)
12
+ * is handled by the schedule; the event is dispatched synchronously right after
13
+ * the run's durable start commits, so a crash in that narrow window — start
14
+ * committed, dispatch not yet reached — can drop the notification without
15
+ * affecting the run. Treat it as a reaction signal, not a durable record. This
16
+ * lets a consumer react to a firing without polling `engine.list()` or
17
+ * `getSchedule()`.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import { workflow, Engine, ScheduleFiredEvent } from '@lostgradient/weft';
22
+ *
23
+ * const engine = new Engine();
24
+ * engine.addEventListener('schedule:fired', (e: Event) => {
25
+ * const ev = e as ScheduleFiredEvent;
26
+ * console.log('schedule', ev.scheduleId, 'launched run', ev.workflowId);
27
+ * });
28
+ * engine.register(workflow({ name: 'tick' }).execute(async function* () { return 'ok'; }));
29
+ * await engine.schedule('tick', null, { every: '1h' });
30
+ * ```
31
+ */
32
+ export declare class ScheduleFiredEvent extends Event {
33
+ static readonly type: "schedule:fired";
34
+ /** The schedule whose occurrence fired. */
35
+ readonly scheduleId: string;
36
+ /** The workflow run this occurrence launched. */
37
+ readonly workflowId: string;
38
+ /** Wall-clock time the run was launched, from the engine's injected clock. */
39
+ readonly firedAt: number;
40
+ /**
41
+ * The scheduled grid timestamp the occurrence was due. `undefined` for a run
42
+ * that drained from the `queue` overlap policy: a queued occurrence is tracked
43
+ * only as a count (`queuedRuns`), so its original due timestamp is not retained
44
+ * and cannot be reported when the run finally launches.
45
+ */
46
+ readonly occurrence: number | undefined;
47
+ constructor(scheduleId: string, workflowId: string, firedAt: number, occurrence?: number);
48
+ }
49
+ /**
50
+ * Fired on the {@link Engine} when a non-backfill schedule timer is more than
51
+ * one second late and the engine skips the missed occurrence window instead of
52
+ * starting workflows for those ticks.
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * import { Engine, ScheduleMissedFireEvent } from '@lostgradient/weft';
57
+ *
58
+ * const engine = new Engine();
59
+ * engine.addEventListener(ScheduleMissedFireEvent.type, (event) => {
60
+ * console.warn(event.scheduleId, 'missed', event.missedCount, 'scheduled ticks');
61
+ * });
62
+ * ```
63
+ */
64
+ export declare class ScheduleMissedFireEvent extends Event {
65
+ static readonly type: "schedule:missed-fire";
66
+ readonly scheduleId: string;
67
+ readonly missedCount: number;
68
+ readonly windowStart: number;
69
+ readonly windowEnd: number;
70
+ constructor(scheduleId: string, missedCount: number, windowStart: number, windowEnd: number);
71
+ }