@effect-agent/storage-cloudflare 0.1.0-beta.50 → 0.1.0-beta.52
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.
- package/dist/DoScheduleStore.mjs +1 -1
- package/dist/DoScheduleStore.mjs.map +1 -1
- package/dist/{DoStorageVersion-KrYUXqeJ.d.mts → DoStorageVersion-DxqcVgDE.d.mts} +2 -2
- package/dist/DoStorageVersion.d.mts +1 -1
- package/dist/DoStorageVersion.mjs +2 -2
- package/dist/DoSubmissionLedger.mjs +35 -6
- package/dist/DoSubmissionLedger.mjs.map +1 -1
- package/dist/DoSubscriptionStore.mjs +8 -4
- package/dist/DoSubscriptionStore.mjs.map +1 -1
- package/dist/{DoThreadStore-D00TdRAa.mjs → DoThreadStore-JqjeFOga.mjs} +8 -8
- package/dist/{DoThreadStore-D00TdRAa.mjs.map → DoThreadStore-JqjeFOga.mjs.map} +1 -1
- package/dist/DoThreadStore.mjs +1 -1
- package/dist/PortProtocol.d.mts +25 -3
- package/dist/PortProtocol.mjs +2 -1
- package/dist/PortProtocol.mjs.map +1 -1
- package/dist/PortRouting.mjs +2 -2
- package/dist/PortRouting.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{migrations-Bo4GU-pp.mjs → migrations-B-jiT7vx.mjs} +9 -3
- package/dist/migrations-B-jiT7vx.mjs.map +1 -0
- package/package.json +1 -1
- package/src/DoScheduleStore.ts +1 -1
- package/src/DoSubmissionLedger.ts +61 -3
- package/src/DoSubscriptionStore.ts +8 -4
- package/src/PortProtocol.ts +2 -0
- package/src/PortRouting.ts +2 -1
- package/src/internal/migrations.ts +8 -1
- package/dist/migrations-Bo4GU-pp.mjs.map +0 -1
package/dist/DoScheduleStore.mjs
CHANGED
|
@@ -9,7 +9,7 @@ var DoScheduleStore_exports = /* @__PURE__ */ __exportAll({
|
|
|
9
9
|
DoScheduleTransaction: () => DoScheduleTransaction,
|
|
10
10
|
scheduleStoreLayer: () => scheduleStoreLayer
|
|
11
11
|
});
|
|
12
|
-
const CURRENT_SCHEDULE_STORE_VERSION =
|
|
12
|
+
const CURRENT_SCHEDULE_STORE_VERSION = 3;
|
|
13
13
|
const StoredScheduleJson = Schema.String.check(Schema.isMaxLength(19e5));
|
|
14
14
|
const StoredDeadline = Schema.NullOr(ScheduleInstant);
|
|
15
15
|
var ScheduleRow = class extends Schema.Class("@effect-agent/storage-cloudflare/ScheduleRow")({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DoScheduleStore.mjs","names":[],"sources":["../src/DoScheduleStore.ts"],"sourcesContent":["import {\n ScheduleCapacityError,\n ScheduleDueCursor,\n defaultSchedulingLimits,\n ScheduleChange,\n ScheduleConflict,\n ScheduleFailpoint,\n type ScheduleFailpointError,\n ScheduleKey,\n ScheduleId,\n ScheduleInstant,\n ScheduleNotFound,\n ScheduleOwner,\n type SchedulePage,\n SchedulePageRequest,\n ScheduleRecord,\n ScheduleStorageError,\n ScheduleStore,\n} from \"@effect-agent/thread/Schedule\";\nimport {\n applyScheduleChange,\n scheduleUsesCapacity,\n scheduleDeadline,\n} from \"@effect-agent/thread/ScheduleTransition\";\nimport { Context, Effect, Layer, Result, Schema } from \"effect\";\nimport * as SqlClientService from \"effect/unstable/sql/SqlClient\";\n\nconst CURRENT_SCHEDULE_STORE_VERSION = 2;\nconst MAX_STORED_SCHEDULE_BYTES = 1_900_000;\n\nconst StoredScheduleJson = Schema.String.check(Schema.isMaxLength(MAX_STORED_SCHEDULE_BYTES));\nconst StoredDeadline = Schema.NullOr(ScheduleInstant);\n\nclass ScheduleRow extends Schema.Class<ScheduleRow>(\"@effect-agent/storage-cloudflare/ScheduleRow\")(\n {\n tenant_id: ScheduleOwner.fields.tenantId,\n owner_id: ScheduleOwner.fields.ownerId,\n schedule_id: ScheduleId,\n deadline_at_millis: StoredDeadline,\n record_json: StoredScheduleJson,\n },\n) {}\n\nconst ScheduleDueRow = Schema.Struct({\n tenant_id: ScheduleOwner.fields.tenantId,\n owner_id: ScheduleOwner.fields.ownerId,\n schedule_id: ScheduleId,\n deadline_at_millis: ScheduleInstant,\n});\n\nclass ScheduleCountRow extends Schema.Class<ScheduleCountRow>(\n \"@effect-agent/storage-cloudflare/ScheduleCountRow\",\n)({\n schedule_count: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n}) {}\n\nclass ScheduleDeadlineRow extends Schema.Class<ScheduleDeadlineRow>(\n \"@effect-agent/storage-cloudflare/ScheduleDeadlineRow\",\n)({\n deadline_at_millis: StoredDeadline,\n}) {}\n\nclass ScheduleStoreStateRow extends Schema.Class<ScheduleStoreStateRow>(\n \"@effect-agent/storage-cloudflare/ScheduleStoreStateRow\",\n)({\n storage_version: Schema.Int.check(Schema.isGreaterThan(0)),\n alarm_generation: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n}) {}\n\nclass ScheduleTableNameRow extends Schema.Class<ScheduleTableNameRow>(\n \"@effect-agent/storage-cloudflare/ScheduleTableNameRow\",\n)({\n name: Schema.String,\n}) {}\n\nexport interface DoScheduleAlarmReplacement {\n readonly deadlineAtMillis: number | null;\n /** Included in every logical alarm payload so equal-time replacement stays distinguishable. */\n readonly generation: number;\n}\n\nexport type DoScheduleReplaceAlarm = (\n replacement: DoScheduleAlarmReplacement,\n) => Effect.Effect<void, ScheduleStorageError>;\n\n/**\n * Platform-owned transaction boundary for schedule SQL and logical alarm mutation. The callback\n * and its `replaceAlarm` capability belong to one fiber and must not escape or fork.\n */\nexport class DoScheduleTransaction extends Context.Service<\n DoScheduleTransaction,\n {\n readonly run: <A, E, R>(\n body: (replaceAlarm: DoScheduleReplaceAlarm) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | ScheduleStorageError, R>;\n }\n>()(\"@effect-agent/storage-cloudflare/DoScheduleTransaction\") {}\n\n/** Platform driver operations that use the same schedule-state and alarm transaction. */\nexport class DoScheduleAlarmControl extends Context.Service<\n DoScheduleAlarmControl,\n {\n /** Establish a future recovery wake before cross-Object admission starts. */\n readonly prearm: (\n deadlineAtMillis: number,\n ) => Effect.Effect<void, ScheduleStorageError | ScheduleFailpointError>;\n /** Replace or cancel the wake from the object's authoritative indexed deadline. */\n readonly reconcile: Effect.Effect<void, ScheduleStorageError | ScheduleFailpointError>;\n }\n>()(\"@effect-agent/storage-cloudflare/DoScheduleAlarmControl\") {}\n\nconst unavailable = (operation: string): ScheduleStorageError =>\n ScheduleStorageError.make({ operation, reason: \"unavailable\" });\n\nconst corrupt = (operation: string): ScheduleStorageError =>\n ScheduleStorageError.make({ operation, reason: \"corrupt\" });\n\nconst decodeRows = Effect.fn(\"DoScheduleStore.decodeRows\")(function* <A, I, R>(\n schema: Schema.Codec<A, I, R>,\n rows: ReadonlyArray<unknown>,\n operation: string,\n): Effect.fn.Return<A, ScheduleStorageError, R> {\n return yield* Schema.decodeUnknownEffect(schema)(rows).pipe(\n Effect.mapError(() => corrupt(operation)),\n );\n});\n\nconst decodeBoundary = <A, I, R>(\n schema: Schema.Codec<A, I, R>,\n value: unknown,\n operation: string,\n): Effect.Effect<A, ScheduleStorageError, R> =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => corrupt(operation)));\n\nconst decodeRecord = Effect.fn(\"DoScheduleStore.decodeRecord\")(function* (\n row: ScheduleRow,\n): Effect.fn.Return<ScheduleRecord, ScheduleStorageError> {\n const record = yield* Schema.decodeEffect(Schema.fromJsonString(ScheduleRecord))(\n row.record_json,\n ).pipe(Effect.mapError(() => corrupt(\"decode schedule\")));\n\n if (\n record.owner.tenantId !== row.tenant_id ||\n record.owner.ownerId !== row.owner_id ||\n record.scheduleId !== row.schedule_id ||\n scheduleDeadline(record) !== row.deadline_at_millis\n ) {\n return yield* corrupt(\"decode schedule index\");\n }\n\n return record;\n});\n\nconst encodeRecord = Effect.fn(\"DoScheduleStore.encodeRecord\")(function* (\n record: ScheduleRecord,\n): Effect.fn.Return<string, ScheduleStorageError> {\n const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(ScheduleRecord))(record).pipe(\n Effect.mapError(() => corrupt(\"encode schedule\")),\n );\n\n return yield* Schema.decodeUnknownEffect(StoredScheduleJson)(encoded).pipe(\n Effect.mapError(() => corrupt(\"encode schedule bounds\")),\n );\n});\n\nconst initializeScheduleStore = Effect.fn(\"DoScheduleStore.initialize\")(function* () {\n const sql = yield* SqlClientService.SqlClient;\n const operation = \"initialize schedule store\";\n\n const rawTables = yield* sql<Record<string, unknown>>`\n SELECT name\n FROM sqlite_master\n WHERE type = 'table'\n AND name IN (\n 'effect_agent_schedule_store_state',\n 'effect_agent_schedules'\n )\n ORDER BY name\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const tables = yield* decodeRows(Schema.Array(ScheduleTableNameRow), rawTables, operation);\n const hasState = tables.some((row) => row.name === \"effect_agent_schedule_store_state\");\n const hasSchedules = tables.some((row) => row.name === \"effect_agent_schedules\");\n\n if (!hasState) {\n if (hasSchedules) return yield* corrupt(operation);\n yield* sql\n .withTransaction(\n Effect.gen(function* () {\n yield* sql`\n CREATE TABLE effect_agent_schedule_store_state (\n singleton INTEGER PRIMARY KEY NOT NULL CHECK (singleton = 1),\n storage_version INTEGER NOT NULL,\n alarm_generation INTEGER NOT NULL\n )\n `.withoutTransform;\n yield* sql`\n CREATE TABLE effect_agent_schedules (\n tenant_id TEXT NOT NULL,\n owner_id TEXT NOT NULL,\n schedule_id TEXT NOT NULL,\n deadline_at_millis INTEGER,\n record_json TEXT NOT NULL,\n PRIMARY KEY (tenant_id, owner_id, schedule_id)\n )\n `.withoutTransform;\n yield* sql`\n CREATE INDEX effect_agent_schedules_deadline\n ON effect_agent_schedules (deadline_at_millis, tenant_id, owner_id, schedule_id)\n WHERE deadline_at_millis IS NOT NULL\n `.withoutTransform;\n yield* sql`\n CREATE INDEX effect_agent_schedules_owner_deadline\n ON effect_agent_schedules (tenant_id, owner_id, deadline_at_millis, schedule_id)\n WHERE deadline_at_millis IS NOT NULL\n `.withoutTransform;\n yield* sql`\n INSERT INTO effect_agent_schedule_store_state (\n singleton, storage_version, alarm_generation\n ) VALUES (1, ${CURRENT_SCHEDULE_STORE_VERSION}, 0)\n `.withoutTransform;\n }),\n )\n .pipe(Effect.mapError(() => unavailable(operation)));\n\n return;\n }\n\n if (!hasSchedules) return yield* corrupt(operation);\n\n const rawState = yield* sql<Record<string, unknown>>`\n SELECT storage_version, alarm_generation\n FROM effect_agent_schedule_store_state\n WHERE singleton = 1\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const state = yield* decodeRows(Schema.Array(ScheduleStoreStateRow), rawState, operation);\n\n if (state.length !== 1 || state[0].storage_version !== CURRENT_SCHEDULE_STORE_VERSION) {\n return yield* corrupt(\n state.length === 1\n ? `${operation}: incompatible storage version ${state[0].storage_version}; expected ${CURRENT_SCHEDULE_STORE_VERSION}`\n : `${operation}: invalid storage version row`,\n );\n }\n});\n\nconst makeServices = Effect.gen(function* () {\n const sql = yield* SqlClientService.SqlClient;\n const transactions = yield* DoScheduleTransaction;\n const scheduleFailpoint = yield* ScheduleFailpoint;\n\n yield* initializeScheduleStore();\n\n const readRows = Effect.fn(\"DoScheduleStore.readRows\")(function* (\n key: ScheduleKey,\n operation: string,\n ): Effect.fn.Return<ReadonlyArray<ScheduleRow>, ScheduleStorageError> {\n const rows = yield* sql<Record<string, unknown>>`\n SELECT tenant_id, owner_id, schedule_id, deadline_at_millis, record_json\n FROM effect_agent_schedules\n WHERE tenant_id = ${key.owner.tenantId}\n AND owner_id = ${key.owner.ownerId}\n AND schedule_id = ${key.scheduleId}\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n return yield* decodeRows(Schema.Array(ScheduleRow), rows, operation);\n });\n\n const readOne = Effect.fn(\"DoScheduleStore.readOne\")(function* (\n key: ScheduleKey,\n operation: string,\n ): Effect.fn.Return<ScheduleRecord | null, ScheduleStorageError> {\n const rows = yield* readRows(key, operation);\n\n if (rows.length === 0) return null;\n if (rows.length !== 1) return yield* corrupt(operation);\n\n return yield* decodeRecord(rows[0]);\n });\n\n const readNextDeadline = Effect.fn(\"DoScheduleStore.readNextDeadline\")(function* (\n owner: ScheduleOwner | undefined,\n operation: string,\n ): Effect.fn.Return<number | null, ScheduleStorageError> {\n const rows =\n owner === undefined\n ? yield* sql<Record<string, unknown>>`\n SELECT MIN(deadline_at_millis) AS deadline_at_millis\n FROM effect_agent_schedules\n WHERE deadline_at_millis IS NOT NULL\n `.pipe(Effect.mapError(() => unavailable(operation)))\n : yield* sql<Record<string, unknown>>`\n SELECT MIN(deadline_at_millis) AS deadline_at_millis\n FROM effect_agent_schedules\n WHERE tenant_id = ${owner.tenantId}\n AND owner_id = ${owner.ownerId}\n AND deadline_at_millis IS NOT NULL\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const decoded = yield* decodeRows(Schema.Array(ScheduleDeadlineRow), rows, operation);\n\n if (decoded.length !== 1) return yield* corrupt(operation);\n\n return decoded[0].deadline_at_millis;\n });\n\n const replaceAlarm = Effect.fn(\"DoScheduleStore.replaceAlarm\")(function* (\n replace: DoScheduleReplaceAlarm,\n deadlineAtMillis: number | null,\n operation: string,\n ) {\n const rawState = yield* sql<Record<string, unknown>>`\n UPDATE effect_agent_schedule_store_state\n SET alarm_generation = alarm_generation + 1\n WHERE singleton = 1\n RETURNING storage_version, alarm_generation\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const state = yield* decodeRows(Schema.Array(ScheduleStoreStateRow), rawState, operation);\n\n if (state.length !== 1 || state[0].storage_version !== CURRENT_SCHEDULE_STORE_VERSION) {\n return yield* corrupt(operation);\n }\n yield* scheduleFailpoint.hit(\"schedule:alarm:before\");\n yield* replace({ deadlineAtMillis, generation: state[0].alarm_generation });\n yield* scheduleFailpoint.hit(\"schedule:alarm:after\");\n });\n\n const insert: ScheduleStore[\"Service\"][\"insert\"] = Effect.fn(\"DoScheduleStore.insert\")(\n function* (record, ownerLimit) {\n const operation = \"insert schedule\";\n const canonical = yield* decodeBoundary(ScheduleRecord, record, operation);\n const recordJson = yield* encodeRecord(canonical);\n\n const result = yield* transactions.run((replace) =>\n Effect.gen(function* () {\n const existing = yield* readOne(canonical, operation);\n\n if (existing !== null) {\n if (existing.creationFingerprint === canonical.creationFingerprint) {\n return { record: existing, inserted: false } as const;\n }\n\n return yield* ScheduleConflict.make({ reason: \"creation\", key: canonical });\n }\n\n const rawCounts = yield* sql<Record<string, unknown>>`\n SELECT COUNT(*) AS schedule_count\n FROM effect_agent_schedules\n WHERE tenant_id = ${canonical.owner.tenantId}\n AND owner_id = ${canonical.owner.ownerId}\n AND (json_extract(record_json, '$.pending') IS NOT NULL OR\n (json_extract(record_json, '$.state') != 'cancelled' AND json_extract(record_json, '$.nextAtMillis') IS NOT NULL))\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const counts = yield* decodeRows(Schema.Array(ScheduleCountRow), rawCounts, operation);\n\n if (counts.length !== 1) return yield* corrupt(operation);\n if (counts[0].schedule_count >= ownerLimit) {\n return yield* ScheduleCapacityError.make({ limit: ownerLimit });\n }\n yield* scheduleFailpoint.hit(\"schedule:insert:before\");\n yield* sql`\n INSERT INTO effect_agent_schedules (\n tenant_id, owner_id, schedule_id, deadline_at_millis, record_json\n ) VALUES (\n ${canonical.owner.tenantId},\n ${canonical.owner.ownerId},\n ${canonical.scheduleId},\n ${scheduleDeadline(canonical)},\n ${recordJson}\n )\n `.pipe(Effect.mapError(() => unavailable(operation)));\n const deadline = yield* readNextDeadline(undefined, operation);\n\n yield* replaceAlarm(replace, deadline, operation);\n\n return { record: canonical, inserted: true } as const;\n }),\n );\n\n if (result.inserted) yield* scheduleFailpoint.hit(\"schedule:insert:after\");\n\n return result.record;\n },\n );\n\n const get: ScheduleStore[\"Service\"][\"get\"] = Effect.fn(\"DoScheduleStore.get\")(function* (key) {\n const canonical = yield* decodeBoundary(ScheduleKey, key, \"get schedule\");\n\n return yield* readOne(canonical, \"get schedule\");\n });\n\n const list: ScheduleStore[\"Service\"][\"list\"] = Effect.fn(\"DoScheduleStore.list\")(function* (\n requestValue: SchedulePageRequest,\n ): Effect.fn.Return<SchedulePage, ScheduleStorageError> {\n const operation = \"list schedules\";\n const request = yield* decodeBoundary(SchedulePageRequest, requestValue, operation);\n\n const rows =\n request.after === undefined\n ? yield* sql<Record<string, unknown>>`\n SELECT tenant_id, owner_id, schedule_id, deadline_at_millis, record_json\n FROM effect_agent_schedules\n WHERE tenant_id = ${request.owner.tenantId}\n AND owner_id = ${request.owner.ownerId}\n ORDER BY schedule_id\n LIMIT ${request.limit + 1}\n `.pipe(Effect.mapError(() => unavailable(operation)))\n : yield* sql<Record<string, unknown>>`\n SELECT tenant_id, owner_id, schedule_id, deadline_at_millis, record_json\n FROM effect_agent_schedules\n WHERE tenant_id = ${request.owner.tenantId}\n AND owner_id = ${request.owner.ownerId}\n AND schedule_id > ${request.after}\n ORDER BY schedule_id\n LIMIT ${request.limit + 1}\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const decoded = yield* decodeRows(Schema.Array(ScheduleRow), rows, operation);\n const records = yield* Effect.forEach(decoded, decodeRecord);\n const hasNext = records.length > request.limit;\n const items = hasNext ? records.slice(0, request.limit) : records;\n\n return { items, next: hasNext ? (items.at(-1)?.scheduleId ?? null) : null };\n });\n\n const change: ScheduleStore[\"Service\"][\"change\"] = Effect.fn(\"DoScheduleStore.change\")(function* (\n key,\n change,\n ownerLimit = defaultSchedulingLimits.maxSchedulesPerOwner,\n ) {\n const operation = \"change schedule\";\n const canonicalKey = yield* decodeBoundary(ScheduleKey, key, operation);\n const canonicalChange = yield* decodeBoundary(ScheduleChange, change, operation);\n\n const result = yield* transactions.run((replace) =>\n Effect.gen(function* () {\n const current = yield* readOne(canonicalKey, operation);\n\n if (current === null) return yield* ScheduleNotFound.make({ key: canonicalKey });\n const transition = applyScheduleChange(current, canonicalChange);\n\n if (Result.isFailure(transition)) return yield* transition.failure;\n const next = transition.success;\n\n if (!scheduleUsesCapacity(current) && scheduleUsesCapacity(next)) {\n const rawCounts = yield* sql<Record<string, unknown>>`\n SELECT COUNT(*) AS schedule_count FROM effect_agent_schedules\n WHERE tenant_id = ${key.owner.tenantId} AND owner_id = ${key.owner.ownerId}\n AND (json_extract(record_json, '$.pending') IS NOT NULL OR\n (json_extract(record_json, '$.state') != 'cancelled' AND json_extract(record_json, '$.nextAtMillis') IS NOT NULL))\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const counts = yield* decodeRows(Schema.Array(ScheduleCountRow), rawCounts, operation);\n\n if (counts.length !== 1) return yield* corrupt(operation);\n if (counts[0].schedule_count >= ownerLimit)\n return yield* ScheduleCapacityError.make({ limit: ownerLimit });\n }\n if (next === current) return { record: current, changed: false } as const;\n const recordJson = yield* encodeRecord(next);\n\n yield* scheduleFailpoint.hit(`schedule:${canonicalChange._tag.toLowerCase()}:before`);\n yield* sql`\n UPDATE effect_agent_schedules\n SET deadline_at_millis = ${scheduleDeadline(next)}, record_json = ${recordJson}\n WHERE tenant_id = ${canonicalKey.owner.tenantId}\n AND owner_id = ${canonicalKey.owner.ownerId}\n AND schedule_id = ${canonicalKey.scheduleId}\n `.pipe(Effect.mapError(() => unavailable(operation)));\n const deadline = yield* readNextDeadline(undefined, operation);\n\n yield* replaceAlarm(replace, deadline, operation);\n\n return { record: next, changed: true } as const;\n }),\n );\n\n if (result.changed) {\n yield* scheduleFailpoint.hit(`schedule:${canonicalChange._tag.toLowerCase()}:after`);\n }\n\n return result.record;\n });\n\n const due: ScheduleStore[\"Service\"][\"due\"] = Effect.fn(\"DoScheduleStore.due\")(function* (\n nowMillis,\n limit,\n owner?: ScheduleOwner,\n after?: ScheduleDueCursor,\n ) {\n const operation = \"query due schedules\";\n\n const cursor =\n after === undefined\n ? undefined\n : yield* Schema.decodeUnknownEffect(ScheduleDueCursor)(after).pipe(\n Effect.mapError(() => corrupt(operation)),\n );\n\n const continuation =\n cursor === undefined\n ? sql`1 = 1`\n : sql`\n (deadline_at_millis, tenant_id, owner_id, schedule_id) >\n (${cursor.deadlineAtMillis}, ${cursor.owner.tenantId}, ${cursor.owner.ownerId}, ${cursor.scheduleId})`;\n\n const rows =\n owner === undefined\n ? yield* sql<Record<string, unknown>>`\n SELECT tenant_id, owner_id, schedule_id, deadline_at_millis\n FROM effect_agent_schedules\n WHERE deadline_at_millis <= ${nowMillis} AND ${continuation}\n ORDER BY deadline_at_millis, tenant_id, owner_id, schedule_id\n LIMIT ${limit}\n `.pipe(Effect.mapError(() => unavailable(operation)))\n : yield* sql<Record<string, unknown>>`\n SELECT tenant_id, owner_id, schedule_id, deadline_at_millis\n FROM effect_agent_schedules\n WHERE tenant_id = ${owner.tenantId}\n AND owner_id = ${owner.ownerId}\n AND deadline_at_millis <= ${nowMillis} AND ${continuation}\n ORDER BY deadline_at_millis, schedule_id\n LIMIT ${limit}\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const decoded = yield* decodeRows(Schema.Array(ScheduleDueRow), rows, operation);\n\n return decoded.map((row) => ({\n owner: { tenantId: row.tenant_id, ownerId: row.owner_id },\n scheduleId: row.schedule_id,\n deadlineAtMillis: row.deadline_at_millis,\n }));\n });\n\n const nextDeadline: ScheduleStore[\"Service\"][\"nextDeadline\"] = Effect.fn(\n \"DoScheduleStore.nextDeadline\",\n )(function* (owner?: ScheduleOwner) {\n const operation = \"query next schedule deadline\";\n\n return yield* readNextDeadline(owner, operation);\n });\n\n const prearm = Effect.fn(\"DoScheduleStore.prearm\")(function* (\n deadlineAtMillis: number,\n ): Effect.fn.Return<void, ScheduleStorageError | ScheduleFailpointError> {\n yield* decodeBoundary(ScheduleInstant, deadlineAtMillis, \"pre-arm schedule recovery\");\n yield* transactions.run((replace) =>\n replaceAlarm(replace, deadlineAtMillis, \"pre-arm schedule recovery\"),\n );\n yield* scheduleFailpoint.hit(\"schedule:prearm:after\");\n });\n\n const reconcile = Effect.gen(function* () {\n yield* transactions.run((replace) =>\n Effect.gen(function* () {\n const deadline = yield* readNextDeadline(undefined, \"reconcile schedule alarm\");\n\n yield* replaceAlarm(replace, deadline, \"reconcile schedule alarm\");\n }),\n );\n yield* scheduleFailpoint.hit(\"schedule:reconcile:after\");\n });\n\n return Context.make(ScheduleStore, {\n insert,\n get,\n list,\n change,\n due,\n nextDeadline,\n }).pipe(Context.add(DoScheduleAlarmControl, { prearm, reconcile }));\n});\n\n/**\n * Durable Object SQLite ScheduleStore. Platform code supplies the one transaction owner that\n * combines these SQL mutations with its logical and native alarm lifecycle.\n */\nexport const scheduleStoreLayer: Layer.Layer<\n ScheduleStore | DoScheduleAlarmControl,\n ScheduleStorageError,\n SqlClientService.SqlClient | DoScheduleTransaction\n> = Layer.effectContext(makeServices);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DoScheduleStore.mjs","names":[],"sources":["../src/DoScheduleStore.ts"],"sourcesContent":["import {\n ScheduleCapacityError,\n ScheduleDueCursor,\n defaultSchedulingLimits,\n ScheduleChange,\n ScheduleConflict,\n ScheduleFailpoint,\n type ScheduleFailpointError,\n ScheduleKey,\n ScheduleId,\n ScheduleInstant,\n ScheduleNotFound,\n ScheduleOwner,\n type SchedulePage,\n SchedulePageRequest,\n ScheduleRecord,\n ScheduleStorageError,\n ScheduleStore,\n} from \"@effect-agent/thread/Schedule\";\nimport {\n applyScheduleChange,\n scheduleUsesCapacity,\n scheduleDeadline,\n} from \"@effect-agent/thread/ScheduleTransition\";\nimport { Context, Effect, Layer, Result, Schema } from \"effect\";\nimport * as SqlClientService from \"effect/unstable/sql/SqlClient\";\n\nconst CURRENT_SCHEDULE_STORE_VERSION = 3;\nconst MAX_STORED_SCHEDULE_BYTES = 1_900_000;\n\nconst StoredScheduleJson = Schema.String.check(Schema.isMaxLength(MAX_STORED_SCHEDULE_BYTES));\nconst StoredDeadline = Schema.NullOr(ScheduleInstant);\n\nclass ScheduleRow extends Schema.Class<ScheduleRow>(\"@effect-agent/storage-cloudflare/ScheduleRow\")(\n {\n tenant_id: ScheduleOwner.fields.tenantId,\n owner_id: ScheduleOwner.fields.ownerId,\n schedule_id: ScheduleId,\n deadline_at_millis: StoredDeadline,\n record_json: StoredScheduleJson,\n },\n) {}\n\nconst ScheduleDueRow = Schema.Struct({\n tenant_id: ScheduleOwner.fields.tenantId,\n owner_id: ScheduleOwner.fields.ownerId,\n schedule_id: ScheduleId,\n deadline_at_millis: ScheduleInstant,\n});\n\nclass ScheduleCountRow extends Schema.Class<ScheduleCountRow>(\n \"@effect-agent/storage-cloudflare/ScheduleCountRow\",\n)({\n schedule_count: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n}) {}\n\nclass ScheduleDeadlineRow extends Schema.Class<ScheduleDeadlineRow>(\n \"@effect-agent/storage-cloudflare/ScheduleDeadlineRow\",\n)({\n deadline_at_millis: StoredDeadline,\n}) {}\n\nclass ScheduleStoreStateRow extends Schema.Class<ScheduleStoreStateRow>(\n \"@effect-agent/storage-cloudflare/ScheduleStoreStateRow\",\n)({\n storage_version: Schema.Int.check(Schema.isGreaterThan(0)),\n alarm_generation: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n}) {}\n\nclass ScheduleTableNameRow extends Schema.Class<ScheduleTableNameRow>(\n \"@effect-agent/storage-cloudflare/ScheduleTableNameRow\",\n)({\n name: Schema.String,\n}) {}\n\nexport interface DoScheduleAlarmReplacement {\n readonly deadlineAtMillis: number | null;\n /** Included in every logical alarm payload so equal-time replacement stays distinguishable. */\n readonly generation: number;\n}\n\nexport type DoScheduleReplaceAlarm = (\n replacement: DoScheduleAlarmReplacement,\n) => Effect.Effect<void, ScheduleStorageError>;\n\n/**\n * Platform-owned transaction boundary for schedule SQL and logical alarm mutation. The callback\n * and its `replaceAlarm` capability belong to one fiber and must not escape or fork.\n */\nexport class DoScheduleTransaction extends Context.Service<\n DoScheduleTransaction,\n {\n readonly run: <A, E, R>(\n body: (replaceAlarm: DoScheduleReplaceAlarm) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | ScheduleStorageError, R>;\n }\n>()(\"@effect-agent/storage-cloudflare/DoScheduleTransaction\") {}\n\n/** Platform driver operations that use the same schedule-state and alarm transaction. */\nexport class DoScheduleAlarmControl extends Context.Service<\n DoScheduleAlarmControl,\n {\n /** Establish a future recovery wake before cross-Object admission starts. */\n readonly prearm: (\n deadlineAtMillis: number,\n ) => Effect.Effect<void, ScheduleStorageError | ScheduleFailpointError>;\n /** Replace or cancel the wake from the object's authoritative indexed deadline. */\n readonly reconcile: Effect.Effect<void, ScheduleStorageError | ScheduleFailpointError>;\n }\n>()(\"@effect-agent/storage-cloudflare/DoScheduleAlarmControl\") {}\n\nconst unavailable = (operation: string): ScheduleStorageError =>\n ScheduleStorageError.make({ operation, reason: \"unavailable\" });\n\nconst corrupt = (operation: string): ScheduleStorageError =>\n ScheduleStorageError.make({ operation, reason: \"corrupt\" });\n\nconst decodeRows = Effect.fn(\"DoScheduleStore.decodeRows\")(function* <A, I, R>(\n schema: Schema.Codec<A, I, R>,\n rows: ReadonlyArray<unknown>,\n operation: string,\n): Effect.fn.Return<A, ScheduleStorageError, R> {\n return yield* Schema.decodeUnknownEffect(schema)(rows).pipe(\n Effect.mapError(() => corrupt(operation)),\n );\n});\n\nconst decodeBoundary = <A, I, R>(\n schema: Schema.Codec<A, I, R>,\n value: unknown,\n operation: string,\n): Effect.Effect<A, ScheduleStorageError, R> =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => corrupt(operation)));\n\nconst decodeRecord = Effect.fn(\"DoScheduleStore.decodeRecord\")(function* (\n row: ScheduleRow,\n): Effect.fn.Return<ScheduleRecord, ScheduleStorageError> {\n const record = yield* Schema.decodeEffect(Schema.fromJsonString(ScheduleRecord))(\n row.record_json,\n ).pipe(Effect.mapError(() => corrupt(\"decode schedule\")));\n\n if (\n record.owner.tenantId !== row.tenant_id ||\n record.owner.ownerId !== row.owner_id ||\n record.scheduleId !== row.schedule_id ||\n scheduleDeadline(record) !== row.deadline_at_millis\n ) {\n return yield* corrupt(\"decode schedule index\");\n }\n\n return record;\n});\n\nconst encodeRecord = Effect.fn(\"DoScheduleStore.encodeRecord\")(function* (\n record: ScheduleRecord,\n): Effect.fn.Return<string, ScheduleStorageError> {\n const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(ScheduleRecord))(record).pipe(\n Effect.mapError(() => corrupt(\"encode schedule\")),\n );\n\n return yield* Schema.decodeUnknownEffect(StoredScheduleJson)(encoded).pipe(\n Effect.mapError(() => corrupt(\"encode schedule bounds\")),\n );\n});\n\nconst initializeScheduleStore = Effect.fn(\"DoScheduleStore.initialize\")(function* () {\n const sql = yield* SqlClientService.SqlClient;\n const operation = \"initialize schedule store\";\n\n const rawTables = yield* sql<Record<string, unknown>>`\n SELECT name\n FROM sqlite_master\n WHERE type = 'table'\n AND name IN (\n 'effect_agent_schedule_store_state',\n 'effect_agent_schedules'\n )\n ORDER BY name\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const tables = yield* decodeRows(Schema.Array(ScheduleTableNameRow), rawTables, operation);\n const hasState = tables.some((row) => row.name === \"effect_agent_schedule_store_state\");\n const hasSchedules = tables.some((row) => row.name === \"effect_agent_schedules\");\n\n if (!hasState) {\n if (hasSchedules) return yield* corrupt(operation);\n yield* sql\n .withTransaction(\n Effect.gen(function* () {\n yield* sql`\n CREATE TABLE effect_agent_schedule_store_state (\n singleton INTEGER PRIMARY KEY NOT NULL CHECK (singleton = 1),\n storage_version INTEGER NOT NULL,\n alarm_generation INTEGER NOT NULL\n )\n `.withoutTransform;\n yield* sql`\n CREATE TABLE effect_agent_schedules (\n tenant_id TEXT NOT NULL,\n owner_id TEXT NOT NULL,\n schedule_id TEXT NOT NULL,\n deadline_at_millis INTEGER,\n record_json TEXT NOT NULL,\n PRIMARY KEY (tenant_id, owner_id, schedule_id)\n )\n `.withoutTransform;\n yield* sql`\n CREATE INDEX effect_agent_schedules_deadline\n ON effect_agent_schedules (deadline_at_millis, tenant_id, owner_id, schedule_id)\n WHERE deadline_at_millis IS NOT NULL\n `.withoutTransform;\n yield* sql`\n CREATE INDEX effect_agent_schedules_owner_deadline\n ON effect_agent_schedules (tenant_id, owner_id, deadline_at_millis, schedule_id)\n WHERE deadline_at_millis IS NOT NULL\n `.withoutTransform;\n yield* sql`\n INSERT INTO effect_agent_schedule_store_state (\n singleton, storage_version, alarm_generation\n ) VALUES (1, ${CURRENT_SCHEDULE_STORE_VERSION}, 0)\n `.withoutTransform;\n }),\n )\n .pipe(Effect.mapError(() => unavailable(operation)));\n\n return;\n }\n\n if (!hasSchedules) return yield* corrupt(operation);\n\n const rawState = yield* sql<Record<string, unknown>>`\n SELECT storage_version, alarm_generation\n FROM effect_agent_schedule_store_state\n WHERE singleton = 1\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const state = yield* decodeRows(Schema.Array(ScheduleStoreStateRow), rawState, operation);\n\n if (state.length !== 1 || state[0].storage_version !== CURRENT_SCHEDULE_STORE_VERSION) {\n return yield* corrupt(\n state.length === 1\n ? `${operation}: incompatible storage version ${state[0].storage_version}; expected ${CURRENT_SCHEDULE_STORE_VERSION}`\n : `${operation}: invalid storage version row`,\n );\n }\n});\n\nconst makeServices = Effect.gen(function* () {\n const sql = yield* SqlClientService.SqlClient;\n const transactions = yield* DoScheduleTransaction;\n const scheduleFailpoint = yield* ScheduleFailpoint;\n\n yield* initializeScheduleStore();\n\n const readRows = Effect.fn(\"DoScheduleStore.readRows\")(function* (\n key: ScheduleKey,\n operation: string,\n ): Effect.fn.Return<ReadonlyArray<ScheduleRow>, ScheduleStorageError> {\n const rows = yield* sql<Record<string, unknown>>`\n SELECT tenant_id, owner_id, schedule_id, deadline_at_millis, record_json\n FROM effect_agent_schedules\n WHERE tenant_id = ${key.owner.tenantId}\n AND owner_id = ${key.owner.ownerId}\n AND schedule_id = ${key.scheduleId}\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n return yield* decodeRows(Schema.Array(ScheduleRow), rows, operation);\n });\n\n const readOne = Effect.fn(\"DoScheduleStore.readOne\")(function* (\n key: ScheduleKey,\n operation: string,\n ): Effect.fn.Return<ScheduleRecord | null, ScheduleStorageError> {\n const rows = yield* readRows(key, operation);\n\n if (rows.length === 0) return null;\n if (rows.length !== 1) return yield* corrupt(operation);\n\n return yield* decodeRecord(rows[0]);\n });\n\n const readNextDeadline = Effect.fn(\"DoScheduleStore.readNextDeadline\")(function* (\n owner: ScheduleOwner | undefined,\n operation: string,\n ): Effect.fn.Return<number | null, ScheduleStorageError> {\n const rows =\n owner === undefined\n ? yield* sql<Record<string, unknown>>`\n SELECT MIN(deadline_at_millis) AS deadline_at_millis\n FROM effect_agent_schedules\n WHERE deadline_at_millis IS NOT NULL\n `.pipe(Effect.mapError(() => unavailable(operation)))\n : yield* sql<Record<string, unknown>>`\n SELECT MIN(deadline_at_millis) AS deadline_at_millis\n FROM effect_agent_schedules\n WHERE tenant_id = ${owner.tenantId}\n AND owner_id = ${owner.ownerId}\n AND deadline_at_millis IS NOT NULL\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const decoded = yield* decodeRows(Schema.Array(ScheduleDeadlineRow), rows, operation);\n\n if (decoded.length !== 1) return yield* corrupt(operation);\n\n return decoded[0].deadline_at_millis;\n });\n\n const replaceAlarm = Effect.fn(\"DoScheduleStore.replaceAlarm\")(function* (\n replace: DoScheduleReplaceAlarm,\n deadlineAtMillis: number | null,\n operation: string,\n ) {\n const rawState = yield* sql<Record<string, unknown>>`\n UPDATE effect_agent_schedule_store_state\n SET alarm_generation = alarm_generation + 1\n WHERE singleton = 1\n RETURNING storage_version, alarm_generation\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const state = yield* decodeRows(Schema.Array(ScheduleStoreStateRow), rawState, operation);\n\n if (state.length !== 1 || state[0].storage_version !== CURRENT_SCHEDULE_STORE_VERSION) {\n return yield* corrupt(operation);\n }\n yield* scheduleFailpoint.hit(\"schedule:alarm:before\");\n yield* replace({ deadlineAtMillis, generation: state[0].alarm_generation });\n yield* scheduleFailpoint.hit(\"schedule:alarm:after\");\n });\n\n const insert: ScheduleStore[\"Service\"][\"insert\"] = Effect.fn(\"DoScheduleStore.insert\")(\n function* (record, ownerLimit) {\n const operation = \"insert schedule\";\n const canonical = yield* decodeBoundary(ScheduleRecord, record, operation);\n const recordJson = yield* encodeRecord(canonical);\n\n const result = yield* transactions.run((replace) =>\n Effect.gen(function* () {\n const existing = yield* readOne(canonical, operation);\n\n if (existing !== null) {\n if (existing.creationFingerprint === canonical.creationFingerprint) {\n return { record: existing, inserted: false } as const;\n }\n\n return yield* ScheduleConflict.make({ reason: \"creation\", key: canonical });\n }\n\n const rawCounts = yield* sql<Record<string, unknown>>`\n SELECT COUNT(*) AS schedule_count\n FROM effect_agent_schedules\n WHERE tenant_id = ${canonical.owner.tenantId}\n AND owner_id = ${canonical.owner.ownerId}\n AND (json_extract(record_json, '$.pending') IS NOT NULL OR\n (json_extract(record_json, '$.state') != 'cancelled' AND json_extract(record_json, '$.nextAtMillis') IS NOT NULL))\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const counts = yield* decodeRows(Schema.Array(ScheduleCountRow), rawCounts, operation);\n\n if (counts.length !== 1) return yield* corrupt(operation);\n if (counts[0].schedule_count >= ownerLimit) {\n return yield* ScheduleCapacityError.make({ limit: ownerLimit });\n }\n yield* scheduleFailpoint.hit(\"schedule:insert:before\");\n yield* sql`\n INSERT INTO effect_agent_schedules (\n tenant_id, owner_id, schedule_id, deadline_at_millis, record_json\n ) VALUES (\n ${canonical.owner.tenantId},\n ${canonical.owner.ownerId},\n ${canonical.scheduleId},\n ${scheduleDeadline(canonical)},\n ${recordJson}\n )\n `.pipe(Effect.mapError(() => unavailable(operation)));\n const deadline = yield* readNextDeadline(undefined, operation);\n\n yield* replaceAlarm(replace, deadline, operation);\n\n return { record: canonical, inserted: true } as const;\n }),\n );\n\n if (result.inserted) yield* scheduleFailpoint.hit(\"schedule:insert:after\");\n\n return result.record;\n },\n );\n\n const get: ScheduleStore[\"Service\"][\"get\"] = Effect.fn(\"DoScheduleStore.get\")(function* (key) {\n const canonical = yield* decodeBoundary(ScheduleKey, key, \"get schedule\");\n\n return yield* readOne(canonical, \"get schedule\");\n });\n\n const list: ScheduleStore[\"Service\"][\"list\"] = Effect.fn(\"DoScheduleStore.list\")(function* (\n requestValue: SchedulePageRequest,\n ): Effect.fn.Return<SchedulePage, ScheduleStorageError> {\n const operation = \"list schedules\";\n const request = yield* decodeBoundary(SchedulePageRequest, requestValue, operation);\n\n const rows =\n request.after === undefined\n ? yield* sql<Record<string, unknown>>`\n SELECT tenant_id, owner_id, schedule_id, deadline_at_millis, record_json\n FROM effect_agent_schedules\n WHERE tenant_id = ${request.owner.tenantId}\n AND owner_id = ${request.owner.ownerId}\n ORDER BY schedule_id\n LIMIT ${request.limit + 1}\n `.pipe(Effect.mapError(() => unavailable(operation)))\n : yield* sql<Record<string, unknown>>`\n SELECT tenant_id, owner_id, schedule_id, deadline_at_millis, record_json\n FROM effect_agent_schedules\n WHERE tenant_id = ${request.owner.tenantId}\n AND owner_id = ${request.owner.ownerId}\n AND schedule_id > ${request.after}\n ORDER BY schedule_id\n LIMIT ${request.limit + 1}\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const decoded = yield* decodeRows(Schema.Array(ScheduleRow), rows, operation);\n const records = yield* Effect.forEach(decoded, decodeRecord);\n const hasNext = records.length > request.limit;\n const items = hasNext ? records.slice(0, request.limit) : records;\n\n return { items, next: hasNext ? (items.at(-1)?.scheduleId ?? null) : null };\n });\n\n const change: ScheduleStore[\"Service\"][\"change\"] = Effect.fn(\"DoScheduleStore.change\")(function* (\n key,\n change,\n ownerLimit = defaultSchedulingLimits.maxSchedulesPerOwner,\n ) {\n const operation = \"change schedule\";\n const canonicalKey = yield* decodeBoundary(ScheduleKey, key, operation);\n const canonicalChange = yield* decodeBoundary(ScheduleChange, change, operation);\n\n const result = yield* transactions.run((replace) =>\n Effect.gen(function* () {\n const current = yield* readOne(canonicalKey, operation);\n\n if (current === null) return yield* ScheduleNotFound.make({ key: canonicalKey });\n const transition = applyScheduleChange(current, canonicalChange);\n\n if (Result.isFailure(transition)) return yield* transition.failure;\n const next = transition.success;\n\n if (!scheduleUsesCapacity(current) && scheduleUsesCapacity(next)) {\n const rawCounts = yield* sql<Record<string, unknown>>`\n SELECT COUNT(*) AS schedule_count FROM effect_agent_schedules\n WHERE tenant_id = ${key.owner.tenantId} AND owner_id = ${key.owner.ownerId}\n AND (json_extract(record_json, '$.pending') IS NOT NULL OR\n (json_extract(record_json, '$.state') != 'cancelled' AND json_extract(record_json, '$.nextAtMillis') IS NOT NULL))\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const counts = yield* decodeRows(Schema.Array(ScheduleCountRow), rawCounts, operation);\n\n if (counts.length !== 1) return yield* corrupt(operation);\n if (counts[0].schedule_count >= ownerLimit)\n return yield* ScheduleCapacityError.make({ limit: ownerLimit });\n }\n if (next === current) return { record: current, changed: false } as const;\n const recordJson = yield* encodeRecord(next);\n\n yield* scheduleFailpoint.hit(`schedule:${canonicalChange._tag.toLowerCase()}:before`);\n yield* sql`\n UPDATE effect_agent_schedules\n SET deadline_at_millis = ${scheduleDeadline(next)}, record_json = ${recordJson}\n WHERE tenant_id = ${canonicalKey.owner.tenantId}\n AND owner_id = ${canonicalKey.owner.ownerId}\n AND schedule_id = ${canonicalKey.scheduleId}\n `.pipe(Effect.mapError(() => unavailable(operation)));\n const deadline = yield* readNextDeadline(undefined, operation);\n\n yield* replaceAlarm(replace, deadline, operation);\n\n return { record: next, changed: true } as const;\n }),\n );\n\n if (result.changed) {\n yield* scheduleFailpoint.hit(`schedule:${canonicalChange._tag.toLowerCase()}:after`);\n }\n\n return result.record;\n });\n\n const due: ScheduleStore[\"Service\"][\"due\"] = Effect.fn(\"DoScheduleStore.due\")(function* (\n nowMillis,\n limit,\n owner?: ScheduleOwner,\n after?: ScheduleDueCursor,\n ) {\n const operation = \"query due schedules\";\n\n const cursor =\n after === undefined\n ? undefined\n : yield* Schema.decodeUnknownEffect(ScheduleDueCursor)(after).pipe(\n Effect.mapError(() => corrupt(operation)),\n );\n\n const continuation =\n cursor === undefined\n ? sql`1 = 1`\n : sql`\n (deadline_at_millis, tenant_id, owner_id, schedule_id) >\n (${cursor.deadlineAtMillis}, ${cursor.owner.tenantId}, ${cursor.owner.ownerId}, ${cursor.scheduleId})`;\n\n const rows =\n owner === undefined\n ? yield* sql<Record<string, unknown>>`\n SELECT tenant_id, owner_id, schedule_id, deadline_at_millis\n FROM effect_agent_schedules\n WHERE deadline_at_millis <= ${nowMillis} AND ${continuation}\n ORDER BY deadline_at_millis, tenant_id, owner_id, schedule_id\n LIMIT ${limit}\n `.pipe(Effect.mapError(() => unavailable(operation)))\n : yield* sql<Record<string, unknown>>`\n SELECT tenant_id, owner_id, schedule_id, deadline_at_millis\n FROM effect_agent_schedules\n WHERE tenant_id = ${owner.tenantId}\n AND owner_id = ${owner.ownerId}\n AND deadline_at_millis <= ${nowMillis} AND ${continuation}\n ORDER BY deadline_at_millis, schedule_id\n LIMIT ${limit}\n `.pipe(Effect.mapError(() => unavailable(operation)));\n\n const decoded = yield* decodeRows(Schema.Array(ScheduleDueRow), rows, operation);\n\n return decoded.map((row) => ({\n owner: { tenantId: row.tenant_id, ownerId: row.owner_id },\n scheduleId: row.schedule_id,\n deadlineAtMillis: row.deadline_at_millis,\n }));\n });\n\n const nextDeadline: ScheduleStore[\"Service\"][\"nextDeadline\"] = Effect.fn(\n \"DoScheduleStore.nextDeadline\",\n )(function* (owner?: ScheduleOwner) {\n const operation = \"query next schedule deadline\";\n\n return yield* readNextDeadline(owner, operation);\n });\n\n const prearm = Effect.fn(\"DoScheduleStore.prearm\")(function* (\n deadlineAtMillis: number,\n ): Effect.fn.Return<void, ScheduleStorageError | ScheduleFailpointError> {\n yield* decodeBoundary(ScheduleInstant, deadlineAtMillis, \"pre-arm schedule recovery\");\n yield* transactions.run((replace) =>\n replaceAlarm(replace, deadlineAtMillis, \"pre-arm schedule recovery\"),\n );\n yield* scheduleFailpoint.hit(\"schedule:prearm:after\");\n });\n\n const reconcile = Effect.gen(function* () {\n yield* transactions.run((replace) =>\n Effect.gen(function* () {\n const deadline = yield* readNextDeadline(undefined, \"reconcile schedule alarm\");\n\n yield* replaceAlarm(replace, deadline, \"reconcile schedule alarm\");\n }),\n );\n yield* scheduleFailpoint.hit(\"schedule:reconcile:after\");\n });\n\n return Context.make(ScheduleStore, {\n insert,\n get,\n list,\n change,\n due,\n nextDeadline,\n }).pipe(Context.add(DoScheduleAlarmControl, { prearm, reconcile }));\n});\n\n/**\n * Durable Object SQLite ScheduleStore. Platform code supplies the one transaction owner that\n * combines these SQL mutations with its logical and native alarm lifecycle.\n */\nexport const scheduleStoreLayer: Layer.Layer<\n ScheduleStore | DoScheduleAlarmControl,\n ScheduleStorageError,\n SqlClientService.SqlClient | DoScheduleTransaction\n> = Layer.effectContext(makeServices);\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { SqliteMigrator } from "@effect/sql-sqlite-do";
|
|
2
2
|
//#region src/internal/migrations.d.ts
|
|
3
3
|
/** The current storage version recorded in `effect_agent_meta`. */
|
|
4
|
-
declare const CurrentDoStorageVersion =
|
|
4
|
+
declare const CurrentDoStorageVersion = 3;
|
|
5
5
|
declare namespace DoStorageVersion_d_exports {
|
|
6
6
|
export { CurrentDoStorageVersion };
|
|
7
7
|
}
|
|
8
8
|
//#endregion
|
|
9
9
|
export { CurrentDoStorageVersion as n, DoStorageVersion_d_exports as t };
|
|
10
|
-
//# sourceMappingURL=DoStorageVersion-
|
|
10
|
+
//# sourceMappingURL=DoStorageVersion-DxqcVgDE.d.mts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as CurrentDoStorageVersion } from "./DoStorageVersion-
|
|
1
|
+
import { n as CurrentDoStorageVersion } from "./DoStorageVersion-DxqcVgDE.mjs";
|
|
2
2
|
export { CurrentDoStorageVersion };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
|
-
import { t as CurrentDoStorageVersion } from "./migrations-
|
|
2
|
+
import { t as CurrentDoStorageVersion } from "./migrations-B-jiT7vx.mjs";
|
|
3
3
|
//#region src/DoStorageVersion.ts
|
|
4
|
-
var DoStorageVersion_exports = /* @__PURE__ */ __exportAll({ CurrentDoStorageVersion: () =>
|
|
4
|
+
var DoStorageVersion_exports = /* @__PURE__ */ __exportAll({ CurrentDoStorageVersion: () => 3 });
|
|
5
5
|
//#endregion
|
|
6
6
|
export { CurrentDoStorageVersion, DoStorageVersion_exports as t };
|
|
7
7
|
|
|
@@ -2,13 +2,13 @@ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
|
2
2
|
import { DoStorageConfig } from "./DoStorageConfig.mjs";
|
|
3
3
|
import { DoLedgerError, DoStorageCorruptionError, DoStorageError } from "./DoStorageError.mjs";
|
|
4
4
|
import { DoStorageFailpoint } from "./DoStorageFailpoint.mjs";
|
|
5
|
-
import { i as storageFailpointLayer, o as decodeRows, r as storageConfigLayer, s as initializeDoJournal } from "./DoThreadStore-
|
|
5
|
+
import { i as storageFailpointLayer, o as decodeRows, r as storageConfigLayer, s as initializeDoJournal } from "./DoThreadStore-JqjeFOga.mjs";
|
|
6
6
|
import { SqliteClient } from "@effect/sql-sqlite-do";
|
|
7
7
|
import { Clock, Context, Crypto, DateTime, Effect, Layer, Option, Schema, Stream } from "effect";
|
|
8
8
|
import * as SqlClientService from "effect/unstable/sql/SqlClient";
|
|
9
9
|
import { ApprovalDecision, CanonicalSequence, DefinitionDigests, Digest, PersistedJson, ProducerEpoch, RecordEnvelope, SettlementOutcome } from "@effect-agent/thread/Records";
|
|
10
10
|
import { EMPTY_TAIL_DIGEST } from "@effect-agent/thread/Digest";
|
|
11
|
-
import { AbortCommand, AbortIntent, AbortIntentRequest, AdmissionAdmitted, AdmissionConflict, AdmissionNotAdmitted, AdmissionRequest, AdmissionResult, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, AttachChildToReservationRequest, BeginChildBudgetReleaseRequest, ChildAttachmentSnapshot, ChildBudgetReservationRequest, ChildBudgetReservationSnapshot, ChildReservationConflict, ChildReservationStatus, ChildSettledNotification, Claim, ClaimJoiningRequest, ClaimRequest, InputAppliedMarker, JoinSnapshot, JoinedToHost, JoiningClaim, LedgerCapabilities, LedgerError, MarkInputAppliedRequest, MarkJoinedRequest, MarkReadyRequest, MarkUnknownRequest, OwnershipLost, OwnershipRenewal, OwnershipSnapshot, ParentLinkage, QueueSequence, RecoverySnapshot, RecoverySnapshotRequest, ReleaseChildBudgetRequest, ReleaseOwnershipRequest, RenewOwnershipRequest, ReservedChildBudget, ReservedSettlement, RevertJoiningRequest, Settlement, SettlementConflict, SettlementFinalization, SettlementReservation, SettlementReservationSnapshot, SubmissionLedger, SubmissionLookup, SubmissionLookupByKey, SubmissionSnapshot, SubmissionState, SuspendRequest, SuspensionReason, SuspensionSnapshot, UnknownResolution, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, settlementFailureFromRecord, submissionAbortRecordId } from "@effect-agent/thread/SubmissionLedger";
|
|
11
|
+
import { AbortCommand, AbortIntent, AbortIntentRequest, AdmissionAdmitted, AdmissionConflict, AdmissionFence, AdmissionGroup, AdmissionNotAdmitted, AdmissionPolicyError, AdmissionRequest, AdmissionResult, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, AttachChildToReservationRequest, BeginChildBudgetReleaseRequest, ChildAttachmentSnapshot, ChildBudgetReservationRequest, ChildBudgetReservationSnapshot, ChildReservationConflict, ChildReservationStatus, ChildSettledNotification, Claim, ClaimJoiningRequest, ClaimRequest, InputAppliedMarker, JoinSnapshot, JoinedToHost, JoiningClaim, LedgerCapabilities, LedgerError, MarkInputAppliedRequest, MarkJoinedRequest, MarkReadyRequest, MarkUnknownRequest, OwnershipLost, OwnershipRenewal, OwnershipSnapshot, ParentLinkage, QueueSequence, RecoverySnapshot, RecoverySnapshotRequest, ReleaseChildBudgetRequest, ReleaseOwnershipRequest, RenewOwnershipRequest, ReservedChildBudget, ReservedSettlement, RevertJoiningRequest, Settlement, SettlementConflict, SettlementFinalization, SettlementReservation, SettlementReservationSnapshot, SubmissionAdmissionFence, SubmissionLedger, SubmissionLookup, SubmissionLookupByKey, SubmissionSnapshot, SubmissionState, SuspendRequest, SuspensionReason, SuspensionSnapshot, UnknownResolution, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, settlementFailureFromRecord, submissionAbortRecordId } from "@effect-agent/thread/SubmissionLedger";
|
|
12
12
|
import { BrowserCrypto } from "@effect/platform-browser";
|
|
13
13
|
//#region src/DoSubmissionLedger.ts
|
|
14
14
|
var DoSubmissionLedger_exports = /* @__PURE__ */ __exportAll({
|
|
@@ -54,7 +54,9 @@ var SubmissionRow = class extends Schema.Class("SubmissionRow")({
|
|
|
54
54
|
unknown_reason: Schema.NullOr(BoundedStoredText),
|
|
55
55
|
unknown_tool_call_ids_json: Schema.NullOr(BoundedStoredText),
|
|
56
56
|
parent_submission_id: Schema.NullOr(BoundedIdentifier),
|
|
57
|
-
parent_tool_call_id: Schema.NullOr(BoundedIdentifier)
|
|
57
|
+
parent_tool_call_id: Schema.NullOr(BoundedIdentifier),
|
|
58
|
+
admission_group: Schema.NullOr(AdmissionGroup),
|
|
59
|
+
admission_fence_json: Schema.NullOr(BoundedStoredText)
|
|
58
60
|
}) {};
|
|
59
61
|
var ChildReservationRow = class extends Schema.Class("ChildReservationRow")({
|
|
60
62
|
reservation_id: BoundedIdentifier,
|
|
@@ -150,7 +152,9 @@ const SUBMISSION_COLUMNS = `
|
|
|
150
152
|
unknown_reason,
|
|
151
153
|
unknown_tool_call_ids_json,
|
|
152
154
|
parent_submission_id,
|
|
153
|
-
parent_tool_call_id
|
|
155
|
+
parent_tool_call_id,
|
|
156
|
+
admission_group,
|
|
157
|
+
admission_fence_json
|
|
154
158
|
`;
|
|
155
159
|
const CHILD_RESERVATION_COLUMNS = `
|
|
156
160
|
reservation_id,
|
|
@@ -225,6 +229,7 @@ const makeServices = Effect.fn("DoSubmissionLedger.makeServices")(function* () {
|
|
|
225
229
|
const failpoint = yield* DoStorageFailpoint;
|
|
226
230
|
const sql = yield* SqlClientService.SqlClient;
|
|
227
231
|
const crypto = yield* Crypto.Crypto;
|
|
232
|
+
const admissionFence = yield* SubmissionAdmissionFence;
|
|
228
233
|
const journal = yield* initializeDoJournal(sql, failpoint.hit, config.maxStoredValueBytes);
|
|
229
234
|
const hitFailpoint = (location, operation) => failpoint.hit(location).pipe(Effect.mapError((error) => internalFailure(operation)(error)));
|
|
230
235
|
/**
|
|
@@ -313,6 +318,8 @@ const makeServices = Effect.fn("DoSubmissionLedger.makeServices")(function* () {
|
|
|
313
318
|
receiptId: row.receipt_id,
|
|
314
319
|
state: row.state,
|
|
315
320
|
createdAt: row.created_at,
|
|
321
|
+
...row.admission_group === null ? {} : { admissionGroup: row.admission_group },
|
|
322
|
+
...row.admission_fence_json === null ? {} : { admissionFence: yield* parseStoredJsonText(row.admission_fence_json).pipe(Effect.mapError(internalFailure(operation))) },
|
|
316
323
|
...row.settled_outcome === null ? {} : { settledOutcome: row.settled_outcome },
|
|
317
324
|
...row.ready_at === null ? {} : { readyAt: row.ready_at },
|
|
318
325
|
...row.parent_submission_id === null || row.parent_tool_call_id === null ? {} : { parentLinkage: {
|
|
@@ -538,6 +545,14 @@ const makeServices = Effect.fn("DoSubmissionLedger.makeServices")(function* () {
|
|
|
538
545
|
existingInputDigest: existing[0].input_digest,
|
|
539
546
|
attemptedInputDigest: validated.inputDigest
|
|
540
547
|
});
|
|
548
|
+
const retainedFence = existing[0].admission_fence_json === null ? void 0 : yield* Schema.decodeEffect(Schema.fromJsonString(AdmissionFence))(existing[0].admission_fence_json).pipe(Effect.mapError(internalFailure(operation)));
|
|
549
|
+
if ((existing[0].admission_group ?? void 0) !== validated.admissionGroup || !Schema.toEquivalence(Schema.optional(AdmissionFence))(retainedFence, validated.admissionFence)) return yield* AdmissionConflict.make({
|
|
550
|
+
threadId: validated.threadId,
|
|
551
|
+
principal: validated.principal,
|
|
552
|
+
idempotencyKey: validated.idempotencyKey,
|
|
553
|
+
existingInputDigest: existing[0].input_digest,
|
|
554
|
+
attemptedInputDigest: validated.inputDigest
|
|
555
|
+
});
|
|
541
556
|
return yield* decodeAdmissionResult({
|
|
542
557
|
submissionId: existing[0].submission_id,
|
|
543
558
|
receiptId: existing[0].receipt_id,
|
|
@@ -546,6 +561,16 @@ const makeServices = Effect.fn("DoSubmissionLedger.makeServices")(function* () {
|
|
|
546
561
|
replayed: true
|
|
547
562
|
}).pipe(Effect.mapError(internalFailure(operation)));
|
|
548
563
|
}
|
|
564
|
+
yield* admissionFence.check(validated);
|
|
565
|
+
if (validated.admissionGroup !== void 0) {
|
|
566
|
+
if ((yield* sql`
|
|
567
|
+
SELECT submission_id FROM effect_agent_submissions
|
|
568
|
+
WHERE thread_id=${validated.threadId} AND admission_group=${validated.admissionGroup} AND state<>'settled' LIMIT 1
|
|
569
|
+
`.pipe(Effect.mapError(sqlFailure(operation)))).length > 0) return yield* AdmissionPolicyError.make({
|
|
570
|
+
reason: "occupied",
|
|
571
|
+
code: "admission-group"
|
|
572
|
+
});
|
|
573
|
+
}
|
|
549
574
|
const maxRows = yield* sql`
|
|
550
575
|
SELECT COALESCE(MAX(queue_sequence), 0) AS max_queue_sequence
|
|
551
576
|
FROM effect_agent_submissions
|
|
@@ -570,7 +595,9 @@ const makeServices = Effect.fn("DoSubmissionLedger.makeServices")(function* () {
|
|
|
570
595
|
state,
|
|
571
596
|
created_at,
|
|
572
597
|
parent_submission_id,
|
|
573
|
-
parent_tool_call_id
|
|
598
|
+
parent_tool_call_id,
|
|
599
|
+
admission_group,
|
|
600
|
+
admission_fence_json
|
|
574
601
|
) VALUES (
|
|
575
602
|
${mintedSubmissionId},
|
|
576
603
|
${validated.threadId},
|
|
@@ -586,7 +613,9 @@ const makeServices = Effect.fn("DoSubmissionLedger.makeServices")(function* () {
|
|
|
586
613
|
'admitted',
|
|
587
614
|
${now.iso},
|
|
588
615
|
${validated.parentLinkage?.parentSubmissionId ?? null},
|
|
589
|
-
${validated.parentLinkage?.parentToolCallId ?? null}
|
|
616
|
+
${validated.parentLinkage?.parentToolCallId ?? null},
|
|
617
|
+
${validated.admissionGroup ?? null},
|
|
618
|
+
${validated.admissionFence === void 0 ? null : JSON.stringify(validated.admissionFence)}
|
|
590
619
|
)
|
|
591
620
|
`.pipe(Effect.mapError(sqlFailure(operation)));
|
|
592
621
|
return yield* decodeAdmissionResult({
|