experimental-a2 0.14.0 → 0.14.1
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/CHANGELOG.md +9 -0
- package/dist/ai-server.d.ts.map +1 -1
- package/dist/ai-server.js +39 -12
- package/dist/ai-server.js.map +1 -1
- package/docs/guides/06-ai-agents.mdx +22 -3
- package/examples/playground/package.json +1 -1
- package/package.json +1 -1
- package/src/ai-server.ts +48 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.14.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 0c7fa4e: Enable AI Gateway automatic prompt caching and stable session affinity in
|
|
8
|
+
the default AI generator, including automatic compaction. Caller-supplied
|
|
9
|
+
provider options and per-call affinity headers take precedence. Custom
|
|
10
|
+
generators retain their original settings.
|
|
11
|
+
|
|
3
12
|
## 0.14.0
|
|
4
13
|
|
|
5
14
|
### Minor Changes
|
package/dist/ai-server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-server.d.ts","names":[],"sources":["../src/ai-sdk-step.ts","../src/ai-server.ts"],"mappings":";;;;;KAkBK,kBAAkB,UAAU,aAAW,kBAAkB,WAAW;KAKpE,iBAAiB,UAAU,sBAE5B,KACE,QAAQ,kBAAkB;KAI3B;KAmBA;KASA,iBAAiB,UAAU,yBACpB,WAAW,IAAI,KAAK,EAAE;KAG7B,aAAa,UAAU,WAAS,gBAAgB,kBAAkB,MACrE,YAAY,kBAAkB,GAAG,cAAa,aAAa,qBACvD;KAGD,qBAAqB,UAAU,aAAW,KAC7C,aAAa;WAGJ,OAAO,iBAAiB;;KAG9B,yBAAyB,UAAU,aAAW,KACjD,aAAa;WAGJ,OAAO,iBAAiB;;KAG9B,mBAAmB,UAAU,OAAO,iBAAiB;KAErD,yBAAyB,UAAU,aAAW,YACjD,kBAAkB;KAGf,yBAAyB,UAAU,cACtC,SAAS,KAAK,WAAW,yBAAyB;EAChD,OAAO,iBAAiB;MAEvB,WAAW,yBAAyB;KAEpC,2BAA2B,UAAU,aAAW,YACnD,kBAAkB;KAGf,oBAAoB,UAAU,aAAW,QAC5C,2BAA2B,QACvB;KAGD,oBAAoB,UAAU,cACjC,SAAS,KAAK,WAAW,oBAAoB;EAC3C,OAAO,iBAAiB;MAEvB,WAAW,oBAAoB;;KAGxB,kBAAkB,UAAU,aAAW,QACjD,KACE,kBAAkB,IAClB,8BAA8B;EAGhC,UAAU,iBAAiB;EAC3B,UAAU,mBAAmB,qBAAqB;EAClD,uBAAuB,mBAAmB,qBAAqB;EAC/D,cAAc,mBAAmB,yBAAyB;EAC1D,2BAA2B,mBAAmB,yBAAyB;EACvE,iBAAiB,yBAAyB;EAC1C,8BAA8B,yBAAyB;EACvD,yBACE,oBAAoB,KAAK,MAAM,oBAAoB;;;;
|
|
1
|
+
{"version":3,"file":"ai-server.d.ts","names":[],"sources":["../src/ai-sdk-step.ts","../src/ai-server.ts"],"mappings":"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"}
|
package/dist/ai-server.js
CHANGED
|
@@ -4,6 +4,7 @@ import { f as consumeSchedulerSendFailure, p as installAmbientToolScopeStorage }
|
|
|
4
4
|
import { i as setServerFetchHooks, t as createServer } from "./server-CjJSGcF7.js";
|
|
5
5
|
import { n as applyControlChanges, r as controlCommit, t as initialControlState } from "./ai-control-CcD4hh3y.js";
|
|
6
6
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
7
8
|
import { asSchema, convertToModelMessages, stepCountIs, streamText, toUIMessageStream } from "ai";
|
|
8
9
|
//#region src/ai-coordinator.ts
|
|
9
10
|
const updateResponse = (state, update) => state.response === void 0 ? state : {
|
|
@@ -951,7 +952,23 @@ const nextOrTimer = async (next, delayMs) => {
|
|
|
951
952
|
if (timer !== void 0) clearTimeout(timer);
|
|
952
953
|
}
|
|
953
954
|
};
|
|
954
|
-
async function generateWithAISDK(
|
|
955
|
+
async function generateWithAISDK(options) {
|
|
956
|
+
const { agentName, context, messageMetadata } = options;
|
|
957
|
+
const headers = context.generation.headers ?? {};
|
|
958
|
+
const generation = gatewayModelId(context.model) === void 0 ? context.generation : {
|
|
959
|
+
...context.generation,
|
|
960
|
+
headers: Object.keys(headers).some((key) => key.toLowerCase() === "x-session-affinity") ? headers : {
|
|
961
|
+
...headers,
|
|
962
|
+
"x-session-affinity": createHash("sha256").update(JSON.stringify([agentName, context.request.sessionId])).digest("hex")
|
|
963
|
+
},
|
|
964
|
+
providerOptions: {
|
|
965
|
+
...context.generation.providerOptions,
|
|
966
|
+
gateway: {
|
|
967
|
+
caching: "auto",
|
|
968
|
+
...context.generation.providerOptions?.["gateway"]
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
};
|
|
955
972
|
const step = await generateAISDKStep({
|
|
956
973
|
model: context.model,
|
|
957
974
|
tools: context.tools,
|
|
@@ -960,9 +977,10 @@ async function generateWithAISDK(context, messageMetadata) {
|
|
|
960
977
|
responseMessageId: context.responseMessageId,
|
|
961
978
|
abortSignal: context.signal,
|
|
962
979
|
...context.instructions === void 0 ? {} : { instructions: context.instructions },
|
|
963
|
-
settings:
|
|
980
|
+
settings: generation,
|
|
964
981
|
...messageMetadata === void 0 ? {} : { messageMetadata: ({ part }) => messageMetadata({
|
|
965
982
|
...context,
|
|
983
|
+
generation,
|
|
966
984
|
part
|
|
967
985
|
}) }
|
|
968
986
|
});
|
|
@@ -1080,15 +1098,19 @@ const summarize = async (options) => {
|
|
|
1080
1098
|
return [name, definition];
|
|
1081
1099
|
}));
|
|
1082
1100
|
const source = await generateWithAISDK({
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1101
|
+
agentName: options.agentName,
|
|
1102
|
+
context: {
|
|
1103
|
+
...options.context,
|
|
1104
|
+
generation,
|
|
1105
|
+
tools,
|
|
1106
|
+
modelMessages: [...options.context.modelMessages, {
|
|
1107
|
+
role: "user",
|
|
1108
|
+
content: instruction
|
|
1109
|
+
}],
|
|
1110
|
+
responseMessageId: `${options.context.generationId}:summary`
|
|
1111
|
+
},
|
|
1112
|
+
messageMetadata: void 0
|
|
1113
|
+
});
|
|
1092
1114
|
let summary = "";
|
|
1093
1115
|
let calledTool = false;
|
|
1094
1116
|
let finish;
|
|
@@ -1775,6 +1797,7 @@ function createHandlers(options) {
|
|
|
1775
1797
|
const result = !("shouldCompact" in policy) ? {
|
|
1776
1798
|
messages: [],
|
|
1777
1799
|
...await summarize({
|
|
1800
|
+
agentName: options.agent.contract.name,
|
|
1778
1801
|
context: baseContext,
|
|
1779
1802
|
instructions: policy.instructions
|
|
1780
1803
|
})
|
|
@@ -1843,7 +1866,11 @@ function createHandlers(options) {
|
|
|
1843
1866
|
};
|
|
1844
1867
|
const custom = options.generate !== void 0;
|
|
1845
1868
|
const updates = consumeGeneration({
|
|
1846
|
-
source: options.generate === void 0 ? await generateWithAISDK(
|
|
1869
|
+
source: options.generate === void 0 ? await generateWithAISDK({
|
|
1870
|
+
agentName: options.agent.contract.name,
|
|
1871
|
+
context: generateContext,
|
|
1872
|
+
messageMetadata: options.messageMetadata
|
|
1873
|
+
}) : { stream: await options.generate(generateContext) },
|
|
1847
1874
|
...options.progress === void 0 ? {} : { progress: options.progress }
|
|
1848
1875
|
});
|
|
1849
1876
|
let sequence = 0;
|
package/dist/ai-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-server.js","names":["errorMessage"],"sources":["../src/ai-coordinator.ts","../src/ai-control-server.ts","../src/ai-sdk-step.ts","../src/ai-model-metadata.ts","../src/ai-server.ts"],"sourcesContent":["import type { UIMessage } from 'ai'\nimport { applyControlChanges } from './ai-control-state.ts'\nimport type { ControlCommit, ControlWork } from './ai-control.ts'\nimport type {\n AIEventDefs,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationRequestedPayload,\n GenerationStartedPayload,\n InputRequestedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport type { Reducer } from './reducer.ts'\n\nexport type CoordinatorCall = {\n call: ToolCalledPayload\n approval?: ApprovalRequestedPayload\n response?: ApprovalRespondedPayload\n terminal: boolean\n work?: ControlWork\n}\n\nexport type CoordinatorResponse = {\n rootMessageId: string\n responseMessageId: string\n status: 'requested' | 'generating' | 'waiting' | 'failed'\n stepCount: number\n activeRequestId?: string\n generation?: GenerationStartedPayload\n promptThroughIndex?: number\n source?: {\n generation: GenerationStartedPayload\n promptThroughIndex: number\n failed: boolean\n canCompact: boolean\n }\n completion?: GenerationCompletedPayload\n failure?: GenerationFailedPayload\n calls: CoordinatorCall[]\n inputs: InputRequestedPayload[]\n inputResponse?: {\n generationId: string\n inputId: string\n name: string\n }\n}\n\nexport type AICoordinatorState = {\n closed: boolean\n queued: Array<{ messageId: string; generate: boolean }>\n response?: CoordinatorResponse\n calibration?: { model: string; inputTokens: number; estimate: number }\n}\n\nconst updateResponse = (\n state: AICoordinatorState,\n update: (response: CoordinatorResponse) => CoordinatorResponse,\n): AICoordinatorState =>\n state.response === undefined\n ? state\n : { ...state, response: update(state.response) }\n\nexport const foldCoordinator = <M extends UIMessage, D extends EventDefs>(\n state: AICoordinatorState,\n event: ContractEvent<D>,\n): AICoordinatorState => {\n switch (event.type) {\n case 'ai.session.closed':\n return { closed: true, queued: [] }\n case 'ai.retry.requested':\n case 'ai.compaction.completed': {\n const { calibration: _, ...rest } = state\n return rest\n }\n case 'ai.message.created': {\n const payload = event.payload as MessageCreatedPayload<M>\n const message = payload.message\n if (message.role !== 'user') return state\n return {\n ...state,\n queued: [\n ...state.queued.filter((item) => item.messageId !== message.id),\n {\n messageId: message.id,\n generate: payload.generate !== false,\n },\n ],\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (request.reason === 'message') {\n const responseMessageId =\n request.responseMessageId ?? `${request.messageId}:assistant`\n const requested = state.queued.findIndex(\n (item) => item.messageId === request.messageId,\n )\n return {\n ...state,\n queued:\n requested < 0\n ? state.queued.filter(\n (item) => item.messageId !== request.messageId,\n )\n : state.queued.slice(requested + 1),\n response: {\n rootMessageId: request.messageId,\n responseMessageId,\n status: 'requested',\n stepCount: 0,\n activeRequestId: event.id,\n calls: [],\n inputs: [],\n },\n }\n }\n if (\n state.response === undefined ||\n request.responseMessageId !== state.response.responseMessageId\n ) {\n return state\n }\n if (\n (request.reason === 'tool' &&\n (!continuationReady(state) ||\n event.id !==\n `ai.generate:tools:${state.response.generation?.generationId}`)) ||\n (request.reason === 'retry' && state.response.status !== 'failed') ||\n (request.reason === 'input' &&\n state.response.inputResponse === undefined)\n ) {\n return state\n }\n return updateResponse(state, (response) => {\n const generation = response.generation ?? response.source?.generation\n const promptThroughIndex =\n response.promptThroughIndex ?? response.source?.promptThroughIndex\n return {\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'requested',\n stepCount: response.stepCount,\n activeRequestId: event.id,\n ...(generation === undefined || promptThroughIndex === undefined\n ? {}\n : {\n source: {\n generation,\n promptThroughIndex,\n failed:\n response.failure?.generationId === generation.generationId,\n canCompact: response.calls.every((call) => call.terminal),\n },\n }),\n calls: [],\n inputs: [],\n }\n })\n }\n case 'ai.generation.started': {\n const generation = event.payload as GenerationStartedPayload\n if (\n state.response?.responseMessageId !== generation.responseMessageId ||\n state.response.activeRequestId !== generation.requestId ||\n (state.response.generation?.requestId === generation.requestId &&\n state.response.generation.attempt >= generation.attempt)\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'generating',\n stepCount: response.stepCount,\n generation,\n ...(generation.promptThroughIndex === undefined\n ? {}\n : { promptThroughIndex: generation.promptThroughIndex }),\n ...(response.source === undefined ? {} : { source: response.source }),\n activeRequestId: generation.requestId,\n calls: [],\n inputs: [],\n }))\n }\n case 'ai.generation.completed': {\n const completion = event.payload as GenerationCompletedPayload\n if (\n state.response?.generation?.generationId !== completion.generationId\n ) {\n return state\n }\n const next = updateResponse(state, (response) => ({\n ...response,\n status: 'waiting',\n completion,\n stepCount:\n response.stepCount + (response.completion === undefined ? 1 : 0),\n }))\n const { calibration: _, ...uncalibrated } = next\n const inputTokens = completion.usage?.inputTokens\n const estimate = completion.inputTokenEstimate\n return inputTokens !== undefined &&\n Number.isFinite(inputTokens) &&\n inputTokens >= 0 &&\n estimate !== undefined\n ? {\n ...uncalibrated,\n calibration: {\n model: state.response.generation.model,\n inputTokens,\n estimate,\n },\n }\n : uncalibrated\n }\n case 'ai.generation.failed': {\n const failure = event.payload as GenerationFailedPayload\n const response = state.response\n const ownsActiveGeneration =\n response?.generation?.generationId === failure.generationId\n const ownsActiveStepLimit =\n failure.stepLimit === true &&\n response?.activeRequestId ===\n `ai.generate:tools:${failure.generationId}` &&\n response.responseMessageId === failure.responseMessageId\n if (!ownsActiveGeneration && !ownsActiveStepLimit) {\n return state\n }\n return updateResponse(state, (current) => ({\n ...current,\n status: 'failed',\n failure,\n }))\n }\n case 'ai.message.completed': {\n const messageId = (event.payload as { messageId: string }).messageId\n if (state.response?.responseMessageId !== messageId) return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.message.interrupted': {\n const interruption = event.payload as MessageInterruptedPayload\n const response = state.response\n if (\n response?.responseMessageId !== interruption.messageId ||\n (interruption.generationId !== response.generation?.generationId &&\n interruption.requestId !== response.activeRequestId)\n )\n return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.tool.called': {\n const call = event.payload as ToolCalledPayload\n if (state.response?.generation?.generationId !== call.generationId) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: [\n ...response.calls.filter(\n (candidate) => candidate.call.toolCallId !== call.toolCallId,\n ),\n { call, terminal: false },\n ],\n }))\n }\n case 'ai.approval.requested': {\n const approval = event.payload as ApprovalRequestedPayload\n if (state.response?.generation?.generationId !== approval.generationId) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === approval.toolCallId\n ? { ...candidate, approval }\n : candidate,\n ),\n }))\n }\n case 'ai.approval.responded': {\n const approval = event.payload as ApprovalRespondedPayload\n if (\n state.response?.responseMessageId !== approval.messageId ||\n state.response.generation?.generationId !== approval.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.approval?.approvalId === approval.approvalId\n ? { ...candidate, response: approval }\n : candidate,\n ),\n }))\n }\n case 'ai.tool.result': {\n const result = event.payload as ToolResultPayload\n if (\n result.preliminary === true ||\n state.response?.generation?.generationId !== result.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === result.toolCallId\n ? { ...candidate, terminal: true }\n : candidate,\n ),\n }))\n }\n case 'ai.input.requested': {\n const input = event.payload as InputRequestedPayload\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.generationId !== input.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: [\n ...response.inputs.filter(\n (candidate) =>\n candidate.messageId !== input.messageId ||\n candidate.generationId !== input.generationId ||\n candidate.inputId !== input.inputId,\n ),\n input,\n ],\n }))\n }\n case 'ai.input.responded': {\n const input = event.payload as {\n messageId: string\n generationId: string\n inputId: string\n name: string\n }\n const requested = state.response?.inputs.find(\n (candidate) =>\n candidate.messageId === input.messageId &&\n candidate.generationId === input.generationId &&\n candidate.inputId === input.inputId &&\n candidate.name === input.name,\n )\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.generationId !== input.generationId ||\n requested === undefined\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: response.inputs.filter(\n (candidate) => candidate.inputId !== input.inputId,\n ),\n inputResponse: {\n generationId: input.generationId,\n inputId: input.inputId,\n name: requested.name,\n },\n }))\n }\n default:\n return state\n }\n}\n\nexport const aiCoordinatorReducer = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(\n contract: Contract<D>,\n): Reducer<D, AICoordinatorState> =>\n contract\n .reducer({\n name: 'a2.ai.coordinator.v5',\n initialState: {\n closed: false,\n queued: [],\n } as AICoordinatorState,\n })\n .fold((state, event) =>\n event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes\n .filter((change) => change.path[0] === 'coordinator')\n .map((change) =>\n Object.assign({}, change, { path: change.path.slice(1) }),\n ),\n })\n : state,\n )\n\nexport const continuationReady = (state: AICoordinatorState): boolean => {\n const response = state.response\n return (\n !state.closed &&\n response?.completion?.finishReason === 'tool-calls' &&\n response.generation?.generationId === response.completion.generationId &&\n response.failure === undefined &&\n response.calls.length > 0 &&\n response.calls.every(\n (call) =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n call.call.supportsDeferredResults !== true &&\n call.approval !== undefined &&\n call.response !== undefined),\n )\n )\n}\n","// oxlint-disable no-await-in-loop -- work acknowledgements follow the durable stream.\nimport { applyControlChanges, controlCommit } from './ai-control-state.ts'\nimport type { ControlChange, ControlCommit } from './ai-control.ts'\nimport type { UIMessage } from 'ai'\nimport type {\n AIEventDefs,\n AgentDefinition,\n GenerationRequestedPayload,\n MessageInterruptedPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n continuationReady,\n foldCoordinator,\n} from './ai-coordinator.ts'\nimport {\n initialControlState,\n type AIControlState,\n type ControlCommand,\n type ControlReceipt,\n type WorkFact,\n type WorkReport,\n} from './ai-control.ts'\nimport type { AppendInput, ContractEvent, EventDefs } from './contract.ts'\nimport type { HandlerContext } from './server.ts'\nimport type { Reducer } from './reducer.ts'\nimport type { AICoordinatorState, CoordinatorCall } from './ai-coordinator.ts'\nimport { validateSync } from './validate.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { A2Error } from './errors.ts'\n\nexport class ControlCancelled extends Error {}\n\nconst callReadyForModel = (call: CoordinatorCall): boolean =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n !call.call.supportsDeferredResults &&\n call.response !== undefined)\n\nconst approvalBlocksExecution = (call: CoordinatorCall): boolean =>\n call.approval !== undefined && call.response?.approved !== true\n\nexport type AIControlRuntime<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n handler(\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]>\n append(options: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]>\n settled(options: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): AppendInput<D>\n cancelled(options: { error: unknown; signal: AbortSignal }): boolean\n reducer: Reducer<D, AIControlState<M>>\n coordinator: Reducer<D, AICoordinatorState>\n}\n\nexport const createControlRuntime = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n}): AIControlRuntime<M, D> => {\n const reducer = options.agent.contract\n .reducer({\n name: 'a2.ai.control.v1',\n initialState: initialControlState<M>(),\n })\n .fold((state, event) =>\n event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes,\n })\n : state,\n )\n const coordinator = aiCoordinatorReducer(options.agent.contract)\n\n const handler = async (\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]> => {\n const snapshot = await ctx.session.state(reducer, { through: 'latest' })\n const before = structuredClone(snapshot.state)\n const moves: ControlChange[] = []\n const state = structuredClone(snapshot.state)\n const facts: WorkFact[] = []\n const jobs: AppendInput<D>[] = []\n const emit = ({\n type,\n payload,\n id = `${ctx.event.id}:fact:${facts.length}`,\n }: {\n type: string\n payload: unknown\n id?: string\n }): void => {\n const fact = { type, payload, id }\n facts.push(fact)\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n ...fact,\n } as ContractEvent<D>)\n }\n let reason: ControlReceipt['reason']\n const end = ({\n lastSeenIndex,\n reason: interruptionReason,\n }: {\n lastSeenIndex: number | undefined\n reason: string | undefined\n }): void => {\n const response = state.coordinator.response\n if (response === undefined) return\n const owner =\n response.generation === undefined\n ? { requestId: response.activeRequestId! }\n : { generationId: response.generation.generationId }\n emit({\n type: 'ai.message.interrupted',\n payload: {\n messageId: response.responseMessageId,\n ...owner,\n ...(interruptionReason === undefined\n ? {}\n : { reason: interruptionReason }),\n ...(lastSeenIndex === undefined ? {} : { lastSeenIndex }),\n } satisfies MessageInterruptedPayload,\n })\n state.active = null\n }\n const knownInput = (id: string): boolean =>\n state.inbox.items.some((candidate) => candidate.id === id) ||\n Object.hasOwn(state.reservedIds, id)\n const missingInputReason = (id: string): ControlReceipt['reason'] =>\n state.reservedIds[id] === 'removed' || !knownInput(id)\n ? 'not-found'\n : 'already-active'\n const inputTaken = ({\n message,\n generate = true,\n }: {\n message: M\n generate?: boolean\n }): boolean =>\n knownInput(message.id) ||\n (generate &&\n message.role === 'user' &&\n knownInput(`${message.id}:assistant`))\n const insert = ({\n message,\n generate = true,\n first = false,\n afterStepOf,\n }: {\n message: M\n generate?: boolean\n first?: boolean\n afterStepOf?: string\n }): void => {\n const candidate = {\n id: message.id,\n revision: 0,\n message,\n generate: generate && message.role === 'user',\n ...(afterStepOf === undefined ? {} : { afterStepOf }),\n }\n state.reservedIds = {\n ...state.reservedIds,\n [candidate.id]: true,\n ...(candidate.generate\n ? { [`${candidate.id}:assistant`]: true as const }\n : {}),\n }\n if (first) state.inbox.items.unshift(candidate)\n else state.inbox.items.push(candidate)\n }\n const moveInput = ({ from, to }: { from: number; to: number }): void => {\n if (from === to) return\n const [moved] = state.inbox.items.splice(from, 1)\n state.inbox.items.splice(to, 0, moved!)\n const [previous] = before.inbox.items.splice(from, 1)\n before.inbox.items.splice(to, 0, previous!)\n moves.push({ path: ['inbox', 'items'], move: { from, to } })\n }\n const requestModel = ({\n request,\n id,\n }: {\n request: GenerationRequestedPayload\n id: string\n }): void => {\n const active = state.active!\n const payload = {\n ...request,\n control: { turnId: active.turnId, version: active.version },\n }\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n type: 'ai.generation.requested',\n id,\n payload,\n } as ContractEvent<D>)\n active.model = { id, version: active.version, settled: false }\n active.phase = 'starting'\n jobs.push({\n type: 'ai.generation.requested',\n id,\n payload,\n } as AppendInput<D>)\n }\n if (ctx.event.type === 'ai.session.closed') {\n state.coordinator = { closed: true, queued: [] }\n state.active = null\n state.inbox.items = []\n } else if (ctx.event.type === 'ai.control.requested') {\n const command = ctx.event.payload as ControlCommand<M>\n if (state.coordinator.closed) reason = 'closed'\n else\n switch (command.action) {\n case 'send':\n if (\n inputTaken({\n message: command.message,\n generate: command.generate !== false,\n })\n )\n reason = 'duplicate-input'\n else\n insert({\n message: command.message,\n generate: command.generate !== false,\n })\n break\n case 'edit': {\n const item = state.inbox.items.find(\n (candidate) => candidate.id === command.message.id,\n )\n if (item === undefined)\n reason = missingInputReason(command.message.id)\n else if (item.revision !== command.expectedRevision)\n reason = 'revision-conflict'\n else if (item.message.role !== command.message.role)\n reason = 'revision-conflict'\n else {\n item.message = command.message\n item.revision += 1\n }\n break\n }\n case 'remove': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n if (position < 0) reason = missingInputReason(command.inputId)\n else {\n state.inbox.items.splice(position, 1)\n state.reservedIds = {\n ...state.reservedIds,\n [command.inputId]: 'removed',\n }\n }\n break\n }\n case 'move': {\n const index = state.inbox.items.findIndex(\n (candidate) => candidate.id === command.inputId,\n )\n if (index < 0) reason = missingInputReason(command.inputId)\n else if (\n command.beforeId !== null &&\n !state.inbox.items.some(\n (candidate) => candidate.id === command.beforeId,\n )\n )\n reason = 'not-found'\n else {\n const destination =\n command.beforeId === null\n ? state.inbox.items.length\n : state.inbox.items.findIndex(\n (item) => item.id === command.beforeId,\n )\n moveInput({\n from: index,\n to: destination > index ? destination - 1 : destination,\n })\n }\n break\n }\n case 'send-now': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n const selected = state.inbox.items[position]\n if (!selected) reason = missingInputReason(command.inputId)\n else if ((state.active?.turnId ?? null) !== command.turnId)\n reason = 'stale-turn'\n else if (selected.message.role !== 'user') reason = 'not-user-input'\n else if (\n !selected.generate &&\n knownInput(`${selected.id}:assistant`)\n )\n reason = 'duplicate-input'\n else {\n if (!selected.generate) {\n state.reservedIds = {\n ...state.reservedIds,\n [`${selected.id}:assistant`]: true,\n }\n selected.generate = true\n }\n if (state.active) selected.afterStepOf = state.active.turnId\n else delete selected.afterStepOf\n moveInput({ from: position, to: 0 })\n }\n break\n }\n case 'stop':\n if (state.active?.turnId !== command.turnId) reason = 'stale-turn'\n else\n end({ lastSeenIndex: command.lastSeenIndex, reason: undefined })\n break\n case 'steer':\n if (inputTaken({ message: command.message }))\n reason = 'duplicate-input'\n else {\n insert({\n message: command.message,\n generate: true,\n first: true,\n afterStepOf: command.turnId,\n })\n }\n break\n case 'interrupt': {\n const response = state.coordinator.response\n if (\n !response ||\n response.responseMessageId !== command.request.messageId ||\n (command.request.generationId !==\n response.generation?.generationId &&\n command.request.requestId !== response.activeRequestId)\n )\n reason = 'stale-turn'\n else\n end({\n lastSeenIndex: command.request.lastSeenIndex,\n reason: command.request.reason,\n })\n break\n }\n case 'pause': {\n state.inbox.paused = true\n const active = state.active\n if (\n command.when === 'now' &&\n active !== null &&\n !active.suspended\n ) {\n active.suspended = true\n active.version += 1\n const generation = state.coordinator.response?.generation\n if (generation)\n emit({\n type: 'ai.generation.paused',\n payload: {\n generationId: generation.generationId,\n messageId: generation.responseMessageId,\n },\n })\n }\n break\n }\n case 'resume':\n state.inbox.paused = false\n break\n case 'tool-result': {\n const call = state.coordinator.response?.calls.find(\n (candidate) =>\n candidate.call.generationId === command.result.generationId &&\n candidate.call.messageId === command.result.messageId &&\n candidate.call.toolCallId === command.result.toolCallId &&\n candidate.call.providerExecuted === true &&\n !candidate.terminal,\n )\n if (!call) reason = 'not-found'\n else emit({ type: 'ai.tool.result', payload: command.result })\n break\n }\n case 'approval': {\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) =>\n candidate.approval?.approvalId ===\n command.response.approvalId &&\n candidate.approval.generationId ===\n command.response.generationId &&\n candidate.approval.messageId === command.response.messageId,\n )\n if (response?.failure) reason = 'stale-turn'\n else if (!call || call.response || call.terminal)\n reason = 'not-found'\n else\n emit({ type: 'ai.approval.responded', payload: command.response })\n break\n }\n case 'request-input':\n case 'input': {\n const payload =\n command.action === 'input' ? command.response : command.request\n const response = state.coordinator.response\n if (\n response?.failure !== undefined ||\n response?.generation?.generationId !== payload.generationId ||\n response.responseMessageId !== payload.messageId ||\n (command.action === 'input' &&\n !response.inputs.some(\n (input) =>\n input.inputId === payload.inputId &&\n input.name === payload.name,\n ))\n )\n reason = 'not-found'\n else\n emit({\n type:\n command.action === 'input'\n ? 'ai.input.responded'\n : 'ai.input.requested',\n payload,\n })\n break\n }\n case 'retry': {\n const response = state.coordinator.response\n if (\n !state.active ||\n response?.status !== 'failed' ||\n response.rootMessageId !== command.request.messageId ||\n response.responseMessageId !== command.request.responseMessageId\n )\n reason = 'stale-turn'\n else if (!state.inbox.paused && !state.active.suspended) {\n emit({ type: 'ai.retry.requested', payload: command.request })\n requestModel({\n request: {\n messageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'retry',\n },\n id: `ai.generate:retry:${command.request.retryId}`,\n })\n } else reason = 'stale-turn'\n break\n }\n }\n } else {\n const report = ctx.event.payload as WorkReport\n const active = state.active\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) => candidate.work?.id === report.workId,\n )\n const work = report.kind === 'model' ? active?.model : call?.work\n const current =\n active?.turnId === report.turnId &&\n work?.id === report.workId &&\n work.version === report.version &&\n !work.settled &&\n report.attempt >= (work.attempt ?? 0)\n if (!current) {\n reason = 'stale-work'\n } else {\n work.attempt = report.attempt\n const authorized =\n !active.suspended && active.version === report.version\n for (const event of report.events) {\n if (work.facts?.includes(event.id)) continue\n if (\n authorized ||\n (report.kind === 'tool' && event.type === 'ai.tool.result')\n ) {\n emit({ type: event.type, payload: event.payload, id: event.id })\n work.facts = [...(work.facts ?? []), event.id]\n }\n }\n if (report.settled) work.settled = true\n if (!authorized) reason = 'stale-work'\n }\n }\n\n let active = state.active\n let response = state.coordinator.response\n if (active && response === undefined) {\n state.active = null\n active = null\n }\n if (active && response) {\n const handoff = state.inbox.items.some(\n (item) => item.afterStepOf === active.turnId,\n )\n const outstanding =\n (active.model !== null && !active.model.settled) ||\n response.calls.some(\n (candidate) =>\n candidate.work !== undefined && !candidate.work.settled,\n )\n if (active.suspended) {\n active.phase = outstanding ? 'pausing' : 'paused'\n if (!state.inbox.paused && !outstanding && !handoff)\n active.suspended = false\n }\n if (!active.suspended && response.failure) active.phase = 'failed'\n if (!active.suspended && response.failure === undefined) {\n for (const call of response.calls) {\n if (\n call.terminal ||\n (call.work !== undefined &&\n (!call.work.settled || call.work.version === active.version)) ||\n call.call.providerExecuted === true ||\n (call.approval && !call.response)\n )\n continue\n if (call.response?.approved === false) {\n emit({\n type: 'ai.tool.result',\n payload: {\n ...call.call,\n denied: true,\n phase: 'execution',\n },\n })\n continue\n }\n const id = `${ctx.event.id}:tool:${call.call.toolCallId}`\n call.work = { id, version: active.version, settled: false }\n jobs.push({\n type: 'ai.tool.execution.requested',\n id,\n payload: {\n turnId: active.turnId,\n version: active.version,\n call: call.call,\n generation: response.generation!,\n },\n } as AppendInput<D>)\n }\n }\n response = state.coordinator.response!\n const callsDone = response.calls.every(callReadyForModel)\n const modelDone = active.model === null || active.model.settled\n const workSettled =\n modelDone &&\n response.calls.every(\n (call) => call.work === undefined || call.work.settled,\n )\n const externalPending = response.calls.some(\n (call) =>\n call.call.providerExecuted &&\n call.call.supportsDeferredResults &&\n !call.terminal &&\n !approvalBlocksExecution(call),\n )\n const handoffReady =\n handoff &&\n workSettled &&\n !externalPending &&\n (active.suspended ||\n response.failure !== undefined ||\n response.calls.every(\n (call) => callReadyForModel(call) || approvalBlocksExecution(call),\n ))\n const readyForModel =\n !active.suspended &&\n response.failure === undefined &&\n modelDone &&\n callsDone &&\n response.inputs.length === 0\n const naturalCompletion =\n readyForModel &&\n response.completion !== undefined &&\n response.completion.finishReason !== 'tool-calls'\n if (handoffReady && !naturalCompletion) {\n end({ lastSeenIndex: undefined, reason: 'steered after step' })\n } else if (readyForModel && (!handoff || handoffReady)) {\n const resume =\n active.model !== null && active.model.version !== active.version\n const input = response.inputResponse\n if (\n !handoff &&\n (resume ||\n continuationReady(state.coordinator) ||\n (response.completion && input))\n ) {\n const nextReason = resume ? 'resume' : input ? 'input' : 'tool'\n const id =\n nextReason === 'tool'\n ? `ai.generate:tools:${response.generation!.generationId}`\n : `${ctx.event.id}:generate:${nextReason}`\n requestModel({\n request: {\n messageId: response.responseMessageId,\n responseMessageId: response.responseMessageId,\n reason: nextReason,\n },\n id,\n })\n } else if (naturalCompletion) {\n emit({\n type: 'ai.message.completed',\n payload: {\n messageId: response.responseMessageId,\n },\n })\n state.active = null\n }\n }\n if (\n !active.suspended &&\n state.active &&\n jobs.every((job) => job.type !== 'ai.generation.requested')\n )\n state.active.phase = response.failure\n ? 'failed'\n : !modelDone\n ? 'generating'\n : !callsDone\n ? 'tools'\n : 'waiting'\n }\n if (\n state.active === null &&\n !state.inbox.paused &&\n !state.coordinator.closed\n ) {\n while (state.inbox.items.length > 0) {\n const item = state.inbox.items.shift()!\n delete item.afterStepOf\n emit({\n type: 'ai.message.created',\n payload: { message: item.message, generate: item.generate },\n id: `ai.admitted:${item.id}`,\n })\n if (!item.generate) continue\n state.active = {\n turnId: item.id,\n input: item,\n phase: 'starting',\n version: 0,\n suspended: false,\n model: null,\n }\n requestModel({\n request: { messageId: item.id, reason: 'message' },\n id: `ai.generate:message:${item.id}`,\n })\n break\n }\n }\n const receipt: ControlReceipt = {\n commandId: ctx.event.id,\n ...(ctx.event.type === 'ai.work.reported' ? { work: true as const } : {}),\n outcome: reason === undefined ? 'applied' : 'rejected',\n ...(reason === undefined ? {} : { reason }),\n }\n return [\n ...(facts as AppendInput<D>[]),\n {\n type: 'ai.control.committed',\n payload: controlCommit({ before, after: state, moves }),\n } as AppendInput<D>,\n ...jobs,\n { type: 'ai.control.decided', payload: receipt } as AppendInput<D>,\n ]\n }\n\n const report = ({\n ctx,\n events,\n settled,\n name,\n }: {\n ctx: HandlerContext<D>\n events: readonly AppendInput<D>[]\n settled: boolean\n name: string\n }): AppendInput<D> => {\n const payload = ctx.event.payload as\n GenerationRequestedPayload | { turnId: string; version: number }\n const { turnId, version } = 'turnId' in payload ? payload : payload.control!\n for (const event of events) {\n const schema = options.agent.contract.events[\n event.type\n ] as StandardSchemaV1<unknown>\n const result = validateSync(\n schema,\n event.payload,\n `AI worker ${event.type}`,\n )\n if (result.issues)\n throw new TypeError(\n result.issues.map((issue) => issue.message).join('; '),\n )\n }\n return {\n type: 'ai.work.reported',\n id: `${ctx.event.id}:report:${ctx.attempt}:${name}`,\n payload: {\n workId: ctx.event.id,\n attempt: ctx.attempt,\n turnId,\n version,\n kind: ctx.event.type === 'ai.generation.requested' ? 'model' : 'tool',\n settled,\n events: events\n .filter(\n (event) =>\n event.type !== 'ai.message.completed' &&\n event.type !== 'ai.message.interrupted',\n )\n .map((event, index) => ({\n type: event.type,\n payload: event.payload,\n id:\n event.id ??\n `${ctx.event.id}:fact:${ctx.attempt}:${name}:${index}`,\n })),\n },\n } as AppendInput<D>\n }\n\n const append = async ({\n ctx,\n name,\n events,\n }: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]> => {\n const progress = events.filter(\n (event) => event.type === 'ai.generation.progress',\n )\n const lifecycle = events.filter(\n (event) => event.type !== 'ai.generation.progress',\n )\n if (lifecycle.length === 0) return ctx.session.append(name, ...progress)\n const input = report({ ctx, events: lifecycle, settled: false, name })\n const persisted = await ctx.session.append(name, ...progress, input)\n const index = persisted.at(-1)!.index\n const feed = ctx.session.stream({ startAfter: index })\n const stream = feed[Symbol.asyncIterator]()\n const canonical: ContractEvent<D>[] = []\n const wanted = new Set(lifecycle.map((event) => event.id))\n let rejectAbort!: (error: unknown) => void\n const aborted = new Promise<never>((_, reject) => {\n rejectAbort = reject\n })\n const onAbort = (): void => {\n rejectAbort(ctx.signal.reason)\n }\n ctx.signal.addEventListener('abort', onAbort, { once: true })\n try {\n ctx.signal.throwIfAborted()\n for (;;) {\n const item = await Promise.race([stream.next(), aborted])\n if (item.done)\n throw new Error('AI control acknowledgement stream ended')\n if (wanted.has(item.value.id)) canonical.push(item.value)\n if (\n item.value.type === 'ai.control.decided' &&\n (item.value.payload as ControlReceipt).commandId === input.id\n ) {\n if ((item.value.payload as ControlReceipt).outcome === 'rejected')\n throw new ControlCancelled('stale AI work')\n return [\n ...persisted.filter((event) => event.type !== 'ai.work.reported'),\n ...canonical,\n ]\n }\n }\n } finally {\n ctx.signal.removeEventListener('abort', onAbort)\n await stream.return?.()\n }\n }\n\n const settled = ({\n ctx,\n events,\n }: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): AppendInput<D> =>\n report({\n ctx,\n events:\n events === undefined\n ? []\n : Array.isArray(events)\n ? events\n : [events as AppendInput<D>],\n settled: true,\n name: 'settled',\n })\n const cancelled = ({\n error,\n signal,\n }: {\n error: unknown\n signal: AbortSignal\n }): boolean => {\n if (signal.reason instanceof A2Error) throw signal.reason\n return error instanceof ControlCancelled || signal.aborted\n }\n return { handler, append, settled, cancelled, reducer, coordinator }\n}\n","import {\n convertToModelMessages,\n stepCountIs,\n streamText,\n toUIMessageStream,\n} from 'ai'\nimport type {\n FinishReason,\n InferUIMessageChunk,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n} from 'ai'\n\ntype StreamTextOptions<T extends ToolSet> = Parameters<typeof streamText<T>>[0]\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\ntype ModelStepTimeout<T extends ToolSet> =\n | number\n | Omit<\n Exclude<StreamTextOptions<T>['timeout'], number | undefined>,\n 'toolMs' | 'tools'\n >\n\ntype ControlledStreamTextSetting =\n | '_internal'\n | 'abortSignal'\n | 'instructions'\n | 'messages'\n | 'model'\n | 'onToolExecutionEnd'\n | 'onToolExecutionStart'\n | 'experimental_onToolCallFinish'\n | 'experimental_onToolCallStart'\n | 'experimental_sandbox'\n | 'experimental_toolCallers'\n | 'experimental_toolApprovalSecret'\n | 'prompt'\n | 'prepareStep'\n | 'stopWhen'\n | 'system'\n | 'tools'\n\ntype RetypedStreamTextSetting =\n | 'experimental_onStart'\n | 'experimental_onStepStart'\n | 'experimental_repairToolCall'\n | 'experimental_transform'\n | 'onStart'\n | 'onStepStart'\n | 'repairToolCall'\n\ntype ModelFacingTools<T extends ToolSet> = {\n readonly [K in keyof T]: Omit<T[K], 'execute'>\n}\n\ntype SettingEvent<T extends ToolSet, K extends keyof StreamTextOptions<T>> =\n NonNullable<StreamTextOptions<T>[K]> extends (event: infer EVENT) => unknown\n ? EVENT\n : never\n\ntype ModelPhaseStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseStepStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStepStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseCallback<EVENT> = (event: EVENT) => void | PromiseLike<void>\n\ntype StreamTextRepairToolCall<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['repairToolCall']\n>\n\ntype ModelPhaseRepairToolCall<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextRepairToolCall<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextRepairToolCall<T>>\n\ntype StreamTextTransformSetting<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['experimental_transform']\n>\n\ntype StreamTextTransform<T extends ToolSet> = Extract<\n StreamTextTransformSetting<T>,\n (...args: never[]) => unknown\n>\n\ntype ModelPhaseTransform<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextTransform<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextTransform<T>>\n\n/** AI SDK streamText settings that remain meaningful for one durable step. */\nexport type AISDKStepSettings<T extends ToolSet> = Partial<\n Omit<\n StreamTextOptions<T>,\n ControlledStreamTextSetting | RetypedStreamTextSetting | 'timeout'\n >\n> & {\n timeout?: ModelStepTimeout<T>\n onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n experimental_onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n experimental_onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_transform?:\n ModelPhaseTransform<T> | Array<ModelPhaseTransform<T>>\n}\n\nexport type AISDKStepInput<M extends UIMessage, T extends ToolSet> = {\n model: LanguageModel\n tools: T\n messages: M[]\n modelMessages?: ModelMessage[]\n responseMessageId: string\n abortSignal: AbortSignal\n instructions?: Instructions\n settings?: AISDKStepSettings<T>\n messageMetadata?: (options: {\n part: TextStreamPart<T>\n }) => UIMessageMetadata<M> | undefined\n}\n\nexport type AISDKStepCompletion = {\n finishReason: FinishReason\n usage: LanguageModelUsage\n}\n\nexport type AISDKStepResult<M extends UIMessage> = {\n stream: ReadableStream<InferUIMessageChunk<M>>\n completion(): AISDKStepCompletion\n}\n\nconst CONTROLLED_SETTINGS: readonly ControlledStreamTextSetting[] = [\n '_internal',\n 'abortSignal',\n 'instructions',\n 'messages',\n 'model',\n 'onToolExecutionEnd',\n 'onToolExecutionStart',\n 'experimental_onToolCallFinish',\n 'experimental_onToolCallStart',\n 'experimental_sandbox',\n 'experimental_toolCallers',\n 'experimental_toolApprovalSecret',\n 'prompt',\n 'prepareStep',\n 'stopWhen',\n 'system',\n 'tools',\n]\n\nconst safeSettings = <T extends ToolSet>(\n settings: AISDKStepSettings<T> | undefined,\n): AISDKStepSettings<T> => {\n const result = { ...settings } as AISDKStepSettings<T>\n for (const key of CONTROLLED_SETTINGS) Reflect.deleteProperty(result, key)\n if (typeof result.timeout === 'object' && result.timeout !== null) {\n const timeout = { ...result.timeout } as Record<string, unknown>\n Reflect.deleteProperty(timeout, 'toolMs')\n Reflect.deleteProperty(timeout, 'tools')\n result.timeout = timeout as ModelStepTimeout<T>\n }\n return result\n}\n\nconst modelToolSet = <T extends ToolSet>(tools: T): T =>\n Object.fromEntries(\n Object.entries(tools).map(([name, tool]) => {\n if (tool.type === 'provider' && tool.isProviderExecuted === true) {\n return [name, tool]\n }\n const definition = { ...tool }\n Reflect.deleteProperty(definition, 'execute')\n return [name, definition]\n }),\n ) as T\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\n/** Run exactly one AI SDK model step while leaving local tool execution to A2. */\nexport async function generateAISDKStep<M extends UIMessage, T extends ToolSet>(\n input: AISDKStepInput<M, T>,\n): Promise<AISDKStepResult<M>> {\n const settings = safeSettings(input.settings)\n const tools = modelToolSet(input.tools)\n const messages =\n input.modelMessages ??\n (await convertToModelMessages(input.messages, { tools }))\n const streamOptions = {\n ...settings,\n model: input.model,\n tools,\n messages,\n abortSignal: input.abortSignal,\n ...(input.instructions === undefined\n ? {}\n : { instructions: input.instructions }),\n stopWhen: stepCountIs(1),\n // A2 records stream failures durably; the AI SDK default writes them to\n // stderr in addition to yielding an error part.\n onError: settings.onError ?? (() => {}),\n } as unknown as StreamTextOptions<T>\n const result = streamText<T>(streamOptions)\n\n let completion: AISDKStepCompletion | undefined\n let fatalError: { value: unknown } | undefined\n const observed = result.stream.pipeThrough(\n new TransformStream<TextStreamPart<T>, TextStreamPart<T>>({\n transform(part, controller) {\n if (part.type === 'error' && fatalError === undefined) {\n fatalError = { value: part.error }\n } else if (part.type === 'finish') {\n completion = {\n finishReason: part.finishReason,\n usage: part.totalUsage,\n }\n }\n controller.enqueue(part)\n },\n }),\n )\n\n return {\n stream: toUIMessageStream<T, M>({\n stream: observed,\n tools,\n generateMessageId: () => input.responseMessageId,\n onError: errorMessage,\n ...(input.messageMetadata === undefined\n ? {}\n : { messageMetadata: input.messageMetadata }),\n }),\n completion() {\n if (fatalError !== undefined) throw fatalError.value\n if (completion === undefined) {\n throw new Error('AI SDK step ended without a finish part')\n }\n if (completion.finishReason === 'error') {\n throw new Error('AI SDK step finished with an error')\n }\n return completion\n },\n }\n}\n","import type { LanguageModel } from 'ai'\nimport type { ModelLimits } from './ai.ts'\n\nconst catalogUrl = 'https://ai-gateway.vercel.sh/v1/models'\nconst catalogLifetimeMs = 60 * 60 * 1_000\nconst catalogTimeoutMs = 5_000\n\nlet catalog:\n | {\n expiresAt: number\n promise: Promise<ReadonlyMap<string, ModelLimits>>\n }\n | undefined\n\nexport const gatewayModelId = (model: LanguageModel): string | undefined => {\n if (typeof model === 'string') {\n return globalThis.AI_SDK_DEFAULT_PROVIDER === undefined ? model : undefined\n }\n return model.provider === 'gateway' ? model.modelId : undefined\n}\n\nconst readCatalog = (): Promise<ReadonlyMap<string, ModelLimits>> => {\n if (catalog && catalog.expiresAt > Date.now()) return catalog.promise\n const entry = {\n expiresAt: Number.POSITIVE_INFINITY,\n promise: (async () => {\n const controller = new AbortController()\n const timeout = setTimeout(\n () => controller.abort(new Error('model catalog request timed out')),\n catalogTimeoutMs,\n )\n timeout.unref?.()\n try {\n const response = await fetch(catalogUrl, { signal: controller.signal })\n if (!response.ok)\n throw new Error(\n `model catalog request failed: HTTP ${response.status}`,\n )\n const body: unknown = await response.json()\n if (\n typeof body !== 'object' ||\n body === null ||\n !('data' in body) ||\n !Array.isArray(body.data)\n ) {\n throw new Error('model catalog response must contain a data array')\n }\n const models = new Map<string, ModelLimits>()\n for (const row of body.data as unknown[]) {\n if (\n typeof row !== 'object' ||\n row === null ||\n !('type' in row) ||\n !('id' in row) ||\n !('context_window' in row) ||\n !('max_tokens' in row) ||\n row.type !== 'language' ||\n typeof row.id !== 'string' ||\n typeof row.context_window !== 'number' ||\n typeof row.max_tokens !== 'number' ||\n !Number.isSafeInteger(row.context_window) ||\n row.context_window <= 0 ||\n !Number.isSafeInteger(row.max_tokens) ||\n row.max_tokens <= 0\n )\n continue\n models.set(row.id, {\n contextWindow: row.context_window,\n maxOutputTokens: row.max_tokens,\n })\n }\n return models\n } finally {\n clearTimeout(timeout)\n }\n })(),\n }\n catalog = entry\n entry.promise = entry.promise.then(\n (models) => {\n entry.expiresAt = Date.now() + catalogLifetimeMs\n return models\n },\n (error: unknown) => {\n if (catalog === entry) catalog = undefined\n throw error\n },\n )\n return entry.promise\n}\n\nexport const readModelLimits = async (options: {\n modelId: string\n signal: AbortSignal\n}): Promise<ModelLimits | null> => {\n options.signal.throwIfAborted()\n let onAbort!: () => void\n const aborted = new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(options.signal.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n })\n try {\n const models = await Promise.race([readCatalog(), aborted])\n return models.get(options.modelId) ?? null\n } finally {\n options.signal.removeEventListener('abort', onAbort)\n }\n}\n","/**\n * experimental-a2/ai/server — the server-only implementation of an experimental-a2/ai definition.\n *\n * `createHandlers()` exposes the ordinary A2 handler table;\n * `createAgentServer()` is its batteries-included assembly with createServer.\n */\n\n// oxlint-disable no-await-in-loop -- stream chunks and durable appends are\n// ordered; parallel consumption would corrupt progress sequence and state.\n\nimport { createControlRuntime, ControlCancelled } from './ai-control-server.ts'\nimport type { ControlCommit } from './ai-control.ts'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { asSchema, convertToModelMessages } from 'ai'\nimport type {\n FinishReason,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport { generateAISDKStep, type AISDKStepSettings } from './ai-sdk-step.ts'\nimport { gatewayModelId, readModelLimits } from './ai-model-metadata.ts'\nimport type {\n AIEventDefs,\n AIState,\n AgentDefinition,\n AgentToolContext,\n AgentToolEventDefs,\n ApprovalRequestedPayload,\n CompactionCompletedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationStartedPayload,\n MessageCompletedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n type AICoordinatorState,\n} from './ai-coordinator.ts'\nimport type { AppendInput, ContractEvent, EventDefs } from './contract.ts'\nimport { A2Error } from './errors.ts'\nimport {\n consumeSchedulerSendFailure,\n installAmbientToolScopeStorage,\n type AmbientToolScope,\n} from './internal.ts'\nimport {\n createServer,\n type A2Server,\n type HandlerContext,\n type ServerOptions,\n} from './server.ts'\nimport {\n setServerFetchHooks,\n type ServerIngressContext,\n} from './server-fetch.ts'\n\nfunction validateAgentIngress(context: ServerIngressContext): void {\n const rejected = context.events.find((event) => {\n if (event.type !== 'ai.control.requested') return true\n const command = event.payload as Record<string, unknown>\n if (\n command['action'] === 'request-input' ||\n command['action'] === 'tool-result'\n )\n return true\n if (\n command['action'] === 'send' ||\n command['action'] === 'edit' ||\n command['action'] === 'steer'\n ) {\n return (\n (command['message'] as { role?: unknown } | undefined)?.role !== 'user'\n )\n }\n return false\n })\n if (rejected !== undefined) {\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `event '${rejected.type}' is server-only for an AI agent`,\n )\n }\n}\n\ntype AgentGenerationProgress = {\n type: 'progress'\n chunks: UIMessageChunk[]\n}\n\ntype AgentGenerationFinish = {\n type: 'finish'\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype AgentGenerationUpdate = AgentGenerationProgress | AgentGenerationFinish\n\nexport type AgentGenerateContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = {\n request: ContractEvent<D, 'ai.generation.requested'>\n requestId: string\n generationId: string\n responseMessageId: string\n messages: M[]\n modelMessages: ModelMessage[]\n state: AIState<M>\n session: Pick<HandlerContext<D>['session'], 'state'>\n signal: AbortSignal\n model: LanguageModel\n tools: T\n instructions?: Instructions\n generation: AgentGenerationSettings<T>\n}\n\nexport type AgentGenerate<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = (\n context: AgentGenerateContext<M, D, T>,\n) => ReadableStream<UIMessageChunk> | Promise<ReadableStream<UIMessageChunk>>\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\nexport type AgentMessageMetadata<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = (\n context: AgentGenerateContext<M, D, T> & { part: TextStreamPart<T> },\n) => UIMessageMetadata<M> | undefined\n\nexport type AgentResolverContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n event: ContractEvent<D, 'ai.generation.requested'>\n state: AIState<M>\n session: Pick<HandlerContext<D>['session'], 'state'>\n signal: AbortSignal\n}\n\nexport type Resolvable<T, C> = T | ((context: C) => T | Promise<T>)\n\nexport type CompactionPolicy<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n shouldCompact(\n context: AgentResolverContext<M, D> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): boolean | Promise<boolean>\n compact(\n context: AgentResolverContext<M, D> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): M[] | Promise<M[]>\n}\n\nexport type AutomaticCompaction = {\n thresholdTokens?: number\n instructions?: string\n}\n\nexport type CompactionOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = false | AutomaticCompaction | CompactionPolicy<M, D>\n\nexport type AgentGenerationSettings<T extends ToolSet> = AISDKStepSettings<T>\n\nexport type CreateHandlersOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n> = {\n agent: AgentDefinition<M, D>\n /** AI SDK model string or provider model, optionally resolved per generation. */\n model: Resolvable<LanguageModel, AgentResolverContext<M, D>>\n tools?: T\n instructions?: Resolvable<\n Instructions | undefined,\n AgentResolverContext<M, D>\n >\n /** Settings for each one-step AI SDK streamText call. */\n generation?: AgentGenerationSettings<T>\n /**\n * Maximum model steps in one assistant response. Defaults to Infinity.\n */\n maxSteps?: number\n /** Map default AI SDK stream parts to typed assistant message metadata. */\n messageMetadata?: AgentMessageMetadata<M, D, T>\n /**\n * Replace model generation with an AI SDK UI message chunk stream.\n * The custom stream owns its metadata chunks.\n */\n generate?: AgentGenerate<M, D, T>\n compaction?: Resolvable<CompactionOptions<M, D>, AgentResolverContext<M, D>>\n /** Progress is durably flushed at either limit, whichever is reached first. */\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}\n\nexport type CreateAgentServerOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n> = CreateHandlersOptions<M, D, T> &\n Omit<ServerOptions<D>, 'contract' | 'handlers'> & {\n handlers?: ServerOptions<D>['handlers']\n }\n\nconst checkAbort = (signal: AbortSignal): boolean => {\n if (!signal.aborted) return false\n const reason: unknown = signal.reason\n if (\n reason instanceof A2Error &&\n (reason.code === 'CLAIM_EXPIRED' || reason.code === 'SUPERSEDED_ATTEMPT')\n ) {\n throw reason\n }\n return true\n}\n\nconst resolve = async <T, C extends { signal: AbortSignal }>(\n value: Resolvable<T, C>,\n context: C,\n): Promise<T> => {\n let result: T\n try {\n result =\n typeof value === 'function'\n ? await (value as (context: C) => T | Promise<T>)(context)\n : value\n } catch (error) {\n checkAbort(context.signal)\n throw error\n }\n checkAbort(context.signal)\n return result\n}\n\nconst modelName = (model: LanguageModel): string => {\n if (typeof model === 'string') return model\n if ('modelId' in model && typeof model.modelId === 'string') {\n return model.modelId\n }\n return 'custom'\n}\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\nconst toolScopeStorage = installAmbientToolScopeStorage(\n () => new AsyncLocalStorage<AmbientToolScope>(),\n)\n\n/** Run `fn` with `ctx` as the ambient tool handler context, for direct tool tests. */\nexport function runWithHandlerContext<D extends AgentToolEventDefs, R>(\n ctx: AgentToolContext<D>,\n fn: () => R,\n): R {\n return toolScopeStorage.run({ context: ctx }, fn)\n}\n\nconst promptCacheKey = (sessionId: string, generationId: string): string =>\n `${sessionId}\\u001f${generationId}`\n\nconst asyncIterator = (value: unknown): AsyncIterator<unknown> | undefined => {\n if (typeof value !== 'object' || value === null) return undefined\n const factory = Reflect.get(value, Symbol.asyncIterator)\n if (typeof factory !== 'function') return undefined\n return (factory as (this: object) => AsyncIterator<unknown>).call(value)\n}\n\nconst isBoundaryChunk = (chunk: UIMessageChunk | undefined): boolean =>\n chunk !== undefined &&\n (chunk.type === 'text-end' ||\n chunk.type === 'reasoning-end' ||\n chunk.type === 'tool-input-available' ||\n chunk.type === 'tool-input-error' ||\n chunk.type === 'tool-output-available' ||\n chunk.type === 'tool-output-error' ||\n chunk.type === 'tool-output-denied' ||\n chunk.type === 'tool-approval-request' ||\n chunk.type === 'finish' ||\n chunk.type === 'abort' ||\n chunk.type === 'error')\n\ntype StreamRead<T> = Awaited<ReturnType<ReadableStreamDefaultReader<T>['read']>>\n\nconst nextOrTimer = async <T>(\n next: Promise<StreamRead<T>>,\n delayMs: number,\n): Promise<{ type: 'next'; result: StreamRead<T> } | { type: 'timer' }> => {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n next.then((result) => ({ type: 'next' as const, result })),\n new Promise<{ type: 'timer' }>((finishTimer) => {\n timer = setTimeout(() => finishTimer({ type: 'timer' }), delayMs)\n ;(timer as { unref?: () => void }).unref?.()\n }),\n ])\n } finally {\n if (timer !== undefined) clearTimeout(timer)\n }\n}\n\ntype GenerationCompletion = {\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype GenerationSource = {\n stream: ReadableStream<UIMessageChunk>\n completion?: () => GenerationCompletion\n}\n\nasync function generateWithAISDK<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(\n context: AgentGenerateContext<M, D, T>,\n messageMetadata: AgentMessageMetadata<M, D, T> | undefined,\n): Promise<GenerationSource> {\n const step = await generateAISDKStep<M, T>({\n model: context.model,\n tools: context.tools,\n messages: context.messages,\n modelMessages: context.modelMessages,\n responseMessageId: context.responseMessageId,\n abortSignal: context.signal,\n ...(context.instructions === undefined\n ? {}\n : { instructions: context.instructions }),\n settings: context.generation,\n ...(messageMetadata === undefined\n ? {}\n : {\n messageMetadata: ({ part }) => messageMetadata({ ...context, part }),\n }),\n })\n return {\n stream: step.stream as ReadableStream<UIMessageChunk>,\n completion: step.completion,\n }\n}\n\nasync function* consumeGeneration(options: {\n source: GenerationSource\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}): AsyncGenerator<AgentGenerationUpdate> {\n const pending: UIMessageChunk[] = []\n let streamedFinishReason: FinishReason | undefined\n let streamedError: string | undefined\n const maxChunks = options.progress?.maxChunks ?? 16\n const maxDelayMs = options.progress?.maxDelayMs ?? 30\n let lastFlush = Date.now()\n const reader = options.source.stream.getReader()\n let pendingChunk = reader.read()\n try {\n for (;;) {\n let result: StreamRead<UIMessageChunk>\n if (pending.length > 0) {\n const remaining = Math.max(0, maxDelayMs - (Date.now() - lastFlush))\n const outcome = await nextOrTimer(pendingChunk, remaining)\n if (outcome.type === 'timer') {\n yield { type: 'progress', chunks: pending.splice(0) }\n lastFlush = Date.now()\n continue\n }\n result = outcome.result\n } else {\n result = await pendingChunk\n }\n if (result.done) break\n const chunk = result.value\n pending.push(chunk)\n if (chunk.type === 'finish') streamedFinishReason = chunk.finishReason\n if (chunk.type === 'error') streamedError = chunk.errorText\n pendingChunk = reader.read()\n\n if (pending.length >= maxChunks || isBoundaryChunk(pending.at(-1))) {\n yield { type: 'progress', chunks: pending.splice(0) }\n lastFlush = Date.now()\n }\n }\n } catch (error) {\n if (pending.length > 0)\n yield { type: 'progress', chunks: pending.splice(0) }\n throw error\n } finally {\n void pendingChunk.catch(() => {})\n try {\n await reader.cancel()\n } catch {\n // Cleanup must not replace the error that ended generation.\n } finally {\n reader.releaseLock()\n }\n }\n\n let completion: GenerationCompletion | undefined\n try {\n completion = options.source.completion?.()\n } catch (error) {\n if (pending.length > 0) {\n yield { type: 'progress', chunks: pending.splice(0) }\n }\n throw error\n }\n if (pending.length > 0) {\n yield { type: 'progress', chunks: pending.splice(0) }\n }\n if (streamedError !== undefined) throw new Error(streamedError)\n const finishReason = completion?.finishReason ?? streamedFinishReason\n yield {\n type: 'finish',\n ...(finishReason === undefined ? {} : { finishReason }),\n ...(completion?.usage === undefined ? {} : { usage: completion.usage }),\n }\n}\n\nconst foldAIEvents = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n state: AIState<M>\n events: ContractEvent<D>[]\n}): AIState<M> => {\n let state = options.state\n for (const event of options.events)\n state = options.agent.reducer.fold(state, event)\n return state\n}\n\nconst summarize = async <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n context: AgentGenerateContext<M, D, T>\n instructions: string | undefined\n}): Promise<{ summary: string; usage?: LanguageModelUsage }> => {\n const instruction = [\n 'Summarize this conversation so you can continue the task after the earlier context is replaced by your summary.',\n 'Preserve the objective, constraints, decisions, exact identifiers, completed actions and their results, unresolved questions, and next steps. Distinguish observations from assumptions.',\n 'Respond only with the summary as text. Do not call any tools or continue working on the task.',\n options.instructions,\n ]\n .filter(Boolean)\n .join('\\n')\n const generation = { ...options.context.generation }\n for (const key of Object.keys(generation)) {\n if (\n key.startsWith('on') ||\n key.startsWith('experimental_on') ||\n [\n 'repairToolCall',\n 'experimental_repairToolCall',\n 'experimental_refineToolInput',\n 'experimental_transform',\n 'toolApproval',\n ].includes(key)\n ) {\n Reflect.deleteProperty(generation, key)\n }\n }\n const tools = Object.fromEntries(\n Object.entries(options.context.tools).map(([name, tool]) => {\n const definition = { ...tool, needsApproval: false }\n for (const key of [\n 'execute',\n 'onInputStart',\n 'onInputDelta',\n 'onInputAvailable',\n ]) {\n Reflect.deleteProperty(definition, key)\n }\n return [name, definition]\n }),\n ) as T\n const source = await generateWithAISDK(\n {\n ...options.context,\n generation,\n tools,\n modelMessages: [\n ...options.context.modelMessages,\n { role: 'user', content: instruction },\n ],\n responseMessageId: `${options.context.generationId}:summary`,\n },\n undefined,\n )\n let summary = ''\n let calledTool = false\n let finish: AgentGenerationFinish | undefined\n for await (const update of consumeGeneration({ source })) {\n options.context.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n for (const chunk of update.chunks) {\n if (chunk.type === 'text-delta') summary += chunk.delta\n if (chunk.type.startsWith('tool-')) calledTool = true\n }\n }\n if (\n calledTool ||\n summary.trim().length === 0 ||\n finish?.finishReason !== 'stop'\n ) {\n throw new Error(\n 'compaction must produce a complete text summary without calling tools',\n )\n }\n return {\n summary,\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n}\n\nconst activeCompaction = <M extends UIMessage>(\n state: AIState<M>,\n): AIState<M>['compaction'] => {\n const compaction = state.compaction\n return compaction?.status === 'completed' &&\n compaction.messages !== undefined &&\n state.messages.some((message) => message.id === compaction.throughMessageId)\n ? compaction\n : null\n}\n\nconst contextMessages = async <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n session: HandlerContext<D>['session']\n snapshot: { state: AIState<M>; index: number }\n coordinator: AICoordinatorState\n appended?: ContractEvent<D>[]\n excluded?: ReadonlySet<string>\n}): Promise<M[]> => {\n const { agent, session, snapshot } = options\n const appended = options.appended ?? []\n const state = foldAIEvents({ agent, events: appended, state: snapshot.state })\n const compaction = activeCompaction(state)\n const queued = new Set(\n options.coordinator.queued.map((item) => item.messageId),\n )\n const visible = (messages: M[]): M[] =>\n messages.filter((message) => !queued.has(message.id))\n if (compaction === null) return visible(state.messages)\n const retained = new Set(compaction.retainedMessageIds ?? [])\n const throughIndex = compaction.throughIndex\n if (throughIndex !== undefined) {\n const [prefix, priorCoordinator, tail] = await Promise.all([\n throughIndex === snapshot.index\n ? Promise.resolve(snapshot)\n : session.state(agent.reducer, { through: throughIndex }),\n session.state(aiCoordinatorReducer(agent.contract), {\n through: throughIndex,\n }),\n throughIndex >= snapshot.index\n ? Promise.resolve([])\n : session.history({ gte: throughIndex + 1, lte: snapshot.index }),\n ])\n for (const item of priorCoordinator.state.queued)\n retained.add(item.messageId)\n const events =\n options.excluded === undefined\n ? tail\n : withoutGenerationLifecycle(tail, options.excluded)\n const context = foldAIEvents({\n agent,\n events: [...events, ...appended],\n state: {\n ...prefix.state,\n messages: [\n ...compaction.messages!,\n ...prefix.state.messages.filter((message) =>\n retained.has(message.id),\n ),\n ],\n activeProjection: null,\n },\n })\n const positions = new Map<string, number>()\n for (const message of [...compaction.messages!, ...state.messages]) {\n if (!positions.has(message.id)) positions.set(message.id, positions.size)\n }\n return visible(\n context.messages.toSorted(\n (left, right) =>\n (positions.get(left.id) ?? positions.size) -\n (positions.get(right.id) ?? positions.size),\n ),\n )\n }\n const boundary = state.messages.findIndex(\n (message) => message.id === compaction.throughMessageId,\n )\n return visible([\n ...compaction.messages!,\n ...state.messages\n .slice(0, boundary + 1)\n .filter((message) => retained.has(message.id)),\n ...state.messages.slice(boundary + 1),\n ])\n}\n\nconst modelContext = async <M extends UIMessage>(options: {\n messages: M[]\n state: AIState<M>\n tools: ToolSet\n}): Promise<ModelMessage[]> => {\n const messages = await convertToModelMessages(options.messages, {\n tools: options.tools,\n })\n const summary = activeCompaction(options.state)?.summary\n return summary === undefined\n ? messages\n : [{ role: 'user', content: summary }, ...messages]\n}\n\nconst estimateInputTokens = async (options: {\n messages: ModelMessage[]\n instructions: Instructions | undefined\n tools: ToolSet\n}): Promise<number> => {\n const tools = await Promise.all(\n Object.entries(options.tools).map(async ([name, tool]) => ({\n name,\n description: tool.description,\n inputSchema: await asSchema(tool.inputSchema).jsonSchema,\n })),\n )\n return Math.ceil(\n new TextEncoder().encode(\n JSON.stringify({\n messages: options.messages,\n instructions: options.instructions,\n tools,\n }),\n ).byteLength / 4,\n )\n}\n\nconst measuredInputTokens = (options: {\n estimate: number\n model: string\n calibration: AICoordinatorState['calibration']\n}): number => {\n const previous = options.calibration\n return previous !== undefined &&\n previous.model === options.model &&\n options.estimate >= previous.estimate\n ? Math.max(\n options.estimate,\n Math.ceil(previous.inputTokens + options.estimate - previous.estimate),\n )\n : options.estimate\n}\n\ntype ToolCallClassification = 'automatic' | 'approval' | 'unknown'\n\ntype PendingToolCall = {\n call: ToolCalledPayload\n classification: ToolCallClassification\n}\n\nconst toolCalledEvent = <D extends EventDefs>(\n payload: ToolCalledPayload,\n): AppendInput<D> =>\n ({\n type: 'ai.tool.called',\n id: `${payload.generationId}:tool:${payload.toolCallId}:called`,\n payload,\n }) as AppendInput<D>\n\nconst approvalClassification = <T extends ToolSet>(\n tools: T,\n generation: AgentGenerationSettings<T>,\n toolName: string,\n): ToolCallClassification => {\n const configured = generation.toolApproval\n if (typeof configured === 'function') return 'unknown'\n const policy = configured?.[toolName]\n if (typeof policy === 'function') return 'unknown'\n if (\n policy === 'user-approval' ||\n (typeof policy === 'object' && policy?.type === 'user-approval')\n ) {\n return 'approval'\n }\n if (\n policy === 'denied' ||\n (typeof policy === 'object' && policy?.type === 'denied')\n ) {\n return 'approval'\n }\n const tool = tools[toolName] as { needsApproval?: unknown } | undefined\n if (typeof tool?.needsApproval === 'function') return 'unknown'\n return tool?.needsApproval === true ? 'approval' : 'automatic'\n}\n\nconst lifecycleEvents = <D extends EventDefs, T extends ToolSet>(options: {\n requestId: string\n messageId: string\n generationId: string\n sequence: number\n chunks: UIMessageChunk[]\n pending: PendingToolCall[]\n tools: T\n generation: AgentGenerationSettings<T>\n custom: boolean\n}): { events: AppendInput<D>[]; pending: PendingToolCall[] } => {\n const result: AppendInput<D>[] = []\n const pending = [...options.pending]\n const take = (toolCallId: string): PendingToolCall | undefined => {\n const index = pending.findIndex(\n (candidate) => candidate.call.toolCallId === toolCallId,\n )\n if (index === -1) return undefined\n return pending.splice(index, 1)[0]\n }\n const flush = (toolCallId: string): void => {\n const pendingCall = take(toolCallId)\n if (pendingCall) result.push(toolCalledEvent<D>(pendingCall.call))\n }\n for (const [chunkIndex, chunk] of options.chunks.entries()) {\n const resultId = `${options.generationId}:tool-result:${options.sequence}:${chunkIndex}`\n if (chunk.type === 'tool-input-available') {\n const payload: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...((\n options.tools[chunk.toolName] as\n { supportsDeferredResults?: boolean } | undefined\n )?.supportsDeferredResults === true\n ? { supportsDeferredResults: true }\n : {}),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n }\n take(payload.toolCallId)\n const classification = approvalClassification(\n options.tools,\n options.generation,\n chunk.toolName,\n )\n if (classification === 'automatic') {\n result.push(toolCalledEvent<D>(payload))\n } else {\n pending.push({ call: payload, classification })\n }\n } else if (chunk.type === 'tool-input-error') {\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n ...(chunk.dynamic ? { input: chunk.input } : { rawInput: chunk.input }),\n error: chunk.errorText,\n phase: 'input',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n const called: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n }\n take(chunk.toolCallId)\n result.push(toolCalledEvent<D>(called), {\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-available') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n output: chunk.output,\n phase: 'execution',\n ...(chunk.preliminary === undefined\n ? {}\n : { preliminary: chunk.preliminary }),\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-error') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n error: chunk.errorText,\n phase: 'execution',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-denied') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n denied: true,\n phase: 'execution',\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-request') {\n flush(chunk.toolCallId)\n const payload: ApprovalRequestedPayload = {\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n toolCallId: chunk.toolCallId,\n ...(chunk.isAutomatic === undefined\n ? {}\n : { isAutomatic: chunk.isAutomatic }),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n result.push({\n type: 'ai.approval.requested',\n id: `${options.generationId}:approval:${chunk.approvalId}`,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-response') {\n result.push({\n type: 'ai.approval.responded',\n id: `${options.generationId}:approval:${chunk.approvalId}:automatic-response`,\n payload: {\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n },\n } as AppendInput<D>)\n }\n }\n return { events: result, pending }\n}\n\nfunction withoutGenerationLifecycle<D extends EventDefs>(\n history: ContractEvent<D>[],\n generationIds: ReadonlySet<string>,\n): ContractEvent<D>[] {\n if (generationIds.size === 0) return history\n const approvalKeys = new Set<string>()\n const inputKeys = new Set<string>()\n for (const event of history) {\n const payload = event.payload as {\n generationId?: unknown\n messageId?: unknown\n approvalId?: unknown\n inputId?: unknown\n }\n if (\n typeof payload.generationId !== 'string' ||\n !generationIds.has(payload.generationId) ||\n typeof payload.messageId !== 'string'\n ) {\n continue\n }\n if (\n event.type === 'ai.approval.requested' &&\n typeof payload.approvalId === 'string'\n ) {\n approvalKeys.add(`${payload.messageId}\\u001f${payload.approvalId}`)\n }\n if (\n event.type === 'ai.input.requested' &&\n typeof payload.inputId === 'string'\n ) {\n inputKeys.add(`${payload.messageId}\\u001f${payload.inputId}`)\n }\n }\n return history.filter((event) => {\n const payload = event.payload as {\n generationId?: unknown\n messageId?: unknown\n approvalId?: unknown\n inputId?: unknown\n }\n if (\n typeof payload.generationId === 'string' &&\n generationIds.has(payload.generationId)\n ) {\n return false\n }\n if (\n event.type === 'ai.approval.responded' &&\n typeof payload.messageId === 'string' &&\n typeof payload.approvalId === 'string'\n ) {\n return !approvalKeys.has(\n `${payload.messageId}\\u001f${payload.approvalId}`,\n )\n }\n if (\n event.type === 'ai.input.responded' &&\n typeof payload.messageId === 'string' &&\n typeof payload.inputId === 'string'\n ) {\n return !inputKeys.has(`${payload.messageId}\\u001f${payload.inputId}`)\n }\n return true\n })\n}\n\nconst validateCompaction = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n compaction: CompactionOptions<M, D>\n explicit: boolean\n generation: AgentGenerationSettings<T> | undefined\n tools: T | undefined\n}): CompactionOptions<M, D> => {\n let compaction = options.compaction\n if (\n compaction !== false &&\n (typeof compaction !== 'object' || compaction === null)\n ) {\n throw new TypeError('compaction must resolve to false or a policy object')\n }\n if (compaction !== false && 'then' in compaction) {\n void Promise.resolve(compaction).catch(() => {})\n throw new TypeError('compaction options must be a policy or a resolver')\n }\n if (compaction !== false && !('shouldCompact' in compaction)) {\n if (\n compaction.thresholdTokens !== undefined &&\n (!Number.isSafeInteger(compaction.thresholdTokens) ||\n compaction.thresholdTokens < 1)\n ) {\n throw new TypeError(\n 'compaction.thresholdTokens must be a positive safe integer',\n )\n }\n const choice = options.generation?.toolChoice\n const unsupported =\n options.generation?.output !== undefined\n ? 'structured output'\n : choice !== undefined && choice !== 'auto' && choice !== 'none'\n ? 'forced tool choice'\n : Object.values(options.tools ?? {}).some(\n (tool) =>\n tool.type === 'provider' && tool.isProviderExecuted === true,\n )\n ? 'provider-executed tools'\n : undefined\n if (unsupported !== undefined) {\n if (options.explicit) {\n throw new TypeError(\n `automatic compaction does not support ${unsupported}; use a custom policy or compaction: false`,\n )\n }\n compaction = false\n }\n }\n\n return compaction\n}\n\n/**\n * Build the ordinary A2 handler table for the built-in agent protocol.\n * Application handlers can be spread beside this table.\n */\nexport function createHandlers<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n>(\n options: CreateHandlersOptions<M, D, T>,\n): NonNullable<ServerOptions<D>['handlers']> {\n if (options.model === undefined) {\n throw new TypeError('createHandlers requires model')\n }\n if (\n options.progress?.maxChunks !== undefined &&\n (!Number.isInteger(options.progress.maxChunks) ||\n options.progress.maxChunks < 1)\n ) {\n throw new TypeError('progress.maxChunks must be a positive integer')\n }\n if (\n options.progress?.maxDelayMs !== undefined &&\n (!Number.isFinite(options.progress.maxDelayMs) ||\n options.progress.maxDelayMs < 0)\n ) {\n throw new TypeError('progress.maxDelayMs must be a non-negative number')\n }\n if (\n options.maxSteps !== undefined &&\n options.maxSteps !== Number.POSITIVE_INFINITY &&\n (!Number.isInteger(options.maxSteps) || options.maxSteps < 1)\n ) {\n throw new TypeError('maxSteps must be a positive integer or Infinity')\n }\n\n const configuredCompaction =\n options.compaction ?? (options.generate === undefined ? {} : false)\n const staticCompaction =\n typeof configuredCompaction === 'function'\n ? undefined\n : validateCompaction({\n compaction: configuredCompaction,\n explicit: options.compaction !== undefined,\n generation: options.generation,\n tools: options.tools,\n })\n\n const tools = options.tools ?? ({} as T)\n const generation: AgentGenerationSettings<T> = options.generation ?? {}\n const maxSteps = options.maxSteps ?? Number.POSITIVE_INFINITY\n const control = createControlRuntime({ agent: options.agent })\n const coordinator = control.coordinator\n const promptCache = new Map<string, Promise<ModelMessage[]>>()\n\n type RuntimeTool = {\n execute?: (\n input: unknown,\n options: {\n toolCallId: string\n messages: ModelMessage[]\n abortSignal?: AbortSignal\n },\n ) => unknown\n }\n\n type ToolHandlerContext = HandlerContext<D, 'ai.tool.execution.requested'>\n\n const resultEvent = (\n call: ToolCalledPayload,\n suffix: string,\n result: {\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n },\n ): AppendInput<D> =>\n ({\n type: 'ai.tool.result',\n id: `${call.generationId}:tool:${call.toolCallId}:${suffix}`,\n payload: {\n requestId: call.requestId,\n messageId: call.messageId,\n generationId: call.generationId,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n phase: 'execution',\n ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.denied === undefined ? {} : { denied: result.denied }),\n ...(result.preliminary === undefined\n ? {}\n : { preliminary: result.preliminary }),\n ...(call.dynamic === undefined ? {} : { dynamic: call.dynamic }),\n ...(call.providerExecuted === undefined\n ? {}\n : { providerExecuted: call.providerExecuted }),\n ...(call.toolMetadata === undefined\n ? {}\n : { toolMetadata: call.toolMetadata }),\n },\n }) as AppendInput<D>\n\n const promptMessages = (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<ModelMessage[]> => {\n const { ctx, call, generation: owner } = input\n const key = promptCacheKey(ctx.event.sessionId, call.generationId)\n const cached = promptCache.get(key)\n if (cached) return cached\n const computation = (async () => {\n const frontier = owner.promptThroughIndex\n if (frontier === undefined)\n throw new TypeError('AI work requires a prompt checkpoint')\n const [snapshot, atPrompt, tail] = await Promise.all([\n ctx.session.state(options.agent.reducer, { through: frontier }),\n ctx.session.state(coordinator, { through: frontier }),\n ctx.session.history({ gte: frontier + 1, lte: ctx.event.index }),\n ])\n const appended = tail.filter(\n (event) =>\n (event.type === 'ai.generation.started' ||\n event.type === 'ai.compaction.requested' ||\n event.type === 'ai.compaction.completed') &&\n (event.payload as { generationId: string }).generationId ===\n call.generationId,\n )\n const state = foldAIEvents({\n agent: options.agent,\n events: appended,\n state: snapshot.state,\n })\n return modelContext({\n messages: await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot,\n coordinator: atPrompt.state,\n appended,\n }),\n state,\n tools,\n })\n })()\n promptCache.set(key, computation)\n void computation.catch(() => {\n if (promptCache.get(key) === computation) promptCache.delete(key)\n })\n return computation\n }\n\n const toolExecutionFailure = (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n error: unknown,\n ): AppendInput<D> | void => {\n const schedulerFailure = consumeSchedulerSendFailure(error)\n if (checkAbort(ctx.signal)) return\n if (schedulerFailure === 'retryable') throw error\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: errorMessage(error),\n })\n }\n\n const runToolExecution = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n execute: NonNullable<RuntimeTool['execute']>,\n messages: ModelMessage[],\n ): Promise<AppendInput<D> | void> => {\n let output: unknown\n try {\n output = await execute(call.input, {\n toolCallId: call.toolCallId,\n messages,\n abortSignal: ctx.signal,\n })\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n let iterator: AsyncIterator<unknown> | undefined\n try {\n iterator = asyncIterator(output)\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (iterator === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:0`, { output })\n }\n let last: unknown\n let sequence = 0\n let done = false\n try {\n for (;;) {\n let result: IteratorResult<unknown>\n try {\n result = await iterator.next()\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (result.done) {\n if (ctx.signal.reason instanceof A2Error) throw ctx.signal.reason\n done = true\n break\n }\n if (checkAbort(ctx.signal)) return\n last = result.value\n await control.append({\n ctx,\n name: `tool:${call.toolCallId}:preliminary:${sequence}`,\n events: [\n resultEvent(\n call,\n `${ctx.event.id}:execution:${ctx.attempt}:${sequence}:preliminary`,\n {\n output: result.value,\n preliminary: true,\n },\n ),\n ],\n })\n sequence += 1\n }\n } finally {\n if (!done) {\n try {\n await iterator.return?.()\n } catch {\n // Preserve the failure or cancellation that ended execution.\n }\n }\n }\n return resultEvent(\n call,\n `${ctx.event.id}:execution:${sequence}:final`,\n sequence === 0 ? {} : { output: last },\n )\n }\n\n const executeTool = async (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<AppendInput<D> | void> => {\n const { ctx, call } = input\n const tool = tools[call.toolName] as RuntimeTool | undefined\n const execute = tool?.execute\n if (execute === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: `Tool '${call.toolName}' has no server executor`,\n })\n }\n const messages = await promptMessages(input)\n if (checkAbort(ctx.signal)) return\n const scope: AmbientToolScope = {\n contract: options.agent.contract,\n context: ctx,\n }\n // Async iteration resumes in the caller's context, so the whole\n // execution, not just the execute call, runs inside the scope.\n return toolScopeStorage.run(scope, () =>\n runToolExecution(ctx, call, execute, messages),\n )\n }\n\n const handleToolExecution = async (\n ctx: ToolHandlerContext,\n ): Promise<AppendInput<D>> => {\n try {\n const state = (\n await ctx.session.state(control.reducer, { through: 'latest' })\n ).state\n const request = ctx.event.payload\n const call = state.coordinator.response?.calls.find(\n (candidate) => candidate.work?.id === ctx.event.id,\n )\n if (\n state.active?.turnId !== request.turnId ||\n state.active.suspended ||\n state.active.version !== request.version ||\n state.coordinator.response?.failure !== undefined ||\n !call ||\n call.terminal ||\n call.work?.settled\n )\n return control.settled({ ctx, events: undefined })\n return control.settled({\n ctx,\n events: await executeTool({\n ctx,\n call: request.call,\n generation: request.generation,\n }),\n })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n }\n\n const generationHandler = async (\n ctx: HandlerContext<D, 'ai.generation.requested'>,\n ): Promise<void | AppendInput<D> | readonly AppendInput<D>[]> => {\n if (checkAbort(ctx.signal)) return\n const requestId = ctx.event.id\n const request = ctx.event.payload\n const snapshot = await ctx.session.state(options.agent.reducer, {\n through: 'latest',\n })\n if (\n snapshot.state.active?.phase === 'paused' ||\n snapshot.state.active?.phase === 'pausing'\n )\n return\n const coordinatorState = (\n await ctx.session.state(coordinator, { through: snapshot.index })\n ).state\n if (\n coordinatorState.closed ||\n coordinatorState.response?.activeRequestId !== requestId\n )\n return\n const response = coordinatorState.response\n const current =\n response.generation?.requestId === requestId\n ? response.generation\n : undefined\n if (\n current !== undefined &&\n (response.completion !== undefined ||\n (response.failure !== undefined &&\n response.failure.superseded !== true))\n )\n return\n if (current !== undefined && current.attempt >= ctx.attempt) return\n const attempt = ctx.attempt\n const generationId = `${requestId}:generation:${attempt}`\n const responseMessageId =\n request.responseMessageId ??\n (request.reason === 'message'\n ? `${request.messageId}:assistant`\n : request.messageId)\n const responseStepCount = response.stepCount\n if (\n request.reason === 'tool' &&\n (requestId !==\n `ai.generate:tools:${response.source?.generation.generationId}` ||\n response.responseMessageId !== request.messageId ||\n response.responseMessageId !== request.responseMessageId)\n )\n return\n const previous = current\n const replaced =\n previous === undefined\n ? []\n : [{ generation: previous, frontier: response.promptThroughIndex! }]\n if (request.reason === 'retry' && response.source?.failed) {\n replaced.push({\n generation: response.source.generation,\n frontier: response.source.promptThroughIndex,\n })\n }\n const replacedGenerationIds = new Set(\n replaced.map(({ generation: owner }) => owner.generationId),\n )\n let state = snapshot.state\n if (replaced.length > 0) {\n const through = Math.min(...replaced.map(({ frontier }) => frontier))\n const baseline = await ctx.session.state(options.agent.reducer, {\n through,\n })\n const tail = await ctx.session.history({\n gte: through + 1,\n lte: snapshot.index,\n })\n state = foldAIEvents({\n agent: options.agent,\n events: withoutGenerationLifecycle(tail, replacedGenerationIds),\n state: baseline.state,\n })\n }\n const resolverContext: AgentResolverContext<M, D> = {\n event: ctx.event,\n state,\n session: {\n state: (reducer, readOptions) =>\n ctx.session.state(reducer, {\n ...readOptions,\n through: readOptions?.through ?? snapshot.index,\n }),\n },\n signal: ctx.signal,\n }\n\n let generationStarted = false\n try {\n const resolvedModel = await resolve(options.model, resolverContext)\n if (resolvedModel === undefined) {\n throw new TypeError('the model resolver returned undefined')\n }\n if (checkAbort(ctx.signal)) return\n const resolvedInstructions =\n options.instructions === undefined\n ? undefined\n : await resolve(options.instructions, resolverContext)\n if (checkAbort(ctx.signal)) return\n const compaction =\n typeof configuredCompaction === 'function'\n ? validateCompaction({\n compaction: await resolve(configuredCompaction, resolverContext),\n explicit: true,\n generation: options.generation,\n tools: options.tools,\n })\n : staticCompaction!\n if (checkAbort(ctx.signal)) return\n\n if (request.reason === 'tool' && responseStepCount >= maxSteps) {\n const source = response.source?.generation\n if (source === undefined) return\n return {\n type: 'ai.generation.failed',\n id: `${requestId}:step-limit`,\n payload: {\n requestId: source.requestId,\n messageId: source.messageId,\n generationId: source.generationId,\n responseMessageId,\n error: `agent exceeded the ${maxSteps}-step limit`,\n stepLimit: true,\n },\n } as AppendInput<D>\n }\n\n const started: GenerationStartedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n attempt,\n model: modelName(resolvedModel),\n promptThroughIndex: snapshot.index,\n }\n const catalogModelId = gatewayModelId(resolvedModel)\n const gatewayOptions = options.generation?.providerOptions?.['gateway']\n const usesFallbackModels =\n Array.isArray(gatewayOptions?.['models']) &&\n gatewayOptions['models'].length > 0\n const discoversMetadata =\n compaction !== false &&\n !('shouldCompact' in compaction) &&\n compaction.thresholdTokens === undefined &&\n !usesFallbackModels &&\n catalogModelId !== undefined\n const startEvents: AppendInput<D>[] = []\n if (\n discoversMetadata &&\n !Object.hasOwn(state.modelMetadata, catalogModelId)\n ) {\n startEvents.push({\n type: 'ai.model.metadata.requested',\n id: `ai.model.metadata:${encodeURIComponent(options.agent.contract.name)}:${encodeURIComponent(ctx.event.sessionId)}:${encodeURIComponent(catalogModelId)}`,\n payload: { modelId: catalogModelId },\n } as AppendInput<D>)\n }\n if (previous) {\n const payload = previous\n const superseded: GenerationFailedPayload = {\n requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n responseMessageId: payload.responseMessageId,\n error: 'generation attempt was superseded after an incomplete run',\n superseded: true,\n }\n startEvents.push({\n type: 'ai.generation.failed',\n id: `${payload.generationId}:superseded`,\n payload: superseded,\n } as AppendInput<D>)\n }\n startEvents.push({\n type: 'ai.generation.started',\n id: generationId,\n payload: started,\n } as AppendInput<D>)\n const generationEvents = await control.append({\n ctx,\n name: 'generation-start',\n events: startEvents,\n })\n generationStarted = true\n\n if (checkAbort(ctx.signal)) return\n\n const promptCoordinatorState = coordinatorState\n const messages = await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot: { state, index: snapshot.index },\n coordinator: promptCoordinatorState,\n excluded: replacedGenerationIds,\n })\n let generationMessages = messages\n let modelMessages = await modelContext({ messages, state, tools })\n const baseContext: AgentGenerateContext<M, D, T> = {\n request: ctx.event,\n requestId,\n generationId,\n responseMessageId,\n messages,\n modelMessages,\n state,\n session: resolverContext.session,\n signal: ctx.signal,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation,\n }\n const policy = compaction\n const tracksInput =\n policy !== false &&\n !('shouldCompact' in policy) &&\n (policy.thresholdTokens !== undefined || discoversMetadata)\n const metadata =\n catalogModelId === undefined\n ? undefined\n : state.modelMetadata[catalogModelId]\n const limits =\n metadata?.status === 'resolved' && !usesFallbackModels\n ? metadata.limits\n : undefined\n let inputTokenEstimate: number | undefined\n let compacted = false\n const canCompact = response.source?.canCompact ?? true\n if (policy && canCompact) {\n const compactionContext = {\n ...resolverContext,\n messages,\n modelMessages,\n }\n let shouldCompact: boolean\n if ('shouldCompact' in policy) {\n shouldCompact = await policy.shouldCompact(compactionContext)\n } else if (tracksInput) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n const inputTokens = measuredInputTokens({\n estimate: inputTokenEstimate,\n model: modelName(resolvedModel),\n calibration: coordinatorState.calibration,\n })\n const threshold =\n policy.thresholdTokens ??\n (limits === undefined\n ? undefined\n : Math.floor(\n Math.min(\n limits.contextWindow * 0.75,\n limits.contextWindow - (generation.maxOutputTokens ?? 0),\n ),\n ))\n if (\n limits !== undefined &&\n threshold !== undefined &&\n threshold <= 0\n ) {\n throw new Error(\n `output allowance exhausts the ${limits.contextWindow}-token context window`,\n )\n }\n shouldCompact = threshold !== undefined && inputTokens >= threshold\n } else {\n shouldCompact = false\n }\n if (checkAbort(ctx.signal)) return\n if (shouldCompact) {\n const throughMessageId =\n state.messages.findLast(\n (message) =>\n !promptCoordinatorState.queued.some(\n (queued) => queued.messageId === message.id,\n ),\n )?.id ?? request.messageId\n const throughIndex = snapshot.index\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-requested',\n events: [\n {\n type: 'ai.compaction.requested',\n id: `${generationId}:compaction:requested`,\n payload: { generationId, throughMessageId, throughIndex },\n } as AppendInput<D>,\n ],\n })),\n )\n const result = !('shouldCompact' in policy)\n ? {\n messages: [] as M[],\n ...(await summarize({\n context: baseContext,\n instructions: policy.instructions,\n })),\n }\n : { messages: await policy.compact(compactionContext) }\n if (checkAbort(ctx.signal)) return\n const completed: CompactionCompletedPayload<M> = {\n generationId,\n throughMessageId,\n throughIndex,\n ...result,\n ...(promptCoordinatorState.queued.length === 0\n ? {}\n : {\n retainedMessageIds: promptCoordinatorState.queued.map(\n (item) => item.messageId,\n ),\n }),\n }\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-completed',\n events: [\n {\n type: 'ai.compaction.completed',\n id: `${generationId}:compaction:completed`,\n payload: completed,\n } as AppendInput<D>,\n ],\n })),\n )\n const queued = new Set(\n promptCoordinatorState.queued.map((item) => item.messageId),\n )\n generationMessages = result.messages.filter(\n (message) => !queued.has(message.id),\n )\n compacted = true\n }\n }\n\n const currentState = foldAIEvents({\n agent: options.agent,\n events: generationEvents,\n state: snapshot.state,\n })\n if (request.reason === 'retry' || previous !== undefined) {\n generationMessages = await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot,\n coordinator: promptCoordinatorState,\n appended: generationEvents,\n })\n }\n if (\n (policy && 'shouldCompact' in policy) ||\n generationMessages !== messages ||\n activeCompaction(currentState)?.summary !==\n activeCompaction(state)?.summary\n ) {\n modelMessages = await modelContext({\n messages: generationMessages,\n state: currentState,\n tools,\n })\n }\n promptCache.set(\n promptCacheKey(ctx.event.sessionId, generationId),\n Promise.resolve(modelMessages),\n )\n if (tracksInput && (inputTokenEstimate === undefined || compacted)) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n }\n\n let pendingToolCalls: PendingToolCall[] = []\n if (checkAbort(ctx.signal)) return\n const generateContext: AgentGenerateContext<M, D, T> = {\n request: ctx.event,\n requestId,\n generationId,\n responseMessageId,\n messages: generationMessages,\n modelMessages,\n state: currentState,\n session: resolverContext.session,\n signal: ctx.signal,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation: options.generation ?? {},\n }\n const custom = options.generate !== undefined\n const source =\n options.generate === undefined\n ? await generateWithAISDK(generateContext, options.messageMetadata)\n : { stream: await options.generate(generateContext) }\n const updates = consumeGeneration({\n source,\n ...(options.progress === undefined\n ? {}\n : { progress: options.progress }),\n })\n\n let sequence = 0\n let finish: AgentGenerationFinish | undefined\n for await (const update of updates) {\n ctx.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n const progress: GenerationProgressPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n sequence,\n chunks: update.chunks,\n }\n const lifecycle = lifecycleEvents<D, T>({\n requestId,\n messageId: responseMessageId,\n generationId,\n sequence,\n chunks: update.chunks,\n pending: pendingToolCalls,\n tools,\n generation,\n custom,\n })\n pendingToolCalls = lifecycle.pending\n await control.append({\n ctx,\n name: `generation-progress:${sequence}`,\n events: [\n {\n type: 'ai.generation.progress',\n id: `${generationId}:progress:${sequence}`,\n payload: progress,\n } as AppendInput<D>,\n ...lifecycle.events,\n ],\n })\n sequence += 1\n }\n\n if (!finish) throw new Error('agent generation finished without output')\n const completed: GenerationCompletedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n ...(inputTokenEstimate === undefined ? {} : { inputTokenEstimate }),\n ...(finish.finishReason === undefined\n ? {}\n : { finishReason: finish.finishReason }),\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n const completionEvent = {\n type: 'ai.generation.completed',\n id: `${generationId}:completed`,\n payload: completed,\n } as AppendInput<D>\n const unresolved = options.generate\n ? pendingToolCalls.filter(\n (pending) => pending.classification !== 'automatic',\n )\n : []\n if (unresolved.length > 0) {\n throw new Error(\n `generation ended with unresolved tool authorization for '${unresolved[0]!.call.toolName}'`,\n )\n }\n const pendingEvents = pendingToolCalls\n .filter(\n (pending) =>\n pending.classification === 'automatic' ||\n (options.generate === undefined &&\n pending.classification === 'unknown'),\n )\n .map((pending) => toolCalledEvent<D>(pending.call))\n if (finish.finishReason === 'tool-calls') {\n return [...pendingEvents, completionEvent]\n }\n return [\n ...pendingEvents,\n completionEvent,\n {\n type: 'ai.message.completed',\n id: `${generationId}:message:completed`,\n payload: {\n messageId: responseMessageId,\n } satisfies MessageCompletedPayload,\n } as AppendInput<D>,\n ]\n } catch (error) {\n if (error instanceof ControlCancelled) throw error\n if (error instanceof A2Error) {\n checkAbort(ctx.signal)\n throw error\n }\n if (checkAbort(ctx.signal)) return\n if (!generationStarted) throw error\n const failed: GenerationFailedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n error: errorMessage(error),\n }\n return {\n type: 'ai.generation.failed',\n id: `${generationId}:failed`,\n payload: failed,\n } as AppendInput<D>\n }\n }\n\n const clearPromptCache = (sessionId: string): void => {\n const prefix = `${sessionId}\\u001f`\n for (const key of promptCache.keys()) {\n if (key.startsWith(prefix)) promptCache.delete(key)\n }\n }\n\n return {\n 'ai.model.metadata.requested': {\n handler: async (ctx) => {\n const limits = await readModelLimits({\n modelId: ctx.event.payload.modelId,\n signal: ctx.signal,\n })\n ctx.signal.throwIfAborted()\n return {\n type: 'ai.model.metadata.resolved',\n id: `${ctx.event.id}:resolved`,\n payload: { modelId: ctx.event.payload.modelId, limits },\n } as AppendInput<D>\n },\n },\n 'ai.control.requested': { lane: 'a2.ai.control', handler: control.handler },\n 'ai.work.reported': { lane: 'a2.ai.control', handler: control.handler },\n 'ai.message.completed': {\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n },\n },\n 'ai.message.interrupted': {\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n },\n },\n 'ai.session.closed': {\n lane: 'a2.ai.control',\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n return control.handler(ctx)\n },\n },\n 'ai.generation.failed': {\n handler: (ctx) => {\n promptCache.delete(\n promptCacheKey(ctx.event.sessionId, ctx.event.payload.generationId),\n )\n return Promise.resolve()\n },\n },\n 'ai.generation.requested': {\n lane: 'a2.ai.model',\n abortOn: {\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.control?.turnId ||\n active?.version !== trigger.payload.control?.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: async (ctx) => {\n try {\n return control.settled({ ctx, events: await generationHandler(ctx) })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n },\n },\n 'ai.tool.execution.requested': {\n abortOn: {\n 'ai.generation.failed': (event, trigger) =>\n event.payload.generationId === trigger.payload.call.generationId,\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.turnId ||\n active?.version !== trigger.payload.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: handleToolExecution,\n },\n } as NonNullable<ServerOptions<D>['handlers']>\n}\n\n/** Assemble an A2 server with the built-in agent handlers and app extensions. */\nexport function createAgentServer<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n>(options: CreateAgentServerOptions<M, D, T>): A2Server<D> {\n const {\n agent: definition,\n model,\n tools,\n instructions,\n generation,\n maxSteps,\n messageMetadata,\n generate,\n compaction,\n progress,\n handlers,\n ...serverOptions\n } = options\n const builtIns = createHandlers({\n agent: definition,\n model,\n ...(tools === undefined ? {} : { tools }),\n ...(instructions === undefined ? {} : { instructions }),\n ...(generation === undefined ? {} : { generation }),\n ...(maxSteps === undefined ? {} : { maxSteps }),\n ...(messageMetadata === undefined ? {} : { messageMetadata }),\n ...(generate === undefined ? {} : { generate }),\n ...(compaction === undefined ? {} : { compaction }),\n ...(progress === undefined ? {} : { progress }),\n })\n const server = createServer({\n ...serverOptions,\n contract: definition.contract,\n handlers: { ...builtIns, ...handlers },\n })\n setServerFetchHooks(server, { validateIngress: validateAgentIngress })\n return server\n}\n\nexport type { Instructions, LanguageModel, ToolSet }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-server.js","names":["errorMessage"],"sources":["../src/ai-coordinator.ts","../src/ai-control-server.ts","../src/ai-sdk-step.ts","../src/ai-model-metadata.ts","../src/ai-server.ts"],"sourcesContent":["import type { UIMessage } from 'ai'\nimport { applyControlChanges } from './ai-control-state.ts'\nimport type { ControlCommit, ControlWork } from './ai-control.ts'\nimport type {\n AIEventDefs,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationRequestedPayload,\n GenerationStartedPayload,\n InputRequestedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport type { Reducer } from './reducer.ts'\n\nexport type CoordinatorCall = {\n call: ToolCalledPayload\n approval?: ApprovalRequestedPayload\n response?: ApprovalRespondedPayload\n terminal: boolean\n work?: ControlWork\n}\n\nexport type CoordinatorResponse = {\n rootMessageId: string\n responseMessageId: string\n status: 'requested' | 'generating' | 'waiting' | 'failed'\n stepCount: number\n activeRequestId?: string\n generation?: GenerationStartedPayload\n promptThroughIndex?: number\n source?: {\n generation: GenerationStartedPayload\n promptThroughIndex: number\n failed: boolean\n canCompact: boolean\n }\n completion?: GenerationCompletedPayload\n failure?: GenerationFailedPayload\n calls: CoordinatorCall[]\n inputs: InputRequestedPayload[]\n inputResponse?: {\n generationId: string\n inputId: string\n name: string\n }\n}\n\nexport type AICoordinatorState = {\n closed: boolean\n queued: Array<{ messageId: string; generate: boolean }>\n response?: CoordinatorResponse\n calibration?: { model: string; inputTokens: number; estimate: number }\n}\n\nconst updateResponse = (\n state: AICoordinatorState,\n update: (response: CoordinatorResponse) => CoordinatorResponse,\n): AICoordinatorState =>\n state.response === undefined\n ? state\n : { ...state, response: update(state.response) }\n\nexport const foldCoordinator = <M extends UIMessage, D extends EventDefs>(\n state: AICoordinatorState,\n event: ContractEvent<D>,\n): AICoordinatorState => {\n switch (event.type) {\n case 'ai.session.closed':\n return { closed: true, queued: [] }\n case 'ai.retry.requested':\n case 'ai.compaction.completed': {\n const { calibration: _, ...rest } = state\n return rest\n }\n case 'ai.message.created': {\n const payload = event.payload as MessageCreatedPayload<M>\n const message = payload.message\n if (message.role !== 'user') return state\n return {\n ...state,\n queued: [\n ...state.queued.filter((item) => item.messageId !== message.id),\n {\n messageId: message.id,\n generate: payload.generate !== false,\n },\n ],\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (request.reason === 'message') {\n const responseMessageId =\n request.responseMessageId ?? `${request.messageId}:assistant`\n const requested = state.queued.findIndex(\n (item) => item.messageId === request.messageId,\n )\n return {\n ...state,\n queued:\n requested < 0\n ? state.queued.filter(\n (item) => item.messageId !== request.messageId,\n )\n : state.queued.slice(requested + 1),\n response: {\n rootMessageId: request.messageId,\n responseMessageId,\n status: 'requested',\n stepCount: 0,\n activeRequestId: event.id,\n calls: [],\n inputs: [],\n },\n }\n }\n if (\n state.response === undefined ||\n request.responseMessageId !== state.response.responseMessageId\n ) {\n return state\n }\n if (\n (request.reason === 'tool' &&\n (!continuationReady(state) ||\n event.id !==\n `ai.generate:tools:${state.response.generation?.generationId}`)) ||\n (request.reason === 'retry' && state.response.status !== 'failed') ||\n (request.reason === 'input' &&\n state.response.inputResponse === undefined)\n ) {\n return state\n }\n return updateResponse(state, (response) => {\n const generation = response.generation ?? response.source?.generation\n const promptThroughIndex =\n response.promptThroughIndex ?? response.source?.promptThroughIndex\n return {\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'requested',\n stepCount: response.stepCount,\n activeRequestId: event.id,\n ...(generation === undefined || promptThroughIndex === undefined\n ? {}\n : {\n source: {\n generation,\n promptThroughIndex,\n failed:\n response.failure?.generationId === generation.generationId,\n canCompact: response.calls.every((call) => call.terminal),\n },\n }),\n calls: [],\n inputs: [],\n }\n })\n }\n case 'ai.generation.started': {\n const generation = event.payload as GenerationStartedPayload\n if (\n state.response?.responseMessageId !== generation.responseMessageId ||\n state.response.activeRequestId !== generation.requestId ||\n (state.response.generation?.requestId === generation.requestId &&\n state.response.generation.attempt >= generation.attempt)\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'generating',\n stepCount: response.stepCount,\n generation,\n ...(generation.promptThroughIndex === undefined\n ? {}\n : { promptThroughIndex: generation.promptThroughIndex }),\n ...(response.source === undefined ? {} : { source: response.source }),\n activeRequestId: generation.requestId,\n calls: [],\n inputs: [],\n }))\n }\n case 'ai.generation.completed': {\n const completion = event.payload as GenerationCompletedPayload\n if (\n state.response?.generation?.generationId !== completion.generationId\n ) {\n return state\n }\n const next = updateResponse(state, (response) => ({\n ...response,\n status: 'waiting',\n completion,\n stepCount:\n response.stepCount + (response.completion === undefined ? 1 : 0),\n }))\n const { calibration: _, ...uncalibrated } = next\n const inputTokens = completion.usage?.inputTokens\n const estimate = completion.inputTokenEstimate\n return inputTokens !== undefined &&\n Number.isFinite(inputTokens) &&\n inputTokens >= 0 &&\n estimate !== undefined\n ? {\n ...uncalibrated,\n calibration: {\n model: state.response.generation.model,\n inputTokens,\n estimate,\n },\n }\n : uncalibrated\n }\n case 'ai.generation.failed': {\n const failure = event.payload as GenerationFailedPayload\n const response = state.response\n const ownsActiveGeneration =\n response?.generation?.generationId === failure.generationId\n const ownsActiveStepLimit =\n failure.stepLimit === true &&\n response?.activeRequestId ===\n `ai.generate:tools:${failure.generationId}` &&\n response.responseMessageId === failure.responseMessageId\n if (!ownsActiveGeneration && !ownsActiveStepLimit) {\n return state\n }\n return updateResponse(state, (current) => ({\n ...current,\n status: 'failed',\n failure,\n }))\n }\n case 'ai.message.completed': {\n const messageId = (event.payload as { messageId: string }).messageId\n if (state.response?.responseMessageId !== messageId) return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.message.interrupted': {\n const interruption = event.payload as MessageInterruptedPayload\n const response = state.response\n if (\n response?.responseMessageId !== interruption.messageId ||\n (interruption.generationId !== response.generation?.generationId &&\n interruption.requestId !== response.activeRequestId)\n )\n return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.tool.called': {\n const call = event.payload as ToolCalledPayload\n if (state.response?.generation?.generationId !== call.generationId) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: [\n ...response.calls.filter(\n (candidate) => candidate.call.toolCallId !== call.toolCallId,\n ),\n { call, terminal: false },\n ],\n }))\n }\n case 'ai.approval.requested': {\n const approval = event.payload as ApprovalRequestedPayload\n if (state.response?.generation?.generationId !== approval.generationId) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === approval.toolCallId\n ? { ...candidate, approval }\n : candidate,\n ),\n }))\n }\n case 'ai.approval.responded': {\n const approval = event.payload as ApprovalRespondedPayload\n if (\n state.response?.responseMessageId !== approval.messageId ||\n state.response.generation?.generationId !== approval.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.approval?.approvalId === approval.approvalId\n ? { ...candidate, response: approval }\n : candidate,\n ),\n }))\n }\n case 'ai.tool.result': {\n const result = event.payload as ToolResultPayload\n if (\n result.preliminary === true ||\n state.response?.generation?.generationId !== result.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === result.toolCallId\n ? { ...candidate, terminal: true }\n : candidate,\n ),\n }))\n }\n case 'ai.input.requested': {\n const input = event.payload as InputRequestedPayload\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.generationId !== input.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: [\n ...response.inputs.filter(\n (candidate) =>\n candidate.messageId !== input.messageId ||\n candidate.generationId !== input.generationId ||\n candidate.inputId !== input.inputId,\n ),\n input,\n ],\n }))\n }\n case 'ai.input.responded': {\n const input = event.payload as {\n messageId: string\n generationId: string\n inputId: string\n name: string\n }\n const requested = state.response?.inputs.find(\n (candidate) =>\n candidate.messageId === input.messageId &&\n candidate.generationId === input.generationId &&\n candidate.inputId === input.inputId &&\n candidate.name === input.name,\n )\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.generationId !== input.generationId ||\n requested === undefined\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: response.inputs.filter(\n (candidate) => candidate.inputId !== input.inputId,\n ),\n inputResponse: {\n generationId: input.generationId,\n inputId: input.inputId,\n name: requested.name,\n },\n }))\n }\n default:\n return state\n }\n}\n\nexport const aiCoordinatorReducer = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(\n contract: Contract<D>,\n): Reducer<D, AICoordinatorState> =>\n contract\n .reducer({\n name: 'a2.ai.coordinator.v5',\n initialState: {\n closed: false,\n queued: [],\n } as AICoordinatorState,\n })\n .fold((state, event) =>\n event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes\n .filter((change) => change.path[0] === 'coordinator')\n .map((change) =>\n Object.assign({}, change, { path: change.path.slice(1) }),\n ),\n })\n : state,\n )\n\nexport const continuationReady = (state: AICoordinatorState): boolean => {\n const response = state.response\n return (\n !state.closed &&\n response?.completion?.finishReason === 'tool-calls' &&\n response.generation?.generationId === response.completion.generationId &&\n response.failure === undefined &&\n response.calls.length > 0 &&\n response.calls.every(\n (call) =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n call.call.supportsDeferredResults !== true &&\n call.approval !== undefined &&\n call.response !== undefined),\n )\n )\n}\n","// oxlint-disable no-await-in-loop -- work acknowledgements follow the durable stream.\nimport { applyControlChanges, controlCommit } from './ai-control-state.ts'\nimport type { ControlChange, ControlCommit } from './ai-control.ts'\nimport type { UIMessage } from 'ai'\nimport type {\n AIEventDefs,\n AgentDefinition,\n GenerationRequestedPayload,\n MessageInterruptedPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n continuationReady,\n foldCoordinator,\n} from './ai-coordinator.ts'\nimport {\n initialControlState,\n type AIControlState,\n type ControlCommand,\n type ControlReceipt,\n type WorkFact,\n type WorkReport,\n} from './ai-control.ts'\nimport type { AppendInput, ContractEvent, EventDefs } from './contract.ts'\nimport type { HandlerContext } from './server.ts'\nimport type { Reducer } from './reducer.ts'\nimport type { AICoordinatorState, CoordinatorCall } from './ai-coordinator.ts'\nimport { validateSync } from './validate.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { A2Error } from './errors.ts'\n\nexport class ControlCancelled extends Error {}\n\nconst callReadyForModel = (call: CoordinatorCall): boolean =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n !call.call.supportsDeferredResults &&\n call.response !== undefined)\n\nconst approvalBlocksExecution = (call: CoordinatorCall): boolean =>\n call.approval !== undefined && call.response?.approved !== true\n\nexport type AIControlRuntime<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n handler(\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]>\n append(options: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]>\n settled(options: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): AppendInput<D>\n cancelled(options: { error: unknown; signal: AbortSignal }): boolean\n reducer: Reducer<D, AIControlState<M>>\n coordinator: Reducer<D, AICoordinatorState>\n}\n\nexport const createControlRuntime = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n}): AIControlRuntime<M, D> => {\n const reducer = options.agent.contract\n .reducer({\n name: 'a2.ai.control.v1',\n initialState: initialControlState<M>(),\n })\n .fold((state, event) =>\n event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes,\n })\n : state,\n )\n const coordinator = aiCoordinatorReducer(options.agent.contract)\n\n const handler = async (\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]> => {\n const snapshot = await ctx.session.state(reducer, { through: 'latest' })\n const before = structuredClone(snapshot.state)\n const moves: ControlChange[] = []\n const state = structuredClone(snapshot.state)\n const facts: WorkFact[] = []\n const jobs: AppendInput<D>[] = []\n const emit = ({\n type,\n payload,\n id = `${ctx.event.id}:fact:${facts.length}`,\n }: {\n type: string\n payload: unknown\n id?: string\n }): void => {\n const fact = { type, payload, id }\n facts.push(fact)\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n ...fact,\n } as ContractEvent<D>)\n }\n let reason: ControlReceipt['reason']\n const end = ({\n lastSeenIndex,\n reason: interruptionReason,\n }: {\n lastSeenIndex: number | undefined\n reason: string | undefined\n }): void => {\n const response = state.coordinator.response\n if (response === undefined) return\n const owner =\n response.generation === undefined\n ? { requestId: response.activeRequestId! }\n : { generationId: response.generation.generationId }\n emit({\n type: 'ai.message.interrupted',\n payload: {\n messageId: response.responseMessageId,\n ...owner,\n ...(interruptionReason === undefined\n ? {}\n : { reason: interruptionReason }),\n ...(lastSeenIndex === undefined ? {} : { lastSeenIndex }),\n } satisfies MessageInterruptedPayload,\n })\n state.active = null\n }\n const knownInput = (id: string): boolean =>\n state.inbox.items.some((candidate) => candidate.id === id) ||\n Object.hasOwn(state.reservedIds, id)\n const missingInputReason = (id: string): ControlReceipt['reason'] =>\n state.reservedIds[id] === 'removed' || !knownInput(id)\n ? 'not-found'\n : 'already-active'\n const inputTaken = ({\n message,\n generate = true,\n }: {\n message: M\n generate?: boolean\n }): boolean =>\n knownInput(message.id) ||\n (generate &&\n message.role === 'user' &&\n knownInput(`${message.id}:assistant`))\n const insert = ({\n message,\n generate = true,\n first = false,\n afterStepOf,\n }: {\n message: M\n generate?: boolean\n first?: boolean\n afterStepOf?: string\n }): void => {\n const candidate = {\n id: message.id,\n revision: 0,\n message,\n generate: generate && message.role === 'user',\n ...(afterStepOf === undefined ? {} : { afterStepOf }),\n }\n state.reservedIds = {\n ...state.reservedIds,\n [candidate.id]: true,\n ...(candidate.generate\n ? { [`${candidate.id}:assistant`]: true as const }\n : {}),\n }\n if (first) state.inbox.items.unshift(candidate)\n else state.inbox.items.push(candidate)\n }\n const moveInput = ({ from, to }: { from: number; to: number }): void => {\n if (from === to) return\n const [moved] = state.inbox.items.splice(from, 1)\n state.inbox.items.splice(to, 0, moved!)\n const [previous] = before.inbox.items.splice(from, 1)\n before.inbox.items.splice(to, 0, previous!)\n moves.push({ path: ['inbox', 'items'], move: { from, to } })\n }\n const requestModel = ({\n request,\n id,\n }: {\n request: GenerationRequestedPayload\n id: string\n }): void => {\n const active = state.active!\n const payload = {\n ...request,\n control: { turnId: active.turnId, version: active.version },\n }\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n type: 'ai.generation.requested',\n id,\n payload,\n } as ContractEvent<D>)\n active.model = { id, version: active.version, settled: false }\n active.phase = 'starting'\n jobs.push({\n type: 'ai.generation.requested',\n id,\n payload,\n } as AppendInput<D>)\n }\n if (ctx.event.type === 'ai.session.closed') {\n state.coordinator = { closed: true, queued: [] }\n state.active = null\n state.inbox.items = []\n } else if (ctx.event.type === 'ai.control.requested') {\n const command = ctx.event.payload as ControlCommand<M>\n if (state.coordinator.closed) reason = 'closed'\n else\n switch (command.action) {\n case 'send':\n if (\n inputTaken({\n message: command.message,\n generate: command.generate !== false,\n })\n )\n reason = 'duplicate-input'\n else\n insert({\n message: command.message,\n generate: command.generate !== false,\n })\n break\n case 'edit': {\n const item = state.inbox.items.find(\n (candidate) => candidate.id === command.message.id,\n )\n if (item === undefined)\n reason = missingInputReason(command.message.id)\n else if (item.revision !== command.expectedRevision)\n reason = 'revision-conflict'\n else if (item.message.role !== command.message.role)\n reason = 'revision-conflict'\n else {\n item.message = command.message\n item.revision += 1\n }\n break\n }\n case 'remove': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n if (position < 0) reason = missingInputReason(command.inputId)\n else {\n state.inbox.items.splice(position, 1)\n state.reservedIds = {\n ...state.reservedIds,\n [command.inputId]: 'removed',\n }\n }\n break\n }\n case 'move': {\n const index = state.inbox.items.findIndex(\n (candidate) => candidate.id === command.inputId,\n )\n if (index < 0) reason = missingInputReason(command.inputId)\n else if (\n command.beforeId !== null &&\n !state.inbox.items.some(\n (candidate) => candidate.id === command.beforeId,\n )\n )\n reason = 'not-found'\n else {\n const destination =\n command.beforeId === null\n ? state.inbox.items.length\n : state.inbox.items.findIndex(\n (item) => item.id === command.beforeId,\n )\n moveInput({\n from: index,\n to: destination > index ? destination - 1 : destination,\n })\n }\n break\n }\n case 'send-now': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n const selected = state.inbox.items[position]\n if (!selected) reason = missingInputReason(command.inputId)\n else if ((state.active?.turnId ?? null) !== command.turnId)\n reason = 'stale-turn'\n else if (selected.message.role !== 'user') reason = 'not-user-input'\n else if (\n !selected.generate &&\n knownInput(`${selected.id}:assistant`)\n )\n reason = 'duplicate-input'\n else {\n if (!selected.generate) {\n state.reservedIds = {\n ...state.reservedIds,\n [`${selected.id}:assistant`]: true,\n }\n selected.generate = true\n }\n if (state.active) selected.afterStepOf = state.active.turnId\n else delete selected.afterStepOf\n moveInput({ from: position, to: 0 })\n }\n break\n }\n case 'stop':\n if (state.active?.turnId !== command.turnId) reason = 'stale-turn'\n else\n end({ lastSeenIndex: command.lastSeenIndex, reason: undefined })\n break\n case 'steer':\n if (inputTaken({ message: command.message }))\n reason = 'duplicate-input'\n else {\n insert({\n message: command.message,\n generate: true,\n first: true,\n afterStepOf: command.turnId,\n })\n }\n break\n case 'interrupt': {\n const response = state.coordinator.response\n if (\n !response ||\n response.responseMessageId !== command.request.messageId ||\n (command.request.generationId !==\n response.generation?.generationId &&\n command.request.requestId !== response.activeRequestId)\n )\n reason = 'stale-turn'\n else\n end({\n lastSeenIndex: command.request.lastSeenIndex,\n reason: command.request.reason,\n })\n break\n }\n case 'pause': {\n state.inbox.paused = true\n const active = state.active\n if (\n command.when === 'now' &&\n active !== null &&\n !active.suspended\n ) {\n active.suspended = true\n active.version += 1\n const generation = state.coordinator.response?.generation\n if (generation)\n emit({\n type: 'ai.generation.paused',\n payload: {\n generationId: generation.generationId,\n messageId: generation.responseMessageId,\n },\n })\n }\n break\n }\n case 'resume':\n state.inbox.paused = false\n break\n case 'tool-result': {\n const call = state.coordinator.response?.calls.find(\n (candidate) =>\n candidate.call.generationId === command.result.generationId &&\n candidate.call.messageId === command.result.messageId &&\n candidate.call.toolCallId === command.result.toolCallId &&\n candidate.call.providerExecuted === true &&\n !candidate.terminal,\n )\n if (!call) reason = 'not-found'\n else emit({ type: 'ai.tool.result', payload: command.result })\n break\n }\n case 'approval': {\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) =>\n candidate.approval?.approvalId ===\n command.response.approvalId &&\n candidate.approval.generationId ===\n command.response.generationId &&\n candidate.approval.messageId === command.response.messageId,\n )\n if (response?.failure) reason = 'stale-turn'\n else if (!call || call.response || call.terminal)\n reason = 'not-found'\n else\n emit({ type: 'ai.approval.responded', payload: command.response })\n break\n }\n case 'request-input':\n case 'input': {\n const payload =\n command.action === 'input' ? command.response : command.request\n const response = state.coordinator.response\n if (\n response?.failure !== undefined ||\n response?.generation?.generationId !== payload.generationId ||\n response.responseMessageId !== payload.messageId ||\n (command.action === 'input' &&\n !response.inputs.some(\n (input) =>\n input.inputId === payload.inputId &&\n input.name === payload.name,\n ))\n )\n reason = 'not-found'\n else\n emit({\n type:\n command.action === 'input'\n ? 'ai.input.responded'\n : 'ai.input.requested',\n payload,\n })\n break\n }\n case 'retry': {\n const response = state.coordinator.response\n if (\n !state.active ||\n response?.status !== 'failed' ||\n response.rootMessageId !== command.request.messageId ||\n response.responseMessageId !== command.request.responseMessageId\n )\n reason = 'stale-turn'\n else if (!state.inbox.paused && !state.active.suspended) {\n emit({ type: 'ai.retry.requested', payload: command.request })\n requestModel({\n request: {\n messageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'retry',\n },\n id: `ai.generate:retry:${command.request.retryId}`,\n })\n } else reason = 'stale-turn'\n break\n }\n }\n } else {\n const report = ctx.event.payload as WorkReport\n const active = state.active\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) => candidate.work?.id === report.workId,\n )\n const work = report.kind === 'model' ? active?.model : call?.work\n const current =\n active?.turnId === report.turnId &&\n work?.id === report.workId &&\n work.version === report.version &&\n !work.settled &&\n report.attempt >= (work.attempt ?? 0)\n if (!current) {\n reason = 'stale-work'\n } else {\n work.attempt = report.attempt\n const authorized =\n !active.suspended && active.version === report.version\n for (const event of report.events) {\n if (work.facts?.includes(event.id)) continue\n if (\n authorized ||\n (report.kind === 'tool' && event.type === 'ai.tool.result')\n ) {\n emit({ type: event.type, payload: event.payload, id: event.id })\n work.facts = [...(work.facts ?? []), event.id]\n }\n }\n if (report.settled) work.settled = true\n if (!authorized) reason = 'stale-work'\n }\n }\n\n let active = state.active\n let response = state.coordinator.response\n if (active && response === undefined) {\n state.active = null\n active = null\n }\n if (active && response) {\n const handoff = state.inbox.items.some(\n (item) => item.afterStepOf === active.turnId,\n )\n const outstanding =\n (active.model !== null && !active.model.settled) ||\n response.calls.some(\n (candidate) =>\n candidate.work !== undefined && !candidate.work.settled,\n )\n if (active.suspended) {\n active.phase = outstanding ? 'pausing' : 'paused'\n if (!state.inbox.paused && !outstanding && !handoff)\n active.suspended = false\n }\n if (!active.suspended && response.failure) active.phase = 'failed'\n if (!active.suspended && response.failure === undefined) {\n for (const call of response.calls) {\n if (\n call.terminal ||\n (call.work !== undefined &&\n (!call.work.settled || call.work.version === active.version)) ||\n call.call.providerExecuted === true ||\n (call.approval && !call.response)\n )\n continue\n if (call.response?.approved === false) {\n emit({\n type: 'ai.tool.result',\n payload: {\n ...call.call,\n denied: true,\n phase: 'execution',\n },\n })\n continue\n }\n const id = `${ctx.event.id}:tool:${call.call.toolCallId}`\n call.work = { id, version: active.version, settled: false }\n jobs.push({\n type: 'ai.tool.execution.requested',\n id,\n payload: {\n turnId: active.turnId,\n version: active.version,\n call: call.call,\n generation: response.generation!,\n },\n } as AppendInput<D>)\n }\n }\n response = state.coordinator.response!\n const callsDone = response.calls.every(callReadyForModel)\n const modelDone = active.model === null || active.model.settled\n const workSettled =\n modelDone &&\n response.calls.every(\n (call) => call.work === undefined || call.work.settled,\n )\n const externalPending = response.calls.some(\n (call) =>\n call.call.providerExecuted &&\n call.call.supportsDeferredResults &&\n !call.terminal &&\n !approvalBlocksExecution(call),\n )\n const handoffReady =\n handoff &&\n workSettled &&\n !externalPending &&\n (active.suspended ||\n response.failure !== undefined ||\n response.calls.every(\n (call) => callReadyForModel(call) || approvalBlocksExecution(call),\n ))\n const readyForModel =\n !active.suspended &&\n response.failure === undefined &&\n modelDone &&\n callsDone &&\n response.inputs.length === 0\n const naturalCompletion =\n readyForModel &&\n response.completion !== undefined &&\n response.completion.finishReason !== 'tool-calls'\n if (handoffReady && !naturalCompletion) {\n end({ lastSeenIndex: undefined, reason: 'steered after step' })\n } else if (readyForModel && (!handoff || handoffReady)) {\n const resume =\n active.model !== null && active.model.version !== active.version\n const input = response.inputResponse\n if (\n !handoff &&\n (resume ||\n continuationReady(state.coordinator) ||\n (response.completion && input))\n ) {\n const nextReason = resume ? 'resume' : input ? 'input' : 'tool'\n const id =\n nextReason === 'tool'\n ? `ai.generate:tools:${response.generation!.generationId}`\n : `${ctx.event.id}:generate:${nextReason}`\n requestModel({\n request: {\n messageId: response.responseMessageId,\n responseMessageId: response.responseMessageId,\n reason: nextReason,\n },\n id,\n })\n } else if (naturalCompletion) {\n emit({\n type: 'ai.message.completed',\n payload: {\n messageId: response.responseMessageId,\n },\n })\n state.active = null\n }\n }\n if (\n !active.suspended &&\n state.active &&\n jobs.every((job) => job.type !== 'ai.generation.requested')\n )\n state.active.phase = response.failure\n ? 'failed'\n : !modelDone\n ? 'generating'\n : !callsDone\n ? 'tools'\n : 'waiting'\n }\n if (\n state.active === null &&\n !state.inbox.paused &&\n !state.coordinator.closed\n ) {\n while (state.inbox.items.length > 0) {\n const item = state.inbox.items.shift()!\n delete item.afterStepOf\n emit({\n type: 'ai.message.created',\n payload: { message: item.message, generate: item.generate },\n id: `ai.admitted:${item.id}`,\n })\n if (!item.generate) continue\n state.active = {\n turnId: item.id,\n input: item,\n phase: 'starting',\n version: 0,\n suspended: false,\n model: null,\n }\n requestModel({\n request: { messageId: item.id, reason: 'message' },\n id: `ai.generate:message:${item.id}`,\n })\n break\n }\n }\n const receipt: ControlReceipt = {\n commandId: ctx.event.id,\n ...(ctx.event.type === 'ai.work.reported' ? { work: true as const } : {}),\n outcome: reason === undefined ? 'applied' : 'rejected',\n ...(reason === undefined ? {} : { reason }),\n }\n return [\n ...(facts as AppendInput<D>[]),\n {\n type: 'ai.control.committed',\n payload: controlCommit({ before, after: state, moves }),\n } as AppendInput<D>,\n ...jobs,\n { type: 'ai.control.decided', payload: receipt } as AppendInput<D>,\n ]\n }\n\n const report = ({\n ctx,\n events,\n settled,\n name,\n }: {\n ctx: HandlerContext<D>\n events: readonly AppendInput<D>[]\n settled: boolean\n name: string\n }): AppendInput<D> => {\n const payload = ctx.event.payload as\n GenerationRequestedPayload | { turnId: string; version: number }\n const { turnId, version } = 'turnId' in payload ? payload : payload.control!\n for (const event of events) {\n const schema = options.agent.contract.events[\n event.type\n ] as StandardSchemaV1<unknown>\n const result = validateSync(\n schema,\n event.payload,\n `AI worker ${event.type}`,\n )\n if (result.issues)\n throw new TypeError(\n result.issues.map((issue) => issue.message).join('; '),\n )\n }\n return {\n type: 'ai.work.reported',\n id: `${ctx.event.id}:report:${ctx.attempt}:${name}`,\n payload: {\n workId: ctx.event.id,\n attempt: ctx.attempt,\n turnId,\n version,\n kind: ctx.event.type === 'ai.generation.requested' ? 'model' : 'tool',\n settled,\n events: events\n .filter(\n (event) =>\n event.type !== 'ai.message.completed' &&\n event.type !== 'ai.message.interrupted',\n )\n .map((event, index) => ({\n type: event.type,\n payload: event.payload,\n id:\n event.id ??\n `${ctx.event.id}:fact:${ctx.attempt}:${name}:${index}`,\n })),\n },\n } as AppendInput<D>\n }\n\n const append = async ({\n ctx,\n name,\n events,\n }: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]> => {\n const progress = events.filter(\n (event) => event.type === 'ai.generation.progress',\n )\n const lifecycle = events.filter(\n (event) => event.type !== 'ai.generation.progress',\n )\n if (lifecycle.length === 0) return ctx.session.append(name, ...progress)\n const input = report({ ctx, events: lifecycle, settled: false, name })\n const persisted = await ctx.session.append(name, ...progress, input)\n const index = persisted.at(-1)!.index\n const feed = ctx.session.stream({ startAfter: index })\n const stream = feed[Symbol.asyncIterator]()\n const canonical: ContractEvent<D>[] = []\n const wanted = new Set(lifecycle.map((event) => event.id))\n let rejectAbort!: (error: unknown) => void\n const aborted = new Promise<never>((_, reject) => {\n rejectAbort = reject\n })\n const onAbort = (): void => {\n rejectAbort(ctx.signal.reason)\n }\n ctx.signal.addEventListener('abort', onAbort, { once: true })\n try {\n ctx.signal.throwIfAborted()\n for (;;) {\n const item = await Promise.race([stream.next(), aborted])\n if (item.done)\n throw new Error('AI control acknowledgement stream ended')\n if (wanted.has(item.value.id)) canonical.push(item.value)\n if (\n item.value.type === 'ai.control.decided' &&\n (item.value.payload as ControlReceipt).commandId === input.id\n ) {\n if ((item.value.payload as ControlReceipt).outcome === 'rejected')\n throw new ControlCancelled('stale AI work')\n return [\n ...persisted.filter((event) => event.type !== 'ai.work.reported'),\n ...canonical,\n ]\n }\n }\n } finally {\n ctx.signal.removeEventListener('abort', onAbort)\n await stream.return?.()\n }\n }\n\n const settled = ({\n ctx,\n events,\n }: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): AppendInput<D> =>\n report({\n ctx,\n events:\n events === undefined\n ? []\n : Array.isArray(events)\n ? events\n : [events as AppendInput<D>],\n settled: true,\n name: 'settled',\n })\n const cancelled = ({\n error,\n signal,\n }: {\n error: unknown\n signal: AbortSignal\n }): boolean => {\n if (signal.reason instanceof A2Error) throw signal.reason\n return error instanceof ControlCancelled || signal.aborted\n }\n return { handler, append, settled, cancelled, reducer, coordinator }\n}\n","import {\n convertToModelMessages,\n stepCountIs,\n streamText,\n toUIMessageStream,\n} from 'ai'\nimport type {\n FinishReason,\n InferUIMessageChunk,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n} from 'ai'\n\ntype StreamTextOptions<T extends ToolSet> = Parameters<typeof streamText<T>>[0]\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\ntype ModelStepTimeout<T extends ToolSet> =\n | number\n | Omit<\n Exclude<StreamTextOptions<T>['timeout'], number | undefined>,\n 'toolMs' | 'tools'\n >\n\ntype ControlledStreamTextSetting =\n | '_internal'\n | 'abortSignal'\n | 'instructions'\n | 'messages'\n | 'model'\n | 'onToolExecutionEnd'\n | 'onToolExecutionStart'\n | 'experimental_onToolCallFinish'\n | 'experimental_onToolCallStart'\n | 'experimental_sandbox'\n | 'experimental_toolCallers'\n | 'experimental_toolApprovalSecret'\n | 'prompt'\n | 'prepareStep'\n | 'stopWhen'\n | 'system'\n | 'tools'\n\ntype RetypedStreamTextSetting =\n | 'experimental_onStart'\n | 'experimental_onStepStart'\n | 'experimental_repairToolCall'\n | 'experimental_transform'\n | 'onStart'\n | 'onStepStart'\n | 'repairToolCall'\n\ntype ModelFacingTools<T extends ToolSet> = {\n readonly [K in keyof T]: Omit<T[K], 'execute'>\n}\n\ntype SettingEvent<T extends ToolSet, K extends keyof StreamTextOptions<T>> =\n NonNullable<StreamTextOptions<T>[K]> extends (event: infer EVENT) => unknown\n ? EVENT\n : never\n\ntype ModelPhaseStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseStepStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStepStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseCallback<EVENT> = (event: EVENT) => void | PromiseLike<void>\n\ntype StreamTextRepairToolCall<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['repairToolCall']\n>\n\ntype ModelPhaseRepairToolCall<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextRepairToolCall<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextRepairToolCall<T>>\n\ntype StreamTextTransformSetting<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['experimental_transform']\n>\n\ntype StreamTextTransform<T extends ToolSet> = Extract<\n StreamTextTransformSetting<T>,\n (...args: never[]) => unknown\n>\n\ntype ModelPhaseTransform<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextTransform<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextTransform<T>>\n\n/** AI SDK streamText settings that remain meaningful for one durable step. */\nexport type AISDKStepSettings<T extends ToolSet> = Partial<\n Omit<\n StreamTextOptions<T>,\n ControlledStreamTextSetting | RetypedStreamTextSetting | 'timeout'\n >\n> & {\n timeout?: ModelStepTimeout<T>\n onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n experimental_onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n experimental_onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_transform?:\n ModelPhaseTransform<T> | Array<ModelPhaseTransform<T>>\n}\n\nexport type AISDKStepInput<M extends UIMessage, T extends ToolSet> = {\n model: LanguageModel\n tools: T\n messages: M[]\n modelMessages?: ModelMessage[]\n responseMessageId: string\n abortSignal: AbortSignal\n instructions?: Instructions\n settings?: AISDKStepSettings<T>\n messageMetadata?: (options: {\n part: TextStreamPart<T>\n }) => UIMessageMetadata<M> | undefined\n}\n\nexport type AISDKStepCompletion = {\n finishReason: FinishReason\n usage: LanguageModelUsage\n}\n\nexport type AISDKStepResult<M extends UIMessage> = {\n stream: ReadableStream<InferUIMessageChunk<M>>\n completion(): AISDKStepCompletion\n}\n\nconst CONTROLLED_SETTINGS: readonly ControlledStreamTextSetting[] = [\n '_internal',\n 'abortSignal',\n 'instructions',\n 'messages',\n 'model',\n 'onToolExecutionEnd',\n 'onToolExecutionStart',\n 'experimental_onToolCallFinish',\n 'experimental_onToolCallStart',\n 'experimental_sandbox',\n 'experimental_toolCallers',\n 'experimental_toolApprovalSecret',\n 'prompt',\n 'prepareStep',\n 'stopWhen',\n 'system',\n 'tools',\n]\n\nconst safeSettings = <T extends ToolSet>(\n settings: AISDKStepSettings<T> | undefined,\n): AISDKStepSettings<T> => {\n const result = { ...settings } as AISDKStepSettings<T>\n for (const key of CONTROLLED_SETTINGS) Reflect.deleteProperty(result, key)\n if (typeof result.timeout === 'object' && result.timeout !== null) {\n const timeout = { ...result.timeout } as Record<string, unknown>\n Reflect.deleteProperty(timeout, 'toolMs')\n Reflect.deleteProperty(timeout, 'tools')\n result.timeout = timeout as ModelStepTimeout<T>\n }\n return result\n}\n\nconst modelToolSet = <T extends ToolSet>(tools: T): T =>\n Object.fromEntries(\n Object.entries(tools).map(([name, tool]) => {\n if (tool.type === 'provider' && tool.isProviderExecuted === true) {\n return [name, tool]\n }\n const definition = { ...tool }\n Reflect.deleteProperty(definition, 'execute')\n return [name, definition]\n }),\n ) as T\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\n/** Run exactly one AI SDK model step while leaving local tool execution to A2. */\nexport async function generateAISDKStep<M extends UIMessage, T extends ToolSet>(\n input: AISDKStepInput<M, T>,\n): Promise<AISDKStepResult<M>> {\n const settings = safeSettings(input.settings)\n const tools = modelToolSet(input.tools)\n const messages =\n input.modelMessages ??\n (await convertToModelMessages(input.messages, { tools }))\n const streamOptions = {\n ...settings,\n model: input.model,\n tools,\n messages,\n abortSignal: input.abortSignal,\n ...(input.instructions === undefined\n ? {}\n : { instructions: input.instructions }),\n stopWhen: stepCountIs(1),\n // A2 records stream failures durably; the AI SDK default writes them to\n // stderr in addition to yielding an error part.\n onError: settings.onError ?? (() => {}),\n } as unknown as StreamTextOptions<T>\n const result = streamText<T>(streamOptions)\n\n let completion: AISDKStepCompletion | undefined\n let fatalError: { value: unknown } | undefined\n const observed = result.stream.pipeThrough(\n new TransformStream<TextStreamPart<T>, TextStreamPart<T>>({\n transform(part, controller) {\n if (part.type === 'error' && fatalError === undefined) {\n fatalError = { value: part.error }\n } else if (part.type === 'finish') {\n completion = {\n finishReason: part.finishReason,\n usage: part.totalUsage,\n }\n }\n controller.enqueue(part)\n },\n }),\n )\n\n return {\n stream: toUIMessageStream<T, M>({\n stream: observed,\n tools,\n generateMessageId: () => input.responseMessageId,\n onError: errorMessage,\n ...(input.messageMetadata === undefined\n ? {}\n : { messageMetadata: input.messageMetadata }),\n }),\n completion() {\n if (fatalError !== undefined) throw fatalError.value\n if (completion === undefined) {\n throw new Error('AI SDK step ended without a finish part')\n }\n if (completion.finishReason === 'error') {\n throw new Error('AI SDK step finished with an error')\n }\n return completion\n },\n }\n}\n","import type { LanguageModel } from 'ai'\nimport type { ModelLimits } from './ai.ts'\n\nconst catalogUrl = 'https://ai-gateway.vercel.sh/v1/models'\nconst catalogLifetimeMs = 60 * 60 * 1_000\nconst catalogTimeoutMs = 5_000\n\nlet catalog:\n | {\n expiresAt: number\n promise: Promise<ReadonlyMap<string, ModelLimits>>\n }\n | undefined\n\nexport const gatewayModelId = (model: LanguageModel): string | undefined => {\n if (typeof model === 'string') {\n return globalThis.AI_SDK_DEFAULT_PROVIDER === undefined ? model : undefined\n }\n return model.provider === 'gateway' ? model.modelId : undefined\n}\n\nconst readCatalog = (): Promise<ReadonlyMap<string, ModelLimits>> => {\n if (catalog && catalog.expiresAt > Date.now()) return catalog.promise\n const entry = {\n expiresAt: Number.POSITIVE_INFINITY,\n promise: (async () => {\n const controller = new AbortController()\n const timeout = setTimeout(\n () => controller.abort(new Error('model catalog request timed out')),\n catalogTimeoutMs,\n )\n timeout.unref?.()\n try {\n const response = await fetch(catalogUrl, { signal: controller.signal })\n if (!response.ok)\n throw new Error(\n `model catalog request failed: HTTP ${response.status}`,\n )\n const body: unknown = await response.json()\n if (\n typeof body !== 'object' ||\n body === null ||\n !('data' in body) ||\n !Array.isArray(body.data)\n ) {\n throw new Error('model catalog response must contain a data array')\n }\n const models = new Map<string, ModelLimits>()\n for (const row of body.data as unknown[]) {\n if (\n typeof row !== 'object' ||\n row === null ||\n !('type' in row) ||\n !('id' in row) ||\n !('context_window' in row) ||\n !('max_tokens' in row) ||\n row.type !== 'language' ||\n typeof row.id !== 'string' ||\n typeof row.context_window !== 'number' ||\n typeof row.max_tokens !== 'number' ||\n !Number.isSafeInteger(row.context_window) ||\n row.context_window <= 0 ||\n !Number.isSafeInteger(row.max_tokens) ||\n row.max_tokens <= 0\n )\n continue\n models.set(row.id, {\n contextWindow: row.context_window,\n maxOutputTokens: row.max_tokens,\n })\n }\n return models\n } finally {\n clearTimeout(timeout)\n }\n })(),\n }\n catalog = entry\n entry.promise = entry.promise.then(\n (models) => {\n entry.expiresAt = Date.now() + catalogLifetimeMs\n return models\n },\n (error: unknown) => {\n if (catalog === entry) catalog = undefined\n throw error\n },\n )\n return entry.promise\n}\n\nexport const readModelLimits = async (options: {\n modelId: string\n signal: AbortSignal\n}): Promise<ModelLimits | null> => {\n options.signal.throwIfAborted()\n let onAbort!: () => void\n const aborted = new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(options.signal.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n })\n try {\n const models = await Promise.race([readCatalog(), aborted])\n return models.get(options.modelId) ?? null\n } finally {\n options.signal.removeEventListener('abort', onAbort)\n }\n}\n","/**\n * experimental-a2/ai/server — the server-only implementation of an experimental-a2/ai definition.\n *\n * `createHandlers()` exposes the ordinary A2 handler table;\n * `createAgentServer()` is its batteries-included assembly with createServer.\n */\n\n// oxlint-disable no-await-in-loop -- stream chunks and durable appends are\n// ordered; parallel consumption would corrupt progress sequence and state.\n\nimport { createControlRuntime, ControlCancelled } from './ai-control-server.ts'\nimport type { ControlCommit } from './ai-control.ts'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { createHash } from 'node:crypto'\nimport { asSchema, convertToModelMessages } from 'ai'\nimport type {\n FinishReason,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport { generateAISDKStep, type AISDKStepSettings } from './ai-sdk-step.ts'\nimport { gatewayModelId, readModelLimits } from './ai-model-metadata.ts'\nimport type {\n AIEventDefs,\n AIState,\n AgentDefinition,\n AgentToolContext,\n AgentToolEventDefs,\n ApprovalRequestedPayload,\n CompactionCompletedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationStartedPayload,\n MessageCompletedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n type AICoordinatorState,\n} from './ai-coordinator.ts'\nimport type { AppendInput, ContractEvent, EventDefs } from './contract.ts'\nimport { A2Error } from './errors.ts'\nimport {\n consumeSchedulerSendFailure,\n installAmbientToolScopeStorage,\n type AmbientToolScope,\n} from './internal.ts'\nimport {\n createServer,\n type A2Server,\n type HandlerContext,\n type ServerOptions,\n} from './server.ts'\nimport {\n setServerFetchHooks,\n type ServerIngressContext,\n} from './server-fetch.ts'\n\nfunction validateAgentIngress(context: ServerIngressContext): void {\n const rejected = context.events.find((event) => {\n if (event.type !== 'ai.control.requested') return true\n const command = event.payload as Record<string, unknown>\n if (\n command['action'] === 'request-input' ||\n command['action'] === 'tool-result'\n )\n return true\n if (\n command['action'] === 'send' ||\n command['action'] === 'edit' ||\n command['action'] === 'steer'\n ) {\n return (\n (command['message'] as { role?: unknown } | undefined)?.role !== 'user'\n )\n }\n return false\n })\n if (rejected !== undefined) {\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `event '${rejected.type}' is server-only for an AI agent`,\n )\n }\n}\n\ntype AgentGenerationProgress = {\n type: 'progress'\n chunks: UIMessageChunk[]\n}\n\ntype AgentGenerationFinish = {\n type: 'finish'\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype AgentGenerationUpdate = AgentGenerationProgress | AgentGenerationFinish\n\nexport type AgentGenerateContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = {\n request: ContractEvent<D, 'ai.generation.requested'>\n requestId: string\n generationId: string\n responseMessageId: string\n messages: M[]\n modelMessages: ModelMessage[]\n state: AIState<M>\n session: Pick<HandlerContext<D>['session'], 'state'>\n signal: AbortSignal\n model: LanguageModel\n tools: T\n instructions?: Instructions\n generation: AgentGenerationSettings<T>\n}\n\nexport type AgentGenerate<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = (\n context: AgentGenerateContext<M, D, T>,\n) => ReadableStream<UIMessageChunk> | Promise<ReadableStream<UIMessageChunk>>\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\nexport type AgentMessageMetadata<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = (\n context: AgentGenerateContext<M, D, T> & { part: TextStreamPart<T> },\n) => UIMessageMetadata<M> | undefined\n\nexport type AgentResolverContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n event: ContractEvent<D, 'ai.generation.requested'>\n state: AIState<M>\n session: Pick<HandlerContext<D>['session'], 'state'>\n signal: AbortSignal\n}\n\nexport type Resolvable<T, C> = T | ((context: C) => T | Promise<T>)\n\nexport type CompactionPolicy<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n shouldCompact(\n context: AgentResolverContext<M, D> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): boolean | Promise<boolean>\n compact(\n context: AgentResolverContext<M, D> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): M[] | Promise<M[]>\n}\n\nexport type AutomaticCompaction = {\n thresholdTokens?: number\n instructions?: string\n}\n\nexport type CompactionOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = false | AutomaticCompaction | CompactionPolicy<M, D>\n\nexport type AgentGenerationSettings<T extends ToolSet> = AISDKStepSettings<T>\n\nexport type CreateHandlersOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n> = {\n agent: AgentDefinition<M, D>\n /** AI SDK model string or provider model, optionally resolved per generation. */\n model: Resolvable<LanguageModel, AgentResolverContext<M, D>>\n tools?: T\n instructions?: Resolvable<\n Instructions | undefined,\n AgentResolverContext<M, D>\n >\n /** Settings for each one-step AI SDK streamText call. */\n generation?: AgentGenerationSettings<T>\n /**\n * Maximum model steps in one assistant response. Defaults to Infinity.\n */\n maxSteps?: number\n /** Map default AI SDK stream parts to typed assistant message metadata. */\n messageMetadata?: AgentMessageMetadata<M, D, T>\n /**\n * Replace model generation with an AI SDK UI message chunk stream.\n * The custom stream owns its metadata chunks.\n */\n generate?: AgentGenerate<M, D, T>\n compaction?: Resolvable<CompactionOptions<M, D>, AgentResolverContext<M, D>>\n /** Progress is durably flushed at either limit, whichever is reached first. */\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}\n\nexport type CreateAgentServerOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n> = CreateHandlersOptions<M, D, T> &\n Omit<ServerOptions<D>, 'contract' | 'handlers'> & {\n handlers?: ServerOptions<D>['handlers']\n }\n\nconst checkAbort = (signal: AbortSignal): boolean => {\n if (!signal.aborted) return false\n const reason: unknown = signal.reason\n if (\n reason instanceof A2Error &&\n (reason.code === 'CLAIM_EXPIRED' || reason.code === 'SUPERSEDED_ATTEMPT')\n ) {\n throw reason\n }\n return true\n}\n\nconst resolve = async <T, C extends { signal: AbortSignal }>(\n value: Resolvable<T, C>,\n context: C,\n): Promise<T> => {\n let result: T\n try {\n result =\n typeof value === 'function'\n ? await (value as (context: C) => T | Promise<T>)(context)\n : value\n } catch (error) {\n checkAbort(context.signal)\n throw error\n }\n checkAbort(context.signal)\n return result\n}\n\nconst modelName = (model: LanguageModel): string => {\n if (typeof model === 'string') return model\n if ('modelId' in model && typeof model.modelId === 'string') {\n return model.modelId\n }\n return 'custom'\n}\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\nconst toolScopeStorage = installAmbientToolScopeStorage(\n () => new AsyncLocalStorage<AmbientToolScope>(),\n)\n\n/** Run `fn` with `ctx` as the ambient tool handler context, for direct tool tests. */\nexport function runWithHandlerContext<D extends AgentToolEventDefs, R>(\n ctx: AgentToolContext<D>,\n fn: () => R,\n): R {\n return toolScopeStorage.run({ context: ctx }, fn)\n}\n\nconst promptCacheKey = (sessionId: string, generationId: string): string =>\n `${sessionId}\\u001f${generationId}`\n\nconst asyncIterator = (value: unknown): AsyncIterator<unknown> | undefined => {\n if (typeof value !== 'object' || value === null) return undefined\n const factory = Reflect.get(value, Symbol.asyncIterator)\n if (typeof factory !== 'function') return undefined\n return (factory as (this: object) => AsyncIterator<unknown>).call(value)\n}\n\nconst isBoundaryChunk = (chunk: UIMessageChunk | undefined): boolean =>\n chunk !== undefined &&\n (chunk.type === 'text-end' ||\n chunk.type === 'reasoning-end' ||\n chunk.type === 'tool-input-available' ||\n chunk.type === 'tool-input-error' ||\n chunk.type === 'tool-output-available' ||\n chunk.type === 'tool-output-error' ||\n chunk.type === 'tool-output-denied' ||\n chunk.type === 'tool-approval-request' ||\n chunk.type === 'finish' ||\n chunk.type === 'abort' ||\n chunk.type === 'error')\n\ntype StreamRead<T> = Awaited<ReturnType<ReadableStreamDefaultReader<T>['read']>>\n\nconst nextOrTimer = async <T>(\n next: Promise<StreamRead<T>>,\n delayMs: number,\n): Promise<{ type: 'next'; result: StreamRead<T> } | { type: 'timer' }> => {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n next.then((result) => ({ type: 'next' as const, result })),\n new Promise<{ type: 'timer' }>((finishTimer) => {\n timer = setTimeout(() => finishTimer({ type: 'timer' }), delayMs)\n ;(timer as { unref?: () => void }).unref?.()\n }),\n ])\n } finally {\n if (timer !== undefined) clearTimeout(timer)\n }\n}\n\ntype GenerationCompletion = {\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype GenerationSource = {\n stream: ReadableStream<UIMessageChunk>\n completion?: () => GenerationCompletion\n}\n\nasync function generateWithAISDK<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n agentName: string\n context: AgentGenerateContext<M, D, T>\n messageMetadata: AgentMessageMetadata<M, D, T> | undefined\n}): Promise<GenerationSource> {\n const { agentName, context, messageMetadata } = options\n const headers = context.generation.headers ?? {}\n const generation =\n gatewayModelId(context.model) === undefined\n ? context.generation\n : {\n ...context.generation,\n headers: Object.keys(headers).some(\n (key) => key.toLowerCase() === 'x-session-affinity',\n )\n ? headers\n : {\n ...headers,\n 'x-session-affinity': createHash('sha256')\n .update(\n JSON.stringify([agentName, context.request.sessionId]),\n )\n .digest('hex'),\n },\n providerOptions: {\n ...context.generation.providerOptions,\n gateway: {\n caching: 'auto',\n ...context.generation.providerOptions?.['gateway'],\n },\n },\n }\n const step = await generateAISDKStep<M, T>({\n model: context.model,\n tools: context.tools,\n messages: context.messages,\n modelMessages: context.modelMessages,\n responseMessageId: context.responseMessageId,\n abortSignal: context.signal,\n ...(context.instructions === undefined\n ? {}\n : { instructions: context.instructions }),\n settings: generation,\n ...(messageMetadata === undefined\n ? {}\n : {\n messageMetadata: ({ part }) =>\n messageMetadata({ ...context, generation, part }),\n }),\n })\n return {\n stream: step.stream as ReadableStream<UIMessageChunk>,\n completion: step.completion,\n }\n}\n\nasync function* consumeGeneration(options: {\n source: GenerationSource\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}): AsyncGenerator<AgentGenerationUpdate> {\n const pending: UIMessageChunk[] = []\n let streamedFinishReason: FinishReason | undefined\n let streamedError: string | undefined\n const maxChunks = options.progress?.maxChunks ?? 16\n const maxDelayMs = options.progress?.maxDelayMs ?? 30\n let lastFlush = Date.now()\n const reader = options.source.stream.getReader()\n let pendingChunk = reader.read()\n try {\n for (;;) {\n let result: StreamRead<UIMessageChunk>\n if (pending.length > 0) {\n const remaining = Math.max(0, maxDelayMs - (Date.now() - lastFlush))\n const outcome = await nextOrTimer(pendingChunk, remaining)\n if (outcome.type === 'timer') {\n yield { type: 'progress', chunks: pending.splice(0) }\n lastFlush = Date.now()\n continue\n }\n result = outcome.result\n } else {\n result = await pendingChunk\n }\n if (result.done) break\n const chunk = result.value\n pending.push(chunk)\n if (chunk.type === 'finish') streamedFinishReason = chunk.finishReason\n if (chunk.type === 'error') streamedError = chunk.errorText\n pendingChunk = reader.read()\n\n if (pending.length >= maxChunks || isBoundaryChunk(pending.at(-1))) {\n yield { type: 'progress', chunks: pending.splice(0) }\n lastFlush = Date.now()\n }\n }\n } catch (error) {\n if (pending.length > 0)\n yield { type: 'progress', chunks: pending.splice(0) }\n throw error\n } finally {\n void pendingChunk.catch(() => {})\n try {\n await reader.cancel()\n } catch {\n // Cleanup must not replace the error that ended generation.\n } finally {\n reader.releaseLock()\n }\n }\n\n let completion: GenerationCompletion | undefined\n try {\n completion = options.source.completion?.()\n } catch (error) {\n if (pending.length > 0) {\n yield { type: 'progress', chunks: pending.splice(0) }\n }\n throw error\n }\n if (pending.length > 0) {\n yield { type: 'progress', chunks: pending.splice(0) }\n }\n if (streamedError !== undefined) throw new Error(streamedError)\n const finishReason = completion?.finishReason ?? streamedFinishReason\n yield {\n type: 'finish',\n ...(finishReason === undefined ? {} : { finishReason }),\n ...(completion?.usage === undefined ? {} : { usage: completion.usage }),\n }\n}\n\nconst foldAIEvents = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n state: AIState<M>\n events: ContractEvent<D>[]\n}): AIState<M> => {\n let state = options.state\n for (const event of options.events)\n state = options.agent.reducer.fold(state, event)\n return state\n}\n\nconst summarize = async <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n agentName: string\n context: AgentGenerateContext<M, D, T>\n instructions: string | undefined\n}): Promise<{ summary: string; usage?: LanguageModelUsage }> => {\n const instruction = [\n 'Summarize this conversation so you can continue the task after the earlier context is replaced by your summary.',\n 'Preserve the objective, constraints, decisions, exact identifiers, completed actions and their results, unresolved questions, and next steps. Distinguish observations from assumptions.',\n 'Respond only with the summary as text. Do not call any tools or continue working on the task.',\n options.instructions,\n ]\n .filter(Boolean)\n .join('\\n')\n const generation = { ...options.context.generation }\n for (const key of Object.keys(generation)) {\n if (\n key.startsWith('on') ||\n key.startsWith('experimental_on') ||\n [\n 'repairToolCall',\n 'experimental_repairToolCall',\n 'experimental_refineToolInput',\n 'experimental_transform',\n 'toolApproval',\n ].includes(key)\n ) {\n Reflect.deleteProperty(generation, key)\n }\n }\n const tools = Object.fromEntries(\n Object.entries(options.context.tools).map(([name, tool]) => {\n const definition = { ...tool, needsApproval: false }\n for (const key of [\n 'execute',\n 'onInputStart',\n 'onInputDelta',\n 'onInputAvailable',\n ]) {\n Reflect.deleteProperty(definition, key)\n }\n return [name, definition]\n }),\n ) as T\n const source = await generateWithAISDK({\n agentName: options.agentName,\n context: {\n ...options.context,\n generation,\n tools,\n modelMessages: [\n ...options.context.modelMessages,\n { role: 'user', content: instruction },\n ],\n responseMessageId: `${options.context.generationId}:summary`,\n },\n messageMetadata: undefined,\n })\n let summary = ''\n let calledTool = false\n let finish: AgentGenerationFinish | undefined\n for await (const update of consumeGeneration({ source })) {\n options.context.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n for (const chunk of update.chunks) {\n if (chunk.type === 'text-delta') summary += chunk.delta\n if (chunk.type.startsWith('tool-')) calledTool = true\n }\n }\n if (\n calledTool ||\n summary.trim().length === 0 ||\n finish?.finishReason !== 'stop'\n ) {\n throw new Error(\n 'compaction must produce a complete text summary without calling tools',\n )\n }\n return {\n summary,\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n}\n\nconst activeCompaction = <M extends UIMessage>(\n state: AIState<M>,\n): AIState<M>['compaction'] => {\n const compaction = state.compaction\n return compaction?.status === 'completed' &&\n compaction.messages !== undefined &&\n state.messages.some((message) => message.id === compaction.throughMessageId)\n ? compaction\n : null\n}\n\nconst contextMessages = async <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n session: HandlerContext<D>['session']\n snapshot: { state: AIState<M>; index: number }\n coordinator: AICoordinatorState\n appended?: ContractEvent<D>[]\n excluded?: ReadonlySet<string>\n}): Promise<M[]> => {\n const { agent, session, snapshot } = options\n const appended = options.appended ?? []\n const state = foldAIEvents({ agent, events: appended, state: snapshot.state })\n const compaction = activeCompaction(state)\n const queued = new Set(\n options.coordinator.queued.map((item) => item.messageId),\n )\n const visible = (messages: M[]): M[] =>\n messages.filter((message) => !queued.has(message.id))\n if (compaction === null) return visible(state.messages)\n const retained = new Set(compaction.retainedMessageIds ?? [])\n const throughIndex = compaction.throughIndex\n if (throughIndex !== undefined) {\n const [prefix, priorCoordinator, tail] = await Promise.all([\n throughIndex === snapshot.index\n ? Promise.resolve(snapshot)\n : session.state(agent.reducer, { through: throughIndex }),\n session.state(aiCoordinatorReducer(agent.contract), {\n through: throughIndex,\n }),\n throughIndex >= snapshot.index\n ? Promise.resolve([])\n : session.history({ gte: throughIndex + 1, lte: snapshot.index }),\n ])\n for (const item of priorCoordinator.state.queued)\n retained.add(item.messageId)\n const events =\n options.excluded === undefined\n ? tail\n : withoutGenerationLifecycle(tail, options.excluded)\n const context = foldAIEvents({\n agent,\n events: [...events, ...appended],\n state: {\n ...prefix.state,\n messages: [\n ...compaction.messages!,\n ...prefix.state.messages.filter((message) =>\n retained.has(message.id),\n ),\n ],\n activeProjection: null,\n },\n })\n const positions = new Map<string, number>()\n for (const message of [...compaction.messages!, ...state.messages]) {\n if (!positions.has(message.id)) positions.set(message.id, positions.size)\n }\n return visible(\n context.messages.toSorted(\n (left, right) =>\n (positions.get(left.id) ?? positions.size) -\n (positions.get(right.id) ?? positions.size),\n ),\n )\n }\n const boundary = state.messages.findIndex(\n (message) => message.id === compaction.throughMessageId,\n )\n return visible([\n ...compaction.messages!,\n ...state.messages\n .slice(0, boundary + 1)\n .filter((message) => retained.has(message.id)),\n ...state.messages.slice(boundary + 1),\n ])\n}\n\nconst modelContext = async <M extends UIMessage>(options: {\n messages: M[]\n state: AIState<M>\n tools: ToolSet\n}): Promise<ModelMessage[]> => {\n const messages = await convertToModelMessages(options.messages, {\n tools: options.tools,\n })\n const summary = activeCompaction(options.state)?.summary\n return summary === undefined\n ? messages\n : [{ role: 'user', content: summary }, ...messages]\n}\n\nconst estimateInputTokens = async (options: {\n messages: ModelMessage[]\n instructions: Instructions | undefined\n tools: ToolSet\n}): Promise<number> => {\n const tools = await Promise.all(\n Object.entries(options.tools).map(async ([name, tool]) => ({\n name,\n description: tool.description,\n inputSchema: await asSchema(tool.inputSchema).jsonSchema,\n })),\n )\n return Math.ceil(\n new TextEncoder().encode(\n JSON.stringify({\n messages: options.messages,\n instructions: options.instructions,\n tools,\n }),\n ).byteLength / 4,\n )\n}\n\nconst measuredInputTokens = (options: {\n estimate: number\n model: string\n calibration: AICoordinatorState['calibration']\n}): number => {\n const previous = options.calibration\n return previous !== undefined &&\n previous.model === options.model &&\n options.estimate >= previous.estimate\n ? Math.max(\n options.estimate,\n Math.ceil(previous.inputTokens + options.estimate - previous.estimate),\n )\n : options.estimate\n}\n\ntype ToolCallClassification = 'automatic' | 'approval' | 'unknown'\n\ntype PendingToolCall = {\n call: ToolCalledPayload\n classification: ToolCallClassification\n}\n\nconst toolCalledEvent = <D extends EventDefs>(\n payload: ToolCalledPayload,\n): AppendInput<D> =>\n ({\n type: 'ai.tool.called',\n id: `${payload.generationId}:tool:${payload.toolCallId}:called`,\n payload,\n }) as AppendInput<D>\n\nconst approvalClassification = <T extends ToolSet>(\n tools: T,\n generation: AgentGenerationSettings<T>,\n toolName: string,\n): ToolCallClassification => {\n const configured = generation.toolApproval\n if (typeof configured === 'function') return 'unknown'\n const policy = configured?.[toolName]\n if (typeof policy === 'function') return 'unknown'\n if (\n policy === 'user-approval' ||\n (typeof policy === 'object' && policy?.type === 'user-approval')\n ) {\n return 'approval'\n }\n if (\n policy === 'denied' ||\n (typeof policy === 'object' && policy?.type === 'denied')\n ) {\n return 'approval'\n }\n const tool = tools[toolName] as { needsApproval?: unknown } | undefined\n if (typeof tool?.needsApproval === 'function') return 'unknown'\n return tool?.needsApproval === true ? 'approval' : 'automatic'\n}\n\nconst lifecycleEvents = <D extends EventDefs, T extends ToolSet>(options: {\n requestId: string\n messageId: string\n generationId: string\n sequence: number\n chunks: UIMessageChunk[]\n pending: PendingToolCall[]\n tools: T\n generation: AgentGenerationSettings<T>\n custom: boolean\n}): { events: AppendInput<D>[]; pending: PendingToolCall[] } => {\n const result: AppendInput<D>[] = []\n const pending = [...options.pending]\n const take = (toolCallId: string): PendingToolCall | undefined => {\n const index = pending.findIndex(\n (candidate) => candidate.call.toolCallId === toolCallId,\n )\n if (index === -1) return undefined\n return pending.splice(index, 1)[0]\n }\n const flush = (toolCallId: string): void => {\n const pendingCall = take(toolCallId)\n if (pendingCall) result.push(toolCalledEvent<D>(pendingCall.call))\n }\n for (const [chunkIndex, chunk] of options.chunks.entries()) {\n const resultId = `${options.generationId}:tool-result:${options.sequence}:${chunkIndex}`\n if (chunk.type === 'tool-input-available') {\n const payload: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...((\n options.tools[chunk.toolName] as\n { supportsDeferredResults?: boolean } | undefined\n )?.supportsDeferredResults === true\n ? { supportsDeferredResults: true }\n : {}),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n }\n take(payload.toolCallId)\n const classification = approvalClassification(\n options.tools,\n options.generation,\n chunk.toolName,\n )\n if (classification === 'automatic') {\n result.push(toolCalledEvent<D>(payload))\n } else {\n pending.push({ call: payload, classification })\n }\n } else if (chunk.type === 'tool-input-error') {\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n ...(chunk.dynamic ? { input: chunk.input } : { rawInput: chunk.input }),\n error: chunk.errorText,\n phase: 'input',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n const called: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n }\n take(chunk.toolCallId)\n result.push(toolCalledEvent<D>(called), {\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-available') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n output: chunk.output,\n phase: 'execution',\n ...(chunk.preliminary === undefined\n ? {}\n : { preliminary: chunk.preliminary }),\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-error') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n error: chunk.errorText,\n phase: 'execution',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-denied') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n denied: true,\n phase: 'execution',\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-request') {\n flush(chunk.toolCallId)\n const payload: ApprovalRequestedPayload = {\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n toolCallId: chunk.toolCallId,\n ...(chunk.isAutomatic === undefined\n ? {}\n : { isAutomatic: chunk.isAutomatic }),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n result.push({\n type: 'ai.approval.requested',\n id: `${options.generationId}:approval:${chunk.approvalId}`,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-response') {\n result.push({\n type: 'ai.approval.responded',\n id: `${options.generationId}:approval:${chunk.approvalId}:automatic-response`,\n payload: {\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n },\n } as AppendInput<D>)\n }\n }\n return { events: result, pending }\n}\n\nfunction withoutGenerationLifecycle<D extends EventDefs>(\n history: ContractEvent<D>[],\n generationIds: ReadonlySet<string>,\n): ContractEvent<D>[] {\n if (generationIds.size === 0) return history\n const approvalKeys = new Set<string>()\n const inputKeys = new Set<string>()\n for (const event of history) {\n const payload = event.payload as {\n generationId?: unknown\n messageId?: unknown\n approvalId?: unknown\n inputId?: unknown\n }\n if (\n typeof payload.generationId !== 'string' ||\n !generationIds.has(payload.generationId) ||\n typeof payload.messageId !== 'string'\n ) {\n continue\n }\n if (\n event.type === 'ai.approval.requested' &&\n typeof payload.approvalId === 'string'\n ) {\n approvalKeys.add(`${payload.messageId}\\u001f${payload.approvalId}`)\n }\n if (\n event.type === 'ai.input.requested' &&\n typeof payload.inputId === 'string'\n ) {\n inputKeys.add(`${payload.messageId}\\u001f${payload.inputId}`)\n }\n }\n return history.filter((event) => {\n const payload = event.payload as {\n generationId?: unknown\n messageId?: unknown\n approvalId?: unknown\n inputId?: unknown\n }\n if (\n typeof payload.generationId === 'string' &&\n generationIds.has(payload.generationId)\n ) {\n return false\n }\n if (\n event.type === 'ai.approval.responded' &&\n typeof payload.messageId === 'string' &&\n typeof payload.approvalId === 'string'\n ) {\n return !approvalKeys.has(\n `${payload.messageId}\\u001f${payload.approvalId}`,\n )\n }\n if (\n event.type === 'ai.input.responded' &&\n typeof payload.messageId === 'string' &&\n typeof payload.inputId === 'string'\n ) {\n return !inputKeys.has(`${payload.messageId}\\u001f${payload.inputId}`)\n }\n return true\n })\n}\n\nconst validateCompaction = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n compaction: CompactionOptions<M, D>\n explicit: boolean\n generation: AgentGenerationSettings<T> | undefined\n tools: T | undefined\n}): CompactionOptions<M, D> => {\n let compaction = options.compaction\n if (\n compaction !== false &&\n (typeof compaction !== 'object' || compaction === null)\n ) {\n throw new TypeError('compaction must resolve to false or a policy object')\n }\n if (compaction !== false && 'then' in compaction) {\n void Promise.resolve(compaction).catch(() => {})\n throw new TypeError('compaction options must be a policy or a resolver')\n }\n if (compaction !== false && !('shouldCompact' in compaction)) {\n if (\n compaction.thresholdTokens !== undefined &&\n (!Number.isSafeInteger(compaction.thresholdTokens) ||\n compaction.thresholdTokens < 1)\n ) {\n throw new TypeError(\n 'compaction.thresholdTokens must be a positive safe integer',\n )\n }\n const choice = options.generation?.toolChoice\n const unsupported =\n options.generation?.output !== undefined\n ? 'structured output'\n : choice !== undefined && choice !== 'auto' && choice !== 'none'\n ? 'forced tool choice'\n : Object.values(options.tools ?? {}).some(\n (tool) =>\n tool.type === 'provider' && tool.isProviderExecuted === true,\n )\n ? 'provider-executed tools'\n : undefined\n if (unsupported !== undefined) {\n if (options.explicit) {\n throw new TypeError(\n `automatic compaction does not support ${unsupported}; use a custom policy or compaction: false`,\n )\n }\n compaction = false\n }\n }\n\n return compaction\n}\n\n/**\n * Build the ordinary A2 handler table for the built-in agent protocol.\n * Application handlers can be spread beside this table.\n */\nexport function createHandlers<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n>(\n options: CreateHandlersOptions<M, D, T>,\n): NonNullable<ServerOptions<D>['handlers']> {\n if (options.model === undefined) {\n throw new TypeError('createHandlers requires model')\n }\n if (\n options.progress?.maxChunks !== undefined &&\n (!Number.isInteger(options.progress.maxChunks) ||\n options.progress.maxChunks < 1)\n ) {\n throw new TypeError('progress.maxChunks must be a positive integer')\n }\n if (\n options.progress?.maxDelayMs !== undefined &&\n (!Number.isFinite(options.progress.maxDelayMs) ||\n options.progress.maxDelayMs < 0)\n ) {\n throw new TypeError('progress.maxDelayMs must be a non-negative number')\n }\n if (\n options.maxSteps !== undefined &&\n options.maxSteps !== Number.POSITIVE_INFINITY &&\n (!Number.isInteger(options.maxSteps) || options.maxSteps < 1)\n ) {\n throw new TypeError('maxSteps must be a positive integer or Infinity')\n }\n\n const configuredCompaction =\n options.compaction ?? (options.generate === undefined ? {} : false)\n const staticCompaction =\n typeof configuredCompaction === 'function'\n ? undefined\n : validateCompaction({\n compaction: configuredCompaction,\n explicit: options.compaction !== undefined,\n generation: options.generation,\n tools: options.tools,\n })\n\n const tools = options.tools ?? ({} as T)\n const generation: AgentGenerationSettings<T> = options.generation ?? {}\n const maxSteps = options.maxSteps ?? Number.POSITIVE_INFINITY\n const control = createControlRuntime({ agent: options.agent })\n const coordinator = control.coordinator\n const promptCache = new Map<string, Promise<ModelMessage[]>>()\n\n type RuntimeTool = {\n execute?: (\n input: unknown,\n options: {\n toolCallId: string\n messages: ModelMessage[]\n abortSignal?: AbortSignal\n },\n ) => unknown\n }\n\n type ToolHandlerContext = HandlerContext<D, 'ai.tool.execution.requested'>\n\n const resultEvent = (\n call: ToolCalledPayload,\n suffix: string,\n result: {\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n },\n ): AppendInput<D> =>\n ({\n type: 'ai.tool.result',\n id: `${call.generationId}:tool:${call.toolCallId}:${suffix}`,\n payload: {\n requestId: call.requestId,\n messageId: call.messageId,\n generationId: call.generationId,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n phase: 'execution',\n ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.denied === undefined ? {} : { denied: result.denied }),\n ...(result.preliminary === undefined\n ? {}\n : { preliminary: result.preliminary }),\n ...(call.dynamic === undefined ? {} : { dynamic: call.dynamic }),\n ...(call.providerExecuted === undefined\n ? {}\n : { providerExecuted: call.providerExecuted }),\n ...(call.toolMetadata === undefined\n ? {}\n : { toolMetadata: call.toolMetadata }),\n },\n }) as AppendInput<D>\n\n const promptMessages = (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<ModelMessage[]> => {\n const { ctx, call, generation: owner } = input\n const key = promptCacheKey(ctx.event.sessionId, call.generationId)\n const cached = promptCache.get(key)\n if (cached) return cached\n const computation = (async () => {\n const frontier = owner.promptThroughIndex\n if (frontier === undefined)\n throw new TypeError('AI work requires a prompt checkpoint')\n const [snapshot, atPrompt, tail] = await Promise.all([\n ctx.session.state(options.agent.reducer, { through: frontier }),\n ctx.session.state(coordinator, { through: frontier }),\n ctx.session.history({ gte: frontier + 1, lte: ctx.event.index }),\n ])\n const appended = tail.filter(\n (event) =>\n (event.type === 'ai.generation.started' ||\n event.type === 'ai.compaction.requested' ||\n event.type === 'ai.compaction.completed') &&\n (event.payload as { generationId: string }).generationId ===\n call.generationId,\n )\n const state = foldAIEvents({\n agent: options.agent,\n events: appended,\n state: snapshot.state,\n })\n return modelContext({\n messages: await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot,\n coordinator: atPrompt.state,\n appended,\n }),\n state,\n tools,\n })\n })()\n promptCache.set(key, computation)\n void computation.catch(() => {\n if (promptCache.get(key) === computation) promptCache.delete(key)\n })\n return computation\n }\n\n const toolExecutionFailure = (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n error: unknown,\n ): AppendInput<D> | void => {\n const schedulerFailure = consumeSchedulerSendFailure(error)\n if (checkAbort(ctx.signal)) return\n if (schedulerFailure === 'retryable') throw error\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: errorMessage(error),\n })\n }\n\n const runToolExecution = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n execute: NonNullable<RuntimeTool['execute']>,\n messages: ModelMessage[],\n ): Promise<AppendInput<D> | void> => {\n let output: unknown\n try {\n output = await execute(call.input, {\n toolCallId: call.toolCallId,\n messages,\n abortSignal: ctx.signal,\n })\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n let iterator: AsyncIterator<unknown> | undefined\n try {\n iterator = asyncIterator(output)\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (iterator === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:0`, { output })\n }\n let last: unknown\n let sequence = 0\n let done = false\n try {\n for (;;) {\n let result: IteratorResult<unknown>\n try {\n result = await iterator.next()\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (result.done) {\n if (ctx.signal.reason instanceof A2Error) throw ctx.signal.reason\n done = true\n break\n }\n if (checkAbort(ctx.signal)) return\n last = result.value\n await control.append({\n ctx,\n name: `tool:${call.toolCallId}:preliminary:${sequence}`,\n events: [\n resultEvent(\n call,\n `${ctx.event.id}:execution:${ctx.attempt}:${sequence}:preliminary`,\n {\n output: result.value,\n preliminary: true,\n },\n ),\n ],\n })\n sequence += 1\n }\n } finally {\n if (!done) {\n try {\n await iterator.return?.()\n } catch {\n // Preserve the failure or cancellation that ended execution.\n }\n }\n }\n return resultEvent(\n call,\n `${ctx.event.id}:execution:${sequence}:final`,\n sequence === 0 ? {} : { output: last },\n )\n }\n\n const executeTool = async (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<AppendInput<D> | void> => {\n const { ctx, call } = input\n const tool = tools[call.toolName] as RuntimeTool | undefined\n const execute = tool?.execute\n if (execute === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: `Tool '${call.toolName}' has no server executor`,\n })\n }\n const messages = await promptMessages(input)\n if (checkAbort(ctx.signal)) return\n const scope: AmbientToolScope = {\n contract: options.agent.contract,\n context: ctx,\n }\n // Async iteration resumes in the caller's context, so the whole\n // execution, not just the execute call, runs inside the scope.\n return toolScopeStorage.run(scope, () =>\n runToolExecution(ctx, call, execute, messages),\n )\n }\n\n const handleToolExecution = async (\n ctx: ToolHandlerContext,\n ): Promise<AppendInput<D>> => {\n try {\n const state = (\n await ctx.session.state(control.reducer, { through: 'latest' })\n ).state\n const request = ctx.event.payload\n const call = state.coordinator.response?.calls.find(\n (candidate) => candidate.work?.id === ctx.event.id,\n )\n if (\n state.active?.turnId !== request.turnId ||\n state.active.suspended ||\n state.active.version !== request.version ||\n state.coordinator.response?.failure !== undefined ||\n !call ||\n call.terminal ||\n call.work?.settled\n )\n return control.settled({ ctx, events: undefined })\n return control.settled({\n ctx,\n events: await executeTool({\n ctx,\n call: request.call,\n generation: request.generation,\n }),\n })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n }\n\n const generationHandler = async (\n ctx: HandlerContext<D, 'ai.generation.requested'>,\n ): Promise<void | AppendInput<D> | readonly AppendInput<D>[]> => {\n if (checkAbort(ctx.signal)) return\n const requestId = ctx.event.id\n const request = ctx.event.payload\n const snapshot = await ctx.session.state(options.agent.reducer, {\n through: 'latest',\n })\n if (\n snapshot.state.active?.phase === 'paused' ||\n snapshot.state.active?.phase === 'pausing'\n )\n return\n const coordinatorState = (\n await ctx.session.state(coordinator, { through: snapshot.index })\n ).state\n if (\n coordinatorState.closed ||\n coordinatorState.response?.activeRequestId !== requestId\n )\n return\n const response = coordinatorState.response\n const current =\n response.generation?.requestId === requestId\n ? response.generation\n : undefined\n if (\n current !== undefined &&\n (response.completion !== undefined ||\n (response.failure !== undefined &&\n response.failure.superseded !== true))\n )\n return\n if (current !== undefined && current.attempt >= ctx.attempt) return\n const attempt = ctx.attempt\n const generationId = `${requestId}:generation:${attempt}`\n const responseMessageId =\n request.responseMessageId ??\n (request.reason === 'message'\n ? `${request.messageId}:assistant`\n : request.messageId)\n const responseStepCount = response.stepCount\n if (\n request.reason === 'tool' &&\n (requestId !==\n `ai.generate:tools:${response.source?.generation.generationId}` ||\n response.responseMessageId !== request.messageId ||\n response.responseMessageId !== request.responseMessageId)\n )\n return\n const previous = current\n const replaced =\n previous === undefined\n ? []\n : [{ generation: previous, frontier: response.promptThroughIndex! }]\n if (request.reason === 'retry' && response.source?.failed) {\n replaced.push({\n generation: response.source.generation,\n frontier: response.source.promptThroughIndex,\n })\n }\n const replacedGenerationIds = new Set(\n replaced.map(({ generation: owner }) => owner.generationId),\n )\n let state = snapshot.state\n if (replaced.length > 0) {\n const through = Math.min(...replaced.map(({ frontier }) => frontier))\n const baseline = await ctx.session.state(options.agent.reducer, {\n through,\n })\n const tail = await ctx.session.history({\n gte: through + 1,\n lte: snapshot.index,\n })\n state = foldAIEvents({\n agent: options.agent,\n events: withoutGenerationLifecycle(tail, replacedGenerationIds),\n state: baseline.state,\n })\n }\n const resolverContext: AgentResolverContext<M, D> = {\n event: ctx.event,\n state,\n session: {\n state: (reducer, readOptions) =>\n ctx.session.state(reducer, {\n ...readOptions,\n through: readOptions?.through ?? snapshot.index,\n }),\n },\n signal: ctx.signal,\n }\n\n let generationStarted = false\n try {\n const resolvedModel = await resolve(options.model, resolverContext)\n if (resolvedModel === undefined) {\n throw new TypeError('the model resolver returned undefined')\n }\n if (checkAbort(ctx.signal)) return\n const resolvedInstructions =\n options.instructions === undefined\n ? undefined\n : await resolve(options.instructions, resolverContext)\n if (checkAbort(ctx.signal)) return\n const compaction =\n typeof configuredCompaction === 'function'\n ? validateCompaction({\n compaction: await resolve(configuredCompaction, resolverContext),\n explicit: true,\n generation: options.generation,\n tools: options.tools,\n })\n : staticCompaction!\n if (checkAbort(ctx.signal)) return\n\n if (request.reason === 'tool' && responseStepCount >= maxSteps) {\n const source = response.source?.generation\n if (source === undefined) return\n return {\n type: 'ai.generation.failed',\n id: `${requestId}:step-limit`,\n payload: {\n requestId: source.requestId,\n messageId: source.messageId,\n generationId: source.generationId,\n responseMessageId,\n error: `agent exceeded the ${maxSteps}-step limit`,\n stepLimit: true,\n },\n } as AppendInput<D>\n }\n\n const started: GenerationStartedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n attempt,\n model: modelName(resolvedModel),\n promptThroughIndex: snapshot.index,\n }\n const catalogModelId = gatewayModelId(resolvedModel)\n const gatewayOptions = options.generation?.providerOptions?.['gateway']\n const usesFallbackModels =\n Array.isArray(gatewayOptions?.['models']) &&\n gatewayOptions['models'].length > 0\n const discoversMetadata =\n compaction !== false &&\n !('shouldCompact' in compaction) &&\n compaction.thresholdTokens === undefined &&\n !usesFallbackModels &&\n catalogModelId !== undefined\n const startEvents: AppendInput<D>[] = []\n if (\n discoversMetadata &&\n !Object.hasOwn(state.modelMetadata, catalogModelId)\n ) {\n startEvents.push({\n type: 'ai.model.metadata.requested',\n id: `ai.model.metadata:${encodeURIComponent(options.agent.contract.name)}:${encodeURIComponent(ctx.event.sessionId)}:${encodeURIComponent(catalogModelId)}`,\n payload: { modelId: catalogModelId },\n } as AppendInput<D>)\n }\n if (previous) {\n const payload = previous\n const superseded: GenerationFailedPayload = {\n requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n responseMessageId: payload.responseMessageId,\n error: 'generation attempt was superseded after an incomplete run',\n superseded: true,\n }\n startEvents.push({\n type: 'ai.generation.failed',\n id: `${payload.generationId}:superseded`,\n payload: superseded,\n } as AppendInput<D>)\n }\n startEvents.push({\n type: 'ai.generation.started',\n id: generationId,\n payload: started,\n } as AppendInput<D>)\n const generationEvents = await control.append({\n ctx,\n name: 'generation-start',\n events: startEvents,\n })\n generationStarted = true\n\n if (checkAbort(ctx.signal)) return\n\n const promptCoordinatorState = coordinatorState\n const messages = await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot: { state, index: snapshot.index },\n coordinator: promptCoordinatorState,\n excluded: replacedGenerationIds,\n })\n let generationMessages = messages\n let modelMessages = await modelContext({ messages, state, tools })\n const baseContext: AgentGenerateContext<M, D, T> = {\n request: ctx.event,\n requestId,\n generationId,\n responseMessageId,\n messages,\n modelMessages,\n state,\n session: resolverContext.session,\n signal: ctx.signal,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation,\n }\n const policy = compaction\n const tracksInput =\n policy !== false &&\n !('shouldCompact' in policy) &&\n (policy.thresholdTokens !== undefined || discoversMetadata)\n const metadata =\n catalogModelId === undefined\n ? undefined\n : state.modelMetadata[catalogModelId]\n const limits =\n metadata?.status === 'resolved' && !usesFallbackModels\n ? metadata.limits\n : undefined\n let inputTokenEstimate: number | undefined\n let compacted = false\n const canCompact = response.source?.canCompact ?? true\n if (policy && canCompact) {\n const compactionContext = {\n ...resolverContext,\n messages,\n modelMessages,\n }\n let shouldCompact: boolean\n if ('shouldCompact' in policy) {\n shouldCompact = await policy.shouldCompact(compactionContext)\n } else if (tracksInput) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n const inputTokens = measuredInputTokens({\n estimate: inputTokenEstimate,\n model: modelName(resolvedModel),\n calibration: coordinatorState.calibration,\n })\n const threshold =\n policy.thresholdTokens ??\n (limits === undefined\n ? undefined\n : Math.floor(\n Math.min(\n limits.contextWindow * 0.75,\n limits.contextWindow - (generation.maxOutputTokens ?? 0),\n ),\n ))\n if (\n limits !== undefined &&\n threshold !== undefined &&\n threshold <= 0\n ) {\n throw new Error(\n `output allowance exhausts the ${limits.contextWindow}-token context window`,\n )\n }\n shouldCompact = threshold !== undefined && inputTokens >= threshold\n } else {\n shouldCompact = false\n }\n if (checkAbort(ctx.signal)) return\n if (shouldCompact) {\n const throughMessageId =\n state.messages.findLast(\n (message) =>\n !promptCoordinatorState.queued.some(\n (queued) => queued.messageId === message.id,\n ),\n )?.id ?? request.messageId\n const throughIndex = snapshot.index\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-requested',\n events: [\n {\n type: 'ai.compaction.requested',\n id: `${generationId}:compaction:requested`,\n payload: { generationId, throughMessageId, throughIndex },\n } as AppendInput<D>,\n ],\n })),\n )\n const result = !('shouldCompact' in policy)\n ? {\n messages: [] as M[],\n ...(await summarize({\n agentName: options.agent.contract.name,\n context: baseContext,\n instructions: policy.instructions,\n })),\n }\n : { messages: await policy.compact(compactionContext) }\n if (checkAbort(ctx.signal)) return\n const completed: CompactionCompletedPayload<M> = {\n generationId,\n throughMessageId,\n throughIndex,\n ...result,\n ...(promptCoordinatorState.queued.length === 0\n ? {}\n : {\n retainedMessageIds: promptCoordinatorState.queued.map(\n (item) => item.messageId,\n ),\n }),\n }\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-completed',\n events: [\n {\n type: 'ai.compaction.completed',\n id: `${generationId}:compaction:completed`,\n payload: completed,\n } as AppendInput<D>,\n ],\n })),\n )\n const queued = new Set(\n promptCoordinatorState.queued.map((item) => item.messageId),\n )\n generationMessages = result.messages.filter(\n (message) => !queued.has(message.id),\n )\n compacted = true\n }\n }\n\n const currentState = foldAIEvents({\n agent: options.agent,\n events: generationEvents,\n state: snapshot.state,\n })\n if (request.reason === 'retry' || previous !== undefined) {\n generationMessages = await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot,\n coordinator: promptCoordinatorState,\n appended: generationEvents,\n })\n }\n if (\n (policy && 'shouldCompact' in policy) ||\n generationMessages !== messages ||\n activeCompaction(currentState)?.summary !==\n activeCompaction(state)?.summary\n ) {\n modelMessages = await modelContext({\n messages: generationMessages,\n state: currentState,\n tools,\n })\n }\n promptCache.set(\n promptCacheKey(ctx.event.sessionId, generationId),\n Promise.resolve(modelMessages),\n )\n if (tracksInput && (inputTokenEstimate === undefined || compacted)) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n }\n\n let pendingToolCalls: PendingToolCall[] = []\n if (checkAbort(ctx.signal)) return\n const generateContext: AgentGenerateContext<M, D, T> = {\n request: ctx.event,\n requestId,\n generationId,\n responseMessageId,\n messages: generationMessages,\n modelMessages,\n state: currentState,\n session: resolverContext.session,\n signal: ctx.signal,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation: options.generation ?? {},\n }\n const custom = options.generate !== undefined\n const source =\n options.generate === undefined\n ? await generateWithAISDK({\n agentName: options.agent.contract.name,\n context: generateContext,\n messageMetadata: options.messageMetadata,\n })\n : { stream: await options.generate(generateContext) }\n const updates = consumeGeneration({\n source,\n ...(options.progress === undefined\n ? {}\n : { progress: options.progress }),\n })\n\n let sequence = 0\n let finish: AgentGenerationFinish | undefined\n for await (const update of updates) {\n ctx.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n const progress: GenerationProgressPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n sequence,\n chunks: update.chunks,\n }\n const lifecycle = lifecycleEvents<D, T>({\n requestId,\n messageId: responseMessageId,\n generationId,\n sequence,\n chunks: update.chunks,\n pending: pendingToolCalls,\n tools,\n generation,\n custom,\n })\n pendingToolCalls = lifecycle.pending\n await control.append({\n ctx,\n name: `generation-progress:${sequence}`,\n events: [\n {\n type: 'ai.generation.progress',\n id: `${generationId}:progress:${sequence}`,\n payload: progress,\n } as AppendInput<D>,\n ...lifecycle.events,\n ],\n })\n sequence += 1\n }\n\n if (!finish) throw new Error('agent generation finished without output')\n const completed: GenerationCompletedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n ...(inputTokenEstimate === undefined ? {} : { inputTokenEstimate }),\n ...(finish.finishReason === undefined\n ? {}\n : { finishReason: finish.finishReason }),\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n const completionEvent = {\n type: 'ai.generation.completed',\n id: `${generationId}:completed`,\n payload: completed,\n } as AppendInput<D>\n const unresolved = options.generate\n ? pendingToolCalls.filter(\n (pending) => pending.classification !== 'automatic',\n )\n : []\n if (unresolved.length > 0) {\n throw new Error(\n `generation ended with unresolved tool authorization for '${unresolved[0]!.call.toolName}'`,\n )\n }\n const pendingEvents = pendingToolCalls\n .filter(\n (pending) =>\n pending.classification === 'automatic' ||\n (options.generate === undefined &&\n pending.classification === 'unknown'),\n )\n .map((pending) => toolCalledEvent<D>(pending.call))\n if (finish.finishReason === 'tool-calls') {\n return [...pendingEvents, completionEvent]\n }\n return [\n ...pendingEvents,\n completionEvent,\n {\n type: 'ai.message.completed',\n id: `${generationId}:message:completed`,\n payload: {\n messageId: responseMessageId,\n } satisfies MessageCompletedPayload,\n } as AppendInput<D>,\n ]\n } catch (error) {\n if (error instanceof ControlCancelled) throw error\n if (error instanceof A2Error) {\n checkAbort(ctx.signal)\n throw error\n }\n if (checkAbort(ctx.signal)) return\n if (!generationStarted) throw error\n const failed: GenerationFailedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n error: errorMessage(error),\n }\n return {\n type: 'ai.generation.failed',\n id: `${generationId}:failed`,\n payload: failed,\n } as AppendInput<D>\n }\n }\n\n const clearPromptCache = (sessionId: string): void => {\n const prefix = `${sessionId}\\u001f`\n for (const key of promptCache.keys()) {\n if (key.startsWith(prefix)) promptCache.delete(key)\n }\n }\n\n return {\n 'ai.model.metadata.requested': {\n handler: async (ctx) => {\n const limits = await readModelLimits({\n modelId: ctx.event.payload.modelId,\n signal: ctx.signal,\n })\n ctx.signal.throwIfAborted()\n return {\n type: 'ai.model.metadata.resolved',\n id: `${ctx.event.id}:resolved`,\n payload: { modelId: ctx.event.payload.modelId, limits },\n } as AppendInput<D>\n },\n },\n 'ai.control.requested': { lane: 'a2.ai.control', handler: control.handler },\n 'ai.work.reported': { lane: 'a2.ai.control', handler: control.handler },\n 'ai.message.completed': {\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n },\n },\n 'ai.message.interrupted': {\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n },\n },\n 'ai.session.closed': {\n lane: 'a2.ai.control',\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n return control.handler(ctx)\n },\n },\n 'ai.generation.failed': {\n handler: (ctx) => {\n promptCache.delete(\n promptCacheKey(ctx.event.sessionId, ctx.event.payload.generationId),\n )\n return Promise.resolve()\n },\n },\n 'ai.generation.requested': {\n lane: 'a2.ai.model',\n abortOn: {\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.control?.turnId ||\n active?.version !== trigger.payload.control?.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: async (ctx) => {\n try {\n return control.settled({ ctx, events: await generationHandler(ctx) })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n },\n },\n 'ai.tool.execution.requested': {\n abortOn: {\n 'ai.generation.failed': (event, trigger) =>\n event.payload.generationId === trigger.payload.call.generationId,\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.turnId ||\n active?.version !== trigger.payload.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: handleToolExecution,\n },\n } as NonNullable<ServerOptions<D>['handlers']>\n}\n\n/** Assemble an A2 server with the built-in agent handlers and app extensions. */\nexport function createAgentServer<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n>(options: CreateAgentServerOptions<M, D, T>): A2Server<D> {\n const {\n agent: definition,\n model,\n tools,\n instructions,\n generation,\n maxSteps,\n messageMetadata,\n generate,\n compaction,\n progress,\n handlers,\n ...serverOptions\n } = options\n const builtIns = createHandlers({\n agent: definition,\n model,\n ...(tools === undefined ? {} : { tools }),\n ...(instructions === undefined ? {} : { instructions }),\n ...(generation === undefined ? {} : { generation }),\n ...(maxSteps === undefined ? {} : { maxSteps }),\n ...(messageMetadata === undefined ? {} : { messageMetadata }),\n ...(generate === undefined ? {} : { generate }),\n ...(compaction === undefined ? {} : { compaction }),\n ...(progress === undefined ? {} : { progress }),\n })\n const server = createServer({\n ...serverOptions,\n contract: definition.contract,\n handlers: { ...builtIns, ...handlers },\n })\n setServerFetchHooks(server, { validateIngress: validateAgentIngress })\n return server\n}\n\nexport type { Instructions, LanguageModel, ToolSet }\n"],"mappings":";;;;;;;;;AA4DA,MAAM,kBACJ,OACA,WAEA,MAAM,aAAa,KAAA,IACf,QACA;CAAE,GAAG;CAAO,UAAU,OAAO,MAAM,QAAQ;AAAE;AAEnD,MAAa,mBACX,OACA,UACuB;CACvB,QAAQ,MAAM,MAAd;EACE,KAAK,qBACH,OAAO;GAAE,QAAQ;GAAM,QAAQ,CAAC;EAAE;EACpC,KAAK;EACL,KAAK,2BAA2B;GAC9B,MAAM,EAAE,aAAa,GAAG,GAAG,SAAS;GACpC,OAAO;EACT;EACA,KAAK,sBAAsB;GACzB,MAAM,UAAU,MAAM;GACtB,MAAM,UAAU,QAAQ;GACxB,IAAI,QAAQ,SAAS,QAAQ,OAAO;GACpC,OAAO;IACL,GAAG;IACH,QAAQ,CACN,GAAG,MAAM,OAAO,QAAQ,SAAS,KAAK,cAAc,QAAQ,EAAE,GAC9D;KACE,WAAW,QAAQ;KACnB,UAAU,QAAQ,aAAa;IACjC,CACF;GACF;EACF;EACA,KAAK,2BAA2B;GAC9B,MAAM,UAAU,MAAM;GACtB,IAAI,QAAQ,WAAW,WAAW;IAChC,MAAM,oBACJ,QAAQ,qBAAqB,GAAG,QAAQ,UAAU;IACpD,MAAM,YAAY,MAAM,OAAO,WAC5B,SAAS,KAAK,cAAc,QAAQ,SACvC;IACA,OAAO;KACL,GAAG;KACH,QACE,YAAY,IACR,MAAM,OAAO,QACV,SAAS,KAAK,cAAc,QAAQ,SACvC,IACA,MAAM,OAAO,MAAM,YAAY,CAAC;KACtC,UAAU;MACR,eAAe,QAAQ;MACvB;MACA,QAAQ;MACR,WAAW;MACX,iBAAiB,MAAM;MACvB,OAAO,CAAC;MACR,QAAQ,CAAC;KACX;IACF;GACF;GACA,IACE,MAAM,aAAa,KAAA,KACnB,QAAQ,sBAAsB,MAAM,SAAS,mBAE7C,OAAO;GAET,IACG,QAAQ,WAAW,WACjB,CAAC,kBAAkB,KAAK,KACvB,MAAM,OACJ,qBAAqB,MAAM,SAAS,YAAY,mBACrD,QAAQ,WAAW,WAAW,MAAM,SAAS,WAAW,YACxD,QAAQ,WAAW,WAClB,MAAM,SAAS,kBAAkB,KAAA,GAEnC,OAAO;GAET,OAAO,eAAe,QAAQ,aAAa;IACzC,MAAM,aAAa,SAAS,cAAc,SAAS,QAAQ;IAC3D,MAAM,qBACJ,SAAS,sBAAsB,SAAS,QAAQ;IAClD,OAAO;KACL,eAAe,SAAS;KACxB,mBAAmB,SAAS;KAC5B,QAAQ;KACR,WAAW,SAAS;KACpB,iBAAiB,MAAM;KACvB,GAAI,eAAe,KAAA,KAAa,uBAAuB,KAAA,IACnD,CAAC,IACD,EACE,QAAQ;MACN;MACA;MACA,QACE,SAAS,SAAS,iBAAiB,WAAW;MAChD,YAAY,SAAS,MAAM,OAAO,SAAS,KAAK,QAAQ;KAC1D,EACF;KACJ,OAAO,CAAC;KACR,QAAQ,CAAC;IACX;GACF,CAAC;EACH;EACA,KAAK,yBAAyB;GAC5B,MAAM,aAAa,MAAM;GACzB,IACE,MAAM,UAAU,sBAAsB,WAAW,qBACjD,MAAM,SAAS,oBAAoB,WAAW,aAC7C,MAAM,SAAS,YAAY,cAAc,WAAW,aACnD,MAAM,SAAS,WAAW,WAAW,WAAW,SAElD,OAAO;GAET,OAAO,eAAe,QAAQ,cAAc;IAC1C,eAAe,SAAS;IACxB,mBAAmB,SAAS;IAC5B,QAAQ;IACR,WAAW,SAAS;IACpB;IACA,GAAI,WAAW,uBAAuB,KAAA,IAClC,CAAC,IACD,EAAE,oBAAoB,WAAW,mBAAmB;IACxD,GAAI,SAAS,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,SAAS,OAAO;IACnE,iBAAiB,WAAW;IAC5B,OAAO,CAAC;IACR,QAAQ,CAAC;GACX,EAAE;EACJ;EACA,KAAK,2BAA2B;GAC9B,MAAM,aAAa,MAAM;GACzB,IACE,MAAM,UAAU,YAAY,iBAAiB,WAAW,cAExD,OAAO;GAST,MAAM,EAAE,aAAa,GAAG,GAAG,iBAPd,eAAe,QAAQ,cAAc;IAChD,GAAG;IACH,QAAQ;IACR;IACA,WACE,SAAS,aAAa,SAAS,eAAe,KAAA,IAAY,IAAI;GAClE,EAC+C;GAC/C,MAAM,cAAc,WAAW,OAAO;GACtC,MAAM,WAAW,WAAW;GAC5B,OAAO,gBAAgB,KAAA,KACrB,OAAO,SAAS,WAAW,KAC3B,eAAe,KACf,aAAa,KAAA,IACX;IACE,GAAG;IACH,aAAa;KACX,OAAO,MAAM,SAAS,WAAW;KACjC;KACA;IACF;GACF,IACA;EACN;EACA,KAAK,wBAAwB;GAC3B,MAAM,UAAU,MAAM;GACtB,MAAM,WAAW,MAAM;GACvB,MAAM,uBACJ,UAAU,YAAY,iBAAiB,QAAQ;GACjD,MAAM,sBACJ,QAAQ,cAAc,QACtB,UAAU,oBACR,qBAAqB,QAAQ,kBAC/B,SAAS,sBAAsB,QAAQ;GACzC,IAAI,CAAC,wBAAwB,CAAC,qBAC5B,OAAO;GAET,OAAO,eAAe,QAAQ,aAAa;IACzC,GAAG;IACH,QAAQ;IACR;GACF,EAAE;EACJ;EACA,KAAK,wBAAwB;GAC3B,MAAM,YAAa,MAAM,QAAkC;GAC3D,IAAI,MAAM,UAAU,sBAAsB,WAAW,OAAO;GAC5D,MAAM,EAAE,UAAU,GAAG,GAAG,SAAS;GACjC,OAAO;EACT;EACA,KAAK,0BAA0B;GAC7B,MAAM,eAAe,MAAM;GAC3B,MAAM,WAAW,MAAM;GACvB,IACE,UAAU,sBAAsB,aAAa,aAC5C,aAAa,iBAAiB,SAAS,YAAY,gBAClD,aAAa,cAAc,SAAS,iBAEtC,OAAO;GACT,MAAM,EAAE,UAAU,GAAG,GAAG,SAAS;GACjC,OAAO;EACT;EACA,KAAK,kBAAkB;GACrB,MAAM,OAAO,MAAM;GACnB,IAAI,MAAM,UAAU,YAAY,iBAAiB,KAAK,cACpD,OAAO;GAET,OAAO,eAAe,QAAQ,cAAc;IAC1C,GAAG;IACH,OAAO,CACL,GAAG,SAAS,MAAM,QACf,cAAc,UAAU,KAAK,eAAe,KAAK,UACpD,GACA;KAAE;KAAM,UAAU;IAAM,CAC1B;GACF,EAAE;EACJ;EACA,KAAK,yBAAyB;GAC5B,MAAM,WAAW,MAAM;GACvB,IAAI,MAAM,UAAU,YAAY,iBAAiB,SAAS,cACxD,OAAO;GAET,OAAO,eAAe,QAAQ,cAAc;IAC1C,GAAG;IACH,OAAO,SAAS,MAAM,KAAK,cACzB,UAAU,KAAK,eAAe,SAAS,aACnC;KAAE,GAAG;KAAW;IAAS,IACzB,SACN;GACF,EAAE;EACJ;EACA,KAAK,yBAAyB;GAC5B,MAAM,WAAW,MAAM;GACvB,IACE,MAAM,UAAU,sBAAsB,SAAS,aAC/C,MAAM,SAAS,YAAY,iBAAiB,SAAS,cAErD,OAAO;GAET,OAAO,eAAe,QAAQ,cAAc;IAC1C,GAAG;IACH,OAAO,SAAS,MAAM,KAAK,cACzB,UAAU,UAAU,eAAe,SAAS,aACxC;KAAE,GAAG;KAAW,UAAU;IAAS,IACnC,SACN;GACF,EAAE;EACJ;EACA,KAAK,kBAAkB;GACrB,MAAM,SAAS,MAAM;GACrB,IACE,OAAO,gBAAgB,QACvB,MAAM,UAAU,YAAY,iBAAiB,OAAO,cAEpD,OAAO;GAET,OAAO,eAAe,QAAQ,cAAc;IAC1C,GAAG;IACH,OAAO,SAAS,MAAM,KAAK,cACzB,UAAU,KAAK,eAAe,OAAO,aACjC;KAAE,GAAG;KAAW,UAAU;IAAK,IAC/B,SACN;GACF,EAAE;EACJ;EACA,KAAK,sBAAsB;GACzB,MAAM,QAAQ,MAAM;GACpB,IACE,MAAM,UAAU,sBAAsB,MAAM,aAC5C,MAAM,SAAS,YAAY,iBAAiB,MAAM,cAElD,OAAO;GAET,OAAO,eAAe,QAAQ,cAAc;IAC1C,GAAG;IACH,QAAQ,CACN,GAAG,SAAS,OAAO,QAChB,cACC,UAAU,cAAc,MAAM,aAC9B,UAAU,iBAAiB,MAAM,gBACjC,UAAU,YAAY,MAAM,OAChC,GACA,KACF;GACF,EAAE;EACJ;EACA,KAAK,sBAAsB;GACzB,MAAM,QAAQ,MAAM;GAMpB,MAAM,YAAY,MAAM,UAAU,OAAO,MACtC,cACC,UAAU,cAAc,MAAM,aAC9B,UAAU,iBAAiB,MAAM,gBACjC,UAAU,YAAY,MAAM,WAC5B,UAAU,SAAS,MAAM,IAC7B;GACA,IACE,MAAM,UAAU,sBAAsB,MAAM,aAC5C,MAAM,SAAS,YAAY,iBAAiB,MAAM,gBAClD,cAAc,KAAA,GAEd,OAAO;GAET,OAAO,eAAe,QAAQ,cAAc;IAC1C,GAAG;IACH,QAAQ,SAAS,OAAO,QACrB,cAAc,UAAU,YAAY,MAAM,OAC7C;IACA,eAAe;KACb,cAAc,MAAM;KACpB,SAAS,MAAM;KACf,MAAM,UAAU;IAClB;GACF,EAAE;EACJ;EACA,SACE,OAAO;CACX;AACF;AAEA,MAAa,wBAIX,aAEA,SACG,QAAQ;CACP,MAAM;CACN,cAAc;EACZ,QAAQ;EACR,QAAQ,CAAC;CACX;AACF,CAAC,CAAC,CACD,MAAM,OAAO,UACZ,MAAM,SAAS,yBACX,oBAAoB;CAClB;CACA,SAAU,MAAM,QAA0B,QACvC,QAAQ,WAAW,OAAO,KAAK,OAAO,aAAa,CAAC,CACpD,KAAK,WACJ,OAAO,OAAO,CAAC,GAAG,QAAQ,EAAE,MAAM,OAAO,KAAK,MAAM,CAAC,EAAE,CAAC,CAC1D;AACJ,CAAC,IACD,KACN;AAEJ,MAAa,qBAAqB,UAAuC;CACvE,MAAM,WAAW,MAAM;CACvB,OACE,CAAC,MAAM,UACP,UAAU,YAAY,iBAAiB,gBACvC,SAAS,YAAY,iBAAiB,SAAS,WAAW,gBAC1D,SAAS,YAAY,KAAA,KACrB,SAAS,MAAM,SAAS,KACxB,SAAS,MAAM,OACZ,SACC,KAAK,YACJ,KAAK,KAAK,qBAAqB,QAC9B,KAAK,KAAK,4BAA4B,QACtC,KAAK,aAAa,KAAA,KAClB,KAAK,aAAa,KAAA,CACxB;AAEJ;;;ACzYA,IAAa,mBAAb,cAAsC,MAAM,CAAC;AAE7C,MAAM,qBAAqB,SACzB,KAAK,YACJ,KAAK,KAAK,qBAAqB,QAC9B,CAAC,KAAK,KAAK,2BACX,KAAK,aAAa,KAAA;AAEtB,MAAM,2BAA2B,SAC/B,KAAK,aAAa,KAAA,KAAa,KAAK,UAAU,aAAa;AA0B7D,MAAa,wBAGX,YAE4B;CAC5B,MAAM,UAAU,QAAQ,MAAM,SAC3B,QAAQ;EACP,MAAM;EACN,cAAc,oBAAuB;CACvC,CAAC,CAAC,CACD,MAAM,OAAO,UACZ,MAAM,SAAS,yBACX,oBAAoB;EAClB;EACA,SAAU,MAAM,QAA0B;CAC5C,CAAC,IACD,KACN;CACF,MAAM,cAAc,qBAAqB,QAAQ,MAAM,QAAQ;CAE/D,MAAM,UAAU,OACd,QAI8B;EAC9B,MAAM,WAAW,MAAM,IAAI,QAAQ,MAAM,SAAS,EAAE,SAAS,SAAS,CAAC;EACvE,MAAM,SAAS,gBAAgB,SAAS,KAAK;EAC7C,MAAM,QAAyB,CAAC;EAChC,MAAM,QAAQ,gBAAgB,SAAS,KAAK;EAC5C,MAAM,QAAoB,CAAC;EAC3B,MAAM,OAAyB,CAAC;EAChC,MAAM,QAAQ,EACZ,MACA,SACA,KAAK,GAAG,IAAI,MAAM,GAAG,QAAQ,MAAM,eAKzB;GACV,MAAM,OAAO;IAAE;IAAM;IAAS;GAAG;GACjC,MAAM,KAAK,IAAI;GACf,MAAM,cAAc,gBAAsB,MAAM,aAAa;IAC3D,GAAG,IAAI;IACP,GAAG;GACL,CAAqB;EACvB;EACA,IAAI;EACJ,MAAM,OAAO,EACX,eACA,QAAQ,yBAIE;GACV,MAAM,WAAW,MAAM,YAAY;GACnC,IAAI,aAAa,KAAA,GAAW;GAC5B,MAAM,QACJ,SAAS,eAAe,KAAA,IACpB,EAAE,WAAW,SAAS,gBAAiB,IACvC,EAAE,cAAc,SAAS,WAAW,aAAa;GACvD,KAAK;IACH,MAAM;IACN,SAAS;KACP,WAAW,SAAS;KACpB,GAAG;KACH,GAAI,uBAAuB,KAAA,IACvB,CAAC,IACD,EAAE,QAAQ,mBAAmB;KACjC,GAAI,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc;IACzD;GACF,CAAC;GACD,MAAM,SAAS;EACjB;EACA,MAAM,cAAc,OAClB,MAAM,MAAM,MAAM,MAAM,cAAc,UAAU,OAAO,EAAE,KACzD,OAAO,OAAO,MAAM,aAAa,EAAE;EACrC,MAAM,sBAAsB,OAC1B,MAAM,YAAY,QAAQ,aAAa,CAAC,WAAW,EAAE,IACjD,cACA;EACN,MAAM,cAAc,EAClB,SACA,WAAW,WAKX,WAAW,QAAQ,EAAE,KACpB,YACC,QAAQ,SAAS,UACjB,WAAW,GAAG,QAAQ,GAAG,WAAW;EACxC,MAAM,UAAU,EACd,SACA,WAAW,MACX,QAAQ,OACR,kBAMU;GACV,MAAM,YAAY;IAChB,IAAI,QAAQ;IACZ,UAAU;IACV;IACA,UAAU,YAAY,QAAQ,SAAS;IACvC,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY;GACrD;GACA,MAAM,cAAc;IAClB,GAAG,MAAM;KACR,UAAU,KAAK;IAChB,GAAI,UAAU,WACV,GAAG,GAAG,UAAU,GAAG,cAAc,KAAc,IAC/C,CAAC;GACP;GACA,IAAI,OAAO,MAAM,MAAM,MAAM,QAAQ,SAAS;QACzC,MAAM,MAAM,MAAM,KAAK,SAAS;EACvC;EACA,MAAM,aAAa,EAAE,MAAM,SAA6C;GACtE,IAAI,SAAS,IAAI;GACjB,MAAM,CAAC,SAAS,MAAM,MAAM,MAAM,OAAO,MAAM,CAAC;GAChD,MAAM,MAAM,MAAM,OAAO,IAAI,GAAG,KAAM;GACtC,MAAM,CAAC,YAAY,OAAO,MAAM,MAAM,OAAO,MAAM,CAAC;GACpD,OAAO,MAAM,MAAM,OAAO,IAAI,GAAG,QAAS;GAC1C,MAAM,KAAK;IAAE,MAAM,CAAC,SAAS,OAAO;IAAG,MAAM;KAAE;KAAM;IAAG;GAAE,CAAC;EAC7D;EACA,MAAM,gBAAgB,EACpB,SACA,SAIU;GACV,MAAM,SAAS,MAAM;GACrB,MAAM,UAAU;IACd,GAAG;IACH,SAAS;KAAE,QAAQ,OAAO;KAAQ,SAAS,OAAO;IAAQ;GAC5D;GACA,MAAM,cAAc,gBAAsB,MAAM,aAAa;IAC3D,GAAG,IAAI;IACP,MAAM;IACN;IACA;GACF,CAAqB;GACrB,OAAO,QAAQ;IAAE;IAAI,SAAS,OAAO;IAAS,SAAS;GAAM;GAC7D,OAAO,QAAQ;GACf,KAAK,KAAK;IACR,MAAM;IACN;IACA;GACF,CAAmB;EACrB;EACA,IAAI,IAAI,MAAM,SAAS,qBAAqB;GAC1C,MAAM,cAAc;IAAE,QAAQ;IAAM,QAAQ,CAAC;GAAE;GAC/C,MAAM,SAAS;GACf,MAAM,MAAM,QAAQ,CAAC;EACvB,OAAO,IAAI,IAAI,MAAM,SAAS,wBAAwB;GACpD,MAAM,UAAU,IAAI,MAAM;GAC1B,IAAI,MAAM,YAAY,QAAQ,SAAS;QAErC,QAAQ,QAAQ,QAAhB;IACE,KAAK;KACH,IACE,WAAW;MACT,SAAS,QAAQ;MACjB,UAAU,QAAQ,aAAa;KACjC,CAAC,GAED,SAAS;UAET,OAAO;MACL,SAAS,QAAQ;MACjB,UAAU,QAAQ,aAAa;KACjC,CAAC;KACH;IACF,KAAK,QAAQ;KACX,MAAM,OAAO,MAAM,MAAM,MAAM,MAC5B,cAAc,UAAU,OAAO,QAAQ,QAAQ,EAClD;KACA,IAAI,SAAS,KAAA,GACX,SAAS,mBAAmB,QAAQ,QAAQ,EAAE;UAC3C,IAAI,KAAK,aAAa,QAAQ,kBACjC,SAAS;UACN,IAAI,KAAK,QAAQ,SAAS,QAAQ,QAAQ,MAC7C,SAAS;UACN;MACH,KAAK,UAAU,QAAQ;MACvB,KAAK,YAAY;KACnB;KACA;IACF;IACA,KAAK,UAAU;KACb,MAAM,WAAW,MAAM,MAAM,MAAM,WAChC,SAAS,KAAK,OAAO,QAAQ,OAChC;KACA,IAAI,WAAW,GAAG,SAAS,mBAAmB,QAAQ,OAAO;UACxD;MACH,MAAM,MAAM,MAAM,OAAO,UAAU,CAAC;MACpC,MAAM,cAAc;OAClB,GAAG,MAAM;QACR,QAAQ,UAAU;MACrB;KACF;KACA;IACF;IACA,KAAK,QAAQ;KACX,MAAM,QAAQ,MAAM,MAAM,MAAM,WAC7B,cAAc,UAAU,OAAO,QAAQ,OAC1C;KACA,IAAI,QAAQ,GAAG,SAAS,mBAAmB,QAAQ,OAAO;UACrD,IACH,QAAQ,aAAa,QACrB,CAAC,MAAM,MAAM,MAAM,MAChB,cAAc,UAAU,OAAO,QAAQ,QAC1C,GAEA,SAAS;UACN;MACH,MAAM,cACJ,QAAQ,aAAa,OACjB,MAAM,MAAM,MAAM,SAClB,MAAM,MAAM,MAAM,WACf,SAAS,KAAK,OAAO,QAAQ,QAChC;MACN,UAAU;OACR,MAAM;OACN,IAAI,cAAc,QAAQ,cAAc,IAAI;MAC9C,CAAC;KACH;KACA;IACF;IACA,KAAK,YAAY;KACf,MAAM,WAAW,MAAM,MAAM,MAAM,WAChC,SAAS,KAAK,OAAO,QAAQ,OAChC;KACA,MAAM,WAAW,MAAM,MAAM,MAAM;KACnC,IAAI,CAAC,UAAU,SAAS,mBAAmB,QAAQ,OAAO;UACrD,KAAK,MAAM,QAAQ,UAAU,UAAU,QAAQ,QAClD,SAAS;UACN,IAAI,SAAS,QAAQ,SAAS,QAAQ,SAAS;UAC/C,IACH,CAAC,SAAS,YACV,WAAW,GAAG,SAAS,GAAG,WAAW,GAErC,SAAS;UACN;MACH,IAAI,CAAC,SAAS,UAAU;OACtB,MAAM,cAAc;QAClB,GAAG,MAAM;SACR,GAAG,SAAS,GAAG,cAAc;OAChC;OACA,SAAS,WAAW;MACtB;MACA,IAAI,MAAM,QAAQ,SAAS,cAAc,MAAM,OAAO;WACjD,OAAO,SAAS;MACrB,UAAU;OAAE,MAAM;OAAU,IAAI;MAAE,CAAC;KACrC;KACA;IACF;IACA,KAAK;KACH,IAAI,MAAM,QAAQ,WAAW,QAAQ,QAAQ,SAAS;UAEpD,IAAI;MAAE,eAAe,QAAQ;MAAe,QAAQ,KAAA;KAAU,CAAC;KACjE;IACF,KAAK;KACH,IAAI,WAAW,EAAE,SAAS,QAAQ,QAAQ,CAAC,GACzC,SAAS;UAET,OAAO;MACL,SAAS,QAAQ;MACjB,UAAU;MACV,OAAO;MACP,aAAa,QAAQ;KACvB,CAAC;KAEH;IACF,KAAK,aAAa;KAChB,MAAM,WAAW,MAAM,YAAY;KACnC,IACE,CAAC,YACD,SAAS,sBAAsB,QAAQ,QAAQ,aAC9C,QAAQ,QAAQ,iBACf,SAAS,YAAY,gBACrB,QAAQ,QAAQ,cAAc,SAAS,iBAEzC,SAAS;UAET,IAAI;MACF,eAAe,QAAQ,QAAQ;MAC/B,QAAQ,QAAQ,QAAQ;KAC1B,CAAC;KACH;IACF;IACA,KAAK,SAAS;KACZ,MAAM,MAAM,SAAS;KACrB,MAAM,SAAS,MAAM;KACrB,IACE,QAAQ,SAAS,SACjB,WAAW,QACX,CAAC,OAAO,WACR;MACA,OAAO,YAAY;MACnB,OAAO,WAAW;MAClB,MAAM,aAAa,MAAM,YAAY,UAAU;MAC/C,IAAI,YACF,KAAK;OACH,MAAM;OACN,SAAS;QACP,cAAc,WAAW;QACzB,WAAW,WAAW;OACxB;MACF,CAAC;KACL;KACA;IACF;IACA,KAAK;KACH,MAAM,MAAM,SAAS;KACrB;IACF,KAAK;KASH,IAAI,CARS,MAAM,YAAY,UAAU,MAAM,MAC5C,cACC,UAAU,KAAK,iBAAiB,QAAQ,OAAO,gBAC/C,UAAU,KAAK,cAAc,QAAQ,OAAO,aAC5C,UAAU,KAAK,eAAe,QAAQ,OAAO,cAC7C,UAAU,KAAK,qBAAqB,QACpC,CAAC,UAAU,QACf,GACW,SAAS;UACf,KAAK;MAAE,MAAM;MAAkB,SAAS,QAAQ;KAAO,CAAC;KAC7D;IAEF,KAAK,YAAY;KACf,MAAM,WAAW,MAAM,YAAY;KACnC,MAAM,OAAO,UAAU,MAAM,MAC1B,cACC,UAAU,UAAU,eAClB,QAAQ,SAAS,cACnB,UAAU,SAAS,iBACjB,QAAQ,SAAS,gBACnB,UAAU,SAAS,cAAc,QAAQ,SAAS,SACtD;KACA,IAAI,UAAU,SAAS,SAAS;UAC3B,IAAI,CAAC,QAAQ,KAAK,YAAY,KAAK,UACtC,SAAS;UAET,KAAK;MAAE,MAAM;MAAyB,SAAS,QAAQ;KAAS,CAAC;KACnE;IACF;IACA,KAAK;IACL,KAAK,SAAS;KACZ,MAAM,UACJ,QAAQ,WAAW,UAAU,QAAQ,WAAW,QAAQ;KAC1D,MAAM,WAAW,MAAM,YAAY;KACnC,IACE,UAAU,YAAY,KAAA,KACtB,UAAU,YAAY,iBAAiB,QAAQ,gBAC/C,SAAS,sBAAsB,QAAQ,aACtC,QAAQ,WAAW,WAClB,CAAC,SAAS,OAAO,MACd,UACC,MAAM,YAAY,QAAQ,WAC1B,MAAM,SAAS,QAAQ,IAC3B,GAEF,SAAS;UAET,KAAK;MACH,MACE,QAAQ,WAAW,UACf,uBACA;MACN;KACF,CAAC;KACH;IACF;IACA,KAAK,SAAS;KACZ,MAAM,WAAW,MAAM,YAAY;KACnC,IACE,CAAC,MAAM,UACP,UAAU,WAAW,YACrB,SAAS,kBAAkB,QAAQ,QAAQ,aAC3C,SAAS,sBAAsB,QAAQ,QAAQ,mBAE/C,SAAS;UACN,IAAI,CAAC,MAAM,MAAM,UAAU,CAAC,MAAM,OAAO,WAAW;MACvD,KAAK;OAAE,MAAM;OAAsB,SAAS,QAAQ;MAAQ,CAAC;MAC7D,aAAa;OACX,SAAS;QACP,WAAW,SAAS;QACpB,mBAAmB,SAAS;QAC5B,QAAQ;OACV;OACA,IAAI,qBAAqB,QAAQ,QAAQ;MAC3C,CAAC;KACH,OAAO,SAAS;KAChB;IACF;GACF;EACJ,OAAO;GACL,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,SAAS,MAAM;GAErB,MAAM,OADW,MAAM,YAAY,UACZ,MAAM,MAC1B,cAAc,UAAU,MAAM,OAAO,OAAO,MAC/C;GACA,MAAM,OAAO,OAAO,SAAS,UAAU,QAAQ,QAAQ,MAAM;GAO7D,IAAI,EALF,QAAQ,WAAW,OAAO,UAC1B,MAAM,OAAO,OAAO,UACpB,KAAK,YAAY,OAAO,WACxB,CAAC,KAAK,WACN,OAAO,YAAY,KAAK,WAAW,KAEnC,SAAS;QACJ;IACL,KAAK,UAAU,OAAO;IACtB,MAAM,aACJ,CAAC,OAAO,aAAa,OAAO,YAAY,OAAO;IACjD,KAAK,MAAM,SAAS,OAAO,QAAQ;KACjC,IAAI,KAAK,OAAO,SAAS,MAAM,EAAE,GAAG;KACpC,IACE,cACC,OAAO,SAAS,UAAU,MAAM,SAAS,kBAC1C;MACA,KAAK;OAAE,MAAM,MAAM;OAAM,SAAS,MAAM;OAAS,IAAI,MAAM;MAAG,CAAC;MAC/D,KAAK,QAAQ,CAAC,GAAI,KAAK,SAAS,CAAC,GAAI,MAAM,EAAE;KAC/C;IACF;IACA,IAAI,OAAO,SAAS,KAAK,UAAU;IACnC,IAAI,CAAC,YAAY,SAAS;GAC5B;EACF;EAEA,IAAI,SAAS,MAAM;EACnB,IAAI,WAAW,MAAM,YAAY;EACjC,IAAI,UAAU,aAAa,KAAA,GAAW;GACpC,MAAM,SAAS;GACf,SAAS;EACX;EACA,IAAI,UAAU,UAAU;GACtB,MAAM,UAAU,MAAM,MAAM,MAAM,MAC/B,SAAS,KAAK,gBAAgB,OAAO,MACxC;GACA,MAAM,cACH,OAAO,UAAU,QAAQ,CAAC,OAAO,MAAM,WACxC,SAAS,MAAM,MACZ,cACC,UAAU,SAAS,KAAA,KAAa,CAAC,UAAU,KAAK,OACpD;GACF,IAAI,OAAO,WAAW;IACpB,OAAO,QAAQ,cAAc,YAAY;IACzC,IAAI,CAAC,MAAM,MAAM,UAAU,CAAC,eAAe,CAAC,SAC1C,OAAO,YAAY;GACvB;GACA,IAAI,CAAC,OAAO,aAAa,SAAS,SAAS,OAAO,QAAQ;GAC1D,IAAI,CAAC,OAAO,aAAa,SAAS,YAAY,KAAA,GAC5C,KAAK,MAAM,QAAQ,SAAS,OAAO;IACjC,IACE,KAAK,YACJ,KAAK,SAAS,KAAA,MACZ,CAAC,KAAK,KAAK,WAAW,KAAK,KAAK,YAAY,OAAO,YACtD,KAAK,KAAK,qBAAqB,QAC9B,KAAK,YAAY,CAAC,KAAK,UAExB;IACF,IAAI,KAAK,UAAU,aAAa,OAAO;KACrC,KAAK;MACH,MAAM;MACN,SAAS;OACP,GAAG,KAAK;OACR,QAAQ;OACR,OAAO;MACT;KACF,CAAC;KACD;IACF;IACA,MAAM,KAAK,GAAG,IAAI,MAAM,GAAG,QAAQ,KAAK,KAAK;IAC7C,KAAK,OAAO;KAAE;KAAI,SAAS,OAAO;KAAS,SAAS;IAAM;IAC1D,KAAK,KAAK;KACR,MAAM;KACN;KACA,SAAS;MACP,QAAQ,OAAO;MACf,SAAS,OAAO;MAChB,MAAM,KAAK;MACX,YAAY,SAAS;KACvB;IACF,CAAmB;GACrB;GAEF,WAAW,MAAM,YAAY;GAC7B,MAAM,YAAY,SAAS,MAAM,MAAM,iBAAiB;GACxD,MAAM,YAAY,OAAO,UAAU,QAAQ,OAAO,MAAM;GACxD,MAAM,cACJ,aACA,SAAS,MAAM,OACZ,SAAS,KAAK,SAAS,KAAA,KAAa,KAAK,KAAK,OACjD;GACF,MAAM,kBAAkB,SAAS,MAAM,MACpC,SACC,KAAK,KAAK,oBACV,KAAK,KAAK,2BACV,CAAC,KAAK,YACN,CAAC,wBAAwB,IAAI,CACjC;GACA,MAAM,eACJ,WACA,eACA,CAAC,oBACA,OAAO,aACN,SAAS,YAAY,KAAA,KACrB,SAAS,MAAM,OACZ,SAAS,kBAAkB,IAAI,KAAK,wBAAwB,IAAI,CACnE;GACJ,MAAM,gBACJ,CAAC,OAAO,aACR,SAAS,YAAY,KAAA,KACrB,aACA,aACA,SAAS,OAAO,WAAW;GAC7B,MAAM,oBACJ,iBACA,SAAS,eAAe,KAAA,KACxB,SAAS,WAAW,iBAAiB;GACvC,IAAI,gBAAgB,CAAC,mBACnB,IAAI;IAAE,eAAe,KAAA;IAAW,QAAQ;GAAqB,CAAC;QACzD,IAAI,kBAAkB,CAAC,WAAW,eAAe;IACtD,MAAM,SACJ,OAAO,UAAU,QAAQ,OAAO,MAAM,YAAY,OAAO;IAC3D,MAAM,QAAQ,SAAS;IACvB,IACE,CAAC,YACA,UACC,kBAAkB,MAAM,WAAW,KAClC,SAAS,cAAc,QAC1B;KACA,MAAM,aAAa,SAAS,WAAW,QAAQ,UAAU;KACzD,MAAM,KACJ,eAAe,SACX,qBAAqB,SAAS,WAAY,iBAC1C,GAAG,IAAI,MAAM,GAAG,YAAY;KAClC,aAAa;MACX,SAAS;OACP,WAAW,SAAS;OACpB,mBAAmB,SAAS;OAC5B,QAAQ;MACV;MACA;KACF,CAAC;IACH,OAAO,IAAI,mBAAmB;KAC5B,KAAK;MACH,MAAM;MACN,SAAS,EACP,WAAW,SAAS,kBACtB;KACF,CAAC;KACD,MAAM,SAAS;IACjB;GACF;GACA,IACE,CAAC,OAAO,aACR,MAAM,UACN,KAAK,OAAO,QAAQ,IAAI,SAAS,yBAAyB,GAE1D,MAAM,OAAO,QAAQ,SAAS,UAC1B,WACA,CAAC,YACC,eACA,CAAC,YACC,UACA;EACZ;EACA,IACE,MAAM,WAAW,QACjB,CAAC,MAAM,MAAM,UACb,CAAC,MAAM,YAAY,QAEnB,OAAO,MAAM,MAAM,MAAM,SAAS,GAAG;GACnC,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;GACrC,OAAO,KAAK;GACZ,KAAK;IACH,MAAM;IACN,SAAS;KAAE,SAAS,KAAK;KAAS,UAAU,KAAK;IAAS;IAC1D,IAAI,eAAe,KAAK;GAC1B,CAAC;GACD,IAAI,CAAC,KAAK,UAAU;GACpB,MAAM,SAAS;IACb,QAAQ,KAAK;IACb,OAAO;IACP,OAAO;IACP,SAAS;IACT,WAAW;IACX,OAAO;GACT;GACA,aAAa;IACX,SAAS;KAAE,WAAW,KAAK;KAAI,QAAQ;IAAU;IACjD,IAAI,uBAAuB,KAAK;GAClC,CAAC;GACD;EACF;EAEF,MAAM,UAA0B;GAC9B,WAAW,IAAI,MAAM;GACrB,GAAI,IAAI,MAAM,SAAS,qBAAqB,EAAE,MAAM,KAAc,IAAI,CAAC;GACvE,SAAS,WAAW,KAAA,IAAY,YAAY;GAC5C,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;EAC3C;EACA,OAAO;GACL,GAAI;GACJ;IACE,MAAM;IACN,SAAS,cAAc;KAAE;KAAQ,OAAO;KAAO;IAAM,CAAC;GACxD;GACA,GAAG;GACH;IAAE,MAAM;IAAsB,SAAS;GAAQ;EACjD;CACF;CAEA,MAAM,UAAU,EACd,KACA,QACA,SACA,WAMoB;EACpB,MAAM,UAAU,IAAI,MAAM;EAE1B,MAAM,EAAE,QAAQ,YAAY,YAAY,UAAU,UAAU,QAAQ;EACpE,KAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,SAAS,QAAQ,MAAM,SAAS,OACpC,MAAM;GAER,MAAM,SAAS,aACb,QACA,MAAM,SACN,aAAa,MAAM,MACrB;GACA,IAAI,OAAO,QACT,MAAM,IAAI,UACR,OAAO,OAAO,KAAK,UAAU,MAAM,OAAO,CAAC,CAAC,KAAK,IAAI,CACvD;EACJ;EACA,OAAO;GACL,MAAM;GACN,IAAI,GAAG,IAAI,MAAM,GAAG,UAAU,IAAI,QAAQ,GAAG;GAC7C,SAAS;IACP,QAAQ,IAAI,MAAM;IAClB,SAAS,IAAI;IACb;IACA;IACA,MAAM,IAAI,MAAM,SAAS,4BAA4B,UAAU;IAC/D;IACA,QAAQ,OACL,QACE,UACC,MAAM,SAAS,0BACf,MAAM,SAAS,wBACnB,CAAC,CACA,KAAK,OAAO,WAAW;KACtB,MAAM,MAAM;KACZ,SAAS,MAAM;KACf,IACE,MAAM,MACN,GAAG,IAAI,MAAM,GAAG,QAAQ,IAAI,QAAQ,GAAG,KAAK,GAAG;IACnD,EAAE;GACN;EACF;CACF;CAEA,MAAM,SAAS,OAAO,EACpB,KACA,MACA,aAKiC;EACjC,MAAM,WAAW,OAAO,QACrB,UAAU,MAAM,SAAS,wBAC5B;EACA,MAAM,YAAY,OAAO,QACtB,UAAU,MAAM,SAAS,wBAC5B;EACA,IAAI,UAAU,WAAW,GAAG,OAAO,IAAI,QAAQ,OAAO,MAAM,GAAG,QAAQ;EACvE,MAAM,QAAQ,OAAO;GAAE;GAAK,QAAQ;GAAW,SAAS;GAAO;EAAK,CAAC;EACrE,MAAM,YAAY,MAAM,IAAI,QAAQ,OAAO,MAAM,GAAG,UAAU,KAAK;EACnE,MAAM,QAAQ,UAAU,GAAG,EAAE,CAAC,CAAE;EAEhC,MAAM,SADO,IAAI,QAAQ,OAAO,EAAE,YAAY,MAAM,CAClC,CAAC,CAAC,OAAO,cAAc,CAAC;EAC1C,MAAM,YAAgC,CAAC;EACvC,MAAM,SAAS,IAAI,IAAI,UAAU,KAAK,UAAU,MAAM,EAAE,CAAC;EACzD,IAAI;EACJ,MAAM,UAAU,IAAI,SAAgB,GAAG,WAAW;GAChD,cAAc;EAChB,CAAC;EACD,MAAM,gBAAsB;GAC1B,YAAY,IAAI,OAAO,MAAM;EAC/B;EACA,IAAI,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EAC5D,IAAI;GACF,IAAI,OAAO,eAAe;GAC1B,SAAS;IACP,MAAM,OAAO,MAAM,QAAQ,KAAK,CAAC,OAAO,KAAK,GAAG,OAAO,CAAC;IACxD,IAAI,KAAK,MACP,MAAM,IAAI,MAAM,yCAAyC;IAC3D,IAAI,OAAO,IAAI,KAAK,MAAM,EAAE,GAAG,UAAU,KAAK,KAAK,KAAK;IACxD,IACE,KAAK,MAAM,SAAS,wBACnB,KAAK,MAAM,QAA2B,cAAc,MAAM,IAC3D;KACA,IAAK,KAAK,MAAM,QAA2B,YAAY,YACrD,MAAM,IAAI,iBAAiB,eAAe;KAC5C,OAAO,CACL,GAAG,UAAU,QAAQ,UAAU,MAAM,SAAS,kBAAkB,GAChE,GAAG,SACL;IACF;GACF;EACF,UAAU;GACR,IAAI,OAAO,oBAAoB,SAAS,OAAO;GAC/C,MAAM,OAAO,SAAS;EACxB;CACF;CAEA,MAAM,WAAW,EACf,KACA,aAKA,OAAO;EACL;EACA,QACE,WAAW,KAAA,IACP,CAAC,IACD,MAAM,QAAQ,MAAM,IAClB,SACA,CAAC,MAAwB;EACjC,SAAS;EACT,MAAM;CACR,CAAC;CACH,MAAM,aAAa,EACjB,OACA,aAIa;EACb,IAAI,OAAO,kBAAkB,SAAS,MAAM,OAAO;EACnD,OAAO,iBAAiB,oBAAoB,OAAO;CACrD;CACA,OAAO;EAAE;EAAS;EAAQ;EAAS;EAAW;EAAS;CAAY;AACrE;;;ACtqBA,MAAM,sBAA8D;CAClE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,gBACJ,aACyB;CACzB,MAAM,SAAS,EAAE,GAAG,SAAS;CAC7B,KAAK,MAAM,OAAO,qBAAqB,QAAQ,eAAe,QAAQ,GAAG;CACzE,IAAI,OAAO,OAAO,YAAY,YAAY,OAAO,YAAY,MAAM;EACjE,MAAM,UAAU,EAAE,GAAG,OAAO,QAAQ;EACpC,QAAQ,eAAe,SAAS,QAAQ;EACxC,QAAQ,eAAe,SAAS,OAAO;EACvC,OAAO,UAAU;CACnB;CACA,OAAO;AACT;AAEA,MAAM,gBAAmC,UACvC,OAAO,YACL,OAAO,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU;CAC1C,IAAI,KAAK,SAAS,cAAc,KAAK,uBAAuB,MAC1D,OAAO,CAAC,MAAM,IAAI;CAEpB,MAAM,aAAa,EAAE,GAAG,KAAK;CAC7B,QAAQ,eAAe,YAAY,SAAS;CAC5C,OAAO,CAAC,MAAM,UAAU;AAC1B,CAAC,CACH;AAEF,MAAMA,kBAAgB,UACpB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;;AAGvD,eAAsB,kBACpB,OAC6B;CAC7B,MAAM,WAAW,aAAa,MAAM,QAAQ;CAC5C,MAAM,QAAQ,aAAa,MAAM,KAAK;CACtC,MAAM,WACJ,MAAM,iBACL,MAAM,uBAAuB,MAAM,UAAU,EAAE,MAAM,CAAC;CACzD,MAAM,gBAAgB;EACpB,GAAG;EACH,OAAO,MAAM;EACb;EACA;EACA,aAAa,MAAM;EACnB,GAAI,MAAM,iBAAiB,KAAA,IACvB,CAAC,IACD,EAAE,cAAc,MAAM,aAAa;EACvC,UAAU,YAAY,CAAC;EAGvB,SAAS,SAAS,kBAAkB,CAAC;CACvC;CACA,MAAM,SAAS,WAAc,aAAa;CAE1C,IAAI;CACJ,IAAI;CACJ,MAAM,WAAW,OAAO,OAAO,YAC7B,IAAI,gBAAsD,EACxD,UAAU,MAAM,YAAY;EAC1B,IAAI,KAAK,SAAS,WAAW,eAAe,KAAA,GAC1C,aAAa,EAAE,OAAO,KAAK,MAAM;OAC5B,IAAI,KAAK,SAAS,UACvB,aAAa;GACX,cAAc,KAAK;GACnB,OAAO,KAAK;EACd;EAEF,WAAW,QAAQ,IAAI;CACzB,EACF,CAAC,CACH;CAEA,OAAO;EACL,QAAQ,kBAAwB;GAC9B,QAAQ;GACR;GACA,yBAAyB,MAAM;GAC/B,SAASA;GACT,GAAI,MAAM,oBAAoB,KAAA,IAC1B,CAAC,IACD,EAAE,iBAAiB,MAAM,gBAAgB;EAC/C,CAAC;EACD,aAAa;GACX,IAAI,eAAe,KAAA,GAAW,MAAM,WAAW;GAC/C,IAAI,eAAe,KAAA,GACjB,MAAM,IAAI,MAAM,yCAAyC;GAE3D,IAAI,WAAW,iBAAiB,SAC9B,MAAM,IAAI,MAAM,oCAAoC;GAEtD,OAAO;EACT;CACF;AACF;;;ACpQA,MAAM,aAAa;AACnB,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AAEzB,IAAI;AAOJ,MAAa,kBAAkB,UAA6C;CAC1E,IAAI,OAAO,UAAU,UACnB,OAAO,WAAW,4BAA4B,KAAA,IAAY,QAAQ,KAAA;CAEpE,OAAO,MAAM,aAAa,YAAY,MAAM,UAAU,KAAA;AACxD;AAEA,MAAM,oBAA+D;CACnE,IAAI,WAAW,QAAQ,YAAY,KAAK,IAAI,GAAG,OAAO,QAAQ;CAC9D,MAAM,QAAQ;EACZ,WAAW,OAAO;EAClB,UAAU,YAAY;GACpB,MAAM,aAAa,IAAI,gBAAgB;GACvC,MAAM,UAAU,iBACR,WAAW,sBAAM,IAAI,MAAM,iCAAiC,CAAC,GACnE,gBACF;GACA,QAAQ,QAAQ;GAChB,IAAI;IACF,MAAM,WAAW,MAAM,MAAM,YAAY,EAAE,QAAQ,WAAW,OAAO,CAAC;IACtE,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MACR,sCAAsC,SAAS,QACjD;IACF,MAAM,OAAgB,MAAM,SAAS,KAAK;IAC1C,IACE,OAAO,SAAS,YAChB,SAAS,QACT,EAAE,UAAU,SACZ,CAAC,MAAM,QAAQ,KAAK,IAAI,GAExB,MAAM,IAAI,MAAM,kDAAkD;IAEpE,MAAM,yBAAS,IAAI,IAAyB;IAC5C,KAAK,MAAM,OAAO,KAAK,MAAmB;KACxC,IACE,OAAO,QAAQ,YACf,QAAQ,QACR,EAAE,UAAU,QACZ,EAAE,QAAQ,QACV,EAAE,oBAAoB,QACtB,EAAE,gBAAgB,QAClB,IAAI,SAAS,cACb,OAAO,IAAI,OAAO,YAClB,OAAO,IAAI,mBAAmB,YAC9B,OAAO,IAAI,eAAe,YAC1B,CAAC,OAAO,cAAc,IAAI,cAAc,KACxC,IAAI,kBAAkB,KACtB,CAAC,OAAO,cAAc,IAAI,UAAU,KACpC,IAAI,cAAc,GAElB;KACF,OAAO,IAAI,IAAI,IAAI;MACjB,eAAe,IAAI;MACnB,iBAAiB,IAAI;KACvB,CAAC;IACH;IACA,OAAO;GACT,UAAU;IACR,aAAa,OAAO;GACtB;EACF,EAAA,CAAG;CACL;CACA,UAAU;CACV,MAAM,UAAU,MAAM,QAAQ,MAC3B,WAAW;EACV,MAAM,YAAY,KAAK,IAAI,IAAI;EAC/B,OAAO;CACT,IACC,UAAmB;EAClB,IAAI,YAAY,OAAO,UAAU,KAAA;EACjC,MAAM;CACR,CACF;CACA,OAAO,MAAM;AACf;AAEA,MAAa,kBAAkB,OAAO,YAGH;CACjC,QAAQ,OAAO,eAAe;CAC9B,IAAI;CACJ,MAAM,UAAU,IAAI,SAAgB,UAAU,WAAW;EACvD,gBAAgB,OAAO,QAAQ,OAAO,MAAM;EAC5C,QAAQ,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CAClE,CAAC;CACD,IAAI;EAEF,QAAO,MADc,QAAQ,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,EAAA,CAC5C,IAAI,QAAQ,OAAO,KAAK;CACxC,UAAU;EACR,QAAQ,OAAO,oBAAoB,SAAS,OAAO;CACrD;AACF;;;;;;;;;ACzCA,SAAS,qBAAqB,SAAqC;CACjE,MAAM,WAAW,QAAQ,OAAO,MAAM,UAAU;EAC9C,IAAI,MAAM,SAAS,wBAAwB,OAAO;EAClD,MAAM,UAAU,MAAM;EACtB,IACE,QAAQ,cAAc,mBACtB,QAAQ,cAAc,eAEtB,OAAO;EACT,IACE,QAAQ,cAAc,UACtB,QAAQ,cAAc,UACtB,QAAQ,cAAc,SAEtB,OACG,QAAQ,UAAU,EAAqC,SAAS;EAGrE,OAAO;CACT,CAAC;CACD,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,QACR,mBACA,UAAU,SAAS,KAAK,iCAC1B;AAEJ;AAwIA,MAAM,cAAc,WAAiC;CACnD,IAAI,CAAC,OAAO,SAAS,OAAO;CAC5B,MAAM,SAAkB,OAAO;CAC/B,IACE,kBAAkB,YACjB,OAAO,SAAS,mBAAmB,OAAO,SAAS,uBAEpD,MAAM;CAER,OAAO;AACT;AAEA,MAAM,UAAU,OACd,OACA,YACe;CACf,IAAI;CACJ,IAAI;EACF,SACE,OAAO,UAAU,aACb,MAAO,MAAyC,OAAO,IACvD;CACR,SAAS,OAAO;EACd,WAAW,QAAQ,MAAM;EACzB,MAAM;CACR;CACA,WAAW,QAAQ,MAAM;CACzB,OAAO;AACT;AAEA,MAAM,aAAa,UAAiC;CAClD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,aAAa,SAAS,OAAO,MAAM,YAAY,UACjD,OAAO,MAAM;CAEf,OAAO;AACT;AAEA,MAAM,gBAAgB,UACpB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEvD,MAAM,mBAAmB,qCACjB,IAAI,kBAAoC,CAChD;;AAGA,SAAgB,sBACd,KACA,IACG;CACH,OAAO,iBAAiB,IAAI,EAAE,SAAS,IAAI,GAAG,EAAE;AAClD;AAEA,MAAM,kBAAkB,WAAmB,iBACzC,GAAG,UAAU,QAAQ;AAEvB,MAAM,iBAAiB,UAAuD;CAC5E,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO,KAAA;CACxD,MAAM,UAAU,QAAQ,IAAI,OAAO,OAAO,aAAa;CACvD,IAAI,OAAO,YAAY,YAAY,OAAO,KAAA;CAC1C,OAAQ,QAAqD,KAAK,KAAK;AACzE;AAEA,MAAM,mBAAmB,UACvB,UAAU,KAAA,MACT,MAAM,SAAS,cACd,MAAM,SAAS,mBACf,MAAM,SAAS,0BACf,MAAM,SAAS,sBACf,MAAM,SAAS,2BACf,MAAM,SAAS,uBACf,MAAM,SAAS,wBACf,MAAM,SAAS,2BACf,MAAM,SAAS,YACf,MAAM,SAAS,WACf,MAAM,SAAS;AAInB,MAAM,cAAc,OAClB,MACA,YACyE;CACzE,IAAI;CACJ,IAAI;EACF,OAAO,MAAM,QAAQ,KAAK,CACxB,KAAK,MAAM,YAAY;GAAE,MAAM;GAAiB;EAAO,EAAE,GACzD,IAAI,SAA4B,gBAAgB;GAC9C,QAAQ,iBAAiB,YAAY,EAAE,MAAM,QAAQ,CAAC,GAAG,OAAO;GAC/D,MAAkC,QAAQ;EAC7C,CAAC,CACH,CAAC;CACH,UAAU;EACR,IAAI,UAAU,KAAA,GAAW,aAAa,KAAK;CAC7C;AACF;AAYA,eAAe,kBAIb,SAI4B;CAC5B,MAAM,EAAE,WAAW,SAAS,oBAAoB;CAChD,MAAM,UAAU,QAAQ,WAAW,WAAW,CAAC;CAC/C,MAAM,aACJ,eAAe,QAAQ,KAAK,MAAM,KAAA,IAC9B,QAAQ,aACR;EACE,GAAG,QAAQ;EACX,SAAS,OAAO,KAAK,OAAO,CAAC,CAAC,MAC3B,QAAQ,IAAI,YAAY,MAAM,oBACjC,IACI,UACA;GACE,GAAG;GACH,sBAAsB,WAAW,QAAQ,CAAC,CACvC,OACC,KAAK,UAAU,CAAC,WAAW,QAAQ,QAAQ,SAAS,CAAC,CACvD,CAAC,CACA,OAAO,KAAK;EACjB;EACJ,iBAAiB;GACf,GAAG,QAAQ,WAAW;GACtB,SAAS;IACP,SAAS;IACT,GAAG,QAAQ,WAAW,kBAAkB;GAC1C;EACF;CACF;CACN,MAAM,OAAO,MAAM,kBAAwB;EACzC,OAAO,QAAQ;EACf,OAAO,QAAQ;EACf,UAAU,QAAQ;EAClB,eAAe,QAAQ;EACvB,mBAAmB,QAAQ;EAC3B,aAAa,QAAQ;EACrB,GAAI,QAAQ,iBAAiB,KAAA,IACzB,CAAC,IACD,EAAE,cAAc,QAAQ,aAAa;EACzC,UAAU;EACV,GAAI,oBAAoB,KAAA,IACpB,CAAC,IACD,EACE,kBAAkB,EAAE,WAClB,gBAAgB;GAAE,GAAG;GAAS;GAAY;EAAK,CAAC,EACpD;CACN,CAAC;CACD,OAAO;EACL,QAAQ,KAAK;EACb,YAAY,KAAK;CACnB;AACF;AAEA,gBAAgB,kBAAkB,SAGQ;CACxC,MAAM,UAA4B,CAAC;CACnC,IAAI;CACJ,IAAI;CACJ,MAAM,YAAY,QAAQ,UAAU,aAAa;CACjD,MAAM,aAAa,QAAQ,UAAU,cAAc;CACnD,IAAI,YAAY,KAAK,IAAI;CACzB,MAAM,SAAS,QAAQ,OAAO,OAAO,UAAU;CAC/C,IAAI,eAAe,OAAO,KAAK;CAC/B,IAAI;EACF,SAAS;GACP,IAAI;GACJ,IAAI,QAAQ,SAAS,GAAG;IACtB,MAAM,YAAY,KAAK,IAAI,GAAG,cAAc,KAAK,IAAI,IAAI,UAAU;IACnE,MAAM,UAAU,MAAM,YAAY,cAAc,SAAS;IACzD,IAAI,QAAQ,SAAS,SAAS;KAC5B,MAAM;MAAE,MAAM;MAAY,QAAQ,QAAQ,OAAO,CAAC;KAAE;KACpD,YAAY,KAAK,IAAI;KACrB;IACF;IACA,SAAS,QAAQ;GACnB,OACE,SAAS,MAAM;GAEjB,IAAI,OAAO,MAAM;GACjB,MAAM,QAAQ,OAAO;GACrB,QAAQ,KAAK,KAAK;GAClB,IAAI,MAAM,SAAS,UAAU,uBAAuB,MAAM;GAC1D,IAAI,MAAM,SAAS,SAAS,gBAAgB,MAAM;GAClD,eAAe,OAAO,KAAK;GAE3B,IAAI,QAAQ,UAAU,aAAa,gBAAgB,QAAQ,GAAG,EAAE,CAAC,GAAG;IAClE,MAAM;KAAE,MAAM;KAAY,QAAQ,QAAQ,OAAO,CAAC;IAAE;IACpD,YAAY,KAAK,IAAI;GACvB;EACF;CACF,SAAS,OAAO;EACd,IAAI,QAAQ,SAAS,GACnB,MAAM;GAAE,MAAM;GAAY,QAAQ,QAAQ,OAAO,CAAC;EAAE;EACtD,MAAM;CACR,UAAU;EACR,aAAkB,YAAY,CAAC,CAAC;EAChC,IAAI;GACF,MAAM,OAAO,OAAO;EACtB,QAAQ,CAER,UAAU;GACR,OAAO,YAAY;EACrB;CACF;CAEA,IAAI;CACJ,IAAI;EACF,aAAa,QAAQ,OAAO,aAAa;CAC3C,SAAS,OAAO;EACd,IAAI,QAAQ,SAAS,GACnB,MAAM;GAAE,MAAM;GAAY,QAAQ,QAAQ,OAAO,CAAC;EAAE;EAEtD,MAAM;CACR;CACA,IAAI,QAAQ,SAAS,GACnB,MAAM;EAAE,MAAM;EAAY,QAAQ,QAAQ,OAAO,CAAC;CAAE;CAEtD,IAAI,kBAAkB,KAAA,GAAW,MAAM,IAAI,MAAM,aAAa;CAC9D,MAAM,eAAe,YAAY,gBAAgB;CACjD,MAAM;EACJ,MAAM;EACN,GAAI,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa;EACrD,GAAI,YAAY,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,WAAW,MAAM;CACvE;AACF;AAEA,MAAM,gBAGJ,YAIgB;CAChB,IAAI,QAAQ,QAAQ;CACpB,KAAK,MAAM,SAAS,QAAQ,QAC1B,QAAQ,QAAQ,MAAM,QAAQ,KAAK,OAAO,KAAK;CACjD,OAAO;AACT;AAEA,MAAM,YAAY,OAIhB,YAI8D;CAC9D,MAAM,cAAc;EAClB;EACA;EACA;EACA,QAAQ;CACV,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,IAAI;CACZ,MAAM,aAAa,EAAE,GAAG,QAAQ,QAAQ,WAAW;CACnD,KAAK,MAAM,OAAO,OAAO,KAAK,UAAU,GACtC,IACE,IAAI,WAAW,IAAI,KACnB,IAAI,WAAW,iBAAiB,KAChC;EACE;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,SAAS,GAAG,GAEd,QAAQ,eAAe,YAAY,GAAG;CAG1C,MAAM,QAAQ,OAAO,YACnB,OAAO,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU;EAC1D,MAAM,aAAa;GAAE,GAAG;GAAM,eAAe;EAAM;EACnD,KAAK,MAAM,OAAO;GAChB;GACA;GACA;GACA;EACF,GACE,QAAQ,eAAe,YAAY,GAAG;EAExC,OAAO,CAAC,MAAM,UAAU;CAC1B,CAAC,CACH;CACA,MAAM,SAAS,MAAM,kBAAkB;EACrC,WAAW,QAAQ;EACnB,SAAS;GACP,GAAG,QAAQ;GACX;GACA;GACA,eAAe,CACb,GAAG,QAAQ,QAAQ,eACnB;IAAE,MAAM;IAAQ,SAAS;GAAY,CACvC;GACA,mBAAmB,GAAG,QAAQ,QAAQ,aAAa;EACrD;EACA,iBAAiB,KAAA;CACnB,CAAC;CACD,IAAI,UAAU;CACd,IAAI,aAAa;CACjB,IAAI;CACJ,WAAW,MAAM,UAAU,kBAAkB,EAAE,OAAO,CAAC,GAAG;EACxD,QAAQ,QAAQ,OAAO,eAAe;EACtC,IAAI,OAAO,SAAS,UAAU;GAC5B,SAAS;GACT;EACF;EACA,KAAK,MAAM,SAAS,OAAO,QAAQ;GACjC,IAAI,MAAM,SAAS,cAAc,WAAW,MAAM;GAClD,IAAI,MAAM,KAAK,WAAW,OAAO,GAAG,aAAa;EACnD;CACF;CACA,IACE,cACA,QAAQ,KAAK,CAAC,CAAC,WAAW,KAC1B,QAAQ,iBAAiB,QAEzB,MAAM,IAAI,MACR,uEACF;CAEF,OAAO;EACL;EACA,GAAI,OAAO,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;CAC9D;AACF;AAEA,MAAM,oBACJ,UAC6B;CAC7B,MAAM,aAAa,MAAM;CACzB,OAAO,YAAY,WAAW,eAC5B,WAAW,aAAa,KAAA,KACxB,MAAM,SAAS,MAAM,YAAY,QAAQ,OAAO,WAAW,gBAAgB,IACzE,aACA;AACN;AAEA,MAAM,kBAAkB,OAGtB,YAOkB;CAClB,MAAM,EAAE,OAAO,SAAS,aAAa;CACrC,MAAM,WAAW,QAAQ,YAAY,CAAC;CACtC,MAAM,QAAQ,aAAa;EAAE;EAAO,QAAQ;EAAU,OAAO,SAAS;CAAM,CAAC;CAC7E,MAAM,aAAa,iBAAiB,KAAK;CACzC,MAAM,SAAS,IAAI,IACjB,QAAQ,YAAY,OAAO,KAAK,SAAS,KAAK,SAAS,CACzD;CACA,MAAM,WAAW,aACf,SAAS,QAAQ,YAAY,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;CACtD,IAAI,eAAe,MAAM,OAAO,QAAQ,MAAM,QAAQ;CACtD,MAAM,WAAW,IAAI,IAAI,WAAW,sBAAsB,CAAC,CAAC;CAC5D,MAAM,eAAe,WAAW;CAChC,IAAI,iBAAiB,KAAA,GAAW;EAC9B,MAAM,CAAC,QAAQ,kBAAkB,QAAQ,MAAM,QAAQ,IAAI;GACzD,iBAAiB,SAAS,QACtB,QAAQ,QAAQ,QAAQ,IACxB,QAAQ,MAAM,MAAM,SAAS,EAAE,SAAS,aAAa,CAAC;GAC1D,QAAQ,MAAM,qBAAqB,MAAM,QAAQ,GAAG,EAClD,SAAS,aACX,CAAC;GACD,gBAAgB,SAAS,QACrB,QAAQ,QAAQ,CAAC,CAAC,IAClB,QAAQ,QAAQ;IAAE,KAAK,eAAe;IAAG,KAAK,SAAS;GAAM,CAAC;EACpE,CAAC;EACD,KAAK,MAAM,QAAQ,iBAAiB,MAAM,QACxC,SAAS,IAAI,KAAK,SAAS;EAC7B,MAAM,SACJ,QAAQ,aAAa,KAAA,IACjB,OACA,2BAA2B,MAAM,QAAQ,QAAQ;EACvD,MAAM,UAAU,aAAa;GAC3B;GACA,QAAQ,CAAC,GAAG,QAAQ,GAAG,QAAQ;GAC/B,OAAO;IACL,GAAG,OAAO;IACV,UAAU,CACR,GAAG,WAAW,UACd,GAAG,OAAO,MAAM,SAAS,QAAQ,YAC/B,SAAS,IAAI,QAAQ,EAAE,CACzB,CACF;IACA,kBAAkB;GACpB;EACF,CAAC;EACD,MAAM,4BAAY,IAAI,IAAoB;EAC1C,KAAK,MAAM,WAAW,CAAC,GAAG,WAAW,UAAW,GAAG,MAAM,QAAQ,GAC/D,IAAI,CAAC,UAAU,IAAI,QAAQ,EAAE,GAAG,UAAU,IAAI,QAAQ,IAAI,UAAU,IAAI;EAE1E,OAAO,QACL,QAAQ,SAAS,UACd,MAAM,WACJ,UAAU,IAAI,KAAK,EAAE,KAAK,UAAU,SACpC,UAAU,IAAI,MAAM,EAAE,KAAK,UAAU,KAC1C,CACF;CACF;CACA,MAAM,WAAW,MAAM,SAAS,WAC7B,YAAY,QAAQ,OAAO,WAAW,gBACzC;CACA,OAAO,QAAQ;EACb,GAAG,WAAW;EACd,GAAG,MAAM,SACN,MAAM,GAAG,WAAW,CAAC,CAAC,CACtB,QAAQ,YAAY,SAAS,IAAI,QAAQ,EAAE,CAAC;EAC/C,GAAG,MAAM,SAAS,MAAM,WAAW,CAAC;CACtC,CAAC;AACH;AAEA,MAAM,eAAe,OAA4B,YAIlB;CAC7B,MAAM,WAAW,MAAM,uBAAuB,QAAQ,UAAU,EAC9D,OAAO,QAAQ,MACjB,CAAC;CACD,MAAM,UAAU,iBAAiB,QAAQ,KAAK,CAAC,EAAE;CACjD,OAAO,YAAY,KAAA,IACf,WACA,CAAC;EAAE,MAAM;EAAQ,SAAS;CAAQ,GAAG,GAAG,QAAQ;AACtD;AAEA,MAAM,sBAAsB,OAAO,YAIZ;CACrB,MAAM,QAAQ,MAAM,QAAQ,IAC1B,OAAO,QAAQ,QAAQ,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,WAAW;EACzD;EACA,aAAa,KAAK;EAClB,aAAa,MAAM,SAAS,KAAK,WAAW,CAAC,CAAC;CAChD,EAAE,CACJ;CACA,OAAO,KAAK,KACV,IAAI,YAAY,CAAC,CAAC,OAChB,KAAK,UAAU;EACb,UAAU,QAAQ;EAClB,cAAc,QAAQ;EACtB;CACF,CAAC,CACH,CAAC,CAAC,aAAa,CACjB;AACF;AAEA,MAAM,uBAAuB,YAIf;CACZ,MAAM,WAAW,QAAQ;CACzB,OAAO,aAAa,KAAA,KAClB,SAAS,UAAU,QAAQ,SAC3B,QAAQ,YAAY,SAAS,WAC3B,KAAK,IACH,QAAQ,UACR,KAAK,KAAK,SAAS,cAAc,QAAQ,WAAW,SAAS,QAAQ,CACvE,IACA,QAAQ;AACd;AASA,MAAM,mBACJ,aAEC;CACC,MAAM;CACN,IAAI,GAAG,QAAQ,aAAa,QAAQ,QAAQ,WAAW;CACvD;AACF;AAEF,MAAM,0BACJ,OACA,YACA,aAC2B;CAC3B,MAAM,aAAa,WAAW;CAC9B,IAAI,OAAO,eAAe,YAAY,OAAO;CAC7C,MAAM,SAAS,aAAa;CAC5B,IAAI,OAAO,WAAW,YAAY,OAAO;CACzC,IACE,WAAW,mBACV,OAAO,WAAW,YAAY,QAAQ,SAAS,iBAEhD,OAAO;CAET,IACE,WAAW,YACV,OAAO,WAAW,YAAY,QAAQ,SAAS,UAEhD,OAAO;CAET,MAAM,OAAO,MAAM;CACnB,IAAI,OAAO,MAAM,kBAAkB,YAAY,OAAO;CACtD,OAAO,MAAM,kBAAkB,OAAO,aAAa;AACrD;AAEA,MAAM,mBAA2D,YAUD;CAC9D,MAAM,SAA2B,CAAC;CAClC,MAAM,UAAU,CAAC,GAAG,QAAQ,OAAO;CACnC,MAAM,QAAQ,eAAoD;EAChE,MAAM,QAAQ,QAAQ,WACnB,cAAc,UAAU,KAAK,eAAe,UAC/C;EACA,IAAI,UAAU,IAAI,OAAO,KAAA;EACzB,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,CAAC;CAClC;CACA,MAAM,SAAS,eAA6B;EAC1C,MAAM,cAAc,KAAK,UAAU;EACnC,IAAI,aAAa,OAAO,KAAK,gBAAmB,YAAY,IAAI,CAAC;CACnE;CACA,KAAK,MAAM,CAAC,YAAY,UAAU,QAAQ,OAAO,QAAQ,GAAG;EAC1D,MAAM,WAAW,GAAG,QAAQ,aAAa,eAAe,QAAQ,SAAS,GAAG;EAC5E,IAAI,MAAM,SAAS,wBAAwB;GACzC,MAAM,UAA6B;IACjC,WAAW,QAAQ;IACnB,WAAW,QAAQ;IACnB,cAAc,QAAQ;IACtB,YAAY,MAAM;IAClB,UAAU,MAAM;IAChB,OAAO,MAAM;IACb,GAAI,MAAM,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;IAChE,GAAI,MAAM,qBAAqB,KAAA,IAC3B,CAAC,IACD,EAAE,kBAAkB,MAAM,iBAAiB;IAC/C,GACE,QAAQ,MAAM,MAAM,SAAS,EAE5B,4BAA4B,OAC3B,EAAE,yBAAyB,KAAK,IAChC,CAAC;IACL,GAAI,MAAM,qBAAqB,KAAA,IAC3B,CAAC,IACD,EAAE,kBAAkB,MAAM,iBAAiB;IAC/C,GAAI,MAAM,iBAAiB,KAAA,IACvB,CAAC,IACD,EAAE,cAAc,MAAM,aAAa;IACvC,GAAI,MAAM,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;GAC5D;GACA,KAAK,QAAQ,UAAU;GACvB,MAAM,iBAAiB,uBACrB,QAAQ,OACR,QAAQ,YACR,MAAM,QACR;GACA,IAAI,mBAAmB,aACrB,OAAO,KAAK,gBAAmB,OAAO,CAAC;QAEvC,QAAQ,KAAK;IAAE,MAAM;IAAS;GAAe,CAAC;EAElD,OAAO,IAAI,MAAM,SAAS,oBAAoB;GAC5C,MAAM,UAA6B;IACjC,WAAW,QAAQ;IACnB,WAAW,QAAQ;IACnB,cAAc,QAAQ;IACtB,YAAY,MAAM;IAClB,UAAU,MAAM;IAChB,GAAI,MAAM,UAAU,EAAE,OAAO,MAAM,MAAM,IAAI,EAAE,UAAU,MAAM,MAAM;IACrE,OAAO,MAAM;IACb,OAAO;IACP,GAAI,MAAM,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;IAChE,GAAI,MAAM,qBAAqB,KAAA,IAC3B,CAAC,IACD,EAAE,kBAAkB,MAAM,iBAAiB;IAC/C,GAAI,MAAM,qBAAqB,KAAA,IAC3B,CAAC,IACD,EAAE,kBAAkB,MAAM,iBAAiB;IAC/C,GAAI,MAAM,iBAAiB,KAAA,IACvB,CAAC,IACD,EAAE,cAAc,MAAM,aAAa;GACzC;GACA,MAAM,SAA4B;IAChC,WAAW,QAAQ;IACnB,WAAW,QAAQ;IACnB,cAAc,QAAQ;IACtB,YAAY,MAAM;IAClB,UAAU,MAAM;IAChB,OAAO,MAAM;GACf;GACA,KAAK,MAAM,UAAU;GACrB,OAAO,KAAK,gBAAmB,MAAM,GAAG;IACtC,MAAM;IACN,IAAI;IACJ;GACF,CAAmB;EACrB,OAAO,IAAI,MAAM,SAAS,yBAAyB;GACjD,MAAM,MAAM,UAAU;GACtB,MAAM,UAA6B;IACjC,WAAW,QAAQ;IACnB,WAAW,QAAQ;IACnB,cAAc,QAAQ;IACtB,YAAY,MAAM;IAClB,QAAQ,MAAM;IACd,OAAO;IACP,GAAI,MAAM,gBAAgB,KAAA,IACtB,CAAC,IACD,EAAE,aAAa,MAAM,YAAY;IACrC,GAAI,MAAM,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;IAChE,GAAI,MAAM,qBAAqB,KAAA,IAC3B,CAAC,IACD,EAAE,kBAAkB,MAAM,iBAAiB;IAC/C,GAAI,MAAM,qBAAqB,KAAA,IAC3B,CAAC,IACD,EAAE,kBAAkB,MAAM,iBAAiB;IAC/C,GAAI,MAAM,iBAAiB,KAAA,IACvB,CAAC,IACD,EAAE,cAAc,MAAM,aAAa;GACzC;GACA,OAAO,KAAK;IACV,MAAM;IACN,IAAI;IACJ;GACF,CAAmB;EACrB,OAAO,IAAI,MAAM,SAAS,qBAAqB;GAC7C,MAAM,MAAM,UAAU;GACtB,MAAM,UAA6B;IACjC,WAAW,QAAQ;IACnB,WAAW,QAAQ;IACnB,cAAc,QAAQ;IACtB,YAAY,MAAM;IAClB,OAAO,MAAM;IACb,OAAO;IACP,GAAI,MAAM,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;IAChE,GAAI,MAAM,qBAAqB,KAAA,IAC3B,CAAC,IACD,EAAE,kBAAkB,MAAM,iBAAiB;IAC/C,GAAI,MAAM,qBAAqB,KAAA,IAC3B,CAAC,IACD,EAAE,kBAAkB,MAAM,iBAAiB;IAC/C,GAAI,MAAM,iBAAiB,KAAA,IACvB,CAAC,IACD,EAAE,cAAc,MAAM,aAAa;GACzC;GACA,OAAO,KAAK;IACV,MAAM;IACN,IAAI;IACJ;GACF,CAAmB;EACrB,OAAO,IAAI,MAAM,SAAS,sBAAsB;GAC9C,MAAM,MAAM,UAAU;GACtB,MAAM,UAA6B;IACjC,WAAW,QAAQ;IACnB,WAAW,QAAQ;IACnB,cAAc,QAAQ;IACtB,YAAY,MAAM;IAClB,QAAQ;IACR,OAAO;GACT;GACA,OAAO,KAAK;IACV,MAAM;IACN,IAAI;IACJ;GACF,CAAmB;EACrB,OAAO,IAAI,MAAM,SAAS,yBAAyB;GACjD,MAAM,MAAM,UAAU;GACtB,MAAM,UAAoC;IACxC,WAAW,QAAQ;IACnB,cAAc,QAAQ;IACtB,YAAY,MAAM;IAClB,YAAY,MAAM;IAClB,GAAI,MAAM,gBAAgB,KAAA,IACtB,CAAC,IACD,EAAE,aAAa,MAAM,YAAY;IACrC,GAAI,MAAM,cAAc,KAAA,IACpB,CAAC,IACD,EAAE,WAAW,MAAM,UAAU;GACnC;GACA,OAAO,KAAK;IACV,MAAM;IACN,IAAI,GAAG,QAAQ,aAAa,YAAY,MAAM;IAC9C;GACF,CAAmB;EACrB,OAAO,IAAI,MAAM,SAAS,0BACxB,OAAO,KAAK;GACV,MAAM;GACN,IAAI,GAAG,QAAQ,aAAa,YAAY,MAAM,WAAW;GACzD,SAAS;IACP,WAAW,QAAQ;IACnB,cAAc,QAAQ;IACtB,YAAY,MAAM;IAClB,UAAU,MAAM;IAChB,GAAI,MAAM,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;GAC/D;EACF,CAAmB;CAEvB;CACA,OAAO;EAAE,QAAQ;EAAQ;CAAQ;AACnC;AAEA,SAAS,2BACP,SACA,eACoB;CACpB,IAAI,cAAc,SAAS,GAAG,OAAO;CACrC,MAAM,+BAAe,IAAI,IAAY;CACrC,MAAM,4BAAY,IAAI,IAAY;CAClC,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,UAAU,MAAM;EAMtB,IACE,OAAO,QAAQ,iBAAiB,YAChC,CAAC,cAAc,IAAI,QAAQ,YAAY,KACvC,OAAO,QAAQ,cAAc,UAE7B;EAEF,IACE,MAAM,SAAS,2BACf,OAAO,QAAQ,eAAe,UAE9B,aAAa,IAAI,GAAG,QAAQ,UAAU,QAAQ,QAAQ,YAAY;EAEpE,IACE,MAAM,SAAS,wBACf,OAAO,QAAQ,YAAY,UAE3B,UAAU,IAAI,GAAG,QAAQ,UAAU,QAAQ,QAAQ,SAAS;CAEhE;CACA,OAAO,QAAQ,QAAQ,UAAU;EAC/B,MAAM,UAAU,MAAM;EAMtB,IACE,OAAO,QAAQ,iBAAiB,YAChC,cAAc,IAAI,QAAQ,YAAY,GAEtC,OAAO;EAET,IACE,MAAM,SAAS,2BACf,OAAO,QAAQ,cAAc,YAC7B,OAAO,QAAQ,eAAe,UAE9B,OAAO,CAAC,aAAa,IACnB,GAAG,QAAQ,UAAU,QAAQ,QAAQ,YACvC;EAEF,IACE,MAAM,SAAS,wBACf,OAAO,QAAQ,cAAc,YAC7B,OAAO,QAAQ,YAAY,UAE3B,OAAO,CAAC,UAAU,IAAI,GAAG,QAAQ,UAAU,QAAQ,QAAQ,SAAS;EAEtE,OAAO;CACT,CAAC;AACH;AAEA,MAAM,sBAIJ,YAK6B;CAC7B,IAAI,aAAa,QAAQ;CACzB,IACE,eAAe,UACd,OAAO,eAAe,YAAY,eAAe,OAElD,MAAM,IAAI,UAAU,qDAAqD;CAE3E,IAAI,eAAe,SAAS,UAAU,YAAY;EAChD,QAAa,QAAQ,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC;EAC/C,MAAM,IAAI,UAAU,mDAAmD;CACzE;CACA,IAAI,eAAe,SAAS,EAAE,mBAAmB,aAAa;EAC5D,IACE,WAAW,oBAAoB,KAAA,MAC9B,CAAC,OAAO,cAAc,WAAW,eAAe,KAC/C,WAAW,kBAAkB,IAE/B,MAAM,IAAI,UACR,4DACF;EAEF,MAAM,SAAS,QAAQ,YAAY;EACnC,MAAM,cACJ,QAAQ,YAAY,WAAW,KAAA,IAC3B,sBACA,WAAW,KAAA,KAAa,WAAW,UAAU,WAAW,SACtD,uBACA,OAAO,OAAO,QAAQ,SAAS,CAAC,CAAC,CAAC,CAAC,MAC9B,SACC,KAAK,SAAS,cAAc,KAAK,uBAAuB,IAC5D,IACA,4BACA,KAAA;EACV,IAAI,gBAAgB,KAAA,GAAW;GAC7B,IAAI,QAAQ,UACV,MAAM,IAAI,UACR,yCAAyC,YAAY,2CACvD;GAEF,aAAa;EACf;CACF;CAEA,OAAO;AACT;;;;;AAMA,SAAgB,eAKd,SAC2C;CAC3C,IAAI,QAAQ,UAAU,KAAA,GACpB,MAAM,IAAI,UAAU,+BAA+B;CAErD,IACE,QAAQ,UAAU,cAAc,KAAA,MAC/B,CAAC,OAAO,UAAU,QAAQ,SAAS,SAAS,KAC3C,QAAQ,SAAS,YAAY,IAE/B,MAAM,IAAI,UAAU,+CAA+C;CAErE,IACE,QAAQ,UAAU,eAAe,KAAA,MAChC,CAAC,OAAO,SAAS,QAAQ,SAAS,UAAU,KAC3C,QAAQ,SAAS,aAAa,IAEhC,MAAM,IAAI,UAAU,mDAAmD;CAEzE,IACE,QAAQ,aAAa,KAAA,KACrB,QAAQ,aAAa,OAAO,sBAC3B,CAAC,OAAO,UAAU,QAAQ,QAAQ,KAAK,QAAQ,WAAW,IAE3D,MAAM,IAAI,UAAU,iDAAiD;CAGvE,MAAM,uBACJ,QAAQ,eAAe,QAAQ,aAAa,KAAA,IAAY,CAAC,IAAI;CAC/D,MAAM,mBACJ,OAAO,yBAAyB,aAC5B,KAAA,IACA,mBAAmB;EACjB,YAAY;EACZ,UAAU,QAAQ,eAAe,KAAA;EACjC,YAAY,QAAQ;EACpB,OAAO,QAAQ;CACjB,CAAC;CAEP,MAAM,QAAQ,QAAQ,SAAU,CAAC;CACjC,MAAM,aAAyC,QAAQ,cAAc,CAAC;CACtE,MAAM,WAAW,QAAQ,YAAY,OAAO;CAC5C,MAAM,UAAU,qBAAqB,EAAE,OAAO,QAAQ,MAAM,CAAC;CAC7D,MAAM,cAAc,QAAQ;CAC5B,MAAM,8BAAc,IAAI,IAAqC;CAe7D,MAAM,eACJ,MACA,QACA,YAOC;EACC,MAAM;EACN,IAAI,GAAG,KAAK,aAAa,QAAQ,KAAK,WAAW,GAAG;EACpD,SAAS;GACP,WAAW,KAAK;GAChB,WAAW,KAAK;GAChB,cAAc,KAAK;GACnB,YAAY,KAAK;GACjB,UAAU,KAAK;GACf,OAAO,KAAK;GACZ,OAAO;GACP,GAAI,OAAO,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;GAC/D,GAAI,OAAO,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;GAC5D,GAAI,OAAO,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;GAC/D,GAAI,OAAO,gBAAgB,KAAA,IACvB,CAAC,IACD,EAAE,aAAa,OAAO,YAAY;GACtC,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,KAAK,QAAQ;GAC9D,GAAI,KAAK,qBAAqB,KAAA,IAC1B,CAAC,IACD,EAAE,kBAAkB,KAAK,iBAAiB;GAC9C,GAAI,KAAK,iBAAiB,KAAA,IACtB,CAAC,IACD,EAAE,cAAc,KAAK,aAAa;EACxC;CACF;CAEF,MAAM,kBAAkB,UAIO;EAC7B,MAAM,EAAE,KAAK,MAAM,YAAY,UAAU;EACzC,MAAM,MAAM,eAAe,IAAI,MAAM,WAAW,KAAK,YAAY;EACjE,MAAM,SAAS,YAAY,IAAI,GAAG;EAClC,IAAI,QAAQ,OAAO;EACnB,MAAM,eAAe,YAAY;GAC/B,MAAM,WAAW,MAAM;GACvB,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,UAAU,sCAAsC;GAC5D,MAAM,CAAC,UAAU,UAAU,QAAQ,MAAM,QAAQ,IAAI;IACnD,IAAI,QAAQ,MAAM,QAAQ,MAAM,SAAS,EAAE,SAAS,SAAS,CAAC;IAC9D,IAAI,QAAQ,MAAM,aAAa,EAAE,SAAS,SAAS,CAAC;IACpD,IAAI,QAAQ,QAAQ;KAAE,KAAK,WAAW;KAAG,KAAK,IAAI,MAAM;IAAM,CAAC;GACjE,CAAC;GACD,MAAM,WAAW,KAAK,QACnB,WACE,MAAM,SAAS,2BACd,MAAM,SAAS,6BACf,MAAM,SAAS,8BAChB,MAAM,QAAqC,iBAC1C,KAAK,YACX;GACA,MAAM,QAAQ,aAAa;IACzB,OAAO,QAAQ;IACf,QAAQ;IACR,OAAO,SAAS;GAClB,CAAC;GACD,OAAO,aAAa;IAClB,UAAU,MAAM,gBAAgB;KAC9B,OAAO,QAAQ;KACf,SAAS,IAAI;KACb;KACA,aAAa,SAAS;KACtB;IACF,CAAC;IACD;IACA;GACF,CAAC;EACH,EAAA,CAAG;EACH,YAAY,IAAI,KAAK,WAAW;EAChC,YAAiB,YAAY;GAC3B,IAAI,YAAY,IAAI,GAAG,MAAM,aAAa,YAAY,OAAO,GAAG;EAClE,CAAC;EACD,OAAO;CACT;CAEA,MAAM,wBACJ,KACA,MACA,UAC0B;EAC1B,MAAM,mBAAmB,4BAA4B,KAAK;EAC1D,IAAI,WAAW,IAAI,MAAM,GAAG;EAC5B,IAAI,qBAAqB,aAAa,MAAM;EAC5C,OAAO,YAAY,MAAM,GAAG,IAAI,MAAM,GAAG,mBAAmB,EAC1D,OAAO,aAAa,KAAK,EAC3B,CAAC;CACH;CAEA,MAAM,mBAAmB,OACvB,KACA,MACA,SACA,aACmC;EACnC,IAAI;EACJ,IAAI;GACF,SAAS,MAAM,QAAQ,KAAK,OAAO;IACjC,YAAY,KAAK;IACjB;IACA,aAAa,IAAI;GACnB,CAAC;EACH,SAAS,OAAO;GACd,OAAO,qBAAqB,KAAK,MAAM,KAAK;EAC9C;EACA,IAAI;EACJ,IAAI;GACF,WAAW,cAAc,MAAM;EACjC,SAAS,OAAO;GACd,OAAO,qBAAqB,KAAK,MAAM,KAAK;EAC9C;EACA,IAAI,aAAa,KAAA,GACf,OAAO,YAAY,MAAM,GAAG,IAAI,MAAM,GAAG,eAAe,EAAE,OAAO,CAAC;EAEpE,IAAI;EACJ,IAAI,WAAW;EACf,IAAI,OAAO;EACX,IAAI;GACF,SAAS;IACP,IAAI;IACJ,IAAI;KACF,SAAS,MAAM,SAAS,KAAK;IAC/B,SAAS,OAAO;KACd,OAAO,qBAAqB,KAAK,MAAM,KAAK;IAC9C;IACA,IAAI,OAAO,MAAM;KACf,IAAI,IAAI,OAAO,kBAAkB,SAAS,MAAM,IAAI,OAAO;KAC3D,OAAO;KACP;IACF;IACA,IAAI,WAAW,IAAI,MAAM,GAAG;IAC5B,OAAO,OAAO;IACd,MAAM,QAAQ,OAAO;KACnB;KACA,MAAM,QAAQ,KAAK,WAAW,eAAe;KAC7C,QAAQ,CACN,YACE,MACA,GAAG,IAAI,MAAM,GAAG,aAAa,IAAI,QAAQ,GAAG,SAAS,eACrD;MACE,QAAQ,OAAO;MACf,aAAa;KACf,CACF,CACF;IACF,CAAC;IACD,YAAY;GACd;EACF,UAAU;GACR,IAAI,CAAC,MACH,IAAI;IACF,MAAM,SAAS,SAAS;GAC1B,QAAQ,CAER;EAEJ;EACA,OAAO,YACL,MACA,GAAG,IAAI,MAAM,GAAG,aAAa,SAAS,SACtC,aAAa,IAAI,CAAC,IAAI,EAAE,QAAQ,KAAK,CACvC;CACF;CAEA,MAAM,cAAc,OAAO,UAIW;EACpC,MAAM,EAAE,KAAK,SAAS;EAEtB,MAAM,UADO,MAAM,KAAK,SACJ,EAAE;EACtB,IAAI,YAAY,KAAA,GACd,OAAO,YAAY,MAAM,GAAG,IAAI,MAAM,GAAG,mBAAmB,EAC1D,OAAO,SAAS,KAAK,SAAS,0BAChC,CAAC;EAEH,MAAM,WAAW,MAAM,eAAe,KAAK;EAC3C,IAAI,WAAW,IAAI,MAAM,GAAG;EAC5B,MAAM,QAA0B;GAC9B,UAAU,QAAQ,MAAM;GACxB,SAAS;EACX;EAGA,OAAO,iBAAiB,IAAI,aAC1B,iBAAiB,KAAK,MAAM,SAAS,QAAQ,CAC/C;CACF;CAEA,MAAM,sBAAsB,OAC1B,QAC4B;EAC5B,IAAI;GACF,MAAM,SACJ,MAAM,IAAI,QAAQ,MAAM,QAAQ,SAAS,EAAE,SAAS,SAAS,CAAC,EAAA,CAC9D;GACF,MAAM,UAAU,IAAI,MAAM;GAC1B,MAAM,OAAO,MAAM,YAAY,UAAU,MAAM,MAC5C,cAAc,UAAU,MAAM,OAAO,IAAI,MAAM,EAClD;GACA,IACE,MAAM,QAAQ,WAAW,QAAQ,UACjC,MAAM,OAAO,aACb,MAAM,OAAO,YAAY,QAAQ,WACjC,MAAM,YAAY,UAAU,YAAY,KAAA,KACxC,CAAC,QACD,KAAK,YACL,KAAK,MAAM,SAEX,OAAO,QAAQ,QAAQ;IAAE;IAAK,QAAQ,KAAA;GAAU,CAAC;GACnD,OAAO,QAAQ,QAAQ;IACrB;IACA,QAAQ,MAAM,YAAY;KACxB;KACA,MAAM,QAAQ;KACd,YAAY,QAAQ;IACtB,CAAC;GACH,CAAC;EACH,SAAS,OAAO;GACd,IAAI,QAAQ,UAAU;IAAE;IAAO,QAAQ,IAAI;GAAO,CAAC,GACjD,OAAO,QAAQ,QAAQ;IAAE;IAAK,QAAQ,KAAA;GAAU,CAAC;GACnD,MAAM;EACR;CACF;CAEA,MAAM,oBAAoB,OACxB,QAC+D;EAC/D,IAAI,WAAW,IAAI,MAAM,GAAG;EAC5B,MAAM,YAAY,IAAI,MAAM;EAC5B,MAAM,UAAU,IAAI,MAAM;EAC1B,MAAM,WAAW,MAAM,IAAI,QAAQ,MAAM,QAAQ,MAAM,SAAS,EAC9D,SAAS,SACX,CAAC;EACD,IACE,SAAS,MAAM,QAAQ,UAAU,YACjC,SAAS,MAAM,QAAQ,UAAU,WAEjC;EACF,MAAM,oBACJ,MAAM,IAAI,QAAQ,MAAM,aAAa,EAAE,SAAS,SAAS,MAAM,CAAC,EAAA,CAChE;EACF,IACE,iBAAiB,UACjB,iBAAiB,UAAU,oBAAoB,WAE/C;EACF,MAAM,WAAW,iBAAiB;EAClC,MAAM,UACJ,SAAS,YAAY,cAAc,YAC/B,SAAS,aACT,KAAA;EACN,IACE,YAAY,KAAA,MACX,SAAS,eAAe,KAAA,KACtB,SAAS,YAAY,KAAA,KACpB,SAAS,QAAQ,eAAe,OAEpC;EACF,IAAI,YAAY,KAAA,KAAa,QAAQ,WAAW,IAAI,SAAS;EAC7D,MAAM,UAAU,IAAI;EACpB,MAAM,eAAe,GAAG,UAAU,cAAc;EAChD,MAAM,oBACJ,QAAQ,sBACP,QAAQ,WAAW,YAChB,GAAG,QAAQ,UAAU,cACrB,QAAQ;EACd,MAAM,oBAAoB,SAAS;EACnC,IACE,QAAQ,WAAW,WAClB,cACC,qBAAqB,SAAS,QAAQ,WAAW,kBACjD,SAAS,sBAAsB,QAAQ,aACvC,SAAS,sBAAsB,QAAQ,oBAEzC;EACF,MAAM,WAAW;EACjB,MAAM,WACJ,aAAa,KAAA,IACT,CAAC,IACD,CAAC;GAAE,YAAY;GAAU,UAAU,SAAS;EAAoB,CAAC;EACvE,IAAI,QAAQ,WAAW,WAAW,SAAS,QAAQ,QACjD,SAAS,KAAK;GACZ,YAAY,SAAS,OAAO;GAC5B,UAAU,SAAS,OAAO;EAC5B,CAAC;EAEH,MAAM,wBAAwB,IAAI,IAChC,SAAS,KAAK,EAAE,YAAY,YAAY,MAAM,YAAY,CAC5D;EACA,IAAI,QAAQ,SAAS;EACrB,IAAI,SAAS,SAAS,GAAG;GACvB,MAAM,UAAU,KAAK,IAAI,GAAG,SAAS,KAAK,EAAE,eAAe,QAAQ,CAAC;GACpE,MAAM,WAAW,MAAM,IAAI,QAAQ,MAAM,QAAQ,MAAM,SAAS,EAC9D,QACF,CAAC;GACD,MAAM,OAAO,MAAM,IAAI,QAAQ,QAAQ;IACrC,KAAK,UAAU;IACf,KAAK,SAAS;GAChB,CAAC;GACD,QAAQ,aAAa;IACnB,OAAO,QAAQ;IACf,QAAQ,2BAA2B,MAAM,qBAAqB;IAC9D,OAAO,SAAS;GAClB,CAAC;EACH;EACA,MAAM,kBAA8C;GAClD,OAAO,IAAI;GACX;GACA,SAAS,EACP,QAAQ,SAAS,gBACf,IAAI,QAAQ,MAAM,SAAS;IACzB,GAAG;IACH,SAAS,aAAa,WAAW,SAAS;GAC5C,CAAC,EACL;GACA,QAAQ,IAAI;EACd;EAEA,IAAI,oBAAoB;EACxB,IAAI;GACF,MAAM,gBAAgB,MAAM,QAAQ,QAAQ,OAAO,eAAe;GAClE,IAAI,kBAAkB,KAAA,GACpB,MAAM,IAAI,UAAU,uCAAuC;GAE7D,IAAI,WAAW,IAAI,MAAM,GAAG;GAC5B,MAAM,uBACJ,QAAQ,iBAAiB,KAAA,IACrB,KAAA,IACA,MAAM,QAAQ,QAAQ,cAAc,eAAe;GACzD,IAAI,WAAW,IAAI,MAAM,GAAG;GAC5B,MAAM,aACJ,OAAO,yBAAyB,aAC5B,mBAAmB;IACjB,YAAY,MAAM,QAAQ,sBAAsB,eAAe;IAC/D,UAAU;IACV,YAAY,QAAQ;IACpB,OAAO,QAAQ;GACjB,CAAC,IACD;GACN,IAAI,WAAW,IAAI,MAAM,GAAG;GAE5B,IAAI,QAAQ,WAAW,UAAU,qBAAqB,UAAU;IAC9D,MAAM,SAAS,SAAS,QAAQ;IAChC,IAAI,WAAW,KAAA,GAAW;IAC1B,OAAO;KACL,MAAM;KACN,IAAI,GAAG,UAAU;KACjB,SAAS;MACP,WAAW,OAAO;MAClB,WAAW,OAAO;MAClB,cAAc,OAAO;MACrB;MACA,OAAO,sBAAsB,SAAS;MACtC,WAAW;KACb;IACF;GACF;GAEA,MAAM,UAAoC;IACxC;IACA,WAAW,QAAQ;IACnB;IACA;IACA;IACA,OAAO,UAAU,aAAa;IAC9B,oBAAoB,SAAS;GAC/B;GACA,MAAM,iBAAiB,eAAe,aAAa;GACnD,MAAM,iBAAiB,QAAQ,YAAY,kBAAkB;GAC7D,MAAM,qBACJ,MAAM,QAAQ,iBAAiB,SAAS,KACxC,eAAe,SAAS,CAAC,SAAS;GACpC,MAAM,oBACJ,eAAe,SACf,EAAE,mBAAmB,eACrB,WAAW,oBAAoB,KAAA,KAC/B,CAAC,sBACD,mBAAmB,KAAA;GACrB,MAAM,cAAgC,CAAC;GACvC,IACE,qBACA,CAAC,OAAO,OAAO,MAAM,eAAe,cAAc,GAElD,YAAY,KAAK;IACf,MAAM;IACN,IAAI,qBAAqB,mBAAmB,QAAQ,MAAM,SAAS,IAAI,EAAE,GAAG,mBAAmB,IAAI,MAAM,SAAS,EAAE,GAAG,mBAAmB,cAAc;IACxJ,SAAS,EAAE,SAAS,eAAe;GACrC,CAAmB;GAErB,IAAI,UAAU;IACZ,MAAM,UAAU;IAChB,MAAM,aAAsC;KAC1C;KACA,WAAW,QAAQ;KACnB,cAAc,QAAQ;KACtB,mBAAmB,QAAQ;KAC3B,OAAO;KACP,YAAY;IACd;IACA,YAAY,KAAK;KACf,MAAM;KACN,IAAI,GAAG,QAAQ,aAAa;KAC5B,SAAS;IACX,CAAmB;GACrB;GACA,YAAY,KAAK;IACf,MAAM;IACN,IAAI;IACJ,SAAS;GACX,CAAmB;GACnB,MAAM,mBAAmB,MAAM,QAAQ,OAAO;IAC5C;IACA,MAAM;IACN,QAAQ;GACV,CAAC;GACD,oBAAoB;GAEpB,IAAI,WAAW,IAAI,MAAM,GAAG;GAE5B,MAAM,yBAAyB;GAC/B,MAAM,WAAW,MAAM,gBAAgB;IACrC,OAAO,QAAQ;IACf,SAAS,IAAI;IACb,UAAU;KAAE;KAAO,OAAO,SAAS;IAAM;IACzC,aAAa;IACb,UAAU;GACZ,CAAC;GACD,IAAI,qBAAqB;GACzB,IAAI,gBAAgB,MAAM,aAAa;IAAE;IAAU;IAAO;GAAM,CAAC;GACjE,MAAM,cAA6C;IACjD,SAAS,IAAI;IACb;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,gBAAgB;IACzB,QAAQ,IAAI;IACZ,OAAO;IACP;IACA,GAAI,yBAAyB,KAAA,IACzB,CAAC,IACD,EAAE,cAAc,qBAAqB;IACzC;GACF;GACA,MAAM,SAAS;GACf,MAAM,cACJ,WAAW,SACX,EAAE,mBAAmB,YACpB,OAAO,oBAAoB,KAAA,KAAa;GAC3C,MAAM,WACJ,mBAAmB,KAAA,IACf,KAAA,IACA,MAAM,cAAc;GAC1B,MAAM,SACJ,UAAU,WAAW,cAAc,CAAC,qBAChC,SAAS,SACT,KAAA;GACN,IAAI;GACJ,IAAI,YAAY;GAChB,MAAM,aAAa,SAAS,QAAQ,cAAc;GAClD,IAAI,UAAU,YAAY;IACxB,MAAM,oBAAoB;KACxB,GAAG;KACH;KACA;IACF;IACA,IAAI;IACJ,IAAI,mBAAmB,QACrB,gBAAgB,MAAM,OAAO,cAAc,iBAAiB;SACvD,IAAI,aAAa;KACtB,qBAAqB,MAAM,oBAAoB;MAC7C,UAAU;MACV,cAAc;MACd;KACF,CAAC;KACD,MAAM,cAAc,oBAAoB;MACtC,UAAU;MACV,OAAO,UAAU,aAAa;MAC9B,aAAa,iBAAiB;KAChC,CAAC;KACD,MAAM,YACJ,OAAO,oBACN,WAAW,KAAA,IACR,KAAA,IACA,KAAK,MACH,KAAK,IACH,OAAO,gBAAgB,KACvB,OAAO,iBAAiB,WAAW,mBAAmB,EACxD,CACF;KACN,IACE,WAAW,KAAA,KACX,cAAc,KAAA,KACd,aAAa,GAEb,MAAM,IAAI,MACR,iCAAiC,OAAO,cAAc,sBACxD;KAEF,gBAAgB,cAAc,KAAA,KAAa,eAAe;IAC5D,OACE,gBAAgB;IAElB,IAAI,WAAW,IAAI,MAAM,GAAG;IAC5B,IAAI,eAAe;KACjB,MAAM,mBACJ,MAAM,SAAS,UACZ,YACC,CAAC,uBAAuB,OAAO,MAC5B,WAAW,OAAO,cAAc,QAAQ,EAC3C,CACJ,CAAC,EAAE,MAAM,QAAQ;KACnB,MAAM,eAAe,SAAS;KAC9B,iBAAiB,KACf,GAAI,MAAM,QAAQ,OAAO;MACvB;MACA,MAAM;MACN,QAAQ,CACN;OACE,MAAM;OACN,IAAI,GAAG,aAAa;OACpB,SAAS;QAAE;QAAc;QAAkB;OAAa;MAC1D,CACF;KACF,CAAC,CACH;KACA,MAAM,SAAS,EAAE,mBAAmB,UAChC;MACE,UAAU,CAAC;MACX,GAAI,MAAM,UAAU;OAClB,WAAW,QAAQ,MAAM,SAAS;OAClC,SAAS;OACT,cAAc,OAAO;MACvB,CAAC;KACH,IACA,EAAE,UAAU,MAAM,OAAO,QAAQ,iBAAiB,EAAE;KACxD,IAAI,WAAW,IAAI,MAAM,GAAG;KAC5B,MAAM,YAA2C;MAC/C;MACA;MACA;MACA,GAAG;MACH,GAAI,uBAAuB,OAAO,WAAW,IACzC,CAAC,IACD,EACE,oBAAoB,uBAAuB,OAAO,KAC/C,SAAS,KAAK,SACjB,EACF;KACN;KACA,iBAAiB,KACf,GAAI,MAAM,QAAQ,OAAO;MACvB;MACA,MAAM;MACN,QAAQ,CACN;OACE,MAAM;OACN,IAAI,GAAG,aAAa;OACpB,SAAS;MACX,CACF;KACF,CAAC,CACH;KACA,MAAM,SAAS,IAAI,IACjB,uBAAuB,OAAO,KAAK,SAAS,KAAK,SAAS,CAC5D;KACA,qBAAqB,OAAO,SAAS,QAClC,YAAY,CAAC,OAAO,IAAI,QAAQ,EAAE,CACrC;KACA,YAAY;IACd;GACF;GAEA,MAAM,eAAe,aAAa;IAChC,OAAO,QAAQ;IACf,QAAQ;IACR,OAAO,SAAS;GAClB,CAAC;GACD,IAAI,QAAQ,WAAW,WAAW,aAAa,KAAA,GAC7C,qBAAqB,MAAM,gBAAgB;IACzC,OAAO,QAAQ;IACf,SAAS,IAAI;IACb;IACA,aAAa;IACb,UAAU;GACZ,CAAC;GAEH,IACG,UAAU,mBAAmB,UAC9B,uBAAuB,YACvB,iBAAiB,YAAY,CAAC,EAAE,YAC9B,iBAAiB,KAAK,CAAC,EAAE,SAE3B,gBAAgB,MAAM,aAAa;IACjC,UAAU;IACV,OAAO;IACP;GACF,CAAC;GAEH,YAAY,IACV,eAAe,IAAI,MAAM,WAAW,YAAY,GAChD,QAAQ,QAAQ,aAAa,CAC/B;GACA,IAAI,gBAAgB,uBAAuB,KAAA,KAAa,YACtD,qBAAqB,MAAM,oBAAoB;IAC7C,UAAU;IACV,cAAc;IACd;GACF,CAAC;GAGH,IAAI,mBAAsC,CAAC;GAC3C,IAAI,WAAW,IAAI,MAAM,GAAG;GAC5B,MAAM,kBAAiD;IACrD,SAAS,IAAI;IACb;IACA;IACA;IACA,UAAU;IACV;IACA,OAAO;IACP,SAAS,gBAAgB;IACzB,QAAQ,IAAI;IACZ,OAAO;IACP;IACA,GAAI,yBAAyB,KAAA,IACzB,CAAC,IACD,EAAE,cAAc,qBAAqB;IACzC,YAAY,QAAQ,cAAc,CAAC;GACrC;GACA,MAAM,SAAS,QAAQ,aAAa,KAAA;GASpC,MAAM,UAAU,kBAAkB;IAChC,QARA,QAAQ,aAAa,KAAA,IACjB,MAAM,kBAAkB;KACtB,WAAW,QAAQ,MAAM,SAAS;KAClC,SAAS;KACT,iBAAiB,QAAQ;IAC3B,CAAC,IACD,EAAE,QAAQ,MAAM,QAAQ,SAAS,eAAe,EAAE;IAGtD,GAAI,QAAQ,aAAa,KAAA,IACrB,CAAC,IACD,EAAE,UAAU,QAAQ,SAAS;GACnC,CAAC;GAED,IAAI,WAAW;GACf,IAAI;GACJ,WAAW,MAAM,UAAU,SAAS;IAClC,IAAI,OAAO,eAAe;IAC1B,IAAI,OAAO,SAAS,UAAU;KAC5B,SAAS;KACT;IACF;IACA,MAAM,WAAsC;KAC1C;KACA,WAAW,QAAQ;KACnB;KACA;KACA;KACA,QAAQ,OAAO;IACjB;IACA,MAAM,YAAY,gBAAsB;KACtC;KACA,WAAW;KACX;KACA;KACA,QAAQ,OAAO;KACf,SAAS;KACT;KACA;KACA;IACF,CAAC;IACD,mBAAmB,UAAU;IAC7B,MAAM,QAAQ,OAAO;KACnB;KACA,MAAM,uBAAuB;KAC7B,QAAQ,CACN;MACE,MAAM;MACN,IAAI,GAAG,aAAa,YAAY;MAChC,SAAS;KACX,GACA,GAAG,UAAU,MACf;IACF,CAAC;IACD,YAAY;GACd;GAEA,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,0CAA0C;GACvE,MAAM,YAAwC;IAC5C;IACA,WAAW,QAAQ;IACnB;IACA;IACA,GAAI,uBAAuB,KAAA,IAAY,CAAC,IAAI,EAAE,mBAAmB;IACjE,GAAI,OAAO,iBAAiB,KAAA,IACxB,CAAC,IACD,EAAE,cAAc,OAAO,aAAa;IACxC,GAAI,OAAO,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;GAC9D;GACA,MAAM,kBAAkB;IACtB,MAAM;IACN,IAAI,GAAG,aAAa;IACpB,SAAS;GACX;GACA,MAAM,aAAa,QAAQ,WACvB,iBAAiB,QACd,YAAY,QAAQ,mBAAmB,WAC1C,IACA,CAAC;GACL,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,4DAA4D,WAAW,EAAE,CAAE,KAAK,SAAS,EAC3F;GAEF,MAAM,gBAAgB,iBACnB,QACE,YACC,QAAQ,mBAAmB,eAC1B,QAAQ,aAAa,KAAA,KACpB,QAAQ,mBAAmB,SACjC,CAAC,CACA,KAAK,YAAY,gBAAmB,QAAQ,IAAI,CAAC;GACpD,IAAI,OAAO,iBAAiB,cAC1B,OAAO,CAAC,GAAG,eAAe,eAAe;GAE3C,OAAO;IACL,GAAG;IACH;IACA;KACE,MAAM;KACN,IAAI,GAAG,aAAa;KACpB,SAAS,EACP,WAAW,kBACb;IACF;GACF;EACF,SAAS,OAAO;GACd,IAAI,iBAAiB,kBAAkB,MAAM;GAC7C,IAAI,iBAAiB,SAAS;IAC5B,WAAW,IAAI,MAAM;IACrB,MAAM;GACR;GACA,IAAI,WAAW,IAAI,MAAM,GAAG;GAC5B,IAAI,CAAC,mBAAmB,MAAM;GAC9B,MAAM,SAAkC;IACtC;IACA,WAAW,QAAQ;IACnB;IACA;IACA,OAAO,aAAa,KAAK;GAC3B;GACA,OAAO;IACL,MAAM;IACN,IAAI,GAAG,aAAa;IACpB,SAAS;GACX;EACF;CACF;CAEA,MAAM,oBAAoB,cAA4B;EACpD,MAAM,SAAS,GAAG,UAAU;EAC5B,KAAK,MAAM,OAAO,YAAY,KAAK,GACjC,IAAI,IAAI,WAAW,MAAM,GAAG,YAAY,OAAO,GAAG;CAEtD;CAEA,OAAO;EACL,+BAA+B,EAC7B,SAAS,OAAO,QAAQ;GACtB,MAAM,SAAS,MAAM,gBAAgB;IACnC,SAAS,IAAI,MAAM,QAAQ;IAC3B,QAAQ,IAAI;GACd,CAAC;GACD,IAAI,OAAO,eAAe;GAC1B,OAAO;IACL,MAAM;IACN,IAAI,GAAG,IAAI,MAAM,GAAG;IACpB,SAAS;KAAE,SAAS,IAAI,MAAM,QAAQ;KAAS;IAAO;GACxD;EACF,EACF;EACA,wBAAwB;GAAE,MAAM;GAAiB,SAAS,QAAQ;EAAQ;EAC1E,oBAAoB;GAAE,MAAM;GAAiB,SAAS,QAAQ;EAAQ;EACtE,wBAAwB,EACtB,SAAS,OAAO,QAAQ;GACtB,iBAAiB,IAAI,MAAM,SAAS;EACtC,EACF;EACA,0BAA0B,EACxB,SAAS,OAAO,QAAQ;GACtB,iBAAiB,IAAI,MAAM,SAAS;EACtC,EACF;EACA,qBAAqB;GACnB,MAAM;GACN,SAAS,OAAO,QAAQ;IACtB,iBAAiB,IAAI,MAAM,SAAS;IACpC,OAAO,QAAQ,QAAQ,GAAG;GAC5B;EACF;EACA,wBAAwB,EACtB,UAAU,QAAQ;GAChB,YAAY,OACV,eAAe,IAAI,MAAM,WAAW,IAAI,MAAM,QAAQ,YAAY,CACpE;GACA,OAAO,QAAQ,QAAQ;EACzB,EACF;EACA,2BAA2B;GACzB,MAAM;GACN,SAAS;IACP,yBAAyB,OAAO,YAAY;KAC1C,MAAM,SAAU,MAAM,QAA0B;KAChD,OACE,QAAQ,WAAW,QAAQ,QAAQ,SAAS,UAC5C,QAAQ,YAAY,QAAQ,QAAQ,SAAS;IAEjD;IACA,qBAAqB;GACvB;GACA,SAAS,OAAO,QAAQ;IACtB,IAAI;KACF,OAAO,QAAQ,QAAQ;MAAE;MAAK,QAAQ,MAAM,kBAAkB,GAAG;KAAE,CAAC;IACtE,SAAS,OAAO;KACd,IAAI,QAAQ,UAAU;MAAE;MAAO,QAAQ,IAAI;KAAO,CAAC,GACjD,OAAO,QAAQ,QAAQ;MAAE;MAAK,QAAQ,KAAA;KAAU,CAAC;KACnD,MAAM;IACR;GACF;EACF;EACA,+BAA+B;GAC7B,SAAS;IACP,yBAAyB,OAAO,YAC9B,MAAM,QAAQ,iBAAiB,QAAQ,QAAQ,KAAK;IACtD,yBAAyB,OAAO,YAAY;KAC1C,MAAM,SAAU,MAAM,QAA0B;KAChD,OACE,QAAQ,WAAW,QAAQ,QAAQ,UACnC,QAAQ,YAAY,QAAQ,QAAQ;IAExC;IACA,qBAAqB;GACvB;GACA,SAAS;EACX;CACF;AACF;;AAGA,SAAgB,kBAId,SAAyD;CACzD,MAAM,EACJ,OAAO,YACP,OACA,OACA,cACA,YACA,UACA,iBACA,UACA,YACA,UACA,UACA,GAAG,kBACD;CACJ,MAAM,WAAW,eAAe;EAC9B,OAAO;EACP;EACA,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;EACvC,GAAI,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa;EACrD,GAAI,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW;EACjD,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;EAC7C,GAAI,oBAAoB,KAAA,IAAY,CAAC,IAAI,EAAE,gBAAgB;EAC3D,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;EAC7C,GAAI,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW;EACjD,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;CAC/C,CAAC;CACD,MAAM,SAAS,aAAa;EAC1B,GAAG;EACH,UAAU,WAAW;EACrB,UAAU;GAAE,GAAG;GAAU,GAAG;EAAS;CACvC,CAAC;CACD,oBAAoB,QAAQ,EAAE,iBAAiB,qBAAqB,CAAC;CACrE,OAAO;AACT"}
|
|
@@ -67,11 +67,30 @@ and continuation between steps. Responses have no step limit by default. Set
|
|
|
67
67
|
`maxSteps` to a positive integer to limit one complete assistant response.
|
|
68
68
|
Individual providers decide which model settings they support. `generation`
|
|
69
69
|
therefore excludes `stopWhen`, tool execution callbacks, tool callers, sandbox
|
|
70
|
-
execution, and the tool approval secret.
|
|
71
|
-
`toolsContext`,
|
|
72
|
-
durable execution context later, from the handler that runs it. Model-step
|
|
70
|
+
execution, and the tool approval secret. A2 preserves all other supplied
|
|
71
|
+
settings, including `toolsContext`, when calling the AI SDK. A local tool
|
|
72
|
+
reads its durable execution context later, from the handler that runs it. Model-step
|
|
73
73
|
timeouts are supported; tool-execution timeouts are not.
|
|
74
74
|
|
|
75
|
+
For AI Gateway models, the default generator sets
|
|
76
|
+
`generation.providerOptions.gateway.caching` to `'auto'`. A2 merges this
|
|
77
|
+
default with your provider options, with caller-supplied values taking
|
|
78
|
+
precedence. Other Gateway options and provider namespaces are preserved.
|
|
79
|
+
The same default applies to automatic compaction. A custom `generate`
|
|
80
|
+
function receives your original settings and owns its caching policy.
|
|
81
|
+
|
|
82
|
+
Gateway calls also send an `x-session-affinity` header derived from a SHA-256
|
|
83
|
+
hash of the agent name and session ID. The value stays stable across turns,
|
|
84
|
+
retries, worker restarts, and automatic compaction. No raw session identifier
|
|
85
|
+
is sent in this header. A caller-supplied `generation.headers` entry takes
|
|
86
|
+
precedence, regardless of header casing; an explicit `undefined` suppresses
|
|
87
|
+
A2's default header. Set overrides here, since A2's per-call default can
|
|
88
|
+
override headers configured on the model itself.
|
|
89
|
+
Affinity helps supporting providers reuse their cache; it does not select
|
|
90
|
+
Gateway's provider or guarantee a cache hit.
|
|
91
|
+
See [Gateway automatic caching](https://vercel.com/docs/ai-gateway/models-and-providers/automatic-caching)
|
|
92
|
+
for provider support and cache-write costs.
|
|
93
|
+
|
|
75
94
|
### Store assistant metadata
|
|
76
95
|
|
|
77
96
|
Extend the agent's `UIMessage` type to keep generation status and usage on the
|
package/package.json
CHANGED
package/src/ai-server.ts
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
import { createControlRuntime, ControlCancelled } from './ai-control-server.ts'
|
|
12
12
|
import type { ControlCommit } from './ai-control.ts'
|
|
13
13
|
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
14
|
+
import { createHash } from 'node:crypto'
|
|
14
15
|
import { asSchema, convertToModelMessages } from 'ai'
|
|
15
16
|
import type {
|
|
16
17
|
FinishReason,
|
|
@@ -336,10 +337,38 @@ async function generateWithAISDK<
|
|
|
336
337
|
M extends UIMessage,
|
|
337
338
|
D extends AIEventDefs<M> & EventDefs,
|
|
338
339
|
T extends ToolSet,
|
|
339
|
-
>(
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
340
|
+
>(options: {
|
|
341
|
+
agentName: string
|
|
342
|
+
context: AgentGenerateContext<M, D, T>
|
|
343
|
+
messageMetadata: AgentMessageMetadata<M, D, T> | undefined
|
|
344
|
+
}): Promise<GenerationSource> {
|
|
345
|
+
const { agentName, context, messageMetadata } = options
|
|
346
|
+
const headers = context.generation.headers ?? {}
|
|
347
|
+
const generation =
|
|
348
|
+
gatewayModelId(context.model) === undefined
|
|
349
|
+
? context.generation
|
|
350
|
+
: {
|
|
351
|
+
...context.generation,
|
|
352
|
+
headers: Object.keys(headers).some(
|
|
353
|
+
(key) => key.toLowerCase() === 'x-session-affinity',
|
|
354
|
+
)
|
|
355
|
+
? headers
|
|
356
|
+
: {
|
|
357
|
+
...headers,
|
|
358
|
+
'x-session-affinity': createHash('sha256')
|
|
359
|
+
.update(
|
|
360
|
+
JSON.stringify([agentName, context.request.sessionId]),
|
|
361
|
+
)
|
|
362
|
+
.digest('hex'),
|
|
363
|
+
},
|
|
364
|
+
providerOptions: {
|
|
365
|
+
...context.generation.providerOptions,
|
|
366
|
+
gateway: {
|
|
367
|
+
caching: 'auto',
|
|
368
|
+
...context.generation.providerOptions?.['gateway'],
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
}
|
|
343
372
|
const step = await generateAISDKStep<M, T>({
|
|
344
373
|
model: context.model,
|
|
345
374
|
tools: context.tools,
|
|
@@ -350,11 +379,12 @@ async function generateWithAISDK<
|
|
|
350
379
|
...(context.instructions === undefined
|
|
351
380
|
? {}
|
|
352
381
|
: { instructions: context.instructions }),
|
|
353
|
-
settings:
|
|
382
|
+
settings: generation,
|
|
354
383
|
...(messageMetadata === undefined
|
|
355
384
|
? {}
|
|
356
385
|
: {
|
|
357
|
-
messageMetadata: ({ part }) =>
|
|
386
|
+
messageMetadata: ({ part }) =>
|
|
387
|
+
messageMetadata({ ...context, generation, part }),
|
|
358
388
|
}),
|
|
359
389
|
})
|
|
360
390
|
return {
|
|
@@ -457,6 +487,7 @@ const summarize = async <
|
|
|
457
487
|
D extends AIEventDefs<M> & EventDefs,
|
|
458
488
|
T extends ToolSet,
|
|
459
489
|
>(options: {
|
|
490
|
+
agentName: string
|
|
460
491
|
context: AgentGenerateContext<M, D, T>
|
|
461
492
|
instructions: string | undefined
|
|
462
493
|
}): Promise<{ summary: string; usage?: LanguageModelUsage }> => {
|
|
@@ -498,8 +529,9 @@ const summarize = async <
|
|
|
498
529
|
return [name, definition]
|
|
499
530
|
}),
|
|
500
531
|
) as T
|
|
501
|
-
const source = await generateWithAISDK(
|
|
502
|
-
|
|
532
|
+
const source = await generateWithAISDK({
|
|
533
|
+
agentName: options.agentName,
|
|
534
|
+
context: {
|
|
503
535
|
...options.context,
|
|
504
536
|
generation,
|
|
505
537
|
tools,
|
|
@@ -509,8 +541,8 @@ const summarize = async <
|
|
|
509
541
|
],
|
|
510
542
|
responseMessageId: `${options.context.generationId}:summary`,
|
|
511
543
|
},
|
|
512
|
-
undefined,
|
|
513
|
-
)
|
|
544
|
+
messageMetadata: undefined,
|
|
545
|
+
})
|
|
514
546
|
let summary = ''
|
|
515
547
|
let calledTool = false
|
|
516
548
|
let finish: AgentGenerationFinish | undefined
|
|
@@ -1663,6 +1695,7 @@ export function createHandlers<
|
|
|
1663
1695
|
? {
|
|
1664
1696
|
messages: [] as M[],
|
|
1665
1697
|
...(await summarize({
|
|
1698
|
+
agentName: options.agent.contract.name,
|
|
1666
1699
|
context: baseContext,
|
|
1667
1700
|
instructions: policy.instructions,
|
|
1668
1701
|
})),
|
|
@@ -1765,7 +1798,11 @@ export function createHandlers<
|
|
|
1765
1798
|
const custom = options.generate !== undefined
|
|
1766
1799
|
const source =
|
|
1767
1800
|
options.generate === undefined
|
|
1768
|
-
? await generateWithAISDK(
|
|
1801
|
+
? await generateWithAISDK({
|
|
1802
|
+
agentName: options.agent.contract.name,
|
|
1803
|
+
context: generateContext,
|
|
1804
|
+
messageMetadata: options.messageMetadata,
|
|
1805
|
+
})
|
|
1769
1806
|
: { stream: await options.generate(generateContext) }
|
|
1770
1807
|
const updates = consumeGeneration({
|
|
1771
1808
|
source,
|