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.
- package/dist/{Admin-BjmupLN3.d.mts → Admin-BbTZHSLu.d.mts} +23 -11
- package/dist/{Agent-1DMSO_Fl.mjs → Agent-BMATXYsI.mjs} +9 -2
- package/dist/Agent-BMATXYsI.mjs.map +1 -0
- package/dist/{AgentRuntime-BAjT5gXl.d.mts → AgentRuntime-BPlAn5nA.d.mts} +6 -6
- package/dist/{AgentRuntime-IF_1GoUf.mjs → AgentRuntime-GQACxY_m.mjs} +21 -5
- package/dist/AgentRuntime-GQACxY_m.mjs.map +1 -0
- package/dist/{Digest-CaJ2RIsF.d.mts → Digest-CNHImGy0.d.mts} +2 -2
- package/dist/{DurableAgentRuntime-BQzYkFVy.mjs → DurableAgentRuntime-BAQvZK1e.mjs} +30 -18
- package/dist/DurableAgentRuntime-BAQvZK1e.mjs.map +1 -0
- package/dist/{EventSource-C8CKwQy5.d.mts → EventSource-CETtQTiH.d.mts} +3 -3
- package/dist/InMemory.d.mts +1 -1
- package/dist/{PreparedInputAdmission-CU1PzUVD.d.mts → PreparedInputAdmission-Swp9t800.d.mts} +4 -4
- package/dist/{Records-BrEpibum.d.mts → Records-BxGWRs-t.d.mts} +2 -2
- package/dist/{RunEvent-DV_llBcq.d.mts → RunEvent-D0aepYwN.d.mts} +2 -2
- package/dist/{RunEventSink-D5aVhISG.d.mts → RunEventSink-DsbcGXog.d.mts} +2 -2
- package/dist/{RunOptions-CkRYnlJa.d.mts → RunOptions-GjDlAuKh.d.mts} +5 -2
- package/dist/{Schedule-B_z7PMg-.d.mts → Schedule-B94iS2X3.d.mts} +2 -2
- package/dist/{Subagent-Dld4W1BY.d.mts → Subagent-CLaMeZKu.d.mts} +6 -6
- package/dist/{Subagent-CmFtZaeI.mjs → Subagent-JjcidJ7q.mjs} +2 -2
- package/dist/{Subagent-CmFtZaeI.mjs.map → Subagent-JjcidJ7q.mjs.map} +1 -1
- package/dist/{Subscription-BomcQ9_W.d.mts → Subscription-DaMCppa_.d.mts} +4 -4
- package/dist/{SubscriptionInput-gpZSR9vB.d.mts → SubscriptionInput-B0ZtrQoY.d.mts} +3 -3
- package/dist/{ThreadHistory-ZEu_ja6L.d.mts → ThreadHistory-FD-o4TsR.d.mts} +2 -2
- package/dist/{Usage-Dx0aknfk.d.mts → Usage-BNjPR7Zr.d.mts} +9 -1
- package/dist/{WorkerAdmission-CNbm4o_x.mjs → WorkerAdmission-N9hZV85Q.mjs} +2 -2
- package/dist/{WorkerAdmission-CNbm4o_x.mjs.map → WorkerAdmission-N9hZV85Q.mjs.map} +1 -1
- package/dist/{agent-registration-U3kmV7nW.mjs → agent-registration-BIOzAej4.mjs} +10 -1
- package/dist/agent-registration-BIOzAej4.mjs.map +1 -0
- package/dist/capabilities/Commands.d.mts +1 -1
- package/dist/capabilities/Redaction.d.mts +1 -1
- package/dist/capabilities/RunHooks.d.mts +1 -1
- package/dist/capabilities/Subagent.d.mts +1 -1
- package/dist/capabilities/Subagent.mjs +1 -1
- package/dist/capabilities/ToolDiscovery.d.mts +5 -0
- package/dist/capabilities/ToolDiscovery.mjs +18 -9
- package/dist/capabilities/ToolDiscovery.mjs.map +1 -1
- package/dist/capabilities/WebSearch.d.mts +5 -1
- package/dist/capabilities/WebSearch.mjs +9 -1
- package/dist/capabilities/WebSearch.mjs.map +1 -1
- package/dist/core/Agent.mjs +1 -1
- package/dist/core/RunEvent.d.mts +1 -1
- package/dist/core/Usage.d.mts +1 -1
- package/dist/core/Usage.mjs +22 -1
- package/dist/core/Usage.mjs.map +1 -1
- package/dist/durable/ActivityStore.d.mts +1 -1
- package/dist/durable/Admin.d.mts +1 -1
- package/dist/durable/AgentRegistration.d.mts +1 -1
- package/dist/durable/AgentRegistration.mjs +1 -1
- package/dist/durable/Certification.d.mts +1 -1
- package/dist/durable/CommittedActivity.d.mts +3 -3
- package/dist/durable/Digest.d.mts +1 -1
- package/dist/durable/DurableAgentRuntime.d.mts +1 -1
- package/dist/durable/DurableAgentRuntime.mjs +2 -2
- package/dist/durable/EventSource.d.mts +1 -1
- package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
- package/dist/durable/LifecyclePublication.d.mts +1 -1
- package/dist/durable/LifecyclePublication.mjs +2 -2
- package/dist/durable/LifecyclePublication.mjs.map +1 -1
- package/dist/durable/MessageDelivery.d.mts +4 -4
- package/dist/durable/MessageDeliveryStoreConformance.d.mts +41 -41
- package/dist/durable/PersistentHistory.d.mts +2 -2
- package/dist/durable/PreparedInputAdmission.d.mts +1 -1
- package/dist/durable/Records.d.mts +1 -1
- package/dist/durable/Recovery.d.mts +1 -1
- package/dist/durable/RunJournal.d.mts +1 -1
- package/dist/durable/Schedule.d.mts +1 -1
- package/dist/durable/ScheduleStoreConformance.d.mts +1 -1
- package/dist/durable/ScheduleTransition.d.mts +1 -1
- package/dist/durable/Scheduling.d.mts +3 -3
- package/dist/durable/SubmissionLedger.d.mts +1 -1
- package/dist/durable/SubmissionLedgerConformance.d.mts +2 -2
- package/dist/durable/SubmissionStatus.d.mts +1 -1
- package/dist/durable/Subscription.d.mts +1 -1
- package/dist/durable/SubscriptionInput.d.mts +1 -1
- package/dist/durable/SubscriptionInput.mjs +1 -1
- package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
- package/dist/durable/SubscriptionTools.d.mts +4 -4
- package/dist/durable/SubscriptionTransition.d.mts +1 -1
- package/dist/durable/Subscriptions.d.mts +6 -6
- package/dist/durable/ThreadContextHistory.d.mts +1 -1
- package/dist/durable/ThreadContextHistoryProjection.d.mts +1 -1
- package/dist/durable/ThreadInvariants.d.mts +2 -2
- package/dist/durable/ThreadProjection.d.mts +1 -1
- package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
- package/dist/durable/ThreadStore.d.mts +1 -1
- package/dist/durable/ThreadStoreConformance.d.mts +1 -1
- package/dist/durable/WorkerAdmission.d.mts +2 -2
- package/dist/durable/WorkerAdmission.mjs +1 -1
- package/dist/durable/WorkerHost.d.mts +2 -2
- package/dist/engine/AgentRuntime.d.mts +1 -1
- package/dist/engine/AgentRuntime.mjs +1 -1
- package/dist/engine/RunEventSink.d.mts +1 -1
- package/dist/engine/RunOptions.d.mts +1 -1
- package/dist/engine/RunOptions.mjs +1 -0
- package/dist/engine/RunOptions.mjs.map +1 -1
- package/dist/engine/ThreadHistory.d.mts +1 -1
- package/dist/index.d.mts +15 -15
- package/dist/index.mjs +5 -5
- package/package.json +1 -1
- package/src/capabilities/ToolDiscovery.ts +24 -10
- package/src/capabilities/WebSearch.ts +15 -0
- package/src/core/Agent.ts +16 -2
- package/src/core/Usage.ts +41 -0
- package/src/durable/DurableAgentRuntime.ts +40 -12
- package/src/durable/LifecyclePublication.ts +15 -2
- package/src/durable/internal/agent-registration.ts +11 -0
- package/src/engine/RunOptions.ts +3 -0
- package/src/engine/internal/agent-runtime.ts +68 -5
- package/dist/Agent-1DMSO_Fl.mjs.map +0 -1
- package/dist/AgentRuntime-IF_1GoUf.mjs.map +0 -1
- package/dist/DurableAgentRuntime-BQzYkFVy.mjs.map +0 -1
- package/dist/agent-registration-U3kmV7nW.mjs.map +0 -1
package/dist/core/Agent.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as make, i as isModelResolver, n as ToolInspection, o as withModel, r as inspectTools } from "../Agent-
|
|
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 };
|
package/dist/core/RunEvent.d.mts
CHANGED
|
@@ -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-
|
|
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 };
|
package/dist/core/Usage.d.mts
CHANGED
|
@@ -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-
|
|
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 };
|
package/dist/core/Usage.mjs
CHANGED
|
@@ -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
|
package/dist/core/Usage.mjs.map
CHANGED
|
@@ -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-
|
|
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 };
|
package/dist/durable/Admin.d.mts
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
-
import { Gr as ThreadNotMaterialized, ii as ThreadStoreError, ni as ThreadStore } from "../Admin-
|
|
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-
|
|
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-
|
|
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-
|
|
3
|
-
import { c as threadCreatedBatchId, l as threadCreatedRecordId } from "../WorkerAdmission-
|
|
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-
|
|
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-
|
|
3
|
-
import { E as SubscriptionSourceError } from "../Subscription-
|
|
4
|
-
import { t as EventSource } from "../EventSource-
|
|
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-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAa,6BAA6B,mBAAmB,WAAW,YAAY;CAClF,cAAc,OAAO;CACrB,UAAU,OAAO;CACjB,eAAe,OAAO;CACtB,WAAW,OAAO;CAClB,gBAAgB,OAAO;CACvB,SAAS,OAAO;CAChB,cAAc,OAAO;CACrB,cAAc,OAAO;CACrB,aAAa,OAAO;CACpB,WAAW,OAAO;CAClB,eAAe,OAAO;CACtB,iBAAiB,OAAO;CACxB,kBAAkB,OAAO;CACzB,WAAW,OAAO;AACpB,EAAE;;AAKF,MAAa,2BAA2B,OAAO,MAAM;CACnD,OAAO,aAAa,oBAAoB;EACtC,KAAK;EACL,UAAU;EACV,iBAAiB,OAAO;CAC1B,CAAC;CACD,OAAO,aAAa,mBAAmB;EACrC,KAAK;EACL,UAAU;EACV,QAAQ,OAAO,SAAS;GAAC;GAAW;GAAY;GAAa;GAAW;EAAQ,CAAC;EACjF,SAAS,OAAO,OAAO,OAAO;EAC9B,YAAY,OAAO,OAAO,UAAU;EACpC,SAAS,OAAO;CAClB,CAAC;CACD,OAAO,aAAa,qBAAqB;EACvC,UAAU;EACV,qBAAqB,OAAO,MAAM,YAAY;;EAE9C,UAAU,OAAO,OAAO,kBAAkB;CAC5C,CAAC;CACD,OAAO,aAAa,mBAAmB,EAAE,cAAc,aAAa,CAAC;CACrE,OAAO,aAAa,uBAAuB;EACzC,cAAc;EACd,QAAQ;CACV,CAAC;CACD,OAAO,aAAa,qBAAqB,EAAE,cAAc,aAAa,CAAC;CACvE,OAAO,aAAa,qBAAqB,EAAE,cAAc,aAAa,CAAC;CACvE,OAAO,aAAa,uBAAuB,EAAE,QAAQ,YAAY,CAAC;CAClE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;AASD,IAAa,uBAAb,cAA0C,OAAO,MAC/C,2CACF,CAAC,CAAC;CACA,IAAI,OAAO,eAAe,MAAM,OAAO,YAAY,IAAI,CAAC;CACxD,eAAe;CACf,SAAS,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC;CACjD,WAAW,OAAO;CAClB,mBAAmB,OAAO,YAAY,iBAAiB;CACvD,QAAQ,OAAO,YAAY,0BAA0B;CACrD,MAAM;AACR,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,4BAAb,cAA+C,OAAO,YAAuC,CAAC,CAC5F,6BACA;CACE,QAAQ,OAAO,SAAS;EAAC;EAAe;EAAY;EAAW;CAAU,CAAC;CAC1E,OAAO,OAAO,YAAY,OAAO,OAAO,CAAC;AAC3C,CACF,CAAC,CAAC,CAAC;;AAGH,MAAa,oCAAoC;;AAGjD,MAAa,4BAA4B,OAAO,cAAc,oBAAoB,CAAC,CAAC,MAClF,OAAO,YAAA,CAA6C,GACpD,OAAO,YACJ,UACC,MAAM,OAAO,MAAM,UAAU;CAC3B,MAAM,WAAW,MAAM,QAAQ;CAE/B,OACE,KAAK,kBAAkB,MAAM,EAAE,CAAC,kBAC/B,aAAa,KAAA,KAAa,KAAK,UAAU,SAAS;AAEvD,CAAC,GACH,EAAE,UAAU,0DAA0D,CACxE,CACF;;;;;;;;;AAyCA,IAAa,8BAAb,cAAiD,QAAQ,QAOvD,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC;;AAGzD,MAAa,6BAA6B,QAAQ,UAChD,mDACA,EAAE,oBAAoB,OAAO,KAAK,EAAE,CACtC;;AAGA,MAAa,4BAA4B,MAAM,OAAO,0BAA0B,CAAC,CAC/E,OAAO,IAAI,OAAO,QAAQ,OAAO,IAAI,CACvC;;AAGA,MAAM,aAAa,OAAO,GAAG,iCAAiC,CAAC,CAC7D,WAAW,aAAmC;CAC5C,IACE,YAAY,WAAW,KAAA,KACtB,YAAY,KAAK,SAAS,0BACzB,YAAY,KAAK,mBAAmB,YAAY,eAElD,OAAO;CACT,MAAM,OAAO,YAAY;CAEzB,IAAI,eACF,KAAK,SAAS,wBACV,KAAK,OAAO,eACZ,kBAAkB,OAChB,KAAK,eACL,KAAA;CAER,MAAM,QACJ,KAAK,SAAS,uBACV,KAAK,OAAO,QACZ,WAAW,OACT,KAAK,QACL,KAAA;CAER,IAAI,iBAAiB,KAAA,KAAa,UAAU,KAAA,GAAW;EACrD,MAAM,QAAQ,OAAO,YAAY;GAAE,UAAU,YAAY;GAAe;EAAM,CAAC;EAE/E,IAAI,OAAO,OAAO,KAAK,KAAK,MAAM,MAAM,OAAO,QAAQ,SAAS,qBAC9D,OAAO,OAAO,0BAA0B,KAAK,EAAE,QAAQ,cAAc,CAAC;EACxE,eAAe,MAAM,MAAM,OAAO,QAAQ;CAC5C;CACA,IAAI,iBAAiB,KAAA,GAAW,OAAO;CAEvC,MAAM,QAAQ,QAAO,OADC,iBAAA,CACM,OAAO,qBAAqB,KAAK,EAAE,aAAa,CAAC,CAAC;CAE9E,IAAI,OAAO,OAAO,KAAK,GACrB,OAAO,OAAO,0BAA0B,KAAK,EAAE,QAAQ,cAAc,CAAC;CAExE,MAAM,SAAS,OAAO,OAAO,aAAa,OAAO,OAAO,0BAA0B,CAAC,CAAC,CAClF,MAAM,KACR;CAEA,OAAO,qBAAqB,KAAK;EAAE,GAAG;EAAa;CAAO,CAAC;AAC7D,GACA,OAAO,UAAU,UAAU,0BAA0B,KAAK;CAAE,QAAQ;CAAe;AAAM,CAAC,CAAC,CAC7F;;;;;;;AAQA,MAAa,6BAA6B,OAAO,GAAG,4BAA4B,CAAC,CAAC,WAChF,SACA,gBAAgB,KAChB,QAAQ,GACR;CACA,MAAM,UAAU,OAAO;CACvB,MAAM,UAAU,OAAO,QAAQ,QAAQ,OAAO,MAAM,mBAAmB,KAAK;CAE5E,IAAI,WAAmD,MAAM;CAE7D,KAAK,MAAM,SAAS,SAClB,OAAO,OAAO,IAAI,aAAa;EAC7B,IAAI,EAAE,OAAO,QAAQ,MAAM,OAAO,OAAO,MAAM,mBAAmB,aAAa,IAAI;EACnF,OAAO,OAAO,OACZ,OAAO,IAAI,aAAa;GACtB,MAAM,eAAe,OAAO,OAAO,QAAQ,OAAO,UAAU;GAE5D,OAAO,QAAQ,QAAQ,YAAY;EACrC,CAAC,CACH,CAAC,CAAC,KACA,OAAO,cAAc;GACnB,UAAU;GACV,cAAc,0BAA0B,KAAK,EAAE,QAAQ,cAAc,CAAC;EACxE,CAAC,CACH;EACA,OAAO,QAAQ,YAAY,KAAK;CAClC,CAAC,CAAC,CAAC,KACD,OAAO,cACJ,UAAU,CAAC,MAAM,cAAc,KAAK,IACpC,UAAU;EACT,WAAW,MAAM,QAAQ,UAAU,KAAK;EAExC,OAAO,OAAO;CAChB,CACF,CACF;CAEF,IAAI,SAAS,QAAQ,SAAS,GAAG,OAAO,OAAO,OAAO,UAAU,QAAQ;CAExE,OAAO,QAAQ;AACjB,CAAC"}
|
|
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-
|
|
8
|
-
import { fn as Settlement, xi as LifecyclePublicationStorage } from "../Admin-
|
|
9
|
-
import { a as PreparedInput } from "../Subscription-
|
|
10
|
-
import { t as PreparedInputAdmission } from "../PreparedInputAdmission-
|
|
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 };
|