experimental-a2 0.16.0 → 0.16.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.
@@ -1 +1 @@
1
- {"version":3,"file":"ai-server.js","names":["errorMessage"],"sources":["../src/ai-coordinator.ts","../src/ai-control-server.ts","../src/ai-context-schema.ts","../src/ai-context.ts","../src/ai-sdk-step.ts","../src/ai-model-metadata.ts","../src/ai-input-tokens.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 GenerationReason,\n GenerationStartedPayload,\n InputRequestedPayload,\n InputRespondedPayload,\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\ntype CompletedCall = Pick<\n ToolCalledPayload,\n | 'requestId'\n | 'generationId'\n | 'messageId'\n | 'toolCallId'\n | 'toolName'\n | 'providerExecuted'\n | 'supportsDeferredResults'\n>\n\nexport type CoordinatorCall = {\n approval?: ApprovalRequestedPayload\n response?: ApprovalRespondedPayload\n work?: ControlWork\n} & (\n | { call: ToolCalledPayload; terminal: false }\n | { call: CompletedCall; terminal: true }\n)\n\nconst completeCall = (candidate: CoordinatorCall): CoordinatorCall => {\n const {\n requestId,\n generationId,\n messageId,\n toolCallId,\n toolName,\n providerExecuted,\n supportsDeferredResults,\n } = candidate.call\n return {\n terminal: true,\n call: {\n requestId,\n generationId,\n messageId,\n toolCallId,\n toolName,\n ...(providerExecuted === undefined ? {} : { providerExecuted }),\n ...(supportsDeferredResults === undefined\n ? {}\n : { supportsDeferredResults }),\n },\n ...(candidate.work === undefined ? {} : { work: candidate.work }),\n }\n}\n\nexport type CoordinatorResponse = {\n rootMessageId: string\n responseMessageId: string\n status: 'requested' | 'generating' | 'waiting' | 'failed'\n stepCount: number\n activeRequestId?: string\n requestReason: GenerationReason\n sourceGenerationId?: string\n generation?: GenerationStartedPayload\n source?: {\n generation: GenerationStartedPayload\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 unsettledTools?: Record<string, true>\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 = request.responseMessageId\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 requestReason: request.reason,\n ...(request.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: request.sourceGenerationId }),\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 request.sourceGenerationId !==\n state.response.generation?.generationId)) ||\n (request.sourceGenerationId !== undefined &&\n request.sourceGenerationId !==\n (state.response.generation ?? state.response.source?.generation)\n ?.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 return {\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'requested',\n stepCount: response.stepCount,\n activeRequestId: event.id,\n requestReason: request.reason,\n ...(request.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: request.sourceGenerationId }),\n ...(generation === undefined\n ? {}\n : {\n source: {\n generation,\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 ...(response.source === undefined ? {} : { source: response.source }),\n activeRequestId: generation.requestId,\n requestReason: response.requestReason,\n ...(response.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: response.sourceGenerationId }),\n calls: [],\n inputs: [],\n }))\n }\n case 'ai.generation.completed': {\n const completion = event.payload as GenerationCompletedPayload\n if (\n state.response?.generation?.requestId !== completion.requestId ||\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 response.generation.requestId === failure.requestId\n const ownsActiveStepLimit =\n failure.stepLimit === true &&\n response?.requestReason === 'tool' &&\n response.sourceGenerationId === failure.generationId &&\n response.source?.generation.requestId === failure.requestId &&\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 (\n state.response?.generation?.requestId !== call.requestId ||\n state.response.generation.generationId !== call.generationId\n ) {\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 (\n state.response?.generation?.requestId !== approval.requestId ||\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.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?.requestId !== approval.requestId ||\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?.requestId !== result.requestId ||\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 ? completeCall(candidate)\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?.requestId !== input.requestId ||\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 InputRespondedPayload\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?.requestId !== input.requestId ||\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.v6',\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'\nimport { aiEventId } from './ai-id.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 }): Promise<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.v4',\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 = async ({\n type,\n payload,\n id,\n }: {\n type: string\n payload: unknown\n id?: string\n }): Promise<void> => {\n const fact = {\n type,\n payload,\n id:\n id ??\n (await aiEventId('a2.ai.fact', ctx.event.id, String(facts.length))),\n }\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 = async ({\n lastSeenIndex,\n reason: interruptionReason,\n }: {\n lastSeenIndex: number | undefined\n reason: string | undefined\n }): Promise<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 await 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 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 message,\n generate: generate && message.role === 'user',\n ...(afterStepOf === undefined ? {} : { afterStepOf }),\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 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) reason = 'not-pending'\n else if (item.message.role !== command.message.role)\n reason = 'role-mismatch'\n else item.message = command.message\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 = 'not-pending'\n else state.inbox.items.splice(position, 1)\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 = 'not-pending'\n else if (\n command.beforeId !== null &&\n !state.inbox.items.some(\n (candidate) => candidate.id === command.beforeId,\n )\n )\n reason = 'not-pending'\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 = 'not-pending'\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 {\n selected.generate = true\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 await end({\n lastSeenIndex: command.lastSeenIndex,\n reason: undefined,\n })\n break\n case 'steer':\n insert({\n message: command.message,\n generate: true,\n first: true,\n afterStepOf: command.turnId,\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 await 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 await 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.requestId === command.result.requestId &&\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 await 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?.requestId === command.response.requestId &&\n candidate.approval.approvalId === 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 await emit({\n type: 'ai.approval.responded',\n payload: command.response,\n })\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?.requestId !== payload.requestId ||\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 await 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 await emit({\n type: 'ai.retry.requested',\n payload: command.request,\n })\n requestModel({\n request: {\n messageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'retry',\n },\n id: await aiEventId(\n 'a2.ai.request.retry',\n options.agent.contract.name,\n ctx.event.sessionId,\n command.request.retryId,\n ),\n })\n } else reason = 'stale-turn'\n break\n }\n }\n } else {\n const report = ctx.event.payload as WorkReport\n if (\n report.kind === 'tool' &&\n report.settled &&\n state.coordinator.unsettledTools\n ) {\n delete state.coordinator.unsettledTools[report.workId]\n if (Object.keys(state.coordinator.unsettledTools).length === 0)\n delete state.coordinator.unsettledTools\n }\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 await emit({\n type: event.type,\n payload: event.payload,\n id: event.id,\n })\n work.facts = [...(work.facts ?? []), event.id]\n }\n }\n if (report.settled) {\n work.settled = true\n delete work.facts\n }\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 await 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 = await aiEventId(\n 'a2.ai.tool.execution',\n ctx.event.id,\n call.call.generationId,\n call.call.toolCallId,\n )\n call.work = { id, version: active.version, settled: false }\n state.coordinator.unsettledTools = {\n ...state.coordinator.unsettledTools,\n [id]: true,\n }\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 await 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 sourceGenerationId = (\n response.generation ?? response.source?.generation\n )?.generationId\n const id =\n nextReason === 'tool'\n ? await aiEventId(\n 'a2.ai.request.tool',\n response.generation!.generationId,\n )\n : await aiEventId('a2.ai.request', ctx.event.id, nextReason)\n requestModel({\n request: {\n messageId: response.responseMessageId,\n responseMessageId: response.responseMessageId,\n reason: nextReason,\n ...(sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId }),\n },\n id,\n })\n } else if (naturalCompletion) {\n await 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 await emit({\n type: 'ai.message.created',\n payload: { message: item.message, generate: item.generate },\n id: await aiEventId(\n 'a2.ai.admitted',\n options.agent.contract.name,\n ctx.event.sessionId,\n item.id,\n ),\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 const requestId = await aiEventId(\n 'a2.ai.request.message',\n options.agent.contract.name,\n ctx.event.sessionId,\n item.id,\n )\n requestModel({\n request: {\n messageId: item.id,\n responseMessageId: requestId,\n reason: 'message',\n },\n id: requestId,\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 id: await aiEventId('a2.ai.control.committed', ctx.event.id),\n payload: controlCommit({ before, after: state, moves }),\n } as AppendInput<D>,\n ...jobs,\n {\n type: 'ai.control.decided',\n id: await aiEventId('a2.ai.control.decided', ctx.event.id),\n payload: receipt,\n } as AppendInput<D>,\n ]\n }\n\n const report = async ({\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 }): Promise<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: await aiEventId(\n 'a2.ai.report',\n ctx.event.id,\n String(ctx.attempt),\n name,\n ),\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: await Promise.all(\n events\n .filter(\n (event) =>\n event.type !== 'ai.message.completed' &&\n event.type !== 'ai.message.interrupted',\n )\n .map(async (event, index) => ({\n type: event.type,\n payload: event.payload,\n id:\n event.id ??\n (await aiEventId(\n 'a2.ai.work.fact',\n ctx.event.id,\n String(ctx.attempt),\n name,\n String(index),\n )),\n })),\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 = await 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 }): Promise<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 type { UIMessage } from 'ai'\nimport { events } from './ai.ts'\nimport type { AIContextState } from './ai-context.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { validateSync } from './validate.ts'\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\nconst index = (value: unknown): value is number =>\n typeof value === 'number' && Number.isSafeInteger(value) && value >= 0\nconst id = (value: unknown): value is string =>\n typeof value === 'string' && value.length > 0\nconst nullableId = (value: unknown): boolean => value === null || id(value)\nconst matches = (schema: StandardSchemaV1<unknown>, value: unknown): boolean =>\n validateSync(schema, value, 'AI context checkpoint').issues === undefined\nconst isMessage = (value: unknown): value is UIMessage =>\n matches(events['ai.message.created'], { message: value })\nconst indexes = (value: unknown, messages: readonly UIMessage[]): boolean =>\n record(value) &&\n Object.values(value).every(index) &&\n messages.every((message) => Object.hasOwn(value, message.id))\n\nconst compaction = (value: unknown): boolean =>\n value === null ||\n (record(value) &&\n Object.keys(value).every((key) =>\n [\n 'status',\n 'generationId',\n 'throughMessageId',\n 'throughIndex',\n 'summary',\n ].includes(key),\n ) &&\n ['running', 'completed'].includes(String(value['status'])) &&\n id(value['generationId']) &&\n id(value['throughMessageId']) &&\n index(value['throughIndex']) &&\n (value['summary'] === undefined || typeof value['summary'] === 'string'))\n\nconst progress = (value: unknown): boolean => {\n if (\n !record(value) ||\n !index(value['length']) ||\n !Array.isArray(value['tail']) ||\n !Array.isArray(value['blocks'])\n )\n return false\n const pending = [\n ...value['blocks'].toReversed().filter((block) => block !== null),\n value['tail'],\n ].toReversed()\n const seen = new Set<object>()\n let count = 0\n let last = -1\n while (pending.length > 0) {\n const block: unknown = pending.pop()\n if (typeof block !== 'object' || block === null || seen.has(block))\n return false\n seen.add(block)\n if (Array.isArray(block)) {\n for (const batch of block) {\n if (\n !record(batch) ||\n !index(batch['index']) ||\n batch['index'] <= last ||\n !Array.isArray(batch['chunks']) ||\n !batch['chunks'].every(\n (chunk) => record(chunk) && typeof chunk['type'] === 'string',\n )\n )\n return false\n count += 1\n last = batch['index']\n }\n } else if (\n record(block) &&\n Object.keys(block).length === 2 &&\n Object.hasOwn(block, 'left') &&\n Object.hasOwn(block, 'right')\n )\n pending.push(block['right'], block['left'])\n else return false\n }\n return count === value['length']\n}\n\nconst indexedEvents = (\n value: unknown,\n types: (keyof typeof events)[],\n): boolean =>\n Array.isArray(value) &&\n value.every(\n (event) =>\n record(event) &&\n index(event['index']) &&\n types.includes(event['type'] as keyof typeof events) &&\n matches(\n events[\n event['type'] as keyof typeof events\n ] as StandardSchemaV1<unknown>,\n event['payload'],\n ),\n )\n\nconst projection = (value: unknown, messages: UIMessage[]): boolean => {\n if (\n !record(value) ||\n Object.keys(value).some(\n (key) =>\n ![\n 'generationId',\n 'responseMessageId',\n 'promptThroughIndex',\n 'completionIndex',\n 'baseMessage',\n 'baseCompaction',\n 'batches',\n 'toolEvents',\n 'approvalEvents',\n 'cursor',\n ].includes(key),\n ) ||\n !id(value['generationId']) ||\n !id(value['responseMessageId']) ||\n !index(value['promptThroughIndex']) ||\n (value['completionIndex'] !== undefined &&\n !index(value['completionIndex'])) ||\n (value['baseMessage'] !== undefined && !isMessage(value['baseMessage'])) ||\n (value['baseCompaction'] !== undefined &&\n !compaction(value['baseCompaction'])) ||\n !progress(value['batches']) ||\n !indexedEvents(value['toolEvents'], ['ai.tool.called', 'ai.tool.result']) ||\n !indexedEvents(value['approvalEvents'], [\n 'ai.approval.requested',\n 'ai.approval.responded',\n ])\n )\n return false\n const cursor = value['cursor']\n if (cursor === undefined || cursor === null) return true\n if (\n !record(cursor) ||\n !index(cursor['throughIndex']) ||\n !record(cursor['stream'])\n )\n return false\n const stream = cursor['stream']\n const current = messages.find(\n (message) => message.id === value['responseMessageId'],\n )\n if (\n !current ||\n !['text', 'reasoning'].every(\n (key) =>\n record(stream[key]) &&\n Object.values(stream[key]).every(\n (part) => index(part) && part < current.parts.length,\n ),\n ) ||\n !record(stream['tools'])\n )\n return false\n return Object.values(stream['tools']).every(\n (tool) =>\n record(tool) &&\n typeof tool['text'] === 'string' &&\n typeof tool['toolName'] === 'string' &&\n typeof tool['dynamic'] === 'boolean',\n )\n}\n\nconst authority = (value: unknown): boolean =>\n value === null ||\n (record(value) &&\n Object.keys(value).every((key) =>\n [\n 'requestId',\n 'responseMessageId',\n 'sourceGenerationId',\n 'requestReason',\n 'phase',\n ].includes(key),\n ) &&\n ['requestId', 'responseMessageId', 'sourceGenerationId'].every((key) =>\n nullableId(value[key]),\n ) &&\n (value['requestReason'] === null ||\n ['message', 'tool', 'input', 'resume', 'retry'].includes(\n String(value['requestReason']),\n )) &&\n (value['phase'] === null ||\n [\n 'starting',\n 'generating',\n 'tools',\n 'waiting',\n 'failed',\n 'pausing',\n 'paused',\n ].includes(String(value['phase']))))\n\nexport const contextSchema = <M extends UIMessage>(): StandardSchemaV1<\n AIContextState<M>\n> => ({\n '~standard': {\n version: 1,\n vendor: 'a2-context',\n validate(value) {\n const invalid = { issues: [{ message: 'invalid AI model context' }] }\n const keys = [\n 'messages',\n 'compaction',\n 'modelMetadata',\n 'closed',\n 'authority',\n 'generation',\n 'activeProjection',\n 'messageIndexes',\n ]\n try {\n if (\n !record(value) ||\n keys.some((key) => !Object.hasOwn(value, key)) ||\n Object.keys(value).some((key) => !keys.includes(key))\n )\n return invalid\n const messages = value['messages']\n const metadata = value['modelMetadata']\n const generation = value['generation']\n const current = value['activeProjection']\n if (\n !Array.isArray(messages) ||\n !messages.every(isMessage) ||\n !compaction(value['compaction']) ||\n typeof value['closed'] !== 'boolean' ||\n !authority(value['authority']) ||\n !record(metadata) ||\n !Object.entries(metadata).every(\n ([modelId, entry]) =>\n record(entry) &&\n (entry['status'] === 'pending' ||\n entry['status'] === 'unavailable' ||\n (entry['status'] === 'resolved' &&\n matches(events['ai.model.metadata.resolved'], {\n modelId,\n limits: entry['limits'],\n }))),\n ) ||\n !indexes(value['messageIndexes'], messages)\n )\n return invalid\n if (\n generation !== null &&\n (!record(generation) ||\n !matches(events['ai.generation.started'], generation['owner']) ||\n ![\n 'streaming',\n 'completed',\n 'paused',\n 'failed',\n 'superseded',\n ].includes(String(generation['phase'])) ||\n (generation['responseIndex'] !== undefined &&\n !index(generation['responseIndex'])) ||\n (generation['phase'] === 'failed' &&\n typeof generation['error'] !== 'string'))\n )\n return invalid\n const owner =\n record(generation) && record(generation['owner'])\n ? generation['owner']\n : undefined\n if (\n current !== null &&\n (!projection(current, messages) ||\n !record(current) ||\n current['generationId'] !== owner?.['generationId'] ||\n current['responseMessageId'] !== owner?.['responseMessageId'])\n )\n return invalid\n if (\n generation !== null &&\n (generation as Record<string, unknown>)['phase'] !== 'superseded' &&\n current === null\n )\n return invalid\n if (value['closed'] && (generation !== null || current !== null))\n return invalid\n return { value: value as AIContextState<M> }\n } catch {\n return invalid\n }\n },\n },\n})\n","import type { UIMessage } from 'ai'\nimport type {\n AgentDefinition,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n CompactionCompletedPayload,\n CompactionRequestedPayload,\n CompactionState,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationRequestedPayload,\n GenerationStartedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ModelMetadataRequestedPayload,\n ModelMetadataResolvedPayload,\n ModelMetadataState,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { ControlCommit } from './ai-control.ts'\nimport { contextSchema } from './ai-context-schema.ts'\nimport type { ContractEvent, EventDefs } from './contract.ts'\nimport {\n projectedMessage,\n advanceProjection,\n reduceToolActivity,\n upsertMessage,\n upsertResponse,\n type MessageProjection,\n} from './ai-message-projection.ts'\nimport { interruptUIMessage, pauseUIMessage } from './ai-projector.ts'\nimport {\n flattenProgressBatches,\n progressBatches,\n} from './ai-progress-batches.ts'\nimport { storedAIReducer, type AIStoredReducer } from './ai-stored-state.ts'\n\nexport type AIModelContext<M extends UIMessage = UIMessage> = {\n messages: M[]\n compaction: Omit<\n CompactionState<M>,\n 'messages' | 'retainedMessageIds' | 'usage'\n > | null\n modelMetadata: Record<string, ModelMetadataState>\n}\n\nexport type AIContextState<M extends UIMessage> = AIModelContext<M> & {\n closed: boolean\n authority: Pick<\n ControlCommit['view'],\n | 'requestId'\n | 'requestReason'\n | 'sourceGenerationId'\n | 'responseMessageId'\n | 'phase'\n > | null\n generation: {\n owner: GenerationStartedPayload\n phase: 'streaming' | 'completed' | 'paused' | 'failed' | 'superseded'\n error?: string\n responseIndex?: number\n } | null\n activeProjection: MessageProjection<M> | null\n messageIndexes: Record<string, number>\n}\n\nconst replaceResponse = <M extends UIMessage>({\n state,\n message,\n index,\n}: {\n state: AIContextState<M>\n message: M\n index: number\n}): AIContextState<M> => {\n let messages = upsertResponse({\n messages: state.messages,\n message,\n inputId: state.generation!.owner.messageId,\n })\n if (\n state.generation?.responseIndex !== undefined &&\n !state.messages.some((item) => item.id === message.id)\n ) {\n messages = messages.filter((item) => item.id !== message.id)\n messages.splice(state.generation.responseIndex, 0, message)\n }\n return {\n ...state,\n messages,\n messageIndexes: Object.hasOwn(state.messageIndexes, message.id)\n ? state.messageIndexes\n : { ...state.messageIndexes, [message.id]: index },\n }\n}\n\nconst calledTools = <M extends UIMessage>(\n projection: MessageProjection<M>,\n): Set<string> =>\n new Set([\n ...(projection.baseMessage?.parts.flatMap((part) =>\n 'toolCallId' in part ? [part.toolCallId] : [],\n ) ?? []),\n ...projection.toolEvents\n .filter((event) => event.type === 'ai.tool.called')\n .map((event) => event.payload.toolCallId),\n ])\n\nconst renderProjection = <M extends UIMessage>({\n state,\n index,\n}: {\n state: AIContextState<M>\n index: number\n}): AIContextState<M> => {\n const projection = state.activeProjection!\n let message = projectedMessage(projection)\n if (\n projection.baseMessage === undefined &&\n projection.batches.length === 0 &&\n message.parts.length === 0\n )\n return state\n if (state.generation?.phase === 'paused')\n message = pauseUIMessage({ message, toolCallIds: calledTools(projection) })\n if (state.generation?.phase === 'failed')\n message = interruptUIMessage(\n message,\n `Generation failed before tool completion: ${state.generation.error}`,\n )\n return replaceResponse({\n state: { ...state, activeProjection: { ...projection, cursor: null } },\n message,\n index,\n })\n}\n\nexport const generationBase = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => {\n const projection = state.activeProjection\n if (!projection) return state\n return {\n ...state,\n messages:\n projection.baseMessage === undefined\n ? state.messages.filter(\n (message) => message.id !== projection.responseMessageId,\n )\n : upsertMessage(state.messages, projection.baseMessage),\n compaction: projection.baseCompaction ?? null,\n }\n}\n\nexport const contextForAttempt = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => ({\n ...(state.activeProjection?.completionIndex === undefined\n ? generationBase(state)\n : state),\n generation: state.generation && { ...state.generation, phase: 'superseded' },\n activeProjection: null,\n})\n\nconst endGeneration = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => ({\n ...state,\n authority: null,\n generation: null,\n activeProjection: null,\n})\n\nconst ownsGeneration = <M extends UIMessage>(\n state: AIContextState<M>,\n owner: { generationId: string; requestId: string },\n): boolean =>\n state.generation?.owner.generationId === owner.generationId &&\n state.generation.owner.requestId === owner.requestId &&\n state.generation.phase !== 'superseded'\n\nexport const createContextReducer = <M extends UIMessage, D extends EventDefs>({\n agent,\n}: {\n agent: AgentDefinition<M, D>\n}): AIStoredReducer<D, AIContextState<M>> => {\n const initialState: AIContextState<M> = {\n messages: [],\n compaction: null,\n modelMetadata: {},\n closed: false,\n authority: null,\n generation: null,\n activeProjection: null,\n messageIndexes: {},\n }\n const reducer = agent.contract\n .reducer({\n name: 'a2.ai.context.v3',\n initialState,\n stateSchema: contextSchema<M>(),\n })\n .fold((state, event) => reduceContext(state, event))\n return storedAIReducer(reducer)\n}\n\nconst reduceContext = <M extends UIMessage, D extends EventDefs>(\n state: AIContextState<M>,\n event: ContractEvent<D>,\n): AIContextState<M> => {\n if (state.closed) return state\n switch (event.type) {\n case 'ai.control.committed': {\n const { view } = event.payload as ControlCommit\n const {\n requestId,\n requestReason,\n sourceGenerationId,\n responseMessageId,\n phase,\n } = view\n const next = {\n ...state,\n authority: {\n requestId,\n requestReason,\n sourceGenerationId,\n responseMessageId,\n phase,\n },\n closed: view.closed,\n }\n return view.closed ? endGeneration(next) : next\n }\n case 'ai.session.closed':\n return endGeneration({\n ...state,\n closed: true,\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection?.baseCompaction ?? null)\n : state.compaction,\n })\n case 'ai.message.created': {\n const { message } = event.payload as MessageCreatedPayload<M>\n return {\n ...state,\n messages: upsertMessage(state.messages, message),\n activeProjection:\n state.activeProjection?.responseMessageId === message.id\n ? { ...state.activeProjection, cursor: null }\n : state.activeProjection,\n messageIndexes: { ...state.messageIndexes, [message.id]: event.index },\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (\n state.authority?.requestId !== event.id ||\n request.responseMessageId !== state.authority.responseMessageId ||\n request.reason !== state.authority.requestReason ||\n (request.sourceGenerationId ?? null) !==\n state.authority.sourceGenerationId ||\n request.reason !== 'retry'\n )\n return state\n return contextForAttempt(state)\n }\n case 'ai.generation.started': {\n const owner = event.payload as GenerationStartedPayload\n if (\n state.authority?.requestId !== owner.requestId ||\n state.authority.responseMessageId !== owner.responseMessageId ||\n state.authority.phase === 'paused' ||\n state.authority.phase === 'pausing'\n )\n return state\n const previous = state.generation\n if (\n previous?.owner.requestId === owner.requestId &&\n (previous.owner.attempt >= owner.attempt ||\n previous.phase === 'failed' ||\n previous.phase === 'completed' ||\n state.activeProjection?.completionIndex !== undefined)\n )\n return state\n const base =\n previous?.owner.requestId === owner.requestId\n ? generationBase(state)\n : state\n const baseMessage = base.messages.find(\n (message) => message.id === owner.responseMessageId,\n )\n return {\n ...base,\n generation: {\n owner,\n phase: 'streaming',\n ...(previous?.owner.responseMessageId === owner.responseMessageId &&\n previous.responseIndex !== undefined\n ? { responseIndex: previous.responseIndex }\n : {}),\n },\n activeProjection: {\n generationId: owner.generationId,\n responseMessageId: owner.responseMessageId,\n promptThroughIndex: owner.promptThroughIndex ?? event.index - 1,\n ...(baseMessage === undefined ? {} : { baseMessage }),\n baseCompaction: base.compaction,\n batches: progressBatches(),\n toolEvents: [],\n approvalEvents: [],\n },\n }\n }\n case 'ai.generation.progress': {\n const payload = event.payload as GenerationProgressPayload\n if (\n !ownsGeneration(state, payload) ||\n state.generation!.owner.responseMessageId !==\n payload.responseMessageId ||\n state.generation!.phase !== 'streaming' ||\n !state.activeProjection\n )\n return state\n const projection = state.activeProjection\n const progress = advanceProjection({\n projection,\n base: state.messages.find(\n (message) => message.id === projection.responseMessageId,\n ),\n chunks: payload.chunks,\n index: event.index,\n })\n return replaceResponse({\n state: {\n ...state,\n activeProjection: {\n ...projection,\n batches: progress.batches,\n cursor: progress.cursor,\n },\n },\n message: progress.message,\n index: event.index,\n })\n }\n case 'ai.generation.completed': {\n const payload = event.payload as GenerationCompletedPayload\n if (\n !ownsGeneration(state, payload) ||\n state.generation!.phase !== 'streaming'\n )\n return state\n return {\n ...state,\n generation: { ...state.generation!, phase: 'completed' },\n activeProjection: {\n ...state.activeProjection!,\n completionIndex: event.index,\n cursor: null,\n },\n }\n }\n case 'ai.generation.failed': {\n const payload = event.payload as GenerationFailedPayload\n if (!ownsGeneration(state, payload)) return state\n if (\n state.generation!.phase !== 'streaming' &&\n !(\n payload.stepLimit &&\n state.authority?.requestReason === 'tool' &&\n state.authority.sourceGenerationId === payload.generationId\n )\n )\n return state\n if (payload.superseded) {\n const next = generationBase(state)\n return {\n ...next,\n generation: { ...state.generation!, phase: 'superseded' },\n activeProjection: null,\n }\n }\n return renderProjection({\n state: {\n ...state,\n compaction: state.activeProjection?.baseCompaction ?? null,\n generation: {\n ...state.generation!,\n phase: 'failed',\n error: payload.error,\n },\n },\n index: event.index,\n })\n }\n case 'ai.message.interrupted': {\n const payload = event.payload as MessageInterruptedPayload\n const owner = state.generation?.owner\n const ownsRequest =\n payload.requestId !== undefined &&\n payload.requestId === state.authority?.requestId &&\n payload.messageId === state.authority.responseMessageId\n const ownsOwner =\n owner?.responseMessageId === payload.messageId &&\n (payload.generationId === owner.generationId ||\n payload.requestId === owner.requestId)\n if (!ownsRequest && !ownsOwner) return state\n if (\n ownsOwner &&\n state.authority?.requestId !== owner!.requestId &&\n !ownsRequest\n )\n return state\n const projection = state.activeProjection\n if (!projection) return endGeneration(state)\n const cutoff = payload.lastSeenIndex ?? Number.POSITIVE_INFINITY\n const retained = {\n ...projection,\n batches: progressBatches(\n flattenProgressBatches(projection.batches).filter(\n (batch) => batch.index <= cutoff,\n ),\n ),\n toolEvents: projection.toolEvents.filter(\n (item) => item.index <= cutoff,\n ),\n approvalEvents: projection.approvalEvents.filter(\n (item) => item.index <= cutoff,\n ),\n }\n let next = generationBase(state)\n if (retained.baseMessage !== undefined || retained.batches.length > 0)\n next = replaceResponse({\n state: next,\n message: interruptUIMessage(projectedMessage(retained)),\n index: event.index,\n })\n return endGeneration(next)\n }\n case 'ai.message.completed': {\n const { messageId } = event.payload as { messageId: string }\n return state.generation?.owner.responseMessageId === messageId &&\n state.generation.phase !== 'failed' &&\n state.generation.phase !== 'superseded'\n ? endGeneration(state)\n : state\n }\n case 'ai.generation.paused': {\n const { generationId } = event.payload as { generationId: string }\n if (\n state.generation?.owner.generationId !== generationId ||\n state.generation.phase === 'failed' ||\n state.generation.phase === 'superseded' ||\n !state.activeProjection\n )\n return state\n const toolCallIds = calledTools(state.activeProjection)\n return renderProjection({\n state: {\n ...state,\n generation: { ...state.generation, phase: 'paused' },\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection.baseCompaction ?? null)\n : state.compaction,\n activeProjection: {\n ...state.activeProjection,\n cursor: null,\n batches: progressBatches(\n flattenProgressBatches(state.activeProjection.batches).map(\n (batch) => ({\n index: batch.index,\n chunks: batch.chunks.filter(\n (chunk) =>\n !('toolCallId' in chunk) ||\n toolCallIds.has(chunk.toolCallId),\n ),\n }),\n ),\n ),\n },\n },\n index: event.index,\n })\n }\n case 'ai.tool.called':\n case 'ai.tool.result': {\n const payload = event.payload as ToolCalledPayload | ToolResultPayload\n if (\n !ownsGeneration(state, payload) ||\n !state.activeProjection ||\n state.generation!.owner.responseMessageId !== payload.messageId\n )\n return state\n if (state.generation!.phase === 'failed') {\n const result = payload as ToolResultPayload\n const running = state.activeProjection.toolEvents\n .reduce(\n (tools, item) => reduceToolActivity(tools, item),\n [] as ReturnType<typeof reduceToolActivity>,\n )\n .some(\n (tool) =>\n tool.toolCallId === payload.toolCallId &&\n tool.status === 'running',\n )\n if (event.type !== 'ai.tool.result' || result.preliminary || !running)\n return state\n }\n const toolEvent =\n event.type === 'ai.tool.called'\n ? {\n index: event.index,\n type: 'ai.tool.called' as const,\n payload: payload as ToolCalledPayload,\n }\n : {\n index: event.index,\n type: 'ai.tool.result' as const,\n payload: payload as ToolResultPayload,\n }\n const next = {\n ...state,\n activeProjection: {\n ...state.activeProjection,\n toolEvents: [...state.activeProjection.toolEvents, toolEvent],\n },\n }\n if (event.type === 'ai.tool.called') return next\n next.activeProjection.cursor = null\n return renderProjection({ state: next, index: event.index })\n }\n case 'ai.approval.requested':\n case 'ai.approval.responded': {\n const payload = event.payload as\n ApprovalRequestedPayload | ApprovalRespondedPayload\n if (\n !ownsGeneration(state, payload) ||\n !state.activeProjection ||\n state.generation!.phase === 'failed' ||\n state.generation!.owner.responseMessageId !== payload.messageId\n )\n return state\n const approvalEvent =\n event.type === 'ai.approval.requested'\n ? {\n index: event.index,\n type: 'ai.approval.requested' as const,\n payload: payload as ApprovalRequestedPayload,\n }\n : {\n index: event.index,\n type: 'ai.approval.responded' as const,\n payload: payload as ApprovalRespondedPayload,\n }\n return renderProjection({\n state: {\n ...state,\n activeProjection: {\n ...state.activeProjection,\n cursor: null,\n approvalEvents: [\n ...state.activeProjection.approvalEvents,\n approvalEvent,\n ],\n },\n },\n index: event.index,\n })\n }\n case 'ai.compaction.requested': {\n const payload = event.payload as CompactionRequestedPayload\n if (\n state.generation?.owner.generationId !== payload.generationId ||\n state.generation.phase !== 'streaming'\n )\n return state\n return {\n ...state,\n compaction: {\n status: 'running',\n generationId: payload.generationId,\n throughMessageId: payload.throughMessageId,\n throughIndex:\n payload.throughIndex ?? state.activeProjection!.promptThroughIndex!,\n },\n }\n }\n case 'ai.compaction.completed': {\n const payload = event.payload as CompactionCompletedPayload<M>\n const projection = state.activeProjection\n if (\n state.generation?.owner.generationId !== payload.generationId ||\n state.generation.phase !== 'streaming' ||\n state.compaction?.status !== 'running' ||\n state.compaction.generationId !== payload.generationId ||\n !projection\n )\n return state\n const throughIndex =\n payload.throughIndex ?? projection.promptThroughIndex!\n const replacements = new Set(\n payload.messages.map((message) => message.id),\n )\n const retained = new Set(payload.retainedMessageIds ?? [])\n const messages = [\n ...payload.messages,\n ...state.messages.filter(\n (message) =>\n !replacements.has(message.id) &&\n (retained.has(message.id) ||\n (state.messageIndexes[message.id] ?? 0) > throughIndex),\n ),\n ]\n const activeProjection = { ...projection, cursor: null }\n delete activeProjection.baseMessage\n const baseMessage = messages.find(\n (message) => message.id === projection.responseMessageId,\n )\n if (baseMessage !== undefined) activeProjection.baseMessage = baseMessage\n const compaction: AIModelContext<M>['compaction'] = {\n status: 'completed',\n generationId: payload.generationId,\n throughMessageId: payload.throughMessageId,\n throughIndex,\n ...(payload.summary === undefined ? {} : { summary: payload.summary }),\n }\n activeProjection.baseCompaction = compaction\n return {\n ...state,\n messages,\n compaction,\n generation: {\n ...state.generation,\n responseIndex: payload.messages.length,\n },\n activeProjection,\n messageIndexes: Object.fromEntries(\n messages.map((message) => [\n message.id,\n replacements.has(message.id)\n ? throughIndex\n : state.messageIndexes[message.id]!,\n ]),\n ),\n }\n }\n case 'ai.model.metadata.requested': {\n const { modelId } = event.payload as ModelMetadataRequestedPayload\n return Object.hasOwn(state.modelMetadata, modelId)\n ? state\n : {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]: { status: 'pending' },\n },\n }\n }\n case 'ai.model.metadata.resolved': {\n const { modelId, limits } = event.payload as ModelMetadataResolvedPayload\n return {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]:\n limits === null\n ? { status: 'unavailable' }\n : { status: 'resolved', limits },\n },\n }\n }\n default:\n return state\n }\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","import { Buffer } from 'node:buffer'\nimport { asSchema } from 'ai'\nimport type { Instructions, ModelMessage, ToolSet } from 'ai'\nimport type { AICoordinatorState } from './ai-coordinator.ts'\n\nconst withoutProviderOptions = <T extends object>(value: T): T => {\n const result = { ...value }\n Reflect.deleteProperty(result, 'providerOptions')\n return result\n}\n\nconst estimatedMessage = (message: ModelMessage): unknown => ({\n ...withoutProviderOptions(message),\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) =>\n part.type === 'tool-result'\n ? {\n ...withoutProviderOptions(part),\n output: {\n ...withoutProviderOptions(part.output),\n ...(part.output.type === 'content'\n ? {\n value: part.output.value.map(withoutProviderOptions),\n }\n : {}),\n },\n }\n : withoutProviderOptions(part),\n ),\n})\n\nexport const 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 const instructions = options.instructions\n return Math.ceil(\n Buffer.byteLength(\n JSON.stringify({\n messages: options.messages.map(estimatedMessage),\n instructions:\n instructions === undefined || typeof instructions === 'string'\n ? instructions\n : Array.isArray(instructions)\n ? instructions.map(estimatedMessage)\n : estimatedMessage(instructions),\n tools,\n }),\n 'utf8',\n ) / 4,\n )\n}\n\nexport const 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.ceil(previous.inputTokens + options.estimate - previous.estimate)\n : options.estimate\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 {\n createContextReducer,\n contextForAttempt,\n generationBase,\n type AIContextState,\n type AIModelContext,\n} from './ai-context.ts'\nimport type { Reducer } from './reducer.ts'\nimport { aiStateReducer } from './ai-stored-state.ts'\nimport { aiEventId, AI_EVENT_ID_PREFIX } from './ai-id.ts'\nimport type { ControlCommit, ControlCommand } from './ai-control.ts'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { createHash } from 'node:crypto'\nimport { convertToModelMessages, isToolUIPart } 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 { estimateInputTokens, measuredInputTokens } from './ai-input-tokens.ts'\nimport type {\n AIEventDefs,\n AgentDefinition,\n AgentToolContext,\n AgentToolEventDefs,\n ApprovalRequestedPayload,\n CompactionCompletedPayload,\n CompactionRequestedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationStartedPayload,\n MessageCompletedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { AICoordinatorState } 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 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 messages: 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 reducer: Reducer<D, AIContextState<M>>\n state: AIContextState<M>\n events: ContractEvent<D>[]\n}): AIContextState<M> => {\n let state = options.state\n for (const event of options.events) state = options.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: await aiEventId(\n 'a2.ai.summary',\n options.context.generationId,\n ),\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: AIModelContext<M>,\n): AIModelContext<M>['compaction'] => {\n const compaction = state.compaction\n return compaction?.status === 'completed' ? compaction : null\n}\n\nconst contextMessages = <M extends UIMessage>({\n state,\n coordinator,\n}: {\n state: AIModelContext<M>\n coordinator: AICoordinatorState\n}): M[] => {\n const queued = new Set(coordinator.queued.map((item) => item.messageId))\n return state.messages.filter((message) => !queued.has(message.id))\n}\n\nconst modelContext = async <M extends UIMessage>(options: {\n messages: M[]\n state: AIModelContext<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\ntype ToolCallClassification = 'automatic' | 'approval' | 'unknown'\n\ntype PendingToolCall = {\n call: ToolCalledPayload\n classification: ToolCallClassification\n}\n\nconst toolCalledEvent = async <D extends EventDefs>(\n payload: ToolCalledPayload,\n): Promise<AppendInput<D>> =>\n ({\n type: 'ai.tool.called',\n id: await aiEventId(\n 'a2.ai.tool.called',\n payload.generationId,\n payload.toolCallId,\n ),\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 = async <\n D extends EventDefs,\n T extends ToolSet,\n>(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}): Promise<{ 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 = async (toolCallId: string): Promise<void> => {\n const pendingCall = take(toolCallId)\n if (pendingCall) result.push(await toolCalledEvent<D>(pendingCall.call))\n }\n for (const [chunkIndex, chunk] of options.chunks.entries()) {\n const resultId = (): Promise<string> =>\n aiEventId(\n 'a2.ai.tool.stream-result',\n options.generationId,\n String(options.sequence),\n String(chunkIndex),\n )\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(await 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(await toolCalledEvent<D>(called), {\n type: 'ai.tool.result',\n id: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-available') {\n await 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: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-error') {\n await 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: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-denied') {\n await 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: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-request') {\n await flush(chunk.toolCallId)\n const payload: ApprovalRequestedPayload = {\n requestId: options.requestId,\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: await aiEventId(\n 'a2.ai.approval.requested',\n options.generationId,\n chunk.approvalId,\n ),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-response') {\n result.push({\n type: 'ai.approval.responded',\n id: await aiEventId(\n 'a2.ai.approval.automatic-response',\n options.generationId,\n chunk.approvalId,\n ),\n payload: {\n requestId: options.requestId,\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\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 contextReducer = createContextReducer({ agent: options.agent })\n const readContext = async (\n session: HandlerContext<D>['session'],\n through: number | 'latest',\n ) => {\n const snapshot = await session.state(contextReducer, { through })\n return { state: contextReducer.view(snapshot.state), index: snapshot.index }\n }\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 = async (\n call: ToolCalledPayload,\n suffix: string,\n result: {\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n },\n ): Promise<AppendInput<D>> =>\n ({\n type: 'ai.tool.result',\n id: await aiEventId(\n 'a2.ai.tool.result',\n call.generationId,\n call.toolCallId,\n suffix,\n ),\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 = await readContext(ctx.session, ctx.event.index)\n if (\n snapshot.state.generation?.owner.generationId !== owner.generationId ||\n snapshot.state.generation.owner.requestId !== owner.requestId ||\n snapshot.state.activeProjection?.generationId !== owner.generationId\n )\n throw new TypeError(\n 'Tool prompt checkpoint does not own its generation',\n )\n const state = generationBase(snapshot.state)\n return modelContext({\n messages: state.messages.filter(\n (message) => state.messageIndexes[message.id]! <= frontier,\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 = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n error: unknown,\n ): Promise<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 await 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 readContext(ctx.session, 'latest')\n if (\n snapshot.state.closed ||\n snapshot.state.authority?.requestId !== requestId ||\n snapshot.state.authority?.phase === 'paused' ||\n snapshot.state.authority?.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 = await aiEventId(\n 'a2.ai.generation',\n requestId,\n String(attempt),\n )\n const responseMessageId = request.responseMessageId\n const responseStepCount = response.stepCount\n if (\n request.reason === 'tool' &&\n (request.sourceGenerationId !==\n response.source?.generation.generationId ||\n response.responseMessageId !== request.messageId ||\n response.responseMessageId !== request.responseMessageId)\n )\n return\n const previous = current\n const state =\n previous === undefined\n ? snapshot.state\n : contextForAttempt(snapshot.state)\n const resolverContext: AgentResolverContext<M, D> = {\n event: ctx.event,\n messages: contextMessages({ state, coordinator: coordinatorState }),\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: await aiEventId('a2.ai.step-limit', requestId),\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: await aiEventId(\n 'a2.ai.model.metadata',\n options.agent.contract.name,\n ctx.event.sessionId,\n catalogModelId,\n ),\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: await aiEventId('a2.ai.superseded', payload.generationId),\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 = contextMessages({\n state,\n coordinator: promptCoordinatorState,\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 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 let compactionEstimate:\n | Pick<\n CompactionRequestedPayload,\n 'inputTokenEstimate' | 'inputTokens' | 'thresholdTokens'\n >\n | undefined\n const hasPendingTools = messages.some((message) =>\n message.parts.some(\n (part) =>\n isToolUIPart(part) &&\n !(\n part.state === 'output-error' ||\n part.state === 'output-denied' ||\n (part.state === 'output-available' && part.preliminary !== true)\n ),\n ),\n )\n if (policy && !hasPendingTools) {\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 if (threshold !== undefined && shouldCompact) {\n compactionEstimate = {\n inputTokenEstimate,\n inputTokens,\n thresholdTokens: threshold,\n }\n }\n } else {\n shouldCompact = false\n }\n if (checkAbort(ctx.signal)) return\n if (shouldCompact) {\n const latest = (\n await ctx.session.state(coordinator, { through: 'latest' })\n ).state\n shouldCompact = Object.keys(latest.unsettledTools ?? {}).length === 0\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: await aiEventId(\n 'a2.ai.compaction.requested',\n generationId,\n ),\n payload: {\n generationId,\n throughMessageId,\n throughIndex,\n ...compactionEstimate,\n },\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: await aiEventId(\n 'a2.ai.compaction.completed',\n generationId,\n ),\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 reducer: contextReducer[aiStateReducer],\n events: generationEvents,\n state,\n })\n if (request.reason === 'retry' || previous !== undefined) {\n generationMessages = contextMessages({\n state: currentState,\n coordinator: promptCoordinatorState,\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 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 = await 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: await aiEventId(\n 'a2.ai.progress',\n generationId,\n String(sequence),\n ),\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: await aiEventId('a2.ai.completed', generationId),\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 = await Promise.all(\n 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 )\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: await aiEventId('a2.ai.message.completed', generationId),\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: await aiEventId('a2.ai.failed', generationId),\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: await aiEventId('a2.ai.model.metadata.resolved', ctx.event.id),\n payload: { modelId: ctx.event.payload.modelId, limits },\n } as AppendInput<D>\n },\n },\n 'ai.control.requested': {\n lane: ({ event }) => {\n const command = event.payload as ControlCommand<M>\n if (event.id === '')\n throw new A2Error(\n 'INVALID_PAYLOAD',\n 'AI command IDs must be nonempty',\n )\n if (event.id?.startsWith(AI_EVENT_ID_PREFIX))\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `AI command IDs cannot use the reserved '${AI_EVENT_ID_PREFIX}' prefix`,\n )\n if (\n (command.action === 'send' || command.action === 'steer') &&\n event.id !== command.message.id\n )\n throw new A2Error(\n 'INVALID_PAYLOAD',\n 'AI input event ID must equal message.id',\n )\n return 'a2.ai.control'\n },\n handler: control.handler,\n },\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-context-schema.ts","../src/ai-context.ts","../src/ai-sdk-step.ts","../src/ai-model-metadata.ts","../src/ai-input-tokens.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 GenerationReason,\n GenerationStartedPayload,\n InputRequestedPayload,\n InputRespondedPayload,\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\ntype CompletedCall = Pick<\n ToolCalledPayload,\n | 'requestId'\n | 'generationId'\n | 'messageId'\n | 'toolCallId'\n | 'toolName'\n | 'providerExecuted'\n | 'supportsDeferredResults'\n>\n\nexport type CoordinatorCall = {\n approval?: ApprovalRequestedPayload\n response?: ApprovalRespondedPayload\n work?: ControlWork\n} & (\n | { call: ToolCalledPayload; terminal: false }\n | { call: CompletedCall; terminal: true }\n)\n\nconst completeCall = (candidate: CoordinatorCall): CoordinatorCall => {\n const {\n requestId,\n generationId,\n messageId,\n toolCallId,\n toolName,\n providerExecuted,\n supportsDeferredResults,\n } = candidate.call\n return {\n terminal: true,\n call: {\n requestId,\n generationId,\n messageId,\n toolCallId,\n toolName,\n ...(providerExecuted === undefined ? {} : { providerExecuted }),\n ...(supportsDeferredResults === undefined\n ? {}\n : { supportsDeferredResults }),\n },\n ...(candidate.work === undefined ? {} : { work: candidate.work }),\n }\n}\n\nexport type CoordinatorResponse = {\n rootMessageId: string\n responseMessageId: string\n status: 'requested' | 'generating' | 'waiting' | 'failed'\n stepCount: number\n activeRequestId?: string\n requestReason: GenerationReason\n sourceGenerationId?: string\n generation?: GenerationStartedPayload\n source?: {\n generation: GenerationStartedPayload\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 unsettledTools?: Record<string, true>\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 = request.responseMessageId\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 requestReason: request.reason,\n ...(request.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: request.sourceGenerationId }),\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 request.sourceGenerationId !==\n state.response.generation?.generationId)) ||\n (request.sourceGenerationId !== undefined &&\n request.sourceGenerationId !==\n (state.response.generation ?? state.response.source?.generation)\n ?.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 return {\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'requested',\n stepCount: response.stepCount,\n activeRequestId: event.id,\n requestReason: request.reason,\n ...(request.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: request.sourceGenerationId }),\n ...(generation === undefined\n ? {}\n : {\n source: {\n generation,\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 ...(response.source === undefined ? {} : { source: response.source }),\n activeRequestId: generation.requestId,\n requestReason: response.requestReason,\n ...(response.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: response.sourceGenerationId }),\n calls: [],\n inputs: [],\n }))\n }\n case 'ai.generation.completed': {\n const completion = event.payload as GenerationCompletedPayload\n if (\n state.response?.generation?.requestId !== completion.requestId ||\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 response.generation.requestId === failure.requestId\n const ownsActiveStepLimit =\n failure.stepLimit === true &&\n response?.requestReason === 'tool' &&\n response.sourceGenerationId === failure.generationId &&\n response.source?.generation.requestId === failure.requestId &&\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 (\n state.response?.generation?.requestId !== call.requestId ||\n state.response.generation.generationId !== call.generationId\n ) {\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 (\n state.response?.generation?.requestId !== approval.requestId ||\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.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?.requestId !== approval.requestId ||\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?.requestId !== result.requestId ||\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 ? completeCall(candidate)\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?.requestId !== input.requestId ||\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 InputRespondedPayload\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?.requestId !== input.requestId ||\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.v6',\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'\nimport { aiEventId } from './ai-id.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 }): Promise<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.v5',\n initialState: initialControlState<M>(),\n })\n .fold((state, event) => {\n if (event.type === 'ai.control.requested') {\n const command = event.payload as ControlCommand<M>\n if (command.action === 'stop')\n return {\n ...state,\n pendingStops: {\n ...state.pendingStops,\n [event.id]: command.turnId,\n },\n }\n }\n if (event.type === 'ai.control.decided') {\n const receipt = event.payload as ControlReceipt\n if (Object.hasOwn(state.pendingStops, receipt.commandId)) {\n const pendingStops = { ...state.pendingStops }\n delete pendingStops[receipt.commandId]\n return { ...state, pendingStops }\n }\n }\n return 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 = async ({\n type,\n payload,\n id,\n }: {\n type: string\n payload: unknown\n id?: string\n }): Promise<void> => {\n const fact = {\n type,\n payload,\n id:\n id ??\n (await aiEventId('a2.ai.fact', ctx.event.id, String(facts.length))),\n }\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 = async ({\n lastSeenIndex,\n reason: interruptionReason,\n }: {\n lastSeenIndex: number | undefined\n reason: string | undefined\n }): Promise<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 await 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 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 message,\n generate: generate && message.role === 'user',\n ...(afterStepOf === undefined ? {} : { afterStepOf }),\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 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) reason = 'not-pending'\n else if (item.message.role !== command.message.role)\n reason = 'role-mismatch'\n else item.message = command.message\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 = 'not-pending'\n else state.inbox.items.splice(position, 1)\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 = 'not-pending'\n else if (\n command.beforeId !== null &&\n !state.inbox.items.some(\n (candidate) => candidate.id === command.beforeId,\n )\n )\n reason = 'not-pending'\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 = 'not-pending'\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 {\n selected.generate = true\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 await end({\n lastSeenIndex: command.lastSeenIndex,\n reason: undefined,\n })\n break\n case 'steer':\n insert({\n message: command.message,\n generate: true,\n first: true,\n afterStepOf: command.turnId,\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 await 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 await 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.requestId === command.result.requestId &&\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 await 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?.requestId === command.response.requestId &&\n candidate.approval.approvalId === 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 await emit({\n type: 'ai.approval.responded',\n payload: command.response,\n })\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?.requestId !== payload.requestId ||\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 await 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 await emit({\n type: 'ai.retry.requested',\n payload: command.request,\n })\n requestModel({\n request: {\n messageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'retry',\n },\n id: await aiEventId(\n 'a2.ai.request.retry',\n options.agent.contract.name,\n ctx.event.sessionId,\n command.request.retryId,\n ),\n })\n } else reason = 'stale-turn'\n break\n }\n }\n } else {\n const report = ctx.event.payload as WorkReport\n if (\n report.kind === 'tool' &&\n report.settled &&\n state.coordinator.unsettledTools\n ) {\n delete state.coordinator.unsettledTools[report.workId]\n if (Object.keys(state.coordinator.unsettledTools).length === 0)\n delete state.coordinator.unsettledTools\n }\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 await emit({\n type: event.type,\n payload: event.payload,\n id: event.id,\n })\n work.facts = [...(work.facts ?? []), event.id]\n }\n }\n if (report.settled) {\n work.settled = true\n delete work.facts\n }\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 await 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 = await aiEventId(\n 'a2.ai.tool.execution',\n ctx.event.id,\n call.call.generationId,\n call.call.toolCallId,\n )\n call.work = { id, version: active.version, settled: false }\n state.coordinator.unsettledTools = {\n ...state.coordinator.unsettledTools,\n [id]: true,\n }\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 await 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 sourceGenerationId = (\n response.generation ?? response.source?.generation\n )?.generationId\n const id =\n nextReason === 'tool'\n ? await aiEventId(\n 'a2.ai.request.tool',\n response.generation!.generationId,\n )\n : await aiEventId('a2.ai.request', ctx.event.id, nextReason)\n requestModel({\n request: {\n messageId: response.responseMessageId,\n responseMessageId: response.responseMessageId,\n reason: nextReason,\n ...(sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId }),\n },\n id,\n })\n } else if (naturalCompletion) {\n await 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 await emit({\n type: 'ai.message.created',\n payload: { message: item.message, generate: item.generate },\n id: await aiEventId(\n 'a2.ai.admitted',\n options.agent.contract.name,\n ctx.event.sessionId,\n item.id,\n ),\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 const requestId = await aiEventId(\n 'a2.ai.request.message',\n options.agent.contract.name,\n ctx.event.sessionId,\n item.id,\n )\n requestModel({\n request: {\n messageId: item.id,\n responseMessageId: requestId,\n reason: 'message',\n },\n id: requestId,\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 id: await aiEventId('a2.ai.control.committed', ctx.event.id),\n payload: controlCommit({ before, after: state, moves }),\n } as AppendInput<D>,\n ...jobs,\n {\n type: 'ai.control.decided',\n id: await aiEventId('a2.ai.control.decided', ctx.event.id),\n payload: receipt,\n } as AppendInput<D>,\n ]\n }\n\n const report = async ({\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 }): Promise<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: await aiEventId(\n 'a2.ai.report',\n ctx.event.id,\n String(ctx.attempt),\n name,\n ),\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: await Promise.all(\n events\n .filter(\n (event) =>\n event.type !== 'ai.message.completed' &&\n event.type !== 'ai.message.interrupted',\n )\n .map(async (event, index) => ({\n type: event.type,\n payload: event.payload,\n id:\n event.id ??\n (await aiEventId(\n 'a2.ai.work.fact',\n ctx.event.id,\n String(ctx.attempt),\n name,\n String(index),\n )),\n })),\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 = await 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 }): Promise<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 type { UIMessage } from 'ai'\nimport { events } from './ai.ts'\nimport type { AIContextState } from './ai-context.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { validateSync } from './validate.ts'\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\nconst index = (value: unknown): value is number =>\n typeof value === 'number' && Number.isSafeInteger(value) && value >= 0\nconst id = (value: unknown): value is string =>\n typeof value === 'string' && value.length > 0\nconst nullableId = (value: unknown): boolean => value === null || id(value)\nconst matches = (schema: StandardSchemaV1<unknown>, value: unknown): boolean =>\n validateSync(schema, value, 'AI context checkpoint').issues === undefined\nconst isMessage = (value: unknown): value is UIMessage =>\n matches(events['ai.message.created'], { message: value })\nconst indexes = (value: unknown, messages: readonly UIMessage[]): boolean =>\n record(value) &&\n Object.values(value).every(index) &&\n messages.every((message) => Object.hasOwn(value, message.id))\n\nconst compaction = (value: unknown): boolean =>\n value === null ||\n (record(value) &&\n Object.keys(value).every((key) =>\n [\n 'status',\n 'generationId',\n 'throughMessageId',\n 'throughIndex',\n 'summary',\n ].includes(key),\n ) &&\n ['running', 'completed'].includes(String(value['status'])) &&\n id(value['generationId']) &&\n id(value['throughMessageId']) &&\n index(value['throughIndex']) &&\n (value['summary'] === undefined || typeof value['summary'] === 'string'))\n\nconst progress = (value: unknown): boolean => {\n if (\n !record(value) ||\n !index(value['length']) ||\n !Array.isArray(value['tail']) ||\n !Array.isArray(value['blocks'])\n )\n return false\n const pending = [\n ...value['blocks'].toReversed().filter((block) => block !== null),\n value['tail'],\n ].toReversed()\n const seen = new Set<object>()\n let count = 0\n let last = -1\n while (pending.length > 0) {\n const block: unknown = pending.pop()\n if (typeof block !== 'object' || block === null || seen.has(block))\n return false\n seen.add(block)\n if (Array.isArray(block)) {\n for (const batch of block) {\n if (\n !record(batch) ||\n !index(batch['index']) ||\n batch['index'] <= last ||\n !Array.isArray(batch['chunks']) ||\n !batch['chunks'].every(\n (chunk) => record(chunk) && typeof chunk['type'] === 'string',\n )\n )\n return false\n count += 1\n last = batch['index']\n }\n } else if (\n record(block) &&\n Object.keys(block).length === 2 &&\n Object.hasOwn(block, 'left') &&\n Object.hasOwn(block, 'right')\n )\n pending.push(block['right'], block['left'])\n else return false\n }\n return count === value['length']\n}\n\nconst indexedEvents = (\n value: unknown,\n types: (keyof typeof events)[],\n): boolean =>\n Array.isArray(value) &&\n value.every(\n (event) =>\n record(event) &&\n index(event['index']) &&\n types.includes(event['type'] as keyof typeof events) &&\n matches(\n events[\n event['type'] as keyof typeof events\n ] as StandardSchemaV1<unknown>,\n event['payload'],\n ),\n )\n\nconst projection = (value: unknown, messages: UIMessage[]): boolean => {\n if (\n !record(value) ||\n Object.keys(value).some(\n (key) =>\n ![\n 'generationId',\n 'responseMessageId',\n 'promptThroughIndex',\n 'completionIndex',\n 'baseMessage',\n 'baseCompaction',\n 'batches',\n 'toolEvents',\n 'approvalEvents',\n 'cursor',\n ].includes(key),\n ) ||\n !id(value['generationId']) ||\n !id(value['responseMessageId']) ||\n !index(value['promptThroughIndex']) ||\n (value['completionIndex'] !== undefined &&\n !index(value['completionIndex'])) ||\n (value['baseMessage'] !== undefined && !isMessage(value['baseMessage'])) ||\n (value['baseCompaction'] !== undefined &&\n !compaction(value['baseCompaction'])) ||\n !progress(value['batches']) ||\n !indexedEvents(value['toolEvents'], ['ai.tool.called', 'ai.tool.result']) ||\n !indexedEvents(value['approvalEvents'], [\n 'ai.approval.requested',\n 'ai.approval.responded',\n ])\n )\n return false\n const cursor = value['cursor']\n if (cursor === undefined || cursor === null) return true\n if (\n !record(cursor) ||\n !index(cursor['throughIndex']) ||\n !record(cursor['stream'])\n )\n return false\n const stream = cursor['stream']\n const current = messages.find(\n (message) => message.id === value['responseMessageId'],\n )\n if (\n !current ||\n !['text', 'reasoning'].every(\n (key) =>\n record(stream[key]) &&\n Object.values(stream[key]).every(\n (part) => index(part) && part < current.parts.length,\n ),\n ) ||\n !record(stream['tools'])\n )\n return false\n return Object.values(stream['tools']).every(\n (tool) =>\n record(tool) &&\n typeof tool['text'] === 'string' &&\n typeof tool['toolName'] === 'string' &&\n typeof tool['dynamic'] === 'boolean',\n )\n}\n\nconst authority = (value: unknown): boolean =>\n value === null ||\n (record(value) &&\n Object.keys(value).every((key) =>\n [\n 'requestId',\n 'responseMessageId',\n 'sourceGenerationId',\n 'requestReason',\n 'phase',\n ].includes(key),\n ) &&\n ['requestId', 'responseMessageId', 'sourceGenerationId'].every((key) =>\n nullableId(value[key]),\n ) &&\n (value['requestReason'] === null ||\n ['message', 'tool', 'input', 'resume', 'retry'].includes(\n String(value['requestReason']),\n )) &&\n (value['phase'] === null ||\n [\n 'starting',\n 'generating',\n 'tools',\n 'waiting',\n 'failed',\n 'pausing',\n 'paused',\n ].includes(String(value['phase']))))\n\nexport const contextSchema = <M extends UIMessage>(): StandardSchemaV1<\n AIContextState<M>\n> => ({\n '~standard': {\n version: 1,\n vendor: 'a2-context',\n validate(value) {\n const invalid = { issues: [{ message: 'invalid AI model context' }] }\n const keys = [\n 'messages',\n 'compaction',\n 'modelMetadata',\n 'closed',\n 'authority',\n 'generation',\n 'activeProjection',\n 'messageIndexes',\n ]\n try {\n if (\n !record(value) ||\n keys.some((key) => !Object.hasOwn(value, key)) ||\n Object.keys(value).some((key) => !keys.includes(key))\n )\n return invalid\n const messages = value['messages']\n const metadata = value['modelMetadata']\n const generation = value['generation']\n const current = value['activeProjection']\n if (\n !Array.isArray(messages) ||\n !messages.every(isMessage) ||\n !compaction(value['compaction']) ||\n typeof value['closed'] !== 'boolean' ||\n !authority(value['authority']) ||\n !record(metadata) ||\n !Object.entries(metadata).every(\n ([modelId, entry]) =>\n record(entry) &&\n (entry['status'] === 'pending' ||\n entry['status'] === 'unavailable' ||\n (entry['status'] === 'resolved' &&\n matches(events['ai.model.metadata.resolved'], {\n modelId,\n limits: entry['limits'],\n }))),\n ) ||\n !indexes(value['messageIndexes'], messages)\n )\n return invalid\n if (\n generation !== null &&\n (!record(generation) ||\n !matches(events['ai.generation.started'], generation['owner']) ||\n ![\n 'streaming',\n 'completed',\n 'paused',\n 'failed',\n 'superseded',\n ].includes(String(generation['phase'])) ||\n (generation['responseIndex'] !== undefined &&\n !index(generation['responseIndex'])) ||\n (generation['phase'] === 'failed' &&\n typeof generation['error'] !== 'string'))\n )\n return invalid\n const owner =\n record(generation) && record(generation['owner'])\n ? generation['owner']\n : undefined\n if (\n current !== null &&\n (!projection(current, messages) ||\n !record(current) ||\n current['generationId'] !== owner?.['generationId'] ||\n current['responseMessageId'] !== owner?.['responseMessageId'])\n )\n return invalid\n if (\n generation !== null &&\n (generation as Record<string, unknown>)['phase'] !== 'superseded' &&\n current === null\n )\n return invalid\n if (value['closed'] && (generation !== null || current !== null))\n return invalid\n return { value: value as AIContextState<M> }\n } catch {\n return invalid\n }\n },\n },\n})\n","import type { UIMessage } from 'ai'\nimport type {\n AgentDefinition,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n CompactionCompletedPayload,\n CompactionRequestedPayload,\n CompactionState,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationRequestedPayload,\n GenerationStartedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ModelMetadataRequestedPayload,\n ModelMetadataResolvedPayload,\n ModelMetadataState,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { ControlCommit } from './ai-control.ts'\nimport { contextSchema } from './ai-context-schema.ts'\nimport type { ContractEvent, EventDefs } from './contract.ts'\nimport {\n projectedMessage,\n advanceProjection,\n reduceToolActivity,\n upsertMessage,\n upsertResponse,\n type MessageProjection,\n} from './ai-message-projection.ts'\nimport { interruptUIMessage, pauseUIMessage } from './ai-projector.ts'\nimport {\n flattenProgressBatches,\n progressBatches,\n} from './ai-progress-batches.ts'\nimport { storedAIReducer, type AIStoredReducer } from './ai-stored-state.ts'\n\nexport type AIModelContext<M extends UIMessage = UIMessage> = {\n messages: M[]\n compaction: Omit<\n CompactionState<M>,\n 'messages' | 'retainedMessageIds' | 'usage'\n > | null\n modelMetadata: Record<string, ModelMetadataState>\n}\n\nexport type AIContextState<M extends UIMessage> = AIModelContext<M> & {\n closed: boolean\n authority: Pick<\n ControlCommit['view'],\n | 'requestId'\n | 'requestReason'\n | 'sourceGenerationId'\n | 'responseMessageId'\n | 'phase'\n > | null\n generation: {\n owner: GenerationStartedPayload\n phase: 'streaming' | 'completed' | 'paused' | 'failed' | 'superseded'\n error?: string\n responseIndex?: number\n } | null\n activeProjection: MessageProjection<M> | null\n messageIndexes: Record<string, number>\n}\n\nconst replaceResponse = <M extends UIMessage>({\n state,\n message,\n index,\n}: {\n state: AIContextState<M>\n message: M\n index: number\n}): AIContextState<M> => {\n let messages = upsertResponse({\n messages: state.messages,\n message,\n inputId: state.generation!.owner.messageId,\n })\n if (\n state.generation?.responseIndex !== undefined &&\n !state.messages.some((item) => item.id === message.id)\n ) {\n messages = messages.filter((item) => item.id !== message.id)\n messages.splice(state.generation.responseIndex, 0, message)\n }\n return {\n ...state,\n messages,\n messageIndexes: Object.hasOwn(state.messageIndexes, message.id)\n ? state.messageIndexes\n : { ...state.messageIndexes, [message.id]: index },\n }\n}\n\nconst calledTools = <M extends UIMessage>(\n projection: MessageProjection<M>,\n): Set<string> =>\n new Set([\n ...(projection.baseMessage?.parts.flatMap((part) =>\n 'toolCallId' in part ? [part.toolCallId] : [],\n ) ?? []),\n ...projection.toolEvents\n .filter((event) => event.type === 'ai.tool.called')\n .map((event) => event.payload.toolCallId),\n ])\n\nconst renderProjection = <M extends UIMessage>({\n state,\n index,\n}: {\n state: AIContextState<M>\n index: number\n}): AIContextState<M> => {\n const projection = state.activeProjection!\n let message = projectedMessage(projection)\n if (\n projection.baseMessage === undefined &&\n projection.batches.length === 0 &&\n message.parts.length === 0\n )\n return state\n if (state.generation?.phase === 'paused')\n message = pauseUIMessage({ message, toolCallIds: calledTools(projection) })\n if (state.generation?.phase === 'failed')\n message = interruptUIMessage(\n message,\n `Generation failed before tool completion: ${state.generation.error}`,\n )\n return replaceResponse({\n state: { ...state, activeProjection: { ...projection, cursor: null } },\n message,\n index,\n })\n}\n\nexport const generationBase = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => {\n const projection = state.activeProjection\n if (!projection) return state\n return {\n ...state,\n messages:\n projection.baseMessage === undefined\n ? state.messages.filter(\n (message) => message.id !== projection.responseMessageId,\n )\n : upsertMessage(state.messages, projection.baseMessage),\n compaction: projection.baseCompaction ?? null,\n }\n}\n\nexport const contextForAttempt = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => ({\n ...(state.activeProjection?.completionIndex === undefined\n ? generationBase(state)\n : state),\n generation: state.generation && { ...state.generation, phase: 'superseded' },\n activeProjection: null,\n})\n\nconst endGeneration = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => ({\n ...state,\n authority: null,\n generation: null,\n activeProjection: null,\n})\n\nconst ownsGeneration = <M extends UIMessage>(\n state: AIContextState<M>,\n owner: { generationId: string; requestId: string },\n): boolean =>\n state.generation?.owner.generationId === owner.generationId &&\n state.generation.owner.requestId === owner.requestId &&\n state.generation.phase !== 'superseded'\n\nexport const createContextReducer = <M extends UIMessage, D extends EventDefs>({\n agent,\n}: {\n agent: AgentDefinition<M, D>\n}): AIStoredReducer<D, AIContextState<M>> => {\n const initialState: AIContextState<M> = {\n messages: [],\n compaction: null,\n modelMetadata: {},\n closed: false,\n authority: null,\n generation: null,\n activeProjection: null,\n messageIndexes: {},\n }\n const reducer = agent.contract\n .reducer({\n name: 'a2.ai.context.v3',\n initialState,\n stateSchema: contextSchema<M>(),\n })\n .fold((state, event) => reduceContext(state, event))\n return storedAIReducer(reducer)\n}\n\nconst reduceContext = <M extends UIMessage, D extends EventDefs>(\n state: AIContextState<M>,\n event: ContractEvent<D>,\n): AIContextState<M> => {\n if (state.closed) return state\n switch (event.type) {\n case 'ai.control.committed': {\n const { view } = event.payload as ControlCommit\n const {\n requestId,\n requestReason,\n sourceGenerationId,\n responseMessageId,\n phase,\n } = view\n const next = {\n ...state,\n authority: {\n requestId,\n requestReason,\n sourceGenerationId,\n responseMessageId,\n phase,\n },\n closed: view.closed,\n }\n return view.closed ? endGeneration(next) : next\n }\n case 'ai.session.closed':\n return endGeneration({\n ...state,\n closed: true,\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection?.baseCompaction ?? null)\n : state.compaction,\n })\n case 'ai.message.created': {\n const { message } = event.payload as MessageCreatedPayload<M>\n return {\n ...state,\n messages: upsertMessage(state.messages, message),\n activeProjection:\n state.activeProjection?.responseMessageId === message.id\n ? { ...state.activeProjection, cursor: null }\n : state.activeProjection,\n messageIndexes: { ...state.messageIndexes, [message.id]: event.index },\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (\n state.authority?.requestId !== event.id ||\n request.responseMessageId !== state.authority.responseMessageId ||\n request.reason !== state.authority.requestReason ||\n (request.sourceGenerationId ?? null) !==\n state.authority.sourceGenerationId ||\n request.reason !== 'retry'\n )\n return state\n return contextForAttempt(state)\n }\n case 'ai.generation.started': {\n const owner = event.payload as GenerationStartedPayload\n if (\n state.authority?.requestId !== owner.requestId ||\n state.authority.responseMessageId !== owner.responseMessageId ||\n state.authority.phase === 'paused' ||\n state.authority.phase === 'pausing'\n )\n return state\n const previous = state.generation\n if (\n previous?.owner.requestId === owner.requestId &&\n (previous.owner.attempt >= owner.attempt ||\n previous.phase === 'failed' ||\n previous.phase === 'completed' ||\n state.activeProjection?.completionIndex !== undefined)\n )\n return state\n const base =\n previous?.owner.requestId === owner.requestId\n ? generationBase(state)\n : state\n const baseMessage = base.messages.find(\n (message) => message.id === owner.responseMessageId,\n )\n return {\n ...base,\n generation: {\n owner,\n phase: 'streaming',\n ...(previous?.owner.responseMessageId === owner.responseMessageId &&\n previous.responseIndex !== undefined\n ? { responseIndex: previous.responseIndex }\n : {}),\n },\n activeProjection: {\n generationId: owner.generationId,\n responseMessageId: owner.responseMessageId,\n promptThroughIndex: owner.promptThroughIndex ?? event.index - 1,\n ...(baseMessage === undefined ? {} : { baseMessage }),\n baseCompaction: base.compaction,\n batches: progressBatches(),\n toolEvents: [],\n approvalEvents: [],\n },\n }\n }\n case 'ai.generation.progress': {\n const payload = event.payload as GenerationProgressPayload\n if (\n !ownsGeneration(state, payload) ||\n state.generation!.owner.responseMessageId !==\n payload.responseMessageId ||\n state.generation!.phase !== 'streaming' ||\n !state.activeProjection\n )\n return state\n const projection = state.activeProjection\n const progress = advanceProjection({\n projection,\n base: state.messages.find(\n (message) => message.id === projection.responseMessageId,\n ),\n chunks: payload.chunks,\n index: event.index,\n })\n return replaceResponse({\n state: {\n ...state,\n activeProjection: {\n ...projection,\n batches: progress.batches,\n cursor: progress.cursor,\n },\n },\n message: progress.message,\n index: event.index,\n })\n }\n case 'ai.generation.completed': {\n const payload = event.payload as GenerationCompletedPayload\n if (\n !ownsGeneration(state, payload) ||\n state.generation!.phase !== 'streaming'\n )\n return state\n return {\n ...state,\n generation: { ...state.generation!, phase: 'completed' },\n activeProjection: {\n ...state.activeProjection!,\n completionIndex: event.index,\n cursor: null,\n },\n }\n }\n case 'ai.generation.failed': {\n const payload = event.payload as GenerationFailedPayload\n if (!ownsGeneration(state, payload)) return state\n if (\n state.generation!.phase !== 'streaming' &&\n !(\n payload.stepLimit &&\n state.authority?.requestReason === 'tool' &&\n state.authority.sourceGenerationId === payload.generationId\n )\n )\n return state\n if (payload.superseded) {\n const next = generationBase(state)\n return {\n ...next,\n generation: { ...state.generation!, phase: 'superseded' },\n activeProjection: null,\n }\n }\n return renderProjection({\n state: {\n ...state,\n compaction: state.activeProjection?.baseCompaction ?? null,\n generation: {\n ...state.generation!,\n phase: 'failed',\n error: payload.error,\n },\n },\n index: event.index,\n })\n }\n case 'ai.message.interrupted': {\n const payload = event.payload as MessageInterruptedPayload\n const owner = state.generation?.owner\n const ownsRequest =\n payload.requestId !== undefined &&\n payload.requestId === state.authority?.requestId &&\n payload.messageId === state.authority.responseMessageId\n const ownsOwner =\n owner?.responseMessageId === payload.messageId &&\n (payload.generationId === owner.generationId ||\n payload.requestId === owner.requestId)\n if (!ownsRequest && !ownsOwner) return state\n if (\n ownsOwner &&\n state.authority?.requestId !== owner!.requestId &&\n !ownsRequest\n )\n return state\n const projection = state.activeProjection\n if (!projection) return endGeneration(state)\n const cutoff = payload.lastSeenIndex ?? Number.POSITIVE_INFINITY\n const retained = {\n ...projection,\n batches: progressBatches(\n flattenProgressBatches(projection.batches).filter(\n (batch) => batch.index <= cutoff,\n ),\n ),\n toolEvents: projection.toolEvents.filter(\n (item) => item.index <= cutoff,\n ),\n approvalEvents: projection.approvalEvents.filter(\n (item) => item.index <= cutoff,\n ),\n }\n let next = generationBase(state)\n if (retained.baseMessage !== undefined || retained.batches.length > 0)\n next = replaceResponse({\n state: next,\n message: interruptUIMessage(projectedMessage(retained)),\n index: event.index,\n })\n return endGeneration(next)\n }\n case 'ai.message.completed': {\n const { messageId } = event.payload as { messageId: string }\n return state.generation?.owner.responseMessageId === messageId &&\n state.generation.phase !== 'failed' &&\n state.generation.phase !== 'superseded'\n ? endGeneration(state)\n : state\n }\n case 'ai.generation.paused': {\n const { generationId } = event.payload as { generationId: string }\n if (\n state.generation?.owner.generationId !== generationId ||\n state.generation.phase === 'failed' ||\n state.generation.phase === 'superseded' ||\n !state.activeProjection\n )\n return state\n const toolCallIds = calledTools(state.activeProjection)\n return renderProjection({\n state: {\n ...state,\n generation: { ...state.generation, phase: 'paused' },\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection.baseCompaction ?? null)\n : state.compaction,\n activeProjection: {\n ...state.activeProjection,\n cursor: null,\n batches: progressBatches(\n flattenProgressBatches(state.activeProjection.batches).map(\n (batch) => ({\n index: batch.index,\n chunks: batch.chunks.filter(\n (chunk) =>\n !('toolCallId' in chunk) ||\n toolCallIds.has(chunk.toolCallId),\n ),\n }),\n ),\n ),\n },\n },\n index: event.index,\n })\n }\n case 'ai.tool.called':\n case 'ai.tool.result': {\n const payload = event.payload as ToolCalledPayload | ToolResultPayload\n if (\n !ownsGeneration(state, payload) ||\n !state.activeProjection ||\n state.generation!.owner.responseMessageId !== payload.messageId\n )\n return state\n if (state.generation!.phase === 'failed') {\n const result = payload as ToolResultPayload\n const running = state.activeProjection.toolEvents\n .reduce(\n (tools, item) => reduceToolActivity(tools, item),\n [] as ReturnType<typeof reduceToolActivity>,\n )\n .some(\n (tool) =>\n tool.toolCallId === payload.toolCallId &&\n tool.status === 'running',\n )\n if (event.type !== 'ai.tool.result' || result.preliminary || !running)\n return state\n }\n const toolEvent =\n event.type === 'ai.tool.called'\n ? {\n index: event.index,\n type: 'ai.tool.called' as const,\n payload: payload as ToolCalledPayload,\n }\n : {\n index: event.index,\n type: 'ai.tool.result' as const,\n payload: payload as ToolResultPayload,\n }\n const next = {\n ...state,\n activeProjection: {\n ...state.activeProjection,\n toolEvents: [...state.activeProjection.toolEvents, toolEvent],\n },\n }\n if (event.type === 'ai.tool.called') return next\n next.activeProjection.cursor = null\n return renderProjection({ state: next, index: event.index })\n }\n case 'ai.approval.requested':\n case 'ai.approval.responded': {\n const payload = event.payload as\n ApprovalRequestedPayload | ApprovalRespondedPayload\n if (\n !ownsGeneration(state, payload) ||\n !state.activeProjection ||\n state.generation!.phase === 'failed' ||\n state.generation!.owner.responseMessageId !== payload.messageId\n )\n return state\n const approvalEvent =\n event.type === 'ai.approval.requested'\n ? {\n index: event.index,\n type: 'ai.approval.requested' as const,\n payload: payload as ApprovalRequestedPayload,\n }\n : {\n index: event.index,\n type: 'ai.approval.responded' as const,\n payload: payload as ApprovalRespondedPayload,\n }\n return renderProjection({\n state: {\n ...state,\n activeProjection: {\n ...state.activeProjection,\n cursor: null,\n approvalEvents: [\n ...state.activeProjection.approvalEvents,\n approvalEvent,\n ],\n },\n },\n index: event.index,\n })\n }\n case 'ai.compaction.requested': {\n const payload = event.payload as CompactionRequestedPayload\n if (\n state.generation?.owner.generationId !== payload.generationId ||\n state.generation.phase !== 'streaming'\n )\n return state\n return {\n ...state,\n compaction: {\n status: 'running',\n generationId: payload.generationId,\n throughMessageId: payload.throughMessageId,\n throughIndex:\n payload.throughIndex ?? state.activeProjection!.promptThroughIndex!,\n },\n }\n }\n case 'ai.compaction.completed': {\n const payload = event.payload as CompactionCompletedPayload<M>\n const projection = state.activeProjection\n if (\n state.generation?.owner.generationId !== payload.generationId ||\n state.generation.phase !== 'streaming' ||\n state.compaction?.status !== 'running' ||\n state.compaction.generationId !== payload.generationId ||\n !projection\n )\n return state\n const throughIndex =\n payload.throughIndex ?? projection.promptThroughIndex!\n const replacements = new Set(\n payload.messages.map((message) => message.id),\n )\n const retained = new Set(payload.retainedMessageIds ?? [])\n const messages = [\n ...payload.messages,\n ...state.messages.filter(\n (message) =>\n !replacements.has(message.id) &&\n (retained.has(message.id) ||\n (state.messageIndexes[message.id] ?? 0) > throughIndex),\n ),\n ]\n const activeProjection = { ...projection, cursor: null }\n delete activeProjection.baseMessage\n const baseMessage = messages.find(\n (message) => message.id === projection.responseMessageId,\n )\n if (baseMessage !== undefined) activeProjection.baseMessage = baseMessage\n const compaction: AIModelContext<M>['compaction'] = {\n status: 'completed',\n generationId: payload.generationId,\n throughMessageId: payload.throughMessageId,\n throughIndex,\n ...(payload.summary === undefined ? {} : { summary: payload.summary }),\n }\n activeProjection.baseCompaction = compaction\n return {\n ...state,\n messages,\n compaction,\n generation: {\n ...state.generation,\n responseIndex: payload.messages.length,\n },\n activeProjection,\n messageIndexes: Object.fromEntries(\n messages.map((message) => [\n message.id,\n replacements.has(message.id)\n ? throughIndex\n : state.messageIndexes[message.id]!,\n ]),\n ),\n }\n }\n case 'ai.model.metadata.requested': {\n const { modelId } = event.payload as ModelMetadataRequestedPayload\n return Object.hasOwn(state.modelMetadata, modelId)\n ? state\n : {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]: { status: 'pending' },\n },\n }\n }\n case 'ai.model.metadata.resolved': {\n const { modelId, limits } = event.payload as ModelMetadataResolvedPayload\n return {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]:\n limits === null\n ? { status: 'unavailable' }\n : { status: 'resolved', limits },\n },\n }\n }\n default:\n return state\n }\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","import { Buffer } from 'node:buffer'\nimport { asSchema } from 'ai'\nimport type { Instructions, ModelMessage, ToolSet } from 'ai'\nimport type { AICoordinatorState } from './ai-coordinator.ts'\n\nconst withoutProviderOptions = <T extends object>(value: T): T => {\n const result = { ...value }\n Reflect.deleteProperty(result, 'providerOptions')\n return result\n}\n\nconst estimatedMessage = (message: ModelMessage): unknown => ({\n ...withoutProviderOptions(message),\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) =>\n part.type === 'tool-result'\n ? {\n ...withoutProviderOptions(part),\n output: {\n ...withoutProviderOptions(part.output),\n ...(part.output.type === 'content'\n ? {\n value: part.output.value.map(withoutProviderOptions),\n }\n : {}),\n },\n }\n : withoutProviderOptions(part),\n ),\n})\n\nexport const 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 const instructions = options.instructions\n return Math.ceil(\n Buffer.byteLength(\n JSON.stringify({\n messages: options.messages.map(estimatedMessage),\n instructions:\n instructions === undefined || typeof instructions === 'string'\n ? instructions\n : Array.isArray(instructions)\n ? instructions.map(estimatedMessage)\n : estimatedMessage(instructions),\n tools,\n }),\n 'utf8',\n ) / 4,\n )\n}\n\nexport const 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.ceil(previous.inputTokens + options.estimate - previous.estimate)\n : options.estimate\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 {\n createContextReducer,\n contextForAttempt,\n generationBase,\n type AIContextState,\n type AIModelContext,\n} from './ai-context.ts'\nimport type { Reducer } from './reducer.ts'\nimport { aiStateReducer } from './ai-stored-state.ts'\nimport { aiEventId, AI_EVENT_ID_PREFIX } from './ai-id.ts'\nimport type { ControlCommit, ControlCommand } from './ai-control.ts'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { createHash } from 'node:crypto'\nimport { convertToModelMessages, isToolUIPart } 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 { estimateInputTokens, measuredInputTokens } from './ai-input-tokens.ts'\nimport type {\n AIEventDefs,\n AgentDefinition,\n AgentToolContext,\n AgentToolEventDefs,\n ApprovalRequestedPayload,\n CompactionCompletedPayload,\n CompactionRequestedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationStartedPayload,\n MessageCompletedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { AICoordinatorState } 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 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 messages: 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 reducer: Reducer<D, AIContextState<M>>\n state: AIContextState<M>\n events: ContractEvent<D>[]\n}): AIContextState<M> => {\n let state = options.state\n for (const event of options.events) state = options.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: await aiEventId(\n 'a2.ai.summary',\n options.context.generationId,\n ),\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: AIModelContext<M>,\n): AIModelContext<M>['compaction'] => {\n const compaction = state.compaction\n return compaction?.status === 'completed' ? compaction : null\n}\n\nconst contextMessages = <M extends UIMessage>({\n state,\n coordinator,\n}: {\n state: AIModelContext<M>\n coordinator: AICoordinatorState\n}): M[] => {\n const queued = new Set(coordinator.queued.map((item) => item.messageId))\n return state.messages.filter((message) => !queued.has(message.id))\n}\n\nconst modelContext = async <M extends UIMessage>(options: {\n messages: M[]\n state: AIModelContext<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\ntype ToolCallClassification = 'automatic' | 'approval' | 'unknown'\n\ntype PendingToolCall = {\n call: ToolCalledPayload\n classification: ToolCallClassification\n}\n\nconst toolCalledEvent = async <D extends EventDefs>(\n payload: ToolCalledPayload,\n): Promise<AppendInput<D>> =>\n ({\n type: 'ai.tool.called',\n id: await aiEventId(\n 'a2.ai.tool.called',\n payload.generationId,\n payload.toolCallId,\n ),\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 = async <\n D extends EventDefs,\n T extends ToolSet,\n>(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}): Promise<{ 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 = async (toolCallId: string): Promise<void> => {\n const pendingCall = take(toolCallId)\n if (pendingCall) result.push(await toolCalledEvent<D>(pendingCall.call))\n }\n for (const [chunkIndex, chunk] of options.chunks.entries()) {\n const resultId = (): Promise<string> =>\n aiEventId(\n 'a2.ai.tool.stream-result',\n options.generationId,\n String(options.sequence),\n String(chunkIndex),\n )\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(await 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(await toolCalledEvent<D>(called), {\n type: 'ai.tool.result',\n id: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-available') {\n await 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: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-error') {\n await 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: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-denied') {\n await 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: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-request') {\n await flush(chunk.toolCallId)\n const payload: ApprovalRequestedPayload = {\n requestId: options.requestId,\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: await aiEventId(\n 'a2.ai.approval.requested',\n options.generationId,\n chunk.approvalId,\n ),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-response') {\n result.push({\n type: 'ai.approval.responded',\n id: await aiEventId(\n 'a2.ai.approval.automatic-response',\n options.generationId,\n chunk.approvalId,\n ),\n payload: {\n requestId: options.requestId,\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\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 contextReducer = createContextReducer({ agent: options.agent })\n const readContext = async (\n session: HandlerContext<D>['session'],\n through: number | 'latest',\n ) => {\n const snapshot = await session.state(contextReducer, { through })\n return { state: contextReducer.view(snapshot.state), index: snapshot.index }\n }\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 = async (\n call: ToolCalledPayload,\n suffix: string,\n result: {\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n },\n ): Promise<AppendInput<D>> =>\n ({\n type: 'ai.tool.result',\n id: await aiEventId(\n 'a2.ai.tool.result',\n call.generationId,\n call.toolCallId,\n suffix,\n ),\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 = await readContext(ctx.session, ctx.event.index)\n if (\n snapshot.state.generation?.owner.generationId !== owner.generationId ||\n snapshot.state.generation.owner.requestId !== owner.requestId ||\n snapshot.state.activeProjection?.generationId !== owner.generationId\n )\n throw new TypeError(\n 'Tool prompt checkpoint does not own its generation',\n )\n const state = generationBase(snapshot.state)\n return modelContext({\n messages: state.messages.filter(\n (message) => state.messageIndexes[message.id]! <= frontier,\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 = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n error: unknown,\n ): Promise<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 await 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 Object.values(state.pendingStops).includes(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 readContext(ctx.session, 'latest')\n if (\n snapshot.state.closed ||\n snapshot.state.authority?.requestId !== requestId ||\n snapshot.state.authority?.phase === 'paused' ||\n snapshot.state.authority?.phase === 'pausing'\n )\n return\n const controlState = (\n await ctx.session.state(control.reducer, { through: snapshot.index })\n ).state\n if (\n request.control !== undefined &&\n Object.values(controlState.pendingStops).includes(request.control.turnId)\n )\n return\n const coordinatorState = controlState.coordinator\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 = await aiEventId(\n 'a2.ai.generation',\n requestId,\n String(attempt),\n )\n const responseMessageId = request.responseMessageId\n const responseStepCount = response.stepCount\n if (\n request.reason === 'tool' &&\n (request.sourceGenerationId !==\n response.source?.generation.generationId ||\n response.responseMessageId !== request.messageId ||\n response.responseMessageId !== request.responseMessageId)\n )\n return\n const previous = current\n const state =\n previous === undefined\n ? snapshot.state\n : contextForAttempt(snapshot.state)\n const resolverContext: AgentResolverContext<M, D> = {\n event: ctx.event,\n messages: contextMessages({ state, coordinator: coordinatorState }),\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: await aiEventId('a2.ai.step-limit', requestId),\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: await aiEventId(\n 'a2.ai.model.metadata',\n options.agent.contract.name,\n ctx.event.sessionId,\n catalogModelId,\n ),\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: await aiEventId('a2.ai.superseded', payload.generationId),\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 = contextMessages({\n state,\n coordinator: promptCoordinatorState,\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 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 let compactionEstimate:\n | Pick<\n CompactionRequestedPayload,\n 'inputTokenEstimate' | 'inputTokens' | 'thresholdTokens'\n >\n | undefined\n const hasPendingTools = messages.some((message) =>\n message.parts.some(\n (part) =>\n isToolUIPart(part) &&\n !(\n part.state === 'output-error' ||\n part.state === 'output-denied' ||\n (part.state === 'output-available' && part.preliminary !== true)\n ),\n ),\n )\n if (policy && !hasPendingTools) {\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 if (threshold !== undefined && shouldCompact) {\n compactionEstimate = {\n inputTokenEstimate,\n inputTokens,\n thresholdTokens: threshold,\n }\n }\n } else {\n shouldCompact = false\n }\n if (checkAbort(ctx.signal)) return\n if (shouldCompact) {\n const latest = (\n await ctx.session.state(coordinator, { through: 'latest' })\n ).state\n shouldCompact = Object.keys(latest.unsettledTools ?? {}).length === 0\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: await aiEventId(\n 'a2.ai.compaction.requested',\n generationId,\n ),\n payload: {\n generationId,\n throughMessageId,\n throughIndex,\n ...compactionEstimate,\n },\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: await aiEventId(\n 'a2.ai.compaction.completed',\n generationId,\n ),\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 reducer: contextReducer[aiStateReducer],\n events: generationEvents,\n state,\n })\n if (request.reason === 'retry' || previous !== undefined) {\n generationMessages = contextMessages({\n state: currentState,\n coordinator: promptCoordinatorState,\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 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 = await 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: await aiEventId(\n 'a2.ai.progress',\n generationId,\n String(sequence),\n ),\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: await aiEventId('a2.ai.completed', generationId),\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 = await Promise.all(\n 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 )\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: await aiEventId('a2.ai.message.completed', generationId),\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: await aiEventId('a2.ai.failed', generationId),\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: await aiEventId('a2.ai.model.metadata.resolved', ctx.event.id),\n payload: { modelId: ctx.event.payload.modelId, limits },\n } as AppendInput<D>\n },\n },\n 'ai.control.requested': {\n lane: ({ event }) => {\n const command = event.payload as ControlCommand<M>\n if (event.id === '')\n throw new A2Error(\n 'INVALID_PAYLOAD',\n 'AI command IDs must be nonempty',\n )\n if (event.id?.startsWith(AI_EVENT_ID_PREFIX))\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `AI command IDs cannot use the reserved '${AI_EVENT_ID_PREFIX}' prefix`,\n )\n if (\n (command.action === 'send' || command.action === 'steer') &&\n event.id !== command.message.id\n )\n throw new A2Error(\n 'INVALID_PAYLOAD',\n 'AI input event ID must equal message.id',\n )\n return 'a2.ai.control'\n },\n handler: control.handler,\n },\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.requested': (event, trigger) =>\n event.payload.action === 'stop' &&\n event.payload.turnId === trigger.payload.control?.turnId,\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.control.requested': (event, trigger) =>\n event.payload.action === 'stop' &&\n event.payload.turnId === trigger.payload.turnId,\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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"}