@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
@@ -0,0 +1,56 @@
1
+ export function createInlineContextOptions(dependencies, registration, parameters, workflowAbort) {
2
+ return {
3
+ workflowId: parameters.workflowId,
4
+ workflowType: parameters.workflowType,
5
+ startedAt: parameters.startedAt ?? dependencies.getNow(),
6
+ abortController: workflowAbort,
7
+ getNow: dependencies.getNow,
8
+ nestingDepth: parameters.nestingDepth ?? 0,
9
+ executionStateOwnerId: parameters.executionStateOwnerId ?? parameters.workflowId,
10
+ ...parameters.sleepReferenceTime !== void 0 && {
11
+ sleepReferenceTime: parameters.sleepReferenceTime
12
+ },
13
+ ...dependencies.resolveWorkflowType !== void 0 && {
14
+ resolveWorkflowType: dependencies.resolveWorkflowType
15
+ },
16
+ ...registration.searchAttributes && {
17
+ searchAttributeSchema: registration.searchAttributes
18
+ },
19
+ ...parameters.deadline !== void 0 && { deadline: parameters.deadline },
20
+ ...resolveWorkflowScopedCallbackOptions(dependencies, parameters.workflowId),
21
+ services: dependencies.getWorkflowServices?.(parameters.workflowId),
22
+ ...resolveLogSinkOption(dependencies)
23
+ };
24
+ }
25
+ function resolveWorkflowScopedCallbackOptions(dependencies, workflowId) {
26
+ const { registerCancelHandler, recordFinalizerState } = dependencies;
27
+ return {
28
+ ...registerCancelHandler !== void 0 && {
29
+ registerCancelHandler: (handler) => registerCancelHandler(workflowId, handler)
30
+ },
31
+ ...recordFinalizerState !== void 0 && {
32
+ recordFinalizerState: (value) => recordFinalizerState(workflowId, value)
33
+ }
34
+ };
35
+ }
36
+ function resolveLogSinkOption(dependencies) {
37
+ const logSink = dependencies.getLogSink?.();
38
+ return logSink === void 0 ? {} : { logSink };
39
+ }
40
+ export function optionalInlineDependencies(candidates) {
41
+ return {
42
+ ...candidates.getComposedWorkflowInterceptor !== void 0 && {
43
+ getComposedWorkflowInterceptor: candidates.getComposedWorkflowInterceptor
44
+ },
45
+ ...candidates.registerCancelHandler !== void 0 && {
46
+ registerCancelHandler: candidates.registerCancelHandler
47
+ },
48
+ ...candidates.recordFinalizerState !== void 0 && {
49
+ recordFinalizerState: candidates.recordFinalizerState
50
+ },
51
+ ...candidates.getWorkflowServices !== void 0 && {
52
+ getWorkflowServices: candidates.getWorkflowServices
53
+ },
54
+ ...candidates.getLogSink !== void 0 && { getLogSink: candidates.getLogSink }
55
+ };
56
+ }
@@ -11,38 +11,8 @@
11
11
  */
12
12
  import { Context } from './context.ts';
13
13
  import type { ExecutionStrategy } from './execution-strategy.ts';
14
- import type { ComposedWorkflowInterceptor } from './interceptor.ts';
15
- import type { FailureCategory, OperationOutcome, SearchAttributeSchema, WorkerOutboundMessage, WorkflowFunction } from './types.ts';
16
- export interface InlineExecutionDependencies {
17
- getRegistration: (workflowType: string) => {
18
- handler: WorkflowFunction;
19
- version: string;
20
- searchAttributes?: SearchAttributeSchema;
21
- } | undefined;
22
- getNow: () => number;
23
- resolveWorkflowType?: (target: string | Function) => string;
24
- maxNestingDepth: number;
25
- development?: boolean;
26
- getComposedWorkflowInterceptor?: () => ComposedWorkflowInterceptor | null;
27
- registerCancelHandler?: (workflowId: string, handler: () => Promise<void> | void) => () => void;
28
- /**
29
- * Look up the non-serialized per-run `services` value for a workflow, exposed
30
- * to the body as `ctx.services`. Returns `undefined` when none was supplied.
31
- */
32
- getWorkflowServices?: (workflowId: string) => unknown;
33
- }
34
- type InlineStartWorkflowParameters = {
35
- workflowId: string;
36
- workflowType: string;
37
- input: unknown;
38
- checkpoint: ArrayBuffer | Uint8Array;
39
- nestingDepth?: number;
40
- executionStateOwnerId?: string;
41
- startedAt?: number;
42
- sleepReferenceTime?: number;
43
- deadline?: number;
44
- headers?: [string, string][];
45
- };
14
+ import type { InlineExecutionDependencies, InlineStartWorkflowParameters } from './inline-execution-strategy.context-options.ts';
15
+ import type { FailureCategory, OperationOutcome, WorkerOutboundMessage } from './types.ts';
46
16
  export declare class InlineExecutionStrategy implements ExecutionStrategy {
47
17
  #private;
48
18
  constructor(dependencies: InlineExecutionDependencies);
@@ -54,8 +24,33 @@ export declare class InlineExecutionStrategy implements ExecutionStrategy {
54
24
  operationResult: OperationOutcome;
55
25
  }): void;
56
26
  cancelWorkflow(workflowId: string): void;
57
- parkWorkflow(workflowId: string): void;
27
+ /**
28
+ * Evict a workflow's in-memory execution state (generator, abort controller,
29
+ * live context, tracked turns/advances).
30
+ *
31
+ * By default this is a hard eviction: nothing about the run stays reachable —
32
+ * which is what the suspend/general teardown path requires. The inline
33
+ * `waitForSignal` parking optimization opts into `retainContext: true` so the
34
+ * run's Context survives in `#parkedContexts` and its `ctx.onQuery` handlers
35
+ * stay callable while the run is parked. Retention is therefore strictly
36
+ * opt-in at the one call site that wants it; every other caller gets eviction.
37
+ */
38
+ parkWorkflow(workflowId: string, options?: {
39
+ retainContext?: boolean;
40
+ }): void;
41
+ /** Returns the live Context for a workflow, or `undefined` if not running. For parked workflows use {@link getParkedContext}. */
58
42
  getContext(workflowId: string): Context | undefined;
43
+ /** Returns the retained Context for a parked workflow, or `undefined` if not parked or already cleaned up. */
44
+ getParkedContext(workflowId: string): Context | undefined;
45
+ /**
46
+ * Drop any retained parked Context for a workflow without touching the abort
47
+ * controller or other live state. Terminal cleanup calls this so a workflow
48
+ * that reached a terminal status while parked (e.g. a failed resume, or normal
49
+ * completion of a run that had parked) cannot keep resolving `ctx.onQuery`
50
+ * handlers from a stale parked Context — and so the Context is not retained
51
+ * for the engine's lifetime.
52
+ */
53
+ clearParkedContext(workflowId: string): void;
59
54
  getAbortController(workflowId: string): AbortController | undefined;
60
55
  waitForWorkflowTurn(workflowId: string): Promise<void> | undefined;
61
56
  waitForWorkflowAdvance(workflowId: string): Promise<void> | undefined;
@@ -71,11 +66,11 @@ export declare class InlineExecutionStrategy implements ExecutionStrategy {
71
66
  */
72
67
  throwIntoWorkflow(workflowId: string, error: unknown, operationFailureCategory?: FailureCategory): void;
73
68
  /**
74
- * Store a context and generator that were created externally (used by
75
- * the engine's resume() path where context setup is more complex).
69
+ * Store a context and generator created externally (engine resume path).
70
+ * Clears any retained parked context so a concurrent query sees the new
71
+ * live context rather than the stale parked one.
76
72
  */
77
73
  adoptWorkflow(workflowId: string, generator: AsyncGenerator, context: Context, abortController: AbortController): void;
78
74
  [Symbol.dispose](): void;
79
75
  [Symbol.asyncDispose](): Promise<void>;
80
76
  }
81
- export {};
@@ -3,38 +3,14 @@ import {
3
3
  classifyErrorAsFailureCategory,
4
4
  errorFromFailedOperationOutcome
5
5
  } from "./failure-categories.js";
6
- function createInlineContextOptions(dependencies, registration, parameters, workflowAbort) {
7
- const { registerCancelHandler } = dependencies;
8
- return {
9
- workflowId: parameters.workflowId,
10
- workflowType: parameters.workflowType,
11
- startedAt: parameters.startedAt ?? dependencies.getNow(),
12
- abortController: workflowAbort,
13
- getNow: dependencies.getNow,
14
- nestingDepth: parameters.nestingDepth ?? 0,
15
- executionStateOwnerId: parameters.executionStateOwnerId ?? parameters.workflowId,
16
- ...parameters.sleepReferenceTime !== void 0 && {
17
- sleepReferenceTime: parameters.sleepReferenceTime
18
- },
19
- ...dependencies.resolveWorkflowType !== void 0 && {
20
- resolveWorkflowType: dependencies.resolveWorkflowType
21
- },
22
- ...registration.searchAttributes && {
23
- searchAttributeSchema: registration.searchAttributes
24
- },
25
- ...parameters.deadline !== void 0 && { deadline: parameters.deadline },
26
- ...registerCancelHandler !== void 0 && {
27
- registerCancelHandler: (handler) => registerCancelHandler(parameters.workflowId, handler)
28
- },
29
- services: dependencies.getWorkflowServices?.(parameters.workflowId)
30
- };
31
- }
6
+ import { createInlineContextOptions } from "./inline-execution-strategy.context-options.js";
32
7
 
33
8
  export class InlineExecutionStrategy {
34
9
  #dependencies;
35
10
  #generators;
36
11
  #abortControllers;
37
12
  #contexts;
13
+ #parkedContexts;
38
14
  #workflowAdvances;
39
15
  #workflowTurns;
40
16
  #messageHandler;
@@ -43,6 +19,7 @@ export class InlineExecutionStrategy {
43
19
  this.#generators = new Map;
44
20
  this.#abortControllers = new Map;
45
21
  this.#contexts = new Map;
22
+ this.#parkedContexts = new Map;
46
23
  this.#workflowAdvances = new Map;
47
24
  this.#workflowTurns = new Map;
48
25
  this.#messageHandler = null;
@@ -93,12 +70,21 @@ export class InlineExecutionStrategy {
93
70
  abortController.abort();
94
71
  this.#cleanup(workflowId);
95
72
  }
96
- parkWorkflow(workflowId) {
73
+ parkWorkflow(workflowId, options) {
74
+ const context = options?.retainContext ? this.#contexts.get(workflowId) ?? this.#parkedContexts.get(workflowId) : void 0;
97
75
  this.#cleanup(workflowId);
76
+ if (context !== void 0)
77
+ this.#parkedContexts.set(workflowId, context);
98
78
  }
99
79
  getContext(workflowId) {
100
80
  return this.#contexts.get(workflowId);
101
81
  }
82
+ getParkedContext(workflowId) {
83
+ return this.#parkedContexts.get(workflowId);
84
+ }
85
+ clearParkedContext(workflowId) {
86
+ this.#parkedContexts.delete(workflowId);
87
+ }
102
88
  getAbortController(workflowId) {
103
89
  return this.#abortControllers.get(workflowId);
104
90
  }
@@ -124,6 +110,7 @@ export class InlineExecutionStrategy {
124
110
  this.#throwIntoGenerator(workflowId, generator, error, operationFailureCategory);
125
111
  }
126
112
  adoptWorkflow(workflowId, generator, context, abortController) {
113
+ this.#parkedContexts.delete(workflowId);
127
114
  this.#generators.set(workflowId, generator);
128
115
  this.#contexts.set(workflowId, context);
129
116
  this.#abortControllers.set(workflowId, abortController);
@@ -132,6 +119,7 @@ export class InlineExecutionStrategy {
132
119
  this.#generators.clear();
133
120
  this.#abortControllers.clear();
134
121
  this.#contexts.clear();
122
+ this.#parkedContexts.clear();
135
123
  this.#workflowAdvances.clear();
136
124
  this.#workflowTurns.clear();
137
125
  this.#messageHandler = null;
@@ -257,6 +245,7 @@ export class InlineExecutionStrategy {
257
245
  this.#generators.delete(workflowId);
258
246
  this.#abortControllers.delete(workflowId);
259
247
  this.#contexts.delete(workflowId);
248
+ this.#parkedContexts.delete(workflowId);
260
249
  if (!options?.preserveTrackedAdvance)
261
250
  this.#workflowAdvances.delete(workflowId);
262
251
  if (!options?.preserveTrackedTurn)
@@ -11,7 +11,7 @@
11
11
  import { z } from 'zod';
12
12
  import { isFailureCategory } from './failure-categories.ts';
13
13
  import type { FailureCategory, WorkflowStatus } from './types/identity.ts';
14
- import type { ListFilter } from './types/options.ts';
14
+ import type { ListFilter } from './types/list-options.ts';
15
15
  import { WeftError } from './weft-error.ts';
16
16
  /**
17
17
  * Concrete object schema for {@link ListFilter}. Supports `.omit()` and
@@ -7,7 +7,8 @@ const WORKFLOW_STATUSES = [
7
7
  "completed",
8
8
  "failed",
9
9
  "cancelled",
10
- "timed-out"
10
+ "timed-out",
11
+ "suspended"
11
12
  ], ID_PREFIX_PATTERN = /^[A-Za-z0-9_-]+$/, workflowStatusSchema = z.enum(WORKFLOW_STATUSES), failureCategorySchema = z.enum(FAILURE_CATEGORIES), timeRangeSchema = z.object({
12
13
  gte: z.number().optional(),
13
14
  lte: z.number().optional(),
@@ -4,7 +4,7 @@ import { WeftError } from './weft-error.ts';
4
4
  * {@link PayloadSizeExceededError} message so operators can tell which
5
5
  * admission point rejected the value.
6
6
  */
7
- export type PayloadKind = 'workflow input' | 'signal payload' | 'activity result';
7
+ export type PayloadKind = 'workflow input' | 'signal payload' | 'activity result' | 'finalizer state';
8
8
  /**
9
9
  * Thrown at admission when a payload's serialized (codec-encoded) size exceeds
10
10
  * the operator-configured {@link PayloadSizePolicy.maxBytes}. The rejection
@@ -1,15 +1,17 @@
1
1
  import { WeftError } from './weft-error.ts';
2
2
  /**
3
3
  * Thrown by {@link Engine.create} (and other storage-opening entry points) when
4
- * a persisted Weft database carries a schema version older than the engine
5
- * understands. Pre-MVP Weft does not migrate persisted data bumping
6
- * {@link CURRENT_PERSISTED_DATA_SCHEMA_VERSION} intentionally invalidates older
7
- * databases so the failure surfaces deterministically at boot, before any
8
- * workflow attempts replay.
4
+ * a persisted Weft database's schema version does not match what the engine
5
+ * requires an older version, a newer one, an unparseable sentinel, or user
6
+ * data present with no sentinel at all. Weft loads persisted data only at the
7
+ * exact current schema version; it never reshapes a non-matching database in
8
+ * place. Bumping {@link CURRENT_PERSISTED_DATA_SCHEMA_VERSION} intentionally
9
+ * invalidates databases stamped with any other version so the failure surfaces
10
+ * deterministically at boot, before any workflow attempts replay.
9
11
  *
10
12
  * Inspect `foundVersion` to see what the storage advertised and `expectedVersion`
11
- * to see what this engine requires. Resolve by deleting the database (acceptable
12
- * pre-MVP) or by starting from fresh storage.
13
+ * to see what this engine requires. Resolve by deleting the database or by
14
+ * starting from fresh storage.
13
15
  *
14
16
  * @example
15
17
  * ```ts
@@ -6,12 +6,11 @@
6
6
  *
7
7
  * @example Route review notifications to a webhook
8
8
  * ```ts
9
- * import { ReviewRequestedEvent } from '@lostgradient/weft';
9
+ * import { ReviewRequestedEvent, type TypedEventTarget, type WeftReviewEventMap } from '@lostgradient/weft';
10
10
  *
11
- * const target = new EventTarget();
11
+ * declare const target: TypedEventTarget<WeftReviewEventMap>;
12
12
  *
13
- * target.addEventListener(ReviewRequestedEvent.type, (e) => {
14
- * const event = e as ReviewRequestedEvent;
13
+ * target.addEventListener(ReviewRequestedEvent.type, (event) => {
15
14
  * console.log(`Review ${event.reviewId} requested for workflow ${event.workflowId}`);
16
15
  * console.log('Reviewers:', event.reviewers);
17
16
  * });
@@ -33,12 +32,11 @@ export declare class ReviewRequestedEvent extends Event {
33
32
  *
34
33
  * @example Record review decisions in an audit log
35
34
  * ```ts
36
- * import { ReviewCompletedEvent } from '@lostgradient/weft';
35
+ * import { ReviewCompletedEvent, type TypedEventTarget, type WeftReviewEventMap } from '@lostgradient/weft';
37
36
  *
38
- * const target = new EventTarget();
37
+ * declare const target: TypedEventTarget<WeftReviewEventMap>;
39
38
  *
40
- * target.addEventListener(ReviewCompletedEvent.type, (e) => {
41
- * const event = e as ReviewCompletedEvent;
39
+ * target.addEventListener(ReviewCompletedEvent.type, (event) => {
42
40
  * console.log(`Review ${event.reviewId}: '${event.decision}' by ${event.reviewer} in ${event.duration}ms`);
43
41
  * });
44
42
  * ```
@@ -1,10 +1,19 @@
1
- import type { Storage } from '../../storage/interface.ts';
1
+ import type { BatchOperation, Storage } from '../../storage/interface.ts';
2
2
  import type { TimerEntry } from '../types.ts';
3
3
  export interface SchedulerOptions {
4
4
  storage: Storage;
5
5
  onTimerFired: (entry: TimerEntry) => void | Promise<void>;
6
6
  pollIntervalMs?: number;
7
7
  getNow?: () => number;
8
+ /**
9
+ * Commit the batch that deletes a fired timer's keys after its callback
10
+ * returns. Defaults to an unfenced `storage.batch`. The engine supplies a
11
+ * lease-fenced commit (#563) so the fired-timer delete and the callback's own
12
+ * follow-up writes share the same ownership fence — under deposition both are
13
+ * rejected and the timer survives for the successor to re-drive. With no lease
14
+ * held this commits exactly as the unfenced default would.
15
+ */
16
+ commitTimerCleanup?: (operations: BatchOperation[]) => Promise<void>;
8
17
  }
9
18
  /**
10
19
  * Scheduler manages durable timers and polls for expired deadlines.
@@ -4,16 +4,19 @@ import { buildTimerBatchOperations } from "./timer-batch.js";
4
4
  import {
5
5
  advanceTimerSource,
6
6
  readNextScannedTimerEntry,
7
+ readNextTeardownTimerEntry,
7
8
  readNextTerminalCleanupTimerEntry,
8
9
  selectNextTimerSource,
9
10
  shouldDeleteTimerIndexWithoutLookup
10
11
  } from "./timer-sources.js";
12
+ const EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE = 1000;
11
13
 
12
14
  export class Scheduler {
13
15
  #storage;
14
16
  #onTimerFired;
15
17
  #pollIntervalMs;
16
18
  #getNow;
19
+ #commitTimerCleanup;
17
20
  #intervalHandle = null;
18
21
  #stopped = !1;
19
22
  constructor(options) {
@@ -21,6 +24,7 @@ export class Scheduler {
21
24
  this.#onTimerFired = options.onTimerFired;
22
25
  this.#pollIntervalMs = options.pollIntervalMs ?? 1000;
23
26
  this.#getNow = options.getNow ?? Date.now;
27
+ this.#commitTimerCleanup = options.commitTimerCleanup ?? ((operations) => this.#storage.batch(operations));
24
28
  }
25
29
  start() {
26
30
  if (this.#intervalHandle !== null)
@@ -66,7 +70,7 @@ export class Scheduler {
66
70
  this.stop();
67
71
  }
68
72
  async#processExpiredTimers(now, { respectStopped }) {
69
- const currentTime = now ?? this.#getNow(), timerSources = this.#createTimerSources(this.#scanExpiredTimers(currentTime));
73
+ const currentTime = now ?? this.#getNow(), timerSources = this.#createTimerSources(this.#scanExpiredTimers(currentTime)), cleanupOperations = [];
70
74
  for (const timerSource of timerSources)
71
75
  await advanceTimerSource(timerSource, this.#storage);
72
76
  while (this.#hasPendingTimer(timerSources)) {
@@ -74,27 +78,36 @@ export class Scheduler {
74
78
  if (!nextEntry || !selectedSource)
75
79
  break;
76
80
  if (respectStopped && this.#stopped)
77
- return;
78
- if (await this.#processSelectedTimer(nextEntry) === "retry") {
81
+ break;
82
+ if (await this.#processSelectedTimer(nextEntry, cleanupOperations) === "retry") {
79
83
  await advanceTimerSource(selectedSource, this.#storage);
80
84
  continue;
81
85
  }
82
86
  await advanceTimerSource(selectedSource, this.#storage);
83
87
  }
88
+ await this.#deleteProcessedTimerKeys(cleanupOperations);
84
89
  }
85
90
  #scanExpiredTimers(currentTime) {
86
91
  return {
87
92
  deadline: this.#storage.scan("wf-deadline:", {
88
- lt: resolvePrefixRangeEnd(KEYS.deadline(currentTime, ""))
93
+ lt: resolvePrefixRangeEnd(KEYS.deadline(currentTime, "")),
94
+ limit: EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE
89
95
  }),
90
96
  delayedStart: this.#storage.scan("wf-delayed:", {
91
- lt: resolvePrefixRangeEnd(KEYS.delayedStart(currentTime, ""))
97
+ lt: resolvePrefixRangeEnd(KEYS.delayedStart(currentTime, "")),
98
+ limit: EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE
92
99
  }),
93
100
  schedule: this.#storage.scan("schedule-due:", {
94
- lt: resolvePrefixRangeEnd(KEYS.scheduleTick(currentTime, ""))
101
+ lt: resolvePrefixRangeEnd(KEYS.scheduleTick(currentTime, "")),
102
+ limit: EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE
95
103
  }),
96
104
  terminalCleanup: this.#storage.scan("wf-cleanup:", {
97
- lt: resolvePrefixRangeEnd(KEYS.terminalCleanup(currentTime, ""))
105
+ lt: resolvePrefixRangeEnd(KEYS.terminalCleanup(currentTime, "")),
106
+ limit: EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE
107
+ }),
108
+ teardown: this.#storage.scan("wf-teardown:", {
109
+ lt: resolvePrefixRangeEnd(KEYS.teardownTimer(currentTime, "")),
110
+ limit: EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE
98
111
  })
99
112
  };
100
113
  }
@@ -119,29 +132,43 @@ export class Scheduler {
119
132
  iterator: iterators.terminalCleanup[Symbol.asyncIterator](),
120
133
  next: null,
121
134
  readNext: readNextTerminalCleanupTimerEntry
135
+ },
136
+ {
137
+ iterator: iterators.teardown[Symbol.asyncIterator](),
138
+ next: null,
139
+ readNext: readNextTeardownTimerEntry
122
140
  }
123
141
  ];
124
142
  }
125
143
  #hasPendingTimer(timerSources) {
126
144
  return timerSources.some((timerSource) => timerSource.next !== null);
127
145
  }
128
- async#processSelectedTimer(nextEntry) {
146
+ async#processSelectedTimer(nextEntry, cleanupOperations) {
129
147
  try {
130
148
  await this.#onTimerFired(nextEntry.entry);
131
149
  } catch (error) {
132
150
  console.error(`Timer callback failed for timer ${nextEntry.entry.id}:`, error);
133
151
  return "retry";
134
152
  }
135
- await this.#deleteTimerKeysAfterCallback(nextEntry);
153
+ await this.#appendTimerCleanupOperationsAfterCallback(nextEntry, cleanupOperations);
136
154
  return "processed";
137
155
  }
138
- async#deleteTimerKeysAfterCallback(nextEntry) {
156
+ async#appendTimerCleanupOperationsAfterCallback(nextEntry, cleanupOperations) {
139
157
  try {
140
- await this.#storage.batch(await this.#buildTimerCleanupOperations(nextEntry));
158
+ cleanupOperations.push(...await this.#buildTimerCleanupOperations(nextEntry));
141
159
  } catch (deleteError) {
142
160
  console.error(`Failed to delete timer keys for ${nextEntry.entry.id}:`, deleteError);
143
161
  }
144
162
  }
163
+ async#deleteProcessedTimerKeys(cleanupOperations) {
164
+ if (cleanupOperations.length === 0)
165
+ return;
166
+ try {
167
+ await this.#commitTimerCleanup(cleanupOperations);
168
+ } catch (deleteError) {
169
+ console.error("Failed to delete timer keys for processed scheduler tick:", deleteError);
170
+ }
171
+ }
145
172
  async#buildTimerCleanupOperations(nextEntry) {
146
173
  const cleanupOperations = [{ type: "delete", key: nextEntry.key }], indexDeleteOperation = await this.#buildTimerIndexDeleteOperation(nextEntry);
147
174
  if (indexDeleteOperation)
@@ -2,7 +2,7 @@ import { KEYS } from "../../storage/interface.js";
2
2
  import { encode } from "../codec.js";
3
3
  import { normalizeStorageTimestamp } from "./duration.js";
4
4
  function isTimerEntryKind(value) {
5
- return value === "sleep" || value === "visibility-timeout" || value === "execution-deadline" || value === "delayed-start" || value === "schedule" || value === "terminal-cleanup";
5
+ return value === "sleep" || value === "visibility-timeout" || value === "execution-deadline" || value === "delayed-start" || value === "schedule" || value === "terminal-cleanup" || value === "teardown" || value === "wait-condition";
6
6
  }
7
7
  function isRecord(value) {
8
8
  return typeof value === "object" && value !== null;
@@ -30,6 +30,14 @@ export function buildTimerBatchOperations(entry) {
30
30
  value: encode(normalizedEntry.workflowId)
31
31
  }
32
32
  ];
33
+ if (normalizedEntry.kind === "teardown")
34
+ return [
35
+ {
36
+ type: "put",
37
+ key: KEYS.teardownTimer(normalizedEntry.fireAt, normalizedEntry.id),
38
+ value: encode(normalizedEntry.workflowId)
39
+ }
40
+ ];
33
41
  const deadlineKey = normalizedEntry.kind === "delayed-start" ? KEYS.delayedStart(normalizedEntry.fireAt, normalizedEntry.workflowId) : normalizedEntry.kind === "schedule" ? KEYS.scheduleTick(normalizedEntry.fireAt, normalizedEntry.workflowId) : KEYS.deadline(normalizedEntry.fireAt, normalizedEntry.id), operations = [
34
42
  { type: "put", key: deadlineKey, value: encode(normalizedEntry) }
35
43
  ];
@@ -12,6 +12,7 @@ export type TimerSource = {
12
12
  export declare function compareScannedTimerEntries(left: ScannedTimerEntry, right: ScannedTimerEntry): number;
13
13
  export declare function readNextScannedTimerEntry(iterator: AsyncIterator<[string, Uint8Array]>, storage: Storage): Promise<ScannedTimerEntry | null>;
14
14
  export declare function readNextTerminalCleanupTimerEntry(iterator: AsyncIterator<[string, Uint8Array]>, storage: Storage): Promise<ScannedTimerEntry | null>;
15
+ export declare function readNextTeardownTimerEntry(iterator: AsyncIterator<[string, Uint8Array]>, storage: Storage): Promise<ScannedTimerEntry | null>;
15
16
  export declare function advanceTimerSource(timerSource: TimerSource, storage: Storage): Promise<void>;
16
17
  export declare function selectNextTimerSource(timerSources: TimerSource[]): TimerSource | undefined;
17
18
  export declare function shouldDeleteTimerIndexWithoutLookup(entry: TimerEntry): boolean;
@@ -20,15 +20,15 @@ export async function readNextScannedTimerEntry(iterator, storage) {
20
20
  return { key, entry: decoded };
21
21
  }
22
22
  }
23
- export async function readNextTerminalCleanupTimerEntry(iterator, storage) {
24
- const prefix = "wf-cleanup:";
23
+ async function readNextWorkflowTimerEntry(iterator, storage, kind) {
24
+ const { diagnosticName, prefix } = kind === "terminal-cleanup" ? { diagnosticName: "terminal cleanup", prefix: "wf-cleanup:" } : { diagnosticName: "teardown timer", prefix: "wf-teardown:" };
25
25
  while (!0) {
26
26
  const next = await iterator.next();
27
27
  if (next.done)
28
28
  return null;
29
29
  const [key, value] = next.value, separatorIndex = key.indexOf(":", prefix.length), fireAtValue = separatorIndex === -1 ? Number.NaN : Number(key.slice(prefix.length, separatorIndex)), timerId = separatorIndex === -1 ? null : tryDecodeStorageKeyComponent(key.slice(separatorIndex + 1)), decodedWorkflowId = decode(value);
30
30
  if (!Number.isSafeInteger(fireAtValue) || fireAtValue < 0 || timerId === null || typeof decodedWorkflowId !== "string") {
31
- console.error(`Corrupted terminal cleanup entry at ${key}: removing`);
31
+ console.error(`Corrupted ${diagnosticName} entry at ${key}: removing`);
32
32
  await storage.delete(key);
33
33
  continue;
34
34
  }
@@ -38,11 +38,17 @@ export async function readNextTerminalCleanupTimerEntry(iterator, storage) {
38
38
  id: timerId,
39
39
  workflowId: decodedWorkflowId,
40
40
  fireAt: fireAtValue,
41
- kind: "terminal-cleanup"
41
+ kind
42
42
  }
43
43
  };
44
44
  }
45
45
  }
46
+ export async function readNextTerminalCleanupTimerEntry(iterator, storage) {
47
+ return readNextWorkflowTimerEntry(iterator, storage, "terminal-cleanup");
48
+ }
49
+ export async function readNextTeardownTimerEntry(iterator, storage) {
50
+ return readNextWorkflowTimerEntry(iterator, storage, "teardown");
51
+ }
46
52
  export async function advanceTimerSource(timerSource, storage) {
47
53
  timerSource.next = await timerSource.readNext(timerSource.iterator, storage);
48
54
  }
@@ -57,5 +63,5 @@ export function selectNextTimerSource(timerSources) {
57
63
  return selectedSource;
58
64
  }
59
65
  export function shouldDeleteTimerIndexWithoutLookup(entry) {
60
- return entry.kind !== "schedule" && entry.kind !== "terminal-cleanup";
66
+ return entry.kind !== "schedule" && entry.kind !== "terminal-cleanup" && entry.kind !== "teardown";
61
67
  }
@@ -1,6 +1,5 @@
1
1
  import { WeftError } from './weft-error.ts';
2
2
  export declare const SESSION_STATE_LOCAL_KEY = "stateSession";
3
- export declare const LEGACY_SESSION_STATE_LOCAL_KEY = "sessionState";
4
3
  export declare const MAX_SESSION_STATE_ENTRY_COUNT = 256;
5
4
  export declare const MAX_SESSION_STATE_KEY_LENGTH = 256;
6
5
  export declare const MAX_SESSION_STATE_SERIALIZED_BYTES: number;
@@ -1,6 +1,6 @@
1
1
  import { encode } from "./codec.js";
2
2
  import { WeftError } from "./weft-error.js";
3
- export const SESSION_STATE_LOCAL_KEY = "stateSession", LEGACY_SESSION_STATE_LOCAL_KEY = "sessionState", MAX_SESSION_STATE_ENTRY_COUNT = 256, MAX_SESSION_STATE_KEY_LENGTH = 256, MAX_SESSION_STATE_SERIALIZED_BYTES = 32768;
3
+ export const SESSION_STATE_LOCAL_KEY = "stateSession", MAX_SESSION_STATE_ENTRY_COUNT = 256, MAX_SESSION_STATE_KEY_LENGTH = 256, MAX_SESSION_STATE_SERIALIZED_BYTES = 32768;
4
4
  const RESERVED_SESSION_STATE_KEYS = new Set(["__proto__", "constructor", "prototype"]);
5
5
 
6
6
  export class SessionStateValidationError extends WeftError {
@@ -55,7 +55,7 @@ export function normalizeSessionStateRecord(value) {
55
55
  export function normalizeSessionStateLocals(locals) {
56
56
  if (!locals)
57
57
  return;
58
- return normalizeSessionStateRecord(locals[SESSION_STATE_LOCAL_KEY] ?? locals[LEGACY_SESSION_STATE_LOCAL_KEY]);
58
+ return normalizeSessionStateRecord(locals[SESSION_STATE_LOCAL_KEY]);
59
59
  }
60
60
  export function validateSessionStateStore(store) {
61
61
  const keys = Object.keys(store);
@@ -2,11 +2,67 @@ import type { Duration } from './types.ts';
2
2
  import { WeftError } from './weft-error.ts';
3
3
  export declare const MAX_WORKFLOW_TAGS = 32;
4
4
  export declare const MAX_WORKFLOW_TAG_BYTES = 128;
5
+ /**
6
+ * Upper bound on a start `idempotencyKey`, in UTF-8 bytes. `startOrSignal`
7
+ * derives a signal id of `start-idem:${key}` (an 11-byte prefix) from the key,
8
+ * and `validateSignalId` caps a signal id at 128 bytes — so the raw key must fit
9
+ * in `128 - 11 = 117` bytes for the derived id to stay within that ceiling.
10
+ */
11
+ export declare const MAX_IDEMPOTENCY_KEY_BYTES = 117;
5
12
  export declare class StartWorkflowValidationError extends WeftError<'StartWorkflowValidationError'> {
6
13
  constructor(message: string);
7
14
  }
8
15
  export declare const assertExclusiveStartWorkflowOptions: (startAt: unknown, startAfter: unknown) => void;
9
16
  export declare const coerceStartWorkflowId: (value: unknown, fieldName: string) => string;
17
+ /**
18
+ * Coerce a transport-supplied idempotency key to a non-empty string. The key is
19
+ * a caller-chosen dedup token (it becomes part of a `start-idem:` storage key),
20
+ * so an empty string — which would collide across unrelated starts — is rejected.
21
+ */
22
+ export declare const coerceStartWorkflowIdempotencyKey: (value: unknown, fieldName: string) => string;
23
+ /**
24
+ * Validate an already-string `idempotencyKey`: non-empty (an empty key would
25
+ * collide across unrelated starts under the shared `start-idem:` mapping) and at
26
+ * most {@link MAX_IDEMPOTENCY_KEY_BYTES} UTF-8 bytes (so the derived
27
+ * `start-idem:${key}` signal id stays within the signal-id ceiling). Shared by
28
+ * the transport coercion and the engine boundary so a direct `engine.start`
29
+ * caller gets the same guarantees as an HTTP caller.
30
+ */
31
+ export declare const assertValidIdempotencyKey: (value: string, fieldName: string) => string;
32
+ /**
33
+ * Validate the `onTerminalConflict` start policy against the rest of the start
34
+ * options. `'error'` (the default) and `'start-new'` are the only accepted
35
+ * values. `'start-new'` (Temporal's `ALLOW_DUPLICATE` for terminal runs) requires
36
+ * an explicit, caller-chosen `id` and is mutually exclusive with `idempotencyKey`:
37
+ * idempotency is a permanent at-most-once mapping that survives terminal state, so
38
+ * restarting under it would contradict that contract. A generated UUID is never a
39
+ * meaningful restart target, hence the explicit-`id` requirement.
40
+ */
41
+ export declare function assertValidOnTerminalConflict(options: {
42
+ onTerminalConflict?: unknown;
43
+ id?: unknown;
44
+ idempotencyKey?: unknown;
45
+ } | undefined): void;
46
+ /**
47
+ * `options.id` and `options.idempotencyKey` are mutually exclusive: idempotency
48
+ * assigns its own generated workflow id and dedups through the key, so pinning a
49
+ * caller id alongside it conflates "id already taken" with "lost the idempotency
50
+ * race". Reject the combination so each concern stays separable. Shared by the
51
+ * plain idempotent-start path and `startOrSignal` convergence validation.
52
+ */
53
+ export declare function assertIdAndIdempotencyKeyExclusive(options: {
54
+ id?: unknown;
55
+ idempotencyKey?: unknown;
56
+ }): void;
57
+ /**
58
+ * Reject `onTerminalConflict` on a start surface that does not support it
59
+ * (`engine.startOrSignal`). The option is type-absent from those surfaces, but a
60
+ * transport or untyped JS caller could still smuggle the field into the options
61
+ * object — this is the runtime backstop. `engine.startOrSignal`'s identity is the
62
+ * permanent at-most-once idempotency mapping, which `'start-new'` would violate,
63
+ * so the policy is `engine.start`-only (see follow-up issue #489).
64
+ */
65
+ export declare function assertOnTerminalConflictUnsupported(options: object | undefined, surface: string): void;
10
66
  export declare function coerceStartWorkflowTimestamp(value: unknown, fieldName: string): number;
11
67
  export declare function parseStartWorkflowDuration(duration: Duration, fieldName: string): number;
12
68
  export declare function coerceStartWorkflowDuration(value: unknown, fieldName: string): Duration;