@lostgradient/weft 0.23.1 → 0.24.1

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 (469) hide show
  1. package/README.md +72 -4
  2. package/dist/cli/codegen-emit-dedup.d.ts +81 -0
  3. package/dist/cli/codegen-emit-dedup.js +45 -0
  4. package/dist/cli/codegen-emit-registry.d.ts +90 -0
  5. package/dist/cli/codegen-emit-registry.js +50 -0
  6. package/dist/cli/codegen-emit.d.ts +26 -39
  7. package/dist/cli/codegen-emit.js +4 -27
  8. package/dist/cli/codegen-validate.d.ts +49 -0
  9. package/dist/cli/codegen-validate.js +186 -0
  10. package/dist/cli/codegen.js +6 -87
  11. package/dist/cli/conformance.js +5 -2
  12. package/dist/cli/generated/operation-catalog.snapshot.json +381 -3
  13. package/dist/cli/generated/operation-client.generated.d.ts +350 -10
  14. package/dist/cli/generated/operation-client.generated.js +14 -0
  15. package/dist/cli/output.js +1 -1
  16. package/dist/cli/parse-schedule-arguments.js +15 -3
  17. package/dist/cli/schedule.js +2 -1
  18. package/dist/cli/storage-factory.js +2 -0
  19. package/dist/cli/types.d.ts +2 -1
  20. package/dist/cli/workflow-commands.js +2 -0
  21. package/dist/cli-main.js +1 -1
  22. package/dist/client/http-client-requests.js +6 -9
  23. package/dist/client/start-body.js +1 -0
  24. package/dist/core/application-payload-digest.d.ts +42 -0
  25. package/dist/core/application-payload-digest.js +76 -0
  26. package/dist/core/application-primitive-abort.d.ts +50 -0
  27. package/dist/core/application-primitive-abort.js +40 -0
  28. package/dist/core/application-primitive-attempt-registry.d.ts +74 -0
  29. package/dist/core/application-primitive-attempt-registry.js +73 -0
  30. package/dist/core/application-primitive-codec.d.ts +36 -0
  31. package/dist/core/application-primitive-codec.js +56 -0
  32. package/dist/core/application-primitive-commit.d.ts +67 -0
  33. package/dist/core/application-primitive-commit.js +66 -0
  34. package/dist/core/application-primitive-guards.d.ts +62 -0
  35. package/dist/core/application-primitive-guards.js +89 -0
  36. package/dist/core/application-primitive-payload.d.ts +29 -0
  37. package/dist/core/application-primitive-payload.js +65 -0
  38. package/dist/core/application-primitive-timing.d.ts +18 -0
  39. package/dist/core/application-primitive-timing.js +22 -0
  40. package/dist/core/atomic-state.js +2 -0
  41. package/dist/core/catalog/codec.d.ts +40 -0
  42. package/dist/core/catalog/codec.js +45 -0
  43. package/dist/core/catalog/errors.d.ts +104 -0
  44. package/dist/core/catalog/errors.js +41 -0
  45. package/dist/core/catalog/index.d.ts +25 -0
  46. package/dist/core/catalog/index.js +22 -0
  47. package/dist/core/catalog/reference-counts.d.ts +120 -0
  48. package/dist/core/catalog/reference-counts.js +28 -0
  49. package/dist/core/catalog/removal.d.ts +105 -0
  50. package/dist/core/catalog/removal.js +30 -0
  51. package/dist/core/catalog/storage-io.d.ts +101 -0
  52. package/dist/core/catalog/storage-io.js +106 -0
  53. package/dist/core/catalog/types.d.ts +108 -0
  54. package/dist/core/catalog/types.js +0 -0
  55. package/dist/core/catalog/workflow-catalog.d.ts +165 -0
  56. package/dist/core/catalog/workflow-catalog.js +198 -0
  57. package/dist/core/compare-codepoint.d.ts +13 -0
  58. package/dist/core/compare-codepoint.js +7 -0
  59. package/dist/core/compression.js +2 -0
  60. package/dist/core/context/attributes.d.ts +1 -1
  61. package/dist/core/context/durable-operations.d.ts +2 -2
  62. package/dist/core/context/index.js +5 -3
  63. package/dist/core/context/state-namespace.d.ts +1 -1
  64. package/dist/core/contract/build.d.ts +64 -0
  65. package/dist/core/contract/build.js +99 -0
  66. package/dist/core/contract/compatibility.d.ts +187 -0
  67. package/dist/core/contract/compatibility.js +37 -0
  68. package/dist/core/contract/failure.d.ts +64 -0
  69. package/dist/core/contract/failure.js +4 -0
  70. package/dist/core/contract/hash.d.ts +92 -0
  71. package/dist/core/contract/hash.js +34 -0
  72. package/dist/core/contract/index.d.ts +21 -0
  73. package/dist/core/contract/index.js +22 -0
  74. package/dist/core/contract/limits.d.ts +74 -0
  75. package/dist/core/contract/limits.js +1 -0
  76. package/dist/core/contract/manifest-parse-schema.d.ts +37 -0
  77. package/dist/core/contract/manifest-parse-schema.js +106 -0
  78. package/dist/core/contract/manifest-parse.d.ts +76 -0
  79. package/dist/core/contract/manifest-parse.js +189 -0
  80. package/dist/core/contract/manifest.d.ts +56 -0
  81. package/dist/core/contract/manifest.js +31 -0
  82. package/dist/core/contract/normalize.d.ts +97 -0
  83. package/dist/core/contract/normalize.js +127 -0
  84. package/dist/core/contract/revision.d.ts +29 -0
  85. package/dist/core/contract/revision.js +5 -0
  86. package/dist/core/contract/types.d.ts +274 -0
  87. package/dist/core/contract/types.js +1 -0
  88. package/dist/core/engine/activity-resolution.js +17 -17
  89. package/dist/core/engine/bulk-operations-purge.js +14 -20
  90. package/dist/core/engine/bulk-operations-retry.d.ts +9 -0
  91. package/dist/core/engine/bulk-operations-retry.js +177 -0
  92. package/dist/core/engine/bulk-operations-shared.d.ts +18 -0
  93. package/dist/core/engine/bulk-operations-shared.js +14 -0
  94. package/dist/core/engine/bulk-operations.js +8 -167
  95. package/dist/core/engine/callback-creators-bundles.js +4 -2
  96. package/dist/core/engine/callback-creators-core.js +9 -1
  97. package/dist/core/engine/callback-creators-schedule.js +2 -2
  98. package/dist/core/engine/catalog-activation.d.ts +40 -0
  99. package/dist/core/engine/catalog-activation.js +17 -0
  100. package/dist/core/engine/catalog-events.d.ts +36 -0
  101. package/dist/core/engine/catalog-events.js +15 -0
  102. package/dist/core/engine/catalog-readiness.d.ts +49 -0
  103. package/dist/core/engine/catalog-readiness.js +61 -0
  104. package/dist/core/engine/catalog-removal.d.ts +236 -0
  105. package/dist/core/engine/catalog-removal.js +123 -0
  106. package/dist/core/engine/catalog-tombstone-recovery.d.ts +56 -0
  107. package/dist/core/engine/catalog-tombstone-recovery.js +39 -0
  108. package/dist/core/engine/constraints.js +5 -1
  109. package/dist/core/engine/construction.d.ts +2 -2
  110. package/dist/core/engine/construction.js +4 -2
  111. package/dist/core/engine/decode-revision.d.ts +32 -0
  112. package/dist/core/engine/decode-revision.js +9 -0
  113. package/dist/core/engine/disposal.d.ts +6 -2
  114. package/dist/core/engine/disposal.js +26 -3
  115. package/dist/core/engine/dynamic-source-errors.d.ts +81 -0
  116. package/dist/core/engine/dynamic-source-errors.js +25 -0
  117. package/dist/core/engine/dynamic-source-execution.d.ts +173 -0
  118. package/dist/core/engine/dynamic-source-execution.js +108 -0
  119. package/dist/core/engine/engine-internal-types.d.ts +16 -0
  120. package/dist/core/engine/engine-workflows-namespace.d.ts +140 -0
  121. package/dist/core/engine/engine-workflows-namespace.js +51 -0
  122. package/dist/core/engine/finalizer-metadata.d.ts +22 -0
  123. package/dist/core/engine/finalizer-metadata.js +12 -0
  124. package/dist/core/engine/handle-result.js +2 -0
  125. package/dist/core/engine/index.d.ts +91 -0
  126. package/dist/core/engine/index.js +78 -6
  127. package/dist/core/engine/inline-launch-queue.js +1 -1
  128. package/dist/core/engine/internals.d.ts +54 -15
  129. package/dist/core/engine/internals.js +6 -0
  130. package/dist/core/engine/lifecycle/checkpoint-launch.d.ts +29 -0
  131. package/dist/core/engine/lifecycle/checkpoint-launch.js +75 -0
  132. package/dist/core/engine/lifecycle/delayed-start-registration.d.ts +30 -0
  133. package/dist/core/engine/lifecycle/delayed-start-registration.js +11 -0
  134. package/dist/core/engine/lifecycle/fork-helpers.d.ts +33 -1
  135. package/dist/core/engine/lifecycle/fork-helpers.js +3 -1
  136. package/dist/core/engine/lifecycle/recovery-revision-groups.d.ts +75 -0
  137. package/dist/core/engine/lifecycle/recovery-revision-groups.js +64 -0
  138. package/dist/core/engine/lifecycle/resume-generation-guard.d.ts +58 -0
  139. package/dist/core/engine/lifecycle/resume-generation-guard.js +11 -0
  140. package/dist/core/engine/lifecycle/resume.js +18 -9
  141. package/dist/core/engine/lifecycle/shared.d.ts +43 -0
  142. package/dist/core/engine/lifecycle/standalone-claim-acquire.d.ts +12 -0
  143. package/dist/core/engine/lifecycle/standalone-claim-acquire.js +6 -0
  144. package/dist/core/engine/lifecycle/start-commit-errors.d.ts +12 -0
  145. package/dist/core/engine/lifecycle/start-commit-errors.js +6 -0
  146. package/dist/core/engine/lifecycle/start-commit.d.ts +22 -7
  147. package/dist/core/engine/lifecycle/start-commit.js +49 -15
  148. package/dist/core/engine/lifecycle/start-exec.d.ts +18 -2
  149. package/dist/core/engine/lifecycle/start-exec.js +7 -5
  150. package/dist/core/engine/lifecycle/start-or-signal-create.js +1 -3
  151. package/dist/core/engine/lifecycle/start-or-signal.js +1 -1
  152. package/dist/core/engine/lifecycle/start-precondition-attribution.d.ts +49 -0
  153. package/dist/core/engine/lifecycle/start-precondition-attribution.js +13 -0
  154. package/dist/core/engine/lifecycle/start-revision-resolution.d.ts +34 -0
  155. package/dist/core/engine/lifecycle/start-revision-resolution.js +11 -0
  156. package/dist/core/engine/lifecycle/start-state.d.ts +16 -0
  157. package/dist/core/engine/lifecycle/start-state.js +60 -0
  158. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +66 -3
  159. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +13 -3
  160. package/dist/core/engine/lifecycle/start.d.ts +16 -6
  161. package/dist/core/engine/lifecycle/start.js +39 -66
  162. package/dist/core/engine/lifecycle/transition.d.ts +3 -4
  163. package/dist/core/engine/lifecycle/transition.js +30 -80
  164. package/dist/core/engine/lifecycle.d.ts +4 -2
  165. package/dist/core/engine/lifecycle.js +6 -6
  166. package/dist/core/engine/listing.js +15 -1
  167. package/dist/core/engine/memo-durable-activity.js +4 -1
  168. package/dist/core/engine/nonterminal-revision-count.d.ts +25 -0
  169. package/dist/core/engine/nonterminal-revision-count.js +16 -0
  170. package/dist/core/engine/operations-time.d.ts +5 -23
  171. package/dist/core/engine/operations-time.js +13 -11
  172. package/dist/core/engine/ownership-bootstrap.d.ts +1 -1
  173. package/dist/core/engine/pinned-schedule-revision-count.d.ts +26 -0
  174. package/dist/core/engine/pinned-schedule-revision-count.js +19 -0
  175. package/dist/core/engine/pinned-schedule-revision.d.ts +76 -0
  176. package/dist/core/engine/pinned-schedule-revision.js +53 -0
  177. package/dist/core/engine/registration.d.ts +106 -0
  178. package/dist/core/engine/registration.js +28 -7
  179. package/dist/core/engine/retention.js +9 -2
  180. package/dist/core/engine/revision-errors.d.ts +71 -0
  181. package/dist/core/engine/revision-errors.js +13 -0
  182. package/dist/core/engine/schedule-revision-fire.d.ts +17 -0
  183. package/dist/core/engine/schedule-revision-fire.js +3 -0
  184. package/dist/core/engine/schedule-run.js +2 -1
  185. package/dist/core/engine/schedules.d.ts +2 -1
  186. package/dist/core/engine/schedules.js +28 -9
  187. package/dist/core/engine/source-diagnostics.d.ts +76 -0
  188. package/dist/core/engine/source-diagnostics.js +105 -0
  189. package/dist/core/engine/source-registration.d.ts +42 -0
  190. package/dist/core/engine/source-registration.js +38 -0
  191. package/dist/core/engine/source-resolution.d.ts +101 -0
  192. package/dist/core/engine/source-resolution.js +154 -0
  193. package/dist/core/engine/source-runtime-state.d.ts +92 -0
  194. package/dist/core/engine/source-runtime-state.js +36 -0
  195. package/dist/core/engine/storage-io.d.ts +19 -2
  196. package/dist/core/engine/storage-io.js +21 -2
  197. package/dist/core/engine/termination/finalizer-registration.d.ts +18 -0
  198. package/dist/core/engine/termination/finalizer-registration.js +21 -0
  199. package/dist/core/engine/termination/finalizer.d.ts +16 -19
  200. package/dist/core/engine/termination/finalizer.js +3 -3
  201. package/dist/core/engine/time-operation-callbacks.d.ts +32 -0
  202. package/dist/core/engine/time-operation-callbacks.js +0 -0
  203. package/dist/core/engine/validation/schedule-cadence.d.ts +16 -0
  204. package/dist/core/engine/validation/schedule-cadence.js +20 -0
  205. package/dist/core/engine/validation/schedule-options.d.ts +4 -1
  206. package/dist/core/engine/validation/schedule-options.js +14 -0
  207. package/dist/core/engine/validation/schedule-revision.d.ts +24 -0
  208. package/dist/core/engine/validation/schedule-revision.js +21 -0
  209. package/dist/core/engine/validation/schedule-warnings.d.ts +11 -0
  210. package/dist/core/engine/validation/schedule-warnings.js +5 -0
  211. package/dist/core/engine/validation/schedule.d.ts +4 -3
  212. package/dist/core/engine/validation/schedule.js +15 -26
  213. package/dist/core/engine/validation.js +5 -2
  214. package/dist/core/engine/workflow-claim-reclaim-target.d.ts +1 -1
  215. package/dist/core/engine/workflow-claim-reclaim-target.js +16 -2
  216. package/dist/core/engine/workflow-retention-deadline.d.ts +16 -0
  217. package/dist/core/engine/workflow-retention-deadline.js +33 -0
  218. package/dist/core/events/catalog-events.d.ts +117 -0
  219. package/dist/core/events/catalog-events.js +62 -0
  220. package/dist/core/events/event-map.d.ts +11 -0
  221. package/dist/core/events/index.d.ts +2 -0
  222. package/dist/core/events/index.js +2 -0
  223. package/dist/core/events/workflow-source-events.d.ts +102 -0
  224. package/dist/core/events/workflow-source-events.js +57 -0
  225. package/dist/core/execution-strategy.d.ts +7 -0
  226. package/dist/core/inline-execution-strategy.context-options.d.ts +1 -1
  227. package/dist/core/inline-execution-strategy.js +1 -1
  228. package/dist/core/mailbox-admission.d.ts +26 -0
  229. package/dist/core/mailbox-admission.js +130 -0
  230. package/dist/core/mailbox-claims.d.ts +251 -0
  231. package/dist/core/mailbox-claims.js +0 -0
  232. package/dist/core/mailbox-codec.d.ts +32 -0
  233. package/dist/core/mailbox-codec.js +221 -0
  234. package/dist/core/mailbox-contract.d.ts +290 -0
  235. package/dist/core/mailbox-contract.js +0 -0
  236. package/dist/core/mailbox-delivery.d.ts +37 -0
  237. package/dist/core/mailbox-delivery.js +193 -0
  238. package/dist/core/mailbox-guards.d.ts +78 -0
  239. package/dist/core/mailbox-guards.js +58 -0
  240. package/dist/core/mailbox-index-codec.d.ts +41 -0
  241. package/dist/core/mailbox-index-codec.js +71 -0
  242. package/dist/core/mailbox-internals.d.ts +156 -0
  243. package/dist/core/mailbox-internals.js +154 -0
  244. package/dist/core/mailbox-maintenance.d.ts +29 -0
  245. package/dist/core/mailbox-maintenance.js +196 -0
  246. package/dist/core/mailbox-settlement.d.ts +69 -0
  247. package/dist/core/mailbox-settlement.js +206 -0
  248. package/dist/core/mailbox-storage.d.ts +117 -0
  249. package/dist/core/mailbox-storage.js +115 -0
  250. package/dist/core/mailbox-transition-helpers.d.ts +70 -0
  251. package/dist/core/mailbox-transition-helpers.js +43 -0
  252. package/dist/core/mailbox-transitions-recovery.d.ts +28 -0
  253. package/dist/core/mailbox-transitions-recovery.js +64 -0
  254. package/dist/core/mailbox-transitions.d.ts +138 -0
  255. package/dist/core/mailbox-transitions.js +180 -0
  256. package/dist/core/mailbox-types.d.ts +406 -0
  257. package/dist/core/mailbox-types.js +16 -0
  258. package/dist/core/mailbox-validation.d.ts +65 -0
  259. package/dist/core/mailbox-validation.js +73 -0
  260. package/dist/core/mailbox-waits.d.ts +50 -0
  261. package/dist/core/mailbox-waits.js +97 -0
  262. package/dist/core/mailbox.d.ts +163 -0
  263. package/dist/core/mailbox.js +211 -0
  264. package/dist/core/outbox-claims.d.ts +307 -0
  265. package/dist/core/outbox-claims.js +0 -0
  266. package/dist/core/outbox-codec.d.ts +24 -0
  267. package/dist/core/outbox-codec.js +257 -0
  268. package/dist/core/outbox-contract.d.ts +346 -0
  269. package/dist/core/outbox-contract.js +0 -0
  270. package/dist/core/outbox-delivery.d.ts +34 -0
  271. package/dist/core/outbox-delivery.js +149 -0
  272. package/dist/core/outbox-drain.d.ts +29 -0
  273. package/dist/core/outbox-drain.js +158 -0
  274. package/dist/core/outbox-enqueue.d.ts +24 -0
  275. package/dist/core/outbox-enqueue.js +115 -0
  276. package/dist/core/outbox-guards.d.ts +76 -0
  277. package/dist/core/outbox-guards.js +60 -0
  278. package/dist/core/outbox-index-codec.d.ts +33 -0
  279. package/dist/core/outbox-index-codec.js +71 -0
  280. package/dist/core/outbox-internals.d.ts +99 -0
  281. package/dist/core/outbox-internals.js +159 -0
  282. package/dist/core/outbox-listing.d.ts +12 -0
  283. package/dist/core/outbox-listing.js +38 -0
  284. package/dist/core/outbox-maintenance.d.ts +28 -0
  285. package/dist/core/outbox-maintenance.js +191 -0
  286. package/dist/core/outbox-operations.d.ts +18 -0
  287. package/dist/core/outbox-operations.js +46 -0
  288. package/dist/core/outbox-runner.d.ts +30 -0
  289. package/dist/core/outbox-runner.js +217 -0
  290. package/dist/core/outbox-settlement.d.ts +57 -0
  291. package/dist/core/outbox-settlement.js +183 -0
  292. package/dist/core/outbox-storage.d.ts +107 -0
  293. package/dist/core/outbox-storage.js +127 -0
  294. package/dist/core/outbox-transition-helpers.d.ts +83 -0
  295. package/dist/core/outbox-transition-helpers.js +63 -0
  296. package/dist/core/outbox-transitions-recovery.d.ts +30 -0
  297. package/dist/core/outbox-transitions-recovery.js +42 -0
  298. package/dist/core/outbox-transitions.d.ts +145 -0
  299. package/dist/core/outbox-transitions.js +236 -0
  300. package/dist/core/outbox-types.d.ts +400 -0
  301. package/dist/core/outbox-types.js +20 -0
  302. package/dist/core/outbox-validation.d.ts +101 -0
  303. package/dist/core/outbox-validation.js +127 -0
  304. package/dist/core/outbox-waits.d.ts +39 -0
  305. package/dist/core/outbox-waits.js +88 -0
  306. package/dist/core/outbox.d.ts +156 -0
  307. package/dist/core/outbox.js +234 -0
  308. package/dist/core/registry-limits.d.ts +49 -0
  309. package/dist/core/registry-limits.js +10 -0
  310. package/dist/core/registry-schema-conversion.d.ts +20 -0
  311. package/dist/core/registry-schema-conversion.js +22 -0
  312. package/dist/core/registry-snapshot.d.ts +91 -42
  313. package/dist/core/registry-snapshot.js +39 -77
  314. package/dist/core/registry-workflow-contract-draft.d.ts +32 -0
  315. package/dist/core/registry-workflow-contract-draft.js +28 -0
  316. package/dist/core/registry-workflow-manifest.d.ts +122 -0
  317. package/dist/core/registry-workflow-manifest.js +92 -0
  318. package/dist/core/source/errors.d.ts +55 -0
  319. package/dist/core/source/errors.js +13 -0
  320. package/dist/core/source/index.d.ts +19 -0
  321. package/dist/core/source/index.js +4 -0
  322. package/dist/core/source/resolvers.d.ts +45 -0
  323. package/dist/core/source/resolvers.js +9 -0
  324. package/dist/core/source/types.d.ts +211 -0
  325. package/dist/core/source/types.js +0 -0
  326. package/dist/core/source/validate.d.ts +91 -0
  327. package/dist/core/source/validate.js +62 -0
  328. package/dist/core/source/workflow-source.d.ts +43 -0
  329. package/dist/core/source/workflow-source.js +16 -0
  330. package/dist/core/types/checkpoint.d.ts +14 -0
  331. package/dist/core/types/schedules.d.ts +52 -1
  332. package/dist/core/types/state.d.ts +16 -0
  333. package/dist/core/types/workflow-registries.d.ts +7 -0
  334. package/dist/core/types/workflow-registry.d.ts +12 -0
  335. package/dist/core/versioning.js +2 -0
  336. package/dist/core/weft-error.d.ts +1 -1
  337. package/dist/core/weft-error.js +12 -1
  338. package/dist/core/worker-execution-strategy.d.ts +1 -0
  339. package/dist/core/worker-execution-strategy.js +13 -1
  340. package/dist/core/worker-fault-handling.d.ts +10 -0
  341. package/dist/core/worker-fault-handling.js +1 -0
  342. package/dist/core/worker-inbound-message.d.ts +1 -0
  343. package/dist/core/worker-inbound-message.js +1 -0
  344. package/dist/core/worker-protocol-guard.js +4 -0
  345. package/dist/core/worker-protocol.d.ts +7 -0
  346. package/dist/core/worker-protocol.js +2 -1
  347. package/dist/core/worker-turn-watchdog.d.ts +8 -1
  348. package/dist/core/worker-turn-watchdog.js +3 -2
  349. package/dist/diagnostics/format.js +5 -0
  350. package/dist/diagnostics/types.d.ts +24 -0
  351. package/dist/diagnostics/version-check.js +8 -2
  352. package/dist/http.js +2 -2
  353. package/dist/index.d.ts +25 -4
  354. package/dist/index.js +57 -0
  355. package/dist/indexeddb.js +1 -1
  356. package/dist/json-schema.js +3 -3
  357. package/dist/mcp/resources.js +2 -0
  358. package/dist/runtime/portable.d.ts +9 -1
  359. package/dist/server/fault-to-json-rpc.js +4 -1
  360. package/dist/server/handler/auth-context-principal.js +4 -0
  361. package/dist/server/index.d.ts +11 -0
  362. package/dist/server/json-rpc-http.js +2 -0
  363. package/dist/server/json-rpc-websocket.js +6 -4
  364. package/dist/server/operation-catalog/index.d.ts +1 -1
  365. package/dist/server/operation-catalog/pipeline-helpers.js +2 -0
  366. package/dist/server/operation-catalog/types.d.ts +17 -0
  367. package/dist/server/operation-fault.d.ts +5 -0
  368. package/dist/server/operation-fault.js +4 -1
  369. package/dist/server/operations/activate-workflow-revision.d.ts +30 -0
  370. package/dist/server/operations/activate-workflow-revision.js +69 -0
  371. package/dist/server/operations/create-schedule.d.ts +2 -0
  372. package/dist/server/operations/create-schedule.js +10 -6
  373. package/dist/server/operations/fleet-events-subscription.js +1 -1
  374. package/dist/server/operations/fork-workflow.js +1 -1
  375. package/dist/server/operations/get-active-workflow-revision.d.ts +32 -0
  376. package/dist/server/operations/get-active-workflow-revision.js +46 -0
  377. package/dist/server/operations/get-catalog-diagnostics.d.ts +113 -0
  378. package/dist/server/operations/get-catalog-diagnostics.js +65 -0
  379. package/dist/server/operations/get-registry.js +17 -4
  380. package/dist/server/operations/get-task-detail-schema.d.ts +8 -0
  381. package/dist/server/operations/get-task-detail-schema.js +1 -0
  382. package/dist/server/operations/get-task-detail.d.ts +8 -0
  383. package/dist/server/operations/get-task-detail.js +1 -0
  384. package/dist/server/operations/get-task-diagnostics.d.ts +4 -4
  385. package/dist/server/operations/get-workflow-revision.d.ts +25 -0
  386. package/dist/server/operations/get-workflow-revision.js +50 -0
  387. package/dist/server/operations/install-workflow-revision.d.ts +27 -0
  388. package/dist/server/operations/install-workflow-revision.js +46 -0
  389. package/dist/server/operations/list-workflow-revisions.d.ts +20 -0
  390. package/dist/server/operations/list-workflow-revisions.js +40 -0
  391. package/dist/server/operations/preload-workflow-revision.d.ts +28 -0
  392. package/dist/server/operations/preload-workflow-revision.js +60 -0
  393. package/dist/server/operations/schedule-faults.d.ts +1 -0
  394. package/dist/server/operations/schedule-faults.js +32 -4
  395. package/dist/server/operations/schedule-rest-body.d.ts +1 -0
  396. package/dist/server/operations/schedule-rest-body.js +2 -1
  397. package/dist/server/operations/start-or-signal-workflow.js +1 -1
  398. package/dist/server/operations/start-workflow.js +1 -1
  399. package/dist/server/operations/static-registrations.js +42 -0
  400. package/dist/server/operations/storage.js +2 -2
  401. package/dist/server/operations/submit-review-decision.js +1 -1
  402. package/dist/server/operations/update-schedule.d.ts +2 -0
  403. package/dist/server/operations/update-schedule.js +4 -2
  404. package/dist/server/operations/workflow-catalog-operation-helpers.d.ts +59 -0
  405. package/dist/server/operations/workflow-catalog-operation-helpers.js +162 -0
  406. package/dist/server/runtime/task-dispatch-envelope.d.ts +14 -0
  407. package/dist/server/runtime/task-dispatch-envelope.js +32 -0
  408. package/dist/server/runtime/task-dispatch-revision.d.ts +29 -0
  409. package/dist/server/runtime/task-dispatch-revision.js +13 -0
  410. package/dist/server/runtime/task-dispatch.js +12 -37
  411. package/dist/server/runtime/task-ledger-recovery.js +1 -1
  412. package/dist/server/runtime/task-ledger-runtime.d.ts +14 -2
  413. package/dist/server/runtime/task-ledger-runtime.js +5 -3
  414. package/dist/server/runtime/task-polling.js +9 -3
  415. package/dist/server/runtime/task-reconciliation.js +2 -1
  416. package/dist/server/runtime/websocket-upgrade.js +2 -0
  417. package/dist/server/runtime/websocket-worker.js +9 -0
  418. package/dist/server/task-ledger-codec.d.ts +9 -0
  419. package/dist/server/task-ledger-codec.js +4 -1
  420. package/dist/server/task-ledger-transition-helpers.js +1 -0
  421. package/dist/server/task-ledger-types.d.ts +9 -0
  422. package/dist/server/task-ledger.d.ts +1 -1
  423. package/dist/server/task-ledger.js +2 -1
  424. package/dist/server/task-queue-types.d.ts +2 -0
  425. package/dist/storage/bun-sql.js +51 -6
  426. package/dist/storage/catalog-keys.d.ts +64 -0
  427. package/dist/storage/catalog-keys.js +8 -0
  428. package/dist/storage/compressed-storage.js +1 -1
  429. package/dist/storage/derived-operations.js +1 -1
  430. package/dist/storage/index.d.ts +28 -1
  431. package/dist/storage/interface.d.ts +28 -1
  432. package/dist/storage/interface.js +1 -1
  433. package/dist/storage/key-encoding.d.ts +15 -0
  434. package/dist/storage/key-encoding.js +3 -0
  435. package/dist/storage/key-prefixes.d.ts +1 -1
  436. package/dist/storage/key-prefixes.js +16 -0
  437. package/dist/storage/lmdb.d.ts +54 -1
  438. package/dist/storage/lmdb.js +1 -1
  439. package/dist/storage/mailbox-keys.d.ts +80 -0
  440. package/dist/storage/mailbox-keys.js +14 -0
  441. package/dist/storage/memory.js +1 -1
  442. package/dist/storage/neon.js +2 -2
  443. package/dist/storage/node-sqlite-loader.d.ts +1 -1
  444. package/dist/storage/node-sqlite.js +51 -6
  445. package/dist/storage/outbox-keys.d.ts +77 -0
  446. package/dist/storage/outbox-keys.js +14 -0
  447. package/dist/storage/postgres.js +2 -2
  448. package/dist/storage/resolve.js +1 -1
  449. package/dist/storage/scoped-storage.js +1 -1
  450. package/dist/storage/storage-configuration.d.ts +6 -0
  451. package/dist/storage/testing.js +1 -1
  452. package/dist/storage/turso.js +2 -2
  453. package/dist/version.d.ts +1 -1
  454. package/dist/version.js +1 -1
  455. package/dist/web-extension.js +1 -1
  456. package/dist/worker/manifest/registry-contract-builder.d.ts +21 -3
  457. package/dist/worker/manifest/registry-contract-builder.js +40 -31
  458. package/dist/worker/protocol-messages.d.ts +17 -0
  459. package/dist/worker/protocol-schemas.d.ts +32 -0
  460. package/dist/worker/protocol-schemas.js +7 -3
  461. package/dist/worker/protocol-task-result.js +35 -3
  462. package/dist/worker/protocol.js +1 -1
  463. package/dist/worker/registry/types.d.ts +2 -0
  464. package/dist/worker/registry.d.ts +1 -1
  465. package/dist/worker/registry.js +3 -1
  466. package/dist/workers/workflow-runner.d.ts +9 -0
  467. package/dist/workers/workflow-runner.js +9 -2
  468. package/dist/workers/workflow-worker-entry.js +9 -4
  469. package/package.json +2 -2
@@ -1,15 +1,8 @@
1
- import {
2
- KEYS,
3
- requireStorageCapability,
4
- storageHas
5
- } from "../../storage/interface.js";
1
+ import { KEYS, storageHas } from "../../storage/interface.js";
6
2
  import { assertScopedBulkWorkflowFilter } from "../bulk-workflow-filter.js";
7
- import { deserializeCheckpoint } from "../checkpoint.js";
8
- import { decode, encode } from "../codec.js";
9
- import { buildTimerBatchOperations } from "../scheduler.js";
10
- import { buildIndexOperations } from "../search-attributes.js";
11
- import { buildTerminalWorkflowIndexOperations, bulkMutateWorkflowTags } from "./attributes-tags.js";
3
+ import { bulkMutateWorkflowTags } from "./attributes-tags.js";
12
4
  import { purgeInternal, purgeWorkflow } from "./bulk-operations-purge.js";
5
+ import { runBulkFailedWorkflowRetry } from "./bulk-operations-retry.js";
13
6
  import {
14
7
  buildActionableBulkWorkflowFilter,
15
8
  buildBulkOperationPreparation,
@@ -17,43 +10,19 @@ import {
17
10
  normalizeBulkOperationOptions,
18
11
  prepareBulkOperation,
19
12
  resolveBulkOperationConcurrency,
13
+ runBulkWorkflowPool,
20
14
  shouldPersistBulkAudit,
21
15
  toBulkOperationError,
22
16
  validateBulkConfirmation,
23
17
  withBulkAuditEvent
24
18
  } from "./bulk-operations-shared.js";
25
19
  import { BulkDeleteRequiresTerminalWorkflowsError } from "./errors.js";
26
- import {
27
- assertLeaseHeldForEngineWork,
28
- commitFencedEngineWriteAllowingPreconditionFailure
29
- } from "./fenced-write.js";
20
+ import { assertLeaseHeldForEngineWork } from "./fenced-write.js";
30
21
  import { BULK_OPERATION_BATCH_SIZE } from "./listing.js";
31
- import { createTerminalCleanupTimerId } from "./state-utilities.js";
32
- import { loadWorkflowState, runSerializedWorkflowStateWrite } from "./storage-io.js";
33
- import { decodeWorkflowState, isTerminalWorkflowStatus } from "./validation.js";
34
- import {
35
- commitWithWorkflowClaimFold,
36
- prepareWorkflowClaimFold,
37
- throwWorkflowClaimUnavailable
38
- } from "./workflow-claim-fold.js";
39
- import { buildWorkflowConcurrencyStartOperations } from "./workflow-concurrency.js";
40
- import { buildWorkflowVisibilityIndexTransition } from "./workflow-indexes.js";
22
+ import { loadWorkflowState } from "./storage-io.js";
23
+ import { isTerminalWorkflowStatus } from "./validation.js";
41
24
  export { purgeInternal, TERMINAL_CLEANUP_DELAY_MS } from "./bulk-operations-purge.js";
42
- const ACTIVE_WORKFLOW_STATUSES = ["pending", "running", "suspended"], FAILED_WORKFLOW_STATUSES = ["failed"], CHECKPOINT_RETRY_CONCURRENCY_ADMISSION_MAX_ATTEMPTS = 5;
43
- async function runBulkWorkflowPool(items, concurrencyLimit, operation) {
44
- const results = [];
45
- for (let batchStart = 0;batchStart < items.length; batchStart += concurrencyLimit) {
46
- const batchItems = items.slice(batchStart, batchStart + concurrencyLimit);
47
- results.push(...await Promise.all(batchItems.map(async (item) => {
48
- try {
49
- return { item, status: "fulfilled", value: await operation(item) };
50
- } catch (reason) {
51
- return { item, status: "rejected", reason };
52
- }
53
- })));
54
- }
55
- return results;
56
- }
25
+ const ACTIVE_WORKFLOW_STATUSES = ["pending", "running", "suspended"];
57
26
  export async function purge(internals, filter, cleanupWaiters) {
58
27
  return purgeInternal(internals, filter, { expiredOnly: !1, now: internals.options.getNow() }, cleanupWaiters);
59
28
  }
@@ -95,138 +64,10 @@ async function runBulkCancellation(internals, filter, options = {}) {
95
64
  export async function cancelAll(internals, filter, options = {}) {
96
65
  return runBulkCancellation(internals, filter, options);
97
66
  }
98
- async function runBulkFailedWorkflowRetry(internals, filter, options = {}) {
99
- options = normalizeBulkOperationOptions(options);
100
- assertScopedBulkWorkflowFilter(filter);
101
- const actionableFilter = buildActionableBulkWorkflowFilter(internals, filter, FAILED_WORKFLOW_STATUSES), preparation = await prepareBulkOperation(internals, "retry-failed", actionableFilter, filter, {}, options);
102
- if (options.dryRun === !0)
103
- return preparation.preview;
104
- validateBulkConfirmation(options, preparation);
105
- const bulkConcurrency = resolveBulkOperationConcurrency(options);
106
- let retried = 0;
107
- const errors = [], retryResults = await runBulkWorkflowPool(preparation.workflowIds, bulkConcurrency, async (workflowId) => {
108
- await retryFailedWorkflow(internals, workflowId);
109
- return { status: "retried" };
110
- });
111
- for (const retryResult of retryResults) {
112
- if (retryResult.status === "rejected") {
113
- errors.push(toBulkOperationError(internals, retryResult.item, retryResult.reason));
114
- continue;
115
- }
116
- retried += 1;
117
- }
118
- const result = { retried, failed: errors.length, errors };
119
- if (!shouldPersistBulkAudit(options))
120
- return result;
121
- return withBulkAuditEvent(internals, preparation, options, result, retried);
122
- }
123
67
  export async function retryFailedAll(internals, filter, options = {}) {
124
68
  assertLeaseHeldForEngineWork(internals);
125
69
  return runBulkFailedWorkflowRetry(internals, filter, options);
126
70
  }
127
- async function retryFailedWorkflow(internals, workflowId) {
128
- const state = await loadWorkflowState(internals, workflowId);
129
- if (state === null)
130
- throw Error("Workflow no longer exists");
131
- if (state.status !== "failed")
132
- throw Error(`Workflow is ${state.status}, not failed`);
133
- if (await internals.storage.get(KEYS.checkpoint(workflowId)) !== null) {
134
- await reactivateFailedWorkflowFromCheckpoint(internals, state);
135
- await internals.engine.resume(workflowId);
136
- return;
137
- }
138
- await internals.engine.start(state.type, state.input, {
139
- id: workflowId,
140
- onTerminalConflict: "start-new",
141
- ...state.tags !== void 0 ? { tags: state.tags } : {}
142
- });
143
- }
144
- async function reactivateFailedWorkflowFromCheckpoint(internals, state) {
145
- const reactivated = await runSerializedWorkflowStateWrite(internals, state.id, async () => reactivateFailedWorkflowFromCheckpointSerialized(internals, state.id));
146
- if (reactivated.terminalCleanupTimerId !== void 0)
147
- await internals.scheduler.cancel(reactivated.terminalCleanupTimerId, state.id);
148
- }
149
- async function reactivateFailedWorkflowFromCheckpointSerialized(internals, workflowId) {
150
- let lastConcurrencyStateKey;
151
- for (let attempt = 0;attempt < CHECKPOINT_RETRY_CONCURRENCY_ADMISSION_MAX_ATTEMPTS; attempt += 1) {
152
- const currentStateBytes = await internals.storage.get(KEYS.workflow(workflowId));
153
- if (currentStateBytes === null)
154
- throw Error("Workflow no longer exists");
155
- const currentState = decodeWorkflowState(currentStateBytes);
156
- if (currentState.status !== "failed")
157
- throw Error(`Workflow is ${currentState.status}, not failed`);
158
- const currentCheckpointBytes = await internals.storage.get(KEYS.checkpoint(workflowId));
159
- if (currentCheckpointBytes === null)
160
- throw Error("Checkpoint no longer exists");
161
- const checkpoint = deserializeCheckpoint(currentCheckpointBytes), registration = internals.registrations.get(currentState.type);
162
- if (registration === void 0)
163
- throw Error(`No workflow registered with name "${currentState.type}" (needed to retry "${workflowId}")`);
164
- const concurrencyStartOperations = registration.concurrency === void 0 ? void 0 : await buildWorkflowConcurrencyStartOperations(internals, currentState.type, workflowId, currentState.input, registration.concurrency);
165
- lastConcurrencyStateKey = concurrencyStartOperations?.stateKey ?? lastConcurrencyStateKey;
166
- const reactivatedState = buildReactivatedWorkflowState(internals, currentState), currentAttributes = await loadSearchAttributes(internals, workflowId), operations = [
167
- ...buildTerminalWorkflowIndexOperations(currentState, reactivatedState),
168
- { type: "put", key: KEYS.workflow(workflowId), value: encode(reactivatedState) },
169
- ...buildWorkflowVisibilityIndexTransition(workflowId, currentState, reactivatedState).batchOps,
170
- ...buildRetrySearchAttributeOperations(workflowId, currentAttributes, checkpoint.searchAttributes),
171
- ...reactivatedState.executionDeadline === void 0 ? [] : buildTimerBatchOperations({
172
- id: `deadline:${workflowId}`,
173
- workflowId,
174
- fireAt: reactivatedState.executionDeadline,
175
- kind: "execution-deadline"
176
- }),
177
- ...concurrencyStartOperations?.operations ?? []
178
- ], conditions = concurrencyStartOperations?.conditions ?? [];
179
- if (await commitFailedWorkflowReactivation(internals, workflowId, operations, conditions))
180
- return {
181
- terminalCleanupTimerId: currentState.terminalCleanupToken === void 0 ? void 0 : createTerminalCleanupTimerId(!1, currentState.terminalCleanupToken)
182
- };
183
- }
184
- throw Error(`Workflow concurrency admission for "${lastConcurrencyStateKey ?? workflowId}" changed too many times while retrying failed workflow "${workflowId}"`);
185
- }
186
- async function commitFailedWorkflowReactivation(internals, workflowId, operations, conditions) {
187
- const claimFold = await prepareWorkflowClaimFold(internals, workflowId);
188
- if (claimFold === void 0) {
189
- if (conditions.length > 0)
190
- requireStorageCapability(internals.storage, "conditionalBatch", "retry failed workflow");
191
- return commitFencedEngineWriteAllowingPreconditionFailure(internals, workflowId, operations, conditions);
192
- }
193
- const result = await commitWithWorkflowClaimFold(internals, claimFold, operations, conditions, "retry failed workflow claim acquisition");
194
- if (result.status === "committed")
195
- return !0;
196
- return result.claimConflict ? throwWorkflowClaimUnavailable(internals, workflowId) : !1;
197
- }
198
- function buildReactivatedWorkflowState(internals, state) {
199
- const reactivatedState = {
200
- ...state,
201
- status: "running",
202
- updatedAt: internals.options.getNow()
203
- };
204
- delete reactivatedState.error;
205
- delete reactivatedState.errorStack;
206
- delete reactivatedState.failureCategory;
207
- delete reactivatedState.result;
208
- delete reactivatedState.terminationReason;
209
- delete reactivatedState.terminalCleanupToken;
210
- return reactivatedState;
211
- }
212
- async function loadSearchAttributes(internals, workflowId) {
213
- const attributeBytes = await internals.storage.get(KEYS.attribute(workflowId));
214
- if (attributeBytes === null)
215
- return {};
216
- return decode(attributeBytes);
217
- }
218
- function buildRetrySearchAttributeOperations(workflowId, currentAttributes, checkpointAttributes) {
219
- const operations = buildIndexOperations(workflowId, currentAttributes, checkpointAttributes);
220
- if (Object.keys(checkpointAttributes).length === 0)
221
- operations.push({ type: "delete", key: KEYS.attribute(workflowId) });
222
- else
223
- operations.push({
224
- type: "put",
225
- key: KEYS.attribute(workflowId),
226
- value: encode(checkpointAttributes)
227
- });
228
- return operations;
229
- }
230
71
  export async function signalAll(internals, filter, name, payload, maybeOptions) {
231
72
  const options = normalizeBulkOperationOptions(maybeOptions ?? {});
232
73
  assertScopedBulkWorkflowFilter(filter);
@@ -16,6 +16,7 @@ import {
16
16
  createReviewOperationCallbacks,
17
17
  handleScheduleTimerForEngine
18
18
  } from "./callback-creators-schedule.js";
19
+ import { resolveExecutableRegistrationForRevision } from "./dynamic-source-execution.js";
19
20
  import { commitFencedEngineWrite } from "./fenced-write.js";
20
21
  import { guardTerminalWorkflow, guardTerminalWorkflowAfterCoordinatedRequest } from "./guards.js";
21
22
  import { getInternals } from "./internals.js";
@@ -122,7 +123,7 @@ export function createTimeOperationCallbacks(engine) {
122
123
  loadWorkflowState: (workflowId) => loadWorkflowState(getInternals(engine), workflowId),
123
124
  failWorkflow: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine)),
124
125
  runSerializedWorkflowStateWrite: (workflowId, writeOperation) => runSerializedWorkflowStateWrite(getInternals(engine), workflowId, writeOperation),
125
- beginWorkflowExecution: (workflowId, workflowExecutionToken, workflowType, input, checkpoint, executionDeadline, executionStateOwnerId, registration) => beginWorkflowExecution(getInternals(engine), workflowId, workflowExecutionToken, workflowType, input, checkpoint, executionDeadline, executionStateOwnerId, registration, createLifecycleCallbacks(engine)),
126
+ beginWorkflowExecution: (workflowId, workflowExecutionToken, workflowType, revision, input, checkpoint, executionDeadline, executionStateOwnerId, registration) => beginWorkflowExecution(getInternals(engine), workflowId, workflowExecutionToken, workflowType, revision, input, checkpoint, executionDeadline, executionStateOwnerId, registration, createLifecycleCallbacks(engine)),
126
127
  workflowVersionTupleFromState: (state) => workflowVersionTupleFromState(getInternals(engine), state, createLifecycleCallbacks(engine)),
127
128
  setWorkflowStartHeaders: (workflowId, headers) => setWorkflowStartHeaders(getInternals(engine), workflowId, headers, createLifecycleCallbacks(engine)),
128
129
  loadWorkflowStartHeaders: (workflowId) => loadWorkflowStartHeaders(getInternals(engine), workflowId, createLifecycleCallbacks(engine)),
@@ -131,7 +132,8 @@ export function createTimeOperationCallbacks(engine) {
131
132
  runWorkflowFinalizer: (workflowId, timerId) => runWorkflowFinalizer(getInternals(engine), workflowId, timerId, createTerminationCallbacks(engine)),
132
133
  handleScheduleTimer: (entry) => handleScheduleTimerForEngine(engine, entry),
133
134
  timeout: (workflowId) => engine.timeout(workflowId),
134
- handleCleanupError: (source, error, workflowId) => createTerminationCallbacks(engine).handleCleanupError(source, error, workflowId)
135
+ handleCleanupError: (source, error, workflowId) => createTerminationCallbacks(engine).handleCleanupError(source, error, workflowId),
136
+ resolveExecutableRegistrationForRevision: (type, revision) => resolveExecutableRegistrationForRevision(engine, getInternals(engine), type, revision)
135
137
  };
136
138
  }
137
139
  export function createUpdateCallbacks(engine) {
@@ -3,6 +3,10 @@ import {
3
3
  broadcast as broadcastFromInternals,
4
4
  forwardEventToHandle as forwardEventToHandleFromBroadcast
5
5
  } from "./broadcast.js";
6
+ import {
7
+ resolveExecutableRegistration,
8
+ resolveExecutableRegistrationForRevision
9
+ } from "./dynamic-source-execution.js";
6
10
  import { createWorkflowHandleWithResultPromise } from "./handle-result.js";
7
11
  import {
8
12
  hasLocalCheckpointOwnership,
@@ -79,7 +83,11 @@ export function createLifecycleCallbacks(engine) {
79
83
  failWorkflowForUnavailableServices: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
80
84
  failWorkflowForRecoveryHook: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
81
85
  failWorkflowForCheckpointDecodeError: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
82
- failWorkflowForVersionMismatch: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system")
86
+ failWorkflowForVersionMismatch: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
87
+ resolveExecutableRegistration: (type, onRevisionChosen) => resolveExecutableRegistration(engine, getInternals(engine), type, onRevisionChosen),
88
+ failWorkflowForUnavailableDynamicSource: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
89
+ resolveExecutableRegistrationForRevision: (type, revision) => resolveExecutableRegistrationForRevision(engine, getInternals(engine), type, revision),
90
+ failWorkflowForRevisionUnavailable: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system")
83
91
  };
84
92
  }
85
93
  export function createTerminationCallbacksWith(engine, handleScheduledWorkflowTerminal) {
@@ -20,8 +20,8 @@ import { feedOperationResult } from "./strategy-helpers.js";
20
20
  import { ensureTerminalCleanupTracked, failWorkflow, handleCleanupError } from "./termination.js";
21
21
  export function createScheduleCallbacks(engine) {
22
22
  return {
23
- startWorkflow: async (type, input, options, additionalStartOperations) => {
24
- await startWorkflow(getInternals(engine), type, input, options, additionalStartOperations, createLifecycleCallbacks(engine));
23
+ startWorkflow: async (type, input, options, additionalStartOperations, revisionOverride) => {
24
+ await startWorkflow(getInternals(engine), type, input, options, additionalStartOperations, createLifecycleCallbacks(engine), void 0, revisionOverride);
25
25
  },
26
26
  loadWorkflowState: (workflowId) => loadWorkflowState(getInternals(engine), workflowId),
27
27
  cancelWorkflow: (workflowId) => engine.cancel(workflowId),
@@ -0,0 +1,40 @@
1
+ /**
2
+ * `activateCatalogRevisionCandidate` — a thin engine-level wrapper around
3
+ * `WorkflowCatalog.activateCandidate()`, the guarded activation primitive
4
+ * (WFT-9/WFT-10). Awaits catalog readiness, reads pre-activation state,
5
+ * calls the guarded primitive, dispatches the correct catalog event(s), and
6
+ * returns the primitive's own structured result verbatim:
7
+ * the shared installed/activated/draining helper on success, or
8
+ * `WorkflowRevisionActivationRejectedEvent` directly on refusal.
9
+ *
10
+ * `engine.workflows.activate()` (WFT-11,
11
+ * `core/engine/engine-workflows-namespace.ts`) is this wrapper's production
12
+ * caller — the only practical way an external caller reaches the guarded
13
+ * candidate-activation primitive, so routing it through here (rather than
14
+ * calling `WorkflowCatalog.activateCandidate()` directly) is what makes a
15
+ * manual activation dispatch `catalog:revision-installed`/
16
+ * `catalog:revision-activated`/`catalog:revision-draining`/
17
+ * `catalog:activation-rejected` the same way `engine.register()`'s
18
+ * drain path already does.
19
+ *
20
+ * Never imports `./index.ts` as a value (only as a type, matching
21
+ * `catalog-readiness.ts`'s own import-cycle discipline for itself) — the
22
+ * `Engine` class import here is `import type`, erased at build time.
23
+ *
24
+ * @module core/engine/catalog-activation
25
+ */
26
+ import type { ActivateCandidateOptions, WorkflowCatalogActivationResult } from '../catalog/index.ts';
27
+ import type { WorkflowRevisionManifest } from '../contract/types.ts';
28
+ import type { Engine } from './index.ts';
29
+ /**
30
+ * Activate `candidateManifest` for `name` through the catalog's guarded
31
+ * primitive (`checkWorkflowCompatibility`-gated, single-shot CAS), and
32
+ * return its structured result verbatim. On success, dispatches
33
+ * `catalog:revision-installed` (when genuinely new content),
34
+ * `catalog:revision-draining` (when displacing a prior active revision),
35
+ * and `catalog:revision-activated`. On refusal, dispatches
36
+ * `catalog:activation-rejected` carrying only the bounded `reason` code
37
+ * (and, for `'incompatible'`, the bounded `incompatibilityReasons` array) —
38
+ * never the full `WorkflowCompatibilityVerdict` object.
39
+ */
40
+ export declare function activateCatalogRevisionCandidate(engine: Engine, name: string, candidateManifest: WorkflowRevisionManifest, options?: ActivateCandidateOptions): Promise<WorkflowCatalogActivationResult>;
@@ -0,0 +1,17 @@
1
+ import { WorkflowRevisionActivationRejectedEvent } from "../events/catalog-events.js";
2
+ import { dispatchCatalogInstallAndActivatedEvents } from "./catalog-events.js";
3
+ import { ensureWorkflowCatalogReady, getWorkflowCatalog } from "./catalog-readiness.js";
4
+ export async function activateCatalogRevisionCandidate(engine, name, candidateManifest, options) {
5
+ await ensureWorkflowCatalogReady(engine);
6
+ const catalog = getWorkflowCatalog(engine), preExisting = await catalog.hasInstalled(name, candidateManifest.revision), pointerBefore = await catalog.resolveActiveDurable(name) ?? null, result = await catalog.activateCandidate(name, candidateManifest, options);
7
+ if (result.applied) {
8
+ dispatchCatalogInstallAndActivatedEvents(engine, name, candidateManifest.revision, preExisting, pointerBefore, result.pointer);
9
+ return result;
10
+ }
11
+ if (result.reason === "incompatible") {
12
+ engine.dispatchEvent(new WorkflowRevisionActivationRejectedEvent(name, candidateManifest.revision, result.reason, result.verdict.compatible ? void 0 : result.verdict.reasons));
13
+ return result;
14
+ }
15
+ engine.dispatchEvent(new WorkflowRevisionActivationRejectedEvent(name, candidateManifest.revision, result.reason));
16
+ return result;
17
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Shared installed/activated/draining event-dispatch helper (WFT-12), used
3
+ * by BOTH producers of catalog activation: `catalog-readiness.ts`'s
4
+ * `drainPendingCatalogInstalls` (the `engine.register()`-drain path) and
5
+ * `catalog-activation.ts`'s `activateCatalogRevisionCandidate` (the guarded
6
+ * primitive). The two producers return different result shapes
7
+ * (`activateRegistered` always succeeds and returns a bare pointer;
8
+ * `activateCandidate` returns a union that can also refuse) — this helper
9
+ * takes already-normalized before/after pointer values instead of either
10
+ * raw return type, so it stays agnostic to which producer called it.
11
+ * `activation-rejected` is NOT dispatched here — only `activateCandidate`
12
+ * can refuse, so its one caller dispatches that event itself.
13
+ *
14
+ * @module core/engine/catalog-events
15
+ */
16
+ import type { WorkflowCatalogActivePointer } from '../catalog/index.ts';
17
+ import type { Engine } from './index.ts';
18
+ /**
19
+ * Dispatch `catalog:revision-installed` (only when `preExisting` is
20
+ * `false` — genuinely new content, not a byte-identical reinstall or a
21
+ * cross-process durable adoption of already-present content), then decide
22
+ * activated/draining from how `pointerBefore` and `pointerAfter` compare:
23
+ *
24
+ * - Identical `revision` AND `generation` (a true no-op — nothing was
25
+ * durably written, e.g. `activateRegistered`'s own no-op branch): neither
26
+ * fires.
27
+ * - Same `revision`, different `generation` (a reactivation that still
28
+ * bumped the fencing counter, e.g. `activateCandidate` re-activating the
29
+ * currently active revision): `catalog:revision-activated` fires with
30
+ * `previousRevision: undefined` — nothing was actually displaced, so
31
+ * there is nothing to drain.
32
+ * - Different `revision`: `catalog:revision-draining` for `pointerBefore`
33
+ * (when it existed) followed by `catalog:revision-activated` for
34
+ * `pointerAfter`, `previousRevision` set to the displaced revision.
35
+ */
36
+ export declare function dispatchCatalogInstallAndActivatedEvents(engine: Engine, name: string, revision: string, preExisting: boolean, pointerBefore: WorkflowCatalogActivePointer | null, pointerAfter: WorkflowCatalogActivePointer): void;
@@ -0,0 +1,15 @@
1
+ import {
2
+ WorkflowRevisionActivatedEvent,
3
+ WorkflowRevisionDrainingEvent,
4
+ WorkflowRevisionInstalledEvent
5
+ } from "../events/catalog-events.js";
6
+ export function dispatchCatalogInstallAndActivatedEvents(engine, name, revision, preExisting, pointerBefore, pointerAfter) {
7
+ if (!preExisting)
8
+ engine.dispatchEvent(new WorkflowRevisionInstalledEvent(name, revision));
9
+ if (pointerBefore !== null && pointerBefore.revision === pointerAfter.revision && pointerBefore.generation === pointerAfter.generation)
10
+ return;
11
+ const previousRevision = pointerBefore !== null && pointerBefore.revision !== pointerAfter.revision ? pointerBefore.revision : void 0;
12
+ if (previousRevision !== void 0)
13
+ engine.dispatchEvent(new WorkflowRevisionDrainingEvent(name, previousRevision));
14
+ engine.dispatchEvent(new WorkflowRevisionActivatedEvent(name, pointerAfter.revision, pointerAfter.generation, previousRevision));
15
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The sync/async boundary glue between `engine.register()` (synchronous,
3
+ * cannot itself build a manifest — that requires `crypto.subtle`) and the
4
+ * durable workflow catalog (async, WFT-9/WFT-10).
5
+ *
6
+ * `register()` stays byte-for-byte synchronous; `commitWorkflowDefinition`
7
+ * (`registration.ts`) only pushes the workflow's name onto
8
+ * `EngineInternals.pendingCatalogInstalls`. {@link ensureWorkflowCatalogReady}
9
+ * is the memoized function that, on first call, restores the catalog from
10
+ * storage, then drains `pendingCatalogInstalls` — building each pending
11
+ * workflow's manifest via the already-existing
12
+ * `buildWorkflowManifestForType` (`registry-workflow-manifest.ts`, reused
13
+ * rather than reimplemented) and unconditionally activating it via
14
+ * `WorkflowCatalog.activateRegistered`.
15
+ *
16
+ * Awaited at every entry point that can observe catalog state — see the
17
+ * call sites in `index.ts` — so "restore catalog state before recovery or
18
+ * any new start" holds.
19
+ *
20
+ * @module core/engine/catalog-readiness
21
+ */
22
+ import type { Engine } from './index.ts';
23
+ export { getWorkflowCatalog } from './internals.ts';
24
+ /**
25
+ * Synchronous fast-path check: `true` once the catalog is restored and
26
+ * nothing is pending, `false` when {@link ensureWorkflowCatalogReady} would
27
+ * need to do real work. Every `ensureWorkflowCatalogReady` call site in
28
+ * `index.ts` guards its `await` with this check first — `await`ing an
29
+ * `async` function always costs one microtask tick even when the function's
30
+ * own body takes the fast path internally (JS's `await` semantics, not an
31
+ * implementation detail), so skipping the call entirely on an already-warm
32
+ * engine is what "avoid promise-machinery overhead on the hot path" (the
33
+ * WFT-9/WFT-10 design) actually requires — not just an early return inside
34
+ * the async function.
35
+ */
36
+ export declare function isWorkflowCatalogReady(engine: Engine): boolean;
37
+ /**
38
+ * Restore the workflow catalog from storage (once per engine instance) and
39
+ * drain any workflow names `engine.register()` has queued since the last
40
+ * drain. Memoized: concurrent callers await the same in-flight promise, and
41
+ * a call after a prior drain resolved with newly queued names starts a
42
+ * fresh drain rather than re-scanning storage.
43
+ *
44
+ * Also checks the {@link isWorkflowCatalogReady} fast path itself, so a
45
+ * direct call (bypassing a call site's own guard — as in
46
+ * `buildRegistrySnapshot`, or any future caller) is still cheap and correct
47
+ * without relying on every caller remembering to pre-check.
48
+ */
49
+ export declare function ensureWorkflowCatalogReady(engine: Engine): Promise<void>;
@@ -0,0 +1,61 @@
1
+ import { restoreWorkflowCatalog, WorkflowCatalog } from "../catalog/index.js";
2
+ import { buildWorkflowManifestForType } from "../registry-workflow-manifest.js";
3
+ import { dispatchCatalogInstallAndActivatedEvents } from "./catalog-events.js";
4
+ import { resolveOrphanedCatalogTombstones } from "./catalog-tombstone-recovery.js";
5
+ import { EngineDisposedError } from "./errors.js";
6
+ import { getInternals } from "./internals.js";
7
+ export { getWorkflowCatalog } from "./internals.js";
8
+ async function drainPendingCatalogInstalls(engine) {
9
+ const internals = getInternals(engine), catalog = internals.workflowCatalog, pending = internals.pendingCatalogInstalls;
10
+ internals.pendingCatalogInstalls = [];
11
+ for (let index = 0;index < pending.length; index += 1) {
12
+ const name = pending[index];
13
+ try {
14
+ const manifest = await buildWorkflowManifestForType(engine, name);
15
+ if (manifest === void 0)
16
+ continue;
17
+ const definition = engine.getWorkflowDefinition(name);
18
+ if (definition === void 0)
19
+ continue;
20
+ const preExisting = await catalog.hasInstalled(name, manifest.revision), pointerBefore = await catalog.resolveActiveDurable(name) ?? null, pointerAfter = await catalog.activateRegistered(name, manifest, definition);
21
+ internals.registeredCatalogRevisions.set(name, manifest.revision);
22
+ dispatchCatalogInstallAndActivatedEvents(engine, name, manifest.revision, preExisting, pointerBefore, pointerAfter);
23
+ } catch (error) {
24
+ internals.pendingCatalogInstalls = [
25
+ ...pending.slice(index),
26
+ ...internals.pendingCatalogInstalls
27
+ ];
28
+ throw error;
29
+ }
30
+ }
31
+ }
32
+ export function isWorkflowCatalogReady(engine) {
33
+ const internals = getInternals(engine);
34
+ return internals.catalogRestored && internals.pendingCatalogInstalls.length === 0;
35
+ }
36
+ export async function ensureWorkflowCatalogReady(engine) {
37
+ const internals = getInternals(engine);
38
+ if (isWorkflowCatalogReady(engine))
39
+ return;
40
+ if (internals.catalogDrainPromise !== null) {
41
+ await internals.catalogDrainPromise;
42
+ return ensureWorkflowCatalogReady(engine);
43
+ }
44
+ const drainPromise = (async () => {
45
+ if (internals.disposed)
46
+ throw new EngineDisposedError;
47
+ if (!internals.catalogRestored) {
48
+ await resolveOrphanedCatalogTombstones(internals.storage);
49
+ internals.workflowCatalog = new WorkflowCatalog(internals.storage, await restoreWorkflowCatalog(internals.storage));
50
+ internals.catalogRestored = !0;
51
+ }
52
+ await drainPendingCatalogInstalls(engine);
53
+ })();
54
+ internals.catalogDrainPromise = drainPromise;
55
+ try {
56
+ await drainPromise;
57
+ } finally {
58
+ if (internals.catalogDrainPromise === drainPromise)
59
+ internals.catalogDrainPromise = null;
60
+ }
61
+ }