@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,159 @@
1
+ import type { ActivityCallOptions, Duration } from '../types.ts';
2
+ import { WeftError } from '../weft-error.ts';
3
+ /**
4
+ * Thrown when an activity's {@link ActivityCallOptions.scheduleToCloseTimeout}
5
+ * is enforced at the retry boundary. This fires in two situations, both reported
6
+ * with the **actual** wall-clock {@link elapsed} at the moment of the throw:
7
+ *
8
+ * - The budget has genuinely elapsed (`elapsed >= budget`) — an attempt overran,
9
+ * or downtime during a backoff sleep pushed wall time past the deadline.
10
+ * - The budget has NOT yet elapsed, but the next retry's backoff would start it at
11
+ * or after the deadline — so Weft refuses to schedule a doomed sleep and fails at
12
+ * the retry decision point. In this case {@link projectedNextDispatchElapsed} is
13
+ * set to the elapsed milliseconds after first dispatch at which the skipped retry
14
+ * would have started.
15
+ *
16
+ * The name is registered as a `timeout` failure category, so it classifies and is
17
+ * searchable the same way the other timeout errors are.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import { ActivityScheduleToCloseTimeoutError } from '@lostgradient/weft';
22
+ *
23
+ * function exceededRetryBudget(error: unknown): boolean {
24
+ * return error instanceof ActivityScheduleToCloseTimeoutError;
25
+ * }
26
+ * ```
27
+ */
28
+ export declare class ActivityScheduleToCloseTimeoutError extends WeftError<'ActivityScheduleToCloseTimeoutError'> {
29
+ readonly activityName: string;
30
+ /** Actual wall-clock milliseconds elapsed since first dispatch, at the throw. */
31
+ readonly elapsed: number;
32
+ readonly budget: number;
33
+ /**
34
+ * When the failure is the early retry-decision case (the budget has not yet
35
+ * elapsed but the next backoff would start the retry at or after the deadline),
36
+ * the elapsed milliseconds after first dispatch at which that skipped retry would
37
+ * have started. `undefined` when the budget had genuinely elapsed at the throw.
38
+ */
39
+ readonly projectedNextDispatchElapsed?: number;
40
+ constructor(activityName: string, elapsed: number, budget: number, projectedNextDispatchElapsed?: number);
41
+ }
42
+ /**
43
+ * Thrown when an inline activity attempt overruns its per-attempt
44
+ * {@link ActivityCallOptions.timeout} wall-clock cap. The cap is measured fresh
45
+ * on every attempt (unlike {@link ActivityScheduleToCloseTimeoutError}, which is a
46
+ * single budget across all attempts), so the {@link attempt} number is reported.
47
+ *
48
+ * When this fires, the workflow stops awaiting the attempt and the activity's
49
+ * `AbortSignal` is aborted so a cooperating activity can stop promptly — but Weft
50
+ * cannot forcibly preempt a running activity function, so a non-cooperating
51
+ * activity keeps executing in the background until it returns. The timed-out
52
+ * attempt is retried (with a fresh cap) when a retry policy permits.
53
+ *
54
+ * The name is registered as a `timeout` failure category, so it classifies and is
55
+ * searchable the same way the other timeout errors are. `timeout` is enforced for
56
+ * **inline** execution only; worker-mode per-attempt bounds are governed by
57
+ * `visibilityTimeout`.
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * import { ActivityPerAttemptTimeoutError } from '@lostgradient/weft';
62
+ *
63
+ * function overranAttempt(error: unknown): boolean {
64
+ * return error instanceof ActivityPerAttemptTimeoutError;
65
+ * }
66
+ * ```
67
+ */
68
+ export declare class ActivityPerAttemptTimeoutError extends WeftError<'ActivityPerAttemptTimeoutError'> {
69
+ readonly activityName: string;
70
+ /** The 1-based attempt number that overran its per-attempt cap. */
71
+ readonly attempt: number;
72
+ /** The per-attempt wall-clock cap, in milliseconds. */
73
+ readonly timeoutMs: number;
74
+ constructor(activityName: string, attempt: number, timeoutMs: number);
75
+ }
76
+ /**
77
+ * The largest delay a single `setTimeout` can represent without 32-bit overflow.
78
+ * A delay above this silently wraps and fires almost immediately, so a per-attempt
79
+ * `timeout` larger than this is rejected rather than misbehaving. (~24.8 days.)
80
+ */
81
+ export declare const MAX_PER_ATTEMPT_TIMEOUT_MS = 2147483647;
82
+ /**
83
+ * Parse a per-attempt `timeout` duration to milliseconds, or `undefined` when
84
+ * unset. The value is read off the serialized activity operation, so it is typed
85
+ * `unknown` and validated here as hostile input: only a `number`/`string`
86
+ * {@link Duration} is accepted, and `parseDuration` enforces finite/non-negative
87
+ * so the cap can never silently become `NaN`/`Infinity`/negative. A `0`ms cap is
88
+ * rejected as meaningless (it would expire an attempt before it could run) —
89
+ * callers must omit `timeout` to disable the cap rather than passing `0` — and a
90
+ * value above {@link MAX_PER_ATTEMPT_TIMEOUT_MS} is rejected because it would
91
+ * overflow the underlying `setTimeout` and fire almost immediately.
92
+ */
93
+ export declare function parsePerAttemptTimeoutMs(timeout: unknown): number | undefined;
94
+ /**
95
+ * The first-dispatch anchor and parsed budget for a `ctx.run` call's
96
+ * `scheduleToCloseTimeout`, or `undefined` when no budget is configured.
97
+ */
98
+ export type ScheduleToCloseBudget = {
99
+ budgetMs: number;
100
+ dispatchedAt: number;
101
+ };
102
+ /**
103
+ * Parse a `scheduleToCloseTimeout` duration to milliseconds, or `undefined` when
104
+ * unset. `parseDuration` validates the result is finite and non-negative on every
105
+ * input path (numeric and string, via `assertValidDurationMilliseconds`) and
106
+ * throws otherwise — so the budget can never silently become `NaN`/`Infinity`
107
+ * (which would make `elapsed >= budgetMs` always-false) or negative. `0` is valid
108
+ * (it permits exactly one attempt).
109
+ */
110
+ export declare function parseScheduleToCloseBudgetMs(scheduleToCloseTimeout: Duration | undefined): number | undefined;
111
+ /**
112
+ * Resolve the cross-attempt wall-clock budget for a `ctx.run` call: a per-call
113
+ * `scheduleToCloseTimeout` overrides the activity definition's default. String
114
+ * activities have no definition fields, so only the per-call option applies. The
115
+ * by-reference arm is `Function & { scheduleToCloseTimeout?: Duration }` to match
116
+ * the caller's `ActivityInput` (a callable carrying the activity definition); this
117
+ * resolver reads only the single `scheduleToCloseTimeout` field off it.
118
+ */
119
+ export declare function resolveActivityScheduleToCloseTimeout(activity: string | (Function & {
120
+ scheduleToCloseTimeout?: Duration;
121
+ }), options: ActivityCallOptions | undefined): Duration | undefined;
122
+ /**
123
+ * Resolve the per-attempt `timeout` for a `ctx.run` call: a per-call `timeout`
124
+ * overrides the activity definition's default. String activities have no
125
+ * definition fields, so only the per-call option applies. Mirrors
126
+ * {@link resolveActivityScheduleToCloseTimeout} so the per-attempt cap honors a
127
+ * `timeout` declared on the activity definition, not just at the call site.
128
+ */
129
+ export declare function resolveActivityTimeout(activity: string | (Function & {
130
+ timeout?: Duration;
131
+ }), options: ActivityCallOptions | undefined): Duration | undefined;
132
+ /**
133
+ * Whether the schedule-to-close budget is exhausted at the given clock value.
134
+ * The comparison is `>=` so an exact-deadline or zero-budget retry is treated as
135
+ * exhausted — a `0`ms budget allows exactly one attempt, then throws.
136
+ */
137
+ export declare function isScheduleToCloseBudgetExhausted(budget: ScheduleToCloseBudget, now: number): boolean;
138
+ /**
139
+ * Throw {@link ActivityScheduleToCloseTimeoutError} when the schedule-to-close
140
+ * budget bars the next attempt, otherwise return. Called two ways at the retry
141
+ * boundary, both routing through this single check; the thrown error always
142
+ * reports the ACTUAL elapsed time at `now`, never a projected one:
143
+ *
144
+ * - **Top of the retry loop** (`now = getNow()`, no `projectedNextDispatchClock`):
145
+ * the live clock has reached or passed the deadline — an attempt overran, or
146
+ * downtime during a backoff replay pushed wall time past it. Exhaustion is
147
+ * checked at `now`; the error reports `now - dispatchedAt` and no projection.
148
+ * - **Catch branch** (`now = getNow()`, `projectedNextDispatchClock = now +
149
+ * nextBackoff`, both from a single clock read): the budget may not have elapsed
150
+ * yet, but the next backoff would start the retry at or after the deadline, so we
151
+ * refuse to schedule that doomed sleep and fail at the retry decision point.
152
+ * Exhaustion is checked at the PROJECTED dispatch clock; the error still reports
153
+ * the actual `now - dispatchedAt` elapsed plus the projected next-dispatch
154
+ * (as elapsed-since-first-dispatch ms) as the deciding reason.
155
+ *
156
+ * `budget` is `undefined` when no `scheduleToCloseTimeout` is configured, in which
157
+ * case this is a no-op.
158
+ */
159
+ export declare function assertScheduleToCloseBudgetNotExhausted(budget: ScheduleToCloseBudget | undefined, activityName: string, now: number, projectedNextDispatchClock?: number): void;
@@ -0,0 +1,69 @@
1
+ import { parseDuration } from "../scheduler.js";
2
+ import { WeftError } from "../weft-error.js";
3
+
4
+ export class ActivityScheduleToCloseTimeoutError extends WeftError {
5
+ activityName;
6
+ elapsed;
7
+ budget;
8
+ projectedNextDispatchElapsed;
9
+ constructor(activityName, elapsed, budget, projectedNextDispatchElapsed) {
10
+ super("ActivityScheduleToCloseTimeoutError", projectedNextDispatchElapsed === void 0 ? `Activity "${activityName}" exceeded its scheduleToCloseTimeout budget of ${budget}ms (elapsed ${elapsed}ms across retries)` : `Activity "${activityName}" will not retry within its scheduleToCloseTimeout budget of ${budget}ms (elapsed ${elapsed}ms; next retry would start at ${projectedNextDispatchElapsed}ms after first dispatch, at or beyond the deadline)`);
11
+ this.activityName = activityName;
12
+ this.elapsed = elapsed;
13
+ this.budget = budget;
14
+ if (projectedNextDispatchElapsed !== void 0)
15
+ this.projectedNextDispatchElapsed = projectedNextDispatchElapsed;
16
+ }
17
+ }
18
+
19
+ export class ActivityPerAttemptTimeoutError extends WeftError {
20
+ activityName;
21
+ attempt;
22
+ timeoutMs;
23
+ constructor(activityName, attempt, timeoutMs) {
24
+ super("ActivityPerAttemptTimeoutError", `Activity "${activityName}" attempt ${attempt} exceeded its per-attempt timeout of ${timeoutMs}ms`);
25
+ this.activityName = activityName;
26
+ this.attempt = attempt;
27
+ this.timeoutMs = timeoutMs;
28
+ }
29
+ }
30
+ export const MAX_PER_ATTEMPT_TIMEOUT_MS = 2147483647;
31
+ export function parsePerAttemptTimeoutMs(timeout) {
32
+ if (timeout === void 0)
33
+ return;
34
+ if (typeof timeout !== "number" && typeof timeout !== "string")
35
+ throw Error(`Activity timeout must be a number or duration string when set (got ${typeof timeout}).`);
36
+ const ms = parseDuration(timeout);
37
+ if (ms <= 0)
38
+ throw Error(`Activity timeout must be greater than 0ms when set (got ${ms}ms); omit it to disable the per-attempt cap.`);
39
+ if (ms > MAX_PER_ATTEMPT_TIMEOUT_MS)
40
+ throw Error(`Activity timeout of ${ms}ms exceeds the maximum supported per-attempt cap of ${MAX_PER_ATTEMPT_TIMEOUT_MS}ms (~24.8 days).`);
41
+ return ms;
42
+ }
43
+ export function parseScheduleToCloseBudgetMs(scheduleToCloseTimeout) {
44
+ return scheduleToCloseTimeout === void 0 ? void 0 : parseDuration(scheduleToCloseTimeout);
45
+ }
46
+ export function resolveActivityScheduleToCloseTimeout(activity, options) {
47
+ if (options?.scheduleToCloseTimeout !== void 0)
48
+ return options.scheduleToCloseTimeout;
49
+ if (typeof activity === "string")
50
+ return;
51
+ return activity.scheduleToCloseTimeout;
52
+ }
53
+ export function resolveActivityTimeout(activity, options) {
54
+ if (options?.timeout !== void 0)
55
+ return options.timeout;
56
+ if (typeof activity === "string")
57
+ return;
58
+ return activity.timeout;
59
+ }
60
+ export function isScheduleToCloseBudgetExhausted(budget, now) {
61
+ return now - budget.dispatchedAt >= budget.budgetMs;
62
+ }
63
+ export function assertScheduleToCloseBudgetNotExhausted(budget, activityName, now, projectedNextDispatchClock) {
64
+ if (budget === void 0)
65
+ return;
66
+ if (!isScheduleToCloseBudgetExhausted(budget, projectedNextDispatchClock ?? now))
67
+ return;
68
+ throw new ActivityScheduleToCloseTimeoutError(activityName, now - budget.dispatchedAt, budget.budgetMs, projectedNextDispatchClock !== void 0 && now - budget.dispatchedAt < budget.budgetMs ? projectedNextDispatchClock - budget.dispatchedAt : void 0);
69
+ }
@@ -1,18 +1,18 @@
1
- import type { ChildWorkflowOptions, ChildWorkflowTarget, WorkflowMapOptions, WorkflowPipeStage, WorkflowReduceInput, WorkflowReduceOptions } from '../types.ts';
1
+ import type { AwaitChildWorkflowOptions, ChildWorkflowHandle, ChildWorkflowOptions, ChildWorkflowTarget, WorkflowMapOptions, WorkflowPipeStage, WorkflowReduceInput, WorkflowReduceOptions } from '../types.ts';
2
2
  import type { Context } from './index.ts';
3
3
  import type { ContextInternals } from './internals.ts';
4
4
  import type { ContextOperationRequest } from './operation-request.ts';
5
5
  export declare function normalizePipeStage(internals: ContextInternals, stage: WorkflowPipeStage | ChildWorkflowTarget): {
6
6
  workflowType: string;
7
- options: ChildWorkflowOptions | undefined;
7
+ options: AwaitChildWorkflowOptions | undefined;
8
8
  };
9
9
  export declare function resolveChildWorkflowTarget<TInput = unknown, TOutput = unknown>(internals: ContextInternals, target: ChildWorkflowTarget<TInput, TOutput>): string;
10
10
  export declare function resolveMapConcurrency(totalItems: number, requestedConcurrency: number | undefined): number;
11
11
  export declare function createCompositionToken(internals: ContextInternals, kind: 'map' | 'pipe' | 'reduce'): string;
12
- export declare function createCompositionChildWorkflowOptions(internals: ContextInternals, token: string, index: number, options?: ChildWorkflowOptions | undefined): ChildWorkflowOptions;
13
- export declare function createReduceChildWorkflowOptions(internals: ContextInternals, token: string, index: number, options: WorkflowReduceOptions | undefined): ChildWorkflowOptions;
12
+ export declare function createCompositionChildWorkflowOptions(internals: ContextInternals, token: string, index: number, options?: AwaitChildWorkflowOptions | undefined): AwaitChildWorkflowOptions;
13
+ export declare function createReduceChildWorkflowOptions(internals: ContextInternals, token: string, index: number, options: WorkflowReduceOptions | undefined): AwaitChildWorkflowOptions;
14
14
  export declare function primeParallelOperations(operations: Generator<ContextOperationRequest, unknown, unknown>[]): ContextOperationRequest[];
15
- export declare function startChild<TResult = unknown>(context: Context, internals: ContextInternals, workflowType: string, input: unknown, options?: ChildWorkflowOptions): Generator<ContextOperationRequest, TResult, unknown>;
15
+ export declare function startChild<TResult = unknown>(context: Context, internals: ContextInternals, workflowType: string, input: unknown, options?: ChildWorkflowOptions): Generator<ContextOperationRequest, TResult | ChildWorkflowHandle<TResult>, unknown>;
16
16
  export declare function pipe<TResult = unknown>(context: Context, internals: ContextInternals, stages: Array<WorkflowPipeStage | ChildWorkflowTarget>, input: unknown): Generator<ContextOperationRequest, TResult, unknown>;
17
17
  export declare function map<TItem, TResult>(context: Context, internals: ContextInternals, items: readonly TItem[], workflowType: ChildWorkflowTarget<TItem, TResult>, options?: WorkflowMapOptions): Generator<ContextOperationRequest, TResult[], unknown>;
18
18
  export declare function reduce<TItem, TAccumulator>(context: Context, internals: ContextInternals, items: readonly TItem[], workflowType: ChildWorkflowTarget<WorkflowReduceInput<TAccumulator, TItem>, TAccumulator>, initialValue: TAccumulator, options?: WorkflowReduceOptions): Generator<ContextOperationRequest, TAccumulator, unknown>;
@@ -28,6 +28,7 @@ export function createCompositionToken(internals, kind) {
28
28
  return `${kind}:${internals.stepIndex}`;
29
29
  }
30
30
  export function createCompositionChildWorkflowOptions(internals, token, index, options = void 0) {
31
+ assertCompositionAwaitsChildWorkflow(options);
31
32
  if (options?.id !== void 0)
32
33
  return options;
33
34
  return {
@@ -39,11 +40,20 @@ export function createReduceChildWorkflowOptions(internals, token, index, option
39
40
  if (options === void 0)
40
41
  return createCompositionChildWorkflowOptions(internals, token, index);
41
42
  const { idPrefix, ...childWorkflowOptions } = options;
43
+ assertCompositionAwaitsChildWorkflow(childWorkflowOptions);
42
44
  return createCompositionChildWorkflowOptions(internals, token, index, idPrefix !== void 0 ? {
43
45
  ...childWorkflowOptions,
44
46
  id: `${idPrefix}:${index}`
45
47
  } : childWorkflowOptions);
46
48
  }
49
+ function assertCompositionAwaitsChildWorkflow(options) {
50
+ if (typeof options !== "object" || options === null || !("parentClosePolicy" in options))
51
+ return;
52
+ const parentClosePolicy = options.parentClosePolicy;
53
+ if (parentClosePolicy === void 0 || parentClosePolicy === "await")
54
+ return;
55
+ throw Error('ctx.pipe, ctx.map, and ctx.reduce always await child workflow results. Use ctx.startChild() directly for parentClosePolicy: "abandon" or "request-cancel".');
56
+ }
47
57
  export function primeParallelOperations(operations) {
48
58
  const subOperations = [];
49
59
  for (const generator of operations) {
@@ -58,7 +68,7 @@ export function* startChild(context, internals, workflowType, input, options) {
58
68
  if (internals.accumulatedResults?.has(step)) {
59
69
  if (internals.explainMode)
60
70
  console.log(`[weft] ctx.startChild("${workflowType}") \u2192 Returning cached result from step ${step}`);
61
- return internals.accumulatedResults.get(step);
71
+ return resolveCachedStartChildResult(internals.accumulatedResults.get(step), options);
62
72
  }
63
73
  if (internals.explainMode) {
64
74
  console.log(`[weft] ctx.startChild("${workflowType}", ${JSON.stringify(input)})`);
@@ -74,7 +84,10 @@ export function* startChild(context, internals, workflowType, input, options) {
74
84
  ...options !== void 0 ? { options } : {}
75
85
  };
76
86
  context.accumulatedResults.set(step, result);
77
- return result;
87
+ return resolveCachedStartChildResult(result, options);
88
+ }
89
+ function resolveCachedStartChildResult(result, options) {
90
+ return (options?.parentClosePolicy ?? "await") === "await" ? result : result;
78
91
  }
79
92
  export function* pipe(context, internals, stages, input) {
80
93
  const pipelineToken = createCompositionToken(internals, "pipe");
@@ -0,0 +1,19 @@
1
+ import type { Context } from './index.ts';
2
+ /**
3
+ * Presence checks over a {@link Context}'s lazily-allocated internal maps. Each
4
+ * returns `true` only when the backing structure exists *and* is non-empty, so
5
+ * the checkpoint-commit and inline-parking paths can decide whether a context
6
+ * carries pending attribute changes, registered update handlers, or exposed
7
+ * accessors without forcing allocation through the public getters.
8
+ *
9
+ * Extracted from the `Context` class (which sits at the module line ceiling) as
10
+ * free functions; behavior is identical to the former `ctx.has*` getters.
11
+ *
12
+ * @module core/context/context-presence
13
+ */
14
+ /** True when the context has at least one pending search-attribute change. */
15
+ export declare function hasPendingAttributeChanges(context: Context): boolean;
16
+ /** True when the context has at least one registered update handler. */
17
+ export declare function hasUpdateHandlers(context: Context): boolean;
18
+ /** True when the context has at least one exposed accessor. */
19
+ export declare function hasExposedAccessors(context: Context): boolean;
@@ -0,0 +1,13 @@
1
+ import { getInternals } from "./internals.js";
2
+ export function hasPendingAttributeChanges(context) {
3
+ const pendingAttributeChanges = getInternals(context).pendingAttributeChanges;
4
+ return pendingAttributeChanges !== void 0 && Object.keys(pendingAttributeChanges).length > 0;
5
+ }
6
+ export function hasUpdateHandlers(context) {
7
+ const updateHandlers = getInternals(context).updateHandlers;
8
+ return updateHandlers !== void 0 && updateHandlers.size > 0;
9
+ }
10
+ export function hasExposedAccessors(context) {
11
+ const exposedValues = getInternals(context).exposedValues;
12
+ return exposedValues !== void 0 && exposedValues.size > 0;
13
+ }
@@ -18,6 +18,31 @@ export declare function completePreparedSleepOperation(context: Context, prepare
18
18
  }>): Generator<ContextOperationRequest, void, unknown>;
19
19
  export declare function sleep(context: Context, internals: ContextInternals, duration: Duration): Generator<ContextOperationRequest, void, unknown>;
20
20
  export declare function waitForSignal<T = unknown>(context: Context, internals: ContextInternals, name: string): Generator<ContextOperationRequest, T, unknown>;
21
+ /**
22
+ * Read the absolute deadline anchor for a `ctx.waitUntil` step, writing it on the
23
+ * first evaluation. Read-first so a crash/replay never resets the window: the
24
+ * timeout is measured from the original first yield, and the anchor lands in the
25
+ * checkpoint committed at that yield — the same atomicity the activity
26
+ * schedule-to-close anchor (`readOrInitActivityDispatchedAt`) relies on.
27
+ *
28
+ * Returns `undefined` when no timeout was supplied (wait forever).
29
+ */
30
+ export declare function readOrInitConditionDeadline(internals: ContextInternals, step: number, timeout: Duration | undefined): number | undefined;
31
+ /**
32
+ * Wait until `predicate` returns `true`, re-evaluated by the engine each time the
33
+ * workflow is driven forward (an `onUpdate` handler mutating state, or the
34
+ * optional timeout). The predicate is a non-serializable closure held in-process,
35
+ * never checkpointed. Once the wait outcome has been checkpointed, replay returns
36
+ * the cached outcome and does not re-invoke the predicate. A predicate that
37
+ * throws fails the workflow at the `yield*` call site (like a throwing activity).
38
+ * Inline execution only.
39
+ *
40
+ * With no `timeout` the generator yields `void` (waits forever). With a `timeout`
41
+ * it yields `true` when the predicate was met or `false` when the deadline
42
+ * elapsed first.
43
+ */
44
+ export declare function waitUntil(context: Context, internals: ContextInternals, predicate: () => boolean, timeout?: Duration): Generator<ContextOperationRequest, boolean | void, unknown>;
45
+ export declare function getVersion(_context: Context, internals: ContextInternals, changeId: string, minSupported: number, maxSupported: number): Generator<ContextOperationRequest, number, unknown>;
21
46
  export declare function waitForUpdate<T = unknown>(context: Context, internals: ContextInternals, name: string): Generator<ContextOperationRequest, {
22
47
  payload: T;
23
48
  respond: (result: unknown) => void;
@@ -1,5 +1,6 @@
1
1
  import { parseDuration } from "../scheduler.js";
2
2
  import { captureCallerStack } from "./validation.js";
3
+ import { resolveWorkflowVersionPatch } from "./version-patching.js";
3
4
  export function prepareSleepOperation(internals, duration) {
4
5
  const step = internals.stepIndex++;
5
6
  if (internals.accumulatedResults?.has(step))
@@ -53,6 +54,69 @@ export function* waitForSignal(context, internals, name) {
53
54
  context.accumulatedResults.set(step, result);
54
55
  return result;
55
56
  }
57
+ const CONDITION_DEADLINE_LOCAL_PREFIX = "__weftConditionDeadline:";
58
+ export function readOrInitConditionDeadline(internals, step, timeout) {
59
+ if (timeout === void 0)
60
+ return;
61
+ const localKey = `${CONDITION_DEADLINE_LOCAL_PREFIX}${step}`, existing = internals.checkpointLocals[localKey];
62
+ if (typeof existing === "number" && Number.isFinite(existing))
63
+ return existing;
64
+ if (existing !== void 0)
65
+ throw Error(`Invalid checkpointed wait-condition deadline ${JSON.stringify(existing)} for step ${step}`);
66
+ const milliseconds = parseDuration(timeout), referenceTime = internals.sleepReferenceTime ?? internals.getNow();
67
+ internals.sleepReferenceTime = void 0;
68
+ const deadline = referenceTime + milliseconds;
69
+ internals.checkpointLocals = { ...internals.checkpointLocals, [localKey]: deadline };
70
+ return deadline;
71
+ }
72
+ export function* waitUntil(context, internals, predicate, timeout) {
73
+ const step = internals.stepIndex++;
74
+ if (internals.accumulatedResults?.has(step))
75
+ return internals.accumulatedResults.get(step);
76
+ const deadline = readOrInitConditionDeadline(internals, step, timeout);
77
+ if (internals.explainMode) {
78
+ console.log("[weft] ctx.waitUntil(predicate)");
79
+ console.log(` \u2192 Creating checkpoint at step ${step}`);
80
+ console.log(deadline === void 0 ? " \u2192 Waiting indefinitely" : ` \u2192 Deadline at ${deadline}`);
81
+ }
82
+ const operationId = crypto.randomUUID(), callerStack = captureCallerStack(), result = yield {
83
+ type: "wait-condition",
84
+ operationId,
85
+ step,
86
+ predicate,
87
+ ...deadline !== void 0 && { deadline },
88
+ callerStack
89
+ };
90
+ context.accumulatedResults.set(step, result);
91
+ return result;
92
+ }
93
+ export function* getVersion(_context, internals, changeId, minSupported, maxSupported) {
94
+ const step = internals.stepIndex++, resolution = resolveWorkflowVersionPatch(internals.checkpointLocals, changeId, minSupported, maxSupported);
95
+ internals.checkpointLocals = resolution.checkpointLocals;
96
+ if (!resolution.newlyPinned)
97
+ return resolution.version;
98
+ if (internals.accumulatedResults?.has(step)) {
99
+ const cachedVersion = internals.accumulatedResults.get(step);
100
+ if (cachedVersion !== resolution.version)
101
+ throw Error(`ctx.getVersion("${changeId}") replay result ${String(cachedVersion)} does not match pinned version ${String(resolution.version)}`);
102
+ return resolution.version;
103
+ }
104
+ if (internals.explainMode) {
105
+ console.log(`[weft] ctx.getVersion("${changeId}", ${minSupported}, ${maxSupported})`);
106
+ console.log(` \u2192 Creating checkpoint at step ${step}`);
107
+ console.log(` \u2192 Pinning workflow patch "${changeId}" to version ${resolution.version}`);
108
+ }
109
+ const operationId = crypto.randomUUID(), callerStack = captureCallerStack();
110
+ return yield {
111
+ type: "get-version",
112
+ operationId,
113
+ changeId,
114
+ minSupported,
115
+ maxSupported,
116
+ version: resolution.version,
117
+ callerStack
118
+ };
119
+ }
56
120
  export function* waitForUpdate(context, internals, name) {
57
121
  const step = internals.stepIndex++;
58
122
  if (internals.accumulatedResults?.has(step))
@@ -1,6 +1,6 @@
1
1
  import type { ComposedWorkflowInterceptor } from '../interceptor.ts';
2
2
  import type { HumanReviewOptions, HumanReviewResult } from '../review/index.ts';
3
- import type { ActivityCallable, ActivityCallOptions, ChildWorkflowOptions, ChildWorkflowTarget, Duration, QueryDefinition, RunAllResult, SearchAttributeHandle, SearchAttributeValue, SignalDefinition, UpdateDefinition, WorkflowContext, WorkflowMapOptions, WorkflowOperation, WorkflowOperationTupleResult, WorkflowPipeStageDefinition, WorkflowReduceInput, WorkflowReduceOptions, WorkflowRunAllBranch, WorkflowStateNamespace } from '../types.ts';
3
+ import type { ActivityCallable, ActivityCallOptions, AwaitChildWorkflowOptions, ChildWorkflowHandle, ChildWorkflowTarget, DetachedChildWorkflowOptions, Duration, QueryDefinition, RunAllResult, SearchAttributeHandle, SearchAttributeValue, SignalDefinition, UpdateDefinition, WorkflowContext, WorkflowLogger, WorkflowMapOptions, WorkflowOperation, WorkflowOperationTupleResult, WorkflowPipeStageDefinition, WorkflowReduceInput, WorkflowReduceOptions, WorkflowRunAllBranch, WorkflowStateNamespace } from '../types.ts';
4
4
  import type { ContextOperationRequest } from './operation-request.ts';
5
5
  import type { ContextOptions, ErasedSagaStep, OffloadReference, StreamReference, StreamSink } from './types.ts';
6
6
  import * as contextUpdates from './updates.ts';
@@ -21,6 +21,7 @@ export declare function setContextWorkflowInterceptor(context: Context, workflow
21
21
  * ```
22
22
  */
23
23
  export declare class Context implements WorkflowContext {
24
+ #private;
24
25
  readonly workflowId: string;
25
26
  readonly workflowType: string;
26
27
  readonly startedAt: number;
@@ -28,6 +29,7 @@ export declare class Context implements WorkflowContext {
28
29
  constructor(options: ContextOptions);
29
30
  get executionTimeRemaining(): number;
30
31
  get services(): unknown;
32
+ get log(): WorkflowLogger;
31
33
  get stepIndex(): number;
32
34
  get nestingDepth(): number;
33
35
  get accumulatedResults(): Map<number, unknown>;
@@ -40,9 +42,6 @@ export declare class Context implements WorkflowContext {
40
42
  get explainEnabled(): boolean;
41
43
  get checkpointAccumulatedResults(): Array<[number, unknown]>;
42
44
  get checkpointPendingAttributeChanges(): Record<string, SearchAttributeValue> | undefined;
43
- get hasPendingAttributeChanges(): boolean;
44
- get hasUpdateHandlers(): boolean;
45
- get hasExposedAccessors(): boolean;
46
45
  createSpeculativeChild(): Context;
47
46
  commitSpeculativeChild(child: Context): void;
48
47
  get state(): WorkflowStateNamespace;
@@ -55,6 +54,15 @@ export declare class Context implements WorkflowContext {
55
54
  run<TInput, TResult>(fn: ((input: TInput) => Promise<TResult> | TResult) & {
56
55
  execute?: never;
57
56
  }, input: TInput, options?: ActivityCallOptions): Generator<ContextOperationRequest, TResult, unknown>;
57
+ /**
58
+ * Durably sleep for `duration` before continuing. Unlike a wall-clock
59
+ * `setTimeout`, this is a checkpointed operation: the engine persists the timer
60
+ * and resumes the workflow when it fires, so a sleep survives process restarts
61
+ * and spans of days. On replay an already-elapsed sleep is a no-op — a
62
+ * recovered workflow does not wait again. `duration` is milliseconds
63
+ * (`number`) or a duration string (`'30s'`, `'1h'`, `'2d'` — see
64
+ * {@link Duration}); drive it with `yield*` from a workflow body.
65
+ */
58
66
  sleep(duration: Duration): Generator<ContextOperationRequest, void, unknown>;
59
67
  suspendUntil<T = unknown>(resumeToken: string): Generator<ContextOperationRequest, T, unknown>;
60
68
  waitForSignal<TInput>(definition: SignalDefinition<TInput>): Generator<ContextOperationRequest, TInput, unknown>;
@@ -67,6 +75,9 @@ export declare class Context implements WorkflowContext {
67
75
  payload: T;
68
76
  respond: (result: unknown) => void;
69
77
  }, unknown>;
78
+ waitUntil(predicate: () => boolean): Generator<ContextOperationRequest, void, unknown>;
79
+ waitUntil(p: () => boolean, t: Duration): Generator<ContextOperationRequest, boolean, unknown>;
80
+ getVersion(changeId: string, minSupported: number, maxSupported: number): Generator<ContextOperationRequest, number, unknown>;
70
81
  review(options: HumanReviewOptions): Generator<ContextOperationRequest, HumanReviewResult, unknown>;
71
82
  all<const TOperations extends readonly WorkflowOperation<unknown>[]>(operations: TOperations): Generator<ContextOperationRequest, WorkflowOperationTupleResult<TOperations>, unknown>;
72
83
  race<const TOperations extends readonly WorkflowOperation<unknown>[]>(operations: TOperations): Generator<ContextOperationRequest, WorkflowOperationTupleResult<TOperations>[number], unknown>;
@@ -77,7 +88,8 @@ export declare class Context implements WorkflowContext {
77
88
  archive(key: string, data: unknown): Generator<ContextOperationRequest, void, unknown>;
78
89
  runAll<const TBranches extends Record<string, WorkflowRunAllBranch>>(branches: TBranches): Generator<ContextOperationRequest, RunAllResult<TBranches>, unknown>;
79
90
  saga<TFinalOutput = unknown>(steps: ErasedSagaStep[]): Generator<ContextOperationRequest, TFinalOutput, unknown>;
80
- startChild<TResult = unknown>(workflowType: string, input: unknown, options?: ChildWorkflowOptions): Generator<ContextOperationRequest, TResult, unknown>;
91
+ startChild<TResult = unknown>(workflowType: string, input: unknown, options: DetachedChildWorkflowOptions): Generator<ContextOperationRequest, ChildWorkflowHandle<TResult>, unknown>;
92
+ startChild<TResult = unknown>(workflowType: string, input: unknown, options?: AwaitChildWorkflowOptions): Generator<ContextOperationRequest, TResult, unknown>;
81
93
  pipe<TInput, TOutput>(stages: [WorkflowPipeStageDefinition<TInput, TOutput>], input: TInput): Generator<ContextOperationRequest, TOutput, unknown>;
82
94
  pipe<TInput, TIntermediate, TOutput>(stages: [
83
95
  WorkflowPipeStageDefinition<TInput, TIntermediate>,
@@ -111,5 +123,6 @@ export declare class Context implements WorkflowContext {
111
123
  onQuery(name: string, handler: (input: unknown) => unknown): void;
112
124
  expose(accessors: Record<string, () => unknown>): void;
113
125
  onCancel(handler: () => Promise<void> | void): void;
126
+ setFinalizerState(value: unknown): void;
114
127
  streamUrl(reference: StreamReference): string;
115
128
  }
@@ -14,6 +14,7 @@ import {
14
14
  } from "./speculative-child.js";
15
15
  import * as stateNamespaceHelpers from "./state-namespace.js";
16
16
  import * as contextUpdates from "./updates.js";
17
+ import { createInlineWorkflowLogger } from "./workflow-logger.js";
17
18
  export function setContextWorkflowInterceptor(context, workflowInterceptor) {
18
19
  getInternals(context).workflowInterceptor = workflowInterceptor;
19
20
  }
@@ -23,6 +24,7 @@ export class Context {
23
24
  workflowType;
24
25
  startedAt;
25
26
  signal;
27
+ #log;
26
28
  constructor(options) {
27
29
  this.workflowId = options.workflowId;
28
30
  this.workflowType = options.workflowType;
@@ -40,6 +42,9 @@ export class Context {
40
42
  get services() {
41
43
  return getInternals(this).services;
42
44
  }
45
+ get log() {
46
+ return this.#log ??= createInlineWorkflowLogger(this.workflowId, this.workflowType, () => getInternals(this), getInternals(this).logSink);
47
+ }
43
48
  get stepIndex() {
44
49
  return getInternals(this).stepIndex;
45
50
  }
@@ -90,18 +95,6 @@ export class Context {
90
95
  const pendingAttributeChanges = getInternals(this).pendingAttributeChanges;
91
96
  return pendingAttributeChanges ? { ...pendingAttributeChanges } : void 0;
92
97
  }
93
- get hasPendingAttributeChanges() {
94
- const pendingAttributeChanges = getInternals(this).pendingAttributeChanges;
95
- return pendingAttributeChanges !== void 0 && Object.keys(pendingAttributeChanges).length > 0;
96
- }
97
- get hasUpdateHandlers() {
98
- const updateHandlers = getInternals(this).updateHandlers;
99
- return updateHandlers !== void 0 && updateHandlers.size > 0;
100
- }
101
- get hasExposedAccessors() {
102
- const exposedValues = getInternals(this).exposedValues;
103
- return exposedValues !== void 0 && exposedValues.size > 0;
104
- }
105
98
  createSpeculativeChild() {
106
99
  return createSpeculativeChildState(this, (options) => new Context(options));
107
100
  }
@@ -146,6 +139,12 @@ export class Context {
146
139
  *waitForUpdate(nameOrDefinition) {
147
140
  return yield* durableOperations.waitForUpdate(this, getInternals(this), messageName(nameOrDefinition));
148
141
  }
142
+ *waitUntil(predicate, timeout) {
143
+ return yield* durableOperations.waitUntil(this, getInternals(this), predicate, timeout);
144
+ }
145
+ *getVersion(changeId, minSupported, maxSupported) {
146
+ return yield* durableOperations.getVersion(this, getInternals(this), changeId, minSupported, maxSupported);
147
+ }
149
148
  *review(options) {
150
149
  return yield* durableOperations.review(this, getInternals(this), options);
151
150
  }
@@ -221,6 +220,12 @@ export class Context {
221
220
  throw Error("ctx.onCancel() is only supported for inline workflow execution");
222
221
  internals.registerCancelHandler(handler);
223
222
  }
223
+ setFinalizerState(value) {
224
+ const internals = getInternals(this);
225
+ if (internals.recordFinalizerState === void 0)
226
+ throw Error("ctx.setFinalizerState() is only supported for inline workflow execution; it is unavailable in worker execution mode and inside ctx.speculate() branches.");
227
+ internals.recordFinalizerState(value);
228
+ }
224
229
  streamUrl(reference) {
225
230
  return `/v1/workflows/${encodeURIComponent(reference.workflowId)}/streams/${encodeURIComponent(reference.key)}`;
226
231
  }
@@ -1,5 +1,6 @@
1
1
  import type { ComposedWorkflowInterceptor } from '../interceptor.ts';
2
2
  import type { SearchAttributeSchema, SearchAttributeValue } from '../types.ts';
3
+ import type { WorkflowLogRecord } from '../types/workflow-log.ts';
3
4
  import type { Context, ContextOptions } from './index.ts';
4
5
  export interface ContextInternals {
5
6
  context: Context;
@@ -26,6 +27,34 @@ export interface ContextInternals {
26
27
  resolveWorkflowType: ((target: string | Function) => string) | undefined;
27
28
  registerCancelHandler: ((handler: () => Promise<void> | void) => () => void) | undefined;
28
29
  services: unknown;
30
+ /**
31
+ * Host sink for `ctx.log` records (`EngineOptions.onLog`), or `undefined` for the
32
+ * default console behavior. Captured by value when the `ctx.log` getter first
33
+ * builds its logger; `onLog` is fixed at engine construction, so there is nothing
34
+ * to re-read per emit.
35
+ */
36
+ logSink: ((record: WorkflowLogRecord) => void) | undefined;
37
+ /**
38
+ * Engine callback that durably records `ctx.setFinalizerState(value)` payloads
39
+ * (#446); `undefined` in speculative branches, where the branch reuses this
40
+ * inline {@link Context} but the engine leaves the callback unset, so
41
+ * `ctx.setFinalizerState` throws a descriptive guard error. (Worker-mode
42
+ * generators never reach this field at all — they receive a reduced worker-side
43
+ * context that does not carry `setFinalizerState`, so the call fails there with a
44
+ * `TypeError`.) Finalizer *registration* and teardown are unaffected — those run
45
+ * on the engine host in every mode (#564). Injected at context construction,
46
+ * mirroring {@link registerCancelHandler}.
47
+ */
48
+ recordFinalizerState: ((value: unknown) => void) | undefined;
29
49
  }
30
50
  export declare function initializeInternals(context: Context, options: ContextOptions, initialSessionState: Record<string, unknown> | undefined): void;
31
51
  export declare function getInternals(context: Context): ContextInternals;
52
+ /**
53
+ * Non-throwing probe: is `value` a concrete {@link Context} with initialized
54
+ * internals? Used to distinguish the inline-mode `Context` (which carries the
55
+ * `stepIndex`/`accumulatedResults` replay machinery) from the minimal
56
+ * worker-mode `WorkerWorkflowContext`, which is a different shape. WeakMap
57
+ * `.has` accepts any object key and returns `false` for non-`Context` objects,
58
+ * so this is safe to call on any context-shaped value.
59
+ */
60
+ export declare function hasContextInternals(value: object): value is Context;