veryfront 0.1.154 → 0.1.155

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/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.154",
3
+ "version": "0.1.155",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -1,6 +1,7 @@
1
1
  import * as dntShim from "../../_dnt.shims.js";
2
2
  import { z } from "zod";
3
3
  import type { Agent } from "./types.js";
4
+ import { type RunResumeSessionManager } from "./runtime/index.js";
4
5
  declare const AgUiInjectedToolSchema: z.ZodObject<{
5
6
  name: z.ZodString;
6
7
  description: z.ZodOptional<z.ZodString>;
@@ -65,8 +66,13 @@ export declare const AgUiRequestSchema: z.ZodObject<{
65
66
  export type AgUiInjectedTool = z.infer<typeof AgUiInjectedToolSchema>;
66
67
  export type AgUiContextItem = z.infer<typeof AgUiContextItemSchema>;
67
68
  export type AgUiRequest = z.infer<typeof AgUiRequestSchema>;
69
+ type AgUiResumeValue = {
70
+ result: unknown;
71
+ isError: boolean;
72
+ };
68
73
  export interface AgUiHandlerOptions {
69
74
  context?: Record<string, unknown> | ((request: dntShim.Request) => Record<string, unknown> | Promise<Record<string, unknown>>);
75
+ sessionManager?: RunResumeSessionManager<AgUiResumeValue>;
70
76
  }
71
77
  export interface AgUiHandlerConfigWithAgent extends AgUiHandlerOptions {
72
78
  agent: Agent;
@@ -1 +1 @@
1
- {"version":3,"file":"ag-ui-handler.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,KAAK,EAAW,MAAM,YAAY,CAAC;AAoCjD,QAAA,MAAM,sBAAsB;;;;iBAO1B,CAAC;AAEH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;2BAqBzB,CAAC;AAYH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAe5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAoQ5D,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CAChG;AAED,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,KAAK,EAAE,KAAK,CAAC;CACd;AAUD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,0BAA0B,EAClC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"ag-ui-handler.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,KAAK,EAAW,MAAM,YAAY,CAAC;AACjD,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAsC5B,QAAA,MAAM,sBAAsB;;;;iBAO1B,CAAC;AAEH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;2BAqBzB,CAAC;AAYH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAe5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAG5D,KAAK,eAAe,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AA4Y7D,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/F,cAAc,CAAC,EAAE,uBAAuB,CAAC,eAAe,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,KAAK,EAAE,KAAK,CAAC;CACd;AAUD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,0BAA0B,EAClC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC"}
@@ -1,7 +1,10 @@
1
1
  import * as dntShim from "../../_dnt.shims.js";
2
2
  import { z } from "zod";
3
3
  import { getAgent } from "./composition/index.js";
4
+ import { AgentRuntime, RunAlreadyExistsError, } from "./runtime/index.js";
4
5
  import { INVALID_ARGUMENT } from "../errors/index.js";
6
+ import { SKILL_TOOL_IDS } from "../skill/types.js";
7
+ import { toolRegistry } from "../tool/index.js";
5
8
  import { createStreamTransformState, finalizeRunEvents, formatAgUiEvent, mapRuntimeEventToAgUi, parseSseJsonEvents, } from "../internal-agents/ag-ui-sse.js";
6
9
  const AGENT_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
7
10
  const MAX_TOOL_PARAMETERS_BYTES = 16_384;
@@ -194,25 +197,15 @@ function enqueueEvent(controller, event, payload) {
194
197
  return false;
195
198
  }
196
199
  }
197
- async function createAgUiStreamResponse(agent, request, baseContext) {
198
- const threadId = request.threadId ?? dntShim.crypto.randomUUID();
199
- const runId = request.runId ?? generateRunId();
200
- await agent.clearMemory();
201
- const result = await agent.stream({
202
- messages: normalizeMessages(request.messages),
203
- context: buildStreamContext(request, baseContext, threadId, runId),
204
- ...(request.model ? { model: request.model } : {}),
205
- ...(request.maxOutputTokens ? { maxOutputTokens: request.maxOutputTokens } : {}),
206
- });
207
- const upstream = result.toDataStreamResponse();
208
- const upstreamBody = upstream.body;
200
+ async function createAgUiStreamResponse(options) {
201
+ const { agentId, request, runId, threadId, upstreamBody, upstreamStatus, upstreamStatusText, onFinish, onError, } = options;
209
202
  const stream = new ReadableStream({
210
203
  start: async (controller) => {
211
204
  const state = createStreamTransformState();
212
205
  let reader = null;
213
206
  let remainder = "";
214
207
  const decoder = new TextDecoder();
215
- if (!enqueueEvent(controller, "RunStarted", { runId, threadId, agentId: agent.id })) {
208
+ if (!enqueueEvent(controller, "RunStarted", { runId, threadId, agentId })) {
216
209
  return;
217
210
  }
218
211
  if (!enqueueEvent(controller, "StateSnapshot", { snapshot: {} })) {
@@ -228,6 +221,7 @@ async function createAgUiStreamResponse(agent, request, baseContext) {
228
221
  return;
229
222
  }
230
223
  }
224
+ onFinish?.();
231
225
  closeController(controller);
232
226
  return;
233
227
  }
@@ -261,8 +255,10 @@ async function createAgUiStreamResponse(agent, request, baseContext) {
261
255
  return;
262
256
  }
263
257
  }
258
+ onFinish?.();
264
259
  }
265
260
  catch (error) {
261
+ onError?.(error);
266
262
  enqueueEvent(controller, "RunError", {
267
263
  message: error instanceof Error ? error.message : "Agent run failed",
268
264
  });
@@ -274,11 +270,105 @@ async function createAgUiStreamResponse(agent, request, baseContext) {
274
270
  },
275
271
  });
276
272
  return new dntShim.Response(stream, {
277
- status: upstream.status,
278
- statusText: upstream.statusText,
273
+ status: upstreamStatus,
274
+ statusText: upstreamStatusText,
279
275
  headers: { ...AG_UI_HEADERS },
280
276
  });
281
277
  }
278
+ async function createAgUiDirectStreamResponse(agent, request, baseContext) {
279
+ const threadId = request.threadId ?? dntShim.crypto.randomUUID();
280
+ const runId = request.runId ?? generateRunId();
281
+ await agent.clearMemory();
282
+ const result = await agent.stream({
283
+ messages: normalizeMessages(request.messages),
284
+ context: buildStreamContext(request, baseContext, threadId, runId),
285
+ ...(request.model ? { model: request.model } : {}),
286
+ ...(request.maxOutputTokens ? { maxOutputTokens: request.maxOutputTokens } : {}),
287
+ });
288
+ const upstream = result.toDataStreamResponse();
289
+ return await createAgUiStreamResponse({
290
+ agentId: agent.id,
291
+ request,
292
+ runId,
293
+ threadId,
294
+ upstreamBody: upstream.body,
295
+ upstreamStatus: upstream.status,
296
+ upstreamStatusText: upstream.statusText,
297
+ });
298
+ }
299
+ function createInjectedAgUiTool(runId, tool, sessionManager) {
300
+ return {
301
+ id: tool.name,
302
+ type: "function",
303
+ description: tool.description ?? tool.name,
304
+ inputSchema: z.record(z.string(), z.unknown()),
305
+ inputSchemaJson: (tool.parameters ??
306
+ { type: "object", properties: {}, additionalProperties: true }),
307
+ execute: async (_input, context) => {
308
+ const toolCallId = typeof context?.toolCallId === "string" ? context.toolCallId : null;
309
+ if (!toolCallId) {
310
+ throw new Error(`Missing toolCallId for injected tool "${tool.name}"`);
311
+ }
312
+ const submitted = await sessionManager.waitForSignal(runId, toolCallId);
313
+ if (submitted.isError) {
314
+ throw new Error(typeof submitted.result === "string"
315
+ ? submitted.result
316
+ : JSON.stringify(submitted.result));
317
+ }
318
+ return submitted.result;
319
+ },
320
+ };
321
+ }
322
+ async function createAgUiInjectedToolsStreamResponse(agent, request, baseContext, sessionManager) {
323
+ const threadId = request.threadId ?? dntShim.crypto.randomUUID();
324
+ const runId = request.runId ?? generateRunId();
325
+ try {
326
+ sessionManager.startRun({ runId, threadId });
327
+ }
328
+ catch (error) {
329
+ if (error instanceof RunAlreadyExistsError) {
330
+ return dntShim.Response.json({ error: "Run already active" }, { status: 409 });
331
+ }
332
+ throw error;
333
+ }
334
+ const injectedTools = Object.fromEntries(request.tools.map((tool) => [tool.name, createInjectedAgUiTool(runId, tool, sessionManager)]));
335
+ const mergedTools = !agent.config.tools
336
+ ? injectedTools
337
+ : agent.config.tools === true
338
+ ? {
339
+ ...Object.fromEntries([...toolRegistry.getAll()]
340
+ .filter(([toolId]) => agent.config.skills || !SKILL_TOOL_IDS.has(toolId))
341
+ .map(([toolId]) => [toolId, true])),
342
+ ...injectedTools,
343
+ }
344
+ : { ...agent.config.tools, ...injectedTools };
345
+ const runtime = new AgentRuntime(agent.id, {
346
+ ...agent.config,
347
+ tools: mergedTools,
348
+ });
349
+ let upstreamBody;
350
+ try {
351
+ upstreamBody = await runtime.stream(normalizeMessages(request.messages), buildStreamContext(request, baseContext, threadId, runId), undefined, request.model, request.maxOutputTokens);
352
+ }
353
+ catch (error) {
354
+ sessionManager.failRun(runId);
355
+ throw error;
356
+ }
357
+ return await createAgUiStreamResponse({
358
+ agentId: agent.id,
359
+ request,
360
+ runId,
361
+ threadId,
362
+ upstreamBody,
363
+ upstreamStatus: 200,
364
+ onFinish: () => {
365
+ sessionManager.completeRun(runId);
366
+ },
367
+ onError: () => {
368
+ sessionManager.failRun(runId);
369
+ },
370
+ });
371
+ }
282
372
  function mergeConfig(config, options) {
283
373
  if (!options)
284
374
  return config;
@@ -310,14 +400,20 @@ export function createAgUiHandler(agentIdOrConfig, options) {
310
400
  try {
311
401
  const parsed = AgUiRequestSchema.parse(await request.json());
312
402
  if (parsed.tools.length > 0) {
313
- return dntShim.Response.json({
314
- error: "Injected AG-UI tools are not supported by createAgUiHandler yet. Use package-level wait/resume runtime primitives instead.",
315
- }, { status: 501 });
403
+ if (!options?.sessionManager) {
404
+ return dntShim.Response.json({
405
+ error: "Injected AG-UI tools require a public RunResumeSessionManager on createAgUiHandler().",
406
+ }, { status: 501 });
407
+ }
408
+ const context = typeof options?.context === "function"
409
+ ? await options.context(request)
410
+ : options?.context ?? {};
411
+ return await createAgUiInjectedToolsStreamResponse(agent, parsed, context, options.sessionManager);
316
412
  }
317
413
  const context = typeof options?.context === "function"
318
414
  ? await options.context(request)
319
415
  : options?.context ?? {};
320
- return await createAgUiStreamResponse(agent, parsed, context);
416
+ return await createAgUiDirectStreamResponse(agent, parsed, context);
321
417
  }
322
418
  catch (error) {
323
419
  if (error instanceof z.ZodError) {
@@ -69,6 +69,7 @@ export declare class ErrorCollector {
69
69
  * @param slug Error slug from registry (optional)
70
70
  */
71
71
  addRuntimeError(message: string, stack?: string, context?: Record<string, unknown>, slug?: string): DevError;
72
+ private addFileContextError;
72
73
  /**
73
74
  * Add a bundle error
74
75
  * @param message Error message
@@ -1 +1 @@
1
- {"version":3,"file":"error-collector.d.ts","sourceRoot":"","sources":["../../../src/src/observability/error-collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"error-collector.d.ts","sourceRoot":"","sources":["../../../src/src/observability/error-collector.ts"],"names":[],"mappings":"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"}
@@ -79,6 +79,9 @@ export class ErrorCollector {
79
79
  addRuntimeError(message, stack, context, slug) {
80
80
  return this.addTypedError("runtime", message, { stack, context, slug });
81
81
  }
82
+ addFileContextError(type, message, file, context, slug) {
83
+ return this.addTypedError(type, message, { file, context, slug });
84
+ }
82
85
  /**
83
86
  * Add a bundle error
84
87
  * @param message Error message
@@ -87,7 +90,7 @@ export class ErrorCollector {
87
90
  * @param slug Error slug from registry (optional)
88
91
  */
89
92
  addBundleError(message, file, context, slug) {
90
- return this.addTypedError("bundle", message, { file, context, slug });
93
+ return this.addFileContextError("bundle", message, file, context, slug);
91
94
  }
92
95
  /**
93
96
  * Add an HMR error
@@ -97,7 +100,7 @@ export class ErrorCollector {
97
100
  * @param slug Error slug from registry (optional)
98
101
  */
99
102
  addHMRError(message, file, context, slug) {
100
- return this.addTypedError("hmr", message, { file, context, slug });
103
+ return this.addFileContextError("hmr", message, file, context, slug);
101
104
  }
102
105
  /**
103
106
  * Add a module error
@@ -107,7 +110,7 @@ export class ErrorCollector {
107
110
  * @param slug Error slug from registry (optional)
108
111
  */
109
112
  addModuleError(message, file, context, slug) {
110
- return this.addTypedError("module", message, { file, context, slug });
113
+ return this.addFileContextError("module", message, file, context, slug);
111
114
  }
112
115
  getAll(filter) {
113
116
  const errors = Array.from(this.errors.values());
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.154";
1
+ export declare const VERSION = "0.1.155";
2
2
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.154";
3
+ export const VERSION = "0.1.155";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.154",
3
+ "version": "0.1.155",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
package/src/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.154",
3
+ "version": "0.1.155",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -2,7 +2,14 @@ import * as dntShim from "../../_dnt.shims.js";
2
2
  import { z } from "zod";
3
3
  import { getAgent } from "./composition/index.js";
4
4
  import type { Agent, Message } from "./types.js";
5
+ import {
6
+ AgentRuntime,
7
+ RunAlreadyExistsError,
8
+ type RunResumeSessionManager,
9
+ } from "./runtime/index.js";
5
10
  import { INVALID_ARGUMENT } from "../errors/index.js";
11
+ import { SKILL_TOOL_IDS } from "../skill/types.js";
12
+ import { type Tool, toolRegistry } from "../tool/index.js";
6
13
  import {
7
14
  createStreamTransformState,
8
15
  finalizeRunEvents,
@@ -101,6 +108,7 @@ export type AgUiContextItem = z.infer<typeof AgUiContextItemSchema>;
101
108
  export type AgUiRequest = z.infer<typeof AgUiRequestSchema>;
102
109
 
103
110
  type AgUiRuntimePart = Record<string, unknown> & { type: string };
111
+ type AgUiResumeValue = { result: unknown; isError: boolean };
104
112
 
105
113
  function isRecord(value: unknown): value is Record<string, unknown> {
106
114
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -259,24 +267,29 @@ function enqueueEvent(
259
267
  }
260
268
 
261
269
  async function createAgUiStreamResponse(
262
- agent: Agent,
263
- request: AgUiRequest,
264
- baseContext: Record<string, unknown>,
270
+ options: {
271
+ agentId: string;
272
+ request: AgUiRequest;
273
+ runId: string;
274
+ threadId: string;
275
+ upstreamBody: ReadableStream<Uint8Array> | null;
276
+ upstreamStatus: number;
277
+ upstreamStatusText?: string;
278
+ onFinish?: () => void;
279
+ onError?: (error: unknown) => void;
280
+ },
265
281
  ): Promise<dntShim.Response> {
266
- const threadId = request.threadId ?? dntShim.crypto.randomUUID();
267
- const runId = request.runId ?? generateRunId();
268
-
269
- await agent.clearMemory();
270
-
271
- const result = await agent.stream({
272
- messages: normalizeMessages(request.messages),
273
- context: buildStreamContext(request, baseContext, threadId, runId),
274
- ...(request.model ? { model: request.model } : {}),
275
- ...(request.maxOutputTokens ? { maxOutputTokens: request.maxOutputTokens } : {}),
276
- });
277
-
278
- const upstream = result.toDataStreamResponse();
279
- const upstreamBody = upstream.body;
282
+ const {
283
+ agentId,
284
+ request,
285
+ runId,
286
+ threadId,
287
+ upstreamBody,
288
+ upstreamStatus,
289
+ upstreamStatusText,
290
+ onFinish,
291
+ onError,
292
+ } = options;
280
293
 
281
294
  const stream = new ReadableStream<Uint8Array>({
282
295
  start: async (controller) => {
@@ -285,7 +298,7 @@ async function createAgUiStreamResponse(
285
298
  let remainder = "";
286
299
  const decoder = new TextDecoder();
287
300
 
288
- if (!enqueueEvent(controller, "RunStarted", { runId, threadId, agentId: agent.id })) {
301
+ if (!enqueueEvent(controller, "RunStarted", { runId, threadId, agentId })) {
289
302
  return;
290
303
  }
291
304
  if (!enqueueEvent(controller, "StateSnapshot", { snapshot: {} })) {
@@ -302,6 +315,7 @@ async function createAgUiStreamResponse(
302
315
  return;
303
316
  }
304
317
  }
318
+ onFinish?.();
305
319
  closeController(controller);
306
320
  return;
307
321
  }
@@ -340,7 +354,9 @@ async function createAgUiStreamResponse(
340
354
  return;
341
355
  }
342
356
  }
357
+ onFinish?.();
343
358
  } catch (error) {
359
+ onError?.(error);
344
360
  enqueueEvent(controller, "RunError", {
345
361
  message: error instanceof Error ? error.message : "Agent run failed",
346
362
  });
@@ -352,16 +368,147 @@ async function createAgUiStreamResponse(
352
368
  });
353
369
 
354
370
  return new dntShim.Response(stream, {
355
- status: upstream.status,
356
- statusText: upstream.statusText,
371
+ status: upstreamStatus,
372
+ statusText: upstreamStatusText,
357
373
  headers: { ...AG_UI_HEADERS },
358
374
  });
359
375
  }
360
376
 
377
+ async function createAgUiDirectStreamResponse(
378
+ agent: Agent,
379
+ request: AgUiRequest,
380
+ baseContext: Record<string, unknown>,
381
+ ): Promise<dntShim.Response> {
382
+ const threadId = request.threadId ?? dntShim.crypto.randomUUID();
383
+ const runId = request.runId ?? generateRunId();
384
+
385
+ await agent.clearMemory();
386
+
387
+ const result = await agent.stream({
388
+ messages: normalizeMessages(request.messages),
389
+ context: buildStreamContext(request, baseContext, threadId, runId),
390
+ ...(request.model ? { model: request.model } : {}),
391
+ ...(request.maxOutputTokens ? { maxOutputTokens: request.maxOutputTokens } : {}),
392
+ });
393
+
394
+ const upstream = result.toDataStreamResponse();
395
+ return await createAgUiStreamResponse({
396
+ agentId: agent.id,
397
+ request,
398
+ runId,
399
+ threadId,
400
+ upstreamBody: upstream.body,
401
+ upstreamStatus: upstream.status,
402
+ upstreamStatusText: upstream.statusText,
403
+ });
404
+ }
405
+
406
+ function createInjectedAgUiTool(
407
+ runId: string,
408
+ tool: AgUiInjectedTool,
409
+ sessionManager: RunResumeSessionManager<AgUiResumeValue>,
410
+ ): Tool {
411
+ return {
412
+ id: tool.name,
413
+ type: "function",
414
+ description: tool.description ?? tool.name,
415
+ inputSchema: z.record(z.string(), z.unknown()),
416
+ inputSchemaJson: (tool.parameters ??
417
+ { type: "object", properties: {}, additionalProperties: true }) as Tool["inputSchemaJson"],
418
+ execute: async (_input, context) => {
419
+ const toolCallId = typeof context?.toolCallId === "string" ? context.toolCallId : null;
420
+ if (!toolCallId) {
421
+ throw new Error(`Missing toolCallId for injected tool "${tool.name}"`);
422
+ }
423
+
424
+ const submitted = await sessionManager.waitForSignal(runId, toolCallId);
425
+ if (submitted.isError) {
426
+ throw new Error(
427
+ typeof submitted.result === "string"
428
+ ? submitted.result
429
+ : JSON.stringify(submitted.result),
430
+ );
431
+ }
432
+ return submitted.result;
433
+ },
434
+ };
435
+ }
436
+
437
+ async function createAgUiInjectedToolsStreamResponse(
438
+ agent: Agent,
439
+ request: AgUiRequest,
440
+ baseContext: Record<string, unknown>,
441
+ sessionManager: RunResumeSessionManager<AgUiResumeValue>,
442
+ ): Promise<dntShim.Response> {
443
+ const threadId = request.threadId ?? dntShim.crypto.randomUUID();
444
+ const runId = request.runId ?? generateRunId();
445
+
446
+ try {
447
+ sessionManager.startRun({ runId, threadId });
448
+ } catch (error) {
449
+ if (error instanceof RunAlreadyExistsError) {
450
+ return dntShim.Response.json({ error: "Run already active" }, { status: 409 });
451
+ }
452
+ throw error;
453
+ }
454
+
455
+ const injectedTools = Object.fromEntries(
456
+ request.tools.map((tool) => [tool.name, createInjectedAgUiTool(runId, tool, sessionManager)]),
457
+ );
458
+
459
+ const mergedTools: Agent["config"]["tools"] = !agent.config.tools
460
+ ? injectedTools
461
+ : agent.config.tools === true
462
+ ? {
463
+ ...Object.fromEntries(
464
+ [...toolRegistry.getAll()]
465
+ .filter(([toolId]) => agent.config.skills || !SKILL_TOOL_IDS.has(toolId))
466
+ .map(([toolId]) => [toolId, true]),
467
+ ),
468
+ ...injectedTools,
469
+ }
470
+ : { ...agent.config.tools, ...injectedTools };
471
+
472
+ const runtime = new AgentRuntime(agent.id, {
473
+ ...agent.config,
474
+ tools: mergedTools,
475
+ });
476
+
477
+ let upstreamBody: ReadableStream<Uint8Array>;
478
+ try {
479
+ upstreamBody = await runtime.stream(
480
+ normalizeMessages(request.messages),
481
+ buildStreamContext(request, baseContext, threadId, runId),
482
+ undefined,
483
+ request.model,
484
+ request.maxOutputTokens,
485
+ );
486
+ } catch (error) {
487
+ sessionManager.failRun(runId);
488
+ throw error;
489
+ }
490
+
491
+ return await createAgUiStreamResponse({
492
+ agentId: agent.id,
493
+ request,
494
+ runId,
495
+ threadId,
496
+ upstreamBody,
497
+ upstreamStatus: 200,
498
+ onFinish: () => {
499
+ sessionManager.completeRun(runId);
500
+ },
501
+ onError: () => {
502
+ sessionManager.failRun(runId);
503
+ },
504
+ });
505
+ }
506
+
361
507
  export interface AgUiHandlerOptions {
362
508
  context?:
363
509
  | Record<string, unknown>
364
510
  | ((request: dntShim.Request) => Record<string, unknown> | Promise<Record<string, unknown>>);
511
+ sessionManager?: RunResumeSessionManager<AgUiResumeValue>;
365
512
  }
366
513
 
367
514
  export interface AgUiHandlerConfigWithAgent extends AgUiHandlerOptions {
@@ -418,12 +565,25 @@ export function createAgUiHandler(
418
565
  const parsed = AgUiRequestSchema.parse(await request.json());
419
566
 
420
567
  if (parsed.tools.length > 0) {
421
- return dntShim.Response.json(
422
- {
423
- error:
424
- "Injected AG-UI tools are not supported by createAgUiHandler yet. Use package-level wait/resume runtime primitives instead.",
425
- },
426
- { status: 501 },
568
+ if (!options?.sessionManager) {
569
+ return dntShim.Response.json(
570
+ {
571
+ error:
572
+ "Injected AG-UI tools require a public RunResumeSessionManager on createAgUiHandler().",
573
+ },
574
+ { status: 501 },
575
+ );
576
+ }
577
+
578
+ const context = typeof options?.context === "function"
579
+ ? await options.context(request)
580
+ : options?.context ?? {};
581
+
582
+ return await createAgUiInjectedToolsStreamResponse(
583
+ agent,
584
+ parsed,
585
+ context,
586
+ options.sessionManager,
427
587
  );
428
588
  }
429
589
 
@@ -431,7 +591,7 @@ export function createAgUiHandler(
431
591
  ? await options.context(request)
432
592
  : options?.context ?? {};
433
593
 
434
- return await createAgUiStreamResponse(agent, parsed, context);
594
+ return await createAgUiDirectStreamResponse(agent, parsed, context);
435
595
  } catch (error) {
436
596
  if (error instanceof z.ZodError) {
437
597
  return dntShim.Response.json(
@@ -150,6 +150,16 @@ export class ErrorCollector {
150
150
  return this.addTypedError("runtime", message, { stack, context, slug });
151
151
  }
152
152
 
153
+ private addFileContextError(
154
+ type: "bundle" | "hmr" | "module",
155
+ message: string,
156
+ file?: string,
157
+ context?: Record<string, unknown>,
158
+ slug?: string,
159
+ ): DevError {
160
+ return this.addTypedError(type, message, { file, context, slug });
161
+ }
162
+
153
163
  /**
154
164
  * Add a bundle error
155
165
  * @param message Error message
@@ -163,7 +173,7 @@ export class ErrorCollector {
163
173
  context?: Record<string, unknown>,
164
174
  slug?: string,
165
175
  ): DevError {
166
- return this.addTypedError("bundle", message, { file, context, slug });
176
+ return this.addFileContextError("bundle", message, file, context, slug);
167
177
  }
168
178
 
169
179
  /**
@@ -179,7 +189,7 @@ export class ErrorCollector {
179
189
  context?: Record<string, unknown>,
180
190
  slug?: string,
181
191
  ): DevError {
182
- return this.addTypedError("hmr", message, { file, context, slug });
192
+ return this.addFileContextError("hmr", message, file, context, slug);
183
193
  }
184
194
 
185
195
  /**
@@ -195,7 +205,7 @@ export class ErrorCollector {
195
205
  context?: Record<string, unknown>,
196
206
  slug?: string,
197
207
  ): DevError {
198
- return this.addTypedError("module", message, { file, context, slug });
208
+ return this.addFileContextError("module", message, file, context, slug);
199
209
  }
200
210
 
201
211
  getAll(filter?: ErrorFilter): DevError[] {
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.154";
3
+ export const VERSION = "0.1.155";