experimental-a2 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/ai-server.d.ts.map +1 -1
- package/dist/ai-server.js +39 -12
- package/dist/ai-server.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -0
- package/docs/guides/06-ai-agents.mdx +22 -3
- package/docs/reference/01-api.mdx +25 -0
- package/examples/playground/package.json +1 -1
- package/package.json +1 -1
- package/src/ai-server.ts +48 -11
- package/src/idempotent-id.ts +11 -0
- package/src/index.ts +1 -0
package/dist/ai-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-server.js","names":["errorMessage"],"sources":["../src/ai-coordinator.ts","../src/ai-control-server.ts","../src/ai-sdk-step.ts","../src/ai-model-metadata.ts","../src/ai-server.ts"],"sourcesContent":["import type { UIMessage } from 'ai'\nimport { applyControlChanges } from './ai-control-state.ts'\nimport type { ControlCommit, ControlWork } from './ai-control.ts'\nimport type {\n AIEventDefs,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationRequestedPayload,\n GenerationStartedPayload,\n InputRequestedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport type { Reducer } from './reducer.ts'\n\nexport type CoordinatorCall = {\n call: ToolCalledPayload\n approval?: ApprovalRequestedPayload\n response?: ApprovalRespondedPayload\n terminal: boolean\n work?: ControlWork\n}\n\nexport type CoordinatorResponse = {\n rootMessageId: string\n responseMessageId: string\n status: 'requested' | 'generating' | 'waiting' | 'failed'\n stepCount: number\n activeRequestId?: string\n generation?: GenerationStartedPayload\n promptThroughIndex?: number\n source?: {\n generation: GenerationStartedPayload\n promptThroughIndex: number\n failed: boolean\n canCompact: boolean\n }\n completion?: GenerationCompletedPayload\n failure?: GenerationFailedPayload\n calls: CoordinatorCall[]\n inputs: InputRequestedPayload[]\n inputResponse?: {\n generationId: string\n inputId: string\n name: string\n }\n}\n\nexport type AICoordinatorState = {\n closed: boolean\n queued: Array<{ messageId: string; generate: boolean }>\n response?: CoordinatorResponse\n calibration?: { model: string; inputTokens: number; estimate: number }\n}\n\nconst updateResponse = (\n state: AICoordinatorState,\n update: (response: CoordinatorResponse) => CoordinatorResponse,\n): AICoordinatorState =>\n state.response === undefined\n ? state\n : { ...state, response: update(state.response) }\n\nexport const foldCoordinator = <M extends UIMessage, D extends EventDefs>(\n state: AICoordinatorState,\n event: ContractEvent<D>,\n): AICoordinatorState => {\n switch (event.type) {\n case 'ai.session.closed':\n return { closed: true, queued: [] }\n case 'ai.retry.requested':\n case 'ai.compaction.completed': {\n const { calibration: _, ...rest } = state\n return rest\n }\n case 'ai.message.created': {\n const payload = event.payload as MessageCreatedPayload<M>\n const message = payload.message\n if (message.role !== 'user') return state\n return {\n ...state,\n queued: [\n ...state.queued.filter((item) => item.messageId !== message.id),\n {\n messageId: message.id,\n generate: payload.generate !== false,\n },\n ],\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (request.reason === 'message') {\n const responseMessageId =\n request.responseMessageId ?? `${request.messageId}:assistant`\n const requested = state.queued.findIndex(\n (item) => item.messageId === request.messageId,\n )\n return {\n ...state,\n queued:\n requested < 0\n ? state.queued.filter(\n (item) => item.messageId !== request.messageId,\n )\n : state.queued.slice(requested + 1),\n response: {\n rootMessageId: request.messageId,\n responseMessageId,\n status: 'requested',\n stepCount: 0,\n activeRequestId: event.id,\n calls: [],\n inputs: [],\n },\n }\n }\n if (\n state.response === undefined ||\n request.responseMessageId !== state.response.responseMessageId\n ) {\n return state\n }\n if (\n (request.reason === 'tool' &&\n (!continuationReady(state) ||\n event.id !==\n `ai.generate:tools:${state.response.generation?.generationId}`)) ||\n (request.reason === 'retry' && state.response.status !== 'failed') ||\n (request.reason === 'input' &&\n state.response.inputResponse === undefined)\n ) {\n return state\n }\n return updateResponse(state, (response) => {\n const generation = response.generation ?? response.source?.generation\n const promptThroughIndex =\n response.promptThroughIndex ?? response.source?.promptThroughIndex\n return {\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'requested',\n stepCount: response.stepCount,\n activeRequestId: event.id,\n ...(generation === undefined || promptThroughIndex === undefined\n ? {}\n : {\n source: {\n generation,\n promptThroughIndex,\n failed:\n response.failure?.generationId === generation.generationId,\n canCompact: response.calls.every((call) => call.terminal),\n },\n }),\n calls: [],\n inputs: [],\n }\n })\n }\n case 'ai.generation.started': {\n const generation = event.payload as GenerationStartedPayload\n if (\n state.response?.responseMessageId !== generation.responseMessageId ||\n state.response.activeRequestId !== generation.requestId ||\n (state.response.generation?.requestId === generation.requestId &&\n state.response.generation.attempt >= generation.attempt)\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'generating',\n stepCount: response.stepCount,\n generation,\n ...(generation.promptThroughIndex === undefined\n ? {}\n : { promptThroughIndex: generation.promptThroughIndex }),\n ...(response.source === undefined ? {} : { source: response.source }),\n activeRequestId: generation.requestId,\n calls: [],\n inputs: [],\n }))\n }\n case 'ai.generation.completed': {\n const completion = event.payload as GenerationCompletedPayload\n if (\n state.response?.generation?.generationId !== completion.generationId\n ) {\n return state\n }\n const next = updateResponse(state, (response) => ({\n ...response,\n status: 'waiting',\n completion,\n stepCount:\n response.stepCount + (response.completion === undefined ? 1 : 0),\n }))\n const { calibration: _, ...uncalibrated } = next\n const inputTokens = completion.usage?.inputTokens\n const estimate = completion.inputTokenEstimate\n return inputTokens !== undefined &&\n Number.isFinite(inputTokens) &&\n inputTokens >= 0 &&\n estimate !== undefined\n ? {\n ...uncalibrated,\n calibration: {\n model: state.response.generation.model,\n inputTokens,\n estimate,\n },\n }\n : uncalibrated\n }\n case 'ai.generation.failed': {\n const failure = event.payload as GenerationFailedPayload\n const response = state.response\n const ownsActiveGeneration =\n response?.generation?.generationId === failure.generationId\n const ownsActiveStepLimit =\n failure.stepLimit === true &&\n response?.activeRequestId ===\n `ai.generate:tools:${failure.generationId}` &&\n response.responseMessageId === failure.responseMessageId\n if (!ownsActiveGeneration && !ownsActiveStepLimit) {\n return state\n }\n return updateResponse(state, (current) => ({\n ...current,\n status: 'failed',\n failure,\n }))\n }\n case 'ai.message.completed': {\n const messageId = (event.payload as { messageId: string }).messageId\n if (state.response?.responseMessageId !== messageId) return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.message.interrupted': {\n const interruption = event.payload as MessageInterruptedPayload\n const response = state.response\n if (\n response?.responseMessageId !== interruption.messageId ||\n (interruption.generationId !== response.generation?.generationId &&\n interruption.requestId !== response.activeRequestId)\n )\n return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.tool.called': {\n const call = event.payload as ToolCalledPayload\n if (state.response?.generation?.generationId !== call.generationId) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: [\n ...response.calls.filter(\n (candidate) => candidate.call.toolCallId !== call.toolCallId,\n ),\n { call, terminal: false },\n ],\n }))\n }\n case 'ai.approval.requested': {\n const approval = event.payload as ApprovalRequestedPayload\n if (state.response?.generation?.generationId !== approval.generationId) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === approval.toolCallId\n ? { ...candidate, approval }\n : candidate,\n ),\n }))\n }\n case 'ai.approval.responded': {\n const approval = event.payload as ApprovalRespondedPayload\n if (\n state.response?.responseMessageId !== approval.messageId ||\n state.response.generation?.generationId !== approval.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.approval?.approvalId === approval.approvalId\n ? { ...candidate, response: approval }\n : candidate,\n ),\n }))\n }\n case 'ai.tool.result': {\n const result = event.payload as ToolResultPayload\n if (\n result.preliminary === true ||\n state.response?.generation?.generationId !== result.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === result.toolCallId\n ? { ...candidate, terminal: true }\n : candidate,\n ),\n }))\n }\n case 'ai.input.requested': {\n const input = event.payload as InputRequestedPayload\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.generationId !== input.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: [\n ...response.inputs.filter(\n (candidate) =>\n candidate.messageId !== input.messageId ||\n candidate.generationId !== input.generationId ||\n candidate.inputId !== input.inputId,\n ),\n input,\n ],\n }))\n }\n case 'ai.input.responded': {\n const input = event.payload as {\n messageId: string\n generationId: string\n inputId: string\n name: string\n }\n const requested = state.response?.inputs.find(\n (candidate) =>\n candidate.messageId === input.messageId &&\n candidate.generationId === input.generationId &&\n candidate.inputId === input.inputId &&\n candidate.name === input.name,\n )\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.generationId !== input.generationId ||\n requested === undefined\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: response.inputs.filter(\n (candidate) => candidate.inputId !== input.inputId,\n ),\n inputResponse: {\n generationId: input.generationId,\n inputId: input.inputId,\n name: requested.name,\n },\n }))\n }\n default:\n return state\n }\n}\n\nexport const aiCoordinatorReducer = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(\n contract: Contract<D>,\n): Reducer<D, AICoordinatorState> =>\n contract\n .reducer({\n name: 'a2.ai.coordinator.v5',\n initialState: {\n closed: false,\n queued: [],\n } as AICoordinatorState,\n })\n .fold((state, event) =>\n event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes\n .filter((change) => change.path[0] === 'coordinator')\n .map((change) =>\n Object.assign({}, change, { path: change.path.slice(1) }),\n ),\n })\n : state,\n )\n\nexport const continuationReady = (state: AICoordinatorState): boolean => {\n const response = state.response\n return (\n !state.closed &&\n response?.completion?.finishReason === 'tool-calls' &&\n response.generation?.generationId === response.completion.generationId &&\n response.failure === undefined &&\n response.calls.length > 0 &&\n response.calls.every(\n (call) =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n call.call.supportsDeferredResults !== true &&\n call.approval !== undefined &&\n call.response !== undefined),\n )\n )\n}\n","// oxlint-disable no-await-in-loop -- work acknowledgements follow the durable stream.\nimport { applyControlChanges, controlCommit } from './ai-control-state.ts'\nimport type { ControlChange, ControlCommit } from './ai-control.ts'\nimport type { UIMessage } from 'ai'\nimport type {\n AIEventDefs,\n AgentDefinition,\n GenerationRequestedPayload,\n MessageInterruptedPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n continuationReady,\n foldCoordinator,\n} from './ai-coordinator.ts'\nimport {\n initialControlState,\n type AIControlState,\n type ControlCommand,\n type ControlReceipt,\n type WorkFact,\n type WorkReport,\n} from './ai-control.ts'\nimport type { AppendInput, ContractEvent, EventDefs } from './contract.ts'\nimport type { HandlerContext } from './server.ts'\nimport type { Reducer } from './reducer.ts'\nimport type { AICoordinatorState, CoordinatorCall } from './ai-coordinator.ts'\nimport { validateSync } from './validate.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { A2Error } from './errors.ts'\n\nexport class ControlCancelled extends Error {}\n\nconst callReadyForModel = (call: CoordinatorCall): boolean =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n !call.call.supportsDeferredResults &&\n call.response !== undefined)\n\nconst approvalBlocksExecution = (call: CoordinatorCall): boolean =>\n call.approval !== undefined && call.response?.approved !== true\n\nexport type AIControlRuntime<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n handler(\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]>\n append(options: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]>\n settled(options: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): AppendInput<D>\n cancelled(options: { error: unknown; signal: AbortSignal }): boolean\n reducer: Reducer<D, AIControlState<M>>\n coordinator: Reducer<D, AICoordinatorState>\n}\n\nexport const createControlRuntime = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n}): AIControlRuntime<M, D> => {\n const reducer = options.agent.contract\n .reducer({\n name: 'a2.ai.control.v1',\n initialState: initialControlState<M>(),\n })\n .fold((state, event) =>\n event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes,\n })\n : state,\n )\n const coordinator = aiCoordinatorReducer(options.agent.contract)\n\n const handler = async (\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]> => {\n const snapshot = await ctx.session.state(reducer, { through: 'latest' })\n const before = structuredClone(snapshot.state)\n const moves: ControlChange[] = []\n const state = structuredClone(snapshot.state)\n const facts: WorkFact[] = []\n const jobs: AppendInput<D>[] = []\n const emit = ({\n type,\n payload,\n id = `${ctx.event.id}:fact:${facts.length}`,\n }: {\n type: string\n payload: unknown\n id?: string\n }): void => {\n const fact = { type, payload, id }\n facts.push(fact)\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n ...fact,\n } as ContractEvent<D>)\n }\n let reason: ControlReceipt['reason']\n const end = ({\n lastSeenIndex,\n reason: interruptionReason,\n }: {\n lastSeenIndex: number | undefined\n reason: string | undefined\n }): void => {\n const response = state.coordinator.response\n if (response === undefined) return\n const owner =\n response.generation === undefined\n ? { requestId: response.activeRequestId! }\n : { generationId: response.generation.generationId }\n emit({\n type: 'ai.message.interrupted',\n payload: {\n messageId: response.responseMessageId,\n ...owner,\n ...(interruptionReason === undefined\n ? {}\n : { reason: interruptionReason }),\n ...(lastSeenIndex === undefined ? {} : { lastSeenIndex }),\n } satisfies MessageInterruptedPayload,\n })\n state.active = null\n }\n const knownInput = (id: string): boolean =>\n state.inbox.items.some((candidate) => candidate.id === id) ||\n Object.hasOwn(state.reservedIds, id)\n const missingInputReason = (id: string): ControlReceipt['reason'] =>\n state.reservedIds[id] === 'removed' || !knownInput(id)\n ? 'not-found'\n : 'already-active'\n const inputTaken = ({\n message,\n generate = true,\n }: {\n message: M\n generate?: boolean\n }): boolean =>\n knownInput(message.id) ||\n (generate &&\n message.role === 'user' &&\n knownInput(`${message.id}:assistant`))\n const insert = ({\n message,\n generate = true,\n first = false,\n afterStepOf,\n }: {\n message: M\n generate?: boolean\n first?: boolean\n afterStepOf?: string\n }): void => {\n const candidate = {\n id: message.id,\n revision: 0,\n message,\n generate: generate && message.role === 'user',\n ...(afterStepOf === undefined ? {} : { afterStepOf }),\n }\n state.reservedIds = {\n ...state.reservedIds,\n [candidate.id]: true,\n ...(candidate.generate\n ? { [`${candidate.id}:assistant`]: true as const }\n : {}),\n }\n if (first) state.inbox.items.unshift(candidate)\n else state.inbox.items.push(candidate)\n }\n const moveInput = ({ from, to }: { from: number; to: number }): void => {\n if (from === to) return\n const [moved] = state.inbox.items.splice(from, 1)\n state.inbox.items.splice(to, 0, moved!)\n const [previous] = before.inbox.items.splice(from, 1)\n before.inbox.items.splice(to, 0, previous!)\n moves.push({ path: ['inbox', 'items'], move: { from, to } })\n }\n const requestModel = ({\n request,\n id,\n }: {\n request: GenerationRequestedPayload\n id: string\n }): void => {\n const active = state.active!\n const payload = {\n ...request,\n control: { turnId: active.turnId, version: active.version },\n }\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n type: 'ai.generation.requested',\n id,\n payload,\n } as ContractEvent<D>)\n active.model = { id, version: active.version, settled: false }\n active.phase = 'starting'\n jobs.push({\n type: 'ai.generation.requested',\n id,\n payload,\n } as AppendInput<D>)\n }\n if (ctx.event.type === 'ai.session.closed') {\n state.coordinator = { closed: true, queued: [] }\n state.active = null\n state.inbox.items = []\n } else if (ctx.event.type === 'ai.control.requested') {\n const command = ctx.event.payload as ControlCommand<M>\n if (state.coordinator.closed) reason = 'closed'\n else\n switch (command.action) {\n case 'send':\n if (\n inputTaken({\n message: command.message,\n generate: command.generate !== false,\n })\n )\n reason = 'duplicate-input'\n else\n insert({\n message: command.message,\n generate: command.generate !== false,\n })\n break\n case 'edit': {\n const item = state.inbox.items.find(\n (candidate) => candidate.id === command.message.id,\n )\n if (item === undefined)\n reason = missingInputReason(command.message.id)\n else if (item.revision !== command.expectedRevision)\n reason = 'revision-conflict'\n else if (item.message.role !== command.message.role)\n reason = 'revision-conflict'\n else {\n item.message = command.message\n item.revision += 1\n }\n break\n }\n case 'remove': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n if (position < 0) reason = missingInputReason(command.inputId)\n else {\n state.inbox.items.splice(position, 1)\n state.reservedIds = {\n ...state.reservedIds,\n [command.inputId]: 'removed',\n }\n }\n break\n }\n case 'move': {\n const index = state.inbox.items.findIndex(\n (candidate) => candidate.id === command.inputId,\n )\n if (index < 0) reason = missingInputReason(command.inputId)\n else if (\n command.beforeId !== null &&\n !state.inbox.items.some(\n (candidate) => candidate.id === command.beforeId,\n )\n )\n reason = 'not-found'\n else {\n const destination =\n command.beforeId === null\n ? state.inbox.items.length\n : state.inbox.items.findIndex(\n (item) => item.id === command.beforeId,\n )\n moveInput({\n from: index,\n to: destination > index ? destination - 1 : destination,\n })\n }\n break\n }\n case 'send-now': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n const selected = state.inbox.items[position]\n if (!selected) reason = missingInputReason(command.inputId)\n else if ((state.active?.turnId ?? null) !== command.turnId)\n reason = 'stale-turn'\n else if (selected.message.role !== 'user') reason = 'not-user-input'\n else if (\n !selected.generate &&\n knownInput(`${selected.id}:assistant`)\n )\n reason = 'duplicate-input'\n else {\n if (!selected.generate) {\n state.reservedIds = {\n ...state.reservedIds,\n [`${selected.id}:assistant`]: true,\n }\n selected.generate = true\n }\n if (state.active) selected.afterStepOf = state.active.turnId\n else delete selected.afterStepOf\n moveInput({ from: position, to: 0 })\n }\n break\n }\n case 'stop':\n if (state.active?.turnId !== command.turnId) reason = 'stale-turn'\n else\n end({ lastSeenIndex: command.lastSeenIndex, reason: undefined })\n break\n case 'steer':\n if (inputTaken({ message: command.message }))\n reason = 'duplicate-input'\n else {\n insert({\n message: command.message,\n generate: true,\n first: true,\n afterStepOf: command.turnId,\n })\n }\n break\n case 'interrupt': {\n const response = state.coordinator.response\n if (\n !response ||\n response.responseMessageId !== command.request.messageId ||\n (command.request.generationId !==\n response.generation?.generationId &&\n command.request.requestId !== response.activeRequestId)\n )\n reason = 'stale-turn'\n else\n end({\n lastSeenIndex: command.request.lastSeenIndex,\n reason: command.request.reason,\n })\n break\n }\n case 'pause': {\n state.inbox.paused = true\n const active = state.active\n if (\n command.when === 'now' &&\n active !== null &&\n !active.suspended\n ) {\n active.suspended = true\n active.version += 1\n const generation = state.coordinator.response?.generation\n if (generation)\n emit({\n type: 'ai.generation.paused',\n payload: {\n generationId: generation.generationId,\n messageId: generation.responseMessageId,\n },\n })\n }\n break\n }\n case 'resume':\n state.inbox.paused = false\n break\n case 'tool-result': {\n const call = state.coordinator.response?.calls.find(\n (candidate) =>\n candidate.call.generationId === command.result.generationId &&\n candidate.call.messageId === command.result.messageId &&\n candidate.call.toolCallId === command.result.toolCallId &&\n candidate.call.providerExecuted === true &&\n !candidate.terminal,\n )\n if (!call) reason = 'not-found'\n else emit({ type: 'ai.tool.result', payload: command.result })\n break\n }\n case 'approval': {\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) =>\n candidate.approval?.approvalId ===\n command.response.approvalId &&\n candidate.approval.generationId ===\n command.response.generationId &&\n candidate.approval.messageId === command.response.messageId,\n )\n if (response?.failure) reason = 'stale-turn'\n else if (!call || call.response || call.terminal)\n reason = 'not-found'\n else\n emit({ type: 'ai.approval.responded', payload: command.response })\n break\n }\n case 'request-input':\n case 'input': {\n const payload =\n command.action === 'input' ? command.response : command.request\n const response = state.coordinator.response\n if (\n response?.failure !== undefined ||\n response?.generation?.generationId !== payload.generationId ||\n response.responseMessageId !== payload.messageId ||\n (command.action === 'input' &&\n !response.inputs.some(\n (input) =>\n input.inputId === payload.inputId &&\n input.name === payload.name,\n ))\n )\n reason = 'not-found'\n else\n emit({\n type:\n command.action === 'input'\n ? 'ai.input.responded'\n : 'ai.input.requested',\n payload,\n })\n break\n }\n case 'retry': {\n const response = state.coordinator.response\n if (\n !state.active ||\n response?.status !== 'failed' ||\n response.rootMessageId !== command.request.messageId ||\n response.responseMessageId !== command.request.responseMessageId\n )\n reason = 'stale-turn'\n else if (!state.inbox.paused && !state.active.suspended) {\n emit({ type: 'ai.retry.requested', payload: command.request })\n requestModel({\n request: {\n messageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'retry',\n },\n id: `ai.generate:retry:${command.request.retryId}`,\n })\n } else reason = 'stale-turn'\n break\n }\n }\n } else {\n const report = ctx.event.payload as WorkReport\n const active = state.active\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) => candidate.work?.id === report.workId,\n )\n const work = report.kind === 'model' ? active?.model : call?.work\n const current =\n active?.turnId === report.turnId &&\n work?.id === report.workId &&\n work.version === report.version &&\n !work.settled &&\n report.attempt >= (work.attempt ?? 0)\n if (!current) {\n reason = 'stale-work'\n } else {\n work.attempt = report.attempt\n const authorized =\n !active.suspended && active.version === report.version\n for (const event of report.events) {\n if (work.facts?.includes(event.id)) continue\n if (\n authorized ||\n (report.kind === 'tool' && event.type === 'ai.tool.result')\n ) {\n emit({ type: event.type, payload: event.payload, id: event.id })\n work.facts = [...(work.facts ?? []), event.id]\n }\n }\n if (report.settled) work.settled = true\n if (!authorized) reason = 'stale-work'\n }\n }\n\n let active = state.active\n let response = state.coordinator.response\n if (active && response === undefined) {\n state.active = null\n active = null\n }\n if (active && response) {\n const handoff = state.inbox.items.some(\n (item) => item.afterStepOf === active.turnId,\n )\n const outstanding =\n (active.model !== null && !active.model.settled) ||\n response.calls.some(\n (candidate) =>\n candidate.work !== undefined && !candidate.work.settled,\n )\n if (active.suspended) {\n active.phase = outstanding ? 'pausing' : 'paused'\n if (!state.inbox.paused && !outstanding && !handoff)\n active.suspended = false\n }\n if (!active.suspended && response.failure) active.phase = 'failed'\n if (!active.suspended && response.failure === undefined) {\n for (const call of response.calls) {\n if (\n call.terminal ||\n (call.work !== undefined &&\n (!call.work.settled || call.work.version === active.version)) ||\n call.call.providerExecuted === true ||\n (call.approval && !call.response)\n )\n continue\n if (call.response?.approved === false) {\n emit({\n type: 'ai.tool.result',\n payload: {\n ...call.call,\n denied: true,\n phase: 'execution',\n },\n })\n continue\n }\n const id = `${ctx.event.id}:tool:${call.call.toolCallId}`\n call.work = { id, version: active.version, settled: false }\n jobs.push({\n type: 'ai.tool.execution.requested',\n id,\n payload: {\n turnId: active.turnId,\n version: active.version,\n call: call.call,\n generation: response.generation!,\n },\n } as AppendInput<D>)\n }\n }\n response = state.coordinator.response!\n const callsDone = response.calls.every(callReadyForModel)\n const modelDone = active.model === null || active.model.settled\n const workSettled =\n modelDone &&\n response.calls.every(\n (call) => call.work === undefined || call.work.settled,\n )\n const externalPending = response.calls.some(\n (call) =>\n call.call.providerExecuted &&\n call.call.supportsDeferredResults &&\n !call.terminal &&\n !approvalBlocksExecution(call),\n )\n const handoffReady =\n handoff &&\n workSettled &&\n !externalPending &&\n (active.suspended ||\n response.failure !== undefined ||\n response.calls.every(\n (call) => callReadyForModel(call) || approvalBlocksExecution(call),\n ))\n const readyForModel =\n !active.suspended &&\n response.failure === undefined &&\n modelDone &&\n callsDone &&\n response.inputs.length === 0\n const naturalCompletion =\n readyForModel &&\n response.completion !== undefined &&\n response.completion.finishReason !== 'tool-calls'\n if (handoffReady && !naturalCompletion) {\n end({ lastSeenIndex: undefined, reason: 'steered after step' })\n } else if (readyForModel && (!handoff || handoffReady)) {\n const resume =\n active.model !== null && active.model.version !== active.version\n const input = response.inputResponse\n if (\n !handoff &&\n (resume ||\n continuationReady(state.coordinator) ||\n (response.completion && input))\n ) {\n const nextReason = resume ? 'resume' : input ? 'input' : 'tool'\n const id =\n nextReason === 'tool'\n ? `ai.generate:tools:${response.generation!.generationId}`\n : `${ctx.event.id}:generate:${nextReason}`\n requestModel({\n request: {\n messageId: response.responseMessageId,\n responseMessageId: response.responseMessageId,\n reason: nextReason,\n },\n id,\n })\n } else if (naturalCompletion) {\n emit({\n type: 'ai.message.completed',\n payload: {\n messageId: response.responseMessageId,\n },\n })\n state.active = null\n }\n }\n if (\n !active.suspended &&\n state.active &&\n jobs.every((job) => job.type !== 'ai.generation.requested')\n )\n state.active.phase = response.failure\n ? 'failed'\n : !modelDone\n ? 'generating'\n : !callsDone\n ? 'tools'\n : 'waiting'\n }\n if (\n state.active === null &&\n !state.inbox.paused &&\n !state.coordinator.closed\n ) {\n while (state.inbox.items.length > 0) {\n const item = state.inbox.items.shift()!\n delete item.afterStepOf\n emit({\n type: 'ai.message.created',\n payload: { message: item.message, generate: item.generate },\n id: `ai.admitted:${item.id}`,\n })\n if (!item.generate) continue\n state.active = {\n turnId: item.id,\n input: item,\n phase: 'starting',\n version: 0,\n suspended: false,\n model: null,\n }\n requestModel({\n request: { messageId: item.id, reason: 'message' },\n id: `ai.generate:message:${item.id}`,\n })\n break\n }\n }\n const receipt: ControlReceipt = {\n commandId: ctx.event.id,\n ...(ctx.event.type === 'ai.work.reported' ? { work: true as const } : {}),\n outcome: reason === undefined ? 'applied' : 'rejected',\n ...(reason === undefined ? {} : { reason }),\n }\n return [\n ...(facts as AppendInput<D>[]),\n {\n type: 'ai.control.committed',\n payload: controlCommit({ before, after: state, moves }),\n } as AppendInput<D>,\n ...jobs,\n { type: 'ai.control.decided', payload: receipt } as AppendInput<D>,\n ]\n }\n\n const report = ({\n ctx,\n events,\n settled,\n name,\n }: {\n ctx: HandlerContext<D>\n events: readonly AppendInput<D>[]\n settled: boolean\n name: string\n }): AppendInput<D> => {\n const payload = ctx.event.payload as\n GenerationRequestedPayload | { turnId: string; version: number }\n const { turnId, version } = 'turnId' in payload ? payload : payload.control!\n for (const event of events) {\n const schema = options.agent.contract.events[\n event.type\n ] as StandardSchemaV1<unknown>\n const result = validateSync(\n schema,\n event.payload,\n `AI worker ${event.type}`,\n )\n if (result.issues)\n throw new TypeError(\n result.issues.map((issue) => issue.message).join('; '),\n )\n }\n return {\n type: 'ai.work.reported',\n id: `${ctx.event.id}:report:${ctx.attempt}:${name}`,\n payload: {\n workId: ctx.event.id,\n attempt: ctx.attempt,\n turnId,\n version,\n kind: ctx.event.type === 'ai.generation.requested' ? 'model' : 'tool',\n settled,\n events: events\n .filter(\n (event) =>\n event.type !== 'ai.message.completed' &&\n event.type !== 'ai.message.interrupted',\n )\n .map((event, index) => ({\n type: event.type,\n payload: event.payload,\n id:\n event.id ??\n `${ctx.event.id}:fact:${ctx.attempt}:${name}:${index}`,\n })),\n },\n } as AppendInput<D>\n }\n\n const append = async ({\n ctx,\n name,\n events,\n }: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]> => {\n const progress = events.filter(\n (event) => event.type === 'ai.generation.progress',\n )\n const lifecycle = events.filter(\n (event) => event.type !== 'ai.generation.progress',\n )\n if (lifecycle.length === 0) return ctx.session.append(name, ...progress)\n const input = report({ ctx, events: lifecycle, settled: false, name })\n const persisted = await ctx.session.append(name, ...progress, input)\n const index = persisted.at(-1)!.index\n const feed = ctx.session.stream({ startAfter: index })\n const stream = feed[Symbol.asyncIterator]()\n const canonical: ContractEvent<D>[] = []\n const wanted = new Set(lifecycle.map((event) => event.id))\n let rejectAbort!: (error: unknown) => void\n const aborted = new Promise<never>((_, reject) => {\n rejectAbort = reject\n })\n const onAbort = (): void => {\n rejectAbort(ctx.signal.reason)\n }\n ctx.signal.addEventListener('abort', onAbort, { once: true })\n try {\n ctx.signal.throwIfAborted()\n for (;;) {\n const item = await Promise.race([stream.next(), aborted])\n if (item.done)\n throw new Error('AI control acknowledgement stream ended')\n if (wanted.has(item.value.id)) canonical.push(item.value)\n if (\n item.value.type === 'ai.control.decided' &&\n (item.value.payload as ControlReceipt).commandId === input.id\n ) {\n if ((item.value.payload as ControlReceipt).outcome === 'rejected')\n throw new ControlCancelled('stale AI work')\n return [\n ...persisted.filter((event) => event.type !== 'ai.work.reported'),\n ...canonical,\n ]\n }\n }\n } finally {\n ctx.signal.removeEventListener('abort', onAbort)\n await stream.return?.()\n }\n }\n\n const settled = ({\n ctx,\n events,\n }: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): AppendInput<D> =>\n report({\n ctx,\n events:\n events === undefined\n ? []\n : Array.isArray(events)\n ? events\n : [events as AppendInput<D>],\n settled: true,\n name: 'settled',\n })\n const cancelled = ({\n error,\n signal,\n }: {\n error: unknown\n signal: AbortSignal\n }): boolean => {\n if (signal.reason instanceof A2Error) throw signal.reason\n return error instanceof ControlCancelled || signal.aborted\n }\n return { handler, append, settled, cancelled, reducer, coordinator }\n}\n","import {\n convertToModelMessages,\n stepCountIs,\n streamText,\n toUIMessageStream,\n} from 'ai'\nimport type {\n FinishReason,\n InferUIMessageChunk,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n} from 'ai'\n\ntype StreamTextOptions<T extends ToolSet> = Parameters<typeof streamText<T>>[0]\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\ntype ModelStepTimeout<T extends ToolSet> =\n | number\n | Omit<\n Exclude<StreamTextOptions<T>['timeout'], number | undefined>,\n 'toolMs' | 'tools'\n >\n\ntype ControlledStreamTextSetting =\n | '_internal'\n | 'abortSignal'\n | 'instructions'\n | 'messages'\n | 'model'\n | 'onToolExecutionEnd'\n | 'onToolExecutionStart'\n | 'experimental_onToolCallFinish'\n | 'experimental_onToolCallStart'\n | 'experimental_sandbox'\n | 'experimental_toolCallers'\n | 'experimental_toolApprovalSecret'\n | 'prompt'\n | 'prepareStep'\n | 'stopWhen'\n | 'system'\n | 'tools'\n\ntype RetypedStreamTextSetting =\n | 'experimental_onStart'\n | 'experimental_onStepStart'\n | 'experimental_repairToolCall'\n | 'experimental_transform'\n | 'onStart'\n | 'onStepStart'\n | 'repairToolCall'\n\ntype ModelFacingTools<T extends ToolSet> = {\n readonly [K in keyof T]: Omit<T[K], 'execute'>\n}\n\ntype SettingEvent<T extends ToolSet, K extends keyof StreamTextOptions<T>> =\n NonNullable<StreamTextOptions<T>[K]> extends (event: infer EVENT) => unknown\n ? EVENT\n : never\n\ntype ModelPhaseStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseStepStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStepStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseCallback<EVENT> = (event: EVENT) => void | PromiseLike<void>\n\ntype StreamTextRepairToolCall<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['repairToolCall']\n>\n\ntype ModelPhaseRepairToolCall<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextRepairToolCall<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextRepairToolCall<T>>\n\ntype StreamTextTransformSetting<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['experimental_transform']\n>\n\ntype StreamTextTransform<T extends ToolSet> = Extract<\n StreamTextTransformSetting<T>,\n (...args: never[]) => unknown\n>\n\ntype ModelPhaseTransform<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextTransform<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextTransform<T>>\n\n/** AI SDK streamText settings that remain meaningful for one durable step. */\nexport type AISDKStepSettings<T extends ToolSet> = Partial<\n Omit<\n StreamTextOptions<T>,\n ControlledStreamTextSetting | RetypedStreamTextSetting | 'timeout'\n >\n> & {\n timeout?: ModelStepTimeout<T>\n onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n experimental_onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n experimental_onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_transform?:\n ModelPhaseTransform<T> | Array<ModelPhaseTransform<T>>\n}\n\nexport type AISDKStepInput<M extends UIMessage, T extends ToolSet> = {\n model: LanguageModel\n tools: T\n messages: M[]\n modelMessages?: ModelMessage[]\n responseMessageId: string\n abortSignal: AbortSignal\n instructions?: Instructions\n settings?: AISDKStepSettings<T>\n messageMetadata?: (options: {\n part: TextStreamPart<T>\n }) => UIMessageMetadata<M> | undefined\n}\n\nexport type AISDKStepCompletion = {\n finishReason: FinishReason\n usage: LanguageModelUsage\n}\n\nexport type AISDKStepResult<M extends UIMessage> = {\n stream: ReadableStream<InferUIMessageChunk<M>>\n completion(): AISDKStepCompletion\n}\n\nconst CONTROLLED_SETTINGS: readonly ControlledStreamTextSetting[] = [\n '_internal',\n 'abortSignal',\n 'instructions',\n 'messages',\n 'model',\n 'onToolExecutionEnd',\n 'onToolExecutionStart',\n 'experimental_onToolCallFinish',\n 'experimental_onToolCallStart',\n 'experimental_sandbox',\n 'experimental_toolCallers',\n 'experimental_toolApprovalSecret',\n 'prompt',\n 'prepareStep',\n 'stopWhen',\n 'system',\n 'tools',\n]\n\nconst safeSettings = <T extends ToolSet>(\n settings: AISDKStepSettings<T> | undefined,\n): AISDKStepSettings<T> => {\n const result = { ...settings } as AISDKStepSettings<T>\n for (const key of CONTROLLED_SETTINGS) Reflect.deleteProperty(result, key)\n if (typeof result.timeout === 'object' && result.timeout !== null) {\n const timeout = { ...result.timeout } as Record<string, unknown>\n Reflect.deleteProperty(timeout, 'toolMs')\n Reflect.deleteProperty(timeout, 'tools')\n result.timeout = timeout as ModelStepTimeout<T>\n }\n return result\n}\n\nconst modelToolSet = <T extends ToolSet>(tools: T): T =>\n Object.fromEntries(\n Object.entries(tools).map(([name, tool]) => {\n if (tool.type === 'provider' && tool.isProviderExecuted === true) {\n return [name, tool]\n }\n const definition = { ...tool }\n Reflect.deleteProperty(definition, 'execute')\n return [name, definition]\n }),\n ) as T\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\n/** Run exactly one AI SDK model step while leaving local tool execution to A2. */\nexport async function generateAISDKStep<M extends UIMessage, T extends ToolSet>(\n input: AISDKStepInput<M, T>,\n): Promise<AISDKStepResult<M>> {\n const settings = safeSettings(input.settings)\n const tools = modelToolSet(input.tools)\n const messages =\n input.modelMessages ??\n (await convertToModelMessages(input.messages, { tools }))\n const streamOptions = {\n ...settings,\n model: input.model,\n tools,\n messages,\n abortSignal: input.abortSignal,\n ...(input.instructions === undefined\n ? {}\n : { instructions: input.instructions }),\n stopWhen: stepCountIs(1),\n // A2 records stream failures durably; the AI SDK default writes them to\n // stderr in addition to yielding an error part.\n onError: settings.onError ?? (() => {}),\n } as unknown as StreamTextOptions<T>\n const result = streamText<T>(streamOptions)\n\n let completion: AISDKStepCompletion | undefined\n let fatalError: { value: unknown } | undefined\n const observed = result.stream.pipeThrough(\n new TransformStream<TextStreamPart<T>, TextStreamPart<T>>({\n transform(part, controller) {\n if (part.type === 'error' && fatalError === undefined) {\n fatalError = { value: part.error }\n } else if (part.type === 'finish') {\n completion = {\n finishReason: part.finishReason,\n usage: part.totalUsage,\n }\n }\n controller.enqueue(part)\n },\n }),\n )\n\n return {\n stream: toUIMessageStream<T, M>({\n stream: observed,\n tools,\n generateMessageId: () => input.responseMessageId,\n onError: errorMessage,\n ...(input.messageMetadata === undefined\n ? {}\n : { messageMetadata: input.messageMetadata }),\n }),\n completion() {\n if (fatalError !== undefined) throw fatalError.value\n if (completion === undefined) {\n throw new Error('AI SDK step ended without a finish part')\n }\n if (completion.finishReason === 'error') {\n throw new Error('AI SDK step finished with an error')\n }\n return completion\n },\n }\n}\n","import type { LanguageModel } from 'ai'\nimport type { ModelLimits } from './ai.ts'\n\nconst catalogUrl = 'https://ai-gateway.vercel.sh/v1/models'\nconst catalogLifetimeMs = 60 * 60 * 1_000\nconst catalogTimeoutMs = 5_000\n\nlet catalog:\n | {\n expiresAt: number\n promise: Promise<ReadonlyMap<string, ModelLimits>>\n }\n | undefined\n\nexport const gatewayModelId = (model: LanguageModel): string | undefined => {\n if (typeof model === 'string') {\n return globalThis.AI_SDK_DEFAULT_PROVIDER === undefined ? model : undefined\n }\n return model.provider === 'gateway' ? model.modelId : undefined\n}\n\nconst readCatalog = (): Promise<ReadonlyMap<string, ModelLimits>> => {\n if (catalog && catalog.expiresAt > Date.now()) return catalog.promise\n const entry = {\n expiresAt: Number.POSITIVE_INFINITY,\n promise: (async () => {\n const controller = new AbortController()\n const timeout = setTimeout(\n () => controller.abort(new Error('model catalog request timed out')),\n catalogTimeoutMs,\n )\n timeout.unref?.()\n try {\n const response = await fetch(catalogUrl, { signal: controller.signal })\n if (!response.ok)\n throw new Error(\n `model catalog request failed: HTTP ${response.status}`,\n )\n const body: unknown = await response.json()\n if (\n typeof body !== 'object' ||\n body === null ||\n !('data' in body) ||\n !Array.isArray(body.data)\n ) {\n throw new Error('model catalog response must contain a data array')\n }\n const models = new Map<string, ModelLimits>()\n for (const row of body.data as unknown[]) {\n if (\n typeof row !== 'object' ||\n row === null ||\n !('type' in row) ||\n !('id' in row) ||\n !('context_window' in row) ||\n !('max_tokens' in row) ||\n row.type !== 'language' ||\n typeof row.id !== 'string' ||\n typeof row.context_window !== 'number' ||\n typeof row.max_tokens !== 'number' ||\n !Number.isSafeInteger(row.context_window) ||\n row.context_window <= 0 ||\n !Number.isSafeInteger(row.max_tokens) ||\n row.max_tokens <= 0\n )\n continue\n models.set(row.id, {\n contextWindow: row.context_window,\n maxOutputTokens: row.max_tokens,\n })\n }\n return models\n } finally {\n clearTimeout(timeout)\n }\n })(),\n }\n catalog = entry\n entry.promise = entry.promise.then(\n (models) => {\n entry.expiresAt = Date.now() + catalogLifetimeMs\n return models\n },\n (error: unknown) => {\n if (catalog === entry) catalog = undefined\n throw error\n },\n )\n return entry.promise\n}\n\nexport const readModelLimits = async (options: {\n modelId: string\n signal: AbortSignal\n}): Promise<ModelLimits | null> => {\n options.signal.throwIfAborted()\n let onAbort!: () => void\n const aborted = new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(options.signal.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n })\n try {\n const models = await Promise.race([readCatalog(), aborted])\n return models.get(options.modelId) ?? null\n } finally {\n options.signal.removeEventListener('abort', onAbort)\n }\n}\n","/**\n * experimental-a2/ai/server — the server-only implementation of an experimental-a2/ai definition.\n *\n * `createHandlers()` exposes the ordinary A2 handler table;\n * `createAgentServer()` is its batteries-included assembly with createServer.\n */\n\n// oxlint-disable no-await-in-loop -- stream chunks and durable appends are\n// ordered; parallel consumption would corrupt progress sequence and state.\n\nimport { createControlRuntime, ControlCancelled } from './ai-control-server.ts'\nimport type { ControlCommit } from './ai-control.ts'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { asSchema, convertToModelMessages } from 'ai'\nimport type {\n FinishReason,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport { generateAISDKStep, type AISDKStepSettings } from './ai-sdk-step.ts'\nimport { gatewayModelId, readModelLimits } from './ai-model-metadata.ts'\nimport type {\n AIEventDefs,\n AIState,\n AgentDefinition,\n AgentToolContext,\n AgentToolEventDefs,\n ApprovalRequestedPayload,\n CompactionCompletedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationStartedPayload,\n MessageCompletedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n type AICoordinatorState,\n} from './ai-coordinator.ts'\nimport type { AppendInput, ContractEvent, EventDefs } from './contract.ts'\nimport { A2Error } from './errors.ts'\nimport {\n consumeSchedulerSendFailure,\n installAmbientToolScopeStorage,\n type AmbientToolScope,\n} from './internal.ts'\nimport {\n createServer,\n type A2Server,\n type HandlerContext,\n type ServerOptions,\n} from './server.ts'\nimport {\n setServerFetchHooks,\n type ServerIngressContext,\n} from './server-fetch.ts'\n\nfunction validateAgentIngress(context: ServerIngressContext): void {\n const rejected = context.events.find((event) => {\n if (event.type !== 'ai.control.requested') return true\n const command = event.payload as Record<string, unknown>\n if (\n command['action'] === 'request-input' ||\n command['action'] === 'tool-result'\n )\n return true\n if (\n command['action'] === 'send' ||\n command['action'] === 'edit' ||\n command['action'] === 'steer'\n ) {\n return (\n (command['message'] as { role?: unknown } | undefined)?.role !== 'user'\n )\n }\n return false\n })\n if (rejected !== undefined) {\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `event '${rejected.type}' is server-only for an AI agent`,\n )\n }\n}\n\ntype AgentGenerationProgress = {\n type: 'progress'\n chunks: UIMessageChunk[]\n}\n\ntype AgentGenerationFinish = {\n type: 'finish'\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype AgentGenerationUpdate = AgentGenerationProgress | AgentGenerationFinish\n\nexport type AgentGenerateContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = {\n request: ContractEvent<D, 'ai.generation.requested'>\n requestId: string\n generationId: string\n responseMessageId: string\n messages: M[]\n modelMessages: ModelMessage[]\n state: AIState<M>\n session: Pick<HandlerContext<D>['session'], 'state'>\n signal: AbortSignal\n model: LanguageModel\n tools: T\n instructions?: Instructions\n generation: AgentGenerationSettings<T>\n}\n\nexport type AgentGenerate<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = (\n context: AgentGenerateContext<M, D, T>,\n) => ReadableStream<UIMessageChunk> | Promise<ReadableStream<UIMessageChunk>>\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\nexport type AgentMessageMetadata<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = (\n context: AgentGenerateContext<M, D, T> & { part: TextStreamPart<T> },\n) => UIMessageMetadata<M> | undefined\n\nexport type AgentResolverContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n event: ContractEvent<D, 'ai.generation.requested'>\n state: AIState<M>\n session: Pick<HandlerContext<D>['session'], 'state'>\n signal: AbortSignal\n}\n\nexport type Resolvable<T, C> = T | ((context: C) => T | Promise<T>)\n\nexport type CompactionPolicy<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n shouldCompact(\n context: AgentResolverContext<M, D> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): boolean | Promise<boolean>\n compact(\n context: AgentResolverContext<M, D> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): M[] | Promise<M[]>\n}\n\nexport type AutomaticCompaction = {\n thresholdTokens?: number\n instructions?: string\n}\n\nexport type CompactionOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = false | AutomaticCompaction | CompactionPolicy<M, D>\n\nexport type AgentGenerationSettings<T extends ToolSet> = AISDKStepSettings<T>\n\nexport type CreateHandlersOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n> = {\n agent: AgentDefinition<M, D>\n /** AI SDK model string or provider model, optionally resolved per generation. */\n model: Resolvable<LanguageModel, AgentResolverContext<M, D>>\n tools?: T\n instructions?: Resolvable<\n Instructions | undefined,\n AgentResolverContext<M, D>\n >\n /** Settings for each one-step AI SDK streamText call. */\n generation?: AgentGenerationSettings<T>\n /**\n * Maximum model steps in one assistant response. Defaults to Infinity.\n */\n maxSteps?: number\n /** Map default AI SDK stream parts to typed assistant message metadata. */\n messageMetadata?: AgentMessageMetadata<M, D, T>\n /**\n * Replace model generation with an AI SDK UI message chunk stream.\n * The custom stream owns its metadata chunks.\n */\n generate?: AgentGenerate<M, D, T>\n compaction?: Resolvable<CompactionOptions<M, D>, AgentResolverContext<M, D>>\n /** Progress is durably flushed at either limit, whichever is reached first. */\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}\n\nexport type CreateAgentServerOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n> = CreateHandlersOptions<M, D, T> &\n Omit<ServerOptions<D>, 'contract' | 'handlers'> & {\n handlers?: ServerOptions<D>['handlers']\n }\n\nconst checkAbort = (signal: AbortSignal): boolean => {\n if (!signal.aborted) return false\n const reason: unknown = signal.reason\n if (\n reason instanceof A2Error &&\n (reason.code === 'CLAIM_EXPIRED' || reason.code === 'SUPERSEDED_ATTEMPT')\n ) {\n throw reason\n }\n return true\n}\n\nconst resolve = async <T, C extends { signal: AbortSignal }>(\n value: Resolvable<T, C>,\n context: C,\n): Promise<T> => {\n let result: T\n try {\n result =\n typeof value === 'function'\n ? await (value as (context: C) => T | Promise<T>)(context)\n : value\n } catch (error) {\n checkAbort(context.signal)\n throw error\n }\n checkAbort(context.signal)\n return result\n}\n\nconst modelName = (model: LanguageModel): string => {\n if (typeof model === 'string') return model\n if ('modelId' in model && typeof model.modelId === 'string') {\n return model.modelId\n }\n return 'custom'\n}\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\nconst toolScopeStorage = installAmbientToolScopeStorage(\n () => new AsyncLocalStorage<AmbientToolScope>(),\n)\n\n/** Run `fn` with `ctx` as the ambient tool handler context, for direct tool tests. */\nexport function runWithHandlerContext<D extends AgentToolEventDefs, R>(\n ctx: AgentToolContext<D>,\n fn: () => R,\n): R {\n return toolScopeStorage.run({ context: ctx }, fn)\n}\n\nconst promptCacheKey = (sessionId: string, generationId: string): string =>\n `${sessionId}\\u001f${generationId}`\n\nconst asyncIterator = (value: unknown): AsyncIterator<unknown> | undefined => {\n if (typeof value !== 'object' || value === null) return undefined\n const factory = Reflect.get(value, Symbol.asyncIterator)\n if (typeof factory !== 'function') return undefined\n return (factory as (this: object) => AsyncIterator<unknown>).call(value)\n}\n\nconst isBoundaryChunk = (chunk: UIMessageChunk | undefined): boolean =>\n chunk !== undefined &&\n (chunk.type === 'text-end' ||\n chunk.type === 'reasoning-end' ||\n chunk.type === 'tool-input-available' ||\n chunk.type === 'tool-input-error' ||\n chunk.type === 'tool-output-available' ||\n chunk.type === 'tool-output-error' ||\n chunk.type === 'tool-output-denied' ||\n chunk.type === 'tool-approval-request' ||\n chunk.type === 'finish' ||\n chunk.type === 'abort' ||\n chunk.type === 'error')\n\ntype StreamRead<T> = Awaited<ReturnType<ReadableStreamDefaultReader<T>['read']>>\n\nconst nextOrTimer = async <T>(\n next: Promise<StreamRead<T>>,\n delayMs: number,\n): Promise<{ type: 'next'; result: StreamRead<T> } | { type: 'timer' }> => {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n next.then((result) => ({ type: 'next' as const, result })),\n new Promise<{ type: 'timer' }>((finishTimer) => {\n timer = setTimeout(() => finishTimer({ type: 'timer' }), delayMs)\n ;(timer as { unref?: () => void }).unref?.()\n }),\n ])\n } finally {\n if (timer !== undefined) clearTimeout(timer)\n }\n}\n\ntype GenerationCompletion = {\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype GenerationSource = {\n stream: ReadableStream<UIMessageChunk>\n completion?: () => GenerationCompletion\n}\n\nasync function generateWithAISDK<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(\n context: AgentGenerateContext<M, D, T>,\n messageMetadata: AgentMessageMetadata<M, D, T> | undefined,\n): Promise<GenerationSource> {\n const step = await generateAISDKStep<M, T>({\n model: context.model,\n tools: context.tools,\n messages: context.messages,\n modelMessages: context.modelMessages,\n responseMessageId: context.responseMessageId,\n abortSignal: context.signal,\n ...(context.instructions === undefined\n ? {}\n : { instructions: context.instructions }),\n settings: context.generation,\n ...(messageMetadata === undefined\n ? {}\n : {\n messageMetadata: ({ part }) => messageMetadata({ ...context, part }),\n }),\n })\n return {\n stream: step.stream as ReadableStream<UIMessageChunk>,\n completion: step.completion,\n }\n}\n\nasync function* consumeGeneration(options: {\n source: GenerationSource\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}): AsyncGenerator<AgentGenerationUpdate> {\n const pending: UIMessageChunk[] = []\n let streamedFinishReason: FinishReason | undefined\n let streamedError: string | undefined\n const maxChunks = options.progress?.maxChunks ?? 16\n const maxDelayMs = options.progress?.maxDelayMs ?? 30\n let lastFlush = Date.now()\n const reader = options.source.stream.getReader()\n let pendingChunk = reader.read()\n try {\n for (;;) {\n let result: StreamRead<UIMessageChunk>\n if (pending.length > 0) {\n const remaining = Math.max(0, maxDelayMs - (Date.now() - lastFlush))\n const outcome = await nextOrTimer(pendingChunk, remaining)\n if (outcome.type === 'timer') {\n yield { type: 'progress', chunks: pending.splice(0) }\n lastFlush = Date.now()\n continue\n }\n result = outcome.result\n } else {\n result = await pendingChunk\n }\n if (result.done) break\n const chunk = result.value\n pending.push(chunk)\n if (chunk.type === 'finish') streamedFinishReason = chunk.finishReason\n if (chunk.type === 'error') streamedError = chunk.errorText\n pendingChunk = reader.read()\n\n if (pending.length >= maxChunks || isBoundaryChunk(pending.at(-1))) {\n yield { type: 'progress', chunks: pending.splice(0) }\n lastFlush = Date.now()\n }\n }\n } catch (error) {\n if (pending.length > 0)\n yield { type: 'progress', chunks: pending.splice(0) }\n throw error\n } finally {\n void pendingChunk.catch(() => {})\n try {\n await reader.cancel()\n } catch {\n // Cleanup must not replace the error that ended generation.\n } finally {\n reader.releaseLock()\n }\n }\n\n let completion: GenerationCompletion | undefined\n try {\n completion = options.source.completion?.()\n } catch (error) {\n if (pending.length > 0) {\n yield { type: 'progress', chunks: pending.splice(0) }\n }\n throw error\n }\n if (pending.length > 0) {\n yield { type: 'progress', chunks: pending.splice(0) }\n }\n if (streamedError !== undefined) throw new Error(streamedError)\n const finishReason = completion?.finishReason ?? streamedFinishReason\n yield {\n type: 'finish',\n ...(finishReason === undefined ? {} : { finishReason }),\n ...(completion?.usage === undefined ? {} : { usage: completion.usage }),\n }\n}\n\nconst foldAIEvents = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n state: AIState<M>\n events: ContractEvent<D>[]\n}): AIState<M> => {\n let state = options.state\n for (const event of options.events)\n state = options.agent.reducer.fold(state, event)\n return state\n}\n\nconst summarize = async <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n context: AgentGenerateContext<M, D, T>\n instructions: string | undefined\n}): Promise<{ summary: string; usage?: LanguageModelUsage }> => {\n const instruction = [\n 'Summarize this conversation so you can continue the task after the earlier context is replaced by your summary.',\n 'Preserve the objective, constraints, decisions, exact identifiers, completed actions and their results, unresolved questions, and next steps. Distinguish observations from assumptions.',\n 'Respond only with the summary as text. Do not call any tools or continue working on the task.',\n options.instructions,\n ]\n .filter(Boolean)\n .join('\\n')\n const generation = { ...options.context.generation }\n for (const key of Object.keys(generation)) {\n if (\n key.startsWith('on') ||\n key.startsWith('experimental_on') ||\n [\n 'repairToolCall',\n 'experimental_repairToolCall',\n 'experimental_refineToolInput',\n 'experimental_transform',\n 'toolApproval',\n ].includes(key)\n ) {\n Reflect.deleteProperty(generation, key)\n }\n }\n const tools = Object.fromEntries(\n Object.entries(options.context.tools).map(([name, tool]) => {\n const definition = { ...tool, needsApproval: false }\n for (const key of [\n 'execute',\n 'onInputStart',\n 'onInputDelta',\n 'onInputAvailable',\n ]) {\n Reflect.deleteProperty(definition, key)\n }\n return [name, definition]\n }),\n ) as T\n const source = await generateWithAISDK(\n {\n ...options.context,\n generation,\n tools,\n modelMessages: [\n ...options.context.modelMessages,\n { role: 'user', content: instruction },\n ],\n responseMessageId: `${options.context.generationId}:summary`,\n },\n undefined,\n )\n let summary = ''\n let calledTool = false\n let finish: AgentGenerationFinish | undefined\n for await (const update of consumeGeneration({ source })) {\n options.context.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n for (const chunk of update.chunks) {\n if (chunk.type === 'text-delta') summary += chunk.delta\n if (chunk.type.startsWith('tool-')) calledTool = true\n }\n }\n if (\n calledTool ||\n summary.trim().length === 0 ||\n finish?.finishReason !== 'stop'\n ) {\n throw new Error(\n 'compaction must produce a complete text summary without calling tools',\n )\n }\n return {\n summary,\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n}\n\nconst activeCompaction = <M extends UIMessage>(\n state: AIState<M>,\n): AIState<M>['compaction'] => {\n const compaction = state.compaction\n return compaction?.status === 'completed' &&\n compaction.messages !== undefined &&\n state.messages.some((message) => message.id === compaction.throughMessageId)\n ? compaction\n : null\n}\n\nconst contextMessages = async <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n session: HandlerContext<D>['session']\n snapshot: { state: AIState<M>; index: number }\n coordinator: AICoordinatorState\n appended?: ContractEvent<D>[]\n excluded?: ReadonlySet<string>\n}): Promise<M[]> => {\n const { agent, session, snapshot } = options\n const appended = options.appended ?? []\n const state = foldAIEvents({ agent, events: appended, state: snapshot.state })\n const compaction = activeCompaction(state)\n const queued = new Set(\n options.coordinator.queued.map((item) => item.messageId),\n )\n const visible = (messages: M[]): M[] =>\n messages.filter((message) => !queued.has(message.id))\n if (compaction === null) return visible(state.messages)\n const retained = new Set(compaction.retainedMessageIds ?? [])\n const throughIndex = compaction.throughIndex\n if (throughIndex !== undefined) {\n const [prefix, priorCoordinator, tail] = await Promise.all([\n throughIndex === snapshot.index\n ? Promise.resolve(snapshot)\n : session.state(agent.reducer, { through: throughIndex }),\n session.state(aiCoordinatorReducer(agent.contract), {\n through: throughIndex,\n }),\n throughIndex >= snapshot.index\n ? Promise.resolve([])\n : session.history({ gte: throughIndex + 1, lte: snapshot.index }),\n ])\n for (const item of priorCoordinator.state.queued)\n retained.add(item.messageId)\n const events =\n options.excluded === undefined\n ? tail\n : withoutGenerationLifecycle(tail, options.excluded)\n const context = foldAIEvents({\n agent,\n events: [...events, ...appended],\n state: {\n ...prefix.state,\n messages: [\n ...compaction.messages!,\n ...prefix.state.messages.filter((message) =>\n retained.has(message.id),\n ),\n ],\n activeProjection: null,\n },\n })\n const positions = new Map<string, number>()\n for (const message of [...compaction.messages!, ...state.messages]) {\n if (!positions.has(message.id)) positions.set(message.id, positions.size)\n }\n return visible(\n context.messages.toSorted(\n (left, right) =>\n (positions.get(left.id) ?? positions.size) -\n (positions.get(right.id) ?? positions.size),\n ),\n )\n }\n const boundary = state.messages.findIndex(\n (message) => message.id === compaction.throughMessageId,\n )\n return visible([\n ...compaction.messages!,\n ...state.messages\n .slice(0, boundary + 1)\n .filter((message) => retained.has(message.id)),\n ...state.messages.slice(boundary + 1),\n ])\n}\n\nconst modelContext = async <M extends UIMessage>(options: {\n messages: M[]\n state: AIState<M>\n tools: ToolSet\n}): Promise<ModelMessage[]> => {\n const messages = await convertToModelMessages(options.messages, {\n tools: options.tools,\n })\n const summary = activeCompaction(options.state)?.summary\n return summary === undefined\n ? messages\n : [{ role: 'user', content: summary }, ...messages]\n}\n\nconst estimateInputTokens = async (options: {\n messages: ModelMessage[]\n instructions: Instructions | undefined\n tools: ToolSet\n}): Promise<number> => {\n const tools = await Promise.all(\n Object.entries(options.tools).map(async ([name, tool]) => ({\n name,\n description: tool.description,\n inputSchema: await asSchema(tool.inputSchema).jsonSchema,\n })),\n )\n return Math.ceil(\n new TextEncoder().encode(\n JSON.stringify({\n messages: options.messages,\n instructions: options.instructions,\n tools,\n }),\n ).byteLength / 4,\n )\n}\n\nconst measuredInputTokens = (options: {\n estimate: number\n model: string\n calibration: AICoordinatorState['calibration']\n}): number => {\n const previous = options.calibration\n return previous !== undefined &&\n previous.model === options.model &&\n options.estimate >= previous.estimate\n ? Math.max(\n options.estimate,\n Math.ceil(previous.inputTokens + options.estimate - previous.estimate),\n )\n : options.estimate\n}\n\ntype ToolCallClassification = 'automatic' | 'approval' | 'unknown'\n\ntype PendingToolCall = {\n call: ToolCalledPayload\n classification: ToolCallClassification\n}\n\nconst toolCalledEvent = <D extends EventDefs>(\n payload: ToolCalledPayload,\n): AppendInput<D> =>\n ({\n type: 'ai.tool.called',\n id: `${payload.generationId}:tool:${payload.toolCallId}:called`,\n payload,\n }) as AppendInput<D>\n\nconst approvalClassification = <T extends ToolSet>(\n tools: T,\n generation: AgentGenerationSettings<T>,\n toolName: string,\n): ToolCallClassification => {\n const configured = generation.toolApproval\n if (typeof configured === 'function') return 'unknown'\n const policy = configured?.[toolName]\n if (typeof policy === 'function') return 'unknown'\n if (\n policy === 'user-approval' ||\n (typeof policy === 'object' && policy?.type === 'user-approval')\n ) {\n return 'approval'\n }\n if (\n policy === 'denied' ||\n (typeof policy === 'object' && policy?.type === 'denied')\n ) {\n return 'approval'\n }\n const tool = tools[toolName] as { needsApproval?: unknown } | undefined\n if (typeof tool?.needsApproval === 'function') return 'unknown'\n return tool?.needsApproval === true ? 'approval' : 'automatic'\n}\n\nconst lifecycleEvents = <D extends EventDefs, T extends ToolSet>(options: {\n requestId: string\n messageId: string\n generationId: string\n sequence: number\n chunks: UIMessageChunk[]\n pending: PendingToolCall[]\n tools: T\n generation: AgentGenerationSettings<T>\n custom: boolean\n}): { events: AppendInput<D>[]; pending: PendingToolCall[] } => {\n const result: AppendInput<D>[] = []\n const pending = [...options.pending]\n const take = (toolCallId: string): PendingToolCall | undefined => {\n const index = pending.findIndex(\n (candidate) => candidate.call.toolCallId === toolCallId,\n )\n if (index === -1) return undefined\n return pending.splice(index, 1)[0]\n }\n const flush = (toolCallId: string): void => {\n const pendingCall = take(toolCallId)\n if (pendingCall) result.push(toolCalledEvent<D>(pendingCall.call))\n }\n for (const [chunkIndex, chunk] of options.chunks.entries()) {\n const resultId = `${options.generationId}:tool-result:${options.sequence}:${chunkIndex}`\n if (chunk.type === 'tool-input-available') {\n const payload: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...((\n options.tools[chunk.toolName] as\n { supportsDeferredResults?: boolean } | undefined\n )?.supportsDeferredResults === true\n ? { supportsDeferredResults: true }\n : {}),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n }\n take(payload.toolCallId)\n const classification = approvalClassification(\n options.tools,\n options.generation,\n chunk.toolName,\n )\n if (classification === 'automatic') {\n result.push(toolCalledEvent<D>(payload))\n } else {\n pending.push({ call: payload, classification })\n }\n } else if (chunk.type === 'tool-input-error') {\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n ...(chunk.dynamic ? { input: chunk.input } : { rawInput: chunk.input }),\n error: chunk.errorText,\n phase: 'input',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n const called: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n }\n take(chunk.toolCallId)\n result.push(toolCalledEvent<D>(called), {\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-available') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n output: chunk.output,\n phase: 'execution',\n ...(chunk.preliminary === undefined\n ? {}\n : { preliminary: chunk.preliminary }),\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-error') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n error: chunk.errorText,\n phase: 'execution',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-denied') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n denied: true,\n phase: 'execution',\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-request') {\n flush(chunk.toolCallId)\n const payload: ApprovalRequestedPayload = {\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n toolCallId: chunk.toolCallId,\n ...(chunk.isAutomatic === undefined\n ? {}\n : { isAutomatic: chunk.isAutomatic }),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n result.push({\n type: 'ai.approval.requested',\n id: `${options.generationId}:approval:${chunk.approvalId}`,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-response') {\n result.push({\n type: 'ai.approval.responded',\n id: `${options.generationId}:approval:${chunk.approvalId}:automatic-response`,\n payload: {\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n },\n } as AppendInput<D>)\n }\n }\n return { events: result, pending }\n}\n\nfunction withoutGenerationLifecycle<D extends EventDefs>(\n history: ContractEvent<D>[],\n generationIds: ReadonlySet<string>,\n): ContractEvent<D>[] {\n if (generationIds.size === 0) return history\n const approvalKeys = new Set<string>()\n const inputKeys = new Set<string>()\n for (const event of history) {\n const payload = event.payload as {\n generationId?: unknown\n messageId?: unknown\n approvalId?: unknown\n inputId?: unknown\n }\n if (\n typeof payload.generationId !== 'string' ||\n !generationIds.has(payload.generationId) ||\n typeof payload.messageId !== 'string'\n ) {\n continue\n }\n if (\n event.type === 'ai.approval.requested' &&\n typeof payload.approvalId === 'string'\n ) {\n approvalKeys.add(`${payload.messageId}\\u001f${payload.approvalId}`)\n }\n if (\n event.type === 'ai.input.requested' &&\n typeof payload.inputId === 'string'\n ) {\n inputKeys.add(`${payload.messageId}\\u001f${payload.inputId}`)\n }\n }\n return history.filter((event) => {\n const payload = event.payload as {\n generationId?: unknown\n messageId?: unknown\n approvalId?: unknown\n inputId?: unknown\n }\n if (\n typeof payload.generationId === 'string' &&\n generationIds.has(payload.generationId)\n ) {\n return false\n }\n if (\n event.type === 'ai.approval.responded' &&\n typeof payload.messageId === 'string' &&\n typeof payload.approvalId === 'string'\n ) {\n return !approvalKeys.has(\n `${payload.messageId}\\u001f${payload.approvalId}`,\n )\n }\n if (\n event.type === 'ai.input.responded' &&\n typeof payload.messageId === 'string' &&\n typeof payload.inputId === 'string'\n ) {\n return !inputKeys.has(`${payload.messageId}\\u001f${payload.inputId}`)\n }\n return true\n })\n}\n\nconst validateCompaction = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n compaction: CompactionOptions<M, D>\n explicit: boolean\n generation: AgentGenerationSettings<T> | undefined\n tools: T | undefined\n}): CompactionOptions<M, D> => {\n let compaction = options.compaction\n if (\n compaction !== false &&\n (typeof compaction !== 'object' || compaction === null)\n ) {\n throw new TypeError('compaction must resolve to false or a policy object')\n }\n if (compaction !== false && 'then' in compaction) {\n void Promise.resolve(compaction).catch(() => {})\n throw new TypeError('compaction options must be a policy or a resolver')\n }\n if (compaction !== false && !('shouldCompact' in compaction)) {\n if (\n compaction.thresholdTokens !== undefined &&\n (!Number.isSafeInteger(compaction.thresholdTokens) ||\n compaction.thresholdTokens < 1)\n ) {\n throw new TypeError(\n 'compaction.thresholdTokens must be a positive safe integer',\n )\n }\n const choice = options.generation?.toolChoice\n const unsupported =\n options.generation?.output !== undefined\n ? 'structured output'\n : choice !== undefined && choice !== 'auto' && choice !== 'none'\n ? 'forced tool choice'\n : Object.values(options.tools ?? {}).some(\n (tool) =>\n tool.type === 'provider' && tool.isProviderExecuted === true,\n )\n ? 'provider-executed tools'\n : undefined\n if (unsupported !== undefined) {\n if (options.explicit) {\n throw new TypeError(\n `automatic compaction does not support ${unsupported}; use a custom policy or compaction: false`,\n )\n }\n compaction = false\n }\n }\n\n return compaction\n}\n\n/**\n * Build the ordinary A2 handler table for the built-in agent protocol.\n * Application handlers can be spread beside this table.\n */\nexport function createHandlers<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n>(\n options: CreateHandlersOptions<M, D, T>,\n): NonNullable<ServerOptions<D>['handlers']> {\n if (options.model === undefined) {\n throw new TypeError('createHandlers requires model')\n }\n if (\n options.progress?.maxChunks !== undefined &&\n (!Number.isInteger(options.progress.maxChunks) ||\n options.progress.maxChunks < 1)\n ) {\n throw new TypeError('progress.maxChunks must be a positive integer')\n }\n if (\n options.progress?.maxDelayMs !== undefined &&\n (!Number.isFinite(options.progress.maxDelayMs) ||\n options.progress.maxDelayMs < 0)\n ) {\n throw new TypeError('progress.maxDelayMs must be a non-negative number')\n }\n if (\n options.maxSteps !== undefined &&\n options.maxSteps !== Number.POSITIVE_INFINITY &&\n (!Number.isInteger(options.maxSteps) || options.maxSteps < 1)\n ) {\n throw new TypeError('maxSteps must be a positive integer or Infinity')\n }\n\n const configuredCompaction =\n options.compaction ?? (options.generate === undefined ? {} : false)\n const staticCompaction =\n typeof configuredCompaction === 'function'\n ? undefined\n : validateCompaction({\n compaction: configuredCompaction,\n explicit: options.compaction !== undefined,\n generation: options.generation,\n tools: options.tools,\n })\n\n const tools = options.tools ?? ({} as T)\n const generation: AgentGenerationSettings<T> = options.generation ?? {}\n const maxSteps = options.maxSteps ?? Number.POSITIVE_INFINITY\n const control = createControlRuntime({ agent: options.agent })\n const coordinator = control.coordinator\n const promptCache = new Map<string, Promise<ModelMessage[]>>()\n\n type RuntimeTool = {\n execute?: (\n input: unknown,\n options: {\n toolCallId: string\n messages: ModelMessage[]\n abortSignal?: AbortSignal\n },\n ) => unknown\n }\n\n type ToolHandlerContext = HandlerContext<D, 'ai.tool.execution.requested'>\n\n const resultEvent = (\n call: ToolCalledPayload,\n suffix: string,\n result: {\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n },\n ): AppendInput<D> =>\n ({\n type: 'ai.tool.result',\n id: `${call.generationId}:tool:${call.toolCallId}:${suffix}`,\n payload: {\n requestId: call.requestId,\n messageId: call.messageId,\n generationId: call.generationId,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n phase: 'execution',\n ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.denied === undefined ? {} : { denied: result.denied }),\n ...(result.preliminary === undefined\n ? {}\n : { preliminary: result.preliminary }),\n ...(call.dynamic === undefined ? {} : { dynamic: call.dynamic }),\n ...(call.providerExecuted === undefined\n ? {}\n : { providerExecuted: call.providerExecuted }),\n ...(call.toolMetadata === undefined\n ? {}\n : { toolMetadata: call.toolMetadata }),\n },\n }) as AppendInput<D>\n\n const promptMessages = (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<ModelMessage[]> => {\n const { ctx, call, generation: owner } = input\n const key = promptCacheKey(ctx.event.sessionId, call.generationId)\n const cached = promptCache.get(key)\n if (cached) return cached\n const computation = (async () => {\n const frontier = owner.promptThroughIndex\n if (frontier === undefined)\n throw new TypeError('AI work requires a prompt checkpoint')\n const [snapshot, atPrompt, tail] = await Promise.all([\n ctx.session.state(options.agent.reducer, { through: frontier }),\n ctx.session.state(coordinator, { through: frontier }),\n ctx.session.history({ gte: frontier + 1, lte: ctx.event.index }),\n ])\n const appended = tail.filter(\n (event) =>\n (event.type === 'ai.generation.started' ||\n event.type === 'ai.compaction.requested' ||\n event.type === 'ai.compaction.completed') &&\n (event.payload as { generationId: string }).generationId ===\n call.generationId,\n )\n const state = foldAIEvents({\n agent: options.agent,\n events: appended,\n state: snapshot.state,\n })\n return modelContext({\n messages: await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot,\n coordinator: atPrompt.state,\n appended,\n }),\n state,\n tools,\n })\n })()\n promptCache.set(key, computation)\n void computation.catch(() => {\n if (promptCache.get(key) === computation) promptCache.delete(key)\n })\n return computation\n }\n\n const toolExecutionFailure = (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n error: unknown,\n ): AppendInput<D> | void => {\n const schedulerFailure = consumeSchedulerSendFailure(error)\n if (checkAbort(ctx.signal)) return\n if (schedulerFailure === 'retryable') throw error\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: errorMessage(error),\n })\n }\n\n const runToolExecution = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n execute: NonNullable<RuntimeTool['execute']>,\n messages: ModelMessage[],\n ): Promise<AppendInput<D> | void> => {\n let output: unknown\n try {\n output = await execute(call.input, {\n toolCallId: call.toolCallId,\n messages,\n abortSignal: ctx.signal,\n })\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n let iterator: AsyncIterator<unknown> | undefined\n try {\n iterator = asyncIterator(output)\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (iterator === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:0`, { output })\n }\n let last: unknown\n let sequence = 0\n let done = false\n try {\n for (;;) {\n let result: IteratorResult<unknown>\n try {\n result = await iterator.next()\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (result.done) {\n if (ctx.signal.reason instanceof A2Error) throw ctx.signal.reason\n done = true\n break\n }\n if (checkAbort(ctx.signal)) return\n last = result.value\n await control.append({\n ctx,\n name: `tool:${call.toolCallId}:preliminary:${sequence}`,\n events: [\n resultEvent(\n call,\n `${ctx.event.id}:execution:${ctx.attempt}:${sequence}:preliminary`,\n {\n output: result.value,\n preliminary: true,\n },\n ),\n ],\n })\n sequence += 1\n }\n } finally {\n if (!done) {\n try {\n await iterator.return?.()\n } catch {\n // Preserve the failure or cancellation that ended execution.\n }\n }\n }\n return resultEvent(\n call,\n `${ctx.event.id}:execution:${sequence}:final`,\n sequence === 0 ? {} : { output: last },\n )\n }\n\n const executeTool = async (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<AppendInput<D> | void> => {\n const { ctx, call } = input\n const tool = tools[call.toolName] as RuntimeTool | undefined\n const execute = tool?.execute\n if (execute === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: `Tool '${call.toolName}' has no server executor`,\n })\n }\n const messages = await promptMessages(input)\n if (checkAbort(ctx.signal)) return\n const scope: AmbientToolScope = {\n contract: options.agent.contract,\n context: ctx,\n }\n // Async iteration resumes in the caller's context, so the whole\n // execution, not just the execute call, runs inside the scope.\n return toolScopeStorage.run(scope, () =>\n runToolExecution(ctx, call, execute, messages),\n )\n }\n\n const handleToolExecution = async (\n ctx: ToolHandlerContext,\n ): Promise<AppendInput<D>> => {\n try {\n const state = (\n await ctx.session.state(control.reducer, { through: 'latest' })\n ).state\n const request = ctx.event.payload\n const call = state.coordinator.response?.calls.find(\n (candidate) => candidate.work?.id === ctx.event.id,\n )\n if (\n state.active?.turnId !== request.turnId ||\n state.active.suspended ||\n state.active.version !== request.version ||\n state.coordinator.response?.failure !== undefined ||\n !call ||\n call.terminal ||\n call.work?.settled\n )\n return control.settled({ ctx, events: undefined })\n return control.settled({\n ctx,\n events: await executeTool({\n ctx,\n call: request.call,\n generation: request.generation,\n }),\n })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n }\n\n const generationHandler = async (\n ctx: HandlerContext<D, 'ai.generation.requested'>,\n ): Promise<void | AppendInput<D> | readonly AppendInput<D>[]> => {\n if (checkAbort(ctx.signal)) return\n const requestId = ctx.event.id\n const request = ctx.event.payload\n const snapshot = await ctx.session.state(options.agent.reducer, {\n through: 'latest',\n })\n if (\n snapshot.state.active?.phase === 'paused' ||\n snapshot.state.active?.phase === 'pausing'\n )\n return\n const coordinatorState = (\n await ctx.session.state(coordinator, { through: snapshot.index })\n ).state\n if (\n coordinatorState.closed ||\n coordinatorState.response?.activeRequestId !== requestId\n )\n return\n const response = coordinatorState.response\n const current =\n response.generation?.requestId === requestId\n ? response.generation\n : undefined\n if (\n current !== undefined &&\n (response.completion !== undefined ||\n (response.failure !== undefined &&\n response.failure.superseded !== true))\n )\n return\n if (current !== undefined && current.attempt >= ctx.attempt) return\n const attempt = ctx.attempt\n const generationId = `${requestId}:generation:${attempt}`\n const responseMessageId =\n request.responseMessageId ??\n (request.reason === 'message'\n ? `${request.messageId}:assistant`\n : request.messageId)\n const responseStepCount = response.stepCount\n if (\n request.reason === 'tool' &&\n (requestId !==\n `ai.generate:tools:${response.source?.generation.generationId}` ||\n response.responseMessageId !== request.messageId ||\n response.responseMessageId !== request.responseMessageId)\n )\n return\n const previous = current\n const replaced =\n previous === undefined\n ? []\n : [{ generation: previous, frontier: response.promptThroughIndex! }]\n if (request.reason === 'retry' && response.source?.failed) {\n replaced.push({\n generation: response.source.generation,\n frontier: response.source.promptThroughIndex,\n })\n }\n const replacedGenerationIds = new Set(\n replaced.map(({ generation: owner }) => owner.generationId),\n )\n let state = snapshot.state\n if (replaced.length > 0) {\n const through = Math.min(...replaced.map(({ frontier }) => frontier))\n const baseline = await ctx.session.state(options.agent.reducer, {\n through,\n })\n const tail = await ctx.session.history({\n gte: through + 1,\n lte: snapshot.index,\n })\n state = foldAIEvents({\n agent: options.agent,\n events: withoutGenerationLifecycle(tail, replacedGenerationIds),\n state: baseline.state,\n })\n }\n const resolverContext: AgentResolverContext<M, D> = {\n event: ctx.event,\n state,\n session: {\n state: (reducer, readOptions) =>\n ctx.session.state(reducer, {\n ...readOptions,\n through: readOptions?.through ?? snapshot.index,\n }),\n },\n signal: ctx.signal,\n }\n\n let generationStarted = false\n try {\n const resolvedModel = await resolve(options.model, resolverContext)\n if (resolvedModel === undefined) {\n throw new TypeError('the model resolver returned undefined')\n }\n if (checkAbort(ctx.signal)) return\n const resolvedInstructions =\n options.instructions === undefined\n ? undefined\n : await resolve(options.instructions, resolverContext)\n if (checkAbort(ctx.signal)) return\n const compaction =\n typeof configuredCompaction === 'function'\n ? validateCompaction({\n compaction: await resolve(configuredCompaction, resolverContext),\n explicit: true,\n generation: options.generation,\n tools: options.tools,\n })\n : staticCompaction!\n if (checkAbort(ctx.signal)) return\n\n if (request.reason === 'tool' && responseStepCount >= maxSteps) {\n const source = response.source?.generation\n if (source === undefined) return\n return {\n type: 'ai.generation.failed',\n id: `${requestId}:step-limit`,\n payload: {\n requestId: source.requestId,\n messageId: source.messageId,\n generationId: source.generationId,\n responseMessageId,\n error: `agent exceeded the ${maxSteps}-step limit`,\n stepLimit: true,\n },\n } as AppendInput<D>\n }\n\n const started: GenerationStartedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n attempt,\n model: modelName(resolvedModel),\n promptThroughIndex: snapshot.index,\n }\n const catalogModelId = gatewayModelId(resolvedModel)\n const gatewayOptions = options.generation?.providerOptions?.['gateway']\n const usesFallbackModels =\n Array.isArray(gatewayOptions?.['models']) &&\n gatewayOptions['models'].length > 0\n const discoversMetadata =\n compaction !== false &&\n !('shouldCompact' in compaction) &&\n compaction.thresholdTokens === undefined &&\n !usesFallbackModels &&\n catalogModelId !== undefined\n const startEvents: AppendInput<D>[] = []\n if (\n discoversMetadata &&\n !Object.hasOwn(state.modelMetadata, catalogModelId)\n ) {\n startEvents.push({\n type: 'ai.model.metadata.requested',\n id: `ai.model.metadata:${encodeURIComponent(options.agent.contract.name)}:${encodeURIComponent(ctx.event.sessionId)}:${encodeURIComponent(catalogModelId)}`,\n payload: { modelId: catalogModelId },\n } as AppendInput<D>)\n }\n if (previous) {\n const payload = previous\n const superseded: GenerationFailedPayload = {\n requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n responseMessageId: payload.responseMessageId,\n error: 'generation attempt was superseded after an incomplete run',\n superseded: true,\n }\n startEvents.push({\n type: 'ai.generation.failed',\n id: `${payload.generationId}:superseded`,\n payload: superseded,\n } as AppendInput<D>)\n }\n startEvents.push({\n type: 'ai.generation.started',\n id: generationId,\n payload: started,\n } as AppendInput<D>)\n const generationEvents = await control.append({\n ctx,\n name: 'generation-start',\n events: startEvents,\n })\n generationStarted = true\n\n if (checkAbort(ctx.signal)) return\n\n const promptCoordinatorState = coordinatorState\n const messages = await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot: { state, index: snapshot.index },\n coordinator: promptCoordinatorState,\n excluded: replacedGenerationIds,\n })\n let generationMessages = messages\n let modelMessages = await modelContext({ messages, state, tools })\n const baseContext: AgentGenerateContext<M, D, T> = {\n request: ctx.event,\n requestId,\n generationId,\n responseMessageId,\n messages,\n modelMessages,\n state,\n session: resolverContext.session,\n signal: ctx.signal,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation,\n }\n const policy = compaction\n const tracksInput =\n policy !== false &&\n !('shouldCompact' in policy) &&\n (policy.thresholdTokens !== undefined || discoversMetadata)\n const metadata =\n catalogModelId === undefined\n ? undefined\n : state.modelMetadata[catalogModelId]\n const limits =\n metadata?.status === 'resolved' && !usesFallbackModels\n ? metadata.limits\n : undefined\n let inputTokenEstimate: number | undefined\n let compacted = false\n const canCompact = response.source?.canCompact ?? true\n if (policy && canCompact) {\n const compactionContext = {\n ...resolverContext,\n messages,\n modelMessages,\n }\n let shouldCompact: boolean\n if ('shouldCompact' in policy) {\n shouldCompact = await policy.shouldCompact(compactionContext)\n } else if (tracksInput) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n const inputTokens = measuredInputTokens({\n estimate: inputTokenEstimate,\n model: modelName(resolvedModel),\n calibration: coordinatorState.calibration,\n })\n const threshold =\n policy.thresholdTokens ??\n (limits === undefined\n ? undefined\n : Math.floor(\n Math.min(\n limits.contextWindow * 0.75,\n limits.contextWindow - (generation.maxOutputTokens ?? 0),\n ),\n ))\n if (\n limits !== undefined &&\n threshold !== undefined &&\n threshold <= 0\n ) {\n throw new Error(\n `output allowance exhausts the ${limits.contextWindow}-token context window`,\n )\n }\n shouldCompact = threshold !== undefined && inputTokens >= threshold\n } else {\n shouldCompact = false\n }\n if (checkAbort(ctx.signal)) return\n if (shouldCompact) {\n const throughMessageId =\n state.messages.findLast(\n (message) =>\n !promptCoordinatorState.queued.some(\n (queued) => queued.messageId === message.id,\n ),\n )?.id ?? request.messageId\n const throughIndex = snapshot.index\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-requested',\n events: [\n {\n type: 'ai.compaction.requested',\n id: `${generationId}:compaction:requested`,\n payload: { generationId, throughMessageId, throughIndex },\n } as AppendInput<D>,\n ],\n })),\n )\n const result = !('shouldCompact' in policy)\n ? {\n messages: [] as M[],\n ...(await summarize({\n context: baseContext,\n instructions: policy.instructions,\n })),\n }\n : { messages: await policy.compact(compactionContext) }\n if (checkAbort(ctx.signal)) return\n const completed: CompactionCompletedPayload<M> = {\n generationId,\n throughMessageId,\n throughIndex,\n ...result,\n ...(promptCoordinatorState.queued.length === 0\n ? {}\n : {\n retainedMessageIds: promptCoordinatorState.queued.map(\n (item) => item.messageId,\n ),\n }),\n }\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-completed',\n events: [\n {\n type: 'ai.compaction.completed',\n id: `${generationId}:compaction:completed`,\n payload: completed,\n } as AppendInput<D>,\n ],\n })),\n )\n const queued = new Set(\n promptCoordinatorState.queued.map((item) => item.messageId),\n )\n generationMessages = result.messages.filter(\n (message) => !queued.has(message.id),\n )\n compacted = true\n }\n }\n\n const currentState = foldAIEvents({\n agent: options.agent,\n events: generationEvents,\n state: snapshot.state,\n })\n if (request.reason === 'retry' || previous !== undefined) {\n generationMessages = await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot,\n coordinator: promptCoordinatorState,\n appended: generationEvents,\n })\n }\n if (\n (policy && 'shouldCompact' in policy) ||\n generationMessages !== messages ||\n activeCompaction(currentState)?.summary !==\n activeCompaction(state)?.summary\n ) {\n modelMessages = await modelContext({\n messages: generationMessages,\n state: currentState,\n tools,\n })\n }\n promptCache.set(\n promptCacheKey(ctx.event.sessionId, generationId),\n Promise.resolve(modelMessages),\n )\n if (tracksInput && (inputTokenEstimate === undefined || compacted)) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n }\n\n let pendingToolCalls: PendingToolCall[] = []\n if (checkAbort(ctx.signal)) return\n const generateContext: AgentGenerateContext<M, D, T> = {\n request: ctx.event,\n requestId,\n generationId,\n responseMessageId,\n messages: generationMessages,\n modelMessages,\n state: currentState,\n session: resolverContext.session,\n signal: ctx.signal,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation: options.generation ?? {},\n }\n const custom = options.generate !== undefined\n const source =\n options.generate === undefined\n ? await generateWithAISDK(generateContext, options.messageMetadata)\n : { stream: await options.generate(generateContext) }\n const updates = consumeGeneration({\n source,\n ...(options.progress === undefined\n ? {}\n : { progress: options.progress }),\n })\n\n let sequence = 0\n let finish: AgentGenerationFinish | undefined\n for await (const update of updates) {\n ctx.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n const progress: GenerationProgressPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n sequence,\n chunks: update.chunks,\n }\n const lifecycle = lifecycleEvents<D, T>({\n requestId,\n messageId: responseMessageId,\n generationId,\n sequence,\n chunks: update.chunks,\n pending: pendingToolCalls,\n tools,\n generation,\n custom,\n })\n pendingToolCalls = lifecycle.pending\n await control.append({\n ctx,\n name: `generation-progress:${sequence}`,\n events: [\n {\n type: 'ai.generation.progress',\n id: `${generationId}:progress:${sequence}`,\n payload: progress,\n } as AppendInput<D>,\n ...lifecycle.events,\n ],\n })\n sequence += 1\n }\n\n if (!finish) throw new Error('agent generation finished without output')\n const completed: GenerationCompletedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n ...(inputTokenEstimate === undefined ? {} : { inputTokenEstimate }),\n ...(finish.finishReason === undefined\n ? {}\n : { finishReason: finish.finishReason }),\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n const completionEvent = {\n type: 'ai.generation.completed',\n id: `${generationId}:completed`,\n payload: completed,\n } as AppendInput<D>\n const unresolved = options.generate\n ? pendingToolCalls.filter(\n (pending) => pending.classification !== 'automatic',\n )\n : []\n if (unresolved.length > 0) {\n throw new Error(\n `generation ended with unresolved tool authorization for '${unresolved[0]!.call.toolName}'`,\n )\n }\n const pendingEvents = pendingToolCalls\n .filter(\n (pending) =>\n pending.classification === 'automatic' ||\n (options.generate === undefined &&\n pending.classification === 'unknown'),\n )\n .map((pending) => toolCalledEvent<D>(pending.call))\n if (finish.finishReason === 'tool-calls') {\n return [...pendingEvents, completionEvent]\n }\n return [\n ...pendingEvents,\n completionEvent,\n {\n type: 'ai.message.completed',\n id: `${generationId}:message:completed`,\n payload: {\n messageId: responseMessageId,\n } satisfies MessageCompletedPayload,\n } as AppendInput<D>,\n ]\n } catch (error) {\n if (error instanceof ControlCancelled) throw error\n if (error instanceof A2Error) {\n checkAbort(ctx.signal)\n throw error\n }\n if (checkAbort(ctx.signal)) return\n if (!generationStarted) throw error\n const failed: GenerationFailedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n error: errorMessage(error),\n }\n return {\n type: 'ai.generation.failed',\n id: `${generationId}:failed`,\n payload: failed,\n } as AppendInput<D>\n }\n }\n\n const clearPromptCache = (sessionId: string): void => {\n const prefix = `${sessionId}\\u001f`\n for (const key of promptCache.keys()) {\n if (key.startsWith(prefix)) promptCache.delete(key)\n }\n }\n\n return {\n 'ai.model.metadata.requested': {\n handler: async (ctx) => {\n const limits = await readModelLimits({\n modelId: ctx.event.payload.modelId,\n signal: ctx.signal,\n })\n ctx.signal.throwIfAborted()\n return {\n type: 'ai.model.metadata.resolved',\n id: `${ctx.event.id}:resolved`,\n payload: { modelId: ctx.event.payload.modelId, limits },\n } as AppendInput<D>\n },\n },\n 'ai.control.requested': { lane: 'a2.ai.control', handler: control.handler },\n 'ai.work.reported': { lane: 'a2.ai.control', handler: control.handler },\n 'ai.message.completed': {\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n },\n },\n 'ai.message.interrupted': {\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n },\n },\n 'ai.session.closed': {\n lane: 'a2.ai.control',\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n return control.handler(ctx)\n },\n },\n 'ai.generation.failed': {\n handler: (ctx) => {\n promptCache.delete(\n promptCacheKey(ctx.event.sessionId, ctx.event.payload.generationId),\n )\n return Promise.resolve()\n },\n },\n 'ai.generation.requested': {\n lane: 'a2.ai.model',\n abortOn: {\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.control?.turnId ||\n active?.version !== trigger.payload.control?.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: async (ctx) => {\n try {\n return control.settled({ ctx, events: await generationHandler(ctx) })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n },\n },\n 'ai.tool.execution.requested': {\n abortOn: {\n 'ai.generation.failed': (event, trigger) =>\n event.payload.generationId === trigger.payload.call.generationId,\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.turnId ||\n active?.version !== trigger.payload.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: handleToolExecution,\n },\n } as NonNullable<ServerOptions<D>['handlers']>\n}\n\n/** Assemble an A2 server with the built-in agent handlers and app extensions. */\nexport function createAgentServer<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n>(options: CreateAgentServerOptions<M, D, T>): A2Server<D> {\n const {\n agent: definition,\n model,\n tools,\n instructions,\n generation,\n maxSteps,\n messageMetadata,\n generate,\n compaction,\n progress,\n handlers,\n ...serverOptions\n } = options\n const builtIns = createHandlers({\n agent: definition,\n model,\n ...(tools === undefined ? {} : { tools }),\n ...(instructions === undefined ? {} : { instructions }),\n ...(generation === undefined ? {} : { generation }),\n ...(maxSteps === undefined ? {} : { maxSteps }),\n ...(messageMetadata === undefined ? {} : { messageMetadata }),\n ...(generate === undefined ? {} : { generate }),\n ...(compaction === undefined ? {} : { compaction }),\n ...(progress === undefined ? {} : { progress }),\n })\n const server = createServer({\n ...serverOptions,\n contract: definition.contract,\n handlers: { ...builtIns, ...handlers },\n })\n setServerFetchHooks(server, { validateIngress: validateAgentIngress })\n return server\n}\n\nexport type { Instructions, LanguageModel, ToolSet }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-server.js","names":["errorMessage"],"sources":["../src/ai-coordinator.ts","../src/ai-control-server.ts","../src/ai-sdk-step.ts","../src/ai-model-metadata.ts","../src/ai-server.ts"],"sourcesContent":["import type { UIMessage } from 'ai'\nimport { applyControlChanges } from './ai-control-state.ts'\nimport type { ControlCommit, ControlWork } from './ai-control.ts'\nimport type {\n AIEventDefs,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationRequestedPayload,\n GenerationStartedPayload,\n InputRequestedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport type { Reducer } from './reducer.ts'\n\nexport type CoordinatorCall = {\n call: ToolCalledPayload\n approval?: ApprovalRequestedPayload\n response?: ApprovalRespondedPayload\n terminal: boolean\n work?: ControlWork\n}\n\nexport type CoordinatorResponse = {\n rootMessageId: string\n responseMessageId: string\n status: 'requested' | 'generating' | 'waiting' | 'failed'\n stepCount: number\n activeRequestId?: string\n generation?: GenerationStartedPayload\n promptThroughIndex?: number\n source?: {\n generation: GenerationStartedPayload\n promptThroughIndex: number\n failed: boolean\n canCompact: boolean\n }\n completion?: GenerationCompletedPayload\n failure?: GenerationFailedPayload\n calls: CoordinatorCall[]\n inputs: InputRequestedPayload[]\n inputResponse?: {\n generationId: string\n inputId: string\n name: string\n }\n}\n\nexport type AICoordinatorState = {\n closed: boolean\n queued: Array<{ messageId: string; generate: boolean }>\n response?: CoordinatorResponse\n calibration?: { model: string; inputTokens: number; estimate: number }\n}\n\nconst updateResponse = (\n state: AICoordinatorState,\n update: (response: CoordinatorResponse) => CoordinatorResponse,\n): AICoordinatorState =>\n state.response === undefined\n ? state\n : { ...state, response: update(state.response) }\n\nexport const foldCoordinator = <M extends UIMessage, D extends EventDefs>(\n state: AICoordinatorState,\n event: ContractEvent<D>,\n): AICoordinatorState => {\n switch (event.type) {\n case 'ai.session.closed':\n return { closed: true, queued: [] }\n case 'ai.retry.requested':\n case 'ai.compaction.completed': {\n const { calibration: _, ...rest } = state\n return rest\n }\n case 'ai.message.created': {\n const payload = event.payload as MessageCreatedPayload<M>\n const message = payload.message\n if (message.role !== 'user') return state\n return {\n ...state,\n queued: [\n ...state.queued.filter((item) => item.messageId !== message.id),\n {\n messageId: message.id,\n generate: payload.generate !== false,\n },\n ],\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (request.reason === 'message') {\n const responseMessageId =\n request.responseMessageId ?? `${request.messageId}:assistant`\n const requested = state.queued.findIndex(\n (item) => item.messageId === request.messageId,\n )\n return {\n ...state,\n queued:\n requested < 0\n ? state.queued.filter(\n (item) => item.messageId !== request.messageId,\n )\n : state.queued.slice(requested + 1),\n response: {\n rootMessageId: request.messageId,\n responseMessageId,\n status: 'requested',\n stepCount: 0,\n activeRequestId: event.id,\n calls: [],\n inputs: [],\n },\n }\n }\n if (\n state.response === undefined ||\n request.responseMessageId !== state.response.responseMessageId\n ) {\n return state\n }\n if (\n (request.reason === 'tool' &&\n (!continuationReady(state) ||\n event.id !==\n `ai.generate:tools:${state.response.generation?.generationId}`)) ||\n (request.reason === 'retry' && state.response.status !== 'failed') ||\n (request.reason === 'input' &&\n state.response.inputResponse === undefined)\n ) {\n return state\n }\n return updateResponse(state, (response) => {\n const generation = response.generation ?? response.source?.generation\n const promptThroughIndex =\n response.promptThroughIndex ?? response.source?.promptThroughIndex\n return {\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'requested',\n stepCount: response.stepCount,\n activeRequestId: event.id,\n ...(generation === undefined || promptThroughIndex === undefined\n ? {}\n : {\n source: {\n generation,\n promptThroughIndex,\n failed:\n response.failure?.generationId === generation.generationId,\n canCompact: response.calls.every((call) => call.terminal),\n },\n }),\n calls: [],\n inputs: [],\n }\n })\n }\n case 'ai.generation.started': {\n const generation = event.payload as GenerationStartedPayload\n if (\n state.response?.responseMessageId !== generation.responseMessageId ||\n state.response.activeRequestId !== generation.requestId ||\n (state.response.generation?.requestId === generation.requestId &&\n state.response.generation.attempt >= generation.attempt)\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'generating',\n stepCount: response.stepCount,\n generation,\n ...(generation.promptThroughIndex === undefined\n ? {}\n : { promptThroughIndex: generation.promptThroughIndex }),\n ...(response.source === undefined ? {} : { source: response.source }),\n activeRequestId: generation.requestId,\n calls: [],\n inputs: [],\n }))\n }\n case 'ai.generation.completed': {\n const completion = event.payload as GenerationCompletedPayload\n if (\n state.response?.generation?.generationId !== completion.generationId\n ) {\n return state\n }\n const next = updateResponse(state, (response) => ({\n ...response,\n status: 'waiting',\n completion,\n stepCount:\n response.stepCount + (response.completion === undefined ? 1 : 0),\n }))\n const { calibration: _, ...uncalibrated } = next\n const inputTokens = completion.usage?.inputTokens\n const estimate = completion.inputTokenEstimate\n return inputTokens !== undefined &&\n Number.isFinite(inputTokens) &&\n inputTokens >= 0 &&\n estimate !== undefined\n ? {\n ...uncalibrated,\n calibration: {\n model: state.response.generation.model,\n inputTokens,\n estimate,\n },\n }\n : uncalibrated\n }\n case 'ai.generation.failed': {\n const failure = event.payload as GenerationFailedPayload\n const response = state.response\n const ownsActiveGeneration =\n response?.generation?.generationId === failure.generationId\n const ownsActiveStepLimit =\n failure.stepLimit === true &&\n response?.activeRequestId ===\n `ai.generate:tools:${failure.generationId}` &&\n response.responseMessageId === failure.responseMessageId\n if (!ownsActiveGeneration && !ownsActiveStepLimit) {\n return state\n }\n return updateResponse(state, (current) => ({\n ...current,\n status: 'failed',\n failure,\n }))\n }\n case 'ai.message.completed': {\n const messageId = (event.payload as { messageId: string }).messageId\n if (state.response?.responseMessageId !== messageId) return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.message.interrupted': {\n const interruption = event.payload as MessageInterruptedPayload\n const response = state.response\n if (\n response?.responseMessageId !== interruption.messageId ||\n (interruption.generationId !== response.generation?.generationId &&\n interruption.requestId !== response.activeRequestId)\n )\n return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.tool.called': {\n const call = event.payload as ToolCalledPayload\n if (state.response?.generation?.generationId !== call.generationId) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: [\n ...response.calls.filter(\n (candidate) => candidate.call.toolCallId !== call.toolCallId,\n ),\n { call, terminal: false },\n ],\n }))\n }\n case 'ai.approval.requested': {\n const approval = event.payload as ApprovalRequestedPayload\n if (state.response?.generation?.generationId !== approval.generationId) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === approval.toolCallId\n ? { ...candidate, approval }\n : candidate,\n ),\n }))\n }\n case 'ai.approval.responded': {\n const approval = event.payload as ApprovalRespondedPayload\n if (\n state.response?.responseMessageId !== approval.messageId ||\n state.response.generation?.generationId !== approval.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.approval?.approvalId === approval.approvalId\n ? { ...candidate, response: approval }\n : candidate,\n ),\n }))\n }\n case 'ai.tool.result': {\n const result = event.payload as ToolResultPayload\n if (\n result.preliminary === true ||\n state.response?.generation?.generationId !== result.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === result.toolCallId\n ? { ...candidate, terminal: true }\n : candidate,\n ),\n }))\n }\n case 'ai.input.requested': {\n const input = event.payload as InputRequestedPayload\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.generationId !== input.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: [\n ...response.inputs.filter(\n (candidate) =>\n candidate.messageId !== input.messageId ||\n candidate.generationId !== input.generationId ||\n candidate.inputId !== input.inputId,\n ),\n input,\n ],\n }))\n }\n case 'ai.input.responded': {\n const input = event.payload as {\n messageId: string\n generationId: string\n inputId: string\n name: string\n }\n const requested = state.response?.inputs.find(\n (candidate) =>\n candidate.messageId === input.messageId &&\n candidate.generationId === input.generationId &&\n candidate.inputId === input.inputId &&\n candidate.name === input.name,\n )\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.generationId !== input.generationId ||\n requested === undefined\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: response.inputs.filter(\n (candidate) => candidate.inputId !== input.inputId,\n ),\n inputResponse: {\n generationId: input.generationId,\n inputId: input.inputId,\n name: requested.name,\n },\n }))\n }\n default:\n return state\n }\n}\n\nexport const aiCoordinatorReducer = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(\n contract: Contract<D>,\n): Reducer<D, AICoordinatorState> =>\n contract\n .reducer({\n name: 'a2.ai.coordinator.v5',\n initialState: {\n closed: false,\n queued: [],\n } as AICoordinatorState,\n })\n .fold((state, event) =>\n event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes\n .filter((change) => change.path[0] === 'coordinator')\n .map((change) =>\n Object.assign({}, change, { path: change.path.slice(1) }),\n ),\n })\n : state,\n )\n\nexport const continuationReady = (state: AICoordinatorState): boolean => {\n const response = state.response\n return (\n !state.closed &&\n response?.completion?.finishReason === 'tool-calls' &&\n response.generation?.generationId === response.completion.generationId &&\n response.failure === undefined &&\n response.calls.length > 0 &&\n response.calls.every(\n (call) =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n call.call.supportsDeferredResults !== true &&\n call.approval !== undefined &&\n call.response !== undefined),\n )\n )\n}\n","// oxlint-disable no-await-in-loop -- work acknowledgements follow the durable stream.\nimport { applyControlChanges, controlCommit } from './ai-control-state.ts'\nimport type { ControlChange, ControlCommit } from './ai-control.ts'\nimport type { UIMessage } from 'ai'\nimport type {\n AIEventDefs,\n AgentDefinition,\n GenerationRequestedPayload,\n MessageInterruptedPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n continuationReady,\n foldCoordinator,\n} from './ai-coordinator.ts'\nimport {\n initialControlState,\n type AIControlState,\n type ControlCommand,\n type ControlReceipt,\n type WorkFact,\n type WorkReport,\n} from './ai-control.ts'\nimport type { AppendInput, ContractEvent, EventDefs } from './contract.ts'\nimport type { HandlerContext } from './server.ts'\nimport type { Reducer } from './reducer.ts'\nimport type { AICoordinatorState, CoordinatorCall } from './ai-coordinator.ts'\nimport { validateSync } from './validate.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { A2Error } from './errors.ts'\n\nexport class ControlCancelled extends Error {}\n\nconst callReadyForModel = (call: CoordinatorCall): boolean =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n !call.call.supportsDeferredResults &&\n call.response !== undefined)\n\nconst approvalBlocksExecution = (call: CoordinatorCall): boolean =>\n call.approval !== undefined && call.response?.approved !== true\n\nexport type AIControlRuntime<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n handler(\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]>\n append(options: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]>\n settled(options: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): AppendInput<D>\n cancelled(options: { error: unknown; signal: AbortSignal }): boolean\n reducer: Reducer<D, AIControlState<M>>\n coordinator: Reducer<D, AICoordinatorState>\n}\n\nexport const createControlRuntime = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n}): AIControlRuntime<M, D> => {\n const reducer = options.agent.contract\n .reducer({\n name: 'a2.ai.control.v1',\n initialState: initialControlState<M>(),\n })\n .fold((state, event) =>\n event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes,\n })\n : state,\n )\n const coordinator = aiCoordinatorReducer(options.agent.contract)\n\n const handler = async (\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]> => {\n const snapshot = await ctx.session.state(reducer, { through: 'latest' })\n const before = structuredClone(snapshot.state)\n const moves: ControlChange[] = []\n const state = structuredClone(snapshot.state)\n const facts: WorkFact[] = []\n const jobs: AppendInput<D>[] = []\n const emit = ({\n type,\n payload,\n id = `${ctx.event.id}:fact:${facts.length}`,\n }: {\n type: string\n payload: unknown\n id?: string\n }): void => {\n const fact = { type, payload, id }\n facts.push(fact)\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n ...fact,\n } as ContractEvent<D>)\n }\n let reason: ControlReceipt['reason']\n const end = ({\n lastSeenIndex,\n reason: interruptionReason,\n }: {\n lastSeenIndex: number | undefined\n reason: string | undefined\n }): void => {\n const response = state.coordinator.response\n if (response === undefined) return\n const owner =\n response.generation === undefined\n ? { requestId: response.activeRequestId! }\n : { generationId: response.generation.generationId }\n emit({\n type: 'ai.message.interrupted',\n payload: {\n messageId: response.responseMessageId,\n ...owner,\n ...(interruptionReason === undefined\n ? {}\n : { reason: interruptionReason }),\n ...(lastSeenIndex === undefined ? {} : { lastSeenIndex }),\n } satisfies MessageInterruptedPayload,\n })\n state.active = null\n }\n const knownInput = (id: string): boolean =>\n state.inbox.items.some((candidate) => candidate.id === id) ||\n Object.hasOwn(state.reservedIds, id)\n const missingInputReason = (id: string): ControlReceipt['reason'] =>\n state.reservedIds[id] === 'removed' || !knownInput(id)\n ? 'not-found'\n : 'already-active'\n const inputTaken = ({\n message,\n generate = true,\n }: {\n message: M\n generate?: boolean\n }): boolean =>\n knownInput(message.id) ||\n (generate &&\n message.role === 'user' &&\n knownInput(`${message.id}:assistant`))\n const insert = ({\n message,\n generate = true,\n first = false,\n afterStepOf,\n }: {\n message: M\n generate?: boolean\n first?: boolean\n afterStepOf?: string\n }): void => {\n const candidate = {\n id: message.id,\n revision: 0,\n message,\n generate: generate && message.role === 'user',\n ...(afterStepOf === undefined ? {} : { afterStepOf }),\n }\n state.reservedIds = {\n ...state.reservedIds,\n [candidate.id]: true,\n ...(candidate.generate\n ? { [`${candidate.id}:assistant`]: true as const }\n : {}),\n }\n if (first) state.inbox.items.unshift(candidate)\n else state.inbox.items.push(candidate)\n }\n const moveInput = ({ from, to }: { from: number; to: number }): void => {\n if (from === to) return\n const [moved] = state.inbox.items.splice(from, 1)\n state.inbox.items.splice(to, 0, moved!)\n const [previous] = before.inbox.items.splice(from, 1)\n before.inbox.items.splice(to, 0, previous!)\n moves.push({ path: ['inbox', 'items'], move: { from, to } })\n }\n const requestModel = ({\n request,\n id,\n }: {\n request: GenerationRequestedPayload\n id: string\n }): void => {\n const active = state.active!\n const payload = {\n ...request,\n control: { turnId: active.turnId, version: active.version },\n }\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n type: 'ai.generation.requested',\n id,\n payload,\n } as ContractEvent<D>)\n active.model = { id, version: active.version, settled: false }\n active.phase = 'starting'\n jobs.push({\n type: 'ai.generation.requested',\n id,\n payload,\n } as AppendInput<D>)\n }\n if (ctx.event.type === 'ai.session.closed') {\n state.coordinator = { closed: true, queued: [] }\n state.active = null\n state.inbox.items = []\n } else if (ctx.event.type === 'ai.control.requested') {\n const command = ctx.event.payload as ControlCommand<M>\n if (state.coordinator.closed) reason = 'closed'\n else\n switch (command.action) {\n case 'send':\n if (\n inputTaken({\n message: command.message,\n generate: command.generate !== false,\n })\n )\n reason = 'duplicate-input'\n else\n insert({\n message: command.message,\n generate: command.generate !== false,\n })\n break\n case 'edit': {\n const item = state.inbox.items.find(\n (candidate) => candidate.id === command.message.id,\n )\n if (item === undefined)\n reason = missingInputReason(command.message.id)\n else if (item.revision !== command.expectedRevision)\n reason = 'revision-conflict'\n else if (item.message.role !== command.message.role)\n reason = 'revision-conflict'\n else {\n item.message = command.message\n item.revision += 1\n }\n break\n }\n case 'remove': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n if (position < 0) reason = missingInputReason(command.inputId)\n else {\n state.inbox.items.splice(position, 1)\n state.reservedIds = {\n ...state.reservedIds,\n [command.inputId]: 'removed',\n }\n }\n break\n }\n case 'move': {\n const index = state.inbox.items.findIndex(\n (candidate) => candidate.id === command.inputId,\n )\n if (index < 0) reason = missingInputReason(command.inputId)\n else if (\n command.beforeId !== null &&\n !state.inbox.items.some(\n (candidate) => candidate.id === command.beforeId,\n )\n )\n reason = 'not-found'\n else {\n const destination =\n command.beforeId === null\n ? state.inbox.items.length\n : state.inbox.items.findIndex(\n (item) => item.id === command.beforeId,\n )\n moveInput({\n from: index,\n to: destination > index ? destination - 1 : destination,\n })\n }\n break\n }\n case 'send-now': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n const selected = state.inbox.items[position]\n if (!selected) reason = missingInputReason(command.inputId)\n else if ((state.active?.turnId ?? null) !== command.turnId)\n reason = 'stale-turn'\n else if (selected.message.role !== 'user') reason = 'not-user-input'\n else if (\n !selected.generate &&\n knownInput(`${selected.id}:assistant`)\n )\n reason = 'duplicate-input'\n else {\n if (!selected.generate) {\n state.reservedIds = {\n ...state.reservedIds,\n [`${selected.id}:assistant`]: true,\n }\n selected.generate = true\n }\n if (state.active) selected.afterStepOf = state.active.turnId\n else delete selected.afterStepOf\n moveInput({ from: position, to: 0 })\n }\n break\n }\n case 'stop':\n if (state.active?.turnId !== command.turnId) reason = 'stale-turn'\n else\n end({ lastSeenIndex: command.lastSeenIndex, reason: undefined })\n break\n case 'steer':\n if (inputTaken({ message: command.message }))\n reason = 'duplicate-input'\n else {\n insert({\n message: command.message,\n generate: true,\n first: true,\n afterStepOf: command.turnId,\n })\n }\n break\n case 'interrupt': {\n const response = state.coordinator.response\n if (\n !response ||\n response.responseMessageId !== command.request.messageId ||\n (command.request.generationId !==\n response.generation?.generationId &&\n command.request.requestId !== response.activeRequestId)\n )\n reason = 'stale-turn'\n else\n end({\n lastSeenIndex: command.request.lastSeenIndex,\n reason: command.request.reason,\n })\n break\n }\n case 'pause': {\n state.inbox.paused = true\n const active = state.active\n if (\n command.when === 'now' &&\n active !== null &&\n !active.suspended\n ) {\n active.suspended = true\n active.version += 1\n const generation = state.coordinator.response?.generation\n if (generation)\n emit({\n type: 'ai.generation.paused',\n payload: {\n generationId: generation.generationId,\n messageId: generation.responseMessageId,\n },\n })\n }\n break\n }\n case 'resume':\n state.inbox.paused = false\n break\n case 'tool-result': {\n const call = state.coordinator.response?.calls.find(\n (candidate) =>\n candidate.call.generationId === command.result.generationId &&\n candidate.call.messageId === command.result.messageId &&\n candidate.call.toolCallId === command.result.toolCallId &&\n candidate.call.providerExecuted === true &&\n !candidate.terminal,\n )\n if (!call) reason = 'not-found'\n else emit({ type: 'ai.tool.result', payload: command.result })\n break\n }\n case 'approval': {\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) =>\n candidate.approval?.approvalId ===\n command.response.approvalId &&\n candidate.approval.generationId ===\n command.response.generationId &&\n candidate.approval.messageId === command.response.messageId,\n )\n if (response?.failure) reason = 'stale-turn'\n else if (!call || call.response || call.terminal)\n reason = 'not-found'\n else\n emit({ type: 'ai.approval.responded', payload: command.response })\n break\n }\n case 'request-input':\n case 'input': {\n const payload =\n command.action === 'input' ? command.response : command.request\n const response = state.coordinator.response\n if (\n response?.failure !== undefined ||\n response?.generation?.generationId !== payload.generationId ||\n response.responseMessageId !== payload.messageId ||\n (command.action === 'input' &&\n !response.inputs.some(\n (input) =>\n input.inputId === payload.inputId &&\n input.name === payload.name,\n ))\n )\n reason = 'not-found'\n else\n emit({\n type:\n command.action === 'input'\n ? 'ai.input.responded'\n : 'ai.input.requested',\n payload,\n })\n break\n }\n case 'retry': {\n const response = state.coordinator.response\n if (\n !state.active ||\n response?.status !== 'failed' ||\n response.rootMessageId !== command.request.messageId ||\n response.responseMessageId !== command.request.responseMessageId\n )\n reason = 'stale-turn'\n else if (!state.inbox.paused && !state.active.suspended) {\n emit({ type: 'ai.retry.requested', payload: command.request })\n requestModel({\n request: {\n messageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'retry',\n },\n id: `ai.generate:retry:${command.request.retryId}`,\n })\n } else reason = 'stale-turn'\n break\n }\n }\n } else {\n const report = ctx.event.payload as WorkReport\n const active = state.active\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) => candidate.work?.id === report.workId,\n )\n const work = report.kind === 'model' ? active?.model : call?.work\n const current =\n active?.turnId === report.turnId &&\n work?.id === report.workId &&\n work.version === report.version &&\n !work.settled &&\n report.attempt >= (work.attempt ?? 0)\n if (!current) {\n reason = 'stale-work'\n } else {\n work.attempt = report.attempt\n const authorized =\n !active.suspended && active.version === report.version\n for (const event of report.events) {\n if (work.facts?.includes(event.id)) continue\n if (\n authorized ||\n (report.kind === 'tool' && event.type === 'ai.tool.result')\n ) {\n emit({ type: event.type, payload: event.payload, id: event.id })\n work.facts = [...(work.facts ?? []), event.id]\n }\n }\n if (report.settled) work.settled = true\n if (!authorized) reason = 'stale-work'\n }\n }\n\n let active = state.active\n let response = state.coordinator.response\n if (active && response === undefined) {\n state.active = null\n active = null\n }\n if (active && response) {\n const handoff = state.inbox.items.some(\n (item) => item.afterStepOf === active.turnId,\n )\n const outstanding =\n (active.model !== null && !active.model.settled) ||\n response.calls.some(\n (candidate) =>\n candidate.work !== undefined && !candidate.work.settled,\n )\n if (active.suspended) {\n active.phase = outstanding ? 'pausing' : 'paused'\n if (!state.inbox.paused && !outstanding && !handoff)\n active.suspended = false\n }\n if (!active.suspended && response.failure) active.phase = 'failed'\n if (!active.suspended && response.failure === undefined) {\n for (const call of response.calls) {\n if (\n call.terminal ||\n (call.work !== undefined &&\n (!call.work.settled || call.work.version === active.version)) ||\n call.call.providerExecuted === true ||\n (call.approval && !call.response)\n )\n continue\n if (call.response?.approved === false) {\n emit({\n type: 'ai.tool.result',\n payload: {\n ...call.call,\n denied: true,\n phase: 'execution',\n },\n })\n continue\n }\n const id = `${ctx.event.id}:tool:${call.call.toolCallId}`\n call.work = { id, version: active.version, settled: false }\n jobs.push({\n type: 'ai.tool.execution.requested',\n id,\n payload: {\n turnId: active.turnId,\n version: active.version,\n call: call.call,\n generation: response.generation!,\n },\n } as AppendInput<D>)\n }\n }\n response = state.coordinator.response!\n const callsDone = response.calls.every(callReadyForModel)\n const modelDone = active.model === null || active.model.settled\n const workSettled =\n modelDone &&\n response.calls.every(\n (call) => call.work === undefined || call.work.settled,\n )\n const externalPending = response.calls.some(\n (call) =>\n call.call.providerExecuted &&\n call.call.supportsDeferredResults &&\n !call.terminal &&\n !approvalBlocksExecution(call),\n )\n const handoffReady =\n handoff &&\n workSettled &&\n !externalPending &&\n (active.suspended ||\n response.failure !== undefined ||\n response.calls.every(\n (call) => callReadyForModel(call) || approvalBlocksExecution(call),\n ))\n const readyForModel =\n !active.suspended &&\n response.failure === undefined &&\n modelDone &&\n callsDone &&\n response.inputs.length === 0\n const naturalCompletion =\n readyForModel &&\n response.completion !== undefined &&\n response.completion.finishReason !== 'tool-calls'\n if (handoffReady && !naturalCompletion) {\n end({ lastSeenIndex: undefined, reason: 'steered after step' })\n } else if (readyForModel && (!handoff || handoffReady)) {\n const resume =\n active.model !== null && active.model.version !== active.version\n const input = response.inputResponse\n if (\n !handoff &&\n (resume ||\n continuationReady(state.coordinator) ||\n (response.completion && input))\n ) {\n const nextReason = resume ? 'resume' : input ? 'input' : 'tool'\n const id =\n nextReason === 'tool'\n ? `ai.generate:tools:${response.generation!.generationId}`\n : `${ctx.event.id}:generate:${nextReason}`\n requestModel({\n request: {\n messageId: response.responseMessageId,\n responseMessageId: response.responseMessageId,\n reason: nextReason,\n },\n id,\n })\n } else if (naturalCompletion) {\n emit({\n type: 'ai.message.completed',\n payload: {\n messageId: response.responseMessageId,\n },\n })\n state.active = null\n }\n }\n if (\n !active.suspended &&\n state.active &&\n jobs.every((job) => job.type !== 'ai.generation.requested')\n )\n state.active.phase = response.failure\n ? 'failed'\n : !modelDone\n ? 'generating'\n : !callsDone\n ? 'tools'\n : 'waiting'\n }\n if (\n state.active === null &&\n !state.inbox.paused &&\n !state.coordinator.closed\n ) {\n while (state.inbox.items.length > 0) {\n const item = state.inbox.items.shift()!\n delete item.afterStepOf\n emit({\n type: 'ai.message.created',\n payload: { message: item.message, generate: item.generate },\n id: `ai.admitted:${item.id}`,\n })\n if (!item.generate) continue\n state.active = {\n turnId: item.id,\n input: item,\n phase: 'starting',\n version: 0,\n suspended: false,\n model: null,\n }\n requestModel({\n request: { messageId: item.id, reason: 'message' },\n id: `ai.generate:message:${item.id}`,\n })\n break\n }\n }\n const receipt: ControlReceipt = {\n commandId: ctx.event.id,\n ...(ctx.event.type === 'ai.work.reported' ? { work: true as const } : {}),\n outcome: reason === undefined ? 'applied' : 'rejected',\n ...(reason === undefined ? {} : { reason }),\n }\n return [\n ...(facts as AppendInput<D>[]),\n {\n type: 'ai.control.committed',\n payload: controlCommit({ before, after: state, moves }),\n } as AppendInput<D>,\n ...jobs,\n { type: 'ai.control.decided', payload: receipt } as AppendInput<D>,\n ]\n }\n\n const report = ({\n ctx,\n events,\n settled,\n name,\n }: {\n ctx: HandlerContext<D>\n events: readonly AppendInput<D>[]\n settled: boolean\n name: string\n }): AppendInput<D> => {\n const payload = ctx.event.payload as\n GenerationRequestedPayload | { turnId: string; version: number }\n const { turnId, version } = 'turnId' in payload ? payload : payload.control!\n for (const event of events) {\n const schema = options.agent.contract.events[\n event.type\n ] as StandardSchemaV1<unknown>\n const result = validateSync(\n schema,\n event.payload,\n `AI worker ${event.type}`,\n )\n if (result.issues)\n throw new TypeError(\n result.issues.map((issue) => issue.message).join('; '),\n )\n }\n return {\n type: 'ai.work.reported',\n id: `${ctx.event.id}:report:${ctx.attempt}:${name}`,\n payload: {\n workId: ctx.event.id,\n attempt: ctx.attempt,\n turnId,\n version,\n kind: ctx.event.type === 'ai.generation.requested' ? 'model' : 'tool',\n settled,\n events: events\n .filter(\n (event) =>\n event.type !== 'ai.message.completed' &&\n event.type !== 'ai.message.interrupted',\n )\n .map((event, index) => ({\n type: event.type,\n payload: event.payload,\n id:\n event.id ??\n `${ctx.event.id}:fact:${ctx.attempt}:${name}:${index}`,\n })),\n },\n } as AppendInput<D>\n }\n\n const append = async ({\n ctx,\n name,\n events,\n }: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]> => {\n const progress = events.filter(\n (event) => event.type === 'ai.generation.progress',\n )\n const lifecycle = events.filter(\n (event) => event.type !== 'ai.generation.progress',\n )\n if (lifecycle.length === 0) return ctx.session.append(name, ...progress)\n const input = report({ ctx, events: lifecycle, settled: false, name })\n const persisted = await ctx.session.append(name, ...progress, input)\n const index = persisted.at(-1)!.index\n const feed = ctx.session.stream({ startAfter: index })\n const stream = feed[Symbol.asyncIterator]()\n const canonical: ContractEvent<D>[] = []\n const wanted = new Set(lifecycle.map((event) => event.id))\n let rejectAbort!: (error: unknown) => void\n const aborted = new Promise<never>((_, reject) => {\n rejectAbort = reject\n })\n const onAbort = (): void => {\n rejectAbort(ctx.signal.reason)\n }\n ctx.signal.addEventListener('abort', onAbort, { once: true })\n try {\n ctx.signal.throwIfAborted()\n for (;;) {\n const item = await Promise.race([stream.next(), aborted])\n if (item.done)\n throw new Error('AI control acknowledgement stream ended')\n if (wanted.has(item.value.id)) canonical.push(item.value)\n if (\n item.value.type === 'ai.control.decided' &&\n (item.value.payload as ControlReceipt).commandId === input.id\n ) {\n if ((item.value.payload as ControlReceipt).outcome === 'rejected')\n throw new ControlCancelled('stale AI work')\n return [\n ...persisted.filter((event) => event.type !== 'ai.work.reported'),\n ...canonical,\n ]\n }\n }\n } finally {\n ctx.signal.removeEventListener('abort', onAbort)\n await stream.return?.()\n }\n }\n\n const settled = ({\n ctx,\n events,\n }: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): AppendInput<D> =>\n report({\n ctx,\n events:\n events === undefined\n ? []\n : Array.isArray(events)\n ? events\n : [events as AppendInput<D>],\n settled: true,\n name: 'settled',\n })\n const cancelled = ({\n error,\n signal,\n }: {\n error: unknown\n signal: AbortSignal\n }): boolean => {\n if (signal.reason instanceof A2Error) throw signal.reason\n return error instanceof ControlCancelled || signal.aborted\n }\n return { handler, append, settled, cancelled, reducer, coordinator }\n}\n","import {\n convertToModelMessages,\n stepCountIs,\n streamText,\n toUIMessageStream,\n} from 'ai'\nimport type {\n FinishReason,\n InferUIMessageChunk,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n} from 'ai'\n\ntype StreamTextOptions<T extends ToolSet> = Parameters<typeof streamText<T>>[0]\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\ntype ModelStepTimeout<T extends ToolSet> =\n | number\n | Omit<\n Exclude<StreamTextOptions<T>['timeout'], number | undefined>,\n 'toolMs' | 'tools'\n >\n\ntype ControlledStreamTextSetting =\n | '_internal'\n | 'abortSignal'\n | 'instructions'\n | 'messages'\n | 'model'\n | 'onToolExecutionEnd'\n | 'onToolExecutionStart'\n | 'experimental_onToolCallFinish'\n | 'experimental_onToolCallStart'\n | 'experimental_sandbox'\n | 'experimental_toolCallers'\n | 'experimental_toolApprovalSecret'\n | 'prompt'\n | 'prepareStep'\n | 'stopWhen'\n | 'system'\n | 'tools'\n\ntype RetypedStreamTextSetting =\n | 'experimental_onStart'\n | 'experimental_onStepStart'\n | 'experimental_repairToolCall'\n | 'experimental_transform'\n | 'onStart'\n | 'onStepStart'\n | 'repairToolCall'\n\ntype ModelFacingTools<T extends ToolSet> = {\n readonly [K in keyof T]: Omit<T[K], 'execute'>\n}\n\ntype SettingEvent<T extends ToolSet, K extends keyof StreamTextOptions<T>> =\n NonNullable<StreamTextOptions<T>[K]> extends (event: infer EVENT) => unknown\n ? EVENT\n : never\n\ntype ModelPhaseStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseStepStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStepStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseCallback<EVENT> = (event: EVENT) => void | PromiseLike<void>\n\ntype StreamTextRepairToolCall<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['repairToolCall']\n>\n\ntype ModelPhaseRepairToolCall<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextRepairToolCall<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextRepairToolCall<T>>\n\ntype StreamTextTransformSetting<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['experimental_transform']\n>\n\ntype StreamTextTransform<T extends ToolSet> = Extract<\n StreamTextTransformSetting<T>,\n (...args: never[]) => unknown\n>\n\ntype ModelPhaseTransform<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextTransform<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextTransform<T>>\n\n/** AI SDK streamText settings that remain meaningful for one durable step. */\nexport type AISDKStepSettings<T extends ToolSet> = Partial<\n Omit<\n StreamTextOptions<T>,\n ControlledStreamTextSetting | RetypedStreamTextSetting | 'timeout'\n >\n> & {\n timeout?: ModelStepTimeout<T>\n onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n experimental_onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n experimental_onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_transform?:\n ModelPhaseTransform<T> | Array<ModelPhaseTransform<T>>\n}\n\nexport type AISDKStepInput<M extends UIMessage, T extends ToolSet> = {\n model: LanguageModel\n tools: T\n messages: M[]\n modelMessages?: ModelMessage[]\n responseMessageId: string\n abortSignal: AbortSignal\n instructions?: Instructions\n settings?: AISDKStepSettings<T>\n messageMetadata?: (options: {\n part: TextStreamPart<T>\n }) => UIMessageMetadata<M> | undefined\n}\n\nexport type AISDKStepCompletion = {\n finishReason: FinishReason\n usage: LanguageModelUsage\n}\n\nexport type AISDKStepResult<M extends UIMessage> = {\n stream: ReadableStream<InferUIMessageChunk<M>>\n completion(): AISDKStepCompletion\n}\n\nconst CONTROLLED_SETTINGS: readonly ControlledStreamTextSetting[] = [\n '_internal',\n 'abortSignal',\n 'instructions',\n 'messages',\n 'model',\n 'onToolExecutionEnd',\n 'onToolExecutionStart',\n 'experimental_onToolCallFinish',\n 'experimental_onToolCallStart',\n 'experimental_sandbox',\n 'experimental_toolCallers',\n 'experimental_toolApprovalSecret',\n 'prompt',\n 'prepareStep',\n 'stopWhen',\n 'system',\n 'tools',\n]\n\nconst safeSettings = <T extends ToolSet>(\n settings: AISDKStepSettings<T> | undefined,\n): AISDKStepSettings<T> => {\n const result = { ...settings } as AISDKStepSettings<T>\n for (const key of CONTROLLED_SETTINGS) Reflect.deleteProperty(result, key)\n if (typeof result.timeout === 'object' && result.timeout !== null) {\n const timeout = { ...result.timeout } as Record<string, unknown>\n Reflect.deleteProperty(timeout, 'toolMs')\n Reflect.deleteProperty(timeout, 'tools')\n result.timeout = timeout as ModelStepTimeout<T>\n }\n return result\n}\n\nconst modelToolSet = <T extends ToolSet>(tools: T): T =>\n Object.fromEntries(\n Object.entries(tools).map(([name, tool]) => {\n if (tool.type === 'provider' && tool.isProviderExecuted === true) {\n return [name, tool]\n }\n const definition = { ...tool }\n Reflect.deleteProperty(definition, 'execute')\n return [name, definition]\n }),\n ) as T\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\n/** Run exactly one AI SDK model step while leaving local tool execution to A2. */\nexport async function generateAISDKStep<M extends UIMessage, T extends ToolSet>(\n input: AISDKStepInput<M, T>,\n): Promise<AISDKStepResult<M>> {\n const settings = safeSettings(input.settings)\n const tools = modelToolSet(input.tools)\n const messages =\n input.modelMessages ??\n (await convertToModelMessages(input.messages, { tools }))\n const streamOptions = {\n ...settings,\n model: input.model,\n tools,\n messages,\n abortSignal: input.abortSignal,\n ...(input.instructions === undefined\n ? {}\n : { instructions: input.instructions }),\n stopWhen: stepCountIs(1),\n // A2 records stream failures durably; the AI SDK default writes them to\n // stderr in addition to yielding an error part.\n onError: settings.onError ?? (() => {}),\n } as unknown as StreamTextOptions<T>\n const result = streamText<T>(streamOptions)\n\n let completion: AISDKStepCompletion | undefined\n let fatalError: { value: unknown } | undefined\n const observed = result.stream.pipeThrough(\n new TransformStream<TextStreamPart<T>, TextStreamPart<T>>({\n transform(part, controller) {\n if (part.type === 'error' && fatalError === undefined) {\n fatalError = { value: part.error }\n } else if (part.type === 'finish') {\n completion = {\n finishReason: part.finishReason,\n usage: part.totalUsage,\n }\n }\n controller.enqueue(part)\n },\n }),\n )\n\n return {\n stream: toUIMessageStream<T, M>({\n stream: observed,\n tools,\n generateMessageId: () => input.responseMessageId,\n onError: errorMessage,\n ...(input.messageMetadata === undefined\n ? {}\n : { messageMetadata: input.messageMetadata }),\n }),\n completion() {\n if (fatalError !== undefined) throw fatalError.value\n if (completion === undefined) {\n throw new Error('AI SDK step ended without a finish part')\n }\n if (completion.finishReason === 'error') {\n throw new Error('AI SDK step finished with an error')\n }\n return completion\n },\n }\n}\n","import type { LanguageModel } from 'ai'\nimport type { ModelLimits } from './ai.ts'\n\nconst catalogUrl = 'https://ai-gateway.vercel.sh/v1/models'\nconst catalogLifetimeMs = 60 * 60 * 1_000\nconst catalogTimeoutMs = 5_000\n\nlet catalog:\n | {\n expiresAt: number\n promise: Promise<ReadonlyMap<string, ModelLimits>>\n }\n | undefined\n\nexport const gatewayModelId = (model: LanguageModel): string | undefined => {\n if (typeof model === 'string') {\n return globalThis.AI_SDK_DEFAULT_PROVIDER === undefined ? model : undefined\n }\n return model.provider === 'gateway' ? model.modelId : undefined\n}\n\nconst readCatalog = (): Promise<ReadonlyMap<string, ModelLimits>> => {\n if (catalog && catalog.expiresAt > Date.now()) return catalog.promise\n const entry = {\n expiresAt: Number.POSITIVE_INFINITY,\n promise: (async () => {\n const controller = new AbortController()\n const timeout = setTimeout(\n () => controller.abort(new Error('model catalog request timed out')),\n catalogTimeoutMs,\n )\n timeout.unref?.()\n try {\n const response = await fetch(catalogUrl, { signal: controller.signal })\n if (!response.ok)\n throw new Error(\n `model catalog request failed: HTTP ${response.status}`,\n )\n const body: unknown = await response.json()\n if (\n typeof body !== 'object' ||\n body === null ||\n !('data' in body) ||\n !Array.isArray(body.data)\n ) {\n throw new Error('model catalog response must contain a data array')\n }\n const models = new Map<string, ModelLimits>()\n for (const row of body.data as unknown[]) {\n if (\n typeof row !== 'object' ||\n row === null ||\n !('type' in row) ||\n !('id' in row) ||\n !('context_window' in row) ||\n !('max_tokens' in row) ||\n row.type !== 'language' ||\n typeof row.id !== 'string' ||\n typeof row.context_window !== 'number' ||\n typeof row.max_tokens !== 'number' ||\n !Number.isSafeInteger(row.context_window) ||\n row.context_window <= 0 ||\n !Number.isSafeInteger(row.max_tokens) ||\n row.max_tokens <= 0\n )\n continue\n models.set(row.id, {\n contextWindow: row.context_window,\n maxOutputTokens: row.max_tokens,\n })\n }\n return models\n } finally {\n clearTimeout(timeout)\n }\n })(),\n }\n catalog = entry\n entry.promise = entry.promise.then(\n (models) => {\n entry.expiresAt = Date.now() + catalogLifetimeMs\n return models\n },\n (error: unknown) => {\n if (catalog === entry) catalog = undefined\n throw error\n },\n )\n return entry.promise\n}\n\nexport const readModelLimits = async (options: {\n modelId: string\n signal: AbortSignal\n}): Promise<ModelLimits | null> => {\n options.signal.throwIfAborted()\n let onAbort!: () => void\n const aborted = new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(options.signal.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n })\n try {\n const models = await Promise.race([readCatalog(), aborted])\n return models.get(options.modelId) ?? null\n } finally {\n options.signal.removeEventListener('abort', onAbort)\n }\n}\n","/**\n * experimental-a2/ai/server — the server-only implementation of an experimental-a2/ai definition.\n *\n * `createHandlers()` exposes the ordinary A2 handler table;\n * `createAgentServer()` is its batteries-included assembly with createServer.\n */\n\n// oxlint-disable no-await-in-loop -- stream chunks and durable appends are\n// ordered; parallel consumption would corrupt progress sequence and state.\n\nimport { createControlRuntime, ControlCancelled } from './ai-control-server.ts'\nimport type { ControlCommit } from './ai-control.ts'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { createHash } from 'node:crypto'\nimport { asSchema, convertToModelMessages } from 'ai'\nimport type {\n FinishReason,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport { generateAISDKStep, type AISDKStepSettings } from './ai-sdk-step.ts'\nimport { gatewayModelId, readModelLimits } from './ai-model-metadata.ts'\nimport type {\n AIEventDefs,\n AIState,\n AgentDefinition,\n AgentToolContext,\n AgentToolEventDefs,\n ApprovalRequestedPayload,\n CompactionCompletedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationStartedPayload,\n MessageCompletedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n type AICoordinatorState,\n} from './ai-coordinator.ts'\nimport type { AppendInput, ContractEvent, EventDefs } from './contract.ts'\nimport { A2Error } from './errors.ts'\nimport {\n consumeSchedulerSendFailure,\n installAmbientToolScopeStorage,\n type AmbientToolScope,\n} from './internal.ts'\nimport {\n createServer,\n type A2Server,\n type HandlerContext,\n type ServerOptions,\n} from './server.ts'\nimport {\n setServerFetchHooks,\n type ServerIngressContext,\n} from './server-fetch.ts'\n\nfunction validateAgentIngress(context: ServerIngressContext): void {\n const rejected = context.events.find((event) => {\n if (event.type !== 'ai.control.requested') return true\n const command = event.payload as Record<string, unknown>\n if (\n command['action'] === 'request-input' ||\n command['action'] === 'tool-result'\n )\n return true\n if (\n command['action'] === 'send' ||\n command['action'] === 'edit' ||\n command['action'] === 'steer'\n ) {\n return (\n (command['message'] as { role?: unknown } | undefined)?.role !== 'user'\n )\n }\n return false\n })\n if (rejected !== undefined) {\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `event '${rejected.type}' is server-only for an AI agent`,\n )\n }\n}\n\ntype AgentGenerationProgress = {\n type: 'progress'\n chunks: UIMessageChunk[]\n}\n\ntype AgentGenerationFinish = {\n type: 'finish'\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype AgentGenerationUpdate = AgentGenerationProgress | AgentGenerationFinish\n\nexport type AgentGenerateContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = {\n request: ContractEvent<D, 'ai.generation.requested'>\n requestId: string\n generationId: string\n responseMessageId: string\n messages: M[]\n modelMessages: ModelMessage[]\n state: AIState<M>\n session: Pick<HandlerContext<D>['session'], 'state'>\n signal: AbortSignal\n model: LanguageModel\n tools: T\n instructions?: Instructions\n generation: AgentGenerationSettings<T>\n}\n\nexport type AgentGenerate<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = (\n context: AgentGenerateContext<M, D, T>,\n) => ReadableStream<UIMessageChunk> | Promise<ReadableStream<UIMessageChunk>>\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\nexport type AgentMessageMetadata<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = (\n context: AgentGenerateContext<M, D, T> & { part: TextStreamPart<T> },\n) => UIMessageMetadata<M> | undefined\n\nexport type AgentResolverContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n event: ContractEvent<D, 'ai.generation.requested'>\n state: AIState<M>\n session: Pick<HandlerContext<D>['session'], 'state'>\n signal: AbortSignal\n}\n\nexport type Resolvable<T, C> = T | ((context: C) => T | Promise<T>)\n\nexport type CompactionPolicy<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n shouldCompact(\n context: AgentResolverContext<M, D> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): boolean | Promise<boolean>\n compact(\n context: AgentResolverContext<M, D> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): M[] | Promise<M[]>\n}\n\nexport type AutomaticCompaction = {\n thresholdTokens?: number\n instructions?: string\n}\n\nexport type CompactionOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = false | AutomaticCompaction | CompactionPolicy<M, D>\n\nexport type AgentGenerationSettings<T extends ToolSet> = AISDKStepSettings<T>\n\nexport type CreateHandlersOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n> = {\n agent: AgentDefinition<M, D>\n /** AI SDK model string or provider model, optionally resolved per generation. */\n model: Resolvable<LanguageModel, AgentResolverContext<M, D>>\n tools?: T\n instructions?: Resolvable<\n Instructions | undefined,\n AgentResolverContext<M, D>\n >\n /** Settings for each one-step AI SDK streamText call. */\n generation?: AgentGenerationSettings<T>\n /**\n * Maximum model steps in one assistant response. Defaults to Infinity.\n */\n maxSteps?: number\n /** Map default AI SDK stream parts to typed assistant message metadata. */\n messageMetadata?: AgentMessageMetadata<M, D, T>\n /**\n * Replace model generation with an AI SDK UI message chunk stream.\n * The custom stream owns its metadata chunks.\n */\n generate?: AgentGenerate<M, D, T>\n compaction?: Resolvable<CompactionOptions<M, D>, AgentResolverContext<M, D>>\n /** Progress is durably flushed at either limit, whichever is reached first. */\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}\n\nexport type CreateAgentServerOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n> = CreateHandlersOptions<M, D, T> &\n Omit<ServerOptions<D>, 'contract' | 'handlers'> & {\n handlers?: ServerOptions<D>['handlers']\n }\n\nconst checkAbort = (signal: AbortSignal): boolean => {\n if (!signal.aborted) return false\n const reason: unknown = signal.reason\n if (\n reason instanceof A2Error &&\n (reason.code === 'CLAIM_EXPIRED' || reason.code === 'SUPERSEDED_ATTEMPT')\n ) {\n throw reason\n }\n return true\n}\n\nconst resolve = async <T, C extends { signal: AbortSignal }>(\n value: Resolvable<T, C>,\n context: C,\n): Promise<T> => {\n let result: T\n try {\n result =\n typeof value === 'function'\n ? await (value as (context: C) => T | Promise<T>)(context)\n : value\n } catch (error) {\n checkAbort(context.signal)\n throw error\n }\n checkAbort(context.signal)\n return result\n}\n\nconst modelName = (model: LanguageModel): string => {\n if (typeof model === 'string') return model\n if ('modelId' in model && typeof model.modelId === 'string') {\n return model.modelId\n }\n return 'custom'\n}\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\nconst toolScopeStorage = installAmbientToolScopeStorage(\n () => new AsyncLocalStorage<AmbientToolScope>(),\n)\n\n/** Run `fn` with `ctx` as the ambient tool handler context, for direct tool tests. */\nexport function runWithHandlerContext<D extends AgentToolEventDefs, R>(\n ctx: AgentToolContext<D>,\n fn: () => R,\n): R {\n return toolScopeStorage.run({ context: ctx }, fn)\n}\n\nconst promptCacheKey = (sessionId: string, generationId: string): string =>\n `${sessionId}\\u001f${generationId}`\n\nconst asyncIterator = (value: unknown): AsyncIterator<unknown> | undefined => {\n if (typeof value !== 'object' || value === null) return undefined\n const factory = Reflect.get(value, Symbol.asyncIterator)\n if (typeof factory !== 'function') return undefined\n return (factory as (this: object) => AsyncIterator<unknown>).call(value)\n}\n\nconst isBoundaryChunk = (chunk: UIMessageChunk | undefined): boolean =>\n chunk !== undefined &&\n (chunk.type === 'text-end' ||\n chunk.type === 'reasoning-end' ||\n chunk.type === 'tool-input-available' ||\n chunk.type === 'tool-input-error' ||\n chunk.type === 'tool-output-available' ||\n chunk.type === 'tool-output-error' ||\n chunk.type === 'tool-output-denied' ||\n chunk.type === 'tool-approval-request' ||\n chunk.type === 'finish' ||\n chunk.type === 'abort' ||\n chunk.type === 'error')\n\ntype StreamRead<T> = Awaited<ReturnType<ReadableStreamDefaultReader<T>['read']>>\n\nconst nextOrTimer = async <T>(\n next: Promise<StreamRead<T>>,\n delayMs: number,\n): Promise<{ type: 'next'; result: StreamRead<T> } | { type: 'timer' }> => {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n next.then((result) => ({ type: 'next' as const, result })),\n new Promise<{ type: 'timer' }>((finishTimer) => {\n timer = setTimeout(() => finishTimer({ type: 'timer' }), delayMs)\n ;(timer as { unref?: () => void }).unref?.()\n }),\n ])\n } finally {\n if (timer !== undefined) clearTimeout(timer)\n }\n}\n\ntype GenerationCompletion = {\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype GenerationSource = {\n stream: ReadableStream<UIMessageChunk>\n completion?: () => GenerationCompletion\n}\n\nasync function generateWithAISDK<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n agentName: string\n context: AgentGenerateContext<M, D, T>\n messageMetadata: AgentMessageMetadata<M, D, T> | undefined\n}): Promise<GenerationSource> {\n const { agentName, context, messageMetadata } = options\n const headers = context.generation.headers ?? {}\n const generation =\n gatewayModelId(context.model) === undefined\n ? context.generation\n : {\n ...context.generation,\n headers: Object.keys(headers).some(\n (key) => key.toLowerCase() === 'x-session-affinity',\n )\n ? headers\n : {\n ...headers,\n 'x-session-affinity': createHash('sha256')\n .update(\n JSON.stringify([agentName, context.request.sessionId]),\n )\n .digest('hex'),\n },\n providerOptions: {\n ...context.generation.providerOptions,\n gateway: {\n caching: 'auto',\n ...context.generation.providerOptions?.['gateway'],\n },\n },\n }\n const step = await generateAISDKStep<M, T>({\n model: context.model,\n tools: context.tools,\n messages: context.messages,\n modelMessages: context.modelMessages,\n responseMessageId: context.responseMessageId,\n abortSignal: context.signal,\n ...(context.instructions === undefined\n ? {}\n : { instructions: context.instructions }),\n settings: generation,\n ...(messageMetadata === undefined\n ? {}\n : {\n messageMetadata: ({ part }) =>\n messageMetadata({ ...context, generation, part }),\n }),\n })\n return {\n stream: step.stream as ReadableStream<UIMessageChunk>,\n completion: step.completion,\n }\n}\n\nasync function* consumeGeneration(options: {\n source: GenerationSource\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}): AsyncGenerator<AgentGenerationUpdate> {\n const pending: UIMessageChunk[] = []\n let streamedFinishReason: FinishReason | undefined\n let streamedError: string | undefined\n const maxChunks = options.progress?.maxChunks ?? 16\n const maxDelayMs = options.progress?.maxDelayMs ?? 30\n let lastFlush = Date.now()\n const reader = options.source.stream.getReader()\n let pendingChunk = reader.read()\n try {\n for (;;) {\n let result: StreamRead<UIMessageChunk>\n if (pending.length > 0) {\n const remaining = Math.max(0, maxDelayMs - (Date.now() - lastFlush))\n const outcome = await nextOrTimer(pendingChunk, remaining)\n if (outcome.type === 'timer') {\n yield { type: 'progress', chunks: pending.splice(0) }\n lastFlush = Date.now()\n continue\n }\n result = outcome.result\n } else {\n result = await pendingChunk\n }\n if (result.done) break\n const chunk = result.value\n pending.push(chunk)\n if (chunk.type === 'finish') streamedFinishReason = chunk.finishReason\n if (chunk.type === 'error') streamedError = chunk.errorText\n pendingChunk = reader.read()\n\n if (pending.length >= maxChunks || isBoundaryChunk(pending.at(-1))) {\n yield { type: 'progress', chunks: pending.splice(0) }\n lastFlush = Date.now()\n }\n }\n } catch (error) {\n if (pending.length > 0)\n yield { type: 'progress', chunks: pending.splice(0) }\n throw error\n } finally {\n void pendingChunk.catch(() => {})\n try {\n await reader.cancel()\n } catch {\n // Cleanup must not replace the error that ended generation.\n } finally {\n reader.releaseLock()\n }\n }\n\n let completion: GenerationCompletion | undefined\n try {\n completion = options.source.completion?.()\n } catch (error) {\n if (pending.length > 0) {\n yield { type: 'progress', chunks: pending.splice(0) }\n }\n throw error\n }\n if (pending.length > 0) {\n yield { type: 'progress', chunks: pending.splice(0) }\n }\n if (streamedError !== undefined) throw new Error(streamedError)\n const finishReason = completion?.finishReason ?? streamedFinishReason\n yield {\n type: 'finish',\n ...(finishReason === undefined ? {} : { finishReason }),\n ...(completion?.usage === undefined ? {} : { usage: completion.usage }),\n }\n}\n\nconst foldAIEvents = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n state: AIState<M>\n events: ContractEvent<D>[]\n}): AIState<M> => {\n let state = options.state\n for (const event of options.events)\n state = options.agent.reducer.fold(state, event)\n return state\n}\n\nconst summarize = async <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n agentName: string\n context: AgentGenerateContext<M, D, T>\n instructions: string | undefined\n}): Promise<{ summary: string; usage?: LanguageModelUsage }> => {\n const instruction = [\n 'Summarize this conversation so you can continue the task after the earlier context is replaced by your summary.',\n 'Preserve the objective, constraints, decisions, exact identifiers, completed actions and their results, unresolved questions, and next steps. Distinguish observations from assumptions.',\n 'Respond only with the summary as text. Do not call any tools or continue working on the task.',\n options.instructions,\n ]\n .filter(Boolean)\n .join('\\n')\n const generation = { ...options.context.generation }\n for (const key of Object.keys(generation)) {\n if (\n key.startsWith('on') ||\n key.startsWith('experimental_on') ||\n [\n 'repairToolCall',\n 'experimental_repairToolCall',\n 'experimental_refineToolInput',\n 'experimental_transform',\n 'toolApproval',\n ].includes(key)\n ) {\n Reflect.deleteProperty(generation, key)\n }\n }\n const tools = Object.fromEntries(\n Object.entries(options.context.tools).map(([name, tool]) => {\n const definition = { ...tool, needsApproval: false }\n for (const key of [\n 'execute',\n 'onInputStart',\n 'onInputDelta',\n 'onInputAvailable',\n ]) {\n Reflect.deleteProperty(definition, key)\n }\n return [name, definition]\n }),\n ) as T\n const source = await generateWithAISDK({\n agentName: options.agentName,\n context: {\n ...options.context,\n generation,\n tools,\n modelMessages: [\n ...options.context.modelMessages,\n { role: 'user', content: instruction },\n ],\n responseMessageId: `${options.context.generationId}:summary`,\n },\n messageMetadata: undefined,\n })\n let summary = ''\n let calledTool = false\n let finish: AgentGenerationFinish | undefined\n for await (const update of consumeGeneration({ source })) {\n options.context.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n for (const chunk of update.chunks) {\n if (chunk.type === 'text-delta') summary += chunk.delta\n if (chunk.type.startsWith('tool-')) calledTool = true\n }\n }\n if (\n calledTool ||\n summary.trim().length === 0 ||\n finish?.finishReason !== 'stop'\n ) {\n throw new Error(\n 'compaction must produce a complete text summary without calling tools',\n )\n }\n return {\n summary,\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n}\n\nconst activeCompaction = <M extends UIMessage>(\n state: AIState<M>,\n): AIState<M>['compaction'] => {\n const compaction = state.compaction\n return compaction?.status === 'completed' &&\n compaction.messages !== undefined &&\n state.messages.some((message) => message.id === compaction.throughMessageId)\n ? compaction\n : null\n}\n\nconst contextMessages = async <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n agent: AgentDefinition<M, D>\n session: HandlerContext<D>['session']\n snapshot: { state: AIState<M>; index: number }\n coordinator: AICoordinatorState\n appended?: ContractEvent<D>[]\n excluded?: ReadonlySet<string>\n}): Promise<M[]> => {\n const { agent, session, snapshot } = options\n const appended = options.appended ?? []\n const state = foldAIEvents({ agent, events: appended, state: snapshot.state })\n const compaction = activeCompaction(state)\n const queued = new Set(\n options.coordinator.queued.map((item) => item.messageId),\n )\n const visible = (messages: M[]): M[] =>\n messages.filter((message) => !queued.has(message.id))\n if (compaction === null) return visible(state.messages)\n const retained = new Set(compaction.retainedMessageIds ?? [])\n const throughIndex = compaction.throughIndex\n if (throughIndex !== undefined) {\n const [prefix, priorCoordinator, tail] = await Promise.all([\n throughIndex === snapshot.index\n ? Promise.resolve(snapshot)\n : session.state(agent.reducer, { through: throughIndex }),\n session.state(aiCoordinatorReducer(agent.contract), {\n through: throughIndex,\n }),\n throughIndex >= snapshot.index\n ? Promise.resolve([])\n : session.history({ gte: throughIndex + 1, lte: snapshot.index }),\n ])\n for (const item of priorCoordinator.state.queued)\n retained.add(item.messageId)\n const events =\n options.excluded === undefined\n ? tail\n : withoutGenerationLifecycle(tail, options.excluded)\n const context = foldAIEvents({\n agent,\n events: [...events, ...appended],\n state: {\n ...prefix.state,\n messages: [\n ...compaction.messages!,\n ...prefix.state.messages.filter((message) =>\n retained.has(message.id),\n ),\n ],\n activeProjection: null,\n },\n })\n const positions = new Map<string, number>()\n for (const message of [...compaction.messages!, ...state.messages]) {\n if (!positions.has(message.id)) positions.set(message.id, positions.size)\n }\n return visible(\n context.messages.toSorted(\n (left, right) =>\n (positions.get(left.id) ?? positions.size) -\n (positions.get(right.id) ?? positions.size),\n ),\n )\n }\n const boundary = state.messages.findIndex(\n (message) => message.id === compaction.throughMessageId,\n )\n return visible([\n ...compaction.messages!,\n ...state.messages\n .slice(0, boundary + 1)\n .filter((message) => retained.has(message.id)),\n ...state.messages.slice(boundary + 1),\n ])\n}\n\nconst modelContext = async <M extends UIMessage>(options: {\n messages: M[]\n state: AIState<M>\n tools: ToolSet\n}): Promise<ModelMessage[]> => {\n const messages = await convertToModelMessages(options.messages, {\n tools: options.tools,\n })\n const summary = activeCompaction(options.state)?.summary\n return summary === undefined\n ? messages\n : [{ role: 'user', content: summary }, ...messages]\n}\n\nconst estimateInputTokens = async (options: {\n messages: ModelMessage[]\n instructions: Instructions | undefined\n tools: ToolSet\n}): Promise<number> => {\n const tools = await Promise.all(\n Object.entries(options.tools).map(async ([name, tool]) => ({\n name,\n description: tool.description,\n inputSchema: await asSchema(tool.inputSchema).jsonSchema,\n })),\n )\n return Math.ceil(\n new TextEncoder().encode(\n JSON.stringify({\n messages: options.messages,\n instructions: options.instructions,\n tools,\n }),\n ).byteLength / 4,\n )\n}\n\nconst measuredInputTokens = (options: {\n estimate: number\n model: string\n calibration: AICoordinatorState['calibration']\n}): number => {\n const previous = options.calibration\n return previous !== undefined &&\n previous.model === options.model &&\n options.estimate >= previous.estimate\n ? Math.max(\n options.estimate,\n Math.ceil(previous.inputTokens + options.estimate - previous.estimate),\n )\n : options.estimate\n}\n\ntype ToolCallClassification = 'automatic' | 'approval' | 'unknown'\n\ntype PendingToolCall = {\n call: ToolCalledPayload\n classification: ToolCallClassification\n}\n\nconst toolCalledEvent = <D extends EventDefs>(\n payload: ToolCalledPayload,\n): AppendInput<D> =>\n ({\n type: 'ai.tool.called',\n id: `${payload.generationId}:tool:${payload.toolCallId}:called`,\n payload,\n }) as AppendInput<D>\n\nconst approvalClassification = <T extends ToolSet>(\n tools: T,\n generation: AgentGenerationSettings<T>,\n toolName: string,\n): ToolCallClassification => {\n const configured = generation.toolApproval\n if (typeof configured === 'function') return 'unknown'\n const policy = configured?.[toolName]\n if (typeof policy === 'function') return 'unknown'\n if (\n policy === 'user-approval' ||\n (typeof policy === 'object' && policy?.type === 'user-approval')\n ) {\n return 'approval'\n }\n if (\n policy === 'denied' ||\n (typeof policy === 'object' && policy?.type === 'denied')\n ) {\n return 'approval'\n }\n const tool = tools[toolName] as { needsApproval?: unknown } | undefined\n if (typeof tool?.needsApproval === 'function') return 'unknown'\n return tool?.needsApproval === true ? 'approval' : 'automatic'\n}\n\nconst lifecycleEvents = <D extends EventDefs, T extends ToolSet>(options: {\n requestId: string\n messageId: string\n generationId: string\n sequence: number\n chunks: UIMessageChunk[]\n pending: PendingToolCall[]\n tools: T\n generation: AgentGenerationSettings<T>\n custom: boolean\n}): { events: AppendInput<D>[]; pending: PendingToolCall[] } => {\n const result: AppendInput<D>[] = []\n const pending = [...options.pending]\n const take = (toolCallId: string): PendingToolCall | undefined => {\n const index = pending.findIndex(\n (candidate) => candidate.call.toolCallId === toolCallId,\n )\n if (index === -1) return undefined\n return pending.splice(index, 1)[0]\n }\n const flush = (toolCallId: string): void => {\n const pendingCall = take(toolCallId)\n if (pendingCall) result.push(toolCalledEvent<D>(pendingCall.call))\n }\n for (const [chunkIndex, chunk] of options.chunks.entries()) {\n const resultId = `${options.generationId}:tool-result:${options.sequence}:${chunkIndex}`\n if (chunk.type === 'tool-input-available') {\n const payload: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...((\n options.tools[chunk.toolName] as\n { supportsDeferredResults?: boolean } | undefined\n )?.supportsDeferredResults === true\n ? { supportsDeferredResults: true }\n : {}),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n }\n take(payload.toolCallId)\n const classification = approvalClassification(\n options.tools,\n options.generation,\n chunk.toolName,\n )\n if (classification === 'automatic') {\n result.push(toolCalledEvent<D>(payload))\n } else {\n pending.push({ call: payload, classification })\n }\n } else if (chunk.type === 'tool-input-error') {\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n ...(chunk.dynamic ? { input: chunk.input } : { rawInput: chunk.input }),\n error: chunk.errorText,\n phase: 'input',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n const called: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n }\n take(chunk.toolCallId)\n result.push(toolCalledEvent<D>(called), {\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-available') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n output: chunk.output,\n phase: 'execution',\n ...(chunk.preliminary === undefined\n ? {}\n : { preliminary: chunk.preliminary }),\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-error') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n error: chunk.errorText,\n phase: 'execution',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-denied') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n denied: true,\n phase: 'execution',\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-request') {\n flush(chunk.toolCallId)\n const payload: ApprovalRequestedPayload = {\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n toolCallId: chunk.toolCallId,\n ...(chunk.isAutomatic === undefined\n ? {}\n : { isAutomatic: chunk.isAutomatic }),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n result.push({\n type: 'ai.approval.requested',\n id: `${options.generationId}:approval:${chunk.approvalId}`,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-response') {\n result.push({\n type: 'ai.approval.responded',\n id: `${options.generationId}:approval:${chunk.approvalId}:automatic-response`,\n payload: {\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n },\n } as AppendInput<D>)\n }\n }\n return { events: result, pending }\n}\n\nfunction withoutGenerationLifecycle<D extends EventDefs>(\n history: ContractEvent<D>[],\n generationIds: ReadonlySet<string>,\n): ContractEvent<D>[] {\n if (generationIds.size === 0) return history\n const approvalKeys = new Set<string>()\n const inputKeys = new Set<string>()\n for (const event of history) {\n const payload = event.payload as {\n generationId?: unknown\n messageId?: unknown\n approvalId?: unknown\n inputId?: unknown\n }\n if (\n typeof payload.generationId !== 'string' ||\n !generationIds.has(payload.generationId) ||\n typeof payload.messageId !== 'string'\n ) {\n continue\n }\n if (\n event.type === 'ai.approval.requested' &&\n typeof payload.approvalId === 'string'\n ) {\n approvalKeys.add(`${payload.messageId}\\u001f${payload.approvalId}`)\n }\n if (\n event.type === 'ai.input.requested' &&\n typeof payload.inputId === 'string'\n ) {\n inputKeys.add(`${payload.messageId}\\u001f${payload.inputId}`)\n }\n }\n return history.filter((event) => {\n const payload = event.payload as {\n generationId?: unknown\n messageId?: unknown\n approvalId?: unknown\n inputId?: unknown\n }\n if (\n typeof payload.generationId === 'string' &&\n generationIds.has(payload.generationId)\n ) {\n return false\n }\n if (\n event.type === 'ai.approval.responded' &&\n typeof payload.messageId === 'string' &&\n typeof payload.approvalId === 'string'\n ) {\n return !approvalKeys.has(\n `${payload.messageId}\\u001f${payload.approvalId}`,\n )\n }\n if (\n event.type === 'ai.input.responded' &&\n typeof payload.messageId === 'string' &&\n typeof payload.inputId === 'string'\n ) {\n return !inputKeys.has(`${payload.messageId}\\u001f${payload.inputId}`)\n }\n return true\n })\n}\n\nconst validateCompaction = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n compaction: CompactionOptions<M, D>\n explicit: boolean\n generation: AgentGenerationSettings<T> | undefined\n tools: T | undefined\n}): CompactionOptions<M, D> => {\n let compaction = options.compaction\n if (\n compaction !== false &&\n (typeof compaction !== 'object' || compaction === null)\n ) {\n throw new TypeError('compaction must resolve to false or a policy object')\n }\n if (compaction !== false && 'then' in compaction) {\n void Promise.resolve(compaction).catch(() => {})\n throw new TypeError('compaction options must be a policy or a resolver')\n }\n if (compaction !== false && !('shouldCompact' in compaction)) {\n if (\n compaction.thresholdTokens !== undefined &&\n (!Number.isSafeInteger(compaction.thresholdTokens) ||\n compaction.thresholdTokens < 1)\n ) {\n throw new TypeError(\n 'compaction.thresholdTokens must be a positive safe integer',\n )\n }\n const choice = options.generation?.toolChoice\n const unsupported =\n options.generation?.output !== undefined\n ? 'structured output'\n : choice !== undefined && choice !== 'auto' && choice !== 'none'\n ? 'forced tool choice'\n : Object.values(options.tools ?? {}).some(\n (tool) =>\n tool.type === 'provider' && tool.isProviderExecuted === true,\n )\n ? 'provider-executed tools'\n : undefined\n if (unsupported !== undefined) {\n if (options.explicit) {\n throw new TypeError(\n `automatic compaction does not support ${unsupported}; use a custom policy or compaction: false`,\n )\n }\n compaction = false\n }\n }\n\n return compaction\n}\n\n/**\n * Build the ordinary A2 handler table for the built-in agent protocol.\n * Application handlers can be spread beside this table.\n */\nexport function createHandlers<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n>(\n options: CreateHandlersOptions<M, D, T>,\n): NonNullable<ServerOptions<D>['handlers']> {\n if (options.model === undefined) {\n throw new TypeError('createHandlers requires model')\n }\n if (\n options.progress?.maxChunks !== undefined &&\n (!Number.isInteger(options.progress.maxChunks) ||\n options.progress.maxChunks < 1)\n ) {\n throw new TypeError('progress.maxChunks must be a positive integer')\n }\n if (\n options.progress?.maxDelayMs !== undefined &&\n (!Number.isFinite(options.progress.maxDelayMs) ||\n options.progress.maxDelayMs < 0)\n ) {\n throw new TypeError('progress.maxDelayMs must be a non-negative number')\n }\n if (\n options.maxSteps !== undefined &&\n options.maxSteps !== Number.POSITIVE_INFINITY &&\n (!Number.isInteger(options.maxSteps) || options.maxSteps < 1)\n ) {\n throw new TypeError('maxSteps must be a positive integer or Infinity')\n }\n\n const configuredCompaction =\n options.compaction ?? (options.generate === undefined ? {} : false)\n const staticCompaction =\n typeof configuredCompaction === 'function'\n ? undefined\n : validateCompaction({\n compaction: configuredCompaction,\n explicit: options.compaction !== undefined,\n generation: options.generation,\n tools: options.tools,\n })\n\n const tools = options.tools ?? ({} as T)\n const generation: AgentGenerationSettings<T> = options.generation ?? {}\n const maxSteps = options.maxSteps ?? Number.POSITIVE_INFINITY\n const control = createControlRuntime({ agent: options.agent })\n const coordinator = control.coordinator\n const promptCache = new Map<string, Promise<ModelMessage[]>>()\n\n type RuntimeTool = {\n execute?: (\n input: unknown,\n options: {\n toolCallId: string\n messages: ModelMessage[]\n abortSignal?: AbortSignal\n },\n ) => unknown\n }\n\n type ToolHandlerContext = HandlerContext<D, 'ai.tool.execution.requested'>\n\n const resultEvent = (\n call: ToolCalledPayload,\n suffix: string,\n result: {\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n },\n ): AppendInput<D> =>\n ({\n type: 'ai.tool.result',\n id: `${call.generationId}:tool:${call.toolCallId}:${suffix}`,\n payload: {\n requestId: call.requestId,\n messageId: call.messageId,\n generationId: call.generationId,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n phase: 'execution',\n ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.denied === undefined ? {} : { denied: result.denied }),\n ...(result.preliminary === undefined\n ? {}\n : { preliminary: result.preliminary }),\n ...(call.dynamic === undefined ? {} : { dynamic: call.dynamic }),\n ...(call.providerExecuted === undefined\n ? {}\n : { providerExecuted: call.providerExecuted }),\n ...(call.toolMetadata === undefined\n ? {}\n : { toolMetadata: call.toolMetadata }),\n },\n }) as AppendInput<D>\n\n const promptMessages = (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<ModelMessage[]> => {\n const { ctx, call, generation: owner } = input\n const key = promptCacheKey(ctx.event.sessionId, call.generationId)\n const cached = promptCache.get(key)\n if (cached) return cached\n const computation = (async () => {\n const frontier = owner.promptThroughIndex\n if (frontier === undefined)\n throw new TypeError('AI work requires a prompt checkpoint')\n const [snapshot, atPrompt, tail] = await Promise.all([\n ctx.session.state(options.agent.reducer, { through: frontier }),\n ctx.session.state(coordinator, { through: frontier }),\n ctx.session.history({ gte: frontier + 1, lte: ctx.event.index }),\n ])\n const appended = tail.filter(\n (event) =>\n (event.type === 'ai.generation.started' ||\n event.type === 'ai.compaction.requested' ||\n event.type === 'ai.compaction.completed') &&\n (event.payload as { generationId: string }).generationId ===\n call.generationId,\n )\n const state = foldAIEvents({\n agent: options.agent,\n events: appended,\n state: snapshot.state,\n })\n return modelContext({\n messages: await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot,\n coordinator: atPrompt.state,\n appended,\n }),\n state,\n tools,\n })\n })()\n promptCache.set(key, computation)\n void computation.catch(() => {\n if (promptCache.get(key) === computation) promptCache.delete(key)\n })\n return computation\n }\n\n const toolExecutionFailure = (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n error: unknown,\n ): AppendInput<D> | void => {\n const schedulerFailure = consumeSchedulerSendFailure(error)\n if (checkAbort(ctx.signal)) return\n if (schedulerFailure === 'retryable') throw error\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: errorMessage(error),\n })\n }\n\n const runToolExecution = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n execute: NonNullable<RuntimeTool['execute']>,\n messages: ModelMessage[],\n ): Promise<AppendInput<D> | void> => {\n let output: unknown\n try {\n output = await execute(call.input, {\n toolCallId: call.toolCallId,\n messages,\n abortSignal: ctx.signal,\n })\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n let iterator: AsyncIterator<unknown> | undefined\n try {\n iterator = asyncIterator(output)\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (iterator === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:0`, { output })\n }\n let last: unknown\n let sequence = 0\n let done = false\n try {\n for (;;) {\n let result: IteratorResult<unknown>\n try {\n result = await iterator.next()\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (result.done) {\n if (ctx.signal.reason instanceof A2Error) throw ctx.signal.reason\n done = true\n break\n }\n if (checkAbort(ctx.signal)) return\n last = result.value\n await control.append({\n ctx,\n name: `tool:${call.toolCallId}:preliminary:${sequence}`,\n events: [\n resultEvent(\n call,\n `${ctx.event.id}:execution:${ctx.attempt}:${sequence}:preliminary`,\n {\n output: result.value,\n preliminary: true,\n },\n ),\n ],\n })\n sequence += 1\n }\n } finally {\n if (!done) {\n try {\n await iterator.return?.()\n } catch {\n // Preserve the failure or cancellation that ended execution.\n }\n }\n }\n return resultEvent(\n call,\n `${ctx.event.id}:execution:${sequence}:final`,\n sequence === 0 ? {} : { output: last },\n )\n }\n\n const executeTool = async (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<AppendInput<D> | void> => {\n const { ctx, call } = input\n const tool = tools[call.toolName] as RuntimeTool | undefined\n const execute = tool?.execute\n if (execute === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: `Tool '${call.toolName}' has no server executor`,\n })\n }\n const messages = await promptMessages(input)\n if (checkAbort(ctx.signal)) return\n const scope: AmbientToolScope = {\n contract: options.agent.contract,\n context: ctx,\n }\n // Async iteration resumes in the caller's context, so the whole\n // execution, not just the execute call, runs inside the scope.\n return toolScopeStorage.run(scope, () =>\n runToolExecution(ctx, call, execute, messages),\n )\n }\n\n const handleToolExecution = async (\n ctx: ToolHandlerContext,\n ): Promise<AppendInput<D>> => {\n try {\n const state = (\n await ctx.session.state(control.reducer, { through: 'latest' })\n ).state\n const request = ctx.event.payload\n const call = state.coordinator.response?.calls.find(\n (candidate) => candidate.work?.id === ctx.event.id,\n )\n if (\n state.active?.turnId !== request.turnId ||\n state.active.suspended ||\n state.active.version !== request.version ||\n state.coordinator.response?.failure !== undefined ||\n !call ||\n call.terminal ||\n call.work?.settled\n )\n return control.settled({ ctx, events: undefined })\n return control.settled({\n ctx,\n events: await executeTool({\n ctx,\n call: request.call,\n generation: request.generation,\n }),\n })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n }\n\n const generationHandler = async (\n ctx: HandlerContext<D, 'ai.generation.requested'>,\n ): Promise<void | AppendInput<D> | readonly AppendInput<D>[]> => {\n if (checkAbort(ctx.signal)) return\n const requestId = ctx.event.id\n const request = ctx.event.payload\n const snapshot = await ctx.session.state(options.agent.reducer, {\n through: 'latest',\n })\n if (\n snapshot.state.active?.phase === 'paused' ||\n snapshot.state.active?.phase === 'pausing'\n )\n return\n const coordinatorState = (\n await ctx.session.state(coordinator, { through: snapshot.index })\n ).state\n if (\n coordinatorState.closed ||\n coordinatorState.response?.activeRequestId !== requestId\n )\n return\n const response = coordinatorState.response\n const current =\n response.generation?.requestId === requestId\n ? response.generation\n : undefined\n if (\n current !== undefined &&\n (response.completion !== undefined ||\n (response.failure !== undefined &&\n response.failure.superseded !== true))\n )\n return\n if (current !== undefined && current.attempt >= ctx.attempt) return\n const attempt = ctx.attempt\n const generationId = `${requestId}:generation:${attempt}`\n const responseMessageId =\n request.responseMessageId ??\n (request.reason === 'message'\n ? `${request.messageId}:assistant`\n : request.messageId)\n const responseStepCount = response.stepCount\n if (\n request.reason === 'tool' &&\n (requestId !==\n `ai.generate:tools:${response.source?.generation.generationId}` ||\n response.responseMessageId !== request.messageId ||\n response.responseMessageId !== request.responseMessageId)\n )\n return\n const previous = current\n const replaced =\n previous === undefined\n ? []\n : [{ generation: previous, frontier: response.promptThroughIndex! }]\n if (request.reason === 'retry' && response.source?.failed) {\n replaced.push({\n generation: response.source.generation,\n frontier: response.source.promptThroughIndex,\n })\n }\n const replacedGenerationIds = new Set(\n replaced.map(({ generation: owner }) => owner.generationId),\n )\n let state = snapshot.state\n if (replaced.length > 0) {\n const through = Math.min(...replaced.map(({ frontier }) => frontier))\n const baseline = await ctx.session.state(options.agent.reducer, {\n through,\n })\n const tail = await ctx.session.history({\n gte: through + 1,\n lte: snapshot.index,\n })\n state = foldAIEvents({\n agent: options.agent,\n events: withoutGenerationLifecycle(tail, replacedGenerationIds),\n state: baseline.state,\n })\n }\n const resolverContext: AgentResolverContext<M, D> = {\n event: ctx.event,\n state,\n session: {\n state: (reducer, readOptions) =>\n ctx.session.state(reducer, {\n ...readOptions,\n through: readOptions?.through ?? snapshot.index,\n }),\n },\n signal: ctx.signal,\n }\n\n let generationStarted = false\n try {\n const resolvedModel = await resolve(options.model, resolverContext)\n if (resolvedModel === undefined) {\n throw new TypeError('the model resolver returned undefined')\n }\n if (checkAbort(ctx.signal)) return\n const resolvedInstructions =\n options.instructions === undefined\n ? undefined\n : await resolve(options.instructions, resolverContext)\n if (checkAbort(ctx.signal)) return\n const compaction =\n typeof configuredCompaction === 'function'\n ? validateCompaction({\n compaction: await resolve(configuredCompaction, resolverContext),\n explicit: true,\n generation: options.generation,\n tools: options.tools,\n })\n : staticCompaction!\n if (checkAbort(ctx.signal)) return\n\n if (request.reason === 'tool' && responseStepCount >= maxSteps) {\n const source = response.source?.generation\n if (source === undefined) return\n return {\n type: 'ai.generation.failed',\n id: `${requestId}:step-limit`,\n payload: {\n requestId: source.requestId,\n messageId: source.messageId,\n generationId: source.generationId,\n responseMessageId,\n error: `agent exceeded the ${maxSteps}-step limit`,\n stepLimit: true,\n },\n } as AppendInput<D>\n }\n\n const started: GenerationStartedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n attempt,\n model: modelName(resolvedModel),\n promptThroughIndex: snapshot.index,\n }\n const catalogModelId = gatewayModelId(resolvedModel)\n const gatewayOptions = options.generation?.providerOptions?.['gateway']\n const usesFallbackModels =\n Array.isArray(gatewayOptions?.['models']) &&\n gatewayOptions['models'].length > 0\n const discoversMetadata =\n compaction !== false &&\n !('shouldCompact' in compaction) &&\n compaction.thresholdTokens === undefined &&\n !usesFallbackModels &&\n catalogModelId !== undefined\n const startEvents: AppendInput<D>[] = []\n if (\n discoversMetadata &&\n !Object.hasOwn(state.modelMetadata, catalogModelId)\n ) {\n startEvents.push({\n type: 'ai.model.metadata.requested',\n id: `ai.model.metadata:${encodeURIComponent(options.agent.contract.name)}:${encodeURIComponent(ctx.event.sessionId)}:${encodeURIComponent(catalogModelId)}`,\n payload: { modelId: catalogModelId },\n } as AppendInput<D>)\n }\n if (previous) {\n const payload = previous\n const superseded: GenerationFailedPayload = {\n requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n responseMessageId: payload.responseMessageId,\n error: 'generation attempt was superseded after an incomplete run',\n superseded: true,\n }\n startEvents.push({\n type: 'ai.generation.failed',\n id: `${payload.generationId}:superseded`,\n payload: superseded,\n } as AppendInput<D>)\n }\n startEvents.push({\n type: 'ai.generation.started',\n id: generationId,\n payload: started,\n } as AppendInput<D>)\n const generationEvents = await control.append({\n ctx,\n name: 'generation-start',\n events: startEvents,\n })\n generationStarted = true\n\n if (checkAbort(ctx.signal)) return\n\n const promptCoordinatorState = coordinatorState\n const messages = await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot: { state, index: snapshot.index },\n coordinator: promptCoordinatorState,\n excluded: replacedGenerationIds,\n })\n let generationMessages = messages\n let modelMessages = await modelContext({ messages, state, tools })\n const baseContext: AgentGenerateContext<M, D, T> = {\n request: ctx.event,\n requestId,\n generationId,\n responseMessageId,\n messages,\n modelMessages,\n state,\n session: resolverContext.session,\n signal: ctx.signal,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation,\n }\n const policy = compaction\n const tracksInput =\n policy !== false &&\n !('shouldCompact' in policy) &&\n (policy.thresholdTokens !== undefined || discoversMetadata)\n const metadata =\n catalogModelId === undefined\n ? undefined\n : state.modelMetadata[catalogModelId]\n const limits =\n metadata?.status === 'resolved' && !usesFallbackModels\n ? metadata.limits\n : undefined\n let inputTokenEstimate: number | undefined\n let compacted = false\n const canCompact = response.source?.canCompact ?? true\n if (policy && canCompact) {\n const compactionContext = {\n ...resolverContext,\n messages,\n modelMessages,\n }\n let shouldCompact: boolean\n if ('shouldCompact' in policy) {\n shouldCompact = await policy.shouldCompact(compactionContext)\n } else if (tracksInput) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n const inputTokens = measuredInputTokens({\n estimate: inputTokenEstimate,\n model: modelName(resolvedModel),\n calibration: coordinatorState.calibration,\n })\n const threshold =\n policy.thresholdTokens ??\n (limits === undefined\n ? undefined\n : Math.floor(\n Math.min(\n limits.contextWindow * 0.75,\n limits.contextWindow - (generation.maxOutputTokens ?? 0),\n ),\n ))\n if (\n limits !== undefined &&\n threshold !== undefined &&\n threshold <= 0\n ) {\n throw new Error(\n `output allowance exhausts the ${limits.contextWindow}-token context window`,\n )\n }\n shouldCompact = threshold !== undefined && inputTokens >= threshold\n } else {\n shouldCompact = false\n }\n if (checkAbort(ctx.signal)) return\n if (shouldCompact) {\n const throughMessageId =\n state.messages.findLast(\n (message) =>\n !promptCoordinatorState.queued.some(\n (queued) => queued.messageId === message.id,\n ),\n )?.id ?? request.messageId\n const throughIndex = snapshot.index\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-requested',\n events: [\n {\n type: 'ai.compaction.requested',\n id: `${generationId}:compaction:requested`,\n payload: { generationId, throughMessageId, throughIndex },\n } as AppendInput<D>,\n ],\n })),\n )\n const result = !('shouldCompact' in policy)\n ? {\n messages: [] as M[],\n ...(await summarize({\n agentName: options.agent.contract.name,\n context: baseContext,\n instructions: policy.instructions,\n })),\n }\n : { messages: await policy.compact(compactionContext) }\n if (checkAbort(ctx.signal)) return\n const completed: CompactionCompletedPayload<M> = {\n generationId,\n throughMessageId,\n throughIndex,\n ...result,\n ...(promptCoordinatorState.queued.length === 0\n ? {}\n : {\n retainedMessageIds: promptCoordinatorState.queued.map(\n (item) => item.messageId,\n ),\n }),\n }\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-completed',\n events: [\n {\n type: 'ai.compaction.completed',\n id: `${generationId}:compaction:completed`,\n payload: completed,\n } as AppendInput<D>,\n ],\n })),\n )\n const queued = new Set(\n promptCoordinatorState.queued.map((item) => item.messageId),\n )\n generationMessages = result.messages.filter(\n (message) => !queued.has(message.id),\n )\n compacted = true\n }\n }\n\n const currentState = foldAIEvents({\n agent: options.agent,\n events: generationEvents,\n state: snapshot.state,\n })\n if (request.reason === 'retry' || previous !== undefined) {\n generationMessages = await contextMessages({\n agent: options.agent,\n session: ctx.session,\n snapshot,\n coordinator: promptCoordinatorState,\n appended: generationEvents,\n })\n }\n if (\n (policy && 'shouldCompact' in policy) ||\n generationMessages !== messages ||\n activeCompaction(currentState)?.summary !==\n activeCompaction(state)?.summary\n ) {\n modelMessages = await modelContext({\n messages: generationMessages,\n state: currentState,\n tools,\n })\n }\n promptCache.set(\n promptCacheKey(ctx.event.sessionId, generationId),\n Promise.resolve(modelMessages),\n )\n if (tracksInput && (inputTokenEstimate === undefined || compacted)) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n }\n\n let pendingToolCalls: PendingToolCall[] = []\n if (checkAbort(ctx.signal)) return\n const generateContext: AgentGenerateContext<M, D, T> = {\n request: ctx.event,\n requestId,\n generationId,\n responseMessageId,\n messages: generationMessages,\n modelMessages,\n state: currentState,\n session: resolverContext.session,\n signal: ctx.signal,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation: options.generation ?? {},\n }\n const custom = options.generate !== undefined\n const source =\n options.generate === undefined\n ? await generateWithAISDK({\n agentName: options.agent.contract.name,\n context: generateContext,\n messageMetadata: options.messageMetadata,\n })\n : { stream: await options.generate(generateContext) }\n const updates = consumeGeneration({\n source,\n ...(options.progress === undefined\n ? {}\n : { progress: options.progress }),\n })\n\n let sequence = 0\n let finish: AgentGenerationFinish | undefined\n for await (const update of updates) {\n ctx.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n const progress: GenerationProgressPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n sequence,\n chunks: update.chunks,\n }\n const lifecycle = lifecycleEvents<D, T>({\n requestId,\n messageId: responseMessageId,\n generationId,\n sequence,\n chunks: update.chunks,\n pending: pendingToolCalls,\n tools,\n generation,\n custom,\n })\n pendingToolCalls = lifecycle.pending\n await control.append({\n ctx,\n name: `generation-progress:${sequence}`,\n events: [\n {\n type: 'ai.generation.progress',\n id: `${generationId}:progress:${sequence}`,\n payload: progress,\n } as AppendInput<D>,\n ...lifecycle.events,\n ],\n })\n sequence += 1\n }\n\n if (!finish) throw new Error('agent generation finished without output')\n const completed: GenerationCompletedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n ...(inputTokenEstimate === undefined ? {} : { inputTokenEstimate }),\n ...(finish.finishReason === undefined\n ? {}\n : { finishReason: finish.finishReason }),\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n const completionEvent = {\n type: 'ai.generation.completed',\n id: `${generationId}:completed`,\n payload: completed,\n } as AppendInput<D>\n const unresolved = options.generate\n ? pendingToolCalls.filter(\n (pending) => pending.classification !== 'automatic',\n )\n : []\n if (unresolved.length > 0) {\n throw new Error(\n `generation ended with unresolved tool authorization for '${unresolved[0]!.call.toolName}'`,\n )\n }\n const pendingEvents = pendingToolCalls\n .filter(\n (pending) =>\n pending.classification === 'automatic' ||\n (options.generate === undefined &&\n pending.classification === 'unknown'),\n )\n .map((pending) => toolCalledEvent<D>(pending.call))\n if (finish.finishReason === 'tool-calls') {\n return [...pendingEvents, completionEvent]\n }\n return [\n ...pendingEvents,\n completionEvent,\n {\n type: 'ai.message.completed',\n id: `${generationId}:message:completed`,\n payload: {\n messageId: responseMessageId,\n } satisfies MessageCompletedPayload,\n } as AppendInput<D>,\n ]\n } catch (error) {\n if (error instanceof ControlCancelled) throw error\n if (error instanceof A2Error) {\n checkAbort(ctx.signal)\n throw error\n }\n if (checkAbort(ctx.signal)) return\n if (!generationStarted) throw error\n const failed: GenerationFailedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n error: errorMessage(error),\n }\n return {\n type: 'ai.generation.failed',\n id: `${generationId}:failed`,\n payload: failed,\n } as AppendInput<D>\n }\n }\n\n const clearPromptCache = (sessionId: string): void => {\n const prefix = `${sessionId}\\u001f`\n for (const key of promptCache.keys()) {\n if (key.startsWith(prefix)) promptCache.delete(key)\n }\n }\n\n return {\n 'ai.model.metadata.requested': {\n handler: async (ctx) => {\n const limits = await readModelLimits({\n modelId: ctx.event.payload.modelId,\n signal: ctx.signal,\n })\n ctx.signal.throwIfAborted()\n return {\n type: 'ai.model.metadata.resolved',\n id: `${ctx.event.id}:resolved`,\n payload: { modelId: ctx.event.payload.modelId, limits },\n } as AppendInput<D>\n },\n },\n 'ai.control.requested': { lane: 'a2.ai.control', handler: control.handler },\n 'ai.work.reported': { lane: 'a2.ai.control', handler: control.handler },\n 'ai.message.completed': {\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n },\n },\n 'ai.message.interrupted': {\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n },\n },\n 'ai.session.closed': {\n lane: 'a2.ai.control',\n handler: async (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n return control.handler(ctx)\n },\n },\n 'ai.generation.failed': {\n handler: (ctx) => {\n promptCache.delete(\n promptCacheKey(ctx.event.sessionId, ctx.event.payload.generationId),\n )\n return Promise.resolve()\n },\n },\n 'ai.generation.requested': {\n lane: 'a2.ai.model',\n abortOn: {\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.control?.turnId ||\n active?.version !== trigger.payload.control?.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: async (ctx) => {\n try {\n return control.settled({ ctx, events: await generationHandler(ctx) })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n },\n },\n 'ai.tool.execution.requested': {\n abortOn: {\n 'ai.generation.failed': (event, trigger) =>\n event.payload.generationId === trigger.payload.call.generationId,\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.turnId ||\n active?.version !== trigger.payload.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: handleToolExecution,\n },\n } as NonNullable<ServerOptions<D>['handlers']>\n}\n\n/** Assemble an A2 server with the built-in agent handlers and app extensions. */\nexport function createAgentServer<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n>(options: CreateAgentServerOptions<M, D, T>): A2Server<D> {\n const {\n agent: definition,\n model,\n tools,\n instructions,\n generation,\n maxSteps,\n messageMetadata,\n generate,\n compaction,\n progress,\n handlers,\n ...serverOptions\n } = options\n const builtIns = createHandlers({\n agent: definition,\n model,\n ...(tools === undefined ? {} : { tools }),\n ...(instructions === undefined ? {} : { instructions }),\n ...(generation === undefined ? {} : { generation }),\n ...(maxSteps === undefined ? {} : { maxSteps }),\n ...(messageMetadata === undefined ? {} : { messageMetadata }),\n ...(generate === undefined ? {} : { generate }),\n ...(compaction === undefined ? {} : { compaction }),\n ...(progress === undefined ? {} : { progress }),\n })\n const server = createServer({\n ...serverOptions,\n contract: definition.contract,\n handlers: { ...builtIns, ...handlers },\n })\n setServerFetchHooks(server, { validateIngress: validateAgentIngress })\n return server\n}\n\nexport type { Instructions, LanguageModel, ToolSet }\n"],"mappings":"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"}
|