experimental-a2 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +207 -0
- package/dist/ai-CFNeCrRl.d.ts +334 -0
- package/dist/ai-CFNeCrRl.d.ts.map +1 -0
- package/dist/ai-server.browser.js +2 -0
- package/dist/ai-server.browser.js.map +1 -0
- package/dist/ai-server.d.ts +49 -9
- package/dist/ai-server.d.ts.map +1 -0
- package/dist/ai-server.js +123 -49
- package/dist/ai-server.js.map +1 -0
- package/dist/ai.d.ts +2 -303
- package/dist/ai.js +233 -86
- package/dist/ai.js.map +1 -0
- package/dist/cli-B3VuxoDe.js +599 -0
- package/dist/cli-B3VuxoDe.js.map +1 -0
- package/dist/cli-bin.d.ts +1 -0
- package/dist/cli-bin.js +7 -0
- package/dist/cli-bin.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +2 -0
- package/dist/client-BKlyLiOU.js +1008 -0
- package/dist/client-BKlyLiOU.js.map +1 -0
- package/dist/client-D7mvIXrF.d.ts +191 -0
- package/dist/client-D7mvIXrF.d.ts.map +1 -0
- package/dist/client.d.ts +2 -90
- package/dist/client.js +1 -409
- package/dist/{contract-CG_adnu_.js → contract-48bUMgcL.js} +12 -2
- package/dist/contract-48bUMgcL.js.map +1 -0
- package/dist/{contract-C_3dIIEU.d.ts → contract-jIfaR085.d.ts} +63 -8
- package/dist/contract-jIfaR085.d.ts.map +1 -0
- package/dist/devtools-J_jZ2vQf.d.ts +152 -0
- package/dist/devtools-J_jZ2vQf.d.ts.map +1 -0
- package/dist/devtools-kJJaORn-.js +340 -0
- package/dist/devtools-kJJaORn-.js.map +1 -0
- package/dist/devtools-server.browser.js +3 -1
- package/dist/devtools-server.browser.js.map +1 -0
- package/dist/devtools-server.d.ts +4 -3
- package/dist/devtools-server.d.ts.map +1 -0
- package/dist/devtools-server.js +226 -43
- package/dist/devtools-server.js.map +1 -0
- package/dist/devtools.d.ts +2 -0
- package/dist/devtools.js +2 -0
- package/dist/{errors-BJRMd-h6.js → errors-BQuJpe82.js} +6 -4
- package/dist/errors-BQuJpe82.js.map +1 -0
- package/dist/{errors-xL_JTXsY.d.ts → errors-W6nwJ-fm.d.ts} +3 -2
- package/dist/errors-W6nwJ-fm.d.ts.map +1 -0
- package/dist/http.d.ts +135 -28
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +647 -61
- package/dist/http.js.map +1 -0
- package/dist/{idempotent-replay-BMyHrP0L.js → idempotent-replay-DuqEkYA7.js} +4 -2
- package/dist/idempotent-replay-DuqEkYA7.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +2 -2
- package/dist/{inspection-E7qbD0Xj.js → inspection-DaxB5jM2.js} +4 -1
- package/dist/inspection-DaxB5jM2.js.map +1 -0
- package/dist/internal-DstsI6Re.js +211 -0
- package/dist/internal-DstsI6Re.js.map +1 -0
- package/dist/otel.d.ts +3 -2
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +2 -0
- package/dist/otel.js.map +1 -0
- package/dist/platform-B4TnJtWu.js +34 -0
- package/dist/platform-B4TnJtWu.js.map +1 -0
- package/dist/react.d.ts +47 -15
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +30 -15
- package/dist/react.js.map +1 -0
- package/dist/retryable-lazy-DZWmHpii.js +2 -0
- package/dist/retryable-lazy-DZWmHpii.js.map +1 -0
- package/dist/scheduler-qstash.d.ts +79 -0
- package/dist/scheduler-qstash.d.ts.map +1 -0
- package/dist/scheduler-qstash.js +501 -0
- package/dist/scheduler-qstash.js.map +1 -0
- package/dist/scheduler-task-BpzhPnRS.js +56 -0
- package/dist/scheduler-task-BpzhPnRS.js.map +1 -0
- package/dist/{recovery-vercel.d.ts → scheduler-vercel.d.ts} +18 -24
- package/dist/scheduler-vercel.d.ts.map +1 -0
- package/dist/scheduler-vercel.js +228 -0
- package/dist/scheduler-vercel.js.map +1 -0
- package/dist/server-C72KOw51.js +1457 -0
- package/dist/server-C72KOw51.js.map +1 -0
- package/dist/server-DUF9pjsx.d.ts +261 -0
- package/dist/server-DUF9pjsx.d.ts.map +1 -0
- package/dist/server.browser.js +2 -0
- package/dist/server.browser.js.map +1 -0
- package/dist/server.d.ts +4 -155
- package/dist/server.js +2 -2
- package/dist/{log-ldf5g8Cx.d.ts → store-DysUkTH3.d.ts} +120 -35
- package/dist/store-DysUkTH3.d.ts.map +1 -0
- package/dist/{log-yJbXUf72.js → store-N8PXxDAS.js} +3 -1
- package/dist/store-N8PXxDAS.js.map +1 -0
- package/dist/store-codec-DTG0Ftek.js +10 -0
- package/dist/store-codec-DTG0Ftek.js.map +1 -0
- package/dist/store-memory.d.ts +12 -0
- package/dist/store-memory.d.ts.map +1 -0
- package/dist/{log-memory.js → store-memory.js} +145 -34
- package/dist/store-memory.js.map +1 -0
- package/dist/{log-polling-DZ1MiKLg.js → store-polling-dSeLxzfb.js} +7 -5
- package/dist/store-polling-dSeLxzfb.js.map +1 -0
- package/dist/{log-postgres.d.ts → store-postgres.d.ts} +7 -6
- package/dist/store-postgres.d.ts.map +1 -0
- package/dist/{log-postgres.js → store-postgres.js} +214 -24
- package/dist/store-postgres.js.map +1 -0
- package/dist/{log-redis-core-CyJ5L8yR.js → store-redis-core-BFLwz0Wj.js} +271 -66
- package/dist/store-redis-core-BFLwz0Wj.js.map +1 -0
- package/dist/{log-redis-http.d.ts → store-redis-http.d.ts} +8 -7
- package/dist/store-redis-http.d.ts.map +1 -0
- package/dist/{log-redis-http.js → store-redis-http.js} +22 -12
- package/dist/store-redis-http.js.map +1 -0
- package/dist/{log-redis.d.ts → store-redis.d.ts} +7 -6
- package/dist/store-redis.d.ts.map +1 -0
- package/dist/{log-redis.js → store-redis.js} +101 -39
- package/dist/store-redis.js.map +1 -0
- package/dist/{log-sqlite.d.ts → store-sqlite.d.ts} +7 -6
- package/dist/store-sqlite.d.ts.map +1 -0
- package/dist/{log-sqlite.js → store-sqlite.js} +118 -22
- package/dist/store-sqlite.js.map +1 -0
- package/dist/{telemetry-Cso0qyHQ.d.ts → telemetry-BjYHTfh2.d.ts} +3 -2
- package/dist/telemetry-BjYHTfh2.d.ts.map +1 -0
- package/dist/testing.browser.d.ts +1 -0
- package/dist/testing.browser.js +6 -0
- package/dist/testing.browser.js.map +1 -0
- package/dist/testing.d.ts +32 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +103 -0
- package/dist/testing.js.map +1 -0
- package/dist/validate-XKT4FSNn.js +2 -0
- package/dist/validate-XKT4FSNn.js.map +1 -0
- package/dist/wire-BFQmSJ-9.js +284 -0
- package/dist/wire-BFQmSJ-9.js.map +1 -0
- package/docs/01-quickstart.mdx +3 -3
- package/docs/concepts/01-contracts.mdx +18 -13
- package/docs/concepts/02-handlers.mdx +7 -7
- package/docs/concepts/03-durability.mdx +21 -21
- package/docs/concepts/04-state.mdx +18 -21
- package/docs/guides/01-timers.mdx +154 -49
- package/docs/guides/02-cancellation.mdx +30 -4
- package/docs/guides/03-react.mdx +76 -57
- package/docs/guides/04-local-first.mdx +1 -1
- package/docs/guides/05-production.mdx +310 -61
- package/docs/guides/06-ai-agents.mdx +252 -74
- package/docs/guides/07-devtools.mdx +137 -12
- package/docs/guides/08-application-data.mdx +1 -1
- package/docs/guides/09-presence.mdx +263 -0
- package/docs/guides/10-transports.mdx +140 -0
- package/docs/index.mdx +18 -14
- package/docs/reference/01-api.mdx +839 -110
- package/docs/reference/02-errors.mdx +13 -6
- package/package.json +24 -7
- package/src/ai-coordinator.ts +358 -0
- package/src/ai-projector.ts +524 -0
- package/src/ai-sdk-step.ts +261 -0
- package/src/ai-server.browser.ts +5 -0
- package/src/ai-server.ts +1719 -0
- package/src/ai.ts +2155 -0
- package/src/cache-indexeddb.ts +10 -0
- package/src/cli-bin.ts +5 -0
- package/src/cli.ts +1046 -0
- package/src/client.ts +1826 -0
- package/src/contract.ts +206 -0
- package/src/deterministic-id.ts +72 -0
- package/src/devtools-app.ts +989 -0
- package/src/devtools-server.browser.ts +5 -0
- package/src/devtools-server.ts +604 -0
- package/src/devtools.ts +716 -0
- package/src/errors.ts +50 -0
- package/src/http.ts +394 -0
- package/src/idempotent-replay.ts +53 -0
- package/src/index.ts +37 -0
- package/src/inspection.ts +39 -0
- package/src/internal.ts +426 -0
- package/src/otel.ts +59 -0
- package/src/platform.ts +60 -0
- package/src/push-envelope.ts +137 -0
- package/src/react.ts +284 -0
- package/src/reducer.ts +108 -0
- package/src/retryable-lazy.ts +27 -0
- package/src/scheduler-qstash.ts +915 -0
- package/src/scheduler-task.ts +106 -0
- package/src/scheduler-vercel.ts +437 -0
- package/src/server.browser.ts +12 -0
- package/src/server.ts +2700 -0
- package/src/session-socket.ts +548 -0
- package/src/sse.ts +141 -0
- package/src/standard-schema.ts +77 -0
- package/src/store-codec.ts +10 -0
- package/src/store-memory.ts +788 -0
- package/src/store-polling.ts +102 -0
- package/src/store-postgres.ts +1212 -0
- package/src/store-redis-core.ts +1494 -0
- package/src/store-redis-http.ts +116 -0
- package/src/store-redis.ts +458 -0
- package/src/store-sqlite.ts +1108 -0
- package/src/store.ts +385 -0
- package/src/telemetry.ts +47 -0
- package/src/testing.browser.ts +5 -0
- package/src/testing.ts +185 -0
- package/src/validate.ts +39 -0
- package/src/wire.ts +454 -0
- package/dist/internal-gCd5qMry.js +0 -44
- package/dist/log-memory.d.ts +0 -11
- package/dist/recovery-vercel.js +0 -119
- package/dist/server-BcLa4RFL.js +0 -877
- package/dist/wire-BVsgR8o9.js +0 -62
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-server.d.ts","names":[],"sources":["../src/ai-sdk-step.ts","../src/ai-server.ts"],"mappings":"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"}
|
package/dist/ai-server.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { t as A2Error } from "./errors-
|
|
2
|
-
import {
|
|
1
|
+
import { t as A2Error } from "./errors-BQuJpe82.js";
|
|
2
|
+
import { m as installAmbientToolScopeStorage, p as consumeSchedulerSendFailure } from "./internal-DstsI6Re.js";
|
|
3
|
+
import { t as createServer } from "./server-C72KOw51.js";
|
|
4
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
3
5
|
import { convertToModelMessages, stepCountIs, streamText, toUIMessageStream } from "ai";
|
|
4
6
|
//#region src/ai-sdk-step.ts
|
|
5
7
|
const CONTROLLED_SETTINGS = [
|
|
@@ -19,8 +21,7 @@ const CONTROLLED_SETTINGS = [
|
|
|
19
21
|
"prepareStep",
|
|
20
22
|
"stopWhen",
|
|
21
23
|
"system",
|
|
22
|
-
"tools"
|
|
23
|
-
"toolsContext"
|
|
24
|
+
"tools"
|
|
24
25
|
];
|
|
25
26
|
const safeSettings = (settings) => {
|
|
26
27
|
const result = { ...settings };
|
|
@@ -72,7 +73,8 @@ async function generateAISDKStep(input) {
|
|
|
72
73
|
tools,
|
|
73
74
|
originalMessages: input.messages,
|
|
74
75
|
generateMessageId: () => input.responseMessageId,
|
|
75
|
-
onError: errorMessage$1
|
|
76
|
+
onError: errorMessage$1,
|
|
77
|
+
...input.messageMetadata === void 0 ? {} : { messageMetadata: input.messageMetadata }
|
|
76
78
|
}),
|
|
77
79
|
completion() {
|
|
78
80
|
if (fatalError !== void 0) throw fatalError.value;
|
|
@@ -95,13 +97,15 @@ const foldCoordinator = (state, event) => {
|
|
|
95
97
|
queued: []
|
|
96
98
|
};
|
|
97
99
|
case "ai.message.created": {
|
|
98
|
-
const
|
|
100
|
+
const payload = event.payload;
|
|
101
|
+
const message = payload.message;
|
|
99
102
|
if (message.role !== "user") return state;
|
|
100
103
|
return {
|
|
101
104
|
...state,
|
|
102
105
|
queued: [...state.queued.filter((item) => item.messageId !== message.id), {
|
|
103
106
|
index: event.index,
|
|
104
|
-
messageId: message.id
|
|
107
|
+
messageId: message.id,
|
|
108
|
+
generate: payload.generate !== false
|
|
105
109
|
}].toSorted((left, right) => left.index - right.index)
|
|
106
110
|
};
|
|
107
111
|
}
|
|
@@ -109,9 +113,10 @@ const foldCoordinator = (state, event) => {
|
|
|
109
113
|
const request = event.payload;
|
|
110
114
|
if (request.reason === "message") {
|
|
111
115
|
const responseMessageId = request.responseMessageId ?? `${request.messageId}:assistant`;
|
|
116
|
+
const requested = state.queued.find((item) => item.messageId === request.messageId);
|
|
112
117
|
return {
|
|
113
118
|
...state,
|
|
114
|
-
queued: state.queued.filter((item) => item.messageId !== request.messageId),
|
|
119
|
+
queued: requested === void 0 ? state.queued.filter((item) => item.messageId !== request.messageId) : state.queued.filter((item) => item.index > requested.index),
|
|
115
120
|
response: {
|
|
116
121
|
rootMessageId: request.messageId,
|
|
117
122
|
responseMessageId,
|
|
@@ -177,7 +182,7 @@ const foldCoordinator = (state, event) => {
|
|
|
177
182
|
case "ai.message.interrupted": {
|
|
178
183
|
const interruption = event.payload;
|
|
179
184
|
const response = state.response;
|
|
180
|
-
return response?.responseMessageId === interruption.messageId && (interruption.generationId ===
|
|
185
|
+
return response?.responseMessageId === interruption.messageId && (interruption.generationId === response.generation?.generationId || interruption.requestId === response.activeRequestId) ? {
|
|
181
186
|
closed: state.closed,
|
|
182
187
|
queued: state.queued
|
|
183
188
|
} : state;
|
|
@@ -255,7 +260,7 @@ const foldCoordinator = (state, event) => {
|
|
|
255
260
|
}
|
|
256
261
|
};
|
|
257
262
|
const aiCoordinatorReducer = (contract) => contract.reducer({
|
|
258
|
-
name: "a2.ai.coordinator.
|
|
263
|
+
name: "a2.ai.coordinator.v3",
|
|
259
264
|
initialState: {
|
|
260
265
|
closed: false,
|
|
261
266
|
queued: []
|
|
@@ -288,8 +293,18 @@ const modelName = (model) => {
|
|
|
288
293
|
return "custom";
|
|
289
294
|
};
|
|
290
295
|
const errorMessage = (error) => error instanceof Error ? error.message : String(error);
|
|
296
|
+
const toolScopeStorage = installAmbientToolScopeStorage(() => new AsyncLocalStorage());
|
|
297
|
+
/** Run `fn` with `ctx` as the ambient tool handler context, for direct tool tests. */
|
|
298
|
+
function runWithHandlerContext(ctx, fn) {
|
|
299
|
+
return toolScopeStorage.run({ context: ctx }, fn);
|
|
300
|
+
}
|
|
291
301
|
const promptCacheKey = (sessionId, generationId) => `${sessionId}\u001f${generationId}`;
|
|
292
|
-
const
|
|
302
|
+
const asyncIterator = (value) => {
|
|
303
|
+
if (typeof value !== "object" || value === null) return void 0;
|
|
304
|
+
const factory = Reflect.get(value, Symbol.asyncIterator);
|
|
305
|
+
if (typeof factory !== "function") return void 0;
|
|
306
|
+
return factory.call(value);
|
|
307
|
+
};
|
|
293
308
|
const isBoundaryChunk = (chunk) => chunk !== void 0 && (chunk.type === "text-end" || chunk.type === "reasoning-end" || chunk.type === "tool-input-available" || chunk.type === "tool-input-error" || chunk.type === "tool-output-available" || chunk.type === "tool-output-error" || chunk.type === "tool-output-denied" || chunk.type === "tool-approval-request" || chunk.type === "finish" || chunk.type === "abort" || chunk.type === "error");
|
|
294
309
|
const nextOrTimer = async (next, delayMs) => {
|
|
295
310
|
let timer;
|
|
@@ -305,7 +320,7 @@ const nextOrTimer = async (next, delayMs) => {
|
|
|
305
320
|
if (timer !== void 0) clearTimeout(timer);
|
|
306
321
|
}
|
|
307
322
|
};
|
|
308
|
-
async function generateWithAISDK(context) {
|
|
323
|
+
async function generateWithAISDK(context, messageMetadata) {
|
|
309
324
|
const step = await generateAISDKStep({
|
|
310
325
|
model: context.model,
|
|
311
326
|
tools: context.tools,
|
|
@@ -313,7 +328,11 @@ async function generateWithAISDK(context) {
|
|
|
313
328
|
responseMessageId: context.responseMessageId,
|
|
314
329
|
abortSignal: context.signal,
|
|
315
330
|
...context.instructions === void 0 ? {} : { instructions: context.instructions },
|
|
316
|
-
settings: context.generation
|
|
331
|
+
settings: context.generation,
|
|
332
|
+
...messageMetadata === void 0 ? {} : { messageMetadata: ({ part }) => messageMetadata({
|
|
333
|
+
...context,
|
|
334
|
+
part
|
|
335
|
+
}) }
|
|
317
336
|
});
|
|
318
337
|
return {
|
|
319
338
|
stream: step.stream,
|
|
@@ -408,6 +427,10 @@ const activeContextMessages = (state, coordinator) => {
|
|
|
408
427
|
const queued = new Set(coordinator.queued.map((item) => item.messageId));
|
|
409
428
|
return contextMessages(state).filter((message) => !queued.has(message.id));
|
|
410
429
|
};
|
|
430
|
+
const generationRequestId = (generationId) => {
|
|
431
|
+
const markerIndex = generationId.lastIndexOf(":generation:");
|
|
432
|
+
return markerIndex === -1 ? void 0 : generationId.slice(0, markerIndex);
|
|
433
|
+
};
|
|
411
434
|
const toolCalledEvent = (payload) => ({
|
|
412
435
|
type: "ai.tool.called",
|
|
413
436
|
id: `${payload.generationId}:tool:${payload.toolCallId}:called`,
|
|
@@ -576,15 +599,27 @@ const lifecycleEvents = (options) => {
|
|
|
576
599
|
};
|
|
577
600
|
};
|
|
578
601
|
function queuedMessagesAt(history) {
|
|
579
|
-
const
|
|
580
|
-
|
|
581
|
-
if (event.type
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
602
|
+
const queued = [];
|
|
603
|
+
for (const event of history) {
|
|
604
|
+
if (event.type === "ai.message.created") {
|
|
605
|
+
const payload = event.payload;
|
|
606
|
+
if (payload.message.role !== "user") continue;
|
|
607
|
+
const duplicate = queued.findIndex((item) => item.messageId === payload.message.id);
|
|
608
|
+
if (duplicate !== -1) queued.splice(duplicate, 1);
|
|
609
|
+
queued.push({
|
|
610
|
+
index: event.index,
|
|
611
|
+
messageId: payload.message.id,
|
|
612
|
+
generate: payload.generate !== false
|
|
613
|
+
});
|
|
614
|
+
continue;
|
|
615
|
+
}
|
|
616
|
+
if (event.type !== "ai.generation.requested") continue;
|
|
617
|
+
const request = event.payload;
|
|
618
|
+
if (request.reason !== "message") continue;
|
|
619
|
+
const requested = queued.findIndex((item) => item.messageId === request.messageId);
|
|
620
|
+
if (requested !== -1) queued.splice(0, requested + 1);
|
|
621
|
+
}
|
|
622
|
+
return queued;
|
|
588
623
|
}
|
|
589
624
|
function withoutGenerationLifecycle(history, generationIds) {
|
|
590
625
|
if (generationIds.size === 0) return history;
|
|
@@ -612,10 +647,10 @@ function createHandlers(options) {
|
|
|
612
647
|
if (options.model === void 0) throw new TypeError("createHandlers requires model");
|
|
613
648
|
if (options.progress?.maxChunks !== void 0 && (!Number.isInteger(options.progress.maxChunks) || options.progress.maxChunks < 1)) throw new TypeError("progress.maxChunks must be a positive integer");
|
|
614
649
|
if (options.progress?.maxDelayMs !== void 0 && (!Number.isFinite(options.progress.maxDelayMs) || options.progress.maxDelayMs < 0)) throw new TypeError("progress.maxDelayMs must be a non-negative number");
|
|
615
|
-
if (options.maxSteps !== void 0 && (!Number.isInteger(options.maxSteps) || options.maxSteps < 1)) throw new TypeError("maxSteps must be a positive integer");
|
|
650
|
+
if (options.maxSteps !== void 0 && options.maxSteps !== Number.POSITIVE_INFINITY && (!Number.isInteger(options.maxSteps) || options.maxSteps < 1)) throw new TypeError("maxSteps must be a positive integer or Infinity");
|
|
616
651
|
const tools = options.tools ?? {};
|
|
617
652
|
const generation = options.generation ?? {};
|
|
618
|
-
const maxSteps = options.maxSteps ??
|
|
653
|
+
const maxSteps = options.maxSteps ?? Number.POSITIVE_INFINITY;
|
|
619
654
|
const coordinator = aiCoordinatorReducer(options.agent.contract);
|
|
620
655
|
const promptCache = /* @__PURE__ */ new Map();
|
|
621
656
|
const coordinatorStateAt = (history, frontier = Number.POSITIVE_INFINITY) => {
|
|
@@ -628,7 +663,7 @@ function createHandlers(options) {
|
|
|
628
663
|
};
|
|
629
664
|
const requestForNextMessage = (state) => {
|
|
630
665
|
if (state.closed || state.response !== void 0) return void 0;
|
|
631
|
-
const next = state.queued
|
|
666
|
+
const next = state.queued.find((item) => item.generate !== false);
|
|
632
667
|
if (next === void 0) return void 0;
|
|
633
668
|
return {
|
|
634
669
|
type: "ai.generation.requested",
|
|
@@ -710,36 +745,72 @@ function createHandlers(options) {
|
|
|
710
745
|
});
|
|
711
746
|
return computation;
|
|
712
747
|
};
|
|
713
|
-
const
|
|
714
|
-
const
|
|
715
|
-
if (
|
|
716
|
-
|
|
748
|
+
const toolExecutionFailure = (ctx, call, error) => {
|
|
749
|
+
const schedulerFailure = consumeSchedulerSendFailure(error);
|
|
750
|
+
if (ctx.signal.aborted) return;
|
|
751
|
+
if (schedulerFailure === "retryable") throw error;
|
|
752
|
+
return resultEvent(call, "execution:error", { error: errorMessage(error) });
|
|
753
|
+
};
|
|
754
|
+
const runToolExecution = async (ctx, call, execute, messages) => {
|
|
717
755
|
let output;
|
|
718
756
|
try {
|
|
719
|
-
output = await
|
|
757
|
+
output = await execute(call.input, {
|
|
720
758
|
toolCallId: call.toolCallId,
|
|
721
759
|
messages,
|
|
722
|
-
abortSignal: ctx.signal
|
|
723
|
-
context: void 0
|
|
760
|
+
abortSignal: ctx.signal
|
|
724
761
|
});
|
|
725
762
|
} catch (error) {
|
|
726
|
-
|
|
727
|
-
return resultEvent(call, "execution:error", { error: errorMessage(error) });
|
|
763
|
+
return toolExecutionFailure(ctx, call, error);
|
|
728
764
|
}
|
|
729
|
-
|
|
765
|
+
let iterator;
|
|
766
|
+
try {
|
|
767
|
+
iterator = asyncIterator(output);
|
|
768
|
+
} catch (error) {
|
|
769
|
+
return toolExecutionFailure(ctx, call, error);
|
|
770
|
+
}
|
|
771
|
+
if (iterator === void 0) return resultEvent(call, "execution:0", { output });
|
|
730
772
|
let last;
|
|
731
773
|
let sequence = 0;
|
|
732
|
-
for
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
}
|
|
774
|
+
for (;;) {
|
|
775
|
+
let result;
|
|
776
|
+
try {
|
|
777
|
+
result = await iterator.next();
|
|
778
|
+
} catch (error) {
|
|
779
|
+
return toolExecutionFailure(ctx, call, error);
|
|
780
|
+
}
|
|
781
|
+
if (result.done) break;
|
|
782
|
+
if (ctx.signal.aborted) {
|
|
783
|
+
try {
|
|
784
|
+
await iterator.return?.();
|
|
785
|
+
} catch {}
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
788
|
+
last = result.value;
|
|
789
|
+
try {
|
|
790
|
+
await ctx.session.append(`tool:${call.toolCallId}:preliminary:${sequence}`, resultEvent(call, `execution:${sequence}:preliminary`, {
|
|
791
|
+
output: result.value,
|
|
792
|
+
preliminary: true
|
|
793
|
+
}));
|
|
794
|
+
} catch (error) {
|
|
795
|
+
try {
|
|
796
|
+
await iterator.return?.();
|
|
797
|
+
} catch {}
|
|
798
|
+
throw error;
|
|
799
|
+
}
|
|
739
800
|
sequence += 1;
|
|
740
801
|
}
|
|
741
802
|
return resultEvent(call, `execution:${sequence}:final`, sequence === 0 ? {} : { output: last });
|
|
742
803
|
};
|
|
804
|
+
const executeTool = async (ctx, call) => {
|
|
805
|
+
const execute = tools[call.toolName]?.execute;
|
|
806
|
+
if (execute === void 0) return resultEvent(call, "execution:error", { error: `Tool '${call.toolName}' has no server executor` });
|
|
807
|
+
const messages = await promptMessages(ctx.event.sessionId, call, ctx.session.history);
|
|
808
|
+
const scope = {
|
|
809
|
+
contract: options.agent.contract,
|
|
810
|
+
context: ctx
|
|
811
|
+
};
|
|
812
|
+
return toolScopeStorage.run(scope, () => runToolExecution(ctx, call, execute, messages));
|
|
813
|
+
};
|
|
743
814
|
const handleToolCall = async (ctx) => {
|
|
744
815
|
const response = (await ctx.session.state(coordinator)).state.response;
|
|
745
816
|
const current = response?.calls.find((candidate) => candidate.index === ctx.event.index);
|
|
@@ -914,7 +985,7 @@ function createHandlers(options) {
|
|
|
914
985
|
};
|
|
915
986
|
const custom = options.generate !== void 0;
|
|
916
987
|
const updates = consumeGeneration({
|
|
917
|
-
source: options.generate === void 0 ? await generateWithAISDK(generateContext) : { stream: await options.generate(generateContext) },
|
|
988
|
+
source: options.generate === void 0 ? await generateWithAISDK(generateContext, options.messageMetadata) : { stream: await options.generate(generateContext) },
|
|
918
989
|
...options.progress === void 0 ? {} : { progress: options.progress }
|
|
919
990
|
});
|
|
920
991
|
let sequence = 0;
|
|
@@ -1008,7 +1079,7 @@ function createHandlers(options) {
|
|
|
1008
1079
|
}
|
|
1009
1080
|
};
|
|
1010
1081
|
const handleMessageCreated = async (ctx) => {
|
|
1011
|
-
if (ctx.event.payload.message.role !== "user") return;
|
|
1082
|
+
if (ctx.event.payload.message.role !== "user" || ctx.event.payload.generate === false) return;
|
|
1012
1083
|
return scheduleNext(ctx);
|
|
1013
1084
|
};
|
|
1014
1085
|
const handleRetry = async (ctx) => {
|
|
@@ -1071,7 +1142,7 @@ function createHandlers(options) {
|
|
|
1071
1142
|
abortOn: {
|
|
1072
1143
|
"ai.message.interrupted": (event, trigger, context) => {
|
|
1073
1144
|
const responseMessageId = trigger.payload.responseMessageId ?? (trigger.payload.reason === "message" ? `${trigger.payload.messageId}:assistant` : trigger.payload.messageId);
|
|
1074
|
-
return event.payload.messageId === responseMessageId && (event.payload.
|
|
1145
|
+
return event.payload.messageId === responseMessageId && (event.payload.requestId === trigger.id || event.payload.generationId === `${trigger.id}:generation:${context.attempt}`);
|
|
1075
1146
|
},
|
|
1076
1147
|
"ai.session.closed": true
|
|
1077
1148
|
},
|
|
@@ -1081,7 +1152,7 @@ function createHandlers(options) {
|
|
|
1081
1152
|
"ai.tool.called": {
|
|
1082
1153
|
abortOn: {
|
|
1083
1154
|
"ai.generation.failed": (event, trigger) => event.payload.generationId === trigger.payload.generationId,
|
|
1084
|
-
"ai.message.interrupted": (event, trigger) => event.payload.messageId === trigger.payload.messageId && (event.payload.
|
|
1155
|
+
"ai.message.interrupted": (event, trigger) => event.payload.messageId === trigger.payload.messageId && (event.payload.requestId === trigger.payload.requestId || event.payload.generationId === trigger.payload.generationId),
|
|
1085
1156
|
"ai.session.closed": true
|
|
1086
1157
|
},
|
|
1087
1158
|
handler: handleToolCall
|
|
@@ -1089,7 +1160,7 @@ function createHandlers(options) {
|
|
|
1089
1160
|
"ai.approval.responded": {
|
|
1090
1161
|
abortOn: {
|
|
1091
1162
|
"ai.generation.failed": (event, trigger) => event.payload.responseMessageId === trigger.payload.messageId && event.payload.generationId === trigger.payload.generationId,
|
|
1092
|
-
"ai.message.interrupted": (event, trigger) => event.payload.messageId === trigger.payload.messageId && (event.payload.
|
|
1163
|
+
"ai.message.interrupted": (event, trigger) => event.payload.messageId === trigger.payload.messageId && (event.payload.requestId === generationRequestId(trigger.payload.generationId) || event.payload.generationId === trigger.payload.generationId),
|
|
1093
1164
|
"ai.session.closed": true
|
|
1094
1165
|
},
|
|
1095
1166
|
handler: handleApproval
|
|
@@ -1102,7 +1173,7 @@ function createHandlers(options) {
|
|
|
1102
1173
|
}
|
|
1103
1174
|
/** Assemble an A2 server with the built-in agent handlers and app extensions. */
|
|
1104
1175
|
function createAgentServer(options) {
|
|
1105
|
-
const { agent: definition, model, tools, instructions, generation, maxSteps, generate, compaction, progress, handlers, ...serverOptions } = options;
|
|
1176
|
+
const { agent: definition, model, tools, instructions, generation, maxSteps, messageMetadata, generate, compaction, progress, handlers, ...serverOptions } = options;
|
|
1106
1177
|
const builtIns = createHandlers({
|
|
1107
1178
|
agent: definition,
|
|
1108
1179
|
model,
|
|
@@ -1110,6 +1181,7 @@ function createAgentServer(options) {
|
|
|
1110
1181
|
...instructions === void 0 ? {} : { instructions },
|
|
1111
1182
|
...generation === void 0 ? {} : { generation },
|
|
1112
1183
|
...maxSteps === void 0 ? {} : { maxSteps },
|
|
1184
|
+
...messageMetadata === void 0 ? {} : { messageMetadata },
|
|
1113
1185
|
...generate === void 0 ? {} : { generate },
|
|
1114
1186
|
...compaction === void 0 ? {} : { compaction },
|
|
1115
1187
|
...progress === void 0 ? {} : { progress }
|
|
@@ -1125,4 +1197,6 @@ function createAgentServer(options) {
|
|
|
1125
1197
|
});
|
|
1126
1198
|
}
|
|
1127
1199
|
//#endregion
|
|
1128
|
-
export { createAgentServer, createHandlers, validateAgentPush };
|
|
1200
|
+
export { createAgentServer, createHandlers, runWithHandlerContext, validateAgentPush };
|
|
1201
|
+
|
|
1202
|
+
//# sourceMappingURL=ai-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-server.js","names":["errorMessage"],"sources":["../src/ai-sdk-step.ts","../src/ai-coordinator.ts","../src/ai-server.ts"],"sourcesContent":["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 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 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 = 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 originalMessages: input.messages,\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 { UIMessage } from 'ai'\nimport type {\n AIEventDefs,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationRequestedPayload,\n GenerationStartedPayload,\n InputRequestedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport type { Reducer } from './reducer.ts'\n\nexport type CoordinatorCall = {\n index: number\n call: ToolCalledPayload\n approval?: ApprovalRequestedPayload\n response?: ApprovalRespondedPayload\n responseIndex?: number\n terminal: boolean\n}\n\nexport type CoordinatorResponse = {\n rootMessageId: string\n responseMessageId: string\n status: 'requested' | 'generating' | 'waiting' | 'failed'\n activeRequestId?: string\n generation?: GenerationStartedPayload\n completion?: GenerationCompletedPayload\n failure?: GenerationFailedPayload\n calls: CoordinatorCall[]\n inputs: InputRequestedPayload[]\n inputResponse?: {\n index: number\n generationId: string\n inputId: string\n name: string\n }\n}\n\nexport type AICoordinatorState = {\n closed: boolean\n queued: Array<{ index: number; messageId: string; generate: boolean }>\n response?: CoordinatorResponse\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\nconst 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.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 index: event.index,\n messageId: message.id,\n generate: payload.generate !== false,\n },\n ].toSorted((left, right) => left.index - right.index),\n }\n }\n case 'ai.generation.requested': {\n const request = event.payload as GenerationRequestedPayload\n if (request.reason === 'message') {\n const responseMessageId =\n request.responseMessageId ?? `${request.messageId}:assistant`\n const requested = state.queued.find(\n (item) => item.messageId === request.messageId,\n )\n return {\n ...state,\n queued:\n requested === undefined\n ? state.queued.filter(\n (item) => item.messageId !== request.messageId,\n )\n : state.queued.filter((item) => item.index > requested.index),\n response: {\n rootMessageId: request.messageId,\n responseMessageId,\n status: 'requested',\n activeRequestId: event.id,\n calls: [],\n inputs: [],\n },\n }\n }\n if (\n state.response === undefined ||\n request.responseMessageId !== state.response.responseMessageId\n ) {\n return state\n }\n if (\n (request.reason === 'tool' &&\n (!continuationReady(state) ||\n event.id !==\n `ai.generate:tools:${state.response.generation?.generationId}`)) ||\n (request.reason === 'retry' && state.response.status !== 'failed') ||\n (request.reason === 'input' &&\n state.response.inputResponse === undefined)\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n rootMessageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n status: 'requested',\n activeRequestId: event.id,\n calls: [],\n inputs: [],\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 generation,\n activeRequestId: generation.requestId,\n calls: [],\n inputs: [],\n }))\n }\n case 'ai.generation.completed': {\n const completion = event.payload as GenerationCompletedPayload\n if (\n state.response?.generation?.generationId !== completion.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n status: 'waiting',\n completion,\n }))\n }\n case 'ai.generation.failed': {\n const failure = event.payload as GenerationFailedPayload\n const response = state.response\n const ownsActiveGeneration =\n response?.generation?.generationId === failure.generationId\n const ownsActiveStepLimit =\n failure.stepLimit === true &&\n response?.activeRequestId ===\n `ai.generate:tools:${failure.generationId}` &&\n response.responseMessageId === failure.responseMessageId\n if (!ownsActiveGeneration && !ownsActiveStepLimit) {\n return state\n }\n return updateResponse(state, (current) => ({\n ...current,\n status: 'failed',\n failure,\n }))\n }\n case 'ai.message.completed': {\n const messageId = (event.payload as { messageId: string }).messageId\n return state.response?.responseMessageId === messageId\n ? { closed: state.closed, queued: state.queued }\n : state\n }\n case 'ai.message.interrupted': {\n const interruption = event.payload as MessageInterruptedPayload\n const response = state.response\n return response?.responseMessageId === interruption.messageId &&\n (interruption.generationId === response.generation?.generationId ||\n interruption.requestId === response.activeRequestId)\n ? { closed: state.closed, queued: state.queued }\n : state\n }\n case 'ai.tool.called': {\n const call = event.payload as ToolCalledPayload\n if (state.response?.generation?.generationId !== call.generationId) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: [\n ...response.calls.filter(\n (candidate) => candidate.call.toolCallId !== call.toolCallId,\n ),\n { index: event.index, call, terminal: false },\n ],\n }))\n }\n case 'ai.approval.requested': {\n const approval = event.payload as ApprovalRequestedPayload\n if (state.response?.generation?.generationId !== approval.generationId) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === approval.toolCallId\n ? { ...candidate, approval }\n : candidate,\n ),\n }))\n }\n case 'ai.approval.responded': {\n const approval = event.payload as ApprovalRespondedPayload\n if (\n state.response?.responseMessageId !== approval.messageId ||\n state.response.generation?.generationId !== approval.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.approval?.approvalId === approval.approvalId\n ? { ...candidate, response: approval, responseIndex: event.index }\n : candidate,\n ),\n }))\n }\n case 'ai.tool.result': {\n const result = event.payload as ToolResultPayload\n if (\n result.preliminary === true ||\n state.response?.generation?.generationId !== result.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n calls: response.calls.map((candidate) =>\n candidate.call.toolCallId === result.toolCallId\n ? { ...candidate, terminal: true }\n : candidate,\n ),\n }))\n }\n case 'ai.input.requested': {\n const input = event.payload as InputRequestedPayload\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.generationId !== input.generationId\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: [\n ...response.inputs.filter(\n (candidate) =>\n candidate.messageId !== input.messageId ||\n candidate.generationId !== input.generationId ||\n candidate.inputId !== input.inputId,\n ),\n input,\n ],\n }))\n }\n case 'ai.input.responded': {\n const input = event.payload as {\n messageId: string\n generationId: string\n inputId: string\n name: string\n }\n const requested = state.response?.inputs.find(\n (candidate) =>\n candidate.messageId === input.messageId &&\n candidate.generationId === input.generationId &&\n candidate.inputId === input.inputId &&\n candidate.name === input.name,\n )\n if (\n state.response?.responseMessageId !== input.messageId ||\n state.response.generation?.generationId !== input.generationId ||\n requested === undefined\n ) {\n return state\n }\n return updateResponse(state, (response) => ({\n ...response,\n inputs: response.inputs.filter(\n (candidate) => candidate.inputId !== input.inputId,\n ),\n inputResponse: {\n index: event.index,\n generationId: input.generationId,\n inputId: input.inputId,\n name: requested.name,\n },\n }))\n }\n default:\n return state\n }\n}\n\nexport const aiCoordinatorReducer = <\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n>(\n contract: Contract<D>,\n): Reducer<D, AICoordinatorState> =>\n contract\n .reducer({\n name: 'a2.ai.coordinator.v3',\n initialState: {\n closed: false,\n queued: [],\n } as AICoordinatorState,\n })\n .fold((state, event) => foldCoordinator<M, D>(state, event))\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","/**\n * experimental-a2/ai/server — the server-only implementation of an experimental-a2/ai definition.\n *\n * `createHandlers()` exposes the ordinary A2 handler table;\n * `createAgentServer()` is its batteries-included assembly with createServer.\n */\n\n// oxlint-disable no-await-in-loop -- stream chunks and durable appends are\n// ordered; parallel consumption would corrupt progress sequence and state.\n\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { convertToModelMessages } from 'ai'\nimport type {\n FinishReason,\n Instructions,\n LanguageModel,\n LanguageModelUsage,\n ModelMessage,\n TextStreamPart,\n ToolSet,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport { generateAISDKStep, type AISDKStepSettings } from './ai-sdk-step.ts'\nimport type {\n AIEventDefs,\n AIState,\n AgentDefinition,\n AgentToolContext,\n AgentToolEventDefs,\n ApprovalRequestedPayload,\n CompactionCompletedPayload,\n GenerationCompletedPayload,\n GenerationFailedPayload,\n GenerationProgressPayload,\n GenerationRequestedPayload,\n GenerationStartedPayload,\n MessageCompletedPayload,\n MessageCreatedPayload,\n MessageInterruptedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\nimport {\n aiCoordinatorReducer,\n continuationReady,\n type AICoordinatorState,\n} from './ai-coordinator.ts'\nimport type { AppendInput, ContractEvent, EventDefs } from './contract.ts'\nimport { A2Error } from './errors.ts'\nimport {\n consumeSchedulerSendFailure,\n installAmbientToolScopeStorage,\n type AmbientToolScope,\n} from './internal.ts'\nimport {\n createServer,\n type A2Server,\n type HandlerContext,\n type PushValidationContext,\n type ServerOptions,\n} from './server.ts'\n\nexport function validateAgentPush(context: PushValidationContext): void {\n const rejected = context.events.find((event) => {\n if (event.type !== 'ai.message.created') {\n return !(\n event.type === 'ai.approval.responded' ||\n event.type === 'ai.input.responded' ||\n event.type === 'ai.message.interrupted' ||\n event.type === 'ai.retry.requested'\n )\n }\n const payload = event.payload\n return (\n typeof payload !== 'object' ||\n payload === null ||\n !('message' in payload) ||\n typeof payload.message !== 'object' ||\n payload.message === null ||\n !('role' in payload.message) ||\n payload.message.role !== 'user'\n )\n })\n if (rejected !== undefined) {\n throw new A2Error(\n 'INVALID_PAYLOAD',\n `event '${rejected.type}' is server-only for an AI agent`,\n )\n }\n}\n\ntype AgentGenerationProgress = {\n type: 'progress'\n chunks: UIMessageChunk[]\n}\n\ntype AgentGenerationFinish = {\n type: 'finish'\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype AgentGenerationUpdate = AgentGenerationProgress | AgentGenerationFinish\n\nexport type AgentGenerateContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = {\n request: ContractEvent<D, 'ai.generation.requested'>\n requestId: string\n generationId: string\n responseMessageId: string\n messages: M[]\n state: AIState<M>\n history: ContractEvent<D>[]\n signal: AbortSignal\n model: LanguageModel\n tools: T\n instructions?: Instructions\n generation: AgentGenerationSettings<T>\n}\n\nexport type AgentGenerate<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = (\n context: AgentGenerateContext<M, D, T>,\n) => ReadableStream<UIMessageChunk> | Promise<ReadableStream<UIMessageChunk>>\n\ntype UIMessageMetadata<M extends UIMessage> =\n M extends UIMessage<infer Metadata> ? Metadata : unknown\n\nexport type AgentMessageMetadata<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n> = (\n context: AgentGenerateContext<M, D, T> & { part: TextStreamPart<T> },\n) => UIMessageMetadata<M> | undefined\n\nexport type AgentResolverContext<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n event: ContractEvent<D, 'ai.generation.requested'>\n state: AIState<M>\n history: ContractEvent<D>[]\n signal: AbortSignal\n}\n\nexport type Resolvable<T, C> = T | ((context: C) => T | Promise<T>)\n\nexport type CompactionPolicy<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n> = {\n shouldCompact(\n context: AgentResolverContext<M, D> & { messages: M[] },\n ): boolean | Promise<boolean>\n compact(\n context: AgentResolverContext<M, D> & { messages: M[] },\n ): M[] | Promise<M[]>\n}\n\nexport type AgentGenerationSettings<T extends ToolSet> = AISDKStepSettings<T>\n\nexport type CreateHandlersOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n> = {\n agent: AgentDefinition<M, D>\n /** AI SDK model string or provider model, optionally resolved per generation. */\n model: Resolvable<LanguageModel, AgentResolverContext<M, D>>\n tools?: T\n instructions?: Resolvable<\n Instructions | undefined,\n AgentResolverContext<M, D>\n >\n /** Settings for each one-step AI SDK streamText call. */\n generation?: AgentGenerationSettings<T>\n /**\n * Maximum model steps in one assistant response. Defaults to Infinity.\n */\n maxSteps?: number\n /** Map default AI SDK stream parts to typed assistant message metadata. */\n messageMetadata?: AgentMessageMetadata<M, D, T>\n /**\n * Replace model generation with an AI SDK UI message chunk stream.\n * The custom stream owns its metadata chunks.\n */\n generate?: AgentGenerate<M, D, T>\n compaction?: CompactionPolicy<M, D>\n /** Progress is durably flushed at either limit, whichever is reached first. */\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}\n\nexport type CreateAgentServerOptions<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n> = CreateHandlersOptions<M, D, T> &\n Omit<ServerOptions<D>, 'contract' | 'handlers' | 'validatePush'> & {\n handlers?: ServerOptions<D>['handlers']\n }\n\nconst resolve = async <T, C>(\n value: Resolvable<T, C>,\n context: C,\n): Promise<T> =>\n typeof value === 'function'\n ? await (value as (context: C) => T | Promise<T>)(context)\n : value\n\nconst modelName = (model: LanguageModel): string => {\n if (typeof model === 'string') return model\n if ('modelId' in model && typeof model.modelId === 'string') {\n return model.modelId\n }\n return 'custom'\n}\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error)\n\nconst toolScopeStorage = installAmbientToolScopeStorage(\n () => new AsyncLocalStorage<AmbientToolScope>(),\n)\n\n/** Run `fn` with `ctx` as the ambient tool handler context, for direct tool tests. */\nexport function runWithHandlerContext<D extends AgentToolEventDefs, R>(\n ctx: AgentToolContext<D>,\n fn: () => R,\n): R {\n return toolScopeStorage.run({ context: ctx }, fn)\n}\n\nconst promptCacheKey = (sessionId: string, generationId: string): string =>\n `${sessionId}\\u001f${generationId}`\n\nconst asyncIterator = (value: unknown): AsyncIterator<unknown> | undefined => {\n if (typeof value !== 'object' || value === null) return undefined\n const factory = Reflect.get(value, Symbol.asyncIterator)\n if (typeof factory !== 'function') return undefined\n return (factory as (this: object) => AsyncIterator<unknown>).call(value)\n}\n\nconst isBoundaryChunk = (chunk: UIMessageChunk | undefined): boolean =>\n chunk !== undefined &&\n (chunk.type === 'text-end' ||\n chunk.type === 'reasoning-end' ||\n chunk.type === 'tool-input-available' ||\n chunk.type === 'tool-input-error' ||\n chunk.type === 'tool-output-available' ||\n chunk.type === 'tool-output-error' ||\n chunk.type === 'tool-output-denied' ||\n chunk.type === 'tool-approval-request' ||\n chunk.type === 'finish' ||\n chunk.type === 'abort' ||\n chunk.type === 'error')\n\nconst nextOrTimer = async <T>(\n next: Promise<IteratorResult<T>>,\n delayMs: number,\n): Promise<{ type: 'next'; result: IteratorResult<T> } | { type: 'timer' }> => {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n next.then((result) => ({ type: 'next' as const, result })),\n new Promise<{ type: 'timer' }>((finishTimer) => {\n timer = setTimeout(() => finishTimer({ type: 'timer' }), delayMs)\n ;(timer as { unref?: () => void }).unref?.()\n }),\n ])\n } finally {\n if (timer !== undefined) clearTimeout(timer)\n }\n}\n\ntype GenerationCompletion = {\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n}\n\ntype GenerationSource = {\n stream: ReadableStream<UIMessageChunk>\n completion?: () => GenerationCompletion\n}\n\nasync function generateWithAISDK<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet,\n>(\n context: AgentGenerateContext<M, D, T>,\n messageMetadata: AgentMessageMetadata<M, D, T> | undefined,\n): Promise<GenerationSource> {\n const step = await generateAISDKStep<M, T>({\n model: context.model,\n tools: context.tools,\n messages: context.messages,\n responseMessageId: context.responseMessageId,\n abortSignal: context.signal,\n ...(context.instructions === undefined\n ? {}\n : { instructions: context.instructions }),\n settings: context.generation,\n ...(messageMetadata === undefined\n ? {}\n : {\n messageMetadata: ({ part }) => messageMetadata({ ...context, part }),\n }),\n })\n return {\n stream: step.stream as ReadableStream<UIMessageChunk>,\n completion: step.completion,\n }\n}\n\nasync function* consumeGeneration(options: {\n source: GenerationSource\n progress?: { maxChunks?: number; maxDelayMs?: number }\n}): AsyncGenerator<AgentGenerationUpdate> {\n const pending: UIMessageChunk[] = []\n let streamedFinishReason: FinishReason | undefined\n let streamedError: string | undefined\n const maxChunks = options.progress?.maxChunks ?? 16\n const maxDelayMs = options.progress?.maxDelayMs ?? 30\n let lastFlush = Date.now()\n const chunks = options.source.stream[Symbol.asyncIterator]()\n let pendingChunk = chunks.next()\n try {\n for (;;) {\n let result: IteratorResult<UIMessageChunk>\n if (pending.length > 0) {\n const remaining = Math.max(0, maxDelayMs - (Date.now() - lastFlush))\n const outcome = await nextOrTimer(pendingChunk, remaining)\n if (outcome.type === 'timer') {\n yield { type: 'progress', chunks: pending.splice(0) }\n lastFlush = Date.now()\n continue\n }\n result = outcome.result\n } else {\n result = await pendingChunk\n }\n if (result.done) break\n const chunk = result.value\n pending.push(chunk)\n if (chunk.type === 'finish') streamedFinishReason = chunk.finishReason\n if (chunk.type === 'error') streamedError = chunk.errorText\n pendingChunk = chunks.next()\n\n if (pending.length >= maxChunks || isBoundaryChunk(pending.at(-1))) {\n yield { type: 'progress', chunks: pending.splice(0) }\n lastFlush = Date.now()\n }\n }\n } catch (error) {\n if (pending.length > 0)\n yield { type: 'progress', chunks: pending.splice(0) }\n throw error\n }\n\n let completion: GenerationCompletion | undefined\n try {\n completion = options.source.completion?.()\n } catch (error) {\n if (pending.length > 0) {\n yield { type: 'progress', chunks: pending.splice(0) }\n }\n throw error\n }\n if (pending.length > 0) {\n yield { type: 'progress', chunks: pending.splice(0) }\n }\n if (streamedError !== undefined) throw new Error(streamedError)\n const finishReason = completion?.finishReason ?? streamedFinishReason\n yield {\n type: 'finish',\n ...(finishReason === undefined ? {} : { finishReason }),\n ...(completion?.usage === undefined ? {} : { usage: completion.usage }),\n }\n}\n\nconst replay = <M extends UIMessage, D extends AIEventDefs<M> & EventDefs>(\n definition: AgentDefinition<M, D>,\n history: ContractEvent<D>[],\n): AIState<M> => {\n let state = definition.reducer.initialState\n for (const event of history) state = definition.reducer.fold(state, event)\n return state\n}\n\nconst contextMessages = <M extends UIMessage>(state: AIState<M>): M[] => {\n const compaction = state.compaction\n if (compaction?.status !== 'completed' || !compaction.messages) {\n return state.messages\n }\n const boundary = state.messages.findIndex(\n (message) => message.id === compaction.throughMessageId,\n )\n const retained = new Set(compaction.retainedMessageIds ?? [])\n return boundary === -1\n ? state.messages\n : [\n ...compaction.messages,\n ...state.messages\n .slice(0, boundary + 1)\n .filter((message) => retained.has(message.id)),\n ...state.messages.slice(boundary + 1),\n ]\n}\n\nconst activeContextMessages = <M extends UIMessage>(\n state: AIState<M>,\n coordinator: AICoordinatorState,\n): M[] => {\n const queued = new Set(coordinator.queued.map((item) => item.messageId))\n return contextMessages(state).filter((message) => !queued.has(message.id))\n}\n\nconst generationRequestId = (generationId: string): string | undefined => {\n const markerIndex = generationId.lastIndexOf(':generation:')\n return markerIndex === -1 ? undefined : generationId.slice(0, markerIndex)\n}\n\ntype ToolCallClassification = 'automatic' | 'approval' | 'unknown'\n\ntype PendingToolCall = {\n call: ToolCalledPayload\n classification: ToolCallClassification\n}\n\nconst toolCalledEvent = <D extends EventDefs>(\n payload: ToolCalledPayload,\n): AppendInput<D> =>\n ({\n type: 'ai.tool.called',\n id: `${payload.generationId}:tool:${payload.toolCallId}:called`,\n payload,\n }) as AppendInput<D>\n\nconst approvalClassification = <T extends ToolSet>(\n tools: T,\n generation: AgentGenerationSettings<T>,\n toolName: string,\n): ToolCallClassification => {\n const configured = generation.toolApproval\n if (typeof configured === 'function') return 'unknown'\n const policy = configured?.[toolName]\n if (typeof policy === 'function') return 'unknown'\n if (\n policy === 'user-approval' ||\n (typeof policy === 'object' && policy?.type === 'user-approval')\n ) {\n return 'approval'\n }\n if (\n policy === 'denied' ||\n (typeof policy === 'object' && policy?.type === 'denied')\n ) {\n return 'approval'\n }\n const tool = tools[toolName] as { needsApproval?: unknown } | undefined\n if (typeof tool?.needsApproval === 'function') return 'unknown'\n return tool?.needsApproval === true ? 'approval' : 'automatic'\n}\n\nconst lifecycleEvents = <D extends EventDefs, T extends ToolSet>(options: {\n requestId: string\n messageId: string\n generationId: string\n sequence: number\n chunks: UIMessageChunk[]\n pending: PendingToolCall[]\n tools: T\n generation: AgentGenerationSettings<T>\n custom: boolean\n}): { events: AppendInput<D>[]; pending: PendingToolCall[] } => {\n const result: AppendInput<D>[] = []\n const pending = [...options.pending]\n const take = (toolCallId: string): PendingToolCall | undefined => {\n const index = pending.findIndex(\n (candidate) => candidate.call.toolCallId === toolCallId,\n )\n if (index === -1) return undefined\n return pending.splice(index, 1)[0]\n }\n const flush = (toolCallId: string): void => {\n const pendingCall = take(toolCallId)\n if (pendingCall) result.push(toolCalledEvent<D>(pendingCall.call))\n }\n for (const [chunkIndex, chunk] of options.chunks.entries()) {\n const resultId = `${options.generationId}:tool-result:${options.sequence}:${chunkIndex}`\n if (chunk.type === 'tool-input-available') {\n const payload: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...((\n options.tools[chunk.toolName] as\n { supportsDeferredResults?: boolean } | undefined\n )?.supportsDeferredResults === true\n ? { supportsDeferredResults: true }\n : {}),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n }\n take(payload.toolCallId)\n const classification = approvalClassification(\n options.tools,\n options.generation,\n chunk.toolName,\n )\n if (classification === 'automatic') {\n result.push(toolCalledEvent<D>(payload))\n } else {\n pending.push({ call: payload, classification })\n }\n } else if (chunk.type === 'tool-input-error') {\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n ...(chunk.dynamic ? { input: chunk.input } : { rawInput: chunk.input }),\n error: chunk.errorText,\n phase: 'input',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n const called: ToolCalledPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n }\n take(chunk.toolCallId)\n result.push(toolCalledEvent<D>(called), {\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-available') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n output: chunk.output,\n phase: 'execution',\n ...(chunk.preliminary === undefined\n ? {}\n : { preliminary: chunk.preliminary }),\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-error') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n error: chunk.errorText,\n phase: 'execution',\n ...(chunk.dynamic === undefined ? {} : { dynamic: chunk.dynamic }),\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-output-denied') {\n flush(chunk.toolCallId)\n const payload: ToolResultPayload = {\n requestId: options.requestId,\n messageId: options.messageId,\n generationId: options.generationId,\n toolCallId: chunk.toolCallId,\n denied: true,\n phase: 'execution',\n }\n result.push({\n type: 'ai.tool.result',\n id: resultId,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-request') {\n flush(chunk.toolCallId)\n const payload: ApprovalRequestedPayload = {\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n toolCallId: chunk.toolCallId,\n ...(chunk.isAutomatic === undefined\n ? {}\n : { isAutomatic: chunk.isAutomatic }),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n result.push({\n type: 'ai.approval.requested',\n id: `${options.generationId}:approval:${chunk.approvalId}`,\n payload,\n } as AppendInput<D>)\n } else if (chunk.type === 'tool-approval-response') {\n result.push({\n type: 'ai.approval.responded',\n id: `${options.generationId}:approval:${chunk.approvalId}:automatic-response`,\n payload: {\n messageId: options.messageId,\n generationId: options.generationId,\n approvalId: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n },\n } as AppendInput<D>)\n }\n }\n return { events: result, pending }\n}\n\nfunction queuedMessagesAt<D extends EventDefs>(\n history: ContractEvent<D>[],\n): AICoordinatorState['queued'] {\n const queued: AICoordinatorState['queued'] = []\n for (const event of history) {\n if (event.type === 'ai.message.created') {\n const payload = event.payload as MessageCreatedPayload<UIMessage>\n if (payload.message.role !== 'user') continue\n const duplicate = queued.findIndex(\n (item) => item.messageId === payload.message.id,\n )\n if (duplicate !== -1) queued.splice(duplicate, 1)\n queued.push({\n index: event.index,\n messageId: payload.message.id,\n generate: payload.generate !== false,\n })\n continue\n }\n if (event.type !== 'ai.generation.requested') continue\n const request = event.payload as GenerationRequestedPayload\n if (request.reason !== 'message') continue\n const requested = queued.findIndex(\n (item) => item.messageId === request.messageId,\n )\n if (requested !== -1) queued.splice(0, requested + 1)\n }\n return queued\n}\n\nfunction withoutGenerationLifecycle<D extends EventDefs>(\n history: ContractEvent<D>[],\n generationIds: ReadonlySet<string>,\n): ContractEvent<D>[] {\n if (generationIds.size === 0) return history\n const approvalKeys = new Set<string>()\n const inputKeys = new Set<string>()\n for (const event of history) {\n const payload = event.payload as {\n generationId?: unknown\n messageId?: unknown\n approvalId?: unknown\n inputId?: unknown\n }\n if (\n typeof payload.generationId !== 'string' ||\n !generationIds.has(payload.generationId) ||\n typeof payload.messageId !== 'string'\n ) {\n continue\n }\n if (\n event.type === 'ai.approval.requested' &&\n typeof payload.approvalId === 'string'\n ) {\n approvalKeys.add(`${payload.messageId}\\u001f${payload.approvalId}`)\n }\n if (\n event.type === 'ai.input.requested' &&\n typeof payload.inputId === 'string'\n ) {\n inputKeys.add(`${payload.messageId}\\u001f${payload.inputId}`)\n }\n }\n return history.filter((event) => {\n const payload = event.payload as {\n generationId?: unknown\n messageId?: unknown\n approvalId?: unknown\n inputId?: unknown\n }\n if (\n typeof payload.generationId === 'string' &&\n generationIds.has(payload.generationId)\n ) {\n return false\n }\n if (\n event.type === 'ai.approval.responded' &&\n typeof payload.messageId === 'string' &&\n typeof payload.approvalId === 'string'\n ) {\n return !approvalKeys.has(\n `${payload.messageId}\\u001f${payload.approvalId}`,\n )\n }\n if (\n event.type === 'ai.input.responded' &&\n typeof payload.messageId === 'string' &&\n typeof payload.inputId === 'string'\n ) {\n return !inputKeys.has(`${payload.messageId}\\u001f${payload.inputId}`)\n }\n return true\n })\n}\n\n/**\n * Build the ordinary A2 handler table for the built-in agent protocol.\n * Application handlers can be spread beside this table.\n */\nexport function createHandlers<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n>(\n options: CreateHandlersOptions<M, D, T>,\n): NonNullable<ServerOptions<D>['handlers']> {\n if (options.model === undefined) {\n throw new TypeError('createHandlers requires model')\n }\n if (\n options.progress?.maxChunks !== undefined &&\n (!Number.isInteger(options.progress.maxChunks) ||\n options.progress.maxChunks < 1)\n ) {\n throw new TypeError('progress.maxChunks must be a positive integer')\n }\n if (\n options.progress?.maxDelayMs !== undefined &&\n (!Number.isFinite(options.progress.maxDelayMs) ||\n options.progress.maxDelayMs < 0)\n ) {\n throw new TypeError('progress.maxDelayMs must be a non-negative number')\n }\n if (\n options.maxSteps !== undefined &&\n options.maxSteps !== Number.POSITIVE_INFINITY &&\n (!Number.isInteger(options.maxSteps) || options.maxSteps < 1)\n ) {\n throw new TypeError('maxSteps must be a positive integer or Infinity')\n }\n\n const tools = options.tools ?? ({} as T)\n const generation = options.generation ?? {}\n const maxSteps = options.maxSteps ?? Number.POSITIVE_INFINITY\n const coordinator = aiCoordinatorReducer(options.agent.contract)\n const promptCache = new Map<string, Promise<ModelMessage[]>>()\n\n const coordinatorStateAt = (\n history: ContractEvent<D>[],\n frontier = Number.POSITIVE_INFINITY,\n ): AICoordinatorState => {\n let state = coordinator.initialState\n for (const event of history) {\n if (event.index >= frontier) break\n state = coordinator.fold(state, event)\n }\n return state\n }\n\n const requestForNextMessage = (\n state: AICoordinatorState,\n ): AppendInput<D> | undefined => {\n if (state.closed || state.response !== undefined) return undefined\n const next = state.queued.find((item) => item.generate !== false)\n if (next === undefined) return undefined\n return {\n type: 'ai.generation.requested',\n id: `ai.generate:message:${next.messageId}`,\n payload: { messageId: next.messageId, reason: 'message' },\n } as AppendInput<D>\n }\n\n const scheduleNext = async (\n ctx: Pick<HandlerContext<D>, 'session'>,\n ): Promise<AppendInput<D> | void> =>\n requestForNextMessage((await ctx.session.state(coordinator)).state)\n\n const continueIfReady = async (\n ctx: Pick<HandlerContext<D>, 'session'>,\n generationId: string,\n ): Promise<void> => {\n const state = (await ctx.session.state(coordinator)).state\n const response = state.response\n if (response?.generation?.generationId !== generationId) {\n return\n }\n const input = response.inputResponse\n const inputReady =\n response.completion?.generationId === generationId &&\n response.failure === undefined &&\n input !== undefined &&\n response.inputs.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 if (inputReady) {\n await ctx.session.append('continue-after-input', {\n type: 'ai.generation.requested',\n id: `ai.generate:input:${encodeURIComponent(response.responseMessageId)}:${encodeURIComponent(input.generationId)}:${encodeURIComponent(input.inputId)}`,\n payload: {\n messageId: response.responseMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'input',\n },\n } as AppendInput<D>)\n return\n }\n if (!continuationReady(state)) return\n await ctx.session.append('continue-after-tools', {\n type: 'ai.generation.requested',\n id: `ai.generate:tools:${generationId}`,\n payload: {\n messageId: response.responseMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'tool',\n },\n } as AppendInput<D>)\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 =\n | HandlerContext<D, 'ai.tool.called'>\n | HandlerContext<D, 'ai.approval.responded'>\n\n const resultEvent = (\n call: ToolCalledPayload,\n suffix: string,\n result: {\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n },\n ): AppendInput<D> =>\n ({\n type: 'ai.tool.result',\n id: `${call.generationId}:tool:${call.toolCallId}:${suffix}`,\n payload: {\n requestId: call.requestId,\n messageId: call.messageId,\n generationId: call.generationId,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n phase: 'execution',\n ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.denied === undefined ? {} : { denied: result.denied }),\n ...(result.preliminary === undefined\n ? {}\n : { preliminary: result.preliminary }),\n ...(call.dynamic === undefined ? {} : { dynamic: call.dynamic }),\n ...(call.providerExecuted === undefined\n ? {}\n : { providerExecuted: call.providerExecuted }),\n ...(call.toolMetadata === undefined\n ? {}\n : { toolMetadata: call.toolMetadata }),\n },\n }) as AppendInput<D>\n\n const promptMessages = (\n sessionId: string,\n call: ToolCalledPayload,\n readHistory: () => Promise<ContractEvent<D>[]>,\n ): Promise<ModelMessage[]> => {\n const key = promptCacheKey(sessionId, call.generationId)\n const cached = promptCache.get(key)\n if (cached) return cached\n const computation = (async () => {\n const history = await readHistory()\n const coordinatorState = coordinatorStateAt(history)\n const compaction = history.find(\n (event) =>\n event.type === 'ai.compaction.completed' &&\n (event.payload as CompactionCompletedPayload<M>).generationId ===\n call.generationId,\n )\n if (compaction !== undefined) {\n const messages = (\n compaction.payload as CompactionCompletedPayload<M>\n ).messages.filter(\n (message) =>\n !coordinatorState.queued.some(\n (queued) => queued.messageId === message.id,\n ),\n )\n return convertToModelMessages(messages, { tools })\n }\n const started = history.find(\n (event) =>\n event.type === 'ai.generation.started' &&\n (event.payload as GenerationStartedPayload).generationId ===\n call.generationId,\n )\n const frontier = started?.index ?? Number.POSITIVE_INFINITY\n const state = replay(\n options.agent,\n history.filter((event) => event.index < frontier),\n )\n return convertToModelMessages(\n activeContextMessages(state, coordinatorState),\n { tools },\n )\n })()\n promptCache.set(key, computation)\n void computation.catch(() => {\n if (promptCache.get(key) === computation) promptCache.delete(key)\n })\n return computation\n }\n\n const toolExecutionFailure = (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n error: unknown,\n ): AppendInput<D> | void => {\n const schedulerFailure = consumeSchedulerSendFailure(error)\n if (ctx.signal.aborted) return\n if (schedulerFailure === 'retryable') throw error\n return resultEvent(call, '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, 'execution:0', { output })\n }\n let last: unknown\n let sequence = 0\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) break\n if (ctx.signal.aborted) {\n try {\n await iterator.return?.()\n } catch {\n // The aborted handler cannot record an iterator cleanup failure.\n }\n return\n }\n last = result.value\n try {\n await ctx.session.append(\n `tool:${call.toolCallId}:preliminary:${sequence}`,\n resultEvent(call, `execution:${sequence}:preliminary`, {\n output: result.value,\n preliminary: true,\n }),\n )\n } catch (error) {\n try {\n await iterator.return?.()\n } catch {\n // Preserve the append failure that makes the durable handler retry.\n }\n throw error\n }\n sequence += 1\n }\n return resultEvent(\n call,\n `execution:${sequence}:final`,\n sequence === 0 ? {} : { output: last },\n )\n }\n\n const executeTool = async (\n ctx: ToolHandlerContext,\n call: ToolCalledPayload,\n ): Promise<AppendInput<D> | void> => {\n const tool = tools[call.toolName] as RuntimeTool | undefined\n const execute = tool?.execute\n if (execute === undefined) {\n return resultEvent(call, 'execution:error', {\n error: `Tool '${call.toolName}' has no server executor`,\n })\n }\n const messages = await promptMessages(\n ctx.event.sessionId,\n call,\n ctx.session.history,\n )\n const scope: AmbientToolScope = {\n contract: options.agent.contract,\n context: ctx,\n }\n // Async iteration resumes in the caller's context, so the whole\n // execution, not just the execute call, runs inside the scope.\n return toolScopeStorage.run(scope, () =>\n runToolExecution(ctx, call, execute, messages),\n )\n }\n\n const handleToolCall = async (\n ctx: HandlerContext<D, 'ai.tool.called'>,\n ): Promise<AppendInput<D> | void> => {\n const state = (await ctx.session.state(coordinator)).state\n const response = state.response\n const current = response?.calls.find(\n (candidate) => candidate.index === ctx.event.index,\n )\n if (\n current === undefined ||\n response?.generation?.generationId !== ctx.event.payload.generationId ||\n response.failure !== undefined ||\n current.terminal ||\n current.approval !== undefined\n ) {\n return\n }\n if (current.call.providerExecuted === true) {\n await continueIfReady(ctx, current.call.generationId)\n return\n }\n return executeTool(ctx, current.call)\n }\n\n const handleApproval = async (\n ctx: HandlerContext<D, 'ai.approval.responded'>,\n ): Promise<AppendInput<D> | void> => {\n const state = (await ctx.session.state(coordinator)).state\n const response = state.response\n const current = response?.calls.find(\n (candidate) =>\n candidate.approval?.approvalId === ctx.event.payload.approvalId &&\n candidate.approval.messageId === ctx.event.payload.messageId &&\n candidate.approval.generationId === ctx.event.payload.generationId &&\n candidate.responseIndex === ctx.event.index,\n )\n if (\n current === undefined ||\n response?.generation?.generationId !== current.call.generationId ||\n response.failure !== undefined ||\n current.terminal\n ) {\n return\n }\n if (current.call.providerExecuted === true) {\n await continueIfReady(ctx, current.call.generationId)\n return\n }\n if (!ctx.event.payload.approved) {\n return resultEvent(current.call, 'execution:denied', { denied: true })\n }\n return executeTool(ctx, current.call)\n }\n\n const generationHandler = async (\n ctx: HandlerContext<D, 'ai.generation.requested'>,\n ): Promise<void | AppendInput<D> | readonly AppendInput<D>[]> => {\n const history = await ctx.session.history()\n const requestId = ctx.event.id\n const request = ctx.event.payload\n const coordinatorState = (await ctx.session.state(coordinator)).state\n if (\n coordinatorState.closed ||\n coordinatorState.response?.activeRequestId !== requestId\n ) {\n return\n }\n const terminal = history.some((event) => {\n if (event.type === 'ai.generation.completed') {\n return (\n (event.payload as GenerationCompletedPayload).requestId === requestId\n )\n }\n if (event.type !== 'ai.generation.failed') return false\n const payload = event.payload as GenerationFailedPayload\n return payload.requestId === requestId && payload.superseded !== true\n })\n if (terminal) return\n\n const previousStarts = history.filter(\n (event) =>\n event.type === 'ai.generation.started' &&\n (event.payload as GenerationStartedPayload).requestId === requestId,\n )\n const priorAttempts = previousStarts.map(\n (event) => (event.payload as GenerationStartedPayload).attempt,\n )\n if (priorAttempts.some((priorAttempt) => priorAttempt >= ctx.attempt)) {\n return\n }\n const attempt = ctx.attempt\n const generationId = `${requestId}:generation:${attempt}`\n const responseMessageId =\n request.responseMessageId ??\n (request.reason === 'message'\n ? `${request.messageId}:assistant`\n : request.messageId)\n\n const responseStepCount = history.filter(\n (event) =>\n event.type === 'ai.generation.completed' &&\n (event.payload as GenerationCompletedPayload).responseMessageId ===\n responseMessageId,\n ).length\n\n const sourceCoordinatorState = coordinatorStateAt(history, ctx.event.index)\n if (request.reason === 'tool') {\n const prefix = 'ai.generate:tools:'\n if (!requestId.startsWith(prefix)) return\n const sourceGenerationId = requestId.slice(prefix.length)\n if (\n !continuationReady(sourceCoordinatorState) ||\n sourceCoordinatorState.response?.generation?.generationId !==\n sourceGenerationId ||\n sourceCoordinatorState.response.responseMessageId !==\n request.messageId ||\n sourceCoordinatorState.response.responseMessageId !==\n request.responseMessageId\n ) {\n return\n }\n }\n\n const previous = previousStarts\n .filter(\n (event) =>\n (event.payload as GenerationStartedPayload).attempt < attempt,\n )\n .toSorted(\n (left, right) =>\n (right.payload as GenerationStartedPayload).attempt -\n (left.payload as GenerationStartedPayload).attempt,\n )[0]\n\n const incompleteId = previous\n ? (previous.payload as GenerationStartedPayload).generationId\n : undefined\n const replacedGenerationIds = new Set<string>()\n if (incompleteId !== undefined) replacedGenerationIds.add(incompleteId)\n if (\n request.reason === 'retry' &&\n sourceCoordinatorState.response?.failure?.generationId !== undefined\n ) {\n replacedGenerationIds.add(\n sourceCoordinatorState.response.failure.generationId,\n )\n }\n const promptHistory = withoutGenerationLifecycle(\n history,\n replacedGenerationIds,\n )\n let state = replay(options.agent, promptHistory)\n const resolverContext: AgentResolverContext<M, D> = {\n event: ctx.event,\n state,\n history,\n signal: ctx.signal,\n }\n\n const resolvedModel = await resolve(options.model, resolverContext)\n if (resolvedModel === undefined) {\n throw new TypeError('the model resolver returned undefined')\n }\n if (ctx.signal.aborted) return\n\n if (request.reason === 'tool' && responseStepCount >= maxSteps) {\n const source = sourceCoordinatorState.response?.generation\n if (source === undefined) return\n return {\n type: 'ai.generation.failed',\n id: `${requestId}:step-limit`,\n payload: {\n requestId: source.requestId,\n messageId: source.messageId,\n generationId: source.generationId,\n responseMessageId,\n error: `agent exceeded the ${maxSteps}-step limit`,\n stepLimit: true,\n },\n } as AppendInput<D>\n }\n\n const started: GenerationStartedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n attempt,\n model: modelName(resolvedModel),\n }\n const startEvents: AppendInput<D>[] = []\n if (previous) {\n const payload = previous.payload as GenerationStartedPayload\n const superseded: GenerationFailedPayload = {\n requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n responseMessageId: payload.responseMessageId,\n error: 'generation attempt was superseded after an incomplete run',\n superseded: true,\n }\n startEvents.push({\n type: 'ai.generation.failed',\n id: `${payload.generationId}:superseded`,\n payload: superseded,\n } as AppendInput<D>)\n }\n startEvents.push({\n type: 'ai.generation.started',\n id: generationId,\n payload: started,\n } as AppendInput<D>)\n await ctx.session.append('generation-start', ...startEvents)\n\n const startedCoordinatorState = (await ctx.session.state(coordinator)).state\n if (\n startedCoordinatorState.response?.activeRequestId !== requestId ||\n startedCoordinatorState.response.generation?.generationId !== generationId\n ) {\n return\n }\n\n const promptCoordinatorState = {\n ...coordinatorStateAt(history),\n queued: queuedMessagesAt(history),\n }\n let messages = activeContextMessages(state, promptCoordinatorState)\n if (options.compaction) {\n const compactionContext = { ...resolverContext, messages }\n if (await options.compaction.shouldCompact(compactionContext)) {\n const throughMessageId = messages.at(-1)?.id ?? request.messageId\n await ctx.session.append('compaction-requested', {\n type: 'ai.compaction.requested',\n id: `${generationId}:compaction:requested`,\n payload: { generationId, throughMessageId },\n })\n messages = await options.compaction.compact(compactionContext)\n const completed: CompactionCompletedPayload<M> = {\n generationId,\n throughMessageId,\n messages,\n ...(promptCoordinatorState.queued.length === 0\n ? {}\n : {\n retainedMessageIds: promptCoordinatorState.queued.map(\n (item) => item.messageId,\n ),\n }),\n }\n await ctx.session.append('compaction-completed', {\n type: 'ai.compaction.completed',\n id: `${generationId}:compaction:completed`,\n payload: completed,\n })\n state = {\n ...state,\n compaction: { status: 'completed', ...completed },\n }\n }\n }\n\n const currentState = (await ctx.session.state(options.agent.reducer)).state\n const currentCoordinatorState = (await ctx.session.state(coordinator)).state\n const generationMessages = activeContextMessages(\n currentState,\n currentCoordinatorState,\n )\n promptCache.set(\n promptCacheKey(ctx.event.sessionId, generationId),\n convertToModelMessages(generationMessages, { tools }),\n )\n\n let pendingToolCalls: PendingToolCall[] = []\n try {\n const resolvedInstructions =\n options.instructions === undefined\n ? undefined\n : await resolve(options.instructions, resolverContext)\n const generateContext: AgentGenerateContext<M, D, T> = {\n request: ctx.event,\n requestId,\n generationId,\n responseMessageId,\n messages: generationMessages,\n state: currentState,\n history,\n signal: ctx.signal,\n model: resolvedModel,\n tools,\n ...(resolvedInstructions === undefined\n ? {}\n : { instructions: resolvedInstructions }),\n generation: options.generation ?? {},\n }\n const custom = options.generate !== undefined\n const source =\n options.generate === undefined\n ? await generateWithAISDK(generateContext, options.messageMetadata)\n : { stream: await options.generate(generateContext) }\n const updates = consumeGeneration({\n source,\n ...(options.progress === undefined\n ? {}\n : { progress: options.progress }),\n })\n\n let sequence = 0\n let finish: AgentGenerationFinish | undefined\n for await (const update of updates) {\n ctx.signal.throwIfAborted()\n if (update.type === 'finish') {\n finish = update\n continue\n }\n const progress: GenerationProgressPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n sequence,\n chunks: update.chunks,\n }\n const lifecycle = lifecycleEvents<D, T>({\n requestId,\n messageId: responseMessageId,\n generationId,\n sequence,\n chunks: update.chunks,\n pending: pendingToolCalls,\n tools,\n generation,\n custom,\n })\n pendingToolCalls = lifecycle.pending\n await ctx.session.append(\n `generation-progress:${sequence}`,\n {\n type: 'ai.generation.progress',\n id: `${generationId}:progress:${sequence}`,\n payload: progress,\n },\n ...lifecycle.events,\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 ...(finish.finishReason === undefined\n ? {}\n : { finishReason: finish.finishReason }),\n ...(finish.usage === undefined ? {} : { usage: finish.usage }),\n }\n const completionEvent = {\n type: 'ai.generation.completed',\n id: `${generationId}:completed`,\n payload: completed,\n } as AppendInput<D>\n const unresolved = options.generate\n ? pendingToolCalls.filter(\n (pending) => pending.classification !== 'automatic',\n )\n : []\n if (unresolved.length > 0) {\n throw new Error(\n `generation ended with unresolved tool authorization for '${unresolved[0]!.call.toolName}'`,\n )\n }\n const pendingEvents = pendingToolCalls\n .filter(\n (pending) =>\n pending.classification === 'automatic' ||\n (options.generate === undefined &&\n pending.classification === 'unknown'),\n )\n .map((pending) => toolCalledEvent<D>(pending.call))\n if (finish.finishReason === 'tool-calls') {\n return [...pendingEvents, completionEvent]\n }\n return [\n ...pendingEvents,\n completionEvent,\n {\n type: 'ai.message.completed',\n id: `${generationId}:message:completed`,\n payload: {\n messageId: responseMessageId,\n } satisfies MessageCompletedPayload,\n } as AppendInput<D>,\n ]\n } catch (error) {\n if (error instanceof A2Error) throw error\n if (ctx.signal.aborted) {\n const interrupted: MessageInterruptedPayload = {\n messageId: responseMessageId,\n generationId,\n reason: 'aborted',\n }\n return {\n type: 'ai.message.interrupted',\n id: `${generationId}:interrupted`,\n payload: interrupted,\n } as AppendInput<D>\n }\n const failed: GenerationFailedPayload = {\n requestId,\n messageId: request.messageId,\n generationId,\n responseMessageId,\n error: errorMessage(error),\n }\n return {\n type: 'ai.generation.failed',\n id: `${generationId}:failed`,\n payload: failed,\n } as AppendInput<D>\n }\n }\n\n const handleMessageCreated = async (\n ctx: HandlerContext<D, 'ai.message.created'>,\n ): Promise<AppendInput<D> | void> => {\n if (\n ctx.event.payload.message.role !== 'user' ||\n ctx.event.payload.generate === false\n ) {\n return\n }\n return scheduleNext(ctx)\n }\n\n const handleRetry = async (\n ctx: HandlerContext<D, 'ai.retry.requested'>,\n ): Promise<AppendInput<D> | void> => {\n const state = (await ctx.session.state(coordinator)).state\n const response = state.response\n if (\n response?.status !== 'failed' ||\n response.rootMessageId !== ctx.event.payload.messageId ||\n response.responseMessageId !== ctx.event.payload.responseMessageId\n ) {\n return\n }\n return {\n type: 'ai.generation.requested',\n id: `ai.generate:retry:${ctx.event.payload.retryId}`,\n payload: {\n messageId: response.rootMessageId,\n responseMessageId: response.responseMessageId,\n reason: 'retry',\n },\n } as AppendInput<D>\n }\n\n const handleInputResponse = async (\n ctx: HandlerContext<D, 'ai.input.responded'>,\n ): Promise<void> => {\n const state = (await ctx.session.state(coordinator)).state\n const response = state.response\n if (\n response?.responseMessageId !== ctx.event.payload.messageId ||\n response.inputResponse?.index !== ctx.event.index ||\n response.inputResponse.generationId !== ctx.event.payload.generationId ||\n response.inputResponse.inputId !== ctx.event.payload.inputId\n ) {\n return\n }\n await continueIfReady(ctx, ctx.event.payload.generationId)\n }\n\n const clearPromptCache = (sessionId: string): void => {\n const prefix = `${sessionId}\\u001f`\n for (const key of promptCache.keys()) {\n if (key.startsWith(prefix)) promptCache.delete(key)\n }\n }\n\n const handleResponseEnded = async (\n ctx: HandlerContext<D, 'ai.message.completed' | 'ai.message.interrupted'>,\n ): Promise<AppendInput<D> | void> => {\n clearPromptCache(ctx.event.sessionId)\n return scheduleNext(ctx)\n }\n\n return {\n 'ai.message.created': { lane: 'a2.ai.turn', handler: handleMessageCreated },\n 'ai.retry.requested': { lane: 'a2.ai.turn', handler: handleRetry },\n 'ai.input.responded': {\n lane: 'a2.ai.turn',\n handler: handleInputResponse,\n },\n 'ai.message.completed': {\n lane: 'a2.ai.turn',\n handler: handleResponseEnded,\n },\n 'ai.message.interrupted': {\n lane: 'a2.ai.turn',\n handler: handleResponseEnded,\n },\n 'ai.session.closed': {\n handler: (ctx) => {\n clearPromptCache(ctx.event.sessionId)\n return Promise.resolve()\n },\n },\n 'ai.generation.failed': {\n handler: (ctx) => {\n promptCache.delete(\n promptCacheKey(ctx.event.sessionId, ctx.event.payload.generationId),\n )\n return Promise.resolve()\n },\n },\n 'ai.generation.requested': {\n lane: 'a2.ai.turn',\n abortOn: {\n 'ai.message.interrupted': (event, trigger, context) => {\n const responseMessageId =\n trigger.payload.responseMessageId ??\n (trigger.payload.reason === 'message'\n ? `${trigger.payload.messageId}:assistant`\n : trigger.payload.messageId)\n return (\n event.payload.messageId === responseMessageId &&\n (event.payload.requestId === trigger.id ||\n event.payload.generationId ===\n `${trigger.id}:generation:${context.attempt}`)\n )\n },\n 'ai.session.closed': true,\n },\n handler: generationHandler,\n },\n 'ai.generation.completed': {\n handler: async (ctx) =>\n continueIfReady(ctx, ctx.event.payload.generationId),\n },\n 'ai.tool.called': {\n abortOn: {\n 'ai.generation.failed': (event, trigger) =>\n event.payload.generationId === trigger.payload.generationId,\n 'ai.message.interrupted': (event, trigger) =>\n event.payload.messageId === trigger.payload.messageId &&\n (event.payload.requestId === trigger.payload.requestId ||\n event.payload.generationId === trigger.payload.generationId),\n 'ai.session.closed': true,\n },\n handler: handleToolCall,\n },\n 'ai.approval.responded': {\n abortOn: {\n 'ai.generation.failed': (event, trigger) =>\n event.payload.responseMessageId === trigger.payload.messageId &&\n event.payload.generationId === trigger.payload.generationId,\n 'ai.message.interrupted': (event, trigger) =>\n event.payload.messageId === trigger.payload.messageId &&\n (event.payload.requestId ===\n generationRequestId(trigger.payload.generationId) ||\n event.payload.generationId === trigger.payload.generationId),\n 'ai.session.closed': true,\n },\n handler: handleApproval,\n },\n 'ai.tool.result': {\n handler: async (ctx) => {\n if (ctx.event.payload.preliminary === true) return\n await continueIfReady(ctx, ctx.event.payload.generationId)\n },\n },\n } as NonNullable<ServerOptions<D>['handlers']>\n}\n\n/** Assemble an A2 server with the built-in agent handlers and app extensions. */\nexport function createAgentServer<\n M extends UIMessage,\n D extends AIEventDefs<M> & EventDefs,\n T extends ToolSet = ToolSet,\n>(options: CreateAgentServerOptions<M, D, T>): A2Server<D> {\n const {\n agent: definition,\n model,\n tools,\n instructions,\n generation,\n maxSteps,\n messageMetadata,\n generate,\n compaction,\n progress,\n handlers,\n ...serverOptions\n } = options\n const builtIns = createHandlers({\n agent: definition,\n model,\n ...(tools === undefined ? {} : { tools }),\n ...(instructions === undefined ? {} : { instructions }),\n ...(generation === undefined ? {} : { generation }),\n ...(maxSteps === undefined ? {} : { maxSteps }),\n ...(messageMetadata === undefined ? {} : { messageMetadata }),\n ...(generate === undefined ? {} : { generate }),\n ...(compaction === undefined ? {} : { compaction }),\n ...(progress === undefined ? {} : { progress }),\n })\n return createServer({\n ...serverOptions,\n contract: definition.contract,\n handlers: { ...builtIns, ...handlers },\n validatePush: validateAgentPush,\n })\n}\n\nexport type { Instructions, LanguageModel, ToolSet }\n"],"mappings":"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"}
|