@yielded/agent-storage-cloudflare 0.1.0-beta.167 → 0.1.0-beta.169

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 (71) hide show
  1. package/dist/DoMemoryStore.mjs +1 -1
  2. package/dist/DoMessageDeliveryStore.d.mts +1 -1
  3. package/dist/DoMessageDeliveryStore.mjs +3 -2
  4. package/dist/DoMessageDeliveryStore.mjs.map +1 -1
  5. package/dist/DoScheduleStore.mjs +16 -37
  6. package/dist/DoScheduleStore.mjs.map +1 -1
  7. package/dist/DoStorageConfig.d.mts +2 -10
  8. package/dist/DoStorageConfig.mjs +2 -11
  9. package/dist/DoStorageConfig.mjs.map +1 -1
  10. package/dist/{DoStorageError-CGuAfSwF.d.mts → DoStorageError-CxjMnzUA.d.mts} +7 -18
  11. package/dist/DoStorageError.d.mts +2 -2
  12. package/dist/DoStorageError.mjs +14 -30
  13. package/dist/DoStorageError.mjs.map +1 -1
  14. package/dist/DoStorageFailpoint.d.mts +1 -1
  15. package/dist/DoStorageFailpointTesting.d.mts +1 -1
  16. package/dist/{DoStorageVersion-iNSyi3cJ.d.mts → DoStorageVersion-DTFoLglB.d.mts} +3 -4
  17. package/dist/DoStorageVersion.d.mts +1 -1
  18. package/dist/DoStorageVersion.mjs +2 -2
  19. package/dist/DoStorageVersion.mjs.map +1 -1
  20. package/dist/DoSubmissionLedger.d.mts +7 -5
  21. package/dist/DoSubmissionLedger.mjs +378 -528
  22. package/dist/DoSubmissionLedger.mjs.map +1 -1
  23. package/dist/DoSubscriptionStore.mjs +5 -24
  24. package/dist/DoSubscriptionStore.mjs.map +1 -1
  25. package/dist/{DoThreadStore-D_83OjCH.d.mts → DoThreadStore-Bd4fTns3.d.mts} +17 -18
  26. package/dist/DoThreadStore-CwBvTLoq.mjs +468 -0
  27. package/dist/DoThreadStore-CwBvTLoq.mjs.map +1 -0
  28. package/dist/DoThreadStore.d.mts +2 -2
  29. package/dist/DoThreadStore.mjs +4 -529
  30. package/dist/MemoryProtocol.mjs +3 -3
  31. package/dist/MemoryProtocol.mjs.map +1 -1
  32. package/dist/PortProtocol.d.mts +11727 -3410
  33. package/dist/PortProtocol.mjs +103 -15
  34. package/dist/PortProtocol.mjs.map +1 -1
  35. package/dist/PortRouting.d.mts +14 -9
  36. package/dist/PortRouting.mjs +155 -29
  37. package/dist/PortRouting.mjs.map +1 -1
  38. package/dist/do-journal-Cawnsetj.mjs +761 -0
  39. package/dist/do-journal-Cawnsetj.mjs.map +1 -0
  40. package/dist/index.d.mts +3 -3
  41. package/dist/index.mjs +1 -1
  42. package/dist/migrations-D_EP3KYf.mjs +148 -0
  43. package/dist/migrations-D_EP3KYf.mjs.map +1 -0
  44. package/dist/{owned-state-DHm2aRXx.mjs → owned-state-BHzUi0eb.mjs} +50 -19
  45. package/dist/owned-state-BHzUi0eb.mjs.map +1 -0
  46. package/package.json +1 -1
  47. package/src/DoMessageDeliveryStore.ts +2 -1
  48. package/src/DoScheduleStore.ts +19 -59
  49. package/src/DoStorageConfig.ts +2 -11
  50. package/src/DoStorageError.ts +3 -26
  51. package/src/DoStorageVersion.ts +1 -1
  52. package/src/DoSubmissionLedger.ts +1806 -2030
  53. package/src/DoSubscriptionStore.ts +5 -47
  54. package/src/DoThreadStore.ts +276 -622
  55. package/src/MemoryProtocol.ts +3 -3
  56. package/src/PortProtocol.ts +198 -12
  57. package/src/PortRouting.ts +527 -108
  58. package/src/internal/canonical-append.ts +15 -0
  59. package/src/internal/do-journal.ts +548 -1440
  60. package/src/internal/migrations.ts +184 -287
  61. package/src/internal/owned-state.ts +81 -30
  62. package/src/internal/prompt-checkpoint.ts +158 -0
  63. package/src/internal/storage-span.ts +2 -5
  64. package/dist/DoThreadStore.mjs.map +0 -1
  65. package/dist/do-journal-DUhjZkOf.mjs +0 -1352
  66. package/dist/do-journal-DUhjZkOf.mjs.map +0 -1
  67. package/dist/migrations-DtKz_Gxr.mjs +0 -306
  68. package/dist/migrations-DtKz_Gxr.mjs.map +0 -1
  69. package/dist/owned-state-DHm2aRXx.mjs.map +0 -1
  70. package/src/internal/message-delivery-schema.ts +0 -24
  71. package/src/internal/recovery-checkpoint-schema.ts +0 -17
@@ -1 +0,0 @@
1
- {"version":3,"file":"owned-state-DHm2aRXx.mjs","names":[],"sources":["../src/internal/owned-state.ts"],"sourcesContent":["import { SqliteClient } from \"@effect/sql-sqlite-do\";\nimport { Context, Effect, Exit, Predicate, Schema, Semaphore } from \"effect\";\nimport { SqlClient } from \"effect/sql/SqlClient\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { DoStorageCorruptionError, DoStorageError } from \"../DoStorageError.ts\";\n\nconst ActiveState = Context.Reference<OwnedState | undefined>(\n \"@effect-agent/storage-cloudflare/internal/ActiveState\",\n { defaultValue: () => undefined },\n);\n\n/** One disposable view per physical Object database, including separately acquired adapters. */\nexport class OwnedState {\n private readonly gate = Semaphore.makeUnsafe(1);\n readonly invalidators = new Set<() => void>();\n\n readonly invalidate = Effect.sync(() => {\n for (const invalidate of this.invalidators) invalidate();\n });\n\n /** Cached readers must wait for the complete transaction, including rollback/commit. */\n readonly read = <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>\n Effect.flatMap(ActiveState, (active) =>\n active === this\n ? effect\n : this.gate.withPermits(1)(Effect.provideService(effect, ActiveState, this)),\n );\n\n readonly transaction = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n ): Effect.Effect<A, E | SqlError, R | SqlClient> =>\n this.read(\n Effect.flatMap(SqlClient, (sql) =>\n sql\n .withTransaction(effect)\n .pipe(Effect.onExit((exit) => (Exit.isFailure(exit) ? this.invalidate : Effect.void))),\n ),\n );\n}\n\nconst states = new WeakMap<object, OwnedState>();\n\n/** Explicit invalidation for maintenance that writes private tables outside the adapters. */\nexport const invalidateOwnedState = (storage: DurableObjectStorage): Effect.Effect<void> =>\n Effect.suspend(() => {\n const state = states.get(storage);\n\n return state === undefined ? Effect.void : state.read(state.invalidate);\n });\n\nconst DoClient = Schema.declare<SqliteClient.SqliteClient>(\n (value): value is SqliteClient.SqliteClient => Predicate.hasProperty(value, SqliteClient.TypeId),\n);\n\nexport const ownedState = (sql: SqlClient) =>\n Schema.decodeUnknownEffect(DoClient)(sql).pipe(\n Effect.mapError(() =>\n DoStorageError.make({\n operation: \"open owned state\",\n message: \"Owned state requires a Durable Object SQLite client.\",\n }),\n ),\n Effect.map((client) => {\n // Instrumentation may return a fresh SQL wrapper on every storage.sql access.\n const key = client.config.storage ?? client.config.db ?? client;\n let state = states.get(key);\n\n if (state === undefined) {\n state = new OwnedState();\n states.set(key, state);\n }\n\n return state;\n }),\n );\n\n/**\n * Demand-loaded row views. Writes apply SQLite's RETURNING rows to every retained view in\n * the same transaction; rollback discards them. Bounded views avoid loading a host's entire\n * retained submission history just to fence one live submission.\n */\nexport const ownedRows = <A, I>(\n schema: Schema.Codec<A, I>,\n table: string,\n key: (row: A) => string,\n identityColumn?: keyof A & string,\n uniqueFields: ReadonlyArray<ReadonlyArray<keyof A & string>> = [],\n) => {\n type View = {\n readonly id: string;\n readonly matches: (row: A) => boolean;\n readonly maxRows: number;\n readonly rows: ReadonlyArray<A>;\n readonly bytes: number;\n };\n const caches = new WeakMap<OwnedState, Map<string, View>>();\n\n return (state: OwnedState, sql: SqlClient) => {\n let cache = caches.get(state);\n\n if (cache === undefined) {\n cache = new Map();\n caches.set(state, cache);\n const current = cache;\n\n state.invalidators.add(() => current.clear());\n }\n const current = cache;\n\n const decode = (rows: unknown) =>\n Schema.decodeUnknownEffect(Schema.Array(schema))(rows).pipe(\n Effect.mapError(() =>\n DoStorageCorruptionError.make({\n table,\n rowKey: \"owned-state\",\n message: \"Stored rows do not satisfy the storage schema\",\n }),\n ),\n );\n\n const retain = (\n id: string,\n matches: View[\"matches\"],\n rows: ReadonlyArray<A>,\n maxRows: number,\n ) => {\n const bytes = new TextEncoder().encode(JSON.stringify(rows)).byteLength;\n\n current.delete(id);\n if (rows.length > maxRows || bytes > 4 * 1024 * 1024) return;\n current.set(id, { id, matches, maxRows, rows, bytes });\n let total = 0;\n\n for (const view of current.values()) total += view.bytes;\n while (current.size > 128 || total > 4 * 1024 * 1024) {\n const oldest = current.entries().next().value;\n\n if (oldest === undefined) break;\n total -= oldest[1].bytes;\n current.delete(oldest[0]);\n }\n };\n\n const matching = (\n id: string,\n matches: View[\"matches\"],\n query: Effect.Effect<ReadonlyArray<unknown>, SqlError>,\n maxRows = Infinity,\n ) =>\n state.read(\n Effect.gen(function* () {\n const view = current.get(id);\n\n if (view !== undefined) return view.rows;\n\n const rows = yield* decode(yield* query);\n\n retain(id, matches, rows, maxRows);\n\n return rows;\n }),\n );\n\n const by = (field: keyof A & string, value: string) =>\n matching(\n JSON.stringify([field, value]),\n (row) => row[field] === value,\n sql`SELECT * FROM ${sql(table)} WHERE ${sql(field)} = ${value}`,\n );\n\n // Only a source mutation proving the complete result may seed a view. This must run\n // under the owner transaction; rollback invalidates it with every other retained view.\n const seed = (field: keyof A & string, value: string, rows: ReadonlyArray<A>) =>\n retain(JSON.stringify([field, value]), (row) => row[field] === value, rows, Infinity);\n\n const byFields = (fields: ReadonlyArray<readonly [keyof A & string, string]>) =>\n matching(\n JSON.stringify(fields),\n (row) => fields.every(([field, value]) => row[field] === value),\n sql`SELECT * FROM ${sql(table)} WHERE ${sql.and(fields.map(([field, value]) => sql`${sql(field)} = ${value}`))}`,\n );\n\n const apply =\n (remove: boolean) =>\n <E, R>(effect: Effect.Effect<ReadonlyArray<unknown>, E, R>) =>\n Effect.gen(function* () {\n const rows = yield* decode(yield* effect);\n const changed = new Set(rows.map(key));\n\n for (const { id, matches, maxRows, rows: prior } of Array.from(current.values())) {\n const next = prior.filter((row) => !changed.has(key(row)));\n\n if (!remove) next.push(...rows.filter(matches));\n retain(id, matches, next, maxRows);\n }\n // A RETURNING row completely defines its unique-key view, even on a new Thread.\n if (identityColumn !== undefined)\n for (const row of rows) {\n const value = row[identityColumn];\n\n if (typeof value === \"string\")\n retain(\n JSON.stringify([identityColumn, value]),\n (row) => row[identityColumn] === value,\n remove ? [] : [row],\n Infinity,\n );\n }\n\n for (const row of rows)\n for (const fields of uniqueFields) {\n const values = fields.map((field) => [field, row[field]] as const);\n\n retain(\n JSON.stringify(values),\n (candidate) => values.every(([field, value]) => candidate[field] === value),\n remove ? [] : [row],\n 1,\n );\n }\n\n return rows;\n });\n\n return { by, byFields, matching, seed, write: apply(false), remove: apply(true) };\n };\n};\n"],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- import { Effect } from "effect";
2
- import * as SqlClient from "effect/sql/SqlClient";
3
-
4
- /** Additive storage owned by this adapter; creation participates in its version transaction. */
5
- export const createMessageDeliveryTables = Effect.gen(function* () {
6
- const sql = yield* SqlClient.SqlClient;
7
-
8
- yield* sql`
9
- CREATE TABLE effect_agent_message_deliveries (
10
- owner_thread_id TEXT NOT NULL,
11
- message_id TEXT NOT NULL,
12
- version INTEGER NOT NULL,
13
- state TEXT NOT NULL,
14
- deadline_at_millis INTEGER,
15
- record_json TEXT NOT NULL,
16
- PRIMARY KEY (owner_thread_id, message_id)
17
- )
18
- `.withoutTransform;
19
- yield* sql`
20
- CREATE INDEX effect_agent_message_deliveries_due
21
- ON effect_agent_message_deliveries (deadline_at_millis, owner_thread_id, message_id)
22
- WHERE deadline_at_millis IS NOT NULL
23
- `.withoutTransform;
24
- });
@@ -1,17 +0,0 @@
1
- import { Effect } from "effect";
2
- import * as SqlClient from "effect/sql/SqlClient";
3
-
4
- /** One disposable recovery snapshot per Thread, independent of generic projections. */
5
- export const createRecoveryCheckpointTable = Effect.gen(function* () {
6
- const sql = yield* SqlClient.SqlClient;
7
-
8
- yield* sql`
9
- CREATE TABLE effect_agent_recovery_checkpoints (
10
- thread_id TEXT PRIMARY KEY NOT NULL,
11
- through_sequence INTEGER NOT NULL,
12
- tail_digest TEXT NOT NULL,
13
- checkpoint_json TEXT NOT NULL,
14
- FOREIGN KEY (thread_id) REFERENCES effect_agent_threads(thread_id) ON DELETE RESTRICT
15
- )
16
- `.withoutTransform;
17
- });