@lostgradient/weft 0.3.0 → 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 (508) 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 +46 -5
  23. package/dist/client/local.d.ts +4 -1
  24. package/dist/client/local.js +12 -4
  25. package/dist/client/start-body.d.ts +4 -3
  26. package/dist/core/byte-arrays.d.ts +5 -0
  27. package/dist/core/byte-arrays.js +5 -0
  28. package/dist/core/checkpoint/lifecycle.d.ts +3 -0
  29. package/dist/core/checkpoint/lifecycle.js +9 -4
  30. package/dist/core/checkpoint/serialization.js +12 -5
  31. package/dist/core/codec/extension-codec.d.ts +16 -0
  32. package/dist/core/codec/extension-codec.js +100 -6
  33. package/dist/core/context/activity-retry-state.d.ts +38 -0
  34. package/dist/core/context/activity-retry-state.js +89 -0
  35. package/dist/core/context/activity-schedule-to-close.d.ts +159 -0
  36. package/dist/core/context/activity-schedule-to-close.js +69 -0
  37. package/dist/core/context/child-workflow-pipe.d.ts +5 -5
  38. package/dist/core/context/child-workflow-pipe.js +15 -2
  39. package/dist/core/context/context-presence.d.ts +19 -0
  40. package/dist/core/context/context-presence.js +13 -0
  41. package/dist/core/context/durable-operations.d.ts +25 -0
  42. package/dist/core/context/durable-operations.js +64 -0
  43. package/dist/core/context/index.d.ts +9 -5
  44. package/dist/core/context/index.js +17 -12
  45. package/dist/core/context/internals.d.ts +20 -0
  46. package/dist/core/context/internals.js +3 -1
  47. package/dist/core/context/operation-request.d.ts +35 -0
  48. package/dist/core/context/parallel-cache-entry.d.ts +14 -5
  49. package/dist/core/context/run-operation.d.ts +6 -1
  50. package/dist/core/context/run-operation.js +41 -87
  51. package/dist/core/context/session-state.js +7 -8
  52. package/dist/core/context/speculative-child.js +2 -0
  53. package/dist/core/context/types.d.ts +15 -0
  54. package/dist/core/context/version-patching.d.ts +8 -0
  55. package/dist/core/context/version-patching.js +40 -0
  56. package/dist/core/context/workflow-logger.d.ts +98 -0
  57. package/dist/core/context/workflow-logger.js +68 -0
  58. package/dist/core/engine/activity-heartbeat-tracking.d.ts +64 -0
  59. package/dist/core/engine/activity-heartbeat-tracking.js +42 -0
  60. package/dist/core/engine/activity-per-attempt-timeout.d.ts +41 -0
  61. package/dist/core/engine/activity-per-attempt-timeout.js +36 -0
  62. package/dist/core/engine/activity-reconciliation.d.ts +1 -0
  63. package/dist/core/engine/activity-reconciliation.js +12 -1
  64. package/dist/core/engine/activity-resolution.d.ts +23 -0
  65. package/dist/core/engine/activity-resolution.js +37 -0
  66. package/dist/core/engine/aggregate.js +66 -30
  67. package/dist/core/engine/async-activity-completion.d.ts +23 -6
  68. package/dist/core/engine/async-activity-completion.js +53 -12
  69. package/dist/core/engine/attributes-tags.js +9 -4
  70. package/dist/core/engine/bulk-operations-purge.d.ts +26 -0
  71. package/dist/core/engine/bulk-operations-purge.js +38 -3
  72. package/dist/core/engine/bulk-operations-shared.d.ts +2 -0
  73. package/dist/core/engine/bulk-operations-shared.js +8 -2
  74. package/dist/core/engine/bulk-operations.d.ts +4 -1
  75. package/dist/core/engine/bulk-operations.js +235 -24
  76. package/dist/core/engine/callback-creators-bundles.d.ts +9 -0
  77. package/dist/core/engine/callback-creators-bundles.js +30 -2
  78. package/dist/core/engine/callback-creators-core.js +6 -4
  79. package/dist/core/engine/callback-creators-router.js +10 -0
  80. package/dist/core/engine/callback-creators-schedule.d.ts +2 -2
  81. package/dist/core/engine/callback-creators-schedule.js +12 -8
  82. package/dist/core/engine/candidate-read-batching.d.ts +6 -0
  83. package/dist/core/engine/candidate-read-batching.js +1 -0
  84. package/dist/core/engine/checkpoint-io.js +61 -25
  85. package/dist/core/engine/checkpoint-reads.js +3 -2
  86. package/dist/core/engine/checkpoint-replay.d.ts +20 -0
  87. package/dist/core/engine/checkpoint-replay.js +242 -0
  88. package/dist/core/engine/checkpoint-side-effects.d.ts +23 -0
  89. package/dist/core/engine/checkpoint-side-effects.js +35 -0
  90. package/dist/core/engine/child-workflow-cancellation.d.ts +10 -0
  91. package/dist/core/engine/child-workflow-cancellation.js +40 -0
  92. package/dist/core/engine/child-workflow.js +27 -4
  93. package/dist/core/engine/condition-waiters.d.ts +14 -0
  94. package/dist/core/engine/condition-waiters.js +5 -0
  95. package/dist/core/engine/construction.d.ts +3 -0
  96. package/dist/core/engine/construction.js +21 -8
  97. package/dist/core/engine/coordination-branch-executors.d.ts +70 -0
  98. package/dist/core/engine/coordination-branch-executors.js +107 -0
  99. package/dist/core/engine/deferred-consume-envelope.d.ts +59 -0
  100. package/dist/core/engine/deferred-consume-envelope.js +14 -0
  101. package/dist/core/engine/disposal.js +13 -0
  102. package/dist/core/engine/engine-create-types.d.ts +14 -4
  103. package/dist/core/engine/engine-internal-types.d.ts +26 -3
  104. package/dist/core/engine/errors.d.ts +47 -0
  105. package/dist/core/engine/errors.js +20 -0
  106. package/dist/core/engine/event-log-compaction.d.ts +8 -0
  107. package/dist/core/engine/event-log-compaction.js +20 -2
  108. package/dist/core/engine/fenced-write.d.ts +65 -0
  109. package/dist/core/engine/fenced-write.js +71 -0
  110. package/dist/core/engine/finalizer-state.d.ts +28 -0
  111. package/dist/core/engine/finalizer-state.js +16 -0
  112. package/dist/core/engine/handles.d.ts +8 -0
  113. package/dist/core/engine/index.d.ts +34 -16
  114. package/dist/core/engine/index.js +133 -8
  115. package/dist/core/engine/inline-parking.js +3 -2
  116. package/dist/core/engine/internals.d.ts +107 -3
  117. package/dist/core/engine/lease-codec.d.ts +35 -0
  118. package/dist/core/engine/lease-codec.js +32 -0
  119. package/dist/core/engine/lease-deposition.d.ts +66 -0
  120. package/dist/core/engine/lease-deposition.js +10 -0
  121. package/dist/core/engine/lease-errors.d.ts +99 -0
  122. package/dist/core/engine/lease-errors.js +30 -0
  123. package/dist/core/engine/lease-manager.d.ts +114 -0
  124. package/dist/core/engine/lease-manager.js +135 -0
  125. package/dist/core/engine/lifecycle/persist.js +10 -32
  126. package/dist/core/engine/lifecycle/recovered-services.d.ts +8 -6
  127. package/dist/core/engine/lifecycle/recovered-services.js +18 -3
  128. package/dist/core/engine/lifecycle/resume.js +16 -9
  129. package/dist/core/engine/lifecycle/shared.d.ts +8 -1
  130. package/dist/core/engine/lifecycle/start-batch.d.ts +1 -1
  131. package/dist/core/engine/lifecycle/start-batch.js +2 -1
  132. package/dist/core/engine/lifecycle/start-commit.d.ts +9 -0
  133. package/dist/core/engine/lifecycle/start-commit.js +50 -8
  134. package/dist/core/engine/lifecycle/start-or-signal-create.d.ts +58 -0
  135. package/dist/core/engine/lifecycle/start-or-signal-create.js +95 -0
  136. package/dist/core/engine/lifecycle/start-or-signal.d.ts +3 -2
  137. package/dist/core/engine/lifecycle/start-or-signal.js +11 -81
  138. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +39 -0
  139. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +28 -0
  140. package/dist/core/engine/lifecycle/start.d.ts +4 -4
  141. package/dist/core/engine/lifecycle/start.js +17 -9
  142. package/dist/core/engine/lifecycle/transition.js +17 -5
  143. package/dist/core/engine/lifecycle.d.ts +1 -1
  144. package/dist/core/engine/list-candidate-resolution.js +2 -2
  145. package/dist/core/engine/listing.js +9 -5
  146. package/dist/core/engine/operations-activity.d.ts +4 -11
  147. package/dist/core/engine/operations-activity.js +22 -49
  148. package/dist/core/engine/operations-coordination.d.ts +10 -0
  149. package/dist/core/engine/operations-coordination.js +43 -8
  150. package/dist/core/engine/operations-router.d.ts +6 -0
  151. package/dist/core/engine/operations-router.js +2 -0
  152. package/dist/core/engine/operations-speculate.js +6 -2
  153. package/dist/core/engine/operations-stream.js +12 -2
  154. package/dist/core/engine/operations-time.d.ts +4 -2
  155. package/dist/core/engine/operations-time.js +14 -2
  156. package/dist/core/engine/operations-wait-condition.d.ts +23 -0
  157. package/dist/core/engine/operations-wait-condition.js +62 -0
  158. package/dist/core/engine/ownership-options.d.ts +23 -0
  159. package/dist/core/engine/ownership-options.js +26 -0
  160. package/dist/core/engine/payload-size-policy.d.ts +3 -0
  161. package/dist/core/engine/payload-size-policy.js +4 -0
  162. package/dist/core/engine/pending-updates.d.ts +17 -0
  163. package/dist/core/engine/pending-updates.js +33 -11
  164. package/dist/core/engine/queries.js +1 -1
  165. package/dist/core/engine/registration.d.ts +1 -0
  166. package/dist/core/engine/registration.js +18 -3
  167. package/dist/core/engine/schedule-jitter.d.ts +5 -0
  168. package/dist/core/engine/schedule-jitter.js +10 -0
  169. package/dist/core/engine/schedule-run.d.ts +17 -0
  170. package/dist/core/engine/schedule-run.js +38 -0
  171. package/dist/core/engine/schedule-timer.js +81 -17
  172. package/dist/core/engine/schedules.d.ts +7 -4
  173. package/dist/core/engine/schedules.js +37 -16
  174. package/dist/core/engine/search-attribute-records.d.ts +4 -0
  175. package/dist/core/engine/search-attribute-records.js +17 -0
  176. package/dist/core/engine/signals.d.ts +18 -2
  177. package/dist/core/engine/signals.js +42 -21
  178. package/dist/core/engine/state-utilities.d.ts +49 -2
  179. package/dist/core/engine/state-utilities.js +114 -3
  180. package/dist/core/engine/storage-io.d.ts +16 -2
  181. package/dist/core/engine/storage-io.js +26 -5
  182. package/dist/core/engine/stream-chunk-loading.d.ts +2 -0
  183. package/dist/core/engine/stream-chunk-loading.js +24 -1
  184. package/dist/core/engine/sub-operation.js +22 -3
  185. package/dist/core/engine/termination/cleanup.d.ts +3 -1
  186. package/dist/core/engine/termination/cleanup.js +25 -1
  187. package/dist/core/engine/termination/complete.js +44 -6
  188. package/dist/core/engine/termination/finalizer-activity.d.ts +53 -0
  189. package/dist/core/engine/termination/finalizer-activity.js +30 -0
  190. package/dist/core/engine/termination/finalizer-claim.d.ts +110 -0
  191. package/dist/core/engine/termination/finalizer-claim.js +80 -0
  192. package/dist/core/engine/termination/finalizer.d.ts +48 -0
  193. package/dist/core/engine/termination/finalizer.js +159 -0
  194. package/dist/core/engine/termination/suspend.d.ts +3 -1
  195. package/dist/core/engine/termination.d.ts +1 -0
  196. package/dist/core/engine/termination.js +4 -0
  197. package/dist/core/engine/updates.js +5 -25
  198. package/dist/core/engine/validation/schedule.d.ts +2 -1
  199. package/dist/core/engine/validation/schedule.js +51 -2
  200. package/dist/core/engine/validation.js +32 -5
  201. package/dist/core/engine/waiting-update-response.d.ts +8 -0
  202. package/dist/core/engine/waiting-update-response.js +22 -0
  203. package/dist/core/engine/workflow-concurrency.d.ts +10 -0
  204. package/dist/core/engine/workflow-concurrency.js +136 -0
  205. package/dist/core/engine/workflow-feed.d.ts +4 -5
  206. package/dist/core/engine/workflow-feed.js +4 -1
  207. package/dist/core/engine/workflow-indexes.d.ts +9 -0
  208. package/dist/core/engine/workflow-indexes.js +10 -0
  209. package/dist/core/engine/workflow-state-stream.js +33 -13
  210. package/dist/core/engine/workflow-visibility-queries.d.ts +2 -2
  211. package/dist/core/engine-helpers.js +1 -0
  212. package/dist/core/events/activity-events.d.ts +43 -12
  213. package/dist/core/events/activity-events.js +28 -0
  214. package/dist/core/events/attribute-events.d.ts +2 -3
  215. package/dist/core/events/event-map.d.ts +18 -12
  216. package/dist/core/events/index.d.ts +1 -0
  217. package/dist/core/events/index.js +1 -0
  218. package/dist/core/events/schedule-events.d.ts +71 -0
  219. package/dist/core/events/schedule-events.js +29 -0
  220. package/dist/core/events/signal-events.d.ts +4 -6
  221. package/dist/core/events/system-events.d.ts +29 -19
  222. package/dist/core/events/system-events.js +26 -0
  223. package/dist/core/events/update-events.d.ts +6 -8
  224. package/dist/core/events/workflow-events.d.ts +88 -23
  225. package/dist/core/events/workflow-events.js +26 -0
  226. package/dist/core/failure-categories.js +5 -17
  227. package/dist/core/fault-code.d.ts +9 -3
  228. package/dist/core/fault-code.js +1 -0
  229. package/dist/core/inline-execution-strategy.context-options.d.ts +69 -0
  230. package/dist/core/inline-execution-strategy.context-options.js +56 -0
  231. package/dist/core/inline-execution-strategy.d.ts +31 -36
  232. package/dist/core/inline-execution-strategy.js +16 -27
  233. package/dist/core/list-filter-validation.d.ts +1 -1
  234. package/dist/core/payload-size.d.ts +1 -1
  235. package/dist/core/persisted-data-incompatible-error.d.ts +9 -7
  236. package/dist/core/review/events.d.ts +6 -8
  237. package/dist/core/scheduler/scheduler-class.d.ts +10 -1
  238. package/dist/core/scheduler/scheduler-class.js +38 -11
  239. package/dist/core/scheduler/timer-batch.js +9 -1
  240. package/dist/core/scheduler/timer-sources.d.ts +1 -0
  241. package/dist/core/scheduler/timer-sources.js +11 -5
  242. package/dist/core/session-state.d.ts +0 -1
  243. package/dist/core/session-state.js +2 -2
  244. package/dist/core/start-workflow-validation.d.ts +34 -0
  245. package/dist/core/start-workflow-validation.js +19 -0
  246. package/dist/core/types/activity-verification.d.ts +67 -0
  247. package/dist/core/types/activity-verification.js +0 -0
  248. package/dist/core/types/activity.d.ts +80 -61
  249. package/dist/core/types/bulk.d.ts +50 -9
  250. package/dist/core/types/checkpoint.d.ts +44 -8
  251. package/dist/core/types/list-options.d.ts +146 -0
  252. package/dist/core/types/list-options.js +0 -0
  253. package/dist/core/types/options.d.ts +121 -165
  254. package/dist/core/types/schedules.d.ts +39 -3
  255. package/dist/core/types/services-resolution.d.ts +2 -2
  256. package/dist/core/types/workflow-builder-runtime.d.ts +12 -3
  257. package/dist/core/types/workflow-builder-runtime.js +11 -2
  258. package/dist/core/types/workflow-builder.d.ts +42 -11
  259. package/dist/core/types/workflow-concurrency.d.ts +39 -0
  260. package/dist/core/types/workflow-concurrency.js +0 -0
  261. package/dist/core/types/workflow-context.d.ts +157 -14
  262. package/dist/core/types/workflow-definition.d.ts +53 -10
  263. package/dist/core/types/workflow-function.d.ts +84 -9
  264. package/dist/core/types/workflow-log.d.ts +98 -0
  265. package/dist/core/types/workflow-log.js +0 -0
  266. package/dist/core/types/workflow-registries.d.ts +14 -3
  267. package/dist/core/types/workflow-registry.d.ts +3 -0
  268. package/dist/core/types.d.ts +4 -0
  269. package/dist/core/types.js +4 -0
  270. package/dist/core/versioning.d.ts +9 -39
  271. package/dist/core/versioning.js +2 -12
  272. package/dist/core/weft-error.d.ts +44 -1
  273. package/dist/core/weft-error.js +16 -0
  274. package/dist/core/worker-execution-strategy-options.d.ts +26 -0
  275. package/dist/core/worker-execution-strategy.js +40 -36
  276. package/dist/core/worker-inbound-message.d.ts +38 -0
  277. package/dist/core/worker-inbound-message.js +37 -0
  278. package/dist/core/worker-log-abuse-counter.d.ts +175 -0
  279. package/dist/core/worker-log-abuse-counter.js +107 -0
  280. package/dist/core/worker-message-helpers.d.ts +47 -0
  281. package/dist/core/worker-message-helpers.js +26 -0
  282. package/dist/core/worker-protocol-guard.js +1 -1
  283. package/dist/core/worker-protocol-log.d.ts +56 -0
  284. package/dist/core/worker-protocol-log.js +18 -0
  285. package/dist/core/worker-protocol.d.ts +23 -0
  286. package/dist/core/worker-protocol.js +12 -2
  287. package/dist/core/workflow-version-tuple.d.ts +3 -9
  288. package/dist/core/workflow-version-tuple.js +2 -3
  289. package/dist/diagnostics/format.js +1 -6
  290. package/dist/diagnostics/types.d.ts +4 -5
  291. package/dist/diagnostics/validate.d.ts +0 -1
  292. package/dist/diagnostics/version-check.d.ts +1 -1
  293. package/dist/diagnostics/version-check.js +4 -9
  294. package/dist/index.d.ts +12 -10
  295. package/dist/index.js +29 -3
  296. package/dist/json-schema.js +3 -3
  297. package/dist/mcp/cli.js +27 -27
  298. package/dist/mcp/dispatcher.js +1 -1
  299. package/dist/mcp/http.js +16 -6
  300. package/dist/mcp/protocol.d.ts +2 -0
  301. package/dist/mcp/protocol.js +1 -1
  302. package/dist/mcp/session.d.ts +16 -0
  303. package/dist/mcp/session.js +59 -6
  304. package/dist/mcp/tools.js +73 -6
  305. package/dist/observability/index.js +2 -2
  306. package/dist/server/asyncapi-channels.js +5 -2
  307. package/dist/server/attribute-filters.d.ts +8 -3
  308. package/dist/server/attribute-filters.js +6 -1
  309. package/dist/server/authentication/api-key.d.ts +2 -1
  310. package/dist/server/authentication/api-key.js +5 -2
  311. package/dist/server/authentication/constant-time-api-key.d.ts +15 -0
  312. package/dist/server/authentication/constant-time-api-key.js +24 -0
  313. package/dist/server/authentication/index.d.ts +1 -1
  314. package/dist/server/authentication/index.js +7 -4
  315. package/dist/server/authentication/rotating-api-key-store.d.ts +5 -3
  316. package/dist/server/authentication/rotating-api-key-store.js +19 -11
  317. package/dist/server/engine-event-feed-backend.d.ts +4 -5
  318. package/dist/server/fault-to-http.js +8 -1
  319. package/dist/server/fault-to-json-rpc.js +1 -0
  320. package/dist/server/fleet-event-feed.d.ts +31 -0
  321. package/dist/server/fleet-event-feed.js +157 -0
  322. package/dist/server/handler/index.js +1 -1
  323. package/dist/server/handler/response-helpers.js +2 -1
  324. package/dist/server/handler/route-dispatch.d.ts +6 -3
  325. package/dist/server/handler/route-dispatch.js +2 -2
  326. package/dist/server/handler.js +23 -23
  327. package/dist/server/index.d.ts +32 -2
  328. package/dist/server/index.js +26 -26
  329. package/dist/server/json-rpc-transport-helpers.d.ts +1 -0
  330. package/dist/server/json-rpc-transport-helpers.js +2 -1
  331. package/dist/server/json-rpc-websocket-runtime.d.ts +11 -2
  332. package/dist/server/json-rpc-websocket-runtime.js +1 -0
  333. package/dist/server/json-rpc-websocket-subscriptions.d.ts +10 -0
  334. package/dist/server/json-rpc-websocket-subscriptions.js +29 -0
  335. package/dist/server/json-rpc-websocket-types.d.ts +22 -0
  336. package/dist/server/json-rpc-websocket-types.js +0 -0
  337. package/dist/server/json-rpc-websocket-validation.js +20 -4
  338. package/dist/server/json-rpc-websocket.d.ts +2 -43
  339. package/dist/server/json-rpc-websocket.js +57 -74
  340. package/dist/server/openapi.d.ts +2 -1
  341. package/dist/server/openapi.js +1 -3
  342. package/dist/server/openrpc-document-schema.d.ts +78 -0
  343. package/dist/server/openrpc-document-schema.js +27 -1
  344. package/dist/server/openrpc-errors.d.ts +3 -0
  345. package/dist/server/openrpc-errors.js +2 -1
  346. package/dist/server/openrpc.js +32 -0
  347. package/dist/server/operation-catalog/index.d.ts +1 -1
  348. package/dist/server/operation-catalog/pipeline-helpers.js +1 -0
  349. package/dist/server/operation-catalog/pipeline-stages.js +26 -12
  350. package/dist/server/operation-catalog/pipeline.js +8 -1
  351. package/dist/server/operation-catalog/registry.js +13 -0
  352. package/dist/server/operation-catalog/types.d.ts +20 -9
  353. package/dist/server/operation-fault.d.ts +10 -0
  354. package/dist/server/operation-fault.js +2 -0
  355. package/dist/server/operation-registry.d.ts +12 -11
  356. package/dist/server/operation-registry.js +12 -3
  357. package/dist/server/operations/aggregate-workflows.d.ts +15 -15
  358. package/dist/server/operations/async-activity.d.ts +2 -2
  359. package/dist/server/operations/async-activity.js +12 -7
  360. package/dist/server/operations/bulk-cancel-workflows.d.ts +1 -1
  361. package/dist/server/operations/bulk-cancel-workflows.js +2 -2
  362. package/dist/server/operations/bulk-delete-workflows.d.ts +1 -1
  363. package/dist/server/operations/bulk-delete-workflows.js +2 -2
  364. package/dist/server/operations/bulk-filter-helpers.d.ts +8 -6
  365. package/dist/server/operations/bulk-filter-helpers.js +54 -24
  366. package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +11 -9
  367. package/dist/server/operations/bulk-mutate-workflow-tags.js +2 -2
  368. package/dist/server/operations/bulk-operation-helpers.d.ts +2 -2
  369. package/dist/server/operations/bulk-retry-failed-workflows.d.ts +7 -0
  370. package/dist/server/operations/bulk-retry-failed-workflows.js +64 -0
  371. package/dist/server/operations/bulk-signal-workflows.d.ts +11 -9
  372. package/dist/server/operations/bulk-signal-workflows.js +2 -2
  373. package/dist/server/operations/cancel-schedule.d.ts +1 -1
  374. package/dist/server/operations/create-schedule.d.ts +3 -1
  375. package/dist/server/operations/create-schedule.js +29 -11
  376. package/dist/server/operations/fleet-events-subscription.d.ts +54 -0
  377. package/dist/server/operations/fleet-events-subscription.js +99 -0
  378. package/dist/server/operations/fork-workflow.d.ts +1 -1
  379. package/dist/server/operations/fork-workflow.js +3 -2
  380. package/dist/server/operations/get-checkpoint-at.d.ts +1 -1
  381. package/dist/server/operations/get-registry.d.ts +1 -1
  382. package/dist/server/operations/get-retention-overview.d.ts +1 -1
  383. package/dist/server/operations/get-review.d.ts +1 -1
  384. package/dist/server/operations/get-schedule.d.ts +1 -1
  385. package/dist/server/operations/get-stream-chunks.d.ts +1 -1
  386. package/dist/server/operations/get-system-metrics.d.ts +2 -2
  387. package/dist/server/operations/get-task-diagnostics.d.ts +45 -6
  388. package/dist/server/operations/get-task-diagnostics.js +101 -7
  389. package/dist/server/operations/get-update-result.d.ts +1 -1
  390. package/dist/server/operations/get-workflow-attributes.d.ts +1 -1
  391. package/dist/server/operations/get-workflow-events.d.ts +1 -1
  392. package/dist/server/operations/get-workflow-result.d.ts +1 -1
  393. package/dist/server/operations/get-workflow-timeline.d.ts +1 -1
  394. package/dist/server/operations/get-workflow.d.ts +1 -1
  395. package/dist/server/operations/list-checkpoints.d.ts +1 -1
  396. package/dist/server/operations/list-reviews.d.ts +1 -1
  397. package/dist/server/operations/list-schedules.d.ts +1 -1
  398. package/dist/server/operations/list-task-queues.d.ts +2 -2
  399. package/dist/server/operations/list-workers.d.ts +2 -2
  400. package/dist/server/operations/list-workflows.d.ts +1 -1
  401. package/dist/server/operations/operation-helpers.d.ts +16 -1
  402. package/dist/server/operations/operation-helpers.js +15 -3
  403. package/dist/server/operations/pause-schedule.d.ts +1 -1
  404. package/dist/server/operations/purge-workflows.d.ts +5 -5
  405. package/dist/server/operations/purge-workflows.js +2 -2
  406. package/dist/server/operations/query-workflow.d.ts +1 -1
  407. package/dist/server/operations/query-workflow.js +3 -2
  408. package/dist/server/operations/recover-all.d.ts +1 -1
  409. package/dist/server/operations/replay-workflow.d.ts +1 -1
  410. package/dist/server/operations/resume-schedule.d.ts +1 -1
  411. package/dist/server/operations/set-workflow-attributes.d.ts +1 -1
  412. package/dist/server/operations/set-workflow-attributes.js +6 -3
  413. package/dist/server/operations/signal-workflow.js +8 -3
  414. package/dist/server/operations/single-workflow-tag-mutation.js +13 -3
  415. package/dist/server/operations/start-or-signal-workflow.d.ts +6 -1
  416. package/dist/server/operations/start-or-signal-workflow.js +14 -24
  417. package/dist/server/operations/start-workflow-options.d.ts +6 -0
  418. package/dist/server/operations/start-workflow-rest-input.d.ts +14 -0
  419. package/dist/server/operations/start-workflow-rest-input.js +31 -0
  420. package/dist/server/operations/start-workflow.d.ts +1 -1
  421. package/dist/server/operations/start-workflow.js +8 -23
  422. package/dist/server/operations/storage.d.ts +6 -6
  423. package/dist/server/operations/storage.js +24 -14
  424. package/dist/server/operations/stream-workflow-sse.d.ts +1 -1
  425. package/dist/server/operations/submit-review-decision.d.ts +1 -1
  426. package/dist/server/operations/submit-review-decision.js +6 -3
  427. package/dist/server/operations/update-schedule.d.ts +1 -1
  428. package/dist/server/operations/update-schedule.js +7 -4
  429. package/dist/server/operations/update-workflow.d.ts +1 -1
  430. package/dist/server/operations/update-workflow.js +7 -3
  431. package/dist/server/operations/worker-drain.d.ts +8 -8
  432. package/dist/server/operations/worker-drain.js +11 -8
  433. package/dist/server/operations/workflow-events-subscription.d.ts +7 -8
  434. package/dist/server/operations/workflow-events-subscription.js +43 -8
  435. package/dist/server/rest-binding.d.ts +3 -1
  436. package/dist/server/rest-bindings.js +12 -0
  437. package/dist/server/rest-body.d.ts +10 -0
  438. package/dist/server/rest-body.js +80 -0
  439. package/dist/server/runtime/authentication-bridge.d.ts +1 -0
  440. package/dist/server/runtime/authentication-bridge.js +33 -6
  441. package/dist/server/runtime/client-visible-events.d.ts +3 -0
  442. package/dist/server/runtime/client-visible-events.js +65 -0
  443. package/dist/server/runtime/context.d.ts +7 -0
  444. package/dist/server/runtime/event-broadcasting.d.ts +6 -0
  445. package/dist/server/runtime/event-broadcasting.js +72 -38
  446. package/dist/server/runtime/retry.d.ts +1 -0
  447. package/dist/server/runtime/retry.js +14 -0
  448. package/dist/server/runtime/shutdown.d.ts +7 -6
  449. package/dist/server/runtime/shutdown.js +6 -1
  450. package/dist/server/runtime/task-polling.js +61 -20
  451. package/dist/server/runtime/task-reconciliation.js +9 -1
  452. package/dist/server/runtime/task-result-resolution.d.ts +15 -0
  453. package/dist/server/runtime/task-result-resolution.js +81 -0
  454. package/dist/server/runtime/websocket-stream.d.ts +20 -1
  455. package/dist/server/runtime/websocket-stream.js +173 -7
  456. package/dist/server/runtime/websocket-upgrade.js +22 -3
  457. package/dist/server/runtime/websocket-worker.d.ts +1 -1
  458. package/dist/server/runtime/websocket-worker.js +38 -30
  459. package/dist/server/serve-internals.d.ts +3 -1
  460. package/dist/server/serve-internals.js +18 -2
  461. package/dist/server/task-state.d.ts +30 -0
  462. package/dist/server/task-state.js +28 -0
  463. package/dist/server/workflow-event-feed.d.ts +36 -115
  464. package/dist/server/workflow-event-feed.js +92 -27
  465. package/dist/service-worker/index.js +30 -30
  466. package/dist/storage/auto.js +1 -1
  467. package/dist/storage/bun-sql.js +24 -0
  468. package/dist/storage/compressed-storage.js +1 -1
  469. package/dist/storage/default-scope.d.ts +7 -4
  470. package/dist/storage/http.js +2 -2
  471. package/dist/storage/index.d.ts +76 -4
  472. package/dist/storage/indexeddb.js +1 -1
  473. package/dist/storage/interface.d.ts +163 -0
  474. package/dist/storage/interface.js +1 -1
  475. package/dist/storage/key-prefixes.d.ts +1 -1
  476. package/dist/storage/key-prefixes.js +10 -0
  477. package/dist/storage/lmdb.d.ts +4 -3
  478. package/dist/storage/lmdb.js +1 -1
  479. package/dist/storage/memory.js +1 -1
  480. package/dist/storage/neon-batch.d.ts +30 -0
  481. package/dist/storage/neon-batch.js +30 -0
  482. package/dist/storage/neon-value-mapping.d.ts +30 -3
  483. package/dist/storage/neon-value-mapping.js +12 -0
  484. package/dist/storage/neon.d.ts +16 -0
  485. package/dist/storage/neon.js +9 -4
  486. package/dist/storage/node-sqlite.js +23 -0
  487. package/dist/storage/postgres-key-value-queries.d.ts +69 -44
  488. package/dist/storage/postgres-key-value-queries.js +62 -24
  489. package/dist/storage/resolve.js +1 -1
  490. package/dist/storage/scoped-storage.js +1 -1
  491. package/dist/storage/testing.d.ts +168 -0
  492. package/dist/storage/testing.js +2 -0
  493. package/dist/storage/turso.d.ts +8 -0
  494. package/dist/storage/turso.js +2 -2
  495. package/dist/storage/typed-storage.js +1 -1
  496. package/dist/storage/web-extension.js +1 -1
  497. package/dist/testing/index.js +28 -28
  498. package/dist/version.d.ts +1 -1
  499. package/dist/version.js +1 -1
  500. package/dist/worker/protocol.js +1 -1
  501. package/dist/workers/worker-replay-state.d.ts +32 -0
  502. package/dist/workers/worker-replay-state.js +35 -0
  503. package/dist/workers/worker-state-namespace.d.ts +21 -0
  504. package/dist/workers/worker-state-namespace.js +13 -0
  505. package/dist/workers/workflow-runner.d.ts +19 -15
  506. package/dist/workers/workflow-runner.js +72 -60
  507. package/dist/workers/workflow-worker-entry.js +5 -2
  508. package/package.json +5 -1
package/dist/version.d.ts CHANGED
@@ -9,4 +9,4 @@
9
9
  * console.log(`Running Weft ${VERSION}`);
10
10
  * ```
11
11
  */
12
- export declare const VERSION = "0.3.0";
12
+ export declare const VERSION = "0.4.0";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const VERSION = "0.3.0";
1
+ export const VERSION = "0.4.0";
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var h=Object.defineProperty;var M=(z)=>z;function I(z,B){this[z]=M.bind(null,B)}var r=(z,B)=>{for(var D in B)h(z,D,{get:B[D],enumerable:!0,configurable:!0,set:I.bind(B,D)})};var o=(z,B)=>()=>(z&&(B=z(z=0)),B);function G(z){return z!==null&&typeof z==="object"&&!Array.isArray(z)}function U(z){if(z===null||typeof z==="string"||typeof z==="boolean"||typeof z==="number"&&Number.isFinite(z))return!0;if(Array.isArray(z))return z.every(U);if(!G(z))return!1;return Object.values(z).every(U)}function Y(z){return typeof z==="string"&&z.length>0}function j(z){return Array.isArray(z)&&z.every(Y)}function w(z){if(!G(z))return!1;return Object.values(z).every((B)=>typeof B==="string")}function q(z){if(!G(z))return!1;return Object.values(z).every(U)}function b(z){return typeof z==="number"&&Number.isFinite(z)}function Q(z,B,D){return{ok:!1,error:{code:z,message:B,...D!==void 0?{requestedProtocolVersion:D}:{}}}}function J(z,B,D){let X={};for(let[Z,x,H,C]of D){let L=B[Z];if(L===void 0){if(x)return{ok:!1,error:Q(z,C)};continue}if(!H(L))return{ok:!1,error:Q(z,C)};X[Z]=L}return{ok:!0,values:X}}var $=2,P=2,g=2,_=[2];var F={$ref:"#/$defs/jsonValue"},A={type:"object",additionalProperties:F},y={type:"object",additionalProperties:{type:"string"}},f={const:$},K={register:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","activities"],properties:{type:{const:"register"},protocolVersion:f,workerId:{type:"string",minLength:1},activities:{type:"array",items:{type:"string",minLength:1}},concurrency:{type:"number",minimum:1,maximum:1000},queue:{type:"string",minLength:1},deploymentName:{type:"string",minLength:1},buildId:{type:"string",minLength:1},runtimeVersion:{type:"string",minLength:1},gitSha:{type:"string",minLength:1},startedAt:{type:"number"},capabilities:A}},heartbeat:{type:"object",additionalProperties:!1,required:["type","workerId"],properties:{type:{const:"heartbeat"},workerId:{type:"string",minLength:1}}},taskResult:{oneOf:[{type:"object",additionalProperties:!1,required:["type","operationId","status","value"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"completed"},value:F,attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"failed"},error:{type:"string"},attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"cancelled"},error:{type:"string"},cancelled:{const:!0},attemptToken:{type:"string",minLength:1}}}]},task:{type:"object",additionalProperties:!1,required:["type","operationId","activityName","input"],properties:{type:{const:"task"},operationId:{type:"string",minLength:1},activityName:{type:"string",minLength:1},input:F,attempt:{type:"number",minimum:1},headers:y,attemptToken:{type:"string",minLength:1}}},cancel:{type:"object",additionalProperties:!1,required:["type","operationId"],properties:{type:{const:"cancel"},operationId:{type:"string",minLength:1}}},shutdown:{type:"object",additionalProperties:!1,required:["type"],properties:{type:{const:"shutdown"}}},registerAck:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","queue","activities","concurrency"],properties:{type:{const:"registerAck"},protocolVersion:f,workerId:{type:"string",minLength:1},queue:{type:"string",minLength:1},activities:{type:"array",items:{type:"string",minLength:1}},concurrency:{type:"number",minimum:1,maximum:1000}}},registerError:{type:"object",additionalProperties:!1,required:["type","code","message","supportedProtocolVersions"],properties:{type:{const:"registerError"},code:{enum:["invalid_registration","unsupported_protocol_version"]},message:{type:"string"},supportedProtocolVersions:{type:"array",items:f},requestedProtocolVersion:{type:"number"}}},protocolError:{type:"object",additionalProperties:!1,required:["type","code","message"],properties:{type:{const:"protocolError"},code:{enum:["invalid_json","invalid_message","unknown_message_type","registration_required"]},message:{type:"string"}}}},T={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://weft.dev/schemas/remote-worker-protocol.v1.json",title:"Weft RemoteWorker Protocol v1",oneOf:Object.keys(K).map((z)=>({$ref:`#/$defs/messages/${z}`})),$defs:{jsonValue:{oneOf:[{type:"null"},{type:"boolean"},{type:"number"},{type:"string"},{type:"array",items:{$ref:"#/$defs/jsonValue"}},{type:"object",additionalProperties:{$ref:"#/$defs/jsonValue"}}]},jsonObject:A,messages:K}};function N(z){let B=z.attemptToken;if(B===void 0)return{ok:!0,message:{}};if(!Y(B))return Q("invalid_message","taskResult.attemptToken must be a non-empty string when present");return{ok:!0,message:{attemptToken:B}}}function O(z,B){let D=B.value;if(!U(D))return Q("invalid_message","completed taskResult.value must be valid JSON");let X=N(B);if(!X.ok)return X;return{ok:!0,message:{type:"taskResult",operationId:z,status:"completed",value:D,...X.message}}}function V(z,B){let D=B.error;if(typeof D!=="string")return Q("invalid_message","failed taskResult.error must be a string");let X=N(B);if(!X.ok)return X;return{ok:!0,message:{type:"taskResult",operationId:z,status:"failed",error:D,...X.message}}}function S(z,B){let D=B.error;if(typeof D!=="string")return Q("invalid_message","cancelled taskResult.error must be a string");let X=B.cancelled;if(X!==void 0&&X!==!0)return Q("invalid_message","taskResult.cancelled must be true when present");let Z=N(B);if(!Z.ok)return Z;return{ok:!0,message:{type:"taskResult",operationId:z,status:"cancelled",error:D,...X===!0?{cancelled:X}:{},...Z.message}}}var k={completed:O,failed:V,cancelled:S};function E(z){return z==="completed"||z==="failed"||z==="cancelled"}function W(z){let B=z.operationId;if(!Y(B))return Q("invalid_message","taskResult.operationId must be a non-empty string");let D=z.status;if(!E(D))return Q("invalid_message","taskResult.status must be completed, failed, or cancelled");return k[D](B,z)}var m=new Set(["register","heartbeat","taskResult"]),R=new Set(["registerAck","registerError","protocolError","task","cancel","shutdown"]);function p(z){if(z===$)return{ok:!0,message:z};let B=b(z)?z:void 0;return Q("unsupported_protocol_version",`Unsupported RemoteWorker protocol version: ${String(z)}`,B)}var n=[["workerId",!0,Y,"register.workerId must be a non-empty string"],["activities",!0,j,"register.activities must be an array of non-empty strings"],["concurrency",!1,b,"register.concurrency must be a finite number"],["queue",!1,Y,"register.queue must be a non-empty string"],["deploymentName",!1,Y,"register.deploymentName must be a non-empty string when present"],["buildId",!1,Y,"register.buildId must be a non-empty string when present"],["runtimeVersion",!1,Y,"register.runtimeVersion must be a non-empty string when present"],["gitSha",!1,Y,"register.gitSha must be a non-empty string when present"],["startedAt",!1,b,"register.startedAt must be a finite number when present"],["capabilities",!1,q,"register.capabilities must be a JSON object when present"]];function i(z){let B=p(z.protocolVersion);if(!B.ok)return B;let D=J("invalid_registration",z,n);if(!D.ok)return D.error;return{ok:!0,message:{type:"register",protocolVersion:B.message,...D.values}}}function v(z){let B=z.workerId;if(!Y(B))return Q("invalid_message","heartbeat.workerId must be a non-empty string");return{ok:!0,message:{type:"heartbeat",workerId:B}}}var d=[["operationId",!0,Y,"task.operationId must be a non-empty string"],["activityName",!0,Y,"task.activityName must be a non-empty string"],["input",!0,U,"task.input must be valid JSON"],["attempt",!1,b,"task.attempt must be a finite number"],["headers",!1,w,"task.headers must be a string map"],["attemptToken",!1,Y,"task.attemptToken must be a non-empty string"]];function u(z){let B=J("invalid_message",z,d);if(!B.ok)return B.error;return{ok:!0,message:{type:"task",...B.values}}}function s(z){let B=z.operationId;if(!Y(B))return Q("invalid_message","cancel.operationId must be a non-empty string");return{ok:!0,message:{type:"cancel",operationId:B}}}function c(){return{ok:!0,message:{type:"shutdown"}}}function t(z){let B=z.protocolVersion;if(B!==$)return Q("invalid_message",`registerAck.protocolVersion must be ${String($)}`);let{workerId:D,queue:X,activities:Z,concurrency:x}=z;if(!Y(D))return Q("invalid_message","registerAck.workerId must be a non-empty string");if(!Y(X))return Q("invalid_message","registerAck.queue must be a non-empty string");if(!j(Z))return Q("invalid_message","registerAck.activities must be a string array");if(typeof x!=="number"||!Number.isFinite(x))return Q("invalid_message","registerAck.concurrency must be a finite number");return{ok:!0,message:{type:"registerAck",protocolVersion:B,workerId:D,queue:X,activities:Z,concurrency:x}}}function l(z){let{code:B,message:D,supportedProtocolVersions:X,requestedProtocolVersion:Z}=z;if(B!=="invalid_registration"&&B!=="unsupported_protocol_version")return Q("invalid_message","registerError.code is not recognized");if(typeof D!=="string")return Q("invalid_message","registerError.message must be a string");if(!Array.isArray(X)||!X.every((H)=>H===$))return Q("invalid_message","registerError.supportedProtocolVersions is invalid");if(Z!==void 0&&!b(Z))return Q("invalid_message","registerError.requestedProtocolVersion must be a finite number");return{ok:!0,message:{type:"registerError",code:B,message:D,supportedProtocolVersions:X,...Z!==void 0?{requestedProtocolVersion:Z}:{}}}}function a(z){let{code:B,message:D}=z;if(B!=="invalid_json"&&B!=="invalid_message"&&B!=="unknown_message_type"&&B!=="registration_required")return Q("invalid_message","protocolError.code is not recognized");if(typeof D!=="string")return Q("invalid_message","protocolError.message must be a string");return{ok:!0,message:{type:"protocolError",code:B,message:D}}}function Gz(z){if(!G(z))return Q("invalid_message","Worker protocol message must be a JSON object");let B=z.type;if(typeof B!=="string")return Q("invalid_message","Worker protocol message.type must be a string");if(!m.has(B))return Q("unknown_message_type",`Unknown worker message type: ${B}`);switch(B){case"register":return i(z);case"heartbeat":return v(z);case"taskResult":return W(z);default:return Q("unknown_message_type",`Unknown worker message type: ${B}`)}}function bz(z){if(!G(z))return Q("invalid_message","Server protocol message must be a JSON object");let B=z.type;if(typeof B!=="string")return Q("invalid_message","Server protocol message.type must be a string");if(!R.has(B))return Q("unknown_message_type",`Unknown server message type: ${B}`);switch(B){case"registerAck":return t(z);case"registerError":return l(z);case"protocolError":return a(z);case"task":return u(z);case"cancel":return s(z);case"shutdown":return c();default:return Q("unknown_message_type",`Unknown server message type: ${B}`)}}export{Gz as parseWorkerToServerMessage,bz as parseServerToWorkerMessage,U as isRemoteWorkerJsonValue,_ as REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS,$ as REMOTE_WORKER_PROTOCOL_VERSION,T as REMOTE_WORKER_PROTOCOL_JSON_SCHEMA,P as REMOTE_WORKER_MIN_PROTOCOL_VERSION,K as REMOTE_WORKER_MESSAGE_SCHEMAS,g as REMOTE_WORKER_MAX_PROTOCOL_VERSION};
2
+ var h=Object.defineProperty;var M=(z)=>z;function I(z,B){this[z]=M.bind(null,B)}var r=(z,B)=>{for(var D in B)h(z,D,{get:B[D],enumerable:!0,configurable:!0,set:I.bind(B,D)})};var o=(z,B)=>()=>(z&&(B=z(z=0)),B);var e=(z,B,D)=>{if(B!=null){if(typeof B!=="object"&&typeof B!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let X;if(D)X=B[Symbol.asyncDispose];if(X===void 0)X=B[Symbol.dispose];if(typeof X!=="function")throw TypeError("Object not disposable");z.push([D,X,B])}else if(D)z.push([D]);return B},zz=(z,B,D)=>{let X=(U)=>B=D?new SuppressedError(U,B,"An error was suppressed during disposal"):(D=!0,U),Y=(U)=>{while(U=z.pop())try{var L=U[1]&&U[1].call(U[2]);if(U[0])return Promise.resolve(L).then(Y,(G)=>(X(G),Y()))}catch(G){X(G)}if(D)throw B};return Y()};function b(z){return z!==null&&typeof z==="object"&&!Array.isArray(z)}function $(z){if(z===null||typeof z==="string"||typeof z==="boolean"||typeof z==="number"&&Number.isFinite(z))return!0;if(Array.isArray(z))return z.every($);if(!b(z))return!1;return Object.values(z).every($)}function Z(z){return typeof z==="string"&&z.length>0}function J(z){return Array.isArray(z)&&z.every(Z)}function w(z){if(!b(z))return!1;return Object.values(z).every((B)=>typeof B==="string")}function q(z){if(!b(z))return!1;return Object.values(z).every($)}function H(z){return typeof z==="number"&&Number.isFinite(z)}function Q(z,B,D){return{ok:!1,error:{code:z,message:B,...D!==void 0?{requestedProtocolVersion:D}:{}}}}function f(z,B,D){let X={};for(let[Y,U,L,G]of D){let j=B[Y];if(j===void 0){if(U)return{ok:!1,error:Q(z,G)};continue}if(!L(j))return{ok:!1,error:Q(z,G)};X[Y]=j}return{ok:!0,values:X}}var x=2,P=2,g=2,_=[2];var K={$ref:"#/$defs/jsonValue"},A={type:"object",additionalProperties:K},y={type:"object",additionalProperties:{type:"string"}},F={const:x},N={register:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","activities"],properties:{type:{const:"register"},protocolVersion:F,workerId:{type:"string",minLength:1},activities:{type:"array",items:{type:"string",minLength:1}},concurrency:{type:"number",minimum:1,maximum:1000},queue:{type:"string",minLength:1},deploymentName:{type:"string",minLength:1},buildId:{type:"string",minLength:1},runtimeVersion:{type:"string",minLength:1},gitSha:{type:"string",minLength:1},startedAt:{type:"number"},capabilities:A}},heartbeat:{type:"object",additionalProperties:!1,required:["type","workerId"],properties:{type:{const:"heartbeat"},workerId:{type:"string",minLength:1}}},taskResult:{oneOf:[{type:"object",additionalProperties:!1,required:["type","operationId","status","value"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"completed"},value:K,attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"failed"},error:{type:"string"},attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"cancelled"},error:{type:"string"},cancelled:{const:!0},attemptToken:{type:"string",minLength:1}}}]},task:{type:"object",additionalProperties:!1,required:["type","operationId","activityName","input"],properties:{type:{const:"task"},operationId:{type:"string",minLength:1},activityName:{type:"string",minLength:1},input:K,attempt:{type:"number",minimum:1},headers:y,attemptToken:{type:"string",minLength:1}}},cancel:{type:"object",additionalProperties:!1,required:["type","operationId"],properties:{type:{const:"cancel"},operationId:{type:"string",minLength:1}}},shutdown:{type:"object",additionalProperties:!1,required:["type"],properties:{type:{const:"shutdown"}}},registerAck:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","queue","activities","concurrency"],properties:{type:{const:"registerAck"},protocolVersion:F,workerId:{type:"string",minLength:1},queue:{type:"string",minLength:1},activities:{type:"array",items:{type:"string",minLength:1}},concurrency:{type:"number",minimum:1,maximum:1000}}},registerError:{type:"object",additionalProperties:!1,required:["type","code","message","supportedProtocolVersions"],properties:{type:{const:"registerError"},code:{enum:["invalid_registration","unsupported_protocol_version"]},message:{type:"string"},supportedProtocolVersions:{type:"array",items:F},requestedProtocolVersion:{type:"number"}}},protocolError:{type:"object",additionalProperties:!1,required:["type","code","message"],properties:{type:{const:"protocolError"},code:{enum:["invalid_json","invalid_message","unknown_message_type","registration_required"]},message:{type:"string"}}}},T={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://weft.dev/schemas/remote-worker-protocol.v1.json",title:"Weft RemoteWorker Protocol v1",oneOf:Object.keys(N).map((z)=>({$ref:`#/$defs/messages/${z}`})),$defs:{jsonValue:{oneOf:[{type:"null"},{type:"boolean"},{type:"number"},{type:"string"},{type:"array",items:{$ref:"#/$defs/jsonValue"}},{type:"object",additionalProperties:{$ref:"#/$defs/jsonValue"}}]},jsonObject:A,messages:N}};function C(z){let B=z.attemptToken;if(B===void 0)return{ok:!0,message:{}};if(!Z(B))return Q("invalid_message","taskResult.attemptToken must be a non-empty string when present");return{ok:!0,message:{attemptToken:B}}}function O(z,B){let D=B.value;if(!$(D))return Q("invalid_message","completed taskResult.value must be valid JSON");let X=C(B);if(!X.ok)return X;return{ok:!0,message:{type:"taskResult",operationId:z,status:"completed",value:D,...X.message}}}function V(z,B){let D=B.error;if(typeof D!=="string")return Q("invalid_message","failed taskResult.error must be a string");let X=C(B);if(!X.ok)return X;return{ok:!0,message:{type:"taskResult",operationId:z,status:"failed",error:D,...X.message}}}function S(z,B){let D=B.error;if(typeof D!=="string")return Q("invalid_message","cancelled taskResult.error must be a string");let X=B.cancelled;if(X!==void 0&&X!==!0)return Q("invalid_message","taskResult.cancelled must be true when present");let Y=C(B);if(!Y.ok)return Y;return{ok:!0,message:{type:"taskResult",operationId:z,status:"cancelled",error:D,...X===!0?{cancelled:X}:{},...Y.message}}}var k={completed:O,failed:V,cancelled:S};function E(z){return z==="completed"||z==="failed"||z==="cancelled"}function W(z){let B=z.operationId;if(!Z(B))return Q("invalid_message","taskResult.operationId must be a non-empty string");let D=z.status;if(!E(D))return Q("invalid_message","taskResult.status must be completed, failed, or cancelled");return k[D](B,z)}var m=new Set(["register","heartbeat","taskResult"]),R=new Set(["registerAck","registerError","protocolError","task","cancel","shutdown"]);function p(z){if(z===x)return{ok:!0,message:z};let B=H(z)?z:void 0;return Q("unsupported_protocol_version",`Unsupported RemoteWorker protocol version: ${String(z)}`,B)}var n=[["workerId",!0,Z,"register.workerId must be a non-empty string"],["activities",!0,J,"register.activities must be an array of non-empty strings"],["concurrency",!1,H,"register.concurrency must be a finite number"],["queue",!1,Z,"register.queue must be a non-empty string"],["deploymentName",!1,Z,"register.deploymentName must be a non-empty string when present"],["buildId",!1,Z,"register.buildId must be a non-empty string when present"],["runtimeVersion",!1,Z,"register.runtimeVersion must be a non-empty string when present"],["gitSha",!1,Z,"register.gitSha must be a non-empty string when present"],["startedAt",!1,H,"register.startedAt must be a finite number when present"],["capabilities",!1,q,"register.capabilities must be a JSON object when present"]];function i(z){let B=p(z.protocolVersion);if(!B.ok)return B;let D=f("invalid_registration",z,n);if(!D.ok)return D.error;return{ok:!0,message:{type:"register",protocolVersion:B.message,...D.values}}}function v(z){let B=z.workerId;if(!Z(B))return Q("invalid_message","heartbeat.workerId must be a non-empty string");return{ok:!0,message:{type:"heartbeat",workerId:B}}}var d=[["operationId",!0,Z,"task.operationId must be a non-empty string"],["activityName",!0,Z,"task.activityName must be a non-empty string"],["input",!0,$,"task.input must be valid JSON"],["attempt",!1,H,"task.attempt must be a finite number"],["headers",!1,w,"task.headers must be a string map"],["attemptToken",!1,Z,"task.attemptToken must be a non-empty string"]];function u(z){let B=f("invalid_message",z,d);if(!B.ok)return B.error;return{ok:!0,message:{type:"task",...B.values}}}function s(z){let B=z.operationId;if(!Z(B))return Q("invalid_message","cancel.operationId must be a non-empty string");return{ok:!0,message:{type:"cancel",operationId:B}}}function c(){return{ok:!0,message:{type:"shutdown"}}}function t(z){let B=z.protocolVersion;if(B!==x)return Q("invalid_message",`registerAck.protocolVersion must be ${String(x)}`);let{workerId:D,queue:X,activities:Y,concurrency:U}=z;if(!Z(D))return Q("invalid_message","registerAck.workerId must be a non-empty string");if(!Z(X))return Q("invalid_message","registerAck.queue must be a non-empty string");if(!J(Y))return Q("invalid_message","registerAck.activities must be a string array");if(typeof U!=="number"||!Number.isFinite(U))return Q("invalid_message","registerAck.concurrency must be a finite number");return{ok:!0,message:{type:"registerAck",protocolVersion:B,workerId:D,queue:X,activities:Y,concurrency:U}}}function l(z){let{code:B,message:D,supportedProtocolVersions:X,requestedProtocolVersion:Y}=z;if(B!=="invalid_registration"&&B!=="unsupported_protocol_version")return Q("invalid_message","registerError.code is not recognized");if(typeof D!=="string")return Q("invalid_message","registerError.message must be a string");if(!Array.isArray(X)||!X.every((L)=>L===x))return Q("invalid_message","registerError.supportedProtocolVersions is invalid");if(Y!==void 0&&!H(Y))return Q("invalid_message","registerError.requestedProtocolVersion must be a finite number");return{ok:!0,message:{type:"registerError",code:B,message:D,supportedProtocolVersions:X,...Y!==void 0?{requestedProtocolVersion:Y}:{}}}}function a(z){let{code:B,message:D}=z;if(B!=="invalid_json"&&B!=="invalid_message"&&B!=="unknown_message_type"&&B!=="registration_required")return Q("invalid_message","protocolError.code is not recognized");if(typeof D!=="string")return Q("invalid_message","protocolError.message must be a string");return{ok:!0,message:{type:"protocolError",code:B,message:D}}}function Hz(z){if(!b(z))return Q("invalid_message","Worker protocol message must be a JSON object");let B=z.type;if(typeof B!=="string")return Q("invalid_message","Worker protocol message.type must be a string");if(!m.has(B))return Q("unknown_message_type",`Unknown worker message type: ${B}`);switch(B){case"register":return i(z);case"heartbeat":return v(z);case"taskResult":return W(z);default:return Q("unknown_message_type",`Unknown worker message type: ${B}`)}}function Lz(z){if(!b(z))return Q("invalid_message","Server protocol message must be a JSON object");let B=z.type;if(typeof B!=="string")return Q("invalid_message","Server protocol message.type must be a string");if(!R.has(B))return Q("unknown_message_type",`Unknown server message type: ${B}`);switch(B){case"registerAck":return t(z);case"registerError":return l(z);case"protocolError":return a(z);case"task":return u(z);case"cancel":return s(z);case"shutdown":return c();default:return Q("unknown_message_type",`Unknown server message type: ${B}`)}}export{Hz as parseWorkerToServerMessage,Lz as parseServerToWorkerMessage,$ as isRemoteWorkerJsonValue,_ as REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS,x as REMOTE_WORKER_PROTOCOL_VERSION,T as REMOTE_WORKER_PROTOCOL_JSON_SCHEMA,P as REMOTE_WORKER_MIN_PROTOCOL_VERSION,N as REMOTE_WORKER_MESSAGE_SCHEMAS,g as REMOTE_WORKER_MAX_PROTOCOL_VERSION};
@@ -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.3.0",
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",