@lostgradient/weft 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +47 -22
  2. package/dist/cli/generated/operation-client.generated.d.ts +28 -1
  3. package/dist/cli/generated/operation-client.generated.js +2 -0
  4. package/dist/cli-main.js +79 -79
  5. package/dist/client/handle-delegation.d.ts +4 -0
  6. package/dist/client/handle-delegation.js +6 -0
  7. package/dist/client/http-client-requests.d.ts +2 -0
  8. package/dist/client/http-client-requests.js +3 -0
  9. package/dist/client/http-client.d.ts +4 -1
  10. package/dist/client/http-client.js +9 -1
  11. package/dist/client/interface.d.ts +57 -2
  12. package/dist/client/local.d.ts +4 -1
  13. package/dist/client/local.js +7 -0
  14. package/dist/client/start-body.d.ts +7 -1
  15. package/dist/client/start-body.js +13 -4
  16. package/dist/core/codec/extension-codec.js +4 -2
  17. package/dist/core/codec/index.d.ts +1 -0
  18. package/dist/core/codec/index.js +1 -0
  19. package/dist/core/codec/serializer-registry.d.ts +122 -0
  20. package/dist/core/codec/serializer-registry.js +51 -0
  21. package/dist/core/context/index.d.ts +10 -0
  22. package/dist/core/context/index.js +3 -0
  23. package/dist/core/context/internals.d.ts +10 -0
  24. package/dist/core/context/internals.js +5 -1
  25. package/dist/core/context/run-operation.d.ts +16 -3
  26. package/dist/core/context/run-operation.js +16 -7
  27. package/dist/core/context/speculative-child.js +2 -0
  28. package/dist/core/context/types.d.ts +6 -0
  29. package/dist/core/engine/bulk-operations-purge.js +1 -0
  30. package/dist/core/engine/bulk-operations.js +1 -1
  31. package/dist/core/engine/callback-creators-bundles.js +2 -1
  32. package/dist/core/engine/callback-creators-core.js +2 -1
  33. package/dist/core/engine/construction.d.ts +1 -1
  34. package/dist/core/engine/construction.js +15 -3
  35. package/dist/core/engine/disposal.js +12 -0
  36. package/dist/core/engine/engine-create-types.d.ts +0 -14
  37. package/dist/core/engine/engine-internal-types.d.ts +17 -0
  38. package/dist/core/engine/engine-leak-warnings.d.ts +6 -0
  39. package/dist/core/engine/engine-leak-warnings.js +4 -0
  40. package/dist/core/engine/engine-runtime-helpers.d.ts +17 -0
  41. package/dist/core/engine/engine-runtime-helpers.js +26 -5
  42. package/dist/core/engine/errors.d.ts +74 -0
  43. package/dist/core/engine/errors.js +25 -1
  44. package/dist/core/engine/handle-result.js +1 -1
  45. package/dist/core/engine/handles.d.ts +89 -40
  46. package/dist/core/engine/handles.js +25 -27
  47. package/dist/core/engine/index.d.ts +122 -4
  48. package/dist/core/engine/index.js +82 -5
  49. package/dist/core/engine/inline-launch-queue.d.ts +14 -0
  50. package/dist/core/engine/inline-launch-queue.js +32 -7
  51. package/dist/core/engine/internals.d.ts +26 -10
  52. package/dist/core/engine/lifecycle/fork-helpers.js +1 -7
  53. package/dist/core/engine/lifecycle/persist.js +5 -20
  54. package/dist/core/engine/lifecycle/recovered-services.d.ts +45 -0
  55. package/dist/core/engine/lifecycle/recovered-services.js +34 -0
  56. package/dist/core/engine/lifecycle/resume.js +33 -5
  57. package/dist/core/engine/lifecycle/shared.d.ts +8 -0
  58. package/dist/core/engine/lifecycle/start-batch.js +23 -12
  59. package/dist/core/engine/lifecycle/start-commit.d.ts +47 -0
  60. package/dist/core/engine/lifecycle/start-commit.js +27 -0
  61. package/dist/core/engine/lifecycle/start-exec.d.ts +30 -2
  62. package/dist/core/engine/lifecycle/start-exec.js +38 -0
  63. package/dist/core/engine/lifecycle/start-or-signal-resolution.d.ts +79 -0
  64. package/dist/core/engine/lifecycle/start-or-signal-resolution.js +60 -0
  65. package/dist/core/engine/lifecycle/start-or-signal.d.ts +45 -0
  66. package/dist/core/engine/lifecycle/start-or-signal.js +141 -0
  67. package/dist/core/engine/lifecycle/start.d.ts +3 -3
  68. package/dist/core/engine/lifecycle/start.js +42 -37
  69. package/dist/core/engine/lifecycle.d.ts +3 -2
  70. package/dist/core/engine/lifecycle.js +9 -2
  71. package/dist/core/engine/listing.js +1 -1
  72. package/dist/core/engine/operations-data.d.ts +16 -0
  73. package/dist/core/engine/operations-data.js +6 -0
  74. package/dist/core/engine/operations-time.d.ts +3 -2
  75. package/dist/core/engine/operations-time.js +6 -1
  76. package/dist/core/engine/persisted-data-version.d.ts +5 -9
  77. package/dist/core/engine/persisted-data-version.js +4 -5
  78. package/dist/core/engine/schedule-handle.d.ts +45 -0
  79. package/dist/core/engine/schedule-handle.js +26 -0
  80. package/dist/core/engine/schedules.d.ts +1 -1
  81. package/dist/core/engine/schedules.js +7 -3
  82. package/dist/core/engine/second-instance-detector.d.ts +96 -0
  83. package/dist/core/engine/second-instance-detector.js +108 -0
  84. package/dist/core/engine/signals.d.ts +22 -0
  85. package/dist/core/engine/signals.js +15 -0
  86. package/dist/core/engine/termination/cleanup.d.ts +25 -0
  87. package/dist/core/engine/termination/cleanup.js +21 -1
  88. package/dist/core/engine/termination/complete.js +4 -3
  89. package/dist/core/engine/termination/suspend.d.ts +68 -0
  90. package/dist/core/engine/termination/suspend.js +41 -0
  91. package/dist/core/engine/termination.d.ts +4 -2
  92. package/dist/core/engine/termination.js +2 -0
  93. package/dist/core/engine/validation.js +25 -1
  94. package/dist/core/engine/workflow-feed.d.ts +5 -3
  95. package/dist/core/events/event-map.d.ts +2 -1
  96. package/dist/core/events/workflow-events.d.ts +23 -0
  97. package/dist/core/events/workflow-events.js +9 -0
  98. package/dist/core/inline-execution-strategy.d.ts +5 -0
  99. package/dist/core/inline-execution-strategy.js +2 -1
  100. package/dist/core/list-filter-validation.js +2 -1
  101. package/dist/core/start-workflow-validation.d.ts +22 -0
  102. package/dist/core/start-workflow-validation.js +11 -1
  103. package/dist/core/step-context.d.ts +10 -6
  104. package/dist/core/step-context.js +7 -15
  105. package/dist/core/types/activity.d.ts +6 -3
  106. package/dist/core/types/identity.d.ts +8 -1
  107. package/dist/core/types/launch-metadata.d.ts +33 -0
  108. package/dist/core/types/launch-metadata.js +0 -0
  109. package/dist/core/types/message-handles.d.ts +25 -0
  110. package/dist/core/types/options.d.ts +90 -7
  111. package/dist/core/types/reviews.d.ts +2 -1
  112. package/dist/core/types/services-resolution.d.ts +47 -0
  113. package/dist/core/types/services-resolution.js +0 -0
  114. package/dist/core/types/state.d.ts +11 -11
  115. package/dist/core/types/workflow-builder.d.ts +5 -4
  116. package/dist/core/types/workflow-context.d.ts +25 -0
  117. package/dist/core/types/workflow-function.d.ts +17 -0
  118. package/dist/core/types/workflow-snapshot.d.ts +29 -0
  119. package/dist/core/types/workflow-snapshot.js +0 -0
  120. package/dist/core/types.d.ts +3 -0
  121. package/dist/core/types.js +3 -0
  122. package/dist/core/weft-error.d.ts +46 -14
  123. package/dist/core/weft-error.js +12 -1
  124. package/dist/diagnostics/doctor.js +6 -3
  125. package/dist/diagnostics/format.js +2 -2
  126. package/dist/diagnostics/types.d.ts +1 -0
  127. package/dist/diagnostics/version-check.js +6 -4
  128. package/dist/index.d.ts +10 -5
  129. package/dist/index.js +11 -2
  130. package/dist/json-schema.js +3 -3
  131. package/dist/mcp/cli.js +35 -35
  132. package/dist/mcp/list-filter.js +2 -1
  133. package/dist/mcp/session.js +1 -0
  134. package/dist/observability/index.js +2 -2
  135. package/dist/server/handler.js +30 -30
  136. package/dist/server/index.js +33 -33
  137. package/dist/server/interactive-operations.js +1 -0
  138. package/dist/server/operations/resume-workflow.js +2 -2
  139. package/dist/server/operations/start-or-signal-workflow.d.ts +39 -0
  140. package/dist/server/operations/start-or-signal-workflow.js +140 -0
  141. package/dist/server/operations/start-workflow-options.d.ts +32 -0
  142. package/dist/server/operations/start-workflow-options.js +63 -0
  143. package/dist/server/operations/start-workflow.js +7 -69
  144. package/dist/server/operations/suspend-workflow.d.ts +13 -0
  145. package/dist/server/operations/suspend-workflow.js +36 -0
  146. package/dist/server/rest-binding.d.ts +18 -7
  147. package/dist/server/rest-bindings.js +12 -0
  148. package/dist/server/runtime/task-dispatch.js +5 -3
  149. package/dist/server/runtime/task-polling.d.ts +16 -2
  150. package/dist/server/runtime/task-polling.js +20 -5
  151. package/dist/server/runtime/websocket-worker.js +8 -0
  152. package/dist/server/serve-internals.d.ts +8 -0
  153. package/dist/server/serve-internals.js +4 -2
  154. package/dist/server/task-state.d.ts +8 -0
  155. package/dist/service-worker/index.js +28 -28
  156. package/dist/storage/capabilities.d.ts +10 -2
  157. package/dist/storage/capabilities.js +2 -2
  158. package/dist/storage/http.js +2 -2
  159. package/dist/storage/index.d.ts +7 -1
  160. package/dist/storage/indexeddb.js +1 -1
  161. package/dist/storage/interface.d.ts +40 -0
  162. package/dist/storage/interface.js +1 -1
  163. package/dist/storage/key-prefixes.d.ts +1 -1
  164. package/dist/storage/key-prefixes.js +3 -0
  165. package/dist/storage/lmdb.js +1 -1
  166. package/dist/storage/memory.js +1 -1
  167. package/dist/storage/neon-value-mapping.d.ts +47 -0
  168. package/dist/storage/neon-value-mapping.js +11 -0
  169. package/dist/storage/neon.d.ts +108 -0
  170. package/dist/storage/neon.js +10 -0
  171. package/dist/storage/node-sqlite-loader.d.ts +71 -0
  172. package/dist/storage/node-sqlite-loader.js +41 -0
  173. package/dist/storage/node-sqlite.d.ts +1 -19
  174. package/dist/storage/node-sqlite.js +38 -32
  175. package/dist/storage/postgres-key-value-queries.d.ts +79 -0
  176. package/dist/storage/postgres-key-value-queries.js +63 -0
  177. package/dist/storage/resolve.d.ts +2 -165
  178. package/dist/storage/resolve.js +1 -1
  179. package/dist/storage/scoped-storage.js +1 -1
  180. package/dist/storage/storage-configuration.d.ts +209 -0
  181. package/dist/storage/storage-configuration.js +0 -0
  182. package/dist/storage/text-value-store.d.ts +13 -10
  183. package/dist/storage/turso.js +2 -2
  184. package/dist/storage/typed-storage.js +1 -1
  185. package/dist/storage/web-extension.js +1 -1
  186. package/dist/testing/event-loop.d.ts +36 -2
  187. package/dist/testing/index.d.ts +31 -1
  188. package/dist/testing/index.js +33 -33
  189. package/dist/version.d.ts +1 -1
  190. package/dist/version.js +1 -1
  191. package/dist/worker/index.js +9 -5
  192. package/dist/worker/long-poll.js +4 -0
  193. package/dist/worker/protocol-messages.d.ts +20 -0
  194. package/dist/worker/protocol-schemas.d.ts +32 -0
  195. package/dist/worker/protocol-schemas.js +8 -4
  196. package/dist/worker/protocol-task-result.d.ts +28 -0
  197. package/dist/worker/protocol-task-result.js +76 -0
  198. package/dist/worker/protocol.d.ts +4 -15
  199. package/dist/worker/protocol.js +1 -1
  200. package/dist/worker/registry/fair-share.d.ts +29 -0
  201. package/dist/worker/registry/fair-share.js +30 -0
  202. package/dist/worker/registry/routing.d.ts +18 -0
  203. package/dist/worker/registry/routing.js +14 -0
  204. package/dist/worker/registry/types.d.ts +7 -0
  205. package/dist/worker/registry.d.ts +16 -1
  206. package/dist/worker/registry.js +24 -36
  207. package/package.json +17 -4
@@ -170,8 +170,16 @@ export declare function requireStorageCapability(storage: Storage, capability: G
170
170
  /**
171
171
  * Fail fast when a storage backend is not conservative enough for boot-time
172
172
  * durable recovery. This is intentionally stricter than the engine's per-feature
173
- * gates: it rejects ephemeral, remote, eventual, best-effort, non-atomic, and
174
- * non-CAS storage before an application starts in durable mode.
173
+ * gates: it rejects ephemeral, eventual, best-effort, non-atomic, and non-CAS
174
+ * storage before an application starts in durable mode.
175
+ *
176
+ * Persistence may be `local` (a same-process file-backed store) or `remote` (a
177
+ * durable service such as Neon Postgres). A `remote` backend is acceptable only
178
+ * because the other four axes are still required at their strongest:
179
+ * `linearizable` read-after-write, `snapshot` scans, atomic batches, and
180
+ * compare-and-swap. A remote store that cannot promise all four (an eventually
181
+ * consistent HTTP backend, say) is still rejected — by those axes, not by its
182
+ * persistence scope.
175
183
  *
176
184
  * @throws {Error} When the backend's capability row is not suitable for recovery.
177
185
  *
@@ -4,8 +4,8 @@ export function requireStorageCapability(storage, capability, featureName) {
4
4
  }
5
5
  export function assertDurableStorageForRecovery(storage) {
6
6
  const capabilities = storage.capabilities(), failures = [];
7
- if (capabilities.persistence !== "local")
8
- failures.push(`persistence must be "local" (got "${capabilities.persistence}")`);
7
+ if (capabilities.persistence !== "local" && capabilities.persistence !== "remote")
8
+ failures.push(`persistence must be "local" or "remote" (got "${capabilities.persistence}")`);
9
9
  if (capabilities.readAfterWrite !== "linearizable")
10
10
  failures.push(`readAfterWrite must be "linearizable" (got "${capabilities.readAfterWrite}")`);
11
11
  if (capabilities.scanConsistency !== "snapshot")
@@ -1,2 +1,2 @@
1
- var k=Object.defineProperty;var u=(J)=>J;function w(J,Y){this[J]=u.bind(null,Y)}var n=(J,Y)=>{for(var Z in Y)k(J,Z,{get:Y[Z],enumerable:!0,configurable:!0,set:w.bind(Y,Z)})};function U(J){let Y=[];for(let Z=0;Z<J.length;Z+=512)Y.push(String.fromCharCode(...J.subarray(Z,Z+512)));return btoa(Y.join(""))}function T(J){let Y=atob(J),Z=new Uint8Array(Y.length);for(let G=0;G<Y.length;G+=1)Z[G]=Y.charCodeAt(G);return Z}function N(J){return typeof J==="object"&&J!==null&&!Array.isArray(J)}async function M(J,Y){return await J.get(Y)!==null}async function*Q(J,Y,Z){for await(let[G]of J.scan(Y,Z))yield G}async function V(J,Y){let Z=0;for await(let G of Q(J,Y))Z++;return Z}async function E(J,Y){let Z=[];for await(let G of Q(J,Y))Z.push({type:"delete",key:G});if(Z.length===0)return 0;return await J.batch(Z),Z.length}async function H(J,Y,Z){let G=[];for await(let X of Q(J,Y,Z))G.push({type:"delete",key:X});if(G.length===0)return 0;return await J.batch(G),G.length}function q(J,Y,Z){if(!J.capabilities()[Y])throw Error(`Feature "${Z}" requires storage capability "${Y}", but this storage backend does not provide it.`)}var R="default";function O(J){return J.length>0?J.slice(0,-1)+String.fromCharCode(J.charCodeAt(J.length-1)+1):"ÿ"}function _J(J,Y={}){if(Y.gt!==void 0&&J<=Y.gt)return!1;if(Y.gte!==void 0&&J<Y.gte)return!1;if(Y.lt!==void 0&&J>=Y.lt)return!1;if(Y.lte!==void 0&&J>Y.lte)return!1;return!0}function FJ(J,Y){if(J===null||Y===null)return J===Y;if(J.byteLength!==Y.byteLength)return!1;for(let Z=0;Z<J.byteLength;Z++)if(J[Z]!==Y[Z])return!1;return!0}async function P(J,Y){if(J.has)return J.has(Y);return M(J,Y)}function h(J,Y,Z){if(J.keys)return J.keys(Y,Z);return Q(J,Y,Z)}async function C(J,Y){if(J.count)return J.count(Y);return V(J,Y)}async function v(J,Y){if(J.deletePrefix)return J.deletePrefix(Y);return E(J,Y)}async function K(J,Y,Z){if(q(J,"conditionalBatch","storageConditionalBatch"),!J.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return J.conditionalBatch(Y,Z)}function $(J){return encodeURIComponent(J)}function QJ(J){try{return decodeURIComponent(J)}catch{return null}}var _=(J)=>String(J).padStart(16,"0"),WJ={workflow:(J)=>`wf:${$(J)}`,checkpoint:(J)=>`wf:${$(J)}:ckpt`,checkpointHistory:(J,Y)=>`wf:${$(J)}:ckpt:${String(Y).padStart(10,"0")}`,timelinePrefix:(J)=>`wf:${$(J)}:timeline:`,timeline:(J,Y)=>`wf:${$(J)}:timeline:${String(Y).padStart(10,"0")}`,schedule:(J)=>`schedule:${$(J)}`,scheduleTick:(J,Y)=>`schedule-due:${String(J).padStart(16,"0")}:${$(Y)}`,scheduleRun:(J)=>`schedule-run:${$(J)}`,operation:(J,Y,Z)=>`op:${J}:${_(Y)}:${Z}`,operationInflight:(J)=>`op:inflight:${J}`,operationQueued:(J)=>`op:queued:${J}`,operationResolved:(J)=>`op:resolved:${J}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(J,Y,Z)=>`audit:bulk:${_(J)}:${$(Y)}:${$(Z)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(J,Y)=>`op:resolved-by-time:${_(J)}:${$(Y)}`,asyncActivity:(J,Y)=>`async-act:v1:${$(J)}:${$(Y)}`,activityReconciliationPrefix:(J)=>`actrec:v1:${$(J)}:`,activityReconciliation:(J,Y,Z)=>`actrec:v1:${$(J)}:${$(Y)}:${Z}`,eventPrefix:(J)=>`ev:${$(J)}:`,event:(J,Y)=>`ev:${$(J)}:${String(Y).padStart(10,"0")}`,eventHead:(J)=>`ev:${$(J)}:head`,eventWatermark:(J)=>`ev:${$(J)}:watermark`,signal:(J,Y,Z)=>`sig:${$(J)}:${Y}:${$(Z)}`,signalSequence:(J)=>`sigseq:v1:${$(J)}`,signalAcceptedResponsePrefix:(J)=>`sigres:v1:${$(J)}:`,signalAcceptedResponse:(J,Y,Z)=>`sigres:v1:${$(J)}:${$(Y)}:${$(Z)}`,deadline:(J,Y)=>`wf-deadline:${_(J)}:${$(Y)}`,terminalCleanup:(J,Y)=>`wf-cleanup:${_(J)}:${$(Y)}`,delayedStart:(J,Y)=>`wf-delayed:${_(J)}:${$(Y)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(J,Y)=>`wf-terminal:${_(J)}:${$(Y)}`,attribute:(J)=>`attr:${$(J)}`,attributeIndex:(J,Y,Z)=>`idx:${J}:${Y}:${$(Z)}`,tagIndex:(J,Y)=>`tag:${$(J)}:${$(Y)}`,updatePrefix:(J)=>`upd:${$(J)}:`,update:(J,Y)=>`upd:${$(J)}:${Y}`,updateResponse:(J)=>`upr:${J}`,updateIdempotency:(J,Y)=>`upk:${$(J)}:${Y}`,budget:(J,Y,Z)=>`budget:${J}:${Y}:${Z}`,review:(J,Y)=>`review:${$(J)}:${Y}`,workflowHeaders:(J)=>`wf-headers:${$(J)}`,terminalCleanupNeeded:(J)=>`wf-cleanup-needed:${$(J)}`,offload:(J,Y)=>`offload:${$(J)}:${Y}`,archive:(J,Y)=>`archive:${$(J)}:${Y}`,stateExecution:(J,Y)=>`state:execution:${$(J)}:${$(Y)}`,stateWorkflow:(J,Y)=>`state:workflow-scope:${R}:${$(J)}:${$(Y)}`,streamChunkPrefix:(J,Y)=>`blob:${$(J)}:${Y}:chunk:`,streamChunk:(J,Y,Z)=>`blob:${$(J)}:${Y}:chunk:${String(Z).padStart(10,"0")}`,streamMetadata:(J,Y)=>`blob:${$(J)}:${Y}:meta`,budgetCharged:(J)=>`budget-charged:${J}`,toolEffect:(J,Y,Z)=>`tool-effect:${$(J)}:${Y}:${Z}`,workflowVisibilityStatus:(J,Y)=>`wf-idx-status:${$(J)}:${$(Y)}`,workflowVisibilityType:(J,Y)=>`wf-idx-type:${$(J)}:${$(Y)}`,workflowVisibilityCreated:(J,Y)=>`wf-idx-created:${_(J)}:${$(Y)}`,workflowVisibilityUpdated:(J,Y)=>`wf-idx-updated:${_(J)}:${$(Y)}`,workflowVisibilityDeadline:(J,Y)=>`wf-idx-deadline:${_(J)}:${$(Y)}`,workflowVisibilityManifest:(J)=>`wf-idx-manifest:${$(J)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function m(J){if(J===void 0)return;if(typeof J!=="number"||!Number.isInteger(J)||J<0)throw Error("deleteRange limit must be a finite non-negative integer");return J===0?0:J}function j(J){let Y={},Z=!1;for(let X of["gt","gte","lt","lte"]){let F=J[X];if(F===void 0)continue;if(typeof F!=="string")throw Error("deleteRange bounds must be strings");Y[X]=F,Z=!0}if(!Z)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let G=m(J.limit);if(G!==void 0)Y.limit=G;return Y}async function b(J,Y,Z){let G=j(Z);if(J.deleteRange)return J.deleteRange(Y,G);return H(J,Y,G)}function c(J,Y){let Z={key:J,open:!1};if(Y.gte!==void 0&&Y.gte>Z.key)Z.key=Y.gte,Z.open=!1;if(Y.gt!==void 0&&Y.gt>=Z.key)Z.key=Y.gt,Z.open=!0;return Z}function y(J,Y){let Z={key:O(J),open:!0};if(Y.lt!==void 0&&Y.lt<=Z.key)Z.key=Y.lt,Z.open=!0;if(Y.lte!==void 0&&Y.lte<Z.key)Z.key=Y.lte,Z.open=!1;return Z}function HJ(J,Y){let Z=c(J,Y),G=y(J,Y);if(Z.key>G.key||Z.key===G.key&&(Z.open||G.open))return null;return{lower:Z,upper:G}}function B(J){return J.replaceAll(/:+$/g,"")}function g(J,Y){let Z=B(J),G=B(Y);if(Z.length===0)return G;if(G.length===0)return Z;return`${Z}:${G}`}class A{#Y;#Z;constructor(J,Y){this.#Y=J,this.#Z=B(Y)}#J(J){if(this.#Z.length===0)return J;return J.length===0?`${this.#Z}:`:`${this.#Z}:${J}`}#$(J){if(this.#Z.length===0)return J;return J.slice(this.#Z.length+1)}#G(J={}){let Y={};if(J.limit!==void 0)Y.limit=J.limit;if(J.reverse!==void 0)Y.reverse=J.reverse;if(J.gt!==void 0)Y.gt=this.#J(J.gt);if(J.gte!==void 0)Y.gte=this.#J(J.gte);if(J.lt!==void 0)Y.lt=this.#J(J.lt);if(J.lte!==void 0)Y.lte=this.#J(J.lte);return Y}#_(J){let Y={};if(J.limit!==void 0)Y.limit=J.limit;if(J.gt!==void 0)Y.gt=this.#J(J.gt);if(J.gte!==void 0)Y.gte=this.#J(J.gte);if(J.lt!==void 0)Y.lt=this.#J(J.lt);if(J.lte!==void 0)Y.lte=this.#J(J.lte);return Y}capabilities(){return this.#Y.capabilities()}scoped(J){return new A(this.#Y,g(this.#Z,J))}async get(J){return this.#Y.get(this.#J(J))}async put(J,Y){await this.#Y.put(this.#J(J),Y)}async delete(J){await this.#Y.delete(this.#J(J))}async*scan(J,Y){for await(let[Z,G]of this.#Y.scan(this.#J(J),this.#G(Y)))yield[this.#$(Z),G]}async batch(J){await this.#Y.batch(J.map((Y)=>{if(Y.type==="put")return{type:"put",key:this.#J(Y.key),value:Y.value};return{type:"delete",key:this.#J(Y.key)}}))}async conditionalBatch(J,Y){return K(this.#Y,J.map((Z)=>({key:this.#J(Z.key),expectedValue:Z.expectedValue})),Y.map((Z)=>{if(Z.type==="put")return{type:"put",key:this.#J(Z.key),value:Z.value};return{type:"delete",key:this.#J(Z.key)}}))}async has(J){return P(this.#Y,this.#J(J))}async deletePrefix(J){return v(this.#Y,this.#J(J))}async deleteRange(J,Y){let Z=this.#_(j(Y));return b(this.#Y,this.#J(J),Z)}async*keys(J,Y){for await(let Z of h(this.#Y,this.#J(J),this.#G(Y)))yield this.#$(Z)}async count(J){return C(this.#Y,this.#J(J))}[Symbol.dispose](){this.#Y[Symbol.dispose]()}}function S(J,Y){return new A(J,Y)}var f=67108864;function I(J){if(J.type==="put")return{type:"put",key:J.key,value:U(J.value)};return{type:"delete",key:J.key}}function l(J){return{key:J.key,expectedValue:J.expectedValue===null?null:U(J.expectedValue)}}function d(J){if(!N(J)||typeof J.key!=="string"||typeof J.value!=="string")throw Error("HTTPStorage scan response contained an invalid NDJSON entry.");return{key:J.key,value:J.value}}function p(J){if(!N(J)||typeof J.applied!=="boolean")throw Error('HTTPStorage conditional batch response must include a boolean "applied" field.');return J.applied}function W(J,Y,Z){if(Z!==void 0)J.searchParams.set(Y,String(Z))}function s(J){if(J.trim().length===0)return null;let Y=d(JSON.parse(J));return[Y.key,T(Y.value)]}function a(J){if(J>f)throw Error("HTTPStorage scan response exceeded the maximum allowed size.")}async function*i(J){if(J.body===null)return;let Y=J.body.getReader(),Z=new TextDecoder,G="",X=0,F=!1;try{while(!0){let{done:L,value:D}=await Y.read();if(L){F=!0;break}X+=D.byteLength,a(X),G+=Z.decode(D,{stream:!0});let z=G.split(`
2
- `);G=z.pop()??"";for(let x of z)yield x}if(G+=Z.decode(),G.length>0)yield G}finally{try{if(!F)await Y.cancel()}catch{}Y.releaseLock()}}class r{#Y;#Z;#J;constructor(J){this.#Y=J.baseUrl instanceof URL?J.baseUrl:new URL(J.baseUrl),this.#Z={...J.headers},this.#J=J.remoteConditionalBatch??!1}capabilities(){return{persistence:"remote",readAfterWrite:"eventual",scanConsistency:"best-effort",atomicBatch:!0,conditionalBatch:this.#J,boundedRangeDelete:!1}}#$(J){let Y=this.#Y.href.endsWith("/")?this.#Y.href:`${this.#Y.href}/`;return new URL(J.replace(/^\/+/,""),Y)}#G(J){return this.#$(`/v1/storage/${encodeURIComponent(J)}`)}#_(J,Y){let Z=this.#$("/v1/storage");return Z.searchParams.set("prefix",J),W(Z,"limit",Y.limit),W(Z,"reverse",Y.reverse),W(Z,"gt",Y.gt),W(Z,"gte",Y.gte),W(Z,"lt",Y.lt),W(Z,"lte",Y.lte),Z}async#X(J,Y={},Z=[]){let G=new Headers(this.#Z);for(let[F,L]of new Headers(Y.headers).entries())G.set(F,L);let X=await fetch(J,{...Y,headers:G});if(!X.ok&&!Z.includes(X.status))throw Error(`HTTPStorage request failed: ${Y.method??"GET"} ${J.pathname} returned ${String(X.status)}.`);return X}async get(J){let Y=await this.#X(this.#G(J),{method:"GET"},[404]);if(Y.status===404)return null;return new Uint8Array(await Y.arrayBuffer())}async put(J,Y){await this.#X(this.#G(J),{method:"PUT",headers:{"content-type":"application/octet-stream"},body:new Blob([Y])})}async delete(J){await this.#X(this.#G(J),{method:"DELETE"})}async*scan(J,Y={}){let Z=await this.#X(this.#_(J,Y),{method:"GET",headers:{accept:"application/x-ndjson"}});for await(let G of i(Z)){let X=s(G);if(X!==null)yield X}}async batch(J){await this.#X(this.#$("/v1/storage/-/batch"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({operations:J.map(I)})})}async conditionalBatch(J,Y){let Z=await this.#X(this.#$("/v1/storage/-/conditional-batch"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({conditions:J.map(l),operations:Y.map(I)})});return p(await Z.json())}has(J){return M(this,J)}async*keys(J,Y){yield*Q(this,J,Y)}count(J){return V(this,J)}deletePrefix(J){return E(this,J)}deleteRange(J,Y){return H(this,J,j(Y))}scoped(J){return S(this,J)}[Symbol.dispose](){}}export{r as HTTPStorage};
1
+ var k=Object.defineProperty;var u=(F)=>F;function m(F,J){this[F]=u.bind(null,J)}var n=(F,J)=>{for(var Q in J)k(F,Q,{get:J[Q],enumerable:!0,configurable:!0,set:m.bind(J,Q)})};function U(F){let J=[];for(let Q=0;Q<F.length;Q+=512)J.push(String.fromCharCode(...F.subarray(Q,Q+512)));return btoa(J.join(""))}function T(F){let J=atob(F),Q=new Uint8Array(J.length);for(let Z=0;Z<J.length;Z+=1)Q[Z]=J.charCodeAt(Z);return Q}function N(F){return typeof F==="object"&&F!==null&&!Array.isArray(F)}async function M(F,J){return await F.get(J)!==null}async function*X(F,J,Q){for await(let[Z]of F.scan(J,Q))yield Z}async function V(F,J){let Q=0;for await(let Z of X(F,J))Q++;return Q}async function E(F,J){let Q=[];for await(let Z of X(F,J))Q.push({type:"delete",key:Z});if(Q.length===0)return 0;return await F.batch(Q),Q.length}async function H(F,J,Q){let Z=[];for await(let $ of X(F,J,Q))Z.push({type:"delete",key:$});if(Z.length===0)return 0;return await F.batch(Z),Z.length}function q(F,J,Q){if(!F.capabilities()[J])throw Error(`Feature "${Q}" requires storage capability "${J}", but this storage backend does not provide it.`)}var R="default";function O(F){return F.length>0?F.slice(0,-1)+String.fromCharCode(F.charCodeAt(F.length-1)+1):"ÿ"}function GF(F,J={}){if(J.gt!==void 0&&F<=J.gt)return!1;if(J.gte!==void 0&&F<J.gte)return!1;if(J.lt!==void 0&&F>=J.lt)return!1;if(J.lte!==void 0&&F>J.lte)return!1;return!0}function WF(F,J){if(F===null||J===null)return F===J;if(F.byteLength!==J.byteLength)return!1;for(let Q=0;Q<F.byteLength;Q++)if(F[Q]!==J[Q])return!1;return!0}async function P(F,J){if(F.has)return F.has(J);return M(F,J)}function h(F,J,Q){if(F.keys)return F.keys(J,Q);return X(F,J,Q)}async function v(F,J){if(F.count)return F.count(J);return V(F,J)}async function C(F,J){if(F.deletePrefix)return F.deletePrefix(J);return E(F,J)}async function b(F,J,Q){if(q(F,"conditionalBatch","storageConditionalBatch"),!F.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return F.conditionalBatch(J,Q)}function Y(F){return encodeURIComponent(F)}function XF(F){try{return decodeURIComponent(F)}catch{return null}}var G=(F)=>String(F).padStart(16,"0"),_F={workflow:(F)=>`wf:${Y(F)}`,checkpoint:(F)=>`wf:${Y(F)}:ckpt`,checkpointHistory:(F,J)=>`wf:${Y(F)}:ckpt:${String(J).padStart(10,"0")}`,timelinePrefix:(F)=>`wf:${Y(F)}:timeline:`,timeline:(F,J)=>`wf:${Y(F)}:timeline:${String(J).padStart(10,"0")}`,schedule:(F)=>`schedule:${Y(F)}`,scheduleTick:(F,J)=>`schedule-due:${String(F).padStart(16,"0")}:${Y(J)}`,scheduleRun:(F)=>`schedule-run:${Y(F)}`,operation:(F,J,Q)=>`op:${F}:${G(J)}:${Q}`,operationInflight:(F)=>`op:inflight:${F}`,operationQueued:(F)=>`op:queued:${F}`,operationResolved:(F)=>`op:resolved:${F}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(F,J,Q)=>`audit:bulk:${G(F)}:${Y(J)}:${Y(Q)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(F,J)=>`op:resolved-by-time:${G(F)}:${Y(J)}`,asyncActivity:(F,J)=>`async-act:v1:${Y(F)}:${Y(J)}`,activityReconciliationPrefix:(F)=>`actrec:v1:${Y(F)}:`,activityReconciliation:(F,J,Q)=>`actrec:v1:${Y(F)}:${Y(J)}:${Q}`,eventPrefix:(F)=>`ev:${Y(F)}:`,event:(F,J)=>`ev:${Y(F)}:${String(J).padStart(10,"0")}`,eventHead:(F)=>`ev:${Y(F)}:head`,eventWatermark:(F)=>`ev:${Y(F)}:watermark`,signal:(F,J,Q)=>`sig:${Y(F)}:${J}:${Y(Q)}`,signalSequence:(F)=>`sigseq:v1:${Y(F)}`,signalAcceptedResponsePrefix:(F)=>`sigres:v1:${Y(F)}:`,signalAcceptedResponse:(F,J,Q)=>`sigres:v1:${Y(F)}:${Y(J)}:${Y(Q)}`,deadline:(F,J)=>`wf-deadline:${G(F)}:${Y(J)}`,terminalCleanup:(F,J)=>`wf-cleanup:${G(F)}:${Y(J)}`,delayedStart:(F,J)=>`wf-delayed:${G(F)}:${Y(J)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(F,J)=>`wf-terminal:${G(F)}:${Y(J)}`,attribute:(F)=>`attr:${Y(F)}`,attributeIndex:(F,J,Q)=>`idx:${F}:${J}:${Y(Q)}`,tagIndex:(F,J)=>`tag:${Y(F)}:${Y(J)}`,updatePrefix:(F)=>`upd:${Y(F)}:`,update:(F,J)=>`upd:${Y(F)}:${J}`,updateResponse:(F)=>`upr:${F}`,updateIdempotency:(F,J)=>`upk:${Y(F)}:${J}`,startIdempotency:(F)=>`start-idem:${Y(F)}`,startIdempotencySignalId:(F)=>`start-idem:${F}`,livenessPrefix:()=>"liveness:",liveness:(F)=>`liveness:${Y(F)}`,budget:(F,J,Q)=>`budget:${F}:${J}:${Q}`,review:(F,J)=>`review:${Y(F)}:${J}`,workflowHeaders:(F)=>`wf-headers:${Y(F)}`,terminalCleanupNeeded:(F)=>`wf-cleanup-needed:${Y(F)}`,workflowHasServices:(F)=>`wf-has-services:${Y(F)}`,offload:(F,J)=>`offload:${Y(F)}:${J}`,archive:(F,J)=>`archive:${Y(F)}:${J}`,stateExecution:(F,J)=>`state:execution:${Y(F)}:${Y(J)}`,stateWorkflow:(F,J)=>`state:workflow-scope:${R}:${Y(F)}:${Y(J)}`,streamChunkPrefix:(F,J)=>`blob:${Y(F)}:${J}:chunk:`,streamChunk:(F,J,Q)=>`blob:${Y(F)}:${J}:chunk:${String(Q).padStart(10,"0")}`,streamMetadata:(F,J)=>`blob:${Y(F)}:${J}:meta`,budgetCharged:(F)=>`budget-charged:${F}`,toolEffect:(F,J,Q)=>`tool-effect:${Y(F)}:${J}:${Q}`,workflowVisibilityStatus:(F,J)=>`wf-idx-status:${Y(F)}:${Y(J)}`,workflowVisibilityType:(F,J)=>`wf-idx-type:${Y(F)}:${Y(J)}`,workflowVisibilityCreated:(F,J)=>`wf-idx-created:${G(F)}:${Y(J)}`,workflowVisibilityUpdated:(F,J)=>`wf-idx-updated:${G(F)}:${Y(J)}`,workflowVisibilityDeadline:(F,J)=>`wf-idx-deadline:${G(F)}:${Y(J)}`,workflowVisibilityManifest:(F)=>`wf-idx-manifest:${Y(F)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function w(F){if(F===void 0)return;if(typeof F!=="number"||!Number.isInteger(F)||F<0)throw Error("deleteRange limit must be a finite non-negative integer");return F===0?0:F}function j(F){let J={},Q=!1;for(let $ of["gt","gte","lt","lte"]){let W=F[$];if(W===void 0)continue;if(typeof W!=="string")throw Error("deleteRange bounds must be strings");J[$]=W,Q=!0}if(!Q)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Z=w(F.limit);if(Z!==void 0)J.limit=Z;return J}async function K(F,J,Q){let Z=j(Q);if(F.deleteRange)return F.deleteRange(J,Z);return H(F,J,Z)}function c(F,J){let Q={key:F,open:!1};if(J.gte!==void 0&&J.gte>Q.key)Q.key=J.gte,Q.open=!1;if(J.gt!==void 0&&J.gt>=Q.key)Q.key=J.gt,Q.open=!0;return Q}function y(F,J){let Q={key:O(F),open:!0};if(J.lt!==void 0&&J.lt<=Q.key)Q.key=J.lt,Q.open=!0;if(J.lte!==void 0&&J.lte<Q.key)Q.key=J.lte,Q.open=!1;return Q}function HF(F,J){let Q=c(F,J),Z=y(F,J);if(Q.key>Z.key||Q.key===Z.key&&(Q.open||Z.open))return null;return{lower:Q,upper:Z}}function B(F){return F.replaceAll(/:+$/g,"")}function g(F,J){let Q=B(F),Z=B(J);if(Q.length===0)return Z;if(Z.length===0)return Q;return`${Q}:${Z}`}class D{#J;#Q;constructor(F,J){this.#J=F,this.#Q=B(J)}#F(F){if(this.#Q.length===0)return F;return F.length===0?`${this.#Q}:`:`${this.#Q}:${F}`}#Y(F){if(this.#Q.length===0)return F;return F.slice(this.#Q.length+1)}#Z(F={}){let J={};if(F.limit!==void 0)J.limit=F.limit;if(F.reverse!==void 0)J.reverse=F.reverse;if(F.gt!==void 0)J.gt=this.#F(F.gt);if(F.gte!==void 0)J.gte=this.#F(F.gte);if(F.lt!==void 0)J.lt=this.#F(F.lt);if(F.lte!==void 0)J.lte=this.#F(F.lte);return J}#G(F){let J={};if(F.limit!==void 0)J.limit=F.limit;if(F.gt!==void 0)J.gt=this.#F(F.gt);if(F.gte!==void 0)J.gte=this.#F(F.gte);if(F.lt!==void 0)J.lt=this.#F(F.lt);if(F.lte!==void 0)J.lte=this.#F(F.lte);return J}capabilities(){return this.#J.capabilities()}scoped(F){return new D(this.#J,g(this.#Q,F))}async get(F){return this.#J.get(this.#F(F))}async put(F,J){await this.#J.put(this.#F(F),J)}async delete(F){await this.#J.delete(this.#F(F))}async*scan(F,J){for await(let[Q,Z]of this.#J.scan(this.#F(F),this.#Z(J)))yield[this.#Y(Q),Z]}async batch(F){await this.#J.batch(F.map((J)=>{if(J.type==="put")return{type:"put",key:this.#F(J.key),value:J.value};return{type:"delete",key:this.#F(J.key)}}))}async conditionalBatch(F,J){return b(this.#J,F.map((Q)=>({key:this.#F(Q.key),expectedValue:Q.expectedValue})),J.map((Q)=>{if(Q.type==="put")return{type:"put",key:this.#F(Q.key),value:Q.value};return{type:"delete",key:this.#F(Q.key)}}))}async has(F){return P(this.#J,this.#F(F))}async deletePrefix(F){return C(this.#J,this.#F(F))}async deleteRange(F,J){let Q=this.#G(j(J));return K(this.#J,this.#F(F),Q)}async*keys(F,J){for await(let Q of h(this.#J,this.#F(F),this.#Z(J)))yield this.#Y(Q)}async count(F){return v(this.#J,this.#F(F))}[Symbol.dispose](){this.#J[Symbol.dispose]()}}function S(F,J){return new D(F,J)}var f=67108864;function I(F){if(F.type==="put")return{type:"put",key:F.key,value:U(F.value)};return{type:"delete",key:F.key}}function l(F){return{key:F.key,expectedValue:F.expectedValue===null?null:U(F.expectedValue)}}function d(F){if(!N(F)||typeof F.key!=="string"||typeof F.value!=="string")throw Error("HTTPStorage scan response contained an invalid NDJSON entry.");return{key:F.key,value:F.value}}function p(F){if(!N(F)||typeof F.applied!=="boolean")throw Error('HTTPStorage conditional batch response must include a boolean "applied" field.');return F.applied}function _(F,J,Q){if(Q!==void 0)F.searchParams.set(J,String(Q))}function s(F){if(F.trim().length===0)return null;let J=d(JSON.parse(F));return[J.key,T(J.value)]}function a(F){if(F>f)throw Error("HTTPStorage scan response exceeded the maximum allowed size.")}async function*i(F){if(F.body===null)return;let J=F.body.getReader(),Q=new TextDecoder,Z="",$=0,W=!1;try{while(!0){let{done:L,value:A}=await J.read();if(L){W=!0;break}$+=A.byteLength,a($),Z+=Q.decode(A,{stream:!0});let z=Z.split(`
2
+ `);Z=z.pop()??"";for(let x of z)yield x}if(Z+=Q.decode(),Z.length>0)yield Z}finally{try{if(!W)await J.cancel()}catch{}J.releaseLock()}}class r{#J;#Q;#F;constructor(F){this.#J=F.baseUrl instanceof URL?F.baseUrl:new URL(F.baseUrl),this.#Q={...F.headers},this.#F=F.remoteConditionalBatch??!1}capabilities(){return{persistence:"remote",readAfterWrite:"eventual",scanConsistency:"best-effort",atomicBatch:!0,conditionalBatch:this.#F,boundedRangeDelete:!1}}#Y(F){let J=this.#J.href.endsWith("/")?this.#J.href:`${this.#J.href}/`;return new URL(F.replace(/^\/+/,""),J)}#Z(F){return this.#Y(`/v1/storage/${encodeURIComponent(F)}`)}#G(F,J){let Q=this.#Y("/v1/storage");return Q.searchParams.set("prefix",F),_(Q,"limit",J.limit),_(Q,"reverse",J.reverse),_(Q,"gt",J.gt),_(Q,"gte",J.gte),_(Q,"lt",J.lt),_(Q,"lte",J.lte),Q}async#$(F,J={},Q=[]){let Z=new Headers(this.#Q);for(let[W,L]of new Headers(J.headers).entries())Z.set(W,L);let $=await fetch(F,{...J,headers:Z});if(!$.ok&&!Q.includes($.status))throw Error(`HTTPStorage request failed: ${J.method??"GET"} ${F.pathname} returned ${String($.status)}.`);return $}async get(F){let J=await this.#$(this.#Z(F),{method:"GET"},[404]);if(J.status===404)return null;return new Uint8Array(await J.arrayBuffer())}async put(F,J){await this.#$(this.#Z(F),{method:"PUT",headers:{"content-type":"application/octet-stream"},body:new Blob([J])})}async delete(F){await this.#$(this.#Z(F),{method:"DELETE"})}async*scan(F,J={}){let Q=await this.#$(this.#G(F,J),{method:"GET",headers:{accept:"application/x-ndjson"}});for await(let Z of i(Q)){let $=s(Z);if($!==null)yield $}}async batch(F){await this.#$(this.#Y("/v1/storage/-/batch"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({operations:F.map(I)})})}async conditionalBatch(F,J){let Q=await this.#$(this.#Y("/v1/storage/-/conditional-batch"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({conditions:F.map(l),operations:J.map(I)})});return p(await Q.json())}has(F){return M(this,F)}async*keys(F,J){yield*X(this,F,J)}count(F){return V(this,F)}deletePrefix(F){return E(this,F)}deleteRange(F,J){return H(this,F,j(J))}scoped(F){return S(this,F)}[Symbol.dispose](){}}export{r as HTTPStorage};
@@ -13,6 +13,7 @@
13
13
  * import { SQLiteStorage } from '@lostgradient/weft/storage/sqlite'; // Bun or Node SQLite
14
14
  * import { LMDBStorage } from '@lostgradient/weft/storage/lmdb'; // peer: lmdb
15
15
  * import { TursoStorage } from '@lostgradient/weft/storage/turso'; // peer: @libsql/client
16
+ * import { NeonStorage } from '@lostgradient/weft/storage/neon'; // peer: @neondatabase/serverless
16
17
  * import { IndexedDBStorage } from '@lostgradient/weft/storage/indexeddb'; // browser-only
17
18
  * import { WebExtensionStorage } from '@lostgradient/weft/storage/web-extension'; // extension-only
18
19
  * import { HTTPStorage } from '@lostgradient/weft/storage/http'; // remote storage
@@ -119,10 +120,15 @@ declare const exportedKeys: {
119
120
  readonly update: (workflowId: string, updateId: string) => string;
120
121
  readonly updateResponse: (updateId: string) => string;
121
122
  readonly updateIdempotency: (workflowId: string, key: string) => string;
123
+ readonly startIdempotency: (key: string) => string;
124
+ readonly startIdempotencySignalId: (key: string) => string;
125
+ readonly livenessPrefix: () => string;
126
+ readonly liveness: (instanceId: string) => string;
122
127
  readonly budget: (namespace: string, period: string, date: string) => string;
123
128
  readonly review: (workflowId: string, reviewId: string) => string;
124
129
  readonly workflowHeaders: (workflowId: string) => string;
125
130
  readonly terminalCleanupNeeded: (workflowId: string) => string;
131
+ readonly workflowHasServices: (workflowId: string) => string;
126
132
  readonly offload: (workflowId: string, key: string) => string;
127
133
  readonly archive: (workflowId: string, key: string) => string;
128
134
  readonly stateExecution: (ownerWorkflowId: string, key: string) => string;
@@ -269,7 +275,7 @@ declare const exportedTextValueStore: typeof textValueStore;
269
275
  * void isWeftKey;
270
276
  * ```
271
277
  */
272
- declare const exportedWeftReservedKeyPrefixes: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "ev:", "idx:", "offload:", "op:", "review:", "schedule:", "schedule-due:", "schedule-run:", "sig:", "sigres:", "sigseq:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-deadline:", "wf-delayed:", "wf-headers:", "wf-idx-", "wf-terminal:"];
278
+ declare const exportedWeftReservedKeyPrefixes: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "ev:", "idx:", "liveness:", "offload:", "op:", "review:", "schedule:", "schedule-due:", "schedule-run:", "sig:", "sigres:", "sigseq:", "start-idem:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-deadline:", "wf-delayed:", "wf-has-services:", "wf-headers:", "wf-idx-", "wf-terminal:"];
273
279
  /**
274
280
  * Re-exported {@link withCodec}. See the original declaration for full docs.
275
281
  *
@@ -1 +1 @@
1
- var l=Object.defineProperty;var d=(Y)=>Y;function p(Y,J){this[Y]=d.bind(null,J)}var t=(Y,J)=>{for(var U in J)l(Y,U,{get:J[U],enumerable:!0,configurable:!0,set:p.bind(J,U)})};async function E(Y,J){return await Y.get(J)!==null}async function*T(Y,J,U){for await(let[X]of Y.scan(J,U))yield X}async function v(Y,J){let U=0;for await(let X of T(Y,J))U++;return U}async function K(Y,J){let U=[];for await(let X of T(Y,J))U.push({type:"delete",key:X});if(U.length===0)return 0;return await Y.batch(U),U.length}async function C(Y,J,U){let X=[];for await(let $ of T(Y,J,U))X.push({type:"delete",key:$});if(X.length===0)return 0;return await Y.batch(X),X.length}function q(Y,J,U){if(!Y.capabilities()[J])throw Error(`Feature "${U}" requires storage capability "${J}", but this storage backend does not provide it.`)}var b="default";function N(Y){return Y.length>0?Y.slice(0,-1)+String.fromCharCode(Y.charCodeAt(Y.length-1)+1):"ÿ"}function O(Y,J={}){if(J.gt!==void 0&&Y<=J.gt)return!1;if(J.gte!==void 0&&Y<J.gte)return!1;if(J.lt!==void 0&&Y>=J.lt)return!1;if(J.lte!==void 0&&Y>J.lte)return!1;return!0}function I(Y,J){if(Y===null||J===null)return Y===J;if(Y.byteLength!==J.byteLength)return!1;for(let U=0;U<Y.byteLength;U++)if(Y[U]!==J[U])return!1;return!0}async function S(Y,J){if(Y.has)return Y.has(J);return E(Y,J)}function x(Y,J,U){if(Y.keys)return Y.keys(J,U);return T(Y,J,U)}async function k(Y,J){if(Y.count)return Y.count(J);return v(Y,J)}async function w(Y,J){if(Y.deletePrefix)return Y.deletePrefix(J);return K(Y,J)}async function u(Y,J,U){if(q(Y,"conditionalBatch","storageConditionalBatch"),!Y.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return Y.conditionalBatch(J,U)}function Z(Y){return encodeURIComponent(Y)}function GY(Y){try{return decodeURIComponent(Y)}catch{return null}}var _=(Y)=>String(Y).padStart(16,"0"),FY={workflow:(Y)=>`wf:${Z(Y)}`,checkpoint:(Y)=>`wf:${Z(Y)}:ckpt`,checkpointHistory:(Y,J)=>`wf:${Z(Y)}:ckpt:${String(J).padStart(10,"0")}`,timelinePrefix:(Y)=>`wf:${Z(Y)}:timeline:`,timeline:(Y,J)=>`wf:${Z(Y)}:timeline:${String(J).padStart(10,"0")}`,schedule:(Y)=>`schedule:${Z(Y)}`,scheduleTick:(Y,J)=>`schedule-due:${String(Y).padStart(16,"0")}:${Z(J)}`,scheduleRun:(Y)=>`schedule-run:${Z(Y)}`,operation:(Y,J,U)=>`op:${Y}:${_(J)}:${U}`,operationInflight:(Y)=>`op:inflight:${Y}`,operationQueued:(Y)=>`op:queued:${Y}`,operationResolved:(Y)=>`op:resolved:${Y}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(Y,J,U)=>`audit:bulk:${_(Y)}:${Z(J)}:${Z(U)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(Y,J)=>`op:resolved-by-time:${_(Y)}:${Z(J)}`,asyncActivity:(Y,J)=>`async-act:v1:${Z(Y)}:${Z(J)}`,activityReconciliationPrefix:(Y)=>`actrec:v1:${Z(Y)}:`,activityReconciliation:(Y,J,U)=>`actrec:v1:${Z(Y)}:${Z(J)}:${U}`,eventPrefix:(Y)=>`ev:${Z(Y)}:`,event:(Y,J)=>`ev:${Z(Y)}:${String(J).padStart(10,"0")}`,eventHead:(Y)=>`ev:${Z(Y)}:head`,eventWatermark:(Y)=>`ev:${Z(Y)}:watermark`,signal:(Y,J,U)=>`sig:${Z(Y)}:${J}:${Z(U)}`,signalSequence:(Y)=>`sigseq:v1:${Z(Y)}`,signalAcceptedResponsePrefix:(Y)=>`sigres:v1:${Z(Y)}:`,signalAcceptedResponse:(Y,J,U)=>`sigres:v1:${Z(Y)}:${Z(J)}:${Z(U)}`,deadline:(Y,J)=>`wf-deadline:${_(Y)}:${Z(J)}`,terminalCleanup:(Y,J)=>`wf-cleanup:${_(Y)}:${Z(J)}`,delayedStart:(Y,J)=>`wf-delayed:${_(Y)}:${Z(J)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(Y,J)=>`wf-terminal:${_(Y)}:${Z(J)}`,attribute:(Y)=>`attr:${Z(Y)}`,attributeIndex:(Y,J,U)=>`idx:${Y}:${J}:${Z(U)}`,tagIndex:(Y,J)=>`tag:${Z(Y)}:${Z(J)}`,updatePrefix:(Y)=>`upd:${Z(Y)}:`,update:(Y,J)=>`upd:${Z(Y)}:${J}`,updateResponse:(Y)=>`upr:${Y}`,updateIdempotency:(Y,J)=>`upk:${Z(Y)}:${J}`,budget:(Y,J,U)=>`budget:${Y}:${J}:${U}`,review:(Y,J)=>`review:${Z(Y)}:${J}`,workflowHeaders:(Y)=>`wf-headers:${Z(Y)}`,terminalCleanupNeeded:(Y)=>`wf-cleanup-needed:${Z(Y)}`,offload:(Y,J)=>`offload:${Z(Y)}:${J}`,archive:(Y,J)=>`archive:${Z(Y)}:${J}`,stateExecution:(Y,J)=>`state:execution:${Z(Y)}:${Z(J)}`,stateWorkflow:(Y,J)=>`state:workflow-scope:${b}:${Z(Y)}:${Z(J)}`,streamChunkPrefix:(Y,J)=>`blob:${Z(Y)}:${J}:chunk:`,streamChunk:(Y,J,U)=>`blob:${Z(Y)}:${J}:chunk:${String(U).padStart(10,"0")}`,streamMetadata:(Y,J)=>`blob:${Z(Y)}:${J}:meta`,budgetCharged:(Y)=>`budget-charged:${Y}`,toolEffect:(Y,J,U)=>`tool-effect:${Z(Y)}:${J}:${U}`,workflowVisibilityStatus:(Y,J)=>`wf-idx-status:${Z(Y)}:${Z(J)}`,workflowVisibilityType:(Y,J)=>`wf-idx-type:${Z(Y)}:${Z(J)}`,workflowVisibilityCreated:(Y,J)=>`wf-idx-created:${_(Y)}:${Z(J)}`,workflowVisibilityUpdated:(Y,J)=>`wf-idx-updated:${_(Y)}:${Z(J)}`,workflowVisibilityDeadline:(Y,J)=>`wf-idx-deadline:${_(Y)}:${Z(J)}`,workflowVisibilityManifest:(Y)=>`wf-idx-manifest:${Z(Y)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function s(Y){if(Y===void 0)return;if(typeof Y!=="number"||!Number.isInteger(Y)||Y<0)throw Error("deleteRange limit must be a finite non-negative integer");return Y===0?0:Y}function P(Y){let J={},U=!1;for(let $ of["gt","gte","lt","lte"]){let F=Y[$];if(F===void 0)continue;if(typeof F!=="string")throw Error("deleteRange bounds must be strings");J[$]=F,U=!0}if(!U)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let X=s(Y.limit);if(X!==void 0)J.limit=X;return J}async function y(Y,J,U){let X=P(U);if(Y.deleteRange)return Y.deleteRange(J,X);return C(Y,J,X)}function a(Y,J){let U={key:Y,open:!1};if(J.gte!==void 0&&J.gte>U.key)U.key=J.gte,U.open=!1;if(J.gt!==void 0&&J.gt>=U.key)U.key=J.gt,U.open=!0;return U}function i(Y,J){let U={key:N(Y),open:!0};if(J.lt!==void 0&&J.lt<=U.key)U.key=J.lt,U.open=!0;if(J.lte!==void 0&&J.lte<U.key)U.key=J.lte,U.open=!1;return U}function m(Y,J){let U=a(Y,J),X=i(Y,J);if(U.key>X.key||U.key===X.key&&(U.open||X.open))return null;return{lower:U,upper:X}}function R(Y){return Y.replaceAll(/:+$/g,"")}function n(Y,J){let U=R(Y),X=R(J);if(U.length===0)return X;if(X.length===0)return U;return`${U}:${X}`}class h{#J;#U;constructor(Y,J){this.#J=Y,this.#U=R(J)}#Y(Y){if(this.#U.length===0)return Y;return Y.length===0?`${this.#U}:`:`${this.#U}:${Y}`}#X(Y){if(this.#U.length===0)return Y;return Y.slice(this.#U.length+1)}#Z(Y={}){let J={};if(Y.limit!==void 0)J.limit=Y.limit;if(Y.reverse!==void 0)J.reverse=Y.reverse;if(Y.gt!==void 0)J.gt=this.#Y(Y.gt);if(Y.gte!==void 0)J.gte=this.#Y(Y.gte);if(Y.lt!==void 0)J.lt=this.#Y(Y.lt);if(Y.lte!==void 0)J.lte=this.#Y(Y.lte);return J}#$(Y){let J={};if(Y.limit!==void 0)J.limit=Y.limit;if(Y.gt!==void 0)J.gt=this.#Y(Y.gt);if(Y.gte!==void 0)J.gte=this.#Y(Y.gte);if(Y.lt!==void 0)J.lt=this.#Y(Y.lt);if(Y.lte!==void 0)J.lte=this.#Y(Y.lte);return J}capabilities(){return this.#J.capabilities()}scoped(Y){return new h(this.#J,n(this.#U,Y))}async get(Y){return this.#J.get(this.#Y(Y))}async put(Y,J){await this.#J.put(this.#Y(Y),J)}async delete(Y){await this.#J.delete(this.#Y(Y))}async*scan(Y,J){for await(let[U,X]of this.#J.scan(this.#Y(Y),this.#Z(J)))yield[this.#X(U),X]}async batch(Y){await this.#J.batch(Y.map((J)=>{if(J.type==="put")return{type:"put",key:this.#Y(J.key),value:J.value};return{type:"delete",key:this.#Y(J.key)}}))}async conditionalBatch(Y,J){return u(this.#J,Y.map((U)=>({key:this.#Y(U.key),expectedValue:U.expectedValue})),J.map((U)=>{if(U.type==="put")return{type:"put",key:this.#Y(U.key),value:U.value};return{type:"delete",key:this.#Y(U.key)}}))}async has(Y){return S(this.#J,this.#Y(Y))}async deletePrefix(Y){return w(this.#J,this.#Y(Y))}async deleteRange(Y,J){let U=this.#$(P(J));return y(this.#J,this.#Y(Y),U)}async*keys(Y,J){for await(let U of x(this.#J,this.#Y(Y),this.#Z(J)))yield this.#X(U)}async count(Y){return k(this.#J,this.#Y(Y))}[Symbol.dispose](){this.#J[Symbol.dispose]()}}function f(Y,J){return new h(Y,J)}var Q="kv";function A(Y){return new Promise((J,U)=>{Y.onsuccess=()=>J(Y.result),Y.onerror=()=>U(Y.error)})}function g(Y,J){let U=null,X=null,$=null,F=(G,V)=>{let W=G??Error(V);if(X){let B=X;U=null,X=null,B(W);return}$=W};return Y.onsuccess=()=>{if(!U)return;let G=U;U=null,X=null,G(Y.result)},Y.onerror=()=>{F(Y.error,"IndexedDB cursor request failed.")},J.onerror=()=>{F(J.error,"IndexedDB transaction failed.")},J.onabort=()=>{F(J.error,"IndexedDB transaction aborted.")},()=>{return new Promise((G,V)=>{if($){let W=$;$=null,V(W);return}if(U=G,X=V,Y.readyState==="done"){let W=U;U=null,X=null,W?.(Y.result)}})}}class r{#J;#U=null;#Y;constructor(Y="weft"){this.#J=Y,this.#Y=this.#X()}capabilities(){return{persistence:"local",readAfterWrite:"linearizable",scanConsistency:"best-effort",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#X(){let Y=indexedDB.open(this.#J,1);return Y.onupgradeneeded=()=>{let J=Y.result;if(!J.objectStoreNames.contains(Q))J.createObjectStore(Q)},A(Y).then((J)=>{return this.#U=J,J})}async get(Y){let X=(await this.#Y).transaction(Q,"readonly").objectStore(Q),$=await A(X.get(Y));return $===void 0?null:new Uint8Array($)}async put(Y,J){let $=(await this.#Y).transaction(Q,"readwrite").objectStore(Q);await A($.put(J,Y))}async delete(Y){let X=(await this.#Y).transaction(Q,"readwrite").objectStore(Q);await A(X.delete(Y))}async has(Y){let X=(await this.#Y).transaction(Q,"readonly").objectStore(Q);return await A(X.count(Y))>0}async deletePrefix(Y){let J=await this.#Y,U=N(Y),X=IDBKeyRange.bound(Y,U,!1,!0);return new Promise(($,F)=>{let G=J.transaction(Q,"readwrite"),V=G.objectStore(Q),W=0,B=V.count(X);B.onsuccess=()=>{W=B.result,V.delete(X)},G.oncomplete=()=>$(W),G.onerror=()=>F(G.error)})}async deleteRange(Y,J){let U=P(J),X=m(Y,U);if(X===null)return 0;let $=IDBKeyRange.bound(X.lower.key,X.upper.key,X.lower.open,X.upper.open),F=await this.#Y,{limit:G}=U;return new Promise((V,W)=>{let B=F.transaction(Q,"readwrite"),M=B.objectStore(Q),D=0;if(G===void 0){let H=M.count($);H.onsuccess=()=>{D=H.result,M.delete($)}}else{let H=M.openCursor($,"next");H.onsuccess=()=>{let z=H.result;if(z===null||D>=G)return;if(z.delete(),D++,D<G)z.continue()}}B.oncomplete=()=>V(D),B.onerror=()=>W(B.error)})}async*scan(Y,J={}){let{limit:U,reverse:X}=J,$=await this.#Y,F=N(Y),G=IDBKeyRange.bound(Y,F,!1,!0),V=X?"prev":"next",W=$.transaction(Q,"readonly"),M=W.objectStore(Q).openCursor(G,V),D=0,H=g(M,W),z=!1;try{let L=await H();while(L){if(U!==void 0&&D>=U)break;let j=L.key;if(O(j,J))yield[j,new Uint8Array(L.value)],D++;L.continue(),L=await H()}z=!0}finally{if(!z)try{W.abort()}catch{}}}async batch(Y){if(Y.length===0)return;let J=await this.#Y;return new Promise((U,X)=>{let $=J.transaction(Q,"readwrite"),F=$.objectStore(Q);for(let G of Y)if(G.type==="put")F.put(G.value,G.key);else F.delete(G.key);$.oncomplete=()=>U(),$.onerror=()=>X($.error)})}async conditionalBatch(Y,J){let U=await this.#Y;return new Promise((X,$)=>{let F=U.transaction(Q,"readwrite"),G=F.objectStore(Q),V=!1,W=!1,B=(H,z)=>{if(V)return;V=!0,$(H??Error(z))};F.oncomplete=()=>{if(V)return;V=!0,X(!0)},F.onerror=()=>{B(F.error,"IndexedDB conditionalBatch transaction failed.")},F.onabort=()=>{if(V)return;if(V=!0,W){X(!1);return}$(F.error??Error("IndexedDB conditionalBatch transaction aborted."))};let M=()=>{for(let H of J)if(H.type==="put")G.put(H.value,H.key);else G.delete(H.key)},D=(H)=>{if(H>=Y.length){M();return}let z=Y[H],L=G.get(z.key);L.onsuccess=()=>{let j=L.result,c=j===void 0?null:new Uint8Array(j);if(!I(c,z.expectedValue)){W=!0,F.abort();return}D(H+1)},L.onerror=()=>{B(L.error,"IndexedDB conditionalBatch condition check failed.")}};D(0)})}async*keys(Y,J={}){let{limit:U,reverse:X}=J,$=await this.#Y,F=N(Y),G=IDBKeyRange.bound(Y,F,!1,!0),V=X?"prev":"next",W=$.transaction(Q,"readonly"),M=W.objectStore(Q).openKeyCursor(G,V),D=0,H=g(M,W),z=!1;try{let L=await H();while(L){if(U!==void 0&&D>=U)break;let j=L.key;if(O(j,J))yield j,D++;L.continue(),L=await H()}z=!0}finally{if(!z)try{W.abort()}catch{}}}async count(Y){let J=await this.#Y,U=N(Y),$=J.transaction(Q,"readonly").objectStore(Q);return A($.count(IDBKeyRange.bound(Y,U,!1,!0)))}scoped(Y){return f(this,Y)}[Symbol.dispose](){if(this.#U)this.#U.close(),this.#U=null}}export{r as IndexedDBStorage};
1
+ var l=Object.defineProperty;var d=(F)=>F;function p(F,Y){this[F]=d.bind(null,Y)}var t=(F,Y)=>{for(var J in Y)l(F,J,{get:Y[J],enumerable:!0,configurable:!0,set:p.bind(Y,J)})};async function E(F,Y){return await F.get(Y)!==null}async function*T(F,Y,J){for await(let[U]of F.scan(Y,J))yield U}async function v(F,Y){let J=0;for await(let U of T(F,Y))J++;return J}async function K(F,Y){let J=[];for await(let U of T(F,Y))J.push({type:"delete",key:U});if(J.length===0)return 0;return await F.batch(J),J.length}async function b(F,Y,J){let U=[];for await(let X of T(F,Y,J))U.push({type:"delete",key:X});if(U.length===0)return 0;return await F.batch(U),U.length}function q(F,Y,J){if(!F.capabilities()[Y])throw Error(`Feature "${J}" requires storage capability "${Y}", but this storage backend does not provide it.`)}var C="default";function N(F){return F.length>0?F.slice(0,-1)+String.fromCharCode(F.charCodeAt(F.length-1)+1):"ÿ"}function O(F,Y={}){if(Y.gt!==void 0&&F<=Y.gt)return!1;if(Y.gte!==void 0&&F<Y.gte)return!1;if(Y.lt!==void 0&&F>=Y.lt)return!1;if(Y.lte!==void 0&&F>Y.lte)return!1;return!0}function I(F,Y){if(F===null||Y===null)return F===Y;if(F.byteLength!==Y.byteLength)return!1;for(let J=0;J<F.byteLength;J++)if(F[J]!==Y[J])return!1;return!0}async function S(F,Y){if(F.has)return F.has(Y);return E(F,Y)}function x(F,Y,J){if(F.keys)return F.keys(Y,J);return T(F,Y,J)}async function k(F,Y){if(F.count)return F.count(Y);return v(F,Y)}async function w(F,Y){if(F.deletePrefix)return F.deletePrefix(Y);return K(F,Y)}async function u(F,Y,J){if(q(F,"conditionalBatch","storageConditionalBatch"),!F.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return F.conditionalBatch(Y,J)}function Q(F){return encodeURIComponent(F)}function ZF(F){try{return decodeURIComponent(F)}catch{return null}}var _=(F)=>String(F).padStart(16,"0"),$F={workflow:(F)=>`wf:${Q(F)}`,checkpoint:(F)=>`wf:${Q(F)}:ckpt`,checkpointHistory:(F,Y)=>`wf:${Q(F)}:ckpt:${String(Y).padStart(10,"0")}`,timelinePrefix:(F)=>`wf:${Q(F)}:timeline:`,timeline:(F,Y)=>`wf:${Q(F)}:timeline:${String(Y).padStart(10,"0")}`,schedule:(F)=>`schedule:${Q(F)}`,scheduleTick:(F,Y)=>`schedule-due:${String(F).padStart(16,"0")}:${Q(Y)}`,scheduleRun:(F)=>`schedule-run:${Q(F)}`,operation:(F,Y,J)=>`op:${F}:${_(Y)}:${J}`,operationInflight:(F)=>`op:inflight:${F}`,operationQueued:(F)=>`op:queued:${F}`,operationResolved:(F)=>`op:resolved:${F}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(F,Y,J)=>`audit:bulk:${_(F)}:${Q(Y)}:${Q(J)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(F,Y)=>`op:resolved-by-time:${_(F)}:${Q(Y)}`,asyncActivity:(F,Y)=>`async-act:v1:${Q(F)}:${Q(Y)}`,activityReconciliationPrefix:(F)=>`actrec:v1:${Q(F)}:`,activityReconciliation:(F,Y,J)=>`actrec:v1:${Q(F)}:${Q(Y)}:${J}`,eventPrefix:(F)=>`ev:${Q(F)}:`,event:(F,Y)=>`ev:${Q(F)}:${String(Y).padStart(10,"0")}`,eventHead:(F)=>`ev:${Q(F)}:head`,eventWatermark:(F)=>`ev:${Q(F)}:watermark`,signal:(F,Y,J)=>`sig:${Q(F)}:${Y}:${Q(J)}`,signalSequence:(F)=>`sigseq:v1:${Q(F)}`,signalAcceptedResponsePrefix:(F)=>`sigres:v1:${Q(F)}:`,signalAcceptedResponse:(F,Y,J)=>`sigres:v1:${Q(F)}:${Q(Y)}:${Q(J)}`,deadline:(F,Y)=>`wf-deadline:${_(F)}:${Q(Y)}`,terminalCleanup:(F,Y)=>`wf-cleanup:${_(F)}:${Q(Y)}`,delayedStart:(F,Y)=>`wf-delayed:${_(F)}:${Q(Y)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(F,Y)=>`wf-terminal:${_(F)}:${Q(Y)}`,attribute:(F)=>`attr:${Q(F)}`,attributeIndex:(F,Y,J)=>`idx:${F}:${Y}:${Q(J)}`,tagIndex:(F,Y)=>`tag:${Q(F)}:${Q(Y)}`,updatePrefix:(F)=>`upd:${Q(F)}:`,update:(F,Y)=>`upd:${Q(F)}:${Y}`,updateResponse:(F)=>`upr:${F}`,updateIdempotency:(F,Y)=>`upk:${Q(F)}:${Y}`,startIdempotency:(F)=>`start-idem:${Q(F)}`,startIdempotencySignalId:(F)=>`start-idem:${F}`,livenessPrefix:()=>"liveness:",liveness:(F)=>`liveness:${Q(F)}`,budget:(F,Y,J)=>`budget:${F}:${Y}:${J}`,review:(F,Y)=>`review:${Q(F)}:${Y}`,workflowHeaders:(F)=>`wf-headers:${Q(F)}`,terminalCleanupNeeded:(F)=>`wf-cleanup-needed:${Q(F)}`,workflowHasServices:(F)=>`wf-has-services:${Q(F)}`,offload:(F,Y)=>`offload:${Q(F)}:${Y}`,archive:(F,Y)=>`archive:${Q(F)}:${Y}`,stateExecution:(F,Y)=>`state:execution:${Q(F)}:${Q(Y)}`,stateWorkflow:(F,Y)=>`state:workflow-scope:${C}:${Q(F)}:${Q(Y)}`,streamChunkPrefix:(F,Y)=>`blob:${Q(F)}:${Y}:chunk:`,streamChunk:(F,Y,J)=>`blob:${Q(F)}:${Y}:chunk:${String(J).padStart(10,"0")}`,streamMetadata:(F,Y)=>`blob:${Q(F)}:${Y}:meta`,budgetCharged:(F)=>`budget-charged:${F}`,toolEffect:(F,Y,J)=>`tool-effect:${Q(F)}:${Y}:${J}`,workflowVisibilityStatus:(F,Y)=>`wf-idx-status:${Q(F)}:${Q(Y)}`,workflowVisibilityType:(F,Y)=>`wf-idx-type:${Q(F)}:${Q(Y)}`,workflowVisibilityCreated:(F,Y)=>`wf-idx-created:${_(F)}:${Q(Y)}`,workflowVisibilityUpdated:(F,Y)=>`wf-idx-updated:${_(F)}:${Q(Y)}`,workflowVisibilityDeadline:(F,Y)=>`wf-idx-deadline:${_(F)}:${Q(Y)}`,workflowVisibilityManifest:(F)=>`wf-idx-manifest:${Q(F)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function s(F){if(F===void 0)return;if(typeof F!=="number"||!Number.isInteger(F)||F<0)throw Error("deleteRange limit must be a finite non-negative integer");return F===0?0:F}function P(F){let Y={},J=!1;for(let X of["gt","gte","lt","lte"]){let $=F[X];if($===void 0)continue;if(typeof $!=="string")throw Error("deleteRange bounds must be strings");Y[X]=$,J=!0}if(!J)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let U=s(F.limit);if(U!==void 0)Y.limit=U;return Y}async function m(F,Y,J){let U=P(J);if(F.deleteRange)return F.deleteRange(Y,U);return b(F,Y,U)}function a(F,Y){let J={key:F,open:!1};if(Y.gte!==void 0&&Y.gte>J.key)J.key=Y.gte,J.open=!1;if(Y.gt!==void 0&&Y.gt>=J.key)J.key=Y.gt,J.open=!0;return J}function i(F,Y){let J={key:N(F),open:!0};if(Y.lt!==void 0&&Y.lt<=J.key)J.key=Y.lt,J.open=!0;if(Y.lte!==void 0&&Y.lte<J.key)J.key=Y.lte,J.open=!1;return J}function y(F,Y){let J=a(F,Y),U=i(F,Y);if(J.key>U.key||J.key===U.key&&(J.open||U.open))return null;return{lower:J,upper:U}}function h(F){return F.replaceAll(/:+$/g,"")}function n(F,Y){let J=h(F),U=h(Y);if(J.length===0)return U;if(U.length===0)return J;return`${J}:${U}`}class R{#Y;#J;constructor(F,Y){this.#Y=F,this.#J=h(Y)}#F(F){if(this.#J.length===0)return F;return F.length===0?`${this.#J}:`:`${this.#J}:${F}`}#Q(F){if(this.#J.length===0)return F;return F.slice(this.#J.length+1)}#U(F={}){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.reverse!==void 0)Y.reverse=F.reverse;if(F.gt!==void 0)Y.gt=this.#F(F.gt);if(F.gte!==void 0)Y.gte=this.#F(F.gte);if(F.lt!==void 0)Y.lt=this.#F(F.lt);if(F.lte!==void 0)Y.lte=this.#F(F.lte);return Y}#X(F){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.gt!==void 0)Y.gt=this.#F(F.gt);if(F.gte!==void 0)Y.gte=this.#F(F.gte);if(F.lt!==void 0)Y.lt=this.#F(F.lt);if(F.lte!==void 0)Y.lte=this.#F(F.lte);return Y}capabilities(){return this.#Y.capabilities()}scoped(F){return new R(this.#Y,n(this.#J,F))}async get(F){return this.#Y.get(this.#F(F))}async put(F,Y){await this.#Y.put(this.#F(F),Y)}async delete(F){await this.#Y.delete(this.#F(F))}async*scan(F,Y){for await(let[J,U]of this.#Y.scan(this.#F(F),this.#U(Y)))yield[this.#Q(J),U]}async batch(F){await this.#Y.batch(F.map((Y)=>{if(Y.type==="put")return{type:"put",key:this.#F(Y.key),value:Y.value};return{type:"delete",key:this.#F(Y.key)}}))}async conditionalBatch(F,Y){return u(this.#Y,F.map((J)=>({key:this.#F(J.key),expectedValue:J.expectedValue})),Y.map((J)=>{if(J.type==="put")return{type:"put",key:this.#F(J.key),value:J.value};return{type:"delete",key:this.#F(J.key)}}))}async has(F){return S(this.#Y,this.#F(F))}async deletePrefix(F){return w(this.#Y,this.#F(F))}async deleteRange(F,Y){let J=this.#X(P(Y));return m(this.#Y,this.#F(F),J)}async*keys(F,Y){for await(let J of x(this.#Y,this.#F(F),this.#U(Y)))yield this.#Q(J)}async count(F){return k(this.#Y,this.#F(F))}[Symbol.dispose](){this.#Y[Symbol.dispose]()}}function f(F,Y){return new R(F,Y)}var G="kv";function A(F){return new Promise((Y,J)=>{F.onsuccess=()=>Y(F.result),F.onerror=()=>J(F.error)})}function g(F,Y){let J=null,U=null,X=null,$=(Z,L)=>{let W=Z??Error(L);if(U){let B=U;J=null,U=null,B(W);return}X=W};return F.onsuccess=()=>{if(!J)return;let Z=J;J=null,U=null,Z(F.result)},F.onerror=()=>{$(F.error,"IndexedDB cursor request failed.")},Y.onerror=()=>{$(Y.error,"IndexedDB transaction failed.")},Y.onabort=()=>{$(Y.error,"IndexedDB transaction aborted.")},()=>{return new Promise((Z,L)=>{if(X){let W=X;X=null,L(W);return}if(J=Z,U=L,F.readyState==="done"){let W=J;J=null,U=null,W?.(F.result)}})}}class r{#Y;#J=null;#F;constructor(F="weft"){this.#Y=F,this.#F=this.#Q()}capabilities(){return{persistence:"local",readAfterWrite:"linearizable",scanConsistency:"best-effort",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#Q(){let F=indexedDB.open(this.#Y,1);return F.onupgradeneeded=()=>{let Y=F.result;if(!Y.objectStoreNames.contains(G))Y.createObjectStore(G)},A(F).then((Y)=>{return this.#J=Y,Y})}async get(F){let U=(await this.#F).transaction(G,"readonly").objectStore(G),X=await A(U.get(F));return X===void 0?null:new Uint8Array(X)}async put(F,Y){let X=(await this.#F).transaction(G,"readwrite").objectStore(G);await A(X.put(Y,F))}async delete(F){let U=(await this.#F).transaction(G,"readwrite").objectStore(G);await A(U.delete(F))}async has(F){let U=(await this.#F).transaction(G,"readonly").objectStore(G);return await A(U.count(F))>0}async deletePrefix(F){let Y=await this.#F,J=N(F),U=IDBKeyRange.bound(F,J,!1,!0);return new Promise((X,$)=>{let Z=Y.transaction(G,"readwrite"),L=Z.objectStore(G),W=0,B=L.count(U);B.onsuccess=()=>{W=B.result,L.delete(U)},Z.oncomplete=()=>X(W),Z.onerror=()=>$(Z.error)})}async deleteRange(F,Y){let J=P(Y),U=y(F,J);if(U===null)return 0;let X=IDBKeyRange.bound(U.lower.key,U.upper.key,U.lower.open,U.upper.open),$=await this.#F,{limit:Z}=J;return new Promise((L,W)=>{let B=$.transaction(G,"readwrite"),M=B.objectStore(G),D=0;if(Z===void 0){let H=M.count(X);H.onsuccess=()=>{D=H.result,M.delete(X)}}else{let H=M.openCursor(X,"next");H.onsuccess=()=>{let z=H.result;if(z===null||D>=Z)return;if(z.delete(),D++,D<Z)z.continue()}}B.oncomplete=()=>L(D),B.onerror=()=>W(B.error)})}async*scan(F,Y={}){let{limit:J,reverse:U}=Y,X=await this.#F,$=N(F),Z=IDBKeyRange.bound(F,$,!1,!0),L=U?"prev":"next",W=X.transaction(G,"readonly"),M=W.objectStore(G).openCursor(Z,L),D=0,H=g(M,W),z=!1;try{let V=await H();while(V){if(J!==void 0&&D>=J)break;let j=V.key;if(O(j,Y))yield[j,new Uint8Array(V.value)],D++;V.continue(),V=await H()}z=!0}finally{if(!z)try{W.abort()}catch{}}}async batch(F){if(F.length===0)return;let Y=await this.#F;return new Promise((J,U)=>{let X=Y.transaction(G,"readwrite"),$=X.objectStore(G);for(let Z of F)if(Z.type==="put")$.put(Z.value,Z.key);else $.delete(Z.key);X.oncomplete=()=>J(),X.onerror=()=>U(X.error)})}async conditionalBatch(F,Y){let J=await this.#F;return new Promise((U,X)=>{let $=J.transaction(G,"readwrite"),Z=$.objectStore(G),L=!1,W=!1,B=(H,z)=>{if(L)return;L=!0,X(H??Error(z))};$.oncomplete=()=>{if(L)return;L=!0,U(!0)},$.onerror=()=>{B($.error,"IndexedDB conditionalBatch transaction failed.")},$.onabort=()=>{if(L)return;if(L=!0,W){U(!1);return}X($.error??Error("IndexedDB conditionalBatch transaction aborted."))};let M=()=>{for(let H of Y)if(H.type==="put")Z.put(H.value,H.key);else Z.delete(H.key)},D=(H)=>{if(H>=F.length){M();return}let z=F[H],V=Z.get(z.key);V.onsuccess=()=>{let j=V.result,c=j===void 0?null:new Uint8Array(j);if(!I(c,z.expectedValue)){W=!0,$.abort();return}D(H+1)},V.onerror=()=>{B(V.error,"IndexedDB conditionalBatch condition check failed.")}};D(0)})}async*keys(F,Y={}){let{limit:J,reverse:U}=Y,X=await this.#F,$=N(F),Z=IDBKeyRange.bound(F,$,!1,!0),L=U?"prev":"next",W=X.transaction(G,"readonly"),M=W.objectStore(G).openKeyCursor(Z,L),D=0,H=g(M,W),z=!1;try{let V=await H();while(V){if(J!==void 0&&D>=J)break;let j=V.key;if(O(j,Y))yield j,D++;V.continue(),V=await H()}z=!0}finally{if(!z)try{W.abort()}catch{}}}async count(F){let Y=await this.#F,J=N(F),X=Y.transaction(G,"readonly").objectStore(G);return A(X.count(IDBKeyRange.bound(F,J,!1,!0)))}scoped(F){return f(this,F)}[Symbol.dispose](){if(this.#J)this.#J.close(),this.#J=null}}export{r as IndexedDBStorage};
@@ -269,6 +269,12 @@ export declare function tryDecodeStorageKeyComponent(value: string): string | nu
269
269
  * Key layout constants for hierarchical key encoding. Timestamps are
270
270
  * zero-padded to 16 digits for lexicographic ordering.
271
271
  *
272
+ * This registry grows as storage features are added, which is why this file
273
+ * carries a `max-lines: 600` override (above the repo default ceiling) in
274
+ * `.oxlintrc.json` — 600 matches the documented split threshold in
275
+ * `.claude/rules/conventions.md`. When `KEYS` next approaches that line, extract
276
+ * it into its own module rather than raising the ceiling again.
277
+ *
272
278
  * @example
273
279
  * ```ts
274
280
  * import { KEYS } from '@lostgradient/weft/storage/interface';
@@ -315,10 +321,44 @@ export declare const KEYS: {
315
321
  readonly update: (workflowId: string, updateId: string) => string;
316
322
  readonly updateResponse: (updateId: string) => string;
317
323
  readonly updateIdempotency: (workflowId: string, key: string) => string;
324
+ /**
325
+ * Maps a start `idempotencyKey` to the workflow id created for it. Written
326
+ * atomically with the workflow record under a `conditionalBatch` gated on this
327
+ * key being absent, so concurrent same-key starts converge on one workflow.
328
+ * Unlike `updateIdempotency`, it is keyed by the idempotency key alone (no
329
+ * workflow id) because the workflow id is the value it resolves to. It is
330
+ * intentionally NOT swept on terminal cleanup: it must outlive the run so a
331
+ * post-completion `startOrSignal` sees a terminal workflow (and conflicts)
332
+ * rather than missing the mapping and creating a fresh run.
333
+ */
334
+ readonly startIdempotency: (key: string) => string;
335
+ /**
336
+ * The convergence signal id that `startOrSignal` derives from an idempotency
337
+ * key so independent same-key callers deliver ONE signal. Deliberately uses the
338
+ * RAW key (not `encodeStorageKeyComponent`): unlike `startIdempotency` this is a
339
+ * signal id, not a storage key, and `validateSignalId` is character-agnostic, so
340
+ * the raw key is always a valid id as long as it fits the byte cap (enforced as
341
+ * ≤117 bytes so `"start-idem:"` + key stays within the 128-byte signal-id
342
+ * ceiling). The two derivations are independent namespaces; both are individually
343
+ * correct, so the raw-vs-encoded difference is harmless.
344
+ */
345
+ readonly startIdempotencySignalId: (key: string) => string;
346
+ /** Scan prefix for engine liveness heartbeats (best-effort second-instance detection). */
347
+ readonly livenessPrefix: () => string;
348
+ /** Per-engine liveness heartbeat key. One key per engine instance under the shared store. */
349
+ readonly liveness: (instanceId: string) => string;
318
350
  readonly budget: (namespace: string, period: string, date: string) => string;
319
351
  readonly review: (workflowId: string, reviewId: string) => string;
320
352
  readonly workflowHeaders: (workflowId: string) => string;
321
353
  readonly terminalCleanupNeeded: (workflowId: string) => string;
354
+ /**
355
+ * Presence-only marker written at start only when a run is launched with a
356
+ * non-serialized `services` value (see `start-batch.ts`). It lets a
357
+ * fresh-process recovery tell a run whose services were lost on crash apart
358
+ * from one that never had any — the services value itself is never persisted,
359
+ * so this bit is the only durable trace. Cleared on terminal cleanup.
360
+ */
361
+ readonly workflowHasServices: (workflowId: string) => string;
322
362
  readonly offload: (workflowId: string, key: string) => string;
323
363
  readonly archive: (workflowId: string, key: string) => string;
324
364
  readonly stateExecution: (ownerWorkflowId: string, key: string) => string;
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var $=Object.defineProperty;var j=(E)=>E;function L(E,_){this[E]=j.bind(null,_)}var H=(E,_)=>{for(var F in _)$(E,F,{get:_[F],enumerable:!0,configurable:!0,set:L.bind(_,F)})};var G=(E,_)=>()=>(E&&(_=E(E=0)),_);function U(E,_,F){if(!E.capabilities()[_])throw Error(`Feature "${F}" requires storage capability "${_}", but this storage backend does not provide it.`)}function z(E){let _=E.capabilities(),F=[];if(_.persistence!=="local")F.push(`persistence must be "local" (got "${_.persistence}")`);if(_.readAfterWrite!=="linearizable")F.push(`readAfterWrite must be "linearizable" (got "${_.readAfterWrite}")`);if(_.scanConsistency!=="snapshot")F.push(`scanConsistency must be "snapshot" (got "${_.scanConsistency}")`);if(!_.atomicBatch)F.push("atomicBatch must be true");if(!_.conditionalBatch)F.push("conditionalBatch must be true");if(F.length>0)throw Error(`Storage is not durable enough for recovery: ${F.join("; ")}.`)}var B="default";async function J(E,_){return await E.get(_)!==null}async function*X(E,_,F){for await(let[Y]of E.scan(_,F))yield Y}async function M(E,_){let F=0;for await(let Y of X(E,_))F++;return F}async function O(E,_){let F=[];for await(let Y of X(E,_))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await E.batch(F),F.length}async function A(E,_,F){let Y=[];for await(let Z of X(E,_,F))Y.push({type:"delete",key:Z});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var Q;var V=G(()=>{Q=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-headers:","wf-idx-","wf-terminal:"]});function K(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function S(E,_={}){if(_.gt!==void 0&&E<=_.gt)return!1;if(_.gte!==void 0&&E<_.gte)return!1;if(_.lt!==void 0&&E>=_.lt)return!1;if(_.lte!==void 0&&E>_.lte)return!1;return!0}function C(E,_){if(E===null||_===null)return E===_;if(E.byteLength!==_.byteLength)return!1;for(let F=0;F<E.byteLength;F++)if(E[F]!==_[F])return!1;return!0}async function c(E,_){if(E.has)return E.has(_);return J(E,_)}function I(E,_,F){if(E.keys)return E.keys(_,F);return X(E,_,F)}async function k(E,_){if(E.count)return E.count(_);return M(E,_)}async function y(E,_){if(E.deletePrefix)return E.deletePrefix(_);return O(E,_)}async function m(E,_,F){if(U(E,"conditionalBatch","storageConditionalBatch"),!E.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return E.conditionalBatch(_,F)}function W(E){return encodeURIComponent(E)}function f(E){return decodeURIComponent(E)}function l(E){try{return decodeURIComponent(E)}catch{return null}}var P=(E)=>String(E).padStart(16,"0"),g;var D=G(()=>{V();g={workflow:(E)=>`wf:${W(E)}`,checkpoint:(E)=>`wf:${W(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${W(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${W(E)}:timeline:`,timeline:(E,_)=>`wf:${W(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${W(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${W(_)}`,scheduleRun:(E)=>`schedule-run:${W(E)}`,operation:(E,_,F)=>`op:${E}:${P(_)}:${F}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,F)=>`audit:bulk:${P(E)}:${W(_)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${P(E)}:${W(_)}`,asyncActivity:(E,_)=>`async-act:v1:${W(E)}:${W(_)}`,activityReconciliationPrefix:(E)=>`actrec:v1:${W(E)}:`,activityReconciliation:(E,_,F)=>`actrec:v1:${W(E)}:${W(_)}:${F}`,eventPrefix:(E)=>`ev:${W(E)}:`,event:(E,_)=>`ev:${W(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${W(E)}:head`,eventWatermark:(E)=>`ev:${W(E)}:watermark`,signal:(E,_,F)=>`sig:${W(E)}:${_}:${W(F)}`,signalSequence:(E)=>`sigseq:v1:${W(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${W(E)}:`,signalAcceptedResponse:(E,_,F)=>`sigres:v1:${W(E)}:${W(_)}:${W(F)}`,deadline:(E,_)=>`wf-deadline:${P(E)}:${W(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${P(E)}:${W(_)}`,delayedStart:(E,_)=>`wf-delayed:${P(E)}:${W(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${P(E)}:${W(_)}`,attribute:(E)=>`attr:${W(E)}`,attributeIndex:(E,_,F)=>`idx:${E}:${_}:${W(F)}`,tagIndex:(E,_)=>`tag:${W(E)}:${W(_)}`,updatePrefix:(E)=>`upd:${W(E)}:`,update:(E,_)=>`upd:${W(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${W(E)}:${_}`,budget:(E,_,F)=>`budget:${E}:${_}:${F}`,review:(E,_)=>`review:${W(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${W(E)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${W(E)}`,offload:(E,_)=>`offload:${W(E)}:${_}`,archive:(E,_)=>`archive:${W(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${W(E)}:${W(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${B}:${W(E)}:${W(_)}`,streamChunkPrefix:(E,_)=>`blob:${W(E)}:${_}:chunk:`,streamChunk:(E,_,F)=>`blob:${W(E)}:${_}:chunk:${String(F).padStart(10,"0")}`,streamMetadata:(E,_)=>`blob:${W(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,F)=>`tool-effect:${W(E)}:${_}:${F}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${W(E)}:${W(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${W(E)}:${W(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${P(E)}:${W(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${P(E)}:${W(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${P(E)}:${W(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${W(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});D();export{l as tryDecodeStorageKeyComponent,C as storageValuesEqual,I as storageKeys,c as storageHas,y as storageDeletePrefix,k as storageCount,m as storageConditionalBatch,K as resolvePrefixRangeEnd,U as requireStorageCapability,S as matchesScanOptions,W as encodeStorageKeyComponent,f as decodeStorageKeyComponent,z as assertDurableStorageForRecovery,Q as WEFT_RESERVED_KEY_PREFIXES,g as KEYS,B as DEFAULT_SCOPE};
2
+ var V=Object.defineProperty;var Z=(E)=>E;function $(E,_){this[E]=Z.bind(null,_)}var H=(E,_)=>{for(var W in _)V(E,W,{get:_[W],enumerable:!0,configurable:!0,set:$.bind(_,W)})};var B=(E,_)=>()=>(E&&(_=E(E=0)),_);function U(E,_,W){if(!E.capabilities()[_])throw Error(`Feature "${W}" requires storage capability "${_}", but this storage backend does not provide it.`)}function j(E){let _=E.capabilities(),W=[];if(_.persistence!=="local"&&_.persistence!=="remote")W.push(`persistence must be "local" or "remote" (got "${_.persistence}")`);if(_.readAfterWrite!=="linearizable")W.push(`readAfterWrite must be "linearizable" (got "${_.readAfterWrite}")`);if(_.scanConsistency!=="snapshot")W.push(`scanConsistency must be "snapshot" (got "${_.scanConsistency}")`);if(!_.atomicBatch)W.push("atomicBatch must be true");if(!_.conditionalBatch)W.push("conditionalBatch must be true");if(W.length>0)throw Error(`Storage is not durable enough for recovery: ${W.join("; ")}.`)}var L="default";async function G(E,_){return await E.get(_)!==null}async function*X(E,_,W){for await(let[P]of E.scan(_,W))yield P}async function J(E,_){let W=0;for await(let P of X(E,_))W++;return W}async function M(E,_){let W=[];for await(let P of X(E,_))W.push({type:"delete",key:P});if(W.length===0)return 0;return await E.batch(W),W.length}async function T(E,_,W){let P=[];for await(let Q of X(E,_,W))P.push({type:"delete",key:Q});if(P.length===0)return 0;return await E.batch(P),P.length}var D;var O=B(()=>{D=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function K(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function S(E,_={}){if(_.gt!==void 0&&E<=_.gt)return!1;if(_.gte!==void 0&&E<_.gte)return!1;if(_.lt!==void 0&&E>=_.lt)return!1;if(_.lte!==void 0&&E>_.lte)return!1;return!0}function C(E,_){if(E===null||_===null)return E===_;if(E.byteLength!==_.byteLength)return!1;for(let W=0;W<E.byteLength;W++)if(E[W]!==_[W])return!1;return!0}async function c(E,_){if(E.has)return E.has(_);return G(E,_)}function I(E,_,W){if(E.keys)return E.keys(_,W);return X(E,_,W)}async function f(E,_){if(E.count)return E.count(_);return J(E,_)}async function m(E,_){if(E.deletePrefix)return E.deletePrefix(_);return M(E,_)}async function y(E,_,W){if(U(E,"conditionalBatch","storageConditionalBatch"),!E.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return E.conditionalBatch(_,W)}function F(E){return encodeURIComponent(E)}function k(E){return decodeURIComponent(E)}function l(E){try{return decodeURIComponent(E)}catch{return null}}var R=(E)=>String(E).padStart(16,"0"),g;var z=B(()=>{O();g={workflow:(E)=>`wf:${F(E)}`,checkpoint:(E)=>`wf:${F(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${F(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${F(E)}:timeline:`,timeline:(E,_)=>`wf:${F(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${F(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${F(_)}`,scheduleRun:(E)=>`schedule-run:${F(E)}`,operation:(E,_,W)=>`op:${E}:${R(_)}:${W}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,W)=>`audit:bulk:${R(E)}:${F(_)}:${F(W)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${R(E)}:${F(_)}`,asyncActivity:(E,_)=>`async-act:v1:${F(E)}:${F(_)}`,activityReconciliationPrefix:(E)=>`actrec:v1:${F(E)}:`,activityReconciliation:(E,_,W)=>`actrec:v1:${F(E)}:${F(_)}:${W}`,eventPrefix:(E)=>`ev:${F(E)}:`,event:(E,_)=>`ev:${F(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${F(E)}:head`,eventWatermark:(E)=>`ev:${F(E)}:watermark`,signal:(E,_,W)=>`sig:${F(E)}:${_}:${F(W)}`,signalSequence:(E)=>`sigseq:v1:${F(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${F(E)}:`,signalAcceptedResponse:(E,_,W)=>`sigres:v1:${F(E)}:${F(_)}:${F(W)}`,deadline:(E,_)=>`wf-deadline:${R(E)}:${F(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${R(E)}:${F(_)}`,delayedStart:(E,_)=>`wf-delayed:${R(E)}:${F(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${R(E)}:${F(_)}`,attribute:(E)=>`attr:${F(E)}`,attributeIndex:(E,_,W)=>`idx:${E}:${_}:${F(W)}`,tagIndex:(E,_)=>`tag:${F(E)}:${F(_)}`,updatePrefix:(E)=>`upd:${F(E)}:`,update:(E,_)=>`upd:${F(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${F(E)}:${_}`,startIdempotency:(E)=>`start-idem:${F(E)}`,startIdempotencySignalId:(E)=>`start-idem:${E}`,livenessPrefix:()=>"liveness:",liveness:(E)=>`liveness:${F(E)}`,budget:(E,_,W)=>`budget:${E}:${_}:${W}`,review:(E,_)=>`review:${F(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${F(E)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${F(E)}`,workflowHasServices:(E)=>`wf-has-services:${F(E)}`,offload:(E,_)=>`offload:${F(E)}:${_}`,archive:(E,_)=>`archive:${F(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${F(E)}:${F(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${L}:${F(E)}:${F(_)}`,streamChunkPrefix:(E,_)=>`blob:${F(E)}:${_}:chunk:`,streamChunk:(E,_,W)=>`blob:${F(E)}:${_}:chunk:${String(W).padStart(10,"0")}`,streamMetadata:(E,_)=>`blob:${F(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,W)=>`tool-effect:${F(E)}:${_}:${W}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${F(E)}:${F(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${F(E)}:${F(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${R(E)}:${F(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${R(E)}:${F(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${R(E)}:${F(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${F(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});z();export{l as tryDecodeStorageKeyComponent,C as storageValuesEqual,I as storageKeys,c as storageHas,m as storageDeletePrefix,f as storageCount,y as storageConditionalBatch,K as resolvePrefixRangeEnd,U as requireStorageCapability,S as matchesScanOptions,F as encodeStorageKeyComponent,k as decodeStorageKeyComponent,j as assertDurableStorageForRecovery,D as WEFT_RESERVED_KEY_PREFIXES,g as KEYS,L as DEFAULT_SCOPE};
@@ -16,4 +16,4 @@
16
16
  * console.log(isWeftKey); // true
17
17
  * ```
18
18
  */
19
- export declare const WEFT_RESERVED_KEY_PREFIXES: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "ev:", "idx:", "offload:", "op:", "review:", "schedule:", "schedule-due:", "schedule-run:", "sig:", "sigres:", "sigseq:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-deadline:", "wf-delayed:", "wf-headers:", "wf-idx-", "wf-terminal:"];
19
+ export declare const WEFT_RESERVED_KEY_PREFIXES: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "ev:", "idx:", "liveness:", "offload:", "op:", "review:", "schedule:", "schedule-due:", "schedule-run:", "sig:", "sigres:", "sigseq:", "start-idem:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-deadline:", "wf-delayed:", "wf-has-services:", "wf-headers:", "wf-idx-", "wf-terminal:"];
@@ -9,6 +9,7 @@ export const WEFT_RESERVED_KEY_PREFIXES = [
9
9
  "budget-charged:",
10
10
  "ev:",
11
11
  "idx:",
12
+ "liveness:",
12
13
  "offload:",
13
14
  "op:",
14
15
  "review:",
@@ -18,6 +19,7 @@ export const WEFT_RESERVED_KEY_PREFIXES = [
18
19
  "sig:",
19
20
  "sigres:",
20
21
  "sigseq:",
22
+ "start-idem:",
21
23
  "state:",
22
24
  "tag:",
23
25
  "tool-effect:",
@@ -29,6 +31,7 @@ export const WEFT_RESERVED_KEY_PREFIXES = [
29
31
  "wf-cleanup-needed:",
30
32
  "wf-deadline:",
31
33
  "wf-delayed:",
34
+ "wf-has-services:",
32
35
  "wf-headers:",
33
36
  "wf-idx-",
34
37
  "wf-terminal:"
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var y=Object.defineProperty;var g=(E)=>E;function f(E,_){this[E]=g.bind(null,_)}var l=(E,_)=>{for(var W in _)y(E,W,{get:_[W],enumerable:!0,configurable:!0,set:f.bind(_,W)})};var j=(E,_)=>()=>(E&&(_=E(E=0)),_);function B(E,_,W){if(!E.capabilities()[_])throw Error(`Feature "${W}" requires storage capability "${_}", but this storage backend does not provide it.`)}function d(E){let _=E.capabilities(),W=[];if(_.persistence!=="local")W.push(`persistence must be "local" (got "${_.persistence}")`);if(_.readAfterWrite!=="linearizable")W.push(`readAfterWrite must be "linearizable" (got "${_.readAfterWrite}")`);if(_.scanConsistency!=="snapshot")W.push(`scanConsistency must be "snapshot" (got "${_.scanConsistency}")`);if(!_.atomicBatch)W.push("atomicBatch must be true");if(!_.conditionalBatch)W.push("conditionalBatch must be true");if(W.length>0)throw Error(`Storage is not durable enough for recovery: ${W.join("; ")}.`)}var L="default";async function A(E,_){return await E.get(_)!==null}async function*Q(E,_,W){for await(let[Y]of E.scan(_,W))yield Y}async function z(E,_){let W=0;for await(let Y of Q(E,_))W++;return W}async function P(E,_){let W=[];for await(let Y of Q(E,_))W.push({type:"delete",key:Y});if(W.length===0)return 0;return await E.batch(W),W.length}async function O(E,_,W){let Y=[];for await(let X of Q(E,_,W))Y.push({type:"delete",key:X});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var p;var h=j(()=>{p=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-headers:","wf-idx-","wf-terminal:"]});function V(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function N(E,_={}){if(_.gt!==void 0&&E<=_.gt)return!1;if(_.gte!==void 0&&E<_.gte)return!1;if(_.lt!==void 0&&E>=_.lt)return!1;if(_.lte!==void 0&&E>_.lte)return!1;return!0}function v(E,_){if(E===null||_===null)return E===_;if(E.byteLength!==_.byteLength)return!1;for(let W=0;W<E.byteLength;W++)if(E[W]!==_[W])return!1;return!0}async function C(E,_){if(E.has)return E.has(_);return A(E,_)}function K(E,_,W){if(E.keys)return E.keys(_,W);return Q(E,_,W)}async function b(E,_){if(E.count)return E.count(_);return z(E,_)}async function S(E,_){if(E.deletePrefix)return E.deletePrefix(_);return P(E,_)}async function u(E,_,W){if(B(E,"conditionalBatch","storageConditionalBatch"),!E.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return E.conditionalBatch(_,W)}function F(E){return encodeURIComponent(E)}function YE(E){return decodeURIComponent(E)}function XE(E){try{return decodeURIComponent(E)}catch{return null}}var J=(E)=>String(E).padStart(16,"0"),JE;var q=j(()=>{h();JE={workflow:(E)=>`wf:${F(E)}`,checkpoint:(E)=>`wf:${F(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${F(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${F(E)}:timeline:`,timeline:(E,_)=>`wf:${F(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${F(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${F(_)}`,scheduleRun:(E)=>`schedule-run:${F(E)}`,operation:(E,_,W)=>`op:${E}:${J(_)}:${W}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,W)=>`audit:bulk:${J(E)}:${F(_)}:${F(W)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${J(E)}:${F(_)}`,asyncActivity:(E,_)=>`async-act:v1:${F(E)}:${F(_)}`,activityReconciliationPrefix:(E)=>`actrec:v1:${F(E)}:`,activityReconciliation:(E,_,W)=>`actrec:v1:${F(E)}:${F(_)}:${W}`,eventPrefix:(E)=>`ev:${F(E)}:`,event:(E,_)=>`ev:${F(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${F(E)}:head`,eventWatermark:(E)=>`ev:${F(E)}:watermark`,signal:(E,_,W)=>`sig:${F(E)}:${_}:${F(W)}`,signalSequence:(E)=>`sigseq:v1:${F(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${F(E)}:`,signalAcceptedResponse:(E,_,W)=>`sigres:v1:${F(E)}:${F(_)}:${F(W)}`,deadline:(E,_)=>`wf-deadline:${J(E)}:${F(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${J(E)}:${F(_)}`,delayedStart:(E,_)=>`wf-delayed:${J(E)}:${F(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${J(E)}:${F(_)}`,attribute:(E)=>`attr:${F(E)}`,attributeIndex:(E,_,W)=>`idx:${E}:${_}:${F(W)}`,tagIndex:(E,_)=>`tag:${F(E)}:${F(_)}`,updatePrefix:(E)=>`upd:${F(E)}:`,update:(E,_)=>`upd:${F(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${F(E)}:${_}`,budget:(E,_,W)=>`budget:${E}:${_}:${W}`,review:(E,_)=>`review:${F(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${F(E)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${F(E)}`,offload:(E,_)=>`offload:${F(E)}:${_}`,archive:(E,_)=>`archive:${F(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${F(E)}:${F(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${L}:${F(E)}:${F(_)}`,streamChunkPrefix:(E,_)=>`blob:${F(E)}:${_}:chunk:`,streamChunk:(E,_,W)=>`blob:${F(E)}:${_}:chunk:${String(W).padStart(10,"0")}`,streamMetadata:(E,_)=>`blob:${F(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,W)=>`tool-effect:${F(E)}:${_}:${W}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${F(E)}:${F(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${F(E)}:${F(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${J(E)}:${F(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${J(E)}:${F(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${J(E)}:${F(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${F(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function s(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 H(E){let _={},W=!1;for(let X of["gt","gte","lt","lte"]){let U=E[X];if(U===void 0)continue;if(typeof U!=="string")throw Error("deleteRange bounds must be strings");_[X]=U,W=!0}if(!W)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Y=s(E.limit);if(Y!==void 0)_.limit=Y;return _}async function I(E,_,W){let Y=H(W);if(E.deleteRange)return E.deleteRange(_,Y);return O(E,_,Y)}var D=()=>{};function R(E){return E.replaceAll(/:+$/g,"")}function a(E,_){let W=R(E),Y=R(_);if(W.length===0)return Y;if(Y.length===0)return W;return`${W}:${Y}`}function x(E,_){return new T(E,_)}var T;var c=j(()=>{D();q();T=class T{#E;#F;constructor(E,_){this.#E=E,this.#F=R(_)}#_(E){if(this.#F.length===0)return E;return E.length===0?`${this.#F}:`:`${this.#F}:${E}`}#W(E){if(this.#F.length===0)return E;return E.slice(this.#F.length+1)}#Y(E={}){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.reverse!==void 0)_.reverse=E.reverse;if(E.gt!==void 0)_.gt=this.#_(E.gt);if(E.gte!==void 0)_.gte=this.#_(E.gte);if(E.lt!==void 0)_.lt=this.#_(E.lt);if(E.lte!==void 0)_.lte=this.#_(E.lte);return _}#X(E){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.gt!==void 0)_.gt=this.#_(E.gt);if(E.gte!==void 0)_.gte=this.#_(E.gte);if(E.lt!==void 0)_.lt=this.#_(E.lt);if(E.lte!==void 0)_.lte=this.#_(E.lte);return _}capabilities(){return this.#E.capabilities()}scoped(E){return new T(this.#E,a(this.#F,E))}async get(E){return this.#E.get(this.#_(E))}async put(E,_){await this.#E.put(this.#_(E),_)}async delete(E){await this.#E.delete(this.#_(E))}async*scan(E,_){for await(let[W,Y]of this.#E.scan(this.#_(E),this.#Y(_)))yield[this.#W(W),Y]}async batch(E){await this.#E.batch(E.map((_)=>{if(_.type==="put")return{type:"put",key:this.#_(_.key),value:_.value};return{type:"delete",key:this.#_(_.key)}}))}async conditionalBatch(E,_){return u(this.#E,E.map((W)=>({key:this.#_(W.key),expectedValue:W.expectedValue})),_.map((W)=>{if(W.type==="put")return{type:"put",key:this.#_(W.key),value:W.value};return{type:"delete",key:this.#_(W.key)}}))}async has(E){return C(this.#E,this.#_(E))}async deletePrefix(E){return S(this.#E,this.#_(E))}async deleteRange(E,_){let W=this.#X(H(_));return I(this.#E,this.#_(E),W)}async*keys(E,_){for await(let W of K(this.#E,this.#_(E),this.#Y(_)))yield this.#W(W)}async count(E){return b(this.#E,this.#_(E))}[Symbol.dispose](){this.#E[Symbol.dispose]()}}});var i={};l(i,{LMDBStorage:()=>k});import*as w from"lmdb";var k;var r=j(()=>{D();q();c();k=class k{#E;#F=!1;#_=null;constructor(E){this.#E=w.open({path:E,encoding:"binary"})}#W(){if(this.#F)throw Error("LMDBStorage is closed")}capabilities(){return{persistence:"local",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!1}}async get(E){this.#W();let _=this.#E.get(E);if(_===void 0)return null;return new Uint8Array(_)}async put(E,_){this.#W(),await this.#E.put(E,Buffer.from(_))}async delete(E){this.#W(),await this.#E.remove(E)}async has(E){return this.#W(),this.#E.doesExist(E)}async deletePrefix(E){this.#W();let _=[];for await(let W of this.keys(E))_.push(W);if(_.length===0)return 0;return await this.#E.batch(()=>{for(let W of _)this.#E.remove(W)}),_.length}async deleteRange(E,_){this.#W();let W=H(_),Y=[];for await(let X of this.keys(E,W))Y.push(X);if(Y.length===0)return 0;return await this.#E.batch(()=>{for(let X of Y)this.#E.remove(X)}),Y.length}async*scan(E,_={}){this.#W();let{limit:W,reverse:Y}=_,X=V(E),U=Y?this.#E.getRange({start:X,end:E,reverse:!0}):this.#E.getRange({start:E,end:X}),$=0,G=!1;for(let{key:Z,value:m}of U){if(!Z.startsWith(E)){if(Y&&!G)continue;break}if(G=!0,!N(Z,_))continue;if(W!==void 0&&$>=W)break;yield[Z,new Uint8Array(m)],$++}}async*keys(E,_={}){this.#W();let{limit:W,reverse:Y}=_,X=V(E),U=Y?this.#E.getKeys({start:X,end:E,reverse:!0}):this.#E.getKeys({start:E,end:X}),$=0,G=!1;for(let Z of U){if(!Z.startsWith(E)){if(Y&&!G)continue;break}if(G=!0,!N(Z,_))continue;if(W!==void 0&&$>=W)break;yield Z,$++}}async count(E){this.#W();let _=V(E);return this.#E.getKeysCount({start:E,end:_})}scoped(E){return this.#W(),x(this,E)}async batch(E){if(this.#W(),E.length===0)return;await this.#E.batch(()=>{for(let _ of E)if(_.type==="put")this.#E.put(_.key,Buffer.from(_.value));else this.#E.remove(_.key)})}async conditionalBatch(E,_){return this.#W(),this.#E.transactionSync(()=>{for(let Y of E){let X=this.#E.get(Y.key),U=X===void 0?null:new Uint8Array(X);if(!v(U,Y.expectedValue))return!1}for(let Y of _)if(Y.type==="put")this.#E.putSync(Y.key,Buffer.from(Y.value));else this.#E.removeSync(Y.key);return!0})}close(){return this.#F=!0,this.#_??=(async()=>{await Promise.resolve(),await this.#E.close()})(),this.#_}[Symbol.dispose](){this.close()}}});r();export{k as LMDBStorage};
2
+ var y=Object.defineProperty;var g=(E)=>E;function f(E,_){this[E]=g.bind(null,_)}var l=(E,_)=>{for(var F in _)y(E,F,{get:_[F],enumerable:!0,configurable:!0,set:f.bind(_,F)})};var G=(E,_)=>()=>(E&&(_=E(E=0)),_);function V(E,_,F){if(!E.capabilities()[_])throw Error(`Feature "${F}" requires storage capability "${_}", but this storage backend does not provide it.`)}function d(E){let _=E.capabilities(),F=[];if(_.persistence!=="local"&&_.persistence!=="remote")F.push(`persistence must be "local" or "remote" (got "${_.persistence}")`);if(_.readAfterWrite!=="linearizable")F.push(`readAfterWrite must be "linearizable" (got "${_.readAfterWrite}")`);if(_.scanConsistency!=="snapshot")F.push(`scanConsistency must be "snapshot" (got "${_.scanConsistency}")`);if(!_.atomicBatch)F.push("atomicBatch must be true");if(!_.conditionalBatch)F.push("conditionalBatch must be true");if(F.length>0)throw Error(`Storage is not durable enough for recovery: ${F.join("; ")}.`)}var B="default";async function A(E,_){return await E.get(_)!==null}async function*M(E,_,F){for await(let[Y]of E.scan(_,F))yield Y}async function z(E,_){let F=0;for await(let Y of M(E,_))F++;return F}async function P(E,_){let F=[];for await(let Y of M(E,_))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await E.batch(F),F.length}async function O(E,_,F){let Y=[];for await(let X of M(E,_,F))Y.push({type:"delete",key:X});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var s;var v=G(()=>{s=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function L(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function q(E,_={}){if(_.gt!==void 0&&E<=_.gt)return!1;if(_.gte!==void 0&&E<_.gte)return!1;if(_.lt!==void 0&&E>=_.lt)return!1;if(_.lte!==void 0&&E>_.lte)return!1;return!0}function h(E,_){if(E===null||_===null)return E===_;if(E.byteLength!==_.byteLength)return!1;for(let F=0;F<E.byteLength;F++)if(E[F]!==_[F])return!1;return!0}async function b(E,_){if(E.has)return E.has(_);return A(E,_)}function C(E,_,F){if(E.keys)return E.keys(_,F);return M(E,_,F)}async function K(E,_){if(E.count)return E.count(_);return z(E,_)}async function S(E,_){if(E.deletePrefix)return E.deletePrefix(_);return P(E,_)}async function u(E,_,F){if(V(E,"conditionalBatch","storageConditionalBatch"),!E.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return E.conditionalBatch(_,F)}function W(E){return encodeURIComponent(E)}function YE(E){return decodeURIComponent(E)}function XE(E){try{return decodeURIComponent(E)}catch{return null}}var J=(E)=>String(E).padStart(16,"0"),JE;var N=G(()=>{v();JE={workflow:(E)=>`wf:${W(E)}`,checkpoint:(E)=>`wf:${W(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${W(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${W(E)}:timeline:`,timeline:(E,_)=>`wf:${W(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${W(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${W(_)}`,scheduleRun:(E)=>`schedule-run:${W(E)}`,operation:(E,_,F)=>`op:${E}:${J(_)}:${F}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,F)=>`audit:bulk:${J(E)}:${W(_)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${J(E)}:${W(_)}`,asyncActivity:(E,_)=>`async-act:v1:${W(E)}:${W(_)}`,activityReconciliationPrefix:(E)=>`actrec:v1:${W(E)}:`,activityReconciliation:(E,_,F)=>`actrec:v1:${W(E)}:${W(_)}:${F}`,eventPrefix:(E)=>`ev:${W(E)}:`,event:(E,_)=>`ev:${W(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${W(E)}:head`,eventWatermark:(E)=>`ev:${W(E)}:watermark`,signal:(E,_,F)=>`sig:${W(E)}:${_}:${W(F)}`,signalSequence:(E)=>`sigseq:v1:${W(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${W(E)}:`,signalAcceptedResponse:(E,_,F)=>`sigres:v1:${W(E)}:${W(_)}:${W(F)}`,deadline:(E,_)=>`wf-deadline:${J(E)}:${W(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${J(E)}:${W(_)}`,delayedStart:(E,_)=>`wf-delayed:${J(E)}:${W(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${J(E)}:${W(_)}`,attribute:(E)=>`attr:${W(E)}`,attributeIndex:(E,_,F)=>`idx:${E}:${_}:${W(F)}`,tagIndex:(E,_)=>`tag:${W(E)}:${W(_)}`,updatePrefix:(E)=>`upd:${W(E)}:`,update:(E,_)=>`upd:${W(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${W(E)}:${_}`,startIdempotency:(E)=>`start-idem:${W(E)}`,startIdempotencySignalId:(E)=>`start-idem:${E}`,livenessPrefix:()=>"liveness:",liveness:(E)=>`liveness:${W(E)}`,budget:(E,_,F)=>`budget:${E}:${_}:${F}`,review:(E,_)=>`review:${W(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${W(E)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${W(E)}`,workflowHasServices:(E)=>`wf-has-services:${W(E)}`,offload:(E,_)=>`offload:${W(E)}:${_}`,archive:(E,_)=>`archive:${W(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${W(E)}:${W(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${B}:${W(E)}:${W(_)}`,streamChunkPrefix:(E,_)=>`blob:${W(E)}:${_}:chunk:`,streamChunk:(E,_,F)=>`blob:${W(E)}:${_}:chunk:${String(F).padStart(10,"0")}`,streamMetadata:(E,_)=>`blob:${W(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,F)=>`tool-effect:${W(E)}:${_}:${F}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${W(E)}:${W(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${W(E)}:${W(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${J(E)}:${W(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${J(E)}:${W(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${J(E)}:${W(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${W(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function p(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 H(E){let _={},F=!1;for(let X of["gt","gte","lt","lte"]){let Q=E[X];if(Q===void 0)continue;if(typeof Q!=="string")throw Error("deleteRange bounds must be strings");_[X]=Q,F=!0}if(!F)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Y=p(E.limit);if(Y!==void 0)_.limit=Y;return _}async function I(E,_,F){let Y=H(F);if(E.deleteRange)return E.deleteRange(_,Y);return O(E,_,Y)}var D=()=>{};function R(E){return E.replaceAll(/:+$/g,"")}function a(E,_){let F=R(E),Y=R(_);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}function x(E,_){return new T(E,_)}var T;var c=G(()=>{D();N();T=class T{#E;#W;constructor(E,_){this.#E=E,this.#W=R(_)}#_(E){if(this.#W.length===0)return E;return E.length===0?`${this.#W}:`:`${this.#W}:${E}`}#F(E){if(this.#W.length===0)return E;return E.slice(this.#W.length+1)}#Y(E={}){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.reverse!==void 0)_.reverse=E.reverse;if(E.gt!==void 0)_.gt=this.#_(E.gt);if(E.gte!==void 0)_.gte=this.#_(E.gte);if(E.lt!==void 0)_.lt=this.#_(E.lt);if(E.lte!==void 0)_.lte=this.#_(E.lte);return _}#X(E){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.gt!==void 0)_.gt=this.#_(E.gt);if(E.gte!==void 0)_.gte=this.#_(E.gte);if(E.lt!==void 0)_.lt=this.#_(E.lt);if(E.lte!==void 0)_.lte=this.#_(E.lte);return _}capabilities(){return this.#E.capabilities()}scoped(E){return new T(this.#E,a(this.#W,E))}async get(E){return this.#E.get(this.#_(E))}async put(E,_){await this.#E.put(this.#_(E),_)}async delete(E){await this.#E.delete(this.#_(E))}async*scan(E,_){for await(let[F,Y]of this.#E.scan(this.#_(E),this.#Y(_)))yield[this.#F(F),Y]}async batch(E){await this.#E.batch(E.map((_)=>{if(_.type==="put")return{type:"put",key:this.#_(_.key),value:_.value};return{type:"delete",key:this.#_(_.key)}}))}async conditionalBatch(E,_){return u(this.#E,E.map((F)=>({key:this.#_(F.key),expectedValue:F.expectedValue})),_.map((F)=>{if(F.type==="put")return{type:"put",key:this.#_(F.key),value:F.value};return{type:"delete",key:this.#_(F.key)}}))}async has(E){return b(this.#E,this.#_(E))}async deletePrefix(E){return S(this.#E,this.#_(E))}async deleteRange(E,_){let F=this.#X(H(_));return I(this.#E,this.#_(E),F)}async*keys(E,_){for await(let F of C(this.#E,this.#_(E),this.#Y(_)))yield this.#F(F)}async count(E){return K(this.#E,this.#_(E))}[Symbol.dispose](){this.#E[Symbol.dispose]()}}});var i={};l(i,{LMDBStorage:()=>m});import*as w from"lmdb";var m;var r=G(()=>{D();N();c();m=class m{#E;#W=!1;#_=null;constructor(E){this.#E=w.open({path:E,encoding:"binary"})}#F(){if(this.#W)throw Error("LMDBStorage is closed")}capabilities(){return{persistence:"local",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!1}}async get(E){this.#F();let _=this.#E.get(E);if(_===void 0)return null;return new Uint8Array(_)}async put(E,_){this.#F(),await this.#E.put(E,Buffer.from(_))}async delete(E){this.#F(),await this.#E.remove(E)}async has(E){return this.#F(),this.#E.doesExist(E)}async deletePrefix(E){this.#F();let _=[];for await(let F of this.keys(E))_.push(F);if(_.length===0)return 0;return await this.#E.batch(()=>{for(let F of _)this.#E.remove(F)}),_.length}async deleteRange(E,_){this.#F();let F=H(_),Y=[];for await(let X of this.keys(E,F))Y.push(X);if(Y.length===0)return 0;return await this.#E.batch(()=>{for(let X of Y)this.#E.remove(X)}),Y.length}async*scan(E,_={}){this.#F();let{limit:F,reverse:Y}=_,X=L(E),Q=Y?this.#E.getRange({start:X,end:E,reverse:!0}):this.#E.getRange({start:E,end:X}),Z=0,$=!1;for(let{key:U,value:k}of Q){if(!U.startsWith(E)){if(Y&&!$)continue;break}if($=!0,!q(U,_))continue;if(F!==void 0&&Z>=F)break;yield[U,new Uint8Array(k)],Z++}}async*keys(E,_={}){this.#F();let{limit:F,reverse:Y}=_,X=L(E),Q=Y?this.#E.getKeys({start:X,end:E,reverse:!0}):this.#E.getKeys({start:E,end:X}),Z=0,$=!1;for(let U of Q){if(!U.startsWith(E)){if(Y&&!$)continue;break}if($=!0,!q(U,_))continue;if(F!==void 0&&Z>=F)break;yield U,Z++}}async count(E){this.#F();let _=L(E);return this.#E.getKeysCount({start:E,end:_})}scoped(E){return this.#F(),x(this,E)}async batch(E){if(this.#F(),E.length===0)return;await this.#E.batch(()=>{for(let _ of E)if(_.type==="put")this.#E.put(_.key,Buffer.from(_.value));else this.#E.remove(_.key)})}async conditionalBatch(E,_){return this.#F(),this.#E.transactionSync(()=>{for(let Y of E){let X=this.#E.get(Y.key),Q=X===void 0?null:new Uint8Array(X);if(!h(Q,Y.expectedValue))return!1}for(let Y of _)if(Y.type==="put")this.#E.putSync(Y.key,Buffer.from(Y.value));else this.#E.removeSync(Y.key);return!0})}close(){return this.#W=!0,this.#_??=(async()=>{await Promise.resolve(),await this.#E.close()})(),this.#_}[Symbol.dispose](){this.close()}}});r();export{m as LMDBStorage};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var c=Object.defineProperty;var k=(_)=>_;function y(_,E){this[_]=k.bind(null,E)}var g=(_,E)=>{for(var W in E)c(_,W,{get:E[W],enumerable:!0,configurable:!0,set:y.bind(E,W)})};var j=(_,E)=>()=>(_&&(E=_(_=0)),E);function L(_,E,W){if(!_.capabilities()[E])throw Error(`Feature "${W}" requires storage capability "${E}", but this storage backend does not provide it.`)}function f(_){let E=_.capabilities(),W=[];if(E.persistence!=="local")W.push(`persistence must be "local" (got "${E.persistence}")`);if(E.readAfterWrite!=="linearizable")W.push(`readAfterWrite must be "linearizable" (got "${E.readAfterWrite}")`);if(E.scanConsistency!=="snapshot")W.push(`scanConsistency must be "snapshot" (got "${E.scanConsistency}")`);if(!E.atomicBatch)W.push("atomicBatch must be true");if(!E.conditionalBatch)W.push("conditionalBatch must be true");if(W.length>0)throw Error(`Storage is not durable enough for recovery: ${W.join("; ")}.`)}var B="default";async function A(_,E){return await _.get(E)!==null}async function*Q(_,E,W){for await(let[Y]of _.scan(E,W))yield Y}async function z(_,E){let W=0;for await(let Y of Q(_,E))W++;return W}async function O(_,E){let W=[];for await(let Y of Q(_,E))W.push({type:"delete",key:Y});if(W.length===0)return 0;return await _.batch(W),W.length}async function P(_,E,W){let Y=[];for await(let J of Q(_,E,W))Y.push({type:"delete",key:J});if(Y.length===0)return 0;return await _.batch(Y),Y.length}var l;var h=j(()=>{l=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-headers:","wf-idx-","wf-terminal:"]});function G(_){return _.length>0?_.slice(0,-1)+String.fromCharCode(_.charCodeAt(_.length-1)+1):"\xFF"}function H(_,E={}){if(E.gt!==void 0&&_<=E.gt)return!1;if(E.gte!==void 0&&_<E.gte)return!1;if(E.lt!==void 0&&_>=E.lt)return!1;if(E.lte!==void 0&&_>E.lte)return!1;return!0}function v(_,E){if(_===null||E===null)return _===E;if(_.byteLength!==E.byteLength)return!1;for(let W=0;W<_.byteLength;W++)if(_[W]!==E[W])return!1;return!0}async function b(_,E){if(_.has)return _.has(E);return A(_,E)}function C(_,E,W){if(_.keys)return _.keys(E,W);return Q(_,E,W)}async function K(_,E){if(_.count)return _.count(E);return z(_,E)}async function u(_,E){if(_.deletePrefix)return _.deletePrefix(E);return O(_,E)}async function S(_,E,W){if(L(_,"conditionalBatch","storageConditionalBatch"),!_.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return _.conditionalBatch(E,W)}function F(_){return encodeURIComponent(_)}function W_(_){return decodeURIComponent(_)}function F_(_){try{return decodeURIComponent(_)}catch{return null}}var U=(_)=>String(_).padStart(16,"0"),Y_;var N=j(()=>{h();Y_={workflow:(_)=>`wf:${F(_)}`,checkpoint:(_)=>`wf:${F(_)}:ckpt`,checkpointHistory:(_,E)=>`wf:${F(_)}:ckpt:${String(E).padStart(10,"0")}`,timelinePrefix:(_)=>`wf:${F(_)}:timeline:`,timeline:(_,E)=>`wf:${F(_)}:timeline:${String(E).padStart(10,"0")}`,schedule:(_)=>`schedule:${F(_)}`,scheduleTick:(_,E)=>`schedule-due:${String(_).padStart(16,"0")}:${F(E)}`,scheduleRun:(_)=>`schedule-run:${F(_)}`,operation:(_,E,W)=>`op:${_}:${U(E)}:${W}`,operationInflight:(_)=>`op:inflight:${_}`,operationQueued:(_)=>`op:queued:${_}`,operationResolved:(_)=>`op:resolved:${_}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(_,E,W)=>`audit:bulk:${U(_)}:${F(E)}:${F(W)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(_,E)=>`op:resolved-by-time:${U(_)}:${F(E)}`,asyncActivity:(_,E)=>`async-act:v1:${F(_)}:${F(E)}`,activityReconciliationPrefix:(_)=>`actrec:v1:${F(_)}:`,activityReconciliation:(_,E,W)=>`actrec:v1:${F(_)}:${F(E)}:${W}`,eventPrefix:(_)=>`ev:${F(_)}:`,event:(_,E)=>`ev:${F(_)}:${String(E).padStart(10,"0")}`,eventHead:(_)=>`ev:${F(_)}:head`,eventWatermark:(_)=>`ev:${F(_)}:watermark`,signal:(_,E,W)=>`sig:${F(_)}:${E}:${F(W)}`,signalSequence:(_)=>`sigseq:v1:${F(_)}`,signalAcceptedResponsePrefix:(_)=>`sigres:v1:${F(_)}:`,signalAcceptedResponse:(_,E,W)=>`sigres:v1:${F(_)}:${F(E)}:${F(W)}`,deadline:(_,E)=>`wf-deadline:${U(_)}:${F(E)}`,terminalCleanup:(_,E)=>`wf-cleanup:${U(_)}:${F(E)}`,delayedStart:(_,E)=>`wf-delayed:${U(_)}:${F(E)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(_,E)=>`wf-terminal:${U(_)}:${F(E)}`,attribute:(_)=>`attr:${F(_)}`,attributeIndex:(_,E,W)=>`idx:${_}:${E}:${F(W)}`,tagIndex:(_,E)=>`tag:${F(_)}:${F(E)}`,updatePrefix:(_)=>`upd:${F(_)}:`,update:(_,E)=>`upd:${F(_)}:${E}`,updateResponse:(_)=>`upr:${_}`,updateIdempotency:(_,E)=>`upk:${F(_)}:${E}`,budget:(_,E,W)=>`budget:${_}:${E}:${W}`,review:(_,E)=>`review:${F(_)}:${E}`,workflowHeaders:(_)=>`wf-headers:${F(_)}`,terminalCleanupNeeded:(_)=>`wf-cleanup-needed:${F(_)}`,offload:(_,E)=>`offload:${F(_)}:${E}`,archive:(_,E)=>`archive:${F(_)}:${E}`,stateExecution:(_,E)=>`state:execution:${F(_)}:${F(E)}`,stateWorkflow:(_,E)=>`state:workflow-scope:${B}:${F(_)}:${F(E)}`,streamChunkPrefix:(_,E)=>`blob:${F(_)}:${E}:chunk:`,streamChunk:(_,E,W)=>`blob:${F(_)}:${E}:chunk:${String(W).padStart(10,"0")}`,streamMetadata:(_,E)=>`blob:${F(_)}:${E}:meta`,budgetCharged:(_)=>`budget-charged:${_}`,toolEffect:(_,E,W)=>`tool-effect:${F(_)}:${E}:${W}`,workflowVisibilityStatus:(_,E)=>`wf-idx-status:${F(_)}:${F(E)}`,workflowVisibilityType:(_,E)=>`wf-idx-type:${F(_)}:${F(E)}`,workflowVisibilityCreated:(_,E)=>`wf-idx-created:${U(_)}:${F(E)}`,workflowVisibilityUpdated:(_,E)=>`wf-idx-updated:${U(_)}:${F(E)}`,workflowVisibilityDeadline:(_,E)=>`wf-idx-deadline:${U(_)}:${F(E)}`,workflowVisibilityManifest:(_)=>`wf-idx-manifest:${F(_)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function d(_){if(_===void 0)return;if(typeof _!=="number"||!Number.isInteger(_)||_<0)throw Error("deleteRange limit must be a finite non-negative integer");return _===0?0:_}function V(_){let E={},W=!1;for(let J of["gt","gte","lt","lte"]){let X=_[J];if(X===void 0)continue;if(typeof X!=="string")throw Error("deleteRange bounds must be strings");E[J]=X,W=!0}if(!W)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Y=d(_.limit);if(Y!==void 0)E.limit=Y;return E}async function I(_,E,W){let Y=V(W);if(_.deleteRange)return _.deleteRange(E,Y);return P(_,E,Y)}var q=()=>{};function D(_){return _.replaceAll(/:+$/g,"")}function s(_,E){let W=D(_),Y=D(E);if(W.length===0)return Y;if(Y.length===0)return W;return`${W}:${Y}`}function x(_,E){return new R(_,E)}var R;var w=j(()=>{q();N();R=class R{#_;#W;constructor(_,E){this.#_=_,this.#W=D(E)}#E(_){if(this.#W.length===0)return _;return _.length===0?`${this.#W}:`:`${this.#W}:${_}`}#F(_){if(this.#W.length===0)return _;return _.slice(this.#W.length+1)}#Y(_={}){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.reverse!==void 0)E.reverse=_.reverse;if(_.gt!==void 0)E.gt=this.#E(_.gt);if(_.gte!==void 0)E.gte=this.#E(_.gte);if(_.lt!==void 0)E.lt=this.#E(_.lt);if(_.lte!==void 0)E.lte=this.#E(_.lte);return E}#X(_){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.gt!==void 0)E.gt=this.#E(_.gt);if(_.gte!==void 0)E.gte=this.#E(_.gte);if(_.lt!==void 0)E.lt=this.#E(_.lt);if(_.lte!==void 0)E.lte=this.#E(_.lte);return E}capabilities(){return this.#_.capabilities()}scoped(_){return new R(this.#_,s(this.#W,_))}async get(_){return this.#_.get(this.#E(_))}async put(_,E){await this.#_.put(this.#E(_),E)}async delete(_){await this.#_.delete(this.#E(_))}async*scan(_,E){for await(let[W,Y]of this.#_.scan(this.#E(_),this.#Y(E)))yield[this.#F(W),Y]}async batch(_){await this.#_.batch(_.map((E)=>{if(E.type==="put")return{type:"put",key:this.#E(E.key),value:E.value};return{type:"delete",key:this.#E(E.key)}}))}async conditionalBatch(_,E){return S(this.#_,_.map((W)=>({key:this.#E(W.key),expectedValue:W.expectedValue})),E.map((W)=>{if(W.type==="put")return{type:"put",key:this.#E(W.key),value:W.value};return{type:"delete",key:this.#E(W.key)}}))}async has(_){return b(this.#_,this.#E(_))}async deletePrefix(_){return u(this.#_,this.#E(_))}async deleteRange(_,E){let W=this.#X(V(E));return I(this.#_,this.#E(_),W)}async*keys(_,E){for await(let W of C(this.#_,this.#E(_),this.#Y(E)))yield this.#F(W)}async count(_){return K(this.#_,this.#E(_))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}});var p={};g(p,{MemoryStorage:()=>m});var m;var a=j(()=>{q();N();w();m=class m{#_;constructor(){this.#_=new Map}capabilities(){return{persistence:"ephemeral",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#W(_,E,W){return _>=E&&_<W}#E(_,E){let W=[];for(let Y of this.#_.keys())if(this.#W(Y,_,E))W.push(Y);return W.toSorted()}async get(_){return this.#_.get(_)??null}async put(_,E){this.#_.set(_,E)}async delete(_){this.#_.delete(_)}async*scan(_,E={}){let{limit:W,reverse:Y}=E,J=G(_),X=this.#E(_,J);if(X=X.filter(($)=>H($,E)),Y)X.reverse();let Z=0;for(let $ of X){if(W!==void 0&&Z>=W)break;let T=this.#_.get($);if(T!==void 0)yield[$,T],Z++}}async batch(_){this.#F(_)}#F(_){for(let E of _)if(E.type==="put")this.#_.set(E.key,E.value);else this.#_.delete(E.key)}async conditionalBatch(_,E){for(let W of _){let Y=this.#_.get(W.key)??null;if(!v(Y,W.expectedValue))return!1}return this.#F(E),!0}async has(_){return this.#_.has(_)}async deletePrefix(_){let E=G(_),W=this.#E(_,E);for(let Y of W)this.#_.delete(Y);return W.length}async deleteRange(_,E){let W=V(E),Y=G(_),J=this.#E(_,Y).filter((Z)=>H(Z,W)),X=W.limit===void 0?J:J.slice(0,W.limit);for(let Z of X)this.#_.delete(Z);return X.length}async*keys(_,E={}){let{limit:W,reverse:Y}=E,J=G(_),X=this.#E(_,J);if(X=X.filter(($)=>H($,E)),Y)X.reverse();let Z=0;for(let $ of X){if(W!==void 0&&Z>=W)break;yield $,Z++}}async count(_){let E=G(_);return this.#E(_,E).length}scoped(_){return x(this,_)}get size(){return this.#_.size}clear(){this.#_.clear()}snapshot(){let _=new Map;for(let[E,W]of this.#_)_.set(E,new Uint8Array(W));return _}[Symbol.dispose](){this.#_.clear()}}});a();export{m as MemoryStorage};
2
+ var c=Object.defineProperty;var k=(_)=>_;function g(_,E){this[_]=k.bind(null,E)}var f=(_,E)=>{for(var F in E)c(_,F,{get:E[F],enumerable:!0,configurable:!0,set:g.bind(E,F)})};var G=(_,E)=>()=>(_&&(E=_(_=0)),E);function L(_,E,F){if(!_.capabilities()[E])throw Error(`Feature "${F}" requires storage capability "${E}", but this storage backend does not provide it.`)}function y(_){let E=_.capabilities(),F=[];if(E.persistence!=="local"&&E.persistence!=="remote")F.push(`persistence must be "local" or "remote" (got "${E.persistence}")`);if(E.readAfterWrite!=="linearizable")F.push(`readAfterWrite must be "linearizable" (got "${E.readAfterWrite}")`);if(E.scanConsistency!=="snapshot")F.push(`scanConsistency must be "snapshot" (got "${E.scanConsistency}")`);if(!E.atomicBatch)F.push("atomicBatch must be true");if(!E.conditionalBatch)F.push("conditionalBatch must be true");if(F.length>0)throw Error(`Storage is not durable enough for recovery: ${F.join("; ")}.`)}var q="default";async function A(_,E){return await _.get(E)!==null}async function*M(_,E,F){for await(let[Y]of _.scan(E,F))yield Y}async function z(_,E){let F=0;for await(let Y of M(_,E))F++;return F}async function O(_,E){let F=[];for await(let Y of M(_,E))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await _.batch(F),F.length}async function P(_,E,F){let Y=[];for await(let J of M(_,E,F))Y.push({type:"delete",key:J});if(Y.length===0)return 0;return await _.batch(Y),Y.length}var l;var v=G(()=>{l=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function $(_){return _.length>0?_.slice(0,-1)+String.fromCharCode(_.charCodeAt(_.length-1)+1):"\xFF"}function H(_,E={}){if(E.gt!==void 0&&_<=E.gt)return!1;if(E.gte!==void 0&&_<E.gte)return!1;if(E.lt!==void 0&&_>=E.lt)return!1;if(E.lte!==void 0&&_>E.lte)return!1;return!0}function h(_,E){if(_===null||E===null)return _===E;if(_.byteLength!==E.byteLength)return!1;for(let F=0;F<_.byteLength;F++)if(_[F]!==E[F])return!1;return!0}async function b(_,E){if(_.has)return _.has(E);return A(_,E)}function C(_,E,F){if(_.keys)return _.keys(E,F);return M(_,E,F)}async function u(_,E){if(_.count)return _.count(E);return z(_,E)}async function K(_,E){if(_.deletePrefix)return _.deletePrefix(E);return O(_,E)}async function S(_,E,F){if(L(_,"conditionalBatch","storageConditionalBatch"),!_.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return _.conditionalBatch(E,F)}function W(_){return encodeURIComponent(_)}function F_(_){return decodeURIComponent(_)}function W_(_){try{return decodeURIComponent(_)}catch{return null}}var Q=(_)=>String(_).padStart(16,"0"),Y_;var B=G(()=>{v();Y_={workflow:(_)=>`wf:${W(_)}`,checkpoint:(_)=>`wf:${W(_)}:ckpt`,checkpointHistory:(_,E)=>`wf:${W(_)}:ckpt:${String(E).padStart(10,"0")}`,timelinePrefix:(_)=>`wf:${W(_)}:timeline:`,timeline:(_,E)=>`wf:${W(_)}:timeline:${String(E).padStart(10,"0")}`,schedule:(_)=>`schedule:${W(_)}`,scheduleTick:(_,E)=>`schedule-due:${String(_).padStart(16,"0")}:${W(E)}`,scheduleRun:(_)=>`schedule-run:${W(_)}`,operation:(_,E,F)=>`op:${_}:${Q(E)}:${F}`,operationInflight:(_)=>`op:inflight:${_}`,operationQueued:(_)=>`op:queued:${_}`,operationResolved:(_)=>`op:resolved:${_}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(_,E,F)=>`audit:bulk:${Q(_)}:${W(E)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(_,E)=>`op:resolved-by-time:${Q(_)}:${W(E)}`,asyncActivity:(_,E)=>`async-act:v1:${W(_)}:${W(E)}`,activityReconciliationPrefix:(_)=>`actrec:v1:${W(_)}:`,activityReconciliation:(_,E,F)=>`actrec:v1:${W(_)}:${W(E)}:${F}`,eventPrefix:(_)=>`ev:${W(_)}:`,event:(_,E)=>`ev:${W(_)}:${String(E).padStart(10,"0")}`,eventHead:(_)=>`ev:${W(_)}:head`,eventWatermark:(_)=>`ev:${W(_)}:watermark`,signal:(_,E,F)=>`sig:${W(_)}:${E}:${W(F)}`,signalSequence:(_)=>`sigseq:v1:${W(_)}`,signalAcceptedResponsePrefix:(_)=>`sigres:v1:${W(_)}:`,signalAcceptedResponse:(_,E,F)=>`sigres:v1:${W(_)}:${W(E)}:${W(F)}`,deadline:(_,E)=>`wf-deadline:${Q(_)}:${W(E)}`,terminalCleanup:(_,E)=>`wf-cleanup:${Q(_)}:${W(E)}`,delayedStart:(_,E)=>`wf-delayed:${Q(_)}:${W(E)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(_,E)=>`wf-terminal:${Q(_)}:${W(E)}`,attribute:(_)=>`attr:${W(_)}`,attributeIndex:(_,E,F)=>`idx:${_}:${E}:${W(F)}`,tagIndex:(_,E)=>`tag:${W(_)}:${W(E)}`,updatePrefix:(_)=>`upd:${W(_)}:`,update:(_,E)=>`upd:${W(_)}:${E}`,updateResponse:(_)=>`upr:${_}`,updateIdempotency:(_,E)=>`upk:${W(_)}:${E}`,startIdempotency:(_)=>`start-idem:${W(_)}`,startIdempotencySignalId:(_)=>`start-idem:${_}`,livenessPrefix:()=>"liveness:",liveness:(_)=>`liveness:${W(_)}`,budget:(_,E,F)=>`budget:${_}:${E}:${F}`,review:(_,E)=>`review:${W(_)}:${E}`,workflowHeaders:(_)=>`wf-headers:${W(_)}`,terminalCleanupNeeded:(_)=>`wf-cleanup-needed:${W(_)}`,workflowHasServices:(_)=>`wf-has-services:${W(_)}`,offload:(_,E)=>`offload:${W(_)}:${E}`,archive:(_,E)=>`archive:${W(_)}:${E}`,stateExecution:(_,E)=>`state:execution:${W(_)}:${W(E)}`,stateWorkflow:(_,E)=>`state:workflow-scope:${q}:${W(_)}:${W(E)}`,streamChunkPrefix:(_,E)=>`blob:${W(_)}:${E}:chunk:`,streamChunk:(_,E,F)=>`blob:${W(_)}:${E}:chunk:${String(F).padStart(10,"0")}`,streamMetadata:(_,E)=>`blob:${W(_)}:${E}:meta`,budgetCharged:(_)=>`budget-charged:${_}`,toolEffect:(_,E,F)=>`tool-effect:${W(_)}:${E}:${F}`,workflowVisibilityStatus:(_,E)=>`wf-idx-status:${W(_)}:${W(E)}`,workflowVisibilityType:(_,E)=>`wf-idx-type:${W(_)}:${W(E)}`,workflowVisibilityCreated:(_,E)=>`wf-idx-created:${Q(_)}:${W(E)}`,workflowVisibilityUpdated:(_,E)=>`wf-idx-updated:${Q(_)}:${W(E)}`,workflowVisibilityDeadline:(_,E)=>`wf-idx-deadline:${Q(_)}:${W(E)}`,workflowVisibilityManifest:(_)=>`wf-idx-manifest:${W(_)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function d(_){if(_===void 0)return;if(typeof _!=="number"||!Number.isInteger(_)||_<0)throw Error("deleteRange limit must be a finite non-negative integer");return _===0?0:_}function V(_){let E={},F=!1;for(let J of["gt","gte","lt","lte"]){let X=_[J];if(X===void 0)continue;if(typeof X!=="string")throw Error("deleteRange bounds must be strings");E[J]=X,F=!0}if(!F)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Y=d(_.limit);if(Y!==void 0)E.limit=Y;return E}async function I(_,E,F){let Y=V(F);if(_.deleteRange)return _.deleteRange(E,Y);return P(_,E,Y)}var N=()=>{};function D(_){return _.replaceAll(/:+$/g,"")}function s(_,E){let F=D(_),Y=D(E);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}function x(_,E){return new R(_,E)}var R;var w=G(()=>{N();B();R=class R{#_;#F;constructor(_,E){this.#_=_,this.#F=D(E)}#E(_){if(this.#F.length===0)return _;return _.length===0?`${this.#F}:`:`${this.#F}:${_}`}#W(_){if(this.#F.length===0)return _;return _.slice(this.#F.length+1)}#Y(_={}){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.reverse!==void 0)E.reverse=_.reverse;if(_.gt!==void 0)E.gt=this.#E(_.gt);if(_.gte!==void 0)E.gte=this.#E(_.gte);if(_.lt!==void 0)E.lt=this.#E(_.lt);if(_.lte!==void 0)E.lte=this.#E(_.lte);return E}#X(_){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.gt!==void 0)E.gt=this.#E(_.gt);if(_.gte!==void 0)E.gte=this.#E(_.gte);if(_.lt!==void 0)E.lt=this.#E(_.lt);if(_.lte!==void 0)E.lte=this.#E(_.lte);return E}capabilities(){return this.#_.capabilities()}scoped(_){return new R(this.#_,s(this.#F,_))}async get(_){return this.#_.get(this.#E(_))}async put(_,E){await this.#_.put(this.#E(_),E)}async delete(_){await this.#_.delete(this.#E(_))}async*scan(_,E){for await(let[F,Y]of this.#_.scan(this.#E(_),this.#Y(E)))yield[this.#W(F),Y]}async batch(_){await this.#_.batch(_.map((E)=>{if(E.type==="put")return{type:"put",key:this.#E(E.key),value:E.value};return{type:"delete",key:this.#E(E.key)}}))}async conditionalBatch(_,E){return S(this.#_,_.map((F)=>({key:this.#E(F.key),expectedValue:F.expectedValue})),E.map((F)=>{if(F.type==="put")return{type:"put",key:this.#E(F.key),value:F.value};return{type:"delete",key:this.#E(F.key)}}))}async has(_){return b(this.#_,this.#E(_))}async deletePrefix(_){return K(this.#_,this.#E(_))}async deleteRange(_,E){let F=this.#X(V(E));return I(this.#_,this.#E(_),F)}async*keys(_,E){for await(let F of C(this.#_,this.#E(_),this.#Y(E)))yield this.#W(F)}async count(_){return u(this.#_,this.#E(_))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}});var p={};f(p,{MemoryStorage:()=>m});var m;var a=G(()=>{N();B();w();m=class m{#_;constructor(){this.#_=new Map}capabilities(){return{persistence:"ephemeral",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#F(_,E,F){return _>=E&&_<F}#E(_,E){let F=[];for(let Y of this.#_.keys())if(this.#F(Y,_,E))F.push(Y);return F.toSorted()}async get(_){return this.#_.get(_)??null}async put(_,E){this.#_.set(_,E)}async delete(_){this.#_.delete(_)}async*scan(_,E={}){let{limit:F,reverse:Y}=E,J=$(_),X=this.#E(_,J);if(X=X.filter((Z)=>H(Z,E)),Y)X.reverse();let U=0;for(let Z of X){if(F!==void 0&&U>=F)break;let T=this.#_.get(Z);if(T!==void 0)yield[Z,T],U++}}async batch(_){this.#W(_)}#W(_){for(let E of _)if(E.type==="put")this.#_.set(E.key,E.value);else this.#_.delete(E.key)}async conditionalBatch(_,E){for(let F of _){let Y=this.#_.get(F.key)??null;if(!h(Y,F.expectedValue))return!1}return this.#W(E),!0}async has(_){return this.#_.has(_)}async deletePrefix(_){let E=$(_),F=this.#E(_,E);for(let Y of F)this.#_.delete(Y);return F.length}async deleteRange(_,E){let F=V(E),Y=$(_),J=this.#E(_,Y).filter((U)=>H(U,F)),X=F.limit===void 0?J:J.slice(0,F.limit);for(let U of X)this.#_.delete(U);return X.length}async*keys(_,E={}){let{limit:F,reverse:Y}=E,J=$(_),X=this.#E(_,J);if(X=X.filter((Z)=>H(Z,E)),Y)X.reverse();let U=0;for(let Z of X){if(F!==void 0&&U>=F)break;yield Z,U++}}async count(_){let E=$(_);return this.#E(_,E).length}scoped(_){return x(this,_)}get size(){return this.#_.size}clear(){this.#_.clear()}snapshot(){let _=new Map;for(let[E,F]of this.#_)_.set(E,new Uint8Array(F));return _}[Symbol.dispose](){this.#_.clear()}}});a();export{m as MemoryStorage};
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Pure value-mapping helpers shared by the Neon adapter: the minimal query-result
3
+ * shape both the Neon serverless driver and the PGlite test backend satisfy, the
4
+ * driver-tolerant affected-row count, and the BYTEA encode/decode pair. Split out
5
+ * of `neon.ts` to keep that module focused on the `Storage` implementation; none
6
+ * of these is exported from the package — `neon.ts` imports them back.
7
+ *
8
+ * @module storage/neon-value-mapping
9
+ */
10
+ /**
11
+ * Minimal structural view of a node-postgres query result. The Neon serverless
12
+ * driver and PGlite both return an object with a `rows` array; nothing else is
13
+ * needed here, so the adapter depends only on this shape rather than the full
14
+ * driver types. Keeping the seam minimal is what lets the PGlite test backend
15
+ * stand in for the real `Pool` without pulling the optional dependency's types
16
+ * into the build.
17
+ *
18
+ * `rowCount` (node-postgres) and `affectedRows` (PGlite) are the driver-specific
19
+ * names for the number of rows a write affected; both are optional here and read
20
+ * defensively so delete counts never require materializing the deleted rows.
21
+ */
22
+ export type NeonQueryResult = {
23
+ rows: Array<Record<string, unknown>>;
24
+ rowCount?: number | null;
25
+ affectedRows?: number;
26
+ };
27
+ /**
28
+ * Read the number of rows a write statement affected, tolerating the
29
+ * driver-specific field name (`rowCount` on node-postgres/Neon, `affectedRows`
30
+ * on PGlite). Falls back to `rows.length` for statements that return rows.
31
+ */
32
+ export declare function affectedRowCount(result: NeonQueryResult): number;
33
+ /**
34
+ * Normalize a BYTEA value read back from Postgres into a `Uint8Array`. The Neon
35
+ * driver returns a Node `Buffer`, which may be a view onto a larger pooled
36
+ * `ArrayBuffer`; `new Uint8Array(buffer)` copies the bytes into a standalone
37
+ * array so the value cannot be corrupted by buffer reuse. PGlite already returns
38
+ * a `Uint8Array`, and copying it is harmless.
39
+ */
40
+ export declare function toStorageValue(raw: unknown): Uint8Array;
41
+ /**
42
+ * Bind a storage value for a BYTEA parameter. node-postgres serializes a Node
43
+ * `Buffer` as BYTEA; a bare `Uint8Array` can serialize incorrectly. `Buffer` is
44
+ * a `Uint8Array` subclass, so PGlite accepts the same bound value — keeping a
45
+ * single bind path means the PGlite test exercises exactly what Neon runs.
46
+ */
47
+ export declare function toBytea(value: Uint8Array): Buffer;
@@ -0,0 +1,11 @@
1
+ export function affectedRowCount(result) {
2
+ return result.rowCount ?? result.affectedRows ?? result.rows.length;
3
+ }
4
+ export function toStorageValue(raw) {
5
+ if (raw instanceof Uint8Array)
6
+ return new Uint8Array(raw);
7
+ return new Uint8Array(raw);
8
+ }
9
+ export function toBytea(value) {
10
+ return Buffer.from(value);
11
+ }