@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
@@ -9,7 +9,8 @@ import type { Duration } from './retry-retention.ts';
9
9
  import type { SearchAttributeHandle, SearchAttributeSchema, SearchAttributeValue, SearchAttributeValueForDefinition } from './search-attributes.ts';
10
10
  import type { WorkflowStateNamespace } from './state.ts';
11
11
  import type { ActivityArgsFor, ActivityMap, ActivityResultFor, QueryMap, QueryShape, SignalMap, SignalPayload, UpdateMap, UpdatePayload } from './workflow-builder-helpers.ts';
12
- import type { ChildWorkflowOptions, ChildWorkflowTarget, WorkflowMapOptions, WorkflowOperation, WorkflowPipeStage, WorkflowPipeStageDefinition, WorkflowReduceInput, WorkflowReduceOptions } from './workflow-function.ts';
12
+ import type { AwaitChildWorkflowOptions, ChildWorkflowHandle, ChildWorkflowOptions, ChildWorkflowTarget, DetachedChildWorkflowOptions, WorkflowMapOptions, WorkflowOperation, WorkflowPipeStage, WorkflowPipeStageDefinition, WorkflowReduceInput, WorkflowReduceOptions } from './workflow-function.ts';
13
+ import type { WorkflowLogger } from './workflow-log.ts';
13
14
  export type WorkflowOperationResult<TOperation> = TOperation extends Generator<unknown, infer TResult, unknown> ? TResult : never;
14
15
  export type WorkflowOperationTupleResult<TOperations extends readonly WorkflowOperation<unknown>[]> = {
15
16
  -readonly [TIndex in keyof TOperations]: WorkflowOperationResult<TOperations[TIndex]>;
@@ -51,8 +52,14 @@ export type RunAllResult<TBranches extends Record<string, WorkflowRunAllBranch>>
51
52
  * void engine;
52
53
  * ```
53
54
  */
54
- export interface WorkflowContext<TActivities extends ActivityMap = {}, TSignals extends SignalMap = {}, TUpdates extends UpdateMap = {}, TQueries extends QueryMap = {}, TSearchAttributes extends SearchAttributeSchema = {}> {
55
+ export interface WorkflowContext<TActivities extends ActivityMap = {}, TSignals extends SignalMap = {}, TUpdates extends UpdateMap = {}, TQueries extends QueryMap = {}, TSearchAttributes extends SearchAttributeSchema = {}, TServices = unknown> {
55
56
  readonly workflowId: WorkflowId;
57
+ /**
58
+ * The registered workflow type name for this run (the `name` field from
59
+ * `workflow({ name: '...' })`). Useful for logging and self-inspection
60
+ * without capturing the name at the workflow definition site.
61
+ */
62
+ readonly workflowType: string;
56
63
  readonly signal: AbortSignal;
57
64
  readonly executionTimeRemaining: number;
58
65
  readonly startedAt: number;
@@ -63,15 +70,16 @@ export interface WorkflowContext<TActivities extends ActivityMap = {}, TSignals
63
70
  * clients, tool registries). The value is **never checkpointed**: it is held
64
71
  * only in engine memory for this run, and on a fresh-process recovery it is
65
72
  * re-provided by the engine's `resolveWorkflowServices` resolver before the
66
- * generator advances. `undefined` when no services were supplied (and not yet
67
- * re-provided on recovery). Inline execution mode only passing `services`
68
- * under `workflowExecutionMode: 'worker'` throws at `engine.start()`, since a
73
+ * generator advances. `undefined` only when no services were supplied; a
74
+ * services-marked run fails before resume if the fresh engine cannot
75
+ * re-provide them. Inline execution mode only — passing `services` under
76
+ * `workflowExecutionMode: 'worker'` throws at `engine.start()`, since a
69
77
  * non-serializable value cannot cross to a Worker.
70
78
  *
71
- * Typed `unknown`: narrow or cast at the call site
72
- * (`const { db } = ctx.services as MyServices`). A threaded generic is a
73
- * deliberate follow-on, not part of this surface yet. Optional so existing
74
- * structural `WorkflowContext` implementors are not source-broken.
79
+ * Typed by the workflow definition when the builder declares
80
+ * `.services<MyServices>()`, and `unknown` otherwise. Optional so existing
81
+ * structural `WorkflowContext` implementors are not source-broken and so
82
+ * workflows still handle no-services launches explicitly.
75
83
  *
76
84
  * Separate child *workflows* started from within a workflow (`ctx.startChild()`)
77
85
  * do **not** inherit the parent's `services` — each run is its own workflow with
@@ -81,7 +89,21 @@ export interface WorkflowContext<TActivities extends ActivityMap = {}, TSignals
81
89
  * replay (same `workflowId`) and therefore does carry the run's `services`
82
90
  * across.
83
91
  */
84
- readonly services?: unknown;
92
+ readonly services?: TServices;
93
+ /**
94
+ * Structured logger scoped to this run, auto-carrying `workflowId` and
95
+ * `workflowType`. Replay-safe in both inline and worker execution modes: log
96
+ * calls in the already-committed replay window are suppressed so a recovered
97
+ * run does not re-emit logs. See {@link WorkflowLogger} for the full contract
98
+ * (method set, the after-last-step caveat, and parallel-branch semantics).
99
+ *
100
+ * Optional on the interface so existing structural `WorkflowContext`
101
+ * implementors (test stubs and the like) are not source-broken — the same
102
+ * precedent as {@link WorkflowContext.services}. The engine always populates it
103
+ * at runtime, so within a real workflow body `ctx.log` is always present; the
104
+ * `?` only affects callers typed against the bare interface (use `ctx.log?.`).
105
+ */
106
+ readonly log?: WorkflowLogger;
85
107
  run<TName extends keyof TActivities & string>(name: TName, ...rest: ActivityArgsFor<TActivities[TName]>): WorkflowOperation<ActivityResultFor<TActivities[TName]>>;
86
108
  run<TName extends keyof TActivities & string>(name: TName, ...rest: [...ActivityArgsFor<TActivities[TName]>, ActivityCallOptions]): WorkflowOperation<ActivityResultFor<TActivities[TName]>>;
87
109
  run<TName extends string>(name: UnknownNameWhenRegistryHasNoKnownNames<TName, keyof TActivities & string>, input?: unknown, options?: ActivityCallOptions): WorkflowOperation<unknown>;
@@ -107,6 +129,47 @@ export interface WorkflowContext<TActivities extends ActivityMap = {}, TSignals
107
129
  payload: T;
108
130
  respond: (result: unknown) => void;
109
131
  }>;
132
+ /**
133
+ * Wait until `predicate` returns `true`, re-evaluated by the engine each time
134
+ * the workflow is driven forward — when an `onUpdate` handler mutates
135
+ * workflow-local state, or when the optional `timeout` elapses. This is the
136
+ * condition-variable primitive (Temporal's `condition()`): a `waitUntil` whose
137
+ * predicate reads state mutated by `onUpdate` handlers re-checks in-process
138
+ * without polling. (Weft signals are pull-only via `ctx.waitForSignal`; they
139
+ * run no state-mutating handler, so signal delivery does not re-drive a
140
+ * `waitUntil` — use `onUpdate` to push state a predicate observes.)
141
+ *
142
+ * The predicate must be PURE — it may read only checkpoint-restored
143
+ * workflow-local state (`ctx.state`, locals, search attributes) and must not
144
+ * perform I/O, generate randomness, or read wall-clock time. It is a
145
+ * non-serializable closure (like `ctx.memo`'s function), held in-process and
146
+ * never checkpointed. Once the wait outcome has been checkpointed, replay
147
+ * returns the cached outcome and does not re-invoke the predicate. A predicate
148
+ * that throws fails the workflow at the `yield* ctx.waitUntil` call site (like
149
+ * a throwing activity), so the workflow body can `try`/`catch` it.
150
+ *
151
+ * Inline execution only — worker execution does not expose this operation (it
152
+ * is omitted from the worker context type), because the predicate closure
153
+ * cannot cross to a worker process. It also cannot be a branch of `ctx.race`,
154
+ * `ctx.all`, or `ctx.speculate`; used there it throws an actionable error.
155
+ *
156
+ * Without `timeout` it resolves `void` once the predicate is met (waits
157
+ * forever). With `timeout` it resolves `true` when the predicate was met or
158
+ * `false` when the deadline elapsed first; if both happen on the same tick the
159
+ * predicate wins (resolves `true`). `timeout` is milliseconds (`number`) or a
160
+ * duration string (`'30s'`, `'5m'` — see {@link Duration}).
161
+ */
162
+ waitUntil(predicate: () => boolean): WorkflowOperation<void>;
163
+ waitUntil(predicate: () => boolean, timeout: Duration): WorkflowOperation<boolean>;
164
+ /**
165
+ * Pin a named workflow patch to a deterministic numeric version. The first
166
+ * execution stores `maxSupported` under `version:${changeId}` in checkpoint
167
+ * locals; replay and recovery return that stored value so in-flight workflows
168
+ * can keep taking their original branch while new runs pin the newer version.
169
+ * Raise `minSupported` only after every in-flight run pinned below that version
170
+ * has completed.
171
+ */
172
+ getVersion(changeId: string, minSupported: number, maxSupported: number): WorkflowOperation<number>;
110
173
  review(options: HumanReviewOptions): WorkflowOperation<HumanReviewResult>;
111
174
  all<const TOperations extends readonly WorkflowOperation<unknown>[]>(operations: TOperations): WorkflowOperation<WorkflowOperationTupleResult<TOperations>>;
112
175
  race<const TOperations extends readonly WorkflowOperation<unknown>[]>(operations: TOperations): WorkflowOperation<WorkflowOperationTupleResult<TOperations>[number]>;
@@ -123,7 +186,9 @@ export interface WorkflowContext<TActivities extends ActivityMap = {}, TSignals
123
186
  * durable activity pipeline and is not replayed after engine restart.
124
187
  */
125
188
  saga<TFinalOutput = unknown>(steps: ErasedSagaStep[]): WorkflowOperation<TFinalOutput>;
126
- startChild<TResult = unknown>(workflowType: string, input: unknown, options?: ChildWorkflowOptions): WorkflowOperation<TResult>;
189
+ startChild<TResult = unknown>(workflowType: string, input: unknown, options: DetachedChildWorkflowOptions): WorkflowOperation<ChildWorkflowHandle<TResult>>;
190
+ startChild<TResult = unknown>(workflowType: string, input: unknown, options?: AwaitChildWorkflowOptions): WorkflowOperation<TResult>;
191
+ startChild<TResult = unknown>(workflowType: string, input: unknown, options?: ChildWorkflowOptions): WorkflowOperation<TResult | ChildWorkflowHandle<TResult>>;
127
192
  pipe<TInput, TOutput>(stages: [WorkflowPipeStageDefinition<TInput, TOutput>], input: TInput): WorkflowOperation<TOutput>;
128
193
  pipe<TInput, TIntermediate, TOutput>(stages: [
129
194
  WorkflowPipeStageDefinition<TInput, TIntermediate>,
@@ -170,10 +235,27 @@ export interface WorkflowContext<TActivities extends ActivityMap = {}, TSignals
170
235
  *
171
236
  * **Best-effort only**: handlers run outside the durable effect log and are
172
237
  * not retried. Side effects in handlers are not replay-safe, and registered
173
- * handlers are not restored after an engine restart.
238
+ * handlers are not restored after an engine restart. A hard cancel or an
239
+ * engine crash that evicts the workflow before the handler runs loses it.
240
+ *
241
+ * **Prefer a durable `finalizer` for resource teardown.** To tear down a paid
242
+ * external resource (a sandbox, a leased VM) so it is destroyed even across a
243
+ * hard cancel or a crash, record the resource with
244
+ * {@link WorkflowContext.setFinalizerState} and declare a definition-level
245
+ * `finalizer` activity — the engine drives it durably post-terminal. `onCancel`
246
+ * remains the right tool for in-process, best-effort cleanup (releasing an
247
+ * in-memory lock, flushing a buffer) where durability is not required.
248
+ * Registering a `finalizer` works in both inline and worker mode; only the
249
+ * in-generator `ctx.setFinalizerState` call requires inline execution (see
250
+ * `setFinalizerState`).
174
251
  *
175
- * **Worker-pool mode**: this method throws when the engine uses a remote
176
- * worker pool so teardown does not silently drop.
252
+ * **Inline-only**: `onCancel` is in-process host wiring available only under
253
+ * inline execution. A handler annotated `(ctx: WorkflowContext)` type-checks the
254
+ * call (the static type declares it), but at runtime in worker mode the
255
+ * generator's `ctx` is a reduced worker-side context that does not carry
256
+ * `onCancel`, so the call fails with a `TypeError` rather than silently dropping
257
+ * teardown. (Inside a `ctx.speculate()` branch the method is present but its
258
+ * engine callback is unset, so it throws a descriptive guard error instead.)
177
259
  *
178
260
  * @example
179
261
  * ```ts
@@ -189,5 +271,66 @@ export interface WorkflowContext<TActivities extends ActivityMap = {}, TSignals
189
271
  * ```
190
272
  */
191
273
  onCancel(handler: () => Promise<void> | void): void;
274
+ /**
275
+ * Durably record the payload the engine passes to this workflow's
276
+ * definition-level `finalizer` activity when it drives teardown after a
277
+ * `cancelled` or `timed-out` terminal (issue #446).
278
+ *
279
+ * Call this immediately after acquiring a paid external resource, passing
280
+ * whatever the finalizer needs to destroy it (e.g. a sandbox id). The value is
281
+ * durably staged — as a pending atomic side-effect committed with the next
282
+ * checkpoint or the terminal transition, fenced under lease ownership — so the
283
+ * finalizer can run even across a hard cancel or an engine crash. Recording is
284
+ * the engine's signal that there is something to tear down: if the workflow
285
+ * never calls this, the engine skips the finalizer entirely. Recording `null`
286
+ * is different — it still counts as recorded, so the finalizer runs with a
287
+ * `null` payload. The value is last-write-wins, so a later call replaces the
288
+ * earlier one — record the id of the resource that is currently live.
289
+ *
290
+ * **The finalizer runs at least once and must be idempotent.** The engine
291
+ * drives it with bounded retries and re-drives a stale claim after a crash, so
292
+ * the same payload can reach the finalizer more than once (the same contract as
293
+ * keying a destroy by `sandboxId`). Make the teardown safe to repeat —
294
+ * destroying an already-destroyed resource must succeed (or no-op), not throw.
295
+ *
296
+ * Calling this after the workflow is already terminalizing is a no-op (a
297
+ * development warning is logged); finalizer state is recordable only while the
298
+ * workflow is live.
299
+ *
300
+ * **Inline-only caveat**: this method is durable host wiring, available only
301
+ * under inline execution — but its absence surfaces differently per path:
302
+ *
303
+ * - *Inline, top level*: the engine wires up the callback this method delegates
304
+ * to, so it records state.
305
+ * - *Inside a `ctx.speculate()` branch*: the branch reuses the same
306
+ * {@link WorkflowContext}, so `setFinalizerState` exists, but the engine
307
+ * leaves its callback unset for speculation, so the call throws a descriptive
308
+ * guard error rather than recording state.
309
+ * - *Worker execution mode*: the generator's runtime `ctx` is a reduced
310
+ * worker-side context that does not carry `setFinalizerState` at all. A
311
+ * handler annotated `(ctx: WorkflowContext)` still type-checks the call (the
312
+ * static type declares the method), but at runtime the method is absent on the
313
+ * worker context value, so the call fails with a `TypeError`.
314
+ *
315
+ * A workflow that must record finalizer state therefore has to run in inline
316
+ * execution mode. Durable finalizer *registration* works in worker mode since
317
+ * #564; only the in-generator `setFinalizerState` call requires inline execution.
318
+ * For in-process, best-effort cleanup that does not need to survive a crash, use
319
+ * {@link WorkflowContext.onCancel}.
320
+ *
321
+ * @example
322
+ * ```ts
323
+ * import { workflow, type WorkflowContext } from '@lostgradient/weft';
324
+ *
325
+ * const provision = workflow({ name: 'provision' })
326
+ * .execute(async function* (ctx: WorkflowContext) {
327
+ * const sandbox = yield* ctx.run(createSandbox);
328
+ * ctx.setFinalizerState({ sandboxId: sandbox.id });
329
+ * yield* ctx.run(doWork, sandbox.id);
330
+ * });
331
+ * void provision;
332
+ * ```
333
+ */
334
+ setFinalizerState(value: unknown): void;
192
335
  }
193
336
  export {};
@@ -2,20 +2,21 @@
2
2
  * The `WorkflowDefinition` type — the runtime shape produced by
3
3
  * `workflow({ name }).execute(fn)`. Carries the workflow name, the generator
4
4
  * handler, and the colocated metadata the engine reads at registration time
5
- * (version, schemas, retention, search attributes, migration, domain
6
- * constraints, tags, description).
5
+ * (version, schemas, retention, search attributes, domain constraints, tags,
6
+ * description).
7
7
  */
8
8
  import type { ConstraintDefinition } from '../constraint.ts';
9
9
  import type { DefinitionSchema } from './definition-schema.ts';
10
10
  import type { RetentionPolicy } from './retry-retention.ts';
11
11
  import type { SearchAttributeSchema } from './search-attributes.ts';
12
+ import type { WorkflowConcurrencyOptions } from './workflow-concurrency.ts';
12
13
  import type { WorkflowFunction } from './workflow-function.ts';
14
+ import type { AnyActivityDefinition } from './workflow-registries.ts';
13
15
  /**
14
16
  * Named workflow definition returned by {@link workflow}. The runtime object
15
17
  * carries the workflow name, the generator handler, and optional metadata
16
- * (version, schemas, retention policy, search-attribute schema, checkpoint
17
- * migration, and domain constraints) that the engine reads at registration
18
- * time.
18
+ * (version, schemas, retention policy, workflow concurrency, search-attribute
19
+ * schema, and domain constraints) that the engine reads at registration time.
19
20
  *
20
21
  * @example
21
22
  * ```ts
@@ -27,12 +28,12 @@ import type { WorkflowFunction } from './workflow-function.ts';
27
28
  * });
28
29
  * ```
29
30
  */
30
- export interface WorkflowDefinition<TInput = unknown, TOutput = unknown, TName extends string = string> {
31
+ export interface WorkflowDefinition<TInput = unknown, TOutput = unknown, TName extends string = string, TServices = unknown> {
31
32
  /** Wire-safe workflow name; the registry key. */
32
33
  name: TName;
33
34
  /** Workflow generator function executed by the engine. */
34
- handler: WorkflowFunction<TInput, TOutput>;
35
- /** Version recorded with workflow state and used for checkpoint migration. */
35
+ handler: WorkflowFunction<TInput, TOutput, TServices>;
36
+ /** Version recorded with workflow state and checked during recovery. */
36
37
  version?: string;
37
38
  /** User-facing description for catalog, code generation, and tool surfaces. */
38
39
  description?: string;
@@ -42,12 +43,12 @@ export interface WorkflowDefinition<TInput = unknown, TOutput = unknown, TName e
42
43
  inputSchema?: DefinitionSchema<unknown, TInput>;
43
44
  /** Optional output schema metadata for introspection; registration validates metadata shape only. */
44
45
  outputSchema?: DefinitionSchema<unknown, TOutput>;
45
- /** Optional checkpoint migration from a prior workflow version. */
46
- migrate?: (checkpoint: unknown, fromVersion: string) => unknown;
47
46
  /** Search-attribute schema used to validate indexed workflow metadata. */
48
47
  searchAttributes?: SearchAttributeSchema;
49
48
  /** Retention policy for terminal workflow records. */
50
49
  retention?: RetentionPolicy;
50
+ /** Start admission policy for this workflow type. */
51
+ concurrency?: WorkflowConcurrencyOptions<TInput>;
51
52
  /**
52
53
  * Domain constraints evaluated at every checkpoint commit. When a constraint's
53
54
  * `check` returns false, the engine dispatches a `ConstraintViolatedEvent`
@@ -58,4 +59,46 @@ export interface WorkflowDefinition<TInput = unknown, TOutput = unknown, TName e
58
59
  * (`workerExecution` option) will silently skip constraint evaluation.
59
60
  */
60
61
  constraints?: ConstraintDefinition[];
62
+ /**
63
+ * Declares a definition-level teardown activity for durable, replay-safe
64
+ * cancellation cleanup (issue #446) — for example destroying a paid sandbox
65
+ * when a workflow is cancelled or times out.
66
+ *
67
+ * After a `cancelled` or `timed-out` terminal, the engine drives this finalizer
68
+ * to durable completion, passing the value recorded by
69
+ * {@link WorkflowContext.setFinalizerState} as its input. That teardown survives
70
+ * a hard cancel and an engine crash: the engine schedules it durably, claims it
71
+ * before running, retries failures with backoff, re-drives a stale claim after
72
+ * recovery, and records a durable dead-letter once the attempt budget is
73
+ * exhausted. The engine skips the finalizer entirely when the workflow never
74
+ * recorded any finalizer state, and `completed`/`failed` workflows never run it
75
+ * (only `cancelled`/`timed-out`).
76
+ *
77
+ * **The finalizer runs at least once and must be idempotent.** Bounded retries
78
+ * and crash-recovery re-drive mean the same payload can reach it more than once,
79
+ * so destroying an already-destroyed resource must succeed (or no-op) rather
80
+ * than throw — the same contract as keying a destroy by `sandboxId`.
81
+ *
82
+ * A `finalizer` is trusted host code. **Registration** works in both inline and
83
+ * worker execution modes, and the teardown **runs on the engine host** regardless
84
+ * of execution mode (and regardless of whether `activityExecution` is configured):
85
+ * worker execution mode isolates only the workflow generator in a Web Worker.
86
+ *
87
+ * Durable teardown, however, only fires when the workflow staged finalizer state
88
+ * via {@link WorkflowContext.setFinalizerState} before terminating — and that
89
+ * call works only under inline execution. A handler annotated
90
+ * `(ctx: WorkflowContext)` type-checks the call in any generator (the static type
91
+ * declares the method), but at runtime in worker mode the generator's `ctx` is a
92
+ * reduced worker-side context that does not carry `setFinalizerState` at all, so
93
+ * the call fails with a `TypeError`; and there is no host-side API to stage the
94
+ * state on the workflow's behalf. So a worker-mode workflow that needs durable
95
+ * finalizer teardown must run **inline** to record its state; registering a
96
+ * `finalizer` on a worker-mode engine no longer throws, but a worker generator
97
+ * cannot drive it. The inline-only alternatives are `ctx.onCancel`
98
+ * (in-process, best-effort cleanup that need not survive a crash) and `ctx.saga`
99
+ * (multi-step ordered rollback) — both are unavailable in worker mode, where
100
+ * teardown must happen in the workflow body (a `ctx.run` destroy step in a
101
+ * `try/finally`).
102
+ */
103
+ finalizer?: AnyActivityDefinition;
61
104
  }
@@ -28,7 +28,7 @@ export type { WorkflowDefinition } from './workflow-definition.ts';
28
28
  * void engine;
29
29
  * ```
30
30
  */
31
- export type WorkflowFunction<TInput = unknown, TOutput = unknown> = (context: WorkflowContext, input: TInput) => AsyncGenerator<unknown, TOutput, unknown>;
31
+ export type WorkflowFunction<TInput = unknown, TOutput = unknown, TServices = unknown> = (context: WorkflowContext<{}, {}, {}, {}, {}, TServices>, input: TInput) => AsyncGenerator<unknown, TOutput, unknown>;
32
32
  /**
33
33
  * Simplified context for step-based ("progressive disclosure") workflows.
34
34
  * Instead of yielding operations via a generator, write a plain `async`
@@ -54,6 +54,23 @@ export type WorkflowFunction<TInput = unknown, TOutput = unknown> = (context: Wo
54
54
  export interface StepWorkflowContext {
55
55
  readonly workflowId: string;
56
56
  readonly signal: AbortSignal;
57
+ /**
58
+ * Run `fn` as a durable step. Each call routes through the same machinery as
59
+ * `ctx.run(...)`: the engine assigns a positional replay slot, persists the
60
+ * result to the checkpoint, and on crash recovery returns the stored result
61
+ * without re-running `fn`. `name` is the durable activity label (timeline and
62
+ * diagnostics only) — replay is keyed by position, not by name.
63
+ *
64
+ * Because durability is positional, you must `await` each step before
65
+ * starting the next: steps must be queued in a deterministic order so the
66
+ * original run and a recovered run agree on which slot is which. Firing steps
67
+ * concurrently (so a continuation enqueues further steps in completion order)
68
+ * can return a wrong cached value after a crash. For parallelism, durable
69
+ * timers, or signals, use the generator API instead.
70
+ *
71
+ * Requires `workflowExecutionMode: 'inline'` (the default); the worker
72
+ * execution strategy has no step machinery and throws an actionable error.
73
+ */
57
74
  step<T>(name: string, fn: () => Promise<T> | T): Promise<T>;
58
75
  }
59
76
  /**
@@ -141,17 +158,92 @@ export type WorkflowOperation<TResult> = Generator<unknown, TResult, unknown>;
141
158
  */
142
159
  export type ChildWorkflowTarget<TInput = unknown, TOutput = unknown> = string | WorkflowFunction<TInput, TOutput> | StepWorkflowFunction<TInput, TOutput>;
143
160
  /**
144
- * Options passed to child workflow invocations within `ctx.pipe`, `ctx.map`,
145
- * or `ctx.reduce`. Currently accepts an optional `id` to control the child
146
- * workflow ID.
161
+ * How a direct `ctx.startChild()` call relates the child workflow to the parent.
162
+ *
163
+ * - `'await'` is the default and preserves the original behavior: the parent
164
+ * waits for the child result.
165
+ * - `'abandon'` starts the child and returns a serializable child handle
166
+ * reference immediately. The child does not inherit the parent's execution
167
+ * state owner.
168
+ * - `'request-cancel'` starts the child and returns a serializable child handle
169
+ * reference immediately. If the parent is cancelled in the same engine
170
+ * process, Weft requests cancellation of the child.
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * import type { ChildWorkflowParentClosePolicy } from '@lostgradient/weft';
175
+ *
176
+ * const policy: ChildWorkflowParentClosePolicy = 'abandon';
177
+ * void policy;
178
+ * ```
179
+ */
180
+ export type ChildWorkflowParentClosePolicy = 'await' | 'abandon' | 'request-cancel';
181
+ declare const childWorkflowResultType: unique symbol;
182
+ /**
183
+ * Serializable reference returned by detached `ctx.startChild()` policies.
184
+ * It intentionally contains only durable data that can be checkpointed. Use
185
+ * `engine.getHandle(reference.id)` outside the workflow body to observe status,
186
+ * signal the child, or await its result.
187
+ *
188
+ * @example
189
+ * ```ts
190
+ * import type { ChildWorkflowHandle } from '@lostgradient/weft';
191
+ *
192
+ * const child: ChildWorkflowHandle<{ receiptId: string }> = { id: 'payment-child' };
193
+ * const workflowId: string = child.id;
194
+ * void workflowId;
195
+ * ```
196
+ */
197
+ export type ChildWorkflowHandle<TResult = unknown> = {
198
+ readonly id: string;
199
+ readonly [childWorkflowResultType]?: TResult;
200
+ };
201
+ /**
202
+ * Options for child workflow calls that wait for the child result.
203
+ *
204
+ * @example
205
+ * ```ts
206
+ * import type { AwaitChildWorkflowOptions } from '@lostgradient/weft';
207
+ *
208
+ * const options: AwaitChildWorkflowOptions = {
209
+ * id: 'payment-child',
210
+ * parentClosePolicy: 'await',
211
+ * };
212
+ * void options;
213
+ * ```
147
214
  */
148
- export type ChildWorkflowOptions = {
215
+ export type AwaitChildWorkflowOptions = {
149
216
  id?: string;
217
+ parentClosePolicy?: 'await';
150
218
  };
219
+ /**
220
+ * Options for direct child workflow calls that return a child handle reference.
221
+ *
222
+ * @example
223
+ * ```ts
224
+ * import type { DetachedChildWorkflowOptions } from '@lostgradient/weft';
225
+ *
226
+ * const options: DetachedChildWorkflowOptions = {
227
+ * id: 'background-payment',
228
+ * parentClosePolicy: 'request-cancel',
229
+ * };
230
+ * void options;
231
+ * ```
232
+ */
233
+ export type DetachedChildWorkflowOptions = {
234
+ id?: string;
235
+ parentClosePolicy: Exclude<ChildWorkflowParentClosePolicy, 'await'>;
236
+ };
237
+ /**
238
+ * Options passed to direct child workflow invocations via `ctx.startChild()`.
239
+ * Composition operators (`ctx.pipe`, `ctx.map`, and `ctx.reduce`) are await-only
240
+ * and accept only {@link AwaitChildWorkflowOptions}.
241
+ */
242
+ export type ChildWorkflowOptions = AwaitChildWorkflowOptions | DetachedChildWorkflowOptions;
151
243
  /**
152
244
  * A single stage in a `ctx.pipe(stages, input)` composition chain. Pairs a
153
- * {@link ChildWorkflowTarget} with optional {@link ChildWorkflowOptions} such
154
- * as a custom child workflow ID. Use the object form when you need to pass
245
+ * {@link ChildWorkflowTarget} with optional {@link AwaitChildWorkflowOptions}
246
+ * such as a custom child workflow ID. Use the object form when you need to pass
155
247
  * per-stage options; otherwise a bare {@link ChildWorkflowTarget} also works.
156
248
  *
157
249
  * @example
@@ -176,7 +268,7 @@ export type ChildWorkflowOptions = {
176
268
  */
177
269
  export interface WorkflowPipeStage<TInput = unknown, TOutput = unknown> {
178
270
  type: ChildWorkflowTarget<TInput, TOutput>;
179
- options?: ChildWorkflowOptions;
271
+ options?: AwaitChildWorkflowOptions;
180
272
  }
181
273
  /**
182
274
  * Union of the two accepted formats for each stage passed to `ctx.pipe`:
@@ -304,7 +396,7 @@ export interface WorkflowReduceInput<TAccumulator, TItem> {
304
396
  * void engine;
305
397
  * ```
306
398
  */
307
- export interface WorkflowReduceOptions extends Record<string, unknown> {
399
+ export interface WorkflowReduceOptions extends AwaitChildWorkflowOptions {
308
400
  idPrefix?: string;
309
401
  }
310
402
  /**
@@ -0,0 +1,98 @@
1
+ /**
2
+ * The `ctx.log` structured-logging surface: the {@link WorkflowLogger} exposed on
3
+ * the workflow context, the {@link WorkflowLogRecord} envelope it emits, and the
4
+ * {@link WorkflowLogLevel} severity. Split out from `workflow-context.ts` so the
5
+ * context module stays under the line cap and the log types can be re-exported as
6
+ * a cohesive cluster.
7
+ *
8
+ * @module core/types/workflow-log
9
+ */
10
+ /**
11
+ * Severity of a {@link WorkflowLogRecord}, ordered `debug < info < warn < error`.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import type { WorkflowLogLevel } from '@lostgradient/weft';
16
+ * const isError = (level: WorkflowLogLevel) => level === 'error';
17
+ * ```
18
+ */
19
+ export type WorkflowLogLevel = 'debug' | 'info' | 'warn' | 'error';
20
+ /**
21
+ * The structured record a {@link WorkflowLogger} emits for one log call. Envelope
22
+ * fields (`level`, `message`, `workflowId`, `workflowType`, `timestamp`) are
23
+ * engine-owned and always present; caller `attributes` nest under their own key so
24
+ * they can never shadow an envelope field. `timestamp` is wall-clock ms at emit —
25
+ * observability metadata, never checkpointed or replayed. Type a host sink
26
+ * installed via `EngineOptions.onLog` with this record.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * import { Engine, type WorkflowLogRecord } from '@lostgradient/weft';
31
+ * const engine = new Engine({ onLog: (r: WorkflowLogRecord) => console.log(r.level, r.message) });
32
+ * ```
33
+ */
34
+ export interface WorkflowLogRecord {
35
+ readonly level: WorkflowLogLevel;
36
+ readonly message: string;
37
+ readonly workflowId: string;
38
+ readonly workflowType: string;
39
+ readonly timestamp: number;
40
+ readonly attributes?: Record<string, unknown>;
41
+ }
42
+ /**
43
+ * The structured logger exposed as `WorkflowContext.log`. Each method emits
44
+ * a {@link WorkflowLogRecord} to the current process console (`console.debug` /
45
+ * `console.info` / `console.warn` / `console.error`) with `workflowId`,
46
+ * `workflowType`, `level`, and `timestamp` auto-attached. Caller-supplied
47
+ * `attributes` are nested under their own key and cannot overwrite the envelope.
48
+ *
49
+ * Replay behavior: a workflow body re-executes from the start on recovery to
50
+ * rebuild state. Log calls in the already-committed replay window are suppressed,
51
+ * so a recovered run does not re-emit logs it already emitted. Suppression is
52
+ * per-position: a log call sitting at a step the engine has already cached is
53
+ * silenced; a log call at the live frontier emits. This holds in both inline and
54
+ * worker execution modes.
55
+ *
56
+ * Two replay caveats. A log placed *after* the last committed step re-fires on
57
+ * recovery, because there is no cached step to suppress it (the same caveat
58
+ * Temporal's workflow logger carries); likewise a workflow with no committed
59
+ * durable step has no replay position to suppress against, so its logs may
60
+ * re-emit on recovery. Logs inside `ctx.all` / `ctx.runAll` branches follow that
61
+ * branch's re-execution semantics.
62
+ *
63
+ * A host sink installed via `EngineOptions.onLog` receives records from BOTH execution
64
+ * modes: inline records directly, and worker-mode records forwarded from the worker
65
+ * back to the host. When no sink is installed, worker-mode records go to the worker
66
+ * process console (and inline records to the engine-host console). Inline log
67
+ * timestamps come from the engine clock; worker-mode timestamps come from the worker
68
+ * process wall clock.
69
+ *
70
+ * Exported so a host can also type a logger it injects through `ctx.services`
71
+ * (the pre-`ctx.log` pattern).
72
+ *
73
+ * @example
74
+ * ```ts
75
+ * import { workflow, type WorkflowContext, type WorkflowLogger } from '@lostgradient/weft';
76
+ *
77
+ * const myWorkflow = workflow({ name: 'my-workflow' }).execute(async function* (
78
+ * ctx: WorkflowContext,
79
+ * ) {
80
+ * ctx.log?.info('workflow started', { attempt: 1 });
81
+ * ctx.log?.warn('retrying activity', { reason: 'timeout' });
82
+ * // A host logger injected through `ctx.services` can reuse this type:
83
+ * const { log } = (ctx.services ?? {}) as { log?: WorkflowLogger };
84
+ * log?.error('activity failed', { error: 'ECONNREFUSED' });
85
+ * });
86
+ * void myWorkflow;
87
+ * ```
88
+ */
89
+ export interface WorkflowLogger {
90
+ /** Emit a `debug` record. Auto-carries `workflowId`/`workflowType`; suppressed during replay. */
91
+ debug(message: string, attributes?: Record<string, unknown>): void;
92
+ /** Emit an `info` record. Auto-carries `workflowId`/`workflowType`; suppressed during replay. */
93
+ info(message: string, attributes?: Record<string, unknown>): void;
94
+ /** Emit a `warn` record. Auto-carries `workflowId`/`workflowType`; suppressed during replay. */
95
+ warn(message: string, attributes?: Record<string, unknown>): void;
96
+ /** Emit an `error` record. Auto-carries `workflowId`/`workflowType`; suppressed during replay. */
97
+ error(message: string, attributes?: Record<string, unknown>): void;
98
+ }
File without changes
@@ -32,6 +32,7 @@ export interface WorkflowRegistry {
32
32
  export type WorkflowRegistryEntry = {
33
33
  input: unknown;
34
34
  output: unknown;
35
+ services?: unknown;
35
36
  };
36
37
  declare const defaultWorkflowRegistry: unique symbol;
37
38
  declare const defaultActivityTypes: unique symbol;
@@ -73,7 +74,7 @@ export type IsDefaultWorkflowRegistry<TRegistry extends object> = TRegistry exte
73
74
  */
74
75
  export type AnyWorkflowDefinition = {
75
76
  readonly name: string;
76
- readonly handler: WorkflowFunction<never> | StepWorkflowFunction<never>;
77
+ readonly handler: WorkflowFunction<never, unknown, never> | StepWorkflowFunction<never>;
77
78
  };
78
79
  /**
79
80
  * Broad activity-definition constraint used by {@link Engine.create} and
@@ -100,6 +101,14 @@ export type WorkflowInput<TRegistry extends object, TName extends string> = TNam
100
101
  export type WorkflowOutput<TRegistry extends object, TName extends string> = TName extends keyof TRegistry ? TRegistry[TName] extends {
101
102
  output: infer TOutput;
102
103
  } ? TOutput : unknown : unknown;
104
+ export type WorkflowServices<TRegistry extends object, TName extends string> = TName extends keyof TRegistry ? TRegistry[TName] extends {
105
+ services: infer TServices;
106
+ } ? TServices : unknown : unknown;
107
+ export type WorkflowServicesUnion<TRegistry extends object> = [keyof TRegistry & string] extends [
108
+ never
109
+ ] ? unknown : {
110
+ [Name in keyof TRegistry & string]: WorkflowServices<TRegistry, Name>;
111
+ }[keyof TRegistry & string];
103
112
  export type ActivityArguments<TActivities extends object, TName extends string> = TName extends keyof TActivities ? TActivities[TName] extends () => unknown ? [] : TActivities[TName] extends (input: infer TInput) => unknown ? [input: TInput] : [input: unknown] : [input?: unknown];
104
113
  export type ActivityResult<TActivities extends object, TName extends string> = TName extends keyof TActivities ? TActivities[TName] extends (...arguments_: infer _TArguments) => infer TResult ? Awaited<TResult> : unknown : unknown;
105
114
  export type RegisteredActivityFunction<TActivities extends object, TName extends string> = TName extends keyof TActivities ? TActivities[TName] extends () => infer TResult ? () => TResult : TActivities[TName] extends (input: infer TInput) => infer TResult ? (input: TInput) => TResult : never : never;
@@ -122,16 +131,18 @@ type MergeDefinitionEntries<TUnion> = [TUnion] extends [never] ? {} : UnionToInt
122
131
  * void input;
123
132
  * ```
124
133
  */
125
- export type InferWorkflowEntry<TDefinition extends AnyWorkflowDefinition> = TDefinition extends WorkflowDefinition<infer TInput, infer TOutput, infer TName extends string> ? {
134
+ export type InferWorkflowEntry<TDefinition extends AnyWorkflowDefinition> = TDefinition extends WorkflowDefinition<infer TInput, infer TOutput, infer TName extends string, infer TServices> ? {
126
135
  [Name in TName]: {
127
136
  input: TInput;
128
137
  output: TOutput;
138
+ services: TServices;
129
139
  };
130
140
  } : never;
131
- type InferWorkflowEntryForKey<TName extends string, TDefinition extends AnyWorkflowDefinition> = TDefinition extends WorkflowDefinition<infer TInput, infer TOutput> ? {
141
+ type InferWorkflowEntryForKey<TName extends string, TDefinition extends AnyWorkflowDefinition> = TDefinition extends WorkflowDefinition<infer TInput, infer TOutput, string, infer TServices> ? {
132
142
  [Name in TName]: {
133
143
  input: TInput;
134
144
  output: TOutput;
145
+ services: TServices;
135
146
  };
136
147
  } : never;
137
148
  /**
@@ -1,5 +1,6 @@
1
1
  import type { DefinitionSchema } from './definition-schema.ts';
2
2
  import type { SearchAttributeSchema } from './search-attributes.ts';
3
+ import type { WorkflowConcurrencyOptions } from './workflow-concurrency.ts';
3
4
  /**
4
5
  * Read-only metadata exposed by the engine for a registered workflow type.
5
6
  *
@@ -28,4 +29,6 @@ export interface RegisteredWorkflowDefinition<TInput = unknown, TOutput = unknow
28
29
  outputSchema?: DefinitionSchema<unknown, TOutput>;
29
30
  /** Optional search attribute schema used for indexing and runtime validation. */
30
31
  searchAttributes?: SearchAttributeSchema;
32
+ /** Optional start admission policy for this workflow type. */
33
+ concurrency?: WorkflowConcurrencyOptions<TInput>;
31
34
  }