@lostgradient/weft 0.10.0 → 0.12.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 (102) hide show
  1. package/README.md +10 -2
  2. package/dist/cli/generated/operation-catalog.snapshot.json +4671 -0
  3. package/dist/cli/generated/operation-client.generated.d.ts +1 -0
  4. package/dist/cli/index.js +1 -0
  5. package/dist/cli-main.js +227 -401
  6. package/dist/client/http-operations.js +7 -1
  7. package/dist/client/http-request.d.ts +23 -1
  8. package/dist/client/http-request.js +12 -3
  9. package/dist/client/index.d.ts +2 -0
  10. package/dist/client/index.js +7 -0
  11. package/dist/connection.d.ts +8 -0
  12. package/dist/connection.js +41 -17
  13. package/dist/core/checkpoint/serialization.js +2 -2
  14. package/dist/core/engine/callback-creators-core.js +2 -1
  15. package/dist/core/engine/disposal.js +4 -0
  16. package/dist/core/engine/engine-leak-warnings.d.ts +2 -0
  17. package/dist/core/engine/engine-leak-warnings.js +7 -1
  18. package/dist/core/engine/index.d.ts +49 -3
  19. package/dist/core/engine/index.js +19 -3
  20. package/dist/core/engine/inline-parking.js +14 -1
  21. package/dist/core/engine/internals.d.ts +21 -0
  22. package/dist/core/engine/lifecycle/shared.d.ts +25 -0
  23. package/dist/core/engine/lifecycle/transition.js +19 -9
  24. package/dist/core/engine/operations-time.js +8 -28
  25. package/dist/core/engine/sleep-timer-acknowledgements.d.ts +15 -0
  26. package/dist/core/engine/sleep-timer-acknowledgements.js +144 -0
  27. package/dist/core/engine/termination/cleanup.js +3 -0
  28. package/dist/core/types/definition-schema-to-json.d.ts +11 -0
  29. package/dist/core/types/definition-schema-to-json.js +11 -2
  30. package/dist/http.js +2 -0
  31. package/dist/indexeddb.js +1 -0
  32. package/dist/json-schema.js +3 -3
  33. package/dist/mcp/cli.js +63 -61
  34. package/dist/mcp/http.d.ts +7 -2
  35. package/dist/mcp/session.d.ts +3 -3
  36. package/dist/mcp/session.js +3 -2
  37. package/dist/mcp/stdio.d.ts +7 -2
  38. package/dist/observability/index.js +2 -2
  39. package/dist/runtime/portable.d.ts +33 -0
  40. package/dist/runtime/portable.js +17 -6
  41. package/dist/server/engine-event-feed-backend.d.ts +22 -3
  42. package/dist/server/fleet-event-feed.d.ts +65 -0
  43. package/dist/server/handler/index.d.ts +11 -2
  44. package/dist/server/handler/index.js +7 -0
  45. package/dist/server/handler.js +1 -56
  46. package/dist/server/index.d.ts +12 -1
  47. package/dist/server/index.js +87 -64
  48. package/dist/server/operations/submit-review-decision.d.ts +2 -0
  49. package/dist/server/operations/submit-review-decision.js +19 -2
  50. package/dist/server/replay-live-feed-internals.d.ts +19 -0
  51. package/dist/server/replay-live-feed-internals.js +76 -0
  52. package/dist/server/runtime/authentication-bridge.d.ts +2 -2
  53. package/dist/server/serve-internals.js +3 -3
  54. package/dist/server/workflow-event-feed.d.ts +100 -11
  55. package/dist/server/workflow-event-feed.js +1 -140
  56. package/dist/service-worker/index.d.ts +8 -2
  57. package/dist/service-worker/index.js +37 -56
  58. package/dist/service-worker/scheduler.js +1 -0
  59. package/dist/service-worker/setup.d.ts +6 -2
  60. package/dist/storage/auto.js +1 -1
  61. package/dist/storage/bun-sql.js +3 -3
  62. package/dist/storage/cloudflare-durable-object-sql.d.ts +75 -0
  63. package/dist/storage/cloudflare-durable-object-sql.js +0 -0
  64. package/dist/storage/cloudflare-value-codec.d.ts +65 -0
  65. package/dist/storage/cloudflare-value-codec.js +46 -0
  66. package/dist/storage/cloudflare.d.ts +140 -0
  67. package/dist/storage/cloudflare.js +127 -0
  68. package/dist/storage/compressed-storage.js +1 -1
  69. package/dist/storage/http.js +200 -2
  70. package/dist/storage/index.d.ts +1 -0
  71. package/dist/storage/indexeddb.js +311 -1
  72. package/dist/storage/interface.js +1 -1
  73. package/dist/storage/lazy-postgres-pool.d.ts +38 -0
  74. package/dist/storage/lazy-postgres-pool.js +38 -0
  75. package/dist/storage/lmdb.js +1 -1
  76. package/dist/storage/memory.js +1 -1
  77. package/dist/storage/neon-batch.d.ts +8 -8
  78. package/dist/storage/neon.d.ts +26 -79
  79. package/dist/storage/neon.js +4 -4
  80. package/dist/storage/node-sqlite.js +3 -3
  81. package/dist/storage/postgres-key-value-queries.d.ts +7 -1
  82. package/dist/storage/postgres-key-value-queries.js +2 -3
  83. package/dist/storage/postgres-key-value-storage.d.ts +110 -0
  84. package/dist/storage/postgres-key-value-storage.js +204 -0
  85. package/dist/storage/postgres.d.ts +59 -0
  86. package/dist/storage/postgres.js +15 -0
  87. package/dist/storage/resolve.js +1 -1
  88. package/dist/storage/scoped-storage.js +1 -1
  89. package/dist/storage/sql-identifier.d.ts +35 -0
  90. package/dist/storage/sql-identifier.js +5 -0
  91. package/dist/storage/sqlite-key-value-queries.d.ts +11 -6
  92. package/dist/storage/sqlite-key-value-queries.js +3 -3
  93. package/dist/storage/testing.js +1 -1
  94. package/dist/storage/turso.js +2 -2
  95. package/dist/storage/typed-storage.js +138 -2
  96. package/dist/storage/web-extension.js +298 -1
  97. package/dist/testing/index.js +21 -60
  98. package/dist/version.d.ts +1 -1
  99. package/dist/version.js +1 -1
  100. package/dist/web-extension.js +1 -0
  101. package/dist/worker/protocol.js +1 -1
  102. package/package.json +23 -5
@@ -0,0 +1,38 @@
1
+ import type { PostgresPool } from './postgres-key-value-storage.ts';
2
+ /**
3
+ * Options for {@link createLazyPostgresPool}.
4
+ */
5
+ export type LazyPostgresPoolOptions = {
6
+ /** npm package name of the driver, used in the missing-dependency error. */
7
+ readonly driverName: string;
8
+ /** Adapter class name, used in the missing-dependency error. */
9
+ readonly storageName: string;
10
+ /**
11
+ * Import the driver and construct its connection pool for `url`. Called at most
12
+ * once, on first use. Kept as a callback so this module never imports a specific
13
+ * driver — Neon and Postgres pass their own.
14
+ */
15
+ readonly loadPool: (url: string) => Promise<PostgresPool>;
16
+ };
17
+ /**
18
+ * Build a {@link PostgresPool} whose driver module is imported lazily on first use
19
+ * and whose owned connection pool is torn down exactly once. Shared by
20
+ * `NeonStorage` and `PostgresStorage`: both differ only in WHICH driver they load,
21
+ * so the lazy-import memoization, the dispose-before/after-use guards, and the
22
+ * actionable "optional peer dependency" error live here once instead of being
23
+ * copy-pasted into each factory.
24
+ *
25
+ * Behavior:
26
+ * - **Lazy + memoized:** `loadPool` runs at most once, on the first
27
+ * `query`/`connect`. The injected-pool path never reaches here, so it never
28
+ * imports the driver.
29
+ * - **Disposed is terminal:** after `end()`, any further `query`/`connect` throws
30
+ * rather than silently building a fresh, unreachable pool (which would leak
31
+ * connections and keep the process alive — the bug a naive
32
+ * `if (poolPromise === undefined) return` guard introduces).
33
+ * - **End is safe:** `end()` before first use is a no-op (nothing was built); a
34
+ * failed import leaves nothing to close.
35
+ * - **Missing driver is actionable:** a module-resolution failure is rewrapped as
36
+ * an install hint naming the package, matching the SQLite adapters' DX.
37
+ */
38
+ export declare function createLazyPostgresPool(url: string, options: LazyPostgresPoolOptions): PostgresPool;
@@ -0,0 +1,38 @@
1
+ export function createLazyPostgresPool(url, options) {
2
+ let poolPromise, endPromise, disposed = !1;
3
+ const resolvePool = () => {
4
+ if (disposed)
5
+ throw Error(`${options.storageName} pool has been disposed and cannot be reused. Construct a new adapter.`);
6
+ poolPromise ??= options.loadPool(url).catch((error) => {
7
+ poolPromise = void 0;
8
+ throw asDriverLoadError(error, options);
9
+ });
10
+ return poolPromise;
11
+ };
12
+ return {
13
+ query: async (sql, parameters) => {
14
+ return (await resolvePool()).query(sql, parameters);
15
+ },
16
+ connect: async () => {
17
+ return (await resolvePool()).connect();
18
+ },
19
+ end: async () => {
20
+ disposed = !0;
21
+ endPromise ??= (async () => {
22
+ if (poolPromise === void 0)
23
+ return;
24
+ await (await poolPromise.catch(() => {
25
+ return;
26
+ }))?.end();
27
+ })();
28
+ return endPromise;
29
+ }
30
+ };
31
+ }
32
+ const MODULE_NOT_FOUND = /cannot find module|module_not_found|failed to resolve|could not resolve/i;
33
+ function asDriverLoadError(error, options) {
34
+ const message = error instanceof Error ? error.message : String(error);
35
+ if (MODULE_NOT_FOUND.test(message))
36
+ return Error(`${options.storageName} requires the optional peer dependency "${options.driverName}". Install it in your application with: bun add ${options.driverName} (or npm install ${options.driverName}).`, { cause: error });
37
+ return error instanceof Error ? error : Error(message);
38
+ }
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var d=Object.defineProperty;var p=(E)=>E;function a(E,_){this[E]=p.bind(null,_)}var s=(E,_)=>{for(var F in _)d(E,F,{get:_[F],enumerable:!0,configurable:!0,set:a.bind(_,F)})};var $=(E,_)=>()=>(E&&(_=E(E=0)),_);var FE=import.meta.require,WE=(E,_,F)=>{if(_!=null){if(typeof _!=="object"&&typeof _!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let Y;if(F)Y=_[Symbol.asyncDispose];if(Y===void 0)Y=_[Symbol.dispose];if(typeof Y!=="function")throw TypeError("Object not disposable");E.push([F,Y,_])}else if(F)E.push([F]);return _},YE=(E,_,F)=>{let Y=(U)=>_=F?new SuppressedError(U,_,"An error was suppressed during disposal"):(F=!0,U),X=(U)=>{while(U=E.pop())try{var Q=U[1]&&U[1].call(U[2]);if(U[0])return Promise.resolve(Q).then(X,(J)=>(Y(J),X()))}catch(J){Y(J)}if(F)throw _};return X()};function L(E,_,F){if(!E.capabilities()[_])throw Error(`Feature "${F}" requires storage capability "${_}", but this storage backend does not provide it.`)}function n(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 D="default";async function A(E,_){return await E.get(_)!==null}async function*j(E,_,F){for await(let[Y]of E.scan(_,F))yield Y}async function z(E,_){let F=0;for await(let Y of j(E,_))F++;return F}async function K(E,_){let F=[];for await(let Y of j(E,_))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await E.batch(F),F.length}async function h(E,_,F){let Y=[];for await(let X of j(E,_,F))Y.push({type:"delete",key:X});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var r;var v=$(()=>{r=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","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-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-terminal:"]});function M(E,_){if(_>N)throw new O(E,_)}function V(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function R(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 b(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 m(E,_){if(E.has)return E.has(_);return A(E,_)}function c(E,_,F){if(E.keys)return E.keys(_,F);return j(E,_,F)}async function u(E,_){if(E.count)return E.count(_);return z(E,_)}async function x(E,_){if(E.deletePrefix)return E.deletePrefix(_);return K(E,_)}async function jE(E,_){M("batch operations",_.length),await E.batch(_)}async function y(E,_,F){if(M("conditionalBatch conditions",_.length),M("conditionalBatch operations",F.length),L(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 HE(E){return decodeURIComponent(E)}function VE(E){try{return decodeURIComponent(E)}catch{return null}}var N=1e4,TE=1e4,O,G=(E)=>String(E).padStart(16,"0"),t="0",i="1",P=(E,_,F,Y)=>`sig:${W(E)}:${W(_)}:${Y}:${W(F)}`,LE;var S=$(()=>{v();O=class O extends Error{code="StorageBatchOperationLimitExceededError";cap=N;count;target;constructor(E,_){super(`${E} count ${_} exceeds MAX_BATCH_OPERATIONS (${N}).`);this.name="StorageBatchOperationLimitExceededError",this.target=E,this.count=_}};LE={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}:${G(_)}:${F}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(E)=>`op:dead-letter:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,F)=>`audit:bulk:${G(E)}:${W(_)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${G(E)}:${W(_)}`,asyncActivity:(E,_)=>`async-act:v1:${W(E)}:${W(_)}`,asyncActivityResolution:(E,_)=>`async-act:v1:${W(E)}:${W(_)}:resolution`,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`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(E)=>`fleet-event:${String(E).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(E)=>`fleet-event-by-workflow:${W(E)}:`,fleetEventByWorkflow:(E,_)=>`fleet-event-by-workflow:${W(E)}:${String(_).padStart(10,"0")}`,signal:(E,_,F)=>P(E,_,F,i),startSignal:(E,_,F)=>P(E,_,F,t),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:${G(E)}:${W(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${G(E)}:${W(_)}`,teardownTimer:(E,_)=>`wf-teardown:${G(E)}:${W(_)}`,delayedStart:(E,_)=>`wf-delayed:${G(E)}:${W(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${G(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)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(E,_,F)=>`budget:${E}:${_}:${F}`,review:(E,_)=>`review:${W(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${W(E)}`,childCancellationPrefix:(E)=>`child-cancel:${W(E)}:`,childCancellation:(E,_)=>`child-cancel:${W(E)}:${W(_)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${W(E)}`,workflowConcurrency:(E,_)=>`wf-concurrency:${W(E)}:${W(_)}`,workflowConcurrencyHolder:(E)=>`wf-concurrency-holder:${W(E)}`,workflowHasServices:(E)=>`wf-has-services:${W(E)}`,finalizerState:(E)=>`wf-finalizer-state:${W(E)}`,teardownOwed:(E)=>`wf-teardown-needed:${W(E)}`,teardownDeadLetter:(E)=>`wf-teardown-deadletter:${W(E)}`,offload:(E,_)=>`offload:${W(E)}:${_}`,archive:(E,_)=>`archive:${W(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${W(E)}:${W(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${D}:${W(E)}:${W(_)}`,streamChunkPrefix:(E,_)=>`blob:${W(E)}:${_}:chunk:`,streamChunk:(E,_,F)=>`blob:${W(E)}:${_}:chunk:${String(F).padStart(10,"0")}`,streamTail:(E,_)=>`blob:${W(E)}:${_}:tail`,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:${G(E)}:${W(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${G(E)}:${W(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${G(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 e(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 U=E[X];if(U===void 0)continue;if(typeof U!=="string")throw Error("deleteRange bounds must be strings");_[X]=U,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=e(E.limit);if(Y!==void 0)_.limit=Y;return _}async function g(E,_,F){let Y=H(F);if(E.deleteRange)return E.deleteRange(_,Y);return h(E,_,Y)}var q=()=>{};function B(E){return E.replaceAll(/:+$/g,"")}function o(E,_){let F=B(E),Y=B(_);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}function I(E,_){return new C(E,_)}var C;var w=$(()=>{q();S();C=class C{#E;#W;constructor(E,_){this.#E=E,this.#W=B(_)}#_(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 C(this.#E,o(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){M("batch operations",E.length),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 y(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 m(this.#E,this.#_(E))}async deletePrefix(E){return x(this.#E,this.#_(E))}async deleteRange(E,_){let F=this.#X(H(_));return g(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 u(this.#E,this.#_(E))}[Symbol.dispose](){this.#E[Symbol.dispose]()}}});var EE={};s(EE,{LMDBStorage:()=>l});import*as k from"lmdb";var l;var _E=$(()=>{q();S();w();l=class l{#E;#W=!1;#_=null;constructor(E){this.#E=k.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=V(E),U=Y?this.#E.getRange({start:X,end:E,reverse:!0}):this.#E.getRange({start:E,end:X}),Q=0,J=!1;for(let{key:Z,value:f}of U){if(!Z.startsWith(E)){if(Y&&!J)continue;break}if(J=!0,!R(Z,_))continue;if(F!==void 0&&Q>=F)break;yield[Z,new Uint8Array(f)],Q++}}async*keys(E,_={}){this.#F();let{limit:F,reverse:Y}=_,X=V(E),U=Y?this.#E.getKeys({start:X,end:E,reverse:!0}):this.#E.getKeys({start:E,end:X}),Q=0,J=!1;for(let Z of U){if(!Z.startsWith(E)){if(Y&&!J)continue;break}if(J=!0,!R(Z,_))continue;if(F!==void 0&&Q>=F)break;yield Z,Q++}}async count(E){this.#F();let _=V(E);return this.#E.getKeysCount({start:E,end:_})}scoped(E){return this.#F(),I(this,E)}async batch(E){if(this.#F(),M("batch operations",E.length),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(),M("conditionalBatch conditions",E.length),M("conditionalBatch operations",_.length),this.#E.transactionSync(()=>{for(let Y of E){let X=this.#E.get(Y.key),U=X===void 0?null:new Uint8Array(X);if(!b(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.#W=!0,this.#_??=(async()=>{await Promise.resolve(),await this.#E.close()})(),this.#_}[Symbol.dispose](){this.close()}}});_E();export{l as LMDBStorage};
2
+ var d=import.meta.require,p=(E,_,F)=>{if(_!=null){if(typeof _!=="object"&&typeof _!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let Y;if(F)Y=_[Symbol.asyncDispose];if(Y===void 0)Y=_[Symbol.dispose];if(typeof Y!=="function")throw TypeError("Object not disposable");E.push([F,Y,_])}else if(F)E.push([F]);return _},a=(E,_,F)=>{let Y=(U)=>_=F?new SuppressedError(U,_,"An error was suppressed during disposal"):(F=!0,U),X=(U)=>{while(U=E.pop())try{var Q=U[1]&&U[1].call(U[2]);if(U[0])return Promise.resolve(Q).then(X,(J)=>(Y(J),X()))}catch(J){Y(J)}if(F)throw _};return X()};function H(E,_,F){if(!E.capabilities()[_])throw Error(`Feature "${F}" requires storage capability "${_}", but this storage backend does not provide it.`)}function y(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 V="default";async function S(E,_){return await E.get(_)!==null}async function*$(E,_,F){for await(let[Y]of E.scan(_,F))yield Y}async function q(E,_){let F=0;for await(let Y of $(E,_))F++;return F}async function B(E,_){let F=[];for await(let Y of $(E,_))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await E.batch(F),F.length}async function C(E,_,F){let Y=[];for await(let X of $(E,_,F))Y.push({type:"delete",key:X});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var g=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","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-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-terminal:"];var L=1e4,_E=1e4;class z extends Error{code="StorageBatchOperationLimitExceededError";cap=L;count;target;constructor(E,_){super(`${E} count ${_} exceeds MAX_BATCH_OPERATIONS (${L}).`);this.name="StorageBatchOperationLimitExceededError",this.target=E,this.count=_}}function M(E,_){if(_>L)throw new z(E,_)}function j(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function D(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 K(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 h(E,_){if(E.has)return E.has(_);return S(E,_)}function v(E,_,F){if(E.keys)return E.keys(_,F);return $(E,_,F)}async function P(E,_){if(E.count)return E.count(_);return q(E,_)}async function O(E,_){if(E.deletePrefix)return E.deletePrefix(_);return B(E,_)}async function FE(E,_){M("batch operations",_.length),await E.batch(_)}async function b(E,_,F){if(M("conditionalBatch conditions",_.length),M("conditionalBatch operations",F.length),H(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 WE(E){return decodeURIComponent(E)}function YE(E){try{return decodeURIComponent(E)}catch{return null}}var G=(E)=>String(E).padStart(16,"0"),I="0",w="1",A=(E,_,F,Y)=>`sig:${W(E)}:${W(_)}:${Y}:${W(F)}`,XE={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}:${G(_)}:${F}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(E)=>`op:dead-letter:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,F)=>`audit:bulk:${G(E)}:${W(_)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${G(E)}:${W(_)}`,asyncActivity:(E,_)=>`async-act:v1:${W(E)}:${W(_)}`,asyncActivityResolution:(E,_)=>`async-act:v1:${W(E)}:${W(_)}:resolution`,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`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(E)=>`fleet-event:${String(E).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(E)=>`fleet-event-by-workflow:${W(E)}:`,fleetEventByWorkflow:(E,_)=>`fleet-event-by-workflow:${W(E)}:${String(_).padStart(10,"0")}`,signal:(E,_,F)=>A(E,_,F,w),startSignal:(E,_,F)=>A(E,_,F,I),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:${G(E)}:${W(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${G(E)}:${W(_)}`,teardownTimer:(E,_)=>`wf-teardown:${G(E)}:${W(_)}`,delayedStart:(E,_)=>`wf-delayed:${G(E)}:${W(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${G(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)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(E,_,F)=>`budget:${E}:${_}:${F}`,review:(E,_)=>`review:${W(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${W(E)}`,childCancellationPrefix:(E)=>`child-cancel:${W(E)}:`,childCancellation:(E,_)=>`child-cancel:${W(E)}:${W(_)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${W(E)}`,workflowConcurrency:(E,_)=>`wf-concurrency:${W(E)}:${W(_)}`,workflowConcurrencyHolder:(E)=>`wf-concurrency-holder:${W(E)}`,workflowHasServices:(E)=>`wf-has-services:${W(E)}`,finalizerState:(E)=>`wf-finalizer-state:${W(E)}`,teardownOwed:(E)=>`wf-teardown-needed:${W(E)}`,teardownDeadLetter:(E)=>`wf-teardown-deadletter:${W(E)}`,offload:(E,_)=>`offload:${W(E)}:${_}`,archive:(E,_)=>`archive:${W(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${W(E)}:${W(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${V}:${W(E)}:${W(_)}`,streamChunkPrefix:(E,_)=>`blob:${W(E)}:${_}:chunk:`,streamChunk:(E,_,F)=>`blob:${W(E)}:${_}:chunk:${String(F).padStart(10,"0")}`,streamTail:(E,_)=>`blob:${W(E)}:${_}:tail`,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:${G(E)}:${W(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${G(E)}:${W(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${G(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 k(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 T(E){let _={},F=!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,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=k(E.limit);if(Y!==void 0)_.limit=Y;return _}async function m(E,_,F){let Y=T(F);if(E.deleteRange)return E.deleteRange(_,Y);return C(E,_,Y)}function N(E){return E.replaceAll(/:+$/g,"")}function l(E,_){let F=N(E),Y=N(_);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}class R{#E;#W;constructor(E,_){this.#E=E,this.#W=N(_)}#_(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 R(this.#E,l(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){M("batch operations",E.length),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 b(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 h(this.#E,this.#_(E))}async deletePrefix(E){return O(this.#E,this.#_(E))}async deleteRange(E,_){let F=this.#X(T(_));return m(this.#E,this.#_(E),F)}async*keys(E,_){for await(let F of v(this.#E,this.#_(E),this.#Y(_)))yield this.#F(F)}async count(E){return P(this.#E,this.#_(E))}[Symbol.dispose](){this.#E[Symbol.dispose]()}}function c(E,_){return new R(E,_)}import*as u from"lmdb";class f{#E;#W=!1;#_=null;constructor(E){this.#E=u.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=T(_),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=j(E),U=Y?this.#E.getRange({start:X,end:E,reverse:!0}):this.#E.getRange({start:E,end:X}),Q=0,J=!1;for(let{key:Z,value:x}of U){if(!Z.startsWith(E)){if(Y&&!J)continue;break}if(J=!0,!D(Z,_))continue;if(F!==void 0&&Q>=F)break;yield[Z,new Uint8Array(x)],Q++}}async*keys(E,_={}){this.#F();let{limit:F,reverse:Y}=_,X=j(E),U=Y?this.#E.getKeys({start:X,end:E,reverse:!0}):this.#E.getKeys({start:E,end:X}),Q=0,J=!1;for(let Z of U){if(!Z.startsWith(E)){if(Y&&!J)continue;break}if(J=!0,!D(Z,_))continue;if(F!==void 0&&Q>=F)break;yield Z,Q++}}async count(E){this.#F();let _=j(E);return this.#E.getKeysCount({start:E,end:_})}scoped(E){return this.#F(),c(this,E)}async batch(E){if(this.#F(),M("batch operations",E.length),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(),M("conditionalBatch conditions",E.length),M("conditionalBatch operations",_.length),this.#E.transactionSync(()=>{for(let Y of E){let X=this.#E.get(Y.key),U=X===void 0?null:new Uint8Array(X);if(!K(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.#W=!0,this.#_??=(async()=>{await Promise.resolve(),await this.#E.close()})(),this.#_}[Symbol.dispose](){this.close()}}export{f as LMDBStorage};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var f=Object.defineProperty;var l=(_)=>_;function d(_,E){this[_]=l.bind(null,E)}var a=(_,E)=>{for(var F in E)f(_,F,{get:E[F],enumerable:!0,configurable:!0,set:d.bind(E,F)})};var $=(_,E)=>()=>(_&&(E=_(_=0)),E);var __=import.meta.require,E_=(_,E,F)=>{if(E!=null){if(typeof E!=="object"&&typeof E!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let Y;if(F)Y=E[Symbol.asyncDispose];if(Y===void 0)Y=E[Symbol.dispose];if(typeof Y!=="function")throw TypeError("Object not disposable");_.push([F,Y,E])}else if(F)_.push([F]);return E},F_=(_,E,F)=>{let Y=(X)=>E=F?new SuppressedError(X,E,"An error was suppressed during disposal"):(F=!0,X),U=(X)=>{while(X=_.pop())try{var J=X[1]&&X[1].call(X[2]);if(X[0])return Promise.resolve(J).then(U,(G)=>(Y(G),U()))}catch(G){Y(G)}if(F)throw E};return U()};function L(_,E,F){if(!_.capabilities()[E])throw Error(`Feature "${F}" requires storage capability "${E}", but this storage backend does not provide it.`)}function p(_){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 D="default";async function S(_,E){return await _.get(E)!==null}async function*V(_,E,F){for await(let[Y]of _.scan(E,F))yield Y}async function z(_,E){let F=0;for await(let Y of V(_,E))F++;return F}async function P(_,E){let F=[];for await(let Y of V(_,E))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await _.batch(F),F.length}async function v(_,E,F){let Y=[];for await(let U of V(_,E,F))Y.push({type:"delete",key:U});if(Y.length===0)return 0;return await _.batch(Y),Y.length}var s;var h=$(()=>{s=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","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-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-terminal:"]});function Q(_,E){if(E>N)throw new K(_,E)}function Z(_){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 b(_,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 m(_,E){if(_.has)return _.has(E);return S(_,E)}function c(_,E,F){if(_.keys)return _.keys(E,F);return V(_,E,F)}async function u(_,E){if(_.count)return _.count(E);return z(_,E)}async function x(_,E){if(_.deletePrefix)return _.deletePrefix(E);return P(_,E)}async function $_(_,E){Q("batch operations",E.length),await _.batch(E)}async function g(_,E,F){if(Q("conditionalBatch conditions",E.length),Q("conditionalBatch operations",F.length),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 T_(_){return decodeURIComponent(_)}function V_(_){try{return decodeURIComponent(_)}catch{return null}}var N=1e4,Z_=1e4,K,M=(_)=>String(_).padStart(16,"0"),n="0",r="1",O=(_,E,F,Y)=>`sig:${W(_)}:${W(E)}:${Y}:${W(F)}`,j_;var q=$(()=>{h();K=class K extends Error{code="StorageBatchOperationLimitExceededError";cap=N;count;target;constructor(_,E){super(`${_} count ${E} exceeds MAX_BATCH_OPERATIONS (${N}).`);this.name="StorageBatchOperationLimitExceededError",this.target=_,this.count=E}};j_={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:${_}:${M(E)}:${F}`,operationInflight:(_)=>`op:inflight:${_}`,operationQueued:(_)=>`op:queued:${_}`,operationResolved:(_)=>`op:resolved:${_}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(_)=>`op:dead-letter:${_}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(_,E,F)=>`audit:bulk:${M(_)}:${W(E)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(_,E)=>`op:resolved-by-time:${M(_)}:${W(E)}`,asyncActivity:(_,E)=>`async-act:v1:${W(_)}:${W(E)}`,asyncActivityResolution:(_,E)=>`async-act:v1:${W(_)}:${W(E)}:resolution`,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`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(_)=>`fleet-event:${String(_).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(_)=>`fleet-event-by-workflow:${W(_)}:`,fleetEventByWorkflow:(_,E)=>`fleet-event-by-workflow:${W(_)}:${String(E).padStart(10,"0")}`,signal:(_,E,F)=>O(_,E,F,r),startSignal:(_,E,F)=>O(_,E,F,n),signalSequence:(_)=>`sigseq:v1:${W(_)}`,signalAcceptedResponsePrefix:(_)=>`sigres:v1:${W(_)}:`,signalAcceptedResponse:(_,E,F)=>`sigres:v1:${W(_)}:${W(E)}:${W(F)}`,deadline:(_,E)=>`wf-deadline:${M(_)}:${W(E)}`,terminalCleanup:(_,E)=>`wf-cleanup:${M(_)}:${W(E)}`,teardownTimer:(_,E)=>`wf-teardown:${M(_)}:${W(E)}`,delayedStart:(_,E)=>`wf-delayed:${M(_)}:${W(E)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(_,E)=>`wf-terminal:${M(_)}:${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(_)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(_,E,F)=>`budget:${_}:${E}:${F}`,review:(_,E)=>`review:${W(_)}:${E}`,workflowHeaders:(_)=>`wf-headers:${W(_)}`,childCancellationPrefix:(_)=>`child-cancel:${W(_)}:`,childCancellation:(_,E)=>`child-cancel:${W(_)}:${W(E)}`,terminalCleanupNeeded:(_)=>`wf-cleanup-needed:${W(_)}`,workflowConcurrency:(_,E)=>`wf-concurrency:${W(_)}:${W(E)}`,workflowConcurrencyHolder:(_)=>`wf-concurrency-holder:${W(_)}`,workflowHasServices:(_)=>`wf-has-services:${W(_)}`,finalizerState:(_)=>`wf-finalizer-state:${W(_)}`,teardownOwed:(_)=>`wf-teardown-needed:${W(_)}`,teardownDeadLetter:(_)=>`wf-teardown-deadletter:${W(_)}`,offload:(_,E)=>`offload:${W(_)}:${E}`,archive:(_,E)=>`archive:${W(_)}:${E}`,stateExecution:(_,E)=>`state:execution:${W(_)}:${W(E)}`,stateWorkflow:(_,E)=>`state:workflow-scope:${D}:${W(_)}:${W(E)}`,streamChunkPrefix:(_,E)=>`blob:${W(_)}:${E}:chunk:`,streamChunk:(_,E,F)=>`blob:${W(_)}:${E}:chunk:${String(F).padStart(10,"0")}`,streamTail:(_,E)=>`blob:${W(_)}:${E}:tail`,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:${M(_)}:${W(E)}`,workflowVisibilityUpdated:(_,E)=>`wf-idx-updated:${M(_)}:${W(E)}`,workflowVisibilityDeadline:(_,E)=>`wf-idx-deadline:${M(_)}:${W(E)}`,workflowVisibilityManifest:(_)=>`wf-idx-manifest:${W(_)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function t(_){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 j(_){let E={},F=!1;for(let U of["gt","gte","lt","lte"]){let X=_[U];if(X===void 0)continue;if(typeof X!=="string")throw Error("deleteRange bounds must be strings");E[U]=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=t(_.limit);if(Y!==void 0)E.limit=Y;return E}async function I(_,E,F){let Y=j(F);if(_.deleteRange)return _.deleteRange(E,Y);return v(_,E,Y)}var C=()=>{};function R(_){return _.replaceAll(/:+$/g,"")}function i(_,E){let F=R(_),Y=R(E);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}function y(_,E){return new B(_,E)}var B;var w=$(()=>{C();q();B=class B{#_;#F;constructor(_,E){this.#_=_,this.#F=R(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 B(this.#_,i(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(_){Q("batch operations",_.length),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 g(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 m(this.#_,this.#E(_))}async deletePrefix(_){return x(this.#_,this.#E(_))}async deleteRange(_,E){let F=this.#X(j(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 e={};a(e,{MemoryStorage:()=>k});var k;var o=$(()=>{C();q();w();k=class k{#_;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,U=Z(_),X=this.#E(_,U);if(X=X.filter((G)=>H(G,E)),Y)X.reverse();let J=0;for(let G of X){if(F!==void 0&&J>=F)break;let A=this.#_.get(G);if(A!==void 0)yield[G,A],J++}}async batch(_){Q("batch operations",_.length),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){Q("conditionalBatch conditions",_.length),Q("conditionalBatch operations",E.length);for(let F of _){let Y=this.#_.get(F.key)??null;if(!b(Y,F.expectedValue))return!1}return this.#W(E),!0}async has(_){return this.#_.has(_)}async deletePrefix(_){let E=Z(_),F=this.#E(_,E);for(let Y of F)this.#_.delete(Y);return F.length}async deleteRange(_,E){let F=j(E),Y=Z(_),U=this.#E(_,Y).filter((J)=>H(J,F)),X=F.limit===void 0?U:U.slice(0,F.limit);for(let J of X)this.#_.delete(J);return X.length}async*keys(_,E={}){let{limit:F,reverse:Y}=E,U=Z(_),X=this.#E(_,U);if(X=X.filter((G)=>H(G,E)),Y)X.reverse();let J=0;for(let G of X){if(F!==void 0&&J>=F)break;yield G,J++}}async count(_){let E=Z(_);return this.#E(_,E).length}scoped(_){return y(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()}}});o();export{k as MemoryStorage};
2
+ var f=import.meta.require,l=(_,E,F)=>{if(E!=null){if(typeof E!=="object"&&typeof E!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let Y;if(F)Y=E[Symbol.asyncDispose];if(Y===void 0)Y=E[Symbol.dispose];if(typeof Y!=="function")throw TypeError("Object not disposable");_.push([F,Y,E])}else if(F)_.push([F]);return E},d=(_,E,F)=>{let Y=(X)=>E=F?new SuppressedError(X,E,"An error was suppressed during disposal"):(F=!0,X),U=(X)=>{while(X=_.pop())try{var J=X[1]&&X[1].call(X[2]);if(X[0])return Promise.resolve(J).then(U,(G)=>(Y(G),U()))}catch(G){Y(G)}if(F)throw E};return U()};function j(_,E,F){if(!_.capabilities()[E])throw Error(`Feature "${F}" requires storage capability "${E}", but this storage backend does not provide it.`)}function u(_){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 H="default";async function C(_,E){return await _.get(E)!==null}async function*$(_,E,F){for await(let[Y]of _.scan(E,F))yield Y}async function R(_,E){let F=0;for await(let Y of $(_,E))F++;return F}async function B(_,E){let F=[];for await(let Y of $(_,E))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await _.batch(F),F.length}async function A(_,E,F){let Y=[];for await(let U of $(_,E,F))Y.push({type:"delete",key:U});if(Y.length===0)return 0;return await _.batch(Y),Y.length}var x=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","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-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-terminal:"];var L=1e4,o=1e4;class z extends Error{code="StorageBatchOperationLimitExceededError";cap=L;count;target;constructor(_,E){super(`${_} count ${E} exceeds MAX_BATCH_OPERATIONS (${L}).`);this.name="StorageBatchOperationLimitExceededError",this.target=_,this.count=E}}function Q(_,E){if(E>L)throw new z(_,E)}function Z(_){return _.length>0?_.slice(0,-1)+String.fromCharCode(_.charCodeAt(_.length-1)+1):"\xFF"}function V(_,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 P(_,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 v(_,E){if(_.has)return _.has(E);return C(_,E)}function h(_,E,F){if(_.keys)return _.keys(E,F);return $(_,E,F)}async function O(_,E){if(_.count)return _.count(E);return R(_,E)}async function K(_,E){if(_.deletePrefix)return _.deletePrefix(E);return B(_,E)}async function __(_,E){Q("batch operations",E.length),await _.batch(E)}async function b(_,E,F){if(Q("conditionalBatch conditions",E.length),Q("conditionalBatch operations",F.length),j(_,"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 E_(_){return decodeURIComponent(_)}function F_(_){try{return decodeURIComponent(_)}catch{return null}}var M=(_)=>String(_).padStart(16,"0"),g="0",I="1",S=(_,E,F,Y)=>`sig:${W(_)}:${W(E)}:${Y}:${W(F)}`,W_={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:${_}:${M(E)}:${F}`,operationInflight:(_)=>`op:inflight:${_}`,operationQueued:(_)=>`op:queued:${_}`,operationResolved:(_)=>`op:resolved:${_}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(_)=>`op:dead-letter:${_}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(_,E,F)=>`audit:bulk:${M(_)}:${W(E)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(_,E)=>`op:resolved-by-time:${M(_)}:${W(E)}`,asyncActivity:(_,E)=>`async-act:v1:${W(_)}:${W(E)}`,asyncActivityResolution:(_,E)=>`async-act:v1:${W(_)}:${W(E)}:resolution`,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`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(_)=>`fleet-event:${String(_).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(_)=>`fleet-event-by-workflow:${W(_)}:`,fleetEventByWorkflow:(_,E)=>`fleet-event-by-workflow:${W(_)}:${String(E).padStart(10,"0")}`,signal:(_,E,F)=>S(_,E,F,I),startSignal:(_,E,F)=>S(_,E,F,g),signalSequence:(_)=>`sigseq:v1:${W(_)}`,signalAcceptedResponsePrefix:(_)=>`sigres:v1:${W(_)}:`,signalAcceptedResponse:(_,E,F)=>`sigres:v1:${W(_)}:${W(E)}:${W(F)}`,deadline:(_,E)=>`wf-deadline:${M(_)}:${W(E)}`,terminalCleanup:(_,E)=>`wf-cleanup:${M(_)}:${W(E)}`,teardownTimer:(_,E)=>`wf-teardown:${M(_)}:${W(E)}`,delayedStart:(_,E)=>`wf-delayed:${M(_)}:${W(E)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(_,E)=>`wf-terminal:${M(_)}:${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(_)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(_,E,F)=>`budget:${_}:${E}:${F}`,review:(_,E)=>`review:${W(_)}:${E}`,workflowHeaders:(_)=>`wf-headers:${W(_)}`,childCancellationPrefix:(_)=>`child-cancel:${W(_)}:`,childCancellation:(_,E)=>`child-cancel:${W(_)}:${W(E)}`,terminalCleanupNeeded:(_)=>`wf-cleanup-needed:${W(_)}`,workflowConcurrency:(_,E)=>`wf-concurrency:${W(_)}:${W(E)}`,workflowConcurrencyHolder:(_)=>`wf-concurrency-holder:${W(_)}`,workflowHasServices:(_)=>`wf-has-services:${W(_)}`,finalizerState:(_)=>`wf-finalizer-state:${W(_)}`,teardownOwed:(_)=>`wf-teardown-needed:${W(_)}`,teardownDeadLetter:(_)=>`wf-teardown-deadletter:${W(_)}`,offload:(_,E)=>`offload:${W(_)}:${E}`,archive:(_,E)=>`archive:${W(_)}:${E}`,stateExecution:(_,E)=>`state:execution:${W(_)}:${W(E)}`,stateWorkflow:(_,E)=>`state:workflow-scope:${H}:${W(_)}:${W(E)}`,streamChunkPrefix:(_,E)=>`blob:${W(_)}:${E}:chunk:`,streamChunk:(_,E,F)=>`blob:${W(_)}:${E}:chunk:${String(F).padStart(10,"0")}`,streamTail:(_,E)=>`blob:${W(_)}:${E}:tail`,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:${M(_)}:${W(E)}`,workflowVisibilityUpdated:(_,E)=>`wf-idx-updated:${M(_)}:${W(E)}`,workflowVisibilityDeadline:(_,E)=>`wf-idx-deadline:${M(_)}:${W(E)}`,workflowVisibilityManifest:(_)=>`wf-idx-manifest:${W(_)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function y(_){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 T(_){let E={},F=!1;for(let U of["gt","gte","lt","lte"]){let X=_[U];if(X===void 0)continue;if(typeof X!=="string")throw Error("deleteRange bounds must be strings");E[U]=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=y(_.limit);if(Y!==void 0)E.limit=Y;return E}async function m(_,E,F){let Y=T(F);if(_.deleteRange)return _.deleteRange(E,Y);return A(_,E,Y)}function D(_){return _.replaceAll(/:+$/g,"")}function w(_,E){let F=D(_),Y=D(E);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}class N{#_;#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 N(this.#_,w(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(_){Q("batch operations",_.length),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 b(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 v(this.#_,this.#E(_))}async deletePrefix(_){return K(this.#_,this.#E(_))}async deleteRange(_,E){let F=this.#X(T(E));return m(this.#_,this.#E(_),F)}async*keys(_,E){for await(let F of h(this.#_,this.#E(_),this.#Y(E)))yield this.#W(F)}async count(_){return O(this.#_,this.#E(_))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}function c(_,E){return new N(_,E)}class k{#_;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,U=Z(_),X=this.#E(_,U);if(X=X.filter((G)=>V(G,E)),Y)X.reverse();let J=0;for(let G of X){if(F!==void 0&&J>=F)break;let q=this.#_.get(G);if(q!==void 0)yield[G,q],J++}}async batch(_){Q("batch operations",_.length),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){Q("conditionalBatch conditions",_.length),Q("conditionalBatch operations",E.length);for(let F of _){let Y=this.#_.get(F.key)??null;if(!P(Y,F.expectedValue))return!1}return this.#W(E),!0}async has(_){return this.#_.has(_)}async deletePrefix(_){let E=Z(_),F=this.#E(_,E);for(let Y of F)this.#_.delete(Y);return F.length}async deleteRange(_,E){let F=T(E),Y=Z(_),U=this.#E(_,Y).filter((J)=>V(J,F)),X=F.limit===void 0?U:U.slice(0,F.limit);for(let J of X)this.#_.delete(J);return X.length}async*keys(_,E={}){let{limit:F,reverse:Y}=E,U=Z(_),X=this.#E(_,U);if(X=X.filter((G)=>V(G,E)),Y)X.reverse();let J=0;for(let G of X){if(F!==void 0&&J>=F)break;yield G,J++}}async count(_){let E=Z(_);return this.#E(_,E).length}scoped(_){return c(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()}}export{k as MemoryStorage};
@@ -1,13 +1,13 @@
1
1
  import { type ConditionalBatchCondition } from './interface.ts';
2
2
  import { type BatchNetEffect } from './neon-value-mapping.ts';
3
- import type { NeonPoolClient } from './neon.ts';
4
3
  import type { PostgresKeyValueQueries } from './postgres-key-value-queries.ts';
4
+ import type { PostgresPoolClient } from './postgres-key-value-storage.ts';
5
5
  /**
6
- * The collapsed transaction-phase helpers for {@link NeonStorage}'s `batch()` and
7
- * `conditionalBatch()`. Each phase runs as ONE statement regardless of operation
8
- * count, so a checkpoint commit no longer pays one WebSocket round trip per key.
9
- * Split out of `neon.ts` to keep that module under the size ceiling; all run on a
10
- * caller-supplied pinned-transaction `client`.
6
+ * The collapsed transaction-phase helpers for the Postgres storage adapters'
7
+ * `batch()` and `conditionalBatch()`. Each phase runs as ONE statement regardless
8
+ * of operation count, so a checkpoint commit no longer pays one round trip per
9
+ * key. Split out of the storage class to keep that module under the size ceiling;
10
+ * all run on a caller-supplied pinned-transaction `client`.
11
11
  *
12
12
  * @module storage/neon-batch
13
13
  */
@@ -19,7 +19,7 @@ import type { PostgresKeyValueQueries } from './postgres-key-value-queries.ts';
19
19
  * when every condition holds. With no conditions, holds vacuously and issues no
20
20
  * query.
21
21
  */
22
- export declare function conditionsHold(client: NeonPoolClient, queries: PostgresKeyValueQueries, conditions: ConditionalBatchCondition[]): Promise<boolean>;
22
+ export declare function conditionsHold(client: PostgresPoolClient, queries: PostgresKeyValueQueries, conditions: ConditionalBatchCondition[]): Promise<boolean>;
23
23
  /**
24
24
  * Write a resolved batch net effect with at most one upsert and one delete
25
25
  * statement — the put-set as a single `unnest`-driven multi-row upsert, the
@@ -27,4 +27,4 @@ export declare function conditionsHold(client: NeonPoolClient, queries: Postgres
27
27
  * (see {@link resolveBatchNetEffect}), so the statements commute; each is
28
28
  * skipped when its set is empty.
29
29
  */
30
- export declare function writeBatchNetEffect(client: NeonPoolClient, queries: PostgresKeyValueQueries, netEffect: BatchNetEffect): Promise<void>;
30
+ export declare function writeBatchNetEffect(client: PostgresPoolClient, queries: PostgresKeyValueQueries, netEffect: BatchNetEffect): Promise<void>;
@@ -1,32 +1,20 @@
1
- import { type DeleteRangeOptions } from './delete-range.ts';
2
- import { type BatchOperation, type ConditionalBatchCondition, type ScanOptions, type Storage, type StorageCapabilities } from './interface.ts';
3
- import { type NeonQueryResult } from './neon-value-mapping.ts';
1
+ import { PostgresKeyValueStorage, type PostgresKeyValueStorageOptions, type PostgresPool, type PostgresPoolClient } from './postgres-key-value-storage.ts';
4
2
  /**
5
- * A connection that can run a single interactive transaction. Obtained from
6
- * {@link NeonPool.connect}; `release()` returns it to the pool. Both
7
- * `batch()` and `conditionalBatch()` drive `BEGIN`/`COMMIT`/`ROLLBACK` over one
8
- * of these so every statement in a transaction lands on the same connection —
9
- * `pool.query()` alone may scatter statements across pooled connections, which
10
- * would make a multi-statement batch non-atomic.
3
+ * A connection that can run a single interactive transaction, obtained from
4
+ * {@link NeonPool.connect}. Alias of the driver-agnostic
5
+ * {@link PostgresPoolClient}; kept for backward-compatible imports.
11
6
  */
12
- export type NeonPoolClient = {
13
- query(sql: string, parameters?: unknown[]): Promise<NeonQueryResult>;
14
- release(): void;
15
- };
7
+ export type NeonPoolClient = PostgresPoolClient;
16
8
  /**
17
- * Minimal structural view of a node-postgres `Pool`. The real Neon serverless
18
- * `Pool` satisfies this; the PGlite test backend is wrapped to satisfy it too.
19
- * `query()` runs a single statement on a pooled connection (used for the
20
- * single-statement hot paths); `connect()` pins a connection for an interactive
21
- * transaction; `end()` tears the pool down.
9
+ * Minimal structural view of a node-postgres `Pool`. The Neon serverless `Pool`
10
+ * satisfies this; the PGlite test backend is wrapped to satisfy it too. Alias of
11
+ * the driver-agnostic {@link PostgresPool}; kept for backward-compatible imports.
22
12
  */
23
- export type NeonPool = {
24
- query(sql: string, parameters?: unknown[]): Promise<NeonQueryResult>;
25
- connect(): Promise<NeonPoolClient>;
26
- end(): Promise<void>;
27
- };
13
+ export type NeonPool = PostgresPool;
28
14
  /**
29
- * Configuration for connecting to a Neon (or any Postgres) database.
15
+ * Configuration for connecting to a Neon (or any Postgres) database. Alias of the
16
+ * shared {@link PostgresKeyValueStorageOptions}; `url` is optional and required
17
+ * only when no `pool` is supplied.
30
18
  *
31
19
  * @example
32
20
  * ```ts
@@ -38,41 +26,16 @@ export type NeonPool = {
38
26
  * await using storage = new NeonStorage(options);
39
27
  * ```
40
28
  */
41
- export type NeonStorageOptions = {
42
- /** Postgres connection string for the primary endpoint. */
43
- url: string;
44
- /**
45
- * Optional pre-built pool. Pass this to reuse a pool you manage (for example a
46
- * test backend such as PGlite, or a shared application pool), instead of having
47
- * the adapter construct its own from `url`. When supplied, `url` is ignored and
48
- * **ownership stays with the caller**: disposing the `NeonStorage` does NOT
49
- * close an injected pool, so it can be shared across adapters and the caller
50
- * remains responsible for ending it. A pool the adapter constructs itself (from
51
- * `url`) IS closed on disposal.
52
- */
53
- pool?: NeonPool;
54
- /**
55
- * Postgres schema to contain the kv table. Default: unqualified — the table
56
- * resolves through `search_path` (in practice `public`). When set, the adapter
57
- * creates the schema if absent (`CREATE SCHEMA IF NOT EXISTS`) and qualifies
58
- * every statement as `"schema"."table"`. Lets Weft live in its own schema
59
- * alongside the application's tables in one database — one PITR line, no Drizzle
60
- * drift/drop risk. Validated as a strict Postgres identifier at construction.
61
- */
62
- schema?: string;
63
- /**
64
- * Table name. Default: `'kv'`. Validated as a strict Postgres identifier at
65
- * construction. With neither `schema` nor `table` set, the adapter emits
66
- * byte-identical SQL against the unqualified `kv` table (existing deployments
67
- * are unaffected).
68
- */
69
- table?: string;
70
- };
29
+ export type NeonStorageOptions = PostgresKeyValueStorageOptions;
71
30
  /**
72
31
  * Storage adapter backed by Neon serverless Postgres for durable, remote
73
- * deployments. Implements the same `Storage` interface as the SQLite adapters
74
- * over a single `kv(key TEXT COLLATE "C", value BYTEA)` table, so switching from
75
- * a local SQLite store to Neon is a configuration change, not a code change.
32
+ * deployments. A thin {@link PostgresKeyValueStorage} subclass whose only job is
33
+ * to supply the Neon serverless default pool factory; all storage behavior (SQL,
34
+ * value mapping, transactions/retry, schema/table qualification) lives in the
35
+ * driver-agnostic base. Implements the same `Storage` interface as the SQLite
36
+ * adapters over a single `kv(key TEXT COLLATE "C", value BYTEA)` table, so
37
+ * switching from a local SQLite store to Neon is a configuration change, not a
38
+ * code change.
76
39
  *
77
40
  * **Endpoint assumption.** `capabilities()` reports `readAfterWrite:
78
41
  * 'linearizable'`, which holds for the **primary** Neon endpoint. A read-replica
@@ -95,30 +58,14 @@ export type NeonStorageOptions = {
95
58
  * await using engine = new Engine({ storage });
96
59
  * ```
97
60
  */
98
- export declare class NeonStorage implements Storage {
99
- #private;
61
+ export declare class NeonStorage extends PostgresKeyValueStorage {
100
62
  /**
101
63
  * @param options Connection configuration ({@link NeonStorageOptions}).
102
64
  * @param poolFactory Internal seam for constructing the owned pool from `url`.
103
- * Defaults to the real driver `Pool`; tests inject a fake (for example one
104
- * whose `end()` rejects) to exercise owned-pool teardown without a network.
105
- * Used only when no `pool` is supplied; an injected `pool` stays caller-owned.
65
+ * Defaults to lazily importing the real Neon driver `Pool`; tests inject a
66
+ * fake (for example one whose `end()` rejects) to exercise owned-pool teardown
67
+ * without a network. Used only when no `pool` is supplied; an injected `pool`
68
+ * stays caller-owned.
106
69
  */
107
- constructor(options: NeonStorageOptions, poolFactory?: (url: string) => NeonPool);
108
- capabilities(): StorageCapabilities;
109
- get(key: string): Promise<Uint8Array | null>;
110
- put(key: string, value: Uint8Array): Promise<void>;
111
- delete(key: string): Promise<void>;
112
- has(key: string): Promise<boolean>;
113
- deletePrefix(prefix: string): Promise<number>;
114
- deleteRange(prefix: string, options: DeleteRangeOptions): Promise<number>;
115
- scan(prefix: string, options?: ScanOptions): AsyncIterable<[string, Uint8Array]>;
116
- keys(prefix: string, options?: ScanOptions): AsyncIterable<string>;
117
- count(prefix: string): Promise<number>;
118
- scoped(prefix: string): Storage;
119
- batch(operations: BatchOperation[]): Promise<void>;
120
- conditionalBatch(conditions: ConditionalBatchCondition[], operations: BatchOperation[]): Promise<boolean>;
121
- query<T>(sql: string, parameters?: unknown[]): Promise<T[]>;
122
- [Symbol.dispose](): void;
123
- [Symbol.asyncDispose](): Promise<void>;
70
+ constructor(options: NeonStorageOptions, poolFactory?: (url: string) => PostgresPool);
124
71
  }
@@ -1,15 +1,15 @@
1
1
  // @bun
2
- var U_=Object.defineProperty;var Z_=(_)=>_;function G_(_,E){this[_]=Z_.bind(null,E)}var z_=(_,E)=>{for(var F in E)U_(_,F,{get:E[F],enumerable:!0,configurable:!0,set:G_.bind(E,F)})};var M=(_,E)=>()=>(_&&(E=_(_=0)),E);var v_=import.meta.require,P_=(_,E,F)=>{if(E!=null){if(typeof E!=="object"&&typeof E!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let W;if(F)W=E[Symbol.asyncDispose];if(W===void 0)W=E[Symbol.dispose];if(typeof W!=="function")throw TypeError("Object not disposable");_.push([F,W,E])}else if(F)_.push([F]);return E},R_=(_,E,F)=>{let W=(Y)=>E=F?new SuppressedError(Y,E,"An error was suppressed during disposal"):(F=!0,Y),J=(Y)=>{while(Y=_.pop())try{var Q=Y[1]&&Y[1].call(Y[2]);if(Y[0])return Promise.resolve(Q).then(J,(U)=>(W(U),J()))}catch(U){W(U)}if(F)throw E};return J()};function N(_,E,F){if(!_.capabilities()[E])throw Error(`Feature "${F}" requires storage capability "${E}", but this storage backend does not provide it.`)}function M_(_){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 C="default";async function q(_,E){return await _.get(E)!==null}async function*H(_,E,F){for await(let[W]of _.scan(E,F))yield W}async function h(_,E){let F=0;for await(let W of H(_,E))F++;return F}async function b(_,E){let F=[];for await(let W of H(_,E))F.push({type:"delete",key:W});if(F.length===0)return 0;return await _.batch(F),F.length}async function x(_,E,F){let W=[];for await(let J of H(_,E,F))W.push({type:"delete",key:J});if(W.length===0)return 0;return await _.batch(W),W.length}var $_;var y=M(()=>{$_=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","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-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-terminal:"]});function G(_,E){if(E>A)throw new I(_,E)}function g(_){return _.length>0?_.slice(0,-1)+String.fromCharCode(_.charCodeAt(_.length-1)+1):"\xFF"}function c_(_,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 u(_,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 c(_,E){if(_.has)return _.has(E);return q(_,E)}function k(_,E,F){if(_.keys)return _.keys(E,F);return H(_,E,F)}async function w(_,E){if(_.count)return _.count(E);return h(_,E)}async function f(_,E){if(_.deletePrefix)return _.deletePrefix(E);return b(_,E)}async function k_(_,E){G("batch operations",E.length),await _.batch(E)}async function d(_,E,F){if(G("conditionalBatch conditions",E.length),G("conditionalBatch operations",F.length),N(_,"conditionalBatch","storageConditionalBatch"),!_.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return _.conditionalBatch(E,F)}function X(_){return encodeURIComponent(_)}function w_(_){return decodeURIComponent(_)}function f_(_){try{return decodeURIComponent(_)}catch{return null}}var A=1e4,u_=1e4,I,Z=(_)=>String(_).padStart(16,"0"),H_="0",V_="1",m=(_,E,F,W)=>`sig:${X(_)}:${X(E)}:${W}:${X(F)}`,d_;var V=M(()=>{y();I=class I extends Error{code="StorageBatchOperationLimitExceededError";cap=A;count;target;constructor(_,E){super(`${_} count ${E} exceeds MAX_BATCH_OPERATIONS (${A}).`);this.name="StorageBatchOperationLimitExceededError",this.target=_,this.count=E}};d_={workflow:(_)=>`wf:${X(_)}`,checkpoint:(_)=>`wf:${X(_)}:ckpt`,checkpointHistory:(_,E)=>`wf:${X(_)}:ckpt:${String(E).padStart(10,"0")}`,timelinePrefix:(_)=>`wf:${X(_)}:timeline:`,timeline:(_,E)=>`wf:${X(_)}:timeline:${String(E).padStart(10,"0")}`,schedule:(_)=>`schedule:${X(_)}`,scheduleTick:(_,E)=>`schedule-due:${String(_).padStart(16,"0")}:${X(E)}`,scheduleRun:(_)=>`schedule-run:${X(_)}`,operation:(_,E,F)=>`op:${_}:${Z(E)}:${F}`,operationInflight:(_)=>`op:inflight:${_}`,operationQueued:(_)=>`op:queued:${_}`,operationResolved:(_)=>`op:resolved:${_}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(_)=>`op:dead-letter:${_}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(_,E,F)=>`audit:bulk:${Z(_)}:${X(E)}:${X(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(_,E)=>`op:resolved-by-time:${Z(_)}:${X(E)}`,asyncActivity:(_,E)=>`async-act:v1:${X(_)}:${X(E)}`,asyncActivityResolution:(_,E)=>`async-act:v1:${X(_)}:${X(E)}:resolution`,activityReconciliationPrefix:(_)=>`actrec:v1:${X(_)}:`,activityReconciliation:(_,E,F)=>`actrec:v1:${X(_)}:${X(E)}:${F}`,eventPrefix:(_)=>`ev:${X(_)}:`,event:(_,E)=>`ev:${X(_)}:${String(E).padStart(10,"0")}`,eventHead:(_)=>`ev:${X(_)}:head`,eventWatermark:(_)=>`ev:${X(_)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(_)=>`fleet-event:${String(_).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(_)=>`fleet-event-by-workflow:${X(_)}:`,fleetEventByWorkflow:(_,E)=>`fleet-event-by-workflow:${X(_)}:${String(E).padStart(10,"0")}`,signal:(_,E,F)=>m(_,E,F,V_),startSignal:(_,E,F)=>m(_,E,F,H_),signalSequence:(_)=>`sigseq:v1:${X(_)}`,signalAcceptedResponsePrefix:(_)=>`sigres:v1:${X(_)}:`,signalAcceptedResponse:(_,E,F)=>`sigres:v1:${X(_)}:${X(E)}:${X(F)}`,deadline:(_,E)=>`wf-deadline:${Z(_)}:${X(E)}`,terminalCleanup:(_,E)=>`wf-cleanup:${Z(_)}:${X(E)}`,teardownTimer:(_,E)=>`wf-teardown:${Z(_)}:${X(E)}`,delayedStart:(_,E)=>`wf-delayed:${Z(_)}:${X(E)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(_,E)=>`wf-terminal:${Z(_)}:${X(E)}`,attribute:(_)=>`attr:${X(_)}`,attributeIndex:(_,E,F)=>`idx:${_}:${E}:${X(F)}`,tagIndex:(_,E)=>`tag:${X(_)}:${X(E)}`,updatePrefix:(_)=>`upd:${X(_)}:`,update:(_,E)=>`upd:${X(_)}:${E}`,updateResponse:(_)=>`upr:${_}`,updateIdempotency:(_,E)=>`upk:${X(_)}:${E}`,startIdempotency:(_)=>`start-idem:${X(_)}`,startIdempotencySignalId:(_)=>`start-idem:${_}`,livenessPrefix:()=>"liveness:",liveness:(_)=>`liveness:${X(_)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(_,E,F)=>`budget:${_}:${E}:${F}`,review:(_,E)=>`review:${X(_)}:${E}`,workflowHeaders:(_)=>`wf-headers:${X(_)}`,childCancellationPrefix:(_)=>`child-cancel:${X(_)}:`,childCancellation:(_,E)=>`child-cancel:${X(_)}:${X(E)}`,terminalCleanupNeeded:(_)=>`wf-cleanup-needed:${X(_)}`,workflowConcurrency:(_,E)=>`wf-concurrency:${X(_)}:${X(E)}`,workflowConcurrencyHolder:(_)=>`wf-concurrency-holder:${X(_)}`,workflowHasServices:(_)=>`wf-has-services:${X(_)}`,finalizerState:(_)=>`wf-finalizer-state:${X(_)}`,teardownOwed:(_)=>`wf-teardown-needed:${X(_)}`,teardownDeadLetter:(_)=>`wf-teardown-deadletter:${X(_)}`,offload:(_,E)=>`offload:${X(_)}:${E}`,archive:(_,E)=>`archive:${X(_)}:${E}`,stateExecution:(_,E)=>`state:execution:${X(_)}:${X(E)}`,stateWorkflow:(_,E)=>`state:workflow-scope:${C}:${X(_)}:${X(E)}`,streamChunkPrefix:(_,E)=>`blob:${X(_)}:${E}:chunk:`,streamChunk:(_,E,F)=>`blob:${X(_)}:${E}:chunk:${String(F).padStart(10,"0")}`,streamTail:(_,E)=>`blob:${X(_)}:${E}:tail`,streamMetadata:(_,E)=>`blob:${X(_)}:${E}:meta`,budgetCharged:(_)=>`budget-charged:${_}`,toolEffect:(_,E,F)=>`tool-effect:${X(_)}:${E}:${F}`,workflowVisibilityStatus:(_,E)=>`wf-idx-status:${X(_)}:${X(E)}`,workflowVisibilityType:(_,E)=>`wf-idx-type:${X(_)}:${X(E)}`,workflowVisibilityCreated:(_,E)=>`wf-idx-created:${Z(_)}:${X(E)}`,workflowVisibilityUpdated:(_,E)=>`wf-idx-updated:${Z(_)}:${X(E)}`,workflowVisibilityDeadline:(_,E)=>`wf-idx-deadline:${Z(_)}:${X(E)}`,workflowVisibilityManifest:(_)=>`wf-idx-manifest:${X(_)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function j_(_){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 j(_){let E={},F=!1;for(let J of["gt","gte","lt","lte"]){let Y=_[J];if(Y===void 0)continue;if(typeof Y!=="string")throw Error("deleteRange bounds must be strings");E[J]=Y,F=!0}if(!F)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let W=j_(_.limit);if(W!==void 0)E.limit=W;return E}async function l(_,E,F){let W=j(F);if(_.deleteRange)return _.deleteRange(E,W);return x(_,E,W)}var S=()=>{};function T(_){return _.replaceAll(/:+$/g,"")}function L_(_,E){let F=T(_),W=T(E);if(F.length===0)return W;if(W.length===0)return F;return`${F}:${W}`}function p(_,E){return new K(_,E)}var K;var a=M(()=>{S();V();K=class K{#_;#E;constructor(_,E){this.#_=_,this.#E=T(E)}#F(_){if(this.#E.length===0)return _;return _.length===0?`${this.#E}:`:`${this.#E}:${_}`}#X(_){if(this.#E.length===0)return _;return _.slice(this.#E.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.#F(_.gt);if(_.gte!==void 0)E.gte=this.#F(_.gte);if(_.lt!==void 0)E.lt=this.#F(_.lt);if(_.lte!==void 0)E.lte=this.#F(_.lte);return E}#J(_){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.gt!==void 0)E.gt=this.#F(_.gt);if(_.gte!==void 0)E.gte=this.#F(_.gte);if(_.lt!==void 0)E.lt=this.#F(_.lt);if(_.lte!==void 0)E.lte=this.#F(_.lte);return E}capabilities(){return this.#_.capabilities()}scoped(_){return new K(this.#_,L_(this.#E,_))}async get(_){return this.#_.get(this.#F(_))}async put(_,E){await this.#_.put(this.#F(_),E)}async delete(_){await this.#_.delete(this.#F(_))}async*scan(_,E){for await(let[F,W]of this.#_.scan(this.#F(_),this.#Y(E)))yield[this.#X(F),W]}async batch(_){G("batch operations",_.length),await this.#_.batch(_.map((E)=>{if(E.type==="put")return{type:"put",key:this.#F(E.key),value:E.value};return{type:"delete",key:this.#F(E.key)}}))}async conditionalBatch(_,E){return d(this.#_,_.map((F)=>({key:this.#F(F.key),expectedValue:F.expectedValue})),E.map((F)=>{if(F.type==="put")return{type:"put",key:this.#F(F.key),value:F.value};return{type:"delete",key:this.#F(F.key)}}))}async has(_){return c(this.#_,this.#F(_))}async deletePrefix(_){return f(this.#_,this.#F(_))}async deleteRange(_,E){let F=this.#J(j(E));return l(this.#_,this.#F(_),F)}async*keys(_,E){for await(let F of k(this.#_,this.#F(_),this.#Y(E)))yield this.#X(F)}async count(_){return w(this.#_,this.#F(_))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}});function C_(_){return _.trim().replace(/;+\s*$/u,"").trim()}function A_(_){return B_.test(_)}function Y_(_){let E=C_(_);if(E.length===0)throw Error("Storage query must not be empty.");if(E.includes(";"))throw Error("Storage query must contain exactly one read-only statement.");if(N_.test(E))return;if(D_.test(E)&&A_(E))return;throw Error("Storage query only supports read-only SELECT and PRAGMA statements.")}var D_,B_,N_;var J_=M(()=>{D_=/^PRAGMA\b/iu,B_=/^PRAGMA\s+(?:[A-Z_][A-Z0-9_]*\.)?[A-Z_][A-Z0-9_]*\s*$/iu,N_=/^SELECT\b/iu});S();V();import{Pool as S_}from"@neondatabase/serverless";V();function O(_){return _.rowCount??_.affectedRows??_.rows.length}function L(_){if(_ instanceof Uint8Array)return new Uint8Array(_);return new Uint8Array(_)}function D(_){return Buffer.from(_)}function z(_){let E=new Map,F=new Set;for(let W of _)if(W.type==="put")F.delete(W.key),E.set(W.key,W.value);else E.delete(W.key),F.add(W.key);return{puts:E,deletes:F}}async function s(_,E,F){if(F.length===0)return!0;let W=F.map((Q)=>Q.key),J=await _.query(E.selectValuesByKeys,[W]),Y=new Map;for(let Q of J.rows){let U=Q.value;if(U!==null&&U!==void 0)Y.set(Q.key,L(U))}for(let Q of F){let U=Y.get(Q.key)??null;if(!u(U,Q.expectedValue))return!1}return!0}async function v(_,E,F){if(F.puts.size>0){let W=[],J=[];for(let[Y,Q]of F.puts)W.push(Y),J.push(D(Q));await _.query(E.upsertValuesByKeys,[W,J])}if(F.deletes.size>0)await _.query(E.deleteValuesByKeys,[[...F.deletes]])}V();var n="kv",i=/^[a-z_][a-z0-9_]*$/i;function P(_,E){if(!i.test(_))throw Error(`NeonStorage ${E} name "${_}" is not a valid Postgres identifier. Use only letters, digits, and underscores, starting with a letter or underscore (matching ${i.source}).`)}function t(_){let{schema:E,table:F}=_;if(E===void 0&&F===void 0)return n;let W=F??n;if(P(W,"table"),E===void 0)return`"${W}"`;return P(E,"schema"),`"${E}"."${W}"`}function B(_){return[_,g(_)]}function o(_,E){let{gt:F,gte:W,lt:J,lte:Y}=E,Q=B(_),U=["key >= $1 AND key < $2"];if(F!==void 0)Q.push(F),U.push(`key > $${Q.length}`);if(W!==void 0)Q.push(W),U.push(`key >= $${Q.length}`);if(J!==void 0)Q.push(J),U.push(`key < $${Q.length}`);if(Y!==void 0)Q.push(Y),U.push(`key <= $${Q.length}`);return{conditions:U,parameters:Q}}function r(_,E={}){let{limit:F,reverse:W}=E,{conditions:J,parameters:Y}=o(_,E),Q=W?"DESC":"ASC",U="";if(F!==void 0)Y.push(F),U=` LIMIT $${Y.length}`;return{parameters:Y,whereOrderLimit:`WHERE ${J.join(" AND ")} ORDER BY key ${Q}${U}`}}function e(_){let E=`CREATE TABLE IF NOT EXISTS ${_} (
2
+ var JW=import.meta.require,SW=(W,X,Y)=>{if(X!=null){if(typeof X!=="object"&&typeof X!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let _;if(Y)_=X[Symbol.asyncDispose];if(_===void 0)_=X[Symbol.dispose];if(typeof _!=="function")throw TypeError("Object not disposable");W.push([Y,_,X])}else if(Y)W.push([Y]);return X},zW=(W,X,Y)=>{let _=(Z)=>X=Y?new SuppressedError(Z,X,"An error was suppressed during disposal"):(Y=!0,Z),G=(Z)=>{while(Z=W.pop())try{var $=Z[1]&&Z[1].call(Z[2]);if(Z[0])return Promise.resolve($).then(G,(M)=>(_(M),G()))}catch(M){_(M)}if(Y)throw X};return G()};function B(W,X,Y){if(!W.capabilities()[X])throw Error(`Feature "${Y}" requires storage capability "${X}", but this storage backend does not provide it.`)}function ZW(W){let X=W.capabilities(),Y=[];if(X.persistence!=="local"&&X.persistence!=="remote")Y.push(`persistence must be "local" or "remote" (got "${X.persistence}")`);if(X.readAfterWrite!=="linearizable")Y.push(`readAfterWrite must be "linearizable" (got "${X.readAfterWrite}")`);if(X.scanConsistency!=="snapshot")Y.push(`scanConsistency must be "snapshot" (got "${X.scanConsistency}")`);if(!X.atomicBatch)Y.push("atomicBatch must be true");if(!X.conditionalBatch)Y.push("conditionalBatch must be true");if(Y.length>0)throw Error(`Storage is not durable enough for recovery: ${Y.join("; ")}.`)}var L="default";async function R(W,X){return await W.get(X)!==null}async function*U(W,X,Y){for await(let[_]of W.scan(X,Y))yield _}async function v(W,X){let Y=0;for await(let _ of U(W,X))Y++;return Y}async function q(W,X){let Y=[];for await(let _ of U(W,X))Y.push({type:"delete",key:_});if(Y.length===0)return 0;return await W.batch(Y),Y.length}async function P(W,X,Y){let _=[];for await(let G of U(W,X,Y))_.push({type:"delete",key:G});if(_.length===0)return 0;return await W.batch(_),_.length}var GW=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","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-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-terminal:"];var D=1e4,xW=1e4;class b extends Error{code="StorageBatchOperationLimitExceededError";cap=D;count;target;constructor(W,X){super(`${W} count ${X} exceeds MAX_BATCH_OPERATIONS (${D}).`);this.name="StorageBatchOperationLimitExceededError",this.target=W,this.count=X}}function H(W,X){if(X>D)throw new b(W,X)}function x(W){return W.length>0?W.slice(0,-1)+String.fromCharCode(W.charCodeAt(W.length-1)+1):"\xFF"}function yW(W,X={}){if(X.gt!==void 0&&W<=X.gt)return!1;if(X.gte!==void 0&&W<X.gte)return!1;if(X.lt!==void 0&&W>=X.lt)return!1;if(X.lte!==void 0&&W>X.lte)return!1;return!0}function y(W,X){if(W===null||X===null)return W===X;if(W.byteLength!==X.byteLength)return!1;for(let Y=0;Y<W.byteLength;Y++)if(W[Y]!==X[Y])return!1;return!0}async function I(W,X){if(W.has)return W.has(X);return R(W,X)}function m(W,X,Y){if(W.keys)return W.keys(X,Y);return U(W,X,Y)}async function g(W,X){if(W.count)return W.count(X);return v(W,X)}async function k(W,X){if(W.deletePrefix)return W.deletePrefix(X);return q(W,X)}async function IW(W,X){H("batch operations",X.length),await W.batch(X)}async function u(W,X,Y){if(H("conditionalBatch conditions",X.length),H("conditionalBatch operations",Y.length),B(W,"conditionalBatch","storageConditionalBatch"),!W.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return W.conditionalBatch(X,Y)}function J(W){return encodeURIComponent(W)}function mW(W){return decodeURIComponent(W)}function gW(W){try{return decodeURIComponent(W)}catch{return null}}var F=(W)=>String(W).padStart(16,"0"),$W="0",MW="1",h=(W,X,Y,_)=>`sig:${J(W)}:${J(X)}:${_}:${J(Y)}`,kW={workflow:(W)=>`wf:${J(W)}`,checkpoint:(W)=>`wf:${J(W)}:ckpt`,checkpointHistory:(W,X)=>`wf:${J(W)}:ckpt:${String(X).padStart(10,"0")}`,timelinePrefix:(W)=>`wf:${J(W)}:timeline:`,timeline:(W,X)=>`wf:${J(W)}:timeline:${String(X).padStart(10,"0")}`,schedule:(W)=>`schedule:${J(W)}`,scheduleTick:(W,X)=>`schedule-due:${String(W).padStart(16,"0")}:${J(X)}`,scheduleRun:(W)=>`schedule-run:${J(W)}`,operation:(W,X,Y)=>`op:${W}:${F(X)}:${Y}`,operationInflight:(W)=>`op:inflight:${W}`,operationQueued:(W)=>`op:queued:${W}`,operationResolved:(W)=>`op:resolved:${W}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(W)=>`op:dead-letter:${W}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(W,X,Y)=>`audit:bulk:${F(W)}:${J(X)}:${J(Y)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(W,X)=>`op:resolved-by-time:${F(W)}:${J(X)}`,asyncActivity:(W,X)=>`async-act:v1:${J(W)}:${J(X)}`,asyncActivityResolution:(W,X)=>`async-act:v1:${J(W)}:${J(X)}:resolution`,activityReconciliationPrefix:(W)=>`actrec:v1:${J(W)}:`,activityReconciliation:(W,X,Y)=>`actrec:v1:${J(W)}:${J(X)}:${Y}`,eventPrefix:(W)=>`ev:${J(W)}:`,event:(W,X)=>`ev:${J(W)}:${String(X).padStart(10,"0")}`,eventHead:(W)=>`ev:${J(W)}:head`,eventWatermark:(W)=>`ev:${J(W)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(W)=>`fleet-event:${String(W).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(W)=>`fleet-event-by-workflow:${J(W)}:`,fleetEventByWorkflow:(W,X)=>`fleet-event-by-workflow:${J(W)}:${String(X).padStart(10,"0")}`,signal:(W,X,Y)=>h(W,X,Y,MW),startSignal:(W,X,Y)=>h(W,X,Y,$W),signalSequence:(W)=>`sigseq:v1:${J(W)}`,signalAcceptedResponsePrefix:(W)=>`sigres:v1:${J(W)}:`,signalAcceptedResponse:(W,X,Y)=>`sigres:v1:${J(W)}:${J(X)}:${J(Y)}`,deadline:(W,X)=>`wf-deadline:${F(W)}:${J(X)}`,terminalCleanup:(W,X)=>`wf-cleanup:${F(W)}:${J(X)}`,teardownTimer:(W,X)=>`wf-teardown:${F(W)}:${J(X)}`,delayedStart:(W,X)=>`wf-delayed:${F(W)}:${J(X)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(W,X)=>`wf-terminal:${F(W)}:${J(X)}`,attribute:(W)=>`attr:${J(W)}`,attributeIndex:(W,X,Y)=>`idx:${W}:${X}:${J(Y)}`,tagIndex:(W,X)=>`tag:${J(W)}:${J(X)}`,updatePrefix:(W)=>`upd:${J(W)}:`,update:(W,X)=>`upd:${J(W)}:${X}`,updateResponse:(W)=>`upr:${W}`,updateIdempotency:(W,X)=>`upk:${J(W)}:${X}`,startIdempotency:(W)=>`start-idem:${J(W)}`,startIdempotencySignalId:(W)=>`start-idem:${W}`,livenessPrefix:()=>"liveness:",liveness:(W)=>`liveness:${J(W)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(W,X,Y)=>`budget:${W}:${X}:${Y}`,review:(W,X)=>`review:${J(W)}:${X}`,workflowHeaders:(W)=>`wf-headers:${J(W)}`,childCancellationPrefix:(W)=>`child-cancel:${J(W)}:`,childCancellation:(W,X)=>`child-cancel:${J(W)}:${J(X)}`,terminalCleanupNeeded:(W)=>`wf-cleanup-needed:${J(W)}`,workflowConcurrency:(W,X)=>`wf-concurrency:${J(W)}:${J(X)}`,workflowConcurrencyHolder:(W)=>`wf-concurrency-holder:${J(W)}`,workflowHasServices:(W)=>`wf-has-services:${J(W)}`,finalizerState:(W)=>`wf-finalizer-state:${J(W)}`,teardownOwed:(W)=>`wf-teardown-needed:${J(W)}`,teardownDeadLetter:(W)=>`wf-teardown-deadletter:${J(W)}`,offload:(W,X)=>`offload:${J(W)}:${X}`,archive:(W,X)=>`archive:${J(W)}:${X}`,stateExecution:(W,X)=>`state:execution:${J(W)}:${J(X)}`,stateWorkflow:(W,X)=>`state:workflow-scope:${L}:${J(W)}:${J(X)}`,streamChunkPrefix:(W,X)=>`blob:${J(W)}:${X}:chunk:`,streamChunk:(W,X,Y)=>`blob:${J(W)}:${X}:chunk:${String(Y).padStart(10,"0")}`,streamTail:(W,X)=>`blob:${J(W)}:${X}:tail`,streamMetadata:(W,X)=>`blob:${J(W)}:${X}:meta`,budgetCharged:(W)=>`budget-charged:${W}`,toolEffect:(W,X,Y)=>`tool-effect:${J(W)}:${X}:${Y}`,workflowVisibilityStatus:(W,X)=>`wf-idx-status:${J(W)}:${J(X)}`,workflowVisibilityType:(W,X)=>`wf-idx-type:${J(W)}:${J(X)}`,workflowVisibilityCreated:(W,X)=>`wf-idx-created:${F(W)}:${J(X)}`,workflowVisibilityUpdated:(W,X)=>`wf-idx-updated:${F(W)}:${J(X)}`,workflowVisibilityDeadline:(W,X)=>`wf-idx-deadline:${F(W)}:${J(X)}`,workflowVisibilityManifest:(W)=>`wf-idx-manifest:${J(W)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function FW(W){if(W===void 0)return;if(typeof W!=="number"||!Number.isInteger(W)||W<0)throw Error("deleteRange limit must be a finite non-negative integer");return W===0?0:W}function V(W){let X={},Y=!1;for(let G of["gt","gte","lt","lte"]){let Z=W[G];if(Z===void 0)continue;if(typeof Z!=="string")throw Error("deleteRange bounds must be strings");X[G]=Z,Y=!0}if(!Y)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let _=FW(W.limit);if(_!==void 0)X.limit=_;return X}async function c(W,X,Y){let _=V(Y);if(W.deleteRange)return W.deleteRange(X,_);return P(W,X,_)}function C(W){return W.replaceAll(/:+$/g,"")}function HW(W,X){let Y=C(W),_=C(X);if(Y.length===0)return _;if(_.length===0)return Y;return`${Y}:${_}`}class A{#W;#X;constructor(W,X){this.#W=W,this.#X=C(X)}#Y(W){if(this.#X.length===0)return W;return W.length===0?`${this.#X}:`:`${this.#X}:${W}`}#J(W){if(this.#X.length===0)return W;return W.slice(this.#X.length+1)}#Z(W={}){let X={};if(W.limit!==void 0)X.limit=W.limit;if(W.reverse!==void 0)X.reverse=W.reverse;if(W.gt!==void 0)X.gt=this.#Y(W.gt);if(W.gte!==void 0)X.gte=this.#Y(W.gte);if(W.lt!==void 0)X.lt=this.#Y(W.lt);if(W.lte!==void 0)X.lte=this.#Y(W.lte);return X}#G(W){let X={};if(W.limit!==void 0)X.limit=W.limit;if(W.gt!==void 0)X.gt=this.#Y(W.gt);if(W.gte!==void 0)X.gte=this.#Y(W.gte);if(W.lt!==void 0)X.lt=this.#Y(W.lt);if(W.lte!==void 0)X.lte=this.#Y(W.lte);return X}capabilities(){return this.#W.capabilities()}scoped(W){return new A(this.#W,HW(this.#X,W))}async get(W){return this.#W.get(this.#Y(W))}async put(W,X){await this.#W.put(this.#Y(W),X)}async delete(W){await this.#W.delete(this.#Y(W))}async*scan(W,X){for await(let[Y,_]of this.#W.scan(this.#Y(W),this.#Z(X)))yield[this.#J(Y),_]}async batch(W){H("batch operations",W.length),await this.#W.batch(W.map((X)=>{if(X.type==="put")return{type:"put",key:this.#Y(X.key),value:X.value};return{type:"delete",key:this.#Y(X.key)}}))}async conditionalBatch(W,X){return u(this.#W,W.map((Y)=>({key:this.#Y(Y.key),expectedValue:Y.expectedValue})),X.map((Y)=>{if(Y.type==="put")return{type:"put",key:this.#Y(Y.key),value:Y.value};return{type:"delete",key:this.#Y(Y.key)}}))}async has(W){return I(this.#W,this.#Y(W))}async deletePrefix(W){return k(this.#W,this.#Y(W))}async deleteRange(W,X){let Y=this.#G(V(X));return c(this.#W,this.#Y(W),Y)}async*keys(W,X){for await(let Y of m(this.#W,this.#Y(W),this.#Z(X)))yield this.#J(Y)}async count(W){return g(this.#W,this.#Y(W))}[Symbol.dispose](){this.#W[Symbol.dispose]()}}function w(W,X){return new A(W,X)}function f(W,X){let Y,_,G=!1,Z=()=>{if(G)throw Error(`${X.storageName} pool has been disposed and cannot be reused. Construct a new adapter.`);return Y??=X.loadPool(W).catch(($)=>{throw Y=void 0,VW($,X)}),Y};return{query:async($,M)=>{return(await Z()).query($,M)},connect:async()=>{return(await Z()).connect()},end:async()=>{return G=!0,_??=(async()=>{if(Y===void 0)return;await(await Y.catch(()=>{return}))?.end()})(),_}}}var UW=/cannot find module|module_not_found|failed to resolve|could not resolve/i;function VW(W,X){let Y=W instanceof Error?W.message:String(W);if(UW.test(Y))return Error(`${X.storageName} requires the optional peer dependency "${X.driverName}". Install it in your application with: bun add ${X.driverName} (or npm install ${X.driverName}).`,{cause:W});return W instanceof Error?W:Error(Y)}function N(W){return W.rowCount??W.affectedRows??W.rows.length}function Q(W){if(W instanceof Uint8Array)return new Uint8Array(W);return new Uint8Array(W)}function E(W){return Buffer.from(W)}function K(W){let X=new Map,Y=new Set;for(let _ of W)if(_.type==="put")Y.delete(_.key),X.set(_.key,_.value);else X.delete(_.key),Y.add(_.key);return{puts:X,deletes:Y}}async function d(W,X,Y){if(Y.length===0)return!0;let _=Y.map(($)=>$.key),G=await W.query(X.selectValuesByKeys,[_]),Z=new Map;for(let $ of G.rows){let M=$.value;if(M!==null&&M!==void 0)Z.set($.key,Q(M))}for(let $ of Y){let M=Z.get($.key)??null;if(!y(M,$.expectedValue))return!1}return!0}async function S(W,X,Y){if(Y.puts.size>0){let _=[],G=[];for(let[Z,$]of Y.puts)_.push(Z),G.push(E($));await W.query(X.upsertValuesByKeys,[_,G])}if(Y.deletes.size>0)await W.query(X.deleteValuesByKeys,[[...Y.deletes]])}var p=/^[a-z_][a-z0-9_]*$/i;function l(W,X,Y){if(!p.test(W))throw Error(`${Y} storage ${X} name "${W}" is not a valid ${Y} identifier. Use only letters, digits, and underscores, starting with a letter or underscore (matching ${p.source}).`)}var a="kv";function z(W,X){l(W,X,"Postgres")}function n(W){let{schema:X,table:Y}=W;if(X===void 0&&Y===void 0)return a;let _=Y??a;if(z(_,"table"),X===void 0)return`"${_}"`;return z(X,"schema"),`"${X}"."${_}"`}function j(W){return[W,x(W)]}function i(W,X){let{gt:Y,gte:_,lt:G,lte:Z}=X,$=j(W),M=["key >= $1 AND key < $2"];if(Y!==void 0)$.push(Y),M.push(`key > $${$.length}`);if(_!==void 0)$.push(_),M.push(`key >= $${$.length}`);if(G!==void 0)$.push(G),M.push(`key < $${$.length}`);if(Z!==void 0)$.push(Z),M.push(`key <= $${$.length}`);return{conditions:M,parameters:$}}function s(W,X={}){let{limit:Y,reverse:_}=X,{conditions:G,parameters:Z}=i(W,X),$=_?"DESC":"ASC",M="";if(Y!==void 0)Z.push(Y),M=` LIMIT $${Z.length}`;return{parameters:Z,whereOrderLimit:`WHERE ${G.join(" AND ")} ORDER BY key ${$}${M}`}}function r(W){let X=`CREATE TABLE IF NOT EXISTS ${W} (
3
3
  key TEXT COLLATE "C" PRIMARY KEY,
4
4
  value BYTEA NOT NULL
5
- )`,F=`
5
+ )`,Y=`
6
6
  SELECT COALESCE(co.collname, 'default') AS collation
7
7
  FROM pg_attribute a
8
8
  LEFT JOIN pg_collation co ON co.oid = a.attcollation
9
9
  WHERE a.attrelid = to_regclass($1) AND a.attname = 'key' AND a.attnum > 0
10
- `;return{tableReference:_,createTable:E,selectKeyCollation:`
10
+ `;return{tableReference:W,createTable:X,selectKeyCollation:`
11
11
  SELECT COALESCE(co.collname, 'default') AS collation
12
12
  FROM pg_attribute a
13
13
  LEFT JOIN pg_collation co ON co.oid = a.attcollation
14
14
  WHERE a.attrelid = to_regclass($1) AND a.attname = 'key' AND a.attnum > 0
15
- `,selectValueByKey:`SELECT value FROM ${_} WHERE key = $1`,upsertValueByKey:`INSERT INTO ${_} (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,deleteValueByKey:`DELETE FROM ${_} WHERE key = $1`,selectKeyPresence:`SELECT 1 AS present FROM ${_} WHERE key = $1 LIMIT 1`,countKeysByPrefix:`SELECT COUNT(*) AS count FROM ${_} WHERE key >= $1 AND key < $2`,deleteKeysByPrefix:`DELETE FROM ${_} WHERE key >= $1 AND key < $2`,selectValuesByKeys:`SELECT key, value FROM ${_} WHERE key = ANY($1)`,upsertValuesByKeys:`INSERT INTO ${_} (key, value) SELECT * FROM unnest($1::text[], $2::bytea[]) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,deleteValuesByKeys:`DELETE FROM ${_} WHERE key = ANY($1)`,keyValueRangeSelect(W,J={}){let{parameters:Y,whereOrderLimit:Q}=r(W,J);return{parameters:Y,sql:`SELECT key, value FROM ${_} ${Q}`}},keyRangeSelect(W,J={}){let{parameters:Y,whereOrderLimit:Q}=r(W,J);return{parameters:Y,sql:`SELECT key FROM ${_} ${Q}`}},keyRangeDelete(W,J){let{conditions:Y,parameters:Q}=o(W,J),U=Y.join(" AND ");if(J.limit===void 0)return{parameters:Q,sql:`DELETE FROM ${_} WHERE ${U}`};return Q.push(J.limit),{parameters:Q,sql:`DELETE FROM ${_} WHERE key IN (SELECT key FROM ${_} WHERE ${U} ORDER BY key ASC LIMIT $${Q.length})`}}}}var __="BEGIN ISOLATION LEVEL SERIALIZABLE",E_="BEGIN ISOLATION LEVEL READ COMMITTED",F_="BEGIN READ ONLY",W_="COMMIT",R="ROLLBACK";function X_(_){return P(_,"schema"),`CREATE SCHEMA IF NOT EXISTS "${_}"`}J_();a();var T_=new Set(["40001","40P01"]),Q_=5;function K_(_){if(typeof _!=="object"||_===null||!("code"in _))return!1;let E=_.code;return typeof E==="string"&&T_.has(E)}class O_{#_;#E;#F;#X;#Y;#J;constructor(_,E=(F)=>new S_({connectionString:F})){this.#Y=_.pool===void 0,this.#_=_.pool??E(_.url),this.#F=_.schema;let F=t({schema:_.schema,table:_.table});this.#E=e(F)}capabilities(){return{persistence:"remote",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#W(){return this.#X??=this.#Z().catch((_)=>{throw this.#X=void 0,_}),this.#X}async#Z(){if(this.#F!==void 0)await this.#_.query(X_(this.#F));await this.#_.query(this.#E.createTable),await this.#G()}async#G(){let E=(await this.#_.query(this.#E.selectKeyCollation,[this.#E.tableReference])).rows[0]?.collation;if(E==="C")return;let F=E===void 0?"no such table":typeof E==="string"?`"${E}"`:"an unexpected collation value";throw Error(`NeonStorage requires the ${this.#E.tableReference} table's "key" column to use COLLATE "C" (found ${F}). A table created without COLLATE "C" sorts keys by the database locale, which breaks Weft's lexicographic prefix scans. Use a fresh table, or recreate it as: CREATE TABLE ${this.#E.tableReference} (key TEXT COLLATE "C" PRIMARY KEY, value BYTEA NOT NULL).`)}async get(_){await this.#W();let F=(await this.#_.query(this.#E.selectValueByKey,[_])).rows[0];if(F===void 0)return null;let W=F.value;if(W===null||W===void 0)return null;return L(W)}async put(_,E){await this.#W(),await this.#_.query(this.#E.upsertValueByKey,[_,D(E)])}async delete(_){await this.#W(),await this.#_.query(this.#E.deleteValueByKey,[_])}async has(_){return await this.#W(),(await this.#_.query(this.#E.selectKeyPresence,[_])).rows.length>0}async deletePrefix(_){await this.#W();let[E,F]=B(_),W=await this.#_.query(this.#E.deleteKeysByPrefix,[E,F]);return O(W)}async deleteRange(_,E){await this.#W();let F=j(E),{parameters:W,sql:J}=this.#E.keyRangeDelete(_,F),Y=await this.#_.query(J,W);return O(Y)}async*scan(_,E={}){await this.#W();let{parameters:F,sql:W}=this.#E.keyValueRangeSelect(_,E),J=await this.#_.query(W,F);for(let Y of J.rows)yield[Y.key,L(Y.value)]}async*keys(_,E={}){await this.#W();let{parameters:F,sql:W}=this.#E.keyRangeSelect(_,E),J=await this.#_.query(W,F);for(let Y of J.rows)yield Y.key}async count(_){await this.#W();let[E,F]=B(_),W=await this.#_.query(this.#E.countKeysByPrefix,[E,F]);return Number(W.rows[0]?.count??0)}scoped(_){return p(this,_)}async#Q(_,E,F=()=>!0){let W=await this.#_.connect();try{await W.query(_);try{let J=await E(W);return await W.query(F(J)?W_:R),J}catch(J){throw await W.query(R).catch(()=>{}),J}}finally{W.release()}}async batch(_){if(G("batch operations",_.length),_.length===0)return;await this.#W(),await this.#Q(E_,async(E)=>{await v(E,this.#E,z(_))})}async conditionalBatch(_,E){G("conditionalBatch conditions",_.length),G("conditionalBatch operations",E.length),await this.#W();let F=z(E),W;for(let J=0;J<Q_;J+=1)try{return await this.#Q(__,async(Y)=>{if(!await s(Y,this.#E,_))return!1;return await v(Y,this.#E,F),!0},(Y)=>Y)}catch(Y){if(!K_(Y))throw Y;W=Y}throw Error(`conditionalBatch exhausted ${Q_} attempts after retryable transaction failures`,{cause:W})}async query(_,E){return await this.#W(),Y_(_),this.#Q(F_,async(F)=>{return(await F.query(_,E??[])).rows})}#U(){if(!this.#Y)return Promise.resolve();return this.#J??=this.#_.end(),this.#J}[Symbol.dispose](){this.#U().catch(()=>{})}async[Symbol.asyncDispose](){await this.#U()}}export{O_ as NeonStorage};
15
+ `,selectValueByKey:`SELECT value FROM ${W} WHERE key = $1`,upsertValueByKey:`INSERT INTO ${W} (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,deleteValueByKey:`DELETE FROM ${W} WHERE key = $1`,selectKeyPresence:`SELECT 1 AS present FROM ${W} WHERE key = $1 LIMIT 1`,countKeysByPrefix:`SELECT COUNT(*) AS count FROM ${W} WHERE key >= $1 AND key < $2`,deleteKeysByPrefix:`DELETE FROM ${W} WHERE key >= $1 AND key < $2`,selectValuesByKeys:`SELECT key, value FROM ${W} WHERE key = ANY($1)`,upsertValuesByKeys:`INSERT INTO ${W} (key, value) SELECT * FROM unnest($1::text[], $2::bytea[]) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,deleteValuesByKeys:`DELETE FROM ${W} WHERE key = ANY($1)`,keyValueRangeSelect(_,G={}){let{parameters:Z,whereOrderLimit:$}=s(_,G);return{parameters:Z,sql:`SELECT key, value FROM ${W} ${$}`}},keyRangeSelect(_,G={}){let{parameters:Z,whereOrderLimit:$}=s(_,G);return{parameters:Z,sql:`SELECT key FROM ${W} ${$}`}},keyRangeDelete(_,G){let{conditions:Z,parameters:$}=i(_,G),M=Z.join(" AND ");if(G.limit===void 0)return{parameters:$,sql:`DELETE FROM ${W} WHERE ${M}`};return $.push(G.limit),{parameters:$,sql:`DELETE FROM ${W} WHERE key IN (SELECT key FROM ${W} WHERE ${M} ORDER BY key ASC LIMIT $${$.length})`}}}}var t="BEGIN ISOLATION LEVEL SERIALIZABLE",o="BEGIN ISOLATION LEVEL READ COMMITTED",e="BEGIN READ ONLY",WW="COMMIT",O="ROLLBACK";function XW(W){return z(W,"schema"),`CREATE SCHEMA IF NOT EXISTS "${W}"`}var QW=/^PRAGMA\b/iu,EW=/^PRAGMA\s+(?:[A-Z_][A-Z0-9_]*\.)?[A-Z_][A-Z0-9_]*\s*$/iu,jW=/^SELECT\b/iu;function BW(W){return W.trim().replace(/;+\s*$/u,"").trim()}function LW(W){return EW.test(W)}function YW(W){let X=BW(W);if(X.length===0)throw Error("Storage query must not be empty.");if(X.includes(";"))throw Error("Storage query must contain exactly one read-only statement.");if(jW.test(X))return;if(QW.test(X)&&LW(X))return;throw Error("Storage query only supports read-only SELECT and PRAGMA statements.")}var DW=new Set(["40001","40P01"]),_W=5;function CW(W){if(typeof W!=="object"||W===null||!("code"in W))return!1;let X=W.code;return typeof X==="string"&&DW.has(X)}class T{#W;#X;#Y;#J;#Z;#G;constructor(W,X){if(this.#Z=W.pool===void 0,W.pool===void 0){if(W.url===void 0)throw Error("PostgresKeyValueStorage requires either a `url` to build a pool from, or a pre-built `pool`; neither was provided.");this.#W=X(W.url)}else this.#W=W.pool;this.#Y=W.schema;let Y=n({schema:W.schema,table:W.table});this.#X=r(Y)}capabilities(){return{persistence:"remote",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#_(){return this.#J??=this.#F().catch((W)=>{throw this.#J=void 0,W}),this.#J}async#F(){if(this.#Y!==void 0)await this.#W.query(XW(this.#Y));await this.#W.query(this.#X.createTable),await this.#H()}async#H(){let X=(await this.#W.query(this.#X.selectKeyCollation,[this.#X.tableReference])).rows[0]?.collation;if(X==="C")return;let Y=X===void 0?"no such table":typeof X==="string"?`"${X}"`:"an unexpected collation value";throw Error(`Postgres storage requires the ${this.#X.tableReference} table's "key" column to use COLLATE "C" (found ${Y}). A table created without COLLATE "C" sorts keys by the database locale, which breaks Weft's lexicographic prefix scans. Use a fresh table, or recreate it as: CREATE TABLE ${this.#X.tableReference} (key TEXT COLLATE "C" PRIMARY KEY, value BYTEA NOT NULL).`)}async get(W){await this.#_();let Y=(await this.#W.query(this.#X.selectValueByKey,[W])).rows[0];if(Y===void 0)return null;let _=Y.value;if(_===null||_===void 0)return null;return Q(_)}async put(W,X){await this.#_(),await this.#W.query(this.#X.upsertValueByKey,[W,E(X)])}async delete(W){await this.#_(),await this.#W.query(this.#X.deleteValueByKey,[W])}async has(W){return await this.#_(),(await this.#W.query(this.#X.selectKeyPresence,[W])).rows.length>0}async deletePrefix(W){await this.#_();let[X,Y]=j(W),_=await this.#W.query(this.#X.deleteKeysByPrefix,[X,Y]);return N(_)}async deleteRange(W,X){await this.#_();let Y=V(X),{parameters:_,sql:G}=this.#X.keyRangeDelete(W,Y),Z=await this.#W.query(G,_);return N(Z)}async*scan(W,X={}){await this.#_();let{parameters:Y,sql:_}=this.#X.keyValueRangeSelect(W,X),G=await this.#W.query(_,Y);for(let Z of G.rows)yield[Z.key,Q(Z.value)]}async*keys(W,X={}){await this.#_();let{parameters:Y,sql:_}=this.#X.keyRangeSelect(W,X),G=await this.#W.query(_,Y);for(let Z of G.rows)yield Z.key}async count(W){await this.#_();let[X,Y]=j(W),_=await this.#W.query(this.#X.countKeysByPrefix,[X,Y]);return Number(_.rows[0]?.count??0)}scoped(W){return w(this,W)}async#$(W,X,Y=()=>!0){let _=await this.#W.connect();try{await _.query(W);try{let G=await X(_);return await _.query(Y(G)?WW:O),G}catch(G){throw await _.query(O).catch(()=>{}),G}}finally{_.release()}}async batch(W){if(H("batch operations",W.length),W.length===0)return;await this.#_(),await this.#$(o,async(X)=>{await S(X,this.#X,K(W))})}async conditionalBatch(W,X){H("conditionalBatch conditions",W.length),H("conditionalBatch operations",X.length),await this.#_();let Y=K(X),_;for(let G=0;G<_W;G+=1)try{return await this.#$(t,async(Z)=>{if(!await d(Z,this.#X,W))return!1;return await S(Z,this.#X,Y),!0},(Z)=>Z)}catch(Z){if(!CW(Z))throw Z;_=Z}throw Error(`conditionalBatch exhausted ${_W} attempts after retryable transaction failures`,{cause:_})}async query(W,X){return await this.#_(),YW(W),this.#$(e,async(Y)=>{return(await Y.query(W,X??[])).rows})}#M(){if(!this.#Z)return Promise.resolve();return this.#G??=this.#W.end(),this.#G}[Symbol.dispose](){this.#M().catch(()=>{})}async[Symbol.asyncDispose](){await this.#M()}}function AW(W){return f(W,{driverName:"@neondatabase/serverless",storageName:"NeonStorage",loadPool:(X)=>import("@neondatabase/serverless").then(({Pool:Y})=>new Y({connectionString:X}))})}class NW extends T{constructor(W,X=AW){super(W,X)}}export{NW as NeonStorage};
@@ -202,19 +202,19 @@ function buildSqliteKeyRangeQuery(prefix, options = {}) {
202
202
  sqlSuffix: `WHERE ${conditions.join(" AND ")} ORDER BY key ${direction}${limitClause}`
203
203
  };
204
204
  }
205
- function buildSqliteKeyRangeDelete(prefix, options) {
205
+ function buildSqliteKeyRangeDelete(prefix, options, table = "kv") {
206
206
  const { conditions, parameters } = buildSqliteKeyRangeConditions(prefix, options);
207
207
  const whereClause = conditions.join(" AND ");
208
208
  if (options.limit === undefined) {
209
209
  return {
210
210
  parameters,
211
- sql: `DELETE FROM kv WHERE ${whereClause}`
211
+ sql: `DELETE FROM ${table} WHERE ${whereClause}`
212
212
  };
213
213
  }
214
214
  parameters.push(options.limit);
215
215
  return {
216
216
  parameters,
217
- sql: `DELETE FROM kv WHERE key IN (SELECT key FROM kv WHERE ${whereClause} ORDER BY key ASC LIMIT ?)`
217
+ sql: `DELETE FROM ${table} WHERE key IN (SELECT key FROM ${table} WHERE ${whereClause} ORDER BY key ASC LIMIT ?)`
218
218
  };
219
219
  }
220
220
  function buildSqliteKeyValueRangeSelect(prefix, options = {}) {
@@ -29,6 +29,12 @@ export declare const DEFAULT_POSTGRES_TABLE_REFERENCE = "kv";
29
29
  * they must be interpolated into the SQL text — this validation, run once at
30
30
  * construction, is the injection guard that makes interpolation safe. The strict
31
31
  * pattern excludes the `"` quote character, so no quote-doubling is required.
32
+ *
33
+ * A thin Postgres-flavored wrapper over the driver-neutral
34
+ * {@link assertSqlIdentifier} (`./sql-identifier.ts`), which also backs the
35
+ * Cloudflare Durable Object SQLite adapter's table-name validation. Kept as a
36
+ * named export with the `'schema' | 'table'` role union and the "Postgres"
37
+ * wording so existing call sites and error-message assertions stay unchanged.
32
38
  */
33
39
  export declare function assertPostgresIdentifier(value: string, role: 'schema' | 'table'): void;
34
40
  /**
@@ -51,7 +57,7 @@ export type PostgresBuiltQuery = {
51
57
  export declare function buildPostgresPrefixRangeParameters(prefix: string): [string, string];
52
58
  /**
53
59
  * The complete set of SQL statements an adapter instance runs, all bound to one
54
- * `tableReference`. Built once per {@link NeonStorage} via
60
+ * `tableReference`. Built once per storage instance via
55
61
  * {@link buildPostgresKeyValueQueries}; the range builders close over the
56
62
  * reference so callers never re-pass it.
57
63
  */
@@ -1,9 +1,8 @@
1
1
  import { resolvePrefixRangeEnd } from "./interface.js";
2
+ import { assertSqlIdentifier } from "./sql-identifier.js";
2
3
  export const DEFAULT_POSTGRES_TABLE_REFERENCE = "kv";
3
- const POSTGRES_IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_]*$/i;
4
4
  export function assertPostgresIdentifier(value, role) {
5
- if (!POSTGRES_IDENTIFIER_PATTERN.test(value))
6
- throw Error(`NeonStorage ${role} name "${value}" is not a valid Postgres identifier. Use only letters, digits, and underscores, starting with a letter or underscore (matching ${POSTGRES_IDENTIFIER_PATTERN.source}).`);
5
+ assertSqlIdentifier(value, role, "Postgres");
7
6
  }
8
7
  export function resolvePostgresTableReference(options) {
9
8
  const { schema, table } = options;