@lostgradient/weft 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/README.md +123 -43
  2. package/dist/cli/conformance.js +7 -1
  3. package/dist/cli/generated/operation-client.generated.d.ts +55 -13
  4. package/dist/cli/generated/operation-client.generated.js +3 -0
  5. package/dist/cli/help-text.d.ts +1 -1
  6. package/dist/cli/help-text.js +1 -0
  7. package/dist/cli/operation-catalog-snapshot.d.ts +8 -0
  8. package/dist/cli/operation-catalog-snapshot.js +11 -0
  9. package/dist/cli/parse-schedule-arguments.js +3 -1
  10. package/dist/cli/schedule.js +2 -1
  11. package/dist/cli/types.d.ts +1 -0
  12. package/dist/cli-main.js +80 -79
  13. package/dist/client/handle-delegation.d.ts +7 -2
  14. package/dist/client/handle-delegation.js +9 -1
  15. package/dist/client/http-client-requests.d.ts +4 -1
  16. package/dist/client/http-client-requests.js +10 -0
  17. package/dist/client/http-client.d.ts +10 -4
  18. package/dist/client/http-client.js +18 -1
  19. package/dist/client/http-request.d.ts +11 -1
  20. package/dist/client/http-request.js +17 -7
  21. package/dist/client/index.d.ts +1 -1
  22. package/dist/client/interface.d.ts +100 -4
  23. package/dist/client/local.d.ts +7 -1
  24. package/dist/client/local.js +17 -2
  25. package/dist/client/start-body.d.ts +9 -2
  26. package/dist/client/start-body.js +13 -4
  27. package/dist/core/byte-arrays.d.ts +5 -0
  28. package/dist/core/byte-arrays.js +5 -0
  29. package/dist/core/checkpoint/lifecycle.d.ts +3 -0
  30. package/dist/core/checkpoint/lifecycle.js +9 -4
  31. package/dist/core/checkpoint/serialization.js +12 -5
  32. package/dist/core/codec/extension-codec.d.ts +16 -0
  33. package/dist/core/codec/extension-codec.js +104 -8
  34. package/dist/core/codec/index.d.ts +1 -0
  35. package/dist/core/codec/index.js +1 -0
  36. package/dist/core/codec/serializer-registry.d.ts +122 -0
  37. package/dist/core/codec/serializer-registry.js +51 -0
  38. package/dist/core/context/activity-retry-state.d.ts +38 -0
  39. package/dist/core/context/activity-retry-state.js +89 -0
  40. package/dist/core/context/activity-schedule-to-close.d.ts +159 -0
  41. package/dist/core/context/activity-schedule-to-close.js +69 -0
  42. package/dist/core/context/child-workflow-pipe.d.ts +5 -5
  43. package/dist/core/context/child-workflow-pipe.js +15 -2
  44. package/dist/core/context/context-presence.d.ts +19 -0
  45. package/dist/core/context/context-presence.js +13 -0
  46. package/dist/core/context/durable-operations.d.ts +25 -0
  47. package/dist/core/context/durable-operations.js +64 -0
  48. package/dist/core/context/index.d.ts +18 -5
  49. package/dist/core/context/index.js +17 -12
  50. package/dist/core/context/internals.d.ts +29 -0
  51. package/dist/core/context/internals.js +6 -1
  52. package/dist/core/context/operation-request.d.ts +35 -0
  53. package/dist/core/context/parallel-cache-entry.d.ts +14 -5
  54. package/dist/core/context/run-operation.d.ts +21 -3
  55. package/dist/core/context/run-operation.js +56 -93
  56. package/dist/core/context/session-state.js +7 -8
  57. package/dist/core/context/speculative-child.js +2 -0
  58. package/dist/core/context/types.d.ts +15 -0
  59. package/dist/core/context/version-patching.d.ts +8 -0
  60. package/dist/core/context/version-patching.js +40 -0
  61. package/dist/core/context/workflow-logger.d.ts +98 -0
  62. package/dist/core/context/workflow-logger.js +68 -0
  63. package/dist/core/engine/activity-heartbeat-tracking.d.ts +64 -0
  64. package/dist/core/engine/activity-heartbeat-tracking.js +42 -0
  65. package/dist/core/engine/activity-per-attempt-timeout.d.ts +41 -0
  66. package/dist/core/engine/activity-per-attempt-timeout.js +36 -0
  67. package/dist/core/engine/activity-reconciliation.d.ts +1 -0
  68. package/dist/core/engine/activity-reconciliation.js +12 -1
  69. package/dist/core/engine/activity-resolution.d.ts +23 -0
  70. package/dist/core/engine/activity-resolution.js +37 -0
  71. package/dist/core/engine/aggregate.js +66 -30
  72. package/dist/core/engine/async-activity-completion.d.ts +23 -6
  73. package/dist/core/engine/async-activity-completion.js +53 -12
  74. package/dist/core/engine/attributes-tags.js +9 -4
  75. package/dist/core/engine/bulk-operations-purge.d.ts +26 -0
  76. package/dist/core/engine/bulk-operations-purge.js +38 -3
  77. package/dist/core/engine/bulk-operations-shared.d.ts +2 -0
  78. package/dist/core/engine/bulk-operations-shared.js +8 -2
  79. package/dist/core/engine/bulk-operations.d.ts +4 -1
  80. package/dist/core/engine/bulk-operations.js +235 -24
  81. package/dist/core/engine/callback-creators-bundles.d.ts +9 -0
  82. package/dist/core/engine/callback-creators-bundles.js +30 -2
  83. package/dist/core/engine/callback-creators-core.js +6 -4
  84. package/dist/core/engine/callback-creators-router.js +10 -0
  85. package/dist/core/engine/callback-creators-schedule.d.ts +2 -2
  86. package/dist/core/engine/callback-creators-schedule.js +12 -8
  87. package/dist/core/engine/candidate-read-batching.d.ts +6 -0
  88. package/dist/core/engine/candidate-read-batching.js +1 -0
  89. package/dist/core/engine/checkpoint-io.js +61 -25
  90. package/dist/core/engine/checkpoint-reads.js +3 -2
  91. package/dist/core/engine/checkpoint-replay.d.ts +20 -0
  92. package/dist/core/engine/checkpoint-replay.js +242 -0
  93. package/dist/core/engine/checkpoint-side-effects.d.ts +23 -0
  94. package/dist/core/engine/checkpoint-side-effects.js +35 -0
  95. package/dist/core/engine/child-workflow-cancellation.d.ts +10 -0
  96. package/dist/core/engine/child-workflow-cancellation.js +40 -0
  97. package/dist/core/engine/child-workflow.js +27 -4
  98. package/dist/core/engine/condition-waiters.d.ts +14 -0
  99. package/dist/core/engine/condition-waiters.js +5 -0
  100. package/dist/core/engine/construction.d.ts +3 -1
  101. package/dist/core/engine/construction.js +30 -8
  102. package/dist/core/engine/coordination-branch-executors.d.ts +70 -0
  103. package/dist/core/engine/coordination-branch-executors.js +107 -0
  104. package/dist/core/engine/deferred-consume-envelope.d.ts +59 -0
  105. package/dist/core/engine/deferred-consume-envelope.js +14 -0
  106. package/dist/core/engine/disposal.js +25 -0
  107. package/dist/core/engine/engine-create-types.d.ts +14 -18
  108. package/dist/core/engine/engine-internal-types.d.ts +38 -3
  109. package/dist/core/engine/engine-leak-warnings.d.ts +6 -0
  110. package/dist/core/engine/engine-leak-warnings.js +4 -0
  111. package/dist/core/engine/engine-runtime-helpers.d.ts +17 -0
  112. package/dist/core/engine/engine-runtime-helpers.js +26 -5
  113. package/dist/core/engine/errors.d.ts +121 -0
  114. package/dist/core/engine/errors.js +45 -1
  115. package/dist/core/engine/event-log-compaction.d.ts +8 -0
  116. package/dist/core/engine/event-log-compaction.js +20 -2
  117. package/dist/core/engine/fenced-write.d.ts +65 -0
  118. package/dist/core/engine/fenced-write.js +71 -0
  119. package/dist/core/engine/finalizer-state.d.ts +28 -0
  120. package/dist/core/engine/finalizer-state.js +16 -0
  121. package/dist/core/engine/handle-result.js +1 -1
  122. package/dist/core/engine/handles.d.ts +97 -40
  123. package/dist/core/engine/handles.js +25 -27
  124. package/dist/core/engine/index.d.ts +125 -15
  125. package/dist/core/engine/index.js +207 -11
  126. package/dist/core/engine/inline-launch-queue.d.ts +14 -0
  127. package/dist/core/engine/inline-launch-queue.js +32 -7
  128. package/dist/core/engine/inline-parking.js +3 -2
  129. package/dist/core/engine/internals.d.ts +125 -13
  130. package/dist/core/engine/lease-codec.d.ts +35 -0
  131. package/dist/core/engine/lease-codec.js +32 -0
  132. package/dist/core/engine/lease-deposition.d.ts +66 -0
  133. package/dist/core/engine/lease-deposition.js +10 -0
  134. package/dist/core/engine/lease-errors.d.ts +99 -0
  135. package/dist/core/engine/lease-errors.js +30 -0
  136. package/dist/core/engine/lease-manager.d.ts +114 -0
  137. package/dist/core/engine/lease-manager.js +135 -0
  138. package/dist/core/engine/lifecycle/fork-helpers.js +1 -7
  139. package/dist/core/engine/lifecycle/persist.js +15 -52
  140. package/dist/core/engine/lifecycle/recovered-services.d.ts +8 -6
  141. package/dist/core/engine/lifecycle/recovered-services.js +18 -3
  142. package/dist/core/engine/lifecycle/resume.js +39 -11
  143. package/dist/core/engine/lifecycle/shared.d.ts +8 -1
  144. package/dist/core/engine/lifecycle/start-batch.d.ts +1 -1
  145. package/dist/core/engine/lifecycle/start-batch.js +2 -1
  146. package/dist/core/engine/lifecycle/start-commit.d.ts +56 -0
  147. package/dist/core/engine/lifecycle/start-commit.js +69 -0
  148. package/dist/core/engine/lifecycle/start-exec.d.ts +30 -2
  149. package/dist/core/engine/lifecycle/start-exec.js +38 -0
  150. package/dist/core/engine/lifecycle/start-or-signal-create.d.ts +58 -0
  151. package/dist/core/engine/lifecycle/start-or-signal-create.js +95 -0
  152. package/dist/core/engine/lifecycle/start-or-signal-resolution.d.ts +79 -0
  153. package/dist/core/engine/lifecycle/start-or-signal-resolution.js +60 -0
  154. package/dist/core/engine/lifecycle/start-or-signal.d.ts +46 -0
  155. package/dist/core/engine/lifecycle/start-or-signal.js +71 -0
  156. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +39 -0
  157. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +28 -0
  158. package/dist/core/engine/lifecycle/start.d.ts +6 -6
  159. package/dist/core/engine/lifecycle/start.js +47 -45
  160. package/dist/core/engine/lifecycle/transition.js +17 -5
  161. package/dist/core/engine/lifecycle.d.ts +3 -2
  162. package/dist/core/engine/lifecycle.js +9 -2
  163. package/dist/core/engine/list-candidate-resolution.js +2 -2
  164. package/dist/core/engine/listing.js +10 -6
  165. package/dist/core/engine/operations-activity.d.ts +4 -11
  166. package/dist/core/engine/operations-activity.js +22 -49
  167. package/dist/core/engine/operations-coordination.d.ts +10 -0
  168. package/dist/core/engine/operations-coordination.js +43 -8
  169. package/dist/core/engine/operations-router.d.ts +6 -0
  170. package/dist/core/engine/operations-router.js +2 -0
  171. package/dist/core/engine/operations-speculate.js +6 -2
  172. package/dist/core/engine/operations-stream.js +12 -2
  173. package/dist/core/engine/operations-time.d.ts +4 -2
  174. package/dist/core/engine/operations-time.js +14 -2
  175. package/dist/core/engine/operations-wait-condition.d.ts +23 -0
  176. package/dist/core/engine/operations-wait-condition.js +62 -0
  177. package/dist/core/engine/ownership-options.d.ts +23 -0
  178. package/dist/core/engine/ownership-options.js +26 -0
  179. package/dist/core/engine/payload-size-policy.d.ts +3 -0
  180. package/dist/core/engine/payload-size-policy.js +4 -0
  181. package/dist/core/engine/pending-updates.d.ts +17 -0
  182. package/dist/core/engine/pending-updates.js +33 -11
  183. package/dist/core/engine/persisted-data-version.d.ts +5 -9
  184. package/dist/core/engine/persisted-data-version.js +4 -5
  185. package/dist/core/engine/queries.js +1 -1
  186. package/dist/core/engine/registration.d.ts +1 -0
  187. package/dist/core/engine/registration.js +18 -3
  188. package/dist/core/engine/schedule-handle.d.ts +45 -0
  189. package/dist/core/engine/schedule-handle.js +26 -0
  190. package/dist/core/engine/schedule-jitter.d.ts +5 -0
  191. package/dist/core/engine/schedule-jitter.js +10 -0
  192. package/dist/core/engine/schedule-run.d.ts +17 -0
  193. package/dist/core/engine/schedule-run.js +38 -0
  194. package/dist/core/engine/schedule-timer.js +81 -17
  195. package/dist/core/engine/schedules.d.ts +8 -5
  196. package/dist/core/engine/schedules.js +44 -19
  197. package/dist/core/engine/search-attribute-records.d.ts +4 -0
  198. package/dist/core/engine/search-attribute-records.js +17 -0
  199. package/dist/core/engine/second-instance-detector.d.ts +96 -0
  200. package/dist/core/engine/second-instance-detector.js +108 -0
  201. package/dist/core/engine/signals.d.ts +38 -0
  202. package/dist/core/engine/signals.js +55 -19
  203. package/dist/core/engine/state-utilities.d.ts +49 -2
  204. package/dist/core/engine/state-utilities.js +114 -3
  205. package/dist/core/engine/storage-io.d.ts +16 -2
  206. package/dist/core/engine/storage-io.js +26 -5
  207. package/dist/core/engine/stream-chunk-loading.d.ts +2 -0
  208. package/dist/core/engine/stream-chunk-loading.js +24 -1
  209. package/dist/core/engine/sub-operation.js +22 -3
  210. package/dist/core/engine/termination/cleanup.d.ts +28 -1
  211. package/dist/core/engine/termination/cleanup.js +44 -2
  212. package/dist/core/engine/termination/complete.js +48 -9
  213. package/dist/core/engine/termination/finalizer-activity.d.ts +53 -0
  214. package/dist/core/engine/termination/finalizer-activity.js +30 -0
  215. package/dist/core/engine/termination/finalizer-claim.d.ts +110 -0
  216. package/dist/core/engine/termination/finalizer-claim.js +80 -0
  217. package/dist/core/engine/termination/finalizer.d.ts +48 -0
  218. package/dist/core/engine/termination/finalizer.js +159 -0
  219. package/dist/core/engine/termination/suspend.d.ts +70 -0
  220. package/dist/core/engine/termination/suspend.js +41 -0
  221. package/dist/core/engine/termination.d.ts +5 -2
  222. package/dist/core/engine/termination.js +6 -0
  223. package/dist/core/engine/updates.js +5 -25
  224. package/dist/core/engine/validation/schedule.d.ts +2 -1
  225. package/dist/core/engine/validation/schedule.js +51 -2
  226. package/dist/core/engine/validation.js +54 -3
  227. package/dist/core/engine/waiting-update-response.d.ts +8 -0
  228. package/dist/core/engine/waiting-update-response.js +22 -0
  229. package/dist/core/engine/workflow-concurrency.d.ts +10 -0
  230. package/dist/core/engine/workflow-concurrency.js +136 -0
  231. package/dist/core/engine/workflow-feed.d.ts +9 -8
  232. package/dist/core/engine/workflow-feed.js +4 -1
  233. package/dist/core/engine/workflow-indexes.d.ts +9 -0
  234. package/dist/core/engine/workflow-indexes.js +10 -0
  235. package/dist/core/engine/workflow-state-stream.js +33 -13
  236. package/dist/core/engine/workflow-visibility-queries.d.ts +2 -2
  237. package/dist/core/engine-helpers.js +1 -0
  238. package/dist/core/events/activity-events.d.ts +43 -12
  239. package/dist/core/events/activity-events.js +28 -0
  240. package/dist/core/events/attribute-events.d.ts +2 -3
  241. package/dist/core/events/event-map.d.ts +19 -12
  242. package/dist/core/events/index.d.ts +1 -0
  243. package/dist/core/events/index.js +1 -0
  244. package/dist/core/events/schedule-events.d.ts +71 -0
  245. package/dist/core/events/schedule-events.js +29 -0
  246. package/dist/core/events/signal-events.d.ts +4 -6
  247. package/dist/core/events/system-events.d.ts +29 -19
  248. package/dist/core/events/system-events.js +26 -0
  249. package/dist/core/events/update-events.d.ts +6 -8
  250. package/dist/core/events/workflow-events.d.ts +108 -20
  251. package/dist/core/events/workflow-events.js +35 -0
  252. package/dist/core/failure-categories.js +5 -17
  253. package/dist/core/fault-code.d.ts +9 -3
  254. package/dist/core/fault-code.js +1 -0
  255. package/dist/core/inline-execution-strategy.context-options.d.ts +69 -0
  256. package/dist/core/inline-execution-strategy.context-options.js +56 -0
  257. package/dist/core/inline-execution-strategy.d.ts +31 -36
  258. package/dist/core/inline-execution-strategy.js +16 -27
  259. package/dist/core/list-filter-validation.d.ts +1 -1
  260. package/dist/core/list-filter-validation.js +2 -1
  261. package/dist/core/payload-size.d.ts +1 -1
  262. package/dist/core/persisted-data-incompatible-error.d.ts +9 -7
  263. package/dist/core/review/events.d.ts +6 -8
  264. package/dist/core/scheduler/scheduler-class.d.ts +10 -1
  265. package/dist/core/scheduler/scheduler-class.js +38 -11
  266. package/dist/core/scheduler/timer-batch.js +9 -1
  267. package/dist/core/scheduler/timer-sources.d.ts +1 -0
  268. package/dist/core/scheduler/timer-sources.js +11 -5
  269. package/dist/core/session-state.d.ts +0 -1
  270. package/dist/core/session-state.js +2 -2
  271. package/dist/core/start-workflow-validation.d.ts +56 -0
  272. package/dist/core/start-workflow-validation.js +30 -1
  273. package/dist/core/step-context.d.ts +10 -6
  274. package/dist/core/step-context.js +7 -15
  275. package/dist/core/types/activity-verification.d.ts +67 -0
  276. package/dist/core/types/activity-verification.js +0 -0
  277. package/dist/core/types/activity.d.ts +86 -64
  278. package/dist/core/types/bulk.d.ts +50 -9
  279. package/dist/core/types/checkpoint.d.ts +44 -8
  280. package/dist/core/types/identity.d.ts +8 -1
  281. package/dist/core/types/launch-metadata.d.ts +33 -0
  282. package/dist/core/types/launch-metadata.js +0 -0
  283. package/dist/core/types/list-options.d.ts +146 -0
  284. package/dist/core/types/list-options.js +0 -0
  285. package/dist/core/types/message-handles.d.ts +25 -0
  286. package/dist/core/types/options.d.ts +165 -215
  287. package/dist/core/types/reviews.d.ts +2 -1
  288. package/dist/core/types/schedules.d.ts +39 -3
  289. package/dist/core/types/services-resolution.d.ts +47 -0
  290. package/dist/core/types/services-resolution.js +0 -0
  291. package/dist/core/types/state.d.ts +11 -11
  292. package/dist/core/types/workflow-builder-runtime.d.ts +12 -3
  293. package/dist/core/types/workflow-builder-runtime.js +11 -2
  294. package/dist/core/types/workflow-builder.d.ts +47 -15
  295. package/dist/core/types/workflow-concurrency.d.ts +39 -0
  296. package/dist/core/types/workflow-concurrency.js +0 -0
  297. package/dist/core/types/workflow-context.d.ts +157 -14
  298. package/dist/core/types/workflow-definition.d.ts +53 -10
  299. package/dist/core/types/workflow-function.d.ts +101 -9
  300. package/dist/core/types/workflow-log.d.ts +98 -0
  301. package/dist/core/types/workflow-log.js +0 -0
  302. package/dist/core/types/workflow-registries.d.ts +14 -3
  303. package/dist/core/types/workflow-registry.d.ts +3 -0
  304. package/dist/core/types/workflow-snapshot.d.ts +29 -0
  305. package/dist/core/types/workflow-snapshot.js +0 -0
  306. package/dist/core/types.d.ts +7 -0
  307. package/dist/core/types.js +7 -0
  308. package/dist/core/versioning.d.ts +9 -39
  309. package/dist/core/versioning.js +2 -12
  310. package/dist/core/weft-error.d.ts +44 -1
  311. package/dist/core/weft-error.js +19 -1
  312. package/dist/core/worker-execution-strategy-options.d.ts +26 -0
  313. package/dist/core/worker-execution-strategy.js +40 -36
  314. package/dist/core/worker-inbound-message.d.ts +38 -0
  315. package/dist/core/worker-inbound-message.js +37 -0
  316. package/dist/core/worker-log-abuse-counter.d.ts +175 -0
  317. package/dist/core/worker-log-abuse-counter.js +107 -0
  318. package/dist/core/worker-message-helpers.d.ts +47 -0
  319. package/dist/core/worker-message-helpers.js +26 -0
  320. package/dist/core/worker-protocol-guard.js +1 -1
  321. package/dist/core/worker-protocol-log.d.ts +56 -0
  322. package/dist/core/worker-protocol-log.js +18 -0
  323. package/dist/core/worker-protocol.d.ts +23 -0
  324. package/dist/core/worker-protocol.js +12 -2
  325. package/dist/core/workflow-version-tuple.d.ts +3 -9
  326. package/dist/core/workflow-version-tuple.js +2 -3
  327. package/dist/diagnostics/doctor.js +6 -3
  328. package/dist/diagnostics/format.js +3 -8
  329. package/dist/diagnostics/types.d.ts +5 -5
  330. package/dist/diagnostics/validate.d.ts +0 -1
  331. package/dist/diagnostics/version-check.d.ts +1 -1
  332. package/dist/diagnostics/version-check.js +10 -13
  333. package/dist/index.d.ts +13 -11
  334. package/dist/index.js +39 -4
  335. package/dist/json-schema.js +3 -3
  336. package/dist/mcp/cli.js +35 -35
  337. package/dist/mcp/dispatcher.js +1 -1
  338. package/dist/mcp/http.js +16 -6
  339. package/dist/mcp/list-filter.js +2 -1
  340. package/dist/mcp/protocol.d.ts +2 -0
  341. package/dist/mcp/protocol.js +1 -1
  342. package/dist/mcp/session.d.ts +16 -0
  343. package/dist/mcp/session.js +60 -6
  344. package/dist/mcp/tools.js +73 -6
  345. package/dist/observability/index.js +2 -2
  346. package/dist/server/asyncapi-channels.js +5 -2
  347. package/dist/server/attribute-filters.d.ts +8 -3
  348. package/dist/server/attribute-filters.js +6 -1
  349. package/dist/server/authentication/api-key.d.ts +2 -1
  350. package/dist/server/authentication/api-key.js +5 -2
  351. package/dist/server/authentication/constant-time-api-key.d.ts +15 -0
  352. package/dist/server/authentication/constant-time-api-key.js +24 -0
  353. package/dist/server/authentication/index.d.ts +1 -1
  354. package/dist/server/authentication/index.js +7 -4
  355. package/dist/server/authentication/rotating-api-key-store.d.ts +5 -3
  356. package/dist/server/authentication/rotating-api-key-store.js +19 -11
  357. package/dist/server/engine-event-feed-backend.d.ts +4 -5
  358. package/dist/server/fault-to-http.js +8 -1
  359. package/dist/server/fault-to-json-rpc.js +1 -0
  360. package/dist/server/fleet-event-feed.d.ts +31 -0
  361. package/dist/server/fleet-event-feed.js +157 -0
  362. package/dist/server/handler/index.js +1 -1
  363. package/dist/server/handler/response-helpers.js +2 -1
  364. package/dist/server/handler/route-dispatch.d.ts +6 -3
  365. package/dist/server/handler/route-dispatch.js +2 -2
  366. package/dist/server/handler.js +31 -31
  367. package/dist/server/index.d.ts +32 -2
  368. package/dist/server/index.js +35 -35
  369. package/dist/server/interactive-operations.js +1 -0
  370. package/dist/server/json-rpc-transport-helpers.d.ts +1 -0
  371. package/dist/server/json-rpc-transport-helpers.js +2 -1
  372. package/dist/server/json-rpc-websocket-runtime.d.ts +11 -2
  373. package/dist/server/json-rpc-websocket-runtime.js +1 -0
  374. package/dist/server/json-rpc-websocket-subscriptions.d.ts +10 -0
  375. package/dist/server/json-rpc-websocket-subscriptions.js +29 -0
  376. package/dist/server/json-rpc-websocket-types.d.ts +22 -0
  377. package/dist/server/json-rpc-websocket-types.js +0 -0
  378. package/dist/server/json-rpc-websocket-validation.js +20 -4
  379. package/dist/server/json-rpc-websocket.d.ts +2 -43
  380. package/dist/server/json-rpc-websocket.js +57 -74
  381. package/dist/server/openapi.d.ts +2 -1
  382. package/dist/server/openapi.js +1 -3
  383. package/dist/server/openrpc-document-schema.d.ts +78 -0
  384. package/dist/server/openrpc-document-schema.js +27 -1
  385. package/dist/server/openrpc-errors.d.ts +3 -0
  386. package/dist/server/openrpc-errors.js +2 -1
  387. package/dist/server/openrpc.js +32 -0
  388. package/dist/server/operation-catalog/index.d.ts +1 -1
  389. package/dist/server/operation-catalog/pipeline-helpers.js +1 -0
  390. package/dist/server/operation-catalog/pipeline-stages.js +26 -12
  391. package/dist/server/operation-catalog/pipeline.js +8 -1
  392. package/dist/server/operation-catalog/registry.js +13 -0
  393. package/dist/server/operation-catalog/types.d.ts +20 -9
  394. package/dist/server/operation-fault.d.ts +10 -0
  395. package/dist/server/operation-fault.js +2 -0
  396. package/dist/server/operation-registry.d.ts +12 -11
  397. package/dist/server/operation-registry.js +12 -3
  398. package/dist/server/operations/aggregate-workflows.d.ts +15 -15
  399. package/dist/server/operations/async-activity.d.ts +2 -2
  400. package/dist/server/operations/async-activity.js +12 -7
  401. package/dist/server/operations/bulk-cancel-workflows.d.ts +1 -1
  402. package/dist/server/operations/bulk-cancel-workflows.js +2 -2
  403. package/dist/server/operations/bulk-delete-workflows.d.ts +1 -1
  404. package/dist/server/operations/bulk-delete-workflows.js +2 -2
  405. package/dist/server/operations/bulk-filter-helpers.d.ts +8 -6
  406. package/dist/server/operations/bulk-filter-helpers.js +54 -24
  407. package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +11 -9
  408. package/dist/server/operations/bulk-mutate-workflow-tags.js +2 -2
  409. package/dist/server/operations/bulk-operation-helpers.d.ts +2 -2
  410. package/dist/server/operations/bulk-retry-failed-workflows.d.ts +7 -0
  411. package/dist/server/operations/bulk-retry-failed-workflows.js +64 -0
  412. package/dist/server/operations/bulk-signal-workflows.d.ts +11 -9
  413. package/dist/server/operations/bulk-signal-workflows.js +2 -2
  414. package/dist/server/operations/cancel-schedule.d.ts +1 -1
  415. package/dist/server/operations/create-schedule.d.ts +3 -1
  416. package/dist/server/operations/create-schedule.js +29 -11
  417. package/dist/server/operations/fleet-events-subscription.d.ts +54 -0
  418. package/dist/server/operations/fleet-events-subscription.js +99 -0
  419. package/dist/server/operations/fork-workflow.d.ts +1 -1
  420. package/dist/server/operations/fork-workflow.js +3 -2
  421. package/dist/server/operations/get-checkpoint-at.d.ts +1 -1
  422. package/dist/server/operations/get-registry.d.ts +1 -1
  423. package/dist/server/operations/get-retention-overview.d.ts +1 -1
  424. package/dist/server/operations/get-review.d.ts +1 -1
  425. package/dist/server/operations/get-schedule.d.ts +1 -1
  426. package/dist/server/operations/get-stream-chunks.d.ts +1 -1
  427. package/dist/server/operations/get-system-metrics.d.ts +2 -2
  428. package/dist/server/operations/get-task-diagnostics.d.ts +45 -6
  429. package/dist/server/operations/get-task-diagnostics.js +101 -7
  430. package/dist/server/operations/get-update-result.d.ts +1 -1
  431. package/dist/server/operations/get-workflow-attributes.d.ts +1 -1
  432. package/dist/server/operations/get-workflow-events.d.ts +1 -1
  433. package/dist/server/operations/get-workflow-result.d.ts +1 -1
  434. package/dist/server/operations/get-workflow-timeline.d.ts +1 -1
  435. package/dist/server/operations/get-workflow.d.ts +1 -1
  436. package/dist/server/operations/list-checkpoints.d.ts +1 -1
  437. package/dist/server/operations/list-reviews.d.ts +1 -1
  438. package/dist/server/operations/list-schedules.d.ts +1 -1
  439. package/dist/server/operations/list-task-queues.d.ts +2 -2
  440. package/dist/server/operations/list-workers.d.ts +2 -2
  441. package/dist/server/operations/list-workflows.d.ts +1 -1
  442. package/dist/server/operations/operation-helpers.d.ts +16 -1
  443. package/dist/server/operations/operation-helpers.js +15 -3
  444. package/dist/server/operations/pause-schedule.d.ts +1 -1
  445. package/dist/server/operations/purge-workflows.d.ts +5 -5
  446. package/dist/server/operations/purge-workflows.js +2 -2
  447. package/dist/server/operations/query-workflow.d.ts +1 -1
  448. package/dist/server/operations/query-workflow.js +3 -2
  449. package/dist/server/operations/recover-all.d.ts +1 -1
  450. package/dist/server/operations/replay-workflow.d.ts +1 -1
  451. package/dist/server/operations/resume-schedule.d.ts +1 -1
  452. package/dist/server/operations/resume-workflow.js +2 -2
  453. package/dist/server/operations/set-workflow-attributes.d.ts +1 -1
  454. package/dist/server/operations/set-workflow-attributes.js +6 -3
  455. package/dist/server/operations/signal-workflow.js +8 -3
  456. package/dist/server/operations/single-workflow-tag-mutation.js +13 -3
  457. package/dist/server/operations/start-or-signal-workflow.d.ts +44 -0
  458. package/dist/server/operations/start-or-signal-workflow.js +130 -0
  459. package/dist/server/operations/start-workflow-options.d.ts +38 -0
  460. package/dist/server/operations/start-workflow-options.js +63 -0
  461. package/dist/server/operations/start-workflow-rest-input.d.ts +14 -0
  462. package/dist/server/operations/start-workflow-rest-input.js +31 -0
  463. package/dist/server/operations/start-workflow.d.ts +1 -1
  464. package/dist/server/operations/start-workflow.js +15 -92
  465. package/dist/server/operations/storage.d.ts +6 -6
  466. package/dist/server/operations/storage.js +24 -14
  467. package/dist/server/operations/stream-workflow-sse.d.ts +1 -1
  468. package/dist/server/operations/submit-review-decision.d.ts +1 -1
  469. package/dist/server/operations/submit-review-decision.js +6 -3
  470. package/dist/server/operations/suspend-workflow.d.ts +13 -0
  471. package/dist/server/operations/suspend-workflow.js +36 -0
  472. package/dist/server/operations/update-schedule.d.ts +1 -1
  473. package/dist/server/operations/update-schedule.js +7 -4
  474. package/dist/server/operations/update-workflow.d.ts +1 -1
  475. package/dist/server/operations/update-workflow.js +7 -3
  476. package/dist/server/operations/worker-drain.d.ts +8 -8
  477. package/dist/server/operations/worker-drain.js +11 -8
  478. package/dist/server/operations/workflow-events-subscription.d.ts +7 -8
  479. package/dist/server/operations/workflow-events-subscription.js +43 -8
  480. package/dist/server/rest-binding.d.ts +21 -8
  481. package/dist/server/rest-bindings.js +24 -0
  482. package/dist/server/rest-body.d.ts +10 -0
  483. package/dist/server/rest-body.js +80 -0
  484. package/dist/server/runtime/authentication-bridge.d.ts +1 -0
  485. package/dist/server/runtime/authentication-bridge.js +33 -6
  486. package/dist/server/runtime/client-visible-events.d.ts +3 -0
  487. package/dist/server/runtime/client-visible-events.js +65 -0
  488. package/dist/server/runtime/context.d.ts +7 -0
  489. package/dist/server/runtime/event-broadcasting.d.ts +6 -0
  490. package/dist/server/runtime/event-broadcasting.js +72 -38
  491. package/dist/server/runtime/retry.d.ts +1 -0
  492. package/dist/server/runtime/retry.js +14 -0
  493. package/dist/server/runtime/shutdown.d.ts +7 -6
  494. package/dist/server/runtime/shutdown.js +6 -1
  495. package/dist/server/runtime/task-dispatch.js +5 -3
  496. package/dist/server/runtime/task-polling.d.ts +16 -2
  497. package/dist/server/runtime/task-polling.js +80 -24
  498. package/dist/server/runtime/task-reconciliation.js +9 -1
  499. package/dist/server/runtime/task-result-resolution.d.ts +15 -0
  500. package/dist/server/runtime/task-result-resolution.js +81 -0
  501. package/dist/server/runtime/websocket-stream.d.ts +20 -1
  502. package/dist/server/runtime/websocket-stream.js +173 -7
  503. package/dist/server/runtime/websocket-upgrade.js +22 -3
  504. package/dist/server/runtime/websocket-worker.d.ts +1 -1
  505. package/dist/server/runtime/websocket-worker.js +46 -30
  506. package/dist/server/serve-internals.d.ts +11 -1
  507. package/dist/server/serve-internals.js +20 -2
  508. package/dist/server/task-state.d.ts +38 -0
  509. package/dist/server/task-state.js +28 -0
  510. package/dist/server/workflow-event-feed.d.ts +36 -115
  511. package/dist/server/workflow-event-feed.js +92 -27
  512. package/dist/service-worker/index.js +31 -31
  513. package/dist/storage/auto.js +1 -1
  514. package/dist/storage/bun-sql.js +24 -0
  515. package/dist/storage/capabilities.d.ts +10 -2
  516. package/dist/storage/capabilities.js +2 -2
  517. package/dist/storage/compressed-storage.js +1 -1
  518. package/dist/storage/default-scope.d.ts +7 -4
  519. package/dist/storage/http.js +2 -2
  520. package/dist/storage/index.d.ts +81 -4
  521. package/dist/storage/indexeddb.js +1 -1
  522. package/dist/storage/interface.d.ts +189 -0
  523. package/dist/storage/interface.js +1 -1
  524. package/dist/storage/key-prefixes.d.ts +1 -1
  525. package/dist/storage/key-prefixes.js +12 -0
  526. package/dist/storage/lmdb.d.ts +4 -3
  527. package/dist/storage/lmdb.js +1 -1
  528. package/dist/storage/memory.js +1 -1
  529. package/dist/storage/neon-batch.d.ts +30 -0
  530. package/dist/storage/neon-batch.js +30 -0
  531. package/dist/storage/neon-value-mapping.d.ts +74 -0
  532. package/dist/storage/neon-value-mapping.js +23 -0
  533. package/dist/storage/neon.d.ts +124 -0
  534. package/dist/storage/neon.js +15 -0
  535. package/dist/storage/node-sqlite-loader.d.ts +71 -0
  536. package/dist/storage/node-sqlite-loader.js +41 -0
  537. package/dist/storage/node-sqlite.d.ts +1 -19
  538. package/dist/storage/node-sqlite.js +61 -32
  539. package/dist/storage/postgres-key-value-queries.d.ts +104 -0
  540. package/dist/storage/postgres-key-value-queries.js +101 -0
  541. package/dist/storage/resolve.d.ts +2 -165
  542. package/dist/storage/resolve.js +1 -1
  543. package/dist/storage/scoped-storage.js +1 -1
  544. package/dist/storage/storage-configuration.d.ts +209 -0
  545. package/dist/storage/storage-configuration.js +0 -0
  546. package/dist/storage/testing.d.ts +168 -0
  547. package/dist/storage/testing.js +2 -0
  548. package/dist/storage/text-value-store.d.ts +9 -9
  549. package/dist/storage/turso.d.ts +8 -0
  550. package/dist/storage/turso.js +2 -2
  551. package/dist/storage/typed-storage.js +1 -1
  552. package/dist/storage/web-extension.js +1 -1
  553. package/dist/testing/index.js +35 -35
  554. package/dist/version.d.ts +1 -1
  555. package/dist/version.js +1 -1
  556. package/dist/worker/index.js +9 -5
  557. package/dist/worker/long-poll.js +4 -0
  558. package/dist/worker/protocol-messages.d.ts +20 -0
  559. package/dist/worker/protocol-schemas.d.ts +32 -0
  560. package/dist/worker/protocol-schemas.js +8 -4
  561. package/dist/worker/protocol-task-result.d.ts +28 -0
  562. package/dist/worker/protocol-task-result.js +76 -0
  563. package/dist/worker/protocol.d.ts +4 -15
  564. package/dist/worker/protocol.js +1 -1
  565. package/dist/worker/registry/fair-share.d.ts +29 -0
  566. package/dist/worker/registry/fair-share.js +30 -0
  567. package/dist/worker/registry/routing.d.ts +18 -0
  568. package/dist/worker/registry/routing.js +14 -0
  569. package/dist/worker/registry/types.d.ts +7 -0
  570. package/dist/worker/registry.d.ts +16 -1
  571. package/dist/worker/registry.js +24 -36
  572. package/dist/workers/worker-replay-state.d.ts +32 -0
  573. package/dist/workers/worker-replay-state.js +35 -0
  574. package/dist/workers/worker-state-namespace.d.ts +21 -0
  575. package/dist/workers/worker-state-namespace.js +13 -0
  576. package/dist/workers/workflow-runner.d.ts +19 -15
  577. package/dist/workers/workflow-runner.js +72 -60
  578. package/dist/workers/workflow-worker-entry.js +5 -2
  579. package/package.json +21 -4
@@ -1,5 +1,10 @@
1
- import { compareScores, scoreWorker } from "./registry/fair-share.js";
2
- import { matchesWorkerCapabilities, pickLeastLoaded } from "./registry/routing.js";
1
+ import { FairShareCounters } from "./registry/fair-share.js";
2
+ import {
3
+ matchesWorkerCapabilities,
4
+ pickFairShare,
5
+ pickLeastLoaded,
6
+ pickRoundRobin
7
+ } from "./registry/routing.js";
3
8
  import {
4
9
  deploymentHealth,
5
10
  projectDeploymentSummaries,
@@ -19,7 +24,7 @@ export class WorkerRegistry {
19
24
  this.#deploymentDrainStates = new Map;
20
25
  this.#policy = options?.policy ?? "least-loaded";
21
26
  this.#roundRobinCursor = new Map;
22
- this.#fairShareCounts = new Map;
27
+ this.#fairShareCounts = new FairShareCounters;
23
28
  }
24
29
  get policy() {
25
30
  return this.#policy;
@@ -51,7 +56,7 @@ export class WorkerRegistry {
51
56
  if (info === void 0)
52
57
  return;
53
58
  this.#workers.delete(workerId);
54
- this.#fairShareCounts.delete(workerId);
59
+ this.#fairShareCounts.purge(workerId);
55
60
  for (const [operationId, task] of this.#inFlightTasks)
56
61
  if (task.workerId === workerId)
57
62
  this.#inFlightTasks.delete(operationId);
@@ -99,39 +104,23 @@ export class WorkerRegistry {
99
104
  }
100
105
  #selectByPolicy(eligible, queue, activityName, fairShareKey) {
101
106
  if (this.#policy === "round-robin")
102
- return this.#pickRoundRobin(eligible, queue, activityName);
107
+ return pickRoundRobin(eligible, this.#roundRobinCursor, queue, activityName);
103
108
  if (this.#policy === "fair-share" && fairShareKey !== void 0)
104
- return this.#pickFairShare(eligible, fairShareKey);
109
+ return pickFairShare(eligible, this.#fairShareCounts, fairShareKey);
105
110
  return pickLeastLoaded(eligible);
106
111
  }
107
- #pickRoundRobin(eligible, queue, activityName) {
108
- const key = `${queue ?? "__default__"}::${activityName}`, cursor = this.#roundRobinCursor.get(key) ?? 0, pick = eligible[cursor % eligible.length];
109
- this.#roundRobinCursor.set(key, cursor + 1);
110
- return pick;
111
- }
112
- #pickFairShare(eligible, fairShareKey) {
113
- const winner = eligible.map((worker) => scoreWorker({
114
- id: worker.id,
115
- inFlight: worker.inFlight,
116
- keyLoad: this.#fairShareCounts.get(worker.id)?.get(fairShareKey) ?? 0
117
- })).reduce((best, candidate) => compareScores(candidate, best) < 0 ? candidate : best);
118
- return this.#workers.get(winner.id);
119
- }
120
- assignTask(workerId, operationId, visibilityTimeout, fairShareKey) {
112
+ assignTask(workerId, operationId, visibilityTimeout, fairShareKey, attemptToken) {
121
113
  const deadline = Date.now() + visibilityTimeout, task = {
122
114
  operationId,
123
115
  workerId,
124
116
  deadline,
125
117
  visibilityTimeout
126
118
  };
119
+ if (attemptToken !== void 0)
120
+ task.attemptToken = attemptToken;
127
121
  if (fairShareKey !== void 0) {
128
122
  task.fairShareKey = fairShareKey;
129
- let workerCounts = this.#fairShareCounts.get(workerId);
130
- if (workerCounts === void 0) {
131
- workerCounts = new Map;
132
- this.#fairShareCounts.set(workerId, workerCounts);
133
- }
134
- workerCounts.set(fairShareKey, (workerCounts.get(fairShareKey) ?? 0) + 1);
123
+ this.#fairShareCounts.increment(workerId, fairShareKey);
135
124
  }
136
125
  this.#inFlightTasks.set(operationId, task);
137
126
  this.taskAssigned(workerId);
@@ -164,6 +153,14 @@ export class WorkerRegistry {
164
153
  isAssignedToWorker(operationId, workerId) {
165
154
  return this.#inFlightTasks.get(operationId)?.workerId === workerId;
166
155
  }
156
+ isAssignedToAttempt(operationId, workerId, attemptToken) {
157
+ const task = this.#inFlightTasks.get(operationId);
158
+ if (task === void 0 || task.workerId !== workerId)
159
+ return !1;
160
+ if (task.attemptToken === void 0 || attemptToken === void 0)
161
+ return !0;
162
+ return task.attemptToken === attemptToken;
163
+ }
167
164
  isAssigned(operationId) {
168
165
  return this.#inFlightTasks.has(operationId);
169
166
  }
@@ -285,16 +282,7 @@ export class WorkerRegistry {
285
282
  #releaseFairShare(task) {
286
283
  if (task.fairShareKey === void 0)
287
284
  return;
288
- const workerCounts = this.#fairShareCounts.get(task.workerId);
289
- if (workerCounts === void 0)
290
- return;
291
- const current = workerCounts.get(task.fairShareKey) ?? 0, next = Math.max(0, current - 1);
292
- if (next === 0) {
293
- workerCounts.delete(task.fairShareKey);
294
- if (workerCounts.size === 0)
295
- this.#fairShareCounts.delete(task.workerId);
296
- } else
297
- workerCounts.set(task.fairShareKey, next);
285
+ this.#fairShareCounts.release(task.workerId, task.fairShareKey);
298
286
  }
299
287
  }
300
288
  function createDrainRecord(options) {
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The worker-side replay state: the per-run record of cached step outcomes the worker
3
+ * runner rebuilds from a checkpoint, plus the helpers that create it and fold a resumed
4
+ * operation outcome back into it. Extracted from `workflow-runner.ts` so that module
5
+ * stays under the line cap; the runner imports these back and owns the generator-driving
6
+ * flow that consumes them.
7
+ *
8
+ * @module workers/worker-replay-state
9
+ */
10
+ import type { Checkpoint, OperationOutcome, WorkerReplayOperationFailure } from '../core/types.ts';
11
+ import type { WorkerReplayOperationSignature } from '../core/worker-protocol.ts';
12
+ /** Per-run worker replay state, rebuilt from a checkpoint on every run/recovery. */
13
+ export interface WorkerReplayState {
14
+ checkpoint: Checkpoint;
15
+ accumulatedResults: Map<number, unknown>;
16
+ signatures: Map<number, WorkerReplayOperationSignature>;
17
+ failedOutcomes: Map<number, WorkerReplayOperationFailure>;
18
+ nextStepIndex: number;
19
+ pendingStepIndex: number | null;
20
+ maxProtocolMessageBytes: number | undefined;
21
+ }
22
+ export declare function createReplayState(message: {
23
+ workflowId: string;
24
+ checkpoint?: ArrayBuffer;
25
+ maxProtocolMessageBytes?: number;
26
+ }): WorkerReplayState;
27
+ /**
28
+ * Fold a resumed operation outcome into the replay state at the pending step: cache a
29
+ * success in `accumulatedResults`, a failure in `failedOutcomes` (mutually exclusive),
30
+ * and advance `nextStepIndex` past it. A no-op when there is no pending step or outcome.
31
+ */
32
+ export declare function recordOperationOutcome(replayState: WorkerReplayState, outcome: OperationOutcome | undefined): void;
@@ -0,0 +1,35 @@
1
+ import { createCheckpoint, deserializeCheckpoint } from "../core/checkpoint.js";
2
+ import {
3
+ hydrateCheckpointReplayStateFromPayload,
4
+ readCheckpointReplayPayload
5
+ } from "../core/engine/checkpoint-replay.js";
6
+ function deserializeWorkerCheckpoint(checkpointBytes) {
7
+ const checkpoint = deserializeCheckpoint(new Uint8Array(checkpointBytes));
8
+ return hydrateCheckpointReplayStateFromPayload(checkpoint, readCheckpointReplayPayload(checkpoint));
9
+ }
10
+ export function createReplayState(message) {
11
+ const checkpoint = message.checkpoint && message.checkpoint.byteLength > 0 ? deserializeWorkerCheckpoint(message.checkpoint) : createCheckpoint(message.workflowId, "worker");
12
+ return {
13
+ checkpoint,
14
+ accumulatedResults: new Map(checkpoint.accumulatedResults),
15
+ signatures: new Map(checkpoint.workerReplaySignatures ?? []),
16
+ failedOutcomes: new Map(checkpoint.workerReplayFailures ?? []),
17
+ nextStepIndex: 0,
18
+ pendingStepIndex: null,
19
+ maxProtocolMessageBytes: message.maxProtocolMessageBytes
20
+ };
21
+ }
22
+ export function recordOperationOutcome(replayState, outcome) {
23
+ const pendingStepIndex = replayState.pendingStepIndex;
24
+ if (pendingStepIndex === null || !outcome)
25
+ return;
26
+ if (outcome.status === "failed") {
27
+ replayState.failedOutcomes.set(pendingStepIndex, outcome);
28
+ replayState.accumulatedResults.delete(pendingStepIndex);
29
+ } else {
30
+ replayState.accumulatedResults.set(pendingStepIndex, outcome.value);
31
+ replayState.failedOutcomes.delete(pendingStepIndex);
32
+ }
33
+ replayState.nextStepIndex = pendingStepIndex + 1;
34
+ replayState.pendingStepIndex = null;
35
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The worker-side `ctx.state` namespace. Built locally from a `run` message — worker
3
+ * mode supports `execution`/`workflow` atomic state but rejects `session` state, which
4
+ * needs the engine host. Extracted from `workflow-runner.ts` so that module stays under
5
+ * the line cap.
6
+ *
7
+ * @module workers/worker-state-namespace
8
+ */
9
+ import type { WorkflowStateNamespace } from '../core/types.ts';
10
+ /** The `run`-message fields the state namespace needs to scope atomic state. */
11
+ export interface WorkerStateNamespaceScope {
12
+ workflowId: string;
13
+ workflowType: string;
14
+ executionStateOwnerId?: string;
15
+ }
16
+ /**
17
+ * Build the worker-side {@link WorkflowStateNamespace}. `execution` and `workflow`
18
+ * scopes are supported; `session` throws because session state is an engine-host
19
+ * capability the worker process cannot reach.
20
+ */
21
+ export declare function createWorkerStateNamespace(message: WorkerStateNamespaceScope): WorkflowStateNamespace;
@@ -0,0 +1,13 @@
1
+ import { WorkflowAtomicStateHandle } from "../core/context/state-namespace.js";
2
+ export function createWorkerStateNamespace(message) {
3
+ return {
4
+ session: (_key) => {
5
+ throw Error(`Workflow type "${message.workflowType}" called ctx.state.session(), which is not supported in worker execution mode. Use workflowExecutionMode: 'inline' for checkpoint-local session state, or use ctx.state.workflow() or ctx.state.execution() instead.`);
6
+ },
7
+ execution: (key, options) => new WorkflowAtomicStateHandle({
8
+ type: "execution",
9
+ ownerWorkflowId: message.executionStateOwnerId ?? message.workflowId
10
+ }, key, options),
11
+ workflow: (key, options) => new WorkflowAtomicStateHandle({ type: "workflow", workflowType: message.workflowType }, key, options)
12
+ };
13
+ }
@@ -1,13 +1,17 @@
1
- import type { Checkpoint, OperationOutcome, WorkerOutboundMessage, WorkerReplayOperationFailure, WorkflowContext, WorkflowStateNamespace } from '../core/types.ts';
2
- import { type WorkerReplayOperationSignature } from '../core/worker-protocol.ts';
1
+ import type { ContextOperationRequest } from '../core/context.ts';
2
+ import { type WorkerLoggerReplayState } from '../core/context/workflow-logger.ts';
3
+ import type { OperationOutcome, WorkerOutboundMessage, WorkflowContext, WorkflowLogger, WorkflowLogRecord, WorkflowStateNamespace } from '../core/types.ts';
4
+ import { type WorkerReplayState } from './worker-replay-state.ts';
3
5
  /**
4
6
  * Subset of {@link WorkflowContext} that the worker-side runner can build
5
7
  * locally from the `run` message. Engine-side fields (`executionTimeRemaining`
6
8
  * in particular) are stub values because the worker has no clock authority —
7
9
  * any user code reading them will see static numbers, not live deadlines.
8
10
  */
9
- export type WorkerWorkflowContext = Pick<WorkflowContext, 'workflowId' | 'signal' | 'startedAt'> & {
11
+ export type WorkerWorkflowContext = Pick<WorkflowContext, 'workflowId' | 'workflowType' | 'signal' | 'startedAt'> & {
10
12
  readonly state: WorkflowStateNamespace;
13
+ readonly log: WorkflowLogger;
14
+ getVersion(changeId: string, minSupported: number, maxSupported: number): Generator<ContextOperationRequest, number, unknown>;
11
15
  };
12
16
  interface RunMessageShape {
13
17
  workflowId: string;
@@ -21,23 +25,23 @@ interface RunMessageShape {
21
25
  * Construct the worker-side `ctx` argument that gets passed as the first
22
26
  * positional parameter to a registered workflow handler. Engine-side fields
23
27
  * not represented in the `run` message are intentionally omitted — only the
24
- * `Pick`-ed subset above is populated.
28
+ * `Pick`-ed subset above is populated. `forwardLog`, when provided by the worker
29
+ * entry (host has an `onLog` sink), routes `ctx.log` records to the host (#529).
25
30
  */
26
- export declare function createWorkerWorkflowContext(message: RunMessageShape, controller: AbortController): WorkerWorkflowContext;
31
+ export declare function createWorkerWorkflowContext(message: RunMessageShape, controller: AbortController, getReplayState: () => WorkerLoggerReplayState | undefined, forwardLog?: (record: WorkflowLogRecord) => void, getVersionReplayState?: () => WorkerReplayState | undefined): WorkerWorkflowContext;
32
+ /**
33
+ * Posts a forwarded `ctx.log` message to the host, size-checking against the current
34
+ * `maxProtocolMessageBytes`. Throwing on oversize is intentional — the shared logger
35
+ * factory catches it and falls the record back to the worker console (#529).
36
+ */
37
+ export type WorkerLogPoster = (message: Extract<WorkerOutboundMessage, {
38
+ type: 'log';
39
+ }>, maxProtocolMessageBytes: number | undefined) => void;
27
40
  export interface WorkflowRunnerContext {
28
41
  generators: Map<string, AsyncGenerator>;
29
42
  abortControllers: Map<string, AbortController>;
30
43
  replayStates: Map<string, WorkerReplayState>;
31
44
  }
32
- interface WorkerReplayState {
33
- checkpoint: Checkpoint;
34
- accumulatedResults: Map<number, unknown>;
35
- signatures: Map<number, WorkerReplayOperationSignature>;
36
- failedOutcomes: Map<number, WorkerReplayOperationFailure>;
37
- nextStepIndex: number;
38
- pendingStepIndex: number | null;
39
- maxProtocolMessageBytes: number | undefined;
40
- }
41
45
  export declare function createWorkflowRunnerContext(): WorkflowRunnerContext;
42
46
  export declare function handleRunMessage(context: WorkflowRunnerContext, message: {
43
47
  workflowId: string;
@@ -48,7 +52,7 @@ export declare function handleRunMessage(context: WorkflowRunnerContext, message
48
52
  executionStateOwnerId?: string;
49
53
  deadline?: number;
50
54
  headers?: [string, string][];
51
- }, getWorkflowHandler: (type: string) => ((ctx: WorkerWorkflowContext, input: unknown) => AsyncGenerator) | undefined): Promise<WorkerOutboundMessage>;
55
+ }, getWorkflowHandler: (type: string) => ((ctx: WorkerWorkflowContext, input: unknown) => AsyncGenerator) | undefined, postLog?: WorkerLogPoster): Promise<WorkerOutboundMessage>;
52
56
  export declare function handleResumeMessage(context: WorkflowRunnerContext, message: {
53
57
  workflowId: string;
54
58
  result: unknown;
@@ -1,36 +1,75 @@
1
+ import { copyBytesToArrayBuffer } from "../core/byte-arrays.js";
2
+ import { advanceCheckpoint, serializeCheckpoint } from "../core/checkpoint.js";
3
+ import { resolveWorkflowVersionPatch } from "../core/context/version-patching.js";
1
4
  import {
2
- advanceCheckpoint,
3
- createCheckpoint,
4
- deserializeCheckpoint,
5
- serializeCheckpoint
6
- } from "../core/checkpoint.js";
7
- import { WorkflowAtomicStateHandle } from "../core/context/state-namespace.js";
5
+ createWorkerWorkflowLogger
6
+ } from "../core/context/workflow-logger.js";
7
+ import {
8
+ attachTransientCheckpointReplayPayload,
9
+ pruneCheckpointReplayState
10
+ } from "../core/engine/checkpoint-replay.js";
8
11
  import {
9
12
  classifyErrorAsFailureCategory,
10
13
  errorFromFailedOperationOutcome
11
14
  } from "../core/failure-categories.js";
12
15
  import {
13
16
  createWorkerReplayOperationSignature,
17
+ WORKER_PROTOCOL_VERSION,
14
18
  workerReplayOperationSignaturesEqual
15
19
  } from "../core/worker-protocol.js";
16
- export function createWorkerWorkflowContext(message, controller) {
20
+ import {
21
+ createReplayState,
22
+ recordOperationOutcome
23
+ } from "./worker-replay-state.js";
24
+ import { createWorkerStateNamespace } from "./worker-state-namespace.js";
25
+ export function createWorkerWorkflowContext(message, controller, getReplayState, forwardLog, getVersionReplayState = () => {
26
+ return;
27
+ }) {
17
28
  return {
18
29
  workflowId: message.workflowId,
30
+ workflowType: message.workflowType,
19
31
  signal: controller.signal,
20
32
  startedAt: Date.now(),
21
- state: createWorkerStateNamespace(message)
33
+ state: createWorkerStateNamespace(message),
34
+ log: createWorkerWorkflowLogger(message.workflowId, message.workflowType, getReplayState, forwardLog),
35
+ getVersion: (changeId, minSupported, maxSupported) => workerGetVersion(message.workflowId, getVersionReplayState, changeId, minSupported, maxSupported)
22
36
  };
23
37
  }
24
- function createWorkerStateNamespace(message) {
25
- return {
26
- session: (_key) => {
27
- throw Error("ctx.state.session() is not supported in worker execution mode. Construct the engine without `workerExecution` to use session state.");
28
- },
29
- execution: (key, options) => new WorkflowAtomicStateHandle({
30
- type: "execution",
31
- ownerWorkflowId: message.executionStateOwnerId ?? message.workflowId
32
- }, key, options),
33
- workflow: (key, options) => new WorkflowAtomicStateHandle({ type: "workflow", workflowType: message.workflowType }, key, options)
38
+ function* workerGetVersion(workflowId, getReplayState, changeId, minSupported, maxSupported) {
39
+ const replayState = getReplayState();
40
+ if (!replayState)
41
+ throw Error(`No active replay state for workflow: ${workflowId}`);
42
+ const stepIndex = replayState.nextStepIndex, resolution = resolveWorkflowVersionPatch(replayState.checkpoint.locals, changeId, minSupported, maxSupported);
43
+ replayState.checkpoint = {
44
+ ...replayState.checkpoint,
45
+ locals: resolution.checkpointLocals
46
+ };
47
+ const operation = {
48
+ type: "get-version",
49
+ operationId: crypto.randomUUID(),
50
+ changeId,
51
+ minSupported,
52
+ maxSupported,
53
+ version: resolution.version
54
+ };
55
+ if (!resolution.newlyPinned && !replayState.signatures.has(stepIndex)) {
56
+ replayState.nextStepIndex = stepIndex + 1;
57
+ return resolution.version;
58
+ }
59
+ const result = yield operation;
60
+ replayState.accumulatedResults.delete(stepIndex);
61
+ return result;
62
+ }
63
+ function buildLogForwarder(workflowId, maxProtocolMessageBytes, postLog) {
64
+ if (postLog === void 0)
65
+ return;
66
+ return (record) => {
67
+ postLog({
68
+ type: "log",
69
+ protocolVersion: WORKER_PROTOCOL_VERSION,
70
+ workflowId,
71
+ record
72
+ }, maxProtocolMessageBytes);
34
73
  };
35
74
  }
36
75
  export function createWorkflowRunnerContext() {
@@ -40,7 +79,7 @@ export function createWorkflowRunnerContext() {
40
79
  replayStates: new Map
41
80
  };
42
81
  }
43
- export async function handleRunMessage(context, message, getWorkflowHandler) {
82
+ export async function handleRunMessage(context, message, getWorkflowHandler, postLog) {
44
83
  const handler = getWorkflowHandler(message.workflowType);
45
84
  if (!handler)
46
85
  return {
@@ -52,9 +91,8 @@ export async function handleRunMessage(context, message, getWorkflowHandler) {
52
91
  const controller = new AbortController;
53
92
  context.abortControllers.set(message.workflowId, controller);
54
93
  try {
55
- const workerContext = createWorkerWorkflowContext(message, controller), generator = handler(workerContext, message.input);
56
94
  context.replayStates.set(message.workflowId, createReplayState(message));
57
- const step = await generator.next();
95
+ const workerContext = createWorkerWorkflowContext(message, controller, () => context.replayStates.get(message.workflowId), buildLogForwarder(message.workflowId, message.maxProtocolMessageBytes, postLog), () => context.replayStates.get(message.workflowId)), generator = handler(workerContext, message.input), step = await generator.next();
58
96
  return await processGeneratorStep(context, message.workflowId, generator, step);
59
97
  } catch (error) {
60
98
  cleanupWorkflowRunnerState(context, message.workflowId);
@@ -168,46 +206,21 @@ async function processGeneratorStep(context, workflowId, generator, step) {
168
206
  failureCategory: "system"
169
207
  };
170
208
  }
209
+ replayState.checkpoint = pruneWorkerCheckpoint(replayState, replayState.checkpoint, stepIndex);
171
210
  } else {
172
211
  replayState.signatures.set(stepIndex, signature);
173
- replayState.checkpoint = advanceWorkerCheckpoint(replayState);
212
+ replayState.checkpoint = advanceWorkerCheckpoint(replayState, stepIndex);
174
213
  }
175
214
  replayState.pendingStepIndex = stepIndex;
176
215
  context.generators.set(workflowId, generator);
177
216
  return {
178
217
  type: "checkpoint",
179
218
  workflowId,
180
- checkpoint: toArrayBuffer(serializeCheckpoint(replayState.checkpoint)),
219
+ checkpoint: copyBytesToArrayBuffer(serializeCheckpoint(replayState.checkpoint)),
181
220
  operationRequest
182
221
  };
183
222
  }
184
223
  }
185
- function createReplayState(message) {
186
- const checkpoint = message.checkpoint && message.checkpoint.byteLength > 0 ? deserializeCheckpoint(new Uint8Array(message.checkpoint)) : createCheckpoint(message.workflowId, "worker");
187
- return {
188
- checkpoint,
189
- accumulatedResults: new Map(checkpoint.accumulatedResults),
190
- signatures: new Map(checkpoint.workerReplaySignatures ?? []),
191
- failedOutcomes: new Map(checkpoint.workerReplayFailures ?? []),
192
- nextStepIndex: 0,
193
- pendingStepIndex: null,
194
- maxProtocolMessageBytes: message.maxProtocolMessageBytes
195
- };
196
- }
197
- function recordOperationOutcome(replayState, outcome) {
198
- const pendingStepIndex = replayState.pendingStepIndex;
199
- if (pendingStepIndex === null || !outcome)
200
- return;
201
- if (outcome.status === "failed") {
202
- replayState.failedOutcomes.set(pendingStepIndex, outcome);
203
- replayState.accumulatedResults.delete(pendingStepIndex);
204
- } else {
205
- replayState.accumulatedResults.set(pendingStepIndex, outcome.value);
206
- replayState.failedOutcomes.delete(pendingStepIndex);
207
- }
208
- replayState.nextStepIndex = pendingStepIndex + 1;
209
- replayState.pendingStepIndex = null;
210
- }
211
224
  function hasCachedWorkerOutcome(replayState, stepIndex) {
212
225
  return replayState.accumulatedResults.has(stepIndex) || replayState.failedOutcomes.has(stepIndex);
213
226
  }
@@ -217,21 +230,20 @@ async function replayGeneratorStep(generator, replayState, stepIndex) {
217
230
  return await generator.throw(errorFromFailedOperationOutcome(failedOutcome));
218
231
  return await generator.next(replayState.accumulatedResults.get(stepIndex));
219
232
  }
220
- function advanceWorkerCheckpoint(replayState) {
233
+ function advanceWorkerCheckpoint(replayState, pendingOperationStep) {
221
234
  const advanced = advanceCheckpoint(replayState.checkpoint, replayState.checkpoint.locals, {
222
235
  accumulatedResults: [...replayState.accumulatedResults]
223
- }), workerReplayFailures = [...replayState.failedOutcomes], advancedCheckpoint = { ...advanced };
224
- delete advancedCheckpoint.workerReplayFailures;
225
- return {
226
- ...advancedCheckpoint,
236
+ });
237
+ return pruneWorkerCheckpoint(replayState, advanced, pendingOperationStep);
238
+ }
239
+ function pruneWorkerCheckpoint(replayState, checkpoint, pendingOperationStep) {
240
+ const workerReplayFailures = [...replayState.failedOutcomes], { workerReplayFailures: _oldWorkerReplayFailures, ...checkpointWithoutFailures } = checkpoint, workerCheckpoint = {
241
+ ...checkpointWithoutFailures,
242
+ accumulatedResults: [...replayState.accumulatedResults],
227
243
  workerReplaySignatures: [...replayState.signatures],
228
244
  ...workerReplayFailures.length === 0 ? {} : { workerReplayFailures }
229
- };
230
- }
231
- function toArrayBuffer(bytes) {
232
- const copy = new Uint8Array(bytes.byteLength);
233
- copy.set(bytes);
234
- return copy.buffer;
245
+ }, pruned = pruneCheckpointReplayState(workerCheckpoint, pendingOperationStep);
246
+ return attachTransientCheckpointReplayPayload(pruned.checkpoint, pruned.replayPayload);
235
247
  }
236
248
  export function cleanupWorkflowRunnerState(context, workflowId) {
237
249
  context.generators.delete(workflowId);
@@ -10,14 +10,17 @@ import {
10
10
  handleResumeMessage,
11
11
  handleRunMessage
12
12
  } from "./workflow-runner.js";
13
- const workerPostMessage = self.postMessage.bind(self), workerClose = "close" in self && typeof self.close === "function" ? self.close.bind(self) : void 0;
13
+ const workerPostMessage = self.postMessage.bind(self), workerClose = "close" in self && typeof self.close === "function" ? self.close.bind(self) : void 0, postLogMessage = (message, maxProtocolMessageBytes) => {
14
+ assertWorkerProtocolMessageWithinLimit(message, maxProtocolMessageBytes);
15
+ workerPostMessage(message);
16
+ };
14
17
  export function initializeWorkerMessageLoop(getWorkflowHandler) {
15
18
  const runnerContext = createWorkflowRunnerContext();
16
19
  self.addEventListener("message", async (event) => {
17
20
  const message = event.data;
18
21
  switch (message.type) {
19
22
  case "run": {
20
- const response = await handleRunMessage(runnerContext, message, getWorkflowHandler);
23
+ const response = await handleRunMessage(runnerContext, message, getWorkflowHandler, message.hostHasLogSink ? postLogMessage : void 0);
21
24
  postOutboundMessage(runnerContext, response, message);
22
25
  break;
23
26
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lostgradient/weft",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "A Bun-native durable execution engine with pluggable key-value storage.",
5
5
  "keywords": [
6
6
  "bun",
@@ -80,6 +80,10 @@
80
80
  "import": "./dist/storage/text-value-import.js",
81
81
  "default": "./dist/storage/text-value-import.js"
82
82
  },
83
+ "./storage/testing": {
84
+ "types": "./dist/storage/testing.d.ts",
85
+ "bun": "./dist/storage/testing.js"
86
+ },
83
87
  "./storage/sqlite": {
84
88
  "types": "./dist/storage/sqlite.d.ts",
85
89
  "bun": "./dist/storage/bun-sql.js",
@@ -107,6 +111,12 @@
107
111
  "import": "./dist/storage/turso.js",
108
112
  "default": "./dist/storage/turso.js"
109
113
  },
114
+ "./storage/neon": {
115
+ "types": "./dist/storage/neon.d.ts",
116
+ "bun": "./dist/storage/neon.js",
117
+ "import": "./dist/storage/neon.js",
118
+ "default": "./dist/storage/neon.js"
119
+ },
110
120
  "./storage/indexeddb": {
111
121
  "types": "./dist/storage/indexeddb.d.ts",
112
122
  "import": "./dist/storage/indexeddb.js",
@@ -202,18 +212,19 @@
202
212
  "lint": "oxlint --type-aware --tsconfig ./tsconfig.json --report-unused-disable-directives-severity=error && bun run scripts/check-lint-disables.ts && bun run scripts/check-import-cycles.ts && bun run scripts/check-internal-imports.ts && bun run scripts/check-engine-internals-field-access.ts && bun run scripts/check-definition-vocabulary.ts && bun run scripts/check-catalog-completeness.ts && bun run scripts/check-catalog-drift.ts && bun run scripts/check-type-ergonomics.ts",
203
213
  "lint:fix": "oxlint --fix --type-aware --tsconfig ./tsconfig.json",
204
214
  "markdown-doctests:inventory": "bun run scripts/extract-markdown-doctests.ts inventory",
205
- "prepack": "bun run build && bun run verify:exports && bun run verify:portability && bun run verify:markdown-doctests && bun run verify:jsdoc && bun run verify:jsdoc:doctests && bun run verify:jsdoc:declarations && bun run check:package-contents && bun run validate:package-consumers",
215
+ "prepack": "bun run scripts/run-gates.ts prepack",
206
216
  "pr:title": "bun run scripts/pr-title.ts",
207
217
  "prepare": "husky",
208
218
  "prepublishOnly": "bun run validate",
209
219
  "start": "bun run src/index.ts",
210
- "test": "bun test --timeout 15000 --path-ignore-patterns='src/benchmarks/**' --path-ignore-patterns='examples/checkout/**' --path-ignore-patterns='src/service-worker/service-worker-browser.test.ts' --path-ignore-patterns='src/storage/indexeddb-browser.test.ts' --path-ignore-patterns='src/storage/web-extension-browser.test.ts' && bun test src/benchmarks --timeout 15000 --parallel=1",
220
+ "test": "bun test --timeout 15000 --path-ignore-patterns='src/benchmarks/**' --path-ignore-patterns='examples/checkout/**' --path-ignore-patterns='src/service-worker/service-worker-browser.test.ts' --path-ignore-patterns='src/storage/indexeddb-browser.test.ts' --path-ignore-patterns='src/storage/web-extension-browser.test.ts'",
221
+ "test:benchmarks": "bun test src/benchmarks --timeout 15000 --parallel=1",
211
222
  "test:browser-smoke": "WEFT_BROWSER_SMOKE=1 bun test --timeout 20000 src/service-worker/service-worker-browser.test.ts src/storage/indexeddb-browser.test.ts src/storage/web-extension-browser.test.ts",
212
223
  "test:coverage": "bun run scripts/check-coverage.ts",
213
224
  "typecheck": "tsc --noEmit",
214
225
  "typecheck:package-root": "bun run build && tsc --noEmit -p tsconfig.package-test-d.json",
215
226
  "typecheck:tests": "tsc --noEmit -p tsconfig.test-d.json && bun run typecheck:package-root",
216
- "validate": "bun run lint && bun run typecheck && bun run typecheck:tests && bun run verify:documentation && bun run verify:no-test-sleeps && bun run verify:public-api-jsdoc && bun run test",
227
+ "validate": "bun run scripts/run-gates.ts validate",
217
228
  "validate:package-consumers": "bun run scripts/validate-package-consumers.ts",
218
229
  "verify:documentation": "bun run scripts/verify-documentation.ts",
219
230
  "verify:exports": "bun run scripts/verify-tree-shaking.ts",
@@ -248,7 +259,9 @@
248
259
  "zod": "^4.3.6"
249
260
  },
250
261
  "devDependencies": {
262
+ "@electric-sql/pglite": "^0.5.1",
251
263
  "@libsql/client": "^0.17.2",
264
+ "@neondatabase/serverless": "^1.1.0",
252
265
  "@types/bun": "^1.3.13",
253
266
  "better-sqlite3": "^12.8.0",
254
267
  "chalk": "^5.6.2",
@@ -267,6 +280,7 @@
267
280
  },
268
281
  "peerDependencies": {
269
282
  "@libsql/client": "^0.17.2",
283
+ "@neondatabase/serverless": "^1.1.0",
270
284
  "@opentelemetry/api": "^1.0.0",
271
285
  "better-sqlite3": "^12.8.0",
272
286
  "lmdb": "^3.5.2"
@@ -275,6 +289,9 @@
275
289
  "@libsql/client": {
276
290
  "optional": true
277
291
  },
292
+ "@neondatabase/serverless": {
293
+ "optional": true
294
+ },
278
295
  "@opentelemetry/api": {
279
296
  "optional": true
280
297
  },