@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
@@ -6,7 +6,6 @@ export function createCheckpoint(workflowId, version, now) {
6
6
  step: 0,
7
7
  locals: {},
8
8
  accumulatedResults: [],
9
- pendingSignals: [],
10
9
  searchAttributes: {},
11
10
  version,
12
11
  schemaVersion: CURRENT_CHECKPOINT_SCHEMA_VERSION,
@@ -19,9 +18,15 @@ export function advanceCheckpoint(checkpoint, locals, options) {
19
18
  step: checkpoint.step + 1,
20
19
  locals,
21
20
  accumulatedResults: options?.accumulatedResults ?? checkpoint.accumulatedResults,
22
- ...checkpoint.workerReplaySignatures === void 0 ? {} : { workerReplaySignatures: checkpoint.workerReplaySignatures },
23
- ...checkpoint.workerReplayFailures === void 0 ? {} : { workerReplayFailures: checkpoint.workerReplayFailures },
24
- pendingSignals: checkpoint.pendingSignals,
21
+ ...(options?.accumulatedResultReplayWatermark ?? checkpoint.accumulatedResultReplayWatermark) === void 0 ? {} : {
22
+ accumulatedResultReplayWatermark: options?.accumulatedResultReplayWatermark ?? checkpoint.accumulatedResultReplayWatermark
23
+ },
24
+ ...(options?.workerReplaySignatures ?? checkpoint.workerReplaySignatures) === void 0 ? {} : {
25
+ workerReplaySignatures: options?.workerReplaySignatures ?? checkpoint.workerReplaySignatures
26
+ },
27
+ ...(options?.workerReplayFailures ?? checkpoint.workerReplayFailures) === void 0 ? {} : {
28
+ workerReplayFailures: options?.workerReplayFailures ?? checkpoint.workerReplayFailures
29
+ },
25
30
  searchAttributes: {
26
31
  ...checkpoint.searchAttributes,
27
32
  ...options?.searchAttributes
@@ -26,9 +26,10 @@ export function validateCheckpointShape(value) {
26
26
  assertRecordField(record, "locals");
27
27
  validateSessionStateLocals(record.locals);
28
28
  normalizeAccumulatedResults(record);
29
+ validateAccumulatedResultReplayWatermark(record);
29
30
  validateWorkerReplaySignatures(record);
30
31
  validateWorkerReplayFailures(record);
31
- assertArrayField(record, "pendingSignals");
32
+ dropLegacyPendingSignals(record);
32
33
  assertRecordField(record, "searchAttributes");
33
34
  assertStringField(record, "version");
34
35
  assertNumberField(record, "createdAt");
@@ -132,10 +133,6 @@ function assertRecordField(record, field) {
132
133
  if (typeof record[field] !== "object" || record[field] === null)
133
134
  throw Error(`Invalid checkpoint: missing or invalid "${field}" (expected object)`);
134
135
  }
135
- function assertArrayField(record, field) {
136
- if (!Array.isArray(record[field]))
137
- throw Error(`Invalid checkpoint: missing or invalid "${field}" (expected array)`);
138
- }
139
136
  function normalizeAccumulatedResults(record) {
140
137
  if (!("accumulatedResults" in record)) {
141
138
  record.accumulatedResults = [];
@@ -144,6 +141,16 @@ function normalizeAccumulatedResults(record) {
144
141
  if (!Array.isArray(record.accumulatedResults))
145
142
  throw Error('Invalid checkpoint: invalid "accumulatedResults" (expected array)');
146
143
  }
144
+ function validateAccumulatedResultReplayWatermark(record) {
145
+ const watermark = record.accumulatedResultReplayWatermark;
146
+ if (watermark === void 0)
147
+ return;
148
+ if (typeof watermark !== "number" || !Number.isSafeInteger(watermark) || watermark < 0)
149
+ throw Error('Invalid checkpoint: invalid "accumulatedResultReplayWatermark" (expected non-negative safe integer)');
150
+ }
151
+ function dropLegacyPendingSignals(record) {
152
+ delete record.pendingSignals;
153
+ }
147
154
  function assertCurrentSchemaVersion(record) {
148
155
  const schemaVersion = record.schemaVersion;
149
156
  if (schemaVersion === void 0)
@@ -1,7 +1,23 @@
1
1
  import { ExtensionCodec } from '@msgpack/msgpack';
2
+ import { WeftError } from '../weft-error.ts';
3
+ declare const EXTENSION_TYPE_REGEXP = 2;
4
+ export declare class RegExpExtensionDecodeError extends WeftError<'RegExpExtensionDecodeError'> {
5
+ readonly extensionType: typeof EXTENSION_TYPE_REGEXP;
6
+ readonly source: string;
7
+ readonly flags: string;
8
+ readonly sourceByteLength: number;
9
+ constructor(parameters: {
10
+ source: string;
11
+ flags: string;
12
+ sourceByteLength: number;
13
+ reason: string;
14
+ cause?: unknown;
15
+ });
16
+ }
2
17
  export declare const extensionCodec: ExtensionCodec<undefined>;
3
18
  /**
4
19
  * Recursively replace `undefined` with the sentinel so msgpack's encoder
5
20
  * routes it through the extension codec instead of encoding it as null.
6
21
  */
7
22
  export declare function replaceUndefined(value: unknown, visited: Set<object>): unknown;
23
+ export {};
@@ -5,8 +5,52 @@ import {
5
5
  decodeCodecDate,
6
6
  encodeCodecDate
7
7
  } from "../codec-helpers.js";
8
- const EXTENSION_TYPE_DATE = 1, EXTENSION_TYPE_REGEXP = 2, EXTENSION_TYPE_MAP = 3, EXTENSION_TYPE_SET = 4, EXTENSION_TYPE_UNDEFINED = 5, EXTENSION_TYPE_ERROR = 6;
8
+ import { WeftError } from "../weft-error.js";
9
+ import { bindSerializerRegistryToCodec, hasRegisteredSerializer } from "./serializer-registry.js";
10
+ const EXTENSION_TYPE_DATE = 1, EXTENSION_TYPE_REGEXP = 2, EXTENSION_TYPE_MAP = 3, EXTENSION_TYPE_SET = 4, EXTENSION_TYPE_UNDEFINED = 5, EXTENSION_TYPE_ERROR = 6, REGEXP_SOURCE_MAX_BYTES = 65535, regexpSourceTextEncoder = new TextEncoder;
11
+
12
+ export class RegExpExtensionDecodeError extends WeftError {
13
+ extensionType;
14
+ source;
15
+ flags;
16
+ sourceByteLength;
17
+ constructor(parameters) {
18
+ super("RegExpExtensionDecodeError", `RegExp extension type ${EXTENSION_TYPE_REGEXP} could not be decoded: source=${formatRegExpSourceForMessage(parameters.source, parameters.sourceByteLength)} flags=${JSON.stringify(parameters.flags)} ${parameters.reason}`, parameters.cause === void 0 ? void 0 : { cause: parameters.cause });
19
+ this.extensionType = EXTENSION_TYPE_REGEXP;
20
+ this.source = parameters.source;
21
+ this.flags = parameters.flags;
22
+ this.sourceByteLength = parameters.sourceByteLength;
23
+ }
24
+ }
25
+ function formatRegExpSourceForMessage(source, sourceByteLength) {
26
+ if (sourceByteLength <= 200)
27
+ return JSON.stringify(source);
28
+ return `${sourceByteLength}-byte string starting ${JSON.stringify(source.slice(0, 120))}`;
29
+ }
30
+ function decodeRegExpExtension(source, flags) {
31
+ const sourceByteLength = regexpSourceTextEncoder.encode(source).byteLength;
32
+ if (sourceByteLength > REGEXP_SOURCE_MAX_BYTES)
33
+ throw new RegExpExtensionDecodeError({
34
+ source,
35
+ flags,
36
+ sourceByteLength,
37
+ reason: `because source exceeds the ${REGEXP_SOURCE_MAX_BYTES}-byte limit.`
38
+ });
39
+ try {
40
+ return new RegExp(source, flags);
41
+ } catch (cause) {
42
+ const reason = cause instanceof Error ? cause.message : String(cause);
43
+ throw new RegExpExtensionDecodeError({
44
+ source,
45
+ flags,
46
+ sourceByteLength,
47
+ reason: `because ${reason}`,
48
+ cause
49
+ });
50
+ }
51
+ }
9
52
  export const extensionCodec = new ExtensionCodec;
53
+ bindSerializerRegistryToCodec(extensionCodec, replaceUndefined);
10
54
  extensionCodec.register({
11
55
  type: EXTENSION_TYPE_DATE,
12
56
  encode: encodeCodecDate,
@@ -21,7 +65,7 @@ extensionCodec.register({
21
65
  },
22
66
  decode(data) {
23
67
  const decoded = coerceCodecRecord(msgpackDecode(data)), source = typeof decoded.source === "string" ? decoded.source : "", flags = typeof decoded.flags === "string" ? decoded.flags : "";
24
- return new RegExp(source, flags);
68
+ return decodeRegExpExtension(source, flags);
25
69
  }
26
70
  });
27
71
  extensionCodec.register({
@@ -75,7 +119,7 @@ extensionCodec.register({
75
119
  extensionCodec.register({
76
120
  type: EXTENSION_TYPE_ERROR,
77
121
  encode(value) {
78
- if (value instanceof Error)
122
+ if (value instanceof Error && !hasRegisteredSerializer(value))
79
123
  return msgpackEncode({
80
124
  name: value.name,
81
125
  message: value.message,
@@ -92,6 +136,11 @@ extensionCodec.register({
92
136
  }
93
137
  });
94
138
  export function replaceUndefined(value, visited) {
139
+ if (!containsUndefined(value, visited))
140
+ return value;
141
+ return replaceUndefinedDeep(value, new Set);
142
+ }
143
+ function replaceUndefinedDeep(value, visited) {
95
144
  if (value === void 0)
96
145
  return undefinedSentinel;
97
146
  if (value === null || typeof value !== "object")
@@ -119,27 +168,74 @@ function replaceObjectUndefined(value, visited) {
119
168
  function replaceArrayUndefined(value, visited) {
120
169
  const result = Array.from({ length: value.length });
121
170
  for (let index = 0;index < value.length; index++)
122
- result[index] = replaceUndefined(value[index], visited);
171
+ result[index] = replaceUndefinedDeep(value[index], visited);
123
172
  return result;
124
173
  }
125
174
  function replaceMapUndefined(value, visited) {
126
175
  const result = new Map;
127
176
  for (const [key, mapValue] of value)
128
- result.set(replaceUndefined(key, visited), replaceUndefined(mapValue, visited));
177
+ result.set(replaceUndefinedDeep(key, visited), replaceUndefinedDeep(mapValue, visited));
129
178
  return result;
130
179
  }
131
180
  function replaceSetUndefined(value, visited) {
132
181
  const result = new Set;
133
182
  for (const setValue of value)
134
- result.add(replaceUndefined(setValue, visited));
183
+ result.add(replaceUndefinedDeep(setValue, visited));
135
184
  return result;
136
185
  }
137
186
  function isNestedValueFree(value) {
138
- return value instanceof Date || value instanceof RegExp || value instanceof Error || value instanceof Uint8Array || value instanceof ArrayBuffer;
187
+ return value instanceof Date || value instanceof RegExp || value instanceof Error || value instanceof Uint8Array || value instanceof ArrayBuffer || hasRegisteredSerializer(value);
139
188
  }
140
189
  function replaceRecordUndefined(value, visited) {
141
190
  const record = value, result = {};
142
191
  for (const key of Object.keys(record))
143
- result[key] = replaceUndefined(record[key], visited);
192
+ result[key] = replaceUndefinedDeep(record[key], visited);
144
193
  return result;
145
194
  }
195
+ function containsUndefined(value, visited) {
196
+ if (value === void 0)
197
+ return !0;
198
+ if (value === null || typeof value !== "object")
199
+ return !1;
200
+ if (visited.has(value))
201
+ return !1;
202
+ if (isNestedValueFree(value))
203
+ return !1;
204
+ visited.add(value);
205
+ try {
206
+ if (Array.isArray(value))
207
+ return arrayContainsUndefined(value, visited);
208
+ if (value instanceof Map)
209
+ return mapContainsUndefined(value, visited);
210
+ if (value instanceof Set)
211
+ return setContainsUndefined(value, visited);
212
+ return recordContainsUndefined(value, visited);
213
+ } finally {
214
+ visited.delete(value);
215
+ }
216
+ }
217
+ function arrayContainsUndefined(value, visited) {
218
+ for (let index = 0;index < value.length; index++)
219
+ if (containsUndefined(value[index], visited))
220
+ return !0;
221
+ return !1;
222
+ }
223
+ function mapContainsUndefined(value, visited) {
224
+ for (const [key, mapValue] of value)
225
+ if (containsUndefined(key, visited) || containsUndefined(mapValue, visited))
226
+ return !0;
227
+ return !1;
228
+ }
229
+ function setContainsUndefined(value, visited) {
230
+ for (const setValue of value)
231
+ if (containsUndefined(setValue, visited))
232
+ return !0;
233
+ return !1;
234
+ }
235
+ function recordContainsUndefined(value, visited) {
236
+ const record = value;
237
+ for (const key of Object.keys(record))
238
+ if (containsUndefined(record[key], visited))
239
+ return !0;
240
+ return !1;
241
+ }
@@ -1,3 +1,4 @@
1
1
  export { decode, encode } from './api.ts';
2
+ export { registerSerializer, type SerializerHandlers } from './serializer-registry.ts';
2
3
  export { validateCloneable } from './validation.ts';
3
4
  export type { CloneValidationError, CloneValidationResult } from './validation.ts';
@@ -1,2 +1,3 @@
1
1
  export { decode, encode } from "./api.js";
2
+ export { registerSerializer } from "./serializer-registry.js";
2
3
  export { validateCloneable } from "./validation.js";
@@ -0,0 +1,122 @@
1
+ import { ExtensionCodec } from '@msgpack/msgpack';
2
+ /**
3
+ * Encode/decode handlers for a custom structured type that crosses Weft's
4
+ * checkpoint codec. `toJSON` reduces an instance to a plain, msgpack-encodable
5
+ * value; `fromJSON` rebuilds the instance from that value on the far side.
6
+ *
7
+ * The handlers must round-trip deterministically: a value encoded and then
8
+ * decoded must reconstruct an equivalent instance, with field order and content
9
+ * stable across calls (the codec backs replay-deterministic checkpoints).
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { type SerializerHandlers } from '@lostgradient/weft';
14
+ *
15
+ * class ValidationError extends Error {
16
+ * constructor(
17
+ * message: string,
18
+ * readonly issues: string[],
19
+ * ) {
20
+ * super(message);
21
+ * this.name = 'ValidationError';
22
+ * }
23
+ * }
24
+ *
25
+ * const handlers: SerializerHandlers<ValidationError> = {
26
+ * toJSON: (error) => ({ message: error.message, issues: error.issues }),
27
+ * fromJSON: (data) => {
28
+ * const record = data as { message: string; issues: string[] };
29
+ * return new ValidationError(record.message, record.issues);
30
+ * },
31
+ * };
32
+ * void handlers;
33
+ * ```
34
+ */
35
+ export type SerializerHandlers<T> = {
36
+ toJSON(value: T): unknown;
37
+ fromJSON(data: unknown): T;
38
+ };
39
+ /**
40
+ * Constructor of a registrable type. Uses a `never[]`-rest abstract constructor
41
+ * so it accepts any class (a concrete class is assignable to an abstract
42
+ * constructor whose parameters are `never[]`) without an `any`. The handlers,
43
+ * not the constructor signature, own (de)serialization; the constructor is used
44
+ * only for instance-identity matching.
45
+ */
46
+ type RegistrableConstructor<T> = abstract new (...args: never[]) => T;
47
+ /**
48
+ * Register a custom (de)serializer for `constructor` on Weft's checkpoint codec.
49
+ * Once registered, any instance of `constructor` that crosses the codec — an
50
+ * activity result, workflow input, signal payload, or error — round-trips
51
+ * through `handlers` instead of the generic structured-clone fallback (which,
52
+ * for errors, would otherwise drop subclass fields like a `ZodError`'s
53
+ * `.issues`).
54
+ *
55
+ * `options.tag` is a stable, developer-chosen discriminant stored inside each
56
+ * encoded value. Decode resolves the handler by this tag, so registration order
57
+ * and count are irrelevant and a checkpoint stays decodable across deploys.
58
+ * Choose an explicit, durable string — do NOT rely on `constructor.name`, which
59
+ * a minified build mangles, silently breaking cross-build decode.
60
+ *
61
+ * Matching is by exact constructor identity, and the built-in `Error` encoder
62
+ * defers to a registered serializer. The other built-in extension types
63
+ * (`Date`, `RegExp`, `Map`, `Set`) do NOT defer: registering a serializer for a
64
+ * subclass of one of those built-ins has no effect, because the built-in
65
+ * encoder matches the instance first. Register serializers for your own classes
66
+ * (or `Error` subclasses), not for built-in-collection subclasses.
67
+ *
68
+ * Registration is process-global and one-shot per constructor and per tag: call
69
+ * it once at module load, before constructing any engine. Re-registering the
70
+ * same constructor, or reusing a `tag` already taken by another constructor,
71
+ * throws. A checkpoint written with a registered serializer is decodable by any
72
+ * process that registered the same tag → handler.
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * import { registerSerializer } from '@lostgradient/weft';
77
+ *
78
+ * class RateLimitError extends Error {
79
+ * constructor(readonly retryAfterMs: number) {
80
+ * super('rate limited');
81
+ * this.name = 'RateLimitError';
82
+ * }
83
+ * }
84
+ *
85
+ * registerSerializer(
86
+ * RateLimitError,
87
+ * {
88
+ * toJSON: (error) => ({ retryAfterMs: error.retryAfterMs }),
89
+ * fromJSON: (data) => new RateLimitError((data as { retryAfterMs: number }).retryAfterMs),
90
+ * },
91
+ * { tag: 'RateLimitError' },
92
+ * );
93
+ * ```
94
+ */
95
+ export declare function registerSerializer<T>(constructor: RegistrableConstructor<T>, handlers: SerializerHandlers<T>, options: {
96
+ tag: string;
97
+ }): void;
98
+ /**
99
+ * Whether `value` is an instance of a registered constructor. The built-in
100
+ * Error extension encoder consults this to defer to a registered serializer
101
+ * (so a registered Error subclass uses its custom handler, not the generic
102
+ * Error encoding), regardless of extension-encoder registration order.
103
+ */
104
+ export declare function hasRegisteredSerializer(value: object): boolean;
105
+ /**
106
+ * Wire the shared extensionCodec so the single custom-serializer extension type
107
+ * is registered on the live codec, along with the codec's `replaceUndefined`
108
+ * preprocessor so custom-serializer output is encoded with the same `undefined`
109
+ * semantics as the public `encode()`. Called once at codec construction.
110
+ * `replaceUndefined` is passed in rather than imported to avoid a static cycle:
111
+ * extension-codec.ts imports this module for `hasRegisteredSerializer`.
112
+ */
113
+ export declare function bindSerializerRegistryToCodec(codec: ExtensionCodec, replaceUndefined: (value: unknown, visited: Set<object>) => unknown): void;
114
+ /**
115
+ * Test-only reset of the global registry. Production code never unregisters —
116
+ * a stale serializer could misread a checkpoint — but tests need isolation
117
+ * between registration cases. Clears both tag and constructor maps; the single
118
+ * extension-type decoder stays bound to the codec and simply finds an empty
119
+ * registry until the next registration.
120
+ */
121
+ export declare function resetSerializerRegistryForTesting(): void;
122
+ export {};
@@ -0,0 +1,51 @@
1
+ import { ExtensionCodec, decode as msgpackDecode, encode as msgpackEncode } from "@msgpack/msgpack";
2
+ const CUSTOM_SERIALIZER_EXTENSION_TYPE = 100, registryByConstructor = new Map, registryByTag = new Map;
3
+ export function registerSerializer(constructor, handlers, options) {
4
+ const key = constructor, { tag } = options;
5
+ if (typeof tag !== "string" || tag.length === 0)
6
+ throw Error("registerSerializer requires a non-empty string options.tag.");
7
+ if (registryByConstructor.has(key))
8
+ throw Error(`A serializer is already registered for ${constructor.name || "an anonymous constructor"}; registerSerializer is one-shot per constructor.`);
9
+ if (registryByTag.has(tag))
10
+ throw Error(`A serializer is already registered with tag "${tag}"; serializer tags must be unique.`);
11
+ const entry = {
12
+ tag,
13
+ constructor: key,
14
+ handlers
15
+ };
16
+ registryByConstructor.set(key, entry);
17
+ registryByTag.set(tag, entry);
18
+ }
19
+ export function hasRegisteredSerializer(value) {
20
+ return registryByConstructor.has(value.constructor);
21
+ }
22
+ export function bindSerializerRegistryToCodec(codec, replaceUndefined) {
23
+ codec.register({
24
+ type: CUSTOM_SERIALIZER_EXTENSION_TYPE,
25
+ encode(value) {
26
+ if (typeof value !== "object" || value === null)
27
+ return null;
28
+ const entry = registryByConstructor.get(value.constructor);
29
+ if (entry === void 0)
30
+ return null;
31
+ const data = replaceUndefined(entry.handlers.toJSON(value), new Set);
32
+ return msgpackEncode({ tag: entry.tag, data }, { extensionCodec: codec });
33
+ },
34
+ decode(bytes) {
35
+ const payload = msgpackDecode(bytes, { extensionCodec: codec });
36
+ if (typeof payload !== "object" || payload === null || !("tag" in payload))
37
+ throw Error("Corrupt custom-serializer payload: missing tag.");
38
+ const { tag, data } = payload;
39
+ if (typeof tag !== "string")
40
+ throw Error("Corrupt custom-serializer payload: tag is not a string.");
41
+ const entry = registryByTag.get(tag);
42
+ if (entry === void 0)
43
+ throw Error(`No serializer registered for tag "${tag}". Register it (with the same tag) before decoding a checkpoint that used it.`);
44
+ return entry.handlers.fromJSON(data);
45
+ }
46
+ });
47
+ }
48
+ export function resetSerializerRegistryForTesting() {
49
+ registryByConstructor.clear();
50
+ registryByTag.clear();
51
+ }
@@ -0,0 +1,38 @@
1
+ import type { ContextInternals } from './internals.ts';
2
+ /**
3
+ * Durable per-step retry bookkeeping for `ctx.run`, stored in the workflow's
4
+ * `checkpointLocals` so it survives crash/replay. One slot holds, per step: the
5
+ * current attempt number, how many backoff sleeps already completed, and the
6
+ * first-dispatch timestamp anchoring `scheduleToCloseTimeout`. Every mutator
7
+ * rebuilds the slot through {@link writeRetryStateSlot} so no sub-map is silently
8
+ * erased when another is updated.
9
+ */
10
+ export declare const ACTIVITY_RETRY_STATE_LOCAL_KEY = "__weftActivityRetryState";
11
+ declare const ACTIVITY_RETRY_STATE_VERSION = 1;
12
+ export declare const MAX_CHECKPOINTED_RETRY_ATTEMPT = 10000;
13
+ export interface ActivityRetryState {
14
+ version: typeof ACTIVITY_RETRY_STATE_VERSION;
15
+ attempts: Record<string, number>;
16
+ completedRetrySleeps?: Record<string, number>;
17
+ /**
18
+ * First-dispatch engine-clock timestamp per step, the anchor for
19
+ * `scheduleToCloseTimeout`. Written ONCE on the first dispatch of a step and
20
+ * never overwritten, so the wall-clock budget is measured from the original
21
+ * dispatch even across crash/replay. Like `completedRetrySleeps`, it must be
22
+ * preserved whenever the retry-state slot is rebuilt.
23
+ */
24
+ dispatchedAt?: Record<string, number>;
25
+ }
26
+ export declare function isActivityRetryState(value: unknown): value is ActivityRetryState;
27
+ export declare function readActivityRetryAttempt(internals: ContextInternals, step: number): number | undefined;
28
+ export declare function readCompletedRetrySleepCount(internals: ContextInternals, step: number): number;
29
+ export declare function writeActivityRetryAttempt(internals: ContextInternals, step: number, attempt: number): void;
30
+ export declare function completeActivityRetryAttempt(internals: ContextInternals, step: number, completedRetrySleepCount: number): void;
31
+ /**
32
+ * Read the first-dispatch anchor for a step's `scheduleToCloseTimeout`, writing
33
+ * `now` on the first dispatch. Read-first so a crash/replay never resets the
34
+ * window: the budget is measured from the original dispatch, and the anchor
35
+ * lands in the checkpoint committed at the dispatch `yield` that follows.
36
+ */
37
+ export declare function readOrInitActivityDispatchedAt(internals: ContextInternals, step: number, now: number): number;
38
+ export {};
@@ -0,0 +1,89 @@
1
+ export const ACTIVITY_RETRY_STATE_LOCAL_KEY = "__weftActivityRetryState";
2
+ const ACTIVITY_RETRY_STATE_VERSION = 1;
3
+ export const MAX_CHECKPOINTED_RETRY_ATTEMPT = 1e4;
4
+ function isRecord(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ }
7
+ export function isActivityRetryState(value) {
8
+ return isRecord(value) && value.version === ACTIVITY_RETRY_STATE_VERSION && isRecord(value.attempts) && (value.completedRetrySleeps === void 0 || isRecord(value.completedRetrySleeps)) && (value.dispatchedAt === void 0 || isRecord(value.dispatchedAt));
9
+ }
10
+ function assertValidRetryAttempt(attempt, step) {
11
+ if (!Number.isInteger(attempt) || attempt <= 1 || attempt > MAX_CHECKPOINTED_RETRY_ATTEMPT)
12
+ throw Error(`Invalid checkpointed activity retry attempt ${String(attempt)} for step ${String(step)}`);
13
+ }
14
+ export function readActivityRetryAttempt(internals, step) {
15
+ const state = internals.checkpointLocals[ACTIVITY_RETRY_STATE_LOCAL_KEY];
16
+ if (!isActivityRetryState(state))
17
+ return;
18
+ const attempt = state.attempts[String(step)];
19
+ if (attempt === void 0)
20
+ return;
21
+ assertValidRetryAttempt(attempt, step);
22
+ return attempt;
23
+ }
24
+ export function readCompletedRetrySleepCount(internals, step) {
25
+ const state = internals.checkpointLocals[ACTIVITY_RETRY_STATE_LOCAL_KEY];
26
+ if (!isActivityRetryState(state))
27
+ return 0;
28
+ const count = state.completedRetrySleeps?.[String(step)];
29
+ if (count === void 0)
30
+ return 0;
31
+ if (!Number.isInteger(count) || count < 0 || count > MAX_CHECKPOINTED_RETRY_ATTEMPT)
32
+ throw Error(`Invalid checkpointed activity retry sleep count ${String(count)} for step ${String(step)}`);
33
+ return count;
34
+ }
35
+ function currentRetryState(internals) {
36
+ const current = internals.checkpointLocals[ACTIVITY_RETRY_STATE_LOCAL_KEY];
37
+ return isActivityRetryState(current) ? current : void 0;
38
+ }
39
+ function writeRetryStateSlot(internals, attempts, completedRetrySleeps, dispatchedAt) {
40
+ const { [ACTIVITY_RETRY_STATE_LOCAL_KEY]: _removed, ...remainingLocals } = internals.checkpointLocals, hasAttempts = Object.keys(attempts).length > 0, hasSleeps = completedRetrySleeps !== void 0 && Object.keys(completedRetrySleeps).length > 0, hasDispatched = dispatchedAt !== void 0 && Object.keys(dispatchedAt).length > 0;
41
+ if (!hasAttempts && !hasSleeps && !hasDispatched) {
42
+ internals.checkpointLocals = remainingLocals;
43
+ return;
44
+ }
45
+ internals.checkpointLocals = {
46
+ ...remainingLocals,
47
+ [ACTIVITY_RETRY_STATE_LOCAL_KEY]: {
48
+ version: ACTIVITY_RETRY_STATE_VERSION,
49
+ attempts,
50
+ ...hasSleeps ? { completedRetrySleeps } : {},
51
+ ...hasDispatched ? { dispatchedAt } : {}
52
+ }
53
+ };
54
+ }
55
+ export function writeActivityRetryAttempt(internals, step, attempt) {
56
+ assertValidRetryAttempt(attempt, step);
57
+ const current = currentRetryState(internals), attempts = current ? { ...current.attempts } : {};
58
+ attempts[String(step)] = attempt;
59
+ writeRetryStateSlot(internals, attempts, current?.completedRetrySleeps, current?.dispatchedAt);
60
+ }
61
+ function clearActivityRetryAttempt(internals, step) {
62
+ const current = currentRetryState(internals);
63
+ if (!current)
64
+ return;
65
+ const attempts = { ...current.attempts };
66
+ delete attempts[String(step)];
67
+ writeRetryStateSlot(internals, attempts, current.completedRetrySleeps, current.dispatchedAt);
68
+ }
69
+ export function completeActivityRetryAttempt(internals, step, completedRetrySleepCount) {
70
+ if (!Number.isInteger(completedRetrySleepCount) || completedRetrySleepCount < 0 || completedRetrySleepCount > MAX_CHECKPOINTED_RETRY_ATTEMPT)
71
+ throw Error(`Invalid completed activity retry sleep count ${String(completedRetrySleepCount)} for step ${String(step)}`);
72
+ clearActivityRetryAttempt(internals, step);
73
+ if (completedRetrySleepCount === 0)
74
+ return;
75
+ const current = currentRetryState(internals), attempts = current ? { ...current.attempts } : {}, completedRetrySleeps = current ? { ...current.completedRetrySleeps } : {};
76
+ completedRetrySleeps[String(step)] = completedRetrySleepCount;
77
+ writeRetryStateSlot(internals, attempts, completedRetrySleeps, current?.dispatchedAt);
78
+ }
79
+ export function readOrInitActivityDispatchedAt(internals, step, now) {
80
+ const current = currentRetryState(internals), existing = current?.dispatchedAt?.[String(step)];
81
+ if (typeof existing === "number" && Number.isFinite(existing))
82
+ return existing;
83
+ if (existing !== void 0)
84
+ throw Error(`Invalid checkpointed activity dispatch anchor ${String(existing)} for step ${String(step)}`);
85
+ const attempts = current ? { ...current.attempts } : {}, dispatchedAt = current?.dispatchedAt ? { ...current.dispatchedAt } : {};
86
+ dispatchedAt[String(step)] = now;
87
+ writeRetryStateSlot(internals, attempts, current?.completedRetrySleeps, dispatchedAt);
88
+ return now;
89
+ }