experimental-a2 0.12.0 → 0.13.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 +13 -0
- package/dist/ai-server.d.ts +11 -3
- package/dist/ai-server.d.ts.map +1 -1
- package/dist/ai-server.js +476 -142
- package/dist/ai-server.js.map +1 -1
- package/dist/ai.d.ts +32 -1
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +39 -7
- package/dist/ai.js.map +1 -1
- package/docs/guides/06-ai-agents.mdx +100 -18
- package/docs/reference/01-api.mdx +41 -4
- package/examples/playground/app/agent/[agentId]/agent-client.tsx +31 -16
- package/examples/playground/app/agent/[agentId]/compaction/route.ts +14 -0
- package/examples/playground/app/agent/[agentId]/compaction-event.tsx +38 -0
- package/examples/playground/app/agent/[agentId]/compaction-panel.tsx +294 -0
- package/examples/playground/app/agent/compaction-settings.test.ts +128 -0
- package/examples/playground/app/agent/compaction-settings.ts +49 -0
- package/examples/playground/app/agent/compaction-timeline.test.ts +337 -0
- package/examples/playground/app/agent/compaction-timeline.ts +198 -0
- package/examples/playground/app/agent/model.ts +47 -1
- package/examples/playground/app/agent/server.ts +3 -2
- package/examples/playground/app/globals.css +154 -0
- package/examples/playground/package.json +1 -1
- package/package.json +1 -1
- package/src/ai-model-metadata.ts +108 -0
- package/src/ai-sdk-step.ts +5 -1
- package/src/ai-server.ts +712 -203
- package/src/ai.ts +99 -4
package/dist/ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","names":["isRecord","createContract"],"sources":["../src/ai-projector.ts","../src/ai.ts"],"sourcesContent":["import type { UIMessage, UIMessageChunk } from 'ai'\n\ntype MutablePart = Record<string, unknown>\n\ntype PartialToolCall = {\n text: string\n toolName: string\n dynamic: boolean\n providerExecuted?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst cloneMessage = <M extends UIMessage>(messageId: string, base?: M): M =>\n structuredClone(base ?? { id: messageId, role: 'assistant', parts: [] }) as M\n\nconst currentStepParts = (parts: MutablePart[]): MutablePart[] => {\n let start = parts.length - 1\n while (start >= 0 && parts[start]?.['type'] !== 'step-start') start -= 1\n return parts.slice(start + 1)\n}\n\nconst isToolPart = (part: MutablePart): boolean =>\n typeof part['toolCallId'] === 'string' &&\n (part['type'] === 'dynamic-tool' ||\n (typeof part['type'] === 'string' && part['type'].startsWith('tool-')))\n\nconst findToolPart = (\n parts: MutablePart[],\n toolCallId: string,\n): MutablePart | undefined => {\n const current = currentStepParts(parts).find(\n (part) => isToolPart(part) && part['toolCallId'] === toolCallId,\n )\n if (current) return current\n return parts.findLast(\n (part) => isToolPart(part) && part['toolCallId'] === toolCallId,\n )\n}\n\nconst findApprovalPart = (\n parts: MutablePart[],\n approvalId: string,\n): MutablePart | undefined =>\n parts.find((part) => {\n const approval = part['approval']\n return (\n isToolPart(part) && isRecord(approval) && approval['id'] === approvalId\n )\n })\n\nconst setOptional = (\n target: MutablePart,\n key: string,\n value: unknown,\n): void => {\n if (value !== undefined) target[key] = value\n}\n\nconst setToolPart = (options: {\n parts: MutablePart[]\n toolCallId: string\n toolName: string\n dynamic: boolean\n state: string\n input?: unknown\n rawInput?: unknown\n output?: unknown\n errorText?: string\n preliminary?: boolean | undefined\n providerExecuted?: boolean | undefined\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string | undefined\n}): MutablePart => {\n let part = findToolPart(options.parts, options.toolCallId)\n if (!part) {\n part = {\n type: options.dynamic ? 'dynamic-tool' : `tool-${options.toolName}`,\n ...(options.dynamic ? { toolName: options.toolName } : {}),\n toolCallId: options.toolCallId,\n }\n options.parts.push(part)\n }\n\n part['state'] = options.state\n part['input'] = options.input\n delete part['output']\n delete part['rawInput']\n delete part['errorText']\n delete part['preliminary']\n setOptional(part, 'rawInput', options.rawInput)\n setOptional(part, 'output', options.output)\n setOptional(part, 'errorText', options.errorText)\n setOptional(part, 'preliminary', options.preliminary)\n setOptional(part, 'providerExecuted', options.providerExecuted)\n setOptional(part, 'title', options.title)\n setOptional(part, 'toolMetadata', options.toolMetadata)\n if (options.dynamic) part['toolName'] = options.toolName\n if (options.providerMetadata !== undefined) {\n part[\n options.state === 'output-available' || options.state === 'output-error'\n ? 'resultProviderMetadata'\n : 'callProviderMetadata'\n ] = options.providerMetadata\n }\n return part\n}\n\nconst mergeMetadata = (current: unknown, update: unknown): unknown => {\n if (update === undefined || update === null) return current\n return isRecord(current) && isRecord(update)\n ? { ...current, ...update }\n : update\n}\n\nconst parseCompleteJSON = (value: string): unknown => {\n try {\n return JSON.parse(value) as unknown\n } catch {\n return undefined\n }\n}\n\n/** Internal synchronous counterpart of the AI SDK UI message stream fold. */\nexport function projectUIMessage<M extends UIMessage>(options: {\n messageId: string\n base?: M\n chunks: readonly UIMessageChunk[]\n}): M {\n const message = cloneMessage(options.messageId, options.base)\n const record = message as unknown as Record<string, unknown>\n const parts = message.parts as unknown as MutablePart[]\n const activeText = new Map<string, MutablePart>()\n const activeReasoning = new Map<string, MutablePart>()\n const partialTools = new Map<string, PartialToolCall>()\n\n for (const chunk of options.chunks) {\n switch (chunk.type) {\n case 'text-start': {\n const part: MutablePart = {\n type: 'text',\n text: '',\n state: 'streaming',\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n }\n activeText.set(chunk.id, part)\n parts.push(part)\n break\n }\n case 'text-delta': {\n let part = activeText.get(chunk.id)\n if (!part) {\n part = { type: 'text', text: '', state: 'streaming' }\n activeText.set(chunk.id, part)\n parts.push(part)\n }\n part['text'] =\n `${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n break\n }\n case 'text-end': {\n const part = activeText.get(chunk.id)\n if (part) {\n part['state'] = 'done'\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n activeText.delete(chunk.id)\n }\n break\n }\n case 'reasoning-start': {\n const part: MutablePart = {\n type: 'reasoning',\n text: '',\n state: 'streaming',\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n }\n activeReasoning.set(chunk.id, part)\n parts.push(part)\n break\n }\n case 'reasoning-delta': {\n let part = activeReasoning.get(chunk.id)\n if (!part) {\n part = { type: 'reasoning', text: '', state: 'streaming' }\n activeReasoning.set(chunk.id, part)\n parts.push(part)\n }\n part['text'] =\n `${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n break\n }\n case 'reasoning-end': {\n const part = activeReasoning.get(chunk.id)\n if (part) {\n part['state'] = 'done'\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n activeReasoning.delete(chunk.id)\n }\n break\n }\n case 'custom':\n parts.push({\n type: 'custom',\n kind: chunk.kind,\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'file':\n case 'reasoning-file':\n parts.push({\n type: chunk.type,\n mediaType: chunk.mediaType,\n url: chunk.url,\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'source-url':\n parts.push({\n type: chunk.type,\n sourceId: chunk.sourceId,\n url: chunk.url,\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'source-document':\n parts.push({\n type: chunk.type,\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n ...(chunk.filename === undefined ? {} : { filename: chunk.filename }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'tool-input-start': {\n partialTools.set(chunk.toolCallId, {\n text: '',\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\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 ...(chunk.title === undefined ? {} : { title: chunk.title }),\n })\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\n state: 'input-streaming',\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n break\n }\n case 'tool-input-delta': {\n const partial = partialTools.get(chunk.toolCallId)\n if (!partial) break\n partial.text += chunk.inputTextDelta\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: partial.toolName,\n dynamic: partial.dynamic,\n state: 'input-streaming',\n input: parseCompleteJSON(partial.text),\n providerExecuted: partial.providerExecuted,\n providerMetadata: partial.providerMetadata,\n toolMetadata: partial.toolMetadata,\n title: partial.title,\n })\n break\n }\n case 'tool-input-available':\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\n state: 'input-available',\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n partialTools.delete(chunk.toolCallId)\n break\n case 'tool-input-error': {\n const existing = findToolPart(parts, chunk.toolCallId)\n const dynamic = existing?.['type'] === 'dynamic-tool' || chunk.dynamic\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: dynamic === true,\n state: 'output-error',\n input: dynamic ? chunk.input : undefined,\n rawInput: dynamic ? undefined : chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n partialTools.delete(chunk.toolCallId)\n break\n }\n case 'tool-approval-request': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (!part) break\n part['state'] = 'approval-requested'\n part['approval'] = {\n id: chunk.approvalId,\n ...(chunk.isAutomatic === true ? { isAutomatic: true } : {}),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n break\n }\n case 'tool-approval-response': {\n const part = findApprovalPart(parts, chunk.approvalId)\n if (!part) break\n const approval = isRecord(part['approval']) ? part['approval'] : {}\n part['state'] = 'approval-responded'\n part['approval'] = {\n id: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n ...(approval['isAutomatic'] === true ? { isAutomatic: true } : {}),\n ...(typeof approval['signature'] === 'string'\n ? { signature: approval['signature'] }\n : {}),\n }\n setOptional(part, 'providerExecuted', chunk.providerExecuted)\n setOptional(part, 'callProviderMetadata', chunk.providerMetadata)\n break\n }\n case 'tool-output-available': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (!part) break\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName:\n part['type'] === 'dynamic-tool' &&\n typeof part['toolName'] === 'string'\n ? part['toolName']\n : String(part['type']).slice('tool-'.length),\n dynamic: part['type'] === 'dynamic-tool',\n state: 'output-available',\n input: part['input'],\n output: chunk.output,\n preliminary: chunk.preliminary,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata ?? part['toolMetadata'],\n title: typeof part['title'] === 'string' ? part['title'] : undefined,\n })\n break\n }\n case 'tool-output-error': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (!part) break\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName:\n part['type'] === 'dynamic-tool' &&\n typeof part['toolName'] === 'string'\n ? part['toolName']\n : String(part['type']).slice('tool-'.length),\n dynamic: part['type'] === 'dynamic-tool',\n state: 'output-error',\n input: part['input'],\n rawInput: part['rawInput'],\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata ?? part['toolMetadata'],\n title: typeof part['title'] === 'string' ? part['title'] : undefined,\n })\n break\n }\n case 'tool-output-denied': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (part) part['state'] = 'output-denied'\n break\n }\n case 'start-step':\n parts.push({ type: 'step-start' })\n break\n case 'finish-step':\n activeText.clear()\n activeReasoning.clear()\n break\n case 'start':\n if (chunk.messageId !== undefined) record['id'] = chunk.messageId\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'finish':\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'message-metadata':\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'abort':\n case 'error':\n break\n default: {\n if (!chunk.type.startsWith('data-') || chunk.transient) break\n const existing =\n chunk.id === undefined\n ? undefined\n : parts.find(\n (part) =>\n part['type'] === chunk.type && part['id'] === chunk.id,\n )\n if (existing) existing['data'] = chunk.data\n else\n parts.push({\n type: chunk.type,\n ...(chunk.id === undefined ? {} : { id: chunk.id }),\n data: chunk.data,\n })\n }\n }\n }\n\n return message\n}\n\nexport function interruptUIMessage<M extends UIMessage>(\n message: M,\n toolError = 'Tool execution was interrupted.',\n): M {\n const next = structuredClone(message)\n for (const value of next.parts as unknown as MutablePart[]) {\n if (value['type'] === 'text' || value['type'] === 'reasoning') {\n if (value['state'] === 'streaming') value['state'] = 'done'\n continue\n }\n if (!isToolPart(value)) continue\n const state = value['state']\n if (state === 'approval-responded') {\n const approval = value['approval']\n if (isRecord(approval) && approval['approved'] === false) {\n value['state'] = 'output-denied'\n continue\n }\n }\n if (state === 'output-available' && value['preliminary'] === true) {\n delete value['output']\n delete value['preliminary']\n value['state'] = 'output-error'\n value['errorText'] = toolError\n continue\n }\n if (\n state === 'input-streaming' ||\n state === 'input-available' ||\n state === 'approval-requested' ||\n state === 'approval-responded'\n ) {\n if (state === 'approval-requested') delete value['approval']\n value['state'] = 'output-error'\n value['errorText'] = toolError\n }\n }\n return next\n}\n","/**\n * experimental-a2/ai — an isomorphic, extensible agent definition.\n *\n * `agent()` assembles a normal A2 contract, a reducer over the built-in\n * AI protocol, and pure builders for the events applications append.\n * Model calls and tool implementations stay in experimental-a2/ai/server.\n */\n\nimport type {\n FinishReason,\n JSONValue,\n LanguageModelUsage,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport { contract as createContract } from './contract.ts'\nimport type { AppendInput, Contract, EventDefs } from './contract.ts'\nimport { interruptUIMessage, projectUIMessage } from './ai-projector.ts'\nimport { ambientToolScopeStorage } from './internal.ts'\nimport type { Reducer } from './reducer.ts'\nimport type { HandlerContext } from './server.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { assertSyncSchema, validateSync } from './validate.ts'\n\nexport type AgentStatus =\n 'idle' | 'generating' | 'waiting' | 'failed' | 'closed'\n\nexport type GenerationReason = 'message' | 'tool' | 'input' | 'retry'\n\nexport type SessionCreatedPayload = { metadata?: JSONValue }\nexport type SessionClosedPayload = { reason?: string }\nexport type MessageCreatedPayload<M extends UIMessage> = {\n message: M\n /** For user messages, false records passive context. Omission or true schedules. */\n generate?: boolean\n}\nexport type MessageCompletedPayload = { messageId: string }\ntype MessageInterruption = {\n messageId: string\n reason?: string\n /** Last confirmed event-log index visible to the interrupter. */\n lastSeenIndex?: number\n}\nexport type MessageInterruptedPayload = MessageInterruption &\n (\n | { generationId: string; requestId?: never }\n | { requestId: string; generationId?: never }\n )\nexport type GenerationRequestedPayload = {\n messageId: string\n reason: GenerationReason\n responseMessageId?: string\n}\nexport type RetryGenerationOptions = {\n messageId: string\n responseMessageId: string\n retryId: string\n}\nexport type RetryRequestedPayload = RetryGenerationOptions\nexport type GenerationStartedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n attempt: number\n model: string\n}\nexport type GenerationProgressPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n sequence: number\n chunks: UIMessageChunk[]\n}\nexport type GenerationCompletedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\nexport type GenerationFailedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n error: string\n /** True when a later attempt replaced an incomplete attempt. */\n superseded?: boolean\n stepLimit?: boolean\n}\nexport type ToolCalledPayload = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName: string\n input: unknown\n dynamic?: boolean\n providerExecuted?: boolean\n supportsDeferredResults?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string\n}\nexport type ToolResultPayload = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName?: string\n input?: unknown\n rawInput?: unknown\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n phase?: 'input' | 'execution'\n dynamic?: boolean\n providerExecuted?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n}\nexport type ApprovalRequestedPayload = {\n messageId: string\n generationId: string\n approvalId: string\n toolCallId: string\n isAutomatic?: boolean\n signature?: string\n}\nexport type ApprovalRespondedPayload = {\n messageId: string\n generationId: string\n approvalId: string\n approved: boolean\n reason?: string\n}\nexport type InputRequestedPayload = {\n messageId: string\n generationId: string\n inputId: string\n name: string\n question?: JSONValue\n}\nexport type InputRespondedPayload = {\n messageId: string\n generationId: string\n inputId: string\n name: string\n value: JSONValue\n}\nexport type CompactionRequestedPayload = {\n generationId: string\n throughMessageId: string\n}\nexport type CompactionCompletedPayload<M extends UIMessage> = {\n generationId: string\n throughMessageId: string\n messages: M[]\n retainedMessageIds?: string[]\n}\n\nexport type AIEventDefs<M extends UIMessage = UIMessage> = {\n 'ai.session.created': StandardSchemaV1<SessionCreatedPayload>\n 'ai.session.closed': StandardSchemaV1<SessionClosedPayload>\n 'ai.message.created': StandardSchemaV1<MessageCreatedPayload<M>>\n 'ai.message.completed': StandardSchemaV1<MessageCompletedPayload>\n 'ai.message.interrupted': StandardSchemaV1<MessageInterruptedPayload>\n 'ai.generation.requested': StandardSchemaV1<GenerationRequestedPayload>\n 'ai.retry.requested': StandardSchemaV1<RetryRequestedPayload>\n 'ai.generation.started': StandardSchemaV1<GenerationStartedPayload>\n 'ai.generation.progress': StandardSchemaV1<GenerationProgressPayload>\n 'ai.generation.completed': StandardSchemaV1<GenerationCompletedPayload>\n 'ai.generation.failed': StandardSchemaV1<GenerationFailedPayload>\n 'ai.tool.called': StandardSchemaV1<ToolCalledPayload>\n 'ai.tool.result': StandardSchemaV1<ToolResultPayload>\n 'ai.approval.requested': StandardSchemaV1<ApprovalRequestedPayload>\n 'ai.approval.responded': StandardSchemaV1<ApprovalRespondedPayload>\n 'ai.input.requested': StandardSchemaV1<InputRequestedPayload>\n 'ai.input.responded': StandardSchemaV1<InputRespondedPayload>\n 'ai.compaction.requested': StandardSchemaV1<CompactionRequestedPayload>\n 'ai.compaction.completed': StandardSchemaV1<CompactionCompletedPayload<M>>\n}\n\nexport type ActiveGeneration = GenerationStartedPayload\n\nexport type ActiveGenerationProjection<M extends UIMessage = UIMessage> = {\n generationId: string\n responseMessageId: string\n /** Log index of the completed model step while its response remains interruptible. */\n completionIndex?: number\n baseMessage?: M\n baseCompaction?: CompactionState<M> | null\n batches: Array<{ index: number; chunks: UIMessageChunk[] }>\n baseTools: ToolActivity[]\n toolEvents: Array<\n | { index: number; type: 'ai.tool.called'; payload: ToolCalledPayload }\n | { index: number; type: 'ai.tool.result'; payload: ToolResultPayload }\n >\n approvalEvents: Array<\n | {\n index: number\n type: 'ai.approval.requested'\n payload: ApprovalRequestedPayload\n }\n | {\n index: number\n type: 'ai.approval.responded'\n payload: ApprovalRespondedPayload\n }\n >\n}\n\nexport type PendingApproval = ApprovalRequestedPayload\nexport type PendingInput = InputRequestedPayload\n\nexport type ToolActivity = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName?: string\n input?: unknown\n rawInput?: unknown\n output?: unknown\n error?: string\n preliminary?: boolean\n phase?: 'input' | 'execution'\n dynamic?: boolean\n providerExecuted?: boolean\n callProviderMetadata?: unknown\n resultProviderMetadata?: unknown\n toolMetadata?: unknown\n title?: string\n status: 'running' | 'completed' | 'failed' | 'denied'\n}\n\nexport type CompactionState<M extends UIMessage> = {\n status: 'running' | 'completed'\n generationId: string\n throughMessageId: string\n messages?: M[]\n retainedMessageIds?: string[]\n}\n\nexport type GenerationUsage = {\n generationId: string\n usage: LanguageModelUsage\n}\n\nexport type AIState<M extends UIMessage = UIMessage> = {\n session: { created: boolean; metadata?: JSONValue }\n messages: M[]\n status: AgentStatus\n activeGeneration: ActiveGeneration | null\n activeRequestId: string | null\n activeResponseMessageId: string | null\n activeProjection: ActiveGenerationProjection<M> | null\n responseGenerationIds: Record<string, string>\n terminalRequestIds?: Record<string, true>\n terminalGenerations?: Record<\n string,\n 'completed' | 'failed' | 'interrupted' | 'superseded'\n >\n pendingApprovals: PendingApproval[]\n pendingInputs: PendingInput[]\n tools: ToolActivity[]\n compaction: CompactionState<M> | null\n usage: GenerationUsage[]\n error: string | null\n}\n\nexport type AgentDefinition<\n M extends UIMessage = UIMessage,\n D extends EventDefs = AIEventDefs<M>,\n> = {\n readonly contract: Contract<D>\n readonly reducer: Reducer<D, AIState<M>>\n}\n\nexport type AgentToolEventDefs = EventDefs &\n Pick<AIEventDefs, 'ai.tool.called' | 'ai.approval.responded'>\n\n/** The durable handler context supplied when A2 executes a local AI tool. */\nexport type AgentToolContext<D extends AgentToolEventDefs> =\n | HandlerContext<D, 'ai.tool.called'>\n | HandlerContext<D, 'ai.approval.responded'>\n\nexport type AgentOptions<M extends UIMessage, E extends EventDefs> = {\n name: string\n events?: E\n /** Optional stricter schema for custom UIMessage metadata/data/tool types. */\n messageSchema?: StandardSchemaV1<M>\n /** Snapshot identity. Bump when application-level projection semantics change. */\n reducerName?: string\n}\n\ntype AIMessageFrom<D extends EventDefs> =\n D extends Record<'ai.message.created', infer S extends StandardSchemaV1>\n ? StandardSchemaV1.InferOutput<S> extends MessageCreatedPayload<\n infer M extends UIMessage\n >\n ? M\n : UIMessage\n : UIMessage\n\ntype SchemaResult<T> = StandardSchemaV1.Result<T>\n\nconst issue = <T>(message: string): SchemaResult<T> => ({\n issues: [{ message }],\n})\n\nconst schema = <T>(\n label: string,\n parse: (value: unknown) => SchemaResult<T>,\n): StandardSchemaV1<T> => ({\n '~standard': {\n version: 1,\n vendor: 'a2',\n validate(value) {\n try {\n return parse(value)\n } catch (error) {\n return issue(\n `${label}: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n },\n})\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isJSONCompatible = (\n value: unknown,\n seen: Set<object> = new Set(),\n): boolean => {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean'\n ) {\n return true\n }\n if (typeof value === 'number') return Number.isFinite(value)\n if (typeof value === 'undefined') return true\n if (typeof value !== 'object') return false\n if (seen.has(value)) return false\n seen.add(value)\n const valid = Array.isArray(value)\n ? value.every((item) => isJSONCompatible(item, seen))\n : Object.getPrototypeOf(value) === Object.prototype &&\n Object.values(value).every((item) => isJSONCompatible(item, seen))\n seen.delete(value)\n return valid\n}\n\nconst jsonObject = <T extends object>(\n label: string,\n check: (value: Record<string, unknown>) => boolean,\n): StandardSchemaV1<T> =>\n schema(label, (value) => {\n if (!isRecord(value) || !isJSONCompatible(value) || !check(value)) {\n return issue(`invalid ${label}`)\n }\n return { value: value as T }\n })\n\nconst stringField = (value: Record<string, unknown>, key: string): boolean =>\n typeof value[key] === 'string' && value[key].length > 0\n\nconst optionalStringField = (\n value: Record<string, unknown>,\n key: string,\n): boolean => value[key] === undefined || typeof value[key] === 'string'\n\nconst messageValue = (value: unknown): value is UIMessage =>\n isRecord(value) &&\n typeof value['id'] === 'string' &&\n (value['role'] === 'user' ||\n value['role'] === 'assistant' ||\n value['role'] === 'system') &&\n Array.isArray(value['parts']) &&\n value['parts'].every(\n (part) => isRecord(part) && typeof part['type'] === 'string',\n ) &&\n isJSONCompatible(value)\n\nconst validateMessage = <M extends UIMessage>(\n value: unknown,\n messageSchema?: StandardSchemaV1<M>,\n): SchemaResult<M> => {\n if (!messageValue(value)) return issue('invalid AI SDK UIMessage')\n if (!messageSchema) return { value: value as M }\n return validateSync(messageSchema, value, 'the AI message')\n}\n\nconst messagePayloadSchema = <M extends UIMessage>(\n messageSchema?: StandardSchemaV1<M>,\n): StandardSchemaV1<MessageCreatedPayload<M>> =>\n schema('ai.message.created', (value) => {\n if (!isRecord(value)) return issue('invalid ai.message.created payload')\n const message = validateMessage(value['message'], messageSchema)\n if (message.issues) return { issues: message.issues }\n const generate = value['generate']\n if (generate !== undefined && typeof generate !== 'boolean') {\n return issue('invalid ai.message.created generate flag')\n }\n return {\n value: {\n message: message.value,\n ...(generate === false ? { generate: false } : {}),\n },\n }\n })\n\nconst progressPayloadSchema: StandardSchemaV1<GenerationProgressPayload> =\n schema('ai.generation.progress', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'requestId') ||\n !stringField(value, 'messageId') ||\n !stringField(value, 'generationId') ||\n !stringField(value, 'responseMessageId') ||\n typeof value['sequence'] !== 'number' ||\n !Number.isInteger(value['sequence']) ||\n value['sequence'] < 0 ||\n !Array.isArray(value['chunks']) ||\n !value['chunks'].every(\n (chunk) => isRecord(chunk) && typeof chunk['type'] === 'string',\n )\n ) {\n return issue('invalid ai.generation.progress payload')\n }\n return { value: value as GenerationProgressPayload }\n })\n\nconst completedPayloadSchema: StandardSchemaV1<GenerationCompletedPayload> =\n schema('ai.generation.completed', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'requestId') ||\n !stringField(value, 'messageId') ||\n !stringField(value, 'generationId') ||\n !stringField(value, 'responseMessageId') ||\n !optionalStringField(value, 'finishReason')\n ) {\n return issue('invalid ai.generation.completed payload')\n }\n return { value: value as GenerationCompletedPayload }\n })\n\nconst compactionPayloadSchema = <M extends UIMessage>(\n messageSchema?: StandardSchemaV1<M>,\n): StandardSchemaV1<CompactionCompletedPayload<M>> =>\n schema('ai.compaction.completed', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'generationId') ||\n !stringField(value, 'throughMessageId') ||\n !Array.isArray(value['messages']) ||\n (value['retainedMessageIds'] !== undefined &&\n (!Array.isArray(value['retainedMessageIds']) ||\n !value['retainedMessageIds'].every(\n (candidate) => typeof candidate === 'string',\n )))\n ) {\n return issue('invalid ai.compaction.completed payload')\n }\n const messages: M[] = []\n for (const candidate of value['messages']) {\n const result = validateMessage(candidate, messageSchema)\n if (result.issues) return { issues: result.issues }\n messages.push(result.value)\n }\n return {\n value: {\n generationId: value['generationId'] as string,\n throughMessageId: value['throughMessageId'] as string,\n messages,\n ...(value['retainedMessageIds'] === undefined\n ? {}\n : { retainedMessageIds: value['retainedMessageIds'] as string[] }),\n },\n }\n })\n\nexport function createEvents<M extends UIMessage = UIMessage>(options?: {\n messageSchema?: StandardSchemaV1<M>\n}): AIEventDefs<M> {\n const messageSchema = options?.messageSchema\n if (messageSchema) assertSyncSchema(messageSchema, 'the AI message schema')\n const definition: AIEventDefs<M> = {\n 'ai.session.created': jsonObject('ai.session.created', () => true),\n 'ai.session.closed': jsonObject('ai.session.closed', (value) =>\n optionalStringField(value, 'reason'),\n ),\n 'ai.message.created': messagePayloadSchema(messageSchema),\n 'ai.message.completed': jsonObject('ai.message.completed', (value) =>\n stringField(value, 'messageId'),\n ),\n 'ai.message.interrupted': jsonObject(\n 'ai.message.interrupted',\n (value) =>\n stringField(value, 'messageId') &&\n ((stringField(value, 'generationId') &&\n value['requestId'] === undefined) ||\n (stringField(value, 'requestId') &&\n value['generationId'] === undefined)) &&\n optionalStringField(value, 'reason') &&\n (value['lastSeenIndex'] === undefined ||\n (typeof value['lastSeenIndex'] === 'number' &&\n Number.isInteger(value['lastSeenIndex']) &&\n value['lastSeenIndex'] >= 0)),\n ),\n 'ai.generation.requested': jsonObject(\n 'ai.generation.requested',\n (value) =>\n stringField(value, 'messageId') &&\n optionalStringField(value, 'responseMessageId') &&\n (value['reason'] === 'message' ||\n value['reason'] === 'tool' ||\n value['reason'] === 'input' ||\n value['reason'] === 'retry'),\n ),\n 'ai.retry.requested': jsonObject(\n 'ai.retry.requested',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'responseMessageId') &&\n stringField(value, 'retryId'),\n ),\n 'ai.generation.started': jsonObject(\n 'ai.generation.started',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'responseMessageId') &&\n typeof value['attempt'] === 'number' &&\n Number.isInteger(value['attempt']) &&\n value['attempt'] > 0 &&\n stringField(value, 'model'),\n ),\n 'ai.generation.progress': progressPayloadSchema,\n 'ai.generation.completed': completedPayloadSchema,\n 'ai.generation.failed': jsonObject(\n 'ai.generation.failed',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'responseMessageId') &&\n stringField(value, 'error') &&\n (value['superseded'] === undefined ||\n typeof value['superseded'] === 'boolean') &&\n (value['stepLimit'] === undefined ||\n typeof value['stepLimit'] === 'boolean'),\n ),\n 'ai.tool.called': jsonObject(\n 'ai.tool.called',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'toolCallId') &&\n stringField(value, 'toolName') &&\n (value['dynamic'] === undefined ||\n typeof value['dynamic'] === 'boolean') &&\n (value['providerExecuted'] === undefined ||\n typeof value['providerExecuted'] === 'boolean') &&\n (value['supportsDeferredResults'] === undefined ||\n typeof value['supportsDeferredResults'] === 'boolean') &&\n optionalStringField(value, 'title'),\n ),\n 'ai.tool.result': jsonObject(\n 'ai.tool.result',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'toolCallId') &&\n optionalStringField(value, 'toolName') &&\n optionalStringField(value, 'error') &&\n (value['denied'] === undefined ||\n typeof value['denied'] === 'boolean') &&\n (value['preliminary'] === undefined ||\n typeof value['preliminary'] === 'boolean') &&\n (value['phase'] === undefined ||\n value['phase'] === 'input' ||\n value['phase'] === 'execution') &&\n (value['dynamic'] === undefined ||\n typeof value['dynamic'] === 'boolean') &&\n (value['providerExecuted'] === undefined ||\n typeof value['providerExecuted'] === 'boolean'),\n ),\n 'ai.approval.requested': jsonObject(\n 'ai.approval.requested',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'approvalId') &&\n stringField(value, 'toolCallId') &&\n (value['isAutomatic'] === undefined ||\n typeof value['isAutomatic'] === 'boolean') &&\n optionalStringField(value, 'signature'),\n ),\n 'ai.approval.responded': jsonObject(\n 'ai.approval.responded',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'approvalId') &&\n typeof value['approved'] === 'boolean' &&\n optionalStringField(value, 'reason'),\n ),\n 'ai.input.requested': jsonObject(\n 'ai.input.requested',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'inputId') &&\n stringField(value, 'name'),\n ),\n 'ai.input.responded': jsonObject(\n 'ai.input.responded',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'inputId') &&\n stringField(value, 'name'),\n ),\n 'ai.compaction.requested': jsonObject(\n 'ai.compaction.requested',\n (value) =>\n stringField(value, 'generationId') &&\n stringField(value, 'throughMessageId'),\n ),\n 'ai.compaction.completed': compactionPayloadSchema(messageSchema),\n }\n return definition\n}\n\nexport const events: AIEventDefs<UIMessage> = createEvents()\n\nconst initialState = <M extends UIMessage>(): AIState<M> => ({\n session: { created: false },\n messages: [],\n status: 'idle',\n activeGeneration: null,\n activeRequestId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n responseGenerationIds: {},\n pendingApprovals: [],\n pendingInputs: [],\n tools: [],\n compaction: null,\n usage: [],\n error: null,\n})\n\nconst upsertMessage = <M extends UIMessage>(messages: M[], message: M): M[] => {\n const index = messages.findIndex((candidate) => candidate.id === message.id)\n if (index === -1) return [...messages, message]\n const next = [...messages]\n next[index] = message\n return next\n}\n\nconst answerApproval = <M extends UIMessage>(\n messages: M[],\n response: ApprovalRespondedPayload,\n): M[] =>\n messages.map((message) => {\n if (message.id !== response.messageId) return message\n let changed = false\n const parts = message.parts.map((part) => {\n const candidate = part as unknown\n if (\n !isRecord(candidate) ||\n candidate['state'] !== 'approval-requested' ||\n !isRecord(candidate['approval']) ||\n candidate['approval']['id'] !== response.approvalId\n ) {\n return part\n }\n changed = true\n return {\n ...part,\n state: 'approval-responded',\n approval: {\n ...candidate['approval'],\n approved: response.approved,\n ...(response.reason === undefined ? {} : { reason: response.reason }),\n },\n } as typeof part\n })\n return changed ? ({ ...message, parts } as M) : message\n })\n\nconst projectMessageChunks = <M extends UIMessage>(\n messages: M[],\n messageId: string,\n chunks: UIMessageChunk[],\n): M[] =>\n messages.map((message) =>\n message.id === messageId\n ? projectUIMessage({ messageId, base: message, chunks })\n : message,\n )\n\nconst approvalRequestedChunk = (\n payload: ApprovalRequestedPayload,\n): UIMessageChunk => ({\n type: 'tool-approval-request',\n approvalId: payload.approvalId,\n toolCallId: payload.toolCallId,\n ...(payload.isAutomatic === undefined\n ? {}\n : { isAutomatic: payload.isAutomatic }),\n ...(payload.signature === undefined ? {} : { signature: payload.signature }),\n})\n\nconst approvalRespondedChunk = (\n payload: ApprovalRespondedPayload,\n): UIMessageChunk => ({\n type: 'tool-approval-response',\n approvalId: payload.approvalId,\n approved: payload.approved,\n ...(payload.reason === undefined ? {} : { reason: payload.reason }),\n})\n\nconst toolResultChunk = (payload: ToolResultPayload): UIMessageChunk => {\n if (payload.phase === 'input') {\n return {\n type: 'tool-input-error',\n toolCallId: payload.toolCallId,\n toolName: payload.toolName ?? 'unknown',\n input: payload.rawInput ?? payload.input,\n errorText: payload.error ?? 'Invalid tool input',\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n }\n if (payload.denied === true) {\n return {\n type: 'tool-output-denied',\n toolCallId: payload.toolCallId,\n } as UIMessageChunk\n }\n if (payload.error !== undefined) {\n return {\n type: 'tool-output-error',\n toolCallId: payload.toolCallId,\n errorText: payload.error,\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n }\n return {\n type: 'tool-output-available',\n toolCallId: payload.toolCallId,\n output: payload.output,\n ...(payload.preliminary === undefined\n ? {}\n : { preliminary: payload.preliminary }),\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n}\n\nconst waitingStatus = <M extends UIMessage>(state: AIState<M>): AgentStatus => {\n if (state.pendingApprovals.length > 0 || state.pendingInputs.length > 0) {\n return 'waiting'\n }\n return state.activeGeneration !== null ||\n state.tools.some((activity) => activity.status === 'running')\n ? 'generating'\n : 'idle'\n}\n\nconst lifecycleStatus = <M extends UIMessage>(\n previous: AIState<M>,\n next: AIState<M>,\n): AgentStatus =>\n previous.status === 'failed' ? 'failed' : waitingStatus(next)\n\nconst isStaleGeneration = <M extends UIMessage>(\n state: AIState<M>,\n messageId: string,\n generationId: string,\n): boolean => {\n const current = state.responseGenerationIds[messageId]\n return current !== undefined && current !== generationId\n}\n\nconst projectedMessage = <M extends UIMessage>(\n projection: ActiveGenerationProjection<M>,\n): M => {\n const projectionEvents: Array<{ index: number; chunks: UIMessageChunk[] }> = [\n ...projection.batches,\n ]\n for (const event of projection.toolEvents) {\n if (event.type === 'ai.tool.result') {\n projectionEvents.push({\n index: event.index,\n chunks: [toolResultChunk(event.payload)],\n })\n }\n }\n for (const event of projection.approvalEvents) {\n projectionEvents.push({\n index: event.index,\n chunks: [\n event.type === 'ai.approval.requested'\n ? approvalRequestedChunk(event.payload)\n : approvalRespondedChunk(event.payload),\n ],\n })\n }\n return projectUIMessage({\n messageId: projection.responseMessageId,\n ...(projection.baseMessage === undefined\n ? {}\n : { base: projection.baseMessage }),\n chunks: projectionEvents\n .toSorted((left, right) => left.index - right.index)\n .flatMap((event) => event.chunks),\n })\n}\n\nconst reduceToolActivity = (\n tools: ToolActivity[],\n event:\n | { type: 'ai.tool.called'; payload: ToolCalledPayload }\n | { type: 'ai.tool.result'; payload: ToolResultPayload },\n): ToolActivity[] => {\n if (event.type === 'ai.tool.called') {\n const payload = event.payload\n const { providerMetadata, ...called } = payload\n const activity: ToolActivity = {\n ...called,\n ...(providerMetadata === undefined\n ? {}\n : { callProviderMetadata: providerMetadata }),\n status: 'running',\n }\n return [\n ...tools.filter(\n (candidate) =>\n candidate.generationId !== payload.generationId ||\n candidate.toolCallId !== payload.toolCallId,\n ),\n activity,\n ]\n }\n\n const payload = event.payload\n const existing = tools.find(\n (candidate) =>\n candidate.generationId === payload.generationId &&\n candidate.toolCallId === payload.toolCallId,\n )\n const toolName = payload.toolName ?? existing?.toolName\n const input = payload.input === undefined ? existing?.input : payload.input\n const dynamic = payload.dynamic ?? existing?.dynamic\n const providerExecuted =\n payload.providerExecuted ?? existing?.providerExecuted\n const toolMetadata = payload.toolMetadata ?? existing?.toolMetadata\n const resultProviderMetadata =\n payload.providerMetadata ?? existing?.resultProviderMetadata\n const activity: ToolActivity = {\n requestId: payload.requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n toolCallId: payload.toolCallId,\n ...(toolName === undefined ? {} : { toolName }),\n ...(input === undefined ? {} : { input }),\n ...(payload.rawInput === undefined ? {} : { rawInput: payload.rawInput }),\n ...(payload.output === undefined ? {} : { output: payload.output }),\n ...(payload.error === undefined ? {} : { error: payload.error }),\n ...(payload.preliminary === undefined\n ? {}\n : { preliminary: payload.preliminary }),\n ...(payload.phase === undefined ? {} : { phase: payload.phase }),\n ...(dynamic === undefined ? {} : { dynamic }),\n ...(providerExecuted === undefined ? {} : { providerExecuted }),\n ...(existing?.callProviderMetadata === undefined\n ? {}\n : { callProviderMetadata: existing.callProviderMetadata }),\n ...(resultProviderMetadata === undefined ? {} : { resultProviderMetadata }),\n ...(toolMetadata === undefined ? {} : { toolMetadata }),\n ...(existing?.title === undefined ? {} : { title: existing.title }),\n status: payload.denied\n ? 'denied'\n : payload.error\n ? 'failed'\n : payload.preliminary\n ? 'running'\n : 'completed',\n }\n return [\n ...tools.filter(\n (candidate) =>\n candidate.generationId !== payload.generationId ||\n candidate.toolCallId !== payload.toolCallId,\n ),\n activity,\n ]\n}\n\nconst projectedTools = <M extends UIMessage>(\n projection: ActiveGenerationProjection<M>,\n): ToolActivity[] =>\n projection.toolEvents.reduce(\n (tools, event) => reduceToolActivity(tools, event),\n projection.baseTools,\n )\n\nconst restoreGenerationBase = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n responseMessageId: string,\n reason: 'interrupted' | 'superseded',\n): AIState<M> => {\n const projection =\n state.activeProjection?.generationId === generationId\n ? state.activeProjection\n : null\n return {\n ...state,\n messages:\n projection?.baseMessage === undefined\n ? state.messages.filter((message) => message.id !== responseMessageId)\n : upsertMessage(state.messages, projection.baseMessage),\n tools:\n projection === null\n ? state.tools.filter(\n (activity) => activity.generationId !== generationId,\n )\n : projection.baseTools,\n pendingApprovals: state.pendingApprovals.filter(\n (approval) => approval.generationId !== generationId,\n ),\n pendingInputs: state.pendingInputs.filter(\n (input) => input.generationId !== generationId,\n ),\n activeGeneration: null,\n activeProjection: null,\n terminalGenerations: {\n ...state.terminalGenerations,\n [generationId]: reason,\n },\n compaction:\n projection === null\n ? state.compaction?.generationId === generationId\n ? null\n : state.compaction\n : (projection.baseCompaction ?? null),\n }\n}\n\nconst stopGenerationTools = (\n tools: ToolActivity[],\n generationId: string | undefined,\n responseMessageId: string,\n error: string,\n): ToolActivity[] =>\n tools.map((activity) =>\n activity.status === 'running' &&\n (generationId === undefined\n ? activity.messageId === responseMessageId\n : activity.generationId === generationId)\n ? { ...activity, status: 'failed', error, preliminary: false }\n : activity,\n )\n\nconst interruptGenerationProjection = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n responseMessageId: string,\n cutoff: number,\n): AIState<M> | null => {\n const projection =\n state.activeProjection?.generationId === generationId\n ? state.activeProjection\n : null\n if (projection === null) return null\n const retained: ActiveGenerationProjection<M> = {\n ...projection,\n batches: projection.batches.filter((batch) => batch.index <= cutoff),\n toolEvents: projection.toolEvents.filter(\n (toolEvent) => toolEvent.index <= cutoff,\n ),\n approvalEvents: projection.approvalEvents.filter(\n (approvalEvent) => approvalEvent.index <= cutoff,\n ),\n }\n const shouldProject =\n retained.baseMessage !== undefined || retained.batches.length > 0\n const restored = restoreGenerationBase(\n state,\n generationId,\n responseMessageId,\n 'interrupted',\n )\n return {\n ...restored,\n messages: shouldProject\n ? upsertMessage(\n restored.messages,\n interruptUIMessage(projectedMessage(retained)),\n )\n : restored.messages,\n tools: stopGenerationTools(\n projectedTools(retained),\n generationId,\n responseMessageId,\n 'Tool execution was interrupted.',\n ),\n usage:\n projection.completionIndex === undefined ||\n projection.completionIndex <= cutoff\n ? restored.usage\n : restored.usage.filter((entry) => entry.generationId !== generationId),\n }\n}\n\nconst generationRequestId = (generationId: string): string | undefined => {\n const marker = ':generation:'\n const markerIndex = generationId.lastIndexOf(marker)\n return markerIndex === -1 ? undefined : generationId.slice(0, markerIndex)\n}\n\nconst terminalGenerationReason = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n): 'completed' | 'failed' | 'interrupted' | 'superseded' | undefined => {\n const terminal = state.terminalGenerations?.[generationId]\n if (terminal !== undefined) return terminal\n const requestId = generationRequestId(generationId)\n return requestId !== undefined &&\n state.terminalRequestIds?.[requestId] === true\n ? 'interrupted'\n : undefined\n}\n\n/** Pure projection of the built-in AI protocol. Unknown extension events are ignored. */\nexport function reduceAIState<M extends UIMessage>(\n state: AIState<M>,\n event: { type: string; payload: unknown; index: number; id?: string },\n): AIState<M> {\n if (state.status === 'closed') return state\n switch (event.type) {\n case 'ai.session.created': {\n const payload = event.payload as SessionCreatedPayload\n return {\n ...state,\n session: {\n created: true,\n ...(payload.metadata === undefined\n ? state.session.metadata === undefined\n ? {}\n : { metadata: state.session.metadata }\n : { metadata: payload.metadata }),\n },\n }\n }\n case 'ai.session.closed':\n return {\n ...state,\n status: 'closed',\n activeGeneration: null,\n activeRequestId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n }\n case 'ai.message.created': {\n const { message } = event.payload as MessageCreatedPayload<M>\n return { ...state, messages: upsertMessage(state.messages, message) }\n }\n case 'ai.message.completed': {\n const { messageId } = event.payload as MessageCompletedPayload\n const generationId = state.responseGenerationIds[messageId]\n if (\n generationId === undefined ||\n terminalGenerationReason(state, generationId) !== undefined\n ) {\n return state\n }\n const requestId = generationRequestId(generationId)\n return {\n ...state,\n activeRequestId: null,\n activeResponseMessageId: null,\n activeProjection:\n state.activeProjection?.generationId === generationId\n ? null\n : state.activeProjection,\n terminalGenerations: {\n ...state.terminalGenerations,\n [generationId]: 'completed',\n },\n ...(requestId === undefined\n ? {}\n : {\n terminalRequestIds: {\n ...state.terminalRequestIds,\n [requestId]: true,\n },\n }),\n }\n }\n case 'ai.generation.requested': {\n const payload = event.payload as GenerationRequestedPayload\n const schedulesToolContinuation = payload.reason === 'tool'\n const responseMessageId =\n payload.responseMessageId ??\n (payload.reason === 'message'\n ? `${payload.messageId}:assistant`\n : payload.messageId)\n const ownerGenerationId =\n state.responseGenerationIds[responseMessageId] ??\n state.activeGeneration?.generationId\n const ownerRequestId =\n ownerGenerationId === undefined\n ? undefined\n : generationRequestId(ownerGenerationId)\n const requestId = (event as { id?: string }).id\n if (\n requestId !== undefined &&\n state.terminalRequestIds?.[requestId] === true\n ) {\n return state\n }\n const acceptsRequest =\n payload.reason === 'message' ||\n (payload.reason === 'tool'\n ? ownerGenerationId !== undefined &&\n requestId === `ai.generate:tools:${ownerGenerationId}` &&\n state.activeRequestId === ownerRequestId &&\n state.status !== 'failed'\n : payload.reason === 'retry'\n ? state.status === 'failed'\n : ownerGenerationId !== undefined &&\n requestId?.startsWith(\n `ai.generate:input:${encodeURIComponent(responseMessageId)}:${encodeURIComponent(ownerGenerationId)}:`,\n ) === true &&\n state.activeRequestId === ownerRequestId &&\n state.status !== 'failed')\n if (!acceptsRequest) return state\n return {\n ...state,\n messages:\n payload.reason === 'retry' && payload.responseMessageId !== undefined\n ? state.messages.filter(\n (message) => message.id !== payload.responseMessageId,\n )\n : state.messages,\n activeProjection:\n payload.reason === 'retry' ? null : state.activeProjection,\n status: schedulesToolContinuation ? state.status : 'generating',\n activeRequestId: requestId ?? null,\n activeResponseMessageId: responseMessageId,\n error: schedulesToolContinuation ? state.error : null,\n }\n }\n case 'ai.generation.started': {\n const payload = event.payload as GenerationStartedPayload\n if (\n state.terminalRequestIds?.[payload.requestId] === true ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n if (\n state.activeRequestId !== null &&\n state.activeRequestId !== payload.requestId\n ) {\n return state\n }\n const currentOwner =\n state.responseGenerationIds[payload.responseMessageId]\n const currentTerminal =\n currentOwner === undefined\n ? undefined\n : terminalGenerationReason(state, currentOwner)\n if (\n currentTerminal === 'completed' ||\n currentTerminal === 'interrupted'\n ) {\n return state\n }\n const marker = ':generation:'\n const currentAttempt = currentOwner?.startsWith(\n `${payload.requestId}${marker}`,\n )\n ? Number(currentOwner.slice(`${payload.requestId}${marker}`.length))\n : undefined\n if (\n currentAttempt !== undefined &&\n Number.isFinite(currentAttempt) &&\n currentAttempt >= payload.attempt\n ) {\n return state\n }\n const activeGeneration = state.activeGeneration\n const replacesActiveAttempt =\n activeGeneration !== null &&\n activeGeneration.requestId === payload.requestId &&\n activeGeneration.responseMessageId === payload.responseMessageId &&\n activeGeneration.attempt < payload.attempt &&\n state.activeProjection?.generationId === activeGeneration.generationId\n const baseState = replacesActiveAttempt\n ? restoreGenerationBase(\n state,\n activeGeneration.generationId,\n activeGeneration.responseMessageId,\n 'superseded',\n )\n : state\n const baseMessage = baseState.messages.find(\n (message) => message.id === payload.responseMessageId,\n )\n return {\n ...baseState,\n status: 'generating',\n activeGeneration: payload,\n activeResponseMessageId: null,\n responseGenerationIds: {\n ...baseState.responseGenerationIds,\n [payload.responseMessageId]: payload.generationId,\n },\n activeProjection: {\n generationId: payload.generationId,\n responseMessageId: payload.responseMessageId,\n ...(baseMessage === undefined ? {} : { baseMessage }),\n baseCompaction: baseState.compaction,\n batches: [],\n baseTools: baseState.tools,\n toolEvents: [],\n approvalEvents: [],\n },\n error: null,\n }\n }\n case 'ai.generation.progress': {\n const payload = event.payload as GenerationProgressPayload\n if (terminalGenerationReason(state, payload.generationId) !== undefined) {\n return state\n }\n const activeProjection = state.activeProjection\n if (\n state.activeGeneration?.generationId !== payload.generationId ||\n activeProjection?.generationId !== payload.generationId\n ) {\n return state\n }\n const projection: ActiveGenerationProjection<M> = {\n ...activeProjection,\n batches: [\n ...activeProjection.batches.filter(\n (batch) => batch.index !== event.index,\n ),\n { index: event.index, chunks: payload.chunks },\n ].toSorted((left, right) => left.index - right.index),\n }\n return {\n ...state,\n messages: upsertMessage(state.messages, projectedMessage(projection)),\n activeProjection: projection,\n status: 'generating',\n }\n }\n case 'ai.generation.completed': {\n const payload = event.payload as GenerationCompletedPayload\n if (terminalGenerationReason(state, payload.generationId) !== undefined) {\n return state\n }\n if (state.activeGeneration?.generationId !== payload.generationId) {\n return state\n }\n const usage = payload.usage\n ? [\n ...state.usage.filter(\n (entry) => entry.generationId !== payload.generationId,\n ),\n { generationId: payload.generationId, usage: payload.usage },\n ]\n : state.usage\n const next = {\n ...state,\n activeGeneration: null,\n activeProjection:\n state.activeProjection?.generationId === payload.generationId\n ? { ...state.activeProjection, completionIndex: event.index }\n : state.activeProjection,\n usage,\n }\n return { ...next, status: waitingStatus(next) }\n }\n case 'ai.generation.failed': {\n const payload = event.payload as GenerationFailedPayload\n if (terminalGenerationReason(state, payload.generationId) !== undefined) {\n return state\n }\n if (\n state.activeGeneration?.generationId !== payload.generationId &&\n !(\n payload.stepLimit === true &&\n state.responseGenerationIds[payload.responseMessageId] ===\n payload.generationId &&\n state.activeRequestId ===\n `ai.generate:tools:${payload.generationId}` &&\n state.activeResponseMessageId === payload.responseMessageId\n )\n ) {\n return state\n }\n if (payload.superseded === true) {\n return restoreGenerationBase(\n state,\n payload.generationId,\n payload.responseMessageId,\n 'superseded',\n )\n }\n const projection =\n state.activeProjection?.generationId === payload.generationId\n ? state.activeProjection\n : null\n const shouldProject =\n projection !== null &&\n (projection.baseMessage !== undefined || projection.batches.length > 0)\n return {\n ...state,\n messages: shouldProject\n ? upsertMessage(\n state.messages,\n interruptUIMessage(\n projectedMessage(projection),\n `Generation failed before tool completion: ${payload.error}`,\n ),\n )\n : state.messages,\n status: 'failed',\n activeGeneration: null,\n activeResponseMessageId: null,\n activeProjection: projection,\n terminalGenerations: {\n ...state.terminalGenerations,\n [payload.generationId]: 'failed',\n },\n terminalRequestIds: {\n ...state.terminalRequestIds,\n [payload.requestId]: true,\n ...(state.activeRequestId === null\n ? {}\n : { [state.activeRequestId]: true as const }),\n },\n compaction:\n projection?.generationId === payload.generationId\n ? (projection.baseCompaction ?? null)\n : state.compaction?.generationId === payload.generationId\n ? null\n : state.compaction,\n pendingApprovals: state.pendingApprovals.filter(\n (approval) => approval.generationId !== payload.generationId,\n ),\n pendingInputs: state.pendingInputs.filter(\n (input) => input.generationId !== payload.generationId,\n ),\n tools: stopGenerationTools(\n state.tools,\n payload.generationId,\n payload.responseMessageId,\n payload.error,\n ),\n error: payload.error,\n }\n }\n case 'ai.message.interrupted': {\n const payload = event.payload as MessageInterruptedPayload\n const currentGenerationId = state.responseGenerationIds[payload.messageId]\n const targetRequestId =\n payload.requestId ?? generationRequestId(payload.generationId)\n const ownsRequestPhase =\n payload.requestId !== undefined &&\n state.activeGeneration === null &&\n state.activeRequestId === payload.requestId &&\n state.activeResponseMessageId === payload.messageId\n if (\n currentGenerationId !== undefined &&\n !ownsRequestPhase &&\n (payload.generationId !== undefined\n ? currentGenerationId !== payload.generationId\n : generationRequestId(currentGenerationId) !== payload.requestId)\n ) {\n return state\n }\n if (\n state.activeGeneration === null &&\n state.activeRequestId !== null &&\n state.activeResponseMessageId === payload.messageId &&\n targetRequestId !== state.activeRequestId\n ) {\n return state\n }\n const currentTerminal =\n currentGenerationId === undefined\n ? undefined\n : terminalGenerationReason(state, currentGenerationId)\n if (\n currentTerminal === 'completed' ||\n currentTerminal === 'interrupted' ||\n currentTerminal === 'superseded'\n ) {\n return state\n }\n const active = state.activeGeneration\n if (active === null) {\n if (\n payload.requestId !== undefined &&\n state.activeRequestId !== null &&\n state.activeRequestId === payload.requestId &&\n state.activeResponseMessageId === payload.messageId\n ) {\n const projectedState =\n currentGenerationId === undefined\n ? null\n : interruptGenerationProjection(\n state,\n currentGenerationId,\n payload.messageId,\n payload.lastSeenIndex ?? Number.POSITIVE_INFINITY,\n )\n const baseState = projectedState ?? state\n return {\n ...baseState,\n status: 'idle',\n activeRequestId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [payload.requestId]: true,\n },\n ...(currentGenerationId === undefined\n ? {}\n : {\n terminalGenerations: {\n ...baseState.terminalGenerations,\n [currentGenerationId]: 'interrupted' as const,\n },\n }),\n error: null,\n }\n }\n const targetGenerationId =\n payload.generationId ??\n (currentGenerationId !== undefined &&\n generationRequestId(currentGenerationId) === payload.requestId\n ? currentGenerationId\n : undefined)\n if (targetGenerationId === undefined) return state\n if (currentGenerationId !== targetGenerationId) return state\n const matchesGeneration = (generationId: string): boolean =>\n targetGenerationId === generationId\n const hasMessageWork =\n state.pendingApprovals.some(\n (approval) =>\n approval.messageId === payload.messageId &&\n matchesGeneration(approval.generationId),\n ) ||\n state.pendingInputs.some(\n (input) =>\n input.messageId === payload.messageId &&\n matchesGeneration(input.generationId),\n ) ||\n state.tools.some(\n (activity) =>\n activity.messageId === payload.messageId &&\n activity.status === 'running' &&\n matchesGeneration(activity.generationId),\n )\n const resolvesFailedGeneration =\n state.status === 'failed' &&\n currentGenerationId === targetGenerationId &&\n (state.activeRequestId === null ||\n state.activeRequestId === targetRequestId ||\n state.activeRequestId === `ai.generate:tools:${targetGenerationId}`)\n const resolvesCurrentGeneration =\n currentGenerationId === targetGenerationId &&\n currentTerminal === undefined\n if (\n !hasMessageWork &&\n !resolvesFailedGeneration &&\n !resolvesCurrentGeneration\n ) {\n return state\n }\n const pendingRequestId = state.activeRequestId\n const projectedState = interruptGenerationProjection(\n state,\n targetGenerationId,\n payload.messageId,\n payload.lastSeenIndex ?? Number.POSITIVE_INFINITY,\n )\n const baseState = projectedState ?? state\n const next = {\n ...baseState,\n activeRequestId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n messages:\n projectedState === null\n ? state.messages.map((message) =>\n message.id === payload.messageId\n ? interruptUIMessage(message)\n : message,\n )\n : baseState.messages,\n pendingApprovals: baseState.pendingApprovals.filter(\n (approval) =>\n approval.messageId !== payload.messageId ||\n !matchesGeneration(approval.generationId),\n ),\n pendingInputs: baseState.pendingInputs.filter(\n (input) =>\n input.messageId !== payload.messageId ||\n !matchesGeneration(input.generationId),\n ),\n tools:\n projectedState === null\n ? stopGenerationTools(\n state.tools,\n targetGenerationId,\n payload.messageId,\n 'Tool execution was interrupted.',\n )\n : baseState.tools,\n terminalGenerations: {\n ...baseState.terminalGenerations,\n [targetGenerationId]: 'interrupted' as const,\n },\n ...(pendingRequestId === null\n ? {}\n : {\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [pendingRequestId]: true as const,\n },\n }),\n error: resolvesFailedGeneration ? null : state.error,\n }\n return {\n ...next,\n status: waitingStatus(next),\n }\n }\n if (\n payload.messageId !== active.responseMessageId ||\n (payload.generationId !== active.generationId &&\n payload.requestId !== active.requestId)\n ) {\n return state\n }\n const cutoff = payload.lastSeenIndex ?? Number.POSITIVE_INFINITY\n const projectedState = interruptGenerationProjection(\n state,\n active.generationId,\n active.responseMessageId,\n cutoff,\n )\n const baseState =\n projectedState ??\n restoreGenerationBase(\n state,\n active.generationId,\n active.responseMessageId,\n 'interrupted',\n )\n const next = {\n ...baseState,\n activeRequestId: null,\n activeResponseMessageId: null,\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [active.requestId]: true as const,\n },\n tools:\n projectedState === null\n ? stopGenerationTools(\n baseState.tools,\n active.generationId,\n active.responseMessageId,\n 'Tool execution was interrupted.',\n )\n : baseState.tools,\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.tool.called': {\n const payload = event.payload as ToolCalledPayload\n const projection = state.activeProjection\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId,\n )\n ) {\n return state\n }\n if (projection?.generationId !== payload.generationId) {\n const next = {\n ...state,\n tools: reduceToolActivity(state.tools, {\n type: 'ai.tool.called',\n payload,\n }),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n const activeProjection: ActiveGenerationProjection<M> = {\n ...projection,\n toolEvents: [\n ...projection.toolEvents,\n { index: event.index, type: 'ai.tool.called', payload },\n ],\n }\n const next = {\n ...state,\n activeProjection,\n tools: projectedTools(activeProjection),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.tool.result': {\n const payload = event.payload as ToolResultPayload\n const projection = state.activeProjection\n const terminalReason = terminalGenerationReason(\n state,\n payload.generationId,\n )\n const completesFailedTool =\n terminalReason === 'failed' &&\n state.status === 'failed' &&\n payload.preliminary !== true &&\n projection?.generationId === payload.generationId &&\n projectedTools(projection).some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'running',\n )\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n (terminalReason !== undefined && !completesFailedTool)\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId &&\n !completesFailedTool,\n )\n ) {\n return state\n }\n if (projection?.generationId !== payload.generationId) {\n const next = {\n ...state,\n messages: projectMessageChunks(state.messages, payload.messageId, [\n toolResultChunk(payload),\n ]),\n tools: reduceToolActivity(state.tools, {\n type: 'ai.tool.result',\n payload,\n }),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n const activeProjection: ActiveGenerationProjection<M> = {\n ...projection,\n toolEvents: [\n ...projection.toolEvents,\n { index: event.index, type: 'ai.tool.result', payload },\n ],\n }\n const projected = projectedMessage(activeProjection)\n const tools = projectedTools(activeProjection)\n const failureError = state.error ?? 'Generation failed.'\n const next = {\n ...state,\n messages: upsertMessage(\n state.messages,\n terminalReason === 'failed'\n ? interruptUIMessage(\n projected,\n `Generation failed before tool completion: ${failureError}`,\n )\n : projected,\n ),\n activeProjection,\n tools:\n terminalReason === 'failed'\n ? stopGenerationTools(\n tools,\n payload.generationId,\n payload.messageId,\n failureError,\n )\n : tools,\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.approval.requested': {\n const payload = event.payload as ApprovalRequestedPayload\n const projection = state.activeProjection\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId,\n )\n ) {\n return state\n }\n const activeProjection =\n projection?.generationId === payload.generationId\n ? {\n ...projection,\n approvalEvents: [\n ...projection.approvalEvents,\n {\n index: event.index,\n type: 'ai.approval.requested' as const,\n payload,\n },\n ],\n }\n : projection\n const next = {\n ...state,\n messages:\n activeProjection === null || activeProjection === projection\n ? projectMessageChunks(state.messages, payload.messageId, [\n approvalRequestedChunk(payload),\n ])\n : upsertMessage(state.messages, projectedMessage(activeProjection)),\n activeProjection,\n pendingApprovals:\n payload.isAutomatic === true\n ? state.pendingApprovals\n : [\n ...state.pendingApprovals.filter(\n (approval) =>\n approval.approvalId !== payload.approvalId ||\n approval.messageId !== payload.messageId,\n ),\n payload,\n ],\n }\n return {\n ...next,\n status: lifecycleStatus(state, next),\n }\n }\n case 'ai.approval.responded': {\n const payload = event.payload as ApprovalRespondedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n const projection = state.activeProjection\n const pendingRequest = state.pendingApprovals.find(\n (candidate) =>\n candidate.approvalId === payload.approvalId &&\n candidate.messageId === payload.messageId &&\n candidate.generationId === payload.generationId,\n )\n const activeRequest = projection?.approvalEvents.findLast(\n (candidate) =>\n candidate.type === 'ai.approval.requested' &&\n candidate.payload.approvalId === payload.approvalId &&\n candidate.payload.messageId === payload.messageId &&\n candidate.payload.generationId === payload.generationId,\n )\n if (\n state.status === 'failed' &&\n pendingRequest === undefined &&\n activeRequest === undefined\n ) {\n return state\n }\n const activeProjection =\n projection !== null && activeRequest !== undefined\n ? {\n ...projection,\n approvalEvents: [\n ...projection.approvalEvents,\n {\n index: event.index,\n type: 'ai.approval.responded' as const,\n payload,\n },\n ],\n }\n : projection\n const next = {\n ...state,\n messages:\n activeProjection === null || activeProjection === projection\n ? answerApproval(state.messages, payload)\n : upsertMessage(state.messages, projectedMessage(activeProjection)),\n activeProjection,\n pendingApprovals: state.pendingApprovals.filter(\n (approval) =>\n approval.approvalId !== payload.approvalId ||\n approval.messageId !== payload.messageId ||\n approval.generationId !== payload.generationId,\n ),\n }\n return {\n ...next,\n status: lifecycleStatus(state, next),\n }\n }\n case 'ai.input.requested': {\n const payload = event.payload as InputRequestedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n const next = {\n ...state,\n pendingInputs: [\n ...state.pendingInputs.filter(\n (input) =>\n input.messageId !== payload.messageId ||\n input.generationId !== payload.generationId ||\n input.inputId !== payload.inputId,\n ),\n payload,\n ],\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.input.responded': {\n const payload = event.payload as InputRespondedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n const next = {\n ...state,\n pendingInputs: state.pendingInputs.filter(\n (input) =>\n input.inputId !== payload.inputId ||\n input.messageId !== payload.messageId ||\n input.generationId !== payload.generationId,\n ),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.compaction.requested': {\n const payload = event.payload as CompactionRequestedPayload\n if (state.activeGeneration?.generationId !== payload.generationId) {\n return state\n }\n return {\n ...state,\n compaction: { status: 'running', ...payload },\n }\n }\n case 'ai.compaction.completed': {\n const payload = event.payload as CompactionCompletedPayload<M>\n if (\n state.activeGeneration?.generationId !== payload.generationId ||\n state.compaction?.status !== 'running' ||\n state.compaction.generationId !== payload.generationId\n ) {\n return state\n }\n return {\n ...state,\n compaction: { status: 'completed', ...payload },\n }\n }\n default:\n return state\n }\n}\n\n/** Derive AI SDK UI messages directly from an A2 event history. */\nexport function deriveUIMessages<M extends UIMessage = UIMessage>(\n history: readonly { type: string; payload: unknown; index: number }[],\n): M[] {\n let state = initialState<M>()\n for (const event of history) state = reduceAIState(state, event)\n return state.messages\n}\n\n/** Build the standard AI state projection for any contract containing the protocol. */\nexport function createReducer<D extends EventDefs>(options: {\n contract: Contract<D>\n name?: string\n}): Reducer<D, AIState<AIMessageFrom<D>>> {\n type M = AIMessageFrom<D>\n return options.contract\n .reducer({\n name: options.name ?? 'a2.ai.state.v8',\n initialState: initialState<M>(),\n })\n .fold((state, event) => reduceAIState(state, event))\n}\n\ntype ProtocolInput<\n M extends UIMessage,\n K extends keyof AIEventDefs<M> & string,\n> = AppendInput<Pick<AIEventDefs<M>, K>>\n\nexport type AIInputs = {\n /** Record a message. User messages schedule unless generate is false. */\n message<M extends UIMessage>(\n message: M,\n options?: { generate?: boolean },\n ): ProtocolInput<M, 'ai.message.created'>[]\n /** Record a message without requesting a generation. */\n seed<M extends UIMessage>(\n message: M,\n ): ProtocolInput<M, 'ai.message.created'>[]\n /** Answer an AI SDK tool approval. The tool barrier owns continuation. */\n approval(\n response: ApprovalRespondedPayload,\n ): ProtocolInput<UIMessage, 'ai.approval.responded'>[]\n /** Answer an application-defined input request. */\n input(\n response: InputRespondedPayload,\n ): ProtocolInput<UIMessage, 'ai.input.responded'>[]\n /** Record an application-defined request for input. */\n requestInput(\n request: InputRequestedPayload,\n ): ProtocolInput<UIMessage, 'ai.input.requested'>[]\n /** Request a fresh attempt for a failed response. */\n retry(\n options: RetryGenerationOptions,\n ): ProtocolInput<UIMessage, 'ai.retry.requested'>[]\n /** Interrupt the active response for a message. */\n interrupt(\n interruption: MessageInterruptedPayload,\n ): ProtocolInput<UIMessage, 'ai.message.interrupted'>[]\n}\n\nconst messageInput = <M extends UIMessage>(\n message: M,\n generate?: boolean,\n): ProtocolInput<M, 'ai.message.created'>[] => [\n {\n type: 'ai.message.created',\n id: `ai.message:${message.id}`,\n payload: {\n message,\n ...(generate === false ? { generate: false } : {}),\n },\n },\n]\n\n/** Pure append inputs for the built-in AI protocol. */\nexport const inputs: AIInputs = {\n message<M extends UIMessage>(message: M, options?: { generate?: boolean }) {\n return messageInput(message, options?.generate)\n },\n seed<M extends UIMessage>(message: M) {\n return messageInput(message, false)\n },\n approval(response) {\n return [\n {\n type: 'ai.approval.responded',\n id: `ai.approval:${encodeURIComponent(response.messageId)}:${encodeURIComponent(response.generationId)}:${encodeURIComponent(response.approvalId)}:response`,\n payload: response,\n },\n ]\n },\n input(response) {\n return [\n {\n type: 'ai.input.responded',\n id: `ai.input:${encodeURIComponent(response.messageId)}:${encodeURIComponent(response.generationId)}:${encodeURIComponent(response.inputId)}:response`,\n payload: response,\n },\n ]\n },\n requestInput(request) {\n return [\n {\n type: 'ai.input.requested',\n id: `ai.input:${encodeURIComponent(request.messageId)}:${encodeURIComponent(request.generationId)}:${encodeURIComponent(request.inputId)}:request`,\n payload: request,\n },\n ]\n },\n retry(retryOptions) {\n return [\n {\n type: 'ai.retry.requested',\n id: `ai.retry:${retryOptions.retryId}`,\n payload: retryOptions,\n },\n ]\n },\n interrupt(interruption) {\n return [\n {\n type: 'ai.message.interrupted',\n id: `ai.interrupt:${interruption.generationId ?? interruption.requestId}`,\n payload: interruption,\n },\n ]\n },\n}\n\n/**\n * Read the durable handler context ambient to the current AI tool\n * execution. A2 runs each local tool's `execute` inside this scope, so\n * plain AI SDK `tool()` definitions reach their `event`, `attempt`,\n * `session`, and `signal` without an A2-specific wrapper. The agent (or\n * contract) argument carries the event types and is verified against\n * the executing server's contract.\n */\nexport function handlerContext<D extends AgentToolEventDefs>(\n agentOrContract: Contract<D> | { readonly contract: Contract<D> },\n): AgentToolContext<D> {\n const contract =\n 'contract' in agentOrContract ? agentOrContract.contract : agentOrContract\n const scope = ambientToolScopeStorage()?.getStore()\n if (scope === undefined) {\n throw new TypeError(\n `handlerContext('${contract.name}') requires an ambient A2 tool execution: call it inside a local tool's execute, or wrap direct tool tests with runWithHandlerContext`,\n )\n }\n if (scope.contract !== undefined && scope.contract.name !== contract.name) {\n throw new TypeError(\n `handlerContext('${contract.name}') was called during a tool execution for agent '${scope.contract.name}'`,\n )\n }\n return scope.context as AgentToolContext<D>\n}\n\n/**\n * Define an agent: built-in AI protocol + application events and one state\n * reducer. The result is isomorphic.\n */\nexport function agent<\n M extends UIMessage = UIMessage,\n E extends EventDefs = Record<never, never>,\n>(options: AgentOptions<M, E>): AgentDefinition<M, AIEventDefs<M> & E> {\n const builtIns = createEvents(\n options.messageSchema === undefined\n ? undefined\n : { messageSchema: options.messageSchema },\n )\n const extensions = options.events ?? ({} as E)\n for (const key of Object.keys(extensions)) {\n if (Object.hasOwn(builtIns, key)) {\n throw new TypeError(\n `agent event '${key}' conflicts with a built-in event`,\n )\n }\n }\n const agentContract = createContract({\n name: options.name,\n events: { ...builtIns, ...extensions },\n })\n const reducer = agentContract\n .reducer({\n name: options.reducerName ?? 'a2.ai.state.v8',\n initialState: initialState<M>(),\n })\n .fold((state, event) => reduceAIState(state, event))\n\n const definition = {\n contract: agentContract,\n reducer,\n }\n return definition as unknown as AgentDefinition<M, AIEventDefs<M> & E>\n}\n\nexport type {\n FinishReason,\n JSONValue,\n LanguageModelUsage,\n UIMessage,\n UIMessageChunk,\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai.js","names":["isRecord","createContract"],"sources":["../src/ai-projector.ts","../src/ai.ts"],"sourcesContent":["import type { UIMessage, UIMessageChunk } from 'ai'\n\ntype MutablePart = Record<string, unknown>\n\ntype PartialToolCall = {\n text: string\n toolName: string\n dynamic: boolean\n providerExecuted?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst cloneMessage = <M extends UIMessage>(messageId: string, base?: M): M =>\n structuredClone(base ?? { id: messageId, role: 'assistant', parts: [] }) as M\n\nconst currentStepParts = (parts: MutablePart[]): MutablePart[] => {\n let start = parts.length - 1\n while (start >= 0 && parts[start]?.['type'] !== 'step-start') start -= 1\n return parts.slice(start + 1)\n}\n\nconst isToolPart = (part: MutablePart): boolean =>\n typeof part['toolCallId'] === 'string' &&\n (part['type'] === 'dynamic-tool' ||\n (typeof part['type'] === 'string' && part['type'].startsWith('tool-')))\n\nconst findToolPart = (\n parts: MutablePart[],\n toolCallId: string,\n): MutablePart | undefined => {\n const current = currentStepParts(parts).find(\n (part) => isToolPart(part) && part['toolCallId'] === toolCallId,\n )\n if (current) return current\n return parts.findLast(\n (part) => isToolPart(part) && part['toolCallId'] === toolCallId,\n )\n}\n\nconst findApprovalPart = (\n parts: MutablePart[],\n approvalId: string,\n): MutablePart | undefined =>\n parts.find((part) => {\n const approval = part['approval']\n return (\n isToolPart(part) && isRecord(approval) && approval['id'] === approvalId\n )\n })\n\nconst setOptional = (\n target: MutablePart,\n key: string,\n value: unknown,\n): void => {\n if (value !== undefined) target[key] = value\n}\n\nconst setToolPart = (options: {\n parts: MutablePart[]\n toolCallId: string\n toolName: string\n dynamic: boolean\n state: string\n input?: unknown\n rawInput?: unknown\n output?: unknown\n errorText?: string\n preliminary?: boolean | undefined\n providerExecuted?: boolean | undefined\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string | undefined\n}): MutablePart => {\n let part = findToolPart(options.parts, options.toolCallId)\n if (!part) {\n part = {\n type: options.dynamic ? 'dynamic-tool' : `tool-${options.toolName}`,\n ...(options.dynamic ? { toolName: options.toolName } : {}),\n toolCallId: options.toolCallId,\n }\n options.parts.push(part)\n }\n\n part['state'] = options.state\n part['input'] = options.input\n delete part['output']\n delete part['rawInput']\n delete part['errorText']\n delete part['preliminary']\n setOptional(part, 'rawInput', options.rawInput)\n setOptional(part, 'output', options.output)\n setOptional(part, 'errorText', options.errorText)\n setOptional(part, 'preliminary', options.preliminary)\n setOptional(part, 'providerExecuted', options.providerExecuted)\n setOptional(part, 'title', options.title)\n setOptional(part, 'toolMetadata', options.toolMetadata)\n if (options.dynamic) part['toolName'] = options.toolName\n if (options.providerMetadata !== undefined) {\n part[\n options.state === 'output-available' || options.state === 'output-error'\n ? 'resultProviderMetadata'\n : 'callProviderMetadata'\n ] = options.providerMetadata\n }\n return part\n}\n\nconst mergeMetadata = (current: unknown, update: unknown): unknown => {\n if (update === undefined || update === null) return current\n return isRecord(current) && isRecord(update)\n ? { ...current, ...update }\n : update\n}\n\nconst parseCompleteJSON = (value: string): unknown => {\n try {\n return JSON.parse(value) as unknown\n } catch {\n return undefined\n }\n}\n\n/** Internal synchronous counterpart of the AI SDK UI message stream fold. */\nexport function projectUIMessage<M extends UIMessage>(options: {\n messageId: string\n base?: M\n chunks: readonly UIMessageChunk[]\n}): M {\n const message = cloneMessage(options.messageId, options.base)\n const record = message as unknown as Record<string, unknown>\n const parts = message.parts as unknown as MutablePart[]\n const activeText = new Map<string, MutablePart>()\n const activeReasoning = new Map<string, MutablePart>()\n const partialTools = new Map<string, PartialToolCall>()\n\n for (const chunk of options.chunks) {\n switch (chunk.type) {\n case 'text-start': {\n const part: MutablePart = {\n type: 'text',\n text: '',\n state: 'streaming',\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n }\n activeText.set(chunk.id, part)\n parts.push(part)\n break\n }\n case 'text-delta': {\n let part = activeText.get(chunk.id)\n if (!part) {\n part = { type: 'text', text: '', state: 'streaming' }\n activeText.set(chunk.id, part)\n parts.push(part)\n }\n part['text'] =\n `${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n break\n }\n case 'text-end': {\n const part = activeText.get(chunk.id)\n if (part) {\n part['state'] = 'done'\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n activeText.delete(chunk.id)\n }\n break\n }\n case 'reasoning-start': {\n const part: MutablePart = {\n type: 'reasoning',\n text: '',\n state: 'streaming',\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n }\n activeReasoning.set(chunk.id, part)\n parts.push(part)\n break\n }\n case 'reasoning-delta': {\n let part = activeReasoning.get(chunk.id)\n if (!part) {\n part = { type: 'reasoning', text: '', state: 'streaming' }\n activeReasoning.set(chunk.id, part)\n parts.push(part)\n }\n part['text'] =\n `${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n break\n }\n case 'reasoning-end': {\n const part = activeReasoning.get(chunk.id)\n if (part) {\n part['state'] = 'done'\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n activeReasoning.delete(chunk.id)\n }\n break\n }\n case 'custom':\n parts.push({\n type: 'custom',\n kind: chunk.kind,\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'file':\n case 'reasoning-file':\n parts.push({\n type: chunk.type,\n mediaType: chunk.mediaType,\n url: chunk.url,\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'source-url':\n parts.push({\n type: chunk.type,\n sourceId: chunk.sourceId,\n url: chunk.url,\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'source-document':\n parts.push({\n type: chunk.type,\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n ...(chunk.filename === undefined ? {} : { filename: chunk.filename }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'tool-input-start': {\n partialTools.set(chunk.toolCallId, {\n text: '',\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\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 ...(chunk.title === undefined ? {} : { title: chunk.title }),\n })\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\n state: 'input-streaming',\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n break\n }\n case 'tool-input-delta': {\n const partial = partialTools.get(chunk.toolCallId)\n if (!partial) break\n partial.text += chunk.inputTextDelta\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: partial.toolName,\n dynamic: partial.dynamic,\n state: 'input-streaming',\n input: parseCompleteJSON(partial.text),\n providerExecuted: partial.providerExecuted,\n providerMetadata: partial.providerMetadata,\n toolMetadata: partial.toolMetadata,\n title: partial.title,\n })\n break\n }\n case 'tool-input-available':\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\n state: 'input-available',\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n partialTools.delete(chunk.toolCallId)\n break\n case 'tool-input-error': {\n const existing = findToolPart(parts, chunk.toolCallId)\n const dynamic = existing?.['type'] === 'dynamic-tool' || chunk.dynamic\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: dynamic === true,\n state: 'output-error',\n input: dynamic ? chunk.input : undefined,\n rawInput: dynamic ? undefined : chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n partialTools.delete(chunk.toolCallId)\n break\n }\n case 'tool-approval-request': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (!part) break\n part['state'] = 'approval-requested'\n part['approval'] = {\n id: chunk.approvalId,\n ...(chunk.isAutomatic === true ? { isAutomatic: true } : {}),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n break\n }\n case 'tool-approval-response': {\n const part = findApprovalPart(parts, chunk.approvalId)\n if (!part) break\n const approval = isRecord(part['approval']) ? part['approval'] : {}\n part['state'] = 'approval-responded'\n part['approval'] = {\n id: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n ...(approval['isAutomatic'] === true ? { isAutomatic: true } : {}),\n ...(typeof approval['signature'] === 'string'\n ? { signature: approval['signature'] }\n : {}),\n }\n setOptional(part, 'providerExecuted', chunk.providerExecuted)\n setOptional(part, 'callProviderMetadata', chunk.providerMetadata)\n break\n }\n case 'tool-output-available': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (!part) break\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName:\n part['type'] === 'dynamic-tool' &&\n typeof part['toolName'] === 'string'\n ? part['toolName']\n : String(part['type']).slice('tool-'.length),\n dynamic: part['type'] === 'dynamic-tool',\n state: 'output-available',\n input: part['input'],\n output: chunk.output,\n preliminary: chunk.preliminary,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata ?? part['toolMetadata'],\n title: typeof part['title'] === 'string' ? part['title'] : undefined,\n })\n break\n }\n case 'tool-output-error': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (!part) break\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName:\n part['type'] === 'dynamic-tool' &&\n typeof part['toolName'] === 'string'\n ? part['toolName']\n : String(part['type']).slice('tool-'.length),\n dynamic: part['type'] === 'dynamic-tool',\n state: 'output-error',\n input: part['input'],\n rawInput: part['rawInput'],\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata ?? part['toolMetadata'],\n title: typeof part['title'] === 'string' ? part['title'] : undefined,\n })\n break\n }\n case 'tool-output-denied': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (part) part['state'] = 'output-denied'\n break\n }\n case 'start-step':\n parts.push({ type: 'step-start' })\n break\n case 'finish-step':\n activeText.clear()\n activeReasoning.clear()\n break\n case 'start':\n if (chunk.messageId !== undefined) record['id'] = chunk.messageId\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'finish':\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'message-metadata':\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'abort':\n case 'error':\n break\n default: {\n if (!chunk.type.startsWith('data-') || chunk.transient) break\n const existing =\n chunk.id === undefined\n ? undefined\n : parts.find(\n (part) =>\n part['type'] === chunk.type && part['id'] === chunk.id,\n )\n if (existing) existing['data'] = chunk.data\n else\n parts.push({\n type: chunk.type,\n ...(chunk.id === undefined ? {} : { id: chunk.id }),\n data: chunk.data,\n })\n }\n }\n }\n\n return message\n}\n\nexport function interruptUIMessage<M extends UIMessage>(\n message: M,\n toolError = 'Tool execution was interrupted.',\n): M {\n const next = structuredClone(message)\n for (const value of next.parts as unknown as MutablePart[]) {\n if (value['type'] === 'text' || value['type'] === 'reasoning') {\n if (value['state'] === 'streaming') value['state'] = 'done'\n continue\n }\n if (!isToolPart(value)) continue\n const state = value['state']\n if (state === 'approval-responded') {\n const approval = value['approval']\n if (isRecord(approval) && approval['approved'] === false) {\n value['state'] = 'output-denied'\n continue\n }\n }\n if (state === 'output-available' && value['preliminary'] === true) {\n delete value['output']\n delete value['preliminary']\n value['state'] = 'output-error'\n value['errorText'] = toolError\n continue\n }\n if (\n state === 'input-streaming' ||\n state === 'input-available' ||\n state === 'approval-requested' ||\n state === 'approval-responded'\n ) {\n if (state === 'approval-requested') delete value['approval']\n value['state'] = 'output-error'\n value['errorText'] = toolError\n }\n }\n return next\n}\n","/**\n * experimental-a2/ai — an isomorphic, extensible agent definition.\n *\n * `agent()` assembles a normal A2 contract, a reducer over the built-in\n * AI protocol, and pure builders for the events applications append.\n * Model calls and tool implementations stay in experimental-a2/ai/server.\n */\n\nimport type {\n FinishReason,\n JSONValue,\n LanguageModelUsage,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport { contract as createContract } from './contract.ts'\nimport type { AppendInput, Contract, EventDefs } from './contract.ts'\nimport { interruptUIMessage, projectUIMessage } from './ai-projector.ts'\nimport { ambientToolScopeStorage } from './internal.ts'\nimport type { Reducer } from './reducer.ts'\nimport type { HandlerContext } from './server.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { assertSyncSchema, validateSync } from './validate.ts'\n\nexport type AgentStatus =\n 'idle' | 'generating' | 'waiting' | 'failed' | 'closed'\n\nexport type GenerationReason = 'message' | 'tool' | 'input' | 'retry'\n\nexport type SessionCreatedPayload = { metadata?: JSONValue }\nexport type SessionClosedPayload = { reason?: string }\nexport type MessageCreatedPayload<M extends UIMessage> = {\n message: M\n /** For user messages, false records passive context. Omission or true schedules. */\n generate?: boolean\n}\nexport type MessageCompletedPayload = { messageId: string }\ntype MessageInterruption = {\n messageId: string\n reason?: string\n /** Last confirmed event-log index visible to the interrupter. */\n lastSeenIndex?: number\n}\nexport type MessageInterruptedPayload = MessageInterruption &\n (\n | { generationId: string; requestId?: never }\n | { requestId: string; generationId?: never }\n )\nexport type GenerationRequestedPayload = {\n messageId: string\n reason: GenerationReason\n responseMessageId?: string\n}\nexport type RetryGenerationOptions = {\n messageId: string\n responseMessageId: string\n retryId: string\n}\nexport type RetryRequestedPayload = RetryGenerationOptions\nexport type GenerationStartedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n attempt: number\n model: string\n promptThroughIndex?: number\n}\nexport type GenerationProgressPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n sequence: number\n chunks: UIMessageChunk[]\n}\nexport type GenerationCompletedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n inputTokenEstimate?: number\n}\nexport type GenerationFailedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n error: string\n /** True when a later attempt replaced an incomplete attempt. */\n superseded?: boolean\n stepLimit?: boolean\n}\nexport type ToolCalledPayload = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName: string\n input: unknown\n dynamic?: boolean\n providerExecuted?: boolean\n supportsDeferredResults?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string\n}\nexport type ToolResultPayload = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName?: string\n input?: unknown\n rawInput?: unknown\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n phase?: 'input' | 'execution'\n dynamic?: boolean\n providerExecuted?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n}\nexport type ApprovalRequestedPayload = {\n messageId: string\n generationId: string\n approvalId: string\n toolCallId: string\n isAutomatic?: boolean\n signature?: string\n}\nexport type ApprovalRespondedPayload = {\n messageId: string\n generationId: string\n approvalId: string\n approved: boolean\n reason?: string\n}\nexport type InputRequestedPayload = {\n messageId: string\n generationId: string\n inputId: string\n name: string\n question?: JSONValue\n}\nexport type InputRespondedPayload = {\n messageId: string\n generationId: string\n inputId: string\n name: string\n value: JSONValue\n}\nexport type ModelLimits = {\n contextWindow: number\n maxOutputTokens: number\n}\nexport type ModelMetadataRequestedPayload = { modelId: string }\nexport type ModelMetadataResolvedPayload = {\n modelId: string\n limits: ModelLimits | null\n}\nexport type ModelMetadataState =\n | { status: 'pending' }\n | { status: 'resolved'; limits: ModelLimits }\n | { status: 'unavailable' }\n\nexport type CompactionRequestedPayload = {\n generationId: string\n throughMessageId: string\n throughIndex?: number\n}\nexport type CompactionCompletedPayload<M extends UIMessage> = {\n generationId: string\n throughMessageId: string\n throughIndex?: number\n messages: M[]\n retainedMessageIds?: string[]\n summary?: string\n usage?: LanguageModelUsage\n}\n\nexport type AIEventDefs<M extends UIMessage = UIMessage> = {\n 'ai.session.created': StandardSchemaV1<SessionCreatedPayload>\n 'ai.session.closed': StandardSchemaV1<SessionClosedPayload>\n 'ai.message.created': StandardSchemaV1<MessageCreatedPayload<M>>\n 'ai.message.completed': StandardSchemaV1<MessageCompletedPayload>\n 'ai.message.interrupted': StandardSchemaV1<MessageInterruptedPayload>\n 'ai.generation.requested': StandardSchemaV1<GenerationRequestedPayload>\n 'ai.retry.requested': StandardSchemaV1<RetryRequestedPayload>\n 'ai.generation.started': StandardSchemaV1<GenerationStartedPayload>\n 'ai.generation.progress': StandardSchemaV1<GenerationProgressPayload>\n 'ai.generation.completed': StandardSchemaV1<GenerationCompletedPayload>\n 'ai.generation.failed': StandardSchemaV1<GenerationFailedPayload>\n 'ai.tool.called': StandardSchemaV1<ToolCalledPayload>\n 'ai.tool.result': StandardSchemaV1<ToolResultPayload>\n 'ai.approval.requested': StandardSchemaV1<ApprovalRequestedPayload>\n 'ai.approval.responded': StandardSchemaV1<ApprovalRespondedPayload>\n 'ai.input.requested': StandardSchemaV1<InputRequestedPayload>\n 'ai.input.responded': StandardSchemaV1<InputRespondedPayload>\n 'ai.compaction.requested': StandardSchemaV1<CompactionRequestedPayload>\n 'ai.compaction.completed': StandardSchemaV1<CompactionCompletedPayload<M>>\n 'ai.model.metadata.requested': StandardSchemaV1<ModelMetadataRequestedPayload>\n 'ai.model.metadata.resolved': StandardSchemaV1<ModelMetadataResolvedPayload>\n}\n\nexport type ActiveGeneration = GenerationStartedPayload\n\nexport type ActiveGenerationProjection<M extends UIMessage = UIMessage> = {\n generationId: string\n responseMessageId: string\n /** Log index of the completed model step while its response remains interruptible. */\n completionIndex?: number\n baseMessage?: M\n baseCompaction?: CompactionState<M> | null\n batches: Array<{ index: number; chunks: UIMessageChunk[] }>\n baseTools: ToolActivity[]\n toolEvents: Array<\n | { index: number; type: 'ai.tool.called'; payload: ToolCalledPayload }\n | { index: number; type: 'ai.tool.result'; payload: ToolResultPayload }\n >\n approvalEvents: Array<\n | {\n index: number\n type: 'ai.approval.requested'\n payload: ApprovalRequestedPayload\n }\n | {\n index: number\n type: 'ai.approval.responded'\n payload: ApprovalRespondedPayload\n }\n >\n}\n\nexport type PendingApproval = ApprovalRequestedPayload\nexport type PendingInput = InputRequestedPayload\n\nexport type ToolActivity = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName?: string\n input?: unknown\n rawInput?: unknown\n output?: unknown\n error?: string\n preliminary?: boolean\n phase?: 'input' | 'execution'\n dynamic?: boolean\n providerExecuted?: boolean\n callProviderMetadata?: unknown\n resultProviderMetadata?: unknown\n toolMetadata?: unknown\n title?: string\n status: 'running' | 'completed' | 'failed' | 'denied'\n}\n\nexport type CompactionState<M extends UIMessage> = {\n status: 'running' | 'completed'\n generationId: string\n throughMessageId: string\n throughIndex?: number\n messages?: M[]\n retainedMessageIds?: string[]\n summary?: string\n usage?: LanguageModelUsage\n}\n\nexport type GenerationUsage = {\n generationId: string\n usage: LanguageModelUsage\n}\n\nexport type AIState<M extends UIMessage = UIMessage> = {\n session: { created: boolean; metadata?: JSONValue }\n messages: M[]\n status: AgentStatus\n activeGeneration: ActiveGeneration | null\n activeRequestId: string | null\n activeResponseMessageId: string | null\n activeProjection: ActiveGenerationProjection<M> | null\n responseGenerationIds: Record<string, string>\n terminalRequestIds?: Record<string, true>\n terminalGenerations?: Record<\n string,\n 'completed' | 'failed' | 'interrupted' | 'superseded'\n >\n pendingApprovals: PendingApproval[]\n pendingInputs: PendingInput[]\n tools: ToolActivity[]\n compaction: CompactionState<M> | null\n modelMetadata: Record<string, ModelMetadataState>\n usage: GenerationUsage[]\n error: string | null\n}\n\nexport type AgentDefinition<\n M extends UIMessage = UIMessage,\n D extends EventDefs = AIEventDefs<M>,\n> = {\n readonly contract: Contract<D>\n readonly reducer: Reducer<D, AIState<M>>\n}\n\nexport type AgentToolEventDefs = EventDefs &\n Pick<AIEventDefs, 'ai.tool.called' | 'ai.approval.responded'>\n\n/** The durable handler context supplied when A2 executes a local AI tool. */\nexport type AgentToolContext<D extends AgentToolEventDefs> =\n | HandlerContext<D, 'ai.tool.called'>\n | HandlerContext<D, 'ai.approval.responded'>\n\nexport type AgentOptions<M extends UIMessage, E extends EventDefs> = {\n name: string\n events?: E\n /** Optional stricter schema for custom UIMessage metadata/data/tool types. */\n messageSchema?: StandardSchemaV1<M>\n /** Snapshot identity. Bump when application-level projection semantics change. */\n reducerName?: string\n}\n\ntype AIMessageFrom<D extends EventDefs> =\n D extends Record<'ai.message.created', infer S extends StandardSchemaV1>\n ? StandardSchemaV1.InferOutput<S> extends MessageCreatedPayload<\n infer M extends UIMessage\n >\n ? M\n : UIMessage\n : UIMessage\n\ntype SchemaResult<T> = StandardSchemaV1.Result<T>\n\nconst issue = <T>(message: string): SchemaResult<T> => ({\n issues: [{ message }],\n})\n\nconst schema = <T>(\n label: string,\n parse: (value: unknown) => SchemaResult<T>,\n): StandardSchemaV1<T> => ({\n '~standard': {\n version: 1,\n vendor: 'a2',\n validate(value) {\n try {\n return parse(value)\n } catch (error) {\n return issue(\n `${label}: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n },\n})\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isJSONCompatible = (\n value: unknown,\n seen: Set<object> = new Set(),\n): boolean => {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean'\n ) {\n return true\n }\n if (typeof value === 'number') return Number.isFinite(value)\n if (typeof value === 'undefined') return true\n if (typeof value !== 'object') return false\n if (seen.has(value)) return false\n seen.add(value)\n const valid = Array.isArray(value)\n ? value.every((item) => isJSONCompatible(item, seen))\n : Object.getPrototypeOf(value) === Object.prototype &&\n Object.values(value).every((item) => isJSONCompatible(item, seen))\n seen.delete(value)\n return valid\n}\n\nconst jsonObject = <T extends object>(\n label: string,\n check: (value: Record<string, unknown>) => boolean,\n): StandardSchemaV1<T> =>\n schema(label, (value) => {\n if (!isRecord(value) || !isJSONCompatible(value) || !check(value)) {\n return issue(`invalid ${label}`)\n }\n return { value: value as T }\n })\n\nconst stringField = (value: Record<string, unknown>, key: string): boolean =>\n typeof value[key] === 'string' && value[key].length > 0\n\nconst optionalIndexField = (\n value: Record<string, unknown>,\n key: string,\n): boolean =>\n value[key] === undefined ||\n (typeof value[key] === 'number' &&\n Number.isSafeInteger(value[key]) &&\n value[key] >= 0)\n\nconst optionalStringField = (\n value: Record<string, unknown>,\n key: string,\n): boolean => value[key] === undefined || typeof value[key] === 'string'\n\nconst messageValue = (value: unknown): value is UIMessage =>\n isRecord(value) &&\n typeof value['id'] === 'string' &&\n (value['role'] === 'user' ||\n value['role'] === 'assistant' ||\n value['role'] === 'system') &&\n Array.isArray(value['parts']) &&\n value['parts'].every(\n (part) => isRecord(part) && typeof part['type'] === 'string',\n ) &&\n isJSONCompatible(value)\n\nconst validateMessage = <M extends UIMessage>(\n value: unknown,\n messageSchema?: StandardSchemaV1<M>,\n): SchemaResult<M> => {\n if (!messageValue(value)) return issue('invalid AI SDK UIMessage')\n if (!messageSchema) return { value: value as M }\n return validateSync(messageSchema, value, 'the AI message')\n}\n\nconst messagePayloadSchema = <M extends UIMessage>(\n messageSchema?: StandardSchemaV1<M>,\n): StandardSchemaV1<MessageCreatedPayload<M>> =>\n schema('ai.message.created', (value) => {\n if (!isRecord(value)) return issue('invalid ai.message.created payload')\n const message = validateMessage(value['message'], messageSchema)\n if (message.issues) return { issues: message.issues }\n const generate = value['generate']\n if (generate !== undefined && typeof generate !== 'boolean') {\n return issue('invalid ai.message.created generate flag')\n }\n return {\n value: {\n message: message.value,\n ...(generate === false ? { generate: false } : {}),\n },\n }\n })\n\nconst progressPayloadSchema: StandardSchemaV1<GenerationProgressPayload> =\n schema('ai.generation.progress', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'requestId') ||\n !stringField(value, 'messageId') ||\n !stringField(value, 'generationId') ||\n !stringField(value, 'responseMessageId') ||\n typeof value['sequence'] !== 'number' ||\n !Number.isInteger(value['sequence']) ||\n value['sequence'] < 0 ||\n !Array.isArray(value['chunks']) ||\n !value['chunks'].every(\n (chunk) => isRecord(chunk) && typeof chunk['type'] === 'string',\n )\n ) {\n return issue('invalid ai.generation.progress payload')\n }\n return { value: value as GenerationProgressPayload }\n })\n\nconst completedPayloadSchema: StandardSchemaV1<GenerationCompletedPayload> =\n schema('ai.generation.completed', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'requestId') ||\n !stringField(value, 'messageId') ||\n !stringField(value, 'generationId') ||\n !stringField(value, 'responseMessageId') ||\n !optionalIndexField(value, 'inputTokenEstimate') ||\n !optionalStringField(value, 'finishReason')\n ) {\n return issue('invalid ai.generation.completed payload')\n }\n return { value: value as GenerationCompletedPayload }\n })\n\nconst compactionPayloadSchema = <M extends UIMessage>(\n messageSchema?: StandardSchemaV1<M>,\n): StandardSchemaV1<CompactionCompletedPayload<M>> =>\n schema('ai.compaction.completed', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'generationId') ||\n !stringField(value, 'throughMessageId') ||\n !optionalIndexField(value, 'throughIndex') ||\n !optionalStringField(value, 'summary') ||\n !Array.isArray(value['messages']) ||\n (value['retainedMessageIds'] !== undefined &&\n (!Array.isArray(value['retainedMessageIds']) ||\n !value['retainedMessageIds'].every(\n (candidate) => typeof candidate === 'string',\n )))\n ) {\n return issue('invalid ai.compaction.completed payload')\n }\n const messages: M[] = []\n for (const candidate of value['messages']) {\n const result = validateMessage(candidate, messageSchema)\n if (result.issues) return { issues: result.issues }\n messages.push(result.value)\n }\n return {\n value: {\n generationId: value['generationId'] as string,\n throughMessageId: value['throughMessageId'] as string,\n ...(value['throughIndex'] === undefined\n ? {}\n : { throughIndex: value['throughIndex'] as number }),\n messages,\n ...(value['summary'] === undefined\n ? {}\n : { summary: value['summary'] as string }),\n ...(value['usage'] === undefined\n ? {}\n : { usage: value['usage'] as LanguageModelUsage }),\n ...(value['retainedMessageIds'] === undefined\n ? {}\n : { retainedMessageIds: value['retainedMessageIds'] as string[] }),\n },\n }\n })\n\nexport function createEvents<M extends UIMessage = UIMessage>(options?: {\n messageSchema?: StandardSchemaV1<M>\n}): AIEventDefs<M> {\n const messageSchema = options?.messageSchema\n if (messageSchema) assertSyncSchema(messageSchema, 'the AI message schema')\n const definition: AIEventDefs<M> = {\n 'ai.session.created': jsonObject('ai.session.created', () => true),\n 'ai.session.closed': jsonObject('ai.session.closed', (value) =>\n optionalStringField(value, 'reason'),\n ),\n 'ai.message.created': messagePayloadSchema(messageSchema),\n 'ai.message.completed': jsonObject('ai.message.completed', (value) =>\n stringField(value, 'messageId'),\n ),\n 'ai.message.interrupted': jsonObject(\n 'ai.message.interrupted',\n (value) =>\n stringField(value, 'messageId') &&\n ((stringField(value, 'generationId') &&\n value['requestId'] === undefined) ||\n (stringField(value, 'requestId') &&\n value['generationId'] === undefined)) &&\n optionalStringField(value, 'reason') &&\n (value['lastSeenIndex'] === undefined ||\n (typeof value['lastSeenIndex'] === 'number' &&\n Number.isInteger(value['lastSeenIndex']) &&\n value['lastSeenIndex'] >= 0)),\n ),\n 'ai.generation.requested': jsonObject(\n 'ai.generation.requested',\n (value) =>\n stringField(value, 'messageId') &&\n optionalStringField(value, 'responseMessageId') &&\n (value['reason'] === 'message' ||\n value['reason'] === 'tool' ||\n value['reason'] === 'input' ||\n value['reason'] === 'retry'),\n ),\n 'ai.retry.requested': jsonObject(\n 'ai.retry.requested',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'responseMessageId') &&\n stringField(value, 'retryId'),\n ),\n 'ai.generation.started': jsonObject(\n 'ai.generation.started',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'responseMessageId') &&\n typeof value['attempt'] === 'number' &&\n Number.isInteger(value['attempt']) &&\n value['attempt'] > 0 &&\n stringField(value, 'model') &&\n optionalIndexField(value, 'promptThroughIndex'),\n ),\n 'ai.generation.progress': progressPayloadSchema,\n 'ai.generation.completed': completedPayloadSchema,\n 'ai.generation.failed': jsonObject(\n 'ai.generation.failed',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'responseMessageId') &&\n stringField(value, 'error') &&\n (value['superseded'] === undefined ||\n typeof value['superseded'] === 'boolean') &&\n (value['stepLimit'] === undefined ||\n typeof value['stepLimit'] === 'boolean'),\n ),\n 'ai.tool.called': jsonObject(\n 'ai.tool.called',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'toolCallId') &&\n stringField(value, 'toolName') &&\n (value['dynamic'] === undefined ||\n typeof value['dynamic'] === 'boolean') &&\n (value['providerExecuted'] === undefined ||\n typeof value['providerExecuted'] === 'boolean') &&\n (value['supportsDeferredResults'] === undefined ||\n typeof value['supportsDeferredResults'] === 'boolean') &&\n optionalStringField(value, 'title'),\n ),\n 'ai.tool.result': jsonObject(\n 'ai.tool.result',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'toolCallId') &&\n optionalStringField(value, 'toolName') &&\n optionalStringField(value, 'error') &&\n (value['denied'] === undefined ||\n typeof value['denied'] === 'boolean') &&\n (value['preliminary'] === undefined ||\n typeof value['preliminary'] === 'boolean') &&\n (value['phase'] === undefined ||\n value['phase'] === 'input' ||\n value['phase'] === 'execution') &&\n (value['dynamic'] === undefined ||\n typeof value['dynamic'] === 'boolean') &&\n (value['providerExecuted'] === undefined ||\n typeof value['providerExecuted'] === 'boolean'),\n ),\n 'ai.approval.requested': jsonObject(\n 'ai.approval.requested',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'approvalId') &&\n stringField(value, 'toolCallId') &&\n (value['isAutomatic'] === undefined ||\n typeof value['isAutomatic'] === 'boolean') &&\n optionalStringField(value, 'signature'),\n ),\n 'ai.approval.responded': jsonObject(\n 'ai.approval.responded',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'approvalId') &&\n typeof value['approved'] === 'boolean' &&\n optionalStringField(value, 'reason'),\n ),\n 'ai.input.requested': jsonObject(\n 'ai.input.requested',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'inputId') &&\n stringField(value, 'name'),\n ),\n 'ai.input.responded': jsonObject(\n 'ai.input.responded',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'inputId') &&\n stringField(value, 'name'),\n ),\n 'ai.compaction.requested': jsonObject(\n 'ai.compaction.requested',\n (value) =>\n stringField(value, 'generationId') &&\n stringField(value, 'throughMessageId') &&\n optionalIndexField(value, 'throughIndex'),\n ),\n 'ai.compaction.completed': compactionPayloadSchema(messageSchema),\n 'ai.model.metadata.requested': jsonObject(\n 'ai.model.metadata.requested',\n (value) => stringField(value, 'modelId'),\n ),\n 'ai.model.metadata.resolved': jsonObject(\n 'ai.model.metadata.resolved',\n (value) =>\n stringField(value, 'modelId') &&\n (value['limits'] === null ||\n (isRecord(value['limits']) &&\n typeof value['limits']['contextWindow'] === 'number' &&\n Number.isSafeInteger(value['limits']['contextWindow']) &&\n value['limits']['contextWindow'] > 0 &&\n typeof value['limits']['maxOutputTokens'] === 'number' &&\n Number.isSafeInteger(value['limits']['maxOutputTokens']) &&\n value['limits']['maxOutputTokens'] > 0)),\n ),\n }\n return definition\n}\n\nexport const events: AIEventDefs<UIMessage> = createEvents()\n\nconst initialState = <M extends UIMessage>(): AIState<M> => ({\n session: { created: false },\n messages: [],\n status: 'idle',\n activeGeneration: null,\n activeRequestId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n responseGenerationIds: {},\n pendingApprovals: [],\n pendingInputs: [],\n tools: [],\n compaction: null,\n modelMetadata: {},\n usage: [],\n error: null,\n})\n\nconst upsertMessage = <M extends UIMessage>(messages: M[], message: M): M[] => {\n const index = messages.findIndex((candidate) => candidate.id === message.id)\n if (index === -1) return [...messages, message]\n const next = [...messages]\n next[index] = message\n return next\n}\n\nconst answerApproval = <M extends UIMessage>(\n messages: M[],\n response: ApprovalRespondedPayload,\n): M[] =>\n messages.map((message) => {\n if (message.id !== response.messageId) return message\n let changed = false\n const parts = message.parts.map((part) => {\n const candidate = part as unknown\n if (\n !isRecord(candidate) ||\n candidate['state'] !== 'approval-requested' ||\n !isRecord(candidate['approval']) ||\n candidate['approval']['id'] !== response.approvalId\n ) {\n return part\n }\n changed = true\n return {\n ...part,\n state: 'approval-responded',\n approval: {\n ...candidate['approval'],\n approved: response.approved,\n ...(response.reason === undefined ? {} : { reason: response.reason }),\n },\n } as typeof part\n })\n return changed ? ({ ...message, parts } as M) : message\n })\n\nconst projectMessageChunks = <M extends UIMessage>(\n messages: M[],\n messageId: string,\n chunks: UIMessageChunk[],\n): M[] =>\n messages.map((message) =>\n message.id === messageId\n ? projectUIMessage({ messageId, base: message, chunks })\n : message,\n )\n\nconst approvalRequestedChunk = (\n payload: ApprovalRequestedPayload,\n): UIMessageChunk => ({\n type: 'tool-approval-request',\n approvalId: payload.approvalId,\n toolCallId: payload.toolCallId,\n ...(payload.isAutomatic === undefined\n ? {}\n : { isAutomatic: payload.isAutomatic }),\n ...(payload.signature === undefined ? {} : { signature: payload.signature }),\n})\n\nconst approvalRespondedChunk = (\n payload: ApprovalRespondedPayload,\n): UIMessageChunk => ({\n type: 'tool-approval-response',\n approvalId: payload.approvalId,\n approved: payload.approved,\n ...(payload.reason === undefined ? {} : { reason: payload.reason }),\n})\n\nconst toolResultChunk = (payload: ToolResultPayload): UIMessageChunk => {\n if (payload.phase === 'input') {\n return {\n type: 'tool-input-error',\n toolCallId: payload.toolCallId,\n toolName: payload.toolName ?? 'unknown',\n input: payload.rawInput ?? payload.input,\n errorText: payload.error ?? 'Invalid tool input',\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n }\n if (payload.denied === true) {\n return {\n type: 'tool-output-denied',\n toolCallId: payload.toolCallId,\n } as UIMessageChunk\n }\n if (payload.error !== undefined) {\n return {\n type: 'tool-output-error',\n toolCallId: payload.toolCallId,\n errorText: payload.error,\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n }\n return {\n type: 'tool-output-available',\n toolCallId: payload.toolCallId,\n output: payload.output,\n ...(payload.preliminary === undefined\n ? {}\n : { preliminary: payload.preliminary }),\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n}\n\nconst waitingStatus = <M extends UIMessage>(state: AIState<M>): AgentStatus => {\n if (state.pendingApprovals.length > 0 || state.pendingInputs.length > 0) {\n return 'waiting'\n }\n return state.activeGeneration !== null ||\n state.tools.some((activity) => activity.status === 'running')\n ? 'generating'\n : 'idle'\n}\n\nconst lifecycleStatus = <M extends UIMessage>(\n previous: AIState<M>,\n next: AIState<M>,\n): AgentStatus =>\n previous.status === 'failed' ? 'failed' : waitingStatus(next)\n\nconst isStaleGeneration = <M extends UIMessage>(\n state: AIState<M>,\n messageId: string,\n generationId: string,\n): boolean => {\n const current = state.responseGenerationIds[messageId]\n return current !== undefined && current !== generationId\n}\n\nconst projectedMessage = <M extends UIMessage>(\n projection: ActiveGenerationProjection<M>,\n): M => {\n const projectionEvents: Array<{ index: number; chunks: UIMessageChunk[] }> = [\n ...projection.batches,\n ]\n for (const event of projection.toolEvents) {\n if (event.type === 'ai.tool.result') {\n projectionEvents.push({\n index: event.index,\n chunks: [toolResultChunk(event.payload)],\n })\n }\n }\n for (const event of projection.approvalEvents) {\n projectionEvents.push({\n index: event.index,\n chunks: [\n event.type === 'ai.approval.requested'\n ? approvalRequestedChunk(event.payload)\n : approvalRespondedChunk(event.payload),\n ],\n })\n }\n return projectUIMessage({\n messageId: projection.responseMessageId,\n ...(projection.baseMessage === undefined\n ? {}\n : { base: projection.baseMessage }),\n chunks: projectionEvents\n .toSorted((left, right) => left.index - right.index)\n .flatMap((event) => event.chunks),\n })\n}\n\nconst reduceToolActivity = (\n tools: ToolActivity[],\n event:\n | { type: 'ai.tool.called'; payload: ToolCalledPayload }\n | { type: 'ai.tool.result'; payload: ToolResultPayload },\n): ToolActivity[] => {\n if (event.type === 'ai.tool.called') {\n const payload = event.payload\n const { providerMetadata, ...called } = payload\n const activity: ToolActivity = {\n ...called,\n ...(providerMetadata === undefined\n ? {}\n : { callProviderMetadata: providerMetadata }),\n status: 'running',\n }\n return [\n ...tools.filter(\n (candidate) =>\n candidate.generationId !== payload.generationId ||\n candidate.toolCallId !== payload.toolCallId,\n ),\n activity,\n ]\n }\n\n const payload = event.payload\n const existing = tools.find(\n (candidate) =>\n candidate.generationId === payload.generationId &&\n candidate.toolCallId === payload.toolCallId,\n )\n const toolName = payload.toolName ?? existing?.toolName\n const input = payload.input === undefined ? existing?.input : payload.input\n const dynamic = payload.dynamic ?? existing?.dynamic\n const providerExecuted =\n payload.providerExecuted ?? existing?.providerExecuted\n const toolMetadata = payload.toolMetadata ?? existing?.toolMetadata\n const resultProviderMetadata =\n payload.providerMetadata ?? existing?.resultProviderMetadata\n const activity: ToolActivity = {\n requestId: payload.requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n toolCallId: payload.toolCallId,\n ...(toolName === undefined ? {} : { toolName }),\n ...(input === undefined ? {} : { input }),\n ...(payload.rawInput === undefined ? {} : { rawInput: payload.rawInput }),\n ...(payload.output === undefined ? {} : { output: payload.output }),\n ...(payload.error === undefined ? {} : { error: payload.error }),\n ...(payload.preliminary === undefined\n ? {}\n : { preliminary: payload.preliminary }),\n ...(payload.phase === undefined ? {} : { phase: payload.phase }),\n ...(dynamic === undefined ? {} : { dynamic }),\n ...(providerExecuted === undefined ? {} : { providerExecuted }),\n ...(existing?.callProviderMetadata === undefined\n ? {}\n : { callProviderMetadata: existing.callProviderMetadata }),\n ...(resultProviderMetadata === undefined ? {} : { resultProviderMetadata }),\n ...(toolMetadata === undefined ? {} : { toolMetadata }),\n ...(existing?.title === undefined ? {} : { title: existing.title }),\n status: payload.denied\n ? 'denied'\n : payload.error\n ? 'failed'\n : payload.preliminary\n ? 'running'\n : 'completed',\n }\n return [\n ...tools.filter(\n (candidate) =>\n candidate.generationId !== payload.generationId ||\n candidate.toolCallId !== payload.toolCallId,\n ),\n activity,\n ]\n}\n\nconst projectedTools = <M extends UIMessage>(\n projection: ActiveGenerationProjection<M>,\n): ToolActivity[] =>\n projection.toolEvents.reduce(\n (tools, event) => reduceToolActivity(tools, event),\n projection.baseTools,\n )\n\nconst restoreGenerationBase = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n responseMessageId: string,\n reason: 'interrupted' | 'superseded',\n): AIState<M> => {\n const projection =\n state.activeProjection?.generationId === generationId\n ? state.activeProjection\n : null\n return {\n ...state,\n messages:\n projection?.baseMessage === undefined\n ? state.messages.filter((message) => message.id !== responseMessageId)\n : upsertMessage(state.messages, projection.baseMessage),\n tools:\n projection === null\n ? state.tools.filter(\n (activity) => activity.generationId !== generationId,\n )\n : projection.baseTools,\n pendingApprovals: state.pendingApprovals.filter(\n (approval) => approval.generationId !== generationId,\n ),\n pendingInputs: state.pendingInputs.filter(\n (input) => input.generationId !== generationId,\n ),\n activeGeneration: null,\n activeProjection: null,\n terminalGenerations: {\n ...state.terminalGenerations,\n [generationId]: reason,\n },\n compaction:\n projection === null\n ? state.compaction?.generationId === generationId\n ? null\n : state.compaction\n : (projection.baseCompaction ?? null),\n }\n}\n\nconst stopGenerationTools = (\n tools: ToolActivity[],\n generationId: string | undefined,\n responseMessageId: string,\n error: string,\n): ToolActivity[] =>\n tools.map((activity) =>\n activity.status === 'running' &&\n (generationId === undefined\n ? activity.messageId === responseMessageId\n : activity.generationId === generationId)\n ? { ...activity, status: 'failed', error, preliminary: false }\n : activity,\n )\n\nconst interruptGenerationProjection = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n responseMessageId: string,\n cutoff: number,\n): AIState<M> | null => {\n const projection =\n state.activeProjection?.generationId === generationId\n ? state.activeProjection\n : null\n if (projection === null) return null\n const retained: ActiveGenerationProjection<M> = {\n ...projection,\n batches: projection.batches.filter((batch) => batch.index <= cutoff),\n toolEvents: projection.toolEvents.filter(\n (toolEvent) => toolEvent.index <= cutoff,\n ),\n approvalEvents: projection.approvalEvents.filter(\n (approvalEvent) => approvalEvent.index <= cutoff,\n ),\n }\n const shouldProject =\n retained.baseMessage !== undefined || retained.batches.length > 0\n const restored = restoreGenerationBase(\n state,\n generationId,\n responseMessageId,\n 'interrupted',\n )\n return {\n ...restored,\n messages: shouldProject\n ? upsertMessage(\n restored.messages,\n interruptUIMessage(projectedMessage(retained)),\n )\n : restored.messages,\n tools: stopGenerationTools(\n projectedTools(retained),\n generationId,\n responseMessageId,\n 'Tool execution was interrupted.',\n ),\n usage:\n projection.completionIndex === undefined ||\n projection.completionIndex <= cutoff\n ? restored.usage\n : restored.usage.filter((entry) => entry.generationId !== generationId),\n }\n}\n\nconst generationRequestId = (generationId: string): string | undefined => {\n const marker = ':generation:'\n const markerIndex = generationId.lastIndexOf(marker)\n return markerIndex === -1 ? undefined : generationId.slice(0, markerIndex)\n}\n\nconst terminalGenerationReason = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n): 'completed' | 'failed' | 'interrupted' | 'superseded' | undefined => {\n const terminal = state.terminalGenerations?.[generationId]\n if (terminal !== undefined) return terminal\n const requestId = generationRequestId(generationId)\n return requestId !== undefined &&\n state.terminalRequestIds?.[requestId] === true\n ? 'interrupted'\n : undefined\n}\n\n/** Pure projection of the built-in AI protocol. Unknown extension events are ignored. */\nexport function reduceAIState<M extends UIMessage>(\n state: AIState<M>,\n event: { type: string; payload: unknown; index: number; id?: string },\n): AIState<M> {\n if (state.status === 'closed') return state\n switch (event.type) {\n case 'ai.model.metadata.requested': {\n const { modelId } = event.payload as ModelMetadataRequestedPayload\n if (Object.hasOwn(state.modelMetadata, modelId)) return state\n return {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]: { status: 'pending' },\n },\n }\n }\n case 'ai.model.metadata.resolved': {\n const { modelId, limits } = event.payload as ModelMetadataResolvedPayload\n return {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]:\n limits === null\n ? { status: 'unavailable' }\n : { status: 'resolved', limits },\n },\n }\n }\n case 'ai.session.created': {\n const payload = event.payload as SessionCreatedPayload\n return {\n ...state,\n session: {\n created: true,\n ...(payload.metadata === undefined\n ? state.session.metadata === undefined\n ? {}\n : { metadata: state.session.metadata }\n : { metadata: payload.metadata }),\n },\n }\n }\n case 'ai.session.closed':\n return {\n ...state,\n status: 'closed',\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection?.baseCompaction ?? null)\n : state.compaction,\n activeGeneration: null,\n activeRequestId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n }\n case 'ai.message.created': {\n const { message } = event.payload as MessageCreatedPayload<M>\n return { ...state, messages: upsertMessage(state.messages, message) }\n }\n case 'ai.message.completed': {\n const { messageId } = event.payload as MessageCompletedPayload\n const generationId = state.responseGenerationIds[messageId]\n if (\n generationId === undefined ||\n terminalGenerationReason(state, generationId) !== undefined\n ) {\n return state\n }\n const requestId = generationRequestId(generationId)\n return {\n ...state,\n activeRequestId: null,\n activeResponseMessageId: null,\n activeProjection:\n state.activeProjection?.generationId === generationId\n ? null\n : state.activeProjection,\n terminalGenerations: {\n ...state.terminalGenerations,\n [generationId]: 'completed',\n },\n ...(requestId === undefined\n ? {}\n : {\n terminalRequestIds: {\n ...state.terminalRequestIds,\n [requestId]: true,\n },\n }),\n }\n }\n case 'ai.generation.requested': {\n const payload = event.payload as GenerationRequestedPayload\n const schedulesToolContinuation = payload.reason === 'tool'\n const responseMessageId =\n payload.responseMessageId ??\n (payload.reason === 'message'\n ? `${payload.messageId}:assistant`\n : payload.messageId)\n const ownerGenerationId =\n state.responseGenerationIds[responseMessageId] ??\n state.activeGeneration?.generationId\n const ownerRequestId =\n ownerGenerationId === undefined\n ? undefined\n : generationRequestId(ownerGenerationId)\n const requestId = (event as { id?: string }).id\n if (\n requestId !== undefined &&\n state.terminalRequestIds?.[requestId] === true\n ) {\n return state\n }\n const acceptsRequest =\n payload.reason === 'message' ||\n (payload.reason === 'tool'\n ? ownerGenerationId !== undefined &&\n requestId === `ai.generate:tools:${ownerGenerationId}` &&\n state.activeRequestId === ownerRequestId &&\n state.status !== 'failed'\n : payload.reason === 'retry'\n ? state.status === 'failed'\n : ownerGenerationId !== undefined &&\n requestId?.startsWith(\n `ai.generate:input:${encodeURIComponent(responseMessageId)}:${encodeURIComponent(ownerGenerationId)}:`,\n ) === true &&\n state.activeRequestId === ownerRequestId &&\n state.status !== 'failed')\n if (!acceptsRequest) return state\n return {\n ...state,\n messages:\n payload.reason === 'retry' && payload.responseMessageId !== undefined\n ? state.messages.filter(\n (message) => message.id !== payload.responseMessageId,\n )\n : state.messages,\n activeProjection:\n payload.reason === 'retry' ? null : state.activeProjection,\n status: schedulesToolContinuation ? state.status : 'generating',\n activeRequestId: requestId ?? null,\n activeResponseMessageId: responseMessageId,\n error: schedulesToolContinuation ? state.error : null,\n }\n }\n case 'ai.generation.started': {\n const payload = event.payload as GenerationStartedPayload\n if (\n state.terminalRequestIds?.[payload.requestId] === true ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n if (\n state.activeRequestId !== null &&\n state.activeRequestId !== payload.requestId\n ) {\n return state\n }\n const currentOwner =\n state.responseGenerationIds[payload.responseMessageId]\n const currentTerminal =\n currentOwner === undefined\n ? undefined\n : terminalGenerationReason(state, currentOwner)\n if (\n currentTerminal === 'completed' ||\n currentTerminal === 'interrupted'\n ) {\n return state\n }\n const marker = ':generation:'\n const currentAttempt = currentOwner?.startsWith(\n `${payload.requestId}${marker}`,\n )\n ? Number(currentOwner.slice(`${payload.requestId}${marker}`.length))\n : undefined\n if (\n currentAttempt !== undefined &&\n Number.isFinite(currentAttempt) &&\n currentAttempt >= payload.attempt\n ) {\n return state\n }\n const activeGeneration = state.activeGeneration\n const replacesActiveAttempt =\n activeGeneration !== null &&\n activeGeneration.requestId === payload.requestId &&\n activeGeneration.responseMessageId === payload.responseMessageId &&\n activeGeneration.attempt < payload.attempt &&\n state.activeProjection?.generationId === activeGeneration.generationId\n const baseState = replacesActiveAttempt\n ? restoreGenerationBase(\n state,\n activeGeneration.generationId,\n activeGeneration.responseMessageId,\n 'superseded',\n )\n : state\n const baseMessage = baseState.messages.find(\n (message) => message.id === payload.responseMessageId,\n )\n return {\n ...baseState,\n status: 'generating',\n activeGeneration: payload,\n activeResponseMessageId: null,\n responseGenerationIds: {\n ...baseState.responseGenerationIds,\n [payload.responseMessageId]: payload.generationId,\n },\n activeProjection: {\n generationId: payload.generationId,\n responseMessageId: payload.responseMessageId,\n ...(baseMessage === undefined ? {} : { baseMessage }),\n baseCompaction: baseState.compaction,\n batches: [],\n baseTools: baseState.tools,\n toolEvents: [],\n approvalEvents: [],\n },\n error: null,\n }\n }\n case 'ai.generation.progress': {\n const payload = event.payload as GenerationProgressPayload\n if (terminalGenerationReason(state, payload.generationId) !== undefined) {\n return state\n }\n const activeProjection = state.activeProjection\n if (\n state.activeGeneration?.generationId !== payload.generationId ||\n activeProjection?.generationId !== payload.generationId\n ) {\n return state\n }\n const projection: ActiveGenerationProjection<M> = {\n ...activeProjection,\n batches: [\n ...activeProjection.batches.filter(\n (batch) => batch.index !== event.index,\n ),\n { index: event.index, chunks: payload.chunks },\n ].toSorted((left, right) => left.index - right.index),\n }\n return {\n ...state,\n messages: upsertMessage(state.messages, projectedMessage(projection)),\n activeProjection: projection,\n status: 'generating',\n }\n }\n case 'ai.generation.completed': {\n const payload = event.payload as GenerationCompletedPayload\n if (terminalGenerationReason(state, payload.generationId) !== undefined) {\n return state\n }\n if (state.activeGeneration?.generationId !== payload.generationId) {\n return state\n }\n const usage = payload.usage\n ? [\n ...state.usage.filter(\n (entry) => entry.generationId !== payload.generationId,\n ),\n { generationId: payload.generationId, usage: payload.usage },\n ]\n : state.usage\n const next = {\n ...state,\n activeGeneration: null,\n activeProjection:\n state.activeProjection?.generationId === payload.generationId\n ? { ...state.activeProjection, completionIndex: event.index }\n : state.activeProjection,\n usage,\n }\n return { ...next, status: waitingStatus(next) }\n }\n case 'ai.generation.failed': {\n const payload = event.payload as GenerationFailedPayload\n if (terminalGenerationReason(state, payload.generationId) !== undefined) {\n return state\n }\n if (\n state.activeGeneration?.generationId !== payload.generationId &&\n !(\n payload.stepLimit === true &&\n state.responseGenerationIds[payload.responseMessageId] ===\n payload.generationId &&\n state.activeRequestId ===\n `ai.generate:tools:${payload.generationId}` &&\n state.activeResponseMessageId === payload.responseMessageId\n )\n ) {\n return state\n }\n if (payload.superseded === true) {\n return restoreGenerationBase(\n state,\n payload.generationId,\n payload.responseMessageId,\n 'superseded',\n )\n }\n const projection =\n state.activeProjection?.generationId === payload.generationId\n ? state.activeProjection\n : null\n const shouldProject =\n projection !== null &&\n (projection.baseMessage !== undefined || projection.batches.length > 0)\n return {\n ...state,\n messages: shouldProject\n ? upsertMessage(\n state.messages,\n interruptUIMessage(\n projectedMessage(projection),\n `Generation failed before tool completion: ${payload.error}`,\n ),\n )\n : state.messages,\n status: 'failed',\n activeGeneration: null,\n activeResponseMessageId: null,\n activeProjection: projection,\n terminalGenerations: {\n ...state.terminalGenerations,\n [payload.generationId]: 'failed',\n },\n terminalRequestIds: {\n ...state.terminalRequestIds,\n [payload.requestId]: true,\n ...(state.activeRequestId === null\n ? {}\n : { [state.activeRequestId]: true as const }),\n },\n compaction:\n projection?.generationId === payload.generationId\n ? (projection.baseCompaction ?? null)\n : state.compaction?.generationId === payload.generationId\n ? null\n : state.compaction,\n pendingApprovals: state.pendingApprovals.filter(\n (approval) => approval.generationId !== payload.generationId,\n ),\n pendingInputs: state.pendingInputs.filter(\n (input) => input.generationId !== payload.generationId,\n ),\n tools: stopGenerationTools(\n state.tools,\n payload.generationId,\n payload.responseMessageId,\n payload.error,\n ),\n error: payload.error,\n }\n }\n case 'ai.message.interrupted': {\n const payload = event.payload as MessageInterruptedPayload\n const currentGenerationId = state.responseGenerationIds[payload.messageId]\n const targetRequestId =\n payload.requestId ?? generationRequestId(payload.generationId)\n const ownsRequestPhase =\n payload.requestId !== undefined &&\n state.activeGeneration === null &&\n state.activeRequestId === payload.requestId &&\n state.activeResponseMessageId === payload.messageId\n if (\n currentGenerationId !== undefined &&\n !ownsRequestPhase &&\n (payload.generationId !== undefined\n ? currentGenerationId !== payload.generationId\n : generationRequestId(currentGenerationId) !== payload.requestId)\n ) {\n return state\n }\n if (\n state.activeGeneration === null &&\n state.activeRequestId !== null &&\n state.activeResponseMessageId === payload.messageId &&\n targetRequestId !== state.activeRequestId\n ) {\n return state\n }\n const currentTerminal =\n currentGenerationId === undefined\n ? undefined\n : terminalGenerationReason(state, currentGenerationId)\n if (\n currentTerminal === 'completed' ||\n currentTerminal === 'interrupted' ||\n currentTerminal === 'superseded'\n ) {\n return state\n }\n const active = state.activeGeneration\n if (active === null) {\n if (\n payload.requestId !== undefined &&\n state.activeRequestId !== null &&\n state.activeRequestId === payload.requestId &&\n state.activeResponseMessageId === payload.messageId\n ) {\n const projectedState =\n currentGenerationId === undefined\n ? null\n : interruptGenerationProjection(\n state,\n currentGenerationId,\n payload.messageId,\n payload.lastSeenIndex ?? Number.POSITIVE_INFINITY,\n )\n const baseState = projectedState ?? state\n return {\n ...baseState,\n status: 'idle',\n activeRequestId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [payload.requestId]: true,\n },\n ...(currentGenerationId === undefined\n ? {}\n : {\n terminalGenerations: {\n ...baseState.terminalGenerations,\n [currentGenerationId]: 'interrupted' as const,\n },\n }),\n error: null,\n }\n }\n const targetGenerationId =\n payload.generationId ??\n (currentGenerationId !== undefined &&\n generationRequestId(currentGenerationId) === payload.requestId\n ? currentGenerationId\n : undefined)\n if (targetGenerationId === undefined) return state\n if (currentGenerationId !== targetGenerationId) return state\n const matchesGeneration = (generationId: string): boolean =>\n targetGenerationId === generationId\n const hasMessageWork =\n state.pendingApprovals.some(\n (approval) =>\n approval.messageId === payload.messageId &&\n matchesGeneration(approval.generationId),\n ) ||\n state.pendingInputs.some(\n (input) =>\n input.messageId === payload.messageId &&\n matchesGeneration(input.generationId),\n ) ||\n state.tools.some(\n (activity) =>\n activity.messageId === payload.messageId &&\n activity.status === 'running' &&\n matchesGeneration(activity.generationId),\n )\n const resolvesFailedGeneration =\n state.status === 'failed' &&\n currentGenerationId === targetGenerationId &&\n (state.activeRequestId === null ||\n state.activeRequestId === targetRequestId ||\n state.activeRequestId === `ai.generate:tools:${targetGenerationId}`)\n const resolvesCurrentGeneration =\n currentGenerationId === targetGenerationId &&\n currentTerminal === undefined\n if (\n !hasMessageWork &&\n !resolvesFailedGeneration &&\n !resolvesCurrentGeneration\n ) {\n return state\n }\n const pendingRequestId = state.activeRequestId\n const projectedState = interruptGenerationProjection(\n state,\n targetGenerationId,\n payload.messageId,\n payload.lastSeenIndex ?? Number.POSITIVE_INFINITY,\n )\n const baseState = projectedState ?? state\n const next = {\n ...baseState,\n activeRequestId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n messages:\n projectedState === null\n ? state.messages.map((message) =>\n message.id === payload.messageId\n ? interruptUIMessage(message)\n : message,\n )\n : baseState.messages,\n pendingApprovals: baseState.pendingApprovals.filter(\n (approval) =>\n approval.messageId !== payload.messageId ||\n !matchesGeneration(approval.generationId),\n ),\n pendingInputs: baseState.pendingInputs.filter(\n (input) =>\n input.messageId !== payload.messageId ||\n !matchesGeneration(input.generationId),\n ),\n tools:\n projectedState === null\n ? stopGenerationTools(\n state.tools,\n targetGenerationId,\n payload.messageId,\n 'Tool execution was interrupted.',\n )\n : baseState.tools,\n terminalGenerations: {\n ...baseState.terminalGenerations,\n [targetGenerationId]: 'interrupted' as const,\n },\n ...(pendingRequestId === null\n ? {}\n : {\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [pendingRequestId]: true as const,\n },\n }),\n error: resolvesFailedGeneration ? null : state.error,\n }\n return {\n ...next,\n status: waitingStatus(next),\n }\n }\n if (\n payload.messageId !== active.responseMessageId ||\n (payload.generationId !== active.generationId &&\n payload.requestId !== active.requestId)\n ) {\n return state\n }\n const cutoff = payload.lastSeenIndex ?? Number.POSITIVE_INFINITY\n const projectedState = interruptGenerationProjection(\n state,\n active.generationId,\n active.responseMessageId,\n cutoff,\n )\n const baseState =\n projectedState ??\n restoreGenerationBase(\n state,\n active.generationId,\n active.responseMessageId,\n 'interrupted',\n )\n const next = {\n ...baseState,\n activeRequestId: null,\n activeResponseMessageId: null,\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [active.requestId]: true as const,\n },\n tools:\n projectedState === null\n ? stopGenerationTools(\n baseState.tools,\n active.generationId,\n active.responseMessageId,\n 'Tool execution was interrupted.',\n )\n : baseState.tools,\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.tool.called': {\n const payload = event.payload as ToolCalledPayload\n const projection = state.activeProjection\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId,\n )\n ) {\n return state\n }\n if (projection?.generationId !== payload.generationId) {\n const next = {\n ...state,\n tools: reduceToolActivity(state.tools, {\n type: 'ai.tool.called',\n payload,\n }),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n const activeProjection: ActiveGenerationProjection<M> = {\n ...projection,\n toolEvents: [\n ...projection.toolEvents,\n { index: event.index, type: 'ai.tool.called', payload },\n ],\n }\n const next = {\n ...state,\n activeProjection,\n tools: projectedTools(activeProjection),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.tool.result': {\n const payload = event.payload as ToolResultPayload\n const projection = state.activeProjection\n const terminalReason = terminalGenerationReason(\n state,\n payload.generationId,\n )\n const completesFailedTool =\n terminalReason === 'failed' &&\n state.status === 'failed' &&\n payload.preliminary !== true &&\n projection?.generationId === payload.generationId &&\n projectedTools(projection).some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'running',\n )\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n (terminalReason !== undefined && !completesFailedTool)\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId &&\n !completesFailedTool,\n )\n ) {\n return state\n }\n if (projection?.generationId !== payload.generationId) {\n const next = {\n ...state,\n messages: projectMessageChunks(state.messages, payload.messageId, [\n toolResultChunk(payload),\n ]),\n tools: reduceToolActivity(state.tools, {\n type: 'ai.tool.result',\n payload,\n }),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n const activeProjection: ActiveGenerationProjection<M> = {\n ...projection,\n toolEvents: [\n ...projection.toolEvents,\n { index: event.index, type: 'ai.tool.result', payload },\n ],\n }\n const projected = projectedMessage(activeProjection)\n const tools = projectedTools(activeProjection)\n const failureError = state.error ?? 'Generation failed.'\n const next = {\n ...state,\n messages: upsertMessage(\n state.messages,\n terminalReason === 'failed'\n ? interruptUIMessage(\n projected,\n `Generation failed before tool completion: ${failureError}`,\n )\n : projected,\n ),\n activeProjection,\n tools:\n terminalReason === 'failed'\n ? stopGenerationTools(\n tools,\n payload.generationId,\n payload.messageId,\n failureError,\n )\n : tools,\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.approval.requested': {\n const payload = event.payload as ApprovalRequestedPayload\n const projection = state.activeProjection\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId,\n )\n ) {\n return state\n }\n const activeProjection =\n projection?.generationId === payload.generationId\n ? {\n ...projection,\n approvalEvents: [\n ...projection.approvalEvents,\n {\n index: event.index,\n type: 'ai.approval.requested' as const,\n payload,\n },\n ],\n }\n : projection\n const next = {\n ...state,\n messages:\n activeProjection === null || activeProjection === projection\n ? projectMessageChunks(state.messages, payload.messageId, [\n approvalRequestedChunk(payload),\n ])\n : upsertMessage(state.messages, projectedMessage(activeProjection)),\n activeProjection,\n pendingApprovals:\n payload.isAutomatic === true\n ? state.pendingApprovals\n : [\n ...state.pendingApprovals.filter(\n (approval) =>\n approval.approvalId !== payload.approvalId ||\n approval.messageId !== payload.messageId,\n ),\n payload,\n ],\n }\n return {\n ...next,\n status: lifecycleStatus(state, next),\n }\n }\n case 'ai.approval.responded': {\n const payload = event.payload as ApprovalRespondedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n const projection = state.activeProjection\n const pendingRequest = state.pendingApprovals.find(\n (candidate) =>\n candidate.approvalId === payload.approvalId &&\n candidate.messageId === payload.messageId &&\n candidate.generationId === payload.generationId,\n )\n const activeRequest = projection?.approvalEvents.findLast(\n (candidate) =>\n candidate.type === 'ai.approval.requested' &&\n candidate.payload.approvalId === payload.approvalId &&\n candidate.payload.messageId === payload.messageId &&\n candidate.payload.generationId === payload.generationId,\n )\n if (\n state.status === 'failed' &&\n pendingRequest === undefined &&\n activeRequest === undefined\n ) {\n return state\n }\n const activeProjection =\n projection !== null && activeRequest !== undefined\n ? {\n ...projection,\n approvalEvents: [\n ...projection.approvalEvents,\n {\n index: event.index,\n type: 'ai.approval.responded' as const,\n payload,\n },\n ],\n }\n : projection\n const next = {\n ...state,\n messages:\n activeProjection === null || activeProjection === projection\n ? answerApproval(state.messages, payload)\n : upsertMessage(state.messages, projectedMessage(activeProjection)),\n activeProjection,\n pendingApprovals: state.pendingApprovals.filter(\n (approval) =>\n approval.approvalId !== payload.approvalId ||\n approval.messageId !== payload.messageId ||\n approval.generationId !== payload.generationId,\n ),\n }\n return {\n ...next,\n status: lifecycleStatus(state, next),\n }\n }\n case 'ai.input.requested': {\n const payload = event.payload as InputRequestedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n const next = {\n ...state,\n pendingInputs: [\n ...state.pendingInputs.filter(\n (input) =>\n input.messageId !== payload.messageId ||\n input.generationId !== payload.generationId ||\n input.inputId !== payload.inputId,\n ),\n payload,\n ],\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.input.responded': {\n const payload = event.payload as InputRespondedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload.generationId) ||\n terminalGenerationReason(state, payload.generationId) !== undefined\n ) {\n return state\n }\n const next = {\n ...state,\n pendingInputs: state.pendingInputs.filter(\n (input) =>\n input.inputId !== payload.inputId ||\n input.messageId !== payload.messageId ||\n input.generationId !== payload.generationId,\n ),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.compaction.requested': {\n const payload = event.payload as CompactionRequestedPayload\n if (state.activeGeneration?.generationId !== payload.generationId) {\n return state\n }\n return {\n ...state,\n compaction: { status: 'running', ...payload },\n }\n }\n case 'ai.compaction.completed': {\n const payload = event.payload as CompactionCompletedPayload<M>\n if (\n state.activeGeneration?.generationId !== payload.generationId ||\n state.compaction?.status !== 'running' ||\n state.compaction.generationId !== payload.generationId\n ) {\n return state\n }\n return {\n ...state,\n compaction: { status: 'completed', ...payload },\n }\n }\n default:\n return state\n }\n}\n\n/** Derive AI SDK UI messages directly from an A2 event history. */\nexport function deriveUIMessages<M extends UIMessage = UIMessage>(\n history: readonly { type: string; payload: unknown; index: number }[],\n): M[] {\n let state = initialState<M>()\n for (const event of history) state = reduceAIState(state, event)\n return state.messages\n}\n\n/** Build the standard AI state projection for any contract containing the protocol. */\nexport function createReducer<D extends EventDefs>(options: {\n contract: Contract<D>\n name?: string\n}): Reducer<D, AIState<AIMessageFrom<D>>> {\n type M = AIMessageFrom<D>\n return options.contract\n .reducer({\n name: options.name ?? 'a2.ai.state.v10',\n initialState: initialState<M>(),\n })\n .fold((state, event) => reduceAIState(state, event))\n}\n\ntype ProtocolInput<\n M extends UIMessage,\n K extends keyof AIEventDefs<M> & string,\n> = AppendInput<Pick<AIEventDefs<M>, K>>\n\nexport type AIInputs = {\n /** Record a message. User messages schedule unless generate is false. */\n message<M extends UIMessage>(\n message: M,\n options?: { generate?: boolean },\n ): ProtocolInput<M, 'ai.message.created'>[]\n /** Record a message without requesting a generation. */\n seed<M extends UIMessage>(\n message: M,\n ): ProtocolInput<M, 'ai.message.created'>[]\n /** Answer an AI SDK tool approval. The tool barrier owns continuation. */\n approval(\n response: ApprovalRespondedPayload,\n ): ProtocolInput<UIMessage, 'ai.approval.responded'>[]\n /** Answer an application-defined input request. */\n input(\n response: InputRespondedPayload,\n ): ProtocolInput<UIMessage, 'ai.input.responded'>[]\n /** Record an application-defined request for input. */\n requestInput(\n request: InputRequestedPayload,\n ): ProtocolInput<UIMessage, 'ai.input.requested'>[]\n /** Request a fresh attempt for a failed response. */\n retry(\n options: RetryGenerationOptions,\n ): ProtocolInput<UIMessage, 'ai.retry.requested'>[]\n /** Interrupt the active response for a message. */\n interrupt(\n interruption: MessageInterruptedPayload,\n ): ProtocolInput<UIMessage, 'ai.message.interrupted'>[]\n}\n\nconst messageInput = <M extends UIMessage>(\n message: M,\n generate?: boolean,\n): ProtocolInput<M, 'ai.message.created'>[] => [\n {\n type: 'ai.message.created',\n id: `ai.message:${message.id}`,\n payload: {\n message,\n ...(generate === false ? { generate: false } : {}),\n },\n },\n]\n\n/** Pure append inputs for the built-in AI protocol. */\nexport const inputs: AIInputs = {\n message<M extends UIMessage>(message: M, options?: { generate?: boolean }) {\n return messageInput(message, options?.generate)\n },\n seed<M extends UIMessage>(message: M) {\n return messageInput(message, false)\n },\n approval(response) {\n return [\n {\n type: 'ai.approval.responded',\n id: `ai.approval:${encodeURIComponent(response.messageId)}:${encodeURIComponent(response.generationId)}:${encodeURIComponent(response.approvalId)}:response`,\n payload: response,\n },\n ]\n },\n input(response) {\n return [\n {\n type: 'ai.input.responded',\n id: `ai.input:${encodeURIComponent(response.messageId)}:${encodeURIComponent(response.generationId)}:${encodeURIComponent(response.inputId)}:response`,\n payload: response,\n },\n ]\n },\n requestInput(request) {\n return [\n {\n type: 'ai.input.requested',\n id: `ai.input:${encodeURIComponent(request.messageId)}:${encodeURIComponent(request.generationId)}:${encodeURIComponent(request.inputId)}:request`,\n payload: request,\n },\n ]\n },\n retry(retryOptions) {\n return [\n {\n type: 'ai.retry.requested',\n id: `ai.retry:${retryOptions.retryId}`,\n payload: retryOptions,\n },\n ]\n },\n interrupt(interruption) {\n return [\n {\n type: 'ai.message.interrupted',\n id: `ai.interrupt:${interruption.generationId ?? interruption.requestId}`,\n payload: interruption,\n },\n ]\n },\n}\n\n/**\n * Read the durable handler context ambient to the current AI tool\n * execution. A2 runs each local tool's `execute` inside this scope, so\n * plain AI SDK `tool()` definitions reach their `event`, `attempt`,\n * `session`, and `signal` without an A2-specific wrapper. The agent (or\n * contract) argument carries the event types and is verified against\n * the executing server's contract.\n */\nexport function handlerContext<D extends AgentToolEventDefs>(\n agentOrContract: Contract<D> | { readonly contract: Contract<D> },\n): AgentToolContext<D> {\n const contract =\n 'contract' in agentOrContract ? agentOrContract.contract : agentOrContract\n const scope = ambientToolScopeStorage()?.getStore()\n if (scope === undefined) {\n throw new TypeError(\n `handlerContext('${contract.name}') requires an ambient A2 tool execution: call it inside a local tool's execute, or wrap direct tool tests with runWithHandlerContext`,\n )\n }\n if (scope.contract !== undefined && scope.contract.name !== contract.name) {\n throw new TypeError(\n `handlerContext('${contract.name}') was called during a tool execution for agent '${scope.contract.name}'`,\n )\n }\n return scope.context as AgentToolContext<D>\n}\n\n/**\n * Define an agent: built-in AI protocol + application events and one state\n * reducer. The result is isomorphic.\n */\nexport function agent<\n M extends UIMessage = UIMessage,\n E extends EventDefs = Record<never, never>,\n>(options: AgentOptions<M, E>): AgentDefinition<M, AIEventDefs<M> & E> {\n const builtIns = createEvents(\n options.messageSchema === undefined\n ? undefined\n : { messageSchema: options.messageSchema },\n )\n const extensions = options.events ?? ({} as E)\n for (const key of Object.keys(extensions)) {\n if (Object.hasOwn(builtIns, key)) {\n throw new TypeError(\n `agent event '${key}' conflicts with a built-in event`,\n )\n }\n }\n const agentContract = createContract({\n name: options.name,\n events: { ...builtIns, ...extensions },\n })\n const reducer = agentContract\n .reducer({\n name: options.reducerName ?? 'a2.ai.state.v10',\n initialState: initialState<M>(),\n })\n .fold((state, event) => reduceAIState(state, event))\n\n const definition = {\n contract: agentContract,\n reducer,\n }\n return definition as unknown as AgentDefinition<M, AIEventDefs<M> & E>\n}\n\nexport type {\n FinishReason,\n JSONValue,\n LanguageModelUsage,\n UIMessage,\n UIMessageChunk,\n}\n"],"mappings":"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"}
|