@yielded/agent-storage-cloudflare 0.1.0-beta.175 → 0.1.0-beta.177

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.
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
- import { r as ownedState } from "./owned-state-B4QhezMp.mjs";
2
+ import { r as ownedState } from "./owned-state-BgGOA2Ak.mjs";
3
3
  import { SqlMemoryLimits, SqlStorageOwner, memoryStoreLayerWithFailpoints } from "@yielded/agent/sql-memory-store";
4
4
  import { Effect, Layer, Schema } from "effect";
5
5
  import * as SqlClientService from "effect/sql/SqlClient";
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
2
  import { DoStorageConfig } from "./DoStorageConfig.mjs";
3
3
  import { DoStorageFailpoint } from "./DoStorageFailpoint.mjs";
4
- import { i as initializeDoJournal } from "./do-journal-7P3DUBz0.mjs";
4
+ import { i as initializeDoJournal } from "./do-journal-ySC3eXNv.mjs";
5
5
  import { BrowserCrypto } from "@effect/platform-browser";
6
6
  import { SqlLifecycleSource } from "@yielded/agent-storage-sql/sql-lifecycle-publication";
7
7
  import { makeSqlMessageDeliveryStore } from "@yielded/agent-storage-sql/sql-message-delivery-store";
@@ -1,6 +1,6 @@
1
1
  import { DoStorageConfig } from "./DoStorageConfig.mjs";
2
2
  import { DoStorageFailpoint } from "./DoStorageFailpoint.mjs";
3
- import { n as DoStorageOptions, t as DoStorageInitializationError } from "./DoThreadStore-Bd4fTns3.mjs";
3
+ import { n as DoStorageOptions, t as DoStorageInitializationError } from "./DoThreadStore-BzYJjm4O.mjs";
4
4
  import { Crypto, Layer } from "effect";
5
5
  import * as SqlClientService from "effect/sql/SqlClient";
6
6
  import { StorageOwner } from "@yielded/agent/run-storage";
@@ -2,9 +2,9 @@ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
2
  import { DoStorageConfig } from "./DoStorageConfig.mjs";
3
3
  import { DoStorageFailpoint } from "./DoStorageFailpoint.mjs";
4
4
  import { DoLedgerError, DoStorageCorruptionError, DoStorageError } from "./DoStorageError.mjs";
5
- import { n as ownedRows } from "./owned-state-B4QhezMp.mjs";
6
- import { i as initializeDoJournal, r as decodeRows } from "./do-journal-7P3DUBz0.mjs";
7
- import { l as prepareCanonicalAppend, o as storageConfigLayer, s as storageFailpointLayer } from "./DoThreadStore-CgIZQUNR.mjs";
5
+ import { n as ownedRows } from "./owned-state-BgGOA2Ak.mjs";
6
+ import { i as initializeDoJournal, r as decodeRows } from "./do-journal-ySC3eXNv.mjs";
7
+ import { l as prepareCanonicalAppend, o as storageConfigLayer, s as storageFailpointLayer } from "./DoThreadStore-DG0h5J6u.mjs";
8
8
  import { BrowserCrypto } from "@effect/platform-browser";
9
9
  import { Cause, Clock, Context, Crypto, DateTime, Effect, Layer, Option, Schema, Stream } from "effect";
10
10
  import * as SqlClientService from "effect/sql/SqlClient";
@@ -19,7 +19,7 @@ import { decodeAbortFact, decodeAdmissionFact, decodeApprovalFact, decodeResolut
19
19
  import { InputMessage } from "@yielded/agent/messaging";
20
20
  import { runIdForSubmission } from "@yielded/agent/run-journal";
21
21
  import { SettlementPublicationResult, SettlementPublisher, validateCanonicalSettlement, validateJoinedSettlement, validatePublication } from "@yielded/agent/settlement-publisher";
22
- 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, FundingOwner, FundingOwnerRequest, InputAppliedMarker, JoinSnapshot, JoinedToHost, JoiningClaim, LedgerCapabilities, LedgerError, MarkInputAppliedRequest, MarkJoinedRequest, MarkReadyRequest, MarkUnknownRequest, OwnershipLost, ParentLinkage, QueueSequence, RecoverySnapshot, RecoverySnapshotRequest, ReleaseChildBudgetRequest, ReservedChildBudget, RevertJoiningRequest, Settlement, SettlementConflict, SettlementFinalization, SubmissionAdmissionFence, SubmissionLedger, SubmissionLookup, SubmissionLookupByKey, SubmissionSnapshot, SubmissionState, SubmissionWorkItem, SuspendRequest, SuspensionReason, SuspensionSnapshot, UnknownResolution, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, UnknownResolutionKind, WorkerLedgerState, WorkerStopCommand, approvalDecisionsCover, settlementFailureFromRecord, submissionAbortRecordId, submissionSettlementBatchId, submissionSettlementRecordId, unknownResolutionKind, unknownResolutionMatchesResult, workerTerminalFromRecord } from "@yielded/agent/submission-ledger";
22
+ 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, FundingOwner, FundingOwnerRequest, InputAppliedMarker, JoinSnapshot, JoinedToHost, JoiningClaim, LedgerCapabilities, LedgerError, MarkInputAppliedRequest, MarkJoinedRequest, MarkReadyRequest, MarkUnknownRequest, OwnershipLost, ParentLinkage, QueueSequence, RecoverySnapshot, RecoverySnapshotRequest, ReleaseChildBudgetRequest, ReservedChildBudget, RevertJoiningRequest, Settlement, SettlementConflict, SettlementFinalization, SubmissionAdmissionFence, SubmissionLedger, SubmissionLookup, SubmissionLookupByKey, SubmissionSnapshot, SubmissionState, SubmissionWorkItem, SuspendRequest, SuspensionReason, SuspensionSnapshot, UnknownResolution, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, UnknownResolutionKind, WorkerLedgerState, WorkerStopCommand, approvalDecisionsCover, settlementFailureFromRecord, submissionAbortRecordId, submissionInputBatchId, submissionInputRecordId, submissionSettlementBatchId, submissionSettlementRecordId, unknownResolutionKind, unknownResolutionMatchesResult, workerTerminalFromRecord } from "@yielded/agent/submission-ledger";
23
23
  import { AssignmentTerminal } from "@yielded/agent/worker";
24
24
  //#region src/DoSubmissionLedger.ts
25
25
  var DoSubmissionLedger_exports = /* @__PURE__ */ __exportAll({
@@ -524,8 +524,7 @@ const makeServices = Effect.fnUntraced(function* () {
524
524
  yield* hitFailpoint("ledger:admit:before", operation);
525
525
  const result = yield* inWriteTransaction(operation, Effect.gen(function* () {
526
526
  const keyRowKey = `${validated.threadId}/${validated.principal}/${validated.idempotencyKey}`;
527
- const existingRows = yield* byKey(validated, operation);
528
- const existing = yield* decodeSubmissionRows(operation, keyRowKey, existingRows);
527
+ const existing = yield* byKey(validated, operation);
529
528
  if (existing.length > 1) return yield* corruptionFailure(operation, "effect_agent_submissions", keyRowKey, "An admission idempotency key returned more than one row.");
530
529
  if (existing.length === 1) {
531
530
  const sameLinkage = validated.parentLinkage === void 0 ? existing[0].parent_submission_id === null && existing[0].parent_tool_call_id === null : existing[0].parent_submission_id === validated.parentLinkage.parentSubmissionId && existing[0].parent_tool_call_id === validated.parentLinkage.parentToolCallId;
@@ -720,8 +719,7 @@ const makeServices = Effect.fnUntraced(function* () {
720
719
  if (Option.isNone(row)) return Option.none();
721
720
  return Option.some(yield* decodeSubmissionSnapshot(operation, row.value));
722
721
  }
723
- const foundRows = yield* byKey(validated, operation);
724
- const decoded = yield* decodeSubmissionRows(operation, `${validated.threadId}/${validated.principal}/${validated.idempotencyKey}`, foundRows);
722
+ const decoded = yield* byKey(validated, operation);
725
723
  if (decoded.length > 1) return yield* corruptionFailure(operation, "effect_agent_submissions", `${validated.threadId}/${validated.principal}/${validated.idempotencyKey}`, "An admission idempotency key returned more than one row.");
726
724
  if (decoded.length === 0) return Option.none();
727
725
  return Option.some(yield* decodeSubmissionSnapshot(operation, decoded[0]));
@@ -729,8 +727,7 @@ const makeServices = Effect.fnUntraced(function* () {
729
727
  const resolveAdmission = Effect.fnUntraced(function* (request) {
730
728
  const operation = "ledger resolve admission";
731
729
  const validated = yield* Schema.decodeEffect(Schema.toType(SubmissionLookupByKey))(request).pipe(Effect.mapError(internalFailure(operation)));
732
- const foundRows = yield* byKey(validated, operation);
733
- const decoded = yield* decodeSubmissionRows(operation, `${validated.threadId}/${validated.principal}/${validated.idempotencyKey}`, foundRows);
730
+ const decoded = yield* byKey(validated, operation);
734
731
  if (decoded.length > 1) return yield* corruptionFailure(operation, "effect_agent_submissions", `${validated.threadId}/${validated.principal}/${validated.idempotencyKey}`, "An admission idempotency key returned more than one row.");
735
732
  if (decoded.length === 0) return AdmissionNotAdmitted.make();
736
733
  return AdmissionAdmitted.make({ submission: yield* decodeSubmissionSnapshot(operation, decoded[0]) });
@@ -793,31 +790,76 @@ const makeServices = Effect.fnUntraced(function* () {
793
790
  yield* hitFailpoint("ledger:claim:after", operation);
794
791
  return claimed;
795
792
  });
793
+ const markInputAppliedInTransaction = Effect.fnUntraced(function* (validated) {
794
+ const operation = "ledger mark input applied";
795
+ const submission = yield* requireSubmission(operation, validated.submissionId);
796
+ yield* requireOwner(operation, submission);
797
+ if (submission.input_applied_record_id !== null) {
798
+ if (submission.input_applied_record_id === validated.recordId && submission.input_applied_sequence === validated.sequence) return;
799
+ return yield* corruptionFailure(operation, "effect_agent_submissions", validated.submissionId, "A different canonical input marker is already recorded for this Submission.");
800
+ }
801
+ yield* sql`
802
+ UPDATE effect_agent_submissions
803
+ SET
804
+ input_applied_record_id = ${validated.recordId},
805
+ input_applied_sequence = ${validated.sequence},
806
+ state = CASE
807
+ WHEN state IN ('admitted', 'ready') THEN 'input-applied'
808
+ ELSE state
809
+ END
810
+ WHERE submission_id = ${validated.submissionId}
811
+ RETURNING *, ${definitionJson(sql)} AS agent_digests_json`.pipe(rows.submissions.write, Effect.mapError(internalFailure(operation)));
812
+ });
796
813
  const markInputApplied = Effect.fnUntraced(function* (request) {
797
814
  const operation = "ledger mark input applied";
798
815
  const validated = yield* decodeMarkInputAppliedRequestType(request).pipe(Effect.mapError(internalFailure(operation)));
799
816
  yield* hitFailpoint("ledger:mark-input-applied:before", operation);
800
- yield* inWriteTransaction(operation, Effect.gen(function* () {
801
- const submission = yield* requireSubmission(operation, validated.submissionId);
802
- yield* requireOwner(operation, submission);
803
- if (submission.input_applied_record_id !== null) {
804
- if (submission.input_applied_record_id === validated.recordId && submission.input_applied_sequence === validated.sequence) return;
805
- return yield* corruptionFailure(operation, "effect_agent_submissions", validated.submissionId, "A different canonical input marker is already recorded for this Submission.");
806
- }
807
- yield* sql`
808
- UPDATE effect_agent_submissions
809
- SET
810
- input_applied_record_id = ${validated.recordId},
811
- input_applied_sequence = ${validated.sequence},
812
- state = CASE
813
- WHEN state IN ('admitted', 'ready') THEN 'input-applied'
814
- ELSE state
815
- END
816
- WHERE submission_id = ${validated.submissionId}
817
- RETURNING *, ${definitionJson(sql)} AS agent_digests_json`.pipe(rows.submissions.write, Effect.mapError(internalFailure(operation)));
818
- }));
817
+ yield* inWriteTransaction(operation, markInputAppliedInTransaction(validated));
819
818
  yield* hitFailpoint("ledger:mark-input-applied:after", operation);
820
819
  });
820
+ const appendInput = Effect.fnUntraced(function* (submissionId, request) {
821
+ const operation = "append original input and context";
822
+ const prepared = yield* prepareCanonicalAppend(request).pipe(Effect.provideService(Crypto.Crypto, crypto));
823
+ const record = prepared.request.batch.records[0];
824
+ const context = prepared.request.executions?.flatMap((update) => update.facts ?? []).find(({ payload }) => payload._tag === "RunContextRecorded");
825
+ if (prepared.request.executions?.length !== 1 || prepared.request.executions[0]?.previousRevision !== 0 || prepared.request.batch.records.length !== 1 || record?.payload._tag !== "UserInputRecorded" || record.payload.kind !== "user" || record.payload.submissionId !== submissionId || record.payload.runId !== runIdForSubmission(submissionId) || record.recordId !== submissionInputRecordId(submissionId) || prepared.request.batch.batchId !== submissionInputBatchId(submissionId) || context?.payload._tag === "RunContextRecorded" && context.payload.historyThrough !== prepared.request.expectedTailSequence) return yield* ThreadStoreError.make({
826
+ operation,
827
+ message: "Original input publication has a different context boundary"
828
+ });
829
+ const mapError = (cause) => ThreadStoreError.make({
830
+ operation,
831
+ message: cause.message,
832
+ cause
833
+ });
834
+ yield* journal.prepareAppend(prepared.raw).pipe(Effect.mapError(mapError));
835
+ return yield* owner.withProgress(prepared.request.threadId, owner.withMutation(Effect.gen(function* () {
836
+ yield* hitFailpoint("append:before", operation);
837
+ yield* hitFailpoint("ledger:mark-input-applied:before", operation);
838
+ const result = yield* journal.withWriteTransaction(operation)(Effect.gen(function* () {
839
+ const submission = yield* requireSubmission(operation, submissionId);
840
+ yield* requireOwner(operation, submission);
841
+ if (submission.thread_id !== prepared.request.threadId) return yield* LedgerError.make({
842
+ operation,
843
+ message: "Original input belongs to another Thread"
844
+ });
845
+ const result = yield* journal.appendPrepared(prepared.raw);
846
+ yield* markInputAppliedInTransaction(MarkInputAppliedRequest.make({
847
+ submissionId,
848
+ recordId: record.recordId,
849
+ sequence: result.firstSequence
850
+ }));
851
+ return result;
852
+ })).pipe(Effect.mapError((error) => error._tag === "DoAppendConflict" ? AppendConflict.make({
853
+ threadId: prepared.request.threadId,
854
+ batchId: prepared.request.batch.batchId,
855
+ reason: error.reason,
856
+ ...error.actualTailSequence === void 0 ? {} : { actualTailSequence: error.actualTailSequence }
857
+ }) : error._tag === "OwnershipLost" ? error : mapError(error)));
858
+ yield* hitFailpoint("ledger:mark-input-applied:after", operation);
859
+ yield* hitFailpoint("append:after", operation);
860
+ return result;
861
+ }).pipe(Effect.mapError((error) => error._tag === "OwnershipLost" || error._tag === "ThreadStoreError" || error._tag === "AppendConflict" ? error : mapError(error)))));
862
+ });
821
863
  const publish = Effect.fn("DoSubmissionLedger.publishSettlement")(function* (input) {
822
864
  const operation = "publish settlement";
823
865
  const { request, record, settlement } = yield* validatePublication(input);
@@ -1767,8 +1809,8 @@ const makeServices = Effect.fnUntraced(function* () {
1767
1809
  const abortRow = yield* readAbortIntent(operation, validated.submissionId);
1768
1810
  if (Option.isSome(abortRow)) abortIntent = yield* abortIntentFromRow(operation, submissionRow, validated.submissionId, abortRow.value);
1769
1811
  const joinRows = (yield* cached(rows.submissions.by("joined_host_submission_id", validated.submissionId), operation)).filter((row) => row.joined_host_submission_id === validated.submissionId).sort((a, b) => a.queue_sequence - b.queue_sequence);
1770
- const joinSubmissions = yield* decodeSubmissionRows(operation, validated.submissionId, joinRows);
1771
- const joins = yield* Effect.forEach(joinSubmissions, (row) => decodeJoinSnapshot({
1812
+ const joins = [];
1813
+ for (const row of joinRows) joins.push(yield* decodeJoinSnapshot({
1772
1814
  submissionId: row.submission_id,
1773
1815
  state: row.state,
1774
1816
  hostSubmissionId: validated.submissionId
@@ -1784,16 +1826,18 @@ const makeServices = Effect.fnUntraced(function* () {
1784
1826
  }).pipe(Effect.mapError((error) => corruptionFailure(operation, "effect_agent_submissions", validated.submissionId, error.message)));
1785
1827
  }
1786
1828
  const decisionRows = yield* readApprovalDecisions(operation, validated.submissionId);
1787
- const approvalDecisions = yield* Effect.forEach(decisionRows, (row) => approvalIntentFromRow(operation, row));
1829
+ const approvalDecisions = [];
1830
+ for (const row of decisionRows) approvalDecisions.push(yield* approvalIntentFromRow(operation, row));
1788
1831
  const resolutionRows = yield* readUnknownResolutions(operation, validated.submissionId);
1789
- const unknownResolutions = yield* Effect.forEach(resolutionRows, (row) => unknownResolutionIntentFromRow(operation, row));
1832
+ const unknownResolutions = [];
1833
+ for (const row of resolutionRows) unknownResolutions.push(yield* unknownResolutionIntentFromRow(operation, row));
1790
1834
  const childReservationRows = (yield* cached(rows.childReservations.by("parent_submission_id", validated.submissionId), operation)).filter((row) => row.parent_submission_id === validated.submissionId).sort((a, b) => a.parent_tool_call_id.localeCompare(b.parent_tool_call_id));
1791
- const decodedChildReservations = yield* decodeChildReservationRows(operation, validated.submissionId, childReservationRows);
1792
- const childReservations = yield* Effect.forEach(decodedChildReservations, (row) => childReservationSnapshotFromRow(operation, row));
1835
+ const childReservations = [];
1836
+ for (const row of childReservationRows) childReservations.push(yield* childReservationSnapshotFromRow(operation, row));
1793
1837
  const markers = yield* readChildSettlementMarkers(operation, validated.submissionId);
1794
1838
  const markersByChild = new Map(markers.map((row) => [row.child_submission_id, row]));
1795
1839
  const childAttachments = [];
1796
- for (const row of decodedChildReservations) {
1840
+ for (const row of childReservationRows) {
1797
1841
  if (row.child_submission_id === null) continue;
1798
1842
  const child = yield* readSubmission(operation, row.child_submission_id);
1799
1843
  if (Option.isSome(child)) {
@@ -1844,6 +1888,7 @@ const makeServices = Effect.fnUntraced(function* () {
1844
1888
  resolveAdmission,
1845
1889
  selectHead,
1846
1890
  markInputApplied,
1891
+ appendInput,
1847
1892
  finalizeSettlement: (request) => owner.withMutation(finalizeSettlement(request)),
1848
1893
  requestAbort,
1849
1894
  stopWorker,