@effect-agent/storage-memory 0.1.0-beta.49 → 0.1.0-beta.51

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,8 +1,8 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
- import { Clock, DateTime, Duration, Effect, Layer, Option, Ref, Schema, Stream } from "effect";
2
+ import { Cause, Clock, DateTime, Duration, Effect, Exit, Fiber, Layer, Option, Ref, Schema, Stream } from "effect";
3
3
  import { AttemptId, ReceiptId, SubmissionId } from "@effect-agent/core/Identifiers";
4
4
  import { PersistedJson, ProducerEpoch } from "@effect-agent/thread/Records";
5
- import { AbortCommand, AbortIntent, AbortIntentRequest, AdmissionAdmitted, AdmissionConflict, AdmissionIndeterminate, AdmissionNotAdmitted, AdmissionRequest, AdmissionResult, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, AttachChildToReservationRequest, BeginChildBudgetReleaseRequest, ChildAttachmentSnapshot, ChildBudgetReservationRequest, ChildBudgetReservationSnapshot, ChildReservationConflict, ChildSettledNotification, Claim, ClaimJoiningRequest, ClaimRequest, DEFAULT_OWNERSHIP_LEASE_DURATION, InputAppliedMarker, JoinSnapshot, JoinedToHost, JoiningClaim, LedgerCapabilities, LedgerError, MarkInputAppliedRequest, MarkJoinedRequest, MarkReadyRequest, MarkUnknownRequest, OwnershipLost, OwnershipRenewal, OwnershipSnapshot, OwnershipToken, QueueSequence, RecoverySnapshot, RecoverySnapshotRequest, ReleaseChildBudgetRequest, ReleaseOwnershipRequest, RenewOwnershipRequest, ReservedChildBudget, ReservedSettlement, RevertJoiningRequest, Settlement, SettlementConflict, SettlementFinalization, SettlementReservation, SettlementReservationSnapshot, SubmissionLedger, SubmissionLookup, SubmissionLookupByKey, SubmissionSnapshot, SuspendRequest, SuspensionSnapshot, UnknownResolution, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, settlementFailureFromRecord } from "@effect-agent/thread/SubmissionLedger";
5
+ import { AbortCommand, AbortIntent, AbortIntentRequest, AdmissionAdmitted, AdmissionConflict, AdmissionIndeterminate, AdmissionNotAdmitted, AdmissionPolicyError, AdmissionRequest, AdmissionResult, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, AttachChildToReservationRequest, BeginChildBudgetReleaseRequest, ChildAttachmentSnapshot, ChildBudgetReservationRequest, ChildBudgetReservationSnapshot, ChildReservationConflict, ChildSettledNotification, Claim, ClaimJoiningRequest, ClaimRequest, DEFAULT_OWNERSHIP_LEASE_DURATION, InputAppliedMarker, JoinSnapshot, JoinedToHost, JoiningClaim, LedgerCapabilities, LedgerError, MarkInputAppliedRequest, MarkJoinedRequest, MarkReadyRequest, MarkUnknownRequest, OwnershipLost, OwnershipRenewal, OwnershipSnapshot, OwnershipToken, QueueSequence, RecoverySnapshot, RecoverySnapshotRequest, ReleaseChildBudgetRequest, ReleaseOwnershipRequest, RenewOwnershipRequest, ReservedChildBudget, ReservedSettlement, RevertJoiningRequest, Settlement, SettlementConflict, SettlementFinalization, SettlementReservation, SettlementReservationSnapshot, SubmissionAdmissionFence, SubmissionLedger, SubmissionLookup, SubmissionLookupByKey, SubmissionSnapshot, SuspendRequest, SuspensionSnapshot, UnknownResolution, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, settlementFailureFromRecord } from "@effect-agent/thread/SubmissionLedger";
6
6
  //#region src/MemorySubmissionLedger.ts
7
7
  var MemorySubmissionLedger_exports = /* @__PURE__ */ __exportAll({
8
8
  MemorySubmissionLedgerLive: () => MemorySubmissionLedgerLive,
@@ -77,6 +77,8 @@ const toSnapshot = (row) => SubmissionSnapshot.make({
77
77
  receiptId: row.receiptId,
78
78
  state: row.state,
79
79
  createdAt: utc(row.createdAtMillis),
80
+ ...row.admissionGroup === void 0 ? {} : { admissionGroup: row.admissionGroup },
81
+ ...row.admissionFence === void 0 ? {} : { admissionFence: row.admissionFence },
80
82
  ...row.settledOutcome === void 0 ? {} : { settledOutcome: row.settledOutcome },
81
83
  ...row.readyAtMillis === void 0 ? {} : { readyAt: utc(row.readyAtMillis) },
82
84
  ...row.parentLinkage === void 0 ? {} : { parentLinkage: row.parentLinkage }
@@ -161,18 +163,20 @@ const makeSubmissionLedger = (options = {}) => Effect.gen(function* () {
161
163
  childReservations: /* @__PURE__ */ new Map(),
162
164
  mintCounter: 0
163
165
  });
166
+ const admissionFence = yield* SubmissionAdmissionFence;
164
167
  const leaseMillis = Duration.toMillis(DEFAULT_OWNERSHIP_LEASE_DURATION);
165
168
  const capabilities = Effect.succeed(LedgerCapabilities.make({ durability: "non-durable" }));
166
169
  const admit = Effect.fn("MemorySubmissionLedger.admit")((unvalidated) => Effect.gen(function* () {
167
170
  const request = yield* validate(AdmissionRequest, "admit", unvalidated);
168
171
  const nowMillis = yield* Clock.currentTimeMillis;
172
+ const services = yield* Effect.context();
169
173
  const decision = yield* Ref.modify(state, (current) => {
170
174
  const key = admissionKey(request.threadId, request.principal, request.idempotencyKey);
171
175
  const existingId = current.admissionIndex.get(key);
172
176
  if (existingId !== void 0) {
173
177
  const existing = current.submissions.get(existingId);
174
178
  if (existing === void 0) return [failure(ledgerError("admit", "Admission index references a missing Submission")), current];
175
- if (existing.row.inputDigest !== request.inputDigest || !sameParentLinkage(existing.row.parentLinkage, request.parentLinkage)) return [failure(AdmissionConflict.make({
179
+ if (existing.row.inputDigest !== request.inputDigest || !sameParentLinkage(existing.row.parentLinkage, request.parentLinkage) || existing.row.admissionGroup !== request.admissionGroup || !Schema.toEquivalence(Schema.optional(Schema.Json))(existing.row.admissionFence, request.admissionFence)) return [failure(AdmissionConflict.make({
176
180
  threadId: request.threadId,
177
181
  principal: request.principal,
178
182
  idempotencyKey: request.idempotencyKey,
@@ -187,6 +191,15 @@ const makeSubmissionLedger = (options = {}) => Effect.gen(function* () {
187
191
  replayed: true
188
192
  })), current];
189
193
  }
194
+ const checked = Effect.runSyncExitWith(services)(admissionFence.check(request));
195
+ if (Exit.isFailure(checked)) return [{
196
+ _tag: "cause",
197
+ cause: checked.cause
198
+ }, current];
199
+ if (request.admissionGroup !== void 0 && [...current.submissions.values()].some(({ row }) => row.threadId === request.threadId && row.admissionGroup === request.admissionGroup && row.state !== "settled")) return [failure(AdmissionPolicyError.make({
200
+ reason: "occupied",
201
+ code: "admission-group"
202
+ })), current];
190
203
  if (current.submissions.size >= MAX_SUBMISSIONS) return [failure(ledgerError("admit", `In-memory submission limit ${MAX_SUBMISSIONS} exceeded`)), current];
191
204
  const lane = current.lanes.get(request.threadId) ?? {
192
205
  nextQueueSequence: 1,
@@ -209,7 +222,9 @@ const makeSubmissionLedger = (options = {}) => Effect.gen(function* () {
209
222
  settledOutcome: void 0,
210
223
  createdAtMillis: nowMillis,
211
224
  readyAtMillis: void 0,
212
- parentLinkage: request.parentLinkage
225
+ parentLinkage: request.parentLinkage,
226
+ ...request.admissionGroup === void 0 ? {} : { admissionGroup: request.admissionGroup },
227
+ ...request.admissionFence === void 0 ? {} : { admissionFence: request.admissionFence }
213
228
  };
214
229
  const submissions = new Map(current.submissions).set(row.submissionId, {
215
230
  row,
@@ -243,8 +258,18 @@ const makeSubmissionLedger = (options = {}) => Effect.gen(function* () {
243
258
  }];
244
259
  });
245
260
  if (decision._tag === "failure") return yield* decision.error;
261
+ if (decision._tag === "cause") {
262
+ for (const reason of decision.cause.reasons) if (Cause.isDieReason(reason) && Cause.isAsyncFiberError(reason.defect)) {
263
+ yield* Fiber.interrupt(reason.defect.fiber);
264
+ return yield* AdmissionPolicyError.make({
265
+ reason: "unavailable",
266
+ code: "synchronous-memory-policy-required"
267
+ });
268
+ }
269
+ return yield* Effect.failCause(decision.cause);
270
+ }
246
271
  return decision.value;
247
- }));
272
+ }), Effect.uninterruptible);
248
273
  const markReady = Effect.fn("MemorySubmissionLedger.markReady")((unvalidated) => Effect.gen(function* () {
249
274
  const request = yield* validate(MarkReadyRequest, "markReady", unvalidated);
250
275
  const nowMillis = yield* Clock.currentTimeMillis;