@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
@@ -8,9 +8,8 @@
8
8
  * import { Engine, UpdateReceivedEvent } from '@lostgradient/weft';
9
9
  *
10
10
  * const engine = new Engine();
11
- * engine.addEventListener('update:received', (e: Event) => {
12
- * const ev = e as UpdateReceivedEvent;
13
- * console.log('update', ev.name, 'received for', ev.workflowId, '(id:', ev.updateId, ')');
11
+ * engine.addEventListener(UpdateReceivedEvent.type, (event) => {
12
+ * console.log('update', event.name, 'received for', event.workflowId, '(id:', event.updateId, ')');
14
13
  * });
15
14
  * ```
16
15
  */
@@ -32,12 +31,11 @@ export declare class UpdateReceivedEvent extends Event {
32
31
  * import { Engine, UpdateCompletedEvent } from '@lostgradient/weft';
33
32
  *
34
33
  * const engine = new Engine();
35
- * engine.addEventListener('update:completed', (e: Event) => {
36
- * const ev = e as UpdateCompletedEvent;
37
- * if (ev.error) {
38
- * console.error('update', ev.name, 'failed:', ev.error);
34
+ * engine.addEventListener(UpdateCompletedEvent.type, (event) => {
35
+ * if (event.error) {
36
+ * console.error('update', event.name, 'failed:', event.error);
39
37
  * } else {
40
- * console.log('update', ev.name, 'result:', ev.result);
38
+ * console.log('update', event.name, 'result:', event.result);
41
39
  * }
42
40
  * });
43
41
  * ```
@@ -1,4 +1,24 @@
1
1
  import type { TerminationReason } from '../types/history-policy.ts';
2
+ /**
3
+ * Fired on the {@link Engine} after a workflow definition is successfully
4
+ * registered. Same-reference idempotent registration does not emit this event.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { Engine, WorkflowDefinitionRegisteredEvent, workflow } from '@lostgradient/weft';
9
+ *
10
+ * const engine = new Engine();
11
+ * engine.addEventListener(WorkflowDefinitionRegisteredEvent.type, (event) => {
12
+ * console.log('registered workflow:', event.workflowType);
13
+ * });
14
+ * engine.register(workflow({ name: 'ping' }).execute(async function* () { return 'pong'; }));
15
+ * ```
16
+ */
17
+ export declare class WorkflowDefinitionRegisteredEvent extends Event {
18
+ static readonly type: "workflow:definition-registered";
19
+ readonly workflowType: string;
20
+ constructor(workflowType: string);
21
+ }
2
22
  /**
3
23
  * Fired on the {@link Engine} when a new workflow execution begins. Listen via
4
24
  * `engine.addEventListener('workflow:started', handler)` and read
@@ -9,9 +29,8 @@ import type { TerminationReason } from '../types/history-policy.ts';
9
29
  * import { workflow, Engine, WorkflowStartedEvent } from '@lostgradient/weft';
10
30
  *
11
31
  * const engine = new Engine();
12
- * engine.addEventListener('workflow:started', (e: Event) => {
13
- * const ev = e as WorkflowStartedEvent;
14
- * console.log('started', ev.workflowId, ev.workflowType);
32
+ * engine.addEventListener(WorkflowStartedEvent.type, (event) => {
33
+ * console.log('started', event.workflowId, event.workflowType);
15
34
  * });
16
35
  * engine.register(workflow({ name: 'ping' }).execute(async function* () { return 'pong'; }));
17
36
  * await engine.start('ping', null);
@@ -34,9 +53,8 @@ export declare class WorkflowStartedEvent extends Event {
34
53
  * import { workflow, Engine, WorkflowCompletedEvent } from '@lostgradient/weft';
35
54
  *
36
55
  * const engine = new Engine();
37
- * engine.addEventListener('workflow:completed', (e: Event) => {
38
- * const ev = e as WorkflowCompletedEvent;
39
- * console.log('completed in', ev.duration, 'ms, result:', ev.result);
56
+ * engine.addEventListener(WorkflowCompletedEvent.type, (event) => {
57
+ * console.log('completed in', event.duration, 'ms, result:', event.result);
40
58
  * });
41
59
  * engine.register(workflow({ name: 'ping' }).execute(async function* () { return 'pong'; }));
42
60
  * await (await engine.start('ping', null)).result();
@@ -59,9 +77,8 @@ export declare class WorkflowCompletedEvent extends Event {
59
77
  * import { workflow, Engine, WorkflowFailedEvent } from '@lostgradient/weft';
60
78
  *
61
79
  * const engine = new Engine();
62
- * engine.addEventListener('workflow:failed', (e: Event) => {
63
- * const ev = e as WorkflowFailedEvent;
64
- * console.error('workflow', ev.workflowId, 'failed:', ev.error.message);
80
+ * engine.addEventListener(WorkflowFailedEvent.type, (event) => {
81
+ * console.error('workflow', event.workflowId, 'failed:', event.error.message);
65
82
  * });
66
83
  * engine.register(workflow({ name: 'boom' }).execute(async function* () { throw new Error('oops'); }));
67
84
  * await engine.start('boom', null).then(h => h.result()).catch(() => undefined);
@@ -83,9 +100,8 @@ export declare class WorkflowFailedEvent extends Event {
83
100
  * import { Engine, workflow, WorkflowCancelledEvent } from '@lostgradient/weft';
84
101
  *
85
102
  * const engine = new Engine();
86
- * engine.addEventListener('workflow:cancelled', (e: Event) => {
87
- * const ev = e as WorkflowCancelledEvent;
88
- * console.log('cancelled', ev.workflowId);
103
+ * engine.addEventListener(WorkflowCancelledEvent.type, (event) => {
104
+ * console.log('cancelled', event.workflowId);
89
105
  * });
90
106
  * engine.register(
91
107
  * workflow({ name: 'slow' }).execute(async function* (
@@ -117,9 +133,8 @@ export declare class WorkflowCancelledEvent extends Event {
117
133
  * import { Engine, WorkflowTimedOutEvent } from '@lostgradient/weft';
118
134
  *
119
135
  * const engine = new Engine();
120
- * engine.addEventListener('workflow:timed-out', (e: Event) => {
121
- * const ev = e as WorkflowTimedOutEvent;
122
- * console.log(ev.workflowId, 'timed out after', ev.elapsed, 'ms (', ev.timeoutType, ')');
136
+ * engine.addEventListener(WorkflowTimedOutEvent.type, (event) => {
137
+ * console.log(event.workflowId, 'timed out after', event.elapsed, 'ms (', event.timeoutType, ')');
123
138
  * });
124
139
  * ```
125
140
  */
@@ -148,9 +163,8 @@ export declare const WORKFLOW_TERMINAL_EVENT_TYPES: ReadonlySet<string>;
148
163
  * import { Engine, WorkflowResumedEvent } from '@lostgradient/weft';
149
164
  *
150
165
  * const engine = new Engine();
151
- * engine.addEventListener('workflow:resumed', (e: Event) => {
152
- * const ev = e as WorkflowResumedEvent;
153
- * console.log('resumed', ev.workflowId, 'from step', ev.fromStep);
166
+ * engine.addEventListener(WorkflowResumedEvent.type, (event) => {
167
+ * console.log('resumed', event.workflowId, 'from step', event.fromStep);
154
168
  * });
155
169
  * ```
156
170
  */
@@ -172,9 +186,8 @@ export declare class WorkflowResumedEvent extends Event {
172
186
  * import { Engine, WorkflowSuspendedEvent } from '@lostgradient/weft';
173
187
  *
174
188
  * const engine = new Engine();
175
- * engine.addEventListener('workflow:suspended', (e: Event) => {
176
- * const ev = e as WorkflowSuspendedEvent;
177
- * console.log('suspended', ev.workflowId);
189
+ * engine.addEventListener(WorkflowSuspendedEvent.type, (event) => {
190
+ * console.log('suspended', event.workflowId);
178
191
  * });
179
192
  * ```
180
193
  */
@@ -207,8 +220,7 @@ export type WorkflowRecoverySkippedReason = 'type-not-registered';
207
220
  *
208
221
  * const engine = new Engine();
209
222
  * engine.addEventListener(WorkflowRecoverySkippedEvent.type, (event) => {
210
- * const skipped = event as WorkflowRecoverySkippedEvent;
211
- * console.warn('skipped recovery for', skipped.workflowType);
223
+ * console.warn('skipped recovery for', event.workflowType);
212
224
  * });
213
225
  * ```
214
226
  */
@@ -219,3 +231,56 @@ export declare class WorkflowRecoverySkippedEvent extends Event {
219
231
  readonly reason: WorkflowRecoverySkippedReason;
220
232
  constructor(workflowId: string, workflowType: string, reason: WorkflowRecoverySkippedReason);
221
233
  }
234
+ /**
235
+ * The lifecycle stage a {@link WorkflowTeardownEvent} reports for a workflow's
236
+ * definition-level `finalizer` (issue #446):
237
+ *
238
+ * - `'completed'`: the finalizer succeeded — the external resource recorded via
239
+ * `ctx.setFinalizerState` has been torn down.
240
+ * - `'failed'`: a single attempt failed; the engine backs off and re-fires unless the
241
+ * dead-letter horizon is reached. Per-attempt observability — fires on every retry.
242
+ * - `'dead-lettered'`: the retry horizon was reached without success; the external
243
+ * resource may be leaked. The durable record is `KEYS.teardownDeadLetter`, which
244
+ * survives purge so the leak is auditable after the workflow record is gone.
245
+ *
246
+ * @example
247
+ * ```ts
248
+ * import type { WorkflowTeardownStatus } from '@lostgradient/weft';
249
+ *
250
+ * const status: WorkflowTeardownStatus = 'dead-lettered';
251
+ * void status;
252
+ * ```
253
+ */
254
+ export type WorkflowTeardownStatus = 'completed' | 'failed' | 'dead-lettered';
255
+ /**
256
+ * Fired on the {@link Engine} as a workflow's definition-level `finalizer` progresses
257
+ * through teardown after a `cancelled`/`timed-out` terminal (issue #446). One event
258
+ * type carries the stage in `status`; `attempts` is the attempt count; `error` is the
259
+ * failure message on `'failed'`/`'dead-lettered'` (absent on `'completed'`). The schema is
260
+ * stable and compact, and `status` is low-cardinality; `workflowId`/`workflowType` are
261
+ * naturally high-cardinality identifiers. Keep `'failed'` listeners side-effect-light —
262
+ * they fire on every retry.
263
+ *
264
+ * @example
265
+ * ```ts
266
+ * import { Engine, WorkflowTeardownEvent } from '@lostgradient/weft';
267
+ *
268
+ * const engine = new Engine();
269
+ * engine.addEventListener(WorkflowTeardownEvent.type, (event) => {
270
+ * if (event.status === 'dead-lettered') {
271
+ * console.error('LEAKED resource: teardown for', event.workflowId, 'gave up after', event.attempts);
272
+ * } else {
273
+ * console.log('teardown', event.status, 'for', event.workflowId, 'attempt', event.attempts);
274
+ * }
275
+ * });
276
+ * ```
277
+ */
278
+ export declare class WorkflowTeardownEvent extends Event {
279
+ static readonly type: "workflow:teardown";
280
+ readonly workflowId: string;
281
+ readonly workflowType: string;
282
+ readonly status: WorkflowTeardownStatus;
283
+ readonly attempts: number;
284
+ readonly error: string | undefined;
285
+ constructor(workflowId: string, workflowType: string, status: WorkflowTeardownStatus, attempts: number, error?: string);
286
+ }
@@ -1,3 +1,12 @@
1
+ export class WorkflowDefinitionRegisteredEvent extends Event {
2
+ static type = "workflow:definition-registered";
3
+ workflowType;
4
+ constructor(workflowType) {
5
+ super(WorkflowDefinitionRegisteredEvent.type);
6
+ this.workflowType = workflowType;
7
+ }
8
+ }
9
+
1
10
  export class WorkflowStartedEvent extends Event {
2
11
  static type = "workflow:started";
3
12
  workflowId;
@@ -98,3 +107,20 @@ export class WorkflowRecoverySkippedEvent extends Event {
98
107
  this.reason = reason;
99
108
  }
100
109
  }
110
+
111
+ export class WorkflowTeardownEvent extends Event {
112
+ static type = "workflow:teardown";
113
+ workflowId;
114
+ workflowType;
115
+ status;
116
+ attempts;
117
+ error;
118
+ constructor(workflowId, workflowType, status, attempts, error) {
119
+ super(WorkflowTeardownEvent.type);
120
+ this.workflowId = workflowId;
121
+ this.workflowType = workflowType;
122
+ this.status = status;
123
+ this.attempts = attempts;
124
+ this.error = error;
125
+ }
126
+ }
@@ -6,6 +6,8 @@ export const FAILURE_CATEGORIES = [
6
6
  "system"
7
7
  ];
8
8
  const currentFailureCategories = new Set(FAILURE_CATEGORIES), timeoutErrorNames = new Set([
9
+ "ActivityScheduleToCloseTimeoutError",
10
+ "ActivityPerAttemptTimeoutError",
9
11
  "MCPToolTimeoutError",
10
12
  "ReviewTimeoutError",
11
13
  "UpdateTimeoutError",
@@ -23,31 +25,17 @@ const cancellationErrorNames = new Set([
23
25
  "ResourceExhaustedError",
24
26
  "OutOfMemoryError",
25
27
  "StorageQuotaExceededError"
26
- ]), legacyFailureCategoryMapping = {
27
- action: "application",
28
- memory: "resource",
29
- planning: "application",
30
- reflection: "application",
31
- system: "system"
32
- }, failureCategorySearchAliases = {
33
- application: ["application", "action", "planning", "reflection"],
34
- timeout: ["timeout"],
35
- cancellation: ["cancellation"],
36
- resource: ["resource", "memory"],
37
- system: ["system"]
38
- };
28
+ ]);
39
29
  export function isFailureCategory(value) {
40
30
  return currentFailureCategories.has(value);
41
31
  }
42
32
  export function normalizeFailureCategory(value) {
43
33
  if (isFailureCategory(value))
44
34
  return value;
45
- if (typeof value !== "string")
46
- return;
47
- return legacyFailureCategoryMapping[value];
35
+ return;
48
36
  }
49
37
  export function failureCategorySearchValues(category) {
50
- return failureCategorySearchAliases[category];
38
+ return [category];
51
39
  }
52
40
  export function classifyErrorAsFailureCategory(error, options = {}) {
53
41
  if (!(error instanceof Error))
@@ -4,8 +4,10 @@
4
4
  * onto the wire so clients can branch on the failure programmatically rather
5
5
  * than string-matching a human message:
6
6
  *
7
- * - REST: `{ error: { code, message, data? } }` (see `fault-to-http.ts`).
8
- * - JSON-RPC: `data.weftCode` (see `fault-to-json-rpc.ts`).
7
+ * - REST operation routes: HTTP status plus `{ error: string }` for declared
8
+ * faults, with `EngineFailure` masked to `"Internal server error"`.
9
+ * - JSON-RPC: `error.data.weftCode` plus `error.data.httpStatus` (see
10
+ * `fault-to-json-rpc.ts`).
9
11
  *
10
12
  * The type lives in `core` — not `server` — because both the server (which
11
13
  * produces faults) and the client (which consumes them off the wire) need it,
@@ -23,6 +25,9 @@ import type { FailureCategory } from './types/identity.ts';
23
25
  * be added additively, and the `satisfies` map below forces every new code to
24
26
  * declare its failure category at compile time.
25
27
  *
28
+ * See `documentation/reference/api-errors.md#faultcode` for the REST HTTP
29
+ * status and JSON-RPC error-data mappings for every public fault code.
30
+ *
26
31
  * @example
27
32
  * ```ts
28
33
  * import { HttpClientError, type FaultCode } from '@lostgradient/weft';
@@ -34,7 +39,7 @@ import type { FailureCategory } from './types/identity.ts';
34
39
  * void describe;
35
40
  * ```
36
41
  */
37
- export type FaultCode = 'Unauthorized' | 'Forbidden' | 'NotFound' | 'Conflict' | 'Unprocessable' | 'Timeout' | 'NotImplemented' | 'UnsupportedTransport' | 'SubscriptionOverflow' | 'InvalidParams' | 'MethodNotFound' | 'EngineFailure';
42
+ export type FaultCode = 'Unauthorized' | 'Forbidden' | 'NotFound' | 'Conflict' | 'Unprocessable' | 'Timeout' | 'PayloadTooLarge' | 'NotImplemented' | 'UnsupportedTransport' | 'SubscriptionOverflow' | 'InvalidParams' | 'MethodNotFound' | 'EngineFailure';
38
43
  /**
39
44
  * Maps each wire {@link FaultCode} onto a {@link FailureCategory}.
40
45
  *
@@ -61,6 +66,7 @@ export declare const FAULT_CODE_TO_FAILURE_CATEGORY: Readonly<{
61
66
  readonly InvalidParams: "application";
62
67
  readonly MethodNotFound: "application";
63
68
  readonly Timeout: "timeout";
69
+ readonly PayloadTooLarge: "resource";
64
70
  readonly SubscriptionOverflow: "resource";
65
71
  readonly NotImplemented: "system";
66
72
  readonly UnsupportedTransport: "system";
@@ -7,6 +7,7 @@ export const FAULT_CODE_TO_FAILURE_CATEGORY = Object.freeze({
7
7
  InvalidParams: "application",
8
8
  MethodNotFound: "application",
9
9
  Timeout: "timeout",
10
+ PayloadTooLarge: "resource",
10
11
  SubscriptionOverflow: "resource",
11
12
  NotImplemented: "system",
12
13
  UnsupportedTransport: "system",
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Dependency shapes and the context-options builder used by
3
+ * {@link InlineExecutionStrategy}. Kept beside the strategy so the strategy
4
+ * module stays focused on generator lifecycle and context bookkeeping.
5
+ *
6
+ * @module core/inline-execution-strategy.context-options
7
+ */
8
+ import type { ContextOptions } from './context.ts';
9
+ import type { ComposedWorkflowInterceptor } from './interceptor.ts';
10
+ import type { SearchAttributeSchema, WorkflowFunction } from './types.ts';
11
+ import type { WorkflowLogRecord } from './types/workflow-log.ts';
12
+ /** Capabilities the engine injects into the inline strategy at construction. */
13
+ export interface InlineExecutionDependencies {
14
+ getRegistration: (workflowType: string) => {
15
+ handler: WorkflowFunction;
16
+ version: string;
17
+ searchAttributes?: SearchAttributeSchema;
18
+ } | undefined;
19
+ getNow: () => number;
20
+ resolveWorkflowType?: (target: string | Function) => string;
21
+ maxNestingDepth: number;
22
+ development?: boolean;
23
+ getComposedWorkflowInterceptor?: () => ComposedWorkflowInterceptor | null;
24
+ registerCancelHandler?: (workflowId: string, handler: () => Promise<void> | void) => () => void;
25
+ /**
26
+ * Durably record a `ctx.setFinalizerState(value)` payload for a workflow (#446).
27
+ * The engine stages it as a pending atomic side-effect so it commits with the
28
+ * next checkpoint or the terminal batch. Absent in worker mode.
29
+ */
30
+ recordFinalizerState?: (workflowId: string, value: unknown) => void;
31
+ /**
32
+ * Look up the non-serialized per-run `services` value for a workflow, exposed
33
+ * to the body as `ctx.services`. Returns `undefined` when none was supplied.
34
+ */
35
+ getWorkflowServices?: (workflowId: string) => unknown;
36
+ /**
37
+ * The host log sink (`EngineOptions.onLog`) for `ctx.log` records, or
38
+ * `undefined` for the default console behavior. Engine-scoped, so it takes no
39
+ * workflow id.
40
+ */
41
+ getLogSink?: () => ((record: WorkflowLogRecord) => void) | undefined;
42
+ }
43
+ /** A registration resolved through {@link InlineExecutionDependencies.getRegistration}, narrowed to the present case. */
44
+ export type InlineWorkflowRegistration = NonNullable<ReturnType<InlineExecutionDependencies['getRegistration']>>;
45
+ /** Parameters for starting a workflow run on the inline strategy. */
46
+ export type InlineStartWorkflowParameters = {
47
+ workflowId: string;
48
+ workflowType: string;
49
+ input: unknown;
50
+ checkpoint: ArrayBuffer | Uint8Array;
51
+ nestingDepth?: number;
52
+ executionStateOwnerId?: string;
53
+ startedAt?: number;
54
+ sleepReferenceTime?: number;
55
+ deadline?: number;
56
+ headers?: [string, string][];
57
+ };
58
+ /** Build the {@link ContextOptions} for a single inline workflow run from the injected dependencies and start parameters. */
59
+ export declare function createInlineContextOptions(dependencies: InlineExecutionDependencies, registration: InlineWorkflowRegistration, parameters: InlineStartWorkflowParameters, workflowAbort: AbortController): ContextOptions;
60
+ /**
61
+ * Keep only the defined optional inline-strategy dependencies. Under
62
+ * `exactOptionalPropertyTypes` a key set to `undefined` is rejected while an
63
+ * absent key is fine, so each optional is included only when present. Lives here
64
+ * (rather than inline in `createExecutionStrategyBundle`) so its conditional
65
+ * spreads do not tip that function over the cyclomatic-complexity cap.
66
+ */
67
+ export declare function optionalInlineDependencies(candidates: {
68
+ [Key in 'getComposedWorkflowInterceptor' | 'registerCancelHandler' | 'recordFinalizerState' | 'getWorkflowServices' | 'getLogSink']: InlineExecutionDependencies[Key] | undefined;
69
+ }): Partial<InlineExecutionDependencies>;
@@ -0,0 +1,56 @@
1
+ export function createInlineContextOptions(dependencies, registration, parameters, workflowAbort) {
2
+ return {
3
+ workflowId: parameters.workflowId,
4
+ workflowType: parameters.workflowType,
5
+ startedAt: parameters.startedAt ?? dependencies.getNow(),
6
+ abortController: workflowAbort,
7
+ getNow: dependencies.getNow,
8
+ nestingDepth: parameters.nestingDepth ?? 0,
9
+ executionStateOwnerId: parameters.executionStateOwnerId ?? parameters.workflowId,
10
+ ...parameters.sleepReferenceTime !== void 0 && {
11
+ sleepReferenceTime: parameters.sleepReferenceTime
12
+ },
13
+ ...dependencies.resolveWorkflowType !== void 0 && {
14
+ resolveWorkflowType: dependencies.resolveWorkflowType
15
+ },
16
+ ...registration.searchAttributes && {
17
+ searchAttributeSchema: registration.searchAttributes
18
+ },
19
+ ...parameters.deadline !== void 0 && { deadline: parameters.deadline },
20
+ ...resolveWorkflowScopedCallbackOptions(dependencies, parameters.workflowId),
21
+ services: dependencies.getWorkflowServices?.(parameters.workflowId),
22
+ ...resolveLogSinkOption(dependencies)
23
+ };
24
+ }
25
+ function resolveWorkflowScopedCallbackOptions(dependencies, workflowId) {
26
+ const { registerCancelHandler, recordFinalizerState } = dependencies;
27
+ return {
28
+ ...registerCancelHandler !== void 0 && {
29
+ registerCancelHandler: (handler) => registerCancelHandler(workflowId, handler)
30
+ },
31
+ ...recordFinalizerState !== void 0 && {
32
+ recordFinalizerState: (value) => recordFinalizerState(workflowId, value)
33
+ }
34
+ };
35
+ }
36
+ function resolveLogSinkOption(dependencies) {
37
+ const logSink = dependencies.getLogSink?.();
38
+ return logSink === void 0 ? {} : { logSink };
39
+ }
40
+ export function optionalInlineDependencies(candidates) {
41
+ return {
42
+ ...candidates.getComposedWorkflowInterceptor !== void 0 && {
43
+ getComposedWorkflowInterceptor: candidates.getComposedWorkflowInterceptor
44
+ },
45
+ ...candidates.registerCancelHandler !== void 0 && {
46
+ registerCancelHandler: candidates.registerCancelHandler
47
+ },
48
+ ...candidates.recordFinalizerState !== void 0 && {
49
+ recordFinalizerState: candidates.recordFinalizerState
50
+ },
51
+ ...candidates.getWorkflowServices !== void 0 && {
52
+ getWorkflowServices: candidates.getWorkflowServices
53
+ },
54
+ ...candidates.getLogSink !== void 0 && { getLogSink: candidates.getLogSink }
55
+ };
56
+ }
@@ -11,38 +11,8 @@
11
11
  */
12
12
  import { Context } from './context.ts';
13
13
  import type { ExecutionStrategy } from './execution-strategy.ts';
14
- import type { ComposedWorkflowInterceptor } from './interceptor.ts';
15
- import type { FailureCategory, OperationOutcome, SearchAttributeSchema, WorkerOutboundMessage, WorkflowFunction } from './types.ts';
16
- export interface InlineExecutionDependencies {
17
- getRegistration: (workflowType: string) => {
18
- handler: WorkflowFunction;
19
- version: string;
20
- searchAttributes?: SearchAttributeSchema;
21
- } | undefined;
22
- getNow: () => number;
23
- resolveWorkflowType?: (target: string | Function) => string;
24
- maxNestingDepth: number;
25
- development?: boolean;
26
- getComposedWorkflowInterceptor?: () => ComposedWorkflowInterceptor | null;
27
- registerCancelHandler?: (workflowId: string, handler: () => Promise<void> | void) => () => void;
28
- /**
29
- * Look up the non-serialized per-run `services` value for a workflow, exposed
30
- * to the body as `ctx.services`. Returns `undefined` when none was supplied.
31
- */
32
- getWorkflowServices?: (workflowId: string) => unknown;
33
- }
34
- type InlineStartWorkflowParameters = {
35
- workflowId: string;
36
- workflowType: string;
37
- input: unknown;
38
- checkpoint: ArrayBuffer | Uint8Array;
39
- nestingDepth?: number;
40
- executionStateOwnerId?: string;
41
- startedAt?: number;
42
- sleepReferenceTime?: number;
43
- deadline?: number;
44
- headers?: [string, string][];
45
- };
14
+ import type { InlineExecutionDependencies, InlineStartWorkflowParameters } from './inline-execution-strategy.context-options.ts';
15
+ import type { FailureCategory, OperationOutcome, WorkerOutboundMessage } from './types.ts';
46
16
  export declare class InlineExecutionStrategy implements ExecutionStrategy {
47
17
  #private;
48
18
  constructor(dependencies: InlineExecutionDependencies);
@@ -54,8 +24,33 @@ export declare class InlineExecutionStrategy implements ExecutionStrategy {
54
24
  operationResult: OperationOutcome;
55
25
  }): void;
56
26
  cancelWorkflow(workflowId: string): void;
57
- parkWorkflow(workflowId: string): void;
27
+ /**
28
+ * Evict a workflow's in-memory execution state (generator, abort controller,
29
+ * live context, tracked turns/advances).
30
+ *
31
+ * By default this is a hard eviction: nothing about the run stays reachable —
32
+ * which is what the suspend/general teardown path requires. The inline
33
+ * `waitForSignal` parking optimization opts into `retainContext: true` so the
34
+ * run's Context survives in `#parkedContexts` and its `ctx.onQuery` handlers
35
+ * stay callable while the run is parked. Retention is therefore strictly
36
+ * opt-in at the one call site that wants it; every other caller gets eviction.
37
+ */
38
+ parkWorkflow(workflowId: string, options?: {
39
+ retainContext?: boolean;
40
+ }): void;
41
+ /** Returns the live Context for a workflow, or `undefined` if not running. For parked workflows use {@link getParkedContext}. */
58
42
  getContext(workflowId: string): Context | undefined;
43
+ /** Returns the retained Context for a parked workflow, or `undefined` if not parked or already cleaned up. */
44
+ getParkedContext(workflowId: string): Context | undefined;
45
+ /**
46
+ * Drop any retained parked Context for a workflow without touching the abort
47
+ * controller or other live state. Terminal cleanup calls this so a workflow
48
+ * that reached a terminal status while parked (e.g. a failed resume, or normal
49
+ * completion of a run that had parked) cannot keep resolving `ctx.onQuery`
50
+ * handlers from a stale parked Context — and so the Context is not retained
51
+ * for the engine's lifetime.
52
+ */
53
+ clearParkedContext(workflowId: string): void;
59
54
  getAbortController(workflowId: string): AbortController | undefined;
60
55
  waitForWorkflowTurn(workflowId: string): Promise<void> | undefined;
61
56
  waitForWorkflowAdvance(workflowId: string): Promise<void> | undefined;
@@ -71,11 +66,11 @@ export declare class InlineExecutionStrategy implements ExecutionStrategy {
71
66
  */
72
67
  throwIntoWorkflow(workflowId: string, error: unknown, operationFailureCategory?: FailureCategory): void;
73
68
  /**
74
- * Store a context and generator that were created externally (used by
75
- * the engine's resume() path where context setup is more complex).
69
+ * Store a context and generator created externally (engine resume path).
70
+ * Clears any retained parked context so a concurrent query sees the new
71
+ * live context rather than the stale parked one.
76
72
  */
77
73
  adoptWorkflow(workflowId: string, generator: AsyncGenerator, context: Context, abortController: AbortController): void;
78
74
  [Symbol.dispose](): void;
79
75
  [Symbol.asyncDispose](): Promise<void>;
80
76
  }
81
- export {};
@@ -3,38 +3,14 @@ import {
3
3
  classifyErrorAsFailureCategory,
4
4
  errorFromFailedOperationOutcome
5
5
  } from "./failure-categories.js";
6
- function createInlineContextOptions(dependencies, registration, parameters, workflowAbort) {
7
- const { registerCancelHandler } = dependencies;
8
- return {
9
- workflowId: parameters.workflowId,
10
- workflowType: parameters.workflowType,
11
- startedAt: parameters.startedAt ?? dependencies.getNow(),
12
- abortController: workflowAbort,
13
- getNow: dependencies.getNow,
14
- nestingDepth: parameters.nestingDepth ?? 0,
15
- executionStateOwnerId: parameters.executionStateOwnerId ?? parameters.workflowId,
16
- ...parameters.sleepReferenceTime !== void 0 && {
17
- sleepReferenceTime: parameters.sleepReferenceTime
18
- },
19
- ...dependencies.resolveWorkflowType !== void 0 && {
20
- resolveWorkflowType: dependencies.resolveWorkflowType
21
- },
22
- ...registration.searchAttributes && {
23
- searchAttributeSchema: registration.searchAttributes
24
- },
25
- ...parameters.deadline !== void 0 && { deadline: parameters.deadline },
26
- ...registerCancelHandler !== void 0 && {
27
- registerCancelHandler: (handler) => registerCancelHandler(parameters.workflowId, handler)
28
- },
29
- services: dependencies.getWorkflowServices?.(parameters.workflowId)
30
- };
31
- }
6
+ import { createInlineContextOptions } from "./inline-execution-strategy.context-options.js";
32
7
 
33
8
  export class InlineExecutionStrategy {
34
9
  #dependencies;
35
10
  #generators;
36
11
  #abortControllers;
37
12
  #contexts;
13
+ #parkedContexts;
38
14
  #workflowAdvances;
39
15
  #workflowTurns;
40
16
  #messageHandler;
@@ -43,6 +19,7 @@ export class InlineExecutionStrategy {
43
19
  this.#generators = new Map;
44
20
  this.#abortControllers = new Map;
45
21
  this.#contexts = new Map;
22
+ this.#parkedContexts = new Map;
46
23
  this.#workflowAdvances = new Map;
47
24
  this.#workflowTurns = new Map;
48
25
  this.#messageHandler = null;
@@ -93,12 +70,21 @@ export class InlineExecutionStrategy {
93
70
  abortController.abort();
94
71
  this.#cleanup(workflowId);
95
72
  }
96
- parkWorkflow(workflowId) {
73
+ parkWorkflow(workflowId, options) {
74
+ const context = options?.retainContext ? this.#contexts.get(workflowId) ?? this.#parkedContexts.get(workflowId) : void 0;
97
75
  this.#cleanup(workflowId);
76
+ if (context !== void 0)
77
+ this.#parkedContexts.set(workflowId, context);
98
78
  }
99
79
  getContext(workflowId) {
100
80
  return this.#contexts.get(workflowId);
101
81
  }
82
+ getParkedContext(workflowId) {
83
+ return this.#parkedContexts.get(workflowId);
84
+ }
85
+ clearParkedContext(workflowId) {
86
+ this.#parkedContexts.delete(workflowId);
87
+ }
102
88
  getAbortController(workflowId) {
103
89
  return this.#abortControllers.get(workflowId);
104
90
  }
@@ -124,6 +110,7 @@ export class InlineExecutionStrategy {
124
110
  this.#throwIntoGenerator(workflowId, generator, error, operationFailureCategory);
125
111
  }
126
112
  adoptWorkflow(workflowId, generator, context, abortController) {
113
+ this.#parkedContexts.delete(workflowId);
127
114
  this.#generators.set(workflowId, generator);
128
115
  this.#contexts.set(workflowId, context);
129
116
  this.#abortControllers.set(workflowId, abortController);
@@ -132,6 +119,7 @@ export class InlineExecutionStrategy {
132
119
  this.#generators.clear();
133
120
  this.#abortControllers.clear();
134
121
  this.#contexts.clear();
122
+ this.#parkedContexts.clear();
135
123
  this.#workflowAdvances.clear();
136
124
  this.#workflowTurns.clear();
137
125
  this.#messageHandler = null;
@@ -257,6 +245,7 @@ export class InlineExecutionStrategy {
257
245
  this.#generators.delete(workflowId);
258
246
  this.#abortControllers.delete(workflowId);
259
247
  this.#contexts.delete(workflowId);
248
+ this.#parkedContexts.delete(workflowId);
260
249
  if (!options?.preserveTrackedAdvance)
261
250
  this.#workflowAdvances.delete(workflowId);
262
251
  if (!options?.preserveTrackedTurn)
@@ -11,7 +11,7 @@
11
11
  import { z } from 'zod';
12
12
  import { isFailureCategory } from './failure-categories.ts';
13
13
  import type { FailureCategory, WorkflowStatus } from './types/identity.ts';
14
- import type { ListFilter } from './types/options.ts';
14
+ import type { ListFilter } from './types/list-options.ts';
15
15
  import { WeftError } from './weft-error.ts';
16
16
  /**
17
17
  * Concrete object schema for {@link ListFilter}. Supports `.omit()` and
@@ -4,7 +4,7 @@ import { WeftError } from './weft-error.ts';
4
4
  * {@link PayloadSizeExceededError} message so operators can tell which
5
5
  * admission point rejected the value.
6
6
  */
7
- export type PayloadKind = 'workflow input' | 'signal payload' | 'activity result';
7
+ export type PayloadKind = 'workflow input' | 'signal payload' | 'activity result' | 'finalizer state';
8
8
  /**
9
9
  * Thrown at admission when a payload's serialized (codec-encoded) size exceeds
10
10
  * the operator-configured {@link PayloadSizePolicy.maxBytes}. The rejection