@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
@@ -7,9 +7,27 @@
7
7
  * manifest — see {@link declaredShapeDigest}. This module is that build
8
8
  * tooling: it derives `WorkerWorkflowContract`/`WorkerActivityContract`
9
9
  * values from the *same* normalized representation `buildRegistrySnapshot`
10
- * produces for `GET /v1/registry` and `weft codegen`, hashed with the
11
- * collision-resistant {@link sha256Hex} rather than the cache-key-quality
12
- * FNV-1a scheme those placeholders use.
10
+ * produces for `GET /v1/registry` and `weft codegen`, hashed via
11
+ * `core/contract`'s canonical `contractHash()`/`activityContractHash()`/
12
+ * `deriveWorkflowRevision()` (WFT-5) the same normalized-contract vocabulary
13
+ * `weft codegen` and `WorkflowRevisionManifest` use, rather than this
14
+ * module's own ad hoc hashing (as it did before WFT-5).
15
+ *
16
+ * **WFT-5 digest-value change.** `contractHash`/`workflowRevision` here now
17
+ * fold in a `contractVersion` domain separator (`WORKFLOW_CONTRACT_VERSION`)
18
+ * that the pre-WFT-5 formula never had, so digest *strings* for an
19
+ * otherwise-unchanged registration differ from 0.23.x output — see
20
+ * `CHANGELOG.md`. `workflowRevision` also now derives from a `WorkflowContract`
21
+ * that omits `queue`/`retry`/`timeout` (registry-only activity metadata with
22
+ * no contract-identity meaning), which the pre-WFT-5 formula's
23
+ * `{ ...entry, version }` spread incidentally included; this is a narrowing,
24
+ * not a behavior a caller could rely on. `contractHash` also now folds in
25
+ * whichever activities `options.workflows[type]` names (previously
26
+ * independent of that list, since only the activity's *own* schema was
27
+ * hashed) — declaring a different activity subset for the same workflow type
28
+ * now changes `contractHash`, which is the intended effect of a contract
29
+ * identity that is supposed to answer "what can a caller do with this
30
+ * workflow", not just "what does the workflow's own input/output look like".
13
31
  *
14
32
  * Intended use is a build script: construct an `Engine` with every workflow
15
33
  * the artifact bundles registered (never started), call
@@ -1,11 +1,13 @@
1
1
  import {
2
- buildRegistrySnapshot
3
- } from "../../core/registry-snapshot.js";
2
+ activityContractHash,
3
+ contractHash,
4
+ deriveWorkflowRevision
5
+ } from "../../core/contract/index.js";
6
+ import { buildActivityEntry } from "../../core/registry-snapshot.js";
7
+ import { buildWorkflowManifestForType } from "../../core/registry-workflow-manifest.js";
4
8
  import { WeftError } from "../../core/weft-error.js";
5
9
  import { VERSION } from "../../version.js";
6
10
  import { REMOTE_WORKER_PROTOCOL_VERSION } from "../protocol.js";
7
- import { canonicalJsonStringify } from "./canonical-json.js";
8
- import { sha256Hex } from "./content-digest.js";
9
11
  import { WORKER_MANIFEST_VERSION } from "./types.js";
10
12
 
11
13
  export class WorkerManifestBuildError extends WeftError {
@@ -13,43 +15,50 @@ export class WorkerManifestBuildError extends WeftError {
13
15
  super("WorkerManifestBuildError", message);
14
16
  }
15
17
  }
16
- function findWorkflowEntry(snapshot, workflowType) {
17
- const entry = snapshot.workflows[workflowType];
18
- if (entry === void 0)
18
+ async function findWorkflowManifest(engine, workflowType) {
19
+ const manifest = await buildWorkflowManifestForType(engine, workflowType);
20
+ if (manifest === void 0)
19
21
  throw new WorkerManifestBuildError(`Cannot build a worker manifest: workflow type "${workflowType}" is not registered on the source Engine.`);
20
- return entry;
22
+ return manifest;
21
23
  }
22
- function findActivityEntry(snapshot, workflowType, activityName) {
23
- const entry = snapshot.activities[activityName];
24
- if (entry === void 0)
24
+ function findActivityEntry(engine, workflowType, activityName) {
25
+ const metadata = engine.getWorkflowActivityDefinition(workflowType, activityName);
26
+ if (metadata === void 0)
25
27
  throw new WorkerManifestBuildError(`Cannot build a worker manifest: activity "${activityName}" declared under workflow "${workflowType}" is not registered on the source Engine.`);
26
- return entry;
28
+ return buildActivityEntry(metadata);
27
29
  }
28
- function workflowContractPayload(entry) {
29
- return {
30
- inputSchema: entry.inputSchema,
31
- outputSchema: entry.outputSchema,
32
- signals: entry.signals,
33
- updates: entry.updates,
34
- queries: entry.queries
35
- };
36
- }
37
- function activityContractPayload(entry) {
38
- return { inputSchema: entry.inputSchema, outputSchema: entry.outputSchema };
30
+ function toActivityContract(entry) {
31
+ const contract = {};
32
+ if (entry.inputSchema !== void 0)
33
+ contract.inputSchema = entry.inputSchema;
34
+ if (entry.outputSchema !== void 0)
35
+ contract.outputSchema = entry.outputSchema;
36
+ return contract;
39
37
  }
40
- async function buildActivityContract(snapshot, workflowType, activityName, implementationRevision) {
41
- const entry = findActivityEntry(snapshot, workflowType, activityName);
42
- return { contractHash: await sha256Hex(canonicalJsonStringify(activityContractPayload(entry))), implementationRevision };
38
+ async function buildActivityContract(engine, workflowType, activityName, implementationRevision) {
39
+ const entry = findActivityEntry(engine, workflowType, activityName);
40
+ return { contractHash: await activityContractHash(toActivityContract(entry)), implementationRevision };
43
41
  }
44
- async function buildWorkflowContract(snapshot, workflowVersionsByType, workflowType, activityNames, implementationRevision) {
45
- const entry = findWorkflowEntry(snapshot, workflowType), workflowVersion = workflowVersionsByType.get(workflowType), contractHash = await sha256Hex(canonicalJsonStringify(workflowContractPayload(entry))), workflowRevision = await sha256Hex(canonicalJsonStringify({ ...entry, version: workflowVersion })), sortedActivityNames = [...activityNames].toSorted(), activityContracts = await Promise.all(sortedActivityNames.map((activityName) => buildActivityContract(snapshot, workflowType, activityName, implementationRevision))), activities = {};
42
+ async function buildWorkflowContract(engine, workflowType, activityNames, implementationRevision) {
43
+ const manifest = await findWorkflowManifest(engine, workflowType), workflowVersion = manifest.contract.workflowVersion, sortedActivityNames = [...activityNames].toSorted(), activities = Object.create(null);
44
+ for (const activityName of sortedActivityNames)
45
+ activities[activityName] = toActivityContract(findActivityEntry(engine, workflowType, activityName));
46
+ const baseContract = manifest.contract, contractForHash = Object.keys(activities).length > 0 ? { ...baseContract, activities } : baseContract, [hash, revision] = await Promise.all([
47
+ contractHash(contractForHash),
48
+ deriveWorkflowRevision(contractForHash)
49
+ ]), activityContracts = await Promise.all(sortedActivityNames.map((activityName) => buildActivityContract(engine, workflowType, activityName, implementationRevision))), workerActivities = Object.create(null);
46
50
  sortedActivityNames.forEach((activityName, index) => {
47
- activities[activityName] = activityContracts[index];
51
+ workerActivities[activityName] = activityContracts[index];
48
52
  });
49
- return { workflowVersion, workflowRevision, contractHash, activities };
53
+ return {
54
+ workflowVersion,
55
+ workflowRevision: revision,
56
+ contractHash: hash,
57
+ activities: workerActivities
58
+ };
50
59
  }
51
60
  export async function buildWorkerManifestFromRegistry(engine, options) {
52
- const snapshot = buildRegistrySnapshot(engine), workflowVersionsByType = new Map(engine.listWorkflowDefinitions().map((definition) => [definition.type, definition.version])), sortedWorkflowTypes = Object.keys(options.workflows).toSorted(), workflowContracts = await Promise.all(sortedWorkflowTypes.map((workflowType) => buildWorkflowContract(snapshot, workflowVersionsByType, workflowType, options.workflows[workflowType] ?? [], options.deployment.buildId))), workflows = {};
61
+ const sortedWorkflowTypes = Object.keys(options.workflows).toSorted(), workflowContracts = await Promise.all(sortedWorkflowTypes.map((workflowType) => buildWorkflowContract(engine, workflowType, options.workflows[workflowType] ?? [], options.deployment.buildId))), workflows = Object.create(null);
53
62
  sortedWorkflowTypes.forEach((workflowType, index) => {
54
63
  workflows[workflowType] = workflowContracts[index];
55
64
  });
@@ -103,6 +103,12 @@ export type CompletedTaskResultMessage = {
103
103
  readonly value: RemoteWorkerJsonValue;
104
104
  /** Required per-dispatch token echoed from the {@link TaskMessage}. */
105
105
  readonly attemptToken: string;
106
+ /**
107
+ * Echo of {@link TaskMessage.workflowRevision} (WFT-20), when the dispatch
108
+ * carried one. Missing-or-mismatched echo authorization is transport-specific
109
+ * — see `remote-worker-protocol.md`'s revision-staleness section.
110
+ */
111
+ readonly workflowRevision?: string;
106
112
  };
107
113
  /**
108
114
  * Failed activity result message.
@@ -127,6 +133,8 @@ export type FailedTaskResultMessage = {
127
133
  readonly error: string;
128
134
  /** Required per-dispatch token echoed from the {@link TaskMessage}. */
129
135
  readonly attemptToken: string;
136
+ /** Echo of {@link TaskMessage.workflowRevision} (WFT-20) — see {@link CompletedTaskResultMessage.workflowRevision}. */
137
+ readonly workflowRevision?: string;
130
138
  };
131
139
  /**
132
140
  * Cancelled activity result message.
@@ -153,6 +161,8 @@ export type CancelledTaskResultMessage = {
153
161
  readonly cancelled?: true;
154
162
  /** Required per-dispatch token echoed from the {@link TaskMessage}. */
155
163
  readonly attemptToken: string;
164
+ /** Echo of {@link TaskMessage.workflowRevision} (WFT-20) — see {@link CompletedTaskResultMessage.workflowRevision}. */
165
+ readonly workflowRevision?: string;
156
166
  };
157
167
  /**
158
168
  * Registration acknowledgement sent after a worker is accepted.
@@ -262,6 +272,13 @@ export type TaskMessage = {
262
272
  readonly headers?: Readonly<Record<string, string>>;
263
273
  /** Durable token for the workflow run that launched this activity, when known. */
264
274
  readonly workflowExecutionToken?: string;
275
+ /**
276
+ * The dispatching workflow run's persisted revision (WFT-20), when known.
277
+ * A worker echoes this back on the resulting `taskResult`; the server
278
+ * rejects a completion whose echoed revision disagrees with the run's
279
+ * persisted revision as stale.
280
+ */
281
+ readonly workflowRevision?: string;
265
282
  /** Unique, unguessable token identifying this dispatch attempt. */
266
283
  readonly attemptToken: string;
267
284
  };
@@ -84,6 +84,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
84
84
  readonly type: "string";
85
85
  readonly minLength: 1;
86
86
  };
87
+ readonly workflowRevision: {
88
+ readonly type: "string";
89
+ readonly minLength: 1;
90
+ };
87
91
  };
88
92
  }, {
89
93
  readonly type: "object";
@@ -107,6 +111,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
107
111
  readonly type: "string";
108
112
  readonly minLength: 1;
109
113
  };
114
+ readonly workflowRevision: {
115
+ readonly type: "string";
116
+ readonly minLength: 1;
117
+ };
110
118
  };
111
119
  }, {
112
120
  readonly type: "object";
@@ -133,6 +141,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
133
141
  readonly type: "string";
134
142
  readonly minLength: 1;
135
143
  };
144
+ readonly workflowRevision: {
145
+ readonly type: "string";
146
+ readonly minLength: 1;
147
+ };
136
148
  };
137
149
  }];
138
150
  };
@@ -162,6 +174,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
162
174
  readonly type: "string";
163
175
  readonly minLength: 1;
164
176
  };
177
+ readonly workflowRevision: {
178
+ readonly type: "string";
179
+ readonly minLength: 1;
180
+ };
165
181
  readonly attemptToken: {
166
182
  readonly type: "string";
167
183
  readonly minLength: 1;
@@ -371,6 +387,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
371
387
  readonly type: "string";
372
388
  readonly minLength: 1;
373
389
  };
390
+ readonly workflowRevision: {
391
+ readonly type: "string";
392
+ readonly minLength: 1;
393
+ };
374
394
  };
375
395
  }, {
376
396
  readonly type: "object";
@@ -394,6 +414,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
394
414
  readonly type: "string";
395
415
  readonly minLength: 1;
396
416
  };
417
+ readonly workflowRevision: {
418
+ readonly type: "string";
419
+ readonly minLength: 1;
420
+ };
397
421
  };
398
422
  }, {
399
423
  readonly type: "object";
@@ -420,6 +444,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
420
444
  readonly type: "string";
421
445
  readonly minLength: 1;
422
446
  };
447
+ readonly workflowRevision: {
448
+ readonly type: "string";
449
+ readonly minLength: 1;
450
+ };
423
451
  };
424
452
  }];
425
453
  };
@@ -449,6 +477,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
449
477
  readonly type: "string";
450
478
  readonly minLength: 1;
451
479
  };
480
+ readonly workflowRevision: {
481
+ readonly type: "string";
482
+ readonly minLength: 1;
483
+ };
452
484
  readonly attemptToken: {
453
485
  readonly type: "string";
454
486
  readonly minLength: 1;
@@ -44,7 +44,8 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
44
44
  operationId: { type: "string", minLength: 1 },
45
45
  status: { const: "completed" },
46
46
  value: jsonValueSchema,
47
- attemptToken: { type: "string", minLength: 1 }
47
+ attemptToken: { type: "string", minLength: 1 },
48
+ workflowRevision: { type: "string", minLength: 1 }
48
49
  }
49
50
  },
50
51
  {
@@ -56,7 +57,8 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
56
57
  operationId: { type: "string", minLength: 1 },
57
58
  status: { const: "failed" },
58
59
  error: { type: "string" },
59
- attemptToken: { type: "string", minLength: 1 }
60
+ attemptToken: { type: "string", minLength: 1 },
61
+ workflowRevision: { type: "string", minLength: 1 }
60
62
  }
61
63
  },
62
64
  {
@@ -69,7 +71,8 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
69
71
  status: { const: "cancelled" },
70
72
  error: { type: "string" },
71
73
  cancelled: { const: !0 },
72
- attemptToken: { type: "string", minLength: 1 }
74
+ attemptToken: { type: "string", minLength: 1 },
75
+ workflowRevision: { type: "string", minLength: 1 }
73
76
  }
74
77
  }
75
78
  ]
@@ -86,6 +89,7 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
86
89
  attempt: { type: "number", minimum: 1 },
87
90
  headers: stringMapSchema,
88
91
  workflowExecutionToken: { type: "string", minLength: 1 },
92
+ workflowRevision: { type: "string", minLength: 1 },
89
93
  attemptToken: { type: "string", minLength: 1 }
90
94
  }
91
95
  },
@@ -9,6 +9,14 @@ function parseEchoedAttemptToken(record) {
9
9
  return protocolFailure("invalid_message", "taskResult.attemptToken must be a non-empty string");
10
10
  return { ok: !0, message: { attemptToken } };
11
11
  }
12
+ function parseEchoedWorkflowRevision(record) {
13
+ const workflowRevision = record.workflowRevision;
14
+ if (workflowRevision === void 0)
15
+ return { ok: !0, message: {} };
16
+ if (!isNonEmptyString(workflowRevision))
17
+ return protocolFailure("invalid_message", "taskResult.workflowRevision must be a non-empty string when present");
18
+ return { ok: !0, message: { workflowRevision } };
19
+ }
12
20
  function parseCompletedTaskResult(operationId, record) {
13
21
  const value = record.value;
14
22
  if (!isRemoteWorkerJsonValue(value))
@@ -16,9 +24,19 @@ function parseCompletedTaskResult(operationId, record) {
16
24
  const token = parseEchoedAttemptToken(record);
17
25
  if (!token.ok)
18
26
  return token;
27
+ const revision = parseEchoedWorkflowRevision(record);
28
+ if (!revision.ok)
29
+ return revision;
19
30
  return {
20
31
  ok: !0,
21
- message: { type: "taskResult", operationId, status: "completed", value, ...token.message }
32
+ message: {
33
+ type: "taskResult",
34
+ operationId,
35
+ status: "completed",
36
+ value,
37
+ ...token.message,
38
+ ...revision.message
39
+ }
22
40
  };
23
41
  }
24
42
  function parseFailedTaskResult(operationId, record) {
@@ -28,9 +46,19 @@ function parseFailedTaskResult(operationId, record) {
28
46
  const token = parseEchoedAttemptToken(record);
29
47
  if (!token.ok)
30
48
  return token;
49
+ const revision = parseEchoedWorkflowRevision(record);
50
+ if (!revision.ok)
51
+ return revision;
31
52
  return {
32
53
  ok: !0,
33
- message: { type: "taskResult", operationId, status: "failed", error, ...token.message }
54
+ message: {
55
+ type: "taskResult",
56
+ operationId,
57
+ status: "failed",
58
+ error,
59
+ ...token.message,
60
+ ...revision.message
61
+ }
34
62
  };
35
63
  }
36
64
  function parseCancelledTaskResult(operationId, record) {
@@ -43,6 +71,9 @@ function parseCancelledTaskResult(operationId, record) {
43
71
  const token = parseEchoedAttemptToken(record);
44
72
  if (!token.ok)
45
73
  return token;
74
+ const revision = parseEchoedWorkflowRevision(record);
75
+ if (!revision.ok)
76
+ return revision;
46
77
  return {
47
78
  ok: !0,
48
79
  message: {
@@ -51,7 +82,8 @@ function parseCancelledTaskResult(operationId, record) {
51
82
  status: "cancelled",
52
83
  error,
53
84
  ...cancelled === !0 ? { cancelled } : {},
54
- ...token.message
85
+ ...token.message,
86
+ ...revision.message
55
87
  }
56
88
  };
57
89
  }
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var X=import.meta.require;function l(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function p(e){if(e===null||typeof e==="string"||typeof e==="boolean"||typeof e==="number"&&Number.isFinite(e))return!0;if(Array.isArray(e))return e.every(p);if(!l(e))return!1;return Object.values(e).every(p)}function a(e){return typeof e==="string"&&e.length>0}function _(e){return Array.isArray(e)&&e.every(a)}function E(e){if(!l(e))return!1;return Object.values(e).every((t)=>typeof t==="string")}function u(e){return typeof e==="number"&&Number.isFinite(e)}function r(e,t,s){return{ok:!1,error:{code:e,message:t,...s!==void 0?{requestedProtocolVersion:s}:{}}}}function d(e,t,s){let o={};for(let[n,g,c,f]of s){let m=t[n];if(m===void 0){if(g)return{ok:!1,error:r(e,f)};continue}if(!c(m))return{ok:!1,error:r(e,f)};o[n]=m}return{ok:!0,values:o}}var i=3,M=3,O=3,T=[3];var R={$ref:"#/$defs/jsonValue"},S={type:"object",additionalProperties:R},w={type:"object",additionalProperties:{type:"string"}},P={const:i},k={register:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","manifest"],properties:{type:{const:"register"},protocolVersion:P,workerId:{type:"string",minLength:1},manifest:{type:"object"},concurrency:{type:"number",minimum:1,maximum:1000},startedAt:{type:"number"}}},heartbeat:{type:"object",additionalProperties:!1,required:["type","workerId"],properties:{type:{const:"heartbeat"},workerId:{type:"string",minLength:1}}},taskResult:{oneOf:[{type:"object",additionalProperties:!1,required:["type","operationId","status","value","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"completed"},value:R,attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"failed"},error:{type:"string"},attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"cancelled"},error:{type:"string"},cancelled:{const:!0},attemptToken:{type:"string",minLength:1}}}]},task:{type:"object",additionalProperties:!1,required:["type","operationId","activityName","input","attemptToken"],properties:{type:{const:"task"},operationId:{type:"string",minLength:1},activityName:{type:"string",minLength:1},input:R,attempt:{type:"number",minimum:1},headers:w,workflowExecutionToken:{type:"string",minLength:1},attemptToken:{type:"string",minLength:1}}},cancel:{type:"object",additionalProperties:!1,required:["type","operationId"],properties:{type:{const:"cancel"},operationId:{type:"string",minLength:1}}},shutdown:{type:"object",additionalProperties:!1,required:["type"],properties:{type:{const:"shutdown"}}},registerAck:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","queue","concurrency","acceptedManifestDigest","serverCapabilities"],properties:{type:{const:"registerAck"},protocolVersion:P,workerId:{type:"string",minLength:1},queue:{type:"string",minLength:1},concurrency:{type:"number",minimum:1,maximum:1000},acceptedManifestDigest:{type:"string",minLength:1},serverCapabilities:{type:"array",items:{type:"string",minLength:1}}}},registerError:{type:"object",additionalProperties:!1,required:["type","code","message","supportedProtocolVersions"],properties:{type:{const:"registerError"},code:{enum:["invalid_registration","unsupported_protocol_version","deployment_conflict","registration_rejected"]},message:{type:"string"},supportedProtocolVersions:{type:"array",items:{type:"number"}},requestedProtocolVersion:{type:"number"}}},protocolError:{type:"object",additionalProperties:!1,required:["type","code","message"],properties:{type:{const:"protocolError"},code:{enum:["invalid_json","invalid_message","unknown_message_type","registration_required"]},message:{type:"string"}}}},W={$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://weft.dev/schemas/remote-worker-protocol.v${String(i)}.json`,title:`Weft RemoteWorker Protocol v${String(i)}`,oneOf:Object.keys(k).map((e)=>({$ref:`#/$defs/messages/${e}`})),$defs:{jsonValue:{oneOf:[{type:"null"},{type:"boolean"},{type:"number"},{type:"string"},{type:"array",items:{$ref:"#/$defs/jsonValue"}},{type:"object",additionalProperties:{$ref:"#/$defs/jsonValue"}}]},jsonObject:S,messages:k}};function y(e){let t=e.attemptToken;if(!a(t))return r("invalid_message","taskResult.attemptToken must be a non-empty string");return{ok:!0,message:{attemptToken:t}}}function h(e,t){let s=t.value;if(!p(s))return r("invalid_message","completed taskResult.value must be valid JSON");let o=y(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"completed",value:s,...o.message}}}function v(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","failed taskResult.error must be a string");let o=y(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"failed",error:s,...o.message}}}function V(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","cancelled taskResult.error must be a string");let o=t.cancelled;if(o!==void 0&&o!==!0)return r("invalid_message","taskResult.cancelled must be true when present");let n=y(t);if(!n.ok)return n;return{ok:!0,message:{type:"taskResult",operationId:e,status:"cancelled",error:s,...o===!0?{cancelled:o}:{},...n.message}}}var I={completed:h,failed:v,cancelled:V};function C(e){return e==="completed"||e==="failed"||e==="cancelled"}function b(e){let t=e.operationId;if(!a(t))return r("invalid_message","taskResult.operationId must be a non-empty string");let s=e.status;if(!C(s))return r("invalid_message","taskResult.status must be completed, failed, or cancelled");return I[s](t,e)}var j=new Set(["register","heartbeat","taskResult"]),A=new Set(["registerAck","registerError","protocolError","task","cancel","shutdown"]);function L(e){if(e===i)return{ok:!0,message:e};let t=u(e)?e:void 0;return r("unsupported_protocol_version",`Unsupported RemoteWorker protocol version: ${String(e)}`,t)}var N=[["workerId",!0,a,"register.workerId must be a non-empty string"],["manifest",!0,l,"register.manifest must be a JSON object"],["concurrency",!1,u,"register.concurrency must be a finite number"],["startedAt",!1,u,"register.startedAt must be a finite number when present"]];function x(e){let t=L(e.protocolVersion);if(!t.ok)return t;let s=d("invalid_registration",e,N);if(!s.ok)return s.error;return{ok:!0,message:{type:"register",protocolVersion:t.message,...s.values}}}function F(e){let t=e.workerId;if(!a(t))return r("invalid_message","heartbeat.workerId must be a non-empty string");return{ok:!0,message:{type:"heartbeat",workerId:t}}}var q=[["operationId",!0,a,"task.operationId must be a non-empty string"],["activityName",!0,a,"task.activityName must be a non-empty string"],["input",!0,p,"task.input must be valid JSON"],["attempt",!1,u,"task.attempt must be a finite number"],["headers",!1,E,"task.headers must be a string map"],["workflowExecutionToken",!1,a,"task.workflowExecutionToken must be a non-empty string"],["attemptToken",!0,a,"task.attemptToken must be a non-empty string"]];function J(e){let t=d("invalid_message",e,q);if(!t.ok)return t.error;return{ok:!0,message:{type:"task",...t.values}}}function K(e){let t=e.operationId;if(!a(t))return r("invalid_message","cancel.operationId must be a non-empty string");return{ok:!0,message:{type:"cancel",operationId:t}}}function D(){return{ok:!0,message:{type:"shutdown"}}}function H(e){let t=e.protocolVersion;if(t!==i)return r("invalid_message",`registerAck.protocolVersion must be ${String(i)}`);let{workerId:s,queue:o,concurrency:n,acceptedManifestDigest:g,serverCapabilities:c}=e;if(!a(s))return r("invalid_message","registerAck.workerId must be a non-empty string");if(!a(o))return r("invalid_message","registerAck.queue must be a non-empty string");if(typeof n!=="number"||!Number.isFinite(n))return r("invalid_message","registerAck.concurrency must be a finite number");if(!a(g))return r("invalid_message","registerAck.acceptedManifestDigest must be a non-empty string");if(!_(c))return r("invalid_message","registerAck.serverCapabilities must be an array of non-empty strings");return{ok:!0,message:{type:"registerAck",protocolVersion:t,workerId:s,queue:o,concurrency:n,acceptedManifestDigest:g,serverCapabilities:c}}}function U(e){return e==="invalid_registration"||e==="unsupported_protocol_version"||e==="deployment_conflict"||e==="registration_rejected"}function G(e){let{code:t,message:s,supportedProtocolVersions:o,requestedProtocolVersion:n}=e;if(!U(t))return r("invalid_message","registerError.code is not recognized");if(typeof s!=="string")return r("invalid_message","registerError.message must be a string");if(!Array.isArray(o)||!o.every((c)=>u(c)))return r("invalid_message","registerError.supportedProtocolVersions is invalid");if(n!==void 0&&!u(n))return r("invalid_message","registerError.requestedProtocolVersion must be a finite number");return{ok:!0,message:{type:"registerError",code:t,message:s,supportedProtocolVersions:o,...n!==void 0?{requestedProtocolVersion:n}:{}}}}function z(e){let{code:t,message:s}=e;if(t!=="invalid_json"&&t!=="invalid_message"&&t!=="unknown_message_type"&&t!=="registration_required")return r("invalid_message","protocolError.code is not recognized");if(typeof s!=="string")return r("invalid_message","protocolError.message must be a string");return{ok:!0,message:{type:"protocolError",code:t,message:s}}}function ie(e){if(!l(e))return r("invalid_message","Worker protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Worker protocol message.type must be a string");if(!j.has(t))return r("unknown_message_type",`Unknown worker message type: ${t}`);switch(t){case"register":return x(e);case"heartbeat":return F(e);case"taskResult":return b(e);default:return r("unknown_message_type",`Unknown worker message type: ${t}`)}}function ue(e){if(!l(e))return r("invalid_message","Server protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Server protocol message.type must be a string");if(!A.has(t))return r("unknown_message_type",`Unknown server message type: ${t}`);switch(t){case"registerAck":return H(e);case"registerError":return G(e);case"protocolError":return z(e);case"task":return J(e);case"cancel":return K(e);case"shutdown":return D();default:return r("unknown_message_type",`Unknown server message type: ${t}`)}}export{O as REMOTE_WORKER_MAX_PROTOCOL_VERSION,k as REMOTE_WORKER_MESSAGE_SCHEMAS,M as REMOTE_WORKER_MIN_PROTOCOL_VERSION,W as REMOTE_WORKER_PROTOCOL_JSON_SCHEMA,i as REMOTE_WORKER_PROTOCOL_VERSION,T as REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS,p as isRemoteWorkerJsonValue,ue as parseServerToWorkerMessage,ie as parseWorkerToServerMessage};
2
+ var Y=import.meta.require;function g(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function p(e){if(e===null||typeof e==="string"||typeof e==="boolean"||typeof e==="number"&&Number.isFinite(e))return!0;if(Array.isArray(e))return e.every(p);if(!g(e))return!1;return Object.values(e).every(p)}function i(e){return typeof e==="string"&&e.length>0}function E(e){return Array.isArray(e)&&e.every(i)}function P(e){if(!g(e))return!1;return Object.values(e).every((t)=>typeof t==="string")}function c(e){return typeof e==="number"&&Number.isFinite(e)}function r(e,t,s){return{ok:!1,error:{code:e,message:t,...s!==void 0?{requestedProtocolVersion:s}:{}}}}function d(e,t,s){let n={};for(let[o,a,l,_]of s){let m=t[o];if(m===void 0){if(a)return{ok:!1,error:r(e,_)};continue}if(!l(m))return{ok:!1,error:r(e,_)};n[o]=m}return{ok:!0,values:n}}var u=3,O=3,w=3,T=[3];var k={$ref:"#/$defs/jsonValue"},S={type:"object",additionalProperties:k},v={type:"object",additionalProperties:{type:"string"}},b={const:u},R={register:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","manifest"],properties:{type:{const:"register"},protocolVersion:b,workerId:{type:"string",minLength:1},manifest:{type:"object"},concurrency:{type:"number",minimum:1,maximum:1000},startedAt:{type:"number"}}},heartbeat:{type:"object",additionalProperties:!1,required:["type","workerId"],properties:{type:{const:"heartbeat"},workerId:{type:"string",minLength:1}}},taskResult:{oneOf:[{type:"object",additionalProperties:!1,required:["type","operationId","status","value","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"completed"},value:k,attemptToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"failed"},error:{type:"string"},attemptToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"cancelled"},error:{type:"string"},cancelled:{const:!0},attemptToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1}}}]},task:{type:"object",additionalProperties:!1,required:["type","operationId","activityName","input","attemptToken"],properties:{type:{const:"task"},operationId:{type:"string",minLength:1},activityName:{type:"string",minLength:1},input:k,attempt:{type:"number",minimum:1},headers:v,workflowExecutionToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1},attemptToken:{type:"string",minLength:1}}},cancel:{type:"object",additionalProperties:!1,required:["type","operationId"],properties:{type:{const:"cancel"},operationId:{type:"string",minLength:1}}},shutdown:{type:"object",additionalProperties:!1,required:["type"],properties:{type:{const:"shutdown"}}},registerAck:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","queue","concurrency","acceptedManifestDigest","serverCapabilities"],properties:{type:{const:"registerAck"},protocolVersion:b,workerId:{type:"string",minLength:1},queue:{type:"string",minLength:1},concurrency:{type:"number",minimum:1,maximum:1000},acceptedManifestDigest:{type:"string",minLength:1},serverCapabilities:{type:"array",items:{type:"string",minLength:1}}}},registerError:{type:"object",additionalProperties:!1,required:["type","code","message","supportedProtocolVersions"],properties:{type:{const:"registerError"},code:{enum:["invalid_registration","unsupported_protocol_version","deployment_conflict","registration_rejected"]},message:{type:"string"},supportedProtocolVersions:{type:"array",items:{type:"number"}},requestedProtocolVersion:{type:"number"}}},protocolError:{type:"object",additionalProperties:!1,required:["type","code","message"],properties:{type:{const:"protocolError"},code:{enum:["invalid_json","invalid_message","unknown_message_type","registration_required"]},message:{type:"string"}}}},W={$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://weft.dev/schemas/remote-worker-protocol.v${String(u)}.json`,title:`Weft RemoteWorker Protocol v${String(u)}`,oneOf:Object.keys(R).map((e)=>({$ref:`#/$defs/messages/${e}`})),$defs:{jsonValue:{oneOf:[{type:"null"},{type:"boolean"},{type:"number"},{type:"string"},{type:"array",items:{$ref:"#/$defs/jsonValue"}},{type:"object",additionalProperties:{$ref:"#/$defs/jsonValue"}}]},jsonObject:S,messages:R}};function y(e){let t=e.attemptToken;if(!i(t))return r("invalid_message","taskResult.attemptToken must be a non-empty string");return{ok:!0,message:{attemptToken:t}}}function f(e){let t=e.workflowRevision;if(t===void 0)return{ok:!0,message:{}};if(!i(t))return r("invalid_message","taskResult.workflowRevision must be a non-empty string when present");return{ok:!0,message:{workflowRevision:t}}}function h(e,t){let s=t.value;if(!p(s))return r("invalid_message","completed taskResult.value must be valid JSON");let n=y(t);if(!n.ok)return n;let o=f(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"completed",value:s,...n.message,...o.message}}}function V(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","failed taskResult.error must be a string");let n=y(t);if(!n.ok)return n;let o=f(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"failed",error:s,...n.message,...o.message}}}function I(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","cancelled taskResult.error must be a string");let n=t.cancelled;if(n!==void 0&&n!==!0)return r("invalid_message","taskResult.cancelled must be true when present");let o=y(t);if(!o.ok)return o;let a=f(t);if(!a.ok)return a;return{ok:!0,message:{type:"taskResult",operationId:e,status:"cancelled",error:s,...n===!0?{cancelled:n}:{},...o.message,...a.message}}}var C={completed:h,failed:V,cancelled:I};function j(e){return e==="completed"||e==="failed"||e==="cancelled"}function M(e){let t=e.operationId;if(!i(t))return r("invalid_message","taskResult.operationId must be a non-empty string");let s=e.status;if(!j(s))return r("invalid_message","taskResult.status must be completed, failed, or cancelled");return C[s](t,e)}var A=new Set(["register","heartbeat","taskResult"]),L=new Set(["registerAck","registerError","protocolError","task","cancel","shutdown"]);function N(e){if(e===u)return{ok:!0,message:e};let t=c(e)?e:void 0;return r("unsupported_protocol_version",`Unsupported RemoteWorker protocol version: ${String(e)}`,t)}var x=[["workerId",!0,i,"register.workerId must be a non-empty string"],["manifest",!0,g,"register.manifest must be a JSON object"],["concurrency",!1,c,"register.concurrency must be a finite number"],["startedAt",!1,c,"register.startedAt must be a finite number when present"]];function F(e){let t=N(e.protocolVersion);if(!t.ok)return t;let s=d("invalid_registration",e,x);if(!s.ok)return s.error;return{ok:!0,message:{type:"register",protocolVersion:t.message,...s.values}}}function q(e){let t=e.workerId;if(!i(t))return r("invalid_message","heartbeat.workerId must be a non-empty string");return{ok:!0,message:{type:"heartbeat",workerId:t}}}var J=[["operationId",!0,i,"task.operationId must be a non-empty string"],["activityName",!0,i,"task.activityName must be a non-empty string"],["input",!0,p,"task.input must be valid JSON"],["attempt",!1,c,"task.attempt must be a finite number"],["headers",!1,P,"task.headers must be a string map"],["workflowExecutionToken",!1,i,"task.workflowExecutionToken must be a non-empty string"],["workflowRevision",!1,i,"task.workflowRevision must be a non-empty string"],["attemptToken",!0,i,"task.attemptToken must be a non-empty string"]];function K(e){let t=d("invalid_message",e,J);if(!t.ok)return t.error;return{ok:!0,message:{type:"task",...t.values}}}function D(e){let t=e.operationId;if(!i(t))return r("invalid_message","cancel.operationId must be a non-empty string");return{ok:!0,message:{type:"cancel",operationId:t}}}function H(){return{ok:!0,message:{type:"shutdown"}}}function U(e){let t=e.protocolVersion;if(t!==u)return r("invalid_message",`registerAck.protocolVersion must be ${String(u)}`);let{workerId:s,queue:n,concurrency:o,acceptedManifestDigest:a,serverCapabilities:l}=e;if(!i(s))return r("invalid_message","registerAck.workerId must be a non-empty string");if(!i(n))return r("invalid_message","registerAck.queue must be a non-empty string");if(typeof o!=="number"||!Number.isFinite(o))return r("invalid_message","registerAck.concurrency must be a finite number");if(!i(a))return r("invalid_message","registerAck.acceptedManifestDigest must be a non-empty string");if(!E(l))return r("invalid_message","registerAck.serverCapabilities must be an array of non-empty strings");return{ok:!0,message:{type:"registerAck",protocolVersion:t,workerId:s,queue:n,concurrency:o,acceptedManifestDigest:a,serverCapabilities:l}}}function G(e){return e==="invalid_registration"||e==="unsupported_protocol_version"||e==="deployment_conflict"||e==="registration_rejected"}function z(e){let{code:t,message:s,supportedProtocolVersions:n,requestedProtocolVersion:o}=e;if(!G(t))return r("invalid_message","registerError.code is not recognized");if(typeof s!=="string")return r("invalid_message","registerError.message must be a string");if(!Array.isArray(n)||!n.every((l)=>c(l)))return r("invalid_message","registerError.supportedProtocolVersions is invalid");if(o!==void 0&&!c(o))return r("invalid_message","registerError.requestedProtocolVersion must be a finite number");return{ok:!0,message:{type:"registerError",code:t,message:s,supportedProtocolVersions:n,...o!==void 0?{requestedProtocolVersion:o}:{}}}}function X(e){let{code:t,message:s}=e;if(t!=="invalid_json"&&t!=="invalid_message"&&t!=="unknown_message_type"&&t!=="registration_required")return r("invalid_message","protocolError.code is not recognized");if(typeof s!=="string")return r("invalid_message","protocolError.message must be a string");return{ok:!0,message:{type:"protocolError",code:t,message:s}}}function ue(e){if(!g(e))return r("invalid_message","Worker protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Worker protocol message.type must be a string");if(!A.has(t))return r("unknown_message_type",`Unknown worker message type: ${t}`);switch(t){case"register":return F(e);case"heartbeat":return q(e);case"taskResult":return M(e);default:return r("unknown_message_type",`Unknown worker message type: ${t}`)}}function ce(e){if(!g(e))return r("invalid_message","Server protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Server protocol message.type must be a string");if(!L.has(t))return r("unknown_message_type",`Unknown server message type: ${t}`);switch(t){case"registerAck":return U(e);case"registerError":return z(e);case"protocolError":return X(e);case"task":return K(e);case"cancel":return D(e);case"shutdown":return H();default:return r("unknown_message_type",`Unknown server message type: ${t}`)}}export{w as REMOTE_WORKER_MAX_PROTOCOL_VERSION,R as REMOTE_WORKER_MESSAGE_SCHEMAS,O as REMOTE_WORKER_MIN_PROTOCOL_VERSION,W as REMOTE_WORKER_PROTOCOL_JSON_SCHEMA,u as REMOTE_WORKER_PROTOCOL_VERSION,T as REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS,p as isRemoteWorkerJsonValue,ce as parseServerToWorkerMessage,ue as parseWorkerToServerMessage};
@@ -125,6 +125,8 @@ export interface InFlightTask {
125
125
  fairShareKey?: string;
126
126
  /** Unique, unguessable token for this dispatch attempt. */
127
127
  attemptToken: string;
128
+ /** The dispatching workflow run's persisted revision (WFT-20), when the `TaskDispatch` carried one. */
129
+ workflowRevision?: string;
128
130
  }
129
131
  export interface WorkerRegistryOptions {
130
132
  /** Routing policy used by {@link WorkerRegistry.findWorker}. Default: `'least-loaded'`. */
@@ -76,7 +76,7 @@ export declare class WorkerRegistry {
76
76
  */
77
77
  findWorker(activityName: string, options?: RoutingOptions): WorkerInfo | undefined;
78
78
  /** Track a task assignment with a visibility timeout deadline. */
79
- assignTask(workerId: string, operationId: string, visibilityTimeout: number, fairShareKey: string | undefined, attemptToken: string): void;
79
+ assignTask(workerId: string, operationId: string, visibilityTimeout: number, fairShareKey: string | undefined, attemptToken: string, workflowRevision?: string): void;
80
80
  /**
81
81
  * Undo exactly `assignTask`'s effects — capacity increment, fair-share
82
82
  * count, and the in-flight entry — when the durable claim that was
@@ -132,7 +132,7 @@ export class WorkerRegistry {
132
132
  return pickFairShare(eligible, this.#fairShareCounts, fairShareKey);
133
133
  return pickLeastLoaded(eligible);
134
134
  }
135
- assignTask(workerId, operationId, visibilityTimeout, fairShareKey, attemptToken) {
135
+ assignTask(workerId, operationId, visibilityTimeout, fairShareKey, attemptToken, workflowRevision) {
136
136
  const deadline = Date.now() + visibilityTimeout, task = {
137
137
  operationId,
138
138
  workerId,
@@ -144,6 +144,8 @@ export class WorkerRegistry {
144
144
  task.fairShareKey = fairShareKey;
145
145
  this.#fairShareCounts.increment(workerId, fairShareKey);
146
146
  }
147
+ if (workflowRevision !== void 0)
148
+ task.workflowRevision = workflowRevision;
147
149
  this.#inFlightTasks.set(operationId, task);
148
150
  this.taskAssigned(workerId);
149
151
  }
@@ -42,6 +42,14 @@ export interface WorkflowRunnerContext {
42
42
  generators: Map<string, AsyncGenerator>;
43
43
  abortControllers: Map<string, AbortController>;
44
44
  replayStates: Map<string, WorkerReplayState>;
45
+ /**
46
+ * The revision (WFT-20) captured from the `run` message that started this
47
+ * workflow, keyed by workflow id — a `resume` inbound message never
48
+ * re-sends it, so `workflow-worker-entry.ts`'s `attachWorkerProtocol` reads
49
+ * it from here to stamp every outbound message for the workflow's
50
+ * remaining turns.
51
+ */
52
+ workflowRevisions: Map<string, string>;
45
53
  }
46
54
  export declare function createWorkflowRunnerContext(): WorkflowRunnerContext;
47
55
  export declare function handleRunMessage(context: WorkflowRunnerContext, message: {
@@ -53,6 +61,7 @@ export declare function handleRunMessage(context: WorkflowRunnerContext, message
53
61
  executionStateOwnerId?: string;
54
62
  deadline?: number;
55
63
  headers?: [string, string][];
64
+ workflowRevision?: string;
56
65
  }, getWorkflowHandler: (type: string) => ((ctx: WorkerWorkflowContext, input: unknown) => AsyncGenerator) | undefined, postLog?: WorkerLogPoster): Promise<WorkerOutboundMessage>;
57
66
  export declare function handleResumeMessage(context: WorkflowRunnerContext, message: {
58
67
  workflowId: string;
@@ -77,10 +77,15 @@ export function createWorkflowRunnerContext() {
77
77
  return {
78
78
  generators: new Map,
79
79
  abortControllers: new Map,
80
- replayStates: new Map
80
+ replayStates: new Map,
81
+ workflowRevisions: new Map
81
82
  };
82
83
  }
83
84
  export async function handleRunMessage(context, message, getWorkflowHandler, postLog) {
85
+ if (message.workflowRevision !== void 0)
86
+ context.workflowRevisions.set(message.workflowId, message.workflowRevision);
87
+ else
88
+ context.workflowRevisions.delete(message.workflowId);
84
89
  const handler = getWorkflowHandler(message.workflowType);
85
90
  if (!handler)
86
91
  return {
@@ -152,8 +157,10 @@ export async function handleCancelMessage(context, message) {
152
157
  try {
153
158
  await capturedGenerator.return(void 0);
154
159
  } catch {}
155
- if (context.generators.get(message.workflowId) === capturedGenerator)
160
+ if (context.generators.get(message.workflowId) === capturedGenerator) {
156
161
  context.generators.delete(message.workflowId);
162
+ context.workflowRevisions.delete(message.workflowId);
163
+ }
157
164
  if (context.abortControllers.get(message.workflowId) === capturedController)
158
165
  context.abortControllers.delete(message.workflowId);
159
166
  if (context.replayStates.get(message.workflowId) === capturedReplayState)
@@ -49,7 +49,9 @@ export function initializeWorkerMessageLoop(workflows) {
49
49
  });
50
50
  }
51
51
  function postOutboundMessage(runnerContext, message, inboundMessage) {
52
- const outboundMessage = attachWorkerProtocol(message, inboundMessage);
52
+ const activeTurnRevision = runnerContext.workflowRevisions.get(inboundMessage.workflowId), outboundMessage = attachWorkerProtocol(runnerContext, message, inboundMessage);
53
+ if (outboundMessage.type === "completed" || outboundMessage.type === "failed")
54
+ runnerContext.workflowRevisions.delete(inboundMessage.workflowId);
53
55
  try {
54
56
  assertWorkerProtocolMessageWithinLimit(outboundMessage, inboundMessage.maxProtocolMessageBytes);
55
57
  if (outboundMessage.type === "checkpoint")
@@ -62,7 +64,8 @@ function postOutboundMessage(runnerContext, message, inboundMessage) {
62
64
  workflowId: inboundMessage.workflowId,
63
65
  error: error instanceof Error ? error.message : String(error),
64
66
  failureCategory: "resource",
65
- ...inboundMessage.turnId === void 0 ? {} : { turnId: inboundMessage.turnId }
67
+ ...inboundMessage.turnId === void 0 ? {} : { turnId: inboundMessage.turnId },
68
+ ...activeTurnRevision === void 0 ? {} : { workflowRevision: activeTurnRevision }
66
69
  });
67
70
  try {
68
71
  workerPostMessage(failedMessage);
@@ -71,10 +74,12 @@ function postOutboundMessage(runnerContext, message, inboundMessage) {
71
74
  }
72
75
  }
73
76
  }
74
- function attachWorkerProtocol(message, inboundMessage) {
77
+ function attachWorkerProtocol(runnerContext, message, inboundMessage) {
78
+ const workflowRevision = runnerContext.workflowRevisions.get(inboundMessage.workflowId);
75
79
  return {
76
80
  ...message,
77
81
  protocolVersion: WORKER_PROTOCOL_VERSION,
78
- ...inboundMessage.turnId === void 0 ? {} : { turnId: inboundMessage.turnId }
82
+ ...inboundMessage.turnId === void 0 ? {} : { turnId: inboundMessage.turnId },
83
+ ...workflowRevision === void 0 ? {} : { workflowRevision }
79
84
  };
80
85
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lostgradient/weft",
3
- "version": "0.23.1",
3
+ "version": "0.24.1",
4
4
  "description": "A Bun-native durable execution engine with pluggable key-value storage.",
5
5
  "keywords": [
6
6
  "bun",
@@ -221,7 +221,7 @@
221
221
  "dev": "bun --watch run src/index.ts",
222
222
  "format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"",
223
223
  "format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\"",
224
- "lint": "oxlint --type-aware --tsconfig ./tsconfig.json --report-unused-disable-directives-severity=error && bun run scripts/check-lint-disables.ts && bun run scripts/check-implementation-file-sizes.ts && bun run scripts/check-import-cycles.ts && bun run scripts/check-internal-imports.ts && bun run scripts/check-engine-internals-field-access.ts && bun run scripts/check-definition-vocabulary.ts && bun run scripts/check-catalog-completeness.ts && bun run scripts/check-catalog-drift.ts && bun run scripts/check-type-ergonomics.ts",
224
+ "lint": "oxlint --type-aware --tsconfig ./tsconfig.json --report-unused-disable-directives-severity=error && bun run scripts/check-lint-disables.ts && bun run scripts/check-implementation-file-sizes.ts && bun run scripts/check-import-cycles.ts && bun run scripts/check-internal-imports.ts && bun run scripts/check-engine-internals-field-access.ts && bun run scripts/check-revision-keyed-lookups.ts && bun run scripts/check-definition-vocabulary.ts && bun run scripts/check-catalog-completeness.ts && bun run scripts/check-catalog-drift.ts && bun run scripts/check-type-ergonomics.ts",
225
225
  "lint:fix": "oxlint --fix --type-aware --tsconfig ./tsconfig.json",
226
226
  "markdown-doctests:inventory": "bun run scripts/extract-markdown-doctests.ts inventory",
227
227
  "prepack": "bun run scripts/run-gates.ts prepack",