effect-agent 0.1.0-beta.157 → 0.1.0-beta.158

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 { SubagentExecutionFailure, SubagentExecutionFailureClassification, SubagentGrant } from "../core/SubagentContract.mjs";
2
2
  import { o as WorkerCompletion, p as WorkerReport } from "../Worker-CfwzMZEK.mjs";
3
3
  import "./SubagentReservations.mjs";
4
- import { S as delegationCapsFromPolicy, _ as stop, a as define, b as SubagentProjectionFailure, c as Worker, d as cancel, f as followUp, g as start, h as observe, i as background, l as WorkerObservation, m as list, n as SubagentResult, o as layer, p as inspect, s as make, t as SubagentDurableAccounting, u as awaitWorker, v as SubagentPolicy, x as delegationAllocationFromPolicy, y as SubagentPrestartDenied } from "../Subagent-JjcidJ7q.mjs";
4
+ import { S as delegationCapsFromPolicy, _ as stop, a as define, b as SubagentProjectionFailure, c as Worker, d as cancel, f as followUp, g as start, h as observe, i as background, l as WorkerObservation, m as list, n as SubagentResult, o as layer, p as inspect, s as make, t as SubagentDurableAccounting, u as awaitWorker, v as SubagentPolicy, x as delegationAllocationFromPolicy, y as SubagentPrestartDenied } from "../Subagent-211Oz2IN.mjs";
5
5
  export { SubagentDurableAccounting, SubagentExecutionFailure, SubagentExecutionFailureClassification, SubagentGrant, SubagentPolicy, SubagentPrestartDenied, SubagentProjectionFailure, SubagentResult, Worker, WorkerCompletion, WorkerObservation, WorkerReport, awaitWorker as await, background, cancel, define, delegationAllocationFromPolicy, delegationCapsFromPolicy, followUp, inspect, layer, list, make, observe, start, stop };
@@ -1,4 +1,4 @@
1
1
  import { Receipt } from "../core/Receipt.mjs";
2
- import { a as DurableApprovalSuspension, c as RecoveryFailure, d as childReservationIdFor, f as isolateRecovery, i as DurableApprovalResolver, l as RecoveryReport, m as recoveryRepairRecordId, n as DurableAgentRuntime, o as DurableRuntimeConfig, p as recoveryRepairBatchId, s as RecoveryBlocked, t as ApprovalSuspensionError, u as RecoverySweepResult } from "../DurableAgentRuntime-BAQvZK1e.mjs";
2
+ import { a as DurableApprovalSuspension, c as RecoveryFailure, d as childReservationIdFor, f as isolateRecovery, i as DurableApprovalResolver, l as RecoveryReport, m as recoveryRepairRecordId, n as DurableAgentRuntime, o as DurableRuntimeConfig, p as recoveryRepairBatchId, s as RecoveryBlocked, t as ApprovalSuspensionError, u as RecoverySweepResult } from "../DurableAgentRuntime-eImXoGqD.mjs";
3
3
  import { c as threadCreatedBatchId, l as threadCreatedRecordId } from "../WorkerAdmission-N9hZV85Q.mjs";
4
4
  export { ApprovalSuspensionError, DurableAgentRuntime, DurableApprovalResolver, DurableApprovalSuspension, DurableRuntimeConfig, Receipt, RecoveryBlocked, RecoveryFailure, RecoveryReport, RecoverySweepResult, childReservationIdFor, isolateRecovery, recoveryRepairBatchId, recoveryRepairRecordId, threadCreatedBatchId, threadCreatedRecordId };
@@ -10,7 +10,7 @@ import { a as PreparedInput } from "../Subscription-DaMCppa_.mjs";
10
10
  import { t as PreparedInputAdmission } from "../PreparedInputAdmission-Swp9t800.mjs";
11
11
  import { Context, Crypto, Effect, Layer, Result, Schema } from "effect";
12
12
  declare namespace MessageDelivery_d_exports {
13
- export { MessageDeliveryChange, MessageDeliveryDriver, MessageDeliveryDriverLimits, MessageDeliveryError, MessageDeliveryFailpoint, MessageDeliveryFailpointError, MessageDeliveryFailure, MessageDeliveryKey, MessageDeliveryPage, MessageDeliveryPageRequest, MessageDeliveryPolicy, MessageDeliveryRecord, MessageDeliveryStore, MessageDeliveryStoreLimits, applyMessageDeliveryChange, defaultMessageDeliveryPolicy, defaultMessageDeliveryStoreLimits, isWorkerUpdateDelivery, messageDeliveryCapacity, messageDeliveryDeadline, messageDeliveryKeyString, messageDeliveryUsesCapacity, prepareMessageDelivery, readPending, sameMessageDeliveryIdentity, validateMessageDelivery };
13
+ export { MessageDeliveryChange, MessageDeliveryCompletion, MessageDeliveryDriver, MessageDeliveryDriverLimits, MessageDeliveryError, MessageDeliveryFailpoint, MessageDeliveryFailpointError, MessageDeliveryFailure, MessageDeliveryKey, MessageDeliveryPage, MessageDeliveryPageRequest, MessageDeliveryPolicy, MessageDeliveryRecord, MessageDeliveryStore, MessageDeliveryStoreLimits, applyMessageDeliveryChange, defaultMessageDeliveryPolicy, defaultMessageDeliveryStoreLimits, isWorkerUpdateDelivery, messageDeliveryCapacity, messageDeliveryDeadline, messageDeliveryKeyString, messageDeliveryUsesCapacity, prepareMessageDelivery, readPending, sameMessageDeliveryIdentity, validateMessageDelivery };
14
14
  }
15
15
  /** An owner is always a source Thread. Destination admission has its own frozen key. */
16
16
  export declare const MessageDeliveryKey: Schema.Struct<{
@@ -208,7 +208,7 @@ export declare const MessageDeliveryRecord: Schema.Struct<{
208
208
  readonly receipt: Schema.NullOr<typeof Receipt>;
209
209
  readonly settlement: Schema.NullOr<typeof Settlement>;
210
210
  readonly refusal: Schema.NullOr<Schema.String>;
211
- readonly parkReason: Schema.NullOr<Schema.Literals<readonly ["exhausted", "deadline", "status-unavailable"]>>;
211
+ readonly parkReason: Schema.NullOr<Schema.Literals<readonly ["exhausted", "deadline", "status-unavailable", "awaiting-settlement"]>>;
212
212
  readonly leaseUntilMillis: Schema.NullOr<Schema.Int>;
213
213
  readonly retry: Schema.Struct<{
214
214
  readonly attempts: Schema.Natural;
@@ -238,7 +238,21 @@ export type MessageDeliveryFailure = MessageDeliveryError | MessageDeliveryFailp
238
238
  export declare const MessageDeliveryFailpoint: Context.Reference<{
239
239
  readonly hit: (point: string) => Effect.Effect<void, MessageDeliveryFailpointError>;
240
240
  }>;
241
+ /** Terminal destination evidence, independent of an expiring source transport claim. */
242
+ export declare const MessageDeliveryCompletion: Schema.Struct<{
243
+ readonly receipt: typeof Receipt;
244
+ readonly settlement: typeof Settlement;
245
+ readonly admissionKey: Schema.brand<Schema.NonEmptyString, "@effect-agent/thread/IdempotencyKey">;
246
+ readonly inputDigest: Schema.brand<Schema.String, "@effect-agent/thread/Digest">;
247
+ }>;
241
248
  export declare const MessageDeliveryChange: Schema.Union<readonly [Schema.Struct<{
249
+ readonly receipt: typeof Receipt;
250
+ readonly settlement: typeof Settlement;
251
+ readonly admissionKey: Schema.brand<Schema.NonEmptyString, "@effect-agent/thread/IdempotencyKey">;
252
+ readonly inputDigest: Schema.brand<Schema.String, "@effect-agent/thread/Digest">;
253
+ readonly _tag: Schema.Literal<"Complete">;
254
+ readonly nowMillis: Schema.Int;
255
+ }>, Schema.Struct<{
242
256
  readonly expectedVersion: Schema.Int;
243
257
  readonly nowMillis: Schema.Int;
244
258
  readonly _tag: Schema.Literal<"Claim">;
@@ -272,7 +286,7 @@ export declare const MessageDeliveryChange: Schema.Union<readonly [Schema.Struct
272
286
  readonly expectedVersion: Schema.Int;
273
287
  readonly nowMillis: Schema.Int;
274
288
  readonly _tag: Schema.Literal<"Park">;
275
- readonly reason: Schema.Literals<readonly ["exhausted", "deadline", "status-unavailable"]>;
289
+ readonly reason: Schema.Literals<readonly ["exhausted", "deadline", "status-unavailable", "awaiting-settlement"]>;
276
290
  readonly diagnostic: Schema.optionalKey<Schema.Codec<Diagnostic, Diagnostic, never, never>>;
277
291
  }>, Schema.Struct<{
278
292
  readonly expectedVersion: Schema.Int;
@@ -474,7 +488,7 @@ export declare const MessageDeliveryPage: Schema.Struct<{
474
488
  readonly receipt: Schema.NullOr<typeof Receipt>;
475
489
  readonly settlement: Schema.NullOr<typeof Settlement>;
476
490
  readonly refusal: Schema.NullOr<Schema.String>;
477
- readonly parkReason: Schema.NullOr<Schema.Literals<readonly ["exhausted", "deadline", "status-unavailable"]>>;
491
+ readonly parkReason: Schema.NullOr<Schema.Literals<readonly ["exhausted", "deadline", "status-unavailable", "awaiting-settlement"]>>;
478
492
  readonly leaseUntilMillis: Schema.NullOr<Schema.Int>;
479
493
  readonly retry: Schema.Struct<{
480
494
  readonly attempts: Schema.Natural;
@@ -695,7 +709,7 @@ export declare const readPending: (request: Pick<{
695
709
  readonly receipt: Receipt | null;
696
710
  readonly settlement: Settlement | null;
697
711
  readonly refusal: string | null;
698
- readonly parkReason: "deadline" | "exhausted" | "status-unavailable" | null;
712
+ readonly parkReason: "awaiting-settlement" | "deadline" | "exhausted" | "status-unavailable" | null;
699
713
  readonly leaseUntilMillis: number | null;
700
714
  readonly retry: {
701
715
  readonly attempts: number;
@@ -896,7 +910,7 @@ export declare const prepareMessageDelivery: (options: {
896
910
  readonly receipt: Receipt | null;
897
911
  readonly settlement: Settlement | null;
898
912
  readonly refusal: string | null;
899
- readonly parkReason: "deadline" | "exhausted" | "status-unavailable" | null;
913
+ readonly parkReason: "awaiting-settlement" | "deadline" | "exhausted" | "status-unavailable" | null;
900
914
  readonly leaseUntilMillis: number | null;
901
915
  readonly retry: {
902
916
  readonly attempts: number;
@@ -13,6 +13,7 @@ import { Clock, Context, Crypto, Effect, Layer, Result, Schema, Semaphore } from
13
13
  //#region src/durable/MessageDelivery.ts
14
14
  var MessageDelivery_exports = /* @__PURE__ */ __exportAll({
15
15
  MessageDeliveryChange: () => MessageDeliveryChange,
16
+ MessageDeliveryCompletion: () => MessageDeliveryCompletion,
16
17
  MessageDeliveryDriver: () => MessageDeliveryDriver,
17
18
  MessageDeliveryDriverLimits: () => MessageDeliveryDriverLimits,
18
19
  MessageDeliveryError: () => MessageDeliveryError,
@@ -40,6 +41,8 @@ var MessageDelivery_exports = /* @__PURE__ */ __exportAll({
40
41
  });
41
42
  const Positive = Schema.Int.check(Schema.isGreaterThan(0));
42
43
  const BoundedName = Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256));
44
+ const receiptsEqual = Schema.toEquivalence(Receipt);
45
+ const settlementsEqual = Schema.toEquivalence(Settlement);
43
46
  /** An owner is always a source Thread. Destination admission has its own frozen key. */
44
47
  const MessageDeliveryKey = Schema.Struct({
45
48
  ownerThreadId: ThreadId,
@@ -77,7 +80,8 @@ const defaultMessageDeliveryStoreLimits = {
77
80
  const ParkReason = Schema.Literals([
78
81
  "exhausted",
79
82
  "deadline",
80
- "status-unavailable"
83
+ "status-unavailable",
84
+ "awaiting-settlement"
81
85
  ]);
82
86
  const MessageDeliveryRecord = Schema.Struct({
83
87
  schemaVersion: Schema.Literal(1),
@@ -127,7 +131,19 @@ const fence = {
127
131
  expectedVersion: Positive,
128
132
  nowMillis: ScheduleInstant
129
133
  };
134
+ /** Terminal destination evidence, independent of an expiring source transport claim. */
135
+ const MessageDeliveryCompletion = Schema.Struct({
136
+ receipt: Receipt,
137
+ settlement: Settlement,
138
+ admissionKey: IdempotencyKey,
139
+ inputDigest: Digest
140
+ });
130
141
  const MessageDeliveryChange = Schema.Union([
142
+ Schema.Struct({
143
+ _tag: Schema.Literal("Complete"),
144
+ nowMillis: ScheduleInstant,
145
+ ...MessageDeliveryCompletion.fields
146
+ }),
131
147
  Schema.Struct({
132
148
  _tag: Schema.Literal("Claim"),
133
149
  ...fence
@@ -292,6 +308,24 @@ const prepareMessageDelivery = Effect.fn("MessageDelivery.prepare")(function* (o
292
308
  /** Pure reducer used under the adapter's atomic compare-and-swap boundary. */
293
309
  const applyMessageDeliveryChange = (record, change) => {
294
310
  const conflict = () => Result.fail(error("conflict", change._tag));
311
+ if (change._tag === "Complete") {
312
+ if (change.admissionKey !== record.envelope.admissionKey || change.inputDigest !== record.envelope.inputDigest || change.receipt.threadId !== record.envelope.threadId || change.settlement.submissionId !== change.receipt.submissionId || change.settlement.receiptId !== change.receipt.receiptId || record.receipt !== null && !receiptsEqual(record.receipt, change.receipt)) return Result.fail(error("corrupt", "completion-identity"));
313
+ if (record.status === "refused") return conflict();
314
+ if (record.status === "processed") return record.settlement !== null && settlementsEqual(record.settlement, change.settlement) ? Result.succeed(record) : Result.fail(error("corrupt", "completion-identity"));
315
+ return Result.succeed({
316
+ ...record,
317
+ version: record.version + 1,
318
+ status: "processed",
319
+ receipt: change.receipt,
320
+ settlement: change.settlement,
321
+ leaseUntilMillis: null,
322
+ parkReason: null,
323
+ retry: {
324
+ ...record.retry,
325
+ parked: false
326
+ }
327
+ });
328
+ }
295
329
  if (record.version !== change.expectedVersion) return conflict();
296
330
  if (record.status === "processed" || record.status === "refused") return conflict();
297
331
  const now = change.nowMillis;
@@ -386,17 +420,7 @@ const applyMessageDeliveryChange = (record, change) => {
386
420
  }
387
421
  if (change._tag === "ObservePending") {
388
422
  if (record.status !== "accepted") return conflict();
389
- if (now >= record.deadlineAtMillis) return Result.succeed(parked("deadline"));
390
- return Result.succeed({
391
- ...base,
392
- leaseUntilMillis: null,
393
- retry: {
394
- ...record.retry,
395
- automaticAttempts: 0,
396
- lastFailure: null,
397
- nextAttemptAtMillis: Math.min(now + record.policy.settlementPollMillis, record.deadlineAtMillis)
398
- }
399
- });
423
+ return Result.succeed(parked("awaiting-settlement"));
400
424
  }
401
425
  if (change._tag === "Refuse") {
402
426
  if (record.status !== "pending") return conflict();
@@ -478,10 +502,18 @@ var MessageDeliveryDriver = class MessageDeliveryDriver extends Context.Service(
478
502
  if (claimed.status === "pending") {
479
503
  const outcome = yield* admitPreparedInput(admission.submit(claimed.envelope), timeout).pipe(Effect.mapError((cause) => error("corrupt", "admission", cause)));
480
504
  yield* failpoint.hit("message-delivery:admission:after");
481
- if (outcome._tag === "Receipt") return yield* commit({
482
- _tag: "Accept",
483
- receipt: outcome.receipt
484
- });
505
+ if (outcome._tag === "Receipt") {
506
+ const accepted = yield* commit({
507
+ _tag: "Accept",
508
+ receipt: outcome.receipt
509
+ });
510
+ return yield* store.change(key, {
511
+ _tag: "Park",
512
+ reason: "awaiting-settlement",
513
+ expectedVersion: accepted.version,
514
+ nowMillis: yield* Clock.currentTimeMillis
515
+ });
516
+ }
485
517
  if (outcome._tag === "Refused") return yield* commit({
486
518
  _tag: "Refuse",
487
519
  code: outcome.error.code,
@@ -552,6 +584,6 @@ var MessageDeliveryDriver = class MessageDeliveryDriver extends Context.Service(
552
584
  }
553
585
  };
554
586
  //#endregion
555
- export { MessageDeliveryChange, MessageDeliveryDriver, MessageDeliveryDriverLimits, MessageDeliveryError, MessageDeliveryFailpoint, MessageDeliveryFailpointError, MessageDeliveryKey, MessageDeliveryPage, MessageDeliveryPageRequest, MessageDeliveryPolicy, MessageDeliveryRecord, MessageDeliveryStore, MessageDeliveryStoreLimits, applyMessageDeliveryChange, defaultMessageDeliveryPolicy, defaultMessageDeliveryStoreLimits, isWorkerUpdateDelivery, messageDeliveryCapacity, messageDeliveryDeadline, messageDeliveryKeyString, messageDeliveryUsesCapacity, prepareMessageDelivery, readPending, sameMessageDeliveryIdentity, MessageDelivery_exports as t, validateMessageDelivery };
587
+ export { MessageDeliveryChange, MessageDeliveryCompletion, MessageDeliveryDriver, MessageDeliveryDriverLimits, MessageDeliveryError, MessageDeliveryFailpoint, MessageDeliveryFailpointError, MessageDeliveryKey, MessageDeliveryPage, MessageDeliveryPageRequest, MessageDeliveryPolicy, MessageDeliveryRecord, MessageDeliveryStore, MessageDeliveryStoreLimits, applyMessageDeliveryChange, defaultMessageDeliveryPolicy, defaultMessageDeliveryStoreLimits, isWorkerUpdateDelivery, messageDeliveryCapacity, messageDeliveryDeadline, messageDeliveryKeyString, messageDeliveryUsesCapacity, prepareMessageDelivery, readPending, sameMessageDeliveryIdentity, MessageDelivery_exports as t, validateMessageDelivery };
556
588
 
557
589
  //# sourceMappingURL=MessageDelivery.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageDelivery.mjs","names":["FailureDiagnostic.Diagnostic","FailureDiagnostic.Value","FailureDiagnostic.capture"],"sources":["../../src/durable/MessageDelivery.ts"],"sourcesContent":["import { Clock, Context, Crypto, Effect, Layer, Result, Schema, Semaphore } from \"effect\";\n\nimport * as FailureDiagnostic from \"../core/FailureDiagnostic.ts\";\nimport { AgentId, DelegationId, ThreadId } from \"../core/Identifiers.ts\";\nimport { Receipt } from \"../core/Receipt.ts\";\nimport { WorkerUpdate } from \"../core/Worker.ts\";\nimport { digestJson } from \"./Digest.ts\";\nimport type { LifecyclePublicationStorage } from \"./LifecyclePublication.ts\";\nimport { admitPreparedInput, PreparedInputAdmission } from \"./PreparedInputAdmission.ts\";\nimport { Digest } from \"./Records.ts\";\nimport { ScheduleInstant, ScheduleRetry, ScheduleRetryReason } from \"./Schedule.ts\";\nimport { IdempotencyKey, Settlement } from \"./SubmissionLedger.ts\";\nimport { PreparedInput } from \"./Subscription.ts\";\n\nconst Positive = Schema.Int.check(Schema.isGreaterThan(0));\nconst BoundedName = Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256));\n\n/** An owner is always a source Thread. Destination admission has its own frozen key. */\nexport const MessageDeliveryKey = Schema.Struct({\n ownerThreadId: ThreadId,\n messageId: IdempotencyKey,\n});\n\nexport type MessageDeliveryKey = typeof MessageDeliveryKey.Type;\n\nexport const MessageDeliveryPolicy = Schema.Struct({\n maxAutomaticAttempts: Positive.check(Schema.isLessThanOrEqualTo(100)),\n attemptTimeoutMillis: Positive.check(Schema.isLessThanOrEqualTo(300_000)),\n retryBaseMillis: Positive,\n retryMaxMillis: Positive,\n settlementPollMillis: Positive,\n}).check(Schema.makeFilter((value) => value.retryBaseMillis <= value.retryMaxMillis));\n\nexport type MessageDeliveryPolicy = typeof MessageDeliveryPolicy.Type;\n\nexport const defaultMessageDeliveryPolicy: MessageDeliveryPolicy = {\n maxAutomaticAttempts: 8,\n attemptTimeoutMillis: 30_000,\n retryBaseMillis: 1_000,\n retryMaxMillis: 60_000,\n settlementPollMillis: 5_000,\n};\n\nexport const MessageDeliveryStoreLimits = Schema.Struct({\n maxPendingPerOwner: Positive,\n maxRetainedPerOwner: Positive,\n maxEnvelopeBytes: Positive,\n /** Separate update capacity preserves the full ordinary allowance for terminal reports. */\n maxPendingUpdatesPerOwner: Schema.optionalKey(Positive),\n maxRetainedUpdatesPerOwner: Schema.optionalKey(Positive),\n}).check(\n Schema.makeFilter(\n (value) =>\n value.maxPendingPerOwner <= value.maxRetainedPerOwner &&\n (value.maxPendingUpdatesPerOwner ?? 32) <= (value.maxRetainedUpdatesPerOwner ?? 256),\n ),\n);\n\nexport type MessageDeliveryStoreLimits = typeof MessageDeliveryStoreLimits.Type;\n\nexport const defaultMessageDeliveryStoreLimits: MessageDeliveryStoreLimits = {\n maxPendingPerOwner: 100,\n maxRetainedPerOwner: 1_000,\n maxEnvelopeBytes: 262_144,\n maxPendingUpdatesPerOwner: 32,\n maxRetainedUpdatesPerOwner: 256,\n};\n\nconst ParkReason = Schema.Literals([\"exhausted\", \"deadline\", \"status-unavailable\"]);\n\nexport const MessageDeliveryRecord = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n envelopeDigest: Digest,\n /** Same-owner predecessor whose admission must be known before this message is submitted. */\n predecessor: Schema.optionalKey(IdempotencyKey),\n createdAtMillis: ScheduleInstant,\n /** Immutable creation identity; explicit recovery only renews deadlineAtMillis. */\n initialDeadlineAtMillis: ScheduleInstant,\n deadlineAtMillis: ScheduleInstant,\n policy: MessageDeliveryPolicy,\n version: Positive,\n status: Schema.Literals([\"pending\", \"accepted\", \"processed\", \"refused\", \"parked\"]),\n receipt: Schema.NullOr(Receipt),\n settlement: Schema.NullOr(Settlement),\n refusal: Schema.NullOr(BoundedName),\n parkReason: Schema.NullOr(ParkReason),\n leaseUntilMillis: Schema.NullOr(ScheduleInstant),\n retry: ScheduleRetry,\n /** Last failed admission/status check, retained across retries and successful recovery. */\n lastFailureDiagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n}).check(\n Schema.makeFilter(\n (record) =>\n record.deadlineAtMillis > record.createdAtMillis &&\n record.initialDeadlineAtMillis > record.createdAtMillis &&\n record.predecessor !== record.key.messageId &&\n (record.status === \"processed\") === (record.settlement !== null) &&\n (record.status === \"refused\") === (record.refusal !== null) &&\n (record.status === \"parked\") === (record.parkReason !== null) &&\n (record.status === \"parked\") === record.retry.parked &&\n (record.status === \"accepted\" || record.status === \"processed\"\n ? record.receipt !== null\n : true) &&\n (record.status === \"pending\" || record.status === \"refused\"\n ? record.receipt === null\n : true) &&\n (record.receipt === null || record.receipt.threadId === record.envelope.threadId) &&\n (record.settlement === null ||\n (record.settlement.receiptId === record.receipt?.receiptId &&\n record.settlement.submissionId === record.receipt.submissionId)) &&\n (record.status === \"processed\" || record.status === \"refused\" || record.status === \"parked\"\n ? record.leaseUntilMillis === null\n : true),\n ),\n);\n\nexport type MessageDeliveryRecord = typeof MessageDeliveryRecord.Type;\n\nexport class MessageDeliveryError extends Schema.TaggedError<MessageDeliveryError>()(\n \"MessageDeliveryError\",\n {\n cause: Schema.optionalKey(FailureDiagnostic.Value),\n stack: Schema.optionalKey(Schema.String),\n reason: Schema.Literals([\n \"validation\",\n \"conflict\",\n \"capacity\",\n \"not-found\",\n \"storage\",\n \"corrupt\",\n ]),\n operation: Schema.String,\n },\n) {}\n\nexport class MessageDeliveryFailpointError extends Schema.TaggedError<MessageDeliveryFailpointError>()(\n \"MessageDeliveryFailpointError\",\n {\n point: Schema.String,\n },\n) {}\n\nexport type MessageDeliveryFailure = MessageDeliveryError | MessageDeliveryFailpointError;\n\nexport const MessageDeliveryFailpoint = Context.Reference<{\n readonly hit: (point: string) => Effect.Effect<void, MessageDeliveryFailpointError>;\n}>(\"@effect-agent/thread/MessageDeliveryFailpoint\", {\n defaultValue: () => ({ hit: () => Effect.void }),\n});\n\nconst fence = { expectedVersion: Positive, nowMillis: ScheduleInstant };\n\nexport const MessageDeliveryChange = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"Claim\"), ...fence }),\n Schema.Struct({ _tag: Schema.Literal(\"Accept\"), ...fence, receipt: Receipt }),\n Schema.Struct({ _tag: Schema.Literal(\"Process\"), ...fence, settlement: Settlement }),\n Schema.Struct({ _tag: Schema.Literal(\"ObservePending\"), ...fence }),\n Schema.Struct({\n _tag: Schema.Literal(\"Refuse\"),\n ...fence,\n code: BoundedName,\n diagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"Retry\"),\n ...fence,\n reason: ScheduleRetryReason,\n diagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"Park\"),\n ...fence,\n reason: ParkReason,\n diagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n }),\n Schema.Struct({ _tag: Schema.Literal(\"Recover\"), ...fence, deadlineAtMillis: ScheduleInstant }),\n /** Waiting for earlier admission never spends an automatic transport attempt. */\n Schema.Struct({ _tag: Schema.Literal(\"Defer\"), ...fence, untilMillis: ScheduleInstant }),\n]);\n\nexport type MessageDeliveryChange = typeof MessageDeliveryChange.Type;\n\n/** Select one native index per page; index filters cannot be combined. */\nexport const MessageDeliveryPageRequest = Schema.Struct({\n ownerThreadId: ThreadId,\n limit: Positive.check(Schema.isLessThanOrEqualTo(4096)),\n after: Schema.optionalKey(IdempotencyKey),\n /** Native pending index, including accepted, future-due and parked obligations. */\n pendingOnly: Schema.optionalKey(Schema.Boolean),\n /** First retained envelopes, including starts not admitted at the destination. */\n workerStarts: Schema.optionalKey(\n Schema.Struct({ delegationId: DelegationId, targetAgentId: AgentId }),\n ),\n /** Retained inputs not yet acknowledged by one destination worker. */\n pendingWorker: Schema.optionalKey(ThreadId),\n}).check(\n Schema.makeFilter(\n (request) =>\n Number(request.pendingOnly === true) +\n Number(request.workerStarts !== undefined) +\n Number(request.pendingWorker !== undefined) <=\n 1,\n ),\n);\n\nexport type MessageDeliveryPageRequest = typeof MessageDeliveryPageRequest.Type;\n\nexport const MessageDeliveryPage = Schema.Struct({\n items: Schema.Array(MessageDeliveryRecord),\n next: Schema.NullOr(IdempotencyKey),\n});\n\nexport type MessageDeliveryPage = typeof MessageDeliveryPage.Type;\n\n/**\n * Trusted host port, independent of either Thread's active Submission. List/get require an owner.\n * Inserts and changes are atomic; identical inserts return current state even after completion.\n * No automatic deletion: completed rows retain deduplication evidence and count toward retention.\n * `due`/`nextDeadline` are bounded host recovery seams, never model-facing management operations.\n */\nexport class MessageDeliveryStore extends Context.Service<\n MessageDeliveryStore,\n {\n readonly lifecyclePublications?: LifecyclePublicationStorage;\n readonly limits: MessageDeliveryStoreLimits;\n readonly maxStoredValueBytes: number;\n readonly insert: (\n record: MessageDeliveryRecord,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n readonly get: (\n key: MessageDeliveryKey,\n ) => Effect.Effect<MessageDeliveryRecord | null, MessageDeliveryError>;\n readonly list: (\n request: MessageDeliveryPageRequest,\n ) => Effect.Effect<MessageDeliveryPage, MessageDeliveryError>;\n readonly change: (\n key: MessageDeliveryKey,\n change: MessageDeliveryChange,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n readonly due: (\n nowMillis: number,\n limit: number,\n ownerThreadId?: ThreadId,\n ) => Effect.Effect<ReadonlyArray<MessageDeliveryKey>, MessageDeliveryError>;\n readonly nextDeadline: (\n ownerThreadId?: ThreadId,\n ) => Effect.Effect<number | null, MessageDeliveryError>;\n }\n>()(\"@effect-agent/thread/MessageDeliveryStore\") {}\n\n/**\n * Read current source-owned obligations without acquiring a runtime or scanning completed history.\n * A retained receipt is native accepted-admission evidence, not proof of destination materialization.\n * Shipped worker admission reserves the source input before returning that receipt. Policy can\n * therefore leave accepted worker discovery to canonical outstanding inputs; a no-receipt action\n * delivery remains uncertain, including when parked or due in the future.\n */\nexport const readPending = Effect.fn(\"MessageDelivery.readPending\")(function* (\n request: Pick<MessageDeliveryPageRequest, \"ownerThreadId\" | \"limit\">,\n) {\n const store = yield* MessageDeliveryStore;\n\n const input = yield* validateMessageDelivery(\n MessageDeliveryPageRequest,\n {\n ownerThreadId: request.ownerThreadId,\n limit: request.limit,\n pendingOnly: true,\n },\n \"read-pending\",\n );\n\n const page = yield* validateMessageDelivery(\n MessageDeliveryPage,\n yield* store.list(input),\n \"read-pending result\",\n );\n\n if (page.next !== null || page.items.length > input.limit)\n return yield* MessageDeliveryError.make({ reason: \"capacity\", operation: \"read-pending\" });\n const records = page.items;\n\n if (\n records.some(\n (record) =>\n record.key.ownerThreadId !== input.ownerThreadId || !messageDeliveryUsesCapacity(record),\n ) ||\n new Set(records.map((record) => record.key.messageId)).size !== records.length\n )\n return yield* MessageDeliveryError.make({\n reason: \"corrupt\",\n operation: \"read-pending result\",\n });\n\n return records;\n});\n\nexport const messageDeliveryKeyString = (key: MessageDeliveryKey): string =>\n JSON.stringify([key.ownerThreadId, key.messageId]);\n\nexport const messageDeliveryUsesCapacity = (record: MessageDeliveryRecord): boolean =>\n record.status !== \"processed\" && record.status !== \"refused\";\n\nexport const isWorkerUpdateDelivery = (record: MessageDeliveryRecord): boolean =>\n Schema.is(WorkerUpdate)(record.envelope.messageAdmission);\n\nexport const messageDeliveryCapacity = (limits: MessageDeliveryStoreLimits, update: boolean) => ({\n pending: update ? (limits.maxPendingUpdatesPerOwner ?? 32) : limits.maxPendingPerOwner,\n retained: update ? (limits.maxRetainedUpdatesPerOwner ?? 256) : limits.maxRetainedPerOwner,\n});\n\nexport const messageDeliveryDeadline = (record: MessageDeliveryRecord): number | null =>\n record.status === \"pending\" || record.status === \"accepted\"\n ? Math.min(record.deadlineAtMillis, record.leaseUntilMillis ?? record.retry.nextAttemptAtMillis)\n : null;\n\n/** Creation identity deliberately excludes operational counters and renewed recovery deadlines. */\nexport const sameMessageDeliveryIdentity = (\n left: MessageDeliveryRecord,\n right: MessageDeliveryRecord,\n): boolean =>\n messageDeliveryKeyString(left.key) === messageDeliveryKeyString(right.key) &&\n left.envelopeDigest === right.envelopeDigest &&\n left.predecessor === right.predecessor &&\n Schema.toEquivalence(PreparedInput)(left.envelope, right.envelope) &&\n Schema.toEquivalence(MessageDeliveryPolicy)(left.policy, right.policy) &&\n left.createdAtMillis === right.createdAtMillis &&\n left.initialDeadlineAtMillis === right.initialDeadlineAtMillis;\n\nconst error = (reason: MessageDeliveryError[\"reason\"], operation: string, cause?: unknown) =>\n MessageDeliveryError.make({ reason, operation, ...(cause === undefined ? {} : { cause }) });\n\nexport const validateMessageDelivery = <A, I>(\n schema: Schema.Codec<A, I>,\n value: unknown,\n operation: string,\n) =>\n Schema.decodeUnknownEffect(Schema.toType(schema))(value).pipe(\n Effect.mapError(() => error(\"validation\", operation)),\n );\n\nconst MessageDeliveryPreparation = Schema.Struct({\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n createdAtMillis: ScheduleInstant,\n deadlineAtMillis: ScheduleInstant,\n policy: MessageDeliveryPolicy,\n predecessor: Schema.optionalKey(IdempotencyKey),\n});\n\n/** Freeze and digest the complete admission envelope before publishing the obligation. */\nexport const prepareMessageDelivery = Effect.fn(\"MessageDelivery.prepare\")(function* (options: {\n readonly key: MessageDeliveryKey;\n readonly envelope: PreparedInput;\n readonly createdAtMillis: number;\n readonly deadlineAtMillis: number;\n readonly policy?: MessageDeliveryPolicy;\n readonly predecessor?: IdempotencyKey;\n}): Effect.fn.Return<MessageDeliveryRecord, MessageDeliveryError, Crypto.Crypto> {\n // JSON detaches every caller-owned value before Crypto can suspend preparation.\n const snapshot = yield* Schema.encodeEffect(Schema.fromJsonString(MessageDeliveryPreparation))({\n ...options,\n policy: options.policy ?? defaultMessageDeliveryPolicy,\n }).pipe(\n Effect.flatMap(Schema.decodeEffect(Schema.fromJsonString(MessageDeliveryPreparation))),\n Effect.mapError((cause) => error(\"validation\", \"prepare\", cause)),\n );\n\n const envelope = snapshot.envelope;\n\n const encoded = yield* Schema.encodeEffect(PreparedInput)(envelope).pipe(\n Effect.mapError((cause) => error(\"validation\", \"prepare\", cause)),\n );\n\n const inputDigest = yield* digestJson(encoded.input).pipe(\n Effect.mapError((cause) => error(\"storage\", \"digest\", cause)),\n );\n\n if (inputDigest !== envelope.inputDigest) return yield* error(\"corrupt\", \"input-digest\");\n\n const envelopeDigest = yield* digestJson(encoded).pipe(\n Effect.mapError((cause) => error(\"storage\", \"digest\", cause)),\n );\n\n return yield* validateMessageDelivery(\n MessageDeliveryRecord,\n {\n schemaVersion: 1,\n key: snapshot.key,\n envelope,\n envelopeDigest,\n ...(snapshot.predecessor === undefined ? {} : { predecessor: snapshot.predecessor }),\n createdAtMillis: snapshot.createdAtMillis,\n initialDeadlineAtMillis: snapshot.deadlineAtMillis,\n deadlineAtMillis: snapshot.deadlineAtMillis,\n policy: snapshot.policy,\n version: 1,\n status: \"pending\",\n receipt: null,\n settlement: null,\n refusal: null,\n parkReason: null,\n leaseUntilMillis: null,\n retry: {\n attempts: 0,\n generation: 0,\n automaticAttempts: 0,\n parked: false,\n nextAttemptAtMillis: snapshot.createdAtMillis,\n lastAttemptAtMillis: null,\n lastFailure: null,\n },\n },\n \"prepare\",\n );\n});\n\n/** Pure reducer used under the adapter's atomic compare-and-swap boundary. */\nexport const applyMessageDeliveryChange = (\n record: MessageDeliveryRecord,\n change: MessageDeliveryChange,\n): Result.Result<MessageDeliveryRecord, MessageDeliveryError> => {\n const conflict = () => Result.fail(error(\"conflict\", change._tag));\n\n if (record.version !== change.expectedVersion) return conflict();\n if (record.status === \"processed\" || record.status === \"refused\") return conflict();\n const now = change.nowMillis;\n\n const base = {\n ...record,\n version: record.version + 1,\n ...(\"diagnostic\" in change && change.diagnostic !== undefined\n ? { lastFailureDiagnostic: change.diagnostic }\n : {}),\n };\n\n const parked = (reason: typeof ParkReason.Type): MessageDeliveryRecord => ({\n ...base,\n status: \"parked\",\n parkReason: reason,\n leaseUntilMillis: null,\n retry: { ...record.retry, parked: true },\n });\n\n if (change._tag === \"Defer\") {\n if (\n record.status !== \"pending\" ||\n (record.leaseUntilMillis !== null && record.leaseUntilMillis > now)\n )\n return conflict();\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n if (change.untilMillis <= now) return conflict();\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n nextAttemptAtMillis: Math.min(change.untilMillis, record.deadlineAtMillis),\n },\n });\n }\n\n if (change._tag === \"Recover\") {\n if (record.status !== \"parked\" || change.deadlineAtMillis <= now) return conflict();\n\n return Result.succeed({\n ...base,\n deadlineAtMillis: change.deadlineAtMillis,\n status: record.receipt === null ? \"pending\" : \"accepted\",\n parkReason: null,\n retry: {\n ...record.retry,\n generation: record.retry.generation + 1,\n automaticAttempts: 0,\n parked: false,\n nextAttemptAtMillis: now,\n },\n });\n }\n if (record.status === \"parked\") return conflict();\n if (change._tag === \"Park\") return Result.succeed(parked(change.reason));\n if (change._tag === \"Claim\") {\n const due = messageDeliveryDeadline(record);\n\n if (due === null || due > now) return conflict();\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n if (record.retry.automaticAttempts >= record.policy.maxAutomaticAttempts)\n return Result.succeed(parked(\"exhausted\"));\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: Math.min(now + record.policy.attemptTimeoutMillis, record.deadlineAtMillis),\n retry: {\n ...record.retry,\n attempts: record.retry.attempts + 1,\n automaticAttempts: record.retry.automaticAttempts + 1,\n lastAttemptAtMillis: now,\n },\n });\n }\n if (record.leaseUntilMillis === null || now > record.leaseUntilMillis) return conflict();\n if (change._tag === \"Accept\") {\n if (record.status !== \"pending\") return conflict();\n if (change.receipt.threadId !== record.envelope.threadId)\n return Result.fail(error(\"corrupt\", \"receipt-identity\"));\n\n return Result.succeed({\n ...base,\n status: \"accepted\",\n receipt: change.receipt,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n automaticAttempts: 0,\n nextAttemptAtMillis: Math.min(\n now + record.policy.settlementPollMillis,\n record.deadlineAtMillis,\n ),\n lastFailure: null,\n },\n });\n }\n if (change._tag === \"Process\") {\n if (record.status !== \"accepted\") return conflict();\n if (\n change.settlement.submissionId !== record.receipt?.submissionId ||\n change.settlement.receiptId !== record.receipt.receiptId\n )\n return Result.fail(error(\"corrupt\", \"settlement-identity\"));\n\n return Result.succeed({\n ...base,\n status: \"processed\",\n settlement: change.settlement,\n leaseUntilMillis: null,\n });\n }\n if (change._tag === \"ObservePending\") {\n if (record.status !== \"accepted\") return conflict();\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n automaticAttempts: 0,\n lastFailure: null,\n nextAttemptAtMillis: Math.min(\n now + record.policy.settlementPollMillis,\n record.deadlineAtMillis,\n ),\n },\n });\n }\n if (change._tag === \"Refuse\") {\n if (record.status !== \"pending\") return conflict();\n\n return Result.succeed({\n ...base,\n status: \"refused\",\n refusal: change.code,\n leaseUntilMillis: null,\n });\n }\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n if (record.retry.automaticAttempts >= record.policy.maxAutomaticAttempts)\n return Result.succeed(parked(\"exhausted\"));\n\n const delay = Math.min(\n record.policy.retryBaseMillis * 2 ** Math.min(record.retry.automaticAttempts - 1, 52),\n record.policy.retryMaxMillis,\n );\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n nextAttemptAtMillis: Math.min(\n now + (record.status === \"accepted\" ? record.policy.settlementPollMillis : delay),\n record.deadlineAtMillis,\n ),\n lastFailure: change.reason,\n },\n });\n};\n\nexport const MessageDeliveryDriverLimits = Schema.Struct({\n batchSize: Positive.check(Schema.isLessThanOrEqualTo(100)),\n concurrency: Positive.check(Schema.isLessThanOrEqualTo(32)),\n});\n\nexport type MessageDeliveryDriverLimits = typeof MessageDeliveryDriverLimits.Type;\n\n/**\n * Finite, structured host pump. The host owns its Scope and wakes it from nextDeadline even\n * after source/receiver settlement. Failed or interrupted calls retain their expiring claim;\n * no ordinary tool is replayed here, only idempotent PreparedInput admission/status lookup.\n * Spans expose operation names; envelopes, principals, and message contents are never logged.\n */\nexport class MessageDeliveryDriver extends Context.Service<\n MessageDeliveryDriver,\n {\n readonly process: (\n key: MessageDeliveryKey,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n readonly runDue: (\n ownerThreadId?: ThreadId,\n ) => Effect.Effect<ReadonlyArray<MessageDeliveryRecord>, MessageDeliveryFailure>;\n readonly retry: (\n key: MessageDeliveryKey,\n expectedVersion: number,\n deadlineAtMillis: number,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n }\n>()(\"@effect-agent/thread/MessageDeliveryDriver\") {\n static layer(\n limits: MessageDeliveryDriverLimits = { batchSize: 100, concurrency: 4 },\n ): Layer.Layer<\n MessageDeliveryDriver,\n MessageDeliveryError,\n MessageDeliveryStore | PreparedInputAdmission | Crypto.Crypto\n > {\n return Layer.effect(\n MessageDeliveryDriver,\n Effect.gen(function* () {\n const config = yield* validateMessageDelivery(\n MessageDeliveryDriverLimits,\n limits,\n \"driver-limits\",\n );\n\n const store = yield* MessageDeliveryStore;\n const admission = yield* PreparedInputAdmission;\n const crypto = yield* Crypto.Crypto;\n const failpoint = yield* MessageDeliveryFailpoint;\n const semaphore = yield* Semaphore.make(config.concurrency);\n\n const process = Effect.fn(\"MessageDelivery.process\")((key: MessageDeliveryKey) =>\n semaphore\n .withPermit(\n Effect.gen(function* () {\n const current = yield* store.get(key);\n\n if (current === null) return yield* error(\"not-found\", \"process\");\n const nowMillis = yield* Clock.currentTimeMillis;\n const due = messageDeliveryDeadline(current);\n\n if (due === null || due > nowMillis) return current;\n\n if (current.status === \"pending\" && current.predecessor !== undefined) {\n const previous = yield* store.get({\n ownerThreadId: key.ownerThreadId,\n messageId: current.predecessor,\n });\n\n if (\n previous === null ||\n (previous.receipt === null && previous.status !== \"refused\")\n ) {\n return yield* store.change(key, {\n _tag: \"Defer\",\n expectedVersion: current.version,\n nowMillis,\n untilMillis: nowMillis + current.policy.settlementPollMillis,\n });\n }\n }\n\n const claimed = yield* store.change(key, {\n _tag: \"Claim\",\n expectedVersion: current.version,\n nowMillis,\n });\n\n if (claimed.status === \"parked\") return claimed;\n\n const envelope = yield* Schema.encodeEffect(PreparedInput)(claimed.envelope).pipe(\n Effect.mapError((cause) => error(\"corrupt\", \"envelope\", cause)),\n );\n\n const digest = yield* digestJson(envelope).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n Effect.mapError((cause) => error(\"storage\", \"digest\", cause)),\n );\n\n if (digest !== claimed.envelopeDigest)\n return yield* error(\"corrupt\", \"envelope-digest\");\n\n const timeout = Math.min(\n claimed.policy.attemptTimeoutMillis,\n (claimed.leaseUntilMillis ?? claimed.deadlineAtMillis) -\n (yield* Clock.currentTimeMillis),\n );\n\n // Digest computation cannot extend this claim's admission authority.\n if (timeout <= 0) return claimed;\n\n type WithoutFence<T> = T extends MessageDeliveryChange\n ? Omit<T, \"expectedVersion\" | \"nowMillis\">\n : never;\n\n const commit = (change: WithoutFence<MessageDeliveryChange>) =>\n Clock.currentTimeMillis.pipe(\n Effect.flatMap((time) =>\n store.change(key, {\n ...change,\n expectedVersion: claimed.version,\n nowMillis: time,\n }),\n ),\n );\n\n if (claimed.status === \"pending\") {\n const outcome = yield* admitPreparedInput(\n admission.submit(claimed.envelope),\n timeout,\n ).pipe(Effect.mapError((cause) => error(\"corrupt\", \"admission\", cause)));\n\n yield* failpoint.hit(\"message-delivery:admission:after\");\n if (outcome._tag === \"Receipt\")\n return yield* commit({ _tag: \"Accept\", receipt: outcome.receipt });\n if (outcome._tag === \"Refused\")\n return yield* commit({\n _tag: \"Refuse\",\n code: outcome.error.code,\n diagnostic: FailureDiagnostic.capture(outcome.error),\n });\n\n return yield* commit({\n _tag: \"Retry\",\n reason: outcome.reason,\n diagnostic: outcome.diagnostic,\n });\n }\n if (claimed.receipt === null) return yield* error(\"corrupt\", \"receipt\");\n if (admission.submissionStatus === undefined)\n return yield* commit({ _tag: \"Park\", reason: \"status-unavailable\" });\n\n const status = yield* admission.submissionStatus(claimed.receipt).pipe(\n Effect.timeout(timeout),\n Effect.map((status) => ({ _tag: \"Status\" as const, status })),\n Effect.catchTag(\"ScheduledInputRetryable\", (failure) =>\n Effect.succeed({\n _tag: \"Retry\" as const,\n reason: failure.reason,\n diagnostic: FailureDiagnostic.capture(failure),\n }),\n ),\n Effect.catchTag(\"ScheduledInputRefused\", (failure) =>\n Effect.succeed({\n _tag: \"Unavailable\" as const,\n diagnostic: FailureDiagnostic.capture(failure),\n }),\n ),\n Effect.catchTag(\"TimeoutError\", (failure) =>\n Effect.succeed({\n _tag: \"Retry\" as const,\n reason: \"timeout\" as const,\n diagnostic: FailureDiagnostic.capture(failure),\n }),\n ),\n Effect.catchTag(\"ScheduleStorageError\", (failure) =>\n failure.reason === \"unavailable\"\n ? Effect.succeed({\n _tag: \"Retry\" as const,\n reason: \"storage\" as const,\n diagnostic: FailureDiagnostic.capture(failure),\n })\n : Effect.fail(error(\"corrupt\", \"status\", failure)),\n ),\n );\n\n if (status._tag === \"Unavailable\")\n return yield* commit({\n _tag: \"Park\",\n reason: \"status-unavailable\",\n diagnostic: status.diagnostic,\n });\n if (status._tag === \"Status\" && status.status._tag === \"settled\")\n return yield* commit({ _tag: \"Process\", settlement: status.status.settlement });\n if (status._tag === \"Status\") return yield* commit({ _tag: \"ObservePending\" });\n\n return yield* commit({\n _tag: \"Retry\",\n reason: status.reason,\n diagnostic: status.diagnostic,\n });\n }),\n )\n .pipe(\n Effect.catchTag(\"MessageDeliveryError\", (failure) =>\n failure.reason === \"conflict\"\n ? store.get(key).pipe(\n Effect.filterOrFail(\n (record) => record !== null,\n () => failure,\n ),\n )\n : Effect.fail(failure),\n ),\n ),\n );\n\n return MessageDeliveryDriver.of({\n process,\n runDue: Effect.fn(\"MessageDelivery.runDue\")(function* (ownerThreadId) {\n const keys = yield* store.due(\n yield* Clock.currentTimeMillis,\n config.batchSize,\n ownerThreadId,\n );\n\n return yield* Effect.forEach(keys, process, { concurrency: config.concurrency });\n }),\n retry: Effect.fn(\"MessageDelivery.retry\")(\n function* (key, expectedVersion, deadlineAtMillis) {\n return yield* store.change(key, {\n _tag: \"Recover\",\n expectedVersion,\n deadlineAtMillis,\n nowMillis: yield* Clock.currentTimeMillis,\n });\n },\n ),\n });\n }),\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MessageDelivery.mjs","names":["FailureDiagnostic.Diagnostic","FailureDiagnostic.Value","FailureDiagnostic.capture"],"sources":["../../src/durable/MessageDelivery.ts"],"sourcesContent":["import { Clock, Context, Crypto, Effect, Layer, Result, Schema, Semaphore } from \"effect\";\n\nimport * as FailureDiagnostic from \"../core/FailureDiagnostic.ts\";\nimport { AgentId, DelegationId, ThreadId } from \"../core/Identifiers.ts\";\nimport { Receipt } from \"../core/Receipt.ts\";\nimport { WorkerUpdate } from \"../core/Worker.ts\";\nimport { digestJson } from \"./Digest.ts\";\nimport type { LifecyclePublicationStorage } from \"./LifecyclePublication.ts\";\nimport { admitPreparedInput, PreparedInputAdmission } from \"./PreparedInputAdmission.ts\";\nimport { Digest } from \"./Records.ts\";\nimport { ScheduleInstant, ScheduleRetry, ScheduleRetryReason } from \"./Schedule.ts\";\nimport { IdempotencyKey, Settlement } from \"./SubmissionLedger.ts\";\nimport { PreparedInput } from \"./Subscription.ts\";\n\nconst Positive = Schema.Int.check(Schema.isGreaterThan(0));\nconst BoundedName = Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256));\nconst receiptsEqual = Schema.toEquivalence(Receipt);\nconst settlementsEqual = Schema.toEquivalence(Settlement);\n\n/** An owner is always a source Thread. Destination admission has its own frozen key. */\nexport const MessageDeliveryKey = Schema.Struct({\n ownerThreadId: ThreadId,\n messageId: IdempotencyKey,\n});\n\nexport type MessageDeliveryKey = typeof MessageDeliveryKey.Type;\n\nexport const MessageDeliveryPolicy = Schema.Struct({\n maxAutomaticAttempts: Positive.check(Schema.isLessThanOrEqualTo(100)),\n attemptTimeoutMillis: Positive.check(Schema.isLessThanOrEqualTo(300_000)),\n retryBaseMillis: Positive,\n retryMaxMillis: Positive,\n settlementPollMillis: Positive,\n}).check(Schema.makeFilter((value) => value.retryBaseMillis <= value.retryMaxMillis));\n\nexport type MessageDeliveryPolicy = typeof MessageDeliveryPolicy.Type;\n\nexport const defaultMessageDeliveryPolicy: MessageDeliveryPolicy = {\n maxAutomaticAttempts: 8,\n attemptTimeoutMillis: 30_000,\n retryBaseMillis: 1_000,\n retryMaxMillis: 60_000,\n settlementPollMillis: 5_000,\n};\n\nexport const MessageDeliveryStoreLimits = Schema.Struct({\n maxPendingPerOwner: Positive,\n maxRetainedPerOwner: Positive,\n maxEnvelopeBytes: Positive,\n /** Separate update capacity preserves the full ordinary allowance for terminal reports. */\n maxPendingUpdatesPerOwner: Schema.optionalKey(Positive),\n maxRetainedUpdatesPerOwner: Schema.optionalKey(Positive),\n}).check(\n Schema.makeFilter(\n (value) =>\n value.maxPendingPerOwner <= value.maxRetainedPerOwner &&\n (value.maxPendingUpdatesPerOwner ?? 32) <= (value.maxRetainedUpdatesPerOwner ?? 256),\n ),\n);\n\nexport type MessageDeliveryStoreLimits = typeof MessageDeliveryStoreLimits.Type;\n\nexport const defaultMessageDeliveryStoreLimits: MessageDeliveryStoreLimits = {\n maxPendingPerOwner: 100,\n maxRetainedPerOwner: 1_000,\n maxEnvelopeBytes: 262_144,\n maxPendingUpdatesPerOwner: 32,\n maxRetainedUpdatesPerOwner: 256,\n};\n\nconst ParkReason = Schema.Literals([\n \"exhausted\",\n \"deadline\",\n \"status-unavailable\",\n \"awaiting-settlement\",\n]);\n\nexport const MessageDeliveryRecord = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n envelopeDigest: Digest,\n /** Same-owner predecessor whose admission must be known before this message is submitted. */\n predecessor: Schema.optionalKey(IdempotencyKey),\n createdAtMillis: ScheduleInstant,\n /** Immutable creation identity; explicit recovery only renews deadlineAtMillis. */\n initialDeadlineAtMillis: ScheduleInstant,\n deadlineAtMillis: ScheduleInstant,\n policy: MessageDeliveryPolicy,\n version: Positive,\n status: Schema.Literals([\"pending\", \"accepted\", \"processed\", \"refused\", \"parked\"]),\n receipt: Schema.NullOr(Receipt),\n settlement: Schema.NullOr(Settlement),\n refusal: Schema.NullOr(BoundedName),\n parkReason: Schema.NullOr(ParkReason),\n leaseUntilMillis: Schema.NullOr(ScheduleInstant),\n retry: ScheduleRetry,\n /** Last failed admission/status check, retained across retries and successful recovery. */\n lastFailureDiagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n}).check(\n Schema.makeFilter(\n (record) =>\n record.deadlineAtMillis > record.createdAtMillis &&\n record.initialDeadlineAtMillis > record.createdAtMillis &&\n record.predecessor !== record.key.messageId &&\n (record.status === \"processed\") === (record.settlement !== null) &&\n (record.status === \"refused\") === (record.refusal !== null) &&\n (record.status === \"parked\") === (record.parkReason !== null) &&\n (record.status === \"parked\") === record.retry.parked &&\n (record.status === \"accepted\" || record.status === \"processed\"\n ? record.receipt !== null\n : true) &&\n (record.status === \"pending\" || record.status === \"refused\"\n ? record.receipt === null\n : true) &&\n (record.receipt === null || record.receipt.threadId === record.envelope.threadId) &&\n (record.settlement === null ||\n (record.settlement.receiptId === record.receipt?.receiptId &&\n record.settlement.submissionId === record.receipt.submissionId)) &&\n (record.status === \"processed\" || record.status === \"refused\" || record.status === \"parked\"\n ? record.leaseUntilMillis === null\n : true),\n ),\n);\n\nexport type MessageDeliveryRecord = typeof MessageDeliveryRecord.Type;\n\nexport class MessageDeliveryError extends Schema.TaggedError<MessageDeliveryError>()(\n \"MessageDeliveryError\",\n {\n cause: Schema.optionalKey(FailureDiagnostic.Value),\n stack: Schema.optionalKey(Schema.String),\n reason: Schema.Literals([\n \"validation\",\n \"conflict\",\n \"capacity\",\n \"not-found\",\n \"storage\",\n \"corrupt\",\n ]),\n operation: Schema.String,\n },\n) {}\n\nexport class MessageDeliveryFailpointError extends Schema.TaggedError<MessageDeliveryFailpointError>()(\n \"MessageDeliveryFailpointError\",\n {\n point: Schema.String,\n },\n) {}\n\nexport type MessageDeliveryFailure = MessageDeliveryError | MessageDeliveryFailpointError;\n\nexport const MessageDeliveryFailpoint = Context.Reference<{\n readonly hit: (point: string) => Effect.Effect<void, MessageDeliveryFailpointError>;\n}>(\"@effect-agent/thread/MessageDeliveryFailpoint\", {\n defaultValue: () => ({ hit: () => Effect.void }),\n});\n\nconst fence = { expectedVersion: Positive, nowMillis: ScheduleInstant };\n\n/** Terminal destination evidence, independent of an expiring source transport claim. */\nexport const MessageDeliveryCompletion = Schema.Struct({\n receipt: Receipt,\n settlement: Settlement,\n admissionKey: IdempotencyKey,\n inputDigest: Digest,\n});\n\nexport const MessageDeliveryChange = Schema.Union([\n Schema.Struct({\n _tag: Schema.Literal(\"Complete\"),\n nowMillis: ScheduleInstant,\n ...MessageDeliveryCompletion.fields,\n }),\n Schema.Struct({ _tag: Schema.Literal(\"Claim\"), ...fence }),\n Schema.Struct({ _tag: Schema.Literal(\"Accept\"), ...fence, receipt: Receipt }),\n Schema.Struct({ _tag: Schema.Literal(\"Process\"), ...fence, settlement: Settlement }),\n Schema.Struct({ _tag: Schema.Literal(\"ObservePending\"), ...fence }),\n Schema.Struct({\n _tag: Schema.Literal(\"Refuse\"),\n ...fence,\n code: BoundedName,\n diagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"Retry\"),\n ...fence,\n reason: ScheduleRetryReason,\n diagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"Park\"),\n ...fence,\n reason: ParkReason,\n diagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n }),\n Schema.Struct({ _tag: Schema.Literal(\"Recover\"), ...fence, deadlineAtMillis: ScheduleInstant }),\n /** Waiting for earlier admission never spends an automatic transport attempt. */\n Schema.Struct({ _tag: Schema.Literal(\"Defer\"), ...fence, untilMillis: ScheduleInstant }),\n]);\n\nexport type MessageDeliveryChange = typeof MessageDeliveryChange.Type;\n\n/** Select one native index per page; index filters cannot be combined. */\nexport const MessageDeliveryPageRequest = Schema.Struct({\n ownerThreadId: ThreadId,\n limit: Positive.check(Schema.isLessThanOrEqualTo(4096)),\n after: Schema.optionalKey(IdempotencyKey),\n /** Native pending index, including accepted, future-due and parked obligations. */\n pendingOnly: Schema.optionalKey(Schema.Boolean),\n /** First retained envelopes, including starts not admitted at the destination. */\n workerStarts: Schema.optionalKey(\n Schema.Struct({ delegationId: DelegationId, targetAgentId: AgentId }),\n ),\n /** Retained inputs not yet acknowledged by one destination worker. */\n pendingWorker: Schema.optionalKey(ThreadId),\n}).check(\n Schema.makeFilter(\n (request) =>\n Number(request.pendingOnly === true) +\n Number(request.workerStarts !== undefined) +\n Number(request.pendingWorker !== undefined) <=\n 1,\n ),\n);\n\nexport type MessageDeliveryPageRequest = typeof MessageDeliveryPageRequest.Type;\n\nexport const MessageDeliveryPage = Schema.Struct({\n items: Schema.Array(MessageDeliveryRecord),\n next: Schema.NullOr(IdempotencyKey),\n});\n\nexport type MessageDeliveryPage = typeof MessageDeliveryPage.Type;\n\n/**\n * Trusted host port, independent of either Thread's active Submission. List/get require an owner.\n * Inserts and changes are atomic; identical inserts return current state even after completion.\n * No automatic deletion: completed rows retain deduplication evidence and count toward retention.\n * `due`/`nextDeadline` are bounded host recovery seams, never model-facing management operations.\n */\nexport class MessageDeliveryStore extends Context.Service<\n MessageDeliveryStore,\n {\n readonly lifecyclePublications?: LifecyclePublicationStorage;\n readonly limits: MessageDeliveryStoreLimits;\n readonly maxStoredValueBytes: number;\n readonly insert: (\n record: MessageDeliveryRecord,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n readonly get: (\n key: MessageDeliveryKey,\n ) => Effect.Effect<MessageDeliveryRecord | null, MessageDeliveryError>;\n readonly list: (\n request: MessageDeliveryPageRequest,\n ) => Effect.Effect<MessageDeliveryPage, MessageDeliveryError>;\n readonly change: (\n key: MessageDeliveryKey,\n change: MessageDeliveryChange,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n readonly due: (\n nowMillis: number,\n limit: number,\n ownerThreadId?: ThreadId,\n ) => Effect.Effect<ReadonlyArray<MessageDeliveryKey>, MessageDeliveryError>;\n readonly nextDeadline: (\n ownerThreadId?: ThreadId,\n ) => Effect.Effect<number | null, MessageDeliveryError>;\n }\n>()(\"@effect-agent/thread/MessageDeliveryStore\") {}\n\n/**\n * Read current source-owned obligations without acquiring a runtime or scanning completed history.\n * A retained receipt is native accepted-admission evidence, not proof of destination materialization.\n * Shipped worker admission reserves the source input before returning that receipt. Policy can\n * therefore leave accepted worker discovery to canonical outstanding inputs; a no-receipt action\n * delivery remains uncertain, including when parked or due in the future.\n */\nexport const readPending = Effect.fn(\"MessageDelivery.readPending\")(function* (\n request: Pick<MessageDeliveryPageRequest, \"ownerThreadId\" | \"limit\">,\n) {\n const store = yield* MessageDeliveryStore;\n\n const input = yield* validateMessageDelivery(\n MessageDeliveryPageRequest,\n {\n ownerThreadId: request.ownerThreadId,\n limit: request.limit,\n pendingOnly: true,\n },\n \"read-pending\",\n );\n\n const page = yield* validateMessageDelivery(\n MessageDeliveryPage,\n yield* store.list(input),\n \"read-pending result\",\n );\n\n if (page.next !== null || page.items.length > input.limit)\n return yield* MessageDeliveryError.make({ reason: \"capacity\", operation: \"read-pending\" });\n const records = page.items;\n\n if (\n records.some(\n (record) =>\n record.key.ownerThreadId !== input.ownerThreadId || !messageDeliveryUsesCapacity(record),\n ) ||\n new Set(records.map((record) => record.key.messageId)).size !== records.length\n )\n return yield* MessageDeliveryError.make({\n reason: \"corrupt\",\n operation: \"read-pending result\",\n });\n\n return records;\n});\n\nexport const messageDeliveryKeyString = (key: MessageDeliveryKey): string =>\n JSON.stringify([key.ownerThreadId, key.messageId]);\n\nexport const messageDeliveryUsesCapacity = (record: MessageDeliveryRecord): boolean =>\n record.status !== \"processed\" && record.status !== \"refused\";\n\nexport const isWorkerUpdateDelivery = (record: MessageDeliveryRecord): boolean =>\n Schema.is(WorkerUpdate)(record.envelope.messageAdmission);\n\nexport const messageDeliveryCapacity = (limits: MessageDeliveryStoreLimits, update: boolean) => ({\n pending: update ? (limits.maxPendingUpdatesPerOwner ?? 32) : limits.maxPendingPerOwner,\n retained: update ? (limits.maxRetainedUpdatesPerOwner ?? 256) : limits.maxRetainedPerOwner,\n});\n\nexport const messageDeliveryDeadline = (record: MessageDeliveryRecord): number | null =>\n record.status === \"pending\" || record.status === \"accepted\"\n ? Math.min(record.deadlineAtMillis, record.leaseUntilMillis ?? record.retry.nextAttemptAtMillis)\n : null;\n\n/** Creation identity deliberately excludes operational counters and renewed recovery deadlines. */\nexport const sameMessageDeliveryIdentity = (\n left: MessageDeliveryRecord,\n right: MessageDeliveryRecord,\n): boolean =>\n messageDeliveryKeyString(left.key) === messageDeliveryKeyString(right.key) &&\n left.envelopeDigest === right.envelopeDigest &&\n left.predecessor === right.predecessor &&\n Schema.toEquivalence(PreparedInput)(left.envelope, right.envelope) &&\n Schema.toEquivalence(MessageDeliveryPolicy)(left.policy, right.policy) &&\n left.createdAtMillis === right.createdAtMillis &&\n left.initialDeadlineAtMillis === right.initialDeadlineAtMillis;\n\nconst error = (reason: MessageDeliveryError[\"reason\"], operation: string, cause?: unknown) =>\n MessageDeliveryError.make({ reason, operation, ...(cause === undefined ? {} : { cause }) });\n\nexport const validateMessageDelivery = <A, I>(\n schema: Schema.Codec<A, I>,\n value: unknown,\n operation: string,\n) =>\n Schema.decodeUnknownEffect(Schema.toType(schema))(value).pipe(\n Effect.mapError(() => error(\"validation\", operation)),\n );\n\nconst MessageDeliveryPreparation = Schema.Struct({\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n createdAtMillis: ScheduleInstant,\n deadlineAtMillis: ScheduleInstant,\n policy: MessageDeliveryPolicy,\n predecessor: Schema.optionalKey(IdempotencyKey),\n});\n\n/** Freeze and digest the complete admission envelope before publishing the obligation. */\nexport const prepareMessageDelivery = Effect.fn(\"MessageDelivery.prepare\")(function* (options: {\n readonly key: MessageDeliveryKey;\n readonly envelope: PreparedInput;\n readonly createdAtMillis: number;\n readonly deadlineAtMillis: number;\n readonly policy?: MessageDeliveryPolicy;\n readonly predecessor?: IdempotencyKey;\n}): Effect.fn.Return<MessageDeliveryRecord, MessageDeliveryError, Crypto.Crypto> {\n // JSON detaches every caller-owned value before Crypto can suspend preparation.\n const snapshot = yield* Schema.encodeEffect(Schema.fromJsonString(MessageDeliveryPreparation))({\n ...options,\n policy: options.policy ?? defaultMessageDeliveryPolicy,\n }).pipe(\n Effect.flatMap(Schema.decodeEffect(Schema.fromJsonString(MessageDeliveryPreparation))),\n Effect.mapError((cause) => error(\"validation\", \"prepare\", cause)),\n );\n\n const envelope = snapshot.envelope;\n\n const encoded = yield* Schema.encodeEffect(PreparedInput)(envelope).pipe(\n Effect.mapError((cause) => error(\"validation\", \"prepare\", cause)),\n );\n\n const inputDigest = yield* digestJson(encoded.input).pipe(\n Effect.mapError((cause) => error(\"storage\", \"digest\", cause)),\n );\n\n if (inputDigest !== envelope.inputDigest) return yield* error(\"corrupt\", \"input-digest\");\n\n const envelopeDigest = yield* digestJson(encoded).pipe(\n Effect.mapError((cause) => error(\"storage\", \"digest\", cause)),\n );\n\n return yield* validateMessageDelivery(\n MessageDeliveryRecord,\n {\n schemaVersion: 1,\n key: snapshot.key,\n envelope,\n envelopeDigest,\n ...(snapshot.predecessor === undefined ? {} : { predecessor: snapshot.predecessor }),\n createdAtMillis: snapshot.createdAtMillis,\n initialDeadlineAtMillis: snapshot.deadlineAtMillis,\n deadlineAtMillis: snapshot.deadlineAtMillis,\n policy: snapshot.policy,\n version: 1,\n status: \"pending\",\n receipt: null,\n settlement: null,\n refusal: null,\n parkReason: null,\n leaseUntilMillis: null,\n retry: {\n attempts: 0,\n generation: 0,\n automaticAttempts: 0,\n parked: false,\n nextAttemptAtMillis: snapshot.createdAtMillis,\n lastAttemptAtMillis: null,\n lastFailure: null,\n },\n },\n \"prepare\",\n );\n});\n\n/** Pure reducer used under the adapter's atomic compare-and-swap boundary. */\nexport const applyMessageDeliveryChange = (\n record: MessageDeliveryRecord,\n change: MessageDeliveryChange,\n): Result.Result<MessageDeliveryRecord, MessageDeliveryError> => {\n const conflict = () => Result.fail(error(\"conflict\", change._tag));\n\n if (change._tag === \"Complete\") {\n if (\n change.admissionKey !== record.envelope.admissionKey ||\n change.inputDigest !== record.envelope.inputDigest ||\n change.receipt.threadId !== record.envelope.threadId ||\n change.settlement.submissionId !== change.receipt.submissionId ||\n change.settlement.receiptId !== change.receipt.receiptId ||\n (record.receipt !== null && !receiptsEqual(record.receipt, change.receipt))\n )\n return Result.fail(error(\"corrupt\", \"completion-identity\"));\n if (record.status === \"refused\") return conflict();\n if (record.status === \"processed\")\n return record.settlement !== null && settlementsEqual(record.settlement, change.settlement)\n ? Result.succeed(record)\n : Result.fail(error(\"corrupt\", \"completion-identity\"));\n\n return Result.succeed({\n ...record,\n version: record.version + 1,\n status: \"processed\",\n receipt: change.receipt,\n settlement: change.settlement,\n leaseUntilMillis: null,\n parkReason: null,\n retry: { ...record.retry, parked: false },\n });\n }\n\n if (record.version !== change.expectedVersion) return conflict();\n if (record.status === \"processed\" || record.status === \"refused\") return conflict();\n const now = change.nowMillis;\n\n const base = {\n ...record,\n version: record.version + 1,\n ...(\"diagnostic\" in change && change.diagnostic !== undefined\n ? { lastFailureDiagnostic: change.diagnostic }\n : {}),\n };\n\n const parked = (reason: typeof ParkReason.Type): MessageDeliveryRecord => ({\n ...base,\n status: \"parked\",\n parkReason: reason,\n leaseUntilMillis: null,\n retry: { ...record.retry, parked: true },\n });\n\n if (change._tag === \"Defer\") {\n if (\n record.status !== \"pending\" ||\n (record.leaseUntilMillis !== null && record.leaseUntilMillis > now)\n )\n return conflict();\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n if (change.untilMillis <= now) return conflict();\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n nextAttemptAtMillis: Math.min(change.untilMillis, record.deadlineAtMillis),\n },\n });\n }\n\n if (change._tag === \"Recover\") {\n if (record.status !== \"parked\" || change.deadlineAtMillis <= now) return conflict();\n\n return Result.succeed({\n ...base,\n deadlineAtMillis: change.deadlineAtMillis,\n status: record.receipt === null ? \"pending\" : \"accepted\",\n parkReason: null,\n retry: {\n ...record.retry,\n generation: record.retry.generation + 1,\n automaticAttempts: 0,\n parked: false,\n nextAttemptAtMillis: now,\n },\n });\n }\n if (record.status === \"parked\") return conflict();\n if (change._tag === \"Park\") return Result.succeed(parked(change.reason));\n if (change._tag === \"Claim\") {\n const due = messageDeliveryDeadline(record);\n\n if (due === null || due > now) return conflict();\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n if (record.retry.automaticAttempts >= record.policy.maxAutomaticAttempts)\n return Result.succeed(parked(\"exhausted\"));\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: Math.min(now + record.policy.attemptTimeoutMillis, record.deadlineAtMillis),\n retry: {\n ...record.retry,\n attempts: record.retry.attempts + 1,\n automaticAttempts: record.retry.automaticAttempts + 1,\n lastAttemptAtMillis: now,\n },\n });\n }\n if (record.leaseUntilMillis === null || now > record.leaseUntilMillis) return conflict();\n if (change._tag === \"Accept\") {\n if (record.status !== \"pending\") return conflict();\n if (change.receipt.threadId !== record.envelope.threadId)\n return Result.fail(error(\"corrupt\", \"receipt-identity\"));\n\n return Result.succeed({\n ...base,\n status: \"accepted\",\n receipt: change.receipt,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n automaticAttempts: 0,\n nextAttemptAtMillis: Math.min(\n now + record.policy.settlementPollMillis,\n record.deadlineAtMillis,\n ),\n lastFailure: null,\n },\n });\n }\n if (change._tag === \"Process\") {\n if (record.status !== \"accepted\") return conflict();\n if (\n change.settlement.submissionId !== record.receipt?.submissionId ||\n change.settlement.receiptId !== record.receipt.receiptId\n )\n return Result.fail(error(\"corrupt\", \"settlement-identity\"));\n\n return Result.succeed({\n ...base,\n status: \"processed\",\n settlement: change.settlement,\n leaseUntilMillis: null,\n });\n }\n if (change._tag === \"ObservePending\") {\n if (record.status !== \"accepted\") return conflict();\n\n return Result.succeed(parked(\"awaiting-settlement\"));\n }\n if (change._tag === \"Refuse\") {\n if (record.status !== \"pending\") return conflict();\n\n return Result.succeed({\n ...base,\n status: \"refused\",\n refusal: change.code,\n leaseUntilMillis: null,\n });\n }\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n if (record.retry.automaticAttempts >= record.policy.maxAutomaticAttempts)\n return Result.succeed(parked(\"exhausted\"));\n\n const delay = Math.min(\n record.policy.retryBaseMillis * 2 ** Math.min(record.retry.automaticAttempts - 1, 52),\n record.policy.retryMaxMillis,\n );\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n nextAttemptAtMillis: Math.min(\n now + (record.status === \"accepted\" ? record.policy.settlementPollMillis : delay),\n record.deadlineAtMillis,\n ),\n lastFailure: change.reason,\n },\n });\n};\n\nexport const MessageDeliveryDriverLimits = Schema.Struct({\n batchSize: Positive.check(Schema.isLessThanOrEqualTo(100)),\n concurrency: Positive.check(Schema.isLessThanOrEqualTo(32)),\n});\n\nexport type MessageDeliveryDriverLimits = typeof MessageDeliveryDriverLimits.Type;\n\n/**\n * Finite, structured host pump. The host owns its Scope and wakes it from nextDeadline even\n * after source/receiver settlement. Failed or interrupted calls retain their expiring claim;\n * no ordinary tool is replayed here, only idempotent PreparedInput admission/status lookup.\n * Spans expose operation names; envelopes, principals, and message contents are never logged.\n */\nexport class MessageDeliveryDriver extends Context.Service<\n MessageDeliveryDriver,\n {\n readonly process: (\n key: MessageDeliveryKey,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n readonly runDue: (\n ownerThreadId?: ThreadId,\n ) => Effect.Effect<ReadonlyArray<MessageDeliveryRecord>, MessageDeliveryFailure>;\n readonly retry: (\n key: MessageDeliveryKey,\n expectedVersion: number,\n deadlineAtMillis: number,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n }\n>()(\"@effect-agent/thread/MessageDeliveryDriver\") {\n static layer(\n limits: MessageDeliveryDriverLimits = { batchSize: 100, concurrency: 4 },\n ): Layer.Layer<\n MessageDeliveryDriver,\n MessageDeliveryError,\n MessageDeliveryStore | PreparedInputAdmission | Crypto.Crypto\n > {\n return Layer.effect(\n MessageDeliveryDriver,\n Effect.gen(function* () {\n const config = yield* validateMessageDelivery(\n MessageDeliveryDriverLimits,\n limits,\n \"driver-limits\",\n );\n\n const store = yield* MessageDeliveryStore;\n const admission = yield* PreparedInputAdmission;\n const crypto = yield* Crypto.Crypto;\n const failpoint = yield* MessageDeliveryFailpoint;\n const semaphore = yield* Semaphore.make(config.concurrency);\n\n const process = Effect.fn(\"MessageDelivery.process\")((key: MessageDeliveryKey) =>\n semaphore\n .withPermit(\n Effect.gen(function* () {\n const current = yield* store.get(key);\n\n if (current === null) return yield* error(\"not-found\", \"process\");\n const nowMillis = yield* Clock.currentTimeMillis;\n const due = messageDeliveryDeadline(current);\n\n if (due === null || due > nowMillis) return current;\n\n if (current.status === \"pending\" && current.predecessor !== undefined) {\n const previous = yield* store.get({\n ownerThreadId: key.ownerThreadId,\n messageId: current.predecessor,\n });\n\n if (\n previous === null ||\n (previous.receipt === null && previous.status !== \"refused\")\n ) {\n return yield* store.change(key, {\n _tag: \"Defer\",\n expectedVersion: current.version,\n nowMillis,\n untilMillis: nowMillis + current.policy.settlementPollMillis,\n });\n }\n }\n\n const claimed = yield* store.change(key, {\n _tag: \"Claim\",\n expectedVersion: current.version,\n nowMillis,\n });\n\n if (claimed.status === \"parked\") return claimed;\n\n const envelope = yield* Schema.encodeEffect(PreparedInput)(claimed.envelope).pipe(\n Effect.mapError((cause) => error(\"corrupt\", \"envelope\", cause)),\n );\n\n const digest = yield* digestJson(envelope).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n Effect.mapError((cause) => error(\"storage\", \"digest\", cause)),\n );\n\n if (digest !== claimed.envelopeDigest)\n return yield* error(\"corrupt\", \"envelope-digest\");\n\n const timeout = Math.min(\n claimed.policy.attemptTimeoutMillis,\n (claimed.leaseUntilMillis ?? claimed.deadlineAtMillis) -\n (yield* Clock.currentTimeMillis),\n );\n\n // Digest computation cannot extend this claim's admission authority.\n if (timeout <= 0) return claimed;\n\n type WithoutFence<T> =\n T extends Exclude<MessageDeliveryChange, { _tag: \"Complete\" }>\n ? Omit<T, \"expectedVersion\" | \"nowMillis\">\n : never;\n\n const commit = (change: WithoutFence<MessageDeliveryChange>) =>\n Clock.currentTimeMillis.pipe(\n Effect.flatMap((time) =>\n store.change(key, {\n ...change,\n expectedVersion: claimed.version,\n nowMillis: time,\n }),\n ),\n );\n\n if (claimed.status === \"pending\") {\n const outcome = yield* admitPreparedInput(\n admission.submit(claimed.envelope),\n timeout,\n ).pipe(Effect.mapError((cause) => error(\"corrupt\", \"admission\", cause)));\n\n yield* failpoint.hit(\"message-delivery:admission:after\");\n if (outcome._tag === \"Receipt\") {\n const accepted = yield* commit({ _tag: \"Accept\", receipt: outcome.receipt });\n\n return yield* store.change(key, {\n _tag: \"Park\",\n reason: \"awaiting-settlement\",\n expectedVersion: accepted.version,\n nowMillis: yield* Clock.currentTimeMillis,\n });\n }\n if (outcome._tag === \"Refused\")\n return yield* commit({\n _tag: \"Refuse\",\n code: outcome.error.code,\n diagnostic: FailureDiagnostic.capture(outcome.error),\n });\n\n return yield* commit({\n _tag: \"Retry\",\n reason: outcome.reason,\n diagnostic: outcome.diagnostic,\n });\n }\n if (claimed.receipt === null) return yield* error(\"corrupt\", \"receipt\");\n if (admission.submissionStatus === undefined)\n return yield* commit({ _tag: \"Park\", reason: \"status-unavailable\" });\n\n const status = yield* admission.submissionStatus(claimed.receipt).pipe(\n Effect.timeout(timeout),\n Effect.map((status) => ({ _tag: \"Status\" as const, status })),\n Effect.catchTag(\"ScheduledInputRetryable\", (failure) =>\n Effect.succeed({\n _tag: \"Retry\" as const,\n reason: failure.reason,\n diagnostic: FailureDiagnostic.capture(failure),\n }),\n ),\n Effect.catchTag(\"ScheduledInputRefused\", (failure) =>\n Effect.succeed({\n _tag: \"Unavailable\" as const,\n diagnostic: FailureDiagnostic.capture(failure),\n }),\n ),\n Effect.catchTag(\"TimeoutError\", (failure) =>\n Effect.succeed({\n _tag: \"Retry\" as const,\n reason: \"timeout\" as const,\n diagnostic: FailureDiagnostic.capture(failure),\n }),\n ),\n Effect.catchTag(\"ScheduleStorageError\", (failure) =>\n failure.reason === \"unavailable\"\n ? Effect.succeed({\n _tag: \"Retry\" as const,\n reason: \"storage\" as const,\n diagnostic: FailureDiagnostic.capture(failure),\n })\n : Effect.fail(error(\"corrupt\", \"status\", failure)),\n ),\n );\n\n if (status._tag === \"Unavailable\")\n return yield* commit({\n _tag: \"Park\",\n reason: \"status-unavailable\",\n diagnostic: status.diagnostic,\n });\n if (status._tag === \"Status\" && status.status._tag === \"settled\")\n return yield* commit({ _tag: \"Process\", settlement: status.status.settlement });\n if (status._tag === \"Status\") return yield* commit({ _tag: \"ObservePending\" });\n\n return yield* commit({\n _tag: \"Retry\",\n reason: status.reason,\n diagnostic: status.diagnostic,\n });\n }),\n )\n .pipe(\n Effect.catchTag(\"MessageDeliveryError\", (failure) =>\n failure.reason === \"conflict\"\n ? store.get(key).pipe(\n Effect.filterOrFail(\n (record) => record !== null,\n () => failure,\n ),\n )\n : Effect.fail(failure),\n ),\n ),\n );\n\n return MessageDeliveryDriver.of({\n process,\n runDue: Effect.fn(\"MessageDelivery.runDue\")(function* (ownerThreadId) {\n const keys = yield* store.due(\n yield* Clock.currentTimeMillis,\n config.batchSize,\n ownerThreadId,\n );\n\n return yield* Effect.forEach(keys, process, { concurrency: config.concurrency });\n }),\n retry: Effect.fn(\"MessageDelivery.retry\")(\n function* (key, expectedVersion, deadlineAtMillis) {\n return yield* store.change(key, {\n _tag: \"Recover\",\n expectedVersion,\n deadlineAtMillis,\n nowMillis: yield* Clock.currentTimeMillis,\n });\n },\n ),\n });\n }),\n );\n }\n}\n"],"mappings":"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"}
@@ -105,6 +105,25 @@ export declare const makeMessageDeliveryFixture: (messageId?: any, owner?: any,
105
105
  readonly reportKind?: "update" | undefined;
106
106
  } | undefined;
107
107
  readonly messageAdmission?: {
108
+ readonly schemaVersion: 1;
109
+ readonly message: {
110
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
111
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
112
+ };
113
+ readonly peerName: string;
114
+ readonly sender: {
115
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
116
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
117
+ };
118
+ readonly returnAddress: {
119
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
120
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
121
+ };
122
+ readonly inReplyTo?: {
123
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
124
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
125
+ } | undefined;
126
+ } | {
108
127
  readonly _tag: "WorkerCompletion";
109
128
  readonly budgetExhausted: boolean;
110
129
  readonly schemaVersion: 1;
@@ -145,25 +164,6 @@ export declare const makeMessageDeliveryFixture: (messageId?: any, owner?: any,
145
164
  readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
146
165
  };
147
166
  readonly update: Update;
148
- } | {
149
- readonly schemaVersion: 1;
150
- readonly message: {
151
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
152
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
153
- };
154
- readonly peerName: string;
155
- readonly sender: {
156
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
157
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
158
- };
159
- readonly returnAddress: {
160
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
161
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
162
- };
163
- readonly inReplyTo?: {
164
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
165
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
166
- } | undefined;
167
167
  } | undefined;
168
168
  };
169
169
  readonly envelopeDigest: string & import("effect/Brand").Brand<"@effect-agent/thread/Digest">;
@@ -183,7 +183,7 @@ export declare const makeMessageDeliveryFixture: (messageId?: any, owner?: any,
183
183
  readonly receipt: Receipt | null;
184
184
  readonly settlement: Settlement | null;
185
185
  readonly refusal: string | null;
186
- readonly parkReason: "deadline" | "exhausted" | "status-unavailable" | null;
186
+ readonly parkReason: "awaiting-settlement" | "deadline" | "exhausted" | "status-unavailable" | null;
187
187
  readonly leaseUntilMillis: number | null;
188
188
  readonly retry: {
189
189
  readonly attempts: number;
@@ -288,6 +288,25 @@ export declare const makeWorkerUpdateDeliveryFixture: (id: string) => Effect.Eff
288
288
  readonly reportKind?: "update" | undefined;
289
289
  } | undefined;
290
290
  readonly messageAdmission?: {
291
+ readonly schemaVersion: 1;
292
+ readonly message: {
293
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
294
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
295
+ };
296
+ readonly peerName: string;
297
+ readonly sender: {
298
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
299
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
300
+ };
301
+ readonly returnAddress: {
302
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
303
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
304
+ };
305
+ readonly inReplyTo?: {
306
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
307
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
308
+ } | undefined;
309
+ } | {
291
310
  readonly _tag: "WorkerCompletion";
292
311
  readonly budgetExhausted: boolean;
293
312
  readonly schemaVersion: 1;
@@ -328,25 +347,6 @@ export declare const makeWorkerUpdateDeliveryFixture: (id: string) => Effect.Eff
328
347
  readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
329
348
  };
330
349
  readonly update: Update;
331
- } | {
332
- readonly schemaVersion: 1;
333
- readonly message: {
334
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
335
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
336
- };
337
- readonly peerName: string;
338
- readonly sender: {
339
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
340
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
341
- };
342
- readonly returnAddress: {
343
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
344
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
345
- };
346
- readonly inReplyTo?: {
347
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
348
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
349
- } | undefined;
350
350
  } | undefined;
351
351
  };
352
352
  readonly envelopeDigest: string & import("effect/Brand").Brand<"@effect-agent/thread/Digest">;
@@ -366,7 +366,7 @@ export declare const makeWorkerUpdateDeliveryFixture: (id: string) => Effect.Eff
366
366
  readonly receipt: Receipt | null;
367
367
  readonly settlement: Settlement | null;
368
368
  readonly refusal: string | null;
369
- readonly parkReason: "deadline" | "exhausted" | "status-unavailable" | null;
369
+ readonly parkReason: "awaiting-settlement" | "deadline" | "exhausted" | "status-unavailable" | null;
370
370
  readonly leaseUntilMillis: number | null;
371
371
  readonly retry: {
372
372
  readonly attempts: number;
@@ -1,2 +1,2 @@
1
- import { _ as stream, a as SubagentDurability, b as withTerminalDefectEvent, c as decodeFinalOutput, d as projectCompletionOutput, f as renderInputPrompt, g as startUnknown, h as start, i as AgentSpawner, l as encodeRunDisposition, m as runUnknown, n as AgentChildPending, o as SubagentDurabilityError, p as run, r as AgentResultSchema, s as ToolCallWaiting, u as projectCompletionFromToolOutput, v as streamUnknown, y as streamWithUsageAccountingUnknown } from "../AgentRuntime-GQACxY_m.mjs";
1
+ import { _ as stream, a as SubagentDurability, b as withTerminalDefectEvent, c as decodeFinalOutput, d as projectCompletionOutput, f as renderInputPrompt, g as startUnknown, h as start, i as AgentSpawner, l as encodeRunDisposition, m as runUnknown, n as AgentChildPending, o as SubagentDurabilityError, p as run, r as AgentResultSchema, s as ToolCallWaiting, u as projectCompletionFromToolOutput, v as streamUnknown, y as streamWithUsageAccountingUnknown } from "../AgentRuntime-D4eoBpIW.mjs";
2
2
  export { AgentChildPending, AgentResultSchema, AgentSpawner, SubagentDurability, SubagentDurabilityError, ToolCallWaiting, decodeFinalOutput, encodeRunDisposition, projectCompletionFromToolOutput, projectCompletionOutput, renderInputPrompt, run, runUnknown, start, startUnknown, stream, streamUnknown, streamWithUsageAccountingUnknown, withTerminalDefectEvent };
package/dist/index.mjs CHANGED
@@ -15,7 +15,7 @@ import { n as MessagingHost_exports } from "./MessagingHost-DfsbMPvq.mjs";
15
15
  import { t as SubagentHost_exports } from "./engine/SubagentHost.mjs";
16
16
  import { t as Thread_exports } from "./core/Thread.mjs";
17
17
  import { t as ThreadHistory_exports } from "./engine/ThreadHistory.mjs";
18
- import { t as AgentRuntime_exports } from "./AgentRuntime-GQACxY_m.mjs";
18
+ import { t as AgentRuntime_exports } from "./AgentRuntime-D4eoBpIW.mjs";
19
19
  import { t as ContextWindow_exports } from "./engine/ContextWindow.mjs";
20
20
  import { t as DurableStep_exports } from "./engine/DurableStep.mjs";
21
21
  import { t as ContextCompactor_exports } from "./engine/ContextCompactor.mjs";
@@ -57,7 +57,7 @@ import { t as RunHooks_exports } from "./capabilities/RunHooks.mjs";
57
57
  import { t as SemanticMemoryIndex_exports } from "./core/SemanticMemoryIndex.mjs";
58
58
  import { t as SemanticMemoryRevalidation_exports } from "./core/SemanticMemoryRevalidation.mjs";
59
59
  import { t as SemanticMemory_exports } from "./capabilities/SemanticMemory.mjs";
60
- import { r as Subagent_exports } from "./Subagent-JjcidJ7q.mjs";
60
+ import { r as Subagent_exports } from "./Subagent-211Oz2IN.mjs";
61
61
  import { t as ToolDiscovery_exports } from "./capabilities/ToolDiscovery.mjs";
62
62
  import { t as ToolExposure_exports } from "./ToolExposure.mjs";
63
63
  import { t as WebCapture_exports } from "./capabilities/WebCapture.mjs";
@@ -69,7 +69,7 @@ import { t as Recovery_exports } from "./durable/Recovery.mjs";
69
69
  import { t as Admin_exports } from "./durable/Admin.mjs";
70
70
  import { t as Digest_exports } from "./durable/Digest.mjs";
71
71
  import { t as AgentRegistration_exports } from "./durable/AgentRegistration.mjs";
72
- import { r as DurableAgentRuntime_exports } from "./DurableAgentRuntime-BAQvZK1e.mjs";
72
+ import { r as DurableAgentRuntime_exports } from "./DurableAgentRuntime-eImXoGqD.mjs";
73
73
  import { n as RunJournal_exports } from "./RunJournal-ixFRCyW3.mjs";
74
74
  import { t as ThreadStore_exports } from "./durable/ThreadStore.mjs";
75
75
  import { t as CommittedActivity_exports } from "./durable/CommittedActivity.mjs";