effect-agent 0.1.0-beta.160 → 0.1.0-beta.162

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 (48) hide show
  1. package/dist/{Admin-Dirux8PR.d.mts → Admin-Vhz6NdaH.d.mts} +10 -2
  2. package/dist/{DurableAgentRuntime-pr7cCaZw.mjs → DurableAgentRuntime-BpB5rBcu.mjs} +41 -35
  3. package/dist/DurableAgentRuntime-BpB5rBcu.mjs.map +1 -0
  4. package/dist/{EventSource-DOXB0RJR.d.mts → EventSource-CtS0RBM7.d.mts} +2 -2
  5. package/dist/{PreparedInputAdmission-B7r401xJ.d.mts → PreparedInputAdmission-CS_zlCvD.d.mts} +3 -3
  6. package/dist/{Subscription-B3ScCBaN.d.mts → Subscription-nbSNY6Hs.d.mts} +2 -2
  7. package/dist/{SubscriptionInput-BP5WVsX_.d.mts → SubscriptionInput-DbXnOMS2.d.mts} +2 -2
  8. package/dist/durable/Admin.d.mts +1 -1
  9. package/dist/durable/AgentRegistration.d.mts +1 -1
  10. package/dist/durable/Certification.d.mts +1 -1
  11. package/dist/durable/CommittedActivity.d.mts +1 -1
  12. package/dist/durable/DurableAgentRuntime.d.mts +1 -1
  13. package/dist/durable/DurableAgentRuntime.mjs +1 -1
  14. package/dist/durable/EventSource.d.mts +1 -1
  15. package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
  16. package/dist/durable/LifecyclePublication.d.mts +1 -1
  17. package/dist/durable/LifecyclePublication.mjs +25 -16
  18. package/dist/durable/LifecyclePublication.mjs.map +1 -1
  19. package/dist/durable/MessageDelivery.d.mts +3 -3
  20. package/dist/durable/MessageDeliveryStoreConformance.d.mts +1 -1
  21. package/dist/durable/PersistentHistory.d.mts +1 -1
  22. package/dist/durable/PreparedInputAdmission.d.mts +1 -1
  23. package/dist/durable/Recovery.d.mts +1 -1
  24. package/dist/durable/RunJournal.d.mts +1 -1
  25. package/dist/durable/Scheduling.d.mts +1 -1
  26. package/dist/durable/SubmissionLedger.d.mts +1 -1
  27. package/dist/durable/SubmissionLedgerConformance.d.mts +1 -1
  28. package/dist/durable/SubmissionStatus.d.mts +1 -1
  29. package/dist/durable/Subscription.d.mts +1 -1
  30. package/dist/durable/SubscriptionInput.d.mts +1 -1
  31. package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
  32. package/dist/durable/SubscriptionTools.d.mts +2 -2
  33. package/dist/durable/SubscriptionTransition.d.mts +1 -1
  34. package/dist/durable/Subscriptions.d.mts +5 -5
  35. package/dist/durable/ThreadContextHistory.d.mts +1 -1
  36. package/dist/durable/ThreadInvariants.d.mts +1 -1
  37. package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
  38. package/dist/durable/ThreadStore.d.mts +1 -1
  39. package/dist/durable/ThreadStoreConformance.d.mts +1 -1
  40. package/dist/durable/WorkerAdmission.d.mts +1 -1
  41. package/dist/durable/WorkerHost.d.mts +1 -1
  42. package/dist/index.d.mts +5 -5
  43. package/dist/index.mjs +1 -1
  44. package/package.json +1 -1
  45. package/src/durable/DurableAgentRuntime.ts +63 -50
  46. package/src/durable/LifecyclePublication.ts +52 -29
  47. package/src/durable/internal/journal-checkpoint.ts +8 -7
  48. package/dist/DurableAgentRuntime-pr7cCaZw.mjs.map +0 -1
@@ -1511,6 +1511,12 @@ interface LifecyclePublicationStorage {
1511
1511
  }) => Effect.Effect<ReadonlyArray<LifecyclePublicationBatch>, LifecyclePublicationError>;
1512
1512
  /** Atomically acknowledge the exact batch, retaining its identities and fingerprints. */
1513
1513
  readonly acknowledge: (publications: LifecyclePublicationBatch) => Effect.Effect<void, LifecyclePublicationError>;
1514
+ /** Optional atomic acknowledgement of up to 100 successfully published owner batches.
1515
+ * Validate every exact batch before consuming any debt. Empty waves succeed without writes.
1516
+ * Wrappers that validate acknowledgement authority must wrap this method too.
1517
+ * Custom services may omit this; drains then acknowledge each batch immediately.
1518
+ */
1519
+ readonly acknowledgeMany?: (batches: ReadonlyArray<LifecyclePublicationBatch>) => Effect.Effect<void, LifecyclePublicationError>;
1514
1520
  /**
1515
1521
  * Claim a due owner batch and persist its retry before dispatch. Eight automatic attempts;
1516
1522
  * 1s exponential backoff capped at 60s, after the dispatch timeout. The final attempt parks
@@ -1547,7 +1553,9 @@ declare const lifecyclePublicationLayer: Layer.Layer<never, never, Crypto.Crypto
1547
1553
  * One finite wave for the host's existing maintenance coordinator. Persist the next deadline
1548
1554
  * before dispatch, so interruption and process loss retain the same facts without another timer.
1549
1555
  * Finish independent owner batches before surfacing failures; interruption stops the wave.
1550
- * Acknowledgements are exact and idempotent. No producer or external Tool is re-executed here.
1556
+ * Acknowledgements are exact and idempotent. An optional storage wave acknowledgement commits
1557
+ * completed batches in groups of up to 100, including when a later dispatch is interrupted. No producer or
1558
+ * external Tool is re-executed here.
1551
1559
  */
1552
1560
  declare const drainLifecyclePublications: (storage: LifecyclePublicationStorage, timeoutMillis?: any, limit?: any, options?: {
1553
1561
  readonly retainedOnly?: boolean;
@@ -4267,4 +4275,4 @@ declare const RetryRefused_base: Schema.Class<RetryRefused, Schema.TaggedStruct<
4267
4275
  declare class RetryRefused extends RetryRefused_base {}
4268
4276
  //#endregion
4269
4277
  export { RepairSubagentStartLink as $, runDurationBatchId as $i, DurableApprovalFailure as $n, ThreadRecoveryCheckpoints as $r, ParentLinkage as $t, AwaitChildSettlement as A, turnResultsBatchId as Aa, JournalBoundary as Ai, SuspensionReason as An, CheckpointRejected as Ar, ChildReservationConflict as At, MarkUnknown as B, DurableBindingFailure as Ba, compactionBatchId as Bi, settlementFailureFromRecord as Bn, ThreadExport as Br, InputAppliedMarker as Bt, renderRecoveryExplanation as C, turnBatchId as Ca, drainLifecyclePublications as Ci, SubmissionLookupByKey as Cn, isolateRecovery as Cr, ApprovalDecisionIntent as Ct, ApplyUnknownResolutions as D, turnResponseBatch as Da, SettledSubmission as Di, SubmissionWorkItem as Dn, threadCreatedRecordId as Dr, ChildAttachmentSnapshot as Dt, ApplyJoinAccounting as E, turnPreparedBatchId as Ea, PendingSubmission as Ei, SubmissionState as En, threadCreatedBatchId as Er, BeginChildBudgetReleaseRequest as Et, CompleteMaterialization as F, AgentAttemptContext as Fa, TurnCommitInput as Fi, UnknownResolutionIntent as Fn, SaveCheckpointRequest as Fr, Claim as Ft, PropagateChildAbort as G, compileBindingContracts as Ga, modelResponseInterruptedRecordId as Gi, submissionSettlementBatchId as Gn, ThreadNotMaterialized as Gr, MarkInputAppliedRequest as Gt, OpenDelegationCallEvidence as H, ExecutableAgentBinding as Ha, firstWorkerInputRecordId as Hi, submissionAbortRecordId as Hn, ThreadIdentity as Hr, JoiningClaim as Ht, DeclaredPendingBatchEvidence as I, AgentRegistration as Ia, agentUpdateRecordId as Ii, WaitingChild as In, SaveRecoveryCheckpointRequest as Ir, ClaimHandoff as It, Recovery_d_exports as J, projectRunJournal as Ji, workerTerminalFromRecord as Jn, ThreadOutstandingRequest as Jr, MarkUnknownRequest as Jt, RecoveryDecision as K, compileRegistrations as Ka, modelResponseRecordId as Ki, submissionSettlementId as Kn, ThreadObservation as Kr, MarkJoinedRequest as Kt, DelegationAdmissionEvidence as L, BindingSelection as La, approvalDecisionBatchId as Li, WaitingForChildSuspension as Ln, SelectedThreadRead as Lr, ClaimJoiningRequest as Lt, AwaitParentEstablishment as M, workerOriginRecordId as Ma, RunJournalProjection as Mi, UnknownResolution as Mn, FencedAppendRequest as Mr, ChildReservationStatus as Mt, AwaitUnknownResolution as N, workerReportRecordId as Na, RunJournalUsage as Ni, UnknownResolutionCommand as Nn, LoadCheckpointRequest as Nr, ChildSettledNotification as Nt, AwaitApprovalDecision as O, turnResponseBatchId as Oa, SubmissionStatus as Oi, SuspendRequest as On, AppendConflict as Or, ChildBudgetReservationRequest as Ot, CompleteChildAdmission as P, AgentRegistration_d_exports as Pa, RunJournal_d_exports as Pi, UnknownResolutionConflict as Pn, MAX_THREAD_EXPORT_RECORDS as Pr, ChildSettledOutcome as Pt, RepairReadiness as Q, runCompletionDigest as Qi, DurableAgentRuntime_d_exports as Qn, ThreadRecordRequest as Qr, OwnershipToken as Qt, EnsureWaitingForChild as R, BindingUnavailable as Ra, childIdempotencyKeyFor as Ri, WorkerLedgerState as Rn, ThreadCheckpoint as Rr, ClaimRequest as Rt, recoveryDecisionMeaning as S, turnApprovalsBatchId as Sa, LifecyclePublication_d_exports as Si, SubmissionLookupById as Sn, childReservationIdFor as Sr, ApprovalDecisionCommand as St, ApplyInput as T, turnIdForRun as Ta, lifecyclePublicationLayer as Ti, SubmissionSnapshot as Tn, recoveryRepairRecordId as Tr, AttachChildToReservationRequest as Tt, OpenToolCallEvidence as U, ReplayVersions as Ua, markUnknownBatchId as Ui, submissionInputBatchId as Un, ThreadIdentityRequest as Ur, LedgerCapabilities as Ut, NoAction as V, DurableWorkerBinding as Va, compactionRecordId as Vi, submissionAbortBatchId as Vn, ThreadExportRequest as Vr, JoinSnapshot as Vt, PendingApprovalEvidence as W, ResolvedBinding as Wa, modelResponseInterruptedBatchId as Wi, submissionInputRecordId as Wn, ThreadMaterialization as Wr, LedgerError as Wt, RepairInputMarker as X, promptFromCanonicalRecords as Xi, DurableAbortFailure as Xn, ThreadRead as Xr, OwnershipRenewal as Xt, ReleaseOrphanChildReservation as Y, projectRunJournalStream as Yi, ApprovalSuspensionError as Yn, ThreadPeerCountRequest as Yr, OwnershipLost as Yt, RepairJoinMarker as Z, runCompletedRecordId as Zi, DurableAgentRuntime as Zn, ThreadReadRequest as Zr, OwnershipSnapshot as Zt, RetryCommand as _, toolCallResultBatchId as _a, LifecyclePublicationError as _i, SubmissionAdmissionFence as _n, RecoveryBlocked as _r, AdmissionPolicyError as _t, IntegrityCheck as a, subagentJoinedRecordId as aa, ThreadStoreFailure as ai, ReservedChildBudget as an, DurableObserveOptions as ar, SettleAborted as at, obligationSeverityOf as b, toolStepSettledBatchId as ba, LifecyclePublicationSource as bi, SubmissionLedger_d_exports as bn, RecoverySweepOptions as br, AdmissionResult as bt, IntegrityReport as c, subagentRequestedBatchId as ca, ThreadTailRequest as ci, ResolutionCompletedWithResult as cn, DurableRetryFailure as cr, AbortCommand as ct, ObligationReport as d, subagentStartedRecordId as da, getRunInput as di, RevertJoiningRequest as dn, DurableSubmitAgent as dr, AdmissionAdmitted as dt, runDurationRecordId as ea, ThreadRunInputRequest as ei, RecoverySnapshot as en, DurableApprovalResolver as er, ResumeFromTurnBoundary as et, ObligationSeverity as f, toolApprovalDecisionRecordId as fa, readOutstanding as fi, Settlement as fn, DurableSubmitFailure as fr, AdmissionConflict as ft, RecoveryExplanation as g, toolCallResolvedRecordId as ga, LifecyclePublicationConfig as gi, SettlementReservationSnapshot as gn, DurableWorkerRequirements as gr, AdmissionNotAdmitted as gt, RecoveryDisposition as h, toolCallResolutionBatchId as ha, LifecyclePublicationBatch as hi, SettlementReservation as hn, DurableWorkerFailure as hr, AdmissionIndeterminate as ht, ExplainedUnknownCall as i, subagentJoinBatchId as ia, ThreadStoreError as ii, RenewOwnershipRequest as in, DurableObligationFailure as ir, RevertJoining as it, AwaitHostSettlement as j, workerInputRecordId as ja, RunJournalError as ji, SuspensionSnapshot as jn, FenceRejected as jr, ChildReservationId as jt, AwaitChildAdmissionResolution as k, turnResultsBatch as ka, SubmissionStatus_d_exports as ki, SuspensionOutcome as kn, AppendResult as kr, ChildBudgetReservationSnapshot as kt, ObligationBlockedOn as l, subagentRequestedRecordId as la, ThreadWorkerStateRequest as li, ResolutionNeverHappened as ln, DurableRuntimeConfig as lr, AbortIntent as lt, RECOVERY_DECISION_MEANINGS as m, toolCallPreparedRecordId as ma, LifecyclePublication as mi, SettlementFinalization as mn, DurableVerifyFailure as mr, AdmissionGroup as mt, ExplainedEvidence as n, runStartedBatchId as na, ThreadStore as ni, ReleaseChildBudgetRequest as nn, DurableAwaitFailure as nr, ResumeSuspended as nt, IntegrityCheckName as o, subagentLineageBatchId as oa, ThreadStore_d_exports as oi, ReservedSettlement as on, DurableProgressFailure as or, SettleJoinedWithHost as ot, ObligationThresholds as p, toolApprovalRequestRecordId as pa, readWorkerState as pi, SettlementConflict as pn, DurableSubmitOptions as pr, AdmissionFence as pt, RecoveryEvidence as q, definitionDigestsEqual as qa, peerMessageRecordId as qi, submissionSettlementRecordId as qn, ThreadOutstanding as qr, MarkReadyRequest as qt, ExplainedSubmission as r, runStartedRecordId as ra, ThreadStoreDiagnostic as ri, ReleaseOwnershipRequest as rn, DurableExplainFailure as rr, ResumeWaitingParent as rt, IntegrityCheckStatus as s, subagentLineageRecordId as sa, ThreadTail as si, ResolutionAbortSubmission as sn, DurableResolveFailure as sr, classifyRecovery as st, Admin_d_exports as t, runIdForSubmission as ta, ThreadSelection as ti, RecoverySnapshotRequest as tn, DurableApprovalSuspension as tr, ResumePendingToolBatch as tt, ObligationEntry as u, subagentStartedBatchId as ua, getRecord as ui, ResolutionSafeToRetry as un, DurableRuntimeConfigOptions as ur, AbortIntentRequest as ut, RetryRefusalReason as v, toolCallSettledRecordId as va, LifecyclePublicationFact as vi, SubmissionLedger as vn, RecoveryFailure as vr, AdmissionRequest as vt, AppendReservedSettlement as w, turnCanonicalBatch as wa, lifecyclePublicationBatchMaxFacts as wi, SubmissionScheduling as wn, recoveryRepairBatchId as wr, ApprovalPendingSuspension as wt, predictRecoveryDisposition as x, toolStepSettledRecordId as xa, LifecyclePublicationStorage as xi, SubmissionLookup as xn, RecoverySweepResult as xr, ApprovalConflict as xt, RetryRefused as y, toolCallUnknownRecordId as ya, LifecyclePublicationHandler as yi, SubmissionLedgerFailure as yn, RecoveryReport as yr, AdmissionResolution as yt, FinalizeLedgerFromHistory as z, CurrentBindingSelection as za, childThreadIdFor as zi, WorkerStopCommand as zn, ThreadCheckpoints as zr, DEFAULT_OWNERSHIP_LEASE_DURATION as zt };
4270
- //# sourceMappingURL=Admin-Dirux8PR.d.mts.map
4278
+ //# sourceMappingURL=Admin-Vhz6NdaH.d.mts.map
@@ -90,15 +90,16 @@ var RecoveryCheckpointContents = class extends Schema.Class("@effect-agent/threa
90
90
  state: RecoveryCheckpointState,
91
91
  digest: Digest
92
92
  }) {};
93
- const RECOVERY_ENGINE_VERSION = "effect-agent/recovery@3";
93
+ const RECOVERY_ENGINE_VERSION = "effect-agent/recovery@4";
94
94
  /**
95
95
  * Prove that indexed original-input absence also means absent prefix Run/control evidence.
96
- * Only cache consumers with colon-free Submission IDs use this certificate. For those IDs,
97
- * every possible control marker is exactly :run:<submission-id>:. Parsing here can only decline
98
- * caching; it never supplies an execution identity. Separator-bearing identities use full replay.
96
+ * A certificate covers only Run IDs with the given length. Every possible control marker for
97
+ * those IDs is exactly :<run-id>:, including markers nested inside opaque IDs. Cache consumers
98
+ * must have the checkpoint owner's ID length; shorter/longer aliases require full replay.
99
+ * Parsing here can only decline caching; it never supplies an execution identity.
99
100
  * The temporary anchor set is discarded after certification, not persisted with the context.
100
101
  */
101
- const makeThreadContextCertificate = () => {
102
+ const makeThreadContextCertificate = (runIdLength) => {
102
103
  const anchored = /* @__PURE__ */ new Set();
103
104
  let valid = true;
104
105
  return {
@@ -114,8 +115,8 @@ const makeThreadContextCertificate = () => {
114
115
  if (originalInput) anchored.add(payload.runId);
115
116
  }
116
117
  for (let start = record.recordId.indexOf(":run:"); start !== -1; start = record.recordId.indexOf(":run:", start + 1)) {
117
- const end = record.recordId.indexOf(":", start + 5);
118
- if (end !== -1 && !anchored.has(record.recordId.slice(start + 1, end))) {
118
+ const end = start + 1 + runIdLength;
119
+ if (record.recordId[end] === ":" && !anchored.has(record.recordId.slice(start + 1, end))) {
119
120
  valid = false;
120
121
  return;
121
122
  }
@@ -2547,7 +2548,7 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (bindings) {
2547
2548
  })).pipe(Effect.catchTag("CheckpointRejected", () => Effect.succeed(Option.none())));
2548
2549
  if (Option.isNone(loaded)) return Option.none();
2549
2550
  const checkpoint = loaded.value;
2550
- if (checkpoint.engineVersion !== "effect-agent/recovery@3" || checkpoint.threadId !== threadId || checkpoint.throughSequence > throughSequence) return Option.none();
2551
+ if (checkpoint.engineVersion !== "effect-agent/recovery@4" || checkpoint.threadId !== threadId || checkpoint.throughSequence > throughSequence) return Option.none();
2551
2552
  const decoded = yield* Schema.decodeUnknownEffect(RecoveryCheckpointContents)(checkpoint.state).pipe(Effect.option);
2552
2553
  if (Option.isNone(decoded)) return Option.none();
2553
2554
  const { state, digest } = decoded.value;
@@ -2581,7 +2582,7 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (bindings) {
2581
2582
  /** Late/foreign evidence and new compactions require the original canonical proof. */
2582
2583
  const contextSuffixCompatible = (records, submissionId) => {
2583
2584
  const runId = runIdForSubmission(submissionId);
2584
- const certificate = makeThreadContextCertificate();
2585
+ const certificate = makeThreadContextCertificate(runId.length);
2585
2586
  for (const entry of records) {
2586
2587
  const { payload, recordId } = entry.record;
2587
2588
  if (payload._tag === "CompactionCreated" || retainThreadIdentity(entry)) return false;
@@ -2604,7 +2605,7 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (bindings) {
2604
2605
  const { checkpoint, state } = loaded.value;
2605
2606
  if (throughSequence - checkpoint.throughSequence > 4096) return full;
2606
2607
  const submissionId = submissionIds.length === 1 ? submissionIds[0] : void 0;
2607
- if (state.context !== void 0 && submissionId !== void 0 && !submissionId.includes(":") && (journalOwner === void 0 || journalOwner === runIdForSubmission(submissionId))) {
2608
+ if (state.context !== void 0 && submissionId !== void 0 && submissionId.length === state.submissionId.length && (journalOwner === void 0 || journalOwner === runIdForSubmission(submissionId))) {
2608
2609
  const runId = runIdForSubmission(submissionId);
2609
2610
  if ([yield* getRunInput({
2610
2611
  threadId,
@@ -2636,16 +2637,17 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (bindings) {
2636
2637
  seed: state.seed
2637
2638
  };
2638
2639
  });
2639
- const persistRecoveryCheckpoint = Effect.fn("DurableAgentRuntime.persistRecoveryCheckpoint")(function* (ctx, submission, state, tail, createdAt) {
2640
- if (store.recoveryCheckpoints === void 0) return;
2640
+ const encodeRecoveryCheckpoint = Effect.fnUntraced(function* (state) {
2641
2641
  const encoded = yield* Schema.encodeEffect(RecoveryCheckpointState)(state).pipe(Effect.option);
2642
- if (Option.isNone(encoded)) return;
2642
+ if (Option.isNone(encoded)) return Option.none();
2643
2643
  const digest = yield* withCrypto(digestJson(encoded.value));
2644
- const contents = yield* Schema.encodeEffect(Schema.fromJsonString(RecoveryCheckpointContents))(RecoveryCheckpointContents.make({
2644
+ return yield* Schema.encodeEffect(Schema.fromJsonString(RecoveryCheckpointContents))(RecoveryCheckpointContents.make({
2645
2645
  state,
2646
2646
  digest
2647
2647
  })).pipe(Effect.flatMap(Schema.decodeUnknownEffect(Schema.fromJsonString(PersistedJson))), Effect.option);
2648
- if (Option.isNone(contents)) return;
2648
+ });
2649
+ const persistRecoveryCheckpoint = Effect.fn("DurableAgentRuntime.persistRecoveryCheckpoint")(function* (ctx, submission, contents, tail, createdAt) {
2650
+ if (store.recoveryCheckpoints === void 0) return;
2649
2651
  const checkpoint = ThreadCheckpoint.make({
2650
2652
  schemaVersion: 1,
2651
2653
  threadId: ctx.threadId,
@@ -2655,7 +2657,7 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (bindings) {
2655
2657
  agentDefinitionDigest: submission.agentDigests.agent,
2656
2658
  modelDigest: submission.agentDigests.model,
2657
2659
  toolDigest: submission.agentDigests.tools,
2658
- state: contents.value,
2660
+ state: contents,
2659
2661
  createdAt
2660
2662
  });
2661
2663
  yield* hit("checkpoint:before-save");
@@ -2680,7 +2682,7 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (bindings) {
2680
2682
  }
2681
2683
  if (projection === void 0) {
2682
2684
  const source = canonicalRange(ctx.threadId, tail.sequence);
2683
- const certificate = makeThreadContextCertificate();
2685
+ const certificate = makeThreadContextCertificate(runIdForSubmission(submission.submissionId).length);
2684
2686
  const metadata = makeJournalMetadata(void 0);
2685
2687
  const retained = [];
2686
2688
  yield* Stream.runForEach(source, (entry) => Effect.sync(() => {
@@ -2695,30 +2697,32 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (bindings) {
2695
2697
  if (projection === void 0) return;
2696
2698
  const prompt = yield* Schema.encodeEffect(Prompt.Prompt)(projection.prompt).pipe(Effect.flatMap(decodePersisted), Effect.option);
2697
2699
  if (Option.isNone(prompt)) return;
2698
- let seed;
2699
- let records = identities;
2700
- let submissionIds = [submission.submissionId];
2701
- if (previous.state.submissionId === submission.submissionId && previous.state.seed !== void 0 && tail.sequence - previous.checkpoint.throughSequence + previous.state.records.length <= 4096) {
2702
- const suffix = yield* Stream.runCollect(canonicalRange(ctx.threadId, tail.sequence, previous.checkpoint.throughSequence));
2703
- if (checkpointSuffixCompatible(previous.state.seed, suffix, previous.state.records)) {
2704
- seed = previous.state.seed;
2705
- records = [...previous.state.records, ...suffix];
2706
- submissionIds = previous.state.submissionIds;
2707
- }
2708
- }
2709
- yield* persistRecoveryCheckpoint(ctx, submission, RecoveryCheckpointState.make({
2700
+ const contextState = RecoveryCheckpointState.make({
2710
2701
  schemaVersion: 2,
2711
2702
  policyAccountingVersion: 1,
2712
2703
  submissionId: submission.submissionId,
2713
- submissionIds,
2714
- ...seed === void 0 ? {} : { seed },
2704
+ submissionIds: [submission.submissionId],
2715
2705
  context: ThreadContextCheckpoint.make({
2716
2706
  throughSequence: tail.sequence,
2717
2707
  prompt: prompt.value,
2718
2708
  ...projection.contextWindowId === void 0 ? {} : { contextWindowId: projection.contextWindowId }
2719
2709
  }),
2720
- records
2721
- }), tail, yield* DateTime.now);
2710
+ records: identities
2711
+ });
2712
+ let state = contextState;
2713
+ if (previous.state.submissionId === submission.submissionId && previous.state.seed !== void 0 && tail.sequence - previous.checkpoint.throughSequence + previous.state.records.length <= 4096) {
2714
+ const suffix = yield* Stream.runCollect(canonicalRange(ctx.threadId, tail.sequence, previous.checkpoint.throughSequence));
2715
+ if (checkpointSuffixCompatible(previous.state.seed, suffix, previous.state.records)) state = RecoveryCheckpointState.make({
2716
+ ...contextState,
2717
+ seed: previous.state.seed,
2718
+ records: [...previous.state.records, ...suffix],
2719
+ submissionIds: previous.state.submissionIds
2720
+ });
2721
+ }
2722
+ let contents = yield* encodeRecoveryCheckpoint(state);
2723
+ if (Option.isNone(contents) && state.seed !== void 0) contents = yield* encodeRecoveryCheckpoint(contextState);
2724
+ if (Option.isNone(contents)) return;
2725
+ yield* persistRecoveryCheckpoint(ctx, submission, contents.value, tail, yield* DateTime.now);
2722
2726
  });
2723
2727
  const readAllTolerant = Effect.fn("DurableAgentRuntime.readAllTolerant")((threadId, submissionIds) => readControl(threadId, submissionIds).pipe(Effect.map((records) => ({
2724
2728
  records,
@@ -4451,7 +4455,9 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (bindings) {
4451
4455
  ].some((field) => current.usage[field] !== candidate.usage[field]) || (current.usage.unobservedModelCalls ?? 0) !== (candidate.usage.unobservedModelCalls ?? 0)) return;
4452
4456
  const summaries = yield* Effect.forEach([current, candidate], (projection) => summarizeModelUsage(projection.usage.modelUsage, projection.usage.summarizedModelUsage)).pipe(Effect.option);
4453
4457
  if (Option.isNone(summaries) || summaries.value[0] === void 0 || summaries.value[1] === void 0 || !Schema.toEquivalence(RunUsageSummary)(summaries.value[0], summaries.value[1])) return;
4454
- yield* persistRecoveryCheckpoint(ctx, submission, validated.value, tail, replacement.record.createdAt);
4458
+ const contents = yield* encodeRecoveryCheckpoint(validated.value);
4459
+ if (Option.isNone(contents)) return;
4460
+ yield* persistRecoveryCheckpoint(ctx, submission, contents.value, tail, replacement.record.createdAt);
4455
4461
  });
4456
4462
  const childLineage = records.find(({ record }) => record.recordId === subagentLineageRecordId(submission.threadId))?.record.payload;
4457
4463
  const inheritedGrant = submission.workerAdmission?.origin.grant ?? (childLineage?._tag === "SubagentLineageRecorded" ? childLineage.grant : void 0);
@@ -7504,4 +7510,4 @@ var DurableAgentRuntime = class DurableAgentRuntime extends Context.Service()("@
7504
7510
  //#endregion
7505
7511
  export { DurableApprovalSuspension as a, RecoveryFailure as c, childReservationIdFor as d, isolateRecovery as f, DurableApprovalResolver as i, RecoveryReport as l, recoveryRepairRecordId as m, DurableAgentRuntime as n, DurableRuntimeConfig as o, recoveryRepairBatchId as p, DurableAgentRuntime_exports as r, RecoveryBlocked as s, ApprovalSuspensionError as t, RecoverySweepResult as u };
7506
7512
 
7507
- //# sourceMappingURL=DurableAgentRuntime-pr7cCaZw.mjs.map
7513
+ //# sourceMappingURL=DurableAgentRuntime-BpB5rBcu.mjs.map