experimental-a2 0.17.0 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +1 -1
- package/dist/{actor-DBbe5xeE.d.ts → actor-C7b-1arn.d.ts} +5 -5
- package/dist/{actor-DBbe5xeE.d.ts.map → actor-C7b-1arn.d.ts.map} +1 -1
- package/dist/actor-client.d.ts +1 -1
- package/dist/actor-react.d.ts +3 -3
- package/dist/actor-react.js +1 -1
- package/dist/actor.d.ts +1 -1
- package/dist/actor.js +2 -2
- package/dist/{ai-vpGtcaCB.d.ts → ai-BMLlI2Ff.d.ts} +3 -3
- package/dist/{ai-vpGtcaCB.d.ts.map → ai-BMLlI2Ff.d.ts.map} +1 -1
- package/dist/{ai-UrWfKeuv.js → ai-D6mGlO8j.js} +2 -2
- package/dist/{ai-UrWfKeuv.js.map → ai-D6mGlO8j.js.map} +1 -1
- package/dist/ai-client.d.ts +2 -2
- package/dist/ai-client.js +2 -2
- package/dist/ai-fx.browser.d.ts +1 -0
- package/dist/ai-fx.browser.js +6 -0
- package/dist/ai-fx.browser.js.map +1 -0
- package/dist/ai-fx.d.ts +10 -0
- package/dist/ai-fx.d.ts.map +1 -0
- package/dist/ai-fx.js +692 -0
- package/dist/ai-fx.js.map +1 -0
- package/dist/ai-harness-B2suP2Qh.d.ts +26 -0
- package/dist/ai-harness-B2suP2Qh.d.ts.map +1 -0
- package/dist/ai-harness-BuLh_EYi.js +273 -0
- package/dist/ai-harness-BuLh_EYi.js.map +1 -0
- package/dist/ai-pi.browser.d.ts +1 -0
- package/dist/ai-pi.browser.js +6 -0
- package/dist/ai-pi.browser.js.map +1 -0
- package/dist/ai-pi.d.ts +17 -0
- package/dist/ai-pi.d.ts.map +1 -0
- package/dist/ai-pi.js +950 -0
- package/dist/ai-pi.js.map +1 -0
- package/dist/ai-react.d.ts +5 -5
- package/dist/ai-react.js +2 -2
- package/dist/ai-server.d.ts +47 -25
- package/dist/ai-server.d.ts.map +1 -1
- package/dist/ai-server.js +113 -40
- package/dist/ai-server.js.map +1 -1
- package/dist/ai-tool-input-DmSqMUQi.js +40 -0
- package/dist/ai-tool-input-DmSqMUQi.js.map +1 -0
- package/dist/ai.d.ts +1 -1
- package/dist/ai.js +1 -1
- package/dist/bounded-cache-CPHWF-8h.js +41 -0
- package/dist/bounded-cache-CPHWF-8h.js.map +1 -0
- package/dist/{client-COaiaDub.js → client-BhHLoNKF.js} +3 -3
- package/dist/{client-COaiaDub.js.map → client-BhHLoNKF.js.map} +1 -1
- package/dist/{client-qRnRUzBS.d.ts → client-h_DKFAjj.d.ts} +3 -3
- package/dist/{client-qRnRUzBS.d.ts.map → client-h_DKFAjj.d.ts.map} +1 -1
- package/dist/client.d.ts +3 -3
- package/dist/client.js +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/{initial-snapshot-BrLso5x_.d.ts → initial-snapshot-Bx-c0pDP.d.ts} +2 -2
- package/dist/{initial-snapshot-BrLso5x_.d.ts.map → initial-snapshot-Bx-c0pDP.d.ts.map} +1 -1
- package/dist/{internal-CbVvEwad.js → internal-CscSY7K_.js} +11 -3
- package/dist/internal-CscSY7K_.js.map +1 -0
- package/dist/otel.d.ts +1 -1
- package/dist/{react-BbJ-g6Uu.d.ts → react-BBXgHWFc.d.ts} +4 -4
- package/dist/{react-BbJ-g6Uu.d.ts.map → react-BBXgHWFc.d.ts.map} +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +1 -1
- package/dist/reducer-BAXc8JyF.js.map +1 -1
- package/dist/{reducer-BYu6DT7h.d.ts → reducer-CqA59Q6U.d.ts} +2 -2
- package/dist/{reducer-BYu6DT7h.d.ts.map → reducer-CqA59Q6U.d.ts.map} +1 -1
- package/dist/scheduler-qstash.d.ts +2 -2
- package/dist/scheduler-qstash.js +3 -3
- package/dist/scheduler-qstash.js.map +1 -1
- package/dist/scheduler-vercel.d.ts +7 -7
- package/dist/scheduler-vercel.d.ts.map +1 -1
- package/dist/scheduler-vercel.js +9 -10
- package/dist/scheduler-vercel.js.map +1 -1
- package/dist/{server-Rj64fNvX.js → server-D-Y4pqwu.js} +126 -67
- package/dist/server-D-Y4pqwu.js.map +1 -0
- package/dist/{server-CGM8WzRG.d.ts → server-DYAATFuT.d.ts} +42 -7
- package/dist/server-DYAATFuT.d.ts.map +1 -0
- package/dist/server.d.ts +4 -4
- package/dist/server.js +1 -1
- package/dist/{session-clear-Dshpuhff.d.ts → session-clear-C-QwTXV1.d.ts} +2 -2
- package/dist/session-clear-C-QwTXV1.d.ts.map +1 -0
- package/dist/{store-Gpkq7WBo.d.ts → store-CyLUy86v.d.ts} +53 -5
- package/dist/store-CyLUy86v.d.ts.map +1 -0
- package/dist/store-N8PXxDAS.js.map +1 -1
- package/dist/store-memory.d.ts +1 -1
- package/dist/store-memory.js +56 -11
- package/dist/store-memory.js.map +1 -1
- package/dist/{store-polling-4_y8lETm.js → store-polling-7WJV0YWP.js} +2 -2
- package/dist/{store-polling-4_y8lETm.js.map → store-polling-7WJV0YWP.js.map} +1 -1
- package/dist/store-postgres.d.ts +1 -1
- package/dist/store-postgres.d.ts.map +1 -1
- package/dist/store-postgres.js +106 -25
- package/dist/store-postgres.js.map +1 -1
- package/dist/{store-presence-polling-Q1C-k2dd.js → store-presence-polling-B1ixeqIS.js} +3 -3
- package/dist/{store-presence-polling-Q1C-k2dd.js.map → store-presence-polling-B1ixeqIS.js.map} +1 -1
- package/dist/store-redis-http.d.ts +1 -1
- package/dist/store-redis-http.js +3 -3
- package/dist/{store-redis-notify-tqWNnMRu.js → store-redis-notify-CM0AfLY0.js} +271 -101
- package/dist/store-redis-notify-CM0AfLY0.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/dist/store-sqlite.js +66 -21
- package/dist/store-sqlite.js.map +1 -1
- package/dist/{telemetry-cZH-cibj.d.ts → telemetry-Cyfqo6Qt.d.ts} +2 -2
- package/dist/telemetry-Cyfqo6Qt.d.ts.map +1 -0
- package/dist/{wire-DjfHOvdW.js → wire-BKxH1vbP.js} +2 -2
- package/dist/{wire-DjfHOvdW.js.map → wire-BKxH1vbP.js.map} +1 -1
- package/docs/01-quickstart.mdx +49 -83
- package/docs/{guides/07-examples.mdx → 02-examples.mdx} +10 -20
- package/docs/actors/01-introduction.mdx +48 -86
- package/docs/actors/02-concurrency.mdx +43 -70
- package/docs/actors/03-timers.mdx +28 -42
- package/docs/actors/04-routes.mdx +110 -150
- package/docs/actors/meta.ts +1 -1
- package/docs/agents/01-introduction.mdx +257 -0
- package/docs/agents/02-tools.mdx +247 -0
- package/docs/agents/03-conversations.mdx +538 -0
- package/docs/agents/04-harnesses.mdx +136 -0
- package/docs/agents/meta.ts +1 -0
- package/docs/client/01-react.mdx +294 -0
- package/docs/client/02-transports.mdx +86 -0
- package/docs/client/03-presence.mdx +224 -0
- package/docs/client/meta.ts +1 -0
- package/docs/contract/01-events.mdx +57 -0
- package/docs/contract/02-state.mdx +142 -0
- package/docs/contract/03-sessions.mdx +175 -0
- package/docs/index.mdx +109 -145
- package/docs/reference/01-core.mdx +139 -0
- package/docs/reference/02-server.mdx +860 -0
- package/docs/reference/03-client.mdx +301 -0
- package/docs/reference/04-ai.mdx +731 -0
- package/docs/reference/05-adapters.mdx +351 -0
- package/docs/reference/06-errors.mdx +138 -0
- package/docs/reference/meta.ts +1 -1
- package/docs/server/01-handlers.mdx +200 -0
- package/docs/server/02-timers.mdx +130 -0
- package/docs/server/03-cancellation.mdx +142 -0
- package/docs/server/04-routes.mdx +243 -0
- package/docs/server/05-production.mdx +323 -0
- package/docs/server/06-guarantees.mdx +132 -0
- package/examples/playground/DEPLOY.md +3 -5
- package/examples/playground/app/a0/[appId]/page.tsx +12 -13
- package/examples/playground/app/a0/app-list.tsx +9 -2
- package/examples/playground/app/a0/app-view.tsx +9 -1
- package/examples/playground/app/a0/apps/[appId]/route.ts +10 -5
- package/examples/playground/app/a0/apps.test.ts +12 -0
- package/examples/playground/app/a0/apps.ts +22 -7
- package/examples/playground/app/a0/chat.tsx +47 -1
- package/examples/playground/app/a0/devtools.tsx +2 -8
- package/examples/playground/app/a0/fx/events/route.ts +9 -0
- package/examples/playground/app/a0/fx/scheduler/route.ts +7 -0
- package/examples/playground/app/a0/fx/short/events/route.ts +11 -0
- package/examples/playground/app/a0/model.test.ts +18 -1
- package/examples/playground/app/a0/model.ts +47 -10
- package/examples/playground/app/a0/no-photon.cjs +4 -0
- package/examples/playground/app/a0/no-quickjs.cjs +3 -0
- package/examples/playground/app/a0/pi/events/route.ts +9 -0
- package/examples/playground/app/a0/pi/scheduler/route.ts +7 -0
- package/examples/playground/app/a0/pi/short/events/route.ts +11 -0
- package/examples/playground/app/a0/sandbox-log.ts +10 -4
- package/examples/playground/app/a0/sandbox-session.ts +152 -0
- package/examples/playground/app/a0/scheduler/route.ts +2 -2
- package/examples/playground/app/a0/server.ts +98 -54
- package/examples/playground/app/a0/session.ts +17 -5
- package/examples/playground/app/a0/shell.tsx +11 -3
- package/examples/playground/app/agent/ingress.test.ts +6 -3
- package/examples/playground/app/agent/server.ts +9 -6
- package/examples/playground/app/agent/telemetry.test.ts +71 -50
- package/examples/playground/app/canvas/[canvasId]/canvas-client.tsx +1 -1
- package/examples/playground/app/chat/server.test.ts +30 -26
- package/examples/playground/app/chat/server.ts +46 -46
- package/examples/playground/next.config.ts +17 -5
- package/examples/playground/package.json +4 -1
- package/examples/playground/vercel.json +18 -0
- package/package.json +27 -3
- package/src/ai-agent.ts +271 -90
- package/src/ai-fx.browser.ts +5 -0
- package/src/ai-fx.ts +912 -0
- package/src/ai-harness.ts +518 -0
- package/src/ai-model-metadata.ts +11 -6
- package/src/ai-pi.browser.ts +5 -0
- package/src/ai-pi.ts +1322 -0
- package/src/ai-sdk-step.ts +2 -2
- package/src/ai-server.ts +3 -1
- package/src/ai-tool-input.ts +45 -0
- package/src/internal.ts +13 -0
- package/src/libfx.d.ts +34 -0
- package/src/reducer.ts +1 -1
- package/src/scheduler-qstash.ts +5 -5
- package/src/scheduler-vercel.ts +14 -15
- package/src/server.ts +233 -29
- package/src/store-memory.ts +92 -16
- package/src/store-postgres.ts +156 -25
- package/src/store-redis-core.ts +322 -110
- package/src/store-redis-notify.ts +2 -0
- package/src/store-sqlite.ts +121 -28
- package/src/store.ts +55 -3
- package/src/telemetry.ts +1 -0
- package/dist/internal-CbVvEwad.js.map +0 -1
- package/dist/server-CGM8WzRG.d.ts.map +0 -1
- package/dist/server-Rj64fNvX.js.map +0 -1
- package/dist/session-clear-Dshpuhff.d.ts.map +0 -1
- package/dist/store-Gpkq7WBo.d.ts.map +0 -1
- package/dist/store-redis-notify-tqWNnMRu.js.map +0 -1
- package/dist/telemetry-cZH-cibj.d.ts.map +0 -1
- package/docs/concepts/01-contracts.mdx +0 -237
- package/docs/concepts/02-handlers.mdx +0 -284
- package/docs/concepts/03-durability.mdx +0 -314
- package/docs/concepts/04-state.mdx +0 -209
- package/docs/guides/01-timers.mdx +0 -193
- package/docs/guides/02-cancellation.mdx +0 -161
- package/docs/guides/03-react.mdx +0 -324
- package/docs/guides/04-local-first.mdx +0 -47
- package/docs/guides/05-production.mdx +0 -534
- package/docs/guides/06-ai-agents.mdx +0 -1408
- package/docs/guides/08-application-data.mdx +0 -113
- package/docs/guides/09-presence.mdx +0 -262
- package/docs/guides/10-transports.mdx +0 -221
- package/docs/reference/01-api.mdx +0 -2358
- package/docs/reference/02-errors.mdx +0 -150
- /package/docs/{concepts → contract}/meta.ts +0 -0
- /package/docs/{guides → server}/meta.ts +0 -0
package/dist/ai-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-server.js","names":["reducer","makeReducer","reducer","makeReducer","errorMessage","aiEvents"],"sources":["../src/ai-coordinator.ts","../src/ai-control-server.ts","../src/ai-context-schema.ts","../src/ai-context.ts","../src/ai-sdk-step.ts","../src/ai-model-metadata.ts","../src/ai-input-tokens.ts","../src/ai-agent.ts"],"sourcesContent":["import { reducer } from './reducer.ts'\nimport type { UIMessage } from 'ai'\nimport { applyControlChanges } from './ai-control-state.ts'\nimport type { ControlCommit, ControlWork } from './ai-control.ts'\nimport type {\n AIEventDefs,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationRequestedPayload,\n GenerationReason,\n GenerationStartedPayload,\n InputRequestedPayload,\n InputRespondedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport type { Reducer } from './reducer.ts'\n\ntype CompletedCall = Pick<\n ToolCalledPayload,\n | 'requestId'\n | 'generationId'\n | 'messageId'\n | 'toolCallId'\n | 'toolName'\n | 'providerExecuted'\n | 'supportsDeferredResults'\n>\n\nexport type CoordinatorCall = {\n approval?: ApprovalRequestedPayload\n response?: ApprovalRespondedPayload\n work?: ControlWork\n} & (\n | { call: ToolCalledPayload; terminal: false }\n | { call: CompletedCall; terminal: true }\n)\n\nconst completeCall = (candidate: CoordinatorCall): CoordinatorCall => {\n const {\n requestId,\n generationId,\n messageId,\n toolCallId,\n toolName,\n providerExecuted,\n supportsDeferredResults,\n } = candidate.call\n return {\n terminal: true,\n call: {\n requestId,\n generationId,\n messageId,\n toolCallId,\n toolName,\n ...(providerExecuted === undefined ? {} : { providerExecuted }),\n ...(supportsDeferredResults === undefined\n ? {}\n : { supportsDeferredResults }),\n },\n ...(candidate.work === undefined ? {} : { work: candidate.work }),\n }\n}\n\nexport type CoordinatorResponse = {\n rootMessageId: string\n responseMessageId: string\n status: 'requested' | 'generating' | 'waiting' | 'failed'\n stepCount: number\n activeRequestId?: string\n requestReason: GenerationReason\n sourceGenerationId?: string\n generation?: GenerationStartedPayload\n source?: {\n generation: GenerationStartedPayload\n }\n completion?: GenerationCompletedPayload\n failure?: GenerationFailedPayload\n calls: CoordinatorCall[]\n inputs: InputRequestedPayload[]\n inputResponse?: {\n generationId: string\n inputId: string\n name: string\n }\n}\n\nexport type AICoordinatorState = {\n closed: boolean\n unsettledTools?: Record<string, true>\n queued: Array<{ messageId: string; generate: boolean }>\n response?: CoordinatorResponse\n calibration?: { model: string; inputTokens: number; estimate: number }\n}\n\nconst updateResponse = (\n state: AICoordinatorState,\n update: (response: CoordinatorResponse) => CoordinatorResponse,\n): AICoordinatorState =>\n state.response === undefined\n ? state\n : { ...state, response: update(state.response) }\n\nexport const foldCoordinator = <M extends UIMessage, D extends EventDefs>(\n state: AICoordinatorState,\n event: ContractEvent<D>,\n): AICoordinatorState => {\n switch (event.type) {\n case 'ai.session.closed':\n return { closed: true, queued: [] }\n case 'ai.retry.requested':\n case 'ai.compaction.completed': {\n const { calibration: _, ...rest } = state\n return rest\n }\n case 'ai.message.created': {\n const payload = event.payload as MessageCreatedPayload<M>\n const message = payload.message\n if (message.role !== 'user') return state\n return {\n ...state,\n queued: [\n ...state.queued.filter((item) => item.messageId !== message.id),\n {\n messageId: message.id,\n generate: payload.generate !== false,\n },\n ],\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (request.reason === 'message') {\n const responseMessageId = request.responseMessageId\n const requested = state.queued.findIndex(\n (item) => item.messageId === request.messageId,\n )\n return {\n ...state,\n queued:\n requested < 0\n ? state.queued.filter(\n (item) => item.messageId !== request.messageId,\n )\n : state.queued.slice(requested + 1),\n response: {\n rootMessageId: request.messageId,\n responseMessageId,\n status: 'requested',\n stepCount: 0,\n activeRequestId: event.id,\n requestReason: request.reason,\n ...(request.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: request.sourceGenerationId }),\n calls: [],\n inputs: [],\n },\n }\n }\n if (\n state.response === undefined ||\n request.responseMessageId !== state.response.responseMessageId\n ) {\n return state\n }\n if (\n (request.reason === 'tool' &&\n (!continuationReady(state) ||\n request.sourceGenerationId !==\n state.response.generation?.generationId)) ||\n (request.sourceGenerationId !== undefined &&\n request.sourceGenerationId !==\n (state.response.generation ?? state.response.source?.generation)\n ?.generationId) ||\n (request.reason === 'retry' && state.response.status !== 'failed') ||\n (request.reason === 'input' &&\n state.response.inputResponse === undefined)\n ) {\n return state\n }\n return updateResponse(state, (response) => {\n const generation = response.generation ?? response.source?.generation\n return {\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'requested',\n stepCount: response.stepCount,\n activeRequestId: event.id,\n requestReason: request.reason,\n ...(request.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: request.sourceGenerationId }),\n ...(generation === undefined\n ? {}\n : {\n source: {\n generation,\n },\n }),\n calls: [],\n inputs: [],\n }\n })\n }\n case 'ai.generation.started': {\n const generation = event.payload as GenerationStartedPayload\n if (\n state.response?.responseMessageId !== generation.responseMessageId ||\n state.response.activeRequestId !== generation.requestId ||\n (state.response.generation?.requestId === generation.requestId &&\n state.response.generation.attempt >= generation.attempt)\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'generating',\n stepCount: response.stepCount,\n generation,\n ...(response.source === undefined ? {} : { source: response.source }),\n activeRequestId: generation.requestId,\n requestReason: response.requestReason,\n ...(response.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: response.sourceGenerationId }),\n calls: [],\n inputs: [],\n }))\n }\n case 'ai.generation.completed': {\n const completion = event.payload as GenerationCompletedPayload\n if (\n state.response?.generation?.requestId !== completion.requestId ||\n state.response.generation.generationId !== completion.generationId\n ) {\n return state\n }\n const next = updateResponse(state, (response) => ({\n ...response,\n status: 'waiting',\n completion,\n stepCount:\n response.stepCount + (response.completion === undefined ? 1 : 0),\n }))\n const { calibration: _, ...uncalibrated } = next\n const inputTokens = completion.usage?.inputTokens\n const estimate = completion.inputTokenEstimate\n return inputTokens !== undefined &&\n Number.isFinite(inputTokens) &&\n inputTokens >= 0 &&\n estimate !== undefined &&\n state.response.generation.model !== undefined\n ? {\n ...uncalibrated,\n calibration: {\n model: state.response.generation.model,\n inputTokens,\n estimate,\n },\n }\n : uncalibrated\n }\n case 'ai.generation.failed': {\n const failure = event.payload as GenerationFailedPayload\n const response = state.response\n const ownsActiveGeneration =\n response?.generation?.generationId === failure.generationId &&\n response.generation.requestId === failure.requestId\n const ownsActiveStepLimit =\n failure.stepLimit === true &&\n response?.requestReason === 'tool' &&\n response.sourceGenerationId === failure.generationId &&\n response.source?.generation.requestId === failure.requestId &&\n response.responseMessageId === failure.responseMessageId\n if (!ownsActiveGeneration && !ownsActiveStepLimit) {\n return state\n }\n return updateResponse(state, (current) => ({\n ...current,\n status: 'failed',\n failure,\n }))\n }\n case 'ai.message.completed': {\n const messageId = (event.payload as { messageId: string }).messageId\n if (state.response?.responseMessageId !== messageId) return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.message.interrupted': {\n const interruption = event.payload as MessageInterruptedPayload\n const response = state.response\n if (\n response?.responseMessageId !== interruption.messageId ||\n (interruption.generationId !== response.generation?.generationId &&\n interruption.requestId !== response.activeRequestId)\n )\n return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.tool.called': {\n const call = event.payload as ToolCalledPayload\n if (\n state.response?.generation?.requestId !== call.requestId ||\n state.response.generation.generationId !== call.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: [\n ...response.calls.filter(\n (candidate) => candidate.call.toolCallId !== call.toolCallId,\n ),\n { call, terminal: false },\n ],\n }))\n }\n case 'ai.approval.requested': {\n const approval = event.payload as ApprovalRequestedPayload\n if (\n state.response?.generation?.requestId !== approval.requestId ||\n state.response.generation.generationId !== approval.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === approval.toolCallId\n ? { ...candidate, approval }\n : candidate,\n ),\n }))\n }\n case 'ai.approval.responded': {\n const approval = event.payload as ApprovalRespondedPayload\n if (\n state.response?.responseMessageId !== approval.messageId ||\n state.response.generation?.requestId !== approval.requestId ||\n state.response.generation.generationId !== approval.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.approval?.approvalId === approval.approvalId\n ? { ...candidate, response: approval }\n : candidate,\n ),\n }))\n }\n case 'ai.tool.result': {\n const result = event.payload as ToolResultPayload\n if (\n result.preliminary === true ||\n state.response?.generation?.requestId !== result.requestId ||\n state.response.generation.generationId !== result.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === result.toolCallId\n ? completeCall(candidate)\n : candidate,\n ),\n }))\n }\n case 'ai.input.requested': {\n const input = event.payload as InputRequestedPayload\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.requestId !== input.requestId ||\n state.response.generation.generationId !== input.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: [\n ...response.inputs.filter(\n (candidate) =>\n candidate.messageId !== input.messageId ||\n candidate.generationId !== input.generationId ||\n candidate.inputId !== input.inputId,\n ),\n input,\n ],\n }))\n }\n case 'ai.input.responded': {\n const input = event.payload as InputRespondedPayload\n const requested = state.response?.inputs.find(\n (candidate) =>\n candidate.messageId === input.messageId &&\n candidate.generationId === input.generationId &&\n candidate.inputId === input.inputId &&\n candidate.name === input.name,\n )\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.requestId !== input.requestId ||\n state.response.generation.generationId !== input.generationId ||\n requested === undefined\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: response.inputs.filter(\n (candidate) => candidate.inputId !== input.inputId,\n ),\n inputResponse: {\n generationId: input.generationId,\n inputId: input.inputId,\n name: requested.name,\n },\n }))\n }\n default:\n return state\n }\n}\n\nexport const aiCoordinatorReducer = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(\n contract: Contract<D, Record<never, never>, unknown>,\n): Reducer<D, AICoordinatorState> =>\n reducer({\n contract: contract,\n name: 'a2.ai.coordinator.v6',\n initialState: {\n closed: false,\n queued: [],\n } as AICoordinatorState,\n }).fold((state, event) =>\n event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes\n .filter((change) => change.path[0] === 'coordinator')\n .map((change) =>\n Object.assign({}, change, { path: change.path.slice(1) }),\n ),\n })\n : state,\n )\n\nexport const continuationReady = (state: AICoordinatorState): boolean => {\n const response = state.response\n return (\n !state.closed &&\n response?.completion?.finishReason === 'tool-calls' &&\n response.generation?.generationId === response.completion.generationId &&\n response.failure === undefined &&\n response.calls.length > 0 &&\n response.calls.every(\n (call) =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n call.call.supportsDeferredResults !== true &&\n call.approval !== undefined &&\n call.response !== undefined),\n )\n )\n}\n","import { reducer as makeReducer } from './reducer.ts'\n// oxlint-disable no-await-in-loop -- work acknowledgements follow the durable stream.\nimport { applyControlChanges, controlCommit } from './ai-control-state.ts'\nimport type { ControlChange, ControlCommit } from './ai-control.ts'\nimport type { UIMessage } from 'ai'\nimport type {\n AIEventDefs,\n GenerationRequestedPayload,\n MessageInterruptedPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n continuationReady,\n foldCoordinator,\n} from './ai-coordinator.ts'\nimport {\n initialControlState,\n type AIControlState,\n type ControlCommand,\n type ControlReceipt,\n type WorkFact,\n type WorkReport,\n} from './ai-control.ts'\nimport type {\n AppendInput,\n Contract,\n ContractEvent,\n EventDefs,\n} from './contract.ts'\nimport type { HandlerContext } from './server.ts'\nimport type { Reducer } from './reducer.ts'\nimport type { AICoordinatorState, CoordinatorCall } from './ai-coordinator.ts'\nimport { validateSync } from './validate.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { A2Error } from './errors.ts'\nimport { aiEventId } from './ai-id.ts'\nimport { CONSOLE_TELEMETRY, type A2Telemetry } from './telemetry.ts'\n\nexport class ControlCancelled extends Error {}\n\nconst callReadyForModel = (call: CoordinatorCall): boolean =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n !call.call.supportsDeferredResults &&\n call.response !== undefined)\n\nconst approvalBlocksExecution = (call: CoordinatorCall): boolean =>\n call.approval !== undefined && call.response?.approved !== true\n\nexport type AIControlRuntime<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n handler(\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]>\n append(options: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]>\n settled(options: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): Promise<AppendInput<D>>\n cancelled(options: { error: unknown; signal: AbortSignal }): boolean\n reducer: Reducer<D, AIControlState<M>>\n coordinator: Reducer<D, AICoordinatorState>\n}\n\nexport const createControlRuntime = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n contract: Contract<D, Record<never, never>, unknown>\n telemetry?: A2Telemetry\n}): AIControlRuntime<M, D> => {\n const telemetry = options.telemetry ?? CONSOLE_TELEMETRY\n const reducer = makeReducer({\n contract: options.contract,\n name: 'a2.ai.control.v5',\n initialState: initialControlState<M>(),\n }).fold((state, event) => {\n if (event.type === 'ai.control.requested') {\n const command = event.payload as ControlCommand<M>\n if (command.action === 'stop')\n return {\n ...state,\n pendingStops: {\n ...state.pendingStops,\n [event.id]: command.turnId,\n },\n }\n }\n if (event.type === 'ai.control.decided') {\n const receipt = event.payload as ControlReceipt\n if (Object.hasOwn(state.pendingStops, receipt.commandId)) {\n const pendingStops = { ...state.pendingStops }\n delete pendingStops[receipt.commandId]\n return { ...state, pendingStops }\n }\n }\n return event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes,\n })\n : state\n })\n const coordinator = aiCoordinatorReducer(options.contract)\n\n const handler = async (\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]> => {\n const snapshot = await ctx.session.state(reducer, { through: 'latest' })\n const before = structuredClone(snapshot.state)\n const moves: ControlChange[] = []\n const state = structuredClone(snapshot.state)\n const facts: WorkFact[] = []\n const jobs: AppendInput<D>[] = []\n const emit = async ({\n type,\n payload,\n id,\n }: {\n type: string\n payload: unknown\n id?: string\n }): Promise<void> => {\n const fact = {\n type,\n payload,\n id:\n id ??\n (await aiEventId('a2.ai.fact', ctx.event.id, String(facts.length))),\n }\n facts.push(fact)\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n ...fact,\n } as ContractEvent<D>)\n }\n let reason: ControlReceipt['reason']\n const end = async ({\n lastSeenIndex,\n reason: interruptionReason,\n }: {\n lastSeenIndex: number | undefined\n reason: string | undefined\n }): Promise<void> => {\n const response = state.coordinator.response\n if (response === undefined) return\n const owner =\n response.generation === undefined\n ? { requestId: response.activeRequestId! }\n : { generationId: response.generation.generationId }\n await emit({\n type: 'ai.message.interrupted',\n payload: {\n messageId: response.responseMessageId,\n ...owner,\n ...(interruptionReason === undefined\n ? {}\n : { reason: interruptionReason }),\n ...(lastSeenIndex === undefined ? {} : { lastSeenIndex }),\n } satisfies MessageInterruptedPayload,\n })\n state.active = null\n }\n const insert = ({\n message,\n generate = true,\n first = false,\n afterStepOf,\n }: {\n message: M\n generate?: boolean\n first?: boolean\n afterStepOf?: string\n }): void => {\n const candidate = {\n id: message.id,\n message,\n generate: generate && message.role === 'user',\n ...(afterStepOf === undefined ? {} : { afterStepOf }),\n }\n if (first) state.inbox.items.unshift(candidate)\n else state.inbox.items.push(candidate)\n }\n const moveInput = ({ from, to }: { from: number; to: number }): void => {\n if (from === to) return\n const [moved] = state.inbox.items.splice(from, 1)\n state.inbox.items.splice(to, 0, moved!)\n const [previous] = before.inbox.items.splice(from, 1)\n before.inbox.items.splice(to, 0, previous!)\n moves.push({ path: ['inbox', 'items'], move: { from, to } })\n }\n const requestModel = ({\n request,\n id,\n }: {\n request: GenerationRequestedPayload\n id: string\n }): void => {\n const active = state.active!\n const payload = {\n ...request,\n control: { turnId: active.turnId, version: active.version },\n }\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n type: 'ai.generation.requested',\n id,\n payload,\n } as ContractEvent<D>)\n active.model = { id, version: active.version, settled: false }\n active.phase = 'starting'\n jobs.push({\n type: 'ai.generation.requested',\n id,\n payload,\n } as AppendInput<D>)\n }\n if (ctx.event.type === 'ai.session.closed') {\n state.coordinator = { closed: true, queued: [] }\n state.active = null\n state.inbox.items = []\n } else if (ctx.event.type === 'ai.control.requested') {\n const command = ctx.event.payload as ControlCommand<M>\n if (state.coordinator.closed) reason = 'closed'\n else\n switch (command.action) {\n case 'send':\n insert({\n message: command.message,\n generate: command.generate !== false,\n })\n break\n case 'edit': {\n const item = state.inbox.items.find(\n (candidate) => candidate.id === command.message.id,\n )\n if (item === undefined) reason = 'not-pending'\n else if (item.message.role !== command.message.role)\n reason = 'role-mismatch'\n else item.message = command.message\n break\n }\n case 'remove': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n if (position < 0) reason = 'not-pending'\n else state.inbox.items.splice(position, 1)\n break\n }\n case 'move': {\n const index = state.inbox.items.findIndex(\n (candidate) => candidate.id === command.inputId,\n )\n if (index < 0) reason = 'not-pending'\n else if (\n command.beforeId !== null &&\n !state.inbox.items.some(\n (candidate) => candidate.id === command.beforeId,\n )\n )\n reason = 'not-pending'\n else {\n const destination =\n command.beforeId === null\n ? state.inbox.items.length\n : state.inbox.items.findIndex(\n (item) => item.id === command.beforeId,\n )\n moveInput({\n from: index,\n to: destination > index ? destination - 1 : destination,\n })\n }\n break\n }\n case 'send-now': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n const selected = state.inbox.items[position]\n if (!selected) reason = 'not-pending'\n else if ((state.active?.turnId ?? null) !== command.turnId)\n reason = 'stale-turn'\n else if (selected.message.role !== 'user') reason = 'not-user-input'\n else {\n selected.generate = true\n if (state.active) selected.afterStepOf = state.active.turnId\n else delete selected.afterStepOf\n moveInput({ from: position, to: 0 })\n }\n break\n }\n case 'stop':\n if (state.active?.turnId !== command.turnId) reason = 'stale-turn'\n else\n await end({\n lastSeenIndex: command.lastSeenIndex,\n reason: undefined,\n })\n break\n case 'steer':\n insert({\n message: command.message,\n generate: true,\n first: true,\n afterStepOf: command.turnId,\n })\n break\n case 'interrupt': {\n const response = state.coordinator.response\n if (\n !response ||\n response.responseMessageId !== command.request.messageId ||\n (command.request.generationId !==\n response.generation?.generationId &&\n command.request.requestId !== response.activeRequestId)\n )\n reason = 'stale-turn'\n else\n await end({\n lastSeenIndex: command.request.lastSeenIndex,\n reason: command.request.reason,\n })\n break\n }\n case 'pause': {\n state.inbox.paused = true\n const active = state.active\n if (\n command.when === 'now' &&\n active !== null &&\n !active.suspended\n ) {\n active.suspended = true\n active.version += 1\n const generation = state.coordinator.response?.generation\n if (generation)\n await emit({\n type: 'ai.generation.paused',\n payload: {\n generationId: generation.generationId,\n messageId: generation.responseMessageId,\n },\n })\n }\n break\n }\n case 'resume':\n state.inbox.paused = false\n break\n case 'tool-result': {\n const call = state.coordinator.response?.calls.find(\n (candidate) =>\n candidate.call.requestId === command.result.requestId &&\n candidate.call.generationId === command.result.generationId &&\n candidate.call.messageId === command.result.messageId &&\n candidate.call.toolCallId === command.result.toolCallId &&\n candidate.call.providerExecuted === true &&\n !candidate.terminal,\n )\n if (!call) reason = 'not-found'\n else await emit({ type: 'ai.tool.result', payload: command.result })\n break\n }\n case 'approval': {\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) =>\n candidate.approval?.requestId === command.response.requestId &&\n candidate.approval.approvalId === command.response.approvalId &&\n candidate.approval.generationId ===\n command.response.generationId &&\n candidate.approval.messageId === command.response.messageId,\n )\n if (response?.failure) reason = 'stale-turn'\n else if (!call || call.response || call.terminal)\n reason = 'not-found'\n else\n await emit({\n type: 'ai.approval.responded',\n payload: command.response,\n })\n break\n }\n case 'request-input':\n case 'input': {\n const payload =\n command.action === 'input' ? command.response : command.request\n const response = state.coordinator.response\n if (\n response?.failure !== undefined ||\n response?.generation?.requestId !== payload.requestId ||\n response.generation.generationId !== payload.generationId ||\n response.responseMessageId !== payload.messageId ||\n (command.action === 'input' &&\n !response.inputs.some(\n (input) =>\n input.inputId === payload.inputId &&\n input.name === payload.name,\n ))\n )\n reason = 'not-found'\n else\n await emit({\n type:\n command.action === 'input'\n ? 'ai.input.responded'\n : 'ai.input.requested',\n payload,\n })\n break\n }\n case 'retry': {\n const response = state.coordinator.response\n if (\n !state.active ||\n response?.status !== 'failed' ||\n response.rootMessageId !== command.request.messageId ||\n response.responseMessageId !== command.request.responseMessageId\n )\n reason = 'stale-turn'\n else if (!state.inbox.paused && !state.active.suspended) {\n await emit({\n type: 'ai.retry.requested',\n payload: command.request,\n })\n requestModel({\n request: {\n messageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'retry',\n },\n id: await aiEventId(\n 'a2.ai.request.retry',\n options.contract.name,\n ctx.event.sessionId,\n command.request.retryId,\n ),\n })\n } else reason = 'stale-turn'\n break\n }\n }\n } else {\n const report = ctx.event.payload as WorkReport\n if (\n report.kind === 'tool' &&\n report.settled &&\n state.coordinator.unsettledTools\n ) {\n delete state.coordinator.unsettledTools[report.workId]\n if (Object.keys(state.coordinator.unsettledTools).length === 0)\n delete state.coordinator.unsettledTools\n }\n const active = state.active\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) => candidate.work?.id === report.workId,\n )\n const work = report.kind === 'model' ? active?.model : call?.work\n const current =\n active?.turnId === report.turnId &&\n work?.id === report.workId &&\n work.version === report.version &&\n !work.settled &&\n report.attempt >= (work.attempt ?? 0)\n if (!current) {\n reason = 'stale-work'\n } else {\n work.attempt = report.attempt\n const authorized =\n !active.suspended && active.version === report.version\n for (const event of report.events) {\n if (work.facts?.includes(event.id)) continue\n if (\n authorized ||\n (report.kind === 'tool' && event.type === 'ai.tool.result')\n ) {\n await emit({\n type: event.type,\n payload: event.payload,\n id: event.id,\n })\n work.facts = [...(work.facts ?? []), event.id]\n }\n }\n if (report.settled) {\n work.settled = true\n delete work.facts\n }\n if (!authorized) reason = 'stale-work'\n }\n }\n\n let active = state.active\n let response = state.coordinator.response\n if (active && response === undefined) {\n state.active = null\n active = null\n }\n if (active && response) {\n const handoff = state.inbox.items.some(\n (item) => item.afterStepOf === active.turnId,\n )\n const outstanding =\n (active.model !== null && !active.model.settled) ||\n response.calls.some(\n (candidate) =>\n candidate.work !== undefined && !candidate.work.settled,\n )\n if (active.suspended) {\n active.phase = outstanding ? 'pausing' : 'paused'\n if (!state.inbox.paused && !outstanding && !handoff)\n active.suspended = false\n }\n if (!active.suspended && response.failure) active.phase = 'failed'\n if (!active.suspended && response.failure === undefined) {\n for (const call of response.calls) {\n if (\n call.terminal ||\n (call.work !== undefined &&\n (!call.work.settled || call.work.version === active.version)) ||\n call.call.providerExecuted === true ||\n (call.approval && !call.response)\n )\n continue\n if (call.response?.approved === false) {\n await emit({\n type: 'ai.tool.result',\n payload: {\n ...call.call,\n denied: true,\n phase: 'execution',\n },\n })\n continue\n }\n const id = await aiEventId(\n 'a2.ai.tool.execution',\n ctx.event.id,\n call.call.generationId,\n call.call.toolCallId,\n )\n call.work = { id, version: active.version, settled: false }\n state.coordinator.unsettledTools = {\n ...state.coordinator.unsettledTools,\n [id]: true,\n }\n jobs.push({\n type: 'ai.tool.execution.requested',\n id,\n payload: {\n turnId: active.turnId,\n version: active.version,\n call: call.call,\n generation: response.generation!,\n },\n } as AppendInput<D>)\n }\n }\n response = state.coordinator.response!\n const callsDone = response.calls.every(callReadyForModel)\n const modelDone = active.model === null || active.model.settled\n const workSettled =\n modelDone &&\n response.calls.every(\n (call) => call.work === undefined || call.work.settled,\n )\n const externalPending = response.calls.some(\n (call) =>\n call.call.providerExecuted &&\n call.call.supportsDeferredResults &&\n !call.terminal &&\n !approvalBlocksExecution(call),\n )\n const handoffReady =\n handoff &&\n workSettled &&\n !externalPending &&\n (active.suspended ||\n response.failure !== undefined ||\n response.calls.every(\n (call) => callReadyForModel(call) || approvalBlocksExecution(call),\n ))\n const readyForModel =\n !active.suspended &&\n response.failure === undefined &&\n modelDone &&\n callsDone &&\n response.inputs.length === 0\n const naturalCompletion =\n readyForModel &&\n response.completion !== undefined &&\n response.completion.finishReason !== 'tool-calls'\n if (handoffReady && !naturalCompletion) {\n await end({ lastSeenIndex: undefined, reason: 'steered after step' })\n } else if (readyForModel && (!handoff || handoffReady)) {\n const resume =\n active.model !== null && active.model.version !== active.version\n const input = response.inputResponse\n if (\n !handoff &&\n (resume ||\n continuationReady(state.coordinator) ||\n (response.completion && input))\n ) {\n const nextReason = resume ? 'resume' : input ? 'input' : 'tool'\n const sourceGenerationId = (\n response.generation ?? response.source?.generation\n )?.generationId\n const id =\n nextReason === 'tool'\n ? await aiEventId(\n 'a2.ai.request.tool',\n response.generation!.generationId,\n )\n : await aiEventId('a2.ai.request', ctx.event.id, nextReason)\n requestModel({\n request: {\n messageId: response.responseMessageId,\n responseMessageId: response.responseMessageId,\n reason: nextReason,\n ...(sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId }),\n },\n id,\n })\n } else if (naturalCompletion) {\n await emit({\n type: 'ai.message.completed',\n payload: {\n messageId: response.responseMessageId,\n },\n })\n state.active = null\n }\n }\n if (\n !active.suspended &&\n state.active &&\n jobs.every((job) => job.type !== 'ai.generation.requested')\n )\n state.active.phase = response.failure\n ? 'failed'\n : !modelDone\n ? 'generating'\n : !callsDone\n ? 'tools'\n : 'waiting'\n }\n if (\n state.active === null &&\n !state.inbox.paused &&\n !state.coordinator.closed\n ) {\n while (state.inbox.items.length > 0) {\n const item = state.inbox.items.shift()!\n delete item.afterStepOf\n await emit({\n type: 'ai.message.created',\n payload: { message: item.message, generate: item.generate },\n id: await aiEventId(\n 'a2.ai.admitted',\n options.contract.name,\n ctx.event.sessionId,\n item.id,\n ),\n })\n if (!item.generate) continue\n state.active = {\n turnId: item.id,\n input: item,\n phase: 'starting',\n version: 0,\n suspended: false,\n model: null,\n }\n const requestId = await aiEventId(\n 'a2.ai.request.message',\n options.contract.name,\n ctx.event.sessionId,\n item.id,\n )\n requestModel({\n request: {\n messageId: item.id,\n responseMessageId: requestId,\n reason: 'message',\n },\n id: requestId,\n })\n break\n }\n }\n const receipt: ControlReceipt = {\n commandId: ctx.event.id,\n ...(ctx.event.type === 'ai.work.reported' ? { work: true as const } : {}),\n outcome: reason === undefined ? 'applied' : 'rejected',\n ...(reason === undefined ? {} : { reason }),\n }\n return [\n ...(facts as AppendInput<D>[]),\n {\n type: 'ai.control.committed',\n id: await aiEventId('a2.ai.control.committed', ctx.event.id),\n payload: controlCommit({ before, after: state, moves }),\n } as AppendInput<D>,\n ...jobs,\n {\n type: 'ai.control.decided',\n id: await aiEventId('a2.ai.control.decided', ctx.event.id),\n payload: receipt,\n } as AppendInput<D>,\n ]\n }\n\n const report = async ({\n ctx,\n events,\n settled,\n name,\n }: {\n ctx: HandlerContext<D>\n events: readonly AppendInput<D>[]\n settled: boolean\n name: string\n }): Promise<AppendInput<D>> => {\n const payload = ctx.event.payload as\n GenerationRequestedPayload | { turnId: string; version: number }\n const { turnId, version } = 'turnId' in payload ? payload : payload.control!\n for (const event of events) {\n const schema = options.contract.events[\n event.type\n ] as StandardSchemaV1<unknown>\n const result = validateSync(\n schema,\n event.payload,\n `AI worker ${event.type}`,\n )\n if (result.issues)\n throw new TypeError(\n result.issues.map((issue) => issue.message).join('; '),\n )\n }\n return {\n type: 'ai.work.reported',\n id: await aiEventId(\n 'a2.ai.report',\n ctx.event.id,\n String(ctx.attempt),\n name,\n ),\n payload: {\n workId: ctx.event.id,\n attempt: ctx.attempt,\n turnId,\n version,\n kind: ctx.event.type === 'ai.generation.requested' ? 'model' : 'tool',\n settled,\n events: await Promise.all(\n events\n .filter(\n (event) =>\n event.type !== 'ai.message.completed' &&\n event.type !== 'ai.message.interrupted',\n )\n .map(async (event, index) => ({\n type: event.type,\n payload: event.payload,\n id:\n event.id ??\n (await aiEventId(\n 'a2.ai.work.fact',\n ctx.event.id,\n String(ctx.attempt),\n name,\n String(index),\n )),\n })),\n ),\n },\n } as AppendInput<D>\n }\n\n const append = async ({\n ctx,\n name,\n events,\n }: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]> => {\n const progress = events.filter(\n (event) => event.type === 'ai.generation.progress',\n )\n const lifecycle = events.filter(\n (event) => event.type !== 'ai.generation.progress',\n )\n if (lifecycle.length === 0) return ctx.session.append(name, ...progress)\n const input = await report({ ctx, events: lifecycle, settled: false, name })\n const persisted = await ctx.session.append(name, ...progress, input)\n const index = persisted.at(-1)!.index\n return telemetry.span(\n 'a2.ai.ack',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.ack.request_id': ctx.event.id,\n 'a2.ai.ack.report_id': input.id!,\n },\n async () => {\n const feed = ctx.session.stream({ startAfter: index })\n const stream = feed[Symbol.asyncIterator]()\n const canonical: ContractEvent<D>[] = []\n const wanted = new Set(lifecycle.map((event) => event.id))\n let rejectAbort!: (error: unknown) => void\n const aborted = new Promise<never>((_, reject) => {\n rejectAbort = reject\n })\n const onAbort = (): void => {\n rejectAbort(ctx.signal.reason)\n }\n ctx.signal.addEventListener('abort', onAbort, { once: true })\n try {\n ctx.signal.throwIfAborted()\n for (;;) {\n const item = await Promise.race([stream.next(), aborted])\n if (item.done)\n throw new Error('AI control acknowledgement stream ended')\n if (wanted.has(item.value.id)) canonical.push(item.value)\n if (\n item.value.type === 'ai.control.decided' &&\n (item.value.payload as ControlReceipt).commandId === input.id\n ) {\n if ((item.value.payload as ControlReceipt).outcome === 'rejected')\n throw new ControlCancelled('stale AI work')\n return [\n ...persisted.filter(\n (event) => event.type !== 'ai.work.reported',\n ),\n ...canonical,\n ]\n }\n }\n } finally {\n ctx.signal.removeEventListener('abort', onAbort)\n await stream.return?.()\n }\n },\n )\n }\n\n const settled = ({\n ctx,\n events,\n }: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): Promise<AppendInput<D>> =>\n report({\n ctx,\n events:\n events === undefined\n ? []\n : Array.isArray(events)\n ? events\n : [events as AppendInput<D>],\n settled: true,\n name: 'settled',\n })\n const cancelled = ({\n error,\n signal,\n }: {\n error: unknown\n signal: AbortSignal\n }): boolean => {\n if (signal.reason instanceof A2Error) throw signal.reason\n return error instanceof ControlCancelled || signal.aborted\n }\n return { handler, append, settled, cancelled, reducer, coordinator }\n}\n","import { assertMessageBase, restoreMessageBase } from './ai-message-base.ts'\nimport type { UIMessage } from 'ai'\nimport { events } from './ai.ts'\nimport type { AIContextState } from './ai-context.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { validateSync } from './validate.ts'\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\nconst index = (value: unknown): value is number =>\n typeof value === 'number' && Number.isSafeInteger(value) && value >= 0\nconst id = (value: unknown): value is string =>\n typeof value === 'string' && value.length > 0\nconst nullableId = (value: unknown): boolean => value === null || id(value)\nconst matches = (schema: StandardSchemaV1<unknown>, value: unknown): boolean =>\n validateSync(schema, value, 'AI context checkpoint').issues === undefined\nconst isMessage = (value: unknown): value is UIMessage =>\n matches(events['ai.message.created'], { message: value })\nconst indexes = (value: unknown, messages: readonly UIMessage[]): boolean =>\n record(value) &&\n Object.values(value).every(index) &&\n messages.every((message) => Object.hasOwn(value, message.id))\n\nconst compaction = (value: unknown): boolean =>\n value === null ||\n (record(value) &&\n Object.keys(value).every((key) =>\n [\n 'status',\n 'generationId',\n 'throughMessageId',\n 'throughIndex',\n 'summary',\n ].includes(key),\n ) &&\n ['running', 'completed'].includes(String(value['status'])) &&\n id(value['generationId']) &&\n id(value['throughMessageId']) &&\n index(value['throughIndex']) &&\n (value['summary'] === undefined || typeof value['summary'] === 'string'))\n\nconst progress = (value: unknown): boolean => {\n if (\n !record(value) ||\n !index(value['length']) ||\n !Array.isArray(value['tail']) ||\n !Array.isArray(value['blocks'])\n )\n return false\n const pending = [\n ...value['blocks'].toReversed().filter((block) => block !== null),\n value['tail'],\n ].toReversed()\n const seen = new Set<object>()\n let count = 0\n let last = -1\n while (pending.length > 0) {\n const block: unknown = pending.pop()\n if (typeof block !== 'object' || block === null || seen.has(block))\n return false\n seen.add(block)\n if (Array.isArray(block)) {\n for (const batch of block) {\n if (\n !record(batch) ||\n !index(batch['index']) ||\n batch['index'] <= last ||\n !Array.isArray(batch['chunks']) ||\n !batch['chunks'].every(\n (chunk) => record(chunk) && typeof chunk['type'] === 'string',\n )\n )\n return false\n count += 1\n last = batch['index']\n }\n } else if (\n record(block) &&\n Object.keys(block).length === 2 &&\n Object.hasOwn(block, 'left') &&\n Object.hasOwn(block, 'right')\n )\n pending.push(block['right'], block['left'])\n else return false\n }\n return count === value['length']\n}\n\nconst indexedEvents = (\n value: unknown,\n types: (keyof typeof events)[],\n): boolean =>\n Array.isArray(value) &&\n value.every(\n (event) =>\n record(event) &&\n index(event['index']) &&\n types.includes(event['type'] as keyof typeof events) &&\n matches(\n events[\n event['type'] as keyof typeof events\n ] as StandardSchemaV1<unknown>,\n event['payload'],\n ),\n )\n\nconst restorableBase = (options: {\n base: unknown\n current: UIMessage | undefined\n}): boolean => {\n assertMessageBase(options.base)\n return isMessage(\n restoreMessageBase({ current: options.current, base: options.base }),\n )\n}\n\nconst projection = (value: unknown, messages: UIMessage[]): boolean => {\n if (\n !record(value) ||\n Object.keys(value).some(\n (key) =>\n ![\n 'generationId',\n 'responseMessageId',\n 'promptThroughIndex',\n 'completionIndex',\n 'base',\n 'baseCompaction',\n 'batches',\n 'toolEvents',\n 'approvalEvents',\n 'cursor',\n ].includes(key),\n ) ||\n !id(value['generationId']) ||\n !id(value['responseMessageId']) ||\n !index(value['promptThroughIndex']) ||\n (value['completionIndex'] !== undefined &&\n !index(value['completionIndex'])) ||\n (value['base'] !== undefined &&\n !restorableBase({\n base: value['base'],\n current: messages.find(\n (message) => message.id === value['responseMessageId'],\n ),\n })) ||\n (value['baseCompaction'] !== undefined &&\n !compaction(value['baseCompaction'])) ||\n !progress(value['batches']) ||\n !indexedEvents(value['toolEvents'], ['ai.tool.called', 'ai.tool.result']) ||\n !indexedEvents(value['approvalEvents'], [\n 'ai.approval.requested',\n 'ai.approval.responded',\n ])\n )\n return false\n const cursor = value['cursor']\n if (cursor === undefined || cursor === null) return true\n if (\n !record(cursor) ||\n !index(cursor['throughIndex']) ||\n !record(cursor['stream'])\n )\n return false\n const stream = cursor['stream']\n const current = messages.find(\n (message) => message.id === value['responseMessageId'],\n )\n if (\n !current ||\n !['text', 'reasoning'].every(\n (key) =>\n record(stream[key]) &&\n Object.values(stream[key]).every(\n (part) => index(part) && part < current.parts.length,\n ),\n ) ||\n !record(stream['tools'])\n )\n return false\n return Object.values(stream['tools']).every(\n (tool) =>\n record(tool) &&\n typeof tool['text'] === 'string' &&\n typeof tool['toolName'] === 'string' &&\n typeof tool['dynamic'] === 'boolean',\n )\n}\n\nconst authority = (value: unknown): boolean =>\n value === null ||\n (record(value) &&\n Object.keys(value).every((key) =>\n [\n 'requestId',\n 'responseMessageId',\n 'sourceGenerationId',\n 'requestReason',\n 'phase',\n ].includes(key),\n ) &&\n ['requestId', 'responseMessageId', 'sourceGenerationId'].every((key) =>\n nullableId(value[key]),\n ) &&\n (value['requestReason'] === null ||\n ['message', 'tool', 'input', 'resume', 'retry'].includes(\n String(value['requestReason']),\n )) &&\n (value['phase'] === null ||\n [\n 'starting',\n 'generating',\n 'tools',\n 'waiting',\n 'failed',\n 'pausing',\n 'paused',\n ].includes(String(value['phase']))))\n\nexport const contextSchema = <M extends UIMessage>(\n app?: object,\n): StandardSchemaV1<AIContextState<M>> => ({\n '~standard': {\n version: 1,\n vendor: 'a2-context',\n validate(value) {\n const invalid = { issues: [{ message: 'invalid AI model context' }] }\n const keys = [\n 'messages',\n 'compaction',\n 'modelMetadata',\n 'closed',\n 'authority',\n 'generation',\n 'activeProjection',\n 'messageIndexes',\n ...(app === undefined ? [] : ['app']),\n ]\n try {\n if (\n !record(value) ||\n keys.some((key) => !Object.hasOwn(value, key)) ||\n Object.keys(value).some((key) => !keys.includes(key))\n )\n return invalid\n const messages = value['messages']\n const metadata = value['modelMetadata']\n const generation = value['generation']\n const current = value['activeProjection']\n if (\n !Array.isArray(messages) ||\n !messages.every(isMessage) ||\n !compaction(value['compaction']) ||\n typeof value['closed'] !== 'boolean' ||\n !authority(value['authority']) ||\n !record(metadata) ||\n !Object.entries(metadata).every(\n ([modelId, entry]) =>\n record(entry) &&\n (entry['status'] === 'pending' ||\n entry['status'] === 'unavailable' ||\n (entry['status'] === 'resolved' &&\n matches(events['ai.model.metadata.resolved'], {\n modelId,\n limits: entry['limits'],\n }))),\n ) ||\n !indexes(value['messageIndexes'], messages)\n )\n return invalid\n if (\n generation !== null &&\n (!record(generation) ||\n !matches(events['ai.generation.started'], generation['owner']) ||\n !index(generation['startIndex']) ||\n ![\n 'streaming',\n 'completed',\n 'paused',\n 'failed',\n 'superseded',\n ].includes(String(generation['phase'])) ||\n (generation['responseIndex'] !== undefined &&\n !index(generation['responseIndex'])) ||\n (generation['phase'] === 'failed' &&\n typeof generation['error'] !== 'string'))\n )\n return invalid\n const owner =\n record(generation) && record(generation['owner'])\n ? generation['owner']\n : undefined\n if (\n current !== null &&\n (!projection(current, messages) ||\n !record(current) ||\n current['generationId'] !== owner?.['generationId'] ||\n current['responseMessageId'] !== owner?.['responseMessageId'])\n )\n return invalid\n if (\n generation !== null &&\n (generation as Record<string, unknown>)['phase'] !== 'superseded' &&\n current === null\n )\n return invalid\n if (value['closed'] && (generation !== null || current !== null))\n return invalid\n if (app !== undefined && !record(value['app'])) return invalid\n return { value: value as AIContextState<M> }\n } catch {\n return invalid\n }\n },\n },\n})\n","import { restoreMessageBase } from './ai-message-base.ts'\nimport { reducer as makeReducer } from './reducer.ts'\nimport type { UIMessage } from 'ai'\nimport type {\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n CompactionCompletedPayload,\n CompactionRequestedPayload,\n CompactionState,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationRequestedPayload,\n GenerationStartedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ModelMetadataRequestedPayload,\n ModelMetadataResolvedPayload,\n ModelMetadataState,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { ControlCommit } from './ai-control.ts'\nimport { contextSchema } from './ai-context-schema.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport {\n projectedMessage,\n retainMessageBase,\n findMessage,\n advanceProjection,\n reduceToolActivity,\n upsertMessage,\n upsertResponse,\n type MessageProjection,\n} from './ai-message-projection.ts'\nimport { interruptUIMessage, pauseUIMessage } from './ai-projector.ts'\nimport {\n flattenProgressBatches,\n progressBatches,\n progressOwnedBy,\n type StoredProgressPayload,\n} from './ai-progress-batches.ts'\nimport { appReducerOf, appSlice } from './ai-app-state.ts'\nimport { withAIStorage } from './ai-stored-state.ts'\nimport type { Reducer } from './reducer.ts'\n\nexport type AIModelContext<M extends UIMessage = UIMessage> = {\n messages: M[]\n compaction: Omit<CompactionState, 'usage'> | null\n modelMetadata: Record<string, ModelMetadataState>\n}\n\nexport type AIContextState<M extends UIMessage> = AIModelContext<M> & {\n closed: boolean\n authority: Pick<\n ControlCommit['view'],\n | 'requestId'\n | 'requestReason'\n | 'sourceGenerationId'\n | 'responseMessageId'\n | 'phase'\n > | null\n generation: {\n owner: GenerationStartedPayload\n /** Log index of the owner's `ai.generation.started`. */\n startIndex: number\n phase: 'streaming' | 'completed' | 'paused' | 'failed' | 'superseded'\n error?: string\n responseIndex?: number\n } | null\n activeProjection: MessageProjection | null\n messageIndexes: Record<string, number>\n /** The contract's application state, when `agentContract()` has a reducer. */\n app?: object\n}\n\nconst replaceResponse = <M extends UIMessage>({\n state,\n message,\n index,\n}: {\n state: AIContextState<M>\n message: M\n index: number\n}): AIContextState<M> => {\n let messages = upsertResponse({\n messages: state.messages,\n message,\n inputId: state.generation!.owner.messageId,\n })\n if (\n state.generation?.responseIndex !== undefined &&\n !state.messages.some((item) => item.id === message.id)\n ) {\n messages = messages.filter((item) => item.id !== message.id)\n messages.splice(state.generation.responseIndex, 0, message)\n }\n return {\n ...state,\n messages,\n messageIndexes: Object.hasOwn(state.messageIndexes, message.id)\n ? state.messageIndexes\n : { ...state.messageIndexes, [message.id]: index },\n }\n}\n\nconst calledTools = <M extends UIMessage>({\n projection,\n current,\n}: {\n projection: MessageProjection\n current: M | undefined\n}): Set<string> =>\n new Set([\n ...(restoreMessageBase({ current, base: projection.base })?.parts.flatMap(\n (part) => ('toolCallId' in part ? [part.toolCallId] : []),\n ) ?? []),\n ...projection.toolEvents\n .filter((event) => event.type === 'ai.tool.called')\n .map((event) => event.payload.toolCallId),\n ])\n\nconst renderProjection = <M extends UIMessage>({\n state,\n index,\n}: {\n state: AIContextState<M>\n index: number\n}): AIContextState<M> => {\n const projection = state.activeProjection!\n const current = findMessage(state.messages, projection.responseMessageId)\n let message = projectedMessage({ projection, current })\n if (\n projection.base === undefined &&\n projection.batches.length === 0 &&\n message.parts.length === 0\n )\n return state\n if (state.generation?.phase === 'paused')\n message = pauseUIMessage({\n message,\n toolCallIds: calledTools({ projection, current }),\n })\n if (state.generation?.phase === 'failed')\n message = interruptUIMessage(\n message,\n `Generation failed before tool completion: ${state.generation.error}`,\n )\n return replaceResponse({\n state: { ...state, activeProjection: { ...projection, cursor: null } },\n message,\n index,\n })\n}\n\nexport const generationBase = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => {\n const projection = state.activeProjection\n if (!projection) return state\n const base = restoreMessageBase({\n current: findMessage(state.messages, projection.responseMessageId),\n base: projection.base,\n })\n return {\n ...state,\n messages:\n base === undefined\n ? state.messages.filter(\n (message) => message.id !== projection.responseMessageId,\n )\n : upsertMessage(state.messages, base),\n compaction: projection.baseCompaction ?? null,\n }\n}\n\nexport const contextForAttempt = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => ({\n ...(state.activeProjection?.completionIndex === undefined\n ? generationBase(state)\n : state),\n generation: state.generation && { ...state.generation, phase: 'superseded' },\n activeProjection: null,\n})\n\nconst endGeneration = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => ({\n ...state,\n authority: null,\n generation: null,\n activeProjection: null,\n})\n\nconst ownsGeneration = <M extends UIMessage>(\n state: AIContextState<M>,\n owner: { generationId: string; requestId: string },\n): boolean =>\n state.generation?.owner.generationId === owner.generationId &&\n state.generation.owner.requestId === owner.requestId &&\n state.generation.phase !== 'superseded'\n\nexport const createContextReducer = <M extends UIMessage, D extends EventDefs>({\n contract,\n}: {\n contract: Contract<D, Record<never, never>, unknown>\n}): Reducer<D, AIContextState<M>> => {\n const app = appReducerOf(contract)\n const initialState: AIContextState<M> = {\n messages: [],\n compaction: null,\n modelMetadata: {},\n closed: false,\n authority: null,\n generation: null,\n activeProjection: null,\n messageIndexes: {},\n ...(app === undefined ? {} : { app: app.initialState }),\n }\n const reducer = makeReducer({\n contract,\n // The application state rides in this checkpoint so every generation\n // reads it without another state read.\n name:\n app === undefined ? 'a2.ai.context.v6' : `${app.name}+a2.ai.context.v6`,\n initialState,\n stateSchema: contextSchema<M>(app),\n }).fold((state, event) => {\n const after = retainMessageBase({\n before: state,\n after: reduceContext(state, event),\n })\n if (app === undefined) return after\n const next = app.fold(state.app!, event as ContractEvent<EventDefs>)\n return next === state.app ? after : { ...after, app: appSlice(next) }\n })\n return withAIStorage(reducer)\n}\n\nconst reduceContext = <M extends UIMessage, D extends EventDefs>(\n state: AIContextState<M>,\n event: ContractEvent<D>,\n): AIContextState<M> => {\n if (state.closed) return state\n switch (event.type) {\n case 'ai.control.committed': {\n const { view } = event.payload as ControlCommit\n const {\n requestId,\n requestReason,\n sourceGenerationId,\n responseMessageId,\n phase,\n } = view\n const next = {\n ...state,\n authority: {\n requestId,\n requestReason,\n sourceGenerationId,\n responseMessageId,\n phase,\n },\n closed: view.closed,\n }\n return view.closed ? endGeneration(next) : next\n }\n case 'ai.session.closed':\n return endGeneration({\n ...state,\n closed: true,\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection?.baseCompaction ?? null)\n : state.compaction,\n })\n case 'ai.message.created': {\n const { message } = event.payload as MessageCreatedPayload<M>\n return {\n ...state,\n messages: upsertMessage(state.messages, message),\n activeProjection:\n state.activeProjection?.responseMessageId === message.id\n ? { ...state.activeProjection, cursor: null }\n : state.activeProjection,\n messageIndexes: { ...state.messageIndexes, [message.id]: event.index },\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (\n state.authority?.requestId !== event.id ||\n request.responseMessageId !== state.authority.responseMessageId ||\n request.reason !== state.authority.requestReason ||\n (request.sourceGenerationId ?? null) !==\n state.authority.sourceGenerationId ||\n request.reason !== 'retry'\n )\n return state\n return contextForAttempt(state)\n }\n case 'ai.generation.started': {\n const owner = event.payload as GenerationStartedPayload\n if (\n state.authority?.requestId !== owner.requestId ||\n state.authority.responseMessageId !== owner.responseMessageId ||\n state.authority.phase === 'paused' ||\n state.authority.phase === 'pausing'\n )\n return state\n const previous = state.generation\n if (\n previous?.owner.requestId === owner.requestId &&\n (previous.owner.attempt >= owner.attempt ||\n previous.phase === 'failed' ||\n previous.phase === 'completed' ||\n state.activeProjection?.completionIndex !== undefined)\n )\n return state\n const base =\n previous?.owner.requestId === owner.requestId\n ? generationBase(state)\n : state\n const baseMessage = base.messages.find(\n (message) => message.id === owner.responseMessageId,\n )\n return {\n ...base,\n generation: {\n owner,\n startIndex: event.index,\n phase: 'streaming',\n ...(previous?.owner.responseMessageId === owner.responseMessageId &&\n previous.responseIndex !== undefined\n ? { responseIndex: previous.responseIndex }\n : {}),\n },\n activeProjection: {\n generationId: owner.generationId,\n responseMessageId: owner.responseMessageId,\n promptThroughIndex: owner.promptThroughIndex ?? event.index - 1,\n ...(baseMessage === undefined\n ? {}\n : { base: { partCount: baseMessage.parts.length } }),\n baseCompaction: base.compaction,\n batches: progressBatches(),\n toolEvents: [],\n approvalEvents: [],\n },\n }\n }\n case 'ai.generation.progress': {\n const payload = event.payload as StoredProgressPayload\n const generation = state.generation\n if (\n generation === null ||\n generation.phase !== 'streaming' ||\n !progressOwnedBy({\n payload,\n owner: generation.owner,\n startIndex: generation.startIndex,\n }) ||\n !state.activeProjection\n )\n return state\n const projection = state.activeProjection\n const progress = advanceProjection({\n projection,\n base: state.messages.find(\n (message) => message.id === projection.responseMessageId,\n ),\n chunks: payload.chunks,\n index: event.index,\n })\n return replaceResponse({\n state: {\n ...state,\n activeProjection: {\n ...projection,\n batches: progress.batches,\n cursor: progress.cursor,\n },\n },\n message: progress.message,\n index: event.index,\n })\n }\n case 'ai.generation.completed': {\n const payload = event.payload as GenerationCompletedPayload\n if (\n !ownsGeneration(state, payload) ||\n state.generation!.phase !== 'streaming'\n )\n return state\n return {\n ...state,\n generation: { ...state.generation!, phase: 'completed' },\n activeProjection: {\n ...state.activeProjection!,\n completionIndex: event.index,\n cursor: null,\n },\n }\n }\n case 'ai.generation.failed': {\n const payload = event.payload as GenerationFailedPayload\n if (!ownsGeneration(state, payload)) return state\n if (\n state.generation!.phase !== 'streaming' &&\n !(\n payload.stepLimit &&\n state.authority?.requestReason === 'tool' &&\n state.authority.sourceGenerationId === payload.generationId\n )\n )\n return state\n if (payload.superseded) {\n const next = generationBase(state)\n return {\n ...next,\n generation: { ...state.generation!, phase: 'superseded' },\n activeProjection: null,\n }\n }\n return renderProjection({\n state: {\n ...state,\n compaction: state.activeProjection?.baseCompaction ?? null,\n generation: {\n ...state.generation!,\n phase: 'failed',\n error: payload.error,\n },\n },\n index: event.index,\n })\n }\n case 'ai.message.interrupted': {\n const payload = event.payload as MessageInterruptedPayload\n const owner = state.generation?.owner\n const ownsRequest =\n payload.requestId !== undefined &&\n payload.requestId === state.authority?.requestId &&\n payload.messageId === state.authority.responseMessageId\n const ownsOwner =\n owner?.responseMessageId === payload.messageId &&\n (payload.generationId === owner.generationId ||\n payload.requestId === owner.requestId)\n if (!ownsRequest && !ownsOwner) return state\n if (\n ownsOwner &&\n state.authority?.requestId !== owner!.requestId &&\n !ownsRequest\n )\n return state\n const projection = state.activeProjection\n if (!projection) return endGeneration(state)\n const cutoff = payload.lastSeenIndex ?? Number.POSITIVE_INFINITY\n const retained = {\n ...projection,\n batches: progressBatches(\n flattenProgressBatches(projection.batches).filter(\n (batch) => batch.index <= cutoff,\n ),\n ),\n toolEvents: projection.toolEvents.filter(\n (item) => item.index <= cutoff,\n ),\n approvalEvents: projection.approvalEvents.filter(\n (item) => item.index <= cutoff,\n ),\n }\n let next = generationBase(state)\n if (retained.base !== undefined || retained.batches.length > 0)\n next = replaceResponse({\n state: next,\n message: interruptUIMessage(\n projectedMessage({\n projection: retained,\n current: findMessage(state.messages, retained.responseMessageId),\n }),\n ),\n index: event.index,\n })\n return endGeneration(next)\n }\n case 'ai.message.completed': {\n const { messageId } = event.payload as { messageId: string }\n return state.generation?.owner.responseMessageId === messageId &&\n state.generation.phase !== 'failed' &&\n state.generation.phase !== 'superseded'\n ? endGeneration(state)\n : state\n }\n case 'ai.generation.paused': {\n const { generationId } = event.payload as { generationId: string }\n if (\n state.generation?.owner.generationId !== generationId ||\n state.generation.phase === 'failed' ||\n state.generation.phase === 'superseded' ||\n !state.activeProjection\n )\n return state\n const toolCallIds = calledTools({\n projection: state.activeProjection,\n current: findMessage(\n state.messages,\n state.activeProjection.responseMessageId,\n ),\n })\n return renderProjection({\n state: {\n ...state,\n generation: { ...state.generation, phase: 'paused' },\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection.baseCompaction ?? null)\n : state.compaction,\n activeProjection: {\n ...state.activeProjection,\n cursor: null,\n batches: progressBatches(\n flattenProgressBatches(state.activeProjection.batches).map(\n (batch) => ({\n index: batch.index,\n chunks: batch.chunks.filter(\n (chunk) =>\n !('toolCallId' in chunk) ||\n toolCallIds.has(chunk.toolCallId),\n ),\n }),\n ),\n ),\n },\n },\n index: event.index,\n })\n }\n case 'ai.tool.called':\n case 'ai.tool.result': {\n const payload = event.payload as ToolCalledPayload | ToolResultPayload\n if (\n !ownsGeneration(state, payload) ||\n !state.activeProjection ||\n state.generation!.owner.responseMessageId !== payload.messageId\n )\n return state\n if (state.generation!.phase === 'failed') {\n const result = payload as ToolResultPayload\n const running = state.activeProjection.toolEvents\n .reduce(\n (tools, item) => reduceToolActivity(tools, item),\n [] as ReturnType<typeof reduceToolActivity>,\n )\n .some(\n (tool) =>\n tool.toolCallId === payload.toolCallId &&\n tool.status === 'running',\n )\n if (event.type !== 'ai.tool.result' || result.preliminary || !running)\n return state\n }\n const toolEvent =\n event.type === 'ai.tool.called'\n ? {\n index: event.index,\n type: 'ai.tool.called' as const,\n payload: payload as ToolCalledPayload,\n }\n : {\n index: event.index,\n type: 'ai.tool.result' as const,\n payload: payload as ToolResultPayload,\n }\n const next = {\n ...state,\n activeProjection: {\n ...state.activeProjection,\n toolEvents: [...state.activeProjection.toolEvents, toolEvent],\n },\n }\n if (event.type === 'ai.tool.called') return next\n next.activeProjection.cursor = null\n return renderProjection({ state: next, index: event.index })\n }\n case 'ai.approval.requested':\n case 'ai.approval.responded': {\n const payload = event.payload as\n ApprovalRequestedPayload | ApprovalRespondedPayload\n if (\n !ownsGeneration(state, payload) ||\n !state.activeProjection ||\n state.generation!.phase === 'failed' ||\n state.generation!.owner.responseMessageId !== payload.messageId\n )\n return state\n const approvalEvent =\n event.type === 'ai.approval.requested'\n ? {\n index: event.index,\n type: 'ai.approval.requested' as const,\n payload: payload as ApprovalRequestedPayload,\n }\n : {\n index: event.index,\n type: 'ai.approval.responded' as const,\n payload: payload as ApprovalRespondedPayload,\n }\n return renderProjection({\n state: {\n ...state,\n activeProjection: {\n ...state.activeProjection,\n cursor: null,\n approvalEvents: [\n ...state.activeProjection.approvalEvents,\n approvalEvent,\n ],\n },\n },\n index: event.index,\n })\n }\n case 'ai.compaction.requested': {\n const payload = event.payload as CompactionRequestedPayload\n if (\n state.generation?.owner.generationId !== payload.generationId ||\n state.generation.phase !== 'streaming'\n )\n return state\n return {\n ...state,\n compaction: {\n status: 'running',\n generationId: payload.generationId,\n throughMessageId: payload.throughMessageId,\n throughIndex:\n payload.throughIndex ?? state.activeProjection!.promptThroughIndex!,\n },\n }\n }\n case 'ai.compaction.completed': {\n const payload = event.payload as CompactionCompletedPayload<M>\n const projection = state.activeProjection\n if (\n state.generation?.owner.generationId !== payload.generationId ||\n state.generation.phase !== 'streaming' ||\n state.compaction?.status !== 'running' ||\n state.compaction.generationId !== payload.generationId ||\n !projection\n )\n return state\n const throughIndex =\n payload.throughIndex ?? projection.promptThroughIndex!\n const replacements = new Set(\n payload.messages.map((message) => message.id),\n )\n const retained = new Set(payload.retainedMessageIds ?? [])\n const messages = [\n ...payload.messages,\n ...state.messages.filter(\n (message) =>\n !replacements.has(message.id) &&\n (retained.has(message.id) ||\n (state.messageIndexes[message.id] ?? 0) > throughIndex),\n ),\n ]\n const activeProjection = { ...projection, cursor: null }\n delete activeProjection.base\n const baseMessage = messages.find(\n (message) => message.id === projection.responseMessageId,\n )\n if (baseMessage !== undefined)\n activeProjection.base = { partCount: baseMessage.parts.length }\n const compaction: AIModelContext<M>['compaction'] = {\n status: 'completed',\n generationId: payload.generationId,\n throughMessageId: payload.throughMessageId,\n throughIndex,\n ...(payload.summary === undefined ? {} : { summary: payload.summary }),\n }\n activeProjection.baseCompaction = compaction\n return {\n ...state,\n messages,\n compaction,\n generation: {\n ...state.generation,\n responseIndex: payload.messages.length,\n },\n activeProjection,\n messageIndexes: Object.fromEntries(\n messages.map((message) => [\n message.id,\n replacements.has(message.id)\n ? throughIndex\n : state.messageIndexes[message.id]!,\n ]),\n ),\n }\n }\n case 'ai.model.metadata.requested': {\n const { modelId } = event.payload as ModelMetadataRequestedPayload\n return Object.hasOwn(state.modelMetadata, modelId)\n ? state\n : {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]: { status: 'pending' },\n },\n }\n }\n case 'ai.model.metadata.resolved': {\n const { modelId, limits } = event.payload as ModelMetadataResolvedPayload\n return {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]:\n limits === null\n ? { status: 'unavailable' }\n : { status: 'resolved', limits },\n },\n }\n }\n default:\n return state\n }\n}\n","import {\n convertToModelMessages,\n stepCountIs,\n streamText,\n toUIMessageStream,\n} from 'ai'\nimport type {\n FinishReason,\n InferUIMessageChunk,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n} from 'ai'\n\ntype StreamTextOptions<T extends ToolSet> = Parameters<typeof streamText<T>>[0]\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\ntype ModelStepTimeout<T extends ToolSet> =\n | number\n | Omit<\n Exclude<StreamTextOptions<T>['timeout'], number | undefined>,\n 'toolMs' | 'tools'\n >\n\ntype ControlledStreamTextSetting =\n | '_internal'\n | 'abortSignal'\n | 'instructions'\n | 'messages'\n | 'model'\n | 'onToolExecutionEnd'\n | 'onToolExecutionStart'\n | 'experimental_onToolCallFinish'\n | 'experimental_onToolCallStart'\n | 'experimental_sandbox'\n | 'experimental_toolCallers'\n | 'experimental_toolApprovalSecret'\n | 'prompt'\n | 'prepareStep'\n | 'stopWhen'\n | 'system'\n | 'tools'\n\ntype RetypedStreamTextSetting =\n | 'experimental_onStart'\n | 'experimental_onStepStart'\n | 'experimental_repairToolCall'\n | 'experimental_transform'\n | 'onStart'\n | 'onStepStart'\n | 'repairToolCall'\n\ntype ModelFacingTools<T extends ToolSet> = {\n readonly [K in keyof T]: Omit<T[K], 'execute'>\n}\n\ntype SettingEvent<T extends ToolSet, K extends keyof StreamTextOptions<T>> =\n NonNullable<StreamTextOptions<T>[K]> extends (event: infer EVENT) => unknown\n ? EVENT\n : never\n\ntype ModelPhaseStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseStepStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStepStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseCallback<EVENT> = (event: EVENT) => void | PromiseLike<void>\n\ntype StreamTextRepairToolCall<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['repairToolCall']\n>\n\ntype ModelPhaseRepairToolCall<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextRepairToolCall<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextRepairToolCall<T>>\n\ntype StreamTextTransformSetting<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['experimental_transform']\n>\n\ntype StreamTextTransform<T extends ToolSet> = Extract<\n StreamTextTransformSetting<T>,\n (...args: never[]) => unknown\n>\n\ntype ModelPhaseTransform<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextTransform<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextTransform<T>>\n\n/** AI SDK streamText settings that remain meaningful for one durable step. */\nexport type AISDKStepSettings<T extends ToolSet> = Partial<\n Omit<\n StreamTextOptions<T>,\n ControlledStreamTextSetting | RetypedStreamTextSetting | 'timeout'\n >\n> & {\n timeout?: ModelStepTimeout<T>\n onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n experimental_onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n experimental_onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_transform?:\n ModelPhaseTransform<T> | Array<ModelPhaseTransform<T>>\n}\n\nexport type AISDKStepInput<M extends UIMessage, T extends ToolSet> = {\n model: LanguageModel\n tools: T\n messages: M[]\n modelMessages?: ModelMessage[]\n responseMessageId: string\n abortSignal: AbortSignal\n instructions?: Instructions\n settings?: AISDKStepSettings<T>\n messageMetadata?: (options: {\n part: TextStreamPart<T>\n }) => UIMessageMetadata<M> | undefined\n}\n\nexport type AISDKStepCompletion = {\n finishReason: FinishReason\n usage: LanguageModelUsage\n}\n\nexport type AISDKStepResult<M extends UIMessage> = {\n stream: ReadableStream<InferUIMessageChunk<M>>\n completion(): AISDKStepCompletion\n}\n\nconst CONTROLLED_SETTINGS: readonly ControlledStreamTextSetting[] = [\n '_internal',\n 'abortSignal',\n 'instructions',\n 'messages',\n 'model',\n 'onToolExecutionEnd',\n 'onToolExecutionStart',\n 'experimental_onToolCallFinish',\n 'experimental_onToolCallStart',\n 'experimental_sandbox',\n 'experimental_toolCallers',\n 'experimental_toolApprovalSecret',\n 'prompt',\n 'prepareStep',\n 'stopWhen',\n 'system',\n 'tools',\n]\n\nconst safeSettings = <T extends ToolSet>(\n settings: AISDKStepSettings<T> | undefined,\n): AISDKStepSettings<T> => {\n const result = { ...settings } as AISDKStepSettings<T>\n for (const key of CONTROLLED_SETTINGS) Reflect.deleteProperty(result, key)\n if (typeof result.timeout === 'object' && result.timeout !== null) {\n const timeout = { ...result.timeout } as Record<string, unknown>\n Reflect.deleteProperty(timeout, 'toolMs')\n Reflect.deleteProperty(timeout, 'tools')\n result.timeout = timeout as ModelStepTimeout<T>\n }\n return result\n}\n\nconst modelToolSet = <T extends ToolSet>(tools: T): T =>\n Object.fromEntries(\n Object.entries(tools).map(([name, tool]) => {\n if (tool.type === 'provider' && tool.isProviderExecuted === true) {\n return [name, tool]\n }\n const definition = { ...tool }\n Reflect.deleteProperty(definition, 'execute')\n return [name, definition]\n }),\n ) as T\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\n/** Run exactly one AI SDK model step while leaving local tool execution to A2. */\nexport async function generateAISDKStep<M extends UIMessage, T extends ToolSet>(\n input: AISDKStepInput<M, T>,\n): Promise<AISDKStepResult<M>> {\n const settings = safeSettings(input.settings)\n const tools = modelToolSet(input.tools)\n const messages =\n input.modelMessages ??\n (await convertToModelMessages(input.messages, { tools }))\n const streamOptions = {\n ...settings,\n model: input.model,\n tools,\n messages,\n abortSignal: input.abortSignal,\n ...(input.instructions === undefined\n ? {}\n : { instructions: input.instructions }),\n stopWhen: stepCountIs(1),\n // A2 records stream failures durably; the AI SDK default writes them to\n // stderr in addition to yielding an error part.\n onError: settings.onError ?? (() => {}),\n } as unknown as StreamTextOptions<T>\n const result = streamText<T>(streamOptions)\n\n let completion: AISDKStepCompletion | undefined\n let fatalError: { value: unknown } | undefined\n const observed = result.stream.pipeThrough(\n new TransformStream<TextStreamPart<T>, TextStreamPart<T>>({\n transform(part, controller) {\n if (part.type === 'error' && fatalError === undefined) {\n fatalError = { value: part.error }\n } else if (part.type === 'finish') {\n completion = {\n finishReason: part.finishReason,\n usage: part.totalUsage,\n }\n }\n controller.enqueue(part)\n },\n }),\n )\n\n return {\n stream: toUIMessageStream<T, M>({\n stream: observed,\n tools,\n generateMessageId: () => input.responseMessageId,\n onError: errorMessage,\n ...(input.messageMetadata === undefined\n ? {}\n : { messageMetadata: input.messageMetadata }),\n }),\n completion() {\n if (fatalError !== undefined) throw fatalError.value\n if (completion === undefined) {\n throw new Error('AI SDK step ended without a finish part')\n }\n if (completion.finishReason === 'error') {\n throw new Error('AI SDK step finished with an error')\n }\n return completion\n },\n }\n}\n","import type { LanguageModel } from 'ai'\nimport type { ModelLimits } from './ai.ts'\n\nconst catalogUrl = 'https://ai-gateway.vercel.sh/v1/models'\nconst catalogLifetimeMs = 60 * 60 * 1_000\nconst catalogTimeoutMs = 5_000\n\nlet catalog:\n | {\n expiresAt: number\n promise: Promise<ReadonlyMap<string, ModelLimits>>\n }\n | undefined\n\nexport const gatewayModelId = (model: LanguageModel): string | undefined => {\n if (typeof model === 'string') {\n return globalThis.AI_SDK_DEFAULT_PROVIDER === undefined ? model : undefined\n }\n return model.provider === 'gateway' ? model.modelId : undefined\n}\n\nconst readCatalog = (): Promise<ReadonlyMap<string, ModelLimits>> => {\n if (catalog && catalog.expiresAt > Date.now()) return catalog.promise\n const entry = {\n expiresAt: Number.POSITIVE_INFINITY,\n promise: (async () => {\n const controller = new AbortController()\n const timeout = setTimeout(\n () => controller.abort(new Error('model catalog request timed out')),\n catalogTimeoutMs,\n )\n timeout.unref?.()\n try {\n const response = await fetch(catalogUrl, { signal: controller.signal })\n if (!response.ok)\n throw new Error(\n `model catalog request failed: HTTP ${response.status}`,\n )\n const body: unknown = await response.json()\n if (\n typeof body !== 'object' ||\n body === null ||\n !('data' in body) ||\n !Array.isArray(body.data)\n ) {\n throw new Error('model catalog response must contain a data array')\n }\n const models = new Map<string, ModelLimits>()\n for (const row of body.data as unknown[]) {\n if (\n typeof row !== 'object' ||\n row === null ||\n !('type' in row) ||\n !('id' in row) ||\n !('context_window' in row) ||\n !('max_tokens' in row) ||\n row.type !== 'language' ||\n typeof row.id !== 'string' ||\n typeof row.context_window !== 'number' ||\n typeof row.max_tokens !== 'number' ||\n !Number.isSafeInteger(row.context_window) ||\n row.context_window <= 0 ||\n !Number.isSafeInteger(row.max_tokens) ||\n row.max_tokens <= 0\n )\n continue\n models.set(row.id, {\n contextWindow: row.context_window,\n maxOutputTokens: row.max_tokens,\n })\n }\n return models\n } finally {\n clearTimeout(timeout)\n }\n })(),\n }\n catalog = entry\n entry.promise = entry.promise.then(\n (models) => {\n entry.expiresAt = Date.now() + catalogLifetimeMs\n return models\n },\n (error: unknown) => {\n if (catalog === entry) catalog = undefined\n throw error\n },\n )\n return entry.promise\n}\n\nexport const readModelLimits = async (options: {\n modelId: string\n signal: AbortSignal\n}): Promise<ModelLimits | null> => {\n options.signal.throwIfAborted()\n let onAbort!: () => void\n const aborted = new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(options.signal.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n })\n try {\n const models = await Promise.race([readCatalog(), aborted])\n return models.get(options.modelId) ?? null\n } finally {\n options.signal.removeEventListener('abort', onAbort)\n }\n}\n","import { Buffer } from 'node:buffer'\nimport { asSchema } from 'ai'\nimport type { Instructions, ModelMessage, ToolSet } from 'ai'\nimport type { AICoordinatorState } from './ai-coordinator.ts'\n\nconst withoutProviderOptions = <T extends object>(value: T): T => {\n const result = { ...value }\n Reflect.deleteProperty(result, 'providerOptions')\n return result\n}\n\nconst estimatedMessage = (message: ModelMessage): unknown => ({\n ...withoutProviderOptions(message),\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) =>\n part.type === 'tool-result'\n ? {\n ...withoutProviderOptions(part),\n output: {\n ...withoutProviderOptions(part.output),\n ...(part.output.type === 'content'\n ? {\n value: part.output.value.map(withoutProviderOptions),\n }\n : {}),\n },\n }\n : withoutProviderOptions(part),\n ),\n})\n\nexport const estimateInputTokens = async (options: {\n messages: ModelMessage[]\n instructions: Instructions | undefined\n tools: ToolSet\n}): Promise<number> => {\n const tools = await Promise.all(\n Object.entries(options.tools).map(async ([name, tool]) => ({\n name,\n description: tool.description,\n inputSchema: await asSchema(tool.inputSchema).jsonSchema,\n })),\n )\n const instructions = options.instructions\n return Math.ceil(\n Buffer.byteLength(\n JSON.stringify({\n messages: options.messages.map(estimatedMessage),\n instructions:\n instructions === undefined || typeof instructions === 'string'\n ? instructions\n : Array.isArray(instructions)\n ? instructions.map(estimatedMessage)\n : estimatedMessage(instructions),\n tools,\n }),\n 'utf8',\n ) / 4,\n )\n}\n\nexport const measuredInputTokens = (options: {\n estimate: number\n model: string\n calibration: AICoordinatorState['calibration']\n}): number => {\n const previous = options.calibration\n return previous !== undefined &&\n previous.model === options.model &&\n options.estimate >= previous.estimate\n ? Math.ceil(previous.inputTokens + options.estimate - previous.estimate)\n : options.estimate\n}\n","/**\n * The server-only implementation of the experimental-a2/ai protocol: the\n * handler table and `agent()`, its assembly as an ordinary A2 server.\n */\n\n// oxlint-disable no-await-in-loop -- stream chunks and durable appends are\n// ordered; parallel consumption would corrupt progress sequence and state.\n\nimport { createControlRuntime, ControlCancelled } from './ai-control-server.ts'\nimport {\n createContextReducer,\n contextForAttempt,\n generationBase,\n type AIContextState,\n type AIModelContext,\n} from './ai-context.ts'\nimport { isAgentContract } from './ai-app-state.ts'\nimport { boundedCache } from './bounded-cache.ts'\nimport type { Reducer } from './reducer.ts'\nimport { aiEventId, AI_EVENT_ID_PREFIX } from './ai-id.ts'\nimport type { ControlCommit, ControlCommand } from './ai-control.ts'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { createHash } from 'node:crypto'\nimport { convertToModelMessages, isToolUIPart } from 'ai'\nimport type {\n FinishReason,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport { generateAISDKStep, type AISDKStepSettings } from './ai-sdk-step.ts'\nimport { gatewayModelId, readModelLimits } from './ai-model-metadata.ts'\nimport { estimateInputTokens, measuredInputTokens } from './ai-input-tokens.ts'\nimport { AI_STATE_REDUCER, agentContract, events as aiEvents } from './ai.ts'\nimport type {\n AIEventDefs,\n AIMessageOf,\n AIState,\n AgentToolContext,\n AgentToolEventDefs,\n ApprovalRequestedPayload,\n CompactionCompletedPayload,\n CompactionRequestedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationStartedPayload,\n MessageCompletedPayload,\n ReasoningLevel,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport type { AICoordinatorState } from './ai-coordinator.ts'\nimport type {\n AppendInput,\n Contract,\n ContractEvent,\n EventDefs,\n} from './contract.ts'\nimport { A2Error } from './errors.ts'\nimport {\n consumeSchedulerSendFailure,\n installAmbientToolScopeStorage,\n type AmbientToolScope,\n} from './internal.ts'\nimport {\n createServer,\n type A2Server,\n type HandlerContext,\n type ServerOptions,\n} from './server.ts'\nimport {\n setServerFetchHooks,\n type ServerIngressContext,\n} from './server-fetch.ts'\nimport { CONSOLE_TELEMETRY, type A2Telemetry } from './telemetry.ts'\n\nconst isAgentIngressEvent = (event: {\n type: string\n payload: unknown\n}): boolean => {\n if (event.type !== 'ai.control.requested') return false\n const command = event.payload\n if (typeof command !== 'object' || command === null) return false\n const action = (command as { action?: unknown }).action\n if (action === 'request-input' || action === 'tool-result') return false\n if (action === 'send' || action === 'edit' || action === 'steer')\n return (\n (command as { message?: { role?: unknown } }).message?.role === 'user'\n )\n return true\n}\n\n// With a shared contract, browsers push application events like any A2\n// client, under the route's `authorize`. Events declared with `name` have no\n// client that can push them, so they stay server-only.\nconst validateAgentIngress = ({\n context,\n applicationEvents,\n}: {\n context: ServerIngressContext\n applicationEvents: boolean\n}): void => {\n const rejected = context.events.find((event) =>\n Object.hasOwn(aiEvents, event.type)\n ? !isAgentIngressEvent(event)\n : !applicationEvents,\n )\n if (rejected !== undefined) {\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `event '${rejected.type}' is server-only for an AI agent`,\n )\n }\n}\n\ntype AgentGenerationProgress = {\n type: 'progress'\n chunks: UIMessageChunk[]\n}\n\ntype AgentGenerationFinish = {\n type: 'finish'\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype AgentGenerationUpdate = AgentGenerationProgress | AgentGenerationFinish\n\nexport type AgentGenerateContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n X extends object = Record<never, never>,\n> = AgentResolverContext<M, D, X> & {\n generationId: string\n modelMessages: ModelMessage[]\n model: LanguageModel\n tools: T\n instructions?: Instructions\n generation: AgentGenerationSettings<T>\n}\n\nexport type AgentGenerate<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n X extends object = Record<never, never>,\n> = (\n context: AgentGenerateContext<M, D, T, X>,\n) => ReadableStream<UIMessageChunk> | Promise<ReadableStream<UIMessageChunk>>\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\nexport type AgentMessageMetadata<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n X extends object = Record<never, never>,\n> = (\n context: AgentGenerateContext<M, D, T, X> & { part: TextStreamPart<T> },\n) => UIMessageMetadata<M> | undefined\n\nexport type AgentResolverContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n X extends object = Record<never, never>,\n> = {\n event: ContractEvent<D, 'ai.generation.requested'>\n messages: M[]\n /**\n * The contract's application state, as of the captured snapshot. It rides\n * in the checkpoint the generation already reads, so it costs no I/O.\n */\n state: X\n session: Pick<HandlerContext<D>['session'], 'state'>\n signal: AbortSignal\n}\n\nexport type Resolvable<T, C> = T | ((context: C) => T | Promise<T>)\n\n/** A model with its reasoning level and speed, chosen together. */\nexport type ModelSettings = {\n model: LanguageModel\n /** Overrides `generation.reasoning`. */\n reasoning?: ReasoningLevel\n /** `fast` prefers AI Gateway's faster tier when the model offers one. */\n speed?: 'fast' | 'standard'\n}\n\nexport type CompactionPolicy<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n X extends object = Record<never, never>,\n> = {\n shouldCompact(\n context: AgentResolverContext<M, D, X> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): boolean | Promise<boolean>\n compact(\n context: AgentResolverContext<M, D, X> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): M[] | Promise<M[]>\n}\n\nexport type AutomaticCompaction = {\n thresholdTokens?: number\n instructions?: string\n}\n\nexport type CompactionOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n X extends object = Record<never, never>,\n> = false | AutomaticCompaction | CompactionPolicy<M, D, X>\n\nexport type AgentGenerationSettings<T extends ToolSet> = AISDKStepSettings<T>\n\nexport type HandlersOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n X extends object = Record<never, never>,\n> = AgentModelOptions<M, D, T, X> & {\n contract: Contract<D, Record<never, never>, unknown>\n telemetry?: A2Telemetry\n}\n\nexport type AgentModelOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n X extends object = Record<never, never>,\n> = {\n /**\n * AI SDK model string or provider model, or `ModelSettings` to choose its\n * reasoning level and speed with it, optionally resolved per generation.\n */\n model: Resolvable<\n LanguageModel | ModelSettings,\n AgentResolverContext<M, D, X>\n >\n tools?: T\n instructions?: Resolvable<\n Instructions | undefined,\n AgentResolverContext<M, D, X>\n >\n /** Settings for each one-step AI SDK streamText call, resolved per generation. */\n generation?: Resolvable<\n AgentGenerationSettings<T>,\n AgentResolverContext<M, D, X>\n >\n /**\n * Maximum model steps in one assistant response. Defaults to Infinity.\n */\n maxSteps?: number\n /** Map default AI SDK stream parts to typed assistant message metadata. */\n messageMetadata?: AgentMessageMetadata<M, D, T, X>\n /**\n * Replace model generation with an AI SDK UI message chunk stream.\n * The custom stream owns its metadata chunks.\n */\n generate?: AgentGenerate<M, D, T, X>\n compaction?: Resolvable<\n CompactionOptions<M, D, X>,\n AgentResolverContext<M, D, X>\n >\n /** Progress is durably flushed at either limit, whichever is reached first. */\n progress?: { maxChunks?: number; maxDelayMs?: number }\n /**\n * Run local tool executions one at a time on this lane. By default,\n * independent tools run concurrently.\n */\n toolLane?: string\n}\n\ntype AgentServerOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n S,\n T extends ToolSet,\n X extends object = Record<never, never>,\n> = AgentModelOptions<M, D, T, X> &\n Omit<\n ServerOptions<D, Record<never, never>, Reducer<D, S>>,\n 'contract' | 'handlers'\n > & {\n /** Handlers for application events. */\n handlers?: ServerOptions<D, Record<never, never>, Reducer<D, S>>['handlers']\n }\n\nexport type AgentOptions<\n M extends UIMessage,\n E extends EventDefs,\n T extends ToolSet,\n> = AgentServerOptions<\n NoInfer<M>,\n AIEventDefs<NoInfer<M>> & E,\n AIState<NoInfer<M>>,\n T\n> & {\n /** Identity: prefixes storage keys and queue messages. */\n name: string\n /**\n * Server-only application events. Browsers push application events through\n * a shared `agentContract()`.\n */\n events?: E\n /** Optional stricter schema for custom UIMessage metadata/data/tool types. */\n messageSchema?: StandardSchemaV1<M>\n}\n\nexport type AgentFromContractOptions<\n D extends AIEventDefs<AIMessageOf<D>> & EventDefs,\n S,\n T extends ToolSet,\n Name extends string = string,\n X extends object = Record<never, never>,\n> = AgentServerOptions<AIMessageOf<D>, D, S, T, X> & {\n /**\n * A shared `agentContract()`. Its application state reaches every resolver\n * as `state`; a fully custom contract is core A2, served by `createServer()`.\n */\n contract: Contract<\n D,\n Record<never, never>,\n Reducer<D, S> & { readonly name: Name; readonly '~appState': X }\n >\n}\n\n/**\n * An A2 server for the AI protocol; `typeof` it types `useAgent`. `Name` is\n * its reducer's name: the built-in one lets contract-free clients fold state.\n */\nexport type Agent<\n D extends EventDefs,\n S,\n Name extends string = string,\n> = A2Server<D, Record<never, never>, Reducer<D, S> & { readonly name: Name }>\n\nconst checkAbort = (signal: AbortSignal): boolean => {\n if (!signal.aborted) return false\n const reason: unknown = signal.reason\n if (\n reason instanceof A2Error &&\n (reason.code === 'CLAIM_EXPIRED' || reason.code === 'SUPERSEDED_ATTEMPT')\n ) {\n throw reason\n }\n return true\n}\n\nconst resolve = async <T, C extends { signal: AbortSignal }>(\n value: Resolvable<T, C>,\n context: C,\n): Promise<T> => {\n let result: T\n try {\n result =\n typeof value === 'function'\n ? await (value as (context: C) => T | Promise<T>)(context)\n : value\n } catch (error) {\n checkAbort(context.signal)\n throw error\n }\n checkAbort(context.signal)\n return result\n}\n\nconst withModelSettings = <T extends ToolSet>(options: {\n generation: AgentGenerationSettings<T>\n settings: ModelSettings\n}): AgentGenerationSettings<T> => {\n const { generation, settings } = options\n if (settings.reasoning === undefined && settings.speed === undefined)\n return generation\n const { speed: _speed, ...gateway } =\n generation.providerOptions?.['gateway'] ?? {}\n return {\n ...generation,\n ...(settings.reasoning === undefined\n ? {}\n : { reasoning: settings.reasoning }),\n ...(settings.speed === undefined\n ? {}\n : {\n providerOptions: {\n ...generation.providerOptions,\n gateway:\n settings.speed === 'fast'\n ? { ...gateway, speed: 'fast' }\n : gateway,\n },\n }),\n }\n}\n\nconst modelName = (model: LanguageModel): string => {\n if (typeof model === 'string') return model\n if ('modelId' in model && typeof model.modelId === 'string') {\n return model.modelId\n }\n return 'custom'\n}\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\nconst toolScopeStorage = installAmbientToolScopeStorage(\n () => new AsyncLocalStorage<AmbientToolScope>(),\n)\n\n/** Run `fn` with `ctx` as the ambient tool handler context, for direct tool tests. */\nexport function runWithHandlerContext<D extends AgentToolEventDefs, R>(\n ctx: AgentToolContext<D>,\n fn: () => R,\n): R {\n return toolScopeStorage.run({ context: ctx }, fn)\n}\n\n/** Sessions whose latest step prompt one process keeps for that step's tools. */\nconst PROMPT_SESSIONS = 64\n\nconst asyncIterator = (value: unknown): AsyncIterator<unknown> | undefined => {\n if (typeof value !== 'object' || value === null) return undefined\n const factory = Reflect.get(value, Symbol.asyncIterator)\n if (typeof factory !== 'function') return undefined\n return (factory as (this: object) => AsyncIterator<unknown>).call(value)\n}\n\nconst isBoundaryChunk = (chunk: UIMessageChunk | undefined): boolean =>\n chunk !== undefined &&\n (chunk.type === 'text-end' ||\n chunk.type === 'reasoning-end' ||\n chunk.type === 'tool-input-available' ||\n chunk.type === 'tool-input-error' ||\n chunk.type === 'tool-output-available' ||\n chunk.type === 'tool-output-error' ||\n chunk.type === 'tool-output-denied' ||\n chunk.type === 'tool-approval-request' ||\n chunk.type === 'finish' ||\n chunk.type === 'abort' ||\n chunk.type === 'error')\n\ntype DeltaChunk = Extract<\n UIMessageChunk,\n { type: 'text-delta' | 'reasoning-delta' | 'tool-input-delta' }\n>\n\nconst DELTA_KEYS: Record<DeltaChunk['type'], ReadonlySet<string>> = {\n 'text-delta': new Set(['type', 'id', 'delta', 'providerMetadata']),\n 'reasoning-delta': new Set(['type', 'id', 'delta', 'providerMetadata']),\n 'tool-input-delta': new Set(['type', 'toolCallId', 'inputTextDelta']),\n}\n\nconst isDeltaChunk = (chunk: UIMessageChunk): chunk is DeltaChunk =>\n Object.hasOwn(DELTA_KEYS, chunk.type) &&\n Object.keys(chunk).every((key) =>\n DELTA_KEYS[chunk.type as DeltaChunk['type']].has(key),\n ) &&\n typeof (chunk.type === 'tool-input-delta'\n ? chunk.inputTextDelta\n : (chunk as { delta?: unknown }).delta) === 'string'\n\n// Adjacent deltas of one part project exactly as their concatenation: the text\n// appends and the last defined `providerMetadata` wins.\nconst joinDeltas = (\n left: DeltaChunk,\n right: DeltaChunk,\n): DeltaChunk | undefined => {\n if (left.type === 'tool-input-delta')\n return right.type === 'tool-input-delta' &&\n right.toolCallId === left.toolCallId\n ? { ...left, inputTextDelta: left.inputTextDelta + right.inputTextDelta }\n : undefined\n if (\n right.type === 'tool-input-delta' ||\n right.type !== left.type ||\n right.id !== left.id\n )\n return undefined\n const providerMetadata =\n right.providerMetadata !== undefined\n ? right.providerMetadata\n : left.providerMetadata\n return {\n ...left,\n delta: left.delta + right.delta,\n ...(providerMetadata === undefined ? {} : { providerMetadata }),\n }\n}\n\nconst mergeDeltas = (chunks: UIMessageChunk[]): UIMessageChunk[] => {\n const merged: UIMessageChunk[] = []\n for (const chunk of chunks) {\n const previous = merged.at(-1)\n const joined =\n previous !== undefined && isDeltaChunk(previous) && isDeltaChunk(chunk)\n ? joinDeltas(previous, chunk)\n : undefined\n if (joined === undefined) merged.push(chunk)\n else merged[merged.length - 1] = joined\n }\n return merged\n}\n\ntype StreamRead<T> = Awaited<ReturnType<ReadableStreamDefaultReader<T>['read']>>\n\nconst nextOrTimer = async <T>(\n next: Promise<StreamRead<T>>,\n delayMs: number,\n): Promise<{ type: 'next'; result: StreamRead<T> } | { type: 'timer' }> => {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n next.then((result) => ({ type: 'next' as const, result })),\n new Promise<{ type: 'timer' }>((finishTimer) => {\n timer = setTimeout(() => finishTimer({ type: 'timer' }), delayMs)\n ;(timer as { unref?: () => void }).unref?.()\n }),\n ])\n } finally {\n if (timer !== undefined) clearTimeout(timer)\n }\n}\n\ntype GenerationCompletion = {\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype GenerationSource = {\n stream: ReadableStream<UIMessageChunk>\n completion?: () => GenerationCompletion\n}\n\nasync function generateWithAISDK<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n X extends object,\n>(options: {\n agentName: string\n context: AgentGenerateContext<M, D, T, X>\n messageMetadata: AgentMessageMetadata<M, D, T, X> | undefined\n}): Promise<GenerationSource> {\n const { agentName, context, messageMetadata } = options\n const headers = context.generation.headers ?? {}\n const generation =\n gatewayModelId(context.model) === undefined\n ? context.generation\n : {\n ...context.generation,\n headers: Object.keys(headers).some(\n (key) => key.toLowerCase() === 'x-session-affinity',\n )\n ? headers\n : {\n ...headers,\n 'x-session-affinity': createHash('sha256')\n .update(JSON.stringify([agentName, context.event.sessionId]))\n .digest('hex'),\n },\n providerOptions: {\n ...context.generation.providerOptions,\n gateway: {\n caching: 'auto',\n ...context.generation.providerOptions?.['gateway'],\n },\n },\n }\n const step = await generateAISDKStep<M, T>({\n model: context.model,\n tools: context.tools,\n messages: context.messages,\n modelMessages: context.modelMessages,\n responseMessageId: context.event.payload.responseMessageId,\n abortSignal: context.signal,\n ...(context.instructions === undefined\n ? {}\n : { instructions: context.instructions }),\n settings: generation,\n ...(messageMetadata === undefined\n ? {}\n : {\n messageMetadata: ({ part }) =>\n messageMetadata({ ...context, generation, part }),\n }),\n })\n return {\n stream: step.stream as ReadableStream<UIMessageChunk>,\n completion: step.completion,\n }\n}\n\nasync function* consumeGeneration(options: {\n source: GenerationSource\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}): AsyncGenerator<AgentGenerationUpdate> {\n const pending: UIMessageChunk[] = []\n let streamedFinishReason: FinishReason | undefined\n let streamedError: string | undefined\n // Flush as soon as the previous write finishes: chunks that arrive while\n // it is in flight wait in the stream and share the next batch.\n const maxChunks = options.progress?.maxChunks ?? 128\n const maxDelayMs = options.progress?.maxDelayMs ?? 0\n let lastFlush = Date.now()\n const batch = (): AgentGenerationProgress => ({\n type: 'progress',\n chunks: mergeDeltas(pending.splice(0)),\n })\n const reader = options.source.stream.getReader()\n let pendingChunk = reader.read()\n try {\n for (;;) {\n let result: StreamRead<UIMessageChunk>\n if (pending.length > 0) {\n const remaining = Math.max(0, maxDelayMs - (Date.now() - lastFlush))\n const outcome = await nextOrTimer(pendingChunk, remaining)\n if (outcome.type === 'timer') {\n yield batch()\n lastFlush = Date.now()\n continue\n }\n result = outcome.result\n } else {\n result = await pendingChunk\n }\n if (result.done) break\n const chunk = result.value\n pending.push(chunk)\n if (chunk.type === 'finish') streamedFinishReason = chunk.finishReason\n if (chunk.type === 'error') streamedError = chunk.errorText\n pendingChunk = reader.read()\n\n if (pending.length >= maxChunks || isBoundaryChunk(pending.at(-1))) {\n yield batch()\n lastFlush = Date.now()\n }\n }\n } catch (error) {\n if (pending.length > 0) yield batch()\n throw error\n } finally {\n void pendingChunk.catch(() => {})\n try {\n await reader.cancel()\n } catch {\n // Cleanup must not replace the error that ended generation.\n } finally {\n reader.releaseLock()\n }\n }\n\n let completion: GenerationCompletion | undefined\n try {\n completion = options.source.completion?.()\n } catch (error) {\n if (pending.length > 0) {\n yield batch()\n }\n throw error\n }\n if (pending.length > 0) {\n yield batch()\n }\n if (streamedError !== undefined) throw new Error(streamedError)\n const finishReason = completion?.finishReason ?? streamedFinishReason\n yield {\n type: 'finish',\n ...(finishReason === undefined ? {} : { finishReason }),\n ...(completion?.usage === undefined ? {} : { usage: completion.usage }),\n }\n}\n\nconst foldAIEvents = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n reducer: Reducer<D, AIContextState<M>>\n state: AIContextState<M>\n events: ContractEvent<D>[]\n}): AIContextState<M> => {\n let state = options.state\n for (const event of options.events) state = options.reducer.fold(state, event)\n return state\n}\n\nconst summarize = async <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n agentName: string\n context: AgentGenerateContext<M, D, T>\n instructions: string | undefined\n}): Promise<{ summary: string; usage?: LanguageModelUsage }> => {\n const instruction = [\n 'Summarize this conversation so you can continue the task after the earlier context is replaced by your summary.',\n 'Preserve the objective, constraints, decisions, exact identifiers, completed actions and their results, unresolved questions, and next steps. Distinguish observations from assumptions.',\n 'Respond only with the summary as text. Do not call any tools or continue working on the task.',\n options.instructions,\n ]\n .filter(Boolean)\n .join('\\n')\n const generation = { ...options.context.generation }\n for (const key of Object.keys(generation)) {\n if (\n key.startsWith('on') ||\n key.startsWith('experimental_on') ||\n [\n 'repairToolCall',\n 'experimental_repairToolCall',\n 'experimental_refineToolInput',\n 'experimental_transform',\n 'toolApproval',\n ].includes(key)\n ) {\n Reflect.deleteProperty(generation, key)\n }\n }\n const tools = Object.fromEntries(\n Object.entries(options.context.tools).map(([name, tool]) => {\n const definition = { ...tool, needsApproval: false }\n for (const key of [\n 'execute',\n 'onInputStart',\n 'onInputDelta',\n 'onInputAvailable',\n ]) {\n Reflect.deleteProperty(definition, key)\n }\n return [name, definition]\n }),\n ) as T\n const source = await generateWithAISDK({\n agentName: options.agentName,\n context: {\n ...options.context,\n generation,\n tools,\n modelMessages: [\n ...options.context.modelMessages,\n { role: 'user', content: instruction },\n ],\n },\n messageMetadata: undefined,\n })\n let summary = ''\n let calledTool = false\n let finish: AgentGenerationFinish | undefined\n for await (const update of consumeGeneration({ source })) {\n options.context.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n for (const chunk of update.chunks) {\n if (chunk.type === 'text-delta') summary += chunk.delta\n if (chunk.type.startsWith('tool-')) calledTool = true\n }\n }\n if (\n calledTool ||\n summary.trim().length === 0 ||\n finish?.finishReason !== 'stop'\n ) {\n throw new Error(\n 'compaction must produce a complete text summary without calling tools',\n )\n }\n return {\n summary,\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n}\n\nconst activeCompaction = <M extends UIMessage>(\n state: AIModelContext<M>,\n): AIModelContext<M>['compaction'] => {\n const compaction = state.compaction\n return compaction?.status === 'completed' ? compaction : null\n}\n\nconst contextMessages = <M extends UIMessage>({\n state,\n coordinator,\n}: {\n state: AIModelContext<M>\n coordinator: AICoordinatorState\n}): M[] => {\n const queued = new Set(coordinator.queued.map((item) => item.messageId))\n return state.messages.filter((message) => !queued.has(message.id))\n}\n\nconst modelContext = async <M extends UIMessage>(options: {\n messages: M[]\n state: AIModelContext<M>\n tools: ToolSet\n}): Promise<ModelMessage[]> => {\n const messages = await convertToModelMessages(options.messages, {\n tools: options.tools,\n })\n const summary = activeCompaction(options.state)?.summary\n return summary === undefined\n ? messages\n : [{ role: 'user', content: summary }, ...messages]\n}\n\ntype ToolCallClassification = 'automatic' | 'approval' | 'unknown'\n\ntype PendingToolCall = {\n call: ToolCalledPayload\n classification: ToolCallClassification\n}\n\nconst toolCalledEvent = async <D extends EventDefs>(\n payload: ToolCalledPayload,\n): Promise<AppendInput<D>> =>\n ({\n type: 'ai.tool.called',\n id: await aiEventId(\n 'a2.ai.tool.called',\n payload.generationId,\n payload.toolCallId,\n ),\n payload,\n }) as AppendInput<D>\n\nconst approvalClassification = <T extends ToolSet>(\n tools: T,\n generation: AgentGenerationSettings<T>,\n toolName: string,\n): ToolCallClassification => {\n const configured = generation.toolApproval\n if (typeof configured === 'function') return 'unknown'\n const policy = configured?.[toolName]\n if (typeof policy === 'function') return 'unknown'\n if (\n policy === 'user-approval' ||\n (typeof policy === 'object' && policy?.type === 'user-approval')\n ) {\n return 'approval'\n }\n if (\n policy === 'denied' ||\n (typeof policy === 'object' && policy?.type === 'denied')\n ) {\n return 'approval'\n }\n const tool = tools[toolName] as { needsApproval?: unknown } | undefined\n if (typeof tool?.needsApproval === 'function') return 'unknown'\n return tool?.needsApproval === true ? 'approval' : 'automatic'\n}\n\nconst lifecycleEvents = async <\n D extends EventDefs,\n T extends ToolSet,\n>(options: {\n requestId: string\n messageId: string\n generationId: string\n sequence: number\n chunks: UIMessageChunk[]\n pending: PendingToolCall[]\n tools: T\n generation: AgentGenerationSettings<T>\n custom: boolean\n}): Promise<{ events: AppendInput<D>[]; pending: PendingToolCall[] }> => {\n const result: AppendInput<D>[] = []\n const pending = [...options.pending]\n const take = (toolCallId: string): PendingToolCall | undefined => {\n const index = pending.findIndex(\n (candidate) => candidate.call.toolCallId === toolCallId,\n )\n if (index === -1) return undefined\n return pending.splice(index, 1)[0]\n }\n const flush = async (toolCallId: string): Promise<void> => {\n const pendingCall = take(toolCallId)\n if (pendingCall) result.push(await toolCalledEvent<D>(pendingCall.call))\n }\n for (const [chunkIndex, chunk] of options.chunks.entries()) {\n const resultId = (): Promise<string> =>\n aiEventId(\n 'a2.ai.tool.stream-result',\n options.generationId,\n String(options.sequence),\n String(chunkIndex),\n )\n if (chunk.type === 'tool-input-available') {\n const payload: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...((\n options.tools[chunk.toolName] as\n { supportsDeferredResults?: boolean } | undefined\n )?.supportsDeferredResults === true\n ? { supportsDeferredResults: true }\n : {}),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n }\n take(payload.toolCallId)\n const classification = approvalClassification(\n options.tools,\n options.generation,\n chunk.toolName,\n )\n if (classification === 'automatic') {\n result.push(await toolCalledEvent<D>(payload))\n } else {\n pending.push({ call: payload, classification })\n }\n } else if (chunk.type === 'tool-input-error') {\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n ...(chunk.dynamic ? { input: chunk.input } : { rawInput: chunk.input }),\n error: chunk.errorText,\n phase: 'input',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n const called: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n }\n take(chunk.toolCallId)\n result.push(await toolCalledEvent<D>(called), {\n type: 'ai.tool.result',\n id: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-available') {\n await flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n output: chunk.output,\n phase: 'execution',\n ...(chunk.preliminary === undefined\n ? {}\n : { preliminary: chunk.preliminary }),\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-error') {\n await flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n error: chunk.errorText,\n phase: 'execution',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-denied') {\n await flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n denied: true,\n phase: 'execution',\n }\n result.push({\n type: 'ai.tool.result',\n id: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-request') {\n await flush(chunk.toolCallId)\n const payload: ApprovalRequestedPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n toolCallId: chunk.toolCallId,\n ...(chunk.isAutomatic === undefined\n ? {}\n : { isAutomatic: chunk.isAutomatic }),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n result.push({\n type: 'ai.approval.requested',\n id: await aiEventId(\n 'a2.ai.approval.requested',\n options.generationId,\n chunk.approvalId,\n ),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-response') {\n result.push({\n type: 'ai.approval.responded',\n id: await aiEventId(\n 'a2.ai.approval.automatic-response',\n options.generationId,\n chunk.approvalId,\n ),\n payload: {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n },\n } as AppendInput<D>)\n }\n }\n return { events: result, pending }\n}\n\nconst validateCompaction = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n compaction: CompactionOptions<M, D>\n explicit: boolean\n generation: AgentGenerationSettings<T> | undefined\n tools: T | undefined\n}): CompactionOptions<M, D> => {\n let compaction = options.compaction\n if (\n compaction !== false &&\n (typeof compaction !== 'object' || compaction === null)\n ) {\n throw new TypeError('compaction must resolve to false or a policy object')\n }\n if (compaction !== false && 'then' in compaction) {\n void Promise.resolve(compaction).catch(() => {})\n throw new TypeError('compaction options must be a policy or a resolver')\n }\n if (compaction !== false && !('shouldCompact' in compaction)) {\n if (\n compaction.thresholdTokens !== undefined &&\n (!Number.isSafeInteger(compaction.thresholdTokens) ||\n compaction.thresholdTokens < 1)\n ) {\n throw new TypeError(\n 'compaction.thresholdTokens must be a positive safe integer',\n )\n }\n const choice = options.generation?.toolChoice\n const unsupported =\n options.generation?.output !== undefined\n ? 'structured output'\n : choice !== undefined && choice !== 'auto' && choice !== 'none'\n ? 'forced tool choice'\n : Object.values(options.tools ?? {}).some(\n (tool) =>\n tool.type === 'provider' && tool.isProviderExecuted === true,\n )\n ? 'provider-executed tools'\n : undefined\n if (unsupported !== undefined) {\n if (options.explicit) {\n throw new TypeError(\n `automatic compaction does not support ${unsupported}; use a custom policy or compaction: false`,\n )\n }\n compaction = false\n }\n }\n\n return compaction\n}\n\nexport function createHandlers<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n X extends object = Record<never, never>,\n>(\n options: HandlersOptions<M, D, T, X>,\n): NonNullable<ServerOptions<D>['handlers']> {\n if (options.model === undefined) {\n throw new TypeError('agent requires model')\n }\n if (\n options.progress?.maxChunks !== undefined &&\n (!Number.isInteger(options.progress.maxChunks) ||\n options.progress.maxChunks < 1)\n ) {\n throw new TypeError('progress.maxChunks must be a positive integer')\n }\n if (\n options.progress?.maxDelayMs !== undefined &&\n (!Number.isFinite(options.progress.maxDelayMs) ||\n options.progress.maxDelayMs < 0)\n ) {\n throw new TypeError('progress.maxDelayMs must be a non-negative number')\n }\n if (\n options.maxSteps !== undefined &&\n options.maxSteps !== Number.POSITIVE_INFINITY &&\n (!Number.isInteger(options.maxSteps) || options.maxSteps < 1)\n ) {\n throw new TypeError('maxSteps must be a positive integer or Infinity')\n }\n\n const configuredCompaction =\n options.compaction ?? (options.generate === undefined ? {} : false)\n const staticCompaction =\n typeof configuredCompaction === 'function'\n ? undefined\n : validateCompaction({\n compaction: configuredCompaction,\n explicit: options.compaction !== undefined,\n generation:\n typeof options.generation === 'function'\n ? undefined\n : options.generation,\n tools: options.tools,\n })\n\n const tools = options.tools ?? ({} as T)\n const telemetry = options.telemetry ?? CONSOLE_TELEMETRY\n const maxSteps = options.maxSteps ?? Number.POSITIVE_INFINITY\n const control = createControlRuntime({\n contract: options.contract,\n telemetry,\n })\n const controlHandler: typeof control.handler = (ctx) =>\n telemetry.span(\n 'a2.ai.control',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.control.type': ctx.event.type,\n 'a2.ai.control.id': ctx.event.id,\n 'a2.ai.control.attempt': ctx.attempt,\n },\n () => control.handler(ctx),\n )\n const coordinator = control.coordinator\n const contextReducer = createContextReducer<M, D>({\n contract: options.contract,\n })\n const readContext = async (\n session: HandlerContext<D>['session'],\n through: number | 'latest',\n ) => {\n const snapshot = await session.state(contextReducer, { through })\n return snapshot\n }\n // A session's next step starts only after its tools settle, so only its\n // latest step's prompt is ever reused. A miss rebuilds the prompt from the\n // context checkpoint, so eviction is memory policy, never correctness.\n const prompts = boundedCache<\n string,\n { generationId: string; messages: Promise<ModelMessage[]> }\n >({ maxEntries: PROMPT_SESSIONS, maxBytes: PROMPT_SESSIONS })\n const cachePrompt = ({\n sessionId,\n generationId,\n messages,\n }: {\n sessionId: string\n generationId: string\n messages: Promise<ModelMessage[]>\n }): void =>\n // Entries count as one byte, so the bound is the session count.\n prompts.set(sessionId, { generationId, messages }, 1)\n const forgetPrompt = (sessionId: string, generationId: string): void => {\n if (prompts.get(sessionId)?.generationId === generationId)\n prompts.delete(sessionId)\n }\n\n type RuntimeTool = {\n execute?: (\n input: unknown,\n options: {\n toolCallId: string\n messages: ModelMessage[]\n abortSignal?: AbortSignal\n },\n ) => unknown\n }\n\n type ToolHandlerContext = HandlerContext<D, 'ai.tool.execution.requested'>\n\n const resultEvent = async (\n call: ToolCalledPayload,\n suffix: string,\n result: {\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n },\n ): Promise<AppendInput<D>> =>\n ({\n type: 'ai.tool.result',\n id: await aiEventId(\n 'a2.ai.tool.result',\n call.generationId,\n call.toolCallId,\n suffix,\n ),\n payload: {\n requestId: call.requestId,\n messageId: call.messageId,\n generationId: call.generationId,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n phase: 'execution',\n ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.denied === undefined ? {} : { denied: result.denied }),\n ...(result.preliminary === undefined\n ? {}\n : { preliminary: result.preliminary }),\n ...(call.dynamic === undefined ? {} : { dynamic: call.dynamic }),\n ...(call.providerExecuted === undefined\n ? {}\n : { providerExecuted: call.providerExecuted }),\n ...(call.toolMetadata === undefined\n ? {}\n : { toolMetadata: call.toolMetadata }),\n },\n }) as AppendInput<D>\n\n const promptMessages = (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<ModelMessage[]> => {\n const { ctx, call, generation: owner } = input\n const sessionId = ctx.event.sessionId\n const cached = prompts.get(sessionId)\n if (cached?.generationId === call.generationId) return cached.messages\n const computation = (async () => {\n const frontier = owner.promptThroughIndex\n if (frontier === undefined)\n throw new TypeError('AI work requires a prompt checkpoint')\n const snapshot = await readContext(ctx.session, ctx.event.index)\n if (\n snapshot.state.generation?.owner.generationId !== owner.generationId ||\n snapshot.state.generation.owner.requestId !== owner.requestId ||\n snapshot.state.activeProjection?.generationId !== owner.generationId\n )\n throw new TypeError(\n 'Tool prompt checkpoint does not own its generation',\n )\n const state = generationBase(snapshot.state)\n return telemetry.span(\n 'a2.ai.context',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.context.request_id': call.requestId,\n 'a2.ai.context.phase': 'tool',\n },\n () =>\n modelContext({\n messages: state.messages.filter(\n (message) => state.messageIndexes[message.id]! <= frontier,\n ),\n state,\n tools,\n }),\n )\n })()\n cachePrompt({\n sessionId,\n generationId: call.generationId,\n messages: computation,\n })\n void computation.catch(() => forgetPrompt(sessionId, call.generationId))\n return computation\n }\n\n const toolExecutionFailure = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n error: unknown,\n ): Promise<AppendInput<D> | void> => {\n const schedulerFailure = consumeSchedulerSendFailure(error)\n if (checkAbort(ctx.signal)) return\n if (schedulerFailure === 'retryable') throw error\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: errorMessage(error),\n })\n }\n\n const runToolExecution = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n execute: NonNullable<RuntimeTool['execute']>,\n messages: ModelMessage[],\n ): Promise<AppendInput<D> | void> => {\n let output: unknown\n try {\n output = await execute(call.input, {\n toolCallId: call.toolCallId,\n messages,\n abortSignal: ctx.signal,\n })\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n let iterator: AsyncIterator<unknown> | undefined\n try {\n iterator = asyncIterator(output)\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (iterator === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:0`, { output })\n }\n let last: unknown\n let sequence = 0\n let done = false\n try {\n for (;;) {\n let result: IteratorResult<unknown>\n try {\n result = await iterator.next()\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (result.done) {\n if (ctx.signal.reason instanceof A2Error) throw ctx.signal.reason\n done = true\n break\n }\n if (checkAbort(ctx.signal)) return\n last = result.value\n await control.append({\n ctx,\n name: `tool:${call.toolCallId}:preliminary:${sequence}`,\n events: [\n await resultEvent(\n call,\n `${ctx.event.id}:execution:${ctx.attempt}:${sequence}:preliminary`,\n {\n output: result.value,\n preliminary: true,\n },\n ),\n ],\n })\n sequence += 1\n }\n } finally {\n if (!done) {\n try {\n await iterator.return?.()\n } catch {\n // Preserve the failure or cancellation that ended execution.\n }\n }\n }\n return resultEvent(\n call,\n `${ctx.event.id}:execution:${sequence}:final`,\n sequence === 0 ? {} : { output: last },\n )\n }\n\n const executeTool = async (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<AppendInput<D> | void> => {\n const { ctx, call } = input\n const tool = tools[call.toolName] as RuntimeTool | undefined\n const execute = tool?.execute\n if (execute === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: `Tool '${call.toolName}' has no server executor`,\n })\n }\n const messages = await promptMessages(input)\n if (checkAbort(ctx.signal)) return\n const scope: AmbientToolScope = {\n contract: options.contract,\n context: ctx,\n }\n // Async iteration resumes in the caller's context, so the whole\n // execution, not just the execute call, runs inside the scope.\n return toolScopeStorage.run(scope, () =>\n runToolExecution(ctx, call, execute, messages),\n )\n }\n\n const handleToolExecution = async (\n ctx: ToolHandlerContext,\n ): Promise<AppendInput<D>> => {\n try {\n const state = (\n await ctx.session.state(control.reducer, { through: 'latest' })\n ).state\n const request = ctx.event.payload\n const call = state.coordinator.response?.calls.find(\n (candidate) => candidate.work?.id === ctx.event.id,\n )\n if (\n state.active?.turnId !== request.turnId ||\n Object.values(state.pendingStops).includes(request.turnId) ||\n state.active.suspended ||\n state.active.version !== request.version ||\n state.coordinator.response?.failure !== undefined ||\n !call ||\n call.terminal ||\n call.work?.settled\n )\n return control.settled({ ctx, events: undefined })\n return control.settled({\n ctx,\n events: await executeTool({\n ctx,\n call: request.call,\n generation: request.generation,\n }),\n })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n }\n\n const generationHandler = async (\n ctx: HandlerContext<D, 'ai.generation.requested'>,\n ): Promise<void | AppendInput<D> | readonly AppendInput<D>[]> => {\n if (checkAbort(ctx.signal)) return\n const requestId = ctx.event.id\n const request = ctx.event.payload\n const snapshot = await readContext(ctx.session, 'latest')\n if (\n snapshot.state.closed ||\n snapshot.state.authority?.requestId !== requestId ||\n snapshot.state.authority?.phase === 'paused' ||\n snapshot.state.authority?.phase === 'pausing'\n )\n return\n const controlState = (\n await ctx.session.state(control.reducer, { through: snapshot.index })\n ).state\n if (\n request.control !== undefined &&\n Object.values(controlState.pendingStops).includes(request.control.turnId)\n )\n return\n const coordinatorState = controlState.coordinator\n if (\n coordinatorState.closed ||\n coordinatorState.response?.activeRequestId !== requestId\n )\n return\n const response = coordinatorState.response\n const current =\n response.generation?.requestId === requestId\n ? response.generation\n : undefined\n if (\n current !== undefined &&\n (response.completion !== undefined ||\n (response.failure !== undefined &&\n response.failure.superseded !== true))\n )\n return\n if (current !== undefined && current.attempt >= ctx.attempt) return\n const attempt = ctx.attempt\n const generationId = await aiEventId(\n 'a2.ai.generation',\n requestId,\n String(attempt),\n )\n const responseMessageId = request.responseMessageId\n const responseStepCount = response.stepCount\n if (\n request.reason === 'tool' &&\n (request.sourceGenerationId !==\n response.source?.generation.generationId ||\n response.responseMessageId !== request.messageId ||\n response.responseMessageId !== request.responseMessageId)\n )\n return\n const previous = current\n const state =\n previous === undefined\n ? snapshot.state\n : contextForAttempt(snapshot.state)\n const resolverContext: AgentResolverContext<M, D, X> = {\n event: ctx.event,\n messages: contextMessages({ state, coordinator: coordinatorState }),\n // The contract registered this reducer with its declared state type.\n state: (snapshot.state.app ?? {}) as X,\n session: {\n state: (reducer, readOptions) =>\n ctx.session.state(reducer, {\n ...readOptions,\n through: readOptions?.through ?? snapshot.index,\n }),\n },\n signal: ctx.signal,\n }\n\n if (request.reason === 'tool' && responseStepCount >= maxSteps) {\n const source = response.source?.generation\n if (source === undefined) return\n return {\n type: 'ai.generation.failed',\n id: await aiEventId('a2.ai.step-limit', requestId),\n payload: {\n requestId: source.requestId,\n messageId: source.messageId,\n generationId: source.generationId,\n responseMessageId,\n error: `agent exceeded the ${maxSteps}-step limit`,\n stepLimit: true,\n },\n } as AppendInput<D>\n }\n\n const startEvents = async (\n started: GenerationStartedPayload,\n metadataModelId?: string,\n ): Promise<AppendInput<D>[]> => {\n const events: AppendInput<D>[] = []\n if (metadataModelId !== undefined) {\n events.push({\n type: 'ai.model.metadata.requested',\n id: await aiEventId(\n 'a2.ai.model.metadata',\n options.contract.name,\n ctx.event.sessionId,\n metadataModelId,\n ),\n payload: { modelId: metadataModelId },\n } as AppendInput<D>)\n }\n if (previous) {\n const superseded: GenerationFailedPayload = {\n requestId,\n messageId: previous.messageId,\n generationId: previous.generationId,\n responseMessageId: previous.responseMessageId,\n error: 'generation attempt was superseded after an incomplete run',\n superseded: true,\n }\n events.push({\n type: 'ai.generation.failed',\n id: await aiEventId('a2.ai.superseded', previous.generationId),\n payload: superseded,\n } as AppendInput<D>)\n }\n events.push({\n type: 'ai.generation.started',\n id: generationId,\n payload: started,\n } as AppendInput<D>)\n return events\n }\n const startedPayload = (\n model?: LanguageModel,\n ): GenerationStartedPayload => ({\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n attempt,\n ...(model === undefined ? {} : { model: modelName(model) }),\n promptThroughIndex: snapshot.index,\n })\n\n let resolvedModel: LanguageModel | undefined\n let resolving = true\n let generationStarted = false\n try {\n const choice = await resolve(options.model, resolverContext)\n if (choice === undefined) {\n throw new TypeError('the model resolver returned undefined')\n }\n const settings: ModelSettings =\n typeof choice === 'string' || 'specificationVersion' in choice\n ? { model: choice }\n : choice\n const model = settings.model\n if (\n typeof model !== 'string' &&\n (typeof model !== 'object' || model === null)\n )\n throw new TypeError('the model resolver must return a model')\n resolvedModel = model\n if (checkAbort(ctx.signal)) return\n const resolvedInstructions =\n options.instructions === undefined\n ? undefined\n : await resolve(options.instructions, resolverContext)\n if (checkAbort(ctx.signal)) return\n const resolvedGeneration: AgentGenerationSettings<T> = await resolve(\n options.generation ?? {},\n resolverContext,\n )\n if (checkAbort(ctx.signal)) return\n if (\n resolvedGeneration === null ||\n typeof resolvedGeneration !== 'object' ||\n Array.isArray(resolvedGeneration)\n )\n throw new TypeError('the generation resolver must return settings')\n const generation = withModelSettings({\n generation: resolvedGeneration,\n settings,\n })\n const compaction =\n typeof configuredCompaction === 'function' ||\n typeof options.generation === 'function'\n ? validateCompaction({\n compaction:\n typeof configuredCompaction === 'function'\n ? await resolve(configuredCompaction, resolverContext)\n : staticCompaction!,\n explicit: options.compaction !== undefined,\n generation,\n tools: options.tools,\n })\n : staticCompaction!\n if (checkAbort(ctx.signal)) return\n resolving = false\n\n const catalogModelId = gatewayModelId(model)\n const gatewayOptions = generation.providerOptions?.['gateway']\n const usesFallbackModels =\n Array.isArray(gatewayOptions?.['models']) &&\n gatewayOptions['models'].length > 0\n const discoversMetadata =\n compaction !== false &&\n !('shouldCompact' in compaction) &&\n compaction.thresholdTokens === undefined &&\n !usesFallbackModels &&\n catalogModelId !== undefined\n const generationEvents = await control.append({\n ctx,\n name: 'generation-start',\n events: await startEvents(\n startedPayload(model),\n discoversMetadata &&\n !Object.hasOwn(state.modelMetadata, catalogModelId)\n ? catalogModelId\n : undefined,\n ),\n })\n const startIndex = generationEvents.find(\n (event) => event.id === generationId,\n )!.index\n generationStarted = true\n\n if (checkAbort(ctx.signal)) return\n\n const promptCoordinatorState = coordinatorState\n const { messages } = resolverContext\n let generationMessages = messages\n let modelMessages = await telemetry.span(\n 'a2.ai.context',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.context.request_id': requestId,\n 'a2.ai.context.phase': 'generation',\n },\n () => modelContext({ messages, state, tools }),\n )\n const baseContext: AgentGenerateContext<M, D, T, X> = {\n ...resolverContext,\n generationId,\n modelMessages,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation,\n }\n const policy = compaction\n const tracksInput =\n policy !== false &&\n !('shouldCompact' in policy) &&\n (policy.thresholdTokens !== undefined || discoversMetadata)\n const metadata =\n catalogModelId === undefined\n ? undefined\n : state.modelMetadata[catalogModelId]\n const limits =\n metadata?.status === 'resolved' && !usesFallbackModels\n ? metadata.limits\n : undefined\n let inputTokenEstimate: number | undefined\n let compacted = false\n let compactionEstimate:\n | Pick<\n CompactionRequestedPayload,\n 'inputTokenEstimate' | 'inputTokens' | 'thresholdTokens'\n >\n | undefined\n const hasPendingTools = messages.some((message) =>\n message.parts.some(\n (part) =>\n isToolUIPart(part) &&\n !(\n part.state === 'output-error' ||\n part.state === 'output-denied' ||\n (part.state === 'output-available' && part.preliminary !== true)\n ),\n ),\n )\n if (policy && !hasPendingTools) {\n const compactionContext = {\n ...resolverContext,\n messages,\n modelMessages,\n }\n let shouldCompact: boolean\n if ('shouldCompact' in policy) {\n shouldCompact = await policy.shouldCompact(compactionContext)\n } else if (tracksInput) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n const inputTokens = measuredInputTokens({\n estimate: inputTokenEstimate,\n model: modelName(resolvedModel),\n calibration: coordinatorState.calibration,\n })\n const threshold =\n policy.thresholdTokens ??\n (limits === undefined\n ? undefined\n : Math.floor(\n Math.min(\n limits.contextWindow * 0.75,\n limits.contextWindow - (generation.maxOutputTokens ?? 0),\n ),\n ))\n if (\n limits !== undefined &&\n threshold !== undefined &&\n threshold <= 0\n ) {\n throw new Error(\n `output allowance exhausts the ${limits.contextWindow}-token context window`,\n )\n }\n shouldCompact = threshold !== undefined && inputTokens >= threshold\n if (threshold !== undefined && shouldCompact) {\n compactionEstimate = {\n inputTokenEstimate,\n inputTokens,\n thresholdTokens: threshold,\n }\n }\n } else {\n shouldCompact = false\n }\n if (checkAbort(ctx.signal)) return\n if (shouldCompact) {\n const latest = (\n await ctx.session.state(coordinator, { through: 'latest' })\n ).state\n shouldCompact = Object.keys(latest.unsettledTools ?? {}).length === 0\n }\n if (checkAbort(ctx.signal)) return\n if (shouldCompact) {\n const throughMessageId =\n state.messages.findLast(\n (message) =>\n !promptCoordinatorState.queued.some(\n (queued) => queued.messageId === message.id,\n ),\n )?.id ?? request.messageId\n const throughIndex = snapshot.index\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-requested',\n events: [\n {\n type: 'ai.compaction.requested',\n id: await aiEventId(\n 'a2.ai.compaction.requested',\n generationId,\n ),\n payload: {\n generationId,\n throughMessageId,\n throughIndex,\n ...compactionEstimate,\n },\n } as AppendInput<D>,\n ],\n })),\n )\n const result = await telemetry.span(\n 'a2.ai.compaction',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.compaction.request_id': requestId,\n 'a2.ai.compaction.generation_id': generationId,\n 'a2.ai.compaction.policy':\n 'shouldCompact' in policy ? 'custom' : 'automatic',\n },\n async () =>\n !('shouldCompact' in policy)\n ? {\n messages: [] as M[],\n ...(await summarize({\n agentName: options.contract.name,\n context: baseContext,\n instructions: policy.instructions,\n })),\n }\n : { messages: await policy.compact(compactionContext) },\n )\n if (checkAbort(ctx.signal)) return\n const completed: CompactionCompletedPayload<M> = {\n generationId,\n throughMessageId,\n throughIndex,\n ...result,\n ...(promptCoordinatorState.queued.length === 0\n ? {}\n : {\n retainedMessageIds: promptCoordinatorState.queued.map(\n (item) => item.messageId,\n ),\n }),\n }\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-completed',\n events: [\n {\n type: 'ai.compaction.completed',\n id: await aiEventId(\n 'a2.ai.compaction.completed',\n generationId,\n ),\n payload: completed,\n } as AppendInput<D>,\n ],\n })),\n )\n const queued = new Set(\n promptCoordinatorState.queued.map((item) => item.messageId),\n )\n generationMessages = result.messages.filter(\n (message) => !queued.has(message.id),\n )\n compacted = true\n }\n }\n\n const currentState = foldAIEvents({\n reducer: contextReducer,\n events: generationEvents,\n state,\n })\n if (request.reason === 'retry' || previous !== undefined) {\n generationMessages = contextMessages({\n state: currentState,\n coordinator: promptCoordinatorState,\n })\n }\n if (\n (policy && 'shouldCompact' in policy) ||\n generationMessages !== messages ||\n activeCompaction(currentState)?.summary !==\n activeCompaction(state)?.summary\n ) {\n modelMessages = await telemetry.span(\n 'a2.ai.context',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.context.request_id': requestId,\n 'a2.ai.context.phase': 'refresh',\n },\n () =>\n modelContext({\n messages: generationMessages,\n state: currentState,\n tools,\n }),\n )\n }\n cachePrompt({\n sessionId: ctx.event.sessionId,\n generationId,\n messages: Promise.resolve(modelMessages),\n })\n if (tracksInput && (inputTokenEstimate === undefined || compacted)) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n }\n\n let pendingToolCalls: PendingToolCall[] = []\n if (checkAbort(ctx.signal)) return\n const generateContext: AgentGenerateContext<M, D, T, X> = {\n ...baseContext,\n messages: generationMessages,\n modelMessages,\n }\n const custom = options.generate !== undefined\n const source =\n options.generate === undefined\n ? await generateWithAISDK({\n agentName: options.contract.name,\n context: generateContext,\n messageMetadata: options.messageMetadata,\n })\n : { stream: await options.generate(generateContext) }\n const updates = consumeGeneration({\n source,\n ...(options.progress === undefined\n ? {}\n : { progress: options.progress }),\n })\n\n let sequence = 0\n let finish: AgentGenerationFinish | undefined\n for await (const update of updates) {\n ctx.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n const progress: GenerationProgressPayload = {\n startIndex,\n chunks: update.chunks,\n }\n const lifecycle = await lifecycleEvents<D, T>({\n requestId,\n messageId: responseMessageId,\n generationId,\n sequence,\n chunks: update.chunks,\n pending: pendingToolCalls,\n tools,\n generation,\n custom,\n })\n pendingToolCalls = lifecycle.pending\n await control.append({\n ctx,\n name: `generation-progress:${sequence}`,\n events: [\n {\n type: 'ai.generation.progress',\n id: await aiEventId(\n 'a2.ai.progress',\n generationId,\n String(sequence),\n ),\n payload: progress,\n } as AppendInput<D>,\n ...lifecycle.events,\n ],\n })\n sequence += 1\n }\n\n if (!finish) throw new Error('agent generation finished without output')\n const completed: GenerationCompletedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n ...(inputTokenEstimate === undefined ? {} : { inputTokenEstimate }),\n ...(finish.finishReason === undefined\n ? {}\n : { finishReason: finish.finishReason }),\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n const completionEvent = {\n type: 'ai.generation.completed',\n id: await aiEventId('a2.ai.completed', generationId),\n payload: completed,\n } as AppendInput<D>\n const unresolved = options.generate\n ? pendingToolCalls.filter(\n (pending) => pending.classification !== 'automatic',\n )\n : []\n if (unresolved.length > 0) {\n throw new Error(\n `generation ended with unresolved tool authorization for '${unresolved[0]!.call.toolName}'`,\n )\n }\n const pendingEvents = await Promise.all(\n pendingToolCalls\n .filter(\n (pending) =>\n pending.classification === 'automatic' ||\n (options.generate === undefined &&\n pending.classification === 'unknown'),\n )\n .map((pending) => toolCalledEvent<D>(pending.call)),\n )\n if (finish.finishReason === 'tool-calls') {\n return [...pendingEvents, completionEvent]\n }\n forgetPrompt(ctx.event.sessionId, generationId)\n return [\n ...pendingEvents,\n completionEvent,\n {\n type: 'ai.message.completed',\n id: await aiEventId('a2.ai.message.completed', generationId),\n payload: {\n messageId: responseMessageId,\n } satisfies MessageCompletedPayload,\n } as AppendInput<D>,\n ]\n } catch (error) {\n if (error instanceof ControlCancelled) throw error\n if (error instanceof A2Error) {\n checkAbort(ctx.signal)\n throw error\n }\n if (checkAbort(ctx.signal)) return\n if (!generationStarted && !resolving) throw error\n // A resolver or its result failed before the model ran: record the\n // attempt and fail it once, like a provider error, rather than retrying.\n if (!generationStarted)\n await control.append({\n ctx,\n name: 'generation-start',\n events: await startEvents(startedPayload(resolvedModel)),\n })\n forgetPrompt(ctx.event.sessionId, generationId)\n const failed: GenerationFailedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n error: errorMessage(error),\n }\n return {\n type: 'ai.generation.failed',\n id: await aiEventId('a2.ai.failed', generationId),\n payload: failed,\n } as AppendInput<D>\n }\n }\n\n return {\n 'ai.model.metadata.requested': {\n handler: async (ctx) => {\n const limits = await readModelLimits({\n modelId: ctx.event.payload.modelId,\n signal: ctx.signal,\n })\n ctx.signal.throwIfAborted()\n return {\n type: 'ai.model.metadata.resolved',\n id: await aiEventId('a2.ai.model.metadata.resolved', ctx.event.id),\n payload: { modelId: ctx.event.payload.modelId, limits },\n } as AppendInput<D>\n },\n },\n 'ai.control.requested': {\n lane: ({ event }) => {\n const command = event.payload as ControlCommand<M>\n if (event.id === '')\n throw new A2Error(\n 'INVALID_PAYLOAD',\n 'AI command IDs must be nonempty',\n )\n if (event.id?.startsWith(AI_EVENT_ID_PREFIX))\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `AI command IDs cannot use the reserved '${AI_EVENT_ID_PREFIX}' prefix`,\n )\n if (\n (command.action === 'send' || command.action === 'steer') &&\n event.id !== command.message.id\n )\n throw new A2Error(\n 'INVALID_PAYLOAD',\n 'AI input event ID must equal message.id',\n )\n return 'a2.ai.control'\n },\n handler: controlHandler,\n },\n 'ai.work.reported': { lane: 'a2.ai.control', handler: controlHandler },\n 'ai.session.closed': { lane: 'a2.ai.control', handler: controlHandler },\n 'ai.generation.requested': {\n lane: 'a2.ai.model',\n abortOn: {\n 'ai.control.requested': (event, trigger) =>\n event.payload.action === 'stop' &&\n event.payload.turnId === trigger.payload.control?.turnId,\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.control?.turnId ||\n active?.version !== trigger.payload.control?.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: (ctx) =>\n telemetry.span(\n 'a2.ai.generate',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.generate.request_id': ctx.event.id,\n 'a2.ai.generate.attempt': ctx.attempt,\n },\n async () => {\n try {\n return control.settled({\n ctx,\n events: await generationHandler(ctx),\n })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n },\n ),\n },\n 'ai.tool.execution.requested': {\n ...(options.toolLane === undefined ? {} : { lane: options.toolLane }),\n abortOn: {\n 'ai.control.requested': (event, trigger) =>\n event.payload.action === 'stop' &&\n event.payload.turnId === trigger.payload.turnId,\n 'ai.generation.failed': (event, trigger) =>\n event.payload.generationId === trigger.payload.call.generationId,\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.turnId ||\n active?.version !== trigger.payload.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: (ctx) =>\n telemetry.span(\n 'a2.ai.tool',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.tool.request_id': ctx.event.payload.call.requestId,\n 'a2.ai.tool.call_id': ctx.event.payload.call.toolCallId,\n 'a2.ai.tool.name': ctx.event.payload.call.toolName,\n 'a2.ai.tool.attempt': ctx.attempt,\n },\n () => handleToolExecution(ctx),\n ),\n },\n } as NonNullable<ServerOptions<D>['handlers']>\n}\n\n/**\n * Serve an AI agent: the built-in protocol, its handlers, and A2's store,\n * scheduler, and telemetry, as one ordinary A2 server. Pass `name` for the\n * built-in protocol, or a shared `agentContract()` when clients fold\n * application state.\n */\nexport function agent<\n T extends ToolSet = ToolSet,\n M extends UIMessage = UIMessage,\n E extends EventDefs = Record<never, never>,\n>(\n options: AgentOptions<M, E, T>,\n): Agent<AIEventDefs<M> & E, AIState<M>, typeof AI_STATE_REDUCER>\nexport function agent<\n D extends AIEventDefs<AIMessageOf<D>> & EventDefs,\n S,\n T extends ToolSet = ToolSet,\n Name extends string = string,\n X extends object = Record<never, never>,\n>(options: AgentFromContractOptions<D, S, T, Name, X>): Agent<D, S, Name>\nexport function agent(\n options:\n | AgentOptions<UIMessage, EventDefs, ToolSet>\n | AgentFromContractOptions<AIEventDefs & EventDefs, AIState, ToolSet>,\n): Agent<AIEventDefs & EventDefs, AIState> {\n type D = AIEventDefs & EventDefs\n const {\n model,\n tools,\n instructions,\n generation,\n maxSteps,\n messageMetadata,\n generate,\n compaction,\n progress,\n toolLane,\n handlers,\n ...rest\n } = options\n let contract: Contract<D, Record<never, never>, Reducer<D, AIState>>\n let serverOptions: Omit<\n ServerOptions<D, Record<never, never>, Reducer<D, AIState>>,\n 'contract' | 'handlers'\n >\n if ('contract' in rest) {\n const { contract: shared, ...remaining } = rest\n if ('name' in remaining)\n throw new TypeError('agent takes either name or contract, not both')\n if (!isAgentContract(shared))\n throw new TypeError('agent({ contract }) takes an agentContract()')\n contract = shared\n serverOptions = remaining\n } else {\n const { name, events, messageSchema, ...remaining } = rest\n contract = agentContract({\n name,\n ...(events === undefined ? {} : { events }),\n ...(messageSchema === undefined ? {} : { messageSchema }),\n })\n serverOptions = remaining\n }\n const builtIns = createHandlers<UIMessage, D>({\n contract,\n model,\n ...(serverOptions.telemetry === undefined\n ? {}\n : { telemetry: serverOptions.telemetry }),\n ...(tools === undefined ? {} : { tools }),\n ...(instructions === undefined ? {} : { instructions }),\n ...(generation === undefined ? {} : { generation }),\n ...(maxSteps === undefined ? {} : { maxSteps }),\n ...(messageMetadata === undefined ? {} : { messageMetadata }),\n ...(generate === undefined ? {} : { generate }),\n ...(compaction === undefined ? {} : { compaction }),\n ...(progress === undefined ? {} : { progress }),\n ...(toolLane === undefined ? {} : { toolLane }),\n })\n for (const type of Object.keys(handlers ?? {})) {\n if (Object.hasOwn(builtIns, type))\n throw new TypeError(`agent handles '${type}' itself`)\n }\n const server = createServer({\n ...serverOptions,\n contract,\n handlers: { ...builtIns, ...handlers },\n })\n const applicationEvents = 'contract' in rest\n setServerFetchHooks(server, {\n validateIngress: (context) =>\n validateAgentIngress({ context, applicationEvents }),\n })\n return server\n}\n\nexport type { Instructions, LanguageModel, ToolSet }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-server.js","names":["reducer","makeReducer","reducer","makeReducer","errorMessage","aiEvents"],"sources":["../src/ai-coordinator.ts","../src/ai-control-server.ts","../src/ai-context-schema.ts","../src/ai-context.ts","../src/ai-sdk-step.ts","../src/ai-model-metadata.ts","../src/ai-input-tokens.ts","../src/ai-agent.ts"],"sourcesContent":["import { reducer } from './reducer.ts'\nimport type { UIMessage } from 'ai'\nimport { applyControlChanges } from './ai-control-state.ts'\nimport type { ControlCommit, ControlWork } from './ai-control.ts'\nimport type {\n AIEventDefs,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationRequestedPayload,\n GenerationReason,\n GenerationStartedPayload,\n InputRequestedPayload,\n InputRespondedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport type { Reducer } from './reducer.ts'\n\ntype CompletedCall = Pick<\n ToolCalledPayload,\n | 'requestId'\n | 'generationId'\n | 'messageId'\n | 'toolCallId'\n | 'toolName'\n | 'providerExecuted'\n | 'supportsDeferredResults'\n>\n\nexport type CoordinatorCall = {\n approval?: ApprovalRequestedPayload\n response?: ApprovalRespondedPayload\n work?: ControlWork\n} & (\n | { call: ToolCalledPayload; terminal: false }\n | { call: CompletedCall; terminal: true }\n)\n\nconst completeCall = (candidate: CoordinatorCall): CoordinatorCall => {\n const {\n requestId,\n generationId,\n messageId,\n toolCallId,\n toolName,\n providerExecuted,\n supportsDeferredResults,\n } = candidate.call\n return {\n terminal: true,\n call: {\n requestId,\n generationId,\n messageId,\n toolCallId,\n toolName,\n ...(providerExecuted === undefined ? {} : { providerExecuted }),\n ...(supportsDeferredResults === undefined\n ? {}\n : { supportsDeferredResults }),\n },\n ...(candidate.work === undefined ? {} : { work: candidate.work }),\n }\n}\n\nexport type CoordinatorResponse = {\n rootMessageId: string\n responseMessageId: string\n status: 'requested' | 'generating' | 'waiting' | 'failed'\n stepCount: number\n activeRequestId?: string\n requestReason: GenerationReason\n sourceGenerationId?: string\n generation?: GenerationStartedPayload\n source?: {\n generation: GenerationStartedPayload\n }\n completion?: GenerationCompletedPayload\n failure?: GenerationFailedPayload\n calls: CoordinatorCall[]\n inputs: InputRequestedPayload[]\n inputResponse?: {\n generationId: string\n inputId: string\n name: string\n }\n}\n\nexport type AICoordinatorState = {\n closed: boolean\n unsettledTools?: Record<string, true>\n queued: Array<{ messageId: string; generate: boolean }>\n response?: CoordinatorResponse\n calibration?: { model: string; inputTokens: number; estimate: number }\n}\n\nconst updateResponse = (\n state: AICoordinatorState,\n update: (response: CoordinatorResponse) => CoordinatorResponse,\n): AICoordinatorState =>\n state.response === undefined\n ? state\n : { ...state, response: update(state.response) }\n\nexport const foldCoordinator = <M extends UIMessage, D extends EventDefs>(\n state: AICoordinatorState,\n event: ContractEvent<D>,\n): AICoordinatorState => {\n switch (event.type) {\n case 'ai.session.closed':\n return { closed: true, queued: [] }\n case 'ai.retry.requested':\n case 'ai.compaction.completed': {\n const { calibration: _, ...rest } = state\n return rest\n }\n case 'ai.message.created': {\n const payload = event.payload as MessageCreatedPayload<M>\n const message = payload.message\n if (message.role !== 'user') return state\n return {\n ...state,\n queued: [\n ...state.queued.filter((item) => item.messageId !== message.id),\n {\n messageId: message.id,\n generate: payload.generate !== false,\n },\n ],\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (request.reason === 'message') {\n const responseMessageId = request.responseMessageId\n const requested = state.queued.findIndex(\n (item) => item.messageId === request.messageId,\n )\n return {\n ...state,\n queued:\n requested < 0\n ? state.queued.filter(\n (item) => item.messageId !== request.messageId,\n )\n : state.queued.slice(requested + 1),\n response: {\n rootMessageId: request.messageId,\n responseMessageId,\n status: 'requested',\n stepCount: 0,\n activeRequestId: event.id,\n requestReason: request.reason,\n ...(request.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: request.sourceGenerationId }),\n calls: [],\n inputs: [],\n },\n }\n }\n if (\n state.response === undefined ||\n request.responseMessageId !== state.response.responseMessageId\n ) {\n return state\n }\n if (\n (request.reason === 'tool' &&\n (!continuationReady(state) ||\n request.sourceGenerationId !==\n state.response.generation?.generationId)) ||\n (request.sourceGenerationId !== undefined &&\n request.sourceGenerationId !==\n (state.response.generation ?? state.response.source?.generation)\n ?.generationId) ||\n (request.reason === 'retry' && state.response.status !== 'failed') ||\n (request.reason === 'input' &&\n state.response.inputResponse === undefined)\n ) {\n return state\n }\n return updateResponse(state, (response) => {\n const generation = response.generation ?? response.source?.generation\n return {\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'requested',\n stepCount: response.stepCount,\n activeRequestId: event.id,\n requestReason: request.reason,\n ...(request.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: request.sourceGenerationId }),\n ...(generation === undefined\n ? {}\n : {\n source: {\n generation,\n },\n }),\n calls: [],\n inputs: [],\n }\n })\n }\n case 'ai.generation.started': {\n const generation = event.payload as GenerationStartedPayload\n if (\n state.response?.responseMessageId !== generation.responseMessageId ||\n state.response.activeRequestId !== generation.requestId ||\n (state.response.generation?.requestId === generation.requestId &&\n state.response.generation.attempt >= generation.attempt)\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'generating',\n stepCount: response.stepCount,\n generation,\n ...(response.source === undefined ? {} : { source: response.source }),\n activeRequestId: generation.requestId,\n requestReason: response.requestReason,\n ...(response.sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId: response.sourceGenerationId }),\n calls: [],\n inputs: [],\n }))\n }\n case 'ai.generation.completed': {\n const completion = event.payload as GenerationCompletedPayload\n if (\n state.response?.generation?.requestId !== completion.requestId ||\n state.response.generation.generationId !== completion.generationId\n ) {\n return state\n }\n const next = updateResponse(state, (response) => ({\n ...response,\n status: 'waiting',\n completion,\n stepCount:\n response.stepCount + (response.completion === undefined ? 1 : 0),\n }))\n const { calibration: _, ...uncalibrated } = next\n const inputTokens = completion.usage?.inputTokens\n const estimate = completion.inputTokenEstimate\n return inputTokens !== undefined &&\n Number.isFinite(inputTokens) &&\n inputTokens >= 0 &&\n estimate !== undefined &&\n state.response.generation.model !== undefined\n ? {\n ...uncalibrated,\n calibration: {\n model: state.response.generation.model,\n inputTokens,\n estimate,\n },\n }\n : uncalibrated\n }\n case 'ai.generation.failed': {\n const failure = event.payload as GenerationFailedPayload\n const response = state.response\n const ownsActiveGeneration =\n response?.generation?.generationId === failure.generationId &&\n response.generation.requestId === failure.requestId\n const ownsActiveStepLimit =\n failure.stepLimit === true &&\n response?.requestReason === 'tool' &&\n response.sourceGenerationId === failure.generationId &&\n response.source?.generation.requestId === failure.requestId &&\n response.responseMessageId === failure.responseMessageId\n if (!ownsActiveGeneration && !ownsActiveStepLimit) {\n return state\n }\n return updateResponse(state, (current) => ({\n ...current,\n status: 'failed',\n failure,\n }))\n }\n case 'ai.message.completed': {\n const messageId = (event.payload as { messageId: string }).messageId\n if (state.response?.responseMessageId !== messageId) return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.message.interrupted': {\n const interruption = event.payload as MessageInterruptedPayload\n const response = state.response\n if (\n response?.responseMessageId !== interruption.messageId ||\n (interruption.generationId !== response.generation?.generationId &&\n interruption.requestId !== response.activeRequestId)\n )\n return state\n const { response: _, ...rest } = state\n return rest\n }\n case 'ai.tool.called': {\n const call = event.payload as ToolCalledPayload\n if (\n state.response?.generation?.requestId !== call.requestId ||\n state.response.generation.generationId !== call.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: [\n ...response.calls.filter(\n (candidate) => candidate.call.toolCallId !== call.toolCallId,\n ),\n { call, terminal: false },\n ],\n }))\n }\n case 'ai.approval.requested': {\n const approval = event.payload as ApprovalRequestedPayload\n if (\n state.response?.generation?.requestId !== approval.requestId ||\n state.response.generation.generationId !== approval.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === approval.toolCallId\n ? { ...candidate, approval }\n : candidate,\n ),\n }))\n }\n case 'ai.approval.responded': {\n const approval = event.payload as ApprovalRespondedPayload\n if (\n state.response?.responseMessageId !== approval.messageId ||\n state.response.generation?.requestId !== approval.requestId ||\n state.response.generation.generationId !== approval.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.approval?.approvalId === approval.approvalId\n ? { ...candidate, response: approval }\n : candidate,\n ),\n }))\n }\n case 'ai.tool.result': {\n const result = event.payload as ToolResultPayload\n if (\n result.preliminary === true ||\n state.response?.generation?.requestId !== result.requestId ||\n state.response.generation.generationId !== result.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === result.toolCallId\n ? completeCall(candidate)\n : candidate,\n ),\n }))\n }\n case 'ai.input.requested': {\n const input = event.payload as InputRequestedPayload\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.requestId !== input.requestId ||\n state.response.generation.generationId !== input.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: [\n ...response.inputs.filter(\n (candidate) =>\n candidate.messageId !== input.messageId ||\n candidate.generationId !== input.generationId ||\n candidate.inputId !== input.inputId,\n ),\n input,\n ],\n }))\n }\n case 'ai.input.responded': {\n const input = event.payload as InputRespondedPayload\n const requested = state.response?.inputs.find(\n (candidate) =>\n candidate.messageId === input.messageId &&\n candidate.generationId === input.generationId &&\n candidate.inputId === input.inputId &&\n candidate.name === input.name,\n )\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.requestId !== input.requestId ||\n state.response.generation.generationId !== input.generationId ||\n requested === undefined\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: response.inputs.filter(\n (candidate) => candidate.inputId !== input.inputId,\n ),\n inputResponse: {\n generationId: input.generationId,\n inputId: input.inputId,\n name: requested.name,\n },\n }))\n }\n default:\n return state\n }\n}\n\nexport const aiCoordinatorReducer = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(\n contract: Contract<D, Record<never, never>, unknown>,\n): Reducer<D, AICoordinatorState> =>\n reducer({\n contract: contract,\n name: 'a2.ai.coordinator.v6',\n initialState: {\n closed: false,\n queued: [],\n } as AICoordinatorState,\n }).fold((state, event) =>\n event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes\n .filter((change) => change.path[0] === 'coordinator')\n .map((change) =>\n Object.assign({}, change, { path: change.path.slice(1) }),\n ),\n })\n : state,\n )\n\nexport const continuationReady = (state: AICoordinatorState): boolean => {\n const response = state.response\n return (\n !state.closed &&\n response?.completion?.finishReason === 'tool-calls' &&\n response.generation?.generationId === response.completion.generationId &&\n response.failure === undefined &&\n response.calls.length > 0 &&\n response.calls.every(\n (call) =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n call.call.supportsDeferredResults !== true &&\n call.approval !== undefined &&\n call.response !== undefined),\n )\n )\n}\n","import { reducer as makeReducer } from './reducer.ts'\n// oxlint-disable no-await-in-loop -- work acknowledgements follow the durable stream.\nimport { applyControlChanges, controlCommit } from './ai-control-state.ts'\nimport type { ControlChange, ControlCommit } from './ai-control.ts'\nimport type { UIMessage } from 'ai'\nimport type {\n AIEventDefs,\n GenerationRequestedPayload,\n MessageInterruptedPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n continuationReady,\n foldCoordinator,\n} from './ai-coordinator.ts'\nimport {\n initialControlState,\n type AIControlState,\n type ControlCommand,\n type ControlReceipt,\n type WorkFact,\n type WorkReport,\n} from './ai-control.ts'\nimport type {\n AppendInput,\n Contract,\n ContractEvent,\n EventDefs,\n} from './contract.ts'\nimport type { HandlerContext } from './server.ts'\nimport type { Reducer } from './reducer.ts'\nimport type { AICoordinatorState, CoordinatorCall } from './ai-coordinator.ts'\nimport { validateSync } from './validate.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { A2Error } from './errors.ts'\nimport { aiEventId } from './ai-id.ts'\nimport { CONSOLE_TELEMETRY, type A2Telemetry } from './telemetry.ts'\n\nexport class ControlCancelled extends Error {}\n\nconst callReadyForModel = (call: CoordinatorCall): boolean =>\n call.terminal ||\n (call.call.providerExecuted === true &&\n !call.call.supportsDeferredResults &&\n call.response !== undefined)\n\nconst approvalBlocksExecution = (call: CoordinatorCall): boolean =>\n call.approval !== undefined && call.response?.approved !== true\n\nexport type AIControlRuntime<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n handler(\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]>\n append(options: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]>\n settled(options: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): Promise<AppendInput<D>>\n cancelled(options: { error: unknown; signal: AbortSignal }): boolean\n reducer: Reducer<D, AIControlState<M>>\n coordinator: Reducer<D, AICoordinatorState>\n}\n\nexport const createControlRuntime = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n contract: Contract<D, Record<never, never>, unknown>\n telemetry?: A2Telemetry\n}): AIControlRuntime<M, D> => {\n const telemetry = options.telemetry ?? CONSOLE_TELEMETRY\n const reducer = makeReducer({\n contract: options.contract,\n name: 'a2.ai.control.v5',\n initialState: initialControlState<M>(),\n }).fold((state, event) => {\n if (event.type === 'ai.control.requested') {\n const command = event.payload as ControlCommand<M>\n if (command.action === 'stop')\n return {\n ...state,\n pendingStops: {\n ...state.pendingStops,\n [event.id]: command.turnId,\n },\n }\n }\n if (event.type === 'ai.control.decided') {\n const receipt = event.payload as ControlReceipt\n if (Object.hasOwn(state.pendingStops, receipt.commandId)) {\n const pendingStops = { ...state.pendingStops }\n delete pendingStops[receipt.commandId]\n return { ...state, pendingStops }\n }\n }\n return event.type === 'ai.control.committed'\n ? applyControlChanges({\n state,\n changes: (event.payload as ControlCommit).changes,\n })\n : state\n })\n const coordinator = aiCoordinatorReducer(options.contract)\n\n const handler = async (\n ctx: HandlerContext<\n D,\n 'ai.control.requested' | 'ai.work.reported' | 'ai.session.closed'\n >,\n ): Promise<AppendInput<D>[]> => {\n const snapshot = await ctx.session.state(reducer, { through: 'latest' })\n const before = structuredClone(snapshot.state)\n const moves: ControlChange[] = []\n const state = structuredClone(snapshot.state)\n const facts: WorkFact[] = []\n const jobs: AppendInput<D>[] = []\n const emit = async ({\n type,\n payload,\n id,\n }: {\n type: string\n payload: unknown\n id?: string\n }): Promise<void> => {\n const fact = {\n type,\n payload,\n id:\n id ??\n (await aiEventId('a2.ai.fact', ctx.event.id, String(facts.length))),\n }\n facts.push(fact)\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n ...fact,\n } as ContractEvent<D>)\n }\n let reason: ControlReceipt['reason']\n const end = async ({\n lastSeenIndex,\n reason: interruptionReason,\n }: {\n lastSeenIndex: number | undefined\n reason: string | undefined\n }): Promise<void> => {\n const response = state.coordinator.response\n if (response === undefined) return\n const owner =\n response.generation === undefined\n ? { requestId: response.activeRequestId! }\n : { generationId: response.generation.generationId }\n await emit({\n type: 'ai.message.interrupted',\n payload: {\n messageId: response.responseMessageId,\n ...owner,\n ...(interruptionReason === undefined\n ? {}\n : { reason: interruptionReason }),\n ...(lastSeenIndex === undefined ? {} : { lastSeenIndex }),\n } satisfies MessageInterruptedPayload,\n })\n state.active = null\n }\n const insert = ({\n message,\n generate = true,\n first = false,\n afterStepOf,\n }: {\n message: M\n generate?: boolean\n first?: boolean\n afterStepOf?: string\n }): void => {\n const candidate = {\n id: message.id,\n message,\n generate: generate && message.role === 'user',\n ...(afterStepOf === undefined ? {} : { afterStepOf }),\n }\n if (first) state.inbox.items.unshift(candidate)\n else state.inbox.items.push(candidate)\n }\n const moveInput = ({ from, to }: { from: number; to: number }): void => {\n if (from === to) return\n const [moved] = state.inbox.items.splice(from, 1)\n state.inbox.items.splice(to, 0, moved!)\n const [previous] = before.inbox.items.splice(from, 1)\n before.inbox.items.splice(to, 0, previous!)\n moves.push({ path: ['inbox', 'items'], move: { from, to } })\n }\n const requestModel = ({\n request,\n id,\n }: {\n request: GenerationRequestedPayload\n id: string\n }): void => {\n const active = state.active!\n const payload = {\n ...request,\n control: { turnId: active.turnId, version: active.version },\n }\n state.coordinator = foldCoordinator<M, D>(state.coordinator, {\n ...ctx.event,\n type: 'ai.generation.requested',\n id,\n payload,\n } as ContractEvent<D>)\n active.model = { id, version: active.version, settled: false }\n active.phase = 'starting'\n jobs.push({\n type: 'ai.generation.requested',\n id,\n payload,\n } as AppendInput<D>)\n }\n if (ctx.event.type === 'ai.session.closed') {\n state.coordinator = { closed: true, queued: [] }\n state.active = null\n state.inbox.items = []\n } else if (ctx.event.type === 'ai.control.requested') {\n const command = ctx.event.payload as ControlCommand<M>\n if (state.coordinator.closed) reason = 'closed'\n else\n switch (command.action) {\n case 'send':\n insert({\n message: command.message,\n generate: command.generate !== false,\n })\n break\n case 'edit': {\n const item = state.inbox.items.find(\n (candidate) => candidate.id === command.message.id,\n )\n if (item === undefined) reason = 'not-pending'\n else if (item.message.role !== command.message.role)\n reason = 'role-mismatch'\n else item.message = command.message\n break\n }\n case 'remove': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n if (position < 0) reason = 'not-pending'\n else state.inbox.items.splice(position, 1)\n break\n }\n case 'move': {\n const index = state.inbox.items.findIndex(\n (candidate) => candidate.id === command.inputId,\n )\n if (index < 0) reason = 'not-pending'\n else if (\n command.beforeId !== null &&\n !state.inbox.items.some(\n (candidate) => candidate.id === command.beforeId,\n )\n )\n reason = 'not-pending'\n else {\n const destination =\n command.beforeId === null\n ? state.inbox.items.length\n : state.inbox.items.findIndex(\n (item) => item.id === command.beforeId,\n )\n moveInput({\n from: index,\n to: destination > index ? destination - 1 : destination,\n })\n }\n break\n }\n case 'send-now': {\n const position = state.inbox.items.findIndex(\n (item) => item.id === command.inputId,\n )\n const selected = state.inbox.items[position]\n if (!selected) reason = 'not-pending'\n else if ((state.active?.turnId ?? null) !== command.turnId)\n reason = 'stale-turn'\n else if (selected.message.role !== 'user') reason = 'not-user-input'\n else {\n selected.generate = true\n if (state.active) selected.afterStepOf = state.active.turnId\n else delete selected.afterStepOf\n moveInput({ from: position, to: 0 })\n }\n break\n }\n case 'stop':\n if (state.active?.turnId !== command.turnId) reason = 'stale-turn'\n else\n await end({\n lastSeenIndex: command.lastSeenIndex,\n reason: undefined,\n })\n break\n case 'steer':\n insert({\n message: command.message,\n generate: true,\n first: true,\n afterStepOf: command.turnId,\n })\n break\n case 'interrupt': {\n const response = state.coordinator.response\n if (\n !response ||\n response.responseMessageId !== command.request.messageId ||\n (command.request.generationId !==\n response.generation?.generationId &&\n command.request.requestId !== response.activeRequestId)\n )\n reason = 'stale-turn'\n else\n await end({\n lastSeenIndex: command.request.lastSeenIndex,\n reason: command.request.reason,\n })\n break\n }\n case 'pause': {\n state.inbox.paused = true\n const active = state.active\n if (\n command.when === 'now' &&\n active !== null &&\n !active.suspended\n ) {\n active.suspended = true\n active.version += 1\n const generation = state.coordinator.response?.generation\n if (generation)\n await emit({\n type: 'ai.generation.paused',\n payload: {\n generationId: generation.generationId,\n messageId: generation.responseMessageId,\n },\n })\n }\n break\n }\n case 'resume':\n state.inbox.paused = false\n break\n case 'tool-result': {\n const call = state.coordinator.response?.calls.find(\n (candidate) =>\n candidate.call.requestId === command.result.requestId &&\n candidate.call.generationId === command.result.generationId &&\n candidate.call.messageId === command.result.messageId &&\n candidate.call.toolCallId === command.result.toolCallId &&\n candidate.call.providerExecuted === true &&\n !candidate.terminal,\n )\n if (!call) reason = 'not-found'\n else await emit({ type: 'ai.tool.result', payload: command.result })\n break\n }\n case 'approval': {\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) =>\n candidate.approval?.requestId === command.response.requestId &&\n candidate.approval.approvalId === command.response.approvalId &&\n candidate.approval.generationId ===\n command.response.generationId &&\n candidate.approval.messageId === command.response.messageId,\n )\n if (response?.failure) reason = 'stale-turn'\n else if (!call || call.response || call.terminal)\n reason = 'not-found'\n else\n await emit({\n type: 'ai.approval.responded',\n payload: command.response,\n })\n break\n }\n case 'request-input':\n case 'input': {\n const payload =\n command.action === 'input' ? command.response : command.request\n const response = state.coordinator.response\n if (\n response?.failure !== undefined ||\n response?.generation?.requestId !== payload.requestId ||\n response.generation.generationId !== payload.generationId ||\n response.responseMessageId !== payload.messageId ||\n (command.action === 'input' &&\n !response.inputs.some(\n (input) =>\n input.inputId === payload.inputId &&\n input.name === payload.name,\n ))\n )\n reason = 'not-found'\n else\n await emit({\n type:\n command.action === 'input'\n ? 'ai.input.responded'\n : 'ai.input.requested',\n payload,\n })\n break\n }\n case 'retry': {\n const response = state.coordinator.response\n if (\n !state.active ||\n response?.status !== 'failed' ||\n response.rootMessageId !== command.request.messageId ||\n response.responseMessageId !== command.request.responseMessageId\n )\n reason = 'stale-turn'\n else if (!state.inbox.paused && !state.active.suspended) {\n await emit({\n type: 'ai.retry.requested',\n payload: command.request,\n })\n requestModel({\n request: {\n messageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'retry',\n },\n id: await aiEventId(\n 'a2.ai.request.retry',\n options.contract.name,\n ctx.event.sessionId,\n command.request.retryId,\n ),\n })\n } else reason = 'stale-turn'\n break\n }\n }\n } else {\n const report = ctx.event.payload as WorkReport\n if (\n report.kind === 'tool' &&\n report.settled &&\n state.coordinator.unsettledTools\n ) {\n delete state.coordinator.unsettledTools[report.workId]\n if (Object.keys(state.coordinator.unsettledTools).length === 0)\n delete state.coordinator.unsettledTools\n }\n const active = state.active\n const response = state.coordinator.response\n const call = response?.calls.find(\n (candidate) => candidate.work?.id === report.workId,\n )\n const work = report.kind === 'model' ? active?.model : call?.work\n const current =\n active?.turnId === report.turnId &&\n work?.id === report.workId &&\n work.version === report.version &&\n !work.settled &&\n report.attempt >= (work.attempt ?? 0)\n if (!current) {\n reason = 'stale-work'\n } else {\n work.attempt = report.attempt\n const authorized =\n !active.suspended && active.version === report.version\n for (const event of report.events) {\n if (work.facts?.includes(event.id)) continue\n if (\n authorized ||\n (report.kind === 'tool' && event.type === 'ai.tool.result')\n ) {\n await emit({\n type: event.type,\n payload: event.payload,\n id: event.id,\n })\n work.facts = [...(work.facts ?? []), event.id]\n }\n }\n if (report.settled) {\n work.settled = true\n delete work.facts\n }\n if (!authorized) reason = 'stale-work'\n }\n }\n\n let active = state.active\n let response = state.coordinator.response\n if (active && response === undefined) {\n state.active = null\n active = null\n }\n if (active && response) {\n const handoff = state.inbox.items.some(\n (item) => item.afterStepOf === active.turnId,\n )\n const outstanding =\n (active.model !== null && !active.model.settled) ||\n response.calls.some(\n (candidate) =>\n candidate.work !== undefined && !candidate.work.settled,\n )\n if (active.suspended) {\n active.phase = outstanding ? 'pausing' : 'paused'\n if (!state.inbox.paused && !outstanding && !handoff)\n active.suspended = false\n }\n if (!active.suspended && response.failure) active.phase = 'failed'\n if (!active.suspended && response.failure === undefined) {\n for (const call of response.calls) {\n if (\n call.terminal ||\n (call.work !== undefined &&\n (!call.work.settled || call.work.version === active.version)) ||\n call.call.providerExecuted === true ||\n (call.approval && !call.response)\n )\n continue\n if (call.response?.approved === false) {\n await emit({\n type: 'ai.tool.result',\n payload: {\n ...call.call,\n denied: true,\n phase: 'execution',\n },\n })\n continue\n }\n const id = await aiEventId(\n 'a2.ai.tool.execution',\n ctx.event.id,\n call.call.generationId,\n call.call.toolCallId,\n )\n call.work = { id, version: active.version, settled: false }\n state.coordinator.unsettledTools = {\n ...state.coordinator.unsettledTools,\n [id]: true,\n }\n jobs.push({\n type: 'ai.tool.execution.requested',\n id,\n payload: {\n turnId: active.turnId,\n version: active.version,\n call: call.call,\n generation: response.generation!,\n },\n } as AppendInput<D>)\n }\n }\n response = state.coordinator.response!\n const callsDone = response.calls.every(callReadyForModel)\n const modelDone = active.model === null || active.model.settled\n const workSettled =\n modelDone &&\n response.calls.every(\n (call) => call.work === undefined || call.work.settled,\n )\n const externalPending = response.calls.some(\n (call) =>\n call.call.providerExecuted &&\n call.call.supportsDeferredResults &&\n !call.terminal &&\n !approvalBlocksExecution(call),\n )\n const handoffReady =\n handoff &&\n workSettled &&\n !externalPending &&\n (active.suspended ||\n response.failure !== undefined ||\n response.calls.every(\n (call) => callReadyForModel(call) || approvalBlocksExecution(call),\n ))\n const readyForModel =\n !active.suspended &&\n response.failure === undefined &&\n modelDone &&\n callsDone &&\n response.inputs.length === 0\n const naturalCompletion =\n readyForModel &&\n response.completion !== undefined &&\n response.completion.finishReason !== 'tool-calls'\n if (handoffReady && !naturalCompletion) {\n await end({ lastSeenIndex: undefined, reason: 'steered after step' })\n } else if (readyForModel && (!handoff || handoffReady)) {\n const resume =\n active.model !== null && active.model.version !== active.version\n const input = response.inputResponse\n if (\n !handoff &&\n (resume ||\n continuationReady(state.coordinator) ||\n (response.completion && input))\n ) {\n const nextReason = resume ? 'resume' : input ? 'input' : 'tool'\n const sourceGenerationId = (\n response.generation ?? response.source?.generation\n )?.generationId\n const id =\n nextReason === 'tool'\n ? await aiEventId(\n 'a2.ai.request.tool',\n response.generation!.generationId,\n )\n : await aiEventId('a2.ai.request', ctx.event.id, nextReason)\n requestModel({\n request: {\n messageId: response.responseMessageId,\n responseMessageId: response.responseMessageId,\n reason: nextReason,\n ...(sourceGenerationId === undefined\n ? {}\n : { sourceGenerationId }),\n },\n id,\n })\n } else if (naturalCompletion) {\n await emit({\n type: 'ai.message.completed',\n payload: {\n messageId: response.responseMessageId,\n },\n })\n state.active = null\n }\n }\n if (\n !active.suspended &&\n state.active &&\n jobs.every((job) => job.type !== 'ai.generation.requested')\n )\n state.active.phase = response.failure\n ? 'failed'\n : !modelDone\n ? 'generating'\n : !callsDone\n ? 'tools'\n : 'waiting'\n }\n if (\n state.active === null &&\n !state.inbox.paused &&\n !state.coordinator.closed\n ) {\n while (state.inbox.items.length > 0) {\n const item = state.inbox.items.shift()!\n delete item.afterStepOf\n await emit({\n type: 'ai.message.created',\n payload: { message: item.message, generate: item.generate },\n id: await aiEventId(\n 'a2.ai.admitted',\n options.contract.name,\n ctx.event.sessionId,\n item.id,\n ),\n })\n if (!item.generate) continue\n state.active = {\n turnId: item.id,\n input: item,\n phase: 'starting',\n version: 0,\n suspended: false,\n model: null,\n }\n const requestId = await aiEventId(\n 'a2.ai.request.message',\n options.contract.name,\n ctx.event.sessionId,\n item.id,\n )\n requestModel({\n request: {\n messageId: item.id,\n responseMessageId: requestId,\n reason: 'message',\n },\n id: requestId,\n })\n break\n }\n }\n const receipt: ControlReceipt = {\n commandId: ctx.event.id,\n ...(ctx.event.type === 'ai.work.reported' ? { work: true as const } : {}),\n outcome: reason === undefined ? 'applied' : 'rejected',\n ...(reason === undefined ? {} : { reason }),\n }\n return [\n ...(facts as AppendInput<D>[]),\n {\n type: 'ai.control.committed',\n id: await aiEventId('a2.ai.control.committed', ctx.event.id),\n payload: controlCommit({ before, after: state, moves }),\n } as AppendInput<D>,\n ...jobs,\n {\n type: 'ai.control.decided',\n id: await aiEventId('a2.ai.control.decided', ctx.event.id),\n payload: receipt,\n } as AppendInput<D>,\n ]\n }\n\n const report = async ({\n ctx,\n events,\n settled,\n name,\n }: {\n ctx: HandlerContext<D>\n events: readonly AppendInput<D>[]\n settled: boolean\n name: string\n }): Promise<AppendInput<D>> => {\n const payload = ctx.event.payload as\n GenerationRequestedPayload | { turnId: string; version: number }\n const { turnId, version } = 'turnId' in payload ? payload : payload.control!\n for (const event of events) {\n const schema = options.contract.events[\n event.type\n ] as StandardSchemaV1<unknown>\n const result = validateSync(\n schema,\n event.payload,\n `AI worker ${event.type}`,\n )\n if (result.issues)\n throw new TypeError(\n result.issues.map((issue) => issue.message).join('; '),\n )\n }\n return {\n type: 'ai.work.reported',\n id: await aiEventId(\n 'a2.ai.report',\n ctx.event.id,\n String(ctx.attempt),\n name,\n ),\n payload: {\n workId: ctx.event.id,\n attempt: ctx.attempt,\n turnId,\n version,\n kind: ctx.event.type === 'ai.generation.requested' ? 'model' : 'tool',\n settled,\n events: await Promise.all(\n events\n .filter(\n (event) =>\n event.type !== 'ai.message.completed' &&\n event.type !== 'ai.message.interrupted',\n )\n .map(async (event, index) => ({\n type: event.type,\n payload: event.payload,\n id:\n event.id ??\n (await aiEventId(\n 'a2.ai.work.fact',\n ctx.event.id,\n String(ctx.attempt),\n name,\n String(index),\n )),\n })),\n ),\n },\n } as AppendInput<D>\n }\n\n const append = async ({\n ctx,\n name,\n events,\n }: {\n ctx: HandlerContext<D>\n name: string\n events: AppendInput<D>[]\n }): Promise<ContractEvent<D>[]> => {\n const progress = events.filter(\n (event) => event.type === 'ai.generation.progress',\n )\n const lifecycle = events.filter(\n (event) => event.type !== 'ai.generation.progress',\n )\n if (lifecycle.length === 0) return ctx.session.append(name, ...progress)\n const input = await report({ ctx, events: lifecycle, settled: false, name })\n const persisted = await ctx.session.append(name, ...progress, input)\n const index = persisted.at(-1)!.index\n return telemetry.span(\n 'a2.ai.ack',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.ack.request_id': ctx.event.id,\n 'a2.ai.ack.report_id': input.id!,\n },\n async () => {\n const feed = ctx.session.stream({ startAfter: index })\n const stream = feed[Symbol.asyncIterator]()\n const canonical: ContractEvent<D>[] = []\n const wanted = new Set(lifecycle.map((event) => event.id))\n let rejectAbort!: (error: unknown) => void\n const aborted = new Promise<never>((_, reject) => {\n rejectAbort = reject\n })\n const onAbort = (): void => {\n rejectAbort(ctx.signal.reason)\n }\n ctx.signal.addEventListener('abort', onAbort, { once: true })\n try {\n ctx.signal.throwIfAborted()\n for (;;) {\n const item = await Promise.race([stream.next(), aborted])\n if (item.done)\n throw new Error('AI control acknowledgement stream ended')\n if (wanted.has(item.value.id)) canonical.push(item.value)\n if (\n item.value.type === 'ai.control.decided' &&\n (item.value.payload as ControlReceipt).commandId === input.id\n ) {\n if ((item.value.payload as ControlReceipt).outcome === 'rejected')\n throw new ControlCancelled('stale AI work')\n return [\n ...persisted.filter(\n (event) => event.type !== 'ai.work.reported',\n ),\n ...canonical,\n ]\n }\n }\n } finally {\n ctx.signal.removeEventListener('abort', onAbort)\n await stream.return?.()\n }\n },\n )\n }\n\n const settled = ({\n ctx,\n events,\n }: {\n ctx: HandlerContext<D>\n events: void | AppendInput<D> | readonly AppendInput<D>[]\n }): Promise<AppendInput<D>> =>\n report({\n ctx,\n events:\n events === undefined\n ? []\n : Array.isArray(events)\n ? events\n : [events as AppendInput<D>],\n settled: true,\n name: 'settled',\n })\n const cancelled = ({\n error,\n signal,\n }: {\n error: unknown\n signal: AbortSignal\n }): boolean => {\n if (signal.reason instanceof A2Error) throw signal.reason\n return error instanceof ControlCancelled || signal.aborted\n }\n return { handler, append, settled, cancelled, reducer, coordinator }\n}\n","import { assertMessageBase, restoreMessageBase } from './ai-message-base.ts'\nimport type { UIMessage } from 'ai'\nimport { events } from './ai.ts'\nimport type { AIContextState } from './ai-context.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { validateSync } from './validate.ts'\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\nconst index = (value: unknown): value is number =>\n typeof value === 'number' && Number.isSafeInteger(value) && value >= 0\nconst id = (value: unknown): value is string =>\n typeof value === 'string' && value.length > 0\nconst nullableId = (value: unknown): boolean => value === null || id(value)\nconst matches = (schema: StandardSchemaV1<unknown>, value: unknown): boolean =>\n validateSync(schema, value, 'AI context checkpoint').issues === undefined\nconst isMessage = (value: unknown): value is UIMessage =>\n matches(events['ai.message.created'], { message: value })\nconst indexes = (value: unknown, messages: readonly UIMessage[]): boolean =>\n record(value) &&\n Object.values(value).every(index) &&\n messages.every((message) => Object.hasOwn(value, message.id))\n\nconst compaction = (value: unknown): boolean =>\n value === null ||\n (record(value) &&\n Object.keys(value).every((key) =>\n [\n 'status',\n 'generationId',\n 'throughMessageId',\n 'throughIndex',\n 'summary',\n ].includes(key),\n ) &&\n ['running', 'completed'].includes(String(value['status'])) &&\n id(value['generationId']) &&\n id(value['throughMessageId']) &&\n index(value['throughIndex']) &&\n (value['summary'] === undefined || typeof value['summary'] === 'string'))\n\nconst progress = (value: unknown): boolean => {\n if (\n !record(value) ||\n !index(value['length']) ||\n !Array.isArray(value['tail']) ||\n !Array.isArray(value['blocks'])\n )\n return false\n const pending = [\n ...value['blocks'].toReversed().filter((block) => block !== null),\n value['tail'],\n ].toReversed()\n const seen = new Set<object>()\n let count = 0\n let last = -1\n while (pending.length > 0) {\n const block: unknown = pending.pop()\n if (typeof block !== 'object' || block === null || seen.has(block))\n return false\n seen.add(block)\n if (Array.isArray(block)) {\n for (const batch of block) {\n if (\n !record(batch) ||\n !index(batch['index']) ||\n batch['index'] <= last ||\n !Array.isArray(batch['chunks']) ||\n !batch['chunks'].every(\n (chunk) => record(chunk) && typeof chunk['type'] === 'string',\n )\n )\n return false\n count += 1\n last = batch['index']\n }\n } else if (\n record(block) &&\n Object.keys(block).length === 2 &&\n Object.hasOwn(block, 'left') &&\n Object.hasOwn(block, 'right')\n )\n pending.push(block['right'], block['left'])\n else return false\n }\n return count === value['length']\n}\n\nconst indexedEvents = (\n value: unknown,\n types: (keyof typeof events)[],\n): boolean =>\n Array.isArray(value) &&\n value.every(\n (event) =>\n record(event) &&\n index(event['index']) &&\n types.includes(event['type'] as keyof typeof events) &&\n matches(\n events[\n event['type'] as keyof typeof events\n ] as StandardSchemaV1<unknown>,\n event['payload'],\n ),\n )\n\nconst restorableBase = (options: {\n base: unknown\n current: UIMessage | undefined\n}): boolean => {\n assertMessageBase(options.base)\n return isMessage(\n restoreMessageBase({ current: options.current, base: options.base }),\n )\n}\n\nconst projection = (value: unknown, messages: UIMessage[]): boolean => {\n if (\n !record(value) ||\n Object.keys(value).some(\n (key) =>\n ![\n 'generationId',\n 'responseMessageId',\n 'promptThroughIndex',\n 'completionIndex',\n 'base',\n 'baseCompaction',\n 'batches',\n 'toolEvents',\n 'approvalEvents',\n 'cursor',\n ].includes(key),\n ) ||\n !id(value['generationId']) ||\n !id(value['responseMessageId']) ||\n !index(value['promptThroughIndex']) ||\n (value['completionIndex'] !== undefined &&\n !index(value['completionIndex'])) ||\n (value['base'] !== undefined &&\n !restorableBase({\n base: value['base'],\n current: messages.find(\n (message) => message.id === value['responseMessageId'],\n ),\n })) ||\n (value['baseCompaction'] !== undefined &&\n !compaction(value['baseCompaction'])) ||\n !progress(value['batches']) ||\n !indexedEvents(value['toolEvents'], ['ai.tool.called', 'ai.tool.result']) ||\n !indexedEvents(value['approvalEvents'], [\n 'ai.approval.requested',\n 'ai.approval.responded',\n ])\n )\n return false\n const cursor = value['cursor']\n if (cursor === undefined || cursor === null) return true\n if (\n !record(cursor) ||\n !index(cursor['throughIndex']) ||\n !record(cursor['stream'])\n )\n return false\n const stream = cursor['stream']\n const current = messages.find(\n (message) => message.id === value['responseMessageId'],\n )\n if (\n !current ||\n !['text', 'reasoning'].every(\n (key) =>\n record(stream[key]) &&\n Object.values(stream[key]).every(\n (part) => index(part) && part < current.parts.length,\n ),\n ) ||\n !record(stream['tools'])\n )\n return false\n return Object.values(stream['tools']).every(\n (tool) =>\n record(tool) &&\n typeof tool['text'] === 'string' &&\n typeof tool['toolName'] === 'string' &&\n typeof tool['dynamic'] === 'boolean',\n )\n}\n\nconst authority = (value: unknown): boolean =>\n value === null ||\n (record(value) &&\n Object.keys(value).every((key) =>\n [\n 'requestId',\n 'responseMessageId',\n 'sourceGenerationId',\n 'requestReason',\n 'phase',\n ].includes(key),\n ) &&\n ['requestId', 'responseMessageId', 'sourceGenerationId'].every((key) =>\n nullableId(value[key]),\n ) &&\n (value['requestReason'] === null ||\n ['message', 'tool', 'input', 'resume', 'retry'].includes(\n String(value['requestReason']),\n )) &&\n (value['phase'] === null ||\n [\n 'starting',\n 'generating',\n 'tools',\n 'waiting',\n 'failed',\n 'pausing',\n 'paused',\n ].includes(String(value['phase']))))\n\nexport const contextSchema = <M extends UIMessage>(\n app?: object,\n): StandardSchemaV1<AIContextState<M>> => ({\n '~standard': {\n version: 1,\n vendor: 'a2-context',\n validate(value) {\n const invalid = { issues: [{ message: 'invalid AI model context' }] }\n const keys = [\n 'messages',\n 'compaction',\n 'modelMetadata',\n 'closed',\n 'authority',\n 'generation',\n 'activeProjection',\n 'messageIndexes',\n ...(app === undefined ? [] : ['app']),\n ]\n try {\n if (\n !record(value) ||\n keys.some((key) => !Object.hasOwn(value, key)) ||\n Object.keys(value).some((key) => !keys.includes(key))\n )\n return invalid\n const messages = value['messages']\n const metadata = value['modelMetadata']\n const generation = value['generation']\n const current = value['activeProjection']\n if (\n !Array.isArray(messages) ||\n !messages.every(isMessage) ||\n !compaction(value['compaction']) ||\n typeof value['closed'] !== 'boolean' ||\n !authority(value['authority']) ||\n !record(metadata) ||\n !Object.entries(metadata).every(\n ([modelId, entry]) =>\n record(entry) &&\n (entry['status'] === 'pending' ||\n entry['status'] === 'unavailable' ||\n (entry['status'] === 'resolved' &&\n matches(events['ai.model.metadata.resolved'], {\n modelId,\n limits: entry['limits'],\n }))),\n ) ||\n !indexes(value['messageIndexes'], messages)\n )\n return invalid\n if (\n generation !== null &&\n (!record(generation) ||\n !matches(events['ai.generation.started'], generation['owner']) ||\n !index(generation['startIndex']) ||\n ![\n 'streaming',\n 'completed',\n 'paused',\n 'failed',\n 'superseded',\n ].includes(String(generation['phase'])) ||\n (generation['responseIndex'] !== undefined &&\n !index(generation['responseIndex'])) ||\n (generation['phase'] === 'failed' &&\n typeof generation['error'] !== 'string'))\n )\n return invalid\n const owner =\n record(generation) && record(generation['owner'])\n ? generation['owner']\n : undefined\n if (\n current !== null &&\n (!projection(current, messages) ||\n !record(current) ||\n current['generationId'] !== owner?.['generationId'] ||\n current['responseMessageId'] !== owner?.['responseMessageId'])\n )\n return invalid\n if (\n generation !== null &&\n (generation as Record<string, unknown>)['phase'] !== 'superseded' &&\n current === null\n )\n return invalid\n if (value['closed'] && (generation !== null || current !== null))\n return invalid\n if (app !== undefined && !record(value['app'])) return invalid\n return { value: value as AIContextState<M> }\n } catch {\n return invalid\n }\n },\n },\n})\n","import { restoreMessageBase } from './ai-message-base.ts'\nimport { reducer as makeReducer } from './reducer.ts'\nimport type { UIMessage } from 'ai'\nimport type {\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n CompactionCompletedPayload,\n CompactionRequestedPayload,\n CompactionState,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationRequestedPayload,\n GenerationStartedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ModelMetadataRequestedPayload,\n ModelMetadataResolvedPayload,\n ModelMetadataState,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { ControlCommit } from './ai-control.ts'\nimport { contextSchema } from './ai-context-schema.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport {\n projectedMessage,\n retainMessageBase,\n findMessage,\n advanceProjection,\n reduceToolActivity,\n upsertMessage,\n upsertResponse,\n type MessageProjection,\n} from './ai-message-projection.ts'\nimport { interruptUIMessage, pauseUIMessage } from './ai-projector.ts'\nimport {\n flattenProgressBatches,\n progressBatches,\n progressOwnedBy,\n type StoredProgressPayload,\n} from './ai-progress-batches.ts'\nimport { appReducerOf, appSlice } from './ai-app-state.ts'\nimport { withAIStorage } from './ai-stored-state.ts'\nimport type { Reducer } from './reducer.ts'\n\nexport type AIModelContext<M extends UIMessage = UIMessage> = {\n messages: M[]\n compaction: Omit<CompactionState, 'usage'> | null\n modelMetadata: Record<string, ModelMetadataState>\n}\n\nexport type AIContextState<M extends UIMessage> = AIModelContext<M> & {\n closed: boolean\n authority: Pick<\n ControlCommit['view'],\n | 'requestId'\n | 'requestReason'\n | 'sourceGenerationId'\n | 'responseMessageId'\n | 'phase'\n > | null\n generation: {\n owner: GenerationStartedPayload\n /** Log index of the owner's `ai.generation.started`. */\n startIndex: number\n phase: 'streaming' | 'completed' | 'paused' | 'failed' | 'superseded'\n error?: string\n responseIndex?: number\n } | null\n activeProjection: MessageProjection | null\n messageIndexes: Record<string, number>\n /** The contract's application state, when `agentContract()` has a reducer. */\n app?: object\n}\n\nconst replaceResponse = <M extends UIMessage>({\n state,\n message,\n index,\n}: {\n state: AIContextState<M>\n message: M\n index: number\n}): AIContextState<M> => {\n let messages = upsertResponse({\n messages: state.messages,\n message,\n inputId: state.generation!.owner.messageId,\n })\n if (\n state.generation?.responseIndex !== undefined &&\n !state.messages.some((item) => item.id === message.id)\n ) {\n messages = messages.filter((item) => item.id !== message.id)\n messages.splice(state.generation.responseIndex, 0, message)\n }\n return {\n ...state,\n messages,\n messageIndexes: Object.hasOwn(state.messageIndexes, message.id)\n ? state.messageIndexes\n : { ...state.messageIndexes, [message.id]: index },\n }\n}\n\nconst calledTools = <M extends UIMessage>({\n projection,\n current,\n}: {\n projection: MessageProjection\n current: M | undefined\n}): Set<string> =>\n new Set([\n ...(restoreMessageBase({ current, base: projection.base })?.parts.flatMap(\n (part) => ('toolCallId' in part ? [part.toolCallId] : []),\n ) ?? []),\n ...projection.toolEvents\n .filter((event) => event.type === 'ai.tool.called')\n .map((event) => event.payload.toolCallId),\n ])\n\nconst renderProjection = <M extends UIMessage>({\n state,\n index,\n}: {\n state: AIContextState<M>\n index: number\n}): AIContextState<M> => {\n const projection = state.activeProjection!\n const current = findMessage(state.messages, projection.responseMessageId)\n let message = projectedMessage({ projection, current })\n if (\n projection.base === undefined &&\n projection.batches.length === 0 &&\n message.parts.length === 0\n )\n return state\n if (state.generation?.phase === 'paused')\n message = pauseUIMessage({\n message,\n toolCallIds: calledTools({ projection, current }),\n })\n if (state.generation?.phase === 'failed')\n message = interruptUIMessage(\n message,\n `Generation failed before tool completion: ${state.generation.error}`,\n )\n return replaceResponse({\n state: { ...state, activeProjection: { ...projection, cursor: null } },\n message,\n index,\n })\n}\n\nexport const generationBase = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => {\n const projection = state.activeProjection\n if (!projection) return state\n const base = restoreMessageBase({\n current: findMessage(state.messages, projection.responseMessageId),\n base: projection.base,\n })\n return {\n ...state,\n messages:\n base === undefined\n ? state.messages.filter(\n (message) => message.id !== projection.responseMessageId,\n )\n : upsertMessage(state.messages, base),\n compaction: projection.baseCompaction ?? null,\n }\n}\n\nexport const contextForAttempt = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => ({\n ...(state.activeProjection?.completionIndex === undefined\n ? generationBase(state)\n : state),\n generation: state.generation && { ...state.generation, phase: 'superseded' },\n activeProjection: null,\n})\n\nconst endGeneration = <M extends UIMessage>(\n state: AIContextState<M>,\n): AIContextState<M> => ({\n ...state,\n authority: null,\n generation: null,\n activeProjection: null,\n})\n\nconst ownsGeneration = <M extends UIMessage>(\n state: AIContextState<M>,\n owner: { generationId: string; requestId: string },\n): boolean =>\n state.generation?.owner.generationId === owner.generationId &&\n state.generation.owner.requestId === owner.requestId &&\n state.generation.phase !== 'superseded'\n\nexport const createContextReducer = <M extends UIMessage, D extends EventDefs>({\n contract,\n}: {\n contract: Contract<D, Record<never, never>, unknown>\n}): Reducer<D, AIContextState<M>> => {\n const app = appReducerOf(contract)\n const initialState: AIContextState<M> = {\n messages: [],\n compaction: null,\n modelMetadata: {},\n closed: false,\n authority: null,\n generation: null,\n activeProjection: null,\n messageIndexes: {},\n ...(app === undefined ? {} : { app: app.initialState }),\n }\n const reducer = makeReducer({\n contract,\n // The application state rides in this checkpoint so every generation\n // reads it without another state read.\n name:\n app === undefined ? 'a2.ai.context.v6' : `${app.name}+a2.ai.context.v6`,\n initialState,\n stateSchema: contextSchema<M>(app),\n }).fold((state, event) => {\n const after = retainMessageBase({\n before: state,\n after: reduceContext(state, event),\n })\n if (app === undefined) return after\n const next = app.fold(state.app!, event as ContractEvent<EventDefs>)\n return next === state.app ? after : { ...after, app: appSlice(next) }\n })\n return withAIStorage(reducer)\n}\n\nconst reduceContext = <M extends UIMessage, D extends EventDefs>(\n state: AIContextState<M>,\n event: ContractEvent<D>,\n): AIContextState<M> => {\n if (state.closed) return state\n switch (event.type) {\n case 'ai.control.committed': {\n const { view } = event.payload as ControlCommit\n const {\n requestId,\n requestReason,\n sourceGenerationId,\n responseMessageId,\n phase,\n } = view\n const next = {\n ...state,\n authority: {\n requestId,\n requestReason,\n sourceGenerationId,\n responseMessageId,\n phase,\n },\n closed: view.closed,\n }\n return view.closed ? endGeneration(next) : next\n }\n case 'ai.session.closed':\n return endGeneration({\n ...state,\n closed: true,\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection?.baseCompaction ?? null)\n : state.compaction,\n })\n case 'ai.message.created': {\n const { message } = event.payload as MessageCreatedPayload<M>\n return {\n ...state,\n messages: upsertMessage(state.messages, message),\n activeProjection:\n state.activeProjection?.responseMessageId === message.id\n ? { ...state.activeProjection, cursor: null }\n : state.activeProjection,\n messageIndexes: { ...state.messageIndexes, [message.id]: event.index },\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (\n state.authority?.requestId !== event.id ||\n request.responseMessageId !== state.authority.responseMessageId ||\n request.reason !== state.authority.requestReason ||\n (request.sourceGenerationId ?? null) !==\n state.authority.sourceGenerationId ||\n request.reason !== 'retry'\n )\n return state\n return contextForAttempt(state)\n }\n case 'ai.generation.started': {\n const owner = event.payload as GenerationStartedPayload\n if (\n state.authority?.requestId !== owner.requestId ||\n state.authority.responseMessageId !== owner.responseMessageId ||\n state.authority.phase === 'paused' ||\n state.authority.phase === 'pausing'\n )\n return state\n const previous = state.generation\n if (\n previous?.owner.requestId === owner.requestId &&\n (previous.owner.attempt >= owner.attempt ||\n previous.phase === 'failed' ||\n previous.phase === 'completed' ||\n state.activeProjection?.completionIndex !== undefined)\n )\n return state\n const base =\n previous?.owner.requestId === owner.requestId\n ? generationBase(state)\n : state\n const baseMessage = base.messages.find(\n (message) => message.id === owner.responseMessageId,\n )\n return {\n ...base,\n generation: {\n owner,\n startIndex: event.index,\n phase: 'streaming',\n ...(previous?.owner.responseMessageId === owner.responseMessageId &&\n previous.responseIndex !== undefined\n ? { responseIndex: previous.responseIndex }\n : {}),\n },\n activeProjection: {\n generationId: owner.generationId,\n responseMessageId: owner.responseMessageId,\n promptThroughIndex: owner.promptThroughIndex ?? event.index - 1,\n ...(baseMessage === undefined\n ? {}\n : { base: { partCount: baseMessage.parts.length } }),\n baseCompaction: base.compaction,\n batches: progressBatches(),\n toolEvents: [],\n approvalEvents: [],\n },\n }\n }\n case 'ai.generation.progress': {\n const payload = event.payload as StoredProgressPayload\n const generation = state.generation\n if (\n generation === null ||\n generation.phase !== 'streaming' ||\n !progressOwnedBy({\n payload,\n owner: generation.owner,\n startIndex: generation.startIndex,\n }) ||\n !state.activeProjection\n )\n return state\n const projection = state.activeProjection\n const progress = advanceProjection({\n projection,\n base: state.messages.find(\n (message) => message.id === projection.responseMessageId,\n ),\n chunks: payload.chunks,\n index: event.index,\n })\n return replaceResponse({\n state: {\n ...state,\n activeProjection: {\n ...projection,\n batches: progress.batches,\n cursor: progress.cursor,\n },\n },\n message: progress.message,\n index: event.index,\n })\n }\n case 'ai.generation.completed': {\n const payload = event.payload as GenerationCompletedPayload\n if (\n !ownsGeneration(state, payload) ||\n state.generation!.phase !== 'streaming'\n )\n return state\n return {\n ...state,\n generation: { ...state.generation!, phase: 'completed' },\n activeProjection: {\n ...state.activeProjection!,\n completionIndex: event.index,\n cursor: null,\n },\n }\n }\n case 'ai.generation.failed': {\n const payload = event.payload as GenerationFailedPayload\n if (!ownsGeneration(state, payload)) return state\n if (\n state.generation!.phase !== 'streaming' &&\n !(\n payload.stepLimit &&\n state.authority?.requestReason === 'tool' &&\n state.authority.sourceGenerationId === payload.generationId\n )\n )\n return state\n if (payload.superseded) {\n const next = generationBase(state)\n return {\n ...next,\n generation: { ...state.generation!, phase: 'superseded' },\n activeProjection: null,\n }\n }\n return renderProjection({\n state: {\n ...state,\n compaction: state.activeProjection?.baseCompaction ?? null,\n generation: {\n ...state.generation!,\n phase: 'failed',\n error: payload.error,\n },\n },\n index: event.index,\n })\n }\n case 'ai.message.interrupted': {\n const payload = event.payload as MessageInterruptedPayload\n const owner = state.generation?.owner\n const ownsRequest =\n payload.requestId !== undefined &&\n payload.requestId === state.authority?.requestId &&\n payload.messageId === state.authority.responseMessageId\n const ownsOwner =\n owner?.responseMessageId === payload.messageId &&\n (payload.generationId === owner.generationId ||\n payload.requestId === owner.requestId)\n if (!ownsRequest && !ownsOwner) return state\n if (\n ownsOwner &&\n state.authority?.requestId !== owner!.requestId &&\n !ownsRequest\n )\n return state\n const projection = state.activeProjection\n if (!projection) return endGeneration(state)\n const cutoff = payload.lastSeenIndex ?? Number.POSITIVE_INFINITY\n const retained = {\n ...projection,\n batches: progressBatches(\n flattenProgressBatches(projection.batches).filter(\n (batch) => batch.index <= cutoff,\n ),\n ),\n toolEvents: projection.toolEvents.filter(\n (item) => item.index <= cutoff,\n ),\n approvalEvents: projection.approvalEvents.filter(\n (item) => item.index <= cutoff,\n ),\n }\n let next = generationBase(state)\n if (retained.base !== undefined || retained.batches.length > 0)\n next = replaceResponse({\n state: next,\n message: interruptUIMessage(\n projectedMessage({\n projection: retained,\n current: findMessage(state.messages, retained.responseMessageId),\n }),\n ),\n index: event.index,\n })\n return endGeneration(next)\n }\n case 'ai.message.completed': {\n const { messageId } = event.payload as { messageId: string }\n return state.generation?.owner.responseMessageId === messageId &&\n state.generation.phase !== 'failed' &&\n state.generation.phase !== 'superseded'\n ? endGeneration(state)\n : state\n }\n case 'ai.generation.paused': {\n const { generationId } = event.payload as { generationId: string }\n if (\n state.generation?.owner.generationId !== generationId ||\n state.generation.phase === 'failed' ||\n state.generation.phase === 'superseded' ||\n !state.activeProjection\n )\n return state\n const toolCallIds = calledTools({\n projection: state.activeProjection,\n current: findMessage(\n state.messages,\n state.activeProjection.responseMessageId,\n ),\n })\n return renderProjection({\n state: {\n ...state,\n generation: { ...state.generation, phase: 'paused' },\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection.baseCompaction ?? null)\n : state.compaction,\n activeProjection: {\n ...state.activeProjection,\n cursor: null,\n batches: progressBatches(\n flattenProgressBatches(state.activeProjection.batches).map(\n (batch) => ({\n index: batch.index,\n chunks: batch.chunks.filter(\n (chunk) =>\n !('toolCallId' in chunk) ||\n toolCallIds.has(chunk.toolCallId),\n ),\n }),\n ),\n ),\n },\n },\n index: event.index,\n })\n }\n case 'ai.tool.called':\n case 'ai.tool.result': {\n const payload = event.payload as ToolCalledPayload | ToolResultPayload\n if (\n !ownsGeneration(state, payload) ||\n !state.activeProjection ||\n state.generation!.owner.responseMessageId !== payload.messageId\n )\n return state\n if (state.generation!.phase === 'failed') {\n const result = payload as ToolResultPayload\n const running = state.activeProjection.toolEvents\n .reduce(\n (tools, item) => reduceToolActivity(tools, item),\n [] as ReturnType<typeof reduceToolActivity>,\n )\n .some(\n (tool) =>\n tool.toolCallId === payload.toolCallId &&\n tool.status === 'running',\n )\n if (event.type !== 'ai.tool.result' || result.preliminary || !running)\n return state\n }\n const toolEvent =\n event.type === 'ai.tool.called'\n ? {\n index: event.index,\n type: 'ai.tool.called' as const,\n payload: payload as ToolCalledPayload,\n }\n : {\n index: event.index,\n type: 'ai.tool.result' as const,\n payload: payload as ToolResultPayload,\n }\n const next = {\n ...state,\n activeProjection: {\n ...state.activeProjection,\n toolEvents: [...state.activeProjection.toolEvents, toolEvent],\n },\n }\n if (event.type === 'ai.tool.called') return next\n next.activeProjection.cursor = null\n return renderProjection({ state: next, index: event.index })\n }\n case 'ai.approval.requested':\n case 'ai.approval.responded': {\n const payload = event.payload as\n ApprovalRequestedPayload | ApprovalRespondedPayload\n if (\n !ownsGeneration(state, payload) ||\n !state.activeProjection ||\n state.generation!.phase === 'failed' ||\n state.generation!.owner.responseMessageId !== payload.messageId\n )\n return state\n const approvalEvent =\n event.type === 'ai.approval.requested'\n ? {\n index: event.index,\n type: 'ai.approval.requested' as const,\n payload: payload as ApprovalRequestedPayload,\n }\n : {\n index: event.index,\n type: 'ai.approval.responded' as const,\n payload: payload as ApprovalRespondedPayload,\n }\n return renderProjection({\n state: {\n ...state,\n activeProjection: {\n ...state.activeProjection,\n cursor: null,\n approvalEvents: [\n ...state.activeProjection.approvalEvents,\n approvalEvent,\n ],\n },\n },\n index: event.index,\n })\n }\n case 'ai.compaction.requested': {\n const payload = event.payload as CompactionRequestedPayload\n if (\n state.generation?.owner.generationId !== payload.generationId ||\n state.generation.phase !== 'streaming'\n )\n return state\n return {\n ...state,\n compaction: {\n status: 'running',\n generationId: payload.generationId,\n throughMessageId: payload.throughMessageId,\n throughIndex:\n payload.throughIndex ?? state.activeProjection!.promptThroughIndex!,\n },\n }\n }\n case 'ai.compaction.completed': {\n const payload = event.payload as CompactionCompletedPayload<M>\n const projection = state.activeProjection\n if (\n state.generation?.owner.generationId !== payload.generationId ||\n state.generation.phase !== 'streaming' ||\n state.compaction?.status !== 'running' ||\n state.compaction.generationId !== payload.generationId ||\n !projection\n )\n return state\n const throughIndex =\n payload.throughIndex ?? projection.promptThroughIndex!\n const replacements = new Set(\n payload.messages.map((message) => message.id),\n )\n const retained = new Set(payload.retainedMessageIds ?? [])\n const messages = [\n ...payload.messages,\n ...state.messages.filter(\n (message) =>\n !replacements.has(message.id) &&\n (retained.has(message.id) ||\n (state.messageIndexes[message.id] ?? 0) > throughIndex),\n ),\n ]\n const activeProjection = { ...projection, cursor: null }\n delete activeProjection.base\n const baseMessage = messages.find(\n (message) => message.id === projection.responseMessageId,\n )\n if (baseMessage !== undefined)\n activeProjection.base = { partCount: baseMessage.parts.length }\n const compaction: AIModelContext<M>['compaction'] = {\n status: 'completed',\n generationId: payload.generationId,\n throughMessageId: payload.throughMessageId,\n throughIndex,\n ...(payload.summary === undefined ? {} : { summary: payload.summary }),\n }\n activeProjection.baseCompaction = compaction\n return {\n ...state,\n messages,\n compaction,\n generation: {\n ...state.generation,\n responseIndex: payload.messages.length,\n },\n activeProjection,\n messageIndexes: Object.fromEntries(\n messages.map((message) => [\n message.id,\n replacements.has(message.id)\n ? throughIndex\n : state.messageIndexes[message.id]!,\n ]),\n ),\n }\n }\n case 'ai.model.metadata.requested': {\n const { modelId } = event.payload as ModelMetadataRequestedPayload\n return Object.hasOwn(state.modelMetadata, modelId)\n ? state\n : {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]: { status: 'pending' },\n },\n }\n }\n case 'ai.model.metadata.resolved': {\n const { modelId, limits } = event.payload as ModelMetadataResolvedPayload\n return {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]:\n limits === null\n ? { status: 'unavailable' }\n : { status: 'resolved', limits },\n },\n }\n }\n default:\n return state\n }\n}\n","import {\n convertToModelMessages,\n stepCountIs,\n streamText,\n toUIMessageStream,\n} from 'ai'\nimport type {\n FinishReason,\n InferUIMessageChunk,\n Instructions,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n} from 'ai'\n\ntype StreamTextOptions<T extends ToolSet> = Parameters<typeof streamText<T>>[0]\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\ntype ModelStepTimeout<T extends ToolSet> =\n | number\n | Omit<\n Exclude<StreamTextOptions<T>['timeout'], number | undefined>,\n 'toolMs' | 'tools'\n >\n\ntype ControlledStreamTextSetting =\n | '_internal'\n | 'abortSignal'\n | 'instructions'\n | 'messages'\n | 'model'\n | 'onToolExecutionEnd'\n | 'onToolExecutionStart'\n | 'experimental_onToolCallFinish'\n | 'experimental_onToolCallStart'\n | 'experimental_sandbox'\n | 'experimental_toolCallers'\n | 'experimental_toolApprovalSecret'\n | 'prompt'\n | 'prepareStep'\n | 'stopWhen'\n | 'system'\n | 'tools'\n\ntype RetypedStreamTextSetting =\n | 'experimental_onStart'\n | 'experimental_onStepStart'\n | 'experimental_repairToolCall'\n | 'experimental_transform'\n | 'onStart'\n | 'onStepStart'\n | 'repairToolCall'\n\ntype ModelFacingTools<T extends ToolSet> = {\n readonly [K in keyof T]: Omit<T[K], 'execute'>\n}\n\ntype SettingEvent<T extends ToolSet, K extends keyof StreamTextOptions<T>> =\n NonNullable<StreamTextOptions<T>[K]> extends (event: infer EVENT) => unknown\n ? EVENT\n : never\n\ntype ModelPhaseStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseStepStartEvent<T extends ToolSet> = Omit<\n SettingEvent<T, 'onStepStart'>,\n 'tools'\n> & {\n readonly tools: ModelFacingTools<T> | undefined\n}\n\ntype ModelPhaseCallback<EVENT> = (event: EVENT) => void | PromiseLike<void>\n\ntype StreamTextRepairToolCall<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['repairToolCall']\n>\n\ntype ModelPhaseRepairToolCall<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextRepairToolCall<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextRepairToolCall<T>>\n\ntype StreamTextTransformSetting<T extends ToolSet> = NonNullable<\n StreamTextOptions<T>['experimental_transform']\n>\n\ntype StreamTextTransform<T extends ToolSet> = Extract<\n StreamTextTransformSetting<T>,\n (...args: never[]) => unknown\n>\n\ntype ModelPhaseTransform<T extends ToolSet> = (\n options: Omit<Parameters<StreamTextTransform<T>>[0], 'tools'> & {\n tools: ModelFacingTools<T>\n },\n) => ReturnType<StreamTextTransform<T>>\n\n/** AI SDK streamText settings that remain meaningful for one durable step. */\nexport type AISDKStepSettings<T extends ToolSet> = Partial<\n Omit<\n StreamTextOptions<T>,\n ControlledStreamTextSetting | RetypedStreamTextSetting | 'timeout'\n >\n> & {\n timeout?: ModelStepTimeout<T>\n onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n experimental_onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>\n onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n experimental_onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>\n repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_repairToolCall?: ModelPhaseRepairToolCall<T>\n experimental_transform?:\n ModelPhaseTransform<T> | Array<ModelPhaseTransform<T>>\n}\n\nexport type AISDKStepInput<M extends UIMessage, T extends ToolSet> = {\n /** An AI Gateway model ID, resolved through the AI SDK's global provider. */\n model: string\n tools: T\n messages: M[]\n modelMessages?: ModelMessage[]\n responseMessageId: string\n abortSignal: AbortSignal\n instructions?: Instructions\n settings?: AISDKStepSettings<T>\n messageMetadata?: (options: {\n part: TextStreamPart<T>\n }) => UIMessageMetadata<M> | undefined\n}\n\nexport type AISDKStepCompletion = {\n finishReason: FinishReason\n usage: LanguageModelUsage\n}\n\nexport type AISDKStepResult<M extends UIMessage> = {\n stream: ReadableStream<InferUIMessageChunk<M>>\n completion(): AISDKStepCompletion\n}\n\nconst CONTROLLED_SETTINGS: readonly ControlledStreamTextSetting[] = [\n '_internal',\n 'abortSignal',\n 'instructions',\n 'messages',\n 'model',\n 'onToolExecutionEnd',\n 'onToolExecutionStart',\n 'experimental_onToolCallFinish',\n 'experimental_onToolCallStart',\n 'experimental_sandbox',\n 'experimental_toolCallers',\n 'experimental_toolApprovalSecret',\n 'prompt',\n 'prepareStep',\n 'stopWhen',\n 'system',\n 'tools',\n]\n\nconst safeSettings = <T extends ToolSet>(\n settings: AISDKStepSettings<T> | undefined,\n): AISDKStepSettings<T> => {\n const result = { ...settings } as AISDKStepSettings<T>\n for (const key of CONTROLLED_SETTINGS) Reflect.deleteProperty(result, key)\n if (typeof result.timeout === 'object' && result.timeout !== null) {\n const timeout = { ...result.timeout } as Record<string, unknown>\n Reflect.deleteProperty(timeout, 'toolMs')\n Reflect.deleteProperty(timeout, 'tools')\n result.timeout = timeout as ModelStepTimeout<T>\n }\n return result\n}\n\nconst modelToolSet = <T extends ToolSet>(tools: T): T =>\n Object.fromEntries(\n Object.entries(tools).map(([name, tool]) => {\n if (tool.type === 'provider' && tool.isProviderExecuted === true) {\n return [name, tool]\n }\n const definition = { ...tool }\n Reflect.deleteProperty(definition, 'execute')\n return [name, definition]\n }),\n ) as T\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\n/** Run exactly one AI SDK model step while leaving local tool execution to A2. */\nexport async function generateAISDKStep<M extends UIMessage, T extends ToolSet>(\n input: AISDKStepInput<M, T>,\n): Promise<AISDKStepResult<M>> {\n const settings = safeSettings(input.settings)\n const tools = modelToolSet(input.tools)\n const messages =\n input.modelMessages ??\n (await convertToModelMessages(input.messages, { tools }))\n const streamOptions = {\n ...settings,\n model: input.model,\n tools,\n messages,\n abortSignal: input.abortSignal,\n ...(input.instructions === undefined\n ? {}\n : { instructions: input.instructions }),\n stopWhen: stepCountIs(1),\n // A2 records stream failures durably; the AI SDK default writes them to\n // stderr in addition to yielding an error part.\n onError: settings.onError ?? (() => {}),\n } as unknown as StreamTextOptions<T>\n const result = streamText<T>(streamOptions)\n\n let completion: AISDKStepCompletion | undefined\n let fatalError: { value: unknown } | undefined\n const observed = result.stream.pipeThrough(\n new TransformStream<TextStreamPart<T>, TextStreamPart<T>>({\n transform(part, controller) {\n if (part.type === 'error' && fatalError === undefined) {\n fatalError = { value: part.error }\n } else if (part.type === 'finish') {\n completion = {\n finishReason: part.finishReason,\n usage: part.totalUsage,\n }\n }\n controller.enqueue(part)\n },\n }),\n )\n\n return {\n stream: toUIMessageStream<T, M>({\n stream: observed,\n tools,\n generateMessageId: () => input.responseMessageId,\n onError: errorMessage,\n ...(input.messageMetadata === undefined\n ? {}\n : { messageMetadata: input.messageMetadata }),\n }),\n completion() {\n if (fatalError !== undefined) throw fatalError.value\n if (completion === undefined) {\n throw new Error('AI SDK step ended without a finish part')\n }\n if (completion.finishReason === 'error') {\n throw new Error('AI SDK step finished with an error')\n }\n return completion\n },\n }\n}\n","import type { ModelLimits } from './ai.ts'\n\nconst catalogUrl = 'https://ai-gateway.vercel.sh/v1/models'\nconst catalogLifetimeMs = 60 * 60 * 1_000\nconst catalogTimeoutMs = 5_000\n\nlet catalog:\n | {\n expiresAt: number\n promise: Promise<ReadonlyMap<string, ModelLimits>>\n }\n | undefined\n\n/**\n * The model's AI Gateway ID: the model string, unless an AI SDK global\n * provider resolves it to a model that is not Gateway's.\n */\nexport const gatewayModelId = (model: string): string | undefined => {\n const provider = globalThis.AI_SDK_DEFAULT_PROVIDER\n if (provider === undefined) return model\n if (typeof provider.languageModel !== 'function') return undefined\n return provider.languageModel(model).provider === 'gateway'\n ? model\n : undefined\n}\n\nconst readCatalog = (): Promise<ReadonlyMap<string, ModelLimits>> => {\n if (catalog && catalog.expiresAt > Date.now()) return catalog.promise\n const entry = {\n expiresAt: Number.POSITIVE_INFINITY,\n promise: (async () => {\n const controller = new AbortController()\n const timeout = setTimeout(\n () => controller.abort(new Error('model catalog request timed out')),\n catalogTimeoutMs,\n )\n timeout.unref?.()\n try {\n const response = await fetch(catalogUrl, { signal: controller.signal })\n if (!response.ok)\n throw new Error(\n `model catalog request failed: HTTP ${response.status}`,\n )\n const body: unknown = await response.json()\n if (\n typeof body !== 'object' ||\n body === null ||\n !('data' in body) ||\n !Array.isArray(body.data)\n ) {\n throw new Error('model catalog response must contain a data array')\n }\n const models = new Map<string, ModelLimits>()\n for (const row of body.data as unknown[]) {\n if (\n typeof row !== 'object' ||\n row === null ||\n !('type' in row) ||\n !('id' in row) ||\n !('context_window' in row) ||\n !('max_tokens' in row) ||\n row.type !== 'language' ||\n typeof row.id !== 'string' ||\n typeof row.context_window !== 'number' ||\n typeof row.max_tokens !== 'number' ||\n !Number.isSafeInteger(row.context_window) ||\n row.context_window <= 0 ||\n !Number.isSafeInteger(row.max_tokens) ||\n row.max_tokens <= 0\n )\n continue\n models.set(row.id, {\n contextWindow: row.context_window,\n maxOutputTokens: row.max_tokens,\n })\n }\n return models\n } finally {\n clearTimeout(timeout)\n }\n })(),\n }\n catalog = entry\n entry.promise = entry.promise.then(\n (models) => {\n entry.expiresAt = Date.now() + catalogLifetimeMs\n return models\n },\n (error: unknown) => {\n if (catalog === entry) catalog = undefined\n throw error\n },\n )\n return entry.promise\n}\n\nexport const readModelLimits = async (options: {\n modelId: string\n signal: AbortSignal\n}): Promise<ModelLimits | null> => {\n options.signal.throwIfAborted()\n let onAbort!: () => void\n const aborted = new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(options.signal.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n })\n try {\n const models = await Promise.race([readCatalog(), aborted])\n return models.get(options.modelId) ?? null\n } finally {\n options.signal.removeEventListener('abort', onAbort)\n }\n}\n","import { Buffer } from 'node:buffer'\nimport { asSchema } from 'ai'\nimport type { Instructions, ModelMessage, ToolSet } from 'ai'\nimport type { AICoordinatorState } from './ai-coordinator.ts'\n\nconst withoutProviderOptions = <T extends object>(value: T): T => {\n const result = { ...value }\n Reflect.deleteProperty(result, 'providerOptions')\n return result\n}\n\nconst estimatedMessage = (message: ModelMessage): unknown => ({\n ...withoutProviderOptions(message),\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) =>\n part.type === 'tool-result'\n ? {\n ...withoutProviderOptions(part),\n output: {\n ...withoutProviderOptions(part.output),\n ...(part.output.type === 'content'\n ? {\n value: part.output.value.map(withoutProviderOptions),\n }\n : {}),\n },\n }\n : withoutProviderOptions(part),\n ),\n})\n\nexport const estimateInputTokens = async (options: {\n messages: ModelMessage[]\n instructions: Instructions | undefined\n tools: ToolSet\n}): Promise<number> => {\n const tools = await Promise.all(\n Object.entries(options.tools).map(async ([name, tool]) => ({\n name,\n description: tool.description,\n inputSchema: await asSchema(tool.inputSchema).jsonSchema,\n })),\n )\n const instructions = options.instructions\n return Math.ceil(\n Buffer.byteLength(\n JSON.stringify({\n messages: options.messages.map(estimatedMessage),\n instructions:\n instructions === undefined || typeof instructions === 'string'\n ? instructions\n : Array.isArray(instructions)\n ? instructions.map(estimatedMessage)\n : estimatedMessage(instructions),\n tools,\n }),\n 'utf8',\n ) / 4,\n )\n}\n\nexport const measuredInputTokens = (options: {\n estimate: number\n model: string\n calibration: AICoordinatorState['calibration']\n}): number => {\n const previous = options.calibration\n return previous !== undefined &&\n previous.model === options.model &&\n options.estimate >= previous.estimate\n ? Math.ceil(previous.inputTokens + options.estimate - previous.estimate)\n : options.estimate\n}\n","/**\n * The server-only implementation of the experimental-a2/ai protocol: the\n * handler table and `agent()`, its assembly as an ordinary A2 server.\n */\n\n// oxlint-disable no-await-in-loop -- stream chunks and durable appends are\n// ordered; parallel consumption would corrupt progress sequence and state.\n\nimport { createControlRuntime, ControlCancelled } from './ai-control-server.ts'\nimport {\n createContextReducer,\n contextForAttempt,\n generationBase,\n type AIContextState,\n type AIModelContext,\n} from './ai-context.ts'\nimport { isAgentContract } from './ai-app-state.ts'\nimport { boundedCache } from './bounded-cache.ts'\nimport type { Reducer } from './reducer.ts'\nimport { aiEventId, AI_EVENT_ID_PREFIX } from './ai-id.ts'\nimport type { ControlCommit, ControlCommand } from './ai-control.ts'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { createHash } from 'node:crypto'\nimport { convertToModelMessages, isToolUIPart } from 'ai'\nimport type {\n Experimental_SandboxSession,\n FinishReason,\n Instructions,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport { generateAISDKStep, type AISDKStepSettings } from './ai-sdk-step.ts'\nimport {\n harnessDriver,\n harnessLog,\n harnessStates,\n registerHarnessStates,\n type Harness,\n type HarnessDriver,\n type HarnessStates,\n} from './ai-harness.ts'\nimport { gatewayModelId, readModelLimits } from './ai-model-metadata.ts'\nimport { estimateInputTokens, measuredInputTokens } from './ai-input-tokens.ts'\nimport { AI_STATE_REDUCER, agentContract, events as aiEvents } from './ai.ts'\nimport type {\n AIEventDefs,\n AIMessageOf,\n AIState,\n AgentToolContext,\n AgentToolEventDefs,\n ApprovalRequestedPayload,\n CompactionCompletedPayload,\n CompactionRequestedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationStartedPayload,\n MessageCompletedPayload,\n ReasoningLevel,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport type { AICoordinatorState } from './ai-coordinator.ts'\nimport type {\n AppendInput,\n Contract,\n ContractEvent,\n EventDefs,\n} from './contract.ts'\nimport { A2Error } from './errors.ts'\nimport {\n consumeSchedulerSendFailure,\n failedPreviousAttempt,\n installAmbientToolScopeStorage,\n type AmbientToolScope,\n} from './internal.ts'\nimport {\n createServer,\n type A2Server,\n type HandlerContext,\n type ServerOptions,\n} from './server.ts'\nimport {\n setServerFetchHooks,\n type ServerIngressContext,\n} from './server-fetch.ts'\nimport { CONSOLE_TELEMETRY, type A2Telemetry } from './telemetry.ts'\n\nconst isAgentIngressEvent = (event: {\n type: string\n payload: unknown\n}): boolean => {\n if (event.type !== 'ai.control.requested') return false\n const command = event.payload\n if (typeof command !== 'object' || command === null) return false\n const action = (command as { action?: unknown }).action\n if (action === 'request-input' || action === 'tool-result') return false\n if (action === 'send' || action === 'edit' || action === 'steer')\n return (\n (command as { message?: { role?: unknown } }).message?.role === 'user'\n )\n return true\n}\n\n// With a shared contract, browsers push application events like any A2\n// client, under the route's `authorize`. Events declared with `name` have no\n// client that can push them, so they stay server-only.\nconst validateAgentIngress = ({\n context,\n applicationEvents,\n}: {\n context: ServerIngressContext\n applicationEvents: boolean\n}): void => {\n const rejected = context.events.find((event) =>\n Object.hasOwn(aiEvents, event.type)\n ? !isAgentIngressEvent(event)\n : !applicationEvents,\n )\n if (rejected !== undefined) {\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `event '${rejected.type}' is server-only for an AI agent`,\n )\n }\n}\n\ntype AgentGenerationProgress = {\n type: 'progress'\n chunks: UIMessageChunk[]\n}\n\ntype AgentGenerationFinish = {\n type: 'finish'\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype AgentGenerationUpdate = AgentGenerationProgress | AgentGenerationFinish\n\nexport type AgentGenerateContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n X extends object = Record<never, never>,\n> = AgentResolverContext<M, D, X> & {\n generationId: string\n modelMessages: ModelMessage[]\n /** The resolved AI Gateway model ID. */\n model: string\n tools: T\n instructions?: Instructions\n generation: AgentGenerationSettings<T>\n}\n\nexport type AgentGenerate<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n X extends object = Record<never, never>,\n> = (\n context: AgentGenerateContext<M, D, T, X>,\n) => ReadableStream<UIMessageChunk> | Promise<ReadableStream<UIMessageChunk>>\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\nexport type AgentMessageMetadata<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n X extends object = Record<never, never>,\n> = (\n context: AgentGenerateContext<M, D, T, X> & { part: TextStreamPart<T> },\n) => UIMessageMetadata<M> | undefined\n\nexport type AgentResolverContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n X extends object = Record<never, never>,\n> = {\n event: ContractEvent<D, 'ai.generation.requested'>\n messages: M[]\n /**\n * The contract's application state, as of the captured snapshot. It rides\n * in the checkpoint the generation already reads, so it costs no I/O.\n */\n state: X\n session: Pick<HandlerContext<D>['session'], 'state'>\n signal: AbortSignal\n}\n\nexport type Resolvable<T, C> = T | ((context: C) => T | Promise<T>)\n\n/** A model with its reasoning level and speed, chosen together. */\nexport type ModelSettings = {\n /** An AI Gateway model ID, such as `'anthropic/claude-sonnet-5.5'`. */\n model: string\n /** Overrides `generation.reasoning`. */\n reasoning?: ReasoningLevel\n /** `fast` prefers AI Gateway's faster tier when the model offers one. */\n speed?: 'fast' | 'standard'\n}\n\nexport type CompactionPolicy<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n X extends object = Record<never, never>,\n> = {\n shouldCompact(\n context: AgentResolverContext<M, D, X> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): boolean | Promise<boolean>\n compact(\n context: AgentResolverContext<M, D, X> & {\n messages: M[]\n modelMessages: ModelMessage[]\n },\n ): M[] | Promise<M[]>\n}\n\nexport type AutomaticCompaction = {\n thresholdTokens?: number\n instructions?: string\n}\n\nexport type CompactionOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n X extends object = Record<never, never>,\n> = false | AutomaticCompaction | CompactionPolicy<M, D, X>\n\nexport type AgentGenerationSettings<T extends ToolSet> = AISDKStepSettings<T>\n\nexport type HandlersOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n X extends object = Record<never, never>,\n> = AgentModelOptions<M, D, T, X> & {\n contract: Contract<D, Record<never, never>, unknown>\n telemetry?: A2Telemetry\n /** Where harness steps keep their saved states; one per agent. */\n harnessStates?: HarnessStates\n}\n\n/** What a tool call does when a crash or a cancellation may have cut it short. */\nexport type ToolRecovery = 'rerun' | 'report'\n\n/**\n * The AI SDK harness, the default: one AI SDK `streamText()` step per\n * durable generation, with A2 running tools, approvals, and compaction.\n */\nexport type AISDKHarness<\n M extends UIMessage = UIMessage,\n D extends AIEventDefs<M> & EventDefs = AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n X extends object = Record<never, never>,\n> = {\n type: 'ai-sdk'\n /** Settings for each one-step AI SDK streamText call, resolved per generation. */\n generation?: Resolvable<\n AgentGenerationSettings<T>,\n AgentResolverContext<M, D, X>\n >\n /** Map default AI SDK stream parts to typed assistant message metadata. */\n messageMetadata?: AgentMessageMetadata<M, D, T, X>\n /**\n * Replace model generation with an AI SDK UI message chunk stream.\n * The custom stream owns its metadata chunks.\n */\n generate?: AgentGenerate<M, D, T, X>\n compaction?: Resolvable<\n CompactionOptions<M, D, X>,\n AgentResolverContext<M, D, X>\n >\n}\n\ntype AgentLoopOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n X extends object,\n H extends string,\n> =\n | {\n /** The agent's loop: the AI SDK's (the default), or `fx()` or `pi()`. */\n harness?: AISDKHarness<M, D, T, X>\n /** Per tool name: rerun an interrupted call (the default) or report it to the model. */\n toolRecovery?: Readonly<\n Partial<Record<NoInfer<keyof T & string>, ToolRecovery>>\n >\n }\n | {\n harness: Harness<'fx' | 'pi', H>\n /** Per tool name, the harness's own tools included: rerun an interrupted call (the default) or report it. */\n toolRecovery?: Readonly<\n Partial<Record<NoInfer<(keyof T & string) | H>, ToolRecovery>>\n >\n }\n\nexport type AgentModelOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n X extends object = Record<never, never>,\n /** The tool names a harness from `fx()` or `pi()` brings. */\n H extends string = string,\n> = {\n /**\n * An AI Gateway model ID, or `ModelSettings` to choose its reasoning level\n * and speed with it, optionally resolved per generation.\n */\n model: Resolvable<string | ModelSettings, AgentResolverContext<M, D, X>>\n tools?: T\n instructions?: Resolvable<\n Instructions | undefined,\n AgentResolverContext<M, D, X>\n >\n /**\n * Maximum model steps in one assistant response. Defaults to Infinity.\n */\n maxSteps?: number\n /** Progress is durably flushed at either limit, whichever is reached first. */\n progress?: { maxChunks?: number; maxDelayMs?: number }\n /**\n * Run local tool executions one at a time on this lane. By default,\n * independent tools run concurrently.\n */\n toolLane?: string\n} & AgentLoopOptions<M, D, T, X, H>\n\ntype AgentServerOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n S,\n T extends ToolSet,\n X extends object = Record<never, never>,\n H extends string = string,\n> = AgentModelOptions<M, D, T, X, H> &\n Omit<\n ServerOptions<D, Record<never, never>, Reducer<D, S>>,\n 'contract' | 'handlers'\n > & {\n /** Handlers for application events. */\n handlers?: ServerOptions<D, Record<never, never>, Reducer<D, S>>['handlers']\n }\n\nexport type AgentOptions<\n M extends UIMessage,\n E extends EventDefs,\n T extends ToolSet,\n H extends string = string,\n> = AgentServerOptions<\n NoInfer<M>,\n AIEventDefs<NoInfer<M>> & E,\n AIState<NoInfer<M>>,\n T,\n Record<never, never>,\n H\n> & {\n /** Identity: prefixes storage keys and queue messages. */\n name: string\n /**\n * Server-only application events. Browsers push application events through\n * a shared `agentContract()`.\n */\n events?: E\n /** Optional stricter schema for custom UIMessage metadata/data/tool types. */\n messageSchema?: StandardSchemaV1<M>\n}\n\nexport type AgentFromContractOptions<\n D extends AIEventDefs<AIMessageOf<D>> & EventDefs,\n S,\n T extends ToolSet,\n Name extends string = string,\n X extends object = Record<never, never>,\n H extends string = string,\n> = AgentServerOptions<AIMessageOf<D>, D, S, T, X, H> & {\n /**\n * A shared `agentContract()`. Its application state reaches every resolver\n * as `state`; a fully custom contract is core A2, served by `createServer()`.\n */\n contract: Contract<\n D,\n Record<never, never>,\n Reducer<D, S> & { readonly name: Name; readonly '~appState': X }\n >\n}\n\n/**\n * An A2 server for the AI protocol; `typeof` it types `useAgent`. `Name` is\n * its reducer's name: the built-in one lets contract-free clients fold state.\n */\nexport type Agent<\n D extends EventDefs,\n S,\n Name extends string = string,\n> = A2Server<D, Record<never, never>, Reducer<D, S> & { readonly name: Name }>\n\nconst checkAbort = (signal: AbortSignal): boolean => {\n if (!signal.aborted) return false\n const reason: unknown = signal.reason\n if (\n reason instanceof A2Error &&\n (reason.code === 'CLAIM_EXPIRED' || reason.code === 'SUPERSEDED_ATTEMPT')\n ) {\n throw reason\n }\n return true\n}\n\nconst resolve = async <T, C extends { signal: AbortSignal }>(\n value: Resolvable<T, C>,\n context: C,\n): Promise<T> => {\n let result: T\n try {\n result =\n typeof value === 'function'\n ? await (value as (context: C) => T | Promise<T>)(context)\n : value\n } catch (error) {\n checkAbort(context.signal)\n throw error\n }\n checkAbort(context.signal)\n return result\n}\n\nconst withModelSettings = <T extends ToolSet>(options: {\n generation: AgentGenerationSettings<T>\n settings: ModelSettings\n}): AgentGenerationSettings<T> => {\n const { generation, settings } = options\n if (settings.reasoning === undefined && settings.speed === undefined)\n return generation\n const { speed: _speed, ...gateway } =\n generation.providerOptions?.['gateway'] ?? {}\n return {\n ...generation,\n ...(settings.reasoning === undefined\n ? {}\n : { reasoning: settings.reasoning }),\n ...(settings.speed === undefined\n ? {}\n : {\n providerOptions: {\n ...generation.providerOptions,\n gateway:\n settings.speed === 'fast'\n ? { ...gateway, speed: 'fast' }\n : gateway,\n },\n }),\n }\n}\n\nconst instructionTexts = (instructions: Instructions | undefined): string[] =>\n instructions === undefined\n ? []\n : typeof instructions === 'string'\n ? [instructions]\n : (Array.isArray(instructions) ? instructions : [instructions]).map(\n (message) => message.content,\n )\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\nconst toolScopeStorage = installAmbientToolScopeStorage(\n () => new AsyncLocalStorage<AmbientToolScope>(),\n)\n\n/** Run `fn` with `ctx` as the ambient tool handler context, for direct tool tests. */\nexport function runWithHandlerContext<D extends AgentToolEventDefs, R>(\n ctx: AgentToolContext<D>,\n fn: () => R,\n): R {\n return toolScopeStorage.run({ context: ctx }, fn)\n}\n\n/** Sessions whose latest step prompt one process keeps for that step's tools. */\nconst PROMPT_SESSIONS = 64\n\nconst asyncIterator = (value: unknown): AsyncIterator<unknown> | undefined => {\n if (typeof value !== 'object' || value === null) return undefined\n const factory = Reflect.get(value, Symbol.asyncIterator)\n if (typeof factory !== 'function') return undefined\n return (factory as (this: object) => AsyncIterator<unknown>).call(value)\n}\n\nconst isBoundaryChunk = (chunk: UIMessageChunk | undefined): boolean =>\n chunk !== undefined &&\n (chunk.type === 'text-end' ||\n chunk.type === 'reasoning-end' ||\n chunk.type === 'tool-input-available' ||\n chunk.type === 'tool-input-error' ||\n chunk.type === 'tool-output-available' ||\n chunk.type === 'tool-output-error' ||\n chunk.type === 'tool-output-denied' ||\n chunk.type === 'tool-approval-request' ||\n chunk.type === 'finish' ||\n chunk.type === 'abort' ||\n chunk.type === 'error')\n\ntype DeltaChunk = Extract<\n UIMessageChunk,\n { type: 'text-delta' | 'reasoning-delta' | 'tool-input-delta' }\n>\n\nconst DELTA_KEYS: Record<DeltaChunk['type'], ReadonlySet<string>> = {\n 'text-delta': new Set(['type', 'id', 'delta', 'providerMetadata']),\n 'reasoning-delta': new Set(['type', 'id', 'delta', 'providerMetadata']),\n 'tool-input-delta': new Set(['type', 'toolCallId', 'inputTextDelta']),\n}\n\nconst isDeltaChunk = (chunk: UIMessageChunk): chunk is DeltaChunk =>\n Object.hasOwn(DELTA_KEYS, chunk.type) &&\n Object.keys(chunk).every((key) =>\n DELTA_KEYS[chunk.type as DeltaChunk['type']].has(key),\n ) &&\n typeof (chunk.type === 'tool-input-delta'\n ? chunk.inputTextDelta\n : (chunk as { delta?: unknown }).delta) === 'string'\n\n// Adjacent deltas of one part project exactly as their concatenation: the text\n// appends and the last defined `providerMetadata` wins.\nconst joinDeltas = (\n left: DeltaChunk,\n right: DeltaChunk,\n): DeltaChunk | undefined => {\n if (left.type === 'tool-input-delta')\n return right.type === 'tool-input-delta' &&\n right.toolCallId === left.toolCallId\n ? { ...left, inputTextDelta: left.inputTextDelta + right.inputTextDelta }\n : undefined\n if (\n right.type === 'tool-input-delta' ||\n right.type !== left.type ||\n right.id !== left.id\n )\n return undefined\n const providerMetadata =\n right.providerMetadata !== undefined\n ? right.providerMetadata\n : left.providerMetadata\n return {\n ...left,\n delta: left.delta + right.delta,\n ...(providerMetadata === undefined ? {} : { providerMetadata }),\n }\n}\n\nconst mergeDeltas = (chunks: UIMessageChunk[]): UIMessageChunk[] => {\n const merged: UIMessageChunk[] = []\n for (const chunk of chunks) {\n const previous = merged.at(-1)\n const joined =\n previous !== undefined && isDeltaChunk(previous) && isDeltaChunk(chunk)\n ? joinDeltas(previous, chunk)\n : undefined\n if (joined === undefined) merged.push(chunk)\n else merged[merged.length - 1] = joined\n }\n return merged\n}\n\ntype StreamRead<T> = Awaited<ReturnType<ReadableStreamDefaultReader<T>['read']>>\n\nconst nextOrTimer = async <T>(\n next: Promise<StreamRead<T>>,\n delayMs: number,\n): Promise<{ type: 'next'; result: StreamRead<T> } | { type: 'timer' }> => {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n next.then((result) => ({ type: 'next' as const, result })),\n new Promise<{ type: 'timer' }>((finishTimer) => {\n timer = setTimeout(() => finishTimer({ type: 'timer' }), delayMs)\n ;(timer as { unref?: () => void }).unref?.()\n }),\n ])\n } finally {\n if (timer !== undefined) clearTimeout(timer)\n }\n}\n\ntype GenerationCompletion = {\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype GenerationSource = {\n stream: ReadableStream<UIMessageChunk>\n completion?: () => GenerationCompletion\n}\n\nasync function generateWithAISDK<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n X extends object,\n>(options: {\n agentName: string\n context: AgentGenerateContext<M, D, T, X>\n messageMetadata: AgentMessageMetadata<M, D, T, X> | undefined\n}): Promise<GenerationSource> {\n const { agentName, context, messageMetadata } = options\n const headers = context.generation.headers ?? {}\n const generation =\n gatewayModelId(context.model) === undefined\n ? context.generation\n : {\n ...context.generation,\n headers: Object.keys(headers).some(\n (key) => key.toLowerCase() === 'x-session-affinity',\n )\n ? headers\n : {\n ...headers,\n 'x-session-affinity': createHash('sha256')\n .update(JSON.stringify([agentName, context.event.sessionId]))\n .digest('hex'),\n },\n providerOptions: {\n ...context.generation.providerOptions,\n gateway: {\n caching: 'auto',\n ...context.generation.providerOptions?.['gateway'],\n },\n },\n }\n const step = await generateAISDKStep<M, T>({\n model: context.model,\n tools: context.tools,\n messages: context.messages,\n modelMessages: context.modelMessages,\n responseMessageId: context.event.payload.responseMessageId,\n abortSignal: context.signal,\n ...(context.instructions === undefined\n ? {}\n : { instructions: context.instructions }),\n settings: generation,\n ...(messageMetadata === undefined\n ? {}\n : {\n messageMetadata: ({ part }) =>\n messageMetadata({ ...context, generation, part }),\n }),\n })\n return {\n stream: step.stream as ReadableStream<UIMessageChunk>,\n completion: step.completion,\n }\n}\n\nasync function* consumeGeneration(options: {\n source: GenerationSource\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}): AsyncGenerator<AgentGenerationUpdate> {\n const pending: UIMessageChunk[] = []\n let streamedFinishReason: FinishReason | undefined\n let streamedError: string | undefined\n // Flush as soon as the previous write finishes: chunks that arrive while\n // it is in flight wait in the stream and share the next batch.\n const maxChunks = options.progress?.maxChunks ?? 128\n const maxDelayMs = options.progress?.maxDelayMs ?? 0\n let lastFlush = Date.now()\n const batch = (): AgentGenerationProgress => ({\n type: 'progress',\n chunks: mergeDeltas(pending.splice(0)),\n })\n const reader = options.source.stream.getReader()\n // The next read starts before a batch is yielded, and the consumer may\n // take a while to ask again: a stream that fails meanwhile must not leave\n // that read rejected with no handler, which ends the process.\n const readAhead = (): Promise<StreamRead<UIMessageChunk>> => {\n const read = reader.read()\n read.catch(() => {})\n return read\n }\n let pendingChunk = readAhead()\n try {\n for (;;) {\n let result: StreamRead<UIMessageChunk>\n if (pending.length > 0) {\n const remaining = Math.max(0, maxDelayMs - (Date.now() - lastFlush))\n const outcome = await nextOrTimer(pendingChunk, remaining)\n if (outcome.type === 'timer') {\n yield batch()\n lastFlush = Date.now()\n continue\n }\n result = outcome.result\n } else {\n result = await pendingChunk\n }\n if (result.done) break\n const chunk = result.value\n pending.push(chunk)\n if (chunk.type === 'finish') streamedFinishReason = chunk.finishReason\n if (chunk.type === 'error') streamedError = chunk.errorText\n pendingChunk = readAhead()\n\n if (pending.length >= maxChunks || isBoundaryChunk(pending.at(-1))) {\n yield batch()\n lastFlush = Date.now()\n }\n }\n } catch (error) {\n if (pending.length > 0) yield batch()\n throw error\n } finally {\n try {\n await reader.cancel()\n } catch {\n // Cleanup must not replace the error that ended generation.\n } finally {\n reader.releaseLock()\n }\n }\n\n let completion: GenerationCompletion | undefined\n try {\n completion = options.source.completion?.()\n } catch (error) {\n if (pending.length > 0) {\n yield batch()\n }\n throw error\n }\n if (pending.length > 0) {\n yield batch()\n }\n if (streamedError !== undefined) throw new Error(streamedError)\n const finishReason = completion?.finishReason ?? streamedFinishReason\n yield {\n type: 'finish',\n ...(finishReason === undefined ? {} : { finishReason }),\n ...(completion?.usage === undefined ? {} : { usage: completion.usage }),\n }\n}\n\nconst foldAIEvents = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(options: {\n reducer: Reducer<D, AIContextState<M>>\n state: AIContextState<M>\n events: ContractEvent<D>[]\n}): AIContextState<M> => {\n let state = options.state\n for (const event of options.events) state = options.reducer.fold(state, event)\n return state\n}\n\nconst summarize = async <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n agentName: string\n context: AgentGenerateContext<M, D, T>\n instructions: string | undefined\n}): Promise<{ summary: string; usage?: LanguageModelUsage }> => {\n const instruction = [\n 'Summarize this conversation so you can continue the task after the earlier context is replaced by your summary.',\n 'Preserve the objective, constraints, decisions, exact identifiers, completed actions and their results, unresolved questions, and next steps. Distinguish observations from assumptions.',\n 'Respond only with the summary as text. Do not call any tools or continue working on the task.',\n options.instructions,\n ]\n .filter(Boolean)\n .join('\\n')\n const generation = { ...options.context.generation }\n for (const key of Object.keys(generation)) {\n if (\n key.startsWith('on') ||\n key.startsWith('experimental_on') ||\n [\n 'repairToolCall',\n 'experimental_repairToolCall',\n 'experimental_refineToolInput',\n 'experimental_transform',\n 'toolApproval',\n ].includes(key)\n ) {\n Reflect.deleteProperty(generation, key)\n }\n }\n const tools = Object.fromEntries(\n Object.entries(options.context.tools).map(([name, tool]) => {\n const definition = { ...tool, needsApproval: false }\n for (const key of [\n 'execute',\n 'onInputStart',\n 'onInputDelta',\n 'onInputAvailable',\n ]) {\n Reflect.deleteProperty(definition, key)\n }\n return [name, definition]\n }),\n ) as T\n const source = await generateWithAISDK({\n agentName: options.agentName,\n context: {\n ...options.context,\n generation,\n tools,\n modelMessages: [\n ...options.context.modelMessages,\n { role: 'user', content: instruction },\n ],\n },\n messageMetadata: undefined,\n })\n let summary = ''\n let calledTool = false\n let finish: AgentGenerationFinish | undefined\n for await (const update of consumeGeneration({ source })) {\n options.context.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n for (const chunk of update.chunks) {\n if (chunk.type === 'text-delta') summary += chunk.delta\n if (chunk.type.startsWith('tool-')) calledTool = true\n }\n }\n if (\n calledTool ||\n summary.trim().length === 0 ||\n finish?.finishReason !== 'stop'\n ) {\n throw new Error(\n 'compaction must produce a complete text summary without calling tools',\n )\n }\n return {\n summary,\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n}\n\nconst activeCompaction = <M extends UIMessage>(\n state: AIModelContext<M>,\n): AIModelContext<M>['compaction'] => {\n const compaction = state.compaction\n return compaction?.status === 'completed' ? compaction : null\n}\n\nconst contextMessages = <M extends UIMessage>({\n state,\n coordinator,\n}: {\n state: AIModelContext<M>\n coordinator: AICoordinatorState\n}): M[] => {\n const queued = new Set(coordinator.queued.map((item) => item.messageId))\n return state.messages.filter((message) => !queued.has(message.id))\n}\n\nconst modelContext = async <M extends UIMessage>(options: {\n messages: M[]\n state: AIModelContext<M>\n tools: ToolSet\n}): Promise<ModelMessage[]> => {\n const messages = await convertToModelMessages(options.messages, {\n tools: options.tools,\n })\n const summary = activeCompaction(options.state)?.summary\n return summary === undefined\n ? messages\n : [{ role: 'user', content: summary }, ...messages]\n}\n\ntype ToolCallClassification = 'automatic' | 'approval' | 'unknown'\n\ntype PendingToolCall = {\n call: ToolCalledPayload\n classification: ToolCallClassification\n}\n\nconst toolCalledEvent = async <D extends EventDefs>(\n payload: ToolCalledPayload,\n): Promise<AppendInput<D>> =>\n ({\n type: 'ai.tool.called',\n id: await aiEventId(\n 'a2.ai.tool.called',\n payload.generationId,\n payload.toolCallId,\n ),\n payload,\n }) as AppendInput<D>\n\nconst approvalClassification = <T extends ToolSet>(\n tools: T,\n generation: AgentGenerationSettings<T>,\n toolName: string,\n): ToolCallClassification => {\n const configured = generation.toolApproval\n if (typeof configured === 'function') return 'unknown'\n const policy = configured?.[toolName]\n if (typeof policy === 'function') return 'unknown'\n if (\n policy === 'user-approval' ||\n (typeof policy === 'object' && policy?.type === 'user-approval')\n ) {\n return 'approval'\n }\n if (\n policy === 'denied' ||\n (typeof policy === 'object' && policy?.type === 'denied')\n ) {\n return 'approval'\n }\n const tool = tools[toolName] as { needsApproval?: unknown } | undefined\n if (typeof tool?.needsApproval === 'function') return 'unknown'\n return tool?.needsApproval === true ? 'approval' : 'automatic'\n}\n\nconst lifecycleEvents = async <\n D extends EventDefs,\n T extends ToolSet,\n>(options: {\n requestId: string\n messageId: string\n generationId: string\n sequence: number\n chunks: UIMessageChunk[]\n pending: PendingToolCall[]\n tools: T\n generation: AgentGenerationSettings<T>\n /** A harness's tool calls run without approval. */\n approvals?: boolean\n}): Promise<{ events: AppendInput<D>[]; pending: PendingToolCall[] }> => {\n const result: AppendInput<D>[] = []\n const pending = [...options.pending]\n const take = (toolCallId: string): PendingToolCall | undefined => {\n const index = pending.findIndex(\n (candidate) => candidate.call.toolCallId === toolCallId,\n )\n if (index === -1) return undefined\n return pending.splice(index, 1)[0]\n }\n const flush = async (toolCallId: string): Promise<void> => {\n const pendingCall = take(toolCallId)\n if (pendingCall) result.push(await toolCalledEvent<D>(pendingCall.call))\n }\n for (const [chunkIndex, chunk] of options.chunks.entries()) {\n const resultId = (): Promise<string> =>\n aiEventId(\n 'a2.ai.tool.stream-result',\n options.generationId,\n String(options.sequence),\n String(chunkIndex),\n )\n if (chunk.type === 'tool-input-available') {\n const payload: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...((\n options.tools[chunk.toolName] as\n { supportsDeferredResults?: boolean } | undefined\n )?.supportsDeferredResults === true\n ? { supportsDeferredResults: true }\n : {}),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n }\n take(payload.toolCallId)\n const classification =\n options.approvals === false\n ? 'automatic'\n : approvalClassification(\n options.tools,\n options.generation,\n chunk.toolName,\n )\n if (classification === 'automatic') {\n result.push(await toolCalledEvent<D>(payload))\n } else {\n pending.push({ call: payload, classification })\n }\n } else if (chunk.type === 'tool-input-error') {\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n ...(chunk.dynamic ? { input: chunk.input } : { rawInput: chunk.input }),\n error: chunk.errorText,\n phase: 'input',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n const called: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n }\n take(chunk.toolCallId)\n result.push(await toolCalledEvent<D>(called), {\n type: 'ai.tool.result',\n id: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-available') {\n await flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n output: chunk.output,\n phase: 'execution',\n ...(chunk.preliminary === undefined\n ? {}\n : { preliminary: chunk.preliminary }),\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-error') {\n await flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n error: chunk.errorText,\n phase: 'execution',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-denied') {\n await flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n denied: true,\n phase: 'execution',\n }\n result.push({\n type: 'ai.tool.result',\n id: await resultId(),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-request') {\n await flush(chunk.toolCallId)\n const payload: ApprovalRequestedPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n toolCallId: chunk.toolCallId,\n ...(chunk.isAutomatic === undefined\n ? {}\n : { isAutomatic: chunk.isAutomatic }),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n result.push({\n type: 'ai.approval.requested',\n id: await aiEventId(\n 'a2.ai.approval.requested',\n options.generationId,\n chunk.approvalId,\n ),\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-response') {\n result.push({\n type: 'ai.approval.responded',\n id: await aiEventId(\n 'a2.ai.approval.automatic-response',\n options.generationId,\n chunk.approvalId,\n ),\n payload: {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n },\n } as AppendInput<D>)\n }\n }\n return { events: result, pending }\n}\n\nconst validateCompaction = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(options: {\n compaction: CompactionOptions<M, D>\n explicit: boolean\n generation: AgentGenerationSettings<T> | undefined\n tools: T | undefined\n}): CompactionOptions<M, D> => {\n let compaction = options.compaction\n if (\n compaction !== false &&\n (typeof compaction !== 'object' || compaction === null)\n ) {\n throw new TypeError('compaction must resolve to false or a policy object')\n }\n if (compaction !== false && 'then' in compaction) {\n void Promise.resolve(compaction).catch(() => {})\n throw new TypeError('compaction options must be a policy or a resolver')\n }\n if (compaction !== false && !('shouldCompact' in compaction)) {\n if (\n compaction.thresholdTokens !== undefined &&\n (!Number.isSafeInteger(compaction.thresholdTokens) ||\n compaction.thresholdTokens < 1)\n ) {\n throw new TypeError(\n 'compaction.thresholdTokens must be a positive safe integer',\n )\n }\n const choice = options.generation?.toolChoice\n const unsupported =\n options.generation?.output !== undefined\n ? 'structured output'\n : choice !== undefined && choice !== 'auto' && choice !== 'none'\n ? 'forced tool choice'\n : Object.values(options.tools ?? {}).some(\n (tool) =>\n tool.type === 'provider' && tool.isProviderExecuted === true,\n )\n ? 'provider-executed tools'\n : undefined\n if (unsupported !== undefined) {\n if (options.explicit) {\n throw new TypeError(\n `automatic compaction does not support ${unsupported}; use a custom policy or compaction: false`,\n )\n }\n compaction = false\n }\n }\n\n return compaction\n}\n\n// Options of the AI SDK harness, which live in it, not on agent().\nconst AI_SDK_HARNESS_OPTIONS = [\n 'generation',\n 'generate',\n 'compaction',\n 'messageMetadata',\n] as const\n\nconst assertNoLoopOptions = (options: { harness?: { type: string } }): void => {\n const harness = options.harness?.type ?? 'ai-sdk'\n for (const key of AI_SDK_HARNESS_OPTIONS) {\n if (!Object.hasOwn(options, key)) continue\n throw new TypeError(\n harness === 'ai-sdk'\n ? `${key} belongs to the harness: agent({ harness: { type: 'ai-sdk', ${key} } })`\n : `${key} is an option of the AI SDK harness; ${harness}() runs its own loop`,\n )\n }\n}\n\nexport function createHandlers<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n X extends object = Record<never, never>,\n>(\n options: HandlersOptions<M, D, T, X>,\n): NonNullable<ServerOptions<D>['handlers']> {\n if (options.model === undefined) {\n throw new TypeError('agent requires model')\n }\n if (\n options.progress?.maxChunks !== undefined &&\n (!Number.isInteger(options.progress.maxChunks) ||\n options.progress.maxChunks < 1)\n ) {\n throw new TypeError('progress.maxChunks must be a positive integer')\n }\n if (\n options.progress?.maxDelayMs !== undefined &&\n (!Number.isFinite(options.progress.maxDelayMs) ||\n options.progress.maxDelayMs < 0)\n ) {\n throw new TypeError('progress.maxDelayMs must be a non-negative number')\n }\n if (\n options.maxSteps !== undefined &&\n options.maxSteps !== Number.POSITIVE_INFINITY &&\n (!Number.isInteger(options.maxSteps) || options.maxSteps < 1)\n ) {\n throw new TypeError('maxSteps must be a positive integer or Infinity')\n }\n\n assertNoLoopOptions(options)\n const configured = options.harness\n const loop: Omit<AISDKHarness<M, D, T, X>, 'type'> = configured?.type ===\n 'ai-sdk'\n ? configured\n : {}\n const harness: HarnessDriver | undefined =\n configured === undefined || configured.type === 'ai-sdk'\n ? undefined\n : harnessDriver(configured)\n const states = options.harnessStates ?? harnessStates()\n if (harness !== undefined) {\n for (const [name, tool] of Object.entries(options.tools ?? {})) {\n const needsApproval = (tool as { needsApproval?: unknown }).needsApproval\n if (needsApproval !== undefined && needsApproval !== false)\n throw new TypeError(\n `a harness runs tools without approval; '${name}' sets needsApproval`,\n )\n }\n }\n\n const configuredCompaction =\n loop.compaction ??\n (loop.generate === undefined && harness === undefined ? {} : false)\n const staticCompaction =\n typeof configuredCompaction === 'function'\n ? undefined\n : validateCompaction({\n compaction: configuredCompaction,\n explicit: loop.compaction !== undefined,\n generation:\n typeof loop.generation === 'function' ? undefined : loop.generation,\n tools: options.tools,\n })\n\n // The harness's own tools come first, so an agent tool with a name replaces them.\n const tools = (\n harness === undefined\n ? (options.tools ?? {})\n : { ...harness.tools, ...options.tools }\n ) as T\n const toolRecovery: Readonly<Record<string, ToolRecovery | undefined>> =\n options.toolRecovery ?? {}\n for (const [name, recovery] of Object.entries(toolRecovery)) {\n if (!Object.hasOwn(tools, name))\n throw new TypeError(\n `toolRecovery names '${name}', which is not one of the agent's tools`,\n )\n if (typeof (tools[name] as RuntimeTool).execute !== 'function')\n throw new TypeError(\n `toolRecovery names '${name}', which has no execute function`,\n )\n if (recovery !== 'rerun' && recovery !== 'report')\n throw new TypeError(\n `toolRecovery for '${name}' must be 'rerun' or 'report'`,\n )\n }\n const telemetry = options.telemetry ?? CONSOLE_TELEMETRY\n const maxSteps = options.maxSteps ?? Number.POSITIVE_INFINITY\n const control = createControlRuntime({\n contract: options.contract,\n telemetry,\n })\n const controlHandler: typeof control.handler = (ctx) =>\n telemetry.span(\n 'a2.ai.control',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.control.type': ctx.event.type,\n 'a2.ai.control.id': ctx.event.id,\n 'a2.ai.control.attempt': ctx.attempt,\n },\n () => control.handler(ctx),\n )\n const coordinator = control.coordinator\n const contextReducer = createContextReducer<M, D>({\n contract: options.contract,\n })\n const readContext = async (\n session: HandlerContext<D>['session'],\n through: number | 'latest',\n ) => {\n const snapshot = await session.state(contextReducer, { through })\n return snapshot\n }\n // A session's next step starts only after its tools settle, so only its\n // latest step's prompt is ever reused. A miss rebuilds the prompt from the\n // context checkpoint, so eviction is memory policy, never correctness.\n const prompts = boundedCache<\n string,\n { generationId: string; messages: Promise<ModelMessage[]> }\n >({ maxEntries: PROMPT_SESSIONS, maxBytes: PROMPT_SESSIONS })\n const cachePrompt = ({\n sessionId,\n generationId,\n messages,\n }: {\n sessionId: string\n generationId: string\n messages: Promise<ModelMessage[]>\n }): void =>\n // Entries count as one byte, so the bound is the session count.\n prompts.set(sessionId, { generationId, messages }, 1)\n const forgetPrompt = (sessionId: string, generationId: string): void => {\n if (prompts.get(sessionId)?.generationId === generationId)\n prompts.delete(sessionId)\n }\n\n type RuntimeTool = {\n execute?: (\n input: unknown,\n options: {\n toolCallId: string\n messages: ModelMessage[]\n abortSignal?: AbortSignal\n experimental_sandbox?: Experimental_SandboxSession\n },\n ) => unknown\n }\n\n type ToolHandlerContext = HandlerContext<D, 'ai.tool.execution.requested'>\n\n const resultEvent = async (\n call: ToolCalledPayload,\n suffix: string,\n result: {\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n },\n ): Promise<AppendInput<D>> =>\n ({\n type: 'ai.tool.result',\n id: await aiEventId(\n 'a2.ai.tool.result',\n call.generationId,\n call.toolCallId,\n suffix,\n ),\n payload: {\n requestId: call.requestId,\n messageId: call.messageId,\n generationId: call.generationId,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n phase: 'execution',\n ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.denied === undefined ? {} : { denied: result.denied }),\n ...(result.preliminary === undefined\n ? {}\n : { preliminary: result.preliminary }),\n ...(call.dynamic === undefined ? {} : { dynamic: call.dynamic }),\n ...(call.providerExecuted === undefined\n ? {}\n : { providerExecuted: call.providerExecuted }),\n ...(call.toolMetadata === undefined\n ? {}\n : { toolMetadata: call.toolMetadata }),\n },\n }) as AppendInput<D>\n\n const promptMessages = (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<ModelMessage[]> => {\n const { ctx, call, generation: owner } = input\n const sessionId = ctx.event.sessionId\n const cached = prompts.get(sessionId)\n if (cached?.generationId === call.generationId) return cached.messages\n const computation = (async () => {\n const frontier = owner.promptThroughIndex\n if (frontier === undefined)\n throw new TypeError('AI work requires a prompt checkpoint')\n const snapshot = await readContext(ctx.session, ctx.event.index)\n if (\n snapshot.state.generation?.owner.generationId !== owner.generationId ||\n snapshot.state.generation.owner.requestId !== owner.requestId ||\n snapshot.state.activeProjection?.generationId !== owner.generationId\n )\n throw new TypeError(\n 'Tool prompt checkpoint does not own its generation',\n )\n const state = generationBase(snapshot.state)\n return telemetry.span(\n 'a2.ai.context',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.context.request_id': call.requestId,\n 'a2.ai.context.phase': 'tool',\n },\n () =>\n modelContext({\n messages: state.messages.filter(\n (message) => state.messageIndexes[message.id]! <= frontier,\n ),\n state,\n tools,\n }),\n )\n })()\n cachePrompt({\n sessionId,\n generationId: call.generationId,\n messages: computation,\n })\n void computation.catch(() => forgetPrompt(sessionId, call.generationId))\n return computation\n }\n\n const toolExecutionFailure = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n error: unknown,\n ): Promise<AppendInput<D> | void> => {\n const schedulerFailure = consumeSchedulerSendFailure(error)\n if (checkAbort(ctx.signal)) return\n if (schedulerFailure === 'retryable') throw error\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: errorMessage(error),\n })\n }\n\n const runToolExecution = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n execute: NonNullable<RuntimeTool['execute']>,\n messages: ModelMessage[],\n sandbox: Experimental_SandboxSession | undefined,\n ): Promise<AppendInput<D> | void> => {\n let output: unknown\n try {\n output = await execute(call.input, {\n toolCallId: call.toolCallId,\n messages,\n abortSignal: ctx.signal,\n ...(sandbox === undefined ? {} : { experimental_sandbox: sandbox }),\n })\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n let iterator: AsyncIterator<unknown> | undefined\n try {\n iterator = asyncIterator(output)\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (iterator === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:0`, { output })\n }\n let last: unknown\n let sequence = 0\n let done = false\n try {\n for (;;) {\n let result: IteratorResult<unknown>\n try {\n result = await iterator.next()\n } catch (error) {\n return toolExecutionFailure(ctx, call, error)\n }\n if (result.done) {\n if (ctx.signal.reason instanceof A2Error) throw ctx.signal.reason\n done = true\n break\n }\n if (checkAbort(ctx.signal)) return\n last = result.value\n await control.append({\n ctx,\n name: `tool:${call.toolCallId}:preliminary:${sequence}`,\n events: [\n await resultEvent(\n call,\n `${ctx.event.id}:execution:${ctx.attempt}:${sequence}:preliminary`,\n {\n output: result.value,\n preliminary: true,\n },\n ),\n ],\n })\n sequence += 1\n }\n } finally {\n if (!done) {\n try {\n await iterator.return?.()\n } catch {\n // Preserve the failure or cancellation that ended execution.\n }\n }\n }\n return resultEvent(\n call,\n `${ctx.event.id}:execution:${sequence}:final`,\n sequence === 0 ? {} : { output: last },\n )\n }\n\n const executeTool = async (input: {\n ctx: ToolHandlerContext\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n }): Promise<AppendInput<D> | void> => {\n const { ctx, call } = input\n const tool = tools[call.toolName] as RuntimeTool | undefined\n const execute = tool?.execute\n if (execute === undefined) {\n return resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: `Tool '${call.toolName}' has no server executor`,\n })\n }\n const report = toolRecovery[call.toolName] === 'report'\n const interrupted = () =>\n resultEvent(call, `${ctx.event.id}:execution:error`, {\n error: `Tool '${call.toolName}' was interrupted and may have partly run.`,\n })\n // A thrown failure never follows `execute` for a reported tool (see\n // below), so only a lapsed attempt may have reached it.\n if (report && ctx.attempt > 1 && !failedPreviousAttempt.has(ctx))\n return interrupted()\n const messages = await promptMessages(input)\n // A sandbox that fails to resolve fails the attempt, which A2 retries;\n // it is not the tool's failure to report to the model.\n const sandbox =\n harness?.sandbox === undefined\n ? undefined\n : await resolve(harness.sandbox, {\n session: { id: ctx.session.id },\n signal: ctx.signal,\n })\n if (checkAbort(ctx.signal)) return\n const scope: AmbientToolScope = {\n contract: options.contract,\n context: ctx,\n }\n // Async iteration resumes in the caller's context, so the whole\n // execution, not just the execute call, runs inside the scope.\n const run = () =>\n toolScopeStorage.run(scope, () =>\n runToolExecution(ctx, call, execute, messages, sandbox),\n )\n if (!report) return run()\n try {\n // Undefined means a user cancellation after `execute` started.\n return (await run()) ?? (await interrupted())\n } catch {\n // A lapsed claim surrenders; the next attempt reports the call.\n checkAbort(ctx.signal)\n return interrupted()\n }\n }\n\n const handleToolExecution = async (\n ctx: ToolHandlerContext,\n ): Promise<AppendInput<D>> => {\n try {\n const state = (\n await ctx.session.state(control.reducer, { through: 'latest' })\n ).state\n const request = ctx.event.payload\n const call = state.coordinator.response?.calls.find(\n (candidate) => candidate.work?.id === ctx.event.id,\n )\n if (\n state.active?.turnId !== request.turnId ||\n Object.values(state.pendingStops).includes(request.turnId) ||\n state.active.suspended ||\n state.active.version !== request.version ||\n state.coordinator.response?.failure !== undefined ||\n !call ||\n call.terminal ||\n call.work?.settled\n )\n return control.settled({ ctx, events: undefined })\n return control.settled({\n ctx,\n events: await executeTool({\n ctx,\n call: request.call,\n generation: request.generation,\n }),\n })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n }\n\n const generationHandler = async (\n ctx: HandlerContext<D, 'ai.generation.requested'>,\n ): Promise<void | AppendInput<D> | readonly AppendInput<D>[]> => {\n if (checkAbort(ctx.signal)) return\n const requestId = ctx.event.id\n const request = ctx.event.payload\n const snapshot = await readContext(ctx.session, 'latest')\n if (\n snapshot.state.closed ||\n snapshot.state.authority?.requestId !== requestId ||\n snapshot.state.authority?.phase === 'paused' ||\n snapshot.state.authority?.phase === 'pausing'\n )\n return\n const controlState = (\n await ctx.session.state(control.reducer, { through: snapshot.index })\n ).state\n if (\n request.control !== undefined &&\n Object.values(controlState.pendingStops).includes(request.control.turnId)\n )\n return\n const coordinatorState = controlState.coordinator\n if (\n coordinatorState.closed ||\n coordinatorState.response?.activeRequestId !== requestId\n )\n return\n const response = coordinatorState.response\n const current =\n response.generation?.requestId === requestId\n ? response.generation\n : undefined\n if (\n current !== undefined &&\n (response.completion !== undefined ||\n (response.failure !== undefined &&\n response.failure.superseded !== true))\n )\n return\n if (current !== undefined && current.attempt >= ctx.attempt) return\n const attempt = ctx.attempt\n const generationId = await aiEventId(\n 'a2.ai.generation',\n requestId,\n String(attempt),\n )\n const responseMessageId = request.responseMessageId\n const responseStepCount = response.stepCount\n if (\n request.reason === 'tool' &&\n (request.sourceGenerationId !==\n response.source?.generation.generationId ||\n response.responseMessageId !== request.messageId ||\n response.responseMessageId !== request.responseMessageId)\n )\n return\n const previous = current\n const state =\n previous === undefined\n ? snapshot.state\n : contextForAttempt(snapshot.state)\n const resolverContext: AgentResolverContext<M, D, X> = {\n event: ctx.event,\n messages: contextMessages({ state, coordinator: coordinatorState }),\n // The contract registered this reducer with its declared state type.\n state: (snapshot.state.app ?? {}) as X,\n session: {\n state: (reducer, readOptions) =>\n ctx.session.state(reducer, {\n ...readOptions,\n through: readOptions?.through ?? snapshot.index,\n }),\n },\n signal: ctx.signal,\n }\n\n if (request.reason === 'tool' && responseStepCount >= maxSteps) {\n const source = response.source?.generation\n if (source === undefined) return\n return {\n type: 'ai.generation.failed',\n id: await aiEventId('a2.ai.step-limit', requestId),\n payload: {\n requestId: source.requestId,\n messageId: source.messageId,\n generationId: source.generationId,\n responseMessageId,\n error: `agent exceeded the ${maxSteps}-step limit`,\n stepLimit: true,\n },\n } as AppendInput<D>\n }\n\n const startEvents = async (\n started: GenerationStartedPayload,\n metadataModelId?: string,\n ): Promise<AppendInput<D>[]> => {\n const events: AppendInput<D>[] = []\n if (metadataModelId !== undefined) {\n events.push({\n type: 'ai.model.metadata.requested',\n id: await aiEventId(\n 'a2.ai.model.metadata',\n options.contract.name,\n ctx.event.sessionId,\n metadataModelId,\n ),\n payload: { modelId: metadataModelId },\n } as AppendInput<D>)\n }\n if (previous) {\n const superseded: GenerationFailedPayload = {\n requestId,\n messageId: previous.messageId,\n generationId: previous.generationId,\n responseMessageId: previous.responseMessageId,\n error: 'generation attempt was superseded after an incomplete run',\n superseded: true,\n }\n events.push({\n type: 'ai.generation.failed',\n id: await aiEventId('a2.ai.superseded', previous.generationId),\n payload: superseded,\n } as AppendInput<D>)\n }\n events.push({\n type: 'ai.generation.started',\n id: generationId,\n payload: started,\n } as AppendInput<D>)\n return events\n }\n const startedPayload = (model?: string): GenerationStartedPayload => ({\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n attempt,\n ...(model === undefined ? {} : { model }),\n promptThroughIndex: snapshot.index,\n })\n\n let resolvedModel: string | undefined\n let resolving = true\n let generationStarted = false\n try {\n const choice = await resolve(options.model, resolverContext)\n if (choice === undefined) {\n throw new TypeError('the model resolver returned undefined')\n }\n const settings: ModelSettings =\n typeof choice === 'string' ? { model: choice } : choice\n const model = settings.model\n if (typeof model !== 'string' || model === '')\n throw new TypeError('the model must be an AI Gateway model ID')\n resolvedModel = model\n if (checkAbort(ctx.signal)) return\n const resolvedInstructions =\n options.instructions === undefined\n ? undefined\n : await resolve(options.instructions, resolverContext)\n if (checkAbort(ctx.signal)) return\n const resolvedGeneration: AgentGenerationSettings<T> = await resolve(\n loop.generation ?? {},\n resolverContext,\n )\n if (checkAbort(ctx.signal)) return\n if (\n resolvedGeneration === null ||\n typeof resolvedGeneration !== 'object' ||\n Array.isArray(resolvedGeneration)\n )\n throw new TypeError('the generation resolver must return settings')\n const generation = withModelSettings({\n generation: resolvedGeneration,\n settings,\n })\n const compaction =\n typeof configuredCompaction === 'function' ||\n typeof loop.generation === 'function'\n ? validateCompaction({\n compaction:\n typeof configuredCompaction === 'function'\n ? await resolve(configuredCompaction, resolverContext)\n : staticCompaction!,\n explicit: loop.compaction !== undefined,\n generation,\n tools: options.tools,\n })\n : staticCompaction!\n if (checkAbort(ctx.signal)) return\n resolving = false\n\n const catalogModelId = gatewayModelId(model)\n const gatewayOptions = generation.providerOptions?.['gateway']\n const usesFallbackModels =\n Array.isArray(gatewayOptions?.['models']) &&\n gatewayOptions['models'].length > 0\n const discoversMetadata =\n compaction !== false &&\n !('shouldCompact' in compaction) &&\n compaction.thresholdTokens === undefined &&\n !usesFallbackModels &&\n catalogModelId !== undefined\n const generationEvents = await control.append({\n ctx,\n name: 'generation-start',\n events: await startEvents(\n startedPayload(model),\n discoversMetadata &&\n !Object.hasOwn(state.modelMetadata, catalogModelId)\n ? catalogModelId\n : undefined,\n ),\n })\n const startIndex = generationEvents.find(\n (event) => event.id === generationId,\n )!.index\n generationStarted = true\n\n if (checkAbort(ctx.signal)) return\n\n const promptCoordinatorState = coordinatorState\n const { messages } = resolverContext\n let generationMessages = messages\n let modelMessages = await telemetry.span(\n 'a2.ai.context',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.context.request_id': requestId,\n 'a2.ai.context.phase': 'generation',\n },\n () => modelContext({ messages, state, tools }),\n )\n const baseContext: AgentGenerateContext<M, D, T, X> = {\n ...resolverContext,\n generationId,\n modelMessages,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation,\n }\n const policy = compaction\n const tracksInput =\n policy !== false &&\n !('shouldCompact' in policy) &&\n (policy.thresholdTokens !== undefined || discoversMetadata)\n const metadata =\n catalogModelId === undefined\n ? undefined\n : state.modelMetadata[catalogModelId]\n const limits =\n metadata?.status === 'resolved' && !usesFallbackModels\n ? metadata.limits\n : undefined\n let inputTokenEstimate: number | undefined\n let compacted = false\n let compactionEstimate:\n | Pick<\n CompactionRequestedPayload,\n 'inputTokenEstimate' | 'inputTokens' | 'thresholdTokens'\n >\n | undefined\n const hasPendingTools = messages.some((message) =>\n message.parts.some(\n (part) =>\n isToolUIPart(part) &&\n !(\n part.state === 'output-error' ||\n part.state === 'output-denied' ||\n (part.state === 'output-available' && part.preliminary !== true)\n ),\n ),\n )\n if (policy && !hasPendingTools) {\n const compactionContext = {\n ...resolverContext,\n messages,\n modelMessages,\n }\n let shouldCompact: boolean\n if ('shouldCompact' in policy) {\n shouldCompact = await policy.shouldCompact(compactionContext)\n } else if (tracksInput) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n const inputTokens = measuredInputTokens({\n estimate: inputTokenEstimate,\n model: resolvedModel,\n calibration: coordinatorState.calibration,\n })\n const threshold =\n policy.thresholdTokens ??\n (limits === undefined\n ? undefined\n : Math.floor(\n Math.min(\n limits.contextWindow * 0.75,\n limits.contextWindow - (generation.maxOutputTokens ?? 0),\n ),\n ))\n if (\n limits !== undefined &&\n threshold !== undefined &&\n threshold <= 0\n ) {\n throw new Error(\n `output allowance exhausts the ${limits.contextWindow}-token context window`,\n )\n }\n shouldCompact = threshold !== undefined && inputTokens >= threshold\n if (threshold !== undefined && shouldCompact) {\n compactionEstimate = {\n inputTokenEstimate,\n inputTokens,\n thresholdTokens: threshold,\n }\n }\n } else {\n shouldCompact = false\n }\n if (checkAbort(ctx.signal)) return\n if (shouldCompact) {\n const latest = (\n await ctx.session.state(coordinator, { through: 'latest' })\n ).state\n shouldCompact = Object.keys(latest.unsettledTools ?? {}).length === 0\n }\n if (checkAbort(ctx.signal)) return\n if (shouldCompact) {\n const throughMessageId =\n state.messages.findLast(\n (message) =>\n !promptCoordinatorState.queued.some(\n (queued) => queued.messageId === message.id,\n ),\n )?.id ?? request.messageId\n const throughIndex = snapshot.index\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-requested',\n events: [\n {\n type: 'ai.compaction.requested',\n id: await aiEventId(\n 'a2.ai.compaction.requested',\n generationId,\n ),\n payload: {\n generationId,\n throughMessageId,\n throughIndex,\n ...compactionEstimate,\n },\n } as AppendInput<D>,\n ],\n })),\n )\n const result = await telemetry.span(\n 'a2.ai.compaction',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.compaction.request_id': requestId,\n 'a2.ai.compaction.generation_id': generationId,\n 'a2.ai.compaction.policy':\n 'shouldCompact' in policy ? 'custom' : 'automatic',\n },\n async () =>\n !('shouldCompact' in policy)\n ? {\n messages: [] as M[],\n ...(await summarize({\n agentName: options.contract.name,\n context: baseContext,\n instructions: policy.instructions,\n })),\n }\n : { messages: await policy.compact(compactionContext) },\n )\n if (checkAbort(ctx.signal)) return\n const completed: CompactionCompletedPayload<M> = {\n generationId,\n throughMessageId,\n throughIndex,\n ...result,\n ...(promptCoordinatorState.queued.length === 0\n ? {}\n : {\n retainedMessageIds: promptCoordinatorState.queued.map(\n (item) => item.messageId,\n ),\n }),\n }\n generationEvents.push(\n ...(await control.append({\n ctx,\n name: 'compaction-completed',\n events: [\n {\n type: 'ai.compaction.completed',\n id: await aiEventId(\n 'a2.ai.compaction.completed',\n generationId,\n ),\n payload: completed,\n } as AppendInput<D>,\n ],\n })),\n )\n const queued = new Set(\n promptCoordinatorState.queued.map((item) => item.messageId),\n )\n generationMessages = result.messages.filter(\n (message) => !queued.has(message.id),\n )\n compacted = true\n }\n }\n\n const currentState = foldAIEvents({\n reducer: contextReducer,\n events: generationEvents,\n state,\n })\n if (request.reason === 'retry' || previous !== undefined) {\n generationMessages = contextMessages({\n state: currentState,\n coordinator: promptCoordinatorState,\n })\n }\n if (\n (policy && 'shouldCompact' in policy) ||\n generationMessages !== messages ||\n activeCompaction(currentState)?.summary !==\n activeCompaction(state)?.summary\n ) {\n modelMessages = await telemetry.span(\n 'a2.ai.context',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.context.request_id': requestId,\n 'a2.ai.context.phase': 'refresh',\n },\n () =>\n modelContext({\n messages: generationMessages,\n state: currentState,\n tools,\n }),\n )\n }\n cachePrompt({\n sessionId: ctx.event.sessionId,\n generationId,\n messages: Promise.resolve(modelMessages),\n })\n if (tracksInput && (inputTokenEstimate === undefined || compacted)) {\n inputTokenEstimate = await estimateInputTokens({\n messages: modelMessages,\n instructions: resolvedInstructions,\n tools,\n })\n }\n\n let pendingToolCalls: PendingToolCall[] = []\n if (checkAbort(ctx.signal)) return\n const generateContext: AgentGenerateContext<M, D, T, X> = {\n ...baseContext,\n messages: generationMessages,\n modelMessages,\n }\n const source =\n harness !== undefined\n ? await harness.step({\n agentName: options.contract.name,\n sessionId: ctx.event.sessionId,\n requestIndex: ctx.event.index,\n generationId,\n responseMessageId,\n throughIndex: snapshot.index,\n messages: generationMessages,\n model,\n ...(settings.reasoning === undefined\n ? {}\n : { reasoning: settings.reasoning }),\n ...(settings.speed === undefined\n ? {}\n : { speed: settings.speed }),\n instructions: instructionTexts(resolvedInstructions),\n tools,\n log: harnessLog({\n states,\n session: ctx.session as Parameters<\n typeof harnessLog\n >[0]['session'],\n }),\n signal: ctx.signal,\n })\n : loop.generate === undefined\n ? await generateWithAISDK({\n agentName: options.contract.name,\n context: generateContext,\n messageMetadata: loop.messageMetadata,\n })\n : { stream: await loop.generate(generateContext) }\n const updates = consumeGeneration({\n source,\n ...(options.progress === undefined\n ? {}\n : { progress: options.progress }),\n })\n\n let sequence = 0\n let finish: AgentGenerationFinish | undefined\n for await (const update of updates) {\n ctx.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n const progress: GenerationProgressPayload = {\n startIndex,\n chunks: update.chunks,\n }\n const lifecycle = await lifecycleEvents<D, T>({\n requestId,\n messageId: responseMessageId,\n generationId,\n sequence,\n chunks: update.chunks,\n pending: pendingToolCalls,\n tools,\n generation,\n approvals: harness === undefined,\n })\n pendingToolCalls = lifecycle.pending\n await control.append({\n ctx,\n name: `generation-progress:${sequence}`,\n events: [\n {\n type: 'ai.generation.progress',\n id: await aiEventId(\n 'a2.ai.progress',\n generationId,\n String(sequence),\n ),\n payload: progress,\n } as AppendInput<D>,\n ...lifecycle.events,\n ],\n })\n sequence += 1\n }\n\n if (!finish) throw new Error('agent generation finished without output')\n const completed: GenerationCompletedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n ...(inputTokenEstimate === undefined ? {} : { inputTokenEstimate }),\n ...(finish.finishReason === undefined\n ? {}\n : { finishReason: finish.finishReason }),\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n const completionEvent = {\n type: 'ai.generation.completed',\n id: await aiEventId('a2.ai.completed', generationId),\n payload: completed,\n } as AppendInput<D>\n const unresolved = loop.generate\n ? pendingToolCalls.filter(\n (pending) => pending.classification !== 'automatic',\n )\n : []\n if (unresolved.length > 0) {\n throw new Error(\n `generation ended with unresolved tool authorization for '${unresolved[0]!.call.toolName}'`,\n )\n }\n const pendingEvents = await Promise.all(\n pendingToolCalls\n .filter(\n (pending) =>\n pending.classification === 'automatic' ||\n (loop.generate === undefined &&\n pending.classification === 'unknown'),\n )\n .map((pending) => toolCalledEvent<D>(pending.call)),\n )\n if (finish.finishReason === 'tool-calls') {\n return [...pendingEvents, completionEvent]\n }\n forgetPrompt(ctx.event.sessionId, generationId)\n return [\n ...pendingEvents,\n completionEvent,\n {\n type: 'ai.message.completed',\n id: await aiEventId('a2.ai.message.completed', generationId),\n payload: {\n messageId: responseMessageId,\n } satisfies MessageCompletedPayload,\n } as AppendInput<D>,\n ]\n } catch (error) {\n if (error instanceof ControlCancelled) throw error\n if (error instanceof A2Error) {\n checkAbort(ctx.signal)\n throw error\n }\n if (checkAbort(ctx.signal)) return\n if (!generationStarted && !resolving) throw error\n // A resolver or its result failed before the model ran: record the\n // attempt and fail it once, like a provider error, rather than retrying.\n if (!generationStarted)\n await control.append({\n ctx,\n name: 'generation-start',\n events: await startEvents(startedPayload(resolvedModel)),\n })\n forgetPrompt(ctx.event.sessionId, generationId)\n const failed: GenerationFailedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n error: errorMessage(error),\n }\n return {\n type: 'ai.generation.failed',\n id: await aiEventId('a2.ai.failed', generationId),\n payload: failed,\n } as AppendInput<D>\n }\n }\n\n return {\n 'ai.model.metadata.requested': {\n handler: async (ctx) => {\n const limits = await readModelLimits({\n modelId: ctx.event.payload.modelId,\n signal: ctx.signal,\n })\n ctx.signal.throwIfAborted()\n return {\n type: 'ai.model.metadata.resolved',\n id: await aiEventId('a2.ai.model.metadata.resolved', ctx.event.id),\n payload: { modelId: ctx.event.payload.modelId, limits },\n } as AppendInput<D>\n },\n },\n 'ai.control.requested': {\n lane: ({ event }) => {\n const command = event.payload as ControlCommand<M>\n if (event.id === '')\n throw new A2Error(\n 'INVALID_PAYLOAD',\n 'AI command IDs must be nonempty',\n )\n if (event.id?.startsWith(AI_EVENT_ID_PREFIX))\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `AI command IDs cannot use the reserved '${AI_EVENT_ID_PREFIX}' prefix`,\n )\n if (\n (command.action === 'send' || command.action === 'steer') &&\n event.id !== command.message.id\n )\n throw new A2Error(\n 'INVALID_PAYLOAD',\n 'AI input event ID must equal message.id',\n )\n return 'a2.ai.control'\n },\n handler: controlHandler,\n },\n 'ai.work.reported': { lane: 'a2.ai.control', handler: controlHandler },\n 'ai.session.closed': { lane: 'a2.ai.control', handler: controlHandler },\n 'ai.generation.requested': {\n lane: 'a2.ai.model',\n abortOn: {\n 'ai.control.requested': (event, trigger) =>\n event.payload.action === 'stop' &&\n event.payload.turnId === trigger.payload.control?.turnId,\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.control?.turnId ||\n active?.version !== trigger.payload.control?.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: (ctx) =>\n telemetry.span(\n 'a2.ai.generate',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.generate.request_id': ctx.event.id,\n 'a2.ai.generate.attempt': ctx.attempt,\n },\n async () => {\n try {\n return control.settled({\n ctx,\n events: await generationHandler(ctx),\n })\n } catch (error) {\n if (control.cancelled({ error, signal: ctx.signal }))\n return control.settled({ ctx, events: undefined })\n throw error\n }\n },\n ),\n },\n 'ai.tool.execution.requested': {\n ...(options.toolLane === undefined ? {} : { lane: options.toolLane }),\n abortOn: {\n 'ai.control.requested': (event, trigger) =>\n event.payload.action === 'stop' &&\n event.payload.turnId === trigger.payload.turnId,\n 'ai.generation.failed': (event, trigger) =>\n event.payload.generationId === trigger.payload.call.generationId,\n 'ai.control.committed': (event, trigger) => {\n const active = (event.payload as ControlCommit).view\n return (\n active?.turnId !== trigger.payload.turnId ||\n active?.version !== trigger.payload.version\n )\n },\n 'ai.session.closed': true,\n },\n handler: (ctx) =>\n telemetry.span(\n 'a2.ai.tool',\n {\n 'a2.contract': options.contract.name,\n 'a2.session_id': ctx.event.sessionId,\n 'a2.ai.tool.request_id': ctx.event.payload.call.requestId,\n 'a2.ai.tool.call_id': ctx.event.payload.call.toolCallId,\n 'a2.ai.tool.name': ctx.event.payload.call.toolName,\n 'a2.ai.tool.attempt': ctx.attempt,\n },\n () => handleToolExecution(ctx),\n ),\n },\n } as NonNullable<ServerOptions<D>['handlers']>\n}\n\n/**\n * Serve an AI agent: the built-in protocol, its handlers, and A2's store,\n * scheduler, and telemetry, as one ordinary A2 server. Pass `name` for the\n * built-in protocol, or a shared `agentContract()` when clients fold\n * application state.\n */\nexport function agent<\n T extends ToolSet = ToolSet,\n M extends UIMessage = UIMessage,\n E extends EventDefs = Record<never, never>,\n H extends string = never,\n>(\n options: AgentOptions<M, E, T, H>,\n): Agent<AIEventDefs<M> & E, AIState<M>, typeof AI_STATE_REDUCER>\nexport function agent<\n D extends AIEventDefs<AIMessageOf<D>> & EventDefs,\n S,\n T extends ToolSet = ToolSet,\n Name extends string = string,\n X extends object = Record<never, never>,\n H extends string = never,\n>(options: AgentFromContractOptions<D, S, T, Name, X, H>): Agent<D, S, Name>\nexport function agent(\n options:\n | AgentOptions<UIMessage, EventDefs, ToolSet>\n | AgentFromContractOptions<AIEventDefs & EventDefs, AIState, ToolSet>,\n): Agent<AIEventDefs & EventDefs, AIState> {\n type D = AIEventDefs & EventDefs\n assertNoLoopOptions(options)\n const {\n model,\n tools,\n instructions,\n maxSteps,\n harness,\n toolRecovery,\n progress,\n toolLane,\n handlers,\n ...rest\n } = options\n let contract: Contract<D, Record<never, never>, Reducer<D, AIState>>\n let serverOptions: Omit<\n ServerOptions<D, Record<never, never>, Reducer<D, AIState>>,\n 'contract' | 'handlers'\n >\n if ('contract' in rest) {\n const { contract: shared, ...remaining } = rest\n if ('name' in remaining)\n throw new TypeError('agent takes either name or contract, not both')\n if (!isAgentContract(shared))\n throw new TypeError('agent({ contract }) takes an agentContract()')\n contract = shared\n serverOptions = remaining\n } else {\n const { name, events, messageSchema, ...remaining } = rest\n contract = agentContract({\n name,\n ...(events === undefined ? {} : { events }),\n ...(messageSchema === undefined ? {} : { messageSchema }),\n })\n serverOptions = remaining\n }\n const states = harnessStates()\n const builtIns = createHandlers<UIMessage, D>({\n contract,\n model,\n harnessStates: states,\n ...(serverOptions.telemetry === undefined\n ? {}\n : { telemetry: serverOptions.telemetry }),\n ...(tools === undefined ? {} : { tools }),\n ...(instructions === undefined ? {} : { instructions }),\n ...(maxSteps === undefined ? {} : { maxSteps }),\n ...(harness === undefined ? {} : { harness }),\n ...(toolRecovery === undefined ? {} : { toolRecovery }),\n ...(progress === undefined ? {} : { progress }),\n ...(toolLane === undefined ? {} : { toolLane }),\n } as HandlersOptions<UIMessage, D>)\n for (const type of Object.keys(handlers ?? {})) {\n if (Object.hasOwn(builtIns, type))\n throw new TypeError(`agent handles '${type}' itself`)\n }\n const server = createServer({\n ...serverOptions,\n contract,\n handlers: { ...builtIns, ...handlers },\n })\n registerHarnessStates(server, states)\n const applicationEvents = 'contract' in rest\n setServerFetchHooks(server, {\n validateIngress: (context) =>\n validateAgentIngress({ context, applicationEvents }),\n })\n return server\n}\n\nexport type { Instructions, ToolSet }\n"],"mappings":"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"}
|