@effect-agent/storage-sqlite 0.1.0-beta.8 → 0.1.0-beta.80

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 (60) hide show
  1. package/dist/SqliteActivityStore.d.mts +14 -0
  2. package/dist/SqliteActivityStore.mjs +310 -0
  3. package/dist/SqliteActivityStore.mjs.map +1 -0
  4. package/dist/SqliteMessageDeliveryStore.d.mts +14 -0
  5. package/dist/SqliteMessageDeliveryStore.mjs +24 -0
  6. package/dist/SqliteMessageDeliveryStore.mjs.map +1 -0
  7. package/dist/SqliteScheduleStore.d.mts +14 -0
  8. package/dist/SqliteScheduleStore.mjs +255 -0
  9. package/dist/SqliteScheduleStore.mjs.map +1 -0
  10. package/dist/SqliteStorageConfig.d.mts +34 -0
  11. package/dist/SqliteStorageConfig.mjs +39 -0
  12. package/dist/SqliteStorageConfig.mjs.map +1 -0
  13. package/dist/SqliteStorageError-DVWeaWLm.d.mts +86 -0
  14. package/dist/SqliteStorageError.d.mts +2 -0
  15. package/dist/SqliteStorageError.mjs +150 -0
  16. package/dist/SqliteStorageError.mjs.map +1 -0
  17. package/dist/SqliteStorageFailpoint.d.mts +17 -0
  18. package/dist/SqliteStorageFailpoint.mjs +14 -0
  19. package/dist/SqliteStorageFailpoint.mjs.map +1 -0
  20. package/dist/SqliteStorageFailpointTesting.d.mts +15 -0
  21. package/dist/SqliteStorageFailpointTesting.mjs +19 -0
  22. package/dist/SqliteStorageFailpointTesting.mjs.map +1 -0
  23. package/dist/SqliteStorageVersion-BqmqX0CI.d.mts +11 -0
  24. package/dist/SqliteStorageVersion.d.mts +2 -0
  25. package/dist/SqliteStorageVersion.mjs +8 -0
  26. package/dist/SqliteStorageVersion.mjs.map +1 -0
  27. package/dist/SqliteSubmissionLedger.d.mts +23 -0
  28. package/dist/SqliteSubmissionLedger.mjs +1788 -0
  29. package/dist/SqliteSubmissionLedger.mjs.map +1 -0
  30. package/dist/SqliteSubscriptionStore.d.mts +13 -0
  31. package/dist/SqliteSubscriptionStore.mjs +28 -0
  32. package/dist/SqliteSubscriptionStore.mjs.map +1 -0
  33. package/dist/SqliteThreadStore.d.mts +49 -0
  34. package/dist/SqliteThreadStore.mjs +460 -0
  35. package/dist/SqliteThreadStore.mjs.map +1 -0
  36. package/dist/index.d.mts +11 -193
  37. package/dist/index.mjs +11 -3082
  38. package/dist/migrations-Dy5v0HGe.mjs +346 -0
  39. package/dist/migrations-Dy5v0HGe.mjs.map +1 -0
  40. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  41. package/dist/sqlite-journal-D9xFxCw-.mjs +998 -0
  42. package/dist/sqlite-journal-D9xFxCw-.mjs.map +1 -0
  43. package/package.json +1 -41
  44. package/src/SqliteActivityStore.ts +556 -0
  45. package/src/SqliteMessageDeliveryStore.ts +42 -0
  46. package/src/SqliteScheduleStore.ts +404 -0
  47. package/src/{sqlite-storage-config.ts → SqliteStorageConfig.ts} +1 -1
  48. package/src/{errors.ts → SqliteStorageError.ts} +10 -3
  49. package/src/SqliteStorageFailpoint.ts +23 -0
  50. package/src/{sqlite-storage-failpoint.ts → SqliteStorageFailpointTesting.ts} +7 -18
  51. package/src/SqliteStorageVersion.ts +2 -0
  52. package/src/{sqlite-ledger.ts → SqliteSubmissionLedger.ts} +857 -157
  53. package/src/SqliteSubscriptionStore.ts +59 -0
  54. package/src/{sqlite-conversation-store.ts → SqliteThreadStore.ts} +448 -288
  55. package/src/index.ts +10 -6
  56. package/src/internal/message-delivery-schema.ts +24 -0
  57. package/src/{migrations.ts → internal/migrations.ts} +156 -79
  58. package/src/internal/recovery-checkpoint-schema.ts +17 -0
  59. package/src/{sqlite-journal.ts → internal/sqlite-journal.ts} +752 -239
  60. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,14 @@
1
+ import { Layer } from "effect";
2
+ import * as SqlClientService from "effect/unstable/sql/SqlClient";
3
+ import { ActivityMutationFailpoint, ActivityMutationFailure, ActivityProcessorStore, ActivityStoreError } from "@effect-agent/thread/ActivityStore";
4
+ declare namespace SqliteActivityStore_d_exports {
5
+ export { SqliteActivityInitializationError, activityProcessorStoreLayer, activityProcessorStoreLayerWithFailpoints };
6
+ }
7
+ type SqliteActivityInitializationError = ActivityStoreError | ActivityMutationFailure;
8
+ /** SQLite activity progress with mutation failpoints kept injectable for recovery tests. */
9
+ declare const activityProcessorStoreLayerWithFailpoints: Layer.Layer<ActivityProcessorStore, SqliteActivityInitializationError, SqlClientService.SqlClient | ActivityMutationFailpoint>;
10
+ /** SQLite activity progress with the production no-op mutation failpoint. */
11
+ declare const activityProcessorStoreLayer: Layer.Layer<ActivityProcessorStore, SqliteActivityInitializationError, SqlClientService.SqlClient>;
12
+ //#endregion
13
+ export { SqliteActivityInitializationError, activityProcessorStoreLayer, activityProcessorStoreLayerWithFailpoints, SqliteActivityStore_d_exports as t };
14
+ //# sourceMappingURL=SqliteActivityStore.d.mts.map
@@ -0,0 +1,310 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
+ import { Clock, Effect, Layer, Schema } from "effect";
3
+ import * as SqlClientService from "effect/unstable/sql/SqlClient";
4
+ import { Digest } from "@effect-agent/thread/Records";
5
+ import { ActivityBusy, ActivityClaim, ActivityClaimRequest, ActivityMutationFailpoint, ActivityOwnershipLost, ActivityProcessorKey, ActivityProcessorStore, ActivityProgress, ActivityStoreError, ActivityWorkConflict, PreparedActivity } from "@effect-agent/thread/ActivityStore";
6
+ //#region src/SqliteActivityStore.ts
7
+ var SqliteActivityStore_exports = /* @__PURE__ */ __exportAll({
8
+ activityProcessorStoreLayer: () => activityProcessorStoreLayer,
9
+ activityProcessorStoreLayerWithFailpoints: () => activityProcessorStoreLayerWithFailpoints
10
+ });
11
+ const STORAGE_VERSION = 1;
12
+ const METADATA_COMPONENT = "activity";
13
+ const STATE_TABLE = "effect_agent_activity_processor_state_v1";
14
+ const StoredJson = Schema.String.check(Schema.isMaxLength(16777216));
15
+ const sameKey = Schema.toEquivalence(ActivityProcessorKey);
16
+ const sameWork = Schema.toEquivalence(PreparedActivity);
17
+ var ActivityMetadataRow = class extends Schema.Class("@effect-agent/storage-sqlite/ActivityMetadataRow")({ version: Schema.Int }) {};
18
+ var ActivityTableRow = class extends Schema.Class("@effect-agent/storage-sqlite/ActivityTableRow")({ name: Schema.NonEmptyString }) {};
19
+ var ActivityStateRow = class extends Schema.Class("@effect-agent/storage-sqlite/ActivityStateRow")({
20
+ processor_id: ActivityProcessorKey.fields.processorId,
21
+ processor_version: ActivityProcessorKey.fields.processorVersion,
22
+ thread_id: ActivityProcessorKey.fields.threadId,
23
+ format_version: Schema.Int,
24
+ through_sequence: ActivityProgress.fields.throughSequence,
25
+ epoch: ActivityProgress.fields.epoch,
26
+ owner: ActivityProgress.fields.owner,
27
+ lease_expires_at: ActivityProgress.fields.leaseExpiresAt,
28
+ progress_json: StoredJson
29
+ }) {};
30
+ var ActivityChangeCountRow = class extends Schema.Class("@effect-agent/storage-sqlite/ActivityChangeCountRow")({ changed: Schema.Int }) {};
31
+ const StoredVersionHeader = Schema.Struct({ version: Schema.Int });
32
+ const storeError = (operation, reason = "unavailable") => ActivityStoreError.make({
33
+ operation,
34
+ reason
35
+ });
36
+ const query = (effect, operation) => effect.pipe(Effect.mapError(() => storeError(operation)));
37
+ const decodeRows = Effect.fn("SqliteActivityStore.decodeRows")(function* (schema, rows, operation) {
38
+ return yield* Schema.decodeUnknownEffect(Schema.Array(schema))(rows).pipe(Effect.mapError(() => storeError(operation, "corrupt")));
39
+ });
40
+ const decodeInput = Effect.fn("SqliteActivityStore.decodeInput")(function* (schema, value, operation) {
41
+ return yield* Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => storeError(operation, "invalid-input")));
42
+ });
43
+ const encodeProgress = Effect.fn("SqliteActivityStore.encodeProgress")(function* (progress, operation) {
44
+ return yield* Schema.encodeEffect(Schema.fromJsonString(ActivityProgress))(progress).pipe(Effect.mapError(() => storeError(operation, "corrupt")), Effect.flatMap((encoded) => Schema.decodeEffect(StoredJson)(encoded).pipe(Effect.mapError(() => storeError(operation, "invalid-input")))));
45
+ });
46
+ const decodeProgress = Effect.fn("SqliteActivityStore.decodeProgress")(function* (value, operation) {
47
+ if ((yield* Schema.decodeEffect(Schema.fromJsonString(StoredVersionHeader))(value).pipe(Effect.mapError(() => storeError(operation, "corrupt")))).version !== STORAGE_VERSION) return yield* storeError(operation, "incompatible");
48
+ const progress = yield* Schema.decodeEffect(Schema.fromJsonString(ActivityProgress))(value).pipe(Effect.mapError(() => storeError(operation, "corrupt")));
49
+ if ((yield* encodeProgress(progress, operation)) !== value) return yield* storeError(operation, "corrupt");
50
+ return progress;
51
+ });
52
+ const validateProgress = Effect.fn("SqliteActivityStore.validateProgress")(function* (progress, operation) {
53
+ if (progress.epoch < 1 || progress.owner === null && progress.leaseExpiresAt !== 0 || progress.pending !== null && (!sameKey(progress.pending.key, progress.key) || progress.pending.sequence !== progress.throughSequence + 1)) return yield* storeError(operation, "corrupt");
54
+ return progress;
55
+ });
56
+ const makeClaim = (progress) => progress.owner === null ? null : ActivityClaim.make({
57
+ key: progress.key,
58
+ owner: progress.owner,
59
+ epoch: progress.epoch,
60
+ throughSequence: progress.throughSequence,
61
+ leaseExpiresAt: progress.leaseExpiresAt,
62
+ pending: progress.pending
63
+ });
64
+ const ownershipLost = (claim) => ActivityOwnershipLost.make({
65
+ key: claim.key,
66
+ owner: claim.owner,
67
+ epoch: claim.epoch
68
+ });
69
+ const makeActivityStore = Effect.fn("SqliteActivityStore.make")(function* () {
70
+ const sql = yield* SqlClientService.SqlClient;
71
+ const failpoint = yield* ActivityMutationFailpoint;
72
+ yield* failpoint.hit("activity:initialize:before");
73
+ yield* sql.withTransaction(Effect.gen(function* () {
74
+ yield* sql`
75
+ CREATE TABLE IF NOT EXISTS effect_agent_activity_metadata (
76
+ component TEXT PRIMARY KEY NOT NULL,
77
+ version INTEGER NOT NULL
78
+ )
79
+ `;
80
+ const metadataRows = yield* sql`
81
+ SELECT version FROM effect_agent_activity_metadata
82
+ WHERE component = ${METADATA_COMPONENT}
83
+ `;
84
+ const metadata = yield* decodeRows(ActivityMetadataRow, metadataRows, "decode activity schema version");
85
+ if (metadata.length > 1) return yield* storeError("decode activity schema version", "corrupt");
86
+ const currentVersion = metadata[0]?.version;
87
+ if (currentVersion !== void 0 && currentVersion !== STORAGE_VERSION) return yield* storeError("initialize activity schema", "incompatible");
88
+ if (currentVersion === void 0) {
89
+ const tableRows = yield* sql`
90
+ SELECT name FROM sqlite_master
91
+ WHERE type = 'table' AND name = ${STATE_TABLE}
92
+ `;
93
+ if ((yield* decodeRows(ActivityTableRow, tableRows, "inspect activity schema")).length > 0) return yield* storeError("initialize activity schema", "incompatible");
94
+ yield* sql`
95
+ CREATE TABLE effect_agent_activity_processor_state_v1 (
96
+ processor_id TEXT NOT NULL,
97
+ processor_version TEXT NOT NULL,
98
+ thread_id TEXT NOT NULL,
99
+ format_version INTEGER NOT NULL,
100
+ through_sequence INTEGER NOT NULL,
101
+ epoch INTEGER NOT NULL,
102
+ owner TEXT,
103
+ lease_expires_at REAL NOT NULL,
104
+ progress_json TEXT NOT NULL,
105
+ PRIMARY KEY (processor_id, processor_version, thread_id)
106
+ )
107
+ `;
108
+ yield* sql`
109
+ INSERT INTO effect_agent_activity_metadata (component, version)
110
+ VALUES (${METADATA_COMPONENT}, ${STORAGE_VERSION})
111
+ `;
112
+ }
113
+ yield* sql`
114
+ SELECT processor_id, processor_version, thread_id, format_version,
115
+ through_sequence, epoch, owner, lease_expires_at, progress_json
116
+ FROM effect_agent_activity_processor_state_v1
117
+ LIMIT 0
118
+ `;
119
+ })).pipe(Effect.catchTag("SqlError", () => Effect.fail(storeError("initialize activity schema"))));
120
+ yield* failpoint.hit("activity:initialize:after");
121
+ const readProgress = Effect.fn("SqliteActivityStore.readProgress")(function* (key, operation) {
122
+ const rawRows = yield* query(sql`
123
+ SELECT processor_id, processor_version, thread_id, format_version,
124
+ through_sequence, epoch, owner, lease_expires_at, progress_json
125
+ FROM effect_agent_activity_processor_state_v1
126
+ WHERE processor_id = ${key.processorId}
127
+ AND processor_version = ${key.processorVersion}
128
+ AND thread_id = ${key.threadId}
129
+ `, operation);
130
+ const rows = yield* decodeRows(ActivityStateRow, rawRows, operation);
131
+ if (rows.length === 0) return null;
132
+ if (rows.length !== 1) return yield* storeError(operation, "corrupt");
133
+ const row = rows[0];
134
+ if (row.format_version !== STORAGE_VERSION) return yield* storeError(operation, "incompatible");
135
+ const progress = yield* decodeProgress(row.progress_json, operation);
136
+ yield* validateProgress(progress, operation);
137
+ if (!sameKey(progress.key, key) || row.processor_id !== key.processorId || row.processor_version !== key.processorVersion || row.thread_id !== key.threadId || row.through_sequence !== progress.throughSequence || row.epoch !== progress.epoch || row.owner !== progress.owner || row.lease_expires_at !== progress.leaseExpiresAt) return yield* storeError(operation, "corrupt");
138
+ return progress;
139
+ });
140
+ const checkChanged = Effect.fn("SqliteActivityStore.checkChanged")(function* (operation) {
141
+ const rawRows = yield* query(sql`SELECT changes() AS changed`, operation);
142
+ const rows = yield* decodeRows(ActivityChangeCountRow, rawRows, operation);
143
+ if (rows.length !== 1 || rows[0].changed !== 1) return yield* storeError(operation, "corrupt");
144
+ });
145
+ const insertProgress = Effect.fn("SqliteActivityStore.insertProgress")(function* (progress, operation) {
146
+ const progressJson = yield* encodeProgress(progress, operation);
147
+ yield* sql`
148
+ INSERT INTO effect_agent_activity_processor_state_v1 (
149
+ processor_id, processor_version, thread_id, format_version, through_sequence,
150
+ epoch, owner, lease_expires_at, progress_json
151
+ ) VALUES (
152
+ ${progress.key.processorId}, ${progress.key.processorVersion}, ${progress.key.threadId},
153
+ ${STORAGE_VERSION}, ${progress.throughSequence}, ${progress.epoch}, ${progress.owner},
154
+ ${progress.leaseExpiresAt}, ${progressJson}
155
+ )
156
+ `;
157
+ yield* checkChanged(operation);
158
+ });
159
+ const updateProgress = Effect.fn("SqliteActivityStore.updateProgress")(function* (current, next, operation) {
160
+ const progressJson = yield* encodeProgress(next, operation);
161
+ yield* sql`
162
+ UPDATE effect_agent_activity_processor_state_v1
163
+ SET format_version = ${STORAGE_VERSION},
164
+ through_sequence = ${next.throughSequence},
165
+ epoch = ${next.epoch},
166
+ owner = ${next.owner},
167
+ lease_expires_at = ${next.leaseExpiresAt},
168
+ progress_json = ${progressJson}
169
+ WHERE processor_id = ${current.key.processorId}
170
+ AND processor_version = ${current.key.processorVersion}
171
+ AND thread_id = ${current.key.threadId}
172
+ AND through_sequence = ${current.throughSequence}
173
+ AND epoch = ${current.epoch}
174
+ `;
175
+ yield* checkChanged(operation);
176
+ });
177
+ const requireLive = Effect.fn("SqliteActivityStore.requireLive")(function* (progress, claim, requireSequence) {
178
+ const now = yield* Clock.currentTimeMillis;
179
+ if (progress === null || !sameKey(progress.key, claim.key) || progress.owner !== claim.owner || progress.epoch !== claim.epoch || progress.leaseExpiresAt <= now || requireSequence && progress.throughSequence !== claim.throughSequence) return yield* ownershipLost(claim);
180
+ return progress;
181
+ });
182
+ const inspect = Effect.fn("SqliteActivityStore.inspect")(function* (key) {
183
+ const decodedKey = yield* decodeInput(ActivityProcessorKey, key, "inspect activity progress");
184
+ return yield* readProgress(decodedKey, "inspect activity progress");
185
+ });
186
+ const claim = Effect.fn("SqliteActivityStore.claim")(function* (request) {
187
+ const operation = "claim activity progress";
188
+ const decoded = yield* decodeInput(ActivityClaimRequest, request, operation);
189
+ yield* failpoint.hit("activity:claim:before");
190
+ const claimed = yield* sql.withTransaction(Effect.gen(function* () {
191
+ const current = yield* readProgress(decoded.key, operation);
192
+ const now = yield* Clock.currentTimeMillis;
193
+ if (current !== null && current.owner !== null && current.leaseExpiresAt > now) return yield* ActivityBusy.make({
194
+ key: decoded.key,
195
+ leaseExpiresAt: current.leaseExpiresAt
196
+ });
197
+ const next = yield* Schema.decodeUnknownEffect(ActivityProgress)({
198
+ version: STORAGE_VERSION,
199
+ key: decoded.key,
200
+ throughSequence: current?.throughSequence ?? 0,
201
+ epoch: (current?.epoch ?? 0) + 1,
202
+ owner: decoded.owner,
203
+ leaseExpiresAt: now + decoded.leaseMillis,
204
+ pending: current?.pending ?? null,
205
+ advancedAt: current?.advancedAt ?? null
206
+ }).pipe(Effect.mapError(() => storeError(operation, "corrupt")));
207
+ if (current === null) yield* insertProgress(next, operation);
208
+ else yield* updateProgress(current, next, operation);
209
+ yield* failpoint.hit("activity:claim:after-state");
210
+ const result = makeClaim(next);
211
+ if (result === null) return yield* storeError(operation, "corrupt");
212
+ return result;
213
+ })).pipe(Effect.catchTag("SqlError", () => Effect.fail(storeError(operation))));
214
+ yield* failpoint.hit("activity:claim:after");
215
+ return claimed;
216
+ });
217
+ const prepare = Effect.fn("SqliteActivityStore.prepare")(function* (request) {
218
+ const operation = "prepare activity output";
219
+ const claim = yield* decodeInput(ActivityClaim, request.claim, operation);
220
+ const work = yield* decodeInput(PreparedActivity, request.work, operation);
221
+ yield* failpoint.hit("activity:prepare:before");
222
+ const result = yield* sql.withTransaction(Effect.gen(function* () {
223
+ const current = yield* requireLive(yield* readProgress(claim.key, operation), claim, true);
224
+ if (current.pending !== null) {
225
+ if (sameWork(current.pending, work)) return {
226
+ work: current.pending,
227
+ changed: false
228
+ };
229
+ return yield* ActivityWorkConflict.make({
230
+ key: claim.key,
231
+ workId: work.workId
232
+ });
233
+ }
234
+ if (!sameKey(work.key, claim.key) || work.sequence !== current.throughSequence + 1) return yield* ActivityWorkConflict.make({
235
+ key: claim.key,
236
+ workId: work.workId
237
+ });
238
+ const next = ActivityProgress.make({
239
+ ...current,
240
+ pending: work
241
+ });
242
+ yield* updateProgress(current, next, operation);
243
+ yield* failpoint.hit("activity:prepare:after-state");
244
+ return {
245
+ work,
246
+ changed: true
247
+ };
248
+ })).pipe(Effect.catchTag("SqlError", () => Effect.fail(storeError(operation))));
249
+ if (result.changed) yield* failpoint.hit("activity:prepare:after");
250
+ return result.work;
251
+ });
252
+ const advance = Effect.fn("SqliteActivityStore.advance")(function* (request) {
253
+ const operation = "advance activity progress";
254
+ const claim = yield* decodeInput(ActivityClaim, request.claim, operation);
255
+ const workId = yield* decodeInput(Digest, request.workId, operation);
256
+ yield* failpoint.hit("activity:advance:before");
257
+ const nextClaim = yield* sql.withTransaction(Effect.gen(function* () {
258
+ const current = yield* requireLive(yield* readProgress(claim.key, operation), claim, true);
259
+ if (current.pending === null || current.pending.workId !== workId) return yield* ActivityWorkConflict.make({
260
+ key: claim.key,
261
+ workId
262
+ });
263
+ const next = ActivityProgress.make({
264
+ ...current,
265
+ throughSequence: current.pending.sequence,
266
+ pending: null,
267
+ advancedAt: yield* Clock.currentTimeMillis
268
+ });
269
+ yield* updateProgress(current, next, operation);
270
+ yield* failpoint.hit("activity:advance:after-state");
271
+ const result = makeClaim(next);
272
+ if (result === null) return yield* storeError(operation, "corrupt");
273
+ return result;
274
+ })).pipe(Effect.catchTag("SqlError", () => Effect.fail(storeError(operation))));
275
+ yield* failpoint.hit("activity:advance:after");
276
+ return nextClaim;
277
+ });
278
+ const release = Effect.fn("SqliteActivityStore.release")(function* (claim) {
279
+ const operation = "release activity claim";
280
+ const decoded = yield* decodeInput(ActivityClaim, claim, operation);
281
+ yield* failpoint.hit("activity:release:before");
282
+ yield* sql.withTransaction(Effect.gen(function* () {
283
+ const current = yield* readProgress(decoded.key, operation);
284
+ if (current === null || current.owner !== decoded.owner || current.epoch !== decoded.epoch) return yield* ownershipLost(decoded);
285
+ const next = ActivityProgress.make({
286
+ ...current,
287
+ owner: null,
288
+ leaseExpiresAt: 0
289
+ });
290
+ yield* updateProgress(current, next, operation);
291
+ yield* failpoint.hit("activity:release:after-state");
292
+ })).pipe(Effect.catchTag("SqlError", () => Effect.fail(storeError(operation))));
293
+ yield* failpoint.hit("activity:release:after");
294
+ });
295
+ return ActivityProcessorStore.of({
296
+ inspect,
297
+ claim,
298
+ prepare,
299
+ advance,
300
+ release
301
+ });
302
+ });
303
+ /** SQLite activity progress with mutation failpoints kept injectable for recovery tests. */
304
+ const activityProcessorStoreLayerWithFailpoints = Layer.effect(ActivityProcessorStore, makeActivityStore());
305
+ /** SQLite activity progress with the production no-op mutation failpoint. */
306
+ const activityProcessorStoreLayer = activityProcessorStoreLayerWithFailpoints.pipe(Layer.provide(ActivityMutationFailpoint.layer));
307
+ //#endregion
308
+ export { activityProcessorStoreLayer, activityProcessorStoreLayerWithFailpoints, SqliteActivityStore_exports as t };
309
+
310
+ //# sourceMappingURL=SqliteActivityStore.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteActivityStore.mjs","names":[],"sources":["../src/SqliteActivityStore.ts"],"sourcesContent":["import {\n ActivityBusy,\n ActivityClaim,\n ActivityClaimRequest,\n ActivityMutationFailpoint,\n type ActivityMutationFailure,\n ActivityOwnershipLost,\n ActivityProcessorKey,\n ActivityProcessorStore,\n ActivityProgress,\n ActivityStoreError,\n ActivityWorkConflict,\n PreparedActivity,\n} from \"@effect-agent/thread/ActivityStore\";\nimport { Digest } from \"@effect-agent/thread/Records\";\nimport { Clock, Effect, Layer, Schema } from \"effect\";\nimport * as SqlClientService from \"effect/unstable/sql/SqlClient\";\nimport type { SqlError } from \"effect/unstable/sql/SqlError\";\n\nconst STORAGE_VERSION = 1 as const;\nconst METADATA_COMPONENT = \"activity\";\nconst STATE_TABLE = \"effect_agent_activity_processor_state_v1\";\nconst StoredJson = Schema.String.check(Schema.isMaxLength(16 * 1024 * 1024));\nconst sameKey = Schema.toEquivalence(ActivityProcessorKey);\nconst sameWork = Schema.toEquivalence(PreparedActivity);\n\nclass ActivityMetadataRow extends Schema.Class<ActivityMetadataRow>(\n \"@effect-agent/storage-sqlite/ActivityMetadataRow\",\n)({\n version: Schema.Int,\n}) {}\n\nclass ActivityTableRow extends Schema.Class<ActivityTableRow>(\n \"@effect-agent/storage-sqlite/ActivityTableRow\",\n)({\n name: Schema.NonEmptyString,\n}) {}\n\nclass ActivityStateRow extends Schema.Class<ActivityStateRow>(\n \"@effect-agent/storage-sqlite/ActivityStateRow\",\n)({\n processor_id: ActivityProcessorKey.fields.processorId,\n processor_version: ActivityProcessorKey.fields.processorVersion,\n thread_id: ActivityProcessorKey.fields.threadId,\n format_version: Schema.Int,\n through_sequence: ActivityProgress.fields.throughSequence,\n epoch: ActivityProgress.fields.epoch,\n owner: ActivityProgress.fields.owner,\n lease_expires_at: ActivityProgress.fields.leaseExpiresAt,\n progress_json: StoredJson,\n}) {}\n\nclass ActivityChangeCountRow extends Schema.Class<ActivityChangeCountRow>(\n \"@effect-agent/storage-sqlite/ActivityChangeCountRow\",\n)({\n changed: Schema.Int,\n}) {}\n\nconst StoredVersionHeader = Schema.Struct({ version: Schema.Int });\n\nexport type SqliteActivityInitializationError = ActivityStoreError | ActivityMutationFailure;\n\nconst storeError = (\n operation: string,\n reason: ActivityStoreError[\"reason\"] = \"unavailable\",\n): ActivityStoreError => ActivityStoreError.make({ operation, reason });\n\nconst query = <A extends object>(\n effect: Effect.Effect<ReadonlyArray<A>, SqlError>,\n operation: string,\n) => effect.pipe(Effect.mapError(() => storeError(operation)));\n\nconst decodeRows = Effect.fn(\"SqliteActivityStore.decodeRows\")(function* <A, I>(\n schema: Schema.Codec<A, I, never>,\n rows: ReadonlyArray<unknown>,\n operation: string,\n): Effect.fn.Return<ReadonlyArray<A>, ActivityStoreError> {\n return yield* Schema.decodeUnknownEffect(Schema.Array(schema))(rows).pipe(\n Effect.mapError(() => storeError(operation, \"corrupt\")),\n );\n});\n\nconst decodeInput = Effect.fn(\"SqliteActivityStore.decodeInput\")(function* <A, I>(\n schema: Schema.Codec<A, I, never>,\n value: unknown,\n operation: string,\n): Effect.fn.Return<A, ActivityStoreError> {\n return yield* Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.mapError(() => storeError(operation, \"invalid-input\")),\n );\n});\n\nconst encodeProgress = Effect.fn(\"SqliteActivityStore.encodeProgress\")(function* (\n progress: ActivityProgress,\n operation: string,\n): Effect.fn.Return<string, ActivityStoreError> {\n return yield* Schema.encodeEffect(Schema.fromJsonString(ActivityProgress))(progress).pipe(\n Effect.mapError(() => storeError(operation, \"corrupt\")),\n Effect.flatMap((encoded) =>\n Schema.decodeEffect(StoredJson)(encoded).pipe(\n Effect.mapError(() => storeError(operation, \"invalid-input\")),\n ),\n ),\n );\n});\n\nconst decodeProgress = Effect.fn(\"SqliteActivityStore.decodeProgress\")(function* (\n value: string,\n operation: string,\n): Effect.fn.Return<ActivityProgress, ActivityStoreError> {\n const header = yield* Schema.decodeEffect(Schema.fromJsonString(StoredVersionHeader))(value).pipe(\n Effect.mapError(() => storeError(operation, \"corrupt\")),\n );\n\n if (header.version !== STORAGE_VERSION) {\n return yield* storeError(operation, \"incompatible\");\n }\n\n const progress = yield* Schema.decodeEffect(Schema.fromJsonString(ActivityProgress))(value).pipe(\n Effect.mapError(() => storeError(operation, \"corrupt\")),\n );\n\n const canonical = yield* encodeProgress(progress, operation);\n\n if (canonical !== value) return yield* storeError(operation, \"corrupt\");\n\n return progress;\n});\n\nconst validateProgress = Effect.fn(\"SqliteActivityStore.validateProgress\")(function* (\n progress: ActivityProgress,\n operation: string,\n): Effect.fn.Return<ActivityProgress, ActivityStoreError> {\n if (\n progress.epoch < 1 ||\n (progress.owner === null && progress.leaseExpiresAt !== 0) ||\n (progress.pending !== null &&\n (!sameKey(progress.pending.key, progress.key) ||\n progress.pending.sequence !== progress.throughSequence + 1))\n ) {\n return yield* storeError(operation, \"corrupt\");\n }\n\n return progress;\n});\n\nconst makeClaim = (progress: ActivityProgress): ActivityClaim | null =>\n progress.owner === null\n ? null\n : ActivityClaim.make({\n key: progress.key,\n owner: progress.owner,\n epoch: progress.epoch,\n throughSequence: progress.throughSequence,\n leaseExpiresAt: progress.leaseExpiresAt,\n pending: progress.pending,\n });\n\nconst ownershipLost = (claim: ActivityClaim) =>\n ActivityOwnershipLost.make({ key: claim.key, owner: claim.owner, epoch: claim.epoch });\n\n// The pinned Node SQLite client's writable withTransaction begins with BEGIN IMMEDIATE.\n// Each mutation therefore locks before reading progress, which serializes independent\n// connections without a deferred read-to-write upgrade.\nconst makeActivityStore = Effect.fn(\"SqliteActivityStore.make\")(function* () {\n const sql = yield* SqlClientService.SqlClient;\n const failpoint = yield* ActivityMutationFailpoint;\n\n yield* failpoint.hit(\"activity:initialize:before\");\n yield* sql\n .withTransaction(\n Effect.gen(function* () {\n yield* sql`\n CREATE TABLE IF NOT EXISTS effect_agent_activity_metadata (\n component TEXT PRIMARY KEY NOT NULL,\n version INTEGER NOT NULL\n )\n `;\n\n const metadataRows = yield* sql<Record<string, unknown>>`\n SELECT version FROM effect_agent_activity_metadata\n WHERE component = ${METADATA_COMPONENT}\n `;\n\n const metadata = yield* decodeRows(\n ActivityMetadataRow,\n metadataRows,\n \"decode activity schema version\",\n );\n\n if (metadata.length > 1) {\n return yield* storeError(\"decode activity schema version\", \"corrupt\");\n }\n const currentVersion = metadata[0]?.version;\n\n if (currentVersion !== undefined && currentVersion !== STORAGE_VERSION) {\n return yield* storeError(\"initialize activity schema\", \"incompatible\");\n }\n if (currentVersion === undefined) {\n const tableRows = yield* sql<Record<string, unknown>>`\n SELECT name FROM sqlite_master\n WHERE type = 'table' AND name = ${STATE_TABLE}\n `;\n\n const existing = yield* decodeRows(\n ActivityTableRow,\n tableRows,\n \"inspect activity schema\",\n );\n\n if (existing.length > 0) {\n return yield* storeError(\"initialize activity schema\", \"incompatible\");\n }\n yield* sql`\n CREATE TABLE effect_agent_activity_processor_state_v1 (\n processor_id TEXT NOT NULL,\n processor_version TEXT NOT NULL,\n thread_id TEXT NOT NULL,\n format_version INTEGER NOT NULL,\n through_sequence INTEGER NOT NULL,\n epoch INTEGER NOT NULL,\n owner TEXT,\n lease_expires_at REAL NOT NULL,\n progress_json TEXT NOT NULL,\n PRIMARY KEY (processor_id, processor_version, thread_id)\n )\n `;\n yield* sql`\n INSERT INTO effect_agent_activity_metadata (component, version)\n VALUES (${METADATA_COMPONENT}, ${STORAGE_VERSION})\n `;\n }\n yield* sql`\n SELECT processor_id, processor_version, thread_id, format_version,\n through_sequence, epoch, owner, lease_expires_at, progress_json\n FROM effect_agent_activity_processor_state_v1\n LIMIT 0\n `;\n }),\n )\n .pipe(Effect.catchTag(\"SqlError\", () => Effect.fail(storeError(\"initialize activity schema\"))));\n yield* failpoint.hit(\"activity:initialize:after\");\n\n const readProgress = Effect.fn(\"SqliteActivityStore.readProgress\")(function* (\n key: ActivityProcessorKey,\n operation: string,\n ): Effect.fn.Return<ActivityProgress | null, ActivityStoreError> {\n const rawRows = yield* query(\n sql<Record<string, unknown>>`\n SELECT processor_id, processor_version, thread_id, format_version,\n through_sequence, epoch, owner, lease_expires_at, progress_json\n FROM effect_agent_activity_processor_state_v1\n WHERE processor_id = ${key.processorId}\n AND processor_version = ${key.processorVersion}\n AND thread_id = ${key.threadId}\n `,\n operation,\n );\n\n const rows = yield* decodeRows(ActivityStateRow, rawRows, operation);\n\n if (rows.length === 0) return null;\n if (rows.length !== 1) return yield* storeError(operation, \"corrupt\");\n const row = rows[0];\n\n if (row.format_version !== STORAGE_VERSION) {\n return yield* storeError(operation, \"incompatible\");\n }\n const progress = yield* decodeProgress(row.progress_json, operation);\n\n yield* validateProgress(progress, operation);\n if (\n !sameKey(progress.key, key) ||\n row.processor_id !== key.processorId ||\n row.processor_version !== key.processorVersion ||\n row.thread_id !== key.threadId ||\n row.through_sequence !== progress.throughSequence ||\n row.epoch !== progress.epoch ||\n row.owner !== progress.owner ||\n row.lease_expires_at !== progress.leaseExpiresAt\n ) {\n return yield* storeError(operation, \"corrupt\");\n }\n\n return progress;\n });\n\n const checkChanged = Effect.fn(\"SqliteActivityStore.checkChanged\")(function* (\n operation: string,\n ): Effect.fn.Return<void, ActivityStoreError> {\n const rawRows = yield* query(\n sql<Record<string, unknown>>`SELECT changes() AS changed`,\n operation,\n );\n\n const rows = yield* decodeRows(ActivityChangeCountRow, rawRows, operation);\n\n if (rows.length !== 1 || rows[0].changed !== 1) {\n return yield* storeError(operation, \"corrupt\");\n }\n });\n\n const insertProgress = Effect.fn(\"SqliteActivityStore.insertProgress\")(function* (\n progress: ActivityProgress,\n operation: string,\n ) {\n const progressJson = yield* encodeProgress(progress, operation);\n\n yield* sql`\n INSERT INTO effect_agent_activity_processor_state_v1 (\n processor_id, processor_version, thread_id, format_version, through_sequence,\n epoch, owner, lease_expires_at, progress_json\n ) VALUES (\n ${progress.key.processorId}, ${progress.key.processorVersion}, ${progress.key.threadId},\n ${STORAGE_VERSION}, ${progress.throughSequence}, ${progress.epoch}, ${progress.owner},\n ${progress.leaseExpiresAt}, ${progressJson}\n )\n `;\n yield* checkChanged(operation);\n });\n\n const updateProgress = Effect.fn(\"SqliteActivityStore.updateProgress\")(function* (\n current: ActivityProgress,\n next: ActivityProgress,\n operation: string,\n ) {\n const progressJson = yield* encodeProgress(next, operation);\n\n yield* sql`\n UPDATE effect_agent_activity_processor_state_v1\n SET format_version = ${STORAGE_VERSION},\n through_sequence = ${next.throughSequence},\n epoch = ${next.epoch},\n owner = ${next.owner},\n lease_expires_at = ${next.leaseExpiresAt},\n progress_json = ${progressJson}\n WHERE processor_id = ${current.key.processorId}\n AND processor_version = ${current.key.processorVersion}\n AND thread_id = ${current.key.threadId}\n AND through_sequence = ${current.throughSequence}\n AND epoch = ${current.epoch}\n `;\n yield* checkChanged(operation);\n });\n\n const requireLive = Effect.fn(\"SqliteActivityStore.requireLive\")(function* (\n progress: ActivityProgress | null,\n claim: ActivityClaim,\n requireSequence: boolean,\n ): Effect.fn.Return<ActivityProgress, ActivityOwnershipLost> {\n const now = yield* Clock.currentTimeMillis;\n\n if (\n progress === null ||\n !sameKey(progress.key, claim.key) ||\n progress.owner !== claim.owner ||\n progress.epoch !== claim.epoch ||\n progress.leaseExpiresAt <= now ||\n (requireSequence && progress.throughSequence !== claim.throughSequence)\n ) {\n return yield* ownershipLost(claim);\n }\n\n return progress;\n });\n\n const inspect: ActivityProcessorStore[\"Service\"][\"inspect\"] = Effect.fn(\n \"SqliteActivityStore.inspect\",\n )(function* (key) {\n const decodedKey = yield* decodeInput(ActivityProcessorKey, key, \"inspect activity progress\");\n\n return yield* readProgress(decodedKey, \"inspect activity progress\");\n });\n\n const claim: ActivityProcessorStore[\"Service\"][\"claim\"] = Effect.fn(\"SqliteActivityStore.claim\")(\n function* (request) {\n const operation = \"claim activity progress\";\n const decoded = yield* decodeInput(ActivityClaimRequest, request, operation);\n\n yield* failpoint.hit(\"activity:claim:before\");\n\n const claimed = yield* sql\n .withTransaction(\n Effect.gen(function* () {\n const current = yield* readProgress(decoded.key, operation);\n const now = yield* Clock.currentTimeMillis;\n\n if (current !== null && current.owner !== null && current.leaseExpiresAt > now) {\n return yield* ActivityBusy.make({\n key: decoded.key,\n leaseExpiresAt: current.leaseExpiresAt,\n });\n }\n\n const next = yield* Schema.decodeUnknownEffect(ActivityProgress)({\n version: STORAGE_VERSION,\n key: decoded.key,\n throughSequence: current?.throughSequence ?? 0,\n epoch: (current?.epoch ?? 0) + 1,\n owner: decoded.owner,\n leaseExpiresAt: now + decoded.leaseMillis,\n pending: current?.pending ?? null,\n advancedAt: current?.advancedAt ?? null,\n }).pipe(Effect.mapError(() => storeError(operation, \"corrupt\")));\n\n if (current === null) yield* insertProgress(next, operation);\n else yield* updateProgress(current, next, operation);\n yield* failpoint.hit(\"activity:claim:after-state\");\n const result = makeClaim(next);\n\n if (result === null) return yield* storeError(operation, \"corrupt\");\n\n return result;\n }),\n )\n .pipe(Effect.catchTag(\"SqlError\", () => Effect.fail(storeError(operation))));\n\n yield* failpoint.hit(\"activity:claim:after\");\n\n return claimed;\n },\n );\n\n const prepare: ActivityProcessorStore[\"Service\"][\"prepare\"] = Effect.fn(\n \"SqliteActivityStore.prepare\",\n )(function* (request) {\n const operation = \"prepare activity output\";\n const claim = yield* decodeInput(ActivityClaim, request.claim, operation);\n const work = yield* decodeInput(PreparedActivity, request.work, operation);\n\n yield* failpoint.hit(\"activity:prepare:before\");\n\n const result = yield* sql\n .withTransaction(\n Effect.gen(function* () {\n const current = yield* requireLive(\n yield* readProgress(claim.key, operation),\n claim,\n true,\n );\n\n if (current.pending !== null) {\n if (sameWork(current.pending, work)) {\n return { work: current.pending, changed: false } as const;\n }\n\n return yield* ActivityWorkConflict.make({ key: claim.key, workId: work.workId });\n }\n if (!sameKey(work.key, claim.key) || work.sequence !== current.throughSequence + 1) {\n return yield* ActivityWorkConflict.make({ key: claim.key, workId: work.workId });\n }\n const next = ActivityProgress.make({ ...current, pending: work });\n\n yield* updateProgress(current, next, operation);\n yield* failpoint.hit(\"activity:prepare:after-state\");\n\n return { work, changed: true } as const;\n }),\n )\n .pipe(Effect.catchTag(\"SqlError\", () => Effect.fail(storeError(operation))));\n\n if (result.changed) yield* failpoint.hit(\"activity:prepare:after\");\n\n return result.work;\n });\n\n const advance: ActivityProcessorStore[\"Service\"][\"advance\"] = Effect.fn(\n \"SqliteActivityStore.advance\",\n )(function* (request) {\n const operation = \"advance activity progress\";\n const claim = yield* decodeInput(ActivityClaim, request.claim, operation);\n const workId = yield* decodeInput(Digest, request.workId, operation);\n\n yield* failpoint.hit(\"activity:advance:before\");\n\n const nextClaim = yield* sql\n .withTransaction(\n Effect.gen(function* () {\n const current = yield* requireLive(\n yield* readProgress(claim.key, operation),\n claim,\n true,\n );\n\n if (current.pending === null || current.pending.workId !== workId) {\n return yield* ActivityWorkConflict.make({ key: claim.key, workId });\n }\n\n const next = ActivityProgress.make({\n ...current,\n throughSequence: current.pending.sequence,\n pending: null,\n advancedAt: yield* Clock.currentTimeMillis,\n });\n\n yield* updateProgress(current, next, operation);\n yield* failpoint.hit(\"activity:advance:after-state\");\n const result = makeClaim(next);\n\n if (result === null) return yield* storeError(operation, \"corrupt\");\n\n return result;\n }),\n )\n .pipe(Effect.catchTag(\"SqlError\", () => Effect.fail(storeError(operation))));\n\n yield* failpoint.hit(\"activity:advance:after\");\n\n return nextClaim;\n });\n\n const release: ActivityProcessorStore[\"Service\"][\"release\"] = Effect.fn(\n \"SqliteActivityStore.release\",\n )(function* (claim) {\n const operation = \"release activity claim\";\n const decoded = yield* decodeInput(ActivityClaim, claim, operation);\n\n yield* failpoint.hit(\"activity:release:before\");\n yield* sql\n .withTransaction(\n Effect.gen(function* () {\n const current = yield* readProgress(decoded.key, operation);\n\n if (\n current === null ||\n current.owner !== decoded.owner ||\n current.epoch !== decoded.epoch\n ) {\n return yield* ownershipLost(decoded);\n }\n const next = ActivityProgress.make({ ...current, owner: null, leaseExpiresAt: 0 });\n\n yield* updateProgress(current, next, operation);\n yield* failpoint.hit(\"activity:release:after-state\");\n }),\n )\n .pipe(Effect.catchTag(\"SqlError\", () => Effect.fail(storeError(operation))));\n yield* failpoint.hit(\"activity:release:after\");\n });\n\n return ActivityProcessorStore.of({ inspect, claim, prepare, advance, release });\n});\n\n/** SQLite activity progress with mutation failpoints kept injectable for recovery tests. */\nexport const activityProcessorStoreLayerWithFailpoints: Layer.Layer<\n ActivityProcessorStore,\n SqliteActivityInitializationError,\n SqlClientService.SqlClient | ActivityMutationFailpoint\n> = Layer.effect(ActivityProcessorStore, makeActivityStore());\n\n/** SQLite activity progress with the production no-op mutation failpoint. */\nexport const activityProcessorStoreLayer: Layer.Layer<\n ActivityProcessorStore,\n SqliteActivityInitializationError,\n SqlClientService.SqlClient\n> = activityProcessorStoreLayerWithFailpoints.pipe(Layer.provide(ActivityMutationFailpoint.layer));\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { a as SqliteStorageCompatibilityError, o as SqliteStorageCorruptionError, s as SqliteStorageError } from "./SqliteStorageError-DVWeaWLm.mjs";
2
+ import { SqliteStorageConfig } from "./SqliteStorageConfig.mjs";
3
+ import { SqliteStorageFailpoint } from "./SqliteStorageFailpoint.mjs";
4
+ import { MessageDeliveryError, MessageDeliveryStore, MessageDeliveryStoreLimits } from "@effect-agent/thread/MessageDelivery";
5
+ import { Layer } from "effect";
6
+ import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ declare namespace SqliteMessageDeliveryStore_d_exports {
8
+ export { messageDeliveryStoreLayer };
9
+ }
10
+ /** Source-owned message obligations in the host's existing SQLite database. */
11
+ declare const messageDeliveryStoreLayer: (limits?: MessageDeliveryStoreLimits) => Layer.Layer<MessageDeliveryStore, MessageDeliveryError | SqliteStorageCompatibilityError | SqliteStorageCorruptionError | SqliteStorageError, SqlClient.SqlClient | SqliteStorageConfig | SqliteStorageFailpoint>;
12
+ //#endregion
13
+ export { messageDeliveryStoreLayer, SqliteMessageDeliveryStore_d_exports as t };
14
+ //# sourceMappingURL=SqliteMessageDeliveryStore.d.mts.map
@@ -0,0 +1,24 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
+ import { a as initializeSqliteJournal } from "./sqlite-journal-D9xFxCw-.mjs";
3
+ import { MessageDeliveryError, MessageDeliveryStore } from "@effect-agent/thread/MessageDelivery";
4
+ import { SqlMessageDeliveryTransaction, makeSqlMessageDeliveryStore } from "@effect-agent/thread/SqlMessageDeliveryStore";
5
+ import { Effect, Layer } from "effect";
6
+ import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ //#region src/SqliteMessageDeliveryStore.ts
8
+ var SqliteMessageDeliveryStore_exports = /* @__PURE__ */ __exportAll({ messageDeliveryStoreLayer: () => messageDeliveryStoreLayer });
9
+ const transactions = Layer.effect(SqlMessageDeliveryTransaction, Effect.gen(function* () {
10
+ const sql = yield* SqlClient.SqlClient;
11
+ return SqlMessageDeliveryTransaction.of({ run: (body) => sql.withTransaction(body).pipe(Effect.catchTag("SqlError", () => MessageDeliveryError.make({
12
+ reason: "storage",
13
+ operation: "transaction"
14
+ }))) });
15
+ }));
16
+ /** Source-owned message obligations in the host's existing SQLite database. */
17
+ const messageDeliveryStoreLayer = (limits) => Layer.effect(MessageDeliveryStore, Effect.gen(function* () {
18
+ yield* initializeSqliteJournal();
19
+ return yield* makeSqlMessageDeliveryStore(limits, { maxStoredValueBytes: 16777216 });
20
+ })).pipe(Layer.provide(transactions));
21
+ //#endregion
22
+ export { messageDeliveryStoreLayer, SqliteMessageDeliveryStore_exports as t };
23
+
24
+ //# sourceMappingURL=SqliteMessageDeliveryStore.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteMessageDeliveryStore.mjs","names":[],"sources":["../src/SqliteMessageDeliveryStore.ts"],"sourcesContent":["import {\n MessageDeliveryError,\n MessageDeliveryStore,\n type MessageDeliveryStoreLimits,\n} from \"@effect-agent/thread/MessageDelivery\";\nimport {\n makeSqlMessageDeliveryStore,\n SqlMessageDeliveryTransaction,\n} from \"@effect-agent/thread/SqlMessageDeliveryStore\";\nimport { Effect, Layer } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nimport { initializeSqliteJournal } from \"./internal/sqlite-journal.ts\";\n\nconst transactions = Layer.effect(\n SqlMessageDeliveryTransaction,\n Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n return SqlMessageDeliveryTransaction.of({\n run: (body) =>\n sql\n .withTransaction(body)\n .pipe(\n Effect.catchTag(\"SqlError\", () =>\n MessageDeliveryError.make({ reason: \"storage\", operation: \"transaction\" }),\n ),\n ),\n });\n }),\n);\n\n/** Source-owned message obligations in the host's existing SQLite database. */\nexport const messageDeliveryStoreLayer = (limits?: MessageDeliveryStoreLimits) =>\n Layer.effect(\n MessageDeliveryStore,\n Effect.gen(function* () {\n yield* initializeSqliteJournal();\n\n return yield* makeSqlMessageDeliveryStore(limits, { maxStoredValueBytes: 16 * 1024 * 1024 });\n }),\n ).pipe(Layer.provide(transactions));\n"],"mappings":";;;;;;;;AAcA,MAAM,eAAe,MAAM,OACzB,+BACA,OAAO,IAAI,aAAa;CACtB,MAAM,MAAM,OAAO,UAAU;CAE7B,OAAO,8BAA8B,GAAG,EACtC,MAAM,SACJ,IACG,gBAAgB,IAAI,CAAC,CACrB,KACC,OAAO,SAAS,kBACd,qBAAqB,KAAK;EAAE,QAAQ;EAAW,WAAW;CAAc,CAAC,CAC3E,CACF,EACN,CAAC;AACH,CAAC,CACH;;AAGA,MAAa,6BAA6B,WACxC,MAAM,OACJ,sBACA,OAAO,IAAI,aAAa;CACtB,OAAO,wBAAwB;CAE/B,OAAO,OAAO,4BAA4B,QAAQ,EAAE,qBAAqB,SAAiB,CAAC;AAC7F,CAAC,CACH,CAAC,CAAC,KAAK,MAAM,QAAQ,YAAY,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { SqliteStorageConfig } from "./SqliteStorageConfig.mjs";
2
+ import { SqliteStorageFailpoint } from "./SqliteStorageFailpoint.mjs";
3
+ import { SqliteStorageInitializationError } from "./SqliteThreadStore.mjs";
4
+ import { Layer } from "effect";
5
+ import * as SqlClientService from "effect/unstable/sql/SqlClient";
6
+ import { ScheduleStore } from "@effect-agent/thread/Schedule";
7
+ declare namespace SqliteScheduleStore_d_exports {
8
+ export { scheduleStoreLayer };
9
+ }
10
+ /** SQLite implementation of the atomic ScheduleStore port. */
11
+ declare const scheduleStoreLayer: Layer.Layer<ScheduleStore, SqliteStorageInitializationError, SqliteStorageConfig | SqliteStorageFailpoint | SqlClientService.SqlClient>;
12
+ //#endregion
13
+ export { scheduleStoreLayer, SqliteScheduleStore_d_exports as t };
14
+ //# sourceMappingURL=SqliteScheduleStore.d.mts.map