experimental-a2 0.13.0 → 0.14.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 +34 -0
- package/dist/{actor-DJi3RsNu.d.ts → actor-BfQSE0KC.d.ts} +4 -4
- package/dist/{actor-DJi3RsNu.d.ts.map → actor-BfQSE0KC.d.ts.map} +1 -1
- package/dist/actor-client.d.ts +1 -1
- package/dist/actor-client.js +1 -1
- package/dist/actor-react.d.ts +3 -3
- package/dist/actor-react.js +2 -2
- package/dist/{actor-shared-DI7J5upy.js → actor-shared-B5tJfzt-.js} +2 -2
- package/dist/{actor-shared-DI7J5upy.js.map → actor-shared-B5tJfzt-.js.map} +1 -1
- package/dist/actor.d.ts +1 -1
- package/dist/actor.js +3 -3
- package/dist/ai-Cai-lCbj.d.ts +580 -0
- package/dist/ai-Cai-lCbj.d.ts.map +1 -0
- package/dist/ai-control-CcD4hh3y.js +119 -0
- package/dist/ai-control-CcD4hh3y.js.map +1 -0
- package/dist/ai-server.d.ts +6 -6
- package/dist/ai-server.d.ts.map +1 -1
- package/dist/ai-server.js +1014 -501
- package/dist/ai-server.js.map +1 -1
- package/dist/ai.d.ts +2 -365
- package/dist/ai.js +801 -80
- package/dist/ai.js.map +1 -1
- package/dist/{client-P_NNNRM-.d.ts → client-BAEABRZB.d.ts} +2 -2
- package/dist/{client-P_NNNRM-.d.ts.map → client-BAEABRZB.d.ts.map} +1 -1
- package/dist/{client-Bf6uSEAk.js → client-BYzHjkwU.js} +21 -6
- package/dist/client-BYzHjkwU.js.map +1 -0
- package/dist/client.d.ts +1 -1
- package/dist/client.js +1 -1
- package/dist/{contract-48bUMgcL.js → contract-CKRg_E4q.js} +3 -26
- package/dist/contract-CKRg_E4q.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/react.d.ts +2 -2
- package/dist/react.js +1 -1
- package/dist/{reducer-DJKWm3cp.d.ts → reducer-BcS9VDKC.d.ts} +4 -1
- package/dist/{reducer-DJKWm3cp.d.ts.map → reducer-BcS9VDKC.d.ts.map} +1 -1
- package/dist/reducer-DEMjEY_O.js +29 -0
- package/dist/reducer-DEMjEY_O.js.map +1 -0
- package/dist/scheduler-qstash.d.ts +2 -2
- package/dist/scheduler-qstash.js +1 -1
- package/dist/scheduler-vercel.d.ts +2 -2
- package/dist/scheduler-vercel.js +1 -1
- package/dist/{server-DjZZa1wr.d.ts → server-Bp5Nd1pF.d.ts} +3 -3
- package/dist/{server-DjZZa1wr.d.ts.map → server-Bp5Nd1pF.d.ts.map} +1 -1
- package/dist/{server-BeNADlCI.js → server-CjJSGcF7.js} +4 -3
- package/dist/server-CjJSGcF7.js.map +1 -0
- package/dist/server.d.ts +3 -3
- package/dist/server.js +1 -1
- package/dist/{store-DtDOWLSn.d.ts → store-D_yhNdPz.d.ts} +7 -2
- package/dist/{store-DtDOWLSn.d.ts.map → store-D_yhNdPz.d.ts.map} +1 -1
- package/dist/store-N8PXxDAS.js.map +1 -1
- package/dist/store-memory.d.ts +1 -1
- package/dist/store-postgres.d.ts +1 -1
- package/dist/store-postgres.js +19 -0
- package/dist/store-postgres.js.map +1 -1
- package/dist/store-redis-http.d.ts +1 -1
- package/dist/store-redis-http.js +1 -1
- package/dist/{store-redis-notify-BUCyXOn0.js → store-redis-notify-D2EI6gwX.js} +27 -2
- package/dist/store-redis-notify-D2EI6gwX.js.map +1 -0
- package/dist/store-redis.d.ts +1 -1
- package/dist/store-redis.js +1 -1
- package/dist/store-sqlite.d.ts +1 -1
- package/docs/guides/06-ai-agents.mdx +265 -62
- package/docs/reference/01-api.mdx +122 -27
- package/examples/playground/app/agent/[agentId]/agent-client.tsx +118 -21
- package/examples/playground/app/agent/[agentId]/agent-queue.tsx +289 -0
- package/examples/playground/app/agent/compaction-settings.test.ts +22 -6
- package/examples/playground/app/agent/model.ts +11 -2
- package/examples/playground/app/agent/server.ts +8 -2
- package/examples/playground/app/chat/[chatId]/chat-client.tsx +3 -13
- package/examples/playground/app/chat/model.ts +2 -2
- package/examples/playground/app/chat/server.ts +24 -17
- package/examples/playground/app/globals.css +179 -0
- package/examples/playground/package.json +1 -1
- package/package.json +1 -1
- package/src/ai-client-state.ts +185 -0
- package/src/ai-control-server.ts +829 -0
- package/src/ai-control-state.ts +152 -0
- package/src/ai-control.ts +139 -0
- package/src/ai-coordinator.ts +99 -32
- package/src/ai-progress-batches.ts +68 -0
- package/src/ai-projector.ts +76 -15
- package/src/ai-sdk-step.ts +0 -1
- package/src/ai-server.ts +381 -608
- package/src/ai.ts +553 -108
- package/src/client.ts +31 -9
- package/src/licenses/Apache-2.0.txt +55 -0
- package/src/parse-partial-json.ts +441 -0
- package/src/reducer.ts +6 -0
- package/src/server.ts +8 -4
- package/src/store-postgres.ts +27 -0
- package/src/store-redis-core.ts +53 -1
- package/src/store-redis-notify.ts +1 -0
- package/src/store.ts +6 -0
- package/dist/ai.d.ts.map +0 -1
- package/dist/client-Bf6uSEAk.js.map +0 -1
- package/dist/contract-48bUMgcL.js.map +0 -1
- package/dist/server-BeNADlCI.js.map +0 -1
- package/dist/store-redis-notify-BUCyXOn0.js.map +0 -1
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 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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"}
|
|
1
|
+
{"version":3,"file":"ai.js","names":["isRecord","createContract"],"sources":["../src/ai-client-state.ts","../src/parse-partial-json.ts","../src/ai-projector.ts","../src/ai-progress-batches.ts","../src/ai.ts"],"sourcesContent":["import type { UIMessage } from 'ai'\nimport type { AIState } from './ai.ts'\nimport type { ControlCommand, InboxItem } from './ai-control.ts'\n\nexport type QueueCommand<M extends UIMessage> = Extract<\n ControlCommand<M>,\n {\n action:\n | 'send'\n | 'edit'\n | 'move'\n | 'remove'\n | 'send-now'\n | 'steer'\n | 'pause'\n | 'resume'\n }\n>\nexport type PendingQueueCommand<M extends UIMessage> = {\n commandId: string\n command: QueueCommand<M>\n}\n\nexport const isQueueCommand = <M extends UIMessage>(\n command: ControlCommand<M>,\n): command is QueueCommand<M> =>\n command.action === 'send' ||\n command.action === 'edit' ||\n command.action === 'move' ||\n command.action === 'remove' ||\n command.action === 'send-now' ||\n command.action === 'steer' ||\n command.action === 'pause' ||\n command.action === 'resume'\n\nconst moveItem = <M extends UIMessage>({\n items,\n inputId,\n beforeId,\n}: {\n items: InboxItem<M>[]\n inputId: string\n beforeId: string | null\n}): InboxItem<M>[] => {\n const from = items.findIndex((item) => item.id === inputId)\n if (\n from < 0 ||\n inputId === beforeId ||\n (beforeId !== null && !items.some((item) => item.id === beforeId))\n )\n return items\n const next = [...items]\n const [item] = next.splice(from, 1)\n const to =\n beforeId === null\n ? next.length\n : next.findIndex((entry) => entry.id === beforeId)\n next.splice(to, 0, item!)\n return next\n}\n\nexport function projectAIClientState<M extends UIMessage>(\n state: AIState<M>,\n): AIState<M> {\n const pending = state.pendingQueueCommands ?? []\n if (state.status === 'closed') return state\n if (\n pending.length === 0 &&\n !state.inbox.items.some((item) => item.afterStepOf !== undefined)\n )\n return state\n let messages = state.messages\n let { items, paused } = state.inbox\n let turnId = state.active?.turnId ?? null\n let starting = false\n let suspended =\n state.active?.phase === 'paused' || state.active?.phase === 'pausing'\n let messageIds: Set<string> | undefined\n const show = (message: M): void => {\n messageIds ??= new Set(messages.map((item) => item.id))\n if (messageIds.has(message.id)) return\n if (messages === state.messages) messages = state.messages.slice()\n messages.push(message)\n messageIds.add(message.id)\n }\n const admit = (): void => {\n if (turnId !== null || paused || items.length === 0) return\n let count = 0\n for (const item of items) {\n count += 1\n show(item.message)\n if (item.generate) {\n turnId = item.id\n starting = true\n suspended = false\n break\n }\n }\n if (count > 0) items = items.slice(count)\n }\n for (const { command } of pending) {\n switch (command.action) {\n case 'send':\n case 'steer': {\n if (\n items.some((item) => item.id === command.message.id) ||\n turnId === command.message.id\n )\n break\n const item = {\n ...(command.action === 'steer'\n ? { afterStepOf: command.turnId }\n : {}),\n id: command.message.id,\n revision: 0,\n message: command.message,\n generate:\n command.message.role === 'user' &&\n (command.action === 'steer' || command.generate !== false),\n }\n items = command.action === 'steer' ? [item, ...items] : [...items, item]\n break\n }\n case 'edit':\n items = items.map((item) =>\n item.id === command.message.id &&\n item.revision === command.expectedRevision &&\n item.message.role === command.message.role\n ? { ...item, message: command.message }\n : item,\n )\n break\n case 'move':\n items = moveItem({\n items,\n inputId: command.inputId,\n beforeId: command.beforeId,\n })\n break\n case 'remove':\n items = items.filter((item) => item.id !== command.inputId)\n break\n case 'send-now': {\n if (turnId !== command.turnId) break\n const selected = items.find((item) => item.id === command.inputId)\n if (!selected || selected.message.role !== 'user') break\n items = items.map((item) =>\n item.id === selected.id\n ? {\n ...item,\n generate: true,\n ...(turnId === null ? {} : { afterStepOf: turnId }),\n }\n : item,\n )\n items = moveItem({\n items,\n inputId: command.inputId,\n beforeId: items[0]?.id ?? null,\n })\n break\n }\n case 'pause':\n paused = true\n if (command.when === 'now') suspended = true\n break\n case 'resume':\n paused = false\n suspended = false\n break\n }\n admit()\n }\n items = items.filter((item) => {\n if (item.afterStepOf === undefined) return true\n show(item.message)\n return false\n })\n return {\n ...state,\n messages,\n inbox: { items, paused },\n starting: starting && !suspended,\n }\n}\n","/*!\n * Adapted from AI SDK 7.0.58, packages/ai/src/util/fix-json.ts.\n * Source: https://github.com/vercel/ai, packages/ai/src/util/fix-json.ts.\n * Modified to expose a synchronous partial parser with strict TypeScript types.\n * Also preserves positive exponents in unfinished containers.\n * Copyright 2023 Vercel, Inc.\n * @license Apache-2.0. See src/licenses/Apache-2.0.txt.\n */\n\nexport function parsePartialJSON(text: string | undefined): unknown {\n if (text === undefined || text.trim() === '') return undefined\n try {\n return JSON.parse(text) as unknown\n } catch {\n try {\n return JSON.parse(repairPartialJSON(text)) as unknown\n } catch {\n return undefined\n }\n }\n}\n\ntype State =\n | 'ROOT'\n | 'FINISH'\n | 'INSIDE_STRING'\n | 'INSIDE_STRING_ESCAPE'\n | 'INSIDE_STRING_UNICODE_ESCAPE'\n | 'INSIDE_LITERAL'\n | 'INSIDE_NUMBER'\n | 'INSIDE_OBJECT_START'\n | 'INSIDE_OBJECT_KEY'\n | 'INSIDE_OBJECT_AFTER_KEY'\n | 'INSIDE_OBJECT_BEFORE_VALUE'\n | 'INSIDE_OBJECT_AFTER_VALUE'\n | 'INSIDE_OBJECT_AFTER_COMMA'\n | 'INSIDE_ARRAY_START'\n | 'INSIDE_ARRAY_AFTER_VALUE'\n | 'INSIDE_ARRAY_AFTER_COMMA'\n\nconst isHexDigit = (char: string): boolean =>\n (char >= '0' && char <= '9') ||\n (char >= 'A' && char <= 'F') ||\n (char >= 'a' && char <= 'f')\n\nfunction repairPartialJSON(input: string): string {\n const stack: State[] = ['ROOT']\n let lastValidIndex = -1\n let literalStart: number | null = null\n let unicodeEscapeDigits = 0\n\n function processValueStart(char: string, i: number, swapState: State) {\n {\n switch (char) {\n case '\"': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_STRING')\n break\n }\n\n case 'f':\n case 't':\n case 'n': {\n lastValidIndex = i\n literalStart = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_LITERAL')\n break\n }\n\n case '-': {\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_NUMBER')\n break\n }\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_NUMBER')\n break\n }\n\n case '{': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_OBJECT_START')\n break\n }\n\n case '[': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_ARRAY_START')\n break\n }\n }\n }\n }\n\n function processAfterObjectValue(char: string, i: number) {\n switch (char) {\n case ',': {\n stack.pop()\n stack.push('INSIDE_OBJECT_AFTER_COMMA')\n break\n }\n case '}': {\n lastValidIndex = i\n stack.pop()\n break\n }\n }\n }\n\n function processAfterArrayValue(char: string, i: number) {\n switch (char) {\n case ',': {\n stack.pop()\n stack.push('INSIDE_ARRAY_AFTER_COMMA')\n break\n }\n case ']': {\n lastValidIndex = i\n stack.pop()\n break\n }\n }\n }\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i]!\n const currentState = stack[stack.length - 1]\n\n switch (currentState) {\n case 'ROOT':\n processValueStart(char, i, 'FINISH')\n break\n\n case 'INSIDE_OBJECT_START': {\n switch (char) {\n case '\"': {\n stack.pop()\n stack.push('INSIDE_OBJECT_KEY')\n break\n }\n case '}': {\n lastValidIndex = i\n stack.pop()\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_AFTER_COMMA': {\n switch (char) {\n case '\"': {\n stack.pop()\n stack.push('INSIDE_OBJECT_KEY')\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_KEY': {\n switch (char) {\n case '\"': {\n stack.pop()\n stack.push('INSIDE_OBJECT_AFTER_KEY')\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_AFTER_KEY': {\n switch (char) {\n case ':': {\n stack.pop()\n stack.push('INSIDE_OBJECT_BEFORE_VALUE')\n\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_BEFORE_VALUE': {\n processValueStart(char, i, 'INSIDE_OBJECT_AFTER_VALUE')\n break\n }\n\n case 'INSIDE_OBJECT_AFTER_VALUE': {\n processAfterObjectValue(char, i)\n break\n }\n\n case 'INSIDE_STRING': {\n switch (char) {\n case '\"': {\n stack.pop()\n lastValidIndex = i\n break\n }\n\n case '\\\\': {\n stack.push('INSIDE_STRING_ESCAPE')\n break\n }\n\n default: {\n lastValidIndex = i\n }\n }\n\n break\n }\n\n case 'INSIDE_ARRAY_START': {\n switch (char) {\n case ']': {\n lastValidIndex = i\n stack.pop()\n break\n }\n\n default: {\n lastValidIndex = i\n processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE')\n break\n }\n }\n break\n }\n\n case 'INSIDE_ARRAY_AFTER_VALUE': {\n switch (char) {\n case ',': {\n stack.pop()\n stack.push('INSIDE_ARRAY_AFTER_COMMA')\n break\n }\n\n case ']': {\n lastValidIndex = i\n stack.pop()\n break\n }\n\n default: {\n lastValidIndex = i\n break\n }\n }\n\n break\n }\n\n case 'INSIDE_ARRAY_AFTER_COMMA': {\n processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE')\n break\n }\n\n case 'INSIDE_STRING_ESCAPE': {\n stack.pop()\n\n if (char === 'u') {\n unicodeEscapeDigits = 0\n stack.push('INSIDE_STRING_UNICODE_ESCAPE')\n } else {\n lastValidIndex = i\n }\n\n break\n }\n\n case 'INSIDE_STRING_UNICODE_ESCAPE': {\n if (isHexDigit(char)) {\n unicodeEscapeDigits++\n\n if (unicodeEscapeDigits === 4) {\n stack.pop()\n lastValidIndex = i\n }\n }\n\n break\n }\n\n case 'INSIDE_NUMBER': {\n switch (char) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n lastValidIndex = i\n break\n }\n\n case 'e':\n case 'E':\n case '-':\n case '+':\n case '.': {\n break\n }\n\n case ',': {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i)\n }\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i)\n }\n\n break\n }\n\n case '}': {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i)\n }\n\n break\n }\n\n case ']': {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i)\n }\n\n break\n }\n\n default: {\n stack.pop()\n break\n }\n }\n\n break\n }\n\n case 'INSIDE_LITERAL': {\n const partialLiteral = input.substring(literalStart!, i + 1)\n\n if (\n !'false'.startsWith(partialLiteral) &&\n !'true'.startsWith(partialLiteral) &&\n !'null'.startsWith(partialLiteral)\n ) {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i)\n } else if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i)\n }\n } else {\n lastValidIndex = i\n }\n\n break\n }\n }\n }\n\n let result = input.slice(0, lastValidIndex + 1)\n\n for (let i = stack.length - 1; i >= 0; i--) {\n const state = stack[i]\n\n switch (state) {\n case 'INSIDE_STRING': {\n result += '\"'\n break\n }\n\n case 'INSIDE_OBJECT_KEY':\n case 'INSIDE_OBJECT_AFTER_KEY':\n case 'INSIDE_OBJECT_AFTER_COMMA':\n case 'INSIDE_OBJECT_START':\n case 'INSIDE_OBJECT_BEFORE_VALUE':\n case 'INSIDE_OBJECT_AFTER_VALUE': {\n result += '}'\n break\n }\n\n case 'INSIDE_ARRAY_START':\n case 'INSIDE_ARRAY_AFTER_COMMA':\n case 'INSIDE_ARRAY_AFTER_VALUE': {\n result += ']'\n break\n }\n\n case 'INSIDE_LITERAL': {\n const partialLiteral = input.substring(literalStart!, input.length)\n\n if ('true'.startsWith(partialLiteral)) {\n result += 'true'.slice(partialLiteral.length)\n } else if ('false'.startsWith(partialLiteral)) {\n result += 'false'.slice(partialLiteral.length)\n } else if ('null'.startsWith(partialLiteral)) {\n result += 'null'.slice(partialLiteral.length)\n }\n }\n }\n }\n\n return result\n}\n","import type { UIMessage, UIMessageChunk } from 'ai'\nimport { parsePartialJSON } from './parse-partial-json.ts'\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 (base === undefined\n ? { id: messageId, role: 'assistant', parts: [] }\n : {\n ...base,\n id: messageId,\n parts: base.parts.map((part) => ({ ...part })),\n }) 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\nexport type UIMessageCursor = {\n text: Record<string, number>\n reasoning: Record<string, number>\n tools: Record<string, PartialToolCall>\n}\n\nexport function projectUIMessage<M extends UIMessage>(options: {\n messageId: string\n base?: M\n chunks: readonly UIMessageChunk[]\n}): M {\n return projectUIMessageStream(options).message\n}\n\nexport function projectUIMessageStream<M extends UIMessage>(options: {\n messageId: string\n base?: M\n cursor?: UIMessageCursor\n chunks: readonly UIMessageChunk[]\n}): { message: M; cursor: UIMessageCursor } {\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(\n Object.entries(options.cursor?.text ?? {}).map(([id, index]) => [\n id,\n parts[index]!,\n ]),\n )\n const activeReasoning = new Map(\n Object.entries(options.cursor?.reasoning ?? {}).map(([id, index]) => [\n id,\n parts[index]!,\n ]),\n )\n const partialTools = new Map(\n Object.entries(options.cursor?.tools ?? {}).map(([id, partial]) => [\n id,\n { ...partial },\n ]),\n )\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: parsePartialJSON(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 (\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 const indexes = new Map(parts.map((part, index) => [part, index]))\n return {\n message,\n cursor: {\n text: Object.fromEntries(\n [...activeText].map(([id, part]) => [id, indexes.get(part)!]),\n ),\n reasoning: Object.fromEntries(\n [...activeReasoning].map(([id, part]) => [id, indexes.get(part)!]),\n ),\n tools: Object.fromEntries(partialTools),\n },\n }\n}\n\nexport function pauseUIMessage<M extends UIMessage>(options: {\n message: M\n toolCallIds: ReadonlySet<string>\n}): M {\n const next = structuredClone(options.message)\n next.parts = next.parts.filter(\n (part) =>\n !('toolCallId' in part && !options.toolCallIds.has(part.toolCallId)),\n )\n for (const part of next.parts) {\n if (\n (part.type === 'text' || part.type === 'reasoning') &&\n part.state === 'streaming'\n )\n part.state = 'done'\n }\n return next\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 next.parts = next.parts.filter((value) => {\n const part = value as unknown as MutablePart\n return !isToolPart(part) || part['state'] !== 'input-streaming'\n })\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-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","import type { UIMessageChunk } from 'ai'\n\nexport type ProgressBatch = { index: number; chunks: UIMessageChunk[] }\ntype BatchBlock = ProgressBatch[] | { left: BatchBlock; right: BatchBlock }\n\nexport type ProgressBatches = {\n length: number\n tail: ProgressBatch[]\n blocks: Array<BatchBlock | null>\n}\n\nconst PAGE_SIZE = 64\n\nexport const appendProgressBatch = ({\n batches,\n batch,\n}: {\n batches: ProgressBatches\n batch: ProgressBatch\n}): ProgressBatches => {\n if (batches.tail.length < PAGE_SIZE)\n return {\n ...batches,\n length: batches.length + 1,\n tail: [...batches.tail, batch],\n }\n\n const blocks = [...batches.blocks]\n let block: BatchBlock = batches.tail\n let level = 0\n for (;;) {\n const left = blocks[level]\n if (left == null) break\n block = { left, right: block }\n blocks[level] = null\n level += 1\n }\n blocks[level] = block\n return { length: batches.length + 1, tail: [batch], blocks }\n}\n\nexport const progressBatches = (\n items: readonly ProgressBatch[] = [],\n): ProgressBatches => {\n let batches: ProgressBatches = { length: 0, tail: [], blocks: [] }\n for (const batch of items) batches = appendProgressBatch({ batches, batch })\n return batches\n}\n\nexport const flattenProgressBatches = (\n batches: ProgressBatches,\n): ProgressBatch[] => {\n const items: ProgressBatch[] = []\n const visit = (block: BatchBlock): void => {\n if (Array.isArray(block)) items.push(...block)\n else {\n visit(block.left)\n visit(block.right)\n }\n }\n // Level n holds 2^n completed pages; higher levels contain older batches.\n for (let level = batches.blocks.length - 1; level >= 0; level -= 1) {\n const block = batches.blocks[level]\n if (block) visit(block)\n }\n items.push(...batches.tail)\n return items\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 {\n isQueueCommand,\n projectAIClientState,\n type PendingQueueCommand,\n} from './ai-client-state.ts'\nexport type { PendingQueueCommand } from './ai-client-state.ts'\nimport { applyControlChanges } from './ai-control-state.ts'\nimport { initialControlState } from './ai-control.ts'\nimport type {\n ControlCommit,\n ActiveTurn,\n ControlCommand,\n ControlReceipt,\n InboxItem,\n ToolExecutionRequest,\n WorkReport,\n} from './ai-control.ts'\nexport type {\n ActiveTurn,\n ControlCommand,\n ControlReceipt,\n InboxItem,\n} from './ai-control.ts'\nimport { contract as createContract } from './contract.ts'\nimport type { Contract, EventDefs } from './contract.ts'\nimport {\n interruptUIMessage,\n pauseUIMessage,\n projectUIMessage,\n projectUIMessageStream,\n type UIMessageCursor,\n} from './ai-projector.ts'\nimport { ambientToolScopeStorage } from './internal.ts'\nimport { clientStateProjection, type Reducer } from './reducer.ts'\nimport {\n appendProgressBatch,\n flattenProgressBatches,\n progressBatches,\n type ProgressBatches,\n} from './ai-progress-batches.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' | 'paused'\n\nexport type GenerationReason = 'message' | 'tool' | 'input' | 'retry' | 'resume'\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 control?: { turnId: string; version: number }\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.control.requested': StandardSchemaV1<ControlCommand<M>>\n 'ai.control.committed': StandardSchemaV1<ControlCommit>\n 'ai.control.decided': StandardSchemaV1<ControlReceipt>\n 'ai.work.reported': StandardSchemaV1<WorkReport>\n 'ai.tool.execution.requested': StandardSchemaV1<ToolExecutionRequest>\n 'ai.generation.paused': StandardSchemaV1<{\n generationId: string\n messageId: string\n }>\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 promptThroughIndex?: number\n cursor?: { throughIndex: number; stream: UIMessageCursor } | null\n baseCompaction?: CompactionState<M> | null\n batches: ProgressBatches\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 inbox: { paused: boolean; items: InboxItem<M>[] }\n pendingQueueCommands?: PendingQueueCommand<M>[]\n active: ActiveTurn<M> | null\n starting: boolean\n receipt: ControlReceipt | null\n pausedGenerationIds?: Record<string, true>\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.execution.requested'>\n\n/** The durable handler context supplied when A2 executes a local AI tool. */\nexport type AgentToolContext<D extends AgentToolEventDefs> = HandlerContext<\n D,\n 'ai.tool.execution.requested'\n>\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.control.requested': schema('ai.control.requested', (value) => {\n if (!isRecord(value) || !isJSONCompatible(value))\n return issue('invalid AI command')\n const action = value['action']\n const forwarded = {\n approval: ['ai.approval.responded', 'response'],\n 'tool-result': ['ai.tool.result', 'result'],\n input: ['ai.input.responded', 'response'],\n 'request-input': ['ai.input.requested', 'request'],\n retry: ['ai.retry.requested', 'request'],\n interrupt: ['ai.message.interrupted', 'request'],\n } as const\n if (typeof action === 'string' && Object.hasOwn(forwarded, action)) {\n const [type, key] = forwarded[action as keyof typeof forwarded]\n const payload = validateSync(\n definition[type] as StandardSchemaV1<unknown>,\n value[key],\n 'AI command',\n )\n if (payload.issues) return { issues: payload.issues }\n return { value: { action, [key]: payload.value } as ControlCommand<M> }\n }\n if (action === 'send' || action === 'edit' || action === 'steer') {\n const parsed = validateMessage(value['message'], messageSchema)\n if (parsed.issues) return parsed\n if (\n (action === 'edit' &&\n (!Number.isSafeInteger(value['expectedRevision']) ||\n Number(value['expectedRevision']) < 0)) ||\n (action === 'steer' &&\n (!stringField(value, 'turnId') ||\n !optionalIndexField(value, 'lastSeenIndex'))) ||\n (action === 'send' &&\n value['generate'] !== undefined &&\n typeof value['generate'] !== 'boolean')\n )\n return issue('invalid AI command')\n return {\n value: { ...value, message: parsed.value } as ControlCommand<M>,\n }\n }\n if (\n (action === 'remove' && stringField(value, 'inputId')) ||\n (action === 'send-now' &&\n stringField(value, 'inputId') &&\n (value['turnId'] === null || stringField(value, 'turnId')) &&\n optionalIndexField(value, 'lastSeenIndex')) ||\n (action === 'move' &&\n stringField(value, 'inputId') &&\n (value['beforeId'] === null || stringField(value, 'beforeId'))) ||\n (action === 'stop' &&\n stringField(value, 'turnId') &&\n optionalIndexField(value, 'lastSeenIndex')) ||\n (action === 'pause' &&\n (value['when'] === 'now' || value['when'] === 'after-turn')) ||\n action === 'resume'\n )\n return { value: value as ControlCommand<M> }\n return issue('invalid AI command')\n }),\n 'ai.control.committed': jsonObject(\n 'ai.control.committed',\n (value) => Array.isArray(value['changes']) && isRecord(value['view']),\n ),\n 'ai.control.decided': jsonObject(\n 'ai.control.decided',\n (value) =>\n stringField(value, 'commandId') &&\n (value['outcome'] === 'applied' || value['outcome'] === 'rejected'),\n ),\n 'ai.work.reported': schema('ai.work.reported', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'workId') ||\n !stringField(value, 'turnId') ||\n typeof value['version'] !== 'number' ||\n !optionalIndexField(value, 'version') ||\n typeof value['attempt'] !== 'number' ||\n !Number.isSafeInteger(value['attempt']) ||\n value['attempt'] < 1 ||\n typeof value['settled'] !== 'boolean' ||\n (value['kind'] !== 'model' && value['kind'] !== 'tool') ||\n !Array.isArray(value['events'])\n )\n return issue('invalid AI work report')\n const allowed = new Set([\n 'ai.generation.started',\n 'ai.generation.completed',\n 'ai.generation.failed',\n 'ai.tool.called',\n 'ai.tool.result',\n 'ai.approval.requested',\n 'ai.approval.responded',\n 'ai.compaction.requested',\n 'ai.compaction.completed',\n 'ai.model.metadata.requested',\n ])\n const events: WorkReport['events'] = []\n for (const event of value['events']) {\n if (\n !isRecord(event) ||\n !stringField(event, 'id') ||\n typeof event['type'] !== 'string' ||\n !allowed.has(event['type']) ||\n (value['kind'] === 'tool' && event['type'] !== 'ai.tool.result')\n )\n return issue('invalid AI work fact')\n const parsed = validateSync(\n definition[\n event['type'] as keyof AIEventDefs<M>\n ] as StandardSchemaV1<unknown>,\n event['payload'],\n 'AI work fact',\n )\n if (parsed.issues) return { issues: parsed.issues }\n events.push({\n id: event['id'] as string,\n type: event['type'],\n payload: parsed.value,\n })\n }\n return { value: { ...value, events } as WorkReport }\n }),\n 'ai.tool.execution.requested': jsonObject(\n 'ai.tool.execution.requested',\n (value) =>\n stringField(value, 'turnId') &&\n optionalIndexField(value, 'version') &&\n isRecord(value['call']) &&\n isRecord(value['generation']),\n ),\n 'ai.generation.paused': jsonObject(\n 'ai.generation.paused',\n (value) =>\n stringField(value, 'generationId') && stringField(value, 'messageId'),\n ),\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 value['reason'] === 'resume'),\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 inbox: initialControlState<M>().inbox,\n pendingQueueCommands: [],\n active: null,\n starting: false,\n receipt: null,\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 upsertResponse = <M extends UIMessage>(options: {\n messages: M[]\n message: M\n inputId: string\n}): M[] => {\n const { messages, message, inputId } = options\n if (messages.some((item) => item.id === message.id))\n return upsertMessage(messages, message)\n const inputIndex = messages.findIndex((item) => item.id === inputId)\n if (inputIndex === -1) return [...messages, message]\n return [\n ...messages.slice(0, inputIndex + 1),\n message,\n ...messages.slice(inputIndex + 1),\n ]\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 projectedMessageStream = <M extends UIMessage>(\n projection: ActiveGenerationProjection<M>,\n): { message: M; cursor: UIMessageCursor } => {\n const projectionEvents = flattenProgressBatches(projection.batches)\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 projectUIMessageStream({\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 projectedMessage = <M extends UIMessage>(\n projection: ActiveGenerationProjection<M>,\n): M => projectedMessageStream(projection).message\n\nconst projectedResponse = <M extends UIMessage>(options: {\n state: AIState<M>\n projection: ActiveGenerationProjection<M>\n}): M => {\n const message = projectedMessage(options.projection)\n return options.state.pausedGenerationIds?.[options.projection.generationId]\n ? pauseUIMessage({\n message,\n toolCallIds: new Set(\n options.state.tools.map((tool) => tool.toolCallId),\n ),\n })\n : message\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: progressBatches(\n flattenProgressBatches(projection.batches).filter(\n (batch) => batch.index <= cutoff,\n ),\n ),\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 state.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.control.requested': {\n const command = event.payload as ControlCommand<M>\n if (!event.id || !isQueueCommand(command)) return state\n const pending = state.pendingQueueCommands ?? []\n if (pending.some((item) => item.commandId === event.id)) return state\n if (\n (command.action === 'send' || command.action === 'steer') &&\n (state.messages.some((message) => message.id === command.message.id) ||\n state.inbox.items.some((item) => item.id === command.message.id))\n )\n return state\n return {\n ...state,\n pendingQueueCommands: [...pending, { commandId: event.id, command }],\n }\n }\n case 'ai.control.committed': {\n const commit = event.payload as ControlCommit\n const visible = applyControlChanges({\n state: { inbox: state.inbox, active: state.active },\n changes: commit.changes.filter(\n (change) => change.path[0] === 'inbox' || change.path[0] === 'active',\n ),\n })\n const { phase } = commit.view\n const status: AgentStatus = commit.view.closed\n ? 'closed'\n : phase === 'paused' ||\n phase === 'pausing' ||\n (commit.view.paused && phase === null)\n ? 'paused'\n : phase === 'failed'\n ? 'failed'\n : phase === 'starting' || phase === 'generating'\n ? 'generating'\n : phase\n ? 'waiting'\n : 'idle'\n return {\n ...state,\n ...visible,\n status,\n activeRequestId: commit.view.requestId,\n activeResponseMessageId: commit.view.responseMessageId,\n }\n }\n case 'ai.control.decided': {\n const receipt = event.payload as ControlReceipt\n if (receipt.work) return state\n const pending = state.pendingQueueCommands ?? []\n const settled = pending.find(\n (item) => item.commandId === receipt.commandId,\n )\n return {\n ...state,\n receipt,\n ...(settled === undefined\n ? {}\n : {\n pendingQueueCommands: pending.filter(\n (item) => item.commandId !== receipt.commandId,\n ),\n }),\n }\n }\n case 'ai.generation.paused': {\n const payload = event.payload as {\n generationId: string\n messageId: string\n }\n const toolCallIds = new Set(\n state.tools\n .filter((tool) => tool.messageId === payload.messageId)\n .map((tool) => tool.toolCallId),\n )\n const projection = state.activeProjection\n return {\n ...state,\n activeGeneration: null,\n activeProjection:\n projection?.generationId === payload.generationId\n ? {\n ...projection,\n cursor: null,\n batches: progressBatches(\n flattenProgressBatches(projection.batches).map((batch) => ({\n index: batch.index,\n chunks: batch.chunks.filter(\n (chunk) =>\n !('toolCallId' in chunk) ||\n toolCallIds.has(chunk.toolCallId),\n ),\n })),\n ),\n }\n : projection,\n compaction:\n state.compaction?.status === 'running'\n ? (projection?.baseCompaction ?? null)\n : state.compaction,\n messages: state.messages.map((message) =>\n message.id === payload.messageId\n ? pauseUIMessage({ message, toolCallIds })\n : message,\n ),\n pausedGenerationIds: {\n ...state.pausedGenerationIds,\n [payload.generationId]: true,\n },\n }\n }\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 active: null,\n inbox: { paused: true, items: [] },\n pendingQueueCommands: [],\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 {\n ...state,\n messages: upsertMessage(state.messages, message),\n activeProjection:\n state.activeProjection?.responseMessageId === message.id\n ? { ...state.activeProjection, cursor: null }\n : state.activeProjection,\n }\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.control !== undefined && state.activeRequestId === event.id) ||\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 promptThroughIndex: payload.promptThroughIndex ?? event.index - 1,\n ...(baseMessage === undefined ? {} : { baseMessage }),\n baseCompaction: baseState.compaction,\n batches: progressBatches(),\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 (state.pausedGenerationIds?.[payload.generationId]) return state\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 ordered =\n event.index > (activeProjection.batches.tail.at(-1)?.index ?? -1)\n const projection: ActiveGenerationProjection<M> = {\n ...activeProjection,\n batches: ordered\n ? appendProgressBatch({\n batches: activeProjection.batches,\n batch: { index: event.index, chunks: payload.chunks },\n })\n : progressBatches(\n [\n ...flattenProgressBatches(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 }\n const base = state.messages.find(\n (message) => message.id === projection.responseMessageId,\n )\n const incremental =\n base !== undefined &&\n activeProjection.cursor != null &&\n event.index > activeProjection.cursor.throughIndex\n const projected = incremental\n ? projectUIMessageStream({\n messageId: projection.responseMessageId,\n base,\n cursor: activeProjection.cursor!.stream,\n chunks: payload.chunks,\n })\n : projectedMessageStream(projection)\n projection.cursor = {\n throughIndex: incremental\n ? event.index\n : Math.max(\n event.index,\n projection.batches.tail.at(-1)?.index ?? 0,\n projection.toolEvents.reduce(\n (index, entry) => Math.max(index, entry.index),\n 0,\n ),\n projection.approvalEvents.reduce(\n (index, entry) => Math.max(index, entry.index),\n 0,\n ),\n ),\n stream: projected.cursor,\n }\n return {\n ...state,\n messages: upsertResponse({\n messages: state.messages,\n message: projected.message,\n inputId: state.activeGeneration.messageId,\n }),\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 cursor: null,\n toolEvents: [\n ...projection.toolEvents,\n { index: event.index, type: 'ai.tool.result', payload },\n ],\n }\n const projected = projectedResponse({\n state,\n projection: activeProjection,\n })\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 cursor: null,\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(\n state.messages,\n projectedResponse({ state, projection: activeProjection }),\n ),\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 cursor: null,\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(\n state.messages,\n projectedResponse({ state, projection: activeProjection }),\n ),\n activeProjection:\n activeProjection === null\n ? null\n : { ...activeProjection, cursor: null },\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: {\n status: 'completed',\n ...payload,\n throughIndex:\n payload.throughIndex ?? state.activeProjection!.promptThroughIndex!,\n },\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 const reducer = options.contract\n .reducer({\n name: options.name ?? 'a2.ai.state.v17',\n initialState: initialState<M>(),\n })\n .fold((state, event) => reduceAIState(state, event))\n return { ...reducer, [clientStateProjection]: projectAIClientState }\n}\n\ntype CommandInput<C> = { type: 'ai.control.requested'; payload: C; id?: string }\ntype ControlInput<\n M extends UIMessage,\n A extends ControlCommand<M>['action'],\n> = CommandInput<Extract<ControlCommand<M>, { action: A }>>\n\nexport type AIInputs = {\n message<M extends UIMessage>(\n message: M,\n options?: { generate?: boolean },\n ): ControlInput<M, 'send'>[]\n seed<M extends UIMessage>(message: M): ControlInput<M, 'send'>[]\n queue: {\n remove(options: { inputId: string }): ControlInput<UIMessage, 'remove'>[]\n sendNow(options: {\n inputId: string\n turnId: string | null\n lastSeenIndex?: number\n }): ControlInput<UIMessage, 'send-now'>[]\n edit<M extends UIMessage>(options: {\n message: M\n expectedRevision: number\n }): ControlInput<M, 'edit'>[]\n move(options: {\n inputId: string\n beforeId: string | null\n }): ControlInput<UIMessage, 'move'>[]\n }\n stop(options: {\n turnId: string\n lastSeenIndex?: number\n }): ControlInput<UIMessage, 'stop'>[]\n steer<M extends UIMessage>(options: {\n turnId: string\n message: M\n lastSeenIndex?: number\n }): ControlInput<M, 'steer'>[]\n pause(options: {\n when: 'now' | 'after-turn'\n }): ControlInput<UIMessage, 'pause'>[]\n resume(): ControlInput<UIMessage, 'resume'>[]\n approval(\n response: ApprovalRespondedPayload,\n ): ControlInput<UIMessage, 'approval'>[]\n input(response: InputRespondedPayload): ControlInput<UIMessage, 'input'>[]\n requestInput(\n request: InputRequestedPayload,\n ): ControlInput<UIMessage, 'request-input'>[]\n retry(request: RetryGenerationOptions): ControlInput<UIMessage, 'retry'>[]\n interrupt(\n request: MessageInterruptedPayload,\n ): ControlInput<UIMessage, 'interrupt'>[]\n toolResult(\n result: ToolResultPayload,\n ): ControlInput<UIMessage, 'tool-result'>[]\n}\n\nconst commandInput = <C extends ControlCommand<UIMessage>>(\n payload: C,\n): CommandInput<C>[] => [{ type: 'ai.control.requested', payload }]\nconst messageInput = <M extends UIMessage>(\n message: M,\n generate?: boolean,\n): ControlInput<M, 'send'>[] => [\n {\n type: 'ai.control.requested',\n id: `ai.message:${message.id}`,\n payload: {\n action: 'send',\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 toolResult: (result) => commandInput({ action: 'tool-result', result }),\n queue: {\n remove: (options) => commandInput({ action: 'remove', ...options }),\n sendNow: (options) => commandInput({ action: 'send-now', ...options }),\n edit: (options) => commandInput({ action: 'edit', ...options }),\n move: (options) => commandInput({ action: 'move', ...options }),\n },\n stop: (options) => commandInput({ action: 'stop', ...options }),\n steer: (options) => commandInput({ action: 'steer', ...options }),\n pause: (options) => commandInput({ action: 'pause', ...options }),\n resume: () => commandInput({ action: 'resume' }),\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 {\n ...commandInput({ action: 'approval', response })[0]!,\n id: `ai.approval:${encodeURIComponent(response.messageId)}:${encodeURIComponent(response.generationId)}:${encodeURIComponent(response.approvalId)}:response`,\n },\n ],\n input: (response) => [\n {\n ...commandInput({ action: 'input', response })[0]!,\n id: `ai.input:${encodeURIComponent(response.messageId)}:${encodeURIComponent(response.generationId)}:${encodeURIComponent(response.inputId)}:response`,\n },\n ],\n requestInput: (request) => [\n {\n ...commandInput({ action: 'request-input', request })[0]!,\n id: `ai.input:${encodeURIComponent(request.messageId)}:${encodeURIComponent(request.generationId)}:${encodeURIComponent(request.inputId)}:request`,\n },\n ],\n retry: (request) => [\n {\n ...commandInput({ action: 'retry', request })[0]!,\n id: `ai.retry:${request.retryId}`,\n },\n ],\n interrupt: (request) => [\n {\n ...commandInput({ action: 'interrupt', request })[0]!,\n id: `ai.interrupt:${request.generationId ?? request.requestId}`,\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.v17',\n initialState: initialState<M>(),\n })\n .fold((state, event) => reduceAIState(state, event))\n\n const definition = {\n contract: agentContract,\n reducer: { ...reducer, [clientStateProjection]: projectAIClientState<M> },\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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"}
|