@lostgradient/weft 0.24.0 → 0.24.2

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 (283) hide show
  1. package/README.md +2 -2
  2. package/dist/cli/conformance.js +5 -2
  3. package/dist/cli/generated/operation-catalog.snapshot.json +95 -1
  4. package/dist/cli/generated/operation-client.generated.d.ts +28 -2
  5. package/dist/cli/generated/operation-client.generated.js +2 -0
  6. package/dist/cli/parse-schedule-arguments.js +15 -3
  7. package/dist/cli/schedule.js +2 -1
  8. package/dist/cli/types.d.ts +2 -1
  9. package/dist/client/http-client-requests.js +6 -9
  10. package/dist/client/start-body.js +1 -0
  11. package/dist/core/catalog/index.d.ts +2 -2
  12. package/dist/core/catalog/index.js +9 -2
  13. package/dist/core/catalog/reference-counts.d.ts +29 -14
  14. package/dist/core/catalog/removal.d.ts +63 -10
  15. package/dist/core/catalog/removal.js +18 -2
  16. package/dist/core/catalog/storage-io.d.ts +23 -0
  17. package/dist/core/catalog/storage-io.js +1 -1
  18. package/dist/core/engine/activity-resolution.js +17 -17
  19. package/dist/core/engine/bulk-operations-purge.d.ts +1 -1
  20. package/dist/core/engine/bulk-operations-purge.js +17 -22
  21. package/dist/core/engine/bulk-operations-retry.d.ts +24 -0
  22. package/dist/core/engine/bulk-operations-retry.js +190 -0
  23. package/dist/core/engine/bulk-operations-shared.d.ts +18 -0
  24. package/dist/core/engine/bulk-operations-shared.js +14 -0
  25. package/dist/core/engine/bulk-operations.d.ts +3 -2
  26. package/dist/core/engine/bulk-operations.js +10 -169
  27. package/dist/core/engine/callback-creators-bundles.js +5 -3
  28. package/dist/core/engine/callback-creators-core.js +9 -1
  29. package/dist/core/engine/callback-creators-schedule.js +2 -2
  30. package/dist/core/engine/catalog-readiness.js +2 -0
  31. package/dist/core/engine/catalog-removal.d.ts +107 -3
  32. package/dist/core/engine/catalog-removal.js +66 -13
  33. package/dist/core/engine/catalog-tombstone-recovery.d.ts +56 -0
  34. package/dist/core/engine/catalog-tombstone-recovery.js +39 -0
  35. package/dist/core/engine/child-workflow.d.ts +13 -1
  36. package/dist/core/engine/child-workflow.js +22 -4
  37. package/dist/core/engine/constraints.js +5 -1
  38. package/dist/core/engine/construction.d.ts +1 -1
  39. package/dist/core/engine/decode-revision.d.ts +32 -0
  40. package/dist/core/engine/decode-revision.js +9 -0
  41. package/dist/core/engine/disposal.d.ts +6 -2
  42. package/dist/core/engine/disposal.js +24 -10
  43. package/dist/core/engine/dynamic-source-errors.d.ts +81 -0
  44. package/dist/core/engine/dynamic-source-errors.js +25 -0
  45. package/dist/core/engine/dynamic-source-execution.d.ts +173 -0
  46. package/dist/core/engine/dynamic-source-execution.js +108 -0
  47. package/dist/core/engine/engine-internal-types.d.ts +16 -0
  48. package/dist/core/engine/engine-workflows-namespace.d.ts +10 -0
  49. package/dist/core/engine/engine-workflows-namespace.js +3 -1
  50. package/dist/core/engine/generation-codec.d.ts +22 -0
  51. package/dist/core/engine/generation-codec.js +2 -0
  52. package/dist/core/engine/index.d.ts +18 -10
  53. package/dist/core/engine/index.js +22 -11
  54. package/dist/core/engine/inline-launch-queue.js +1 -1
  55. package/dist/core/engine/internals.d.ts +26 -30
  56. package/dist/core/engine/lifecycle/checkpoint-launch.d.ts +29 -0
  57. package/dist/core/engine/lifecycle/checkpoint-launch.js +75 -0
  58. package/dist/core/engine/lifecycle/delayed-start-registration.d.ts +30 -0
  59. package/dist/core/engine/lifecycle/delayed-start-registration.js +11 -0
  60. package/dist/core/engine/lifecycle/fork-helpers.d.ts +33 -1
  61. package/dist/core/engine/lifecycle/fork-helpers.js +3 -1
  62. package/dist/core/engine/lifecycle/recovery-isolation.d.ts +20 -0
  63. package/dist/core/engine/lifecycle/recovery-isolation.js +26 -0
  64. package/dist/core/engine/lifecycle/recovery-revision-groups.d.ts +75 -0
  65. package/dist/core/engine/lifecycle/recovery-revision-groups.js +64 -0
  66. package/dist/core/engine/lifecycle/resume-body.d.ts +44 -0
  67. package/dist/core/engine/lifecycle/resume-body.js +211 -0
  68. package/dist/core/engine/lifecycle/resume-generation-guard.d.ts +58 -0
  69. package/dist/core/engine/lifecycle/resume-generation-guard.js +11 -0
  70. package/dist/core/engine/lifecycle/resume.d.ts +46 -3
  71. package/dist/core/engine/lifecycle/resume.js +21 -201
  72. package/dist/core/engine/lifecycle/shared.d.ts +43 -0
  73. package/dist/core/engine/lifecycle/standalone-claim-acquire.d.ts +80 -2
  74. package/dist/core/engine/lifecycle/standalone-claim-acquire.js +20 -4
  75. package/dist/core/engine/lifecycle/start-commit-errors.d.ts +12 -0
  76. package/dist/core/engine/lifecycle/start-commit-errors.js +6 -0
  77. package/dist/core/engine/lifecycle/start-commit.d.ts +24 -7
  78. package/dist/core/engine/lifecycle/start-commit.js +57 -15
  79. package/dist/core/engine/lifecycle/start-exec.d.ts +18 -2
  80. package/dist/core/engine/lifecycle/start-exec.js +7 -5
  81. package/dist/core/engine/lifecycle/start-or-signal-create.js +1 -3
  82. package/dist/core/engine/lifecycle/start-or-signal-resolution.d.ts +8 -2
  83. package/dist/core/engine/lifecycle/start-or-signal-resolution.js +11 -3
  84. package/dist/core/engine/lifecycle/start-or-signal.js +1 -1
  85. package/dist/core/engine/lifecycle/start-precondition-attribution.d.ts +55 -0
  86. package/dist/core/engine/lifecycle/start-precondition-attribution.js +13 -0
  87. package/dist/core/engine/lifecycle/start-revision-resolution.d.ts +34 -0
  88. package/dist/core/engine/lifecycle/start-revision-resolution.js +11 -0
  89. package/dist/core/engine/lifecycle/start-schedule-timing.d.ts +11 -0
  90. package/dist/core/engine/lifecycle/start-schedule-timing.js +21 -0
  91. package/dist/core/engine/lifecycle/start-state.d.ts +16 -0
  92. package/dist/core/engine/lifecycle/start-state.js +60 -0
  93. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +146 -4
  94. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +33 -4
  95. package/dist/core/engine/lifecycle/start.d.ts +54 -7
  96. package/dist/core/engine/lifecycle/start.js +53 -90
  97. package/dist/core/engine/lifecycle/transition.d.ts +12 -4
  98. package/dist/core/engine/lifecycle/transition.js +40 -95
  99. package/dist/core/engine/lifecycle.d.ts +5 -2
  100. package/dist/core/engine/lifecycle.js +7 -6
  101. package/dist/core/engine/listing.js +15 -1
  102. package/dist/core/engine/memo-durable-activity.js +4 -1
  103. package/dist/core/engine/nonterminal-revision-count.d.ts +25 -0
  104. package/dist/core/engine/nonterminal-revision-count.js +16 -0
  105. package/dist/core/engine/operations-time.d.ts +5 -23
  106. package/dist/core/engine/operations-time.js +13 -11
  107. package/dist/core/engine/ownership-bootstrap.d.ts +1 -1
  108. package/dist/core/engine/pinned-schedule-revision-count.d.ts +26 -0
  109. package/dist/core/engine/pinned-schedule-revision-count.js +19 -0
  110. package/dist/core/engine/pinned-schedule-revision.d.ts +76 -0
  111. package/dist/core/engine/pinned-schedule-revision.js +53 -0
  112. package/dist/core/engine/registration.d.ts +30 -0
  113. package/dist/core/engine/registration.js +17 -2
  114. package/dist/core/engine/retention.js +9 -2
  115. package/dist/core/engine/revision-errors.d.ts +71 -0
  116. package/dist/core/engine/revision-errors.js +13 -0
  117. package/dist/core/engine/schedule-overlap.js +2 -1
  118. package/dist/core/engine/schedule-revision-fire.d.ts +17 -0
  119. package/dist/core/engine/schedule-revision-fire.js +3 -0
  120. package/dist/core/engine/schedule-run.d.ts +10 -0
  121. package/dist/core/engine/schedule-run.js +2 -1
  122. package/dist/core/engine/schedules.d.ts +11 -1
  123. package/dist/core/engine/schedules.js +28 -9
  124. package/dist/core/engine/source-diagnostics.d.ts +76 -0
  125. package/dist/core/engine/source-diagnostics.js +105 -0
  126. package/dist/core/engine/source-registration.js +4 -2
  127. package/dist/core/engine/source-resolution.d.ts +25 -9
  128. package/dist/core/engine/source-resolution.js +49 -14
  129. package/dist/core/engine/source-runtime-state.d.ts +92 -0
  130. package/dist/core/engine/source-runtime-state.js +36 -0
  131. package/dist/core/engine/storage-io.d.ts +19 -2
  132. package/dist/core/engine/storage-io.js +21 -2
  133. package/dist/core/engine/termination/complete.js +1 -1
  134. package/dist/core/engine/termination/finalizer-registration.d.ts +18 -0
  135. package/dist/core/engine/termination/finalizer-registration.js +21 -0
  136. package/dist/core/engine/termination/finalizer.d.ts +16 -19
  137. package/dist/core/engine/termination/finalizer.js +3 -3
  138. package/dist/core/engine/termination/suspend.js +3 -0
  139. package/dist/core/engine/time-operation-callbacks.d.ts +32 -0
  140. package/dist/core/engine/time-operation-callbacks.js +0 -0
  141. package/dist/core/engine/validation/schedule-cadence.d.ts +16 -0
  142. package/dist/core/engine/validation/schedule-cadence.js +20 -0
  143. package/dist/core/engine/validation/schedule-options.d.ts +4 -1
  144. package/dist/core/engine/validation/schedule-options.js +14 -0
  145. package/dist/core/engine/validation/schedule-revision.d.ts +24 -0
  146. package/dist/core/engine/validation/schedule-revision.js +21 -0
  147. package/dist/core/engine/validation/schedule-warnings.d.ts +11 -0
  148. package/dist/core/engine/validation/schedule-warnings.js +5 -0
  149. package/dist/core/engine/validation/schedule.d.ts +29 -4
  150. package/dist/core/engine/validation/schedule.js +19 -36
  151. package/dist/core/engine/validation.js +13 -17
  152. package/dist/core/engine/workflow-claim-reclaim-target.d.ts +1 -1
  153. package/dist/core/engine/workflow-claim-reclaim-target.js +22 -8
  154. package/dist/core/engine/workflow-claim-registry.d.ts +79 -75
  155. package/dist/core/engine/workflow-claim-registry.js +15 -2
  156. package/dist/core/engine/workflow-generation-fence.d.ts +74 -0
  157. package/dist/core/engine/workflow-generation-fence.js +19 -0
  158. package/dist/core/engine/workflow-retention-deadline.d.ts +16 -0
  159. package/dist/core/engine/workflow-retention-deadline.js +33 -0
  160. package/dist/core/events/event-map.d.ts +5 -0
  161. package/dist/core/events/index.d.ts +1 -0
  162. package/dist/core/events/index.js +1 -0
  163. package/dist/core/events/workflow-source-events.d.ts +102 -0
  164. package/dist/core/events/workflow-source-events.js +57 -0
  165. package/dist/core/execution-strategy.d.ts +7 -0
  166. package/dist/core/inline-execution-strategy.context-options.d.ts +1 -1
  167. package/dist/core/inline-execution-strategy.js +1 -1
  168. package/dist/core/start-workflow-validation.d.ts +15 -0
  169. package/dist/core/start-workflow-validation.js +11 -1
  170. package/dist/core/types/checkpoint.d.ts +14 -0
  171. package/dist/core/types/schedules.d.ts +52 -1
  172. package/dist/core/types/state.d.ts +16 -0
  173. package/dist/core/weft-error.d.ts +1 -1
  174. package/dist/core/weft-error.js +4 -1
  175. package/dist/core/worker-execution-strategy.d.ts +1 -0
  176. package/dist/core/worker-execution-strategy.js +13 -1
  177. package/dist/core/worker-fault-handling.d.ts +10 -0
  178. package/dist/core/worker-fault-handling.js +1 -0
  179. package/dist/core/worker-inbound-message.d.ts +1 -0
  180. package/dist/core/worker-inbound-message.js +1 -0
  181. package/dist/core/worker-protocol-guard.js +4 -0
  182. package/dist/core/worker-protocol.d.ts +7 -0
  183. package/dist/core/worker-protocol.js +2 -1
  184. package/dist/core/worker-turn-watchdog.d.ts +8 -1
  185. package/dist/core/worker-turn-watchdog.js +3 -2
  186. package/dist/core/workflow-identifiers.d.ts +37 -0
  187. package/dist/core/workflow-identifiers.js +19 -1
  188. package/dist/diagnostics/format.js +5 -0
  189. package/dist/diagnostics/types.d.ts +24 -0
  190. package/dist/diagnostics/version-check.js +8 -2
  191. package/dist/http.js +2 -2
  192. package/dist/index.d.ts +3 -3
  193. package/dist/index.js +7 -0
  194. package/dist/indexeddb.js +1 -1
  195. package/dist/json-schema.js +3 -3
  196. package/dist/server/fault-to-json-rpc.js +2 -1
  197. package/dist/server/fleet-event-feed.js +6 -6
  198. package/dist/server/index.d.ts +11 -0
  199. package/dist/server/operation-fault.d.ts +2 -0
  200. package/dist/server/operation-fault.js +2 -1
  201. package/dist/server/operations/create-schedule.d.ts +2 -0
  202. package/dist/server/operations/create-schedule.js +10 -6
  203. package/dist/server/operations/get-catalog-diagnostics.d.ts +28 -0
  204. package/dist/server/operations/get-catalog-diagnostics.js +10 -2
  205. package/dist/server/operations/get-task-detail-schema.d.ts +8 -0
  206. package/dist/server/operations/get-task-detail-schema.js +1 -0
  207. package/dist/server/operations/get-task-detail.d.ts +8 -0
  208. package/dist/server/operations/get-task-detail.js +1 -0
  209. package/dist/server/operations/get-task-diagnostics.d.ts +4 -4
  210. package/dist/server/operations/preload-workflow-revision.d.ts +28 -0
  211. package/dist/server/operations/preload-workflow-revision.js +60 -0
  212. package/dist/server/operations/schedule-faults.d.ts +1 -0
  213. package/dist/server/operations/schedule-faults.js +32 -4
  214. package/dist/server/operations/schedule-rest-body.d.ts +1 -0
  215. package/dist/server/operations/schedule-rest-body.js +2 -1
  216. package/dist/server/operations/static-registrations.js +6 -0
  217. package/dist/server/operations/update-schedule.d.ts +2 -0
  218. package/dist/server/operations/update-schedule.js +4 -2
  219. package/dist/server/operations/workflow-catalog-operation-helpers.js +27 -0
  220. package/dist/server/rest-binding.d.ts +11 -0
  221. package/dist/server/runtime/task-dispatch-envelope.d.ts +41 -0
  222. package/dist/server/runtime/task-dispatch-envelope.js +54 -0
  223. package/dist/server/runtime/task-dispatch-revision.d.ts +29 -0
  224. package/dist/server/runtime/task-dispatch-revision.js +13 -0
  225. package/dist/server/runtime/task-dispatch.d.ts +3 -1
  226. package/dist/server/runtime/task-dispatch.js +20 -44
  227. package/dist/server/runtime/task-ledger-recovery.js +1 -1
  228. package/dist/server/runtime/task-ledger-runtime.d.ts +14 -2
  229. package/dist/server/runtime/task-ledger-runtime.js +5 -3
  230. package/dist/server/runtime/task-polling.js +9 -3
  231. package/dist/server/runtime/task-reconciliation.js +2 -1
  232. package/dist/server/runtime/websocket-worker.js +9 -0
  233. package/dist/server/task-ledger-codec.d.ts +28 -0
  234. package/dist/server/task-ledger-codec.js +7 -1
  235. package/dist/server/task-ledger-transition-helpers.js +1 -0
  236. package/dist/server/task-ledger-types.d.ts +9 -0
  237. package/dist/server/task-ledger.d.ts +1 -1
  238. package/dist/server/task-ledger.js +3 -1
  239. package/dist/server/task-queue-types.d.ts +2 -0
  240. package/dist/storage/bun-sql.js +135 -100
  241. package/dist/storage/catalog-keys.d.ts +19 -0
  242. package/dist/storage/catalog-keys.js +3 -1
  243. package/dist/storage/compressed-storage.js +1 -1
  244. package/dist/storage/generation-keys.d.ts +52 -0
  245. package/dist/storage/generation-keys.js +4 -0
  246. package/dist/storage/index.d.ts +76 -63
  247. package/dist/storage/interface.d.ts +24 -230
  248. package/dist/storage/interface.js +1 -1
  249. package/dist/storage/key-prefixes.d.ts +1 -1
  250. package/dist/storage/key-prefixes.js +2 -0
  251. package/dist/storage/lease-keys.d.ts +48 -0
  252. package/dist/storage/lease-keys.js +8 -0
  253. package/dist/storage/lmdb.d.ts +30 -2
  254. package/dist/storage/lmdb.js +1 -1
  255. package/dist/storage/memory.js +1 -1
  256. package/dist/storage/neon.js +3 -3
  257. package/dist/storage/node-sqlite.js +135 -100
  258. package/dist/storage/postgres.js +3 -3
  259. package/dist/storage/resolve.js +1 -1
  260. package/dist/storage/scoped-storage.js +1 -1
  261. package/dist/storage/signal-keys.d.ts +23 -0
  262. package/dist/storage/signal-keys.js +9 -0
  263. package/dist/storage/testing.js +1 -1
  264. package/dist/storage/turso.js +2 -2
  265. package/dist/storage/workflow-lifecycle-keys.d.ts +128 -0
  266. package/dist/storage/workflow-lifecycle-keys.js +46 -0
  267. package/dist/storage/workflow-record-keys.d.ts +98 -0
  268. package/dist/storage/workflow-record-keys.js +47 -0
  269. package/dist/version.d.ts +1 -1
  270. package/dist/version.js +1 -1
  271. package/dist/web-extension.js +1 -1
  272. package/dist/worker/protocol-messages.d.ts +17 -0
  273. package/dist/worker/protocol-schemas.d.ts +32 -0
  274. package/dist/worker/protocol-schemas.js +7 -3
  275. package/dist/worker/protocol-task-result.js +35 -3
  276. package/dist/worker/protocol.js +1 -1
  277. package/dist/worker/registry/types.d.ts +2 -0
  278. package/dist/worker/registry.d.ts +1 -1
  279. package/dist/worker/registry.js +3 -1
  280. package/dist/workers/workflow-runner.d.ts +9 -0
  281. package/dist/workers/workflow-runner.js +9 -2
  282. package/dist/workers/workflow-worker-entry.js +9 -4
  283. package/package.json +2 -2
@@ -1 +1 @@
1
- function T(e){let t=[];for(let n=0;n<e.length;n+=512)t.push(String.fromCharCode(...e.subarray(n,n+512)));return btoa(t.join(""))}function D(e){let t=atob(e),n=new Uint8Array(t.length);for(let i=0;i<t.length;i+=1)n[i]=t.charCodeAt(i);return n}function u(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}async function b(e,t){return await e.get(t)!==null}async function*c(e,t,n){for await(let[i]of e.scan(t,n))yield i}async function S(e,t){let n=0;for await(let i of c(e,t))n++;return n}async function w(e,t){let n=[];for await(let i of c(e,t))n.push({type:"delete",key:i});if(n.length===0)return 0;return await e.batch(n),n.length}async function v(e,t,n){let i=[];for await(let s of c(e,t,n))i.push({type:"delete",key:s});if(i.length===0)return 0;return await e.batch(i),i.length}function _(e,t,n){if(!e.capabilities()[t])throw Error(`Feature "${n}" requires storage capability "${t}", but this storage backend does not provide it.`)}function r(e){return encodeURIComponent(e)}function l(e){return String(e).padStart(16,"0")}var W={catalogEntry:(e,t)=>`catalog-entry:${r(e)}:${r(t)}`,catalogEntryPrefix:(e)=>`catalog-entry:${r(e)}:`,catalogActive:(e)=>`catalog-active:${r(e)}`};var I="default";var K={applicationMailbox:(e,t)=>`appmbx:v1:${r(e)}:${r(t)}`,applicationMailboxSinkProbe:(e,t,n)=>`appprobe:v1:${r(e)}:${r(t)}:${r(n)}`,applicationCommandPrefix:(e,t)=>`appcmd:v1:${r(e)}:${r(t)}:`,applicationCommand:(e,t,n)=>`appcmd:v1:${r(e)}:${r(t)}:${r(n)}`,applicationCommandReadyPrefix:(e,t)=>`appready:v1:${r(e)}:${r(t)}:`,applicationCommandReady:(e,t,n)=>`appready:v1:${r(e)}:${r(t)}:${l(n)}`,applicationCommandIdempotency:(e,t,n)=>`appidem:v1:${r(e)}:${r(t)}:${r(n)}`,applicationCommandBySequencePrefix:(e,t)=>`appseq:v1:${r(e)}:${r(t)}:`,applicationCommandBySequence:(e,t,n)=>`appseq:v1:${r(e)}:${r(t)}:${l(n)}`,applicationCommandTerminalPrefix:(e,t)=>`appterm:v1:${r(e)}:${r(t)}:`,applicationCommandTerminal:(e,t,n,i)=>`appterm:v1:${r(e)}:${r(t)}:${l(n)}:${r(i)}`};var L={applicationOutbox:(e,t)=>`appobx:v1:${r(e)}:${r(t)}`,applicationOutboxSinkProbe:(e,t,n)=>`appprobe:v1:outbox:${r(e)}:${r(t)}:${r(n)}`,applicationDeliveryPrefix:(e,t)=>`appdlv:v1:${r(e)}:${r(t)}:`,applicationDelivery:(e,t,n)=>`appdlv:v1:${r(e)}:${r(t)}:${r(n)}`,applicationDeliveryDuePrefix:(e,t)=>`appdue:v1:${r(e)}:${r(t)}:`,applicationDeliveryDue:(e,t,n,i)=>`appdue:v1:${r(e)}:${r(t)}:${l(n)}:${r(i)}`,applicationDeliveryIdempotency:(e,t,n)=>`appdidem:v1:${r(e)}:${r(t)}:${r(n)}`,applicationDeliveryBySequencePrefix:(e,t)=>`appdseq:v1:${r(e)}:${r(t)}:`,applicationDeliveryBySequence:(e,t,n)=>`appdseq:v1:${r(e)}:${r(t)}:${l(n)}`,applicationDeliveryTerminalPrefix:(e,t)=>`appdterm:v1:${r(e)}:${r(t)}:`,applicationDeliveryTerminal:(e,t,n,i)=>`appdterm:v1:${r(e)}:${r(t)}:${l(n)}:${r(i)}`};var U={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${r(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${r(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var E=1e4;class z extends Error{code="StorageBatchOperationLimitExceededError";cap=E;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${E}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function d(e,t){if(t>E)throw new z(e,t)}function M(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"ÿ"}function q(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function Ue(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}async function Y(e,t){if(e.has)return e.has(t);return b(e,t)}function H(e,t,n){if(e.keys)return e.keys(t,n);return c(e,t,n)}async function V(e,t){if(e.count)return e.count(t);return S(e,t)}async function j(e,t){if(e.deletePrefix)return e.deletePrefix(t);return w(e,t)}async function G(e,t,n){if(d("conditionalBatch conditions",t.length),d("conditionalBatch operations",n.length),_(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,n)}var a=l,te="0",ne="1",N=(e,t,n,i)=>`sig:${r(e)}:${r(t)}:${i}:${r(n)}`,Ne={workflow:(e)=>`wf:${r(e)}`,checkpoint:(e)=>`wf:${r(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${r(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${r(e)}:timeline:`,timeline:(e,t)=>`wf:${r(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${r(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${r(t)}`,scheduleRun:(e)=>`schedule-run:${r(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${r(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${r(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${r(e)}:${r(t)}`,operation:(e,t,n)=>`op:${e}:${a(t)}:${n}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,n)=>`audit:bulk:${a(e)}:${r(t)}:${r(n)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${a(e)}:${r(t)}`,asyncActivity:(e,t)=>`async-act:v1:${r(e)}:${r(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${r(e)}:${r(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${r(e)}:`,activityReconciliation:(e,t,n)=>`actrec:v1:${r(e)}:${r(t)}:${n}`,eventPrefix:(e)=>`ev:${r(e)}:`,event:(e,t)=>`ev:${r(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${r(e)}:head`,eventWatermark:(e)=>`ev:${r(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${r(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${r(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,n)=>N(e,t,n,ne),startSignal:(e,t,n)=>N(e,t,n,te),signalSequence:(e)=>`sigseq:v1:${r(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${r(e)}:`,signalAcceptedResponse:(e,t,n)=>`sigres:v1:${r(e)}:${r(t)}:${r(n)}`,deadline:(e,t)=>`wf-deadline:${a(e)}:${r(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${a(e)}:${r(t)}`,teardownTimer:(e,t)=>`wf-teardown:${a(e)}:${r(t)}`,delayedStart:(e,t)=>`wf-delayed:${a(e)}:${r(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${a(e)}:${r(t)}`,attribute:(e)=>`attr:${r(e)}`,attributeIndex:(e,t,n)=>`idx:${e}:${t}:${r(n)}`,tagIndex:(e,t)=>`tag:${r(e)}:${r(t)}`,updatePrefix:(e)=>`upd:${r(e)}:`,update:(e,t)=>`upd:${r(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${r(e)}:${t}`,startIdempotency:(e)=>`start-idem:${r(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${r(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...K,...L,...U,...W,budget:(e,t,n)=>`budget:${e}:${t}:${n}`,review:(e,t)=>`review:${r(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${r(e)}`,childCancellationPrefix:(e)=>`child-cancel:${r(e)}:`,childCancellation:(e,t)=>`child-cancel:${r(e)}:${r(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}`,childWorkflowByParent:(e,t,n)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}${r(n)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${r(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${r(e)}:${r(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${r(e)}`,workflowHasServices:(e)=>`wf-has-services:${r(e)}`,finalizerState:(e)=>`wf-finalizer-state:${r(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${r(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${r(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${r(e)}`,offload:(e,t)=>`offload:${r(e)}:${t}`,archive:(e,t)=>`archive:${r(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${r(e)}:${r(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${I}:${r(e)}:${r(t)}`,streamChunkPrefix:(e,t)=>`blob:${r(e)}:${t}:chunk:`,streamChunk:(e,t,n)=>`blob:${r(e)}:${t}:chunk:${String(n).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${r(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${r(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,n)=>`tool-effect:${r(e)}:${t}:${n}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${r(e)}:${r(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${r(e)}:${r(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${a(e)}:${r(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${a(e)}:${r(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${a(e)}:${r(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${r(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function re(e){if(e===void 0)return;if(typeof e!=="number"||!Number.isInteger(e)||e<0)throw Error("deleteRange limit must be a finite non-negative integer");return e===0?0:e}function f(e){let t={},n=!1;for(let s of["gt","gte","lt","lte"]){let o=e[s];if(o===void 0)continue;if(typeof o!=="string")throw Error("deleteRange bounds must be strings");t[s]=o,n=!0}if(!n)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let i=re(e.limit);if(i!==void 0)t.limit=i;return t}async function F(e,t,n){let i=f(n);if(e.deleteRange)return e.deleteRange(t,i);return v(e,t,i)}function ie(e,t){let n={key:e,open:!1};if(t.gte!==void 0&&t.gte>n.key)n.key=t.gte,n.open=!1;if(t.gt!==void 0&&t.gt>=n.key)n.key=t.gt,n.open=!0;return n}function oe(e,t){let n={key:M(e),open:!0};if(t.lt!==void 0&&t.lt<=n.key)n.key=t.lt,n.open=!0;if(t.lte!==void 0&&t.lte<n.key)n.key=t.lte,n.open=!1;return n}function Ye(e,t){let n=ie(e,t),i=oe(e,t);if(n.key>i.key||n.key===i.key&&(n.open||i.open))return null;return{lower:n,upper:i}}function k(e){return e.replaceAll(/:+$/g,"")}function se(e,t){let n=k(e),i=k(t);if(n.length===0)return i;if(i.length===0)return n;return`${n}:${i}`}class P{#t;#n;constructor(e,t){this.#t=e,this.#n=k(t)}#e(e){if(this.#n.length===0)return e;return e.length===0?`${this.#n}:`:`${this.#n}:${e}`}#r(e){return e.map((t)=>{if(t.type==="put")return{type:"put",key:this.#e(t.key),value:t.value};return{type:"delete",key:this.#e(t.key)}})}#o(e){if(this.#n.length===0)return e;return e.slice(this.#n.length+1)}#i(e){let t={};if(e.limit!==void 0)t.limit=e.limit;if(e.gt!==void 0)t.gt=this.#e(e.gt);if(e.gte!==void 0)t.gte=this.#e(e.gte);if(e.lt!==void 0)t.lt=this.#e(e.lt);if(e.lte!==void 0)t.lte=this.#e(e.lte);return t}#s(e={}){let t=this.#i(e);if(e.reverse!==void 0)t.reverse=e.reverse;return t}#g(e){return this.#i(e)}capabilities(){return this.#t.capabilities()}scoped(e){return new P(this.#t,se(this.#n,e))}async get(e){return this.#t.get(this.#e(e))}async put(e,t){await this.#t.put(this.#e(e),t)}async delete(e){await this.#t.delete(this.#e(e))}async*scan(e,t){for await(let[n,i]of this.#t.scan(this.#e(e),this.#s(t)))yield[this.#o(n),i]}async batch(e){d("batch operations",e.length),await this.#t.batch(this.#r(e))}async conditionalBatch(e,t){return G(this.#t,e.map((n)=>({key:this.#e(n.key),expectedValue:n.expectedValue})),this.#r(t))}async has(e){return Y(this.#t,this.#e(e))}async deletePrefix(e){return j(this.#t,this.#e(e))}async deleteRange(e,t){let n=this.#g(f(t));return F(this.#t,this.#e(e),n)}async*keys(e,t){for await(let n of H(this.#t,this.#e(e),this.#s(t)))yield this.#o(n)}async count(e){return V(this.#t,this.#e(e))}[Symbol.dispose](){this.#t[Symbol.dispose]()}}function Q(e,t){return new P(e,t)}var J=1,y="__weftStorageKeyspace",ae=102400,le=8192;function ge(e){return typeof e==="object"&&e!==null&&"then"in e&&typeof e.then==="function"}function C(e){if(!u(e))return!1;if(e.__weftStorage!==J)return!1;return typeof e.value==="string"}function ce(e){if(!u(e))return!1;return Object.values(e).every(C)}function x(e){if(e!==y)return;throw Error(`WebExtensionStorage key "${y}" is reserved for adapter metadata.`)}function ue(e){for(let t of e)x(t.key)}function X(e){return{__weftStorage:J,value:T(e)}}function Z(e){if(!C(e))return null;return D(e.value)}function de(e){return C(e)}function O(e){return new TextEncoder().encode(JSON.stringify(e)).byteLength}function pe(e){if(!u(e))return!1;if(e.runtime!==void 0&&!u(e.runtime))return!1;return e.storage===void 0||u(e.storage)}function fe(e){if(e!==void 0){if(!pe(e))throw Error("WebExtensionStorage injected namespace must be an object.");return e}let t=globalThis,n=t.browser??t.chrome;if(n?.storage===void 0)throw Error("WebExtensionStorage requires globalThis.browser.storage or globalThis.chrome.storage.");return n}function me(e,t){let n=e.storage?.[t];if(n===void 0)throw Error(`WebExtensionStorage area "${t}" is not available.`);return n}function ye(e){if(e==="session")return"ephemeral";if(e==="sync"||e==="managed")return"remote";return"local"}function he(e){let t=e.runtime?.lastError?.message;return t===void 0?null:Error(t)}async function R(e,t,n){return new Promise((i,s)=>{let o=!1,p=(g)=>{if(o)return;let A=he(e);if(o=!0,A!==null)s(A);else i(g)},B=(g)=>{if(o)return;o=!0,s(g)},ee=(g)=>p(g),h;try{h=t(ee)}catch{try{h=n()}catch(g){B(g);return}}if(ge(h))h.then(p,B)})}class m{static#t=new WeakMap;#n;#e;#r;#o;#i;constructor(e={},t){this.#r=e.area??"local",this.#o=ye(this.#r),this.#n=fe(t),this.#e=me(this.#n,this.#r),this.#i=()=>{},this.#n.storage?.onChanged?.addListener?.(this.#i)}capabilities(){return{persistence:this.#o,readAfterWrite:"session",scanConsistency:"best-effort",atomicBatch:!1,conditionalBatch:!1,boundedRangeDelete:!1}}async#s(e){return R(this.#n,(t)=>this.#e.get(e,t),()=>this.#e.get(e))}async#g(e){await R(this.#n,(t)=>this.#e.set(e,t),()=>this.#e.set(e))}async#d(e){if(this.#e.getBytesInUse===void 0)return null;return R(this.#n,(t)=>this.#e.getBytesInUse?.(e,t),()=>this.#e.getBytesInUse?.(e))}async#a(){let t=(await this.#s(y))[y];if(t===void 0)return{};if(!ce(t))throw Error("WebExtensionStorage keyspace is not a valid storage envelope map.");return{...t}}async#c(e){let t={[y]:e};await this.#m(t),await this.#g(t)}async#u(e){let t=m.#t.get(this.#e)??Promise.resolve(),n={},i=new Promise((o)=>{n.release=o}),s=t.catch(()=>{return}).then(()=>i);m.#t.set(this.#e,s),await t.catch(()=>{return});try{return await e()}finally{if(n.release?.(),m.#t.get(this.#e)===s)m.#t.delete(this.#e)}}#l(){if(this.#r==="managed")throw Error('WebExtensionStorage area "managed" is read-only.')}#p(e){let t=this.#e.QUOTA_BYTES_PER_ITEM??le;for(let[n,i]of Object.entries(e)){let s=O({[n]:i});if(s>t)throw Error(`WebExtensionStorage sync item quota exceeded for "${n}": ${String(s)} > ${String(t)}.`)}}async#f(e){let t=Object.keys(e),n=await this.#d(null),i=await this.#d(t);if(n!==null&&i!==null)return n-i+O(e);let s=await this.#s(null);return O({...s,...e})}async#m(e){if(this.#r!=="sync")return;this.#p(e);let t=this.#e.QUOTA_BYTES??ae,n=await this.#f(e);if(n>t)throw Error(`WebExtensionStorage sync total quota exceeded: ${String(n)} > ${String(t)}.`)}async get(e){x(e);let t=await this.#a();return Z(t[e])}async put(e,t){this.#l(),x(e),await this.#u(async()=>{let n=await this.#a();n[e]=X(t),await this.#c(n)})}async delete(e){this.#l(),x(e),await this.#u(async()=>{let t=await this.#a();if(!(e in t))return;delete t[e],await this.#c(t)})}async*scan(e,t={}){let n=await this.#a(),i=Object.keys(n).filter((o)=>o.startsWith(e)).filter((o)=>q(o,t)).filter((o)=>de(n[o])).toSorted();if(t.reverse)i=i.toReversed();let s=0;for(let o of i){if(t.limit!==void 0&&s>=t.limit)break;let p=Z(n[o]);if(p===null)continue;yield[o,p],s+=1}}async batch(e){if(d("batch operations",e.length),this.#l(),e.length===0)return;ue(e),await this.#u(async()=>{let t=await this.#a();for(let n of e)if(n.type==="put")t[n.key]=X(n.value);else delete t[n.key];await this.#c(t)})}has(e){return b(this,e)}async*keys(e,t){yield*c(this,e,t)}count(e){return S(this,e)}async deletePrefix(e){return this.#l(),w(this,e)}async deleteRange(e,t){let n=f(t);return this.#l(),v(this,e,n)}scoped(e){return Q(this,e)}[Symbol.dispose](){this.#n.storage?.onChanged?.removeListener?.(this.#i)}}export{m as WebExtensionStorage};
1
+ function T(e){let t=[];for(let r=0;r<e.length;r+=512)t.push(String.fromCharCode(...e.subarray(r,r+512)));return btoa(t.join(""))}function D(e){let t=atob(e),r=new Uint8Array(t.length);for(let i=0;i<t.length;i+=1)r[i]=t.charCodeAt(i);return r}function u(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}async function b(e,t){return await e.get(t)!==null}async function*c(e,t,r){for await(let[i]of e.scan(t,r))yield i}async function S(e,t){let r=0;for await(let i of c(e,t))r++;return r}async function E(e,t){let r=[];for await(let i of c(e,t))r.push({type:"delete",key:i});if(r.length===0)return 0;return await e.batch(r),r.length}async function w(e,t,r){let i=[];for await(let s of c(e,t,r))i.push({type:"delete",key:s});if(i.length===0)return 0;return await e.batch(i),i.length}function W(e,t,r){if(!e.capabilities()[t])throw Error(`Feature "${r}" requires storage capability "${t}", but this storage backend does not provide it.`)}function n(e){return encodeURIComponent(e)}function a(e){return String(e).padStart(16,"0")}var K={catalogEntry:(e,t)=>`catalog-entry:${n(e)}:${n(t)}`,catalogEntryPrefix:(e)=>`catalog-entry:${n(e)}:`,catalogActive:(e)=>`catalog-active:${n(e)}`,catalogTombstone:(e,t)=>`catalog-tombstone:${n(e)}:${n(t)}`,catalogTombstonePrefix:()=>"catalog-tombstone:"};var L={workflowGeneration:(e)=>`wf-gen:${n(e)}`};var I={livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${n(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder"};var N={applicationMailbox:(e,t)=>`appmbx:v1:${n(e)}:${n(t)}`,applicationMailboxSinkProbe:(e,t,r)=>`appprobe:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandPrefix:(e,t)=>`appcmd:v1:${n(e)}:${n(t)}:`,applicationCommand:(e,t,r)=>`appcmd:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandReadyPrefix:(e,t)=>`appready:v1:${n(e)}:${n(t)}:`,applicationCommandReady:(e,t,r)=>`appready:v1:${n(e)}:${n(t)}:${a(r)}`,applicationCommandIdempotency:(e,t,r)=>`appidem:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandBySequencePrefix:(e,t)=>`appseq:v1:${n(e)}:${n(t)}:`,applicationCommandBySequence:(e,t,r)=>`appseq:v1:${n(e)}:${n(t)}:${a(r)}`,applicationCommandTerminalPrefix:(e,t)=>`appterm:v1:${n(e)}:${n(t)}:`,applicationCommandTerminal:(e,t,r,i)=>`appterm:v1:${n(e)}:${n(t)}:${a(r)}:${n(i)}`};var Y={applicationOutbox:(e,t)=>`appobx:v1:${n(e)}:${n(t)}`,applicationOutboxSinkProbe:(e,t,r)=>`appprobe:v1:outbox:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryPrefix:(e,t)=>`appdlv:v1:${n(e)}:${n(t)}:`,applicationDelivery:(e,t,r)=>`appdlv:v1:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryDuePrefix:(e,t)=>`appdue:v1:${n(e)}:${n(t)}:`,applicationDeliveryDue:(e,t,r,i)=>`appdue:v1:${n(e)}:${n(t)}:${a(r)}:${n(i)}`,applicationDeliveryIdempotency:(e,t,r)=>`appdidem:v1:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryBySequencePrefix:(e,t)=>`appdseq:v1:${n(e)}:${n(t)}:`,applicationDeliveryBySequence:(e,t,r)=>`appdseq:v1:${n(e)}:${n(t)}:${a(r)}`,applicationDeliveryTerminalPrefix:(e,t)=>`appdterm:v1:${n(e)}:${n(t)}:`,applicationDeliveryTerminal:(e,t,r,i)=>`appdterm:v1:${n(e)}:${n(t)}:${a(r)}:${n(i)}`};var U={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${n(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${n(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var ge="0",ce="1",F=(e,t,r,i)=>`sig:${n(e)}:${n(t)}:${i}:${n(r)}`,M={signal:(e,t,r)=>F(e,t,r,ce),startSignal:(e,t,r)=>F(e,t,r,ge),signalSequence:(e)=>`sigseq:v1:${n(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${n(e)}:`,signalAcceptedResponse:(e,t,r)=>`sigres:v1:${n(e)}:${n(t)}:${n(r)}`};var z="default";var l=a,q={deadline:(e,t)=>`wf-deadline:${l(e)}:${n(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${l(e)}:${n(t)}`,teardownTimer:(e,t)=>`wf-teardown:${l(e)}:${n(t)}`,delayedStart:(e,t)=>`wf-delayed:${l(e)}:${n(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${l(e)}:${n(t)}`},G={budget:(e,t,r)=>`budget:${e}:${t}:${r}`,review:(e,t)=>`review:${n(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${n(e)}`,childCancellationPrefix:(e)=>`child-cancel:${n(e)}:`,childCancellation:(e,t)=>`child-cancel:${n(e)}:${n(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}`,childWorkflowByParent:(e,t,r)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}${n(r)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${n(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${n(e)}:${n(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${n(e)}`,workflowHasServices:(e)=>`wf-has-services:${n(e)}`,finalizerState:(e)=>`wf-finalizer-state:${n(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${n(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${n(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${n(e)}`,offload:(e,t)=>`offload:${n(e)}:${t}`,archive:(e,t)=>`archive:${n(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${n(e)}:${n(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${z}:${n(e)}:${n(t)}`,streamChunkPrefix:(e,t)=>`blob:${n(e)}:${t}:chunk:`,streamChunk:(e,t,r)=>`blob:${n(e)}:${t}:chunk:${String(r).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${n(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${n(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,r)=>`tool-effect:${n(e)}:${t}:${r}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${n(e)}:${n(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${n(e)}:${n(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${l(e)}:${n(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${l(e)}:${n(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${l(e)}:${n(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${n(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};var v=a,H={workflow:(e)=>`wf:${n(e)}`,checkpoint:(e)=>`wf:${n(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${n(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${n(e)}:timeline:`,timeline:(e,t)=>`wf:${n(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${n(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${n(t)}`,scheduleRun:(e)=>`schedule-run:${n(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${n(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${n(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${n(e)}:${n(t)}`,operation:(e,t,r)=>`op:${e}:${v(t)}:${r}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,r)=>`audit:bulk:${v(e)}:${n(t)}:${n(r)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${v(e)}:${n(t)}`,asyncActivity:(e,t)=>`async-act:v1:${n(e)}:${n(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${n(e)}:${n(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${n(e)}:`,activityReconciliation:(e,t,r)=>`actrec:v1:${n(e)}:${n(t)}:${r}`,eventPrefix:(e)=>`ev:${n(e)}:`,event:(e,t)=>`ev:${n(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${n(e)}:head`,eventWatermark:(e)=>`ev:${n(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${n(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${n(e)}:${String(t).padStart(10,"0")}`},V={attribute:(e)=>`attr:${n(e)}`,attributeIndex:(e,t,r)=>`idx:${e}:${t}:${n(r)}`,tagIndex:(e,t)=>`tag:${n(e)}:${n(t)}`,updatePrefix:(e)=>`upd:${n(e)}:`,update:(e,t)=>`upd:${n(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${n(e)}:${t}`,startIdempotency:(e)=>`start-idem:${n(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`};var O=1e4;class X extends Error{code="StorageBatchOperationLimitExceededError";cap=O;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${O}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function d(e,t){if(t>O)throw new X(e,t)}function j(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"ÿ"}function Q(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function at(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let r=0;r<e.byteLength;r++)if(e[r]!==t[r])return!1;return!0}async function Z(e,t){if(e.has)return e.has(t);return b(e,t)}function J(e,t,r){if(e.keys)return e.keys(t,r);return c(e,t,r)}async function ee(e,t){if(e.count)return e.count(t);return S(e,t)}async function te(e,t){if(e.deletePrefix)return e.deletePrefix(t);return E(e,t)}async function ne(e,t,r){if(d("conditionalBatch conditions",t.length),d("conditionalBatch operations",r.length),W(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,r)}var lt={...H,...M,...q,...V,...I,...N,...Y,...U,...K,...L,...G};function ue(e){if(e===void 0)return;if(typeof e!=="number"||!Number.isInteger(e)||e<0)throw Error("deleteRange limit must be a finite non-negative integer");return e===0?0:e}function f(e){let t={},r=!1;for(let s of["gt","gte","lt","lte"]){let o=e[s];if(o===void 0)continue;if(typeof o!=="string")throw Error("deleteRange bounds must be strings");t[s]=o,r=!0}if(!r)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let i=ue(e.limit);if(i!==void 0)t.limit=i;return t}async function re(e,t,r){let i=f(r);if(e.deleteRange)return e.deleteRange(t,i);return w(e,t,i)}function de(e,t){let r={key:e,open:!1};if(t.gte!==void 0&&t.gte>r.key)r.key=t.gte,r.open=!1;if(t.gt!==void 0&&t.gt>=r.key)r.key=t.gt,r.open=!0;return r}function pe(e,t){let r={key:j(e),open:!0};if(t.lt!==void 0&&t.lt<=r.key)r.key=t.lt,r.open=!0;if(t.lte!==void 0&&t.lte<r.key)r.key=t.lte,r.open=!1;return r}function dt(e,t){let r=de(e,t),i=pe(e,t);if(r.key>i.key||r.key===i.key&&(r.open||i.open))return null;return{lower:r,upper:i}}function R(e){return e.replaceAll(/:+$/g,"")}function fe(e,t){let r=R(e),i=R(t);if(r.length===0)return i;if(i.length===0)return r;return`${r}:${i}`}class C{#t;#n;constructor(e,t){this.#t=e,this.#n=R(t)}#e(e){if(this.#n.length===0)return e;return e.length===0?`${this.#n}:`:`${this.#n}:${e}`}#r(e){return e.map((t)=>{if(t.type==="put")return{type:"put",key:this.#e(t.key),value:t.value};return{type:"delete",key:this.#e(t.key)}})}#o(e){if(this.#n.length===0)return e;return e.slice(this.#n.length+1)}#i(e){let t={};if(e.limit!==void 0)t.limit=e.limit;if(e.gt!==void 0)t.gt=this.#e(e.gt);if(e.gte!==void 0)t.gte=this.#e(e.gte);if(e.lt!==void 0)t.lt=this.#e(e.lt);if(e.lte!==void 0)t.lte=this.#e(e.lte);return t}#s(e={}){let t=this.#i(e);if(e.reverse!==void 0)t.reverse=e.reverse;return t}#g(e){return this.#i(e)}capabilities(){return this.#t.capabilities()}scoped(e){return new C(this.#t,fe(this.#n,e))}async get(e){return this.#t.get(this.#e(e))}async put(e,t){await this.#t.put(this.#e(e),t)}async delete(e){await this.#t.delete(this.#e(e))}async*scan(e,t){for await(let[r,i]of this.#t.scan(this.#e(e),this.#s(t)))yield[this.#o(r),i]}async batch(e){d("batch operations",e.length),await this.#t.batch(this.#r(e))}async conditionalBatch(e,t){return ne(this.#t,e.map((r)=>({key:this.#e(r.key),expectedValue:r.expectedValue})),this.#r(t))}async has(e){return Z(this.#t,this.#e(e))}async deletePrefix(e){return te(this.#t,this.#e(e))}async deleteRange(e,t){let r=this.#g(f(t));return re(this.#t,this.#e(e),r)}async*keys(e,t){for await(let r of J(this.#t,this.#e(e),this.#s(t)))yield this.#o(r)}async count(e){return ee(this.#t,this.#e(e))}[Symbol.dispose](){this.#t[Symbol.dispose]()}}function ie(e,t){return new C(e,t)}var ae=1,y="__weftStorageKeyspace",me=102400,ye=8192;function he(e){return typeof e==="object"&&e!==null&&"then"in e&&typeof e.then==="function"}function _(e){if(!u(e))return!1;if(e.__weftStorage!==ae)return!1;return typeof e.value==="string"}function be(e){if(!u(e))return!1;return Object.values(e).every(_)}function x(e){if(e!==y)return;throw Error(`WebExtensionStorage key "${y}" is reserved for adapter metadata.`)}function Se(e){for(let t of e)x(t.key)}function oe(e){return{__weftStorage:ae,value:T(e)}}function se(e){if(!_(e))return null;return D(e.value)}function Ee(e){return _(e)}function k(e){return new TextEncoder().encode(JSON.stringify(e)).byteLength}function $e(e){if(!u(e))return!1;if(e.runtime!==void 0&&!u(e.runtime))return!1;return e.storage===void 0||u(e.storage)}function we(e){if(e!==void 0){if(!$e(e))throw Error("WebExtensionStorage injected namespace must be an object.");return e}let t=globalThis,r=t.browser??t.chrome;if(r?.storage===void 0)throw Error("WebExtensionStorage requires globalThis.browser.storage or globalThis.chrome.storage.");return r}function xe(e,t){let r=e.storage?.[t];if(r===void 0)throw Error(`WebExtensionStorage area "${t}" is not available.`);return r}function ve(e){if(e==="session")return"ephemeral";if(e==="sync"||e==="managed")return"remote";return"local"}function Oe(e){let t=e.runtime?.lastError?.message;return t===void 0?null:Error(t)}async function P(e,t,r){return new Promise((i,s)=>{let o=!1,p=(g)=>{if(o)return;let A=Oe(e);if(o=!0,A!==null)s(A);else i(g)},B=(g)=>{if(o)return;o=!0,s(g)},le=(g)=>p(g),h;try{h=t(le)}catch{try{h=r()}catch(g){B(g);return}}if(he(h))h.then(p,B)})}class m{static#t=new WeakMap;#n;#e;#r;#o;#i;constructor(e={},t){this.#r=e.area??"local",this.#o=ve(this.#r),this.#n=we(t),this.#e=xe(this.#n,this.#r),this.#i=()=>{},this.#n.storage?.onChanged?.addListener?.(this.#i)}capabilities(){return{persistence:this.#o,readAfterWrite:"session",scanConsistency:"best-effort",atomicBatch:!1,conditionalBatch:!1,boundedRangeDelete:!1}}async#s(e){return P(this.#n,(t)=>this.#e.get(e,t),()=>this.#e.get(e))}async#g(e){await P(this.#n,(t)=>this.#e.set(e,t),()=>this.#e.set(e))}async#d(e){if(this.#e.getBytesInUse===void 0)return null;return P(this.#n,(t)=>this.#e.getBytesInUse?.(e,t),()=>this.#e.getBytesInUse?.(e))}async#a(){let t=(await this.#s(y))[y];if(t===void 0)return{};if(!be(t))throw Error("WebExtensionStorage keyspace is not a valid storage envelope map.");return{...t}}async#c(e){let t={[y]:e};await this.#m(t),await this.#g(t)}async#u(e){let t=m.#t.get(this.#e)??Promise.resolve(),r={},i=new Promise((o)=>{r.release=o}),s=t.catch(()=>{return}).then(()=>i);m.#t.set(this.#e,s),await t.catch(()=>{return});try{return await e()}finally{if(r.release?.(),m.#t.get(this.#e)===s)m.#t.delete(this.#e)}}#l(){if(this.#r==="managed")throw Error('WebExtensionStorage area "managed" is read-only.')}#p(e){let t=this.#e.QUOTA_BYTES_PER_ITEM??ye;for(let[r,i]of Object.entries(e)){let s=k({[r]:i});if(s>t)throw Error(`WebExtensionStorage sync item quota exceeded for "${r}": ${String(s)} > ${String(t)}.`)}}async#f(e){let t=Object.keys(e),r=await this.#d(null),i=await this.#d(t);if(r!==null&&i!==null)return r-i+k(e);let s=await this.#s(null);return k({...s,...e})}async#m(e){if(this.#r!=="sync")return;this.#p(e);let t=this.#e.QUOTA_BYTES??me,r=await this.#f(e);if(r>t)throw Error(`WebExtensionStorage sync total quota exceeded: ${String(r)} > ${String(t)}.`)}async get(e){x(e);let t=await this.#a();return se(t[e])}async put(e,t){this.#l(),x(e),await this.#u(async()=>{let r=await this.#a();r[e]=oe(t),await this.#c(r)})}async delete(e){this.#l(),x(e),await this.#u(async()=>{let t=await this.#a();if(!(e in t))return;delete t[e],await this.#c(t)})}async*scan(e,t={}){let r=await this.#a(),i=Object.keys(r).filter((o)=>o.startsWith(e)).filter((o)=>Q(o,t)).filter((o)=>Ee(r[o])).toSorted();if(t.reverse)i=i.toReversed();let s=0;for(let o of i){if(t.limit!==void 0&&s>=t.limit)break;let p=se(r[o]);if(p===null)continue;yield[o,p],s+=1}}async batch(e){if(d("batch operations",e.length),this.#l(),e.length===0)return;Se(e),await this.#u(async()=>{let t=await this.#a();for(let r of e)if(r.type==="put")t[r.key]=oe(r.value);else delete t[r.key];await this.#c(t)})}has(e){return b(this,e)}async*keys(e,t){yield*c(this,e,t)}count(e){return S(this,e)}async deletePrefix(e){return this.#l(),E(this,e)}async deleteRange(e,t){let r=f(t);return this.#l(),w(this,e,r)}scoped(e){return ie(this,e)}[Symbol.dispose](){this.#n.storage?.onChanged?.removeListener?.(this.#i)}}export{m as WebExtensionStorage};
@@ -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.24.0",
3
+ "version": "0.24.2",
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",