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

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 (112) hide show
  1. package/dist/{Admin-BjmupLN3.d.mts → Admin-BbTZHSLu.d.mts} +23 -11
  2. package/dist/{Agent-1DMSO_Fl.mjs → Agent-BMATXYsI.mjs} +9 -2
  3. package/dist/Agent-BMATXYsI.mjs.map +1 -0
  4. package/dist/{AgentRuntime-BAjT5gXl.d.mts → AgentRuntime-BPlAn5nA.d.mts} +6 -6
  5. package/dist/{AgentRuntime-IF_1GoUf.mjs → AgentRuntime-GQACxY_m.mjs} +21 -5
  6. package/dist/AgentRuntime-GQACxY_m.mjs.map +1 -0
  7. package/dist/{Digest-CaJ2RIsF.d.mts → Digest-CNHImGy0.d.mts} +2 -2
  8. package/dist/{DurableAgentRuntime-BQzYkFVy.mjs → DurableAgentRuntime-BAQvZK1e.mjs} +30 -18
  9. package/dist/DurableAgentRuntime-BAQvZK1e.mjs.map +1 -0
  10. package/dist/{EventSource-C8CKwQy5.d.mts → EventSource-CETtQTiH.d.mts} +3 -3
  11. package/dist/InMemory.d.mts +1 -1
  12. package/dist/{PreparedInputAdmission-CU1PzUVD.d.mts → PreparedInputAdmission-Swp9t800.d.mts} +4 -4
  13. package/dist/{Records-BrEpibum.d.mts → Records-BxGWRs-t.d.mts} +2 -2
  14. package/dist/{RunEvent-DV_llBcq.d.mts → RunEvent-D0aepYwN.d.mts} +2 -2
  15. package/dist/{RunEventSink-D5aVhISG.d.mts → RunEventSink-DsbcGXog.d.mts} +2 -2
  16. package/dist/{RunOptions-CkRYnlJa.d.mts → RunOptions-GjDlAuKh.d.mts} +5 -2
  17. package/dist/{Schedule-B_z7PMg-.d.mts → Schedule-B94iS2X3.d.mts} +2 -2
  18. package/dist/{Subagent-Dld4W1BY.d.mts → Subagent-CLaMeZKu.d.mts} +6 -6
  19. package/dist/{Subagent-CmFtZaeI.mjs → Subagent-JjcidJ7q.mjs} +2 -2
  20. package/dist/{Subagent-CmFtZaeI.mjs.map → Subagent-JjcidJ7q.mjs.map} +1 -1
  21. package/dist/{Subscription-BomcQ9_W.d.mts → Subscription-DaMCppa_.d.mts} +4 -4
  22. package/dist/{SubscriptionInput-gpZSR9vB.d.mts → SubscriptionInput-B0ZtrQoY.d.mts} +3 -3
  23. package/dist/{ThreadHistory-ZEu_ja6L.d.mts → ThreadHistory-FD-o4TsR.d.mts} +2 -2
  24. package/dist/{Usage-Dx0aknfk.d.mts → Usage-BNjPR7Zr.d.mts} +9 -1
  25. package/dist/{WorkerAdmission-CNbm4o_x.mjs → WorkerAdmission-N9hZV85Q.mjs} +2 -2
  26. package/dist/{WorkerAdmission-CNbm4o_x.mjs.map → WorkerAdmission-N9hZV85Q.mjs.map} +1 -1
  27. package/dist/{agent-registration-U3kmV7nW.mjs → agent-registration-BIOzAej4.mjs} +10 -1
  28. package/dist/agent-registration-BIOzAej4.mjs.map +1 -0
  29. package/dist/capabilities/Commands.d.mts +1 -1
  30. package/dist/capabilities/Redaction.d.mts +1 -1
  31. package/dist/capabilities/RunHooks.d.mts +1 -1
  32. package/dist/capabilities/Subagent.d.mts +1 -1
  33. package/dist/capabilities/Subagent.mjs +1 -1
  34. package/dist/capabilities/ToolDiscovery.d.mts +5 -0
  35. package/dist/capabilities/ToolDiscovery.mjs +18 -9
  36. package/dist/capabilities/ToolDiscovery.mjs.map +1 -1
  37. package/dist/capabilities/WebSearch.d.mts +5 -1
  38. package/dist/capabilities/WebSearch.mjs +9 -1
  39. package/dist/capabilities/WebSearch.mjs.map +1 -1
  40. package/dist/core/Agent.mjs +1 -1
  41. package/dist/core/RunEvent.d.mts +1 -1
  42. package/dist/core/Usage.d.mts +1 -1
  43. package/dist/core/Usage.mjs +22 -1
  44. package/dist/core/Usage.mjs.map +1 -1
  45. package/dist/durable/ActivityStore.d.mts +1 -1
  46. package/dist/durable/Admin.d.mts +1 -1
  47. package/dist/durable/AgentRegistration.d.mts +1 -1
  48. package/dist/durable/AgentRegistration.mjs +1 -1
  49. package/dist/durable/Certification.d.mts +1 -1
  50. package/dist/durable/CommittedActivity.d.mts +3 -3
  51. package/dist/durable/Digest.d.mts +1 -1
  52. package/dist/durable/DurableAgentRuntime.d.mts +1 -1
  53. package/dist/durable/DurableAgentRuntime.mjs +2 -2
  54. package/dist/durable/EventSource.d.mts +1 -1
  55. package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
  56. package/dist/durable/LifecyclePublication.d.mts +1 -1
  57. package/dist/durable/LifecyclePublication.mjs +2 -2
  58. package/dist/durable/LifecyclePublication.mjs.map +1 -1
  59. package/dist/durable/MessageDelivery.d.mts +4 -4
  60. package/dist/durable/MessageDeliveryStoreConformance.d.mts +41 -41
  61. package/dist/durable/PersistentHistory.d.mts +2 -2
  62. package/dist/durable/PreparedInputAdmission.d.mts +1 -1
  63. package/dist/durable/Records.d.mts +1 -1
  64. package/dist/durable/Recovery.d.mts +1 -1
  65. package/dist/durable/RunJournal.d.mts +1 -1
  66. package/dist/durable/Schedule.d.mts +1 -1
  67. package/dist/durable/ScheduleStoreConformance.d.mts +1 -1
  68. package/dist/durable/ScheduleTransition.d.mts +1 -1
  69. package/dist/durable/Scheduling.d.mts +3 -3
  70. package/dist/durable/SubmissionLedger.d.mts +1 -1
  71. package/dist/durable/SubmissionLedgerConformance.d.mts +2 -2
  72. package/dist/durable/SubmissionStatus.d.mts +1 -1
  73. package/dist/durable/Subscription.d.mts +1 -1
  74. package/dist/durable/SubscriptionInput.d.mts +1 -1
  75. package/dist/durable/SubscriptionInput.mjs +1 -1
  76. package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
  77. package/dist/durable/SubscriptionTools.d.mts +4 -4
  78. package/dist/durable/SubscriptionTransition.d.mts +1 -1
  79. package/dist/durable/Subscriptions.d.mts +6 -6
  80. package/dist/durable/ThreadContextHistory.d.mts +1 -1
  81. package/dist/durable/ThreadContextHistoryProjection.d.mts +1 -1
  82. package/dist/durable/ThreadInvariants.d.mts +2 -2
  83. package/dist/durable/ThreadProjection.d.mts +1 -1
  84. package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
  85. package/dist/durable/ThreadStore.d.mts +1 -1
  86. package/dist/durable/ThreadStoreConformance.d.mts +1 -1
  87. package/dist/durable/WorkerAdmission.d.mts +2 -2
  88. package/dist/durable/WorkerAdmission.mjs +1 -1
  89. package/dist/durable/WorkerHost.d.mts +2 -2
  90. package/dist/engine/AgentRuntime.d.mts +1 -1
  91. package/dist/engine/AgentRuntime.mjs +1 -1
  92. package/dist/engine/RunEventSink.d.mts +1 -1
  93. package/dist/engine/RunOptions.d.mts +1 -1
  94. package/dist/engine/RunOptions.mjs +1 -0
  95. package/dist/engine/RunOptions.mjs.map +1 -1
  96. package/dist/engine/ThreadHistory.d.mts +1 -1
  97. package/dist/index.d.mts +15 -15
  98. package/dist/index.mjs +5 -5
  99. package/package.json +1 -1
  100. package/src/capabilities/ToolDiscovery.ts +24 -10
  101. package/src/capabilities/WebSearch.ts +15 -0
  102. package/src/core/Agent.ts +16 -2
  103. package/src/core/Usage.ts +41 -0
  104. package/src/durable/DurableAgentRuntime.ts +40 -12
  105. package/src/durable/LifecyclePublication.ts +15 -2
  106. package/src/durable/internal/agent-registration.ts +11 -0
  107. package/src/engine/RunOptions.ts +3 -0
  108. package/src/engine/internal/agent-runtime.ts +68 -5
  109. package/dist/Agent-1DMSO_Fl.mjs.map +0 -1
  110. package/dist/AgentRuntime-IF_1GoUf.mjs.map +0 -1
  111. package/dist/DurableAgentRuntime-BQzYkFVy.mjs.map +0 -1
  112. package/dist/agent-registration-U3kmV7nW.mjs.map +0 -1
@@ -1,2 +1,2 @@
1
- import { a as make, i as isModelResolver, n as ToolInspection, o as withModel, r as inspectTools } from "../Agent-1DMSO_Fl.mjs";
1
+ import { a as make, i as isModelResolver, n as ToolInspection, o as withModel, r as inspectTools } from "../Agent-BMATXYsI.mjs";
2
2
  export { ToolInspection, inspectTools, isModelResolver, make, withModel };
@@ -1,2 +1,2 @@
1
- import { A as TurnCompleted, C as TextDelta, D as ToolCallSucceeded, E as ToolCallStarted, O as ToolFailureHandling, S as SubagentStarted, T as ToolCallFailed, _ as SubagentFailed, a as ExhaustedLimit, b as SubagentProgress, c as ReasoningDelta, f as RunFailed, g as SubagentCompleted, h as RunSuspended, i as CompactionPerformed, j as TurnStarted, k as ToolProgress, l as RunCompleted, m as RunStarted, n as ApprovalRequested, o as ModelRestarted, p as RunInterrupted, r as BudgetWarning, s as ModelStarted, t as AgentUpdateEmitted, u as RunEvent, v as SubagentInterrupted, w as ToolCallDeclared, x as SubagentRequested, y as SubagentJoined } from "../RunEvent-DV_llBcq.mjs";
1
+ import { A as TurnCompleted, C as TextDelta, D as ToolCallSucceeded, E as ToolCallStarted, O as ToolFailureHandling, S as SubagentStarted, T as ToolCallFailed, _ as SubagentFailed, a as ExhaustedLimit, b as SubagentProgress, c as ReasoningDelta, f as RunFailed, g as SubagentCompleted, h as RunSuspended, i as CompactionPerformed, j as TurnStarted, k as ToolProgress, l as RunCompleted, m as RunStarted, n as ApprovalRequested, o as ModelRestarted, p as RunInterrupted, r as BudgetWarning, s as ModelStarted, t as AgentUpdateEmitted, u as RunEvent, v as SubagentInterrupted, w as ToolCallDeclared, x as SubagentRequested, y as SubagentJoined } from "../RunEvent-D0aepYwN.mjs";
2
2
  export { AgentUpdateEmitted, ApprovalRequested, BudgetWarning, CompactionPerformed, ExhaustedLimit, ModelRestarted, ModelStarted, ReasoningDelta, RunCompleted, RunEvent, RunFailed, RunInterrupted, RunStarted, RunSuspended, SubagentCompleted, SubagentFailed, SubagentInterrupted, SubagentJoined, SubagentProgress, SubagentRequested, SubagentStarted, TextDelta, ToolCallDeclared, ToolCallFailed, ToolCallStarted, ToolCallSucceeded, ToolFailureHandling, ToolProgress, TurnCompleted, TurnStarted };
@@ -1,2 +1,2 @@
1
- import { _ as unknownRunTotals, a as ModelUsageGroup, c as RunUsageReport, d as UsageCompleteness, g as summarizeModelUsage, h as sumRunTotals, i as ModelResponseIdentity, l as RunUsageSummary, m as runTotalsFromSummary, n as InputTokenUsage, o as OutputTokenUsage, p as emptyRunTotals, r as ModelCallUsage, s as RunTotals, t as ChildRunUsage, u as UsageAggregationError } from "../Usage-Dx0aknfk.mjs";
1
+ import { _ as unknownRunTotals, a as ModelUsageGroup, c as RunUsageReport, d as UsageCompleteness, g as summarizeModelUsage, h as sumRunTotals, i as ModelResponseIdentity, l as RunUsageSummary, m as runTotalsFromSummary, n as InputTokenUsage, o as OutputTokenUsage, p as emptyRunTotals, r as ModelCallUsage, s as RunTotals, t as ChildRunUsage, u as UsageAggregationError } from "../Usage-BNjPR7Zr.mjs";
2
2
  export { ChildRunUsage, InputTokenUsage, ModelCallUsage, ModelResponseIdentity, ModelUsageGroup, OutputTokenUsage, RunTotals, RunUsageReport, RunUsageSummary, UsageAggregationError, UsageCompleteness, emptyRunTotals, runTotalsFromSummary, sumRunTotals, summarizeModelUsage, unknownRunTotals };
@@ -68,6 +68,8 @@ var ModelCallUsage = class extends Schema.Class("@effect-agent/core/ModelCallUsa
68
68
  pricingStatus: Schema.optionalKey(Schema.Literals(["estimated", "unknown"])),
69
69
  inputTokens: InputTokenUsage,
70
70
  outputTokens: OutputTokenUsage,
71
+ /** Observed hosted web searches; excludes OpenAI page/find actions. Absent in legacy records. */
72
+ webSearchCalls: Schema.optionalKey(Schema.Natural),
71
73
  costMicrousd: Schema.Natural
72
74
  }) {};
73
75
  /**
@@ -79,6 +81,8 @@ var RunTotals = class extends Schema.Class("@effect-agent/core/RunTotals")({
79
81
  modelCalls: Schema.Natural,
80
82
  inputTokens: Schema.Natural,
81
83
  outputTokens: Schema.Natural,
84
+ /** Observed hosted web searches; excludes OpenAI page/find actions. Absent in legacy records. */
85
+ webSearchCalls: Schema.optionalKey(Schema.Natural),
82
86
  costMicrousd: Schema.Natural,
83
87
  usageStatus: Schema.optionalKey(UsageCompleteness),
84
88
  pricingStatus: Schema.optionalKey(UsageCompleteness),
@@ -97,6 +101,7 @@ var ChildRunUsage = class extends Schema.Class("@effect-agent/core/ChildRunUsage
97
101
  /** Known absence of observed work. */
98
102
  const emptyRunTotals = () => RunTotals.make({
99
103
  modelCalls: 0,
104
+ webSearchCalls: 0,
100
105
  inputTokens: 0,
101
106
  outputTokens: 0,
102
107
  costMicrousd: 0,
@@ -121,12 +126,16 @@ var ModelUsageGroup = class extends Schema.Class("@effect-agent/core/ModelUsageG
121
126
  modelCalls: Schema.Natural.check(Schema.isGreaterThan(0)),
122
127
  inputTokens: InputTokenUsage,
123
128
  outputTokens: OutputTokenUsage,
129
+ /** Observed hosted web searches; excludes OpenAI page/find actions. Absent in legacy records. */
130
+ webSearchCalls: Schema.optionalKey(Schema.Natural),
124
131
  costMicrousd: Schema.Natural
125
132
  }) {};
126
133
  const RunUsageSummaryFields = Schema.Struct({
127
134
  modelCalls: Schema.Natural,
128
135
  inputTokens: InputTokenUsage,
129
136
  outputTokens: OutputTokenUsage,
137
+ /** Observed hosted web searches; excludes OpenAI page/find actions. Absent in legacy records. */
138
+ webSearchCalls: Schema.optionalKey(Schema.Natural),
130
139
  costMicrousd: Schema.Natural,
131
140
  byModel: Schema.Array(ModelUsageGroup),
132
141
  /** Coverage of recorded calls only; interruptions can make the Run less complete. */
@@ -142,7 +151,7 @@ const RunUsageSummaryFields = Schema.Struct({
142
151
  group.serviceTier ?? null,
143
152
  group.pricingVersion ?? null
144
153
  ]));
145
- return new Set(identities).size === identities.length && hasAdditiveTotal(summary.modelCalls, summary.byModel.map((group) => group.modelCalls)) && hasAdditiveTotal(summary.inputTokens.total, summary.byModel.map((group) => group.inputTokens.total)) && hasAdditiveTotal(summary.inputTokens.uncached, summary.byModel.map((group) => group.inputTokens.uncached)) && hasAdditiveTotal(summary.inputTokens.cacheRead, summary.byModel.map((group) => group.inputTokens.cacheRead)) && hasAdditiveTotal(summary.inputTokens.cacheWrite, summary.byModel.map((group) => group.inputTokens.cacheWrite)) && hasAdditiveTotal(summary.outputTokens.total, summary.byModel.map((group) => group.outputTokens.total)) && hasAdditiveTotal(summary.outputTokens.text, summary.byModel.map((group) => group.outputTokens.text)) && hasAdditiveTotal(summary.outputTokens.reasoning, summary.byModel.map((group) => group.outputTokens.reasoning)) && hasAdditiveTotal(summary.costMicrousd, summary.byModel.map((group) => group.costMicrousd));
154
+ return new Set(identities).size === identities.length && (summary.webSearchCalls === void 0 || hasAdditiveTotal(summary.webSearchCalls, summary.byModel.map((group) => group.webSearchCalls ?? 0))) && hasAdditiveTotal(summary.modelCalls, summary.byModel.map((group) => group.modelCalls)) && hasAdditiveTotal(summary.inputTokens.total, summary.byModel.map((group) => group.inputTokens.total)) && hasAdditiveTotal(summary.inputTokens.uncached, summary.byModel.map((group) => group.inputTokens.uncached)) && hasAdditiveTotal(summary.inputTokens.cacheRead, summary.byModel.map((group) => group.inputTokens.cacheRead)) && hasAdditiveTotal(summary.inputTokens.cacheWrite, summary.byModel.map((group) => group.inputTokens.cacheWrite)) && hasAdditiveTotal(summary.outputTokens.total, summary.byModel.map((group) => group.outputTokens.total)) && hasAdditiveTotal(summary.outputTokens.text, summary.byModel.map((group) => group.outputTokens.text)) && hasAdditiveTotal(summary.outputTokens.reasoning, summary.byModel.map((group) => group.outputTokens.reasoning)) && hasAdditiveTotal(summary.costMicrousd, summary.byModel.map((group) => group.costMicrousd));
146
155
  }, { title: "Run usage totals equal unique per-model pricing groups within safe-integer accounting" }));
147
156
  /** Settlement aggregate included with a terminal Run settlement. */
148
157
  var RunUsageSummary = class extends Schema.Class("@effect-agent/core/RunUsageSummary")(RunUsageSummaryFields) {};
@@ -172,6 +181,7 @@ const checkedAdd = (field, left, right) => {
172
181
  /** Combine disjoint totals, retaining uncertainty and rejecting numeric overflow. */
173
182
  const sumRunTotals = Effect.fn("sumRunTotals")(function* (contributions) {
174
183
  let modelCalls = 0;
184
+ let webSearchCalls = 0;
175
185
  let inputTokens = 0;
176
186
  let outputTokens = 0;
177
187
  let costMicrousd = 0;
@@ -184,6 +194,8 @@ const sumRunTotals = Effect.fn("sumRunTotals")(function* (contributions) {
184
194
  message: "Invalid Run totals"
185
195
  })));
186
196
  modelCalls = yield* checkedAdd("modelCalls", modelCalls, value.modelCalls);
197
+ if (value.webSearchCalls === void 0 && value.modelCalls > 0) webSearchCalls = void 0;
198
+ else if (webSearchCalls !== void 0) webSearchCalls = yield* checkedAdd("webSearchCalls", webSearchCalls, value.webSearchCalls ?? 0);
187
199
  inputTokens = yield* checkedAdd("inputTokens", inputTokens, value.inputTokens);
188
200
  outputTokens = yield* checkedAdd("outputTokens", outputTokens, value.outputTokens);
189
201
  costMicrousd = yield* checkedAdd("costMicrousd", costMicrousd, value.costMicrousd);
@@ -194,6 +206,7 @@ const sumRunTotals = Effect.fn("sumRunTotals")(function* (contributions) {
194
206
  const coverage = (statuses) => statuses.every((status) => status === "complete") ? "complete" : statuses.every((status) => status === "unknown") ? "unknown" : "partial";
195
207
  return RunTotals.make({
196
208
  modelCalls,
209
+ ...webSearchCalls === void 0 ? {} : { webSearchCalls },
197
210
  inputTokens,
198
211
  outputTokens,
199
212
  costMicrousd,
@@ -205,6 +218,7 @@ const sumRunTotals = Effect.fn("sumRunTotals")(function* (contributions) {
205
218
  /** Flatten a canonical settlement summary without discarding its coverage markers. */
206
219
  const runTotalsFromSummary = (summary) => RunTotals.make({
207
220
  modelCalls: summary.modelCalls,
221
+ ...summary.webSearchCalls === void 0 ? {} : { webSearchCalls: summary.webSearchCalls },
208
222
  inputTokens: summary.inputTokens.total,
209
223
  outputTokens: summary.outputTokens.total,
210
224
  costMicrousd: summary.costMicrousd,
@@ -226,6 +240,7 @@ const summarizeModelUsage = Effect.fn("summarizeModelUsage")(function* (calls, s
226
240
  const outputTokens = initial === void 0 ? emptyOutputTokens() : { ...initial.outputTokens };
227
241
  const groups = /* @__PURE__ */ new Map();
228
242
  let modelCalls = initial?.modelCalls ?? 0;
243
+ let webSearchCalls = initial === void 0 || initial.modelCalls === 0 ? 0 : initial.webSearchCalls;
229
244
  let costMicrousd = initial?.costMicrousd ?? 0;
230
245
  const hasSeedCalls = modelCalls > 0;
231
246
  let allUsageUnknown = !hasSeedCalls || initial?.usageStatus === void 0 || initial.usageStatus === "unknown";
@@ -242,6 +257,7 @@ const summarizeModelUsage = Effect.fn("summarizeModelUsage")(function* (calls, s
242
257
  ]);
243
258
  groups.set(key, {
244
259
  ...group,
260
+ webSearchCalls: group.webSearchCalls,
245
261
  inputTokens: { ...group.inputTokens },
246
262
  outputTokens: { ...group.outputTokens }
247
263
  });
@@ -252,6 +268,7 @@ const summarizeModelUsage = Effect.fn("summarizeModelUsage")(function* (calls, s
252
268
  allPricingUnknown &&= call.pricingStatus !== "estimated";
253
269
  allPricingComplete &&= call.pricingStatus === "estimated";
254
270
  modelCalls = yield* checkedAdd("modelCalls", modelCalls, 1);
271
+ webSearchCalls = webSearchCalls === void 0 || call.webSearchCalls === void 0 ? void 0 : yield* checkedAdd("webSearchCalls", webSearchCalls, call.webSearchCalls);
255
272
  inputTokens.total = yield* checkedAdd("inputTokens.total", inputTokens.total, call.inputTokens.total);
256
273
  inputTokens.uncached = yield* checkedAdd("inputTokens.uncached", inputTokens.uncached, call.inputTokens.uncached);
257
274
  inputTokens.cacheRead = yield* checkedAdd("inputTokens.cacheRead", inputTokens.cacheRead, call.inputTokens.cacheRead);
@@ -276,6 +293,7 @@ const summarizeModelUsage = Effect.fn("summarizeModelUsage")(function* (calls, s
276
293
  ...call.serviceTier === void 0 ? {} : { serviceTier: call.serviceTier },
277
294
  ...call.pricingVersion === void 0 ? {} : { pricingVersion: call.pricingVersion },
278
295
  modelCalls: 0,
296
+ webSearchCalls: 0,
279
297
  inputTokens: emptyInputTokens(),
280
298
  outputTokens: emptyOutputTokens(),
281
299
  costMicrousd: 0
@@ -283,6 +301,7 @@ const summarizeModelUsage = Effect.fn("summarizeModelUsage")(function* (calls, s
283
301
  groups.set(key, group);
284
302
  }
285
303
  group.modelCalls = yield* checkedAdd("byModel.modelCalls", group.modelCalls, 1);
304
+ group.webSearchCalls = group.webSearchCalls === void 0 || call.webSearchCalls === void 0 ? void 0 : yield* checkedAdd("byModel.webSearchCalls", group.webSearchCalls, call.webSearchCalls);
286
305
  group.inputTokens.total = yield* checkedAdd("byModel.inputTokens.total", group.inputTokens.total, call.inputTokens.total);
287
306
  group.inputTokens.uncached = yield* checkedAdd("byModel.inputTokens.uncached", group.inputTokens.uncached, call.inputTokens.uncached);
288
307
  group.inputTokens.cacheRead = yield* checkedAdd("byModel.inputTokens.cacheRead", group.inputTokens.cacheRead, call.inputTokens.cacheRead);
@@ -294,6 +313,7 @@ const summarizeModelUsage = Effect.fn("summarizeModelUsage")(function* (calls, s
294
313
  }
295
314
  return RunUsageSummary.make({
296
315
  modelCalls,
316
+ ...webSearchCalls === void 0 ? {} : { webSearchCalls },
297
317
  inputTokens: InputTokenUsage.make(inputTokens),
298
318
  outputTokens: OutputTokenUsage.make(outputTokens),
299
319
  costMicrousd,
@@ -307,6 +327,7 @@ const summarizeModelUsage = Effect.fn("summarizeModelUsage")(function* (calls, s
307
327
  ...group.serviceTier === void 0 ? {} : { serviceTier: group.serviceTier },
308
328
  ...group.pricingVersion === void 0 ? {} : { pricingVersion: group.pricingVersion },
309
329
  modelCalls: group.modelCalls,
330
+ ...group.webSearchCalls === void 0 ? {} : { webSearchCalls: group.webSearchCalls },
310
331
  inputTokens: InputTokenUsage.make(group.inputTokens),
311
332
  outputTokens: OutputTokenUsage.make(group.outputTokens),
312
333
  costMicrousd: group.costMicrousd
@@ -1 +1 @@
1
- {"version":3,"file":"Usage.mjs","names":[],"sources":["../../src/core/Usage.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nimport { RunId } from \"./Identifiers.ts\";\n\nconst UsageIdentity = Schema.NonEmptyString.check(Schema.isMaxLength(256));\n\n/** Bounded provider response identity. Request configuration is not response evidence. */\nexport class ModelResponseIdentity extends Schema.Class<ModelResponseIdentity>(\n \"@effect-agent/core/ModelResponseIdentity\",\n)({\n id: Schema.optionalKey(UsageIdentity),\n model: Schema.optionalKey(UsageIdentity),\n}) {}\n\n/** Missing legacy status means unknown, never a free call or a complete report. */\nexport const UsageCompleteness = Schema.Literals([\"complete\", \"partial\", \"unknown\"]);\n\nconst hasAdditiveTotal = (total: number, components: ReadonlyArray<number>): boolean => {\n const sum = components.reduce((accumulator, component) => accumulator + component, 0);\n\n return Number.isSafeInteger(sum) && total === sum;\n};\n\nconst InputTokenUsageFields = Schema.Struct({\n total: Schema.Natural,\n uncached: Schema.Natural,\n cacheRead: Schema.Natural,\n cacheWrite: Schema.Natural,\n}).check(\n Schema.makeFilter(\n (usage) => hasAdditiveTotal(usage.total, [usage.uncached, usage.cacheRead, usage.cacheWrite]),\n { title: \"Input token total equals uncached, cache-read, and cache-write components\" },\n ),\n);\n\n/** Provider-reported input-token components for one completed model call. */\nexport class InputTokenUsage extends Schema.Class<InputTokenUsage>(\n \"@effect-agent/core/InputTokenUsage\",\n)(InputTokenUsageFields) {}\n\nconst OutputTokenUsageFields = Schema.Struct({\n total: Schema.Natural,\n text: Schema.Natural,\n reasoning: Schema.Natural,\n}).check(\n Schema.makeFilter((usage) => hasAdditiveTotal(usage.total, [usage.text, usage.reasoning]), {\n title: \"Output token total equals text and reasoning components\",\n }),\n);\n\n/** Provider-reported output-token components for one completed model call. */\nexport class OutputTokenUsage extends Schema.Class<OutputTokenUsage>(\n \"@effect-agent/core/OutputTokenUsage\",\n)(OutputTokenUsageFields) {}\n\n/** Canonical, provider-independent accounting for one completed model call. */\nexport class ModelCallUsage extends Schema.Class<ModelCallUsage>(\n \"@effect-agent/core/ModelCallUsage\",\n)({\n provider: UsageIdentity,\n /** Configured binding identity. See response.model for provider-reported identity. */\n model: UsageIdentity,\n serviceTier: Schema.optionalKey(UsageIdentity),\n pricingVersion: Schema.optionalKey(UsageIdentity),\n response: Schema.optionalKey(ModelResponseIdentity),\n purpose: Schema.optionalKey(Schema.Literals([\"turn\", \"summary\"])),\n usageStatus: Schema.optionalKey(UsageCompleteness),\n pricingStatus: Schema.optionalKey(Schema.Literals([\"estimated\", \"unknown\"])),\n inputTokens: InputTokenUsage,\n outputTokens: OutputTokenUsage,\n costMicrousd: Schema.Natural,\n}) {}\n\n/**\n * Observed model usage and estimated cost, without per-model attribution.\n * Numeric zero with unknown coverage never establishes free execution. Missing legacy\n * statuses mean unknown. Unobserved calls are excluded from the numeric call/token totals.\n */\nexport class RunTotals extends Schema.Class<RunTotals>(\"@effect-agent/core/RunTotals\")({\n modelCalls: Schema.Natural,\n inputTokens: Schema.Natural,\n outputTokens: Schema.Natural,\n costMicrousd: Schema.Natural,\n usageStatus: Schema.optionalKey(UsageCompleteness),\n pricingStatus: Schema.optionalKey(UsageCompleteness),\n unobservedModelCalls: Schema.optionalKey(Schema.Natural),\n}) {}\n\n/** Own Run usage and disjoint attached-descendant usage. Add each component once. */\nexport class RunUsageReport extends Schema.Class<RunUsageReport>(\n \"@effect-agent/core/RunUsageReport\",\n)({\n usage: RunTotals,\n delegatedUsage: RunTotals,\n}) {}\n\n/** A verified child report retained across durable parent Attempts. */\nexport class ChildRunUsage extends Schema.Class<ChildRunUsage>(\"@effect-agent/core/ChildRunUsage\")({\n runId: RunId,\n report: RunUsageReport,\n}) {}\n\n/** Known absence of observed work. */\nexport const emptyRunTotals = (): RunTotals =>\n RunTotals.make({\n modelCalls: 0,\n inputTokens: 0,\n outputTokens: 0,\n costMicrousd: 0,\n usageStatus: \"complete\",\n pricingStatus: \"complete\",\n unobservedModelCalls: 0,\n });\n\n/** No accounting evidence, including legacy child reports. This is not known zero spend. */\nexport const unknownRunTotals = (): RunTotals =>\n RunTotals.make({\n ...emptyRunTotals(),\n usageStatus: \"unknown\",\n pricingStatus: \"unknown\",\n });\n\n/** Settlement-sized aggregate for calls sharing one pricing identity. */\nexport class ModelUsageGroup extends Schema.Class<ModelUsageGroup>(\n \"@effect-agent/core/ModelUsageGroup\",\n)({\n provider: UsageIdentity,\n model: UsageIdentity,\n /** Actual returned model; absent when only the configured binding is known. */\n responseModel: Schema.optionalKey(UsageIdentity),\n serviceTier: Schema.optionalKey(UsageIdentity),\n pricingVersion: Schema.optionalKey(UsageIdentity),\n modelCalls: Schema.Natural.check(Schema.isGreaterThan(0)),\n inputTokens: InputTokenUsage,\n outputTokens: OutputTokenUsage,\n costMicrousd: Schema.Natural,\n}) {}\n\nconst RunUsageSummaryFields = Schema.Struct({\n modelCalls: Schema.Natural,\n inputTokens: InputTokenUsage,\n outputTokens: OutputTokenUsage,\n costMicrousd: Schema.Natural,\n byModel: Schema.Array(ModelUsageGroup),\n /** Coverage of recorded calls only; interruptions can make the Run less complete. */\n usageStatus: Schema.optionalKey(UsageCompleteness),\n pricingStatus: Schema.optionalKey(UsageCompleteness),\n /** Observed invocations without retained accounting, excluded from numeric call/token totals. */\n unobservedModelCalls: Schema.optionalKey(Schema.Natural),\n}).check(\n Schema.makeFilter(\n (summary) => {\n const identities = summary.byModel.map((group) =>\n JSON.stringify([\n group.provider,\n group.model,\n group.responseModel ?? null,\n group.serviceTier ?? null,\n group.pricingVersion ?? null,\n ]),\n );\n\n return (\n new Set(identities).size === identities.length &&\n hasAdditiveTotal(\n summary.modelCalls,\n summary.byModel.map((group) => group.modelCalls),\n ) &&\n hasAdditiveTotal(\n summary.inputTokens.total,\n summary.byModel.map((group) => group.inputTokens.total),\n ) &&\n hasAdditiveTotal(\n summary.inputTokens.uncached,\n summary.byModel.map((group) => group.inputTokens.uncached),\n ) &&\n hasAdditiveTotal(\n summary.inputTokens.cacheRead,\n summary.byModel.map((group) => group.inputTokens.cacheRead),\n ) &&\n hasAdditiveTotal(\n summary.inputTokens.cacheWrite,\n summary.byModel.map((group) => group.inputTokens.cacheWrite),\n ) &&\n hasAdditiveTotal(\n summary.outputTokens.total,\n summary.byModel.map((group) => group.outputTokens.total),\n ) &&\n hasAdditiveTotal(\n summary.outputTokens.text,\n summary.byModel.map((group) => group.outputTokens.text),\n ) &&\n hasAdditiveTotal(\n summary.outputTokens.reasoning,\n summary.byModel.map((group) => group.outputTokens.reasoning),\n ) &&\n hasAdditiveTotal(\n summary.costMicrousd,\n summary.byModel.map((group) => group.costMicrousd),\n )\n );\n },\n {\n title:\n \"Run usage totals equal unique per-model pricing groups within safe-integer accounting\",\n },\n ),\n);\n\n/** Settlement aggregate included with a terminal Run settlement. */\nexport class RunUsageSummary extends Schema.Class<RunUsageSummary>(\n \"@effect-agent/core/RunUsageSummary\",\n)(RunUsageSummaryFields) {}\n\ninterface MutableUsageGroup {\n readonly provider: string;\n readonly model: string;\n readonly responseModel?: string | undefined;\n readonly serviceTier?: string | undefined;\n readonly pricingVersion?: string | undefined;\n modelCalls: number;\n inputTokens: {\n total: number;\n uncached: number;\n cacheRead: number;\n cacheWrite: number;\n };\n outputTokens: { total: number; text: number; reasoning: number };\n costMicrousd: number;\n}\n\nconst emptyInputTokens = () => ({ total: 0, uncached: 0, cacheRead: 0, cacheWrite: 0 });\nconst emptyOutputTokens = () => ({ total: 0, text: 0, reasoning: 0 });\n\n/** Canonical usage could not be aggregated without exceeding safe-integer accounting. */\nexport class UsageAggregationError extends Schema.TaggedError<UsageAggregationError>()(\n \"UsageAggregationError\",\n {\n field: Schema.NonEmptyString,\n message: Schema.String,\n },\n) {}\n\nconst checkedAdd = (\n field: string,\n left: number,\n right: number,\n): Effect.Effect<number, UsageAggregationError> => {\n const total = left + right;\n\n return Number.isSafeInteger(left) &&\n left >= 0 &&\n Number.isSafeInteger(right) &&\n right >= 0 &&\n Number.isSafeInteger(total)\n ? Effect.succeed(total)\n : Effect.fail(\n UsageAggregationError.make({\n field,\n message: `Canonical usage aggregation exceeded the safe-integer range at ${field}`,\n }),\n );\n};\n\n/** Combine disjoint totals, retaining uncertainty and rejecting numeric overflow. */\nexport const sumRunTotals = Effect.fn(\"sumRunTotals\")(function* (\n contributions: ReadonlyArray<RunTotals>,\n): Effect.fn.Return<RunTotals, UsageAggregationError> {\n let modelCalls = 0;\n let inputTokens = 0;\n let outputTokens = 0;\n let costMicrousd = 0;\n let unobservedModelCalls = 0;\n const usageStatuses: Array<typeof UsageCompleteness.Type> = [];\n const pricingStatuses: Array<typeof UsageCompleteness.Type> = [];\n\n for (const contribution of contributions) {\n const value = yield* Schema.decodeEffect(RunTotals)(contribution).pipe(\n Effect.mapError(\n () => new UsageAggregationError({ field: \"totals\", message: \"Invalid Run totals\" }),\n ),\n );\n\n modelCalls = yield* checkedAdd(\"modelCalls\", modelCalls, value.modelCalls);\n inputTokens = yield* checkedAdd(\"inputTokens\", inputTokens, value.inputTokens);\n outputTokens = yield* checkedAdd(\"outputTokens\", outputTokens, value.outputTokens);\n costMicrousd = yield* checkedAdd(\"costMicrousd\", costMicrousd, value.costMicrousd);\n unobservedModelCalls = yield* checkedAdd(\n \"unobservedModelCalls\",\n unobservedModelCalls,\n value.unobservedModelCalls ?? 0,\n );\n // Known empty contributions are identities; unknown empty contributions are evidence gaps.\n if (\n value.modelCalls > 0 ||\n (value.unobservedModelCalls ?? 0) > 0 ||\n value.usageStatus !== \"complete\"\n ) {\n usageStatuses.push(value.usageStatus ?? \"unknown\");\n }\n if (\n value.modelCalls > 0 ||\n (value.unobservedModelCalls ?? 0) > 0 ||\n value.pricingStatus !== \"complete\"\n ) {\n pricingStatuses.push(value.pricingStatus ?? \"unknown\");\n }\n }\n\n const coverage = (statuses: ReadonlyArray<typeof UsageCompleteness.Type>) =>\n statuses.every((status) => status === \"complete\")\n ? (\"complete\" as const)\n : statuses.every((status) => status === \"unknown\")\n ? (\"unknown\" as const)\n : (\"partial\" as const);\n\n return RunTotals.make({\n modelCalls,\n inputTokens,\n outputTokens,\n costMicrousd,\n unobservedModelCalls,\n usageStatus: coverage(usageStatuses),\n pricingStatus: coverage(pricingStatuses),\n });\n});\n\n/** Flatten a canonical settlement summary without discarding its coverage markers. */\nexport const runTotalsFromSummary = (summary: RunUsageSummary): RunTotals =>\n RunTotals.make({\n modelCalls: summary.modelCalls,\n inputTokens: summary.inputTokens.total,\n outputTokens: summary.outputTokens.total,\n costMicrousd: summary.costMicrousd,\n usageStatus: summary.usageStatus ?? \"unknown\",\n pricingStatus: summary.pricingStatus ?? \"unknown\",\n unobservedModelCalls: summary.unobservedModelCalls ?? 0,\n });\n\n/**\n * Deterministically aggregate canonical per-call usage without making cached tokens free.\n * A validated seed retains earlier call totals and pricing groups without retaining those calls.\n * Empty contributions do not change completeness; the seed is never mutated.\n */\nexport const summarizeModelUsage = Effect.fn(\"summarizeModelUsage\")(function* (\n calls: ReadonlyArray<ModelCallUsage>,\n seed?: RunUsageSummary,\n): Effect.fn.Return<RunUsageSummary, UsageAggregationError> {\n const initial =\n seed === undefined\n ? undefined\n : yield* Schema.decodeEffect(RunUsageSummary)(seed).pipe(\n Effect.mapError(\n () =>\n new UsageAggregationError({\n field: \"seed\",\n message: \"Canonical usage seed does not satisfy the RunUsageSummary Schema\",\n }),\n ),\n );\n\n const inputTokens = initial === undefined ? emptyInputTokens() : { ...initial.inputTokens };\n const outputTokens = initial === undefined ? emptyOutputTokens() : { ...initial.outputTokens };\n const groups = new Map<string, MutableUsageGroup>();\n let modelCalls = initial?.modelCalls ?? 0;\n let costMicrousd = initial?.costMicrousd ?? 0;\n const hasSeedCalls = modelCalls > 0;\n\n let allUsageUnknown =\n !hasSeedCalls || initial?.usageStatus === undefined || initial.usageStatus === \"unknown\";\n\n let allUsageComplete = !hasSeedCalls || initial?.usageStatus === \"complete\";\n\n let allPricingUnknown =\n !hasSeedCalls || initial?.pricingStatus === undefined || initial.pricingStatus === \"unknown\";\n\n let allPricingComplete = !hasSeedCalls || initial?.pricingStatus === \"complete\";\n\n for (const group of initial?.byModel ?? []) {\n const key = JSON.stringify([\n group.provider,\n group.model,\n group.responseModel ?? null,\n group.serviceTier ?? null,\n group.pricingVersion ?? null,\n ]);\n\n groups.set(key, {\n ...group,\n inputTokens: { ...group.inputTokens },\n outputTokens: { ...group.outputTokens },\n });\n }\n\n for (const call of calls) {\n allUsageUnknown &&= call.usageStatus === undefined || call.usageStatus === \"unknown\";\n allUsageComplete &&= call.usageStatus === \"complete\";\n allPricingUnknown &&= call.pricingStatus !== \"estimated\";\n allPricingComplete &&= call.pricingStatus === \"estimated\";\n modelCalls = yield* checkedAdd(\"modelCalls\", modelCalls, 1);\n inputTokens.total = yield* checkedAdd(\n \"inputTokens.total\",\n inputTokens.total,\n call.inputTokens.total,\n );\n inputTokens.uncached = yield* checkedAdd(\n \"inputTokens.uncached\",\n inputTokens.uncached,\n call.inputTokens.uncached,\n );\n inputTokens.cacheRead = yield* checkedAdd(\n \"inputTokens.cacheRead\",\n inputTokens.cacheRead,\n call.inputTokens.cacheRead,\n );\n inputTokens.cacheWrite = yield* checkedAdd(\n \"inputTokens.cacheWrite\",\n inputTokens.cacheWrite,\n call.inputTokens.cacheWrite,\n );\n outputTokens.total = yield* checkedAdd(\n \"outputTokens.total\",\n outputTokens.total,\n call.outputTokens.total,\n );\n outputTokens.text = yield* checkedAdd(\n \"outputTokens.text\",\n outputTokens.text,\n call.outputTokens.text,\n );\n outputTokens.reasoning = yield* checkedAdd(\n \"outputTokens.reasoning\",\n outputTokens.reasoning,\n call.outputTokens.reasoning,\n );\n costMicrousd = yield* checkedAdd(\"costMicrousd\", costMicrousd, call.costMicrousd);\n\n const key = JSON.stringify([\n call.provider,\n call.model,\n call.response?.model ?? null,\n call.serviceTier ?? null,\n call.pricingVersion ?? null,\n ]);\n\n let group = groups.get(key);\n\n if (group === undefined) {\n group = {\n provider: call.provider,\n model: call.model,\n ...(call.response?.model === undefined ? {} : { responseModel: call.response.model }),\n ...(call.serviceTier === undefined ? {} : { serviceTier: call.serviceTier }),\n ...(call.pricingVersion === undefined ? {} : { pricingVersion: call.pricingVersion }),\n modelCalls: 0,\n inputTokens: emptyInputTokens(),\n outputTokens: emptyOutputTokens(),\n costMicrousd: 0,\n };\n groups.set(key, group);\n }\n group.modelCalls = yield* checkedAdd(\"byModel.modelCalls\", group.modelCalls, 1);\n group.inputTokens.total = yield* checkedAdd(\n \"byModel.inputTokens.total\",\n group.inputTokens.total,\n call.inputTokens.total,\n );\n group.inputTokens.uncached = yield* checkedAdd(\n \"byModel.inputTokens.uncached\",\n group.inputTokens.uncached,\n call.inputTokens.uncached,\n );\n group.inputTokens.cacheRead = yield* checkedAdd(\n \"byModel.inputTokens.cacheRead\",\n group.inputTokens.cacheRead,\n call.inputTokens.cacheRead,\n );\n group.inputTokens.cacheWrite = yield* checkedAdd(\n \"byModel.inputTokens.cacheWrite\",\n group.inputTokens.cacheWrite,\n call.inputTokens.cacheWrite,\n );\n group.outputTokens.total = yield* checkedAdd(\n \"byModel.outputTokens.total\",\n group.outputTokens.total,\n call.outputTokens.total,\n );\n group.outputTokens.text = yield* checkedAdd(\n \"byModel.outputTokens.text\",\n group.outputTokens.text,\n call.outputTokens.text,\n );\n group.outputTokens.reasoning = yield* checkedAdd(\n \"byModel.outputTokens.reasoning\",\n group.outputTokens.reasoning,\n call.outputTokens.reasoning,\n );\n group.costMicrousd = yield* checkedAdd(\n \"byModel.costMicrousd\",\n group.costMicrousd,\n call.costMicrousd,\n );\n }\n\n return RunUsageSummary.make({\n modelCalls,\n inputTokens: InputTokenUsage.make(inputTokens),\n outputTokens: OutputTokenUsage.make(outputTokens),\n costMicrousd,\n usageStatus: allUsageUnknown ? \"unknown\" : allUsageComplete ? \"complete\" : \"partial\",\n pricingStatus: allPricingUnknown ? \"unknown\" : allPricingComplete ? \"complete\" : \"partial\",\n ...(initial?.unobservedModelCalls === undefined\n ? {}\n : { unobservedModelCalls: initial.unobservedModelCalls }),\n byModel: [...groups.values()].map((group) =>\n ModelUsageGroup.make({\n provider: group.provider,\n model: group.model,\n ...(group.responseModel === undefined ? {} : { responseModel: group.responseModel }),\n ...(group.serviceTier === undefined ? {} : { serviceTier: group.serviceTier }),\n ...(group.pricingVersion === undefined ? {} : { pricingVersion: group.pricingVersion }),\n modelCalls: group.modelCalls,\n inputTokens: InputTokenUsage.make(group.inputTokens),\n outputTokens: OutputTokenUsage.make(group.outputTokens),\n costMicrousd: group.costMicrousd,\n }),\n ),\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Usage.mjs","names":[],"sources":["../../src/core/Usage.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nimport { RunId } from \"./Identifiers.ts\";\n\nconst UsageIdentity = Schema.NonEmptyString.check(Schema.isMaxLength(256));\n\n/** Bounded provider response identity. Request configuration is not response evidence. */\nexport class ModelResponseIdentity extends Schema.Class<ModelResponseIdentity>(\n \"@effect-agent/core/ModelResponseIdentity\",\n)({\n id: Schema.optionalKey(UsageIdentity),\n model: Schema.optionalKey(UsageIdentity),\n}) {}\n\n/** Missing legacy status means unknown, never a free call or a complete report. */\nexport const UsageCompleteness = Schema.Literals([\"complete\", \"partial\", \"unknown\"]);\n\nconst hasAdditiveTotal = (total: number, components: ReadonlyArray<number>): boolean => {\n const sum = components.reduce((accumulator, component) => accumulator + component, 0);\n\n return Number.isSafeInteger(sum) && total === sum;\n};\n\nconst InputTokenUsageFields = Schema.Struct({\n total: Schema.Natural,\n uncached: Schema.Natural,\n cacheRead: Schema.Natural,\n cacheWrite: Schema.Natural,\n}).check(\n Schema.makeFilter(\n (usage) => hasAdditiveTotal(usage.total, [usage.uncached, usage.cacheRead, usage.cacheWrite]),\n { title: \"Input token total equals uncached, cache-read, and cache-write components\" },\n ),\n);\n\n/** Provider-reported input-token components for one completed model call. */\nexport class InputTokenUsage extends Schema.Class<InputTokenUsage>(\n \"@effect-agent/core/InputTokenUsage\",\n)(InputTokenUsageFields) {}\n\nconst OutputTokenUsageFields = Schema.Struct({\n total: Schema.Natural,\n text: Schema.Natural,\n reasoning: Schema.Natural,\n}).check(\n Schema.makeFilter((usage) => hasAdditiveTotal(usage.total, [usage.text, usage.reasoning]), {\n title: \"Output token total equals text and reasoning components\",\n }),\n);\n\n/** Provider-reported output-token components for one completed model call. */\nexport class OutputTokenUsage extends Schema.Class<OutputTokenUsage>(\n \"@effect-agent/core/OutputTokenUsage\",\n)(OutputTokenUsageFields) {}\n\n/** Canonical, provider-independent accounting for one completed model call. */\nexport class ModelCallUsage extends Schema.Class<ModelCallUsage>(\n \"@effect-agent/core/ModelCallUsage\",\n)({\n provider: UsageIdentity,\n /** Configured binding identity. See response.model for provider-reported identity. */\n model: UsageIdentity,\n serviceTier: Schema.optionalKey(UsageIdentity),\n pricingVersion: Schema.optionalKey(UsageIdentity),\n response: Schema.optionalKey(ModelResponseIdentity),\n purpose: Schema.optionalKey(Schema.Literals([\"turn\", \"summary\"])),\n usageStatus: Schema.optionalKey(UsageCompleteness),\n pricingStatus: Schema.optionalKey(Schema.Literals([\"estimated\", \"unknown\"])),\n inputTokens: InputTokenUsage,\n outputTokens: OutputTokenUsage,\n /** Observed hosted web searches; excludes OpenAI page/find actions. Absent in legacy records. */\n webSearchCalls: Schema.optionalKey(Schema.Natural),\n costMicrousd: Schema.Natural,\n}) {}\n\n/**\n * Observed model usage and estimated cost, without per-model attribution.\n * Numeric zero with unknown coverage never establishes free execution. Missing legacy\n * statuses mean unknown. Unobserved calls are excluded from the numeric call/token totals.\n */\nexport class RunTotals extends Schema.Class<RunTotals>(\"@effect-agent/core/RunTotals\")({\n modelCalls: Schema.Natural,\n inputTokens: Schema.Natural,\n outputTokens: Schema.Natural,\n /** Observed hosted web searches; excludes OpenAI page/find actions. Absent in legacy records. */\n webSearchCalls: Schema.optionalKey(Schema.Natural),\n costMicrousd: Schema.Natural,\n usageStatus: Schema.optionalKey(UsageCompleteness),\n pricingStatus: Schema.optionalKey(UsageCompleteness),\n unobservedModelCalls: Schema.optionalKey(Schema.Natural),\n}) {}\n\n/** Own Run usage and disjoint attached-descendant usage. Add each component once. */\nexport class RunUsageReport extends Schema.Class<RunUsageReport>(\n \"@effect-agent/core/RunUsageReport\",\n)({\n usage: RunTotals,\n delegatedUsage: RunTotals,\n}) {}\n\n/** A verified child report retained across durable parent Attempts. */\nexport class ChildRunUsage extends Schema.Class<ChildRunUsage>(\"@effect-agent/core/ChildRunUsage\")({\n runId: RunId,\n report: RunUsageReport,\n}) {}\n\n/** Known absence of observed work. */\nexport const emptyRunTotals = (): RunTotals =>\n RunTotals.make({\n modelCalls: 0,\n webSearchCalls: 0,\n inputTokens: 0,\n outputTokens: 0,\n costMicrousd: 0,\n usageStatus: \"complete\",\n pricingStatus: \"complete\",\n unobservedModelCalls: 0,\n });\n\n/** No accounting evidence, including legacy child reports. This is not known zero spend. */\nexport const unknownRunTotals = (): RunTotals =>\n RunTotals.make({\n ...emptyRunTotals(),\n usageStatus: \"unknown\",\n pricingStatus: \"unknown\",\n });\n\n/** Settlement-sized aggregate for calls sharing one pricing identity. */\nexport class ModelUsageGroup extends Schema.Class<ModelUsageGroup>(\n \"@effect-agent/core/ModelUsageGroup\",\n)({\n provider: UsageIdentity,\n model: UsageIdentity,\n /** Actual returned model; absent when only the configured binding is known. */\n responseModel: Schema.optionalKey(UsageIdentity),\n serviceTier: Schema.optionalKey(UsageIdentity),\n pricingVersion: Schema.optionalKey(UsageIdentity),\n modelCalls: Schema.Natural.check(Schema.isGreaterThan(0)),\n inputTokens: InputTokenUsage,\n outputTokens: OutputTokenUsage,\n /** Observed hosted web searches; excludes OpenAI page/find actions. Absent in legacy records. */\n webSearchCalls: Schema.optionalKey(Schema.Natural),\n costMicrousd: Schema.Natural,\n}) {}\n\nconst RunUsageSummaryFields = Schema.Struct({\n modelCalls: Schema.Natural,\n inputTokens: InputTokenUsage,\n outputTokens: OutputTokenUsage,\n /** Observed hosted web searches; excludes OpenAI page/find actions. Absent in legacy records. */\n webSearchCalls: Schema.optionalKey(Schema.Natural),\n costMicrousd: Schema.Natural,\n byModel: Schema.Array(ModelUsageGroup),\n /** Coverage of recorded calls only; interruptions can make the Run less complete. */\n usageStatus: Schema.optionalKey(UsageCompleteness),\n pricingStatus: Schema.optionalKey(UsageCompleteness),\n /** Observed invocations without retained accounting, excluded from numeric call/token totals. */\n unobservedModelCalls: Schema.optionalKey(Schema.Natural),\n}).check(\n Schema.makeFilter(\n (summary) => {\n const identities = summary.byModel.map((group) =>\n JSON.stringify([\n group.provider,\n group.model,\n group.responseModel ?? null,\n group.serviceTier ?? null,\n group.pricingVersion ?? null,\n ]),\n );\n\n return (\n new Set(identities).size === identities.length &&\n (summary.webSearchCalls === undefined ||\n hasAdditiveTotal(\n summary.webSearchCalls,\n summary.byModel.map((group) => group.webSearchCalls ?? 0),\n )) &&\n hasAdditiveTotal(\n summary.modelCalls,\n summary.byModel.map((group) => group.modelCalls),\n ) &&\n hasAdditiveTotal(\n summary.inputTokens.total,\n summary.byModel.map((group) => group.inputTokens.total),\n ) &&\n hasAdditiveTotal(\n summary.inputTokens.uncached,\n summary.byModel.map((group) => group.inputTokens.uncached),\n ) &&\n hasAdditiveTotal(\n summary.inputTokens.cacheRead,\n summary.byModel.map((group) => group.inputTokens.cacheRead),\n ) &&\n hasAdditiveTotal(\n summary.inputTokens.cacheWrite,\n summary.byModel.map((group) => group.inputTokens.cacheWrite),\n ) &&\n hasAdditiveTotal(\n summary.outputTokens.total,\n summary.byModel.map((group) => group.outputTokens.total),\n ) &&\n hasAdditiveTotal(\n summary.outputTokens.text,\n summary.byModel.map((group) => group.outputTokens.text),\n ) &&\n hasAdditiveTotal(\n summary.outputTokens.reasoning,\n summary.byModel.map((group) => group.outputTokens.reasoning),\n ) &&\n hasAdditiveTotal(\n summary.costMicrousd,\n summary.byModel.map((group) => group.costMicrousd),\n )\n );\n },\n {\n title:\n \"Run usage totals equal unique per-model pricing groups within safe-integer accounting\",\n },\n ),\n);\n\n/** Settlement aggregate included with a terminal Run settlement. */\nexport class RunUsageSummary extends Schema.Class<RunUsageSummary>(\n \"@effect-agent/core/RunUsageSummary\",\n)(RunUsageSummaryFields) {}\n\ninterface MutableUsageGroup {\n readonly provider: string;\n readonly model: string;\n readonly responseModel?: string | undefined;\n readonly serviceTier?: string | undefined;\n readonly pricingVersion?: string | undefined;\n modelCalls: number;\n webSearchCalls: number | undefined;\n inputTokens: {\n total: number;\n uncached: number;\n cacheRead: number;\n cacheWrite: number;\n };\n outputTokens: { total: number; text: number; reasoning: number };\n costMicrousd: number;\n}\n\nconst emptyInputTokens = () => ({ total: 0, uncached: 0, cacheRead: 0, cacheWrite: 0 });\nconst emptyOutputTokens = () => ({ total: 0, text: 0, reasoning: 0 });\n\n/** Canonical usage could not be aggregated without exceeding safe-integer accounting. */\nexport class UsageAggregationError extends Schema.TaggedError<UsageAggregationError>()(\n \"UsageAggregationError\",\n {\n field: Schema.NonEmptyString,\n message: Schema.String,\n },\n) {}\n\nconst checkedAdd = (\n field: string,\n left: number,\n right: number,\n): Effect.Effect<number, UsageAggregationError> => {\n const total = left + right;\n\n return Number.isSafeInteger(left) &&\n left >= 0 &&\n Number.isSafeInteger(right) &&\n right >= 0 &&\n Number.isSafeInteger(total)\n ? Effect.succeed(total)\n : Effect.fail(\n UsageAggregationError.make({\n field,\n message: `Canonical usage aggregation exceeded the safe-integer range at ${field}`,\n }),\n );\n};\n\n/** Combine disjoint totals, retaining uncertainty and rejecting numeric overflow. */\nexport const sumRunTotals = Effect.fn(\"sumRunTotals\")(function* (\n contributions: ReadonlyArray<RunTotals>,\n): Effect.fn.Return<RunTotals, UsageAggregationError> {\n let modelCalls = 0;\n let webSearchCalls: number | undefined = 0;\n let inputTokens = 0;\n let outputTokens = 0;\n let costMicrousd = 0;\n let unobservedModelCalls = 0;\n const usageStatuses: Array<typeof UsageCompleteness.Type> = [];\n const pricingStatuses: Array<typeof UsageCompleteness.Type> = [];\n\n for (const contribution of contributions) {\n const value = yield* Schema.decodeEffect(RunTotals)(contribution).pipe(\n Effect.mapError(\n () => new UsageAggregationError({ field: \"totals\", message: \"Invalid Run totals\" }),\n ),\n );\n\n modelCalls = yield* checkedAdd(\"modelCalls\", modelCalls, value.modelCalls);\n if (value.webSearchCalls === undefined && value.modelCalls > 0) webSearchCalls = undefined;\n else if (webSearchCalls !== undefined)\n webSearchCalls = yield* checkedAdd(\n \"webSearchCalls\",\n webSearchCalls,\n value.webSearchCalls ?? 0,\n );\n inputTokens = yield* checkedAdd(\"inputTokens\", inputTokens, value.inputTokens);\n outputTokens = yield* checkedAdd(\"outputTokens\", outputTokens, value.outputTokens);\n costMicrousd = yield* checkedAdd(\"costMicrousd\", costMicrousd, value.costMicrousd);\n unobservedModelCalls = yield* checkedAdd(\n \"unobservedModelCalls\",\n unobservedModelCalls,\n value.unobservedModelCalls ?? 0,\n );\n // Known empty contributions are identities; unknown empty contributions are evidence gaps.\n if (\n value.modelCalls > 0 ||\n (value.unobservedModelCalls ?? 0) > 0 ||\n value.usageStatus !== \"complete\"\n ) {\n usageStatuses.push(value.usageStatus ?? \"unknown\");\n }\n if (\n value.modelCalls > 0 ||\n (value.unobservedModelCalls ?? 0) > 0 ||\n value.pricingStatus !== \"complete\"\n ) {\n pricingStatuses.push(value.pricingStatus ?? \"unknown\");\n }\n }\n\n const coverage = (statuses: ReadonlyArray<typeof UsageCompleteness.Type>) =>\n statuses.every((status) => status === \"complete\")\n ? (\"complete\" as const)\n : statuses.every((status) => status === \"unknown\")\n ? (\"unknown\" as const)\n : (\"partial\" as const);\n\n return RunTotals.make({\n modelCalls,\n ...(webSearchCalls === undefined ? {} : { webSearchCalls }),\n inputTokens,\n outputTokens,\n costMicrousd,\n unobservedModelCalls,\n usageStatus: coverage(usageStatuses),\n pricingStatus: coverage(pricingStatuses),\n });\n});\n\n/** Flatten a canonical settlement summary without discarding its coverage markers. */\nexport const runTotalsFromSummary = (summary: RunUsageSummary): RunTotals =>\n RunTotals.make({\n modelCalls: summary.modelCalls,\n ...(summary.webSearchCalls === undefined ? {} : { webSearchCalls: summary.webSearchCalls }),\n inputTokens: summary.inputTokens.total,\n outputTokens: summary.outputTokens.total,\n costMicrousd: summary.costMicrousd,\n usageStatus: summary.usageStatus ?? \"unknown\",\n pricingStatus: summary.pricingStatus ?? \"unknown\",\n unobservedModelCalls: summary.unobservedModelCalls ?? 0,\n });\n\n/**\n * Deterministically aggregate canonical per-call usage without making cached tokens free.\n * A validated seed retains earlier call totals and pricing groups without retaining those calls.\n * Empty contributions do not change completeness; the seed is never mutated.\n */\nexport const summarizeModelUsage = Effect.fn(\"summarizeModelUsage\")(function* (\n calls: ReadonlyArray<ModelCallUsage>,\n seed?: RunUsageSummary,\n): Effect.fn.Return<RunUsageSummary, UsageAggregationError> {\n const initial =\n seed === undefined\n ? undefined\n : yield* Schema.decodeEffect(RunUsageSummary)(seed).pipe(\n Effect.mapError(\n () =>\n new UsageAggregationError({\n field: \"seed\",\n message: \"Canonical usage seed does not satisfy the RunUsageSummary Schema\",\n }),\n ),\n );\n\n const inputTokens = initial === undefined ? emptyInputTokens() : { ...initial.inputTokens };\n const outputTokens = initial === undefined ? emptyOutputTokens() : { ...initial.outputTokens };\n const groups = new Map<string, MutableUsageGroup>();\n let modelCalls = initial?.modelCalls ?? 0;\n\n let webSearchCalls =\n initial === undefined || initial.modelCalls === 0 ? 0 : initial.webSearchCalls;\n\n let costMicrousd = initial?.costMicrousd ?? 0;\n const hasSeedCalls = modelCalls > 0;\n\n let allUsageUnknown =\n !hasSeedCalls || initial?.usageStatus === undefined || initial.usageStatus === \"unknown\";\n\n let allUsageComplete = !hasSeedCalls || initial?.usageStatus === \"complete\";\n\n let allPricingUnknown =\n !hasSeedCalls || initial?.pricingStatus === undefined || initial.pricingStatus === \"unknown\";\n\n let allPricingComplete = !hasSeedCalls || initial?.pricingStatus === \"complete\";\n\n for (const group of initial?.byModel ?? []) {\n const key = JSON.stringify([\n group.provider,\n group.model,\n group.responseModel ?? null,\n group.serviceTier ?? null,\n group.pricingVersion ?? null,\n ]);\n\n groups.set(key, {\n ...group,\n webSearchCalls: group.webSearchCalls,\n inputTokens: { ...group.inputTokens },\n outputTokens: { ...group.outputTokens },\n });\n }\n\n for (const call of calls) {\n allUsageUnknown &&= call.usageStatus === undefined || call.usageStatus === \"unknown\";\n allUsageComplete &&= call.usageStatus === \"complete\";\n allPricingUnknown &&= call.pricingStatus !== \"estimated\";\n allPricingComplete &&= call.pricingStatus === \"estimated\";\n modelCalls = yield* checkedAdd(\"modelCalls\", modelCalls, 1);\n webSearchCalls =\n webSearchCalls === undefined || call.webSearchCalls === undefined\n ? undefined\n : yield* checkedAdd(\"webSearchCalls\", webSearchCalls, call.webSearchCalls);\n inputTokens.total = yield* checkedAdd(\n \"inputTokens.total\",\n inputTokens.total,\n call.inputTokens.total,\n );\n inputTokens.uncached = yield* checkedAdd(\n \"inputTokens.uncached\",\n inputTokens.uncached,\n call.inputTokens.uncached,\n );\n inputTokens.cacheRead = yield* checkedAdd(\n \"inputTokens.cacheRead\",\n inputTokens.cacheRead,\n call.inputTokens.cacheRead,\n );\n inputTokens.cacheWrite = yield* checkedAdd(\n \"inputTokens.cacheWrite\",\n inputTokens.cacheWrite,\n call.inputTokens.cacheWrite,\n );\n outputTokens.total = yield* checkedAdd(\n \"outputTokens.total\",\n outputTokens.total,\n call.outputTokens.total,\n );\n outputTokens.text = yield* checkedAdd(\n \"outputTokens.text\",\n outputTokens.text,\n call.outputTokens.text,\n );\n outputTokens.reasoning = yield* checkedAdd(\n \"outputTokens.reasoning\",\n outputTokens.reasoning,\n call.outputTokens.reasoning,\n );\n costMicrousd = yield* checkedAdd(\"costMicrousd\", costMicrousd, call.costMicrousd);\n\n const key = JSON.stringify([\n call.provider,\n call.model,\n call.response?.model ?? null,\n call.serviceTier ?? null,\n call.pricingVersion ?? null,\n ]);\n\n let group = groups.get(key);\n\n if (group === undefined) {\n group = {\n provider: call.provider,\n model: call.model,\n ...(call.response?.model === undefined ? {} : { responseModel: call.response.model }),\n ...(call.serviceTier === undefined ? {} : { serviceTier: call.serviceTier }),\n ...(call.pricingVersion === undefined ? {} : { pricingVersion: call.pricingVersion }),\n modelCalls: 0,\n webSearchCalls: 0,\n inputTokens: emptyInputTokens(),\n outputTokens: emptyOutputTokens(),\n costMicrousd: 0,\n };\n groups.set(key, group);\n }\n group.modelCalls = yield* checkedAdd(\"byModel.modelCalls\", group.modelCalls, 1);\n group.webSearchCalls =\n group.webSearchCalls === undefined || call.webSearchCalls === undefined\n ? undefined\n : yield* checkedAdd(\"byModel.webSearchCalls\", group.webSearchCalls, call.webSearchCalls);\n group.inputTokens.total = yield* checkedAdd(\n \"byModel.inputTokens.total\",\n group.inputTokens.total,\n call.inputTokens.total,\n );\n group.inputTokens.uncached = yield* checkedAdd(\n \"byModel.inputTokens.uncached\",\n group.inputTokens.uncached,\n call.inputTokens.uncached,\n );\n group.inputTokens.cacheRead = yield* checkedAdd(\n \"byModel.inputTokens.cacheRead\",\n group.inputTokens.cacheRead,\n call.inputTokens.cacheRead,\n );\n group.inputTokens.cacheWrite = yield* checkedAdd(\n \"byModel.inputTokens.cacheWrite\",\n group.inputTokens.cacheWrite,\n call.inputTokens.cacheWrite,\n );\n group.outputTokens.total = yield* checkedAdd(\n \"byModel.outputTokens.total\",\n group.outputTokens.total,\n call.outputTokens.total,\n );\n group.outputTokens.text = yield* checkedAdd(\n \"byModel.outputTokens.text\",\n group.outputTokens.text,\n call.outputTokens.text,\n );\n group.outputTokens.reasoning = yield* checkedAdd(\n \"byModel.outputTokens.reasoning\",\n group.outputTokens.reasoning,\n call.outputTokens.reasoning,\n );\n group.costMicrousd = yield* checkedAdd(\n \"byModel.costMicrousd\",\n group.costMicrousd,\n call.costMicrousd,\n );\n }\n\n return RunUsageSummary.make({\n modelCalls,\n ...(webSearchCalls === undefined ? {} : { webSearchCalls }),\n inputTokens: InputTokenUsage.make(inputTokens),\n outputTokens: OutputTokenUsage.make(outputTokens),\n costMicrousd,\n usageStatus: allUsageUnknown ? \"unknown\" : allUsageComplete ? \"complete\" : \"partial\",\n pricingStatus: allPricingUnknown ? \"unknown\" : allPricingComplete ? \"complete\" : \"partial\",\n ...(initial?.unobservedModelCalls === undefined\n ? {}\n : { unobservedModelCalls: initial.unobservedModelCalls }),\n byModel: [...groups.values()].map((group) =>\n ModelUsageGroup.make({\n provider: group.provider,\n model: group.model,\n ...(group.responseModel === undefined ? {} : { responseModel: group.responseModel }),\n ...(group.serviceTier === undefined ? {} : { serviceTier: group.serviceTier }),\n ...(group.pricingVersion === undefined ? {} : { pricingVersion: group.pricingVersion }),\n modelCalls: group.modelCalls,\n ...(group.webSearchCalls === undefined ? {} : { webSearchCalls: group.webSearchCalls }),\n inputTokens: InputTokenUsage.make(group.inputTokens),\n outputTokens: OutputTokenUsage.make(group.outputTokens),\n costMicrousd: group.costMicrousd,\n }),\n ),\n });\n});\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { _ as Digest } from "../Records-BrEpibum.mjs";
1
+ import { _ as Digest } from "../Records-BxGWRs-t.mjs";
2
2
  import { Context, Effect, Layer, Schema } from "effect";
3
3
  declare namespace ActivityStore_d_exports {
4
4
  export { ActivityBusy, ActivityClaim, ActivityClaimRequest, ActivityMutationFailpoint, ActivityMutationFailure, ActivityMutationPoint, ActivityOwnershipLost, ActivityProcessorKey, ActivityProcessorStore, ActivityProgress, ActivityStoreError, ActivityStoreFailure, ActivityWorkConflict, PreparedActivity };
@@ -1,2 +1,2 @@
1
- import { C as renderRecoveryExplanation, S as recoveryDecisionMeaning, _ as RetryCommand, a as IntegrityCheck, b as obligationSeverityOf, c as IntegrityReport, d as ObligationReport, f as ObligationSeverity, g as RecoveryExplanation, h as RecoveryDisposition, i as ExplainedUnknownCall, l as ObligationBlockedOn, m as RECOVERY_DECISION_MEANINGS, n as ExplainedEvidence, o as IntegrityCheckName, p as ObligationThresholds, r as ExplainedSubmission, s as IntegrityCheckStatus, u as ObligationEntry, v as RetryRefusalReason, x as predictRecoveryDisposition, y as RetryRefused } from "../Admin-BjmupLN3.mjs";
1
+ import { C as renderRecoveryExplanation, S as recoveryDecisionMeaning, _ as RetryCommand, a as IntegrityCheck, b as obligationSeverityOf, c as IntegrityReport, d as ObligationReport, f as ObligationSeverity, g as RecoveryExplanation, h as RecoveryDisposition, i as ExplainedUnknownCall, l as ObligationBlockedOn, m as RECOVERY_DECISION_MEANINGS, n as ExplainedEvidence, o as IntegrityCheckName, p as ObligationThresholds, r as ExplainedSubmission, s as IntegrityCheckStatus, u as ObligationEntry, v as RetryRefusalReason, x as predictRecoveryDisposition, y as RetryRefused } from "../Admin-BbTZHSLu.mjs";
2
2
  export { ExplainedEvidence, ExplainedSubmission, ExplainedUnknownCall, IntegrityCheck, IntegrityCheckName, IntegrityCheckStatus, IntegrityReport, ObligationBlockedOn, ObligationEntry, ObligationReport, ObligationSeverity, ObligationThresholds, RECOVERY_DECISION_MEANINGS, RecoveryDisposition, RecoveryExplanation, RetryCommand, RetryRefusalReason, RetryRefused, obligationSeverityOf, predictRecoveryDisposition, recoveryDecisionMeaning, renderRecoveryExplanation };
@@ -1,2 +1,2 @@
1
- import { Ba as DurableBindingFailure, Fa as AgentAttemptContext, Ga as compileBindingContracts, Ha as ExecutableAgentBinding, Ia as AgentRegistration, Ka as compileRegistrations, La as BindingSelection, Ra as BindingUnavailable, Ua as ReplayVersions, Va as DurableWorkerBinding, Wa as ResolvedBinding, qa as definitionDigestsEqual, za as CurrentBindingSelection } from "../Admin-BjmupLN3.mjs";
1
+ import { Ba as DurableBindingFailure, Fa as AgentAttemptContext, Ga as compileBindingContracts, Ha as ExecutableAgentBinding, Ia as AgentRegistration, Ka as compileRegistrations, La as BindingSelection, Ra as BindingUnavailable, Ua as ReplayVersions, Va as DurableWorkerBinding, Wa as ResolvedBinding, qa as definitionDigestsEqual, za as CurrentBindingSelection } from "../Admin-BbTZHSLu.mjs";
2
2
  export { type AgentAttemptContext, type AgentRegistration, type BindingSelection, BindingUnavailable, CurrentBindingSelection, type DurableBindingFailure, DurableWorkerBinding, type ExecutableAgentBinding, type ReplayVersions, type ResolvedBinding, compileBindingContracts, compileRegistrations, definitionDigestsEqual };
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "../rolldown-runtime-D7D4PA-g.mjs";
2
- import { a as compileRegistrations, i as compileBindingContracts, n as CurrentBindingSelection, o as definitionDigestsEqual, r as DurableWorkerBinding, t as BindingUnavailable } from "../agent-registration-U3kmV7nW.mjs";
2
+ import { a as compileRegistrations, i as compileBindingContracts, n as CurrentBindingSelection, o as definitionDigestsEqual, r as DurableWorkerBinding, t as BindingUnavailable } from "../agent-registration-BIOzAej4.mjs";
3
3
  //#region src/durable/AgentRegistration.ts
4
4
  var AgentRegistration_exports = /* @__PURE__ */ __exportAll({
5
5
  BindingUnavailable: () => BindingUnavailable,
@@ -1,4 +1,4 @@
1
- import { ni as ThreadStore, vn as SubmissionLedger } from "../Admin-BjmupLN3.mjs";
1
+ import { ni as ThreadStore, vn as SubmissionLedger } from "../Admin-BbTZHSLu.mjs";
2
2
  import { Crypto, Effect, Schema } from "effect";
3
3
  //#region src/durable/Certification.d.ts
4
4
  declare const CertifiedAdapterIdentity_base: Schema.Class<CertifiedAdapterIdentity, Schema.Struct<{
@@ -1,7 +1,7 @@
1
- import { k as PersistedJson, l as CanonicalRecordEnvelope } from "../Records-BrEpibum.mjs";
1
+ import { k as PersistedJson, l as CanonicalRecordEnvelope } from "../Records-BxGWRs-t.mjs";
2
2
  import { ActivityProcessorKey, ActivityProcessorStore, ActivityStoreFailure, PreparedActivity } from "./ActivityStore.mjs";
3
- import { t as DigestError } from "../Digest-CaJ2RIsF.mjs";
4
- import { Gr as ThreadNotMaterialized, ii as ThreadStoreError, ni as ThreadStore } from "../Admin-BjmupLN3.mjs";
3
+ import { t as DigestError } from "../Digest-CNHImGy0.mjs";
4
+ import { Gr as ThreadNotMaterialized, ii as ThreadStoreError, ni as ThreadStore } from "../Admin-BbTZHSLu.mjs";
5
5
  import { Crypto, Effect, Schema, Scope } from "effect";
6
6
  declare namespace CommittedActivity_d_exports {
7
7
  export { ActivityPassLimits, ActivityPassResult, ActivityProcessingError, CommittedActivityProcessor, activityWorkId, processCommittedActivity };
@@ -1,2 +1,2 @@
1
- import { a as digestDefinition, i as digestCanonicalBatch, o as digestDefinitions, r as EMPTY_TAIL_DIGEST, s as digestJson, t as DigestError } from "../Digest-CaJ2RIsF.mjs";
1
+ import { a as digestDefinition, i as digestCanonicalBatch, o as digestDefinitions, r as EMPTY_TAIL_DIGEST, s as digestJson, t as DigestError } from "../Digest-CNHImGy0.mjs";
2
2
  export { DigestError, EMPTY_TAIL_DIGEST, digestCanonicalBatch, digestDefinition, digestDefinitions, digestJson };
@@ -1,3 +1,3 @@
1
1
  import { a as Receipt } from "../Receipt-BAHyigAF.mjs";
2
- import { $n as DurableApprovalFailure, Cr as isolateRecovery, Dr as threadCreatedRecordId, Er as threadCreatedBatchId, Sr as childReservationIdFor, Tr as recoveryRepairRecordId, Xn as DurableAbortFailure, Yn as ApprovalSuspensionError, Zn as DurableAgentRuntime, _r as RecoveryBlocked, ar as DurableObserveOptions, br as RecoverySweepOptions, cr as DurableRetryFailure, dr as DurableSubmitAgent, er as DurableApprovalResolver, fr as DurableSubmitFailure, gr as DurableWorkerRequirements, hr as DurableWorkerFailure, ir as DurableObligationFailure, lr as DurableRuntimeConfig, mr as DurableVerifyFailure, nr as DurableAwaitFailure, or as DurableProgressFailure, pr as DurableSubmitOptions, rr as DurableExplainFailure, sr as DurableResolveFailure, tr as DurableApprovalSuspension, ur as DurableRuntimeConfigOptions, vr as RecoveryFailure, wr as recoveryRepairBatchId, xr as RecoverySweepResult, yr as RecoveryReport } from "../Admin-BjmupLN3.mjs";
2
+ import { $n as DurableApprovalFailure, Cr as isolateRecovery, Dr as threadCreatedRecordId, Er as threadCreatedBatchId, Sr as childReservationIdFor, Tr as recoveryRepairRecordId, Xn as DurableAbortFailure, Yn as ApprovalSuspensionError, Zn as DurableAgentRuntime, _r as RecoveryBlocked, ar as DurableObserveOptions, br as RecoverySweepOptions, cr as DurableRetryFailure, dr as DurableSubmitAgent, er as DurableApprovalResolver, fr as DurableSubmitFailure, gr as DurableWorkerRequirements, hr as DurableWorkerFailure, ir as DurableObligationFailure, lr as DurableRuntimeConfig, mr as DurableVerifyFailure, nr as DurableAwaitFailure, or as DurableProgressFailure, pr as DurableSubmitOptions, rr as DurableExplainFailure, sr as DurableResolveFailure, tr as DurableApprovalSuspension, ur as DurableRuntimeConfigOptions, vr as RecoveryFailure, wr as recoveryRepairBatchId, xr as RecoverySweepResult, yr as RecoveryReport } from "../Admin-BbTZHSLu.mjs";
3
3
  export { ApprovalSuspensionError, DurableAbortFailure, DurableAgentRuntime, DurableApprovalFailure, DurableApprovalResolver, DurableApprovalSuspension, DurableAwaitFailure, DurableExplainFailure, DurableObligationFailure, DurableObserveOptions, DurableProgressFailure, DurableResolveFailure, DurableRetryFailure, DurableRuntimeConfig, DurableRuntimeConfigOptions, DurableSubmitAgent, DurableSubmitFailure, DurableSubmitOptions, DurableVerifyFailure, DurableWorkerFailure, DurableWorkerRequirements, Receipt, RecoveryBlocked, RecoveryFailure, RecoveryReport, RecoverySweepOptions, RecoverySweepResult, childReservationIdFor, isolateRecovery, recoveryRepairBatchId, recoveryRepairRecordId, threadCreatedBatchId, threadCreatedRecordId };
@@ -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-BQzYkFVy.mjs";
3
- import { c as threadCreatedBatchId, l as threadCreatedRecordId } from "../WorkerAdmission-CNbm4o_x.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";
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 };
@@ -1,2 +1,2 @@
1
- import { a as makeEventSource, i as NormalizedEvent, r as EventSources, t as EventSource } from "../EventSource-C8CKwQy5.mjs";
1
+ import { a as makeEventSource, i as NormalizedEvent, r as EventSources, t as EventSource } from "../EventSource-CETtQTiH.mjs";
2
2
  export { EventSource, EventSources, NormalizedEvent, makeEventSource };
@@ -1,7 +1,7 @@
1
1
  import { r as Principal } from "../Receipt-BAHyigAF.mjs";
2
- import "../Admin-BjmupLN3.mjs";
3
- import { E as SubscriptionSourceError } from "../Subscription-BomcQ9_W.mjs";
4
- import { t as EventSource } from "../EventSource-C8CKwQy5.mjs";
2
+ import "../Admin-BbTZHSLu.mjs";
3
+ import { E as SubscriptionSourceError } from "../Subscription-DaMCppa_.mjs";
4
+ import { t as EventSource } from "../EventSource-CETtQTiH.mjs";
5
5
  import { SubscriptionFailure, SubscriptionIntake } from "./Subscriptions.mjs";
6
6
  import { Context, Effect, Layer, Redacted, Schema } from "effect";
7
7
  import { HttpClient } from "effect/unstable/http";
@@ -1,2 +1,2 @@
1
- import { Ci as drainLifecyclePublications, Ti as lifecyclePublicationLayer, _i as LifecyclePublicationError, bi as LifecyclePublicationSource, gi as LifecyclePublicationConfig, hi as LifecyclePublicationBatch, mi as LifecyclePublication, vi as LifecyclePublicationFact, wi as lifecyclePublicationBatchMaxFacts, xi as LifecyclePublicationStorage, yi as LifecyclePublicationHandler } from "../Admin-BjmupLN3.mjs";
1
+ import { Ci as drainLifecyclePublications, Ti as lifecyclePublicationLayer, _i as LifecyclePublicationError, bi as LifecyclePublicationSource, gi as LifecyclePublicationConfig, hi as LifecyclePublicationBatch, mi as LifecyclePublication, vi as LifecyclePublicationFact, wi as lifecyclePublicationBatchMaxFacts, xi as LifecyclePublicationStorage, yi as LifecyclePublicationHandler } from "../Admin-BbTZHSLu.mjs";
2
2
  export { LifecyclePublication, LifecyclePublicationBatch, LifecyclePublicationConfig, LifecyclePublicationError, LifecyclePublicationFact, LifecyclePublicationHandler, LifecyclePublicationSource, LifecyclePublicationStorage, drainLifecyclePublications, lifecyclePublicationBatchMaxFacts, lifecyclePublicationLayer };
@@ -162,9 +162,9 @@ const withSource = Effect.fn("LifecyclePublication.withSource")(function* (publi
162
162
  * Finish independent owner batches before surfacing failures; interruption stops the wave.
163
163
  * Acknowledgements are exact and idempotent. No producer or external Tool is re-executed here.
164
164
  */
165
- const drainLifecyclePublications = Effect.fn("LifecyclePublication.drain")(function* (storage, timeoutMillis = 1e4, limit = 4) {
165
+ const drainLifecyclePublications = Effect.fn("LifecyclePublication.drain")(function* (storage, timeoutMillis = 1e4, limit = 4, options) {
166
166
  const handler = yield* LifecyclePublicationHandler;
167
- const pending = yield* storage.pending(yield* Clock.currentTimeMillis, limit);
167
+ const pending = yield* storage.pending(yield* Clock.currentTimeMillis, limit, options);
168
168
  let failures = Cause.empty;
169
169
  for (const batch of pending) yield* Effect.gen(function* () {
170
170
  if (!(yield* storage.claim(batch, yield* Clock.currentTimeMillis, timeoutMillis))) return;
@@ -1 +1 @@
1
- {"version":3,"file":"LifecyclePublication.mjs","names":[],"sources":["../../src/durable/LifecyclePublication.ts"],"sourcesContent":["import { Cause, Clock, Context, Crypto, Effect, Layer, Option, Schema, type Scope } from \"effect\";\n\nimport { SubmissionId, ThreadId } from \"../core/Identifiers.ts\";\nimport { Receipt } from \"../core/Receipt.ts\";\nimport { AssignmentTerminal } from \"../core/Worker.ts\";\nimport { MessageDeliveryKey } from \"./MessageDelivery.ts\";\nimport {\n AbortRequested,\n AgentUpdateEmitted,\n CanonicalSequence,\n RunStartedRecord,\n SubagentJoined,\n SubagentRequested,\n SubagentStarted,\n SubmissionSettledRecord,\n ToolApprovalDecided,\n ToolApprovalRequested,\n UserInputRecorded,\n WorkerInputCompleted,\n WorkerInputRequested,\n WorkerStopRequested,\n} from \"./Records.ts\";\nimport {\n AbortIntent,\n Settlement,\n SubmissionLedger,\n SubmissionLookupById,\n SubmissionSnapshot,\n SuspensionReason,\n} from \"./SubmissionLedger.ts\";\nimport { PreparedInput } from \"./Subscription.ts\";\nimport { getRunInput } from \"./ThreadStore.ts\";\n\n/** Immutable native admission evidence. It is private and grants no application authority. */\nexport const LifecyclePublicationSource = SubmissionSnapshot.mapFields((fields) => ({\n submissionId: fields.submissionId,\n threadId: fields.threadId,\n queueSequence: fields.queueSequence,\n principal: fields.principal,\n idempotencyKey: fields.idempotencyKey,\n agentId: fields.agentId,\n agentDigests: fields.agentDigests,\n inputPayload: fields.inputPayload,\n inputDigest: fields.inputDigest,\n receiptId: fields.receiptId,\n parentLinkage: fields.parentLinkage,\n workerAdmission: fields.workerAdmission,\n messageAdmission: fields.messageAdmission,\n createdAt: fields.createdAt,\n}));\n\nexport type LifecyclePublicationSource = typeof LifecyclePublicationSource.Type;\n\n/** Closed producer facts; model history, Tool payloads and diagnostics are not a publication API. */\nexport const LifecyclePublicationFact = Schema.Union([\n Schema.TaggedStruct(\"DeliveryRetained\", {\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n createdAtMillis: Schema.Natural,\n }),\n Schema.TaggedStruct(\"DeliveryChanged\", {\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n status: Schema.Literals([\"pending\", \"accepted\", \"processed\", \"refused\", \"parked\"]),\n receipt: Schema.NullOr(Receipt),\n settlement: Schema.NullOr(Settlement),\n version: Schema.Natural,\n }),\n Schema.TaggedStruct(\"WorkerInboxSealed\", {\n threadId: ThreadId,\n activeSubmissionIds: Schema.Array(SubmissionId),\n /** First native seal winner; null is an explicit stop rather than assignment completion. */\n terminal: Schema.NullOr(AssignmentTerminal),\n }),\n Schema.TaggedStruct(\"SubmissionReady\", { submissionId: SubmissionId }),\n Schema.TaggedStruct(\"SubmissionSuspended\", {\n submissionId: SubmissionId,\n reason: SuspensionReason,\n }),\n Schema.TaggedStruct(\"SubmissionUnknown\", { submissionId: SubmissionId }),\n Schema.TaggedStruct(\"SubmissionResumed\", { submissionId: SubmissionId }),\n Schema.TaggedStruct(\"AbortIntentRecorded\", { intent: AbortIntent }),\n UserInputRecorded,\n RunStartedRecord,\n AgentUpdateEmitted,\n ToolApprovalRequested,\n ToolApprovalDecided,\n AbortRequested,\n WorkerInputCompleted,\n WorkerInputRequested,\n WorkerStopRequested,\n SubagentRequested,\n SubagentStarted,\n SubagentJoined,\n SubmissionSettledRecord,\n]);\n\nexport type LifecyclePublicationFact = typeof LifecyclePublicationFact.Type;\n\n/**\n * An exact undelivered native fact. `id` is stable across retries and lost acknowledgements.\n * Ordinals order facts only within ownerThreadId. Accepted input order is source.queueSequence;\n * never compare ordinals from the launching Thread and its worker Thread.\n */\nexport class LifecyclePublication extends Schema.Class<LifecyclePublication>(\n \"@effect-agent/thread/LifecyclePublication\",\n)({\n id: Schema.NonEmptyString.check(Schema.isMaxLength(4096)),\n ownerThreadId: ThreadId,\n ordinal: Schema.Int.check(Schema.isGreaterThan(0)),\n createdAt: Schema.DateTimeUtcFromString,\n canonicalSequence: Schema.optionalKey(CanonicalSequence),\n source: Schema.optionalKey(LifecyclePublicationSource),\n fact: LifecyclePublicationFact,\n}) {}\n\nexport class LifecyclePublicationError extends Schema.TaggedError<LifecyclePublicationError>()(\n \"LifecyclePublicationError\",\n {\n reason: Schema.Literals([\"unavailable\", \"conflict\", \"corrupt\", \"capacity\"]),\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** Bound both retained facts and the immutable admission evidence resolved before dispatch. */\nexport const lifecyclePublicationBatchMaxFacts = 8;\n\n/** One owner's bounded pending prefix, strictly ordered by its durable ordinals. */\nexport const LifecyclePublicationBatch = Schema.NonEmptyArray(LifecyclePublication).check(\n Schema.isMaxLength(lifecyclePublicationBatchMaxFacts),\n Schema.makeFilter(\n (facts) =>\n facts.every((fact, index) => {\n const previous = facts[index - 1];\n\n return (\n fact.ownerThreadId === facts[0].ownerThreadId &&\n (previous === undefined || fact.ordinal > previous.ordinal)\n );\n }),\n { expected: \"One owner with strictly increasing publication ordinals\" },\n ),\n);\n\nexport type LifecyclePublicationBatch = typeof LifecyclePublicationBatch.Type;\n\n/** Native recovery state, independent of Attempts. Hosts serialize drains per storage owner. */\nexport interface LifecyclePublicationStorage {\n /** Select up to `limit` due owners, with a bounded pending prefix for each selected owner. */\n readonly pending: (\n nowMillis: number,\n limit: number,\n ) => Effect.Effect<ReadonlyArray<LifecyclePublicationBatch>, LifecyclePublicationError>;\n /** Atomically acknowledge the exact batch, retaining its identities and fingerprints. */\n readonly acknowledge: (\n publications: LifecyclePublicationBatch,\n ) => Effect.Effect<void, LifecyclePublicationError>;\n /**\n * Claim a due owner batch and persist its retry before dispatch. Eight automatic attempts;\n * 1s exponential backoff capped at 60s, after the dispatch timeout. The final attempt parks\n * the payload before dispatch so process loss cannot renew its budget. False means not due.\n */\n readonly claim: (\n publications: LifecyclePublicationBatch,\n nowMillis: number,\n timeoutMillis: number,\n ) => Effect.Effect<boolean, LifecyclePublicationError>;\n readonly pendingDeadline: Effect.Effect<Option.Option<number>, LifecyclePublicationError>;\n /** Explicit operator retry after repairing a parked owner's destination. */\n readonly retryParked: (\n ownerThreadId: ThreadId,\n nowMillis: number,\n ) => Effect.Effect<void, LifecyclePublicationError>;\n}\n\n/**\n * Publish one owner's ordered batch in one idempotent host transaction, including authorization,\n * records, receipts and delivery intents. Larger backlogs continue in later batches.\n * Return only after the entire batch commits. Retries\n * may include already committed identities plus later facts; deduplicate each fact's `id`.\n * Private input/update/result fields remain private; select declared public fields explicitly.\n * Revocation/deletion is an acknowledged domain decision, not an infrastructure retry.\n */\nexport class LifecyclePublicationHandler extends Context.Service<\n LifecyclePublicationHandler,\n {\n readonly publish: (\n publications: LifecyclePublicationBatch,\n ) => Effect.Effect<void, LifecyclePublicationError, Scope.Scope>;\n }\n>()(\"@effect-agent/thread/LifecyclePublicationHandler\") {}\n\n/** Adapter configuration; the opt-in layer captures its explicit Crypto requirement once. */\nexport const LifecyclePublicationConfig = Context.Reference<Option.Option<Crypto.Crypto>>(\n \"@effect-agent/thread/LifecyclePublicationConfig\",\n { defaultValue: () => Option.none() },\n);\n\n/** Enable native SQL obligations without changing dependencies of disabled storage assemblies. */\nexport const lifecyclePublicationLayer = Layer.effect(LifecyclePublicationConfig)(\n Effect.map(Crypto.Crypto, Option.some),\n);\n\n/** Resolve immutable evidence by its exact native identity, never by scanning execution history. */\nconst withSource = Effect.fn(\"LifecyclePublication.withSource\")(\n function* (publication: LifecyclePublication) {\n if (\n publication.source !== undefined ||\n (publication.fact._tag === \"WorkerInputCompleted\" &&\n publication.fact.workerThreadId !== publication.ownerThreadId)\n )\n return publication;\n const fact = publication.fact;\n\n let submissionId =\n fact._tag === \"AbortIntentRecorded\"\n ? fact.intent.submissionId\n : \"submissionId\" in fact\n ? fact.submissionId\n : undefined;\n\n const runId =\n fact._tag === \"AgentUpdateEmitted\"\n ? fact.update.runId\n : \"runId\" in fact\n ? fact.runId\n : undefined;\n\n if (submissionId === undefined && runId !== undefined) {\n const input = yield* getRunInput({ threadId: publication.ownerThreadId, runId });\n\n if (Option.isNone(input) || input.value.record.payload._tag !== \"UserInputRecorded\")\n return yield* LifecyclePublicationError.make({ reason: \"unavailable\" });\n submissionId = input.value.record.payload.submissionId;\n }\n if (submissionId === undefined) return publication;\n const ledger = yield* SubmissionLedger;\n const found = yield* ledger.lookup(SubmissionLookupById.make({ submissionId }));\n\n if (Option.isNone(found))\n return yield* LifecyclePublicationError.make({ reason: \"unavailable\" });\n\n const source = yield* Schema.decodeEffect(Schema.toType(LifecyclePublicationSource))(\n found.value,\n );\n\n return LifecyclePublication.make({ ...publication, source });\n },\n Effect.mapError((cause) => LifecyclePublicationError.make({ reason: \"unavailable\", cause })),\n);\n\n/**\n * One finite wave for the host's existing maintenance coordinator. Persist the next deadline\n * before dispatch, so interruption and process loss retain the same facts without another timer.\n * Finish independent owner batches before surfacing failures; interruption stops the wave.\n * Acknowledgements are exact and idempotent. No producer or external Tool is re-executed here.\n */\nexport const drainLifecyclePublications = Effect.fn(\"LifecyclePublication.drain\")(function* (\n storage: LifecyclePublicationStorage,\n timeoutMillis = 10_000,\n limit = 4,\n) {\n const handler = yield* LifecyclePublicationHandler;\n const pending = yield* storage.pending(yield* Clock.currentTimeMillis, limit);\n\n let failures: Cause.Cause<LifecyclePublicationError> = Cause.empty;\n\n for (const batch of pending) {\n yield* Effect.gen(function* () {\n if (!(yield* storage.claim(batch, yield* Clock.currentTimeMillis, timeoutMillis))) return;\n yield* Effect.scoped(\n Effect.gen(function* () {\n const publications = yield* Effect.forEach(batch, withSource);\n\n yield* handler.publish(publications);\n }),\n ).pipe(\n Effect.timeoutOrElse({\n duration: timeoutMillis,\n orElse: () => LifecyclePublicationError.make({ reason: \"unavailable\" }),\n }),\n );\n yield* storage.acknowledge(batch);\n }).pipe(\n Effect.catchCauseIf(\n (cause) => !Cause.hasInterrupts(cause),\n (cause) => {\n failures = Cause.combine(failures, cause);\n\n return Effect.void;\n },\n ),\n );\n }\n if (failures.reasons.length > 0) return yield* Effect.failCause(failures);\n\n return pending.length;\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"LifecyclePublication.mjs","names":[],"sources":["../../src/durable/LifecyclePublication.ts"],"sourcesContent":["import { Cause, Clock, Context, Crypto, Effect, Layer, Option, Schema, type Scope } from \"effect\";\n\nimport { SubmissionId, ThreadId } from \"../core/Identifiers.ts\";\nimport { Receipt } from \"../core/Receipt.ts\";\nimport { AssignmentTerminal } from \"../core/Worker.ts\";\nimport { MessageDeliveryKey } from \"./MessageDelivery.ts\";\nimport {\n AbortRequested,\n AgentUpdateEmitted,\n CanonicalSequence,\n RunStartedRecord,\n SubagentJoined,\n SubagentRequested,\n SubagentStarted,\n SubmissionSettledRecord,\n ToolApprovalDecided,\n ToolApprovalRequested,\n UserInputRecorded,\n WorkerInputCompleted,\n WorkerInputRequested,\n WorkerStopRequested,\n} from \"./Records.ts\";\nimport {\n AbortIntent,\n Settlement,\n SubmissionLedger,\n SubmissionLookupById,\n SubmissionSnapshot,\n SuspensionReason,\n} from \"./SubmissionLedger.ts\";\nimport { PreparedInput } from \"./Subscription.ts\";\nimport { getRunInput } from \"./ThreadStore.ts\";\n\n/** Immutable native admission evidence. It is private and grants no application authority. */\nexport const LifecyclePublicationSource = SubmissionSnapshot.mapFields((fields) => ({\n submissionId: fields.submissionId,\n threadId: fields.threadId,\n queueSequence: fields.queueSequence,\n principal: fields.principal,\n idempotencyKey: fields.idempotencyKey,\n agentId: fields.agentId,\n agentDigests: fields.agentDigests,\n inputPayload: fields.inputPayload,\n inputDigest: fields.inputDigest,\n receiptId: fields.receiptId,\n parentLinkage: fields.parentLinkage,\n workerAdmission: fields.workerAdmission,\n messageAdmission: fields.messageAdmission,\n createdAt: fields.createdAt,\n}));\n\nexport type LifecyclePublicationSource = typeof LifecyclePublicationSource.Type;\n\n/** Closed producer facts; model history, Tool payloads and diagnostics are not a publication API. */\nexport const LifecyclePublicationFact = Schema.Union([\n Schema.TaggedStruct(\"DeliveryRetained\", {\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n createdAtMillis: Schema.Natural,\n }),\n Schema.TaggedStruct(\"DeliveryChanged\", {\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n status: Schema.Literals([\"pending\", \"accepted\", \"processed\", \"refused\", \"parked\"]),\n receipt: Schema.NullOr(Receipt),\n settlement: Schema.NullOr(Settlement),\n version: Schema.Natural,\n }),\n Schema.TaggedStruct(\"WorkerInboxSealed\", {\n threadId: ThreadId,\n activeSubmissionIds: Schema.Array(SubmissionId),\n /** First native seal winner; null is an explicit stop rather than assignment completion. */\n terminal: Schema.NullOr(AssignmentTerminal),\n }),\n Schema.TaggedStruct(\"SubmissionReady\", { submissionId: SubmissionId }),\n Schema.TaggedStruct(\"SubmissionSuspended\", {\n submissionId: SubmissionId,\n reason: SuspensionReason,\n }),\n Schema.TaggedStruct(\"SubmissionUnknown\", { submissionId: SubmissionId }),\n Schema.TaggedStruct(\"SubmissionResumed\", { submissionId: SubmissionId }),\n Schema.TaggedStruct(\"AbortIntentRecorded\", { intent: AbortIntent }),\n UserInputRecorded,\n RunStartedRecord,\n AgentUpdateEmitted,\n ToolApprovalRequested,\n ToolApprovalDecided,\n AbortRequested,\n WorkerInputCompleted,\n WorkerInputRequested,\n WorkerStopRequested,\n SubagentRequested,\n SubagentStarted,\n SubagentJoined,\n SubmissionSettledRecord,\n]);\n\nexport type LifecyclePublicationFact = typeof LifecyclePublicationFact.Type;\n\n/**\n * An exact undelivered native fact. `id` is stable across retries and lost acknowledgements.\n * Ordinals order facts only within ownerThreadId. Accepted input order is source.queueSequence;\n * never compare ordinals from the launching Thread and its worker Thread.\n */\nexport class LifecyclePublication extends Schema.Class<LifecyclePublication>(\n \"@effect-agent/thread/LifecyclePublication\",\n)({\n id: Schema.NonEmptyString.check(Schema.isMaxLength(4096)),\n ownerThreadId: ThreadId,\n ordinal: Schema.Int.check(Schema.isGreaterThan(0)),\n createdAt: Schema.DateTimeUtcFromString,\n canonicalSequence: Schema.optionalKey(CanonicalSequence),\n source: Schema.optionalKey(LifecyclePublicationSource),\n fact: LifecyclePublicationFact,\n}) {}\n\nexport class LifecyclePublicationError extends Schema.TaggedError<LifecyclePublicationError>()(\n \"LifecyclePublicationError\",\n {\n reason: Schema.Literals([\"unavailable\", \"conflict\", \"corrupt\", \"capacity\"]),\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** Bound both retained facts and the immutable admission evidence resolved before dispatch. */\nexport const lifecyclePublicationBatchMaxFacts = 8;\n\n/** One owner's bounded pending prefix, strictly ordered by its durable ordinals. */\nexport const LifecyclePublicationBatch = Schema.NonEmptyArray(LifecyclePublication).check(\n Schema.isMaxLength(lifecyclePublicationBatchMaxFacts),\n Schema.makeFilter(\n (facts) =>\n facts.every((fact, index) => {\n const previous = facts[index - 1];\n\n return (\n fact.ownerThreadId === facts[0].ownerThreadId &&\n (previous === undefined || fact.ordinal > previous.ordinal)\n );\n }),\n { expected: \"One owner with strictly increasing publication ordinals\" },\n ),\n);\n\nexport type LifecyclePublicationBatch = typeof LifecyclePublicationBatch.Type;\n\n/** Native recovery state, independent of Attempts. Hosts serialize drains per storage owner. */\nexport interface LifecyclePublicationStorage {\n /** Select up to `limit` due owners, with a bounded pending prefix for each selected owner.\n * `retainedOnly` excludes unmaterialized source facts, for a precommitted start prefix.\n */\n readonly pending: (\n nowMillis: number,\n limit: number,\n options?: { readonly retainedOnly?: boolean },\n ) => Effect.Effect<ReadonlyArray<LifecyclePublicationBatch>, LifecyclePublicationError>;\n /** Atomically acknowledge the exact batch, retaining its identities and fingerprints. */\n readonly acknowledge: (\n publications: LifecyclePublicationBatch,\n ) => Effect.Effect<void, LifecyclePublicationError>;\n /**\n * Claim a due owner batch and persist its retry before dispatch. Eight automatic attempts;\n * 1s exponential backoff capped at 60s, after the dispatch timeout. The final attempt parks\n * the payload before dispatch so process loss cannot renew its budget. False means not due.\n */\n readonly claim: (\n publications: LifecyclePublicationBatch,\n nowMillis: number,\n timeoutMillis: number,\n ) => Effect.Effect<boolean, LifecyclePublicationError>;\n readonly pendingDeadline: Effect.Effect<Option.Option<number>, LifecyclePublicationError>;\n /**\n * Deadline for `pending(..., { retainedOnly: true })`, excluding unmaterialized source facts.\n * Source-backed stores provide this when `pendingDeadline` also includes source intent.\n * Otherwise `pendingDeadline` already describes retained work.\n */\n readonly retainedPendingDeadline?: Effect.Effect<\n Option.Option<number>,\n LifecyclePublicationError\n >;\n /** Explicit operator retry after repairing a parked owner's destination. */\n readonly retryParked: (\n ownerThreadId: ThreadId,\n nowMillis: number,\n ) => Effect.Effect<void, LifecyclePublicationError>;\n}\n\n/**\n * Publish one owner's ordered batch in one idempotent host transaction, including authorization,\n * records, receipts and delivery intents. Larger backlogs continue in later batches.\n * Return only after the entire batch commits. Retries\n * may include already committed identities plus later facts; deduplicate each fact's `id`.\n * Private input/update/result fields remain private; select declared public fields explicitly.\n * Revocation/deletion is an acknowledged domain decision, not an infrastructure retry.\n */\nexport class LifecyclePublicationHandler extends Context.Service<\n LifecyclePublicationHandler,\n {\n readonly publish: (\n publications: LifecyclePublicationBatch,\n ) => Effect.Effect<void, LifecyclePublicationError, Scope.Scope>;\n }\n>()(\"@effect-agent/thread/LifecyclePublicationHandler\") {}\n\n/** Adapter configuration; the opt-in layer captures its explicit Crypto requirement once. */\nexport const LifecyclePublicationConfig = Context.Reference<Option.Option<Crypto.Crypto>>(\n \"@effect-agent/thread/LifecyclePublicationConfig\",\n { defaultValue: () => Option.none() },\n);\n\n/** Enable native SQL obligations without changing dependencies of disabled storage assemblies. */\nexport const lifecyclePublicationLayer = Layer.effect(LifecyclePublicationConfig)(\n Effect.map(Crypto.Crypto, Option.some),\n);\n\n/** Resolve immutable evidence by its exact native identity, never by scanning execution history. */\nconst withSource = Effect.fn(\"LifecyclePublication.withSource\")(\n function* (publication: LifecyclePublication) {\n if (\n publication.source !== undefined ||\n (publication.fact._tag === \"WorkerInputCompleted\" &&\n publication.fact.workerThreadId !== publication.ownerThreadId)\n )\n return publication;\n const fact = publication.fact;\n\n let submissionId =\n fact._tag === \"AbortIntentRecorded\"\n ? fact.intent.submissionId\n : \"submissionId\" in fact\n ? fact.submissionId\n : undefined;\n\n const runId =\n fact._tag === \"AgentUpdateEmitted\"\n ? fact.update.runId\n : \"runId\" in fact\n ? fact.runId\n : undefined;\n\n if (submissionId === undefined && runId !== undefined) {\n const input = yield* getRunInput({ threadId: publication.ownerThreadId, runId });\n\n if (Option.isNone(input) || input.value.record.payload._tag !== \"UserInputRecorded\")\n return yield* LifecyclePublicationError.make({ reason: \"unavailable\" });\n submissionId = input.value.record.payload.submissionId;\n }\n if (submissionId === undefined) return publication;\n const ledger = yield* SubmissionLedger;\n const found = yield* ledger.lookup(SubmissionLookupById.make({ submissionId }));\n\n if (Option.isNone(found))\n return yield* LifecyclePublicationError.make({ reason: \"unavailable\" });\n\n const source = yield* Schema.decodeEffect(Schema.toType(LifecyclePublicationSource))(\n found.value,\n );\n\n return LifecyclePublication.make({ ...publication, source });\n },\n Effect.mapError((cause) => LifecyclePublicationError.make({ reason: \"unavailable\", cause })),\n);\n\n/**\n * One finite wave for the host's existing maintenance coordinator. Persist the next deadline\n * before dispatch, so interruption and process loss retain the same facts without another timer.\n * Finish independent owner batches before surfacing failures; interruption stops the wave.\n * Acknowledgements are exact and idempotent. No producer or external Tool is re-executed here.\n */\nexport const drainLifecyclePublications = Effect.fn(\"LifecyclePublication.drain\")(function* (\n storage: LifecyclePublicationStorage,\n timeoutMillis = 10_000,\n limit = 4,\n options?: { readonly retainedOnly?: boolean },\n) {\n const handler = yield* LifecyclePublicationHandler;\n const pending = yield* storage.pending(yield* Clock.currentTimeMillis, limit, options);\n\n let failures: Cause.Cause<LifecyclePublicationError> = Cause.empty;\n\n for (const batch of pending) {\n yield* Effect.gen(function* () {\n if (!(yield* storage.claim(batch, yield* Clock.currentTimeMillis, timeoutMillis))) return;\n yield* Effect.scoped(\n Effect.gen(function* () {\n const publications = yield* Effect.forEach(batch, withSource);\n\n yield* handler.publish(publications);\n }),\n ).pipe(\n Effect.timeoutOrElse({\n duration: timeoutMillis,\n orElse: () => LifecyclePublicationError.make({ reason: \"unavailable\" }),\n }),\n );\n yield* storage.acknowledge(batch);\n }).pipe(\n Effect.catchCauseIf(\n (cause) => !Cause.hasInterrupts(cause),\n (cause) => {\n failures = Cause.combine(failures, cause);\n\n return Effect.void;\n },\n ),\n );\n }\n if (failures.reasons.length > 0) return yield* Effect.failCause(failures);\n\n return pending.length;\n});\n"],"mappings":"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"}
@@ -4,10 +4,10 @@ import { a as Receipt, t as IdempotencyKey } from "../Receipt-BAHyigAF.mjs";
4
4
  import { r as Update } from "../AgentUpdates-DMJ-_xow.mjs";
5
5
  import { a as FailureDiagnostic_d_exports, r as Diagnostic } from "../FailureDiagnostic-CaAkzGHL.mjs";
6
6
  import { t as AgentPolicy } from "../AgentPolicy-CnXWWwdg.mjs";
7
- import { h as DefinitionDigests } from "../Records-BrEpibum.mjs";
8
- import { fn as Settlement, xi as LifecyclePublicationStorage } from "../Admin-BjmupLN3.mjs";
9
- import { a as PreparedInput } from "../Subscription-BomcQ9_W.mjs";
10
- import { t as PreparedInputAdmission } from "../PreparedInputAdmission-CU1PzUVD.mjs";
7
+ import { h as DefinitionDigests } from "../Records-BxGWRs-t.mjs";
8
+ import { fn as Settlement, xi as LifecyclePublicationStorage } from "../Admin-BbTZHSLu.mjs";
9
+ import { a as PreparedInput } from "../Subscription-DaMCppa_.mjs";
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
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 };