@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
@@ -1,9 +1,14 @@
1
1
  import { z } from "zod";
2
2
  import { defineOperation } from "../operation-registry.js";
3
- const INITIAL_SUBSCRIPTION_CURSOR = "-1", workflowEventsSubscriptionInput = z.object({
3
+ import { isAuthenticated } from "../principal.js";
4
+ import {
5
+ decodeCursor
6
+ } from "../workflow-event-feed.js";
7
+ import { invalidParamsFault } from "./operation-helpers.js";
8
+ const INITIAL_SUBSCRIPTION_CURSOR = "-1", MAX_WORKFLOW_SUBSCRIPTION_REPLAY_EVENTS = 1000, workflowEventsSubscriptionInput = z.object({
4
9
  workflowId: z.string().min(1),
5
10
  selector: z.enum(["events", "tokens"]).optional().default("events"),
6
- fromCursor: z.string().optional()
11
+ fromCursor: z.string().refine((cursor) => decodeCursor(cursor) !== null, { message: "Invalid cursor" }).optional()
7
12
  }), workflowEventsSubscriptionEnvelope = z.object({
8
13
  subscriptionId: z.string(),
9
14
  cursor: z.string()
@@ -13,10 +18,12 @@ export const workflowEventsSubscriptionOperation = defineOperation({
13
18
  mcpExposable: !1,
14
19
  kind: "subscription",
15
20
  summary: "Subscribe to workflow events with replay-from-cursor",
21
+ description: '`selector: "events"` requires `events:read`; `selector: "tokens"` requires `streams:read`. The grant is checked when the WebSocket subscription starts and remains active until unsubscribe, socket close, or feed termination.',
16
22
  destructive: !1,
17
23
  tags: ["Events"],
18
24
  inputSchema: workflowEventsSubscriptionInput,
19
25
  outputSchema: workflowEventsSubscriptionEnvelope,
26
+ producibleFaults: ["InvalidParams"],
20
27
  eventSchema: z.object({
21
28
  kind: z.string(),
22
29
  workflowId: z.string(),
@@ -26,20 +33,45 @@ export const workflowEventsSubscriptionOperation = defineOperation({
26
33
  emittedAtMs: z.number(),
27
34
  payload: z.unknown()
28
35
  }),
29
- access: {
30
- kind: "scoped",
31
- scopes: { kind: "anyOf", scopes: ["workflows:read"] }
36
+ access: { kind: "authenticated" },
37
+ parameterizedAccess: {
38
+ discriminator: "selector",
39
+ defaultValue: "events",
40
+ variants: [
41
+ {
42
+ value: "events",
43
+ access: { kind: "scoped", scopes: { kind: "anyOf", scopes: ["events:read"] } }
44
+ },
45
+ {
46
+ value: "tokens",
47
+ access: { kind: "scoped", scopes: { kind: "anyOf", scopes: ["streams:read"] } }
48
+ }
49
+ ]
50
+ },
51
+ authorize: async ({ input, principal }) => {
52
+ const requiredScope = workflowSubscriptionScope(input.selector);
53
+ if (!isAuthenticated(principal))
54
+ return { allowed: !1, classification: "unauthorized", reason: "authentication required" };
55
+ if (principal.hasScope(requiredScope))
56
+ return { allowed: !0 };
57
+ return {
58
+ allowed: !1,
59
+ classification: "forbidden",
60
+ reason: `requires scope: ${requiredScope}`
61
+ };
32
62
  },
33
63
  discoverable: !0,
34
64
  transports: { http: !1, jsonRpcHttp: !1, jsonRpcWebSocket: !0, jsonRpcStdio: !1 },
35
65
  unknownKeyPolicy: { http: "strip", jsonRpc: "reject" },
36
66
  invoke: async ({ input, engine }) => {
37
- const feed = engine.feed, controller = new AbortController, startingCursor = input.fromCursor ?? INITIAL_SUBSCRIPTION_CURSOR, iterable = feed.subscribe({
67
+ const feed = engine.feed, controller = new AbortController, startingCursor = input.fromCursor ?? INITIAL_SUBSCRIPTION_CURSOR, subscribeOptions = {
38
68
  workflowId: input.workflowId,
39
69
  selector: input.selector,
40
70
  ...input.fromCursor === void 0 ? {} : { fromCursor: input.fromCursor },
41
- signal: controller.signal
42
- });
71
+ signal: controller.signal,
72
+ replayLimit: MAX_WORKFLOW_SUBSCRIPTION_REPLAY_EVENTS,
73
+ createReplayLimitError: (count, limit) => invalidParamsFault(`Workflow event replay window is ${count} events; maximum is ${limit}. Supply a more recent fromCursor.`)
74
+ }, iterable = feed.subscribe(subscribeOptions);
43
75
  return {
44
76
  envelope: { subscriptionId: `sub_${crypto.randomUUID()}`, cursor: startingCursor },
45
77
  iterable,
@@ -49,3 +81,6 @@ export const workflowEventsSubscriptionOperation = defineOperation({
49
81
  };
50
82
  }
51
83
  });
84
+ function workflowSubscriptionScope(selector) {
85
+ return selector === "tokens" ? "streams:read" : "events:read";
86
+ }
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import { WeftError } from '../core/weft-error.ts';
14
14
  import type { OperationFault } from './operation-fault.ts';
15
+ import type { RestBodyReadOptions } from './rest-body.ts';
15
16
  import type { HttpMethod } from './route-model.ts';
16
17
  /**
17
18
  * Thrown by `bindingPathMatches` when a URL path parameter contains malformed
@@ -59,6 +60,7 @@ export type ResponseShape = {
59
60
  readonly kind: 'streaming';
60
61
  readonly mediaType: 'text/event-stream' | 'application/octet-stream' | 'application/x-ndjson';
61
62
  };
63
+ export type RestInputContext = RestBodyReadOptions;
62
64
  /**
63
65
  * Binds a REST mount point to an `OperationDefinition`. Generic over
64
66
  * `Input` / `Output` so `extractInput` returns a value the operation's
@@ -91,7 +93,7 @@ export type RestBinding<Input, Output> = {
91
93
  * Called before `executeOperation`; the returned value is what the
92
94
  * pipeline's schema parse step sees.
93
95
  */
94
- readonly extractInput: (request: Request, pathParams: Record<string, string>) => Promise<Input>;
96
+ readonly extractInput: (request: Request, pathParams: Record<string, string>, context: RestInputContext) => Promise<Input>;
95
97
  /** Canonical response shape — OpenAPI reads this, handler may override via `shapeSuccess`. */
96
98
  readonly success: ResponseShape;
97
99
  /**
@@ -111,14 +113,25 @@ export type RestBinding<Input, Output> = {
111
113
  readonly shapeSuccess?: (output: Output, request: Request) => Response;
112
114
  /**
113
115
  * Optional override for fault → HTTP response mapping. When absent,
114
- * the transport adapter falls back to `faultToHttpResponse` (the
115
- * canonical `{ error: { code, message, data? } }` shape).
116
+ * the transport adapter falls back to `faultToHttpResponse`, which emits
117
+ * the REST fault body `{ error: { code, message, data? } }`. This is
118
+ * distinct from the JSON-RPC fault object (`faultToJsonRpcError`): JSON-RPC
119
+ * uses a flat `{ code, message, data }` with a numeric `code` and the
120
+ * symbolic name relocated to `data.weftCode`. REST and JSON-RPC deliberately
121
+ * differ in fault shape, so each transport owns its own projection.
116
122
  *
117
- * During Milestone 1, bindings for REST operations that already exist
118
- * with a different legacy error shape MUST provide this so their
119
- * parity diff test passes byte-for-byte against the legacy handler.
120
- * Milestone 2 drops the per-binding override and all REST endpoints
121
- * move to the canonical fault shape.
123
+ * REST operations provide this to shape faults the way a REST client
124
+ * expects: most use `shapeRestFault`, which masks an `EngineFailure` to a
125
+ * flat `{ error: "Internal server error" }` with status `500` (never
126
+ * leaking internal detail over REST) and maps the remaining fault codes to
127
+ * their HTTP statuses. A few operations supply a bespoke shaper to special-case
128
+ * a particular fault — typically to override its message or to handle one code
129
+ * explicitly — while delegating the rest. The status often matches what the
130
+ * shared map would already produce; the shaper exists for the operation-specific
131
+ * detail (for example, `get-workflow-result` returns the custom message
132
+ * `"Timeout waiting for workflow result"` on a `Timeout`, and `get-stream-chunks`
133
+ * handles `InvalidParams` inline). This per-operation hook is the current
134
+ * contract, not a transitional shim.
122
135
  */
123
136
  readonly shapeFault?: (fault: OperationFault) => Response;
124
137
  };
@@ -25,6 +25,10 @@ import {
25
25
  bulkMutateWorkflowTagsOperation,
26
26
  bulkMutateWorkflowTagsRestBinding
27
27
  } from "./operations/bulk-mutate-workflow-tags.js";
28
+ import {
29
+ bulkRetryFailedWorkflowsOperation,
30
+ bulkRetryFailedWorkflowsRestBinding
31
+ } from "./operations/bulk-retry-failed-workflows.js";
28
32
  import {
29
33
  bulkSignalWorkflowsOperation,
30
34
  bulkSignalWorkflowsRestBinding
@@ -41,6 +45,7 @@ import {
41
45
  createScheduleOperation,
42
46
  createScheduleRestBinding
43
47
  } from "./operations/create-schedule.js";
48
+ import { fleetEventsSubscriptionOperation } from "./operations/fleet-events-subscription.js";
44
49
  import { forkWorkflowOperation, forkWorkflowRestBinding } from "./operations/fork-workflow.js";
45
50
  import {
46
51
  getCheckpointAtOperation,
@@ -62,6 +67,8 @@ import {
62
67
  createGetSystemMetricsRestBinding
63
68
  } from "./operations/get-system-metrics.js";
64
69
  import {
70
+ clearTaskDeadLetterOperation,
71
+ clearTaskDeadLetterRestBinding,
65
72
  createGetTaskDiagnosticsOperation,
66
73
  getTaskDiagnosticsOperation,
67
74
  getTaskDiagnosticsRestBinding
@@ -139,6 +146,10 @@ import {
139
146
  signalWorkflowOperation,
140
147
  signalWorkflowRestBinding
141
148
  } from "./operations/signal-workflow.js";
149
+ import {
150
+ startOrSignalWorkflowOperation,
151
+ startOrSignalWorkflowRestBinding
152
+ } from "./operations/start-or-signal-workflow.js";
142
153
  import { startWorkflowOperation, startWorkflowRestBinding } from "./operations/start-workflow.js";
143
154
  import {
144
155
  storageBatchOperation,
@@ -162,6 +173,10 @@ import {
162
173
  submitReviewDecisionOperation,
163
174
  submitReviewDecisionRestBinding
164
175
  } from "./operations/submit-review-decision.js";
176
+ import {
177
+ suspendWorkflowOperation,
178
+ suspendWorkflowRestBinding
179
+ } from "./operations/suspend-workflow.js";
165
180
  import {
166
181
  timeoutWorkflowOperation,
167
182
  timeoutWorkflowRestBinding
@@ -191,12 +206,14 @@ import {
191
206
  import { workflowEventsSubscriptionOperation } from "./operations/workflow-events-subscription.js";
192
207
  export const REST_BINDINGS = [
193
208
  startWorkflowRestBinding,
209
+ startOrSignalWorkflowRestBinding,
194
210
  recoverAllRestBinding,
195
211
  listWorkflowsRestBinding,
196
212
  aggregateWorkflowsRestBinding,
197
213
  purgeWorkflowsRestBinding,
198
214
  bulkCancelWorkflowsRestBinding,
199
215
  bulkSignalWorkflowsRestBinding,
216
+ bulkRetryFailedWorkflowsRestBinding,
200
217
  bulkDeleteWorkflowsRestBinding,
201
218
  bulkMutateWorkflowTagsRestBinding,
202
219
  getWorkflowRestBinding,
@@ -211,6 +228,7 @@ export const REST_BINDINGS = [
211
228
  queryWorkflowRestBinding,
212
229
  queryWorkflowWithInputRestBinding,
213
230
  resumeWorkflowRestBinding,
231
+ suspendWorkflowRestBinding,
214
232
  forkWorkflowRestBinding,
215
233
  timeoutWorkflowRestBinding,
216
234
  updateWorkflowRestBinding,
@@ -233,6 +251,7 @@ export const REST_BINDINGS = [
233
251
  getStreamChunksRestBinding,
234
252
  streamWorkflowSseRestBinding,
235
253
  getTaskDiagnosticsRestBinding,
254
+ clearTaskDeadLetterRestBinding,
236
255
  listSchedulesRestBinding,
237
256
  getScheduleRestBinding,
238
257
  replayWorkflowRestBinding,
@@ -314,12 +333,14 @@ export function createLiveOperationRegistry(options) {
314
333
  const resolved = options ?? {};
315
334
  return createOperationRegistry([
316
335
  startWorkflowOperation,
336
+ startOrSignalWorkflowOperation,
317
337
  recoverAllOperation,
318
338
  listWorkflowsOperation,
319
339
  aggregateWorkflowsOperation,
320
340
  purgeWorkflowsOperation,
321
341
  bulkCancelWorkflowsOperation,
322
342
  bulkSignalWorkflowsOperation,
343
+ bulkRetryFailedWorkflowsOperation,
323
344
  bulkDeleteWorkflowsOperation,
324
345
  bulkMutateWorkflowTagsOperation,
325
346
  getWorkflowOperation,
@@ -333,6 +354,7 @@ export function createLiveOperationRegistry(options) {
333
354
  failAsyncActivityOperation,
334
355
  queryWorkflowOperation,
335
356
  resumeWorkflowOperation,
357
+ suspendWorkflowOperation,
336
358
  forkWorkflowOperation,
337
359
  timeoutWorkflowOperation,
338
360
  updateWorkflowOperation,
@@ -355,7 +377,9 @@ export function createLiveOperationRegistry(options) {
355
377
  getStreamChunksOperation,
356
378
  streamWorkflowSseOperation,
357
379
  workflowEventsSubscriptionOperation,
380
+ fleetEventsSubscriptionOperation,
358
381
  buildTaskDiagnosticsOperationForRegistry(resolved),
382
+ clearTaskDeadLetterOperation,
359
383
  listSchedulesOperation,
360
384
  getScheduleOperation,
361
385
  replayWorkflowOperation,
@@ -0,0 +1,10 @@
1
+ import type { OperationFault } from './operation-fault.ts';
2
+ export declare const DEFAULT_REST_MAX_BODY_BYTES: number;
3
+ export type RestBodyReadOptions = {
4
+ readonly maxBodyBytes?: number;
5
+ };
6
+ export declare function payloadTooLargeFault(maxBytes: number): OperationFault;
7
+ export declare function readRestBodyBounded(request: Request, options?: RestBodyReadOptions): Promise<Uint8Array>;
8
+ export declare function readRestTextBody(request: Request, options?: RestBodyReadOptions): Promise<string>;
9
+ export declare function readRestJsonBody(request: Request, options?: RestBodyReadOptions): Promise<unknown>;
10
+ export declare function readOptionalRestJsonBody(request: Request, options?: RestBodyReadOptions): Promise<unknown>;
@@ -0,0 +1,80 @@
1
+ export const DEFAULT_REST_MAX_BODY_BYTES = 1048576;
2
+ const CONTENT_LENGTH_PATTERN = /^(0|[1-9]\d*)$/;
3
+ export function payloadTooLargeFault(maxBytes) {
4
+ return {
5
+ code: "PayloadTooLarge",
6
+ message: "Payload Too Large",
7
+ data: { maxBytes }
8
+ };
9
+ }
10
+ function invalidContentLengthFault() {
11
+ return {
12
+ code: "InvalidParams",
13
+ message: "Invalid Content-Length header",
14
+ data: { issues: [] }
15
+ };
16
+ }
17
+ function resolveMaxBodyBytes(options) {
18
+ const maxBytes = options?.maxBodyBytes ?? DEFAULT_REST_MAX_BODY_BYTES;
19
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
20
+ throw Error("REST body size limit must be a non-negative safe integer");
21
+ return maxBytes;
22
+ }
23
+ function assertDeclaredContentLengthWithinLimit(request, maxBytes) {
24
+ const header = request.headers.get("content-length");
25
+ if (header === null)
26
+ return;
27
+ if (!CONTENT_LENGTH_PATTERN.test(header))
28
+ throw invalidContentLengthFault();
29
+ const declared = Number(header);
30
+ if (!Number.isSafeInteger(declared) || declared < 0)
31
+ throw invalidContentLengthFault();
32
+ if (declared > maxBytes)
33
+ throw payloadTooLargeFault(maxBytes);
34
+ }
35
+ async function cancelReaderAfterPayloadOverflow(reader) {
36
+ try {
37
+ await reader.cancel();
38
+ } catch {}
39
+ }
40
+ export async function readRestBodyBounded(request, options) {
41
+ const maxBytes = resolveMaxBodyBytes(options);
42
+ assertDeclaredContentLengthWithinLimit(request, maxBytes);
43
+ const body = request.body;
44
+ if (body === null)
45
+ return new Uint8Array;
46
+ const reader = body.getReader(), chunks = [];
47
+ let total = 0;
48
+ try {
49
+ while (!0) {
50
+ const { done, value } = await reader.read();
51
+ if (done)
52
+ break;
53
+ total += value.byteLength;
54
+ if (total > maxBytes) {
55
+ await cancelReaderAfterPayloadOverflow(reader);
56
+ throw payloadTooLargeFault(maxBytes);
57
+ }
58
+ chunks.push(value);
59
+ }
60
+ } finally {
61
+ reader.releaseLock();
62
+ }
63
+ const bytes = new Uint8Array(total);
64
+ let offset = 0;
65
+ for (const chunk of chunks) {
66
+ bytes.set(chunk, offset);
67
+ offset += chunk.byteLength;
68
+ }
69
+ return bytes;
70
+ }
71
+ export async function readRestTextBody(request, options) {
72
+ return new TextDecoder("utf-8").decode(await readRestBodyBounded(request, options));
73
+ }
74
+ export async function readRestJsonBody(request, options) {
75
+ return JSON.parse(await readRestTextBody(request, options));
76
+ }
77
+ export async function readOptionalRestJsonBody(request, options) {
78
+ const text = await readRestTextBody(request, options);
79
+ return text.trim() === "" ? void 0 : JSON.parse(text);
80
+ }
@@ -11,6 +11,7 @@ type ServerFetchOptions = {
11
11
  discoveryInfo?: import('../discovery-info.ts').DiscoveryInfo;
12
12
  publicOrigin?: string;
13
13
  trustedHosts?: ReadonlyArray<string>;
14
+ maxRequestBodyBytes?: number;
14
15
  };
15
16
  export declare function deriveSupportedOpenApiSecuritySchemes(auth: AuthConfig | undefined): ReadonlySet<OpenApiSecuritySchemeName>;
16
17
  export declare function handleServerFetchRequest(server: ReturnType<typeof Bun.serve>, context: ServerContext, options: ServerFetchOptions, originalRequest: Request): Promise<Response | undefined>;
@@ -1,4 +1,5 @@
1
1
  import { decode } from "../../core/codec.js";
2
+ import { WorkerDisconnectedEvent } from "../../core/events.js";
2
3
  import { handleMcpHttpRequest } from "../../mcp/http.js";
3
4
  import { KEYS } from "../../storage/interface.js";
4
5
  import { authContextToPrincipal, handleRequest } from "../handler.js";
@@ -13,7 +14,15 @@ import { buildPreflightResponse, decorateResponseWithCors, isPreflightRequest }
13
14
  import { gateRequest } from "./request-gate.js";
14
15
  import { handleTaskPollRequest, handleTaskResultRequest } from "./task-polling.js";
15
16
  import { reassignOrExpireTask } from "./task-reconciliation.js";
16
- import { addStreamSocket, removeStreamSocket, replayTokenStream } from "./websocket-stream.js";
17
+ import {
18
+ addStreamSocket,
19
+ addWatchSocket,
20
+ removeStreamSocket,
21
+ removeWatchSocket,
22
+ removeWorkflowStreamConnection,
23
+ replayTokenStream,
24
+ replayWatchEvents
25
+ } from "./websocket-stream.js";
17
26
  import { handleWebSocketUpgrade } from "./websocket-upgrade.js";
18
27
  import { handleWorkerWebSocketMessage, isInflightRecord } from "./websocket-worker.js";
19
28
  export function deriveSupportedOpenApiSecuritySchemes(auth) {
@@ -72,7 +81,8 @@ async function dispatchServerFetchRequest(server, context, options, originalRequ
72
81
  request,
73
82
  registry: context.liveOperationRegistry,
74
83
  engine: options.engine,
75
- authContext: authentication.authContext
84
+ authContext: authentication.authContext,
85
+ ...options.maxRequestBodyBytes !== void 0 ? { maxBodyBytes: options.maxRequestBodyBytes } : {}
76
86
  });
77
87
  return handleRequest(request, options.engine, buildHandlerOptions(context, options, authentication));
78
88
  }
@@ -83,6 +93,7 @@ function buildHandlerOptions(context, options, authentication) {
83
93
  ...options.discoveryInfo !== void 0 ? { discoveryInfo: options.discoveryInfo } : {},
84
94
  ...options.publicOrigin !== void 0 ? { publicOrigin: options.publicOrigin } : {},
85
95
  ...options.trustedHosts !== void 0 ? { trustedHosts: options.trustedHosts } : {},
96
+ ...options.maxRequestBodyBytes !== void 0 ? { maxRequestBodyBytes: options.maxRequestBodyBytes } : {},
86
97
  operationRegistry: context.liveOperationRegistry,
87
98
  restBindings: context.liveRestBindings,
88
99
  supportedAuthenticationSchemes: context.supportedAuthenticationSchemes
@@ -92,12 +103,20 @@ export function createServerWebSocketHandlers(context, options, cleanupWorkflowI
92
103
  return {
93
104
  open(ws) {
94
105
  const { pathname, connectionType, workflowId } = ws.data;
95
- if (pathname && connectionType !== "stream" && connectionType !== "jsonrpc")
106
+ if (connectionType === "watch" && workflowId && !addWatchSocket(context, workflowId, ws))
107
+ return;
108
+ if (connectionType === "watch" && workflowId) {
109
+ ws.data.watchReplayInProgress = !0;
110
+ ws.data.pendingWatchMessages = [];
111
+ replayWatchEvents(context, options.engine, ws, workflowId);
112
+ }
113
+ if (pathname && connectionType !== "stream" && connectionType !== "watch" && connectionType !== "jsonrpc")
96
114
  ws.subscribe(pathname);
97
115
  if (connectionType === "stream" && workflowId) {
98
- ws.data.replayInProgress = !0;
116
+ ws.data.streamReplayInProgress = !0;
99
117
  ws.data.pendingStreamMessages = [];
100
- addStreamSocket(context, workflowId, ws);
118
+ if (!addStreamSocket(context, workflowId, ws))
119
+ return;
101
120
  replayTokenStream(context, options.engine, ws, workflowId);
102
121
  }
103
122
  if (connectionType === "jsonrpc") {
@@ -106,6 +125,7 @@ export function createServerWebSocketHandlers(context, options, cleanupWorkflowI
106
125
  registry: context.liveOperationRegistry,
107
126
  engine: options.engine,
108
127
  feed: context.workflowEventFeed,
128
+ fleetFeed: context.fleetEventFeed,
109
129
  activeSessions: context.activeJsonRpcSessions
110
130
  });
111
131
  return;
@@ -133,8 +153,14 @@ export function createServerWebSocketHandlers(context, options, cleanupWorkflowI
133
153
  });
134
154
  return;
135
155
  }
136
- if (ws.data.connectionType === "stream")
156
+ if (ws.data.connectionType === "stream") {
137
157
  removeStreamSocket(context, ws);
158
+ removeWorkflowStreamConnection(context, ws);
159
+ }
160
+ if (ws.data.connectionType === "watch") {
161
+ removeWatchSocket(context, ws);
162
+ removeWorkflowStreamConnection(context, ws);
163
+ }
138
164
  const workerId = ws.data.workerId;
139
165
  if (workerId) {
140
166
  if (context.workerSockets.get(workerId) !== ws) {
@@ -167,6 +193,7 @@ function runWorkerDisconnectRequeue(context, options, workerId, _ws, cleanupWork
167
193
  }
168
194
  context.registry.unregister(workerId);
169
195
  context.workerSockets.delete(workerId);
196
+ options.engine.dispatchEvent(new WorkerDisconnectedEvent(workerId, inFlightTasks.length));
170
197
  for (const [workflowId, affinityWorkerId] of context.workerAffinity)
171
198
  if (affinityWorkerId === workerId)
172
199
  context.workerAffinity.delete(workflowId);
@@ -0,0 +1,3 @@
1
+ export declare const TOKEN_EVENT_TYPE = "stream:token";
2
+ export declare const EVENTS_READ_EVENT_TYPES: readonly ["workflow:started", "workflow:completed", "workflow:failed", "workflow:cancelled", "workflow:timed-out", "workflow:resumed", "workflow:suspended", "workflow:teardown", "activity:started", "activity:completed", "activity:failed", "activity:async-pending", "task:dead-lettered", "signal:received", "signal:delivered", "attributes:changed", "update:received", "update:completed", "schedule:fired", "schedule:missed-fire", "checkpoint:size-warning", "development:warning", "cleanup:warning", "storage:size-reported", "human-review:requested", "human-review:completed", "alert:fired", "alert:resolved", "constraint:violated", "worker:connected", "worker:disconnected"];
3
+ export declare const CLIENT_VISIBLE_EVENT_TYPES: readonly ["workflow:started", "workflow:completed", "workflow:failed", "workflow:cancelled", "workflow:timed-out", "workflow:resumed", "workflow:suspended", "workflow:teardown", "activity:started", "activity:completed", "activity:failed", "activity:async-pending", "task:dead-lettered", "signal:received", "signal:delivered", "attributes:changed", "update:received", "update:completed", "schedule:fired", "schedule:missed-fire", "checkpoint:size-warning", "development:warning", "cleanup:warning", "storage:size-reported", "human-review:requested", "human-review:completed", "alert:fired", "alert:resolved", "constraint:violated", "worker:connected", "worker:disconnected", "stream:token"];
@@ -0,0 +1,65 @@
1
+ import {
2
+ ActivityAsyncPendingEvent,
3
+ ActivityCompletedEvent,
4
+ ActivityFailedEvent,
5
+ ActivityStartedEvent,
6
+ AlertFiredEvent,
7
+ AlertResolvedEvent,
8
+ AttributesChangedEvent,
9
+ CheckpointSizeWarningEvent,
10
+ CleanupWarningEvent,
11
+ ConstraintViolatedEvent,
12
+ DevelopmentWarningEvent,
13
+ ScheduleFiredEvent,
14
+ ScheduleMissedFireEvent,
15
+ SignalDeliveredEvent,
16
+ SignalReceivedEvent,
17
+ StorageSizeReportedEvent,
18
+ TaskResultDeadLetteredEvent,
19
+ UpdateCompletedEvent,
20
+ UpdateReceivedEvent,
21
+ WorkerConnectedEvent,
22
+ WorkerDisconnectedEvent,
23
+ WorkflowCancelledEvent,
24
+ WorkflowCompletedEvent,
25
+ WorkflowFailedEvent,
26
+ WorkflowResumedEvent,
27
+ WorkflowStartedEvent,
28
+ WorkflowSuspendedEvent,
29
+ WorkflowTeardownEvent,
30
+ WorkflowTimedOutEvent
31
+ } from "../../core/events.js";
32
+ import { ReviewCompletedEvent, ReviewRequestedEvent } from "../../core/review/events.js";
33
+ export const TOKEN_EVENT_TYPE = "stream:token", EVENTS_READ_EVENT_TYPES = [
34
+ WorkflowStartedEvent.type,
35
+ WorkflowCompletedEvent.type,
36
+ WorkflowFailedEvent.type,
37
+ WorkflowCancelledEvent.type,
38
+ WorkflowTimedOutEvent.type,
39
+ WorkflowResumedEvent.type,
40
+ WorkflowSuspendedEvent.type,
41
+ WorkflowTeardownEvent.type,
42
+ ActivityStartedEvent.type,
43
+ ActivityCompletedEvent.type,
44
+ ActivityFailedEvent.type,
45
+ ActivityAsyncPendingEvent.type,
46
+ TaskResultDeadLetteredEvent.type,
47
+ SignalReceivedEvent.type,
48
+ SignalDeliveredEvent.type,
49
+ AttributesChangedEvent.type,
50
+ UpdateReceivedEvent.type,
51
+ UpdateCompletedEvent.type,
52
+ ScheduleFiredEvent.type,
53
+ ScheduleMissedFireEvent.type,
54
+ CheckpointSizeWarningEvent.type,
55
+ DevelopmentWarningEvent.type,
56
+ CleanupWarningEvent.type,
57
+ StorageSizeReportedEvent.type,
58
+ ReviewRequestedEvent.type,
59
+ ReviewCompletedEvent.type,
60
+ AlertFiredEvent.type,
61
+ AlertResolvedEvent.type,
62
+ ConstraintViolatedEvent.type,
63
+ WorkerConnectedEvent.type,
64
+ WorkerDisconnectedEvent.type
65
+ ], CLIENT_VISIBLE_EVENT_TYPES = [...EVENTS_READ_EVENT_TYPES, TOKEN_EVENT_TYPE];
@@ -5,6 +5,7 @@ import type { WorkerRegistry } from '../../worker/registry.ts';
5
5
  import type { Authenticator, RateLimiter } from '../authentication.ts';
6
6
  import type { DeadlineTracker } from '../deadline-tracker.ts';
7
7
  import type { createEngineEventFeedBackend } from '../engine-event-feed-backend.ts';
8
+ import type { FleetEventFeed } from '../fleet-event-feed.ts';
8
9
  import type { WebSocketData } from '../json-rpc-websocket-runtime.ts';
9
10
  import type { JsonRpcWebSocketSession } from '../json-rpc-websocket.ts';
10
11
  import type { OpenApiSecuritySchemeName } from '../openapi.ts';
@@ -23,6 +24,9 @@ export interface ServerContext {
23
24
  readonly taskQueue: TaskQueue;
24
25
  readonly workerSockets: Map<string, ServerWebSocket<WebSocketData>>;
25
26
  readonly streamSockets: Map<string, Set<ServerWebSocket<WebSocketData>>>;
27
+ readonly watchSockets: Map<string, Set<ServerWebSocket<WebSocketData>>>;
28
+ readonly workflowStreamConnectionCounts: Map<string, number>;
29
+ readonly maxStreamConnectionsPerWorkflow: number;
26
30
  /** Tracks per-workflow worker affinity for sticky routing. Maps workflowId to workerId. */
27
31
  readonly workerAffinity: Map<string, string>;
28
32
  /** Reverse index: workflowId to set of operationIds currently in-flight for that workflow. */
@@ -42,6 +46,7 @@ export interface ServerContext {
42
46
  readonly metricsCollector: MetricsCollector;
43
47
  readonly eventFeedBackend: ReturnType<typeof createEngineEventFeedBackend>;
44
48
  readonly workflowEventFeed: WorkflowEventFeed;
49
+ readonly fleetEventFeed: FleetEventFeed;
45
50
  readonly activeJsonRpcSessions: Set<JsonRpcWebSocketSession>;
46
51
  readonly mcpSessionManager: McpSessionManager;
47
52
  readonly authenticatorPromise: Promise<Authenticator> | null;
@@ -59,6 +64,8 @@ export interface ServerContext {
59
64
  * this window cancels the pending requeue. `0` means inline requeue.
60
65
  */
61
66
  readonly workerReconnectGracePeriodMs: number;
67
+ /** Engine-level cap for activity results delivered by remote workers. */
68
+ readonly payloadSizeMaxBytes: number | null;
62
69
  /**
63
70
  * Pending requeue timers keyed by `workerId`. A successful re-register clears
64
71
  * the timer for that worker, suppressing the deferred requeue.
@@ -1,4 +1,5 @@
1
1
  import type { Engine } from '../../core/engine.ts';
2
+ import type { FleetEventFeed } from '../fleet-event-feed.ts';
2
3
  import type { ServerContext } from './context.ts';
3
4
  /**
4
5
  * Result of wiring up engine-to-WebSocket event broadcasting.
@@ -46,6 +47,9 @@ export declare function registerWorkflowEventLifecycle(engine: Engine, context:
46
47
  * token messages, enabling per-workflow stream sockets to be used in
47
48
  * place of the default pub/sub channel. Leave unset unless you manage stream
48
49
  * sockets separately (as `serve()` does internally).
50
+ * @param options.publishWatchMessage - Optional override for watch-event delivery.
51
+ * When provided, this callback is called instead of `server.publish()` for
52
+ * watch messages, enabling per-socket replay buffering during catch-up.
49
53
  *
50
54
  * @example
51
55
  * ```ts
@@ -68,4 +72,6 @@ export declare function registerWorkflowEventLifecycle(engine: Engine, context:
68
72
  */
69
73
  export declare function wireEventBroadcasting(engine: Engine, server: ReturnType<typeof Bun.serve>, options?: {
70
74
  publishTokenMessage?: (workflowId: string, sequence: number, message: string) => void;
75
+ publishWatchMessage?: (workflowId: string, sequence: number, message: string) => void;
76
+ fleetEventFeed?: FleetEventFeed;
71
77
  }): EventBroadcastingHandle;