@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,110 @@
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';
4
+ /**
5
+ * A connection that can run a single interactive transaction. Obtained from
6
+ * {@link PostgresPool.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.
11
+ */
12
+ export type PostgresPoolClient = {
13
+ query(sql: string, parameters?: unknown[]): Promise<NeonQueryResult>;
14
+ release(): void;
15
+ };
16
+ /**
17
+ * Minimal structural view of a node-postgres `Pool`. Both the `pg` `Pool` and
18
+ * the Neon serverless `Pool` satisfy this; the PGlite test backend is wrapped to
19
+ * satisfy it too. `query()` runs a single statement on a pooled connection (used
20
+ * for the single-statement hot paths); `connect()` pins a connection for an
21
+ * interactive transaction; `end()` tears the pool down.
22
+ */
23
+ export type PostgresPool = {
24
+ query(sql: string, parameters?: unknown[]): Promise<NeonQueryResult>;
25
+ connect(): Promise<PostgresPoolClient>;
26
+ end(): Promise<void>;
27
+ };
28
+ /**
29
+ * Configuration shared by every Postgres-wire storage adapter (the native `pg`
30
+ * {@link PostgresPool}-backed adapter and the Neon serverless one).
31
+ */
32
+ export type PostgresKeyValueStorageOptions = {
33
+ /**
34
+ * Postgres connection string. Required only when no `pool` is supplied — the
35
+ * adapter builds its own pool from this via the subclass's `poolFactory`. When
36
+ * `pool` is given, `url` is ignored and may be omitted entirely.
37
+ */
38
+ url?: string;
39
+ /**
40
+ * Optional pre-built pool. Pass this to reuse a pool you manage (for example a
41
+ * test backend such as PGlite, or a shared application pool), instead of having
42
+ * the adapter construct its own from `url`. When supplied, `url` is ignored and
43
+ * **ownership stays with the caller**: disposing the adapter does NOT close an
44
+ * injected pool, so it can be shared across adapters and the caller remains
45
+ * responsible for ending it. A pool the adapter constructs itself (from `url`)
46
+ * IS closed on disposal.
47
+ */
48
+ pool?: PostgresPool;
49
+ /**
50
+ * Postgres schema to contain the kv table. Default: unqualified — the table
51
+ * resolves through `search_path` (in practice `public`). When set, the adapter
52
+ * creates the schema if absent (`CREATE SCHEMA IF NOT EXISTS`) and qualifies
53
+ * every statement as `"schema"."table"`. Lets Weft live in its own schema
54
+ * alongside the application's tables in one database — one PITR line, no Drizzle
55
+ * drift/drop risk. Validated as a strict Postgres identifier at construction.
56
+ */
57
+ schema?: string;
58
+ /**
59
+ * Table name. Default: `'kv'`. Validated as a strict Postgres identifier at
60
+ * construction. With neither `schema` nor `table` set, the adapter emits
61
+ * byte-identical SQL against the unqualified `kv` table (existing deployments
62
+ * are unaffected).
63
+ */
64
+ table?: string;
65
+ };
66
+ /**
67
+ * Driver-agnostic base for Weft's Postgres-wire storage adapters. Implements the
68
+ * full `Storage` interface over a single `kv(key TEXT COLLATE "C", value BYTEA)`
69
+ * table using the structural {@link PostgresPool} seam, so switching between the
70
+ * native `pg` driver and the Neon serverless driver is a subclass choice, not a
71
+ * behavior change. Everything driver-specific — the driver import and the default
72
+ * connection-pool construction — lives in the concrete subclass, which passes a
73
+ * `poolFactory` to this constructor; the base itself carries no driver dependency.
74
+ *
75
+ * **Endpoint assumption.** `capabilities()` reports `readAfterWrite:
76
+ * 'linearizable'`, which holds for the **primary** endpoint. A read-replica
77
+ * connection string would violate that guarantee — point this adapter at the
78
+ * primary.
79
+ *
80
+ * @see {@link PostgresStorage} for the native `pg` adapter and {@link NeonStorage}
81
+ * for the Neon serverless adapter.
82
+ */
83
+ export declare class PostgresKeyValueStorage implements Storage {
84
+ #private;
85
+ /**
86
+ * @param options Connection configuration ({@link PostgresKeyValueStorageOptions}).
87
+ * @param poolFactory Constructs the owned pool from `url`. Required — the
88
+ * concrete subclass injects its driver's pool constructor here (lazily loaded)
89
+ * so the base module never imports a driver. Used only when no `pool` is
90
+ * supplied; an injected `pool` stays caller-owned. Throws if neither `pool`
91
+ * nor `url` is provided.
92
+ */
93
+ constructor(options: PostgresKeyValueStorageOptions, poolFactory: (url: string) => PostgresPool);
94
+ capabilities(): StorageCapabilities;
95
+ get(key: string): Promise<Uint8Array | null>;
96
+ put(key: string, value: Uint8Array): Promise<void>;
97
+ delete(key: string): Promise<void>;
98
+ has(key: string): Promise<boolean>;
99
+ deletePrefix(prefix: string): Promise<number>;
100
+ deleteRange(prefix: string, options: DeleteRangeOptions): Promise<number>;
101
+ scan(prefix: string, options?: ScanOptions): AsyncIterable<[string, Uint8Array]>;
102
+ keys(prefix: string, options?: ScanOptions): AsyncIterable<string>;
103
+ count(prefix: string): Promise<number>;
104
+ scoped(prefix: string): Storage;
105
+ batch(operations: BatchOperation[]): Promise<void>;
106
+ conditionalBatch(conditions: ConditionalBatchCondition[], operations: BatchOperation[]): Promise<boolean>;
107
+ query<T>(sql: string, parameters?: unknown[]): Promise<T[]>;
108
+ [Symbol.dispose](): void;
109
+ [Symbol.asyncDispose](): Promise<void>;
110
+ }
@@ -0,0 +1,204 @@
1
+ import { normalizeDeleteRangeOptions } from "./delete-range.js";
2
+ import {
3
+ assertStorageBatchOperationCount
4
+ } from "./interface.js";
5
+ import { conditionsHold, writeBatchNetEffect } from "./neon-batch.js";
6
+ import {
7
+ affectedRowCount,
8
+ resolveBatchNetEffect,
9
+ toBytea,
10
+ toStorageValue
11
+ } from "./neon-value-mapping.js";
12
+ import {
13
+ buildPostgresCreateSchema,
14
+ buildPostgresKeyValueQueries,
15
+ buildPostgresPrefixRangeParameters,
16
+ PG_BEGIN_READ_COMMITTED,
17
+ PG_BEGIN_READ_ONLY,
18
+ PG_BEGIN_SERIALIZABLE,
19
+ PG_COMMIT,
20
+ PG_ROLLBACK,
21
+ resolvePostgresTableReference
22
+ } from "./postgres-key-value-queries.js";
23
+ import { assertReadOnlyQuery } from "./read-only-query.js";
24
+ import { scopedStorage } from "./scoped-storage.js";
25
+ const RETRYABLE_TRANSACTION_FAILURES = new Set(["40001", "40P01"]), MAX_SERIALIZATION_RETRIES = 5;
26
+ function isRetryableTransactionFailure(error) {
27
+ if (typeof error !== "object" || error === null || !("code" in error))
28
+ return !1;
29
+ const code = error.code;
30
+ return typeof code === "string" && RETRYABLE_TRANSACTION_FAILURES.has(code);
31
+ }
32
+
33
+ export class PostgresKeyValueStorage {
34
+ #pool;
35
+ #queries;
36
+ #schema;
37
+ #initializationPromise;
38
+ #ownsPool;
39
+ #poolShutdown;
40
+ constructor(options, poolFactory) {
41
+ this.#ownsPool = options.pool === void 0;
42
+ if (options.pool === void 0) {
43
+ if (options.url === void 0)
44
+ throw Error("PostgresKeyValueStorage requires either a `url` to build a pool from, or a pre-built `pool`; neither was provided.");
45
+ this.#pool = poolFactory(options.url);
46
+ } else
47
+ this.#pool = options.pool;
48
+ this.#schema = options.schema;
49
+ const tableReference = resolvePostgresTableReference({
50
+ schema: options.schema,
51
+ table: options.table
52
+ });
53
+ this.#queries = buildPostgresKeyValueQueries(tableReference);
54
+ }
55
+ capabilities() {
56
+ return {
57
+ persistence: "remote",
58
+ readAfterWrite: "linearizable",
59
+ scanConsistency: "snapshot",
60
+ atomicBatch: !0,
61
+ conditionalBatch: !0,
62
+ boundedRangeDelete: !0
63
+ };
64
+ }
65
+ #ensureTable() {
66
+ this.#initializationPromise ??= this.#initialize().catch((error) => {
67
+ this.#initializationPromise = void 0;
68
+ throw error;
69
+ });
70
+ return this.#initializationPromise;
71
+ }
72
+ async#initialize() {
73
+ if (this.#schema !== void 0)
74
+ await this.#pool.query(buildPostgresCreateSchema(this.#schema));
75
+ await this.#pool.query(this.#queries.createTable);
76
+ await this.#assertKeyCollation();
77
+ }
78
+ async#assertKeyCollation() {
79
+ const collation = (await this.#pool.query(this.#queries.selectKeyCollation, [
80
+ this.#queries.tableReference
81
+ ])).rows[0]?.collation;
82
+ if (collation === "C")
83
+ return;
84
+ const found = collation === void 0 ? "no such table" : typeof collation === "string" ? `"${collation}"` : "an unexpected collation value";
85
+ throw Error(`Postgres storage requires the ${this.#queries.tableReference} table's "key" column to use COLLATE "C" (found ${found}). 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.#queries.tableReference} (key TEXT COLLATE "C" PRIMARY KEY, value BYTEA NOT NULL).`);
86
+ }
87
+ async get(key) {
88
+ await this.#ensureTable();
89
+ const row = (await this.#pool.query(this.#queries.selectValueByKey, [key])).rows[0];
90
+ if (row === void 0)
91
+ return null;
92
+ const raw = row.value;
93
+ if (raw === null || raw === void 0)
94
+ return null;
95
+ return toStorageValue(raw);
96
+ }
97
+ async put(key, value) {
98
+ await this.#ensureTable();
99
+ await this.#pool.query(this.#queries.upsertValueByKey, [key, toBytea(value)]);
100
+ }
101
+ async delete(key) {
102
+ await this.#ensureTable();
103
+ await this.#pool.query(this.#queries.deleteValueByKey, [key]);
104
+ }
105
+ async has(key) {
106
+ await this.#ensureTable();
107
+ return (await this.#pool.query(this.#queries.selectKeyPresence, [key])).rows.length > 0;
108
+ }
109
+ async deletePrefix(prefix) {
110
+ await this.#ensureTable();
111
+ const [rangeStart, rangeEnd] = buildPostgresPrefixRangeParameters(prefix), result = await this.#pool.query(this.#queries.deleteKeysByPrefix, [rangeStart, rangeEnd]);
112
+ return affectedRowCount(result);
113
+ }
114
+ async deleteRange(prefix, options) {
115
+ await this.#ensureTable();
116
+ const normalized = normalizeDeleteRangeOptions(options), { parameters, sql } = this.#queries.keyRangeDelete(prefix, normalized), result = await this.#pool.query(sql, parameters);
117
+ return affectedRowCount(result);
118
+ }
119
+ async* scan(prefix, options = {}) {
120
+ await this.#ensureTable();
121
+ const { parameters, sql } = this.#queries.keyValueRangeSelect(prefix, options), result = await this.#pool.query(sql, parameters);
122
+ for (const row of result.rows)
123
+ yield [row.key, toStorageValue(row.value)];
124
+ }
125
+ async* keys(prefix, options = {}) {
126
+ await this.#ensureTable();
127
+ const { parameters, sql } = this.#queries.keyRangeSelect(prefix, options), result = await this.#pool.query(sql, parameters);
128
+ for (const row of result.rows)
129
+ yield row.key;
130
+ }
131
+ async count(prefix) {
132
+ await this.#ensureTable();
133
+ const [rangeStart, rangeEnd] = buildPostgresPrefixRangeParameters(prefix), result = await this.#pool.query(this.#queries.countKeysByPrefix, [rangeStart, rangeEnd]);
134
+ return Number(result.rows[0]?.count ?? 0);
135
+ }
136
+ scoped(prefix) {
137
+ return scopedStorage(this, prefix);
138
+ }
139
+ async#withTransaction(beginStatement, runner, shouldCommit = () => !0) {
140
+ const client = await this.#pool.connect();
141
+ try {
142
+ await client.query(beginStatement);
143
+ try {
144
+ const result = await runner(client);
145
+ await client.query(shouldCommit(result) ? PG_COMMIT : PG_ROLLBACK);
146
+ return result;
147
+ } catch (error) {
148
+ await client.query(PG_ROLLBACK).catch(() => {});
149
+ throw error;
150
+ }
151
+ } finally {
152
+ client.release();
153
+ }
154
+ }
155
+ async batch(operations) {
156
+ assertStorageBatchOperationCount("batch operations", operations.length);
157
+ if (operations.length === 0)
158
+ return;
159
+ await this.#ensureTable();
160
+ await this.#withTransaction(PG_BEGIN_READ_COMMITTED, async (client) => {
161
+ await writeBatchNetEffect(client, this.#queries, resolveBatchNetEffect(operations));
162
+ });
163
+ }
164
+ async conditionalBatch(conditions, operations) {
165
+ assertStorageBatchOperationCount("conditionalBatch conditions", conditions.length);
166
+ assertStorageBatchOperationCount("conditionalBatch operations", operations.length);
167
+ await this.#ensureTable();
168
+ const netEffect = resolveBatchNetEffect(operations);
169
+ let lastError;
170
+ for (let attempt = 0;attempt < MAX_SERIALIZATION_RETRIES; attempt += 1)
171
+ try {
172
+ return await this.#withTransaction(PG_BEGIN_SERIALIZABLE, async (client) => {
173
+ if (!await conditionsHold(client, this.#queries, conditions))
174
+ return !1;
175
+ await writeBatchNetEffect(client, this.#queries, netEffect);
176
+ return !0;
177
+ }, (committed) => committed);
178
+ } catch (error) {
179
+ if (!isRetryableTransactionFailure(error))
180
+ throw error;
181
+ lastError = error;
182
+ }
183
+ throw Error(`conditionalBatch exhausted ${MAX_SERIALIZATION_RETRIES} attempts after retryable transaction failures`, { cause: lastError });
184
+ }
185
+ async query(sql, parameters) {
186
+ await this.#ensureTable();
187
+ assertReadOnlyQuery(sql);
188
+ return this.#withTransaction(PG_BEGIN_READ_ONLY, async (client) => {
189
+ return (await client.query(sql, parameters ?? [])).rows;
190
+ });
191
+ }
192
+ #endPoolOnce() {
193
+ if (!this.#ownsPool)
194
+ return Promise.resolve();
195
+ this.#poolShutdown ??= this.#pool.end();
196
+ return this.#poolShutdown;
197
+ }
198
+ [Symbol.dispose]() {
199
+ this.#endPoolOnce().catch(() => {});
200
+ }
201
+ async[Symbol.asyncDispose]() {
202
+ await this.#endPoolOnce();
203
+ }
204
+ }
@@ -0,0 +1,59 @@
1
+ import { PostgresKeyValueStorage, type PostgresKeyValueStorageOptions, type PostgresPool, type PostgresPoolClient } from './postgres-key-value-storage.ts';
2
+ export type { PostgresPool, PostgresPoolClient };
3
+ /**
4
+ * Configuration for connecting to a standard Postgres database over the ordinary
5
+ * wire protocol via the `pg` (node-postgres) driver. Alias of the shared
6
+ * {@link PostgresKeyValueStorageOptions}; `url` is optional and required only when
7
+ * no `pool` is supplied.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { PostgresStorage, type PostgresStorageOptions } from '@lostgradient/weft/storage/postgres';
12
+ *
13
+ * const options: PostgresStorageOptions = {
14
+ * url: 'postgresql://user:password@localhost:5432/weft',
15
+ * };
16
+ * await using storage = new PostgresStorage(options);
17
+ * ```
18
+ */
19
+ export type PostgresStorageOptions = PostgresKeyValueStorageOptions;
20
+ /**
21
+ * Storage adapter backed by a standard Postgres server over the ordinary wire
22
+ * protocol via the `pg` (node-postgres) driver. A thin
23
+ * {@link PostgresKeyValueStorage} subclass whose only job is to supply the `pg`
24
+ * default pool factory; all storage behavior (SQL, value mapping,
25
+ * transactions/retry, schema/table qualification) lives in the driver-agnostic
26
+ * base. Implements the same `Storage` interface as the SQLite adapters over a
27
+ * single `kv(key TEXT COLLATE "C", value BYTEA)` table.
28
+ *
29
+ * Use this instead of {@link NeonStorage} when connecting to a self-hosted or
30
+ * managed Postgres over TCP — including sharing the same database as your
31
+ * application's tables by pointing `schema` at a dedicated Weft schema. The Neon
32
+ * serverless (WebSocket) driver is not required and never imported.
33
+ *
34
+ * **Endpoint assumption.** `capabilities()` reports `readAfterWrite:
35
+ * 'linearizable'`, which holds for the **primary** endpoint. A read-replica
36
+ * connection string would violate that guarantee — point this adapter at the
37
+ * primary.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * import { PostgresStorage } from '@lostgradient/weft/storage/postgres';
42
+ * import { Engine } from '@lostgradient/weft';
43
+ *
44
+ * await using storage = new PostgresStorage({
45
+ * url: process.env['DATABASE_URL']!,
46
+ * });
47
+ * await using engine = new Engine({ storage });
48
+ * ```
49
+ */
50
+ export declare class PostgresStorage extends PostgresKeyValueStorage {
51
+ /**
52
+ * @param options Connection configuration ({@link PostgresStorageOptions}).
53
+ * @param poolFactory Internal seam for constructing the owned pool from `url`.
54
+ * Defaults to lazily importing the real `pg` `Pool`; tests inject a fake to
55
+ * exercise owned-pool teardown without a network. Used only when no `pool` is
56
+ * supplied; an injected `pool` stays caller-owned.
57
+ */
58
+ constructor(options: PostgresStorageOptions, poolFactory?: (url: string) => PostgresPool);
59
+ }
@@ -0,0 +1,15 @@
1
+ // @bun
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 v(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 R(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 v(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 R(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 j(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(j($));await W.query(X.upsertValuesByKeys,[_,G])}if(Y.deletes.size>0)await W.query(X.deleteValuesByKeys,[[...Y.deletes]])}var l=/^[a-z_][a-z0-9_]*$/i;function p(W,X,Y){if(!l.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 ${l.source}).`)}var a="kv";function z(W,X){p(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 E(W){return[W,x(W)]}function i(W,X){let{gt:Y,gte:_,lt:G,lte:Z}=X,$=E(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
+ key TEXT COLLATE "C" PRIMARY KEY,
4
+ value BYTEA NOT NULL
5
+ )`,Y=`
6
+ SELECT COALESCE(co.collname, 'default') AS collation
7
+ FROM pg_attribute a
8
+ LEFT JOIN pg_collation co ON co.oid = a.attcollation
9
+ WHERE a.attrelid = to_regclass($1) AND a.attname = 'key' AND a.attnum > 0
10
+ `;return{tableReference:W,createTable:X,selectKeyCollation:`
11
+ SELECT COALESCE(co.collname, 'default') AS collation
12
+ FROM pg_attribute a
13
+ LEFT JOIN pg_collation co ON co.oid = a.attcollation
14
+ WHERE a.attrelid = to_regclass($1) AND a.attname = 'key' AND a.attnum > 0
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,jW=/^PRAGMA\s+(?:[A-Z_][A-Z0-9_]*\.)?[A-Z_][A-Z0-9_]*\s*$/iu,EW=/^SELECT\b/iu;function BW(W){return W.trim().replace(/;+\s*$/u,"").trim()}function LW(W){return jW.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(EW.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,j(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]=E(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]=E(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:"pg",storageName:"PostgresStorage",loadPool:(X)=>import("pg").then(({default:Y})=>new Y.Pool({connectionString:X}))})}class NW extends T{constructor(W,X=AW){super(W,X)}}export{NW as PostgresStorage};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var e=Object.defineProperty;var o=(F)=>F;function FF(F,Y){this[F]=o.bind(null,Y)}var YF=(F,Y)=>{for(var J in Y)e(F,J,{get:Y[J],enumerable:!0,configurable:!0,set:FF.bind(Y,J)})};var q=(F,Y)=>()=>(F&&(Y=F(F=0)),Y);var hF=import.meta.require,bF=(F,Y,J)=>{if(Y!=null){if(typeof Y!=="object"&&typeof Y!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let $;if(J)$=Y[Symbol.asyncDispose];if($===void 0)$=Y[Symbol.dispose];if(typeof $!=="function")throw TypeError("Object not disposable");F.push([J,$,Y])}else if(J)F.push([J]);return Y},OF=(F,Y,J)=>{let $=(W)=>Y=J?new SuppressedError(W,Y,"An error was suppressed during disposal"):(J=!0,W),X=(W)=>{while(W=F.pop())try{var V=W[1]&&W[1].call(W[2]);if(W[0])return Promise.resolve(V).then(X,(j)=>($(j),X()))}catch(j){$(j)}if(J)throw Y};return X()};function A(F,Y,J){if(!F.capabilities()[Y])throw Error(`Feature "${J}" requires storage capability "${Y}", but this storage backend does not provide it.`)}function JF(F){let Y=F.capabilities(),J=[];if(Y.persistence!=="local"&&Y.persistence!=="remote")J.push(`persistence must be "local" or "remote" (got "${Y.persistence}")`);if(Y.readAfterWrite!=="linearizable")J.push(`readAfterWrite must be "linearizable" (got "${Y.readAfterWrite}")`);if(Y.scanConsistency!=="snapshot")J.push(`scanConsistency must be "snapshot" (got "${Y.scanConsistency}")`);if(!Y.atomicBatch)J.push("atomicBatch must be true");if(!Y.conditionalBatch)J.push("conditionalBatch must be true");if(J.length>0)throw Error(`Storage is not durable enough for recovery: ${J.join("; ")}.`)}var T="default";async function O(F,Y){return await F.get(Y)!==null}async function*L(F,Y,J){for await(let[$]of F.scan(Y,J))yield $}async function v(F,Y){let J=0;for await(let $ of L(F,Y))J++;return J}async function S(F,Y){let J=[];for await(let $ of L(F,Y))J.push({type:"delete",key:$});if(J.length===0)return 0;return await F.batch(J),J.length}async function m(F,Y,J){let $=[];for await(let X of L(F,Y,J))$.push({type:"delete",key:X});if($.length===0)return 0;return await F.batch($),$.length}var ZF;var x=q(()=>{ZF=["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(F,Y){if(Y>N)throw new y(F,Y)}function _(F){return F.length>0?F.slice(0,-1)+String.fromCharCode(F.charCodeAt(F.length-1)+1):"\xFF"}function P(F,Y={}){if(Y.gt!==void 0&&F<=Y.gt)return!1;if(Y.gte!==void 0&&F<Y.gte)return!1;if(Y.lt!==void 0&&F>=Y.lt)return!1;if(Y.lte!==void 0&&F>Y.lte)return!1;return!0}function w(F,Y){if(F===null||Y===null)return F===Y;if(F.byteLength!==Y.byteLength)return!1;for(let J=0;J<F.byteLength;J++)if(F[J]!==Y[J])return!1;return!0}async function c(F,Y){if(F.has)return F.has(Y);return O(F,Y)}function k(F,Y,J){if(F.keys)return F.keys(Y,J);return L(F,Y,J)}async function u(F,Y){if(F.count)return F.count(Y);return v(F,Y)}async function g(F,Y){if(F.deletePrefix)return F.deletePrefix(Y);return S(F,Y)}async function uF(F,Y){G("batch operations",Y.length),await F.batch(Y)}async function l(F,Y,J){if(G("conditionalBatch conditions",Y.length),G("conditionalBatch operations",J.length),A(F,"conditionalBatch","storageConditionalBatch"),!F.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return F.conditionalBatch(Y,J)}function Z(F){return encodeURIComponent(F)}function gF(F){return decodeURIComponent(F)}function lF(F){try{return decodeURIComponent(F)}catch{return null}}var N=1e4,kF=1e4,y,Q=(F)=>String(F).padStart(16,"0"),$F="0",WF="1",I=(F,Y,J,$)=>`sig:${Z(F)}:${Z(Y)}:${$}:${Z(J)}`,fF;var E=q(()=>{x();y=class y extends Error{code="StorageBatchOperationLimitExceededError";cap=N;count;target;constructor(F,Y){super(`${F} count ${Y} exceeds MAX_BATCH_OPERATIONS (${N}).`);this.name="StorageBatchOperationLimitExceededError",this.target=F,this.count=Y}};fF={workflow:(F)=>`wf:${Z(F)}`,checkpoint:(F)=>`wf:${Z(F)}:ckpt`,checkpointHistory:(F,Y)=>`wf:${Z(F)}:ckpt:${String(Y).padStart(10,"0")}`,timelinePrefix:(F)=>`wf:${Z(F)}:timeline:`,timeline:(F,Y)=>`wf:${Z(F)}:timeline:${String(Y).padStart(10,"0")}`,schedule:(F)=>`schedule:${Z(F)}`,scheduleTick:(F,Y)=>`schedule-due:${String(F).padStart(16,"0")}:${Z(Y)}`,scheduleRun:(F)=>`schedule-run:${Z(F)}`,operation:(F,Y,J)=>`op:${F}:${Q(Y)}:${J}`,operationInflight:(F)=>`op:inflight:${F}`,operationQueued:(F)=>`op:queued:${F}`,operationResolved:(F)=>`op:resolved:${F}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(F)=>`op:dead-letter:${F}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(F,Y,J)=>`audit:bulk:${Q(F)}:${Z(Y)}:${Z(J)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(F,Y)=>`op:resolved-by-time:${Q(F)}:${Z(Y)}`,asyncActivity:(F,Y)=>`async-act:v1:${Z(F)}:${Z(Y)}`,asyncActivityResolution:(F,Y)=>`async-act:v1:${Z(F)}:${Z(Y)}:resolution`,activityReconciliationPrefix:(F)=>`actrec:v1:${Z(F)}:`,activityReconciliation:(F,Y,J)=>`actrec:v1:${Z(F)}:${Z(Y)}:${J}`,eventPrefix:(F)=>`ev:${Z(F)}:`,event:(F,Y)=>`ev:${Z(F)}:${String(Y).padStart(10,"0")}`,eventHead:(F)=>`ev:${Z(F)}:head`,eventWatermark:(F)=>`ev:${Z(F)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(F)=>`fleet-event:${String(F).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(F)=>`fleet-event-by-workflow:${Z(F)}:`,fleetEventByWorkflow:(F,Y)=>`fleet-event-by-workflow:${Z(F)}:${String(Y).padStart(10,"0")}`,signal:(F,Y,J)=>I(F,Y,J,WF),startSignal:(F,Y,J)=>I(F,Y,J,$F),signalSequence:(F)=>`sigseq:v1:${Z(F)}`,signalAcceptedResponsePrefix:(F)=>`sigres:v1:${Z(F)}:`,signalAcceptedResponse:(F,Y,J)=>`sigres:v1:${Z(F)}:${Z(Y)}:${Z(J)}`,deadline:(F,Y)=>`wf-deadline:${Q(F)}:${Z(Y)}`,terminalCleanup:(F,Y)=>`wf-cleanup:${Q(F)}:${Z(Y)}`,teardownTimer:(F,Y)=>`wf-teardown:${Q(F)}:${Z(Y)}`,delayedStart:(F,Y)=>`wf-delayed:${Q(F)}:${Z(Y)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(F,Y)=>`wf-terminal:${Q(F)}:${Z(Y)}`,attribute:(F)=>`attr:${Z(F)}`,attributeIndex:(F,Y,J)=>`idx:${F}:${Y}:${Z(J)}`,tagIndex:(F,Y)=>`tag:${Z(F)}:${Z(Y)}`,updatePrefix:(F)=>`upd:${Z(F)}:`,update:(F,Y)=>`upd:${Z(F)}:${Y}`,updateResponse:(F)=>`upr:${F}`,updateIdempotency:(F,Y)=>`upk:${Z(F)}:${Y}`,startIdempotency:(F)=>`start-idem:${Z(F)}`,startIdempotencySignalId:(F)=>`start-idem:${F}`,livenessPrefix:()=>"liveness:",liveness:(F)=>`liveness:${Z(F)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(F,Y,J)=>`budget:${F}:${Y}:${J}`,review:(F,Y)=>`review:${Z(F)}:${Y}`,workflowHeaders:(F)=>`wf-headers:${Z(F)}`,childCancellationPrefix:(F)=>`child-cancel:${Z(F)}:`,childCancellation:(F,Y)=>`child-cancel:${Z(F)}:${Z(Y)}`,terminalCleanupNeeded:(F)=>`wf-cleanup-needed:${Z(F)}`,workflowConcurrency:(F,Y)=>`wf-concurrency:${Z(F)}:${Z(Y)}`,workflowConcurrencyHolder:(F)=>`wf-concurrency-holder:${Z(F)}`,workflowHasServices:(F)=>`wf-has-services:${Z(F)}`,finalizerState:(F)=>`wf-finalizer-state:${Z(F)}`,teardownOwed:(F)=>`wf-teardown-needed:${Z(F)}`,teardownDeadLetter:(F)=>`wf-teardown-deadletter:${Z(F)}`,offload:(F,Y)=>`offload:${Z(F)}:${Y}`,archive:(F,Y)=>`archive:${Z(F)}:${Y}`,stateExecution:(F,Y)=>`state:execution:${Z(F)}:${Z(Y)}`,stateWorkflow:(F,Y)=>`state:workflow-scope:${T}:${Z(F)}:${Z(Y)}`,streamChunkPrefix:(F,Y)=>`blob:${Z(F)}:${Y}:chunk:`,streamChunk:(F,Y,J)=>`blob:${Z(F)}:${Y}:chunk:${String(J).padStart(10,"0")}`,streamTail:(F,Y)=>`blob:${Z(F)}:${Y}:tail`,streamMetadata:(F,Y)=>`blob:${Z(F)}:${Y}:meta`,budgetCharged:(F)=>`budget-charged:${F}`,toolEffect:(F,Y,J)=>`tool-effect:${Z(F)}:${Y}:${J}`,workflowVisibilityStatus:(F,Y)=>`wf-idx-status:${Z(F)}:${Z(Y)}`,workflowVisibilityType:(F,Y)=>`wf-idx-type:${Z(F)}:${Z(Y)}`,workflowVisibilityCreated:(F,Y)=>`wf-idx-created:${Q(F)}:${Z(Y)}`,workflowVisibilityUpdated:(F,Y)=>`wf-idx-updated:${Q(F)}:${Z(Y)}`,workflowVisibilityDeadline:(F,Y)=>`wf-idx-deadline:${Q(F)}:${Z(Y)}`,workflowVisibilityManifest:(F)=>`wf-idx-manifest:${Z(F)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function XF(F){if(F===void 0)return;if(typeof F!=="number"||!Number.isInteger(F)||F<0)throw Error("deleteRange limit must be a finite non-negative integer");return F===0?0:F}function z(F){let Y={},J=!1;for(let X of["gt","gte","lt","lte"]){let W=F[X];if(W===void 0)continue;if(typeof W!=="string")throw Error("deleteRange bounds must be strings");Y[X]=W,J=!0}if(!J)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let $=XF(F.limit);if($!==void 0)Y.limit=$;return Y}async function f(F,Y,J){let $=z(J);if(F.deleteRange)return F.deleteRange(Y,$);return m(F,Y,$)}var K=()=>{};function D(F){return F.replaceAll(/:+$/g,"")}function jF(F,Y){let J=D(F),$=D(Y);if(J.length===0)return $;if($.length===0)return J;return`${J}:${$}`}function d(F,Y){return new R(F,Y)}var R;var p=q(()=>{K();E();R=class R{#F;#J;constructor(F,Y){this.#F=F,this.#J=D(Y)}#Y(F){if(this.#J.length===0)return F;return F.length===0?`${this.#J}:`:`${this.#J}:${F}`}#Z(F){if(this.#J.length===0)return F;return F.slice(this.#J.length+1)}#$(F={}){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.reverse!==void 0)Y.reverse=F.reverse;if(F.gt!==void 0)Y.gt=this.#Y(F.gt);if(F.gte!==void 0)Y.gte=this.#Y(F.gte);if(F.lt!==void 0)Y.lt=this.#Y(F.lt);if(F.lte!==void 0)Y.lte=this.#Y(F.lte);return Y}#W(F){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.gt!==void 0)Y.gt=this.#Y(F.gt);if(F.gte!==void 0)Y.gte=this.#Y(F.gte);if(F.lt!==void 0)Y.lt=this.#Y(F.lt);if(F.lte!==void 0)Y.lte=this.#Y(F.lte);return Y}capabilities(){return this.#F.capabilities()}scoped(F){return new R(this.#F,jF(this.#J,F))}async get(F){return this.#F.get(this.#Y(F))}async put(F,Y){await this.#F.put(this.#Y(F),Y)}async delete(F){await this.#F.delete(this.#Y(F))}async*scan(F,Y){for await(let[J,$]of this.#F.scan(this.#Y(F),this.#$(Y)))yield[this.#Z(J),$]}async batch(F){G("batch operations",F.length),await this.#F.batch(F.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 conditionalBatch(F,Y){return l(this.#F,F.map((J)=>({key:this.#Y(J.key),expectedValue:J.expectedValue})),Y.map((J)=>{if(J.type==="put")return{type:"put",key:this.#Y(J.key),value:J.value};return{type:"delete",key:this.#Y(J.key)}}))}async has(F){return c(this.#F,this.#Y(F))}async deletePrefix(F){return g(this.#F,this.#Y(F))}async deleteRange(F,Y){let J=this.#W(z(Y));return f(this.#F,this.#Y(F),J)}async*keys(F,Y){for await(let J of k(this.#F,this.#Y(F),this.#$(Y)))yield this.#Z(J)}async count(F){return u(this.#F,this.#Y(F))}[Symbol.dispose](){this.#F[Symbol.dispose]()}}});var VF={};YF(VF,{MemoryStorage:()=>B});var B;var s=q(()=>{K();E();p();B=class B{#F;constructor(){this.#F=new Map}capabilities(){return{persistence:"ephemeral",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#J(F,Y,J){return F>=Y&&F<J}#Y(F,Y){let J=[];for(let $ of this.#F.keys())if(this.#J($,F,Y))J.push($);return J.toSorted()}async get(F){return this.#F.get(F)??null}async put(F,Y){this.#F.set(F,Y)}async delete(F){this.#F.delete(F)}async*scan(F,Y={}){let{limit:J,reverse:$}=Y,X=_(F),W=this.#Y(F,X);if(W=W.filter((j)=>P(j,Y)),$)W.reverse();let V=0;for(let j of W){if(J!==void 0&&V>=J)break;let b=this.#F.get(j);if(b!==void 0)yield[j,b],V++}}async batch(F){G("batch operations",F.length),this.#Z(F)}#Z(F){for(let Y of F)if(Y.type==="put")this.#F.set(Y.key,Y.value);else this.#F.delete(Y.key)}async conditionalBatch(F,Y){G("conditionalBatch conditions",F.length),G("conditionalBatch operations",Y.length);for(let J of F){let $=this.#F.get(J.key)??null;if(!w($,J.expectedValue))return!1}return this.#Z(Y),!0}async has(F){return this.#F.has(F)}async deletePrefix(F){let Y=_(F),J=this.#Y(F,Y);for(let $ of J)this.#F.delete($);return J.length}async deleteRange(F,Y){let J=z(Y),$=_(F),X=this.#Y(F,$).filter((V)=>P(V,J)),W=J.limit===void 0?X:X.slice(0,J.limit);for(let V of W)this.#F.delete(V);return W.length}async*keys(F,Y={}){let{limit:J,reverse:$}=Y,X=_(F),W=this.#Y(F,X);if(W=W.filter((j)=>P(j,Y)),$)W.reverse();let V=0;for(let j of W){if(J!==void 0&&V>=J)break;yield j,V++}}async count(F){let Y=_(F);return this.#Y(F,Y).length}scoped(F){return d(this,F)}get size(){return this.#F.size}clear(){this.#F.clear()}snapshot(){let F=new Map;for(let[Y,J]of this.#F)F.set(Y,new Uint8Array(J));return F}[Symbol.dispose](){this.#F.clear()}}});s();function U(F,Y){return import.meta.url.endsWith(".ts")?F:Y}async function H(F){return await import(F)}var QF=U("./bun-sql.ts","./bun-sql.js"),HF=U("./node-sqlite.ts","./node-sqlite.js"),GF=U("./lmdb.ts","./lmdb.js"),UF=U("./turso.ts","./turso.js"),_F=U("./neon.ts","./neon.js"),a=U("./indexeddb.ts","./indexeddb.js"),n=U("./web-extension.ts","./web-extension.js"),qF=U("./http.ts","./http.js"),CF=U("./auto.ts","./auto.js");function t(){return typeof Bun<"u"}function r(){return typeof globalThis.process==="object"&&globalThis.process!==null&&typeof globalThis.process.versions==="object"&&typeof globalThis.process.versions.node==="string"}function LF(){let F=globalThis;return F.browser?.storage!==void 0||F.chrome?.storage!==void 0}function zF(){return typeof globalThis.indexedDB<"u"}async function BF(F){if(t()){let{BunSQLiteStorage:Y}=await H(QF);return new Y(F)}if(r()){let{NodeSQLiteStorage:Y}=await H(HF);return new Y(F)}throw Error("SQLite storage is only available in Bun or Node runtimes.")}async function PF(){if(t()||r()){let{resolveDefaultStorage:F}=await H(CF);return F()}if(LF()){let{WebExtensionStorage:F}=await H(n);return new F}if(zF()){let{IndexedDBStorage:F}=await H(a);return new F}return new B}var i={memory:async(F)=>new B,sqlite:async(F)=>BF(F.path),lmdb:async(F)=>{let{LMDBStorage:Y}=await H(GF);return new Y(F.path)},turso:async(F)=>{let{TursoStorage:Y}=await H(UF);return new Y({url:F.url,...F.authToken===void 0?{}:{authToken:F.authToken}})},neon:async(F)=>{let{NeonStorage:Y}=await H(_F);return new Y({url:F.url})},indexeddb:async(F)=>{let{IndexedDBStorage:Y}=await H(a);return new Y(F.databaseName)},"web-extension":async(F)=>{let{WebExtensionStorage:Y}=await H(n);return new Y(F.area===void 0?{}:{area:F.area})},http:async(F)=>{let{HTTPStorage:Y}=await H(qF);return new Y({baseUrl:F.baseUrl,...F.headers===void 0?{}:{headers:F.headers}})},auto:async(F)=>PF()};function AF(F){if(typeof F!=="object"||F===null)return"unknown";if(!("type"in F))return"unknown";return typeof F.type==="string"?F.type:"unknown"}function TF(F){if(typeof F!=="object"||F===null||Array.isArray(F))throw Error("Storage configuration must be an object.");return F}function M(F,Y,J){let $=F[Y];if(typeof $!=="string"||$.length===0)throw Error(`${J} storage configuration requires "${Y}" as a string.`);return $}function h(F,Y,J){let $=F[Y];if($===void 0)return;if(typeof $!=="string")throw Error(`${J} storage configuration field "${Y}" must be a string.`);return $}function NF(F,Y,J){let $=F[Y];if(typeof $==="string"||$ instanceof URL)return $;throw Error(`${J} storage configuration requires "${Y}" as a string or URL.`)}function EF(F){let Y=F.headers;if(Y===void 0)return;if(typeof Y!=="object"||Y===null||Array.isArray(Y))throw Error('HTTP storage configuration field "headers" must be a string record.');let J={};for(let[$,X]of Object.entries(Y)){if(typeof X!=="string")throw Error('HTTP storage configuration field "headers" must be a string record.');J[$]=X}return J}function KF(F){let Y=F.area;if(Y===void 0)return;if(Y==="local"||Y==="sync"||Y==="session"||Y==="managed")return Y;throw Error('WebExtension storage configuration field "area" must be one of local, sync, session, or managed.')}var DF={memory:(F)=>({type:"memory"}),sqlite:(F)=>{let Y=h(F,"path","SQLite");return Y===void 0?{type:"sqlite"}:{type:"sqlite",path:Y}},lmdb:(F)=>({type:"lmdb",path:M(F,"path","LMDB")}),turso:(F)=>{let Y=h(F,"authToken","Turso");return{type:"turso",url:M(F,"url","Turso"),...Y===void 0?{}:{authToken:Y}}},neon:(F)=>({type:"neon",url:M(F,"url","Neon")}),indexeddb:(F)=>{let Y=h(F,"databaseName","IndexedDB");return Y===void 0?{type:"indexeddb"}:{type:"indexeddb",databaseName:Y}},"web-extension":(F)=>{let Y=KF(F);return Y===void 0?{type:"web-extension"}:{type:"web-extension",area:Y}},http:(F)=>{let Y=EF(F);return{type:"http",baseUrl:NF(F,"baseUrl","HTTP"),...Y===void 0?{}:{headers:Y}}},auto:(F)=>({type:"auto"})};function RF(F,Y){return DF[Y](TF(F))}function MF(F){return Object.hasOwn(i,F)}async function ZY(F){let Y=AF(F);if(!MF(Y))throw Error(`Unsupported storage configuration type: ${Y}`);let J=RF(F,Y),$=i[Y];return $(J)}export{ZY as resolveStorage};
2
+ var LF=import.meta.require,zF=(F,Y,J)=>{if(Y!=null){if(typeof Y!=="object"&&typeof Y!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let $;if(J)$=Y[Symbol.asyncDispose];if($===void 0)$=Y[Symbol.dispose];if(typeof $!=="function")throw TypeError("Object not disposable");F.push([J,$,Y])}else if(J)F.push([J]);return Y},BF=(F,Y,J)=>{let $=(W)=>Y=J?new SuppressedError(W,Y,"An error was suppressed during disposal"):(J=!0,W),X=(W)=>{while(W=F.pop())try{var V=W[1]&&W[1].call(W[2]);if(W[0])return Promise.resolve(V).then(X,(j)=>($(j),X()))}catch(j){$(j)}if(J)throw Y};return X()};function B(F,Y,J){if(!F.capabilities()[Y])throw Error(`Feature "${J}" requires storage capability "${Y}", but this storage backend does not provide it.`)}function p(F){let Y=F.capabilities(),J=[];if(Y.persistence!=="local"&&Y.persistence!=="remote")J.push(`persistence must be "local" or "remote" (got "${Y.persistence}")`);if(Y.readAfterWrite!=="linearizable")J.push(`readAfterWrite must be "linearizable" (got "${Y.readAfterWrite}")`);if(Y.scanConsistency!=="snapshot")J.push(`scanConsistency must be "snapshot" (got "${Y.scanConsistency}")`);if(!Y.atomicBatch)J.push("atomicBatch must be true");if(!Y.conditionalBatch)J.push("conditionalBatch must be true");if(J.length>0)throw Error(`Storage is not durable enough for recovery: ${J.join("; ")}.`)}var P="default";async function R(F,Y){return await F.get(Y)!==null}async function*q(F,Y,J){for await(let[$]of F.scan(Y,J))yield $}async function M(F,Y){let J=0;for await(let $ of q(F,Y))J++;return J}async function h(F,Y){let J=[];for await(let $ of q(F,Y))J.push({type:"delete",key:$});if(J.length===0)return 0;return await F.batch(J),J.length}async function b(F,Y,J){let $=[];for await(let X of q(F,Y,J))$.push({type:"delete",key:X});if($.length===0)return 0;return await F.batch($),$.length}var 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:"];var A=1e4,MF=1e4;class v extends Error{code="StorageBatchOperationLimitExceededError";cap=A;count;target;constructor(F,Y){super(`${F} count ${Y} exceeds MAX_BATCH_OPERATIONS (${A}).`);this.name="StorageBatchOperationLimitExceededError",this.target=F,this.count=Y}}function G(F,Y){if(Y>A)throw new v(F,Y)}function _(F){return F.length>0?F.slice(0,-1)+String.fromCharCode(F.charCodeAt(F.length-1)+1):"\xFF"}function L(F,Y={}){if(Y.gt!==void 0&&F<=Y.gt)return!1;if(Y.gte!==void 0&&F<Y.gte)return!1;if(Y.lt!==void 0&&F>=Y.lt)return!1;if(Y.lte!==void 0&&F>Y.lte)return!1;return!0}function S(F,Y){if(F===null||Y===null)return F===Y;if(F.byteLength!==Y.byteLength)return!1;for(let J=0;J<F.byteLength;J++)if(F[J]!==Y[J])return!1;return!0}async function m(F,Y){if(F.has)return F.has(Y);return R(F,Y)}function x(F,Y,J){if(F.keys)return F.keys(Y,J);return q(F,Y,J)}async function I(F,Y){if(F.count)return F.count(Y);return M(F,Y)}async function y(F,Y){if(F.deletePrefix)return F.deletePrefix(Y);return h(F,Y)}async function hF(F,Y){G("batch operations",Y.length),await F.batch(Y)}async function w(F,Y,J){if(G("conditionalBatch conditions",Y.length),G("conditionalBatch operations",J.length),B(F,"conditionalBatch","storageConditionalBatch"),!F.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return F.conditionalBatch(Y,J)}function Z(F){return encodeURIComponent(F)}function bF(F){return decodeURIComponent(F)}function OF(F){try{return decodeURIComponent(F)}catch{return null}}var Q=(F)=>String(F).padStart(16,"0"),a="0",n="1",O=(F,Y,J,$)=>`sig:${Z(F)}:${Z(Y)}:${$}:${Z(J)}`,vF={workflow:(F)=>`wf:${Z(F)}`,checkpoint:(F)=>`wf:${Z(F)}:ckpt`,checkpointHistory:(F,Y)=>`wf:${Z(F)}:ckpt:${String(Y).padStart(10,"0")}`,timelinePrefix:(F)=>`wf:${Z(F)}:timeline:`,timeline:(F,Y)=>`wf:${Z(F)}:timeline:${String(Y).padStart(10,"0")}`,schedule:(F)=>`schedule:${Z(F)}`,scheduleTick:(F,Y)=>`schedule-due:${String(F).padStart(16,"0")}:${Z(Y)}`,scheduleRun:(F)=>`schedule-run:${Z(F)}`,operation:(F,Y,J)=>`op:${F}:${Q(Y)}:${J}`,operationInflight:(F)=>`op:inflight:${F}`,operationQueued:(F)=>`op:queued:${F}`,operationResolved:(F)=>`op:resolved:${F}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(F)=>`op:dead-letter:${F}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(F,Y,J)=>`audit:bulk:${Q(F)}:${Z(Y)}:${Z(J)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(F,Y)=>`op:resolved-by-time:${Q(F)}:${Z(Y)}`,asyncActivity:(F,Y)=>`async-act:v1:${Z(F)}:${Z(Y)}`,asyncActivityResolution:(F,Y)=>`async-act:v1:${Z(F)}:${Z(Y)}:resolution`,activityReconciliationPrefix:(F)=>`actrec:v1:${Z(F)}:`,activityReconciliation:(F,Y,J)=>`actrec:v1:${Z(F)}:${Z(Y)}:${J}`,eventPrefix:(F)=>`ev:${Z(F)}:`,event:(F,Y)=>`ev:${Z(F)}:${String(Y).padStart(10,"0")}`,eventHead:(F)=>`ev:${Z(F)}:head`,eventWatermark:(F)=>`ev:${Z(F)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(F)=>`fleet-event:${String(F).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(F)=>`fleet-event-by-workflow:${Z(F)}:`,fleetEventByWorkflow:(F,Y)=>`fleet-event-by-workflow:${Z(F)}:${String(Y).padStart(10,"0")}`,signal:(F,Y,J)=>O(F,Y,J,n),startSignal:(F,Y,J)=>O(F,Y,J,a),signalSequence:(F)=>`sigseq:v1:${Z(F)}`,signalAcceptedResponsePrefix:(F)=>`sigres:v1:${Z(F)}:`,signalAcceptedResponse:(F,Y,J)=>`sigres:v1:${Z(F)}:${Z(Y)}:${Z(J)}`,deadline:(F,Y)=>`wf-deadline:${Q(F)}:${Z(Y)}`,terminalCleanup:(F,Y)=>`wf-cleanup:${Q(F)}:${Z(Y)}`,teardownTimer:(F,Y)=>`wf-teardown:${Q(F)}:${Z(Y)}`,delayedStart:(F,Y)=>`wf-delayed:${Q(F)}:${Z(Y)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(F,Y)=>`wf-terminal:${Q(F)}:${Z(Y)}`,attribute:(F)=>`attr:${Z(F)}`,attributeIndex:(F,Y,J)=>`idx:${F}:${Y}:${Z(J)}`,tagIndex:(F,Y)=>`tag:${Z(F)}:${Z(Y)}`,updatePrefix:(F)=>`upd:${Z(F)}:`,update:(F,Y)=>`upd:${Z(F)}:${Y}`,updateResponse:(F)=>`upr:${F}`,updateIdempotency:(F,Y)=>`upk:${Z(F)}:${Y}`,startIdempotency:(F)=>`start-idem:${Z(F)}`,startIdempotencySignalId:(F)=>`start-idem:${F}`,livenessPrefix:()=>"liveness:",liveness:(F)=>`liveness:${Z(F)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(F,Y,J)=>`budget:${F}:${Y}:${J}`,review:(F,Y)=>`review:${Z(F)}:${Y}`,workflowHeaders:(F)=>`wf-headers:${Z(F)}`,childCancellationPrefix:(F)=>`child-cancel:${Z(F)}:`,childCancellation:(F,Y)=>`child-cancel:${Z(F)}:${Z(Y)}`,terminalCleanupNeeded:(F)=>`wf-cleanup-needed:${Z(F)}`,workflowConcurrency:(F,Y)=>`wf-concurrency:${Z(F)}:${Z(Y)}`,workflowConcurrencyHolder:(F)=>`wf-concurrency-holder:${Z(F)}`,workflowHasServices:(F)=>`wf-has-services:${Z(F)}`,finalizerState:(F)=>`wf-finalizer-state:${Z(F)}`,teardownOwed:(F)=>`wf-teardown-needed:${Z(F)}`,teardownDeadLetter:(F)=>`wf-teardown-deadletter:${Z(F)}`,offload:(F,Y)=>`offload:${Z(F)}:${Y}`,archive:(F,Y)=>`archive:${Z(F)}:${Y}`,stateExecution:(F,Y)=>`state:execution:${Z(F)}:${Z(Y)}`,stateWorkflow:(F,Y)=>`state:workflow-scope:${P}:${Z(F)}:${Z(Y)}`,streamChunkPrefix:(F,Y)=>`blob:${Z(F)}:${Y}:chunk:`,streamChunk:(F,Y,J)=>`blob:${Z(F)}:${Y}:chunk:${String(J).padStart(10,"0")}`,streamTail:(F,Y)=>`blob:${Z(F)}:${Y}:tail`,streamMetadata:(F,Y)=>`blob:${Z(F)}:${Y}:meta`,budgetCharged:(F)=>`budget-charged:${F}`,toolEffect:(F,Y,J)=>`tool-effect:${Z(F)}:${Y}:${J}`,workflowVisibilityStatus:(F,Y)=>`wf-idx-status:${Z(F)}:${Z(Y)}`,workflowVisibilityType:(F,Y)=>`wf-idx-type:${Z(F)}:${Z(Y)}`,workflowVisibilityCreated:(F,Y)=>`wf-idx-created:${Q(F)}:${Z(Y)}`,workflowVisibilityUpdated:(F,Y)=>`wf-idx-updated:${Q(F)}:${Z(Y)}`,workflowVisibilityDeadline:(F,Y)=>`wf-idx-deadline:${Q(F)}:${Z(Y)}`,workflowVisibilityManifest:(F)=>`wf-idx-manifest:${Z(F)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function t(F){if(F===void 0)return;if(typeof F!=="number"||!Number.isInteger(F)||F<0)throw Error("deleteRange limit must be a finite non-negative integer");return F===0?0:F}function C(F){let Y={},J=!1;for(let X of["gt","gte","lt","lte"]){let W=F[X];if(W===void 0)continue;if(typeof W!=="string")throw Error("deleteRange bounds must be strings");Y[X]=W,J=!0}if(!J)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let $=t(F.limit);if($!==void 0)Y.limit=$;return Y}async function c(F,Y,J){let $=C(J);if(F.deleteRange)return F.deleteRange(Y,$);return b(F,Y,$)}function T(F){return F.replaceAll(/:+$/g,"")}function r(F,Y){let J=T(F),$=T(Y);if(J.length===0)return $;if($.length===0)return J;return`${J}:${$}`}class N{#F;#J;constructor(F,Y){this.#F=F,this.#J=T(Y)}#Y(F){if(this.#J.length===0)return F;return F.length===0?`${this.#J}:`:`${this.#J}:${F}`}#Z(F){if(this.#J.length===0)return F;return F.slice(this.#J.length+1)}#$(F={}){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.reverse!==void 0)Y.reverse=F.reverse;if(F.gt!==void 0)Y.gt=this.#Y(F.gt);if(F.gte!==void 0)Y.gte=this.#Y(F.gte);if(F.lt!==void 0)Y.lt=this.#Y(F.lt);if(F.lte!==void 0)Y.lte=this.#Y(F.lte);return Y}#W(F){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.gt!==void 0)Y.gt=this.#Y(F.gt);if(F.gte!==void 0)Y.gte=this.#Y(F.gte);if(F.lt!==void 0)Y.lt=this.#Y(F.lt);if(F.lte!==void 0)Y.lte=this.#Y(F.lte);return Y}capabilities(){return this.#F.capabilities()}scoped(F){return new N(this.#F,r(this.#J,F))}async get(F){return this.#F.get(this.#Y(F))}async put(F,Y){await this.#F.put(this.#Y(F),Y)}async delete(F){await this.#F.delete(this.#Y(F))}async*scan(F,Y){for await(let[J,$]of this.#F.scan(this.#Y(F),this.#$(Y)))yield[this.#Z(J),$]}async batch(F){G("batch operations",F.length),await this.#F.batch(F.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 conditionalBatch(F,Y){return w(this.#F,F.map((J)=>({key:this.#Y(J.key),expectedValue:J.expectedValue})),Y.map((J)=>{if(J.type==="put")return{type:"put",key:this.#Y(J.key),value:J.value};return{type:"delete",key:this.#Y(J.key)}}))}async has(F){return m(this.#F,this.#Y(F))}async deletePrefix(F){return y(this.#F,this.#Y(F))}async deleteRange(F,Y){let J=this.#W(C(Y));return c(this.#F,this.#Y(F),J)}async*keys(F,Y){for await(let J of x(this.#F,this.#Y(F),this.#$(Y)))yield this.#Z(J)}async count(F){return I(this.#F,this.#Y(F))}[Symbol.dispose](){this.#F[Symbol.dispose]()}}function k(F,Y){return new N(F,Y)}class z{#F;constructor(){this.#F=new Map}capabilities(){return{persistence:"ephemeral",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#J(F,Y,J){return F>=Y&&F<J}#Y(F,Y){let J=[];for(let $ of this.#F.keys())if(this.#J($,F,Y))J.push($);return J.toSorted()}async get(F){return this.#F.get(F)??null}async put(F,Y){this.#F.set(F,Y)}async delete(F){this.#F.delete(F)}async*scan(F,Y={}){let{limit:J,reverse:$}=Y,X=_(F),W=this.#Y(F,X);if(W=W.filter((j)=>L(j,Y)),$)W.reverse();let V=0;for(let j of W){if(J!==void 0&&V>=J)break;let D=this.#F.get(j);if(D!==void 0)yield[j,D],V++}}async batch(F){G("batch operations",F.length),this.#Z(F)}#Z(F){for(let Y of F)if(Y.type==="put")this.#F.set(Y.key,Y.value);else this.#F.delete(Y.key)}async conditionalBatch(F,Y){G("conditionalBatch conditions",F.length),G("conditionalBatch operations",Y.length);for(let J of F){let $=this.#F.get(J.key)??null;if(!S($,J.expectedValue))return!1}return this.#Z(Y),!0}async has(F){return this.#F.has(F)}async deletePrefix(F){let Y=_(F),J=this.#Y(F,Y);for(let $ of J)this.#F.delete($);return J.length}async deleteRange(F,Y){let J=C(Y),$=_(F),X=this.#Y(F,$).filter((V)=>L(V,J)),W=J.limit===void 0?X:X.slice(0,J.limit);for(let V of W)this.#F.delete(V);return W.length}async*keys(F,Y={}){let{limit:J,reverse:$}=Y,X=_(F),W=this.#Y(F,X);if(W=W.filter((j)=>L(j,Y)),$)W.reverse();let V=0;for(let j of W){if(J!==void 0&&V>=J)break;yield j,V++}}async count(F){let Y=_(F);return this.#Y(F,Y).length}scoped(F){return k(this,F)}get size(){return this.#F.size}clear(){this.#F.clear()}snapshot(){let F=new Map;for(let[Y,J]of this.#F)F.set(Y,new Uint8Array(J));return F}[Symbol.dispose](){this.#F.clear()}}function U(F,Y){return import.meta.url.endsWith(".ts")?F:Y}async function H(F){return await import(F)}var i=U("./bun-sql.ts","./bun-sql.js"),e=U("./node-sqlite.ts","./node-sqlite.js"),o=U("./lmdb.ts","./lmdb.js"),FF=U("./turso.ts","./turso.js"),YF=U("./neon.ts","./neon.js"),u=U("./indexeddb.ts","./indexeddb.js"),g=U("./web-extension.ts","./web-extension.js"),JF=U("./http.ts","./http.js"),ZF=U("./auto.ts","./auto.js");function l(){return typeof Bun<"u"}function f(){return typeof globalThis.process==="object"&&globalThis.process!==null&&typeof globalThis.process.versions==="object"&&typeof globalThis.process.versions.node==="string"}function $F(){let F=globalThis;return F.browser?.storage!==void 0||F.chrome?.storage!==void 0}function WF(){return typeof globalThis.indexedDB<"u"}async function XF(F){if(l()){let{BunSQLiteStorage:Y}=await H(i);return new Y(F)}if(f()){let{NodeSQLiteStorage:Y}=await H(e);return new Y(F)}throw Error("SQLite storage is only available in Bun or Node runtimes.")}async function jF(){if(l()||f()){let{resolveDefaultStorage:F}=await H(ZF);return F()}if($F()){let{WebExtensionStorage:F}=await H(g);return new F}if(WF()){let{IndexedDBStorage:F}=await H(u);return new F}return new z}var d={memory:async(F)=>new z,sqlite:async(F)=>XF(F.path),lmdb:async(F)=>{let{LMDBStorage:Y}=await H(o);return new Y(F.path)},turso:async(F)=>{let{TursoStorage:Y}=await H(FF);return new Y({url:F.url,...F.authToken===void 0?{}:{authToken:F.authToken}})},neon:async(F)=>{let{NeonStorage:Y}=await H(YF);return new Y({url:F.url})},indexeddb:async(F)=>{let{IndexedDBStorage:Y}=await H(u);return new Y(F.databaseName)},"web-extension":async(F)=>{let{WebExtensionStorage:Y}=await H(g);return new Y(F.area===void 0?{}:{area:F.area})},http:async(F)=>{let{HTTPStorage:Y}=await H(JF);return new Y({baseUrl:F.baseUrl,...F.headers===void 0?{}:{headers:F.headers}})},auto:async(F)=>jF()};function VF(F){if(typeof F!=="object"||F===null)return"unknown";if(!("type"in F))return"unknown";return typeof F.type==="string"?F.type:"unknown"}function QF(F){if(typeof F!=="object"||F===null||Array.isArray(F))throw Error("Storage configuration must be an object.");return F}function E(F,Y,J){let $=F[Y];if(typeof $!=="string"||$.length===0)throw Error(`${J} storage configuration requires "${Y}" as a string.`);return $}function K(F,Y,J){let $=F[Y];if($===void 0)return;if(typeof $!=="string")throw Error(`${J} storage configuration field "${Y}" must be a string.`);return $}function HF(F,Y,J){let $=F[Y];if(typeof $==="string"||$ instanceof URL)return $;throw Error(`${J} storage configuration requires "${Y}" as a string or URL.`)}function GF(F){let Y=F.headers;if(Y===void 0)return;if(typeof Y!=="object"||Y===null||Array.isArray(Y))throw Error('HTTP storage configuration field "headers" must be a string record.');let J={};for(let[$,X]of Object.entries(Y)){if(typeof X!=="string")throw Error('HTTP storage configuration field "headers" must be a string record.');J[$]=X}return J}function UF(F){let Y=F.area;if(Y===void 0)return;if(Y==="local"||Y==="sync"||Y==="session"||Y==="managed")return Y;throw Error('WebExtension storage configuration field "area" must be one of local, sync, session, or managed.')}var _F={memory:(F)=>({type:"memory"}),sqlite:(F)=>{let Y=K(F,"path","SQLite");return Y===void 0?{type:"sqlite"}:{type:"sqlite",path:Y}},lmdb:(F)=>({type:"lmdb",path:E(F,"path","LMDB")}),turso:(F)=>{let Y=K(F,"authToken","Turso");return{type:"turso",url:E(F,"url","Turso"),...Y===void 0?{}:{authToken:Y}}},neon:(F)=>({type:"neon",url:E(F,"url","Neon")}),indexeddb:(F)=>{let Y=K(F,"databaseName","IndexedDB");return Y===void 0?{type:"indexeddb"}:{type:"indexeddb",databaseName:Y}},"web-extension":(F)=>{let Y=UF(F);return Y===void 0?{type:"web-extension"}:{type:"web-extension",area:Y}},http:(F)=>{let Y=GF(F);return{type:"http",baseUrl:HF(F,"baseUrl","HTTP"),...Y===void 0?{}:{headers:Y}}},auto:(F)=>({type:"auto"})};function qF(F,Y){return _F[Y](QF(F))}function CF(F){return Object.hasOwn(d,F)}async function sF(F){let Y=VF(F);if(!CF(Y))throw Error(`Unsupported storage configuration type: ${Y}`);let J=qF(F,Y),$=d[Y];return $(J)}export{sF as resolveStorage};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var u=Object.defineProperty;var x=(E)=>E;function y(E,_){this[E]=x.bind(null,_)}var a=(E,_)=>{for(var F in _)u(E,F,{get:_[F],enumerable:!0,configurable:!0,set:y.bind(_,F)})};var Q=(E,_)=>()=>(E&&(_=E(E=0)),_);var p=import.meta.require,s=(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 _},n=(E,_,F)=>{let Y=(X)=>_=F?new SuppressedError(X,_,"An error was suppressed during disposal"):(F=!0,X),V=(X)=>{while(X=E.pop())try{var m=X[1]&&X[1].call(X[2]);if(X[0])return Promise.resolve(m).then(V,(Z)=>(Y(Z),V()))}catch(Z){Y(Z)}if(F)throw _};return V()};function $(E,_,F){if(!E.capabilities()[_])throw Error(`Feature "${F}" requires storage capability "${_}", but this storage backend does not provide it.`)}function g(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 T="default";async function R(E,_){return await E.get(_)!==null}async function*J(E,_,F){for await(let[Y]of E.scan(_,F))yield Y}async function D(E,_){let F=0;for await(let Y of J(E,_))F++;return F}async function B(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 C(E,_,F){let Y=[];for await(let V of J(E,_,F))Y.push({type:"delete",key:V});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var I;var N=Q(()=>{I=["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(_>j)throw new A(E,_)}function YE(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function XE(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 UE(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 v(E,_){if(E.has)return E.has(_);return R(E,_)}function z(E,_,F){if(E.keys)return E.keys(_,F);return J(E,_,F)}async function h(E,_){if(E.count)return E.count(_);return D(E,_)}async function O(E,_){if(E.deletePrefix)return E.deletePrefix(_);return B(E,_)}async function VE(E,_){M("batch operations",_.length),await E.batch(_)}async function P(E,_,F){if(M("conditionalBatch conditions",_.length),M("conditionalBatch operations",F.length),$(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 GE(E){return decodeURIComponent(E)}function JE(E){try{return decodeURIComponent(E)}catch{return null}}var j=1e4,WE=1e4,A,U=(E)=>String(E).padStart(16,"0"),k="0",f="1",q=(E,_,F,Y)=>`sig:${W(E)}:${W(_)}:${Y}:${W(F)}`,ME;var K=Q(()=>{N();A=class A extends Error{code="StorageBatchOperationLimitExceededError";cap=j;count;target;constructor(E,_){super(`${E} count ${_} exceeds MAX_BATCH_OPERATIONS (${j}).`);this.name="StorageBatchOperationLimitExceededError",this.target=E,this.count=_}};ME={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}:${U(_)}:${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:${U(E)}:${W(_)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${U(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)=>q(E,_,F,f),startSignal:(E,_,F)=>q(E,_,F,k),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:${U(E)}:${W(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${U(E)}:${W(_)}`,teardownTimer:(E,_)=>`wf-teardown:${U(E)}:${W(_)}`,delayedStart:(E,_)=>`wf-delayed:${U(E)}:${W(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${U(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:${T}:${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:${U(E)}:${W(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${U(E)}:${W(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${U(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 w(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 V of["gt","gte","lt","lte"]){let X=E[V];if(X===void 0)continue;if(typeof X!=="string")throw Error("deleteRange bounds must be strings");_[V]=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=w(E.limit);if(Y!==void 0)_.limit=Y;return _}async function b(E,_,F){let Y=H(F);if(E.deleteRange)return E.deleteRange(_,Y);return C(E,_,Y)}var c=()=>{};function S(E){return E.replaceAll(/:+$/g,"")}function l(E,_){let F=S(E),Y=S(_);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}function RE(E,_){return new L(E,_)}var L;var d=Q(()=>{c();K();L=class L{#_;#F;constructor(E,_){this.#_=E,this.#F=S(_)}#E(E){if(this.#F.length===0)return E;return E.length===0?`${this.#F}:`:`${this.#F}:${E}`}#W(E){if(this.#F.length===0)return E;return E.slice(this.#F.length+1)}#Y(E={}){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.reverse!==void 0)_.reverse=E.reverse;if(E.gt!==void 0)_.gt=this.#E(E.gt);if(E.gte!==void 0)_.gte=this.#E(E.gte);if(E.lt!==void 0)_.lt=this.#E(E.lt);if(E.lte!==void 0)_.lte=this.#E(E.lte);return _}#X(E){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.gt!==void 0)_.gt=this.#E(E.gt);if(E.gte!==void 0)_.gte=this.#E(E.gte);if(E.lt!==void 0)_.lt=this.#E(E.lt);if(E.lte!==void 0)_.lte=this.#E(E.lte);return _}capabilities(){return this.#_.capabilities()}scoped(E){return new L(this.#_,l(this.#F,E))}async get(E){return this.#_.get(this.#E(E))}async put(E,_){await this.#_.put(this.#E(E),_)}async delete(E){await this.#_.delete(this.#E(E))}async*scan(E,_){for await(let[F,Y]of this.#_.scan(this.#E(E),this.#Y(_)))yield[this.#W(F),Y]}async batch(E){M("batch operations",E.length),await this.#_.batch(E.map((_)=>{if(_.type==="put")return{type:"put",key:this.#E(_.key),value:_.value};return{type:"delete",key:this.#E(_.key)}}))}async conditionalBatch(E,_){return P(this.#_,E.map((F)=>({key:this.#E(F.key),expectedValue:F.expectedValue})),_.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(E){return v(this.#_,this.#E(E))}async deletePrefix(E){return O(this.#_,this.#E(E))}async deleteRange(E,_){let F=this.#X(H(_));return b(this.#_,this.#E(E),F)}async*keys(E,_){for await(let F of z(this.#_,this.#E(E),this.#Y(_)))yield this.#W(F)}async count(E){return h(this.#_,this.#E(E))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}});d();export{RE as scopedStorage,L as ScopedStorage};
2
+ var x=import.meta.require,y=(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 _},g=(E,_,F)=>{let Y=(X)=>_=F?new SuppressedError(X,_,"An error was suppressed during disposal"):(F=!0,X),V=(X)=>{while(X=E.pop())try{var O=X[1]&&X[1].call(X[2]);if(X[0])return Promise.resolve(O).then(V,(M)=>(Y(M),V()))}catch(M){Y(M)}if(F)throw _};return V()};function Q(E,_,F){if(!E.capabilities()[_])throw Error(`Feature "${F}" requires storage capability "${_}", but this storage backend does not provide it.`)}function P(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 Z="default";async function S(E,_){return await E.get(_)!==null}async function*G(E,_,F){for await(let[Y]of E.scan(_,F))yield Y}async function L(E,_){let F=0;for await(let Y of G(E,_))F++;return F}async function R(E,_){let F=[];for await(let Y of G(E,_))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await E.batch(F),F.length}async function D(E,_,F){let Y=[];for await(let V of G(E,_,F))Y.push({type:"delete",key:V});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var K=["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 $=1e4,s=1e4;class C extends Error{code="StorageBatchOperationLimitExceededError";cap=$;count;target;constructor(E,_){super(`${E} count ${_} exceeds MAX_BATCH_OPERATIONS (${$}).`);this.name="StorageBatchOperationLimitExceededError",this.target=E,this.count=_}}function J(E,_){if(_>$)throw new C(E,_)}function n(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 t(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 N(E,_){if(E.has)return E.has(_);return S(E,_)}function q(E,_,F){if(E.keys)return E.keys(_,F);return G(E,_,F)}async function A(E,_){if(E.count)return E.count(_);return L(E,_)}async function v(E,_){if(E.deletePrefix)return E.deletePrefix(_);return R(E,_)}async function i(E,_){J("batch operations",_.length),await E.batch(_)}async function z(E,_,F){if(J("conditionalBatch conditions",_.length),J("conditionalBatch operations",F.length),Q(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 e(E){return decodeURIComponent(E)}function o(E){try{return decodeURIComponent(E)}catch{return null}}var U=(E)=>String(E).padStart(16,"0"),b="0",c="1",B=(E,_,F,Y)=>`sig:${W(E)}:${W(_)}:${Y}:${W(F)}`,EE={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}:${U(_)}:${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:${U(E)}:${W(_)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${U(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)=>B(E,_,F,c),startSignal:(E,_,F)=>B(E,_,F,b),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:${U(E)}:${W(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${U(E)}:${W(_)}`,teardownTimer:(E,_)=>`wf-teardown:${U(E)}:${W(_)}`,delayedStart:(E,_)=>`wf-delayed:${U(E)}:${W(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${U(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:${Z}:${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:${U(E)}:${W(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${U(E)}:${W(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${U(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 m(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 V of["gt","gte","lt","lte"]){let X=E[V];if(X===void 0)continue;if(typeof X!=="string")throw Error("deleteRange bounds must be strings");_[V]=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=m(E.limit);if(Y!==void 0)_.limit=Y;return _}async function h(E,_,F){let Y=T(F);if(E.deleteRange)return E.deleteRange(_,Y);return D(E,_,Y)}function j(E){return E.replaceAll(/:+$/g,"")}function u(E,_){let F=j(E),Y=j(_);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}class H{#_;#F;constructor(E,_){this.#_=E,this.#F=j(_)}#E(E){if(this.#F.length===0)return E;return E.length===0?`${this.#F}:`:`${this.#F}:${E}`}#W(E){if(this.#F.length===0)return E;return E.slice(this.#F.length+1)}#Y(E={}){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.reverse!==void 0)_.reverse=E.reverse;if(E.gt!==void 0)_.gt=this.#E(E.gt);if(E.gte!==void 0)_.gte=this.#E(E.gte);if(E.lt!==void 0)_.lt=this.#E(E.lt);if(E.lte!==void 0)_.lte=this.#E(E.lte);return _}#X(E){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.gt!==void 0)_.gt=this.#E(E.gt);if(E.gte!==void 0)_.gte=this.#E(E.gte);if(E.lt!==void 0)_.lt=this.#E(E.lt);if(E.lte!==void 0)_.lte=this.#E(E.lte);return _}capabilities(){return this.#_.capabilities()}scoped(E){return new H(this.#_,u(this.#F,E))}async get(E){return this.#_.get(this.#E(E))}async put(E,_){await this.#_.put(this.#E(E),_)}async delete(E){await this.#_.delete(this.#E(E))}async*scan(E,_){for await(let[F,Y]of this.#_.scan(this.#E(E),this.#Y(_)))yield[this.#W(F),Y]}async batch(E){J("batch operations",E.length),await this.#_.batch(E.map((_)=>{if(_.type==="put")return{type:"put",key:this.#E(_.key),value:_.value};return{type:"delete",key:this.#E(_.key)}}))}async conditionalBatch(E,_){return z(this.#_,E.map((F)=>({key:this.#E(F.key),expectedValue:F.expectedValue})),_.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(E){return N(this.#_,this.#E(E))}async deletePrefix(E){return v(this.#_,this.#E(E))}async deleteRange(E,_){let F=this.#X(T(_));return h(this.#_,this.#E(E),F)}async*keys(E,_){for await(let F of q(this.#_,this.#E(E),this.#Y(_)))yield this.#W(F)}async count(E){return A(this.#_,this.#E(E))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}function JE(E,_){return new H(E,_)}export{JE as scopedStorage,H as ScopedStorage};
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Driver-neutral SQL identifier validation shared by adapters that must
3
+ * interpolate a caller-configured schema/table name directly into SQL text
4
+ * (identifiers cannot be bound as query parameters).
5
+ *
6
+ * Originally lived only in `postgres-key-value-queries.ts` as
7
+ * `assertPostgresIdentifier`; extracted here so a second dialect
8
+ * (`cloudflare.ts`) can validate its configurable table name without
9
+ * duplicating the pattern or the injection-safety reasoning.
10
+ *
11
+ * @module storage/sql-identifier
12
+ */
13
+ /**
14
+ * The strict identifier grammar every adapter using this module accepts:
15
+ * a letter or underscore, followed by letters, digits, or underscores. The
16
+ * pattern excludes the `"` quote character, so no quote-doubling is required
17
+ * when the validated identifier is later wrapped in double quotes.
18
+ */
19
+ export declare const SQL_IDENTIFIER_PATTERN: RegExp;
20
+ /**
21
+ * Validate a SQL identifier (schema or table name) against
22
+ * {@link SQL_IDENTIFIER_PATTERN}. Identifiers cannot be bound as query
23
+ * parameters, so they must be interpolated into SQL text — this validation,
24
+ * run once at construction, is the injection guard that makes interpolation
25
+ * safe.
26
+ *
27
+ * Internal helper: not exported from any package subpath. Callers reach it
28
+ * transitively through dialect-specific wrappers such as
29
+ * `assertPostgresIdentifier` (Postgres) and the Cloudflare Durable Object
30
+ * adapter's table-name validation. No `@example` here for that reason, like
31
+ * the derived `*Core` helpers in `./derived-operations.ts`.
32
+ *
33
+ * @throws {Error} When `value` does not match {@link SQL_IDENTIFIER_PATTERN}.
34
+ */
35
+ export declare function assertSqlIdentifier(value: string, role: string, dialect: string): void;
@@ -0,0 +1,5 @@
1
+ export const SQL_IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_]*$/i;
2
+ export function assertSqlIdentifier(value, role, dialect) {
3
+ if (!SQL_IDENTIFIER_PATTERN.test(value))
4
+ throw Error(`${dialect} storage ${role} name "${value}" is not a valid ${dialect} identifier. Use only letters, digits, and underscores, starting with a letter or underscore (matching ${SQL_IDENTIFIER_PATTERN.source}).`);
5
+ }