@lostgradient/weft 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +79 -24
  2. package/dist/cli/conformance.js +7 -1
  3. package/dist/cli/generated/operation-client.generated.d.ts +28 -13
  4. package/dist/cli/generated/operation-client.generated.js +1 -0
  5. package/dist/cli/help-text.d.ts +1 -1
  6. package/dist/cli/help-text.js +1 -0
  7. package/dist/cli/operation-catalog-snapshot.d.ts +8 -0
  8. package/dist/cli/operation-catalog-snapshot.js +11 -0
  9. package/dist/cli/parse-schedule-arguments.js +3 -1
  10. package/dist/cli/schedule.js +2 -1
  11. package/dist/cli/types.d.ts +1 -0
  12. package/dist/cli-main.js +79 -78
  13. package/dist/client/handle-delegation.d.ts +3 -2
  14. package/dist/client/handle-delegation.js +3 -1
  15. package/dist/client/http-client-requests.d.ts +2 -1
  16. package/dist/client/http-client-requests.js +7 -0
  17. package/dist/client/http-client.d.ts +9 -6
  18. package/dist/client/http-client.js +10 -1
  19. package/dist/client/http-request.d.ts +11 -1
  20. package/dist/client/http-request.js +17 -7
  21. package/dist/client/index.d.ts +1 -1
  22. package/dist/client/interface.d.ts +61 -5
  23. package/dist/client/local-handles.d.ts +22 -0
  24. package/dist/client/local-handles.js +23 -0
  25. package/dist/client/local.d.ts +6 -3
  26. package/dist/client/local.js +12 -26
  27. package/dist/client/start-body.d.ts +4 -3
  28. package/dist/core/byte-arrays.d.ts +5 -0
  29. package/dist/core/byte-arrays.js +5 -0
  30. package/dist/core/checkpoint/lifecycle.d.ts +3 -0
  31. package/dist/core/checkpoint/lifecycle.js +9 -4
  32. package/dist/core/checkpoint/serialization.js +12 -5
  33. package/dist/core/codec/extension-codec.d.ts +16 -0
  34. package/dist/core/codec/extension-codec.js +100 -6
  35. package/dist/core/context/activity-retry-state.d.ts +38 -0
  36. package/dist/core/context/activity-retry-state.js +89 -0
  37. package/dist/core/context/activity-schedule-to-close.d.ts +159 -0
  38. package/dist/core/context/activity-schedule-to-close.js +69 -0
  39. package/dist/core/context/child-workflow-pipe.d.ts +5 -5
  40. package/dist/core/context/child-workflow-pipe.js +15 -2
  41. package/dist/core/context/context-presence.d.ts +19 -0
  42. package/dist/core/context/context-presence.js +13 -0
  43. package/dist/core/context/durable-operations.d.ts +25 -0
  44. package/dist/core/context/durable-operations.js +64 -0
  45. package/dist/core/context/index.d.ts +9 -5
  46. package/dist/core/context/index.js +17 -12
  47. package/dist/core/context/internals.d.ts +20 -0
  48. package/dist/core/context/internals.js +3 -1
  49. package/dist/core/context/operation-request.d.ts +35 -0
  50. package/dist/core/context/parallel-cache-entry.d.ts +14 -5
  51. package/dist/core/context/run-operation.d.ts +6 -1
  52. package/dist/core/context/run-operation.js +41 -87
  53. package/dist/core/context/session-state.js +7 -8
  54. package/dist/core/context/speculative-child.js +2 -0
  55. package/dist/core/context/types.d.ts +15 -0
  56. package/dist/core/context/version-patching.d.ts +8 -0
  57. package/dist/core/context/version-patching.js +40 -0
  58. package/dist/core/context/workflow-logger.d.ts +98 -0
  59. package/dist/core/context/workflow-logger.js +68 -0
  60. package/dist/core/engine/activity-heartbeat-tracking.d.ts +64 -0
  61. package/dist/core/engine/activity-heartbeat-tracking.js +42 -0
  62. package/dist/core/engine/activity-per-attempt-timeout.d.ts +46 -0
  63. package/dist/core/engine/activity-per-attempt-timeout.js +36 -0
  64. package/dist/core/engine/activity-reconciliation.d.ts +1 -0
  65. package/dist/core/engine/activity-reconciliation.js +12 -1
  66. package/dist/core/engine/activity-resolution.d.ts +23 -0
  67. package/dist/core/engine/activity-resolution.js +37 -0
  68. package/dist/core/engine/aggregate.js +66 -30
  69. package/dist/core/engine/async-activity-completion.d.ts +23 -6
  70. package/dist/core/engine/async-activity-completion.js +53 -12
  71. package/dist/core/engine/attributes-tags.js +9 -4
  72. package/dist/core/engine/bulk-operations-purge.d.ts +26 -0
  73. package/dist/core/engine/bulk-operations-purge.js +38 -3
  74. package/dist/core/engine/bulk-operations-shared.d.ts +2 -0
  75. package/dist/core/engine/bulk-operations-shared.js +8 -2
  76. package/dist/core/engine/bulk-operations.d.ts +4 -1
  77. package/dist/core/engine/bulk-operations.js +235 -24
  78. package/dist/core/engine/callback-creators-bundles.d.ts +9 -0
  79. package/dist/core/engine/callback-creators-bundles.js +30 -2
  80. package/dist/core/engine/callback-creators-core.js +6 -4
  81. package/dist/core/engine/callback-creators-router.js +10 -0
  82. package/dist/core/engine/callback-creators-schedule.d.ts +2 -2
  83. package/dist/core/engine/callback-creators-schedule.js +12 -8
  84. package/dist/core/engine/candidate-read-batching.d.ts +6 -0
  85. package/dist/core/engine/candidate-read-batching.js +1 -0
  86. package/dist/core/engine/checkpoint-io.js +61 -25
  87. package/dist/core/engine/checkpoint-reads.js +3 -2
  88. package/dist/core/engine/checkpoint-replay.d.ts +20 -0
  89. package/dist/core/engine/checkpoint-replay.js +242 -0
  90. package/dist/core/engine/checkpoint-side-effects.d.ts +23 -0
  91. package/dist/core/engine/checkpoint-side-effects.js +35 -0
  92. package/dist/core/engine/child-workflow-cancellation.d.ts +10 -0
  93. package/dist/core/engine/child-workflow-cancellation.js +40 -0
  94. package/dist/core/engine/child-workflow.js +27 -4
  95. package/dist/core/engine/condition-waiters.d.ts +14 -0
  96. package/dist/core/engine/condition-waiters.js +5 -0
  97. package/dist/core/engine/construction.d.ts +3 -0
  98. package/dist/core/engine/construction.js +21 -8
  99. package/dist/core/engine/coordination-branch-executors.d.ts +70 -0
  100. package/dist/core/engine/coordination-branch-executors.js +107 -0
  101. package/dist/core/engine/deferred-consume-envelope.d.ts +59 -0
  102. package/dist/core/engine/deferred-consume-envelope.js +14 -0
  103. package/dist/core/engine/disposal.js +13 -0
  104. package/dist/core/engine/engine-create-types.d.ts +14 -4
  105. package/dist/core/engine/engine-internal-types.d.ts +26 -3
  106. package/dist/core/engine/errors.d.ts +47 -0
  107. package/dist/core/engine/errors.js +20 -0
  108. package/dist/core/engine/event-log-compaction.d.ts +8 -0
  109. package/dist/core/engine/event-log-compaction.js +20 -2
  110. package/dist/core/engine/fenced-write.d.ts +65 -0
  111. package/dist/core/engine/fenced-write.js +71 -0
  112. package/dist/core/engine/finalizer-state.d.ts +28 -0
  113. package/dist/core/engine/finalizer-state.js +16 -0
  114. package/dist/core/engine/handles.d.ts +8 -0
  115. package/dist/core/engine/index.d.ts +34 -16
  116. package/dist/core/engine/index.js +136 -9
  117. package/dist/core/engine/inline-parking.js +3 -2
  118. package/dist/core/engine/internals.d.ts +107 -3
  119. package/dist/core/engine/lease-codec.d.ts +35 -0
  120. package/dist/core/engine/lease-codec.js +32 -0
  121. package/dist/core/engine/lease-deposition.d.ts +66 -0
  122. package/dist/core/engine/lease-deposition.js +10 -0
  123. package/dist/core/engine/lease-errors.d.ts +99 -0
  124. package/dist/core/engine/lease-errors.js +30 -0
  125. package/dist/core/engine/lease-manager.d.ts +114 -0
  126. package/dist/core/engine/lease-manager.js +135 -0
  127. package/dist/core/engine/lifecycle/persist.js +10 -32
  128. package/dist/core/engine/lifecycle/recovered-services.d.ts +8 -6
  129. package/dist/core/engine/lifecycle/recovered-services.js +18 -3
  130. package/dist/core/engine/lifecycle/resume.js +16 -9
  131. package/dist/core/engine/lifecycle/shared.d.ts +8 -1
  132. package/dist/core/engine/lifecycle/start-batch.d.ts +1 -1
  133. package/dist/core/engine/lifecycle/start-batch.js +2 -1
  134. package/dist/core/engine/lifecycle/start-commit.d.ts +9 -0
  135. package/dist/core/engine/lifecycle/start-commit.js +50 -8
  136. package/dist/core/engine/lifecycle/start-or-signal-create.d.ts +58 -0
  137. package/dist/core/engine/lifecycle/start-or-signal-create.js +95 -0
  138. package/dist/core/engine/lifecycle/start-or-signal.d.ts +3 -2
  139. package/dist/core/engine/lifecycle/start-or-signal.js +11 -81
  140. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +39 -0
  141. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +28 -0
  142. package/dist/core/engine/lifecycle/start.d.ts +4 -4
  143. package/dist/core/engine/lifecycle/start.js +17 -9
  144. package/dist/core/engine/lifecycle/transition.js +17 -5
  145. package/dist/core/engine/lifecycle.d.ts +1 -1
  146. package/dist/core/engine/list-candidate-resolution.js +2 -2
  147. package/dist/core/engine/listing.js +9 -5
  148. package/dist/core/engine/operations-activity.d.ts +6 -13
  149. package/dist/core/engine/operations-activity.js +26 -53
  150. package/dist/core/engine/operations-coordination.d.ts +10 -0
  151. package/dist/core/engine/operations-coordination.js +44 -9
  152. package/dist/core/engine/operations-router.d.ts +6 -0
  153. package/dist/core/engine/operations-router.js +2 -0
  154. package/dist/core/engine/operations-speculate.js +6 -2
  155. package/dist/core/engine/operations-stream.js +12 -2
  156. package/dist/core/engine/operations-time.d.ts +4 -2
  157. package/dist/core/engine/operations-time.js +14 -2
  158. package/dist/core/engine/operations-wait-condition.d.ts +23 -0
  159. package/dist/core/engine/operations-wait-condition.js +62 -0
  160. package/dist/core/engine/ownership-options.d.ts +23 -0
  161. package/dist/core/engine/ownership-options.js +26 -0
  162. package/dist/core/engine/payload-size-policy.d.ts +3 -0
  163. package/dist/core/engine/payload-size-policy.js +4 -0
  164. package/dist/core/engine/pending-updates.d.ts +17 -0
  165. package/dist/core/engine/pending-updates.js +33 -11
  166. package/dist/core/engine/queries.js +1 -1
  167. package/dist/core/engine/registration.d.ts +1 -0
  168. package/dist/core/engine/registration.js +18 -3
  169. package/dist/core/engine/schedule-jitter.d.ts +5 -0
  170. package/dist/core/engine/schedule-jitter.js +10 -0
  171. package/dist/core/engine/schedule-run.d.ts +17 -0
  172. package/dist/core/engine/schedule-run.js +38 -0
  173. package/dist/core/engine/schedule-timer.js +81 -17
  174. package/dist/core/engine/schedules.d.ts +7 -4
  175. package/dist/core/engine/schedules.js +37 -16
  176. package/dist/core/engine/search-attribute-records.d.ts +4 -0
  177. package/dist/core/engine/search-attribute-records.js +17 -0
  178. package/dist/core/engine/signals.d.ts +18 -2
  179. package/dist/core/engine/signals.js +42 -21
  180. package/dist/core/engine/state-utilities.d.ts +49 -2
  181. package/dist/core/engine/state-utilities.js +114 -3
  182. package/dist/core/engine/storage-io.d.ts +16 -2
  183. package/dist/core/engine/storage-io.js +26 -5
  184. package/dist/core/engine/stream-chunk-loading.d.ts +2 -0
  185. package/dist/core/engine/stream-chunk-loading.js +24 -1
  186. package/dist/core/engine/sub-operation.js +25 -6
  187. package/dist/core/engine/termination/cleanup.d.ts +3 -1
  188. package/dist/core/engine/termination/cleanup.js +25 -1
  189. package/dist/core/engine/termination/complete.js +44 -6
  190. package/dist/core/engine/termination/finalizer-activity.d.ts +53 -0
  191. package/dist/core/engine/termination/finalizer-activity.js +30 -0
  192. package/dist/core/engine/termination/finalizer-claim.d.ts +110 -0
  193. package/dist/core/engine/termination/finalizer-claim.js +80 -0
  194. package/dist/core/engine/termination/finalizer.d.ts +48 -0
  195. package/dist/core/engine/termination/finalizer.js +159 -0
  196. package/dist/core/engine/termination/suspend.d.ts +3 -1
  197. package/dist/core/engine/termination.d.ts +1 -0
  198. package/dist/core/engine/termination.js +4 -0
  199. package/dist/core/engine/updates.js +5 -25
  200. package/dist/core/engine/validation/schedule.d.ts +2 -1
  201. package/dist/core/engine/validation/schedule.js +51 -2
  202. package/dist/core/engine/validation.js +32 -5
  203. package/dist/core/engine/waiting-update-response.d.ts +8 -0
  204. package/dist/core/engine/waiting-update-response.js +22 -0
  205. package/dist/core/engine/workflow-concurrency.d.ts +10 -0
  206. package/dist/core/engine/workflow-concurrency.js +136 -0
  207. package/dist/core/engine/workflow-feed.d.ts +4 -5
  208. package/dist/core/engine/workflow-feed.js +4 -1
  209. package/dist/core/engine/workflow-indexes.d.ts +9 -0
  210. package/dist/core/engine/workflow-indexes.js +10 -0
  211. package/dist/core/engine/workflow-state-stream.js +33 -13
  212. package/dist/core/engine/workflow-visibility-queries.d.ts +2 -2
  213. package/dist/core/engine-helpers.js +1 -0
  214. package/dist/core/events/activity-events.d.ts +43 -12
  215. package/dist/core/events/activity-events.js +28 -0
  216. package/dist/core/events/attribute-events.d.ts +2 -3
  217. package/dist/core/events/event-map.d.ts +18 -12
  218. package/dist/core/events/index.d.ts +1 -0
  219. package/dist/core/events/index.js +1 -0
  220. package/dist/core/events/schedule-events.d.ts +71 -0
  221. package/dist/core/events/schedule-events.js +29 -0
  222. package/dist/core/events/signal-events.d.ts +4 -6
  223. package/dist/core/events/system-events.d.ts +29 -19
  224. package/dist/core/events/system-events.js +26 -0
  225. package/dist/core/events/update-events.d.ts +6 -8
  226. package/dist/core/events/workflow-events.d.ts +88 -23
  227. package/dist/core/events/workflow-events.js +26 -0
  228. package/dist/core/failure-categories.js +5 -17
  229. package/dist/core/fault-code.d.ts +9 -3
  230. package/dist/core/fault-code.js +1 -0
  231. package/dist/core/inline-execution-strategy.context-options.d.ts +69 -0
  232. package/dist/core/inline-execution-strategy.context-options.js +56 -0
  233. package/dist/core/inline-execution-strategy.d.ts +31 -36
  234. package/dist/core/inline-execution-strategy.js +16 -27
  235. package/dist/core/list-filter-validation.d.ts +1 -1
  236. package/dist/core/payload-size.d.ts +1 -1
  237. package/dist/core/persisted-data-incompatible-error.d.ts +9 -7
  238. package/dist/core/review/events.d.ts +6 -8
  239. package/dist/core/scheduler/scheduler-class.d.ts +10 -1
  240. package/dist/core/scheduler/scheduler-class.js +38 -11
  241. package/dist/core/scheduler/timer-batch.js +9 -1
  242. package/dist/core/scheduler/timer-sources.d.ts +1 -0
  243. package/dist/core/scheduler/timer-sources.js +11 -5
  244. package/dist/core/session-state.d.ts +0 -1
  245. package/dist/core/session-state.js +2 -2
  246. package/dist/core/start-workflow-validation.d.ts +34 -0
  247. package/dist/core/start-workflow-validation.js +19 -0
  248. package/dist/core/types/activity-verification.d.ts +67 -0
  249. package/dist/core/types/activity-verification.js +0 -0
  250. package/dist/core/types/activity.d.ts +80 -61
  251. package/dist/core/types/bulk.d.ts +50 -9
  252. package/dist/core/types/checkpoint.d.ts +44 -8
  253. package/dist/core/types/list-options.d.ts +146 -0
  254. package/dist/core/types/list-options.js +0 -0
  255. package/dist/core/types/options.d.ts +121 -165
  256. package/dist/core/types/schedules.d.ts +39 -3
  257. package/dist/core/types/services-resolution.d.ts +2 -2
  258. package/dist/core/types/workflow-builder-runtime.d.ts +12 -3
  259. package/dist/core/types/workflow-builder-runtime.js +11 -2
  260. package/dist/core/types/workflow-builder.d.ts +42 -11
  261. package/dist/core/types/workflow-concurrency.d.ts +39 -0
  262. package/dist/core/types/workflow-concurrency.js +0 -0
  263. package/dist/core/types/workflow-context.d.ts +157 -14
  264. package/dist/core/types/workflow-definition.d.ts +53 -10
  265. package/dist/core/types/workflow-function.d.ts +84 -9
  266. package/dist/core/types/workflow-log.d.ts +98 -0
  267. package/dist/core/types/workflow-log.js +0 -0
  268. package/dist/core/types/workflow-registries.d.ts +14 -3
  269. package/dist/core/types/workflow-registry.d.ts +3 -0
  270. package/dist/core/types.d.ts +4 -0
  271. package/dist/core/types.js +4 -0
  272. package/dist/core/versioning.d.ts +9 -39
  273. package/dist/core/versioning.js +2 -12
  274. package/dist/core/weft-error.d.ts +44 -1
  275. package/dist/core/weft-error.js +16 -0
  276. package/dist/core/worker-execution-strategy-options.d.ts +26 -0
  277. package/dist/core/worker-execution-strategy.js +40 -36
  278. package/dist/core/worker-inbound-message.d.ts +38 -0
  279. package/dist/core/worker-inbound-message.js +37 -0
  280. package/dist/core/worker-log-abuse-counter.d.ts +175 -0
  281. package/dist/core/worker-log-abuse-counter.js +107 -0
  282. package/dist/core/worker-message-helpers.d.ts +47 -0
  283. package/dist/core/worker-message-helpers.js +26 -0
  284. package/dist/core/worker-protocol-guard.js +1 -1
  285. package/dist/core/worker-protocol-log.d.ts +56 -0
  286. package/dist/core/worker-protocol-log.js +18 -0
  287. package/dist/core/worker-protocol.d.ts +23 -0
  288. package/dist/core/worker-protocol.js +12 -2
  289. package/dist/core/workflow-version-tuple.d.ts +3 -9
  290. package/dist/core/workflow-version-tuple.js +2 -3
  291. package/dist/diagnostics/format.js +1 -6
  292. package/dist/diagnostics/types.d.ts +4 -5
  293. package/dist/diagnostics/validate.d.ts +0 -1
  294. package/dist/diagnostics/version-check.d.ts +1 -1
  295. package/dist/diagnostics/version-check.js +4 -9
  296. package/dist/index.d.ts +12 -10
  297. package/dist/index.js +29 -3
  298. package/dist/json-schema.js +3 -3
  299. package/dist/mcp/cli.js +19 -19
  300. package/dist/mcp/dispatcher.js +1 -1
  301. package/dist/mcp/http.js +16 -6
  302. package/dist/mcp/protocol.d.ts +2 -0
  303. package/dist/mcp/protocol.js +1 -1
  304. package/dist/mcp/session.d.ts +16 -0
  305. package/dist/mcp/session.js +59 -6
  306. package/dist/mcp/tools.js +73 -6
  307. package/dist/observability/index.js +2 -2
  308. package/dist/server/asyncapi-channels.js +5 -2
  309. package/dist/server/attribute-filters.d.ts +8 -3
  310. package/dist/server/attribute-filters.js +6 -1
  311. package/dist/server/authentication/api-key.d.ts +2 -1
  312. package/dist/server/authentication/api-key.js +5 -2
  313. package/dist/server/authentication/constant-time-api-key.d.ts +15 -0
  314. package/dist/server/authentication/constant-time-api-key.js +24 -0
  315. package/dist/server/authentication/index.d.ts +1 -1
  316. package/dist/server/authentication/index.js +7 -4
  317. package/dist/server/authentication/rotating-api-key-store.d.ts +5 -3
  318. package/dist/server/authentication/rotating-api-key-store.js +19 -11
  319. package/dist/server/engine-event-feed-backend.d.ts +4 -5
  320. package/dist/server/fault-to-http.js +8 -1
  321. package/dist/server/fault-to-json-rpc.js +1 -0
  322. package/dist/server/fleet-event-feed.d.ts +31 -0
  323. package/dist/server/fleet-event-feed.js +157 -0
  324. package/dist/server/handler/index.js +1 -1
  325. package/dist/server/handler/response-helpers.js +2 -1
  326. package/dist/server/handler/route-dispatch.d.ts +6 -3
  327. package/dist/server/handler/route-dispatch.js +2 -2
  328. package/dist/server/handler.js +23 -23
  329. package/dist/server/index.d.ts +32 -2
  330. package/dist/server/index.js +32 -32
  331. package/dist/server/json-rpc-transport-helpers.d.ts +1 -0
  332. package/dist/server/json-rpc-transport-helpers.js +2 -1
  333. package/dist/server/json-rpc-websocket-runtime.d.ts +11 -2
  334. package/dist/server/json-rpc-websocket-runtime.js +1 -0
  335. package/dist/server/json-rpc-websocket-subscriptions.d.ts +10 -0
  336. package/dist/server/json-rpc-websocket-subscriptions.js +29 -0
  337. package/dist/server/json-rpc-websocket-types.d.ts +22 -0
  338. package/dist/server/json-rpc-websocket-types.js +0 -0
  339. package/dist/server/json-rpc-websocket-validation.js +20 -4
  340. package/dist/server/json-rpc-websocket.d.ts +2 -43
  341. package/dist/server/json-rpc-websocket.js +57 -74
  342. package/dist/server/openapi.d.ts +2 -1
  343. package/dist/server/openapi.js +1 -3
  344. package/dist/server/openrpc-document-schema.d.ts +78 -0
  345. package/dist/server/openrpc-document-schema.js +27 -1
  346. package/dist/server/openrpc-errors.d.ts +3 -0
  347. package/dist/server/openrpc-errors.js +2 -1
  348. package/dist/server/openrpc.js +32 -0
  349. package/dist/server/operation-catalog/index.d.ts +1 -1
  350. package/dist/server/operation-catalog/pipeline-helpers.js +1 -0
  351. package/dist/server/operation-catalog/pipeline-stages.js +26 -12
  352. package/dist/server/operation-catalog/pipeline.js +8 -1
  353. package/dist/server/operation-catalog/registry.js +13 -0
  354. package/dist/server/operation-catalog/types.d.ts +20 -9
  355. package/dist/server/operation-fault.d.ts +10 -0
  356. package/dist/server/operation-fault.js +2 -0
  357. package/dist/server/operation-registry.d.ts +12 -11
  358. package/dist/server/operation-registry.js +12 -3
  359. package/dist/server/operations/aggregate-workflows.d.ts +15 -15
  360. package/dist/server/operations/async-activity.d.ts +2 -2
  361. package/dist/server/operations/async-activity.js +12 -7
  362. package/dist/server/operations/bulk-cancel-workflows.d.ts +1 -1
  363. package/dist/server/operations/bulk-cancel-workflows.js +2 -2
  364. package/dist/server/operations/bulk-delete-workflows.d.ts +1 -1
  365. package/dist/server/operations/bulk-delete-workflows.js +2 -2
  366. package/dist/server/operations/bulk-filter-helpers.d.ts +8 -6
  367. package/dist/server/operations/bulk-filter-helpers.js +54 -24
  368. package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +11 -9
  369. package/dist/server/operations/bulk-mutate-workflow-tags.js +2 -2
  370. package/dist/server/operations/bulk-operation-helpers.d.ts +2 -2
  371. package/dist/server/operations/bulk-retry-failed-workflows.d.ts +7 -0
  372. package/dist/server/operations/bulk-retry-failed-workflows.js +64 -0
  373. package/dist/server/operations/bulk-signal-workflows.d.ts +11 -9
  374. package/dist/server/operations/bulk-signal-workflows.js +2 -2
  375. package/dist/server/operations/cancel-schedule.d.ts +1 -1
  376. package/dist/server/operations/create-schedule.d.ts +3 -1
  377. package/dist/server/operations/create-schedule.js +29 -11
  378. package/dist/server/operations/fleet-events-subscription.d.ts +54 -0
  379. package/dist/server/operations/fleet-events-subscription.js +99 -0
  380. package/dist/server/operations/fork-workflow.d.ts +1 -1
  381. package/dist/server/operations/fork-workflow.js +3 -2
  382. package/dist/server/operations/get-checkpoint-at.d.ts +1 -1
  383. package/dist/server/operations/get-registry.d.ts +1 -1
  384. package/dist/server/operations/get-retention-overview.d.ts +1 -1
  385. package/dist/server/operations/get-review.d.ts +1 -1
  386. package/dist/server/operations/get-schedule.d.ts +1 -1
  387. package/dist/server/operations/get-stream-chunks.d.ts +1 -1
  388. package/dist/server/operations/get-system-metrics.d.ts +2 -2
  389. package/dist/server/operations/get-task-diagnostics.d.ts +45 -6
  390. package/dist/server/operations/get-task-diagnostics.js +101 -7
  391. package/dist/server/operations/get-update-result.d.ts +1 -1
  392. package/dist/server/operations/get-workflow-attributes.d.ts +1 -1
  393. package/dist/server/operations/get-workflow-events.d.ts +1 -1
  394. package/dist/server/operations/get-workflow-result.d.ts +1 -1
  395. package/dist/server/operations/get-workflow-timeline.d.ts +1 -1
  396. package/dist/server/operations/get-workflow.d.ts +1 -1
  397. package/dist/server/operations/list-checkpoints.d.ts +1 -1
  398. package/dist/server/operations/list-reviews.d.ts +1 -1
  399. package/dist/server/operations/list-schedules.d.ts +1 -1
  400. package/dist/server/operations/list-task-queues.d.ts +2 -2
  401. package/dist/server/operations/list-workers.d.ts +2 -2
  402. package/dist/server/operations/list-workflows.d.ts +1 -1
  403. package/dist/server/operations/operation-helpers.d.ts +16 -1
  404. package/dist/server/operations/operation-helpers.js +15 -3
  405. package/dist/server/operations/pause-schedule.d.ts +1 -1
  406. package/dist/server/operations/purge-workflows.d.ts +5 -5
  407. package/dist/server/operations/purge-workflows.js +2 -2
  408. package/dist/server/operations/query-workflow.d.ts +1 -1
  409. package/dist/server/operations/query-workflow.js +3 -2
  410. package/dist/server/operations/recover-all.d.ts +1 -1
  411. package/dist/server/operations/replay-workflow.d.ts +1 -1
  412. package/dist/server/operations/resume-schedule.d.ts +1 -1
  413. package/dist/server/operations/set-workflow-attributes.d.ts +1 -1
  414. package/dist/server/operations/set-workflow-attributes.js +6 -3
  415. package/dist/server/operations/signal-workflow.js +8 -3
  416. package/dist/server/operations/single-workflow-tag-mutation.js +13 -3
  417. package/dist/server/operations/start-or-signal-workflow.d.ts +6 -1
  418. package/dist/server/operations/start-or-signal-workflow.js +14 -24
  419. package/dist/server/operations/start-workflow-options.d.ts +6 -0
  420. package/dist/server/operations/start-workflow-rest-input.d.ts +14 -0
  421. package/dist/server/operations/start-workflow-rest-input.js +31 -0
  422. package/dist/server/operations/start-workflow.d.ts +1 -1
  423. package/dist/server/operations/start-workflow.js +8 -23
  424. package/dist/server/operations/storage.d.ts +6 -6
  425. package/dist/server/operations/storage.js +24 -14
  426. package/dist/server/operations/stream-workflow-sse.d.ts +1 -1
  427. package/dist/server/operations/submit-review-decision.d.ts +1 -1
  428. package/dist/server/operations/submit-review-decision.js +6 -3
  429. package/dist/server/operations/update-schedule.d.ts +1 -1
  430. package/dist/server/operations/update-schedule.js +7 -4
  431. package/dist/server/operations/update-workflow.d.ts +1 -1
  432. package/dist/server/operations/update-workflow.js +7 -3
  433. package/dist/server/operations/worker-drain.d.ts +8 -8
  434. package/dist/server/operations/worker-drain.js +11 -8
  435. package/dist/server/operations/workflow-events-subscription.d.ts +7 -8
  436. package/dist/server/operations/workflow-events-subscription.js +43 -8
  437. package/dist/server/rest-binding.d.ts +3 -1
  438. package/dist/server/rest-bindings.js +12 -0
  439. package/dist/server/rest-body.d.ts +10 -0
  440. package/dist/server/rest-body.js +80 -0
  441. package/dist/server/runtime/authentication-bridge.d.ts +1 -0
  442. package/dist/server/runtime/authentication-bridge.js +33 -6
  443. package/dist/server/runtime/client-visible-events.d.ts +3 -0
  444. package/dist/server/runtime/client-visible-events.js +65 -0
  445. package/dist/server/runtime/context.d.ts +7 -0
  446. package/dist/server/runtime/event-broadcasting.d.ts +6 -0
  447. package/dist/server/runtime/event-broadcasting.js +72 -38
  448. package/dist/server/runtime/retry.d.ts +1 -0
  449. package/dist/server/runtime/retry.js +14 -0
  450. package/dist/server/runtime/shutdown.d.ts +7 -6
  451. package/dist/server/runtime/shutdown.js +6 -1
  452. package/dist/server/runtime/task-polling.js +61 -20
  453. package/dist/server/runtime/task-reconciliation.js +9 -1
  454. package/dist/server/runtime/task-result-resolution.d.ts +15 -0
  455. package/dist/server/runtime/task-result-resolution.js +81 -0
  456. package/dist/server/runtime/websocket-stream.d.ts +20 -1
  457. package/dist/server/runtime/websocket-stream.js +173 -7
  458. package/dist/server/runtime/websocket-upgrade.js +22 -3
  459. package/dist/server/runtime/websocket-worker.d.ts +1 -1
  460. package/dist/server/runtime/websocket-worker.js +38 -30
  461. package/dist/server/serve-internals.d.ts +3 -1
  462. package/dist/server/serve-internals.js +18 -2
  463. package/dist/server/task-state.d.ts +30 -0
  464. package/dist/server/task-state.js +28 -0
  465. package/dist/server/workflow-event-feed.d.ts +36 -115
  466. package/dist/server/workflow-event-feed.js +92 -27
  467. package/dist/service-worker/index.js +30 -30
  468. package/dist/storage/auto.js +1 -1
  469. package/dist/storage/bun-sql.js +24 -0
  470. package/dist/storage/compressed-storage.js +1 -1
  471. package/dist/storage/default-scope.d.ts +7 -4
  472. package/dist/storage/http.js +2 -2
  473. package/dist/storage/index.d.ts +76 -4
  474. package/dist/storage/indexeddb.js +1 -1
  475. package/dist/storage/interface.d.ts +163 -0
  476. package/dist/storage/interface.js +1 -1
  477. package/dist/storage/key-prefixes.d.ts +1 -1
  478. package/dist/storage/key-prefixes.js +10 -0
  479. package/dist/storage/lmdb.d.ts +4 -3
  480. package/dist/storage/lmdb.js +1 -1
  481. package/dist/storage/memory.js +1 -1
  482. package/dist/storage/neon-batch.d.ts +30 -0
  483. package/dist/storage/neon-batch.js +30 -0
  484. package/dist/storage/neon-value-mapping.d.ts +30 -3
  485. package/dist/storage/neon-value-mapping.js +12 -0
  486. package/dist/storage/neon.d.ts +16 -0
  487. package/dist/storage/neon.js +9 -4
  488. package/dist/storage/node-sqlite.js +23 -0
  489. package/dist/storage/postgres-key-value-queries.d.ts +69 -44
  490. package/dist/storage/postgres-key-value-queries.js +62 -24
  491. package/dist/storage/resolve.js +1 -1
  492. package/dist/storage/scoped-storage.js +1 -1
  493. package/dist/storage/testing.d.ts +168 -0
  494. package/dist/storage/testing.js +2 -0
  495. package/dist/storage/turso.d.ts +8 -0
  496. package/dist/storage/turso.js +2 -2
  497. package/dist/storage/typed-storage.js +1 -1
  498. package/dist/storage/web-extension.js +1 -1
  499. package/dist/testing/index.js +20 -20
  500. package/dist/version.d.ts +1 -1
  501. package/dist/version.js +1 -1
  502. package/dist/worker/protocol.js +1 -1
  503. package/dist/workers/worker-replay-state.d.ts +32 -0
  504. package/dist/workers/worker-replay-state.js +35 -0
  505. package/dist/workers/worker-state-namespace.d.ts +21 -0
  506. package/dist/workers/worker-state-namespace.js +13 -0
  507. package/dist/workers/workflow-runner.d.ts +19 -15
  508. package/dist/workers/workflow-runner.js +72 -60
  509. package/dist/workers/workflow-worker-entry.js +5 -2
  510. package/package.json +5 -1
@@ -22,6 +22,6 @@ export declare const updateWorkflowOperation: import("../operation-catalog.ts").
22
22
  }, {
23
23
  updateId: string;
24
24
  result: unknown;
25
- }>;
25
+ }, unknown>;
26
26
  export declare const updateWorkflowRestBinding: UnknownRestBinding;
27
27
  export {};
@@ -5,6 +5,7 @@ import {
5
5
  WorkflowTerminalError
6
6
  } from "../../core/updates.js";
7
7
  import { defineOperation } from "../operation-registry.js";
8
+ import { readRestJsonBody } from "../rest-body.js";
8
9
  import { isOperationFault, shapeRestFault } from "./operation-helpers.js";
9
10
  const DEFAULT_UPDATE_TIMEOUT_MS = 30000, updateWorkflowInput = z.object({
10
11
  workflowId: z.string().min(1),
@@ -85,17 +86,20 @@ export const updateWorkflowOperation = defineOperation({
85
86
  timeout: { kind: "body-field", bodyField: "timeout" },
86
87
  idempotencyKey: { kind: "body-field", bodyField: "idempotencyKey" }
87
88
  },
88
- extractInput: async (request, pathParams) => {
89
+ extractInput: async (request, pathParams, context) => {
89
90
  let payload, timeout, idempotencyKey;
90
91
  try {
91
- const body = await request.json();
92
+ const body = await readRestJsonBody(request, context);
92
93
  if (typeof body === "object" && body !== null) {
93
94
  const record = body;
94
95
  payload = record.payload;
95
96
  timeout = record.timeout;
96
97
  idempotencyKey = record.idempotencyKey;
97
98
  }
98
- } catch {}
99
+ } catch (error) {
100
+ if (isOperationFault(error))
101
+ throw error;
102
+ }
99
103
  return {
100
104
  workflowId: pathParams.id ?? "",
101
105
  updateName: pathParams.name ?? "",
@@ -37,31 +37,31 @@ type WorkerDrainOperationOptions = {
37
37
  export declare function createDrainWorkerOperation(options?: WorkerDrainOperationOptions): import("../operation-catalog.ts").OperationDefinition<{
38
38
  workerId: string;
39
39
  reason?: string | undefined;
40
- }, WorkerDrainMutationResult>;
40
+ }, WorkerDrainMutationResult, unknown>;
41
41
  export declare function createClearWorkerDrainOperation(options?: WorkerDrainOperationOptions): import("../operation-catalog.ts").OperationDefinition<{
42
42
  workerId: string;
43
- }, WorkerDrainMutationResult>;
43
+ }, WorkerDrainMutationResult, unknown>;
44
44
  export declare function createDrainDeploymentOperation(options?: WorkerDrainOperationOptions): import("../operation-catalog.ts").OperationDefinition<{
45
45
  deploymentName: string;
46
46
  reason?: string | undefined;
47
- }, WorkerDrainMutationResult>;
47
+ }, WorkerDrainMutationResult, unknown>;
48
48
  export declare function createClearDeploymentDrainOperation(options?: WorkerDrainOperationOptions): import("../operation-catalog.ts").OperationDefinition<{
49
49
  deploymentName: string;
50
- }, WorkerDrainMutationResult>;
50
+ }, WorkerDrainMutationResult, unknown>;
51
51
  export declare const drainWorkerOperation: import("../operation-catalog.ts").OperationDefinition<{
52
52
  workerId: string;
53
53
  reason?: string | undefined;
54
- }, WorkerDrainMutationResult>;
54
+ }, WorkerDrainMutationResult, unknown>;
55
55
  export declare const clearWorkerDrainOperation: import("../operation-catalog.ts").OperationDefinition<{
56
56
  workerId: string;
57
- }, WorkerDrainMutationResult>;
57
+ }, WorkerDrainMutationResult, unknown>;
58
58
  export declare const drainDeploymentOperation: import("../operation-catalog.ts").OperationDefinition<{
59
59
  deploymentName: string;
60
60
  reason?: string | undefined;
61
- }, WorkerDrainMutationResult>;
61
+ }, WorkerDrainMutationResult, unknown>;
62
62
  export declare const clearDeploymentDrainOperation: import("../operation-catalog.ts").OperationDefinition<{
63
63
  deploymentName: string;
64
- }, WorkerDrainMutationResult>;
64
+ }, WorkerDrainMutationResult, unknown>;
65
65
  export declare function createDrainWorkerRestBinding(): UnknownRestBinding;
66
66
  export declare function createClearWorkerDrainRestBinding(): UnknownRestBinding;
67
67
  export declare function createDrainDeploymentRestBinding(): UnknownRestBinding;
@@ -1,7 +1,8 @@
1
1
  import { z } from "zod";
2
2
  import { shapeOperationFaultAsJson } from "../operation-fault.js";
3
3
  import { defineOperation } from "../operation-registry.js";
4
- import { invalidParamsFault } from "./operation-helpers.js";
4
+ import { readRestTextBody } from "../rest-body.js";
5
+ import { invalidParamsFault, isOperationFault } from "./operation-helpers.js";
5
6
  const drainReasonSchema = z.string().min(1).max(256).optional(), workerDrainInput = z.object({
6
7
  workerId: z.string().min(1),
7
8
  reason: drainReasonSchema
@@ -153,9 +154,9 @@ function createWorkerDrainRestBinding(method, operationName) {
153
154
  workerId: { kind: "path", pathParam: "workerId" },
154
155
  ...method === "POST" ? { reason: { kind: "body-field", bodyField: "reason" } } : {}
155
156
  },
156
- extractInput: async (request, pathParams) => ({
157
+ extractInput: async (request, pathParams, context) => ({
157
158
  workerId: pathParams.workerId ?? "",
158
- ...method === "POST" ? await readDrainBody(request) : {}
159
+ ...method === "POST" ? await readDrainBody(request, context) : {}
159
160
  }),
160
161
  success: { kind: "json", status: 200 },
161
162
  shapeSuccess: shapeDrainSuccess,
@@ -172,9 +173,9 @@ function createDeploymentDrainRestBinding(method, operationName) {
172
173
  deploymentName: { kind: "path", pathParam: "deploymentName" },
173
174
  ...method === "POST" ? { reason: { kind: "body-field", bodyField: "reason" } } : {}
174
175
  },
175
- extractInput: async (request, pathParams) => ({
176
+ extractInput: async (request, pathParams, context) => ({
176
177
  deploymentName: pathParams.deploymentName ?? "",
177
- ...method === "POST" ? await readDrainBody(request) : {}
178
+ ...method === "POST" ? await readDrainBody(request, context) : {}
178
179
  }),
179
180
  success: { kind: "json", status: 200 },
180
181
  shapeSuccess: shapeDrainSuccess,
@@ -187,14 +188,16 @@ function shapeDrainSuccess(output) {
187
188
  headers: { "Content-Type": "application/json" }
188
189
  });
189
190
  }
190
- async function readDrainBody(request) {
191
- const text = await request.text();
191
+ async function readDrainBody(request, context) {
192
+ const text = await readRestTextBody(request, context);
192
193
  if (text.trim().length === 0)
193
194
  return {};
194
195
  let parsed;
195
196
  try {
196
197
  parsed = JSON.parse(text);
197
- } catch {
198
+ } catch (error) {
199
+ if (isOperationFault(error))
200
+ throw error;
198
201
  throw invalidParamsFault("Drain request body must be valid JSON");
199
202
  }
200
203
  if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { type EventEnvelope } from '../workflow-event-feed.ts';
2
3
  declare const workflowEventsSubscriptionInput: z.ZodObject<{
3
4
  workflowId: z.ZodString;
4
5
  selector: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -28,13 +29,11 @@ export type WorkflowEventsSubscriptionEnvelope = z.infer<typeof workflowEventsSu
28
29
  * subscriptions. This is documented as a known v1 constraint; per-event
29
30
  * filtering is a planned future refinement.
30
31
  *
31
- * Access is `scoped: { workflows:read }` (NOT optionalAuth, NOT public).
32
- * Anonymous callers and authenticated callers without `workflows:read` are
33
- * both denied. The earlier policies allowed unauthenticated clients to
34
- * subscribe to arbitrary workflow event streams a real exposure the
35
- * security committee flagged. Operators running `serve({ engine })`
36
- * without auth must add an authentication layer before exposing this
37
- * endpoint to untrusted networks.
32
+ * Access is selector-specific: event envelopes require `events:read`, while
33
+ * token-stream envelopes require `streams:read`. Anonymous callers and
34
+ * authenticated callers without the matching scope are denied. Operators
35
+ * running `serve({ engine })` without auth must add an authentication layer
36
+ * before exposing this endpoint to untrusted networks.
38
37
  */
39
38
  export declare const workflowEventsSubscriptionOperation: import("../operation-catalog.ts").OperationDefinition<{
40
39
  workflowId: string;
@@ -43,5 +42,5 @@ export declare const workflowEventsSubscriptionOperation: import("../operation-c
43
42
  }, {
44
43
  subscriptionId: string;
45
44
  cursor: string;
46
- }>;
45
+ }, EventEnvelope>;
47
46
  export {};
@@ -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
  /**
@@ -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
@@ -206,6 +213,7 @@ export const REST_BINDINGS = [
206
213
  purgeWorkflowsRestBinding,
207
214
  bulkCancelWorkflowsRestBinding,
208
215
  bulkSignalWorkflowsRestBinding,
216
+ bulkRetryFailedWorkflowsRestBinding,
209
217
  bulkDeleteWorkflowsRestBinding,
210
218
  bulkMutateWorkflowTagsRestBinding,
211
219
  getWorkflowRestBinding,
@@ -243,6 +251,7 @@ export const REST_BINDINGS = [
243
251
  getStreamChunksRestBinding,
244
252
  streamWorkflowSseRestBinding,
245
253
  getTaskDiagnosticsRestBinding,
254
+ clearTaskDeadLetterRestBinding,
246
255
  listSchedulesRestBinding,
247
256
  getScheduleRestBinding,
248
257
  replayWorkflowRestBinding,
@@ -331,6 +340,7 @@ export function createLiveOperationRegistry(options) {
331
340
  purgeWorkflowsOperation,
332
341
  bulkCancelWorkflowsOperation,
333
342
  bulkSignalWorkflowsOperation,
343
+ bulkRetryFailedWorkflowsOperation,
334
344
  bulkDeleteWorkflowsOperation,
335
345
  bulkMutateWorkflowTagsOperation,
336
346
  getWorkflowOperation,
@@ -367,7 +377,9 @@ export function createLiveOperationRegistry(options) {
367
377
  getStreamChunksOperation,
368
378
  streamWorkflowSseOperation,
369
379
  workflowEventsSubscriptionOperation,
380
+ fleetEventsSubscriptionOperation,
370
381
  buildTaskDiagnosticsOperationForRegistry(resolved),
382
+ clearTaskDeadLetterOperation,
371
383
  listSchedulesOperation,
372
384
  getScheduleOperation,
373
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.