veryfront 0.1.222 → 0.1.224

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.222",
3
+ "version": "0.1.224",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "workspace": [
@@ -55,6 +55,12 @@ export declare const AgUiDetachedStartAcceptedSchema: z.ZodObject<{
55
55
  }, z.core.$strip>;
56
56
  export type AgUiDetachedStartRequest = z.infer<typeof AgUiDetachedStartRequestSchema>;
57
57
  export type AgUiDetachedStartAccepted = z.infer<typeof AgUiDetachedStartAcceptedSchema>;
58
+ export interface ExecuteAgUiDetachedStartInput {
59
+ request: AgUiDetachedStartRequest;
60
+ rawRequest?: Request;
61
+ requestOrCtx?: unknown;
62
+ context?: Record<string, unknown>;
63
+ }
58
64
  interface AgUiDetachedStartExecutionInput {
59
65
  request: AgUiDetachedStartRequest;
60
66
  requestOrCtx: unknown;
@@ -93,6 +99,7 @@ export type AgUiDetachedStartHandlerOptions = (AgUiDetachedStartHandlerOptionsBa
93
99
  agent?: undefined;
94
100
  startDetachedExecution: AgUiDetachedExecutionStarter;
95
101
  });
102
+ export declare function executeAgUiDetachedStart(options: AgUiDetachedStartHandlerOptions, input: ExecuteAgUiDetachedStartInput): Promise<Response>;
96
103
  export declare function createAgUiDetachedStartHandler(options: AgUiDetachedStartHandlerOptions): (requestOrCtx: unknown) => Promise<Response>;
97
104
  export {};
98
105
  //# sourceMappingURL=ag-ui-detached-start.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ag-ui-detached-start.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-detached-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,KAAK,gBAAgB,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AA8IvF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGzC,CAAC;AAEH,eAAO,MAAM,+BAA+B;;;;;iBAK1C,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACtF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,UAAU,+BAA+B;IACvC,OAAO,EAAE,wBAAwB,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,KAAK,4BAA4B,GAAG,CAClC,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,UAAU,mCAAmC;IAC3C,cAAc,EAAE,uBAAuB,CAAC,eAAe,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,sBAAsB,CAAC,EAAE,4BAA4B,CAAC;IACtD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QACnB,OAAO,EAAE,wBAAwB,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QACpB,OAAO,EAAE,wBAAwB,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAChF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAChG;AAED,MAAM,MAAM,+BAA+B,GACvC,CAAC,mCAAmC,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,GACxD,CAAC,mCAAmC,GAAG;IACvC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sBAAsB,EAAE,4BAA4B,CAAC;CACtD,CAAC,CAAC;AA0BL,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,+BAA+B,GACvC,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAwH9C"}
1
+ {"version":3,"file":"ag-ui-detached-start.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-detached-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,KAAK,gBAAgB,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAmIvF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGzC,CAAC;AAEH,eAAO,MAAM,+BAA+B;;;;;iBAK1C,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACtF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,wBAAwB,CAAC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,UAAU,+BAA+B;IACvC,OAAO,EAAE,wBAAwB,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,KAAK,4BAA4B,GAAG,CAClC,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,UAAU,mCAAmC;IAC3C,cAAc,EAAE,uBAAuB,CAAC,eAAe,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,sBAAsB,CAAC,EAAE,4BAA4B,CAAC;IACtD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QACnB,OAAO,EAAE,wBAAwB,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QACpB,OAAO,EAAE,wBAAwB,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAChF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAChG;AAED,MAAM,MAAM,+BAA+B,GACvC,CAAC,mCAAmC,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,GACxD,CAAC,mCAAmC,GAAG;IACvC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sBAAsB,EAAE,4BAA4B,CAAC;CACtD,CAAC,CAAC;AAqEL,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,EACxC,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,QAAQ,CAAC,CAwFnB;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,+BAA+B,GACvC,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAuC9C"}
@@ -84,12 +84,6 @@ function buildMergedTools(agent, request, sessionManager) {
84
84
  }
85
85
  return { ...agent.config.tools, ...injectedTools };
86
86
  }
87
- async function resolveContextValue(value, request) {
88
- if (typeof value === "function") {
89
- return await value(request);
90
- }
91
- return value ?? {};
92
- }
93
87
  function scheduleDetachedTask(requestOrCtx, task) {
94
88
  if (typeof requestOrCtx === "object" &&
95
89
  requestOrCtx !== null &&
@@ -123,6 +117,111 @@ async function startDefaultDetachedExecution(input) {
123
117
  const runtimeStream = await runtime.stream(normalizeAgUiMessages(input.request.messages), buildStreamContext(input.request, input.context, input.request.threadId, input.request.runId), undefined, input.request.model, input.request.maxOutputTokens, input.abortSignal);
124
118
  await drainRuntimeStream(runtimeStream);
125
119
  }
120
+ async function resolveDetachedStartContext(options, input) {
121
+ if (input.context) {
122
+ return input.context;
123
+ }
124
+ if (!options.context) {
125
+ return {};
126
+ }
127
+ if (typeof options.context === "function") {
128
+ if (!input.rawRequest) {
129
+ throw INVALID_ARGUMENT.create({
130
+ detail: "executeAgUiDetachedStart requires rawRequest when options.context is a function.",
131
+ });
132
+ }
133
+ return await options.context(input.rawRequest);
134
+ }
135
+ return options.context;
136
+ }
137
+ function assertDetachedStartRawRequest(options, input) {
138
+ if (!options.startDetachedExecution) {
139
+ return input.rawRequest;
140
+ }
141
+ if (input.rawRequest) {
142
+ return input.rawRequest;
143
+ }
144
+ throw INVALID_ARGUMENT.create({
145
+ detail: "executeAgUiDetachedStart requires rawRequest when options.startDetachedExecution is used.",
146
+ });
147
+ }
148
+ export async function executeAgUiDetachedStart(options, input) {
149
+ const rawRequest = assertDetachedStartRawRequest(options, input);
150
+ const context = await resolveDetachedStartContext(options, input);
151
+ try {
152
+ const abortSignal = options.sessionManager.startRun({
153
+ runId: input.request.runId,
154
+ threadId: input.request.threadId,
155
+ });
156
+ await options.onAccepted?.({
157
+ request: input.request,
158
+ runId: input.request.runId,
159
+ threadId: input.request.threadId,
160
+ });
161
+ const detachedTask = (async () => {
162
+ try {
163
+ if (options.startDetachedExecution) {
164
+ await options.startDetachedExecution({
165
+ request: input.request,
166
+ requestOrCtx: input.requestOrCtx,
167
+ rawRequest: rawRequest,
168
+ context,
169
+ abortSignal,
170
+ });
171
+ }
172
+ else if (options.agent) {
173
+ await startDefaultDetachedExecution({
174
+ agent: options.agent,
175
+ request: input.request,
176
+ context,
177
+ abortSignal,
178
+ sessionManager: options.sessionManager,
179
+ });
180
+ }
181
+ else {
182
+ throw new Error("Detached AG-UI start configuration became invalid during execution.");
183
+ }
184
+ options.sessionManager.completeRun(input.request.runId);
185
+ await options.onFinish?.({
186
+ runId: input.request.runId,
187
+ threadId: input.request.threadId,
188
+ });
189
+ }
190
+ catch (error) {
191
+ options.sessionManager.failRun(input.request.runId);
192
+ await options.onError?.({
193
+ runId: input.request.runId,
194
+ threadId: input.request.threadId,
195
+ error,
196
+ });
197
+ }
198
+ })().catch(() => undefined);
199
+ scheduleDetachedTask(input.requestOrCtx, detachedTask);
200
+ return Response.json({
201
+ accepted: true,
202
+ duplicate: false,
203
+ runId: input.request.runId,
204
+ threadId: input.request.threadId,
205
+ }, { status: 202 });
206
+ }
207
+ catch (error) {
208
+ if (error instanceof RunAlreadyExistsError) {
209
+ await options.onDuplicate?.({
210
+ request: input.request,
211
+ runId: input.request.runId,
212
+ threadId: input.request.threadId,
213
+ });
214
+ return Response.json({
215
+ accepted: true,
216
+ duplicate: true,
217
+ runId: input.request.runId,
218
+ threadId: input.request.threadId,
219
+ }, { status: 202 });
220
+ }
221
+ options.sessionManager.failRun(input.request.runId);
222
+ throw error;
223
+ }
224
+ }
126
225
  export function createAgUiDetachedStartHandler(options) {
127
226
  if (!options.agent && !options.startDetachedExecution) {
128
227
  throw new Error("Detached AG-UI start requires either an agent or startDetachedExecution handler.");
@@ -131,80 +230,11 @@ export function createAgUiDetachedStartHandler(options) {
131
230
  const request = extractRequest(requestOrCtx);
132
231
  try {
133
232
  const parsed = AgUiDetachedStartRequestSchema.parse(await request.json());
134
- const context = await resolveContextValue(options.context, request);
135
- try {
136
- const abortSignal = options.sessionManager.startRun({
137
- runId: parsed.runId,
138
- threadId: parsed.threadId,
139
- });
140
- await options.onAccepted?.({
141
- request: parsed,
142
- runId: parsed.runId,
143
- threadId: parsed.threadId,
144
- });
145
- const detachedTask = (async () => {
146
- try {
147
- if (options.startDetachedExecution) {
148
- await options.startDetachedExecution({
149
- request: parsed,
150
- requestOrCtx,
151
- rawRequest: request,
152
- context,
153
- abortSignal,
154
- });
155
- }
156
- else if (options.agent) {
157
- await startDefaultDetachedExecution({
158
- agent: options.agent,
159
- request: parsed,
160
- context,
161
- abortSignal,
162
- sessionManager: options.sessionManager,
163
- });
164
- }
165
- else {
166
- throw new Error("Detached AG-UI start configuration became invalid during execution.");
167
- }
168
- options.sessionManager.completeRun(parsed.runId);
169
- await options.onFinish?.({
170
- runId: parsed.runId,
171
- threadId: parsed.threadId,
172
- });
173
- }
174
- catch (error) {
175
- options.sessionManager.failRun(parsed.runId);
176
- await options.onError?.({
177
- runId: parsed.runId,
178
- threadId: parsed.threadId,
179
- error,
180
- });
181
- }
182
- })().catch(() => undefined);
183
- scheduleDetachedTask(requestOrCtx, detachedTask);
184
- return Response.json({
185
- accepted: true,
186
- duplicate: false,
187
- runId: parsed.runId,
188
- threadId: parsed.threadId,
189
- }, { status: 202 });
190
- }
191
- catch (error) {
192
- if (error instanceof RunAlreadyExistsError) {
193
- await options.onDuplicate?.({
194
- request: parsed,
195
- runId: parsed.runId,
196
- threadId: parsed.threadId,
197
- });
198
- return Response.json({
199
- accepted: true,
200
- duplicate: true,
201
- runId: parsed.runId,
202
- threadId: parsed.threadId,
203
- }, { status: 202 });
204
- }
205
- options.sessionManager.failRun(parsed.runId);
206
- throw error;
207
- }
233
+ return await executeAgUiDetachedStart(options, {
234
+ request: parsed,
235
+ rawRequest: request,
236
+ requestOrCtx,
237
+ });
208
238
  }
209
239
  catch (error) {
210
240
  if (error instanceof z.ZodError) {
@@ -0,0 +1,29 @@
1
+ import { type RunResumeSessionManager } from "./runtime/index.js";
2
+ import type { Agent } from "./types.js";
3
+ import { type AgUiRuntimeRequest } from "./runtime-ag-ui-contract.js";
4
+ type AgUiResumeValue = {
5
+ result: unknown;
6
+ isError: boolean;
7
+ };
8
+ export interface AgUiRuntimeHandlerExecuteInput {
9
+ request: Request;
10
+ agUiInput: AgUiRuntimeRequest;
11
+ context: Record<string, unknown>;
12
+ createDefaultResponse?: () => Promise<Response>;
13
+ }
14
+ export type AgUiRuntimeHandlerExecute = (input: AgUiRuntimeHandlerExecuteInput) => Promise<Response> | Response;
15
+ export interface AgUiRuntimeHandlerOptions {
16
+ context?: Record<string, unknown> | ((request: Request) => Record<string, unknown> | Promise<Record<string, unknown>>);
17
+ sessionManager?: RunResumeSessionManager<AgUiResumeValue>;
18
+ execute?: AgUiRuntimeHandlerExecute;
19
+ }
20
+ export interface AgUiRuntimeHandlerConfigWithAgent extends AgUiRuntimeHandlerOptions {
21
+ agent: Agent;
22
+ }
23
+ export type AgUiRuntimeHandlerConfig = AgUiRuntimeHandlerConfigWithAgent | (AgUiRuntimeHandlerOptions & {
24
+ agent?: undefined;
25
+ execute: AgUiRuntimeHandlerExecute;
26
+ });
27
+ export declare function createAgUiRuntimeHandler(config: AgUiRuntimeHandlerConfig): (requestOrCtx: unknown) => Promise<Response>;
28
+ export {};
29
+ //# sourceMappingURL=ag-ui-runtime-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ag-ui-runtime-handler.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-runtime-handler.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,6BAA6B,CAAC;AAgBrC,KAAK,eAAe,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AA2T7D,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;CACjD;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,KAAK,EAAE,8BAA8B,KAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;AAElC,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACvF,cAAc,CAAC,EAAE,uBAAuB,CAAC,eAAe,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE,yBAAyB,CAAC;CACrC;AAED,MAAM,WAAW,iCAAkC,SAAQ,yBAAyB;IAClF,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,MAAM,wBAAwB,GAChC,iCAAiC,GACjC,CAAC,yBAAyB,GAAG;IAAE,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,yBAAyB,CAAA;CAAE,CAAC,CAAC;AAE5F,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA8E9C"}
@@ -0,0 +1,291 @@
1
+ import { z } from "zod";
2
+ import { INVALID_ARGUMENT } from "../errors/index.js";
3
+ import { SKILL_TOOL_IDS } from "../skill/types.js";
4
+ import { toolRegistry } from "../tool/index.js";
5
+ import { AgentRuntime, RunAlreadyExistsError, } from "./runtime/index.js";
6
+ import { parseAgUiRuntimeRequestOrError, } from "./runtime-ag-ui-contract.js";
7
+ import { normalizeAgUiRuntimeMessages } from "./ag-ui-runtime-support.js";
8
+ import { createStreamTransformState, finalizeRunEvents, formatAgUiEvent, mapRuntimeEventToAgUi, } from "../internal-agents/ag-ui-sse.js";
9
+ import { streamDataStreamEvents } from "./data-stream.js";
10
+ const AG_UI_HEADERS = {
11
+ "Content-Type": "text/event-stream",
12
+ "Cache-Control": "no-cache",
13
+ Connection: "keep-alive",
14
+ };
15
+ function isRequest(obj) {
16
+ return (typeof obj === "object" &&
17
+ obj !== null &&
18
+ "json" in obj &&
19
+ typeof obj.json === "function" &&
20
+ "url" in obj &&
21
+ typeof obj.url === "string" &&
22
+ "method" in obj &&
23
+ typeof obj.method === "string");
24
+ }
25
+ function isRecord(value) {
26
+ return typeof value === "object" && value !== null && !Array.isArray(value);
27
+ }
28
+ function extractRequest(requestOrCtx) {
29
+ if (isRequest(requestOrCtx))
30
+ return requestOrCtx;
31
+ if (typeof requestOrCtx === "object" && requestOrCtx !== null && "request" in requestOrCtx) {
32
+ const candidate = requestOrCtx.request;
33
+ if (isRequest(candidate))
34
+ return candidate;
35
+ }
36
+ throw INVALID_ARGUMENT.create({
37
+ detail: "Invalid handler argument: expected Request or APIContext",
38
+ });
39
+ }
40
+ function buildStreamContext(request, baseContext) {
41
+ return {
42
+ ...baseContext,
43
+ threadId: request.threadId,
44
+ runId: request.runId,
45
+ agUi: {
46
+ context: request.context,
47
+ forwardedProps: request.forwardedProps,
48
+ },
49
+ };
50
+ }
51
+ function closeController(controller) {
52
+ try {
53
+ controller.close();
54
+ }
55
+ catch {
56
+ return;
57
+ }
58
+ }
59
+ function enqueueEvent(controller, event, payload) {
60
+ try {
61
+ controller.enqueue(formatAgUiEvent(event, payload));
62
+ return true;
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ async function createAgUiRuntimeStreamResponse(options) {
69
+ const { agentId, request, upstreamBody, upstreamStatus, upstreamStatusText, onFinish, onError, onToolCallSeen, } = options;
70
+ const stream = new ReadableStream({
71
+ start: async (controller) => {
72
+ const state = createStreamTransformState();
73
+ const prepareToolResultIfNeeded = (event, payload) => {
74
+ if (event !== "ToolCallStart" && event !== "ToolCallArgs" &&
75
+ event !== "ToolCallEnd") {
76
+ return;
77
+ }
78
+ const toolCallId = typeof payload.toolCallId === "string" ? payload.toolCallId : null;
79
+ if (toolCallId) {
80
+ onToolCallSeen?.(toolCallId);
81
+ }
82
+ };
83
+ if (!enqueueEvent(controller, "RunStarted", {
84
+ runId: request.runId,
85
+ threadId: request.threadId,
86
+ agentId,
87
+ })) {
88
+ return;
89
+ }
90
+ if (!enqueueEvent(controller, "StateSnapshot", {
91
+ snapshot: isRecord(request.state) ? request.state : {},
92
+ })) {
93
+ return;
94
+ }
95
+ if (!enqueueEvent(controller, "MessagesSnapshot", {
96
+ messages: normalizeAgUiRuntimeMessages(request.messages),
97
+ })) {
98
+ return;
99
+ }
100
+ try {
101
+ if (!upstreamBody) {
102
+ for (const event of finalizeRunEvents(state, null)) {
103
+ if (!enqueueEvent(controller, event.event, event.payload)) {
104
+ return;
105
+ }
106
+ }
107
+ onFinish?.();
108
+ closeController(controller);
109
+ return;
110
+ }
111
+ for await (const event of streamDataStreamEvents(upstreamBody)) {
112
+ for (const mapped of mapRuntimeEventToAgUi(state, event)) {
113
+ prepareToolResultIfNeeded(mapped.event, mapped.payload);
114
+ if (!enqueueEvent(controller, mapped.event, mapped.payload)) {
115
+ return;
116
+ }
117
+ }
118
+ }
119
+ for (const event of finalizeRunEvents(state, null)) {
120
+ if (!enqueueEvent(controller, event.event, event.payload)) {
121
+ return;
122
+ }
123
+ }
124
+ onFinish?.();
125
+ }
126
+ catch (error) {
127
+ onError?.(error);
128
+ enqueueEvent(controller, "RunError", {
129
+ message: error instanceof Error ? error.message : "Agent run failed",
130
+ });
131
+ }
132
+ finally {
133
+ closeController(controller);
134
+ }
135
+ },
136
+ });
137
+ return new Response(stream, {
138
+ status: upstreamStatus,
139
+ statusText: upstreamStatusText,
140
+ headers: { ...AG_UI_HEADERS },
141
+ });
142
+ }
143
+ async function createAgUiRuntimeDirectStreamResponse(agent, request, baseContext) {
144
+ await agent.clearMemory();
145
+ const result = await agent.stream({
146
+ messages: normalizeAgUiRuntimeMessages(request.messages),
147
+ context: buildStreamContext(request, baseContext),
148
+ });
149
+ const upstream = result.toDataStreamResponse();
150
+ return await createAgUiRuntimeStreamResponse({
151
+ agentId: agent.id,
152
+ request,
153
+ upstreamBody: upstream.body,
154
+ upstreamStatus: upstream.status,
155
+ upstreamStatusText: upstream.statusText,
156
+ });
157
+ }
158
+ function createInjectedAgUiTool(runId, tool, sessionManager) {
159
+ return {
160
+ id: tool.name,
161
+ type: "function",
162
+ description: tool.description ?? tool.name,
163
+ inputSchema: z.record(z.string(), z.unknown()),
164
+ inputSchemaJson: (tool.parameters ??
165
+ { type: "object", properties: {}, additionalProperties: true }),
166
+ execute: async (_input, context) => {
167
+ const toolCallId = typeof context?.toolCallId === "string" ? context.toolCallId : null;
168
+ if (!toolCallId) {
169
+ throw new Error(`Missing toolCallId for injected tool "${tool.name}"`);
170
+ }
171
+ sessionManager.prepareForSignal(runId, toolCallId);
172
+ const submitted = await sessionManager.waitForSignal(runId, toolCallId);
173
+ if (submitted.isError) {
174
+ throw new Error(typeof submitted.result === "string"
175
+ ? submitted.result
176
+ : JSON.stringify(submitted.result));
177
+ }
178
+ return submitted.result;
179
+ },
180
+ };
181
+ }
182
+ function buildMergedTools(agent, request, sessionManager) {
183
+ const injectedTools = Object.fromEntries(request.tools.map((tool) => [
184
+ tool.name,
185
+ createInjectedAgUiTool(request.runId, tool, sessionManager),
186
+ ]));
187
+ if (!agent.config.tools) {
188
+ return Object.keys(injectedTools).length > 0 ? injectedTools : undefined;
189
+ }
190
+ if (agent.config.tools === true) {
191
+ const merged = {};
192
+ for (const [toolId] of toolRegistry.getAll()) {
193
+ if (!agent.config.skills && SKILL_TOOL_IDS.has(toolId)) {
194
+ continue;
195
+ }
196
+ merged[toolId] = true;
197
+ }
198
+ return { ...merged, ...injectedTools };
199
+ }
200
+ return { ...agent.config.tools, ...injectedTools };
201
+ }
202
+ async function createAgUiRuntimeInjectedToolsStreamResponse(agent, request, baseContext, sessionManager) {
203
+ try {
204
+ sessionManager.startRun({ runId: request.runId, threadId: request.threadId });
205
+ }
206
+ catch (error) {
207
+ if (error instanceof RunAlreadyExistsError) {
208
+ return Response.json({ error: "Run already active" }, { status: 409 });
209
+ }
210
+ throw error;
211
+ }
212
+ const runtime = new AgentRuntime(agent.id, {
213
+ ...agent.config,
214
+ tools: buildMergedTools(agent, request, sessionManager),
215
+ });
216
+ let upstreamBody;
217
+ try {
218
+ upstreamBody = await runtime.stream(normalizeAgUiRuntimeMessages(request.messages), buildStreamContext(request, baseContext), undefined, undefined, undefined);
219
+ }
220
+ catch (error) {
221
+ sessionManager.failRun(request.runId);
222
+ throw error;
223
+ }
224
+ return await createAgUiRuntimeStreamResponse({
225
+ agentId: agent.id,
226
+ request,
227
+ upstreamBody,
228
+ upstreamStatus: 200,
229
+ onFinish: () => {
230
+ sessionManager.completeRun(request.runId);
231
+ },
232
+ onError: () => {
233
+ sessionManager.failRun(request.runId);
234
+ },
235
+ onToolCallSeen: (toolCallId) => {
236
+ sessionManager.prepareForSignal(request.runId, toolCallId);
237
+ },
238
+ });
239
+ }
240
+ export function createAgUiRuntimeHandler(config) {
241
+ if (!config.agent && !config.execute) {
242
+ throw new Error("createAgUiRuntimeHandler requires either an agent or an execute handler.");
243
+ }
244
+ return async function POST(requestOrCtx) {
245
+ const request = extractRequest(requestOrCtx);
246
+ try {
247
+ const parsed = await parseAgUiRuntimeRequestOrError(request);
248
+ if (parsed instanceof Response) {
249
+ return parsed;
250
+ }
251
+ const context = typeof config.context === "function"
252
+ ? await config.context(request)
253
+ : config.context ?? {};
254
+ const createDefaultResponse = config.agent
255
+ ? () => parsed.tools.length > 0
256
+ ? config.sessionManager
257
+ ? createAgUiRuntimeInjectedToolsStreamResponse(config.agent, parsed, context, config.sessionManager)
258
+ : Promise.resolve(Response.json({
259
+ error: "Injected AG-UI tools require a public RunResumeSessionManager on createAgUiRuntimeHandler().",
260
+ }, { status: 501 }))
261
+ : createAgUiRuntimeDirectStreamResponse(config.agent, parsed, context)
262
+ : undefined;
263
+ if (config.execute) {
264
+ return await config.execute({
265
+ request,
266
+ agUiInput: parsed,
267
+ context,
268
+ createDefaultResponse,
269
+ });
270
+ }
271
+ if (createDefaultResponse) {
272
+ return await createDefaultResponse();
273
+ }
274
+ throw new Error("createAgUiRuntimeHandler configuration became invalid during execution.");
275
+ }
276
+ catch (error) {
277
+ if (error instanceof z.ZodError) {
278
+ return Response.json({
279
+ error: "Invalid AG-UI runtime request",
280
+ details: error.issues.map((issue) => ({
281
+ path: issue.path,
282
+ message: issue.message,
283
+ })),
284
+ }, { status: 400 });
285
+ }
286
+ return Response.json({
287
+ error: error instanceof Error ? error.message : "Internal server error",
288
+ }, { status: 500 });
289
+ }
290
+ };
291
+ }
@@ -0,0 +1,4 @@
1
+ import type { Message } from "./types.js";
2
+ import type { AgUiRuntimeRequest } from "./runtime-ag-ui-contract.js";
3
+ export declare function normalizeAgUiRuntimeMessages(messages: AgUiRuntimeRequest["messages"]): Message[];
4
+ //# sourceMappingURL=ag-ui-runtime-support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ag-ui-runtime-support.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-runtime-support.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAetE,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,GACvC,OAAO,EAAE,CA6CX"}
@@ -0,0 +1,56 @@
1
+ function isRecord(value) {
2
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3
+ }
4
+ function parseToolArguments(serializedArguments) {
5
+ try {
6
+ const parsed = JSON.parse(serializedArguments);
7
+ return isRecord(parsed) ? parsed : {};
8
+ }
9
+ catch {
10
+ return {};
11
+ }
12
+ }
13
+ export function normalizeAgUiRuntimeMessages(messages) {
14
+ return messages.map((message) => {
15
+ const parts = [];
16
+ switch (message.role) {
17
+ case "system":
18
+ case "user":
19
+ parts.push({ type: "text", text: message.content });
20
+ break;
21
+ case "assistant":
22
+ if (typeof message.content === "string" && message.content.length > 0) {
23
+ parts.push({ type: "text", text: message.content });
24
+ }
25
+ for (const toolCall of message.toolCalls ?? []) {
26
+ parts.push({
27
+ type: "tool-call",
28
+ toolCallId: toolCall.id,
29
+ toolName: toolCall.function.name,
30
+ args: parseToolArguments(toolCall.function.arguments),
31
+ });
32
+ }
33
+ break;
34
+ case "tool":
35
+ parts.push({
36
+ type: "tool-result",
37
+ toolCallId: message.toolCallId,
38
+ toolName: "unknown",
39
+ result: message.error
40
+ ? {
41
+ content: message.content,
42
+ error: message.error,
43
+ }
44
+ : message.content,
45
+ });
46
+ break;
47
+ }
48
+ return {
49
+ id: message.id,
50
+ role: message.role,
51
+ parts,
52
+ ...(message.createdAt ? { timestamp: Date.parse(message.createdAt) || undefined } : {}),
53
+ ...(message.metadata ? { metadata: message.metadata } : {}),
54
+ };
55
+ });
56
+ }
@@ -84,11 +84,13 @@ export { getTextFromParts, getToolArguments, hasArgs, hasInput } from "./types.j
84
84
  export { BufferMemory, ConversationMemory, createMemory, createRedisMemory, type Memory, type MemoryPersistence, type MemoryStats, type RedisClient, RedisMemory, type RedisMemoryConfig, SummaryMemory, } from "./memory/index.js";
85
85
  export { agentAsTool, createWorkflow, getAgent, getAgentsAsTools, getAllAgentIds, registerAgent, type WorkflowConfig, type WorkflowResult, type WorkflowStep, } from "./composition/index.js";
86
86
  export { agent } from "./factory.js";
87
+ export { type AgUiRuntimeHandlerConfig, type AgUiRuntimeHandlerConfigWithAgent, type AgUiRuntimeHandlerExecute, type AgUiRuntimeHandlerExecuteInput, type AgUiRuntimeHandlerOptions, createAgUiRuntimeHandler, } from "./ag-ui-runtime-handler.js";
87
88
  export { type AgUiRuntimeContextItem, AgUiRuntimeContextItemSchema, type AgUiRuntimeInjectedTool, AgUiRuntimeInjectedToolSchema, type AgUiRuntimeMessage, AgUiRuntimeMessageSchema, type AgUiRuntimeRequest, AgUiRuntimeRequestSchema, parseAgUiRuntimeRequest, parseAgUiRuntimeRequestOrError, } from "./runtime-ag-ui-contract.js";
89
+ export { normalizeAgUiRuntimeMessages } from "./ag-ui-runtime-support.js";
88
90
  export { type AgUiBrowserEncodedEvent, type AgUiBrowserEncoderState, type AgUiBrowserRunFinishedMetadata, type AgUiRuntimeStreamEvent, createAgUiBrowserEncoderState, finalizeAgUiBrowserEvents, mapRuntimeStreamEventToAgUiBrowserEvents, } from "./ag-ui-browser-encoder.js";
89
91
  export { mergeToolCallInput, mergeToolInputDelta, parseDataStreamSseEvents, parseToolInputObject, streamDataStreamEvents, stripLeadingEmptyObjectPlaceholder, } from "./data-stream.js";
90
92
  export { expandAllowedRemoteToolNames, getProviderNativeToolNames, type ProviderNativeToolInventoryOptions, } from "./provider-native-tool-inventory.js";
91
- export { type AgUiDetachedStartAccepted, AgUiDetachedStartAcceptedSchema, type AgUiDetachedStartHandlerOptions, type AgUiDetachedStartRequest, AgUiDetachedStartRequestSchema, createAgUiDetachedStartHandler, } from "./ag-ui-detached-start.js";
93
+ export { type AgUiDetachedStartAccepted, AgUiDetachedStartAcceptedSchema, type AgUiDetachedStartHandlerOptions, type AgUiDetachedStartRequest, AgUiDetachedStartRequestSchema, createAgUiDetachedStartHandler, executeAgUiDetachedStart, type ExecuteAgUiDetachedStartInput, } from "./ag-ui-detached-start.js";
92
94
  export { type AgUiCancelHandlerOptions, type AgUiResumeHandlerOptions, type AgUiResumeSignal, AgUiResumeSignalSchema, createAgUiCancelHandler, createAgUiResumeHandler, } from "./ag-ui-run-control.js";
93
95
  export { type AgUiSseEvent, createAgUiRunErrorEvent, createAgUiSseErrorResponse, normalizeAgUiMessages, parseAgUiRequest, parseAgUiRequestOrError, } from "./ag-ui-host-support.js";
94
96
  export { type AgUiContextItem, type AgUiHandlerConfigWithAgent, type AgUiHandlerOptions, type AgUiInjectedTool, type AgUiRequest, AgUiRequestSchema, createAgUiHandler, } from "./ag-ui-handler.js";