veryfront 0.1.223 → 0.1.225

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.223",
3
+ "version": "0.1.225",
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":"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"}
@@ -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) {
@@ -5,6 +5,11 @@ type AgUiResumeValue = {
5
5
  result: unknown;
6
6
  isError: boolean;
7
7
  };
8
+ export interface AgUiRuntimeLifecycleContext {
9
+ request: AgUiRuntimeRequest;
10
+ toolCallId?: string;
11
+ error?: unknown;
12
+ }
8
13
  export interface AgUiRuntimeHandlerExecuteInput {
9
14
  request: Request;
10
15
  agUiInput: AgUiRuntimeRequest;
@@ -16,6 +21,9 @@ export interface AgUiRuntimeHandlerOptions {
16
21
  context?: Record<string, unknown> | ((request: Request) => Record<string, unknown> | Promise<Record<string, unknown>>);
17
22
  sessionManager?: RunResumeSessionManager<AgUiResumeValue>;
18
23
  execute?: AgUiRuntimeHandlerExecute;
24
+ onToolCallSeen?: (context: AgUiRuntimeLifecycleContext) => Promise<void> | void;
25
+ onFinish?: (context: AgUiRuntimeLifecycleContext) => Promise<void> | void;
26
+ onError?: (context: AgUiRuntimeLifecycleContext) => Promise<void> | void;
19
27
  }
20
28
  export interface AgUiRuntimeHandlerConfigWithAgent extends AgUiRuntimeHandlerOptions {
21
29
  agent: Agent;
@@ -1 +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"}
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;AAG7D,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,kBAAkB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAqWD,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;IACpC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAChF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1E,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1E;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,CAqI9C"}
@@ -12,6 +12,27 @@ const AG_UI_HEADERS = {
12
12
  "Cache-Control": "no-cache",
13
13
  Connection: "keep-alive",
14
14
  };
15
+ function invokeLifecycleCallback(callback, context) {
16
+ if (!callback)
17
+ return;
18
+ try {
19
+ const result = callback(context);
20
+ void Promise.resolve(result).catch(() => undefined);
21
+ }
22
+ catch {
23
+ return;
24
+ }
25
+ }
26
+ async function invokeLifecycleCallbackAndWait(callback, context) {
27
+ if (!callback)
28
+ return;
29
+ try {
30
+ await callback(context);
31
+ }
32
+ catch {
33
+ return;
34
+ }
35
+ }
15
36
  function isRequest(obj) {
16
37
  return (typeof obj === "object" &&
17
38
  obj !== null &&
@@ -140,7 +161,7 @@ async function createAgUiRuntimeStreamResponse(options) {
140
161
  headers: { ...AG_UI_HEADERS },
141
162
  });
142
163
  }
143
- async function createAgUiRuntimeDirectStreamResponse(agent, request, baseContext) {
164
+ async function createAgUiRuntimeDirectStreamResponse(agent, request, baseContext, lifecycle) {
144
165
  await agent.clearMemory();
145
166
  const result = await agent.stream({
146
167
  messages: normalizeAgUiRuntimeMessages(request.messages),
@@ -153,6 +174,9 @@ async function createAgUiRuntimeDirectStreamResponse(agent, request, baseContext
153
174
  upstreamBody: upstream.body,
154
175
  upstreamStatus: upstream.status,
155
176
  upstreamStatusText: upstream.statusText,
177
+ onFinish: lifecycle?.onFinish,
178
+ onError: lifecycle?.onError,
179
+ onToolCallSeen: lifecycle?.onToolCallSeen,
156
180
  });
157
181
  }
158
182
  function createInjectedAgUiTool(runId, tool, sessionManager) {
@@ -199,7 +223,7 @@ function buildMergedTools(agent, request, sessionManager) {
199
223
  }
200
224
  return { ...agent.config.tools, ...injectedTools };
201
225
  }
202
- async function createAgUiRuntimeInjectedToolsStreamResponse(agent, request, baseContext, sessionManager) {
226
+ async function createAgUiRuntimeInjectedToolsStreamResponse(agent, request, baseContext, sessionManager, lifecycle) {
203
227
  try {
204
228
  sessionManager.startRun({ runId: request.runId, threadId: request.threadId });
205
229
  }
@@ -228,12 +252,15 @@ async function createAgUiRuntimeInjectedToolsStreamResponse(agent, request, base
228
252
  upstreamStatus: 200,
229
253
  onFinish: () => {
230
254
  sessionManager.completeRun(request.runId);
255
+ void lifecycle?.onFinish?.();
231
256
  },
232
- onError: () => {
257
+ onError: (error) => {
233
258
  sessionManager.failRun(request.runId);
259
+ void lifecycle?.onError?.(error);
234
260
  },
235
261
  onToolCallSeen: (toolCallId) => {
236
262
  sessionManager.prepareForSignal(request.runId, toolCallId);
263
+ void lifecycle?.onToolCallSeen?.(toolCallId);
237
264
  },
238
265
  });
239
266
  }
@@ -260,16 +287,53 @@ export function createAgUiRuntimeHandler(config) {
260
287
  }, { status: 501 }))
261
288
  : createAgUiRuntimeDirectStreamResponse(config.agent, parsed, context)
262
289
  : undefined;
290
+ const invokeLifecycle = (type, extra = {}) => {
291
+ invokeLifecycleCallback(config[type], {
292
+ request: parsed,
293
+ ...extra,
294
+ });
295
+ };
296
+ const createDefaultResponseWithLifecycle = createDefaultResponse
297
+ ? async () => {
298
+ try {
299
+ if (!config.agent) {
300
+ return await createDefaultResponse();
301
+ }
302
+ if (parsed.tools.length > 0) {
303
+ if (!config.sessionManager) {
304
+ return await createDefaultResponse();
305
+ }
306
+ return await createAgUiRuntimeInjectedToolsStreamResponse(config.agent, parsed, context, config.sessionManager, {
307
+ onFinish: () => invokeLifecycle("onFinish"),
308
+ onError: (error) => invokeLifecycle("onError", { error }),
309
+ onToolCallSeen: (toolCallId) => invokeLifecycle("onToolCallSeen", { toolCallId }),
310
+ });
311
+ }
312
+ return await createAgUiRuntimeDirectStreamResponse(config.agent, parsed, context, {
313
+ onFinish: () => invokeLifecycle("onFinish"),
314
+ onError: (error) => invokeLifecycle("onError", { error }),
315
+ onToolCallSeen: (toolCallId) => invokeLifecycle("onToolCallSeen", { toolCallId }),
316
+ });
317
+ }
318
+ catch (error) {
319
+ await invokeLifecycleCallbackAndWait(config.onError, {
320
+ request: parsed,
321
+ error,
322
+ });
323
+ throw error;
324
+ }
325
+ }
326
+ : undefined;
263
327
  if (config.execute) {
264
328
  return await config.execute({
265
329
  request,
266
330
  agUiInput: parsed,
267
331
  context,
268
- createDefaultResponse,
332
+ createDefaultResponse: createDefaultResponseWithLifecycle,
269
333
  });
270
334
  }
271
- if (createDefaultResponse) {
272
- return await createDefaultResponse();
335
+ if (createDefaultResponseWithLifecycle) {
336
+ return await createDefaultResponseWithLifecycle();
273
337
  }
274
338
  throw new Error("createAgUiRuntimeHandler configuration became invalid during execution.");
275
339
  }
@@ -84,13 +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
+ export { type AgUiRuntimeHandlerConfig, type AgUiRuntimeHandlerConfigWithAgent, type AgUiRuntimeHandlerExecute, type AgUiRuntimeHandlerExecuteInput, type AgUiRuntimeHandlerOptions, type AgUiRuntimeLifecycleContext, createAgUiRuntimeHandler, } from "./ag-ui-runtime-handler.js";
88
88
  export { type AgUiRuntimeContextItem, AgUiRuntimeContextItemSchema, type AgUiRuntimeInjectedTool, AgUiRuntimeInjectedToolSchema, type AgUiRuntimeMessage, AgUiRuntimeMessageSchema, type AgUiRuntimeRequest, AgUiRuntimeRequestSchema, parseAgUiRuntimeRequest, parseAgUiRuntimeRequestOrError, } from "./runtime-ag-ui-contract.js";
89
89
  export { normalizeAgUiRuntimeMessages } from "./ag-ui-runtime-support.js";
90
90
  export { type AgUiBrowserEncodedEvent, type AgUiBrowserEncoderState, type AgUiBrowserRunFinishedMetadata, type AgUiRuntimeStreamEvent, createAgUiBrowserEncoderState, finalizeAgUiBrowserEvents, mapRuntimeStreamEventToAgUiBrowserEvents, } from "./ag-ui-browser-encoder.js";
91
91
  export { mergeToolCallInput, mergeToolInputDelta, parseDataStreamSseEvents, parseToolInputObject, streamDataStreamEvents, stripLeadingEmptyObjectPlaceholder, } from "./data-stream.js";
92
92
  export { expandAllowedRemoteToolNames, getProviderNativeToolNames, type ProviderNativeToolInventoryOptions, } from "./provider-native-tool-inventory.js";
93
- 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";
94
94
  export { type AgUiCancelHandlerOptions, type AgUiResumeHandlerOptions, type AgUiResumeSignal, AgUiResumeSignalSchema, createAgUiCancelHandler, createAgUiResumeHandler, } from "./ag-ui-run-control.js";
95
95
  export { type AgUiSseEvent, createAgUiRunErrorEvent, createAgUiSseErrorResponse, normalizeAgUiMessages, parseAgUiRequest, parseAgUiRequestOrError, } from "./ag-ui-host-support.js";
96
96
  export { type AgUiContextItem, type AgUiHandlerConfigWithAgent, type AgUiHandlerOptions, type AgUiInjectedTool, type AgUiRequest, AgUiRequestSchema, createAgUiHandler, } from "./ag-ui-handler.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AACH,OAAO,yBAAyB,CAAC;AAGjC,YAAY,EACV,KAAK,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,OAAO,IAAI,YAAY,EACvB,WAAW,EACX,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,KAAK,MAAM,EACX,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,WAAW,EACX,KAAK,iBAAiB,EACtB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,WAAW,EACX,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,iCAAiC,EACtC,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,EAC5B,KAAK,uBAAuB,EAC5B,6BAA6B,EAC7B,KAAK,kBAAkB,EACvB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,EAC3B,6BAA6B,EAC7B,yBAAyB,EACzB,wCAAwC,GACzC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,kCAAkC,GACnC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,KAAK,kCAAkC,GACxC,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,KAAK,yBAAyB,EAC9B,+BAA+B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC7B,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,YAAY,EACjB,uBAAuB,EACvB,0BAA0B,EAC1B,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,sBAAsB,EACtB,KAAK,wBAAwB,EAC7B,8BAA8B,EAC9B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,uBAAuB,EACvB,KAAK,gBAAgB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,EAC5B,iBAAiB,EACjB,KAAK,wBAAwB,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,8BAA8B,EACnC,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/agent/index.ts"],"names":[],"mappings":"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"}
@@ -89,7 +89,7 @@ export { normalizeAgUiRuntimeMessages } from "./ag-ui-runtime-support.js";
89
89
  export { createAgUiBrowserEncoderState, finalizeAgUiBrowserEvents, mapRuntimeStreamEventToAgUiBrowserEvents, } from "./ag-ui-browser-encoder.js";
90
90
  export { mergeToolCallInput, mergeToolInputDelta, parseDataStreamSseEvents, parseToolInputObject, streamDataStreamEvents, stripLeadingEmptyObjectPlaceholder, } from "./data-stream.js";
91
91
  export { expandAllowedRemoteToolNames, getProviderNativeToolNames, } from "./provider-native-tool-inventory.js";
92
- export { AgUiDetachedStartAcceptedSchema, AgUiDetachedStartRequestSchema, createAgUiDetachedStartHandler, } from "./ag-ui-detached-start.js";
92
+ export { AgUiDetachedStartAcceptedSchema, AgUiDetachedStartRequestSchema, createAgUiDetachedStartHandler, executeAgUiDetachedStart, } from "./ag-ui-detached-start.js";
93
93
  export { AgUiResumeSignalSchema, createAgUiCancelHandler, createAgUiResumeHandler, } from "./ag-ui-run-control.js";
94
94
  export { createAgUiRunErrorEvent, createAgUiSseErrorResponse, normalizeAgUiMessages, parseAgUiRequest, parseAgUiRequestOrError, } from "./ag-ui-host-support.js";
95
95
  export { AgUiRequestSchema, createAgUiHandler, } from "./ag-ui-handler.js";
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.223";
1
+ export declare const VERSION = "0.1.225";
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.223";
3
+ export const VERSION = "0.1.225";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.223",
3
+ "version": "0.1.225",
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.223",
3
+ "version": "0.1.225",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "workspace": [
@@ -133,17 +133,6 @@ function buildMergedTools(
133
133
  return { ...agent.config.tools, ...injectedTools };
134
134
  }
135
135
 
136
- async function resolveContextValue(
137
- value: AgUiContextValue | undefined,
138
- request: Request,
139
- ): Promise<Record<string, unknown>> {
140
- if (typeof value === "function") {
141
- return await value(request);
142
- }
143
-
144
- return value ?? {};
145
- }
146
-
147
136
  function scheduleDetachedTask(requestOrCtx: unknown, task: Promise<void>): void {
148
137
  if (
149
138
  typeof requestOrCtx === "object" &&
@@ -181,6 +170,13 @@ export const AgUiDetachedStartAcceptedSchema = z.object({
181
170
  export type AgUiDetachedStartRequest = z.infer<typeof AgUiDetachedStartRequestSchema>;
182
171
  export type AgUiDetachedStartAccepted = z.infer<typeof AgUiDetachedStartAcceptedSchema>;
183
172
 
173
+ export interface ExecuteAgUiDetachedStartInput {
174
+ request: AgUiDetachedStartRequest;
175
+ rawRequest?: Request;
176
+ requestOrCtx?: unknown;
177
+ context?: Record<string, unknown>;
178
+ }
179
+
184
180
  interface AgUiDetachedStartExecutionInput {
185
181
  request: AgUiDetachedStartRequest;
186
182
  requestOrCtx: unknown;
@@ -242,6 +238,142 @@ async function startDefaultDetachedExecution(input: {
242
238
  await drainRuntimeStream(runtimeStream);
243
239
  }
244
240
 
241
+ async function resolveDetachedStartContext(
242
+ options: AgUiDetachedStartHandlerOptions,
243
+ input: ExecuteAgUiDetachedStartInput,
244
+ ): Promise<Record<string, unknown>> {
245
+ if (input.context) {
246
+ return input.context;
247
+ }
248
+
249
+ if (!options.context) {
250
+ return {};
251
+ }
252
+
253
+ if (typeof options.context === "function") {
254
+ if (!input.rawRequest) {
255
+ throw INVALID_ARGUMENT.create({
256
+ detail: "executeAgUiDetachedStart requires rawRequest when options.context is a function.",
257
+ });
258
+ }
259
+
260
+ return await options.context(input.rawRequest);
261
+ }
262
+
263
+ return options.context;
264
+ }
265
+
266
+ function assertDetachedStartRawRequest(
267
+ options: AgUiDetachedStartHandlerOptions,
268
+ input: ExecuteAgUiDetachedStartInput,
269
+ ): Request | undefined {
270
+ if (!options.startDetachedExecution) {
271
+ return input.rawRequest;
272
+ }
273
+
274
+ if (input.rawRequest) {
275
+ return input.rawRequest;
276
+ }
277
+
278
+ throw INVALID_ARGUMENT.create({
279
+ detail:
280
+ "executeAgUiDetachedStart requires rawRequest when options.startDetachedExecution is used.",
281
+ });
282
+ }
283
+
284
+ export async function executeAgUiDetachedStart(
285
+ options: AgUiDetachedStartHandlerOptions,
286
+ input: ExecuteAgUiDetachedStartInput,
287
+ ): Promise<Response> {
288
+ const rawRequest = assertDetachedStartRawRequest(options, input);
289
+ const context = await resolveDetachedStartContext(options, input);
290
+
291
+ try {
292
+ const abortSignal = options.sessionManager.startRun({
293
+ runId: input.request.runId,
294
+ threadId: input.request.threadId,
295
+ });
296
+
297
+ await options.onAccepted?.({
298
+ request: input.request,
299
+ runId: input.request.runId,
300
+ threadId: input.request.threadId,
301
+ });
302
+
303
+ const detachedTask = (async () => {
304
+ try {
305
+ if (options.startDetachedExecution) {
306
+ await options.startDetachedExecution({
307
+ request: input.request,
308
+ requestOrCtx: input.requestOrCtx,
309
+ rawRequest: rawRequest!,
310
+ context,
311
+ abortSignal,
312
+ });
313
+ } else if (options.agent) {
314
+ await startDefaultDetachedExecution({
315
+ agent: options.agent,
316
+ request: input.request,
317
+ context,
318
+ abortSignal,
319
+ sessionManager: options.sessionManager,
320
+ });
321
+ } else {
322
+ throw new Error(
323
+ "Detached AG-UI start configuration became invalid during execution.",
324
+ );
325
+ }
326
+
327
+ options.sessionManager.completeRun(input.request.runId);
328
+ await options.onFinish?.({
329
+ runId: input.request.runId,
330
+ threadId: input.request.threadId,
331
+ });
332
+ } catch (error) {
333
+ options.sessionManager.failRun(input.request.runId);
334
+ await options.onError?.({
335
+ runId: input.request.runId,
336
+ threadId: input.request.threadId,
337
+ error,
338
+ });
339
+ }
340
+ })().catch(() => undefined);
341
+
342
+ scheduleDetachedTask(input.requestOrCtx, detachedTask);
343
+
344
+ return Response.json(
345
+ {
346
+ accepted: true,
347
+ duplicate: false,
348
+ runId: input.request.runId,
349
+ threadId: input.request.threadId,
350
+ } satisfies AgUiDetachedStartAccepted,
351
+ { status: 202 },
352
+ );
353
+ } catch (error) {
354
+ if (error instanceof RunAlreadyExistsError) {
355
+ await options.onDuplicate?.({
356
+ request: input.request,
357
+ runId: input.request.runId,
358
+ threadId: input.request.threadId,
359
+ });
360
+
361
+ return Response.json(
362
+ {
363
+ accepted: true,
364
+ duplicate: true,
365
+ runId: input.request.runId,
366
+ threadId: input.request.threadId,
367
+ } satisfies AgUiDetachedStartAccepted,
368
+ { status: 202 },
369
+ );
370
+ }
371
+
372
+ options.sessionManager.failRun(input.request.runId);
373
+ throw error;
374
+ }
375
+ }
376
+
245
377
  export function createAgUiDetachedStartHandler(
246
378
  options: AgUiDetachedStartHandlerOptions,
247
379
  ): (requestOrCtx: unknown) => Promise<Response> {
@@ -256,92 +388,11 @@ export function createAgUiDetachedStartHandler(
256
388
 
257
389
  try {
258
390
  const parsed = AgUiDetachedStartRequestSchema.parse(await request.json());
259
- const context = await resolveContextValue(options.context, request);
260
-
261
- try {
262
- const abortSignal = options.sessionManager.startRun({
263
- runId: parsed.runId,
264
- threadId: parsed.threadId,
265
- });
266
-
267
- await options.onAccepted?.({
268
- request: parsed,
269
- runId: parsed.runId,
270
- threadId: parsed.threadId,
271
- });
272
-
273
- const detachedTask = (async () => {
274
- try {
275
- if (options.startDetachedExecution) {
276
- await options.startDetachedExecution({
277
- request: parsed,
278
- requestOrCtx,
279
- rawRequest: request,
280
- context,
281
- abortSignal,
282
- });
283
- } else if (options.agent) {
284
- await startDefaultDetachedExecution({
285
- agent: options.agent,
286
- request: parsed,
287
- context,
288
- abortSignal,
289
- sessionManager: options.sessionManager,
290
- });
291
- } else {
292
- throw new Error(
293
- "Detached AG-UI start configuration became invalid during execution.",
294
- );
295
- }
296
-
297
- options.sessionManager.completeRun(parsed.runId);
298
- await options.onFinish?.({
299
- runId: parsed.runId,
300
- threadId: parsed.threadId,
301
- });
302
- } catch (error) {
303
- options.sessionManager.failRun(parsed.runId);
304
- await options.onError?.({
305
- runId: parsed.runId,
306
- threadId: parsed.threadId,
307
- error,
308
- });
309
- }
310
- })().catch(() => undefined);
311
-
312
- scheduleDetachedTask(requestOrCtx, detachedTask);
313
-
314
- return Response.json(
315
- {
316
- accepted: true,
317
- duplicate: false,
318
- runId: parsed.runId,
319
- threadId: parsed.threadId,
320
- } satisfies AgUiDetachedStartAccepted,
321
- { status: 202 },
322
- );
323
- } catch (error) {
324
- if (error instanceof RunAlreadyExistsError) {
325
- await options.onDuplicate?.({
326
- request: parsed,
327
- runId: parsed.runId,
328
- threadId: parsed.threadId,
329
- });
330
-
331
- return Response.json(
332
- {
333
- accepted: true,
334
- duplicate: true,
335
- runId: parsed.runId,
336
- threadId: parsed.threadId,
337
- } satisfies AgUiDetachedStartAccepted,
338
- { status: 202 },
339
- );
340
- }
341
-
342
- options.sessionManager.failRun(parsed.runId);
343
- throw error;
344
- }
391
+ return await executeAgUiDetachedStart(options, {
392
+ request: parsed,
393
+ rawRequest: request,
394
+ requestOrCtx,
395
+ });
345
396
  } catch (error) {
346
397
  if (error instanceof z.ZodError) {
347
398
  return Response.json(
@@ -31,6 +31,39 @@ const AG_UI_HEADERS: Record<string, string> = {
31
31
  type AgUiResumeValue = { result: unknown; isError: boolean };
32
32
  type AgUiRuntimePart = Record<string, unknown> & { type: string };
33
33
 
34
+ export interface AgUiRuntimeLifecycleContext {
35
+ request: AgUiRuntimeRequest;
36
+ toolCallId?: string;
37
+ error?: unknown;
38
+ }
39
+
40
+ function invokeLifecycleCallback(
41
+ callback: ((context: AgUiRuntimeLifecycleContext) => Promise<void> | void) | undefined,
42
+ context: AgUiRuntimeLifecycleContext,
43
+ ): void {
44
+ if (!callback) return;
45
+
46
+ try {
47
+ const result = callback(context);
48
+ void Promise.resolve(result).catch(() => undefined);
49
+ } catch {
50
+ return;
51
+ }
52
+ }
53
+
54
+ async function invokeLifecycleCallbackAndWait(
55
+ callback: ((context: AgUiRuntimeLifecycleContext) => Promise<void> | void) | undefined,
56
+ context: AgUiRuntimeLifecycleContext,
57
+ ): Promise<void> {
58
+ if (!callback) return;
59
+
60
+ try {
61
+ await callback(context);
62
+ } catch {
63
+ return;
64
+ }
65
+ }
66
+
34
67
  function isRequest(obj: unknown): obj is Request {
35
68
  return (
36
69
  typeof obj === "object" &&
@@ -212,6 +245,11 @@ async function createAgUiRuntimeDirectStreamResponse(
212
245
  agent: Agent,
213
246
  request: AgUiRuntimeRequest,
214
247
  baseContext: Record<string, unknown>,
248
+ lifecycle?: {
249
+ onFinish?: () => Promise<void> | void;
250
+ onError?: (error: unknown) => Promise<void> | void;
251
+ onToolCallSeen?: (toolCallId: string) => Promise<void> | void;
252
+ },
215
253
  ): Promise<Response> {
216
254
  await agent.clearMemory();
217
255
 
@@ -227,6 +265,9 @@ async function createAgUiRuntimeDirectStreamResponse(
227
265
  upstreamBody: upstream.body,
228
266
  upstreamStatus: upstream.status,
229
267
  upstreamStatusText: upstream.statusText,
268
+ onFinish: lifecycle?.onFinish,
269
+ onError: lifecycle?.onError,
270
+ onToolCallSeen: lifecycle?.onToolCallSeen,
230
271
  });
231
272
  }
232
273
 
@@ -297,6 +338,11 @@ async function createAgUiRuntimeInjectedToolsStreamResponse(
297
338
  request: AgUiRuntimeRequest,
298
339
  baseContext: Record<string, unknown>,
299
340
  sessionManager: RunResumeSessionManager<AgUiResumeValue>,
341
+ lifecycle?: {
342
+ onFinish?: () => Promise<void> | void;
343
+ onError?: (error: unknown) => Promise<void> | void;
344
+ onToolCallSeen?: (toolCallId: string) => Promise<void> | void;
345
+ },
300
346
  ): Promise<Response> {
301
347
  try {
302
348
  sessionManager.startRun({ runId: request.runId, threadId: request.threadId });
@@ -333,12 +379,15 @@ async function createAgUiRuntimeInjectedToolsStreamResponse(
333
379
  upstreamStatus: 200,
334
380
  onFinish: () => {
335
381
  sessionManager.completeRun(request.runId);
382
+ void lifecycle?.onFinish?.();
336
383
  },
337
- onError: () => {
384
+ onError: (error) => {
338
385
  sessionManager.failRun(request.runId);
386
+ void lifecycle?.onError?.(error);
339
387
  },
340
388
  onToolCallSeen: (toolCallId) => {
341
389
  sessionManager.prepareForSignal(request.runId, toolCallId);
390
+ void lifecycle?.onToolCallSeen?.(toolCallId);
342
391
  },
343
392
  });
344
393
  }
@@ -360,6 +409,9 @@ export interface AgUiRuntimeHandlerOptions {
360
409
  | ((request: Request) => Record<string, unknown> | Promise<Record<string, unknown>>);
361
410
  sessionManager?: RunResumeSessionManager<AgUiResumeValue>;
362
411
  execute?: AgUiRuntimeHandlerExecute;
412
+ onToolCallSeen?: (context: AgUiRuntimeLifecycleContext) => Promise<void> | void;
413
+ onFinish?: (context: AgUiRuntimeLifecycleContext) => Promise<void> | void;
414
+ onError?: (context: AgUiRuntimeLifecycleContext) => Promise<void> | void;
363
415
  }
364
416
 
365
417
  export interface AgUiRuntimeHandlerConfigWithAgent extends AgUiRuntimeHandlerOptions {
@@ -414,17 +466,72 @@ export function createAgUiRuntimeHandler(
414
466
  : createAgUiRuntimeDirectStreamResponse(config.agent, parsed, context)
415
467
  : undefined;
416
468
 
469
+ const invokeLifecycle = (
470
+ type: "onFinish" | "onError" | "onToolCallSeen",
471
+ extra: Partial<AgUiRuntimeLifecycleContext> = {},
472
+ ): void => {
473
+ invokeLifecycleCallback(config[type], {
474
+ request: parsed,
475
+ ...extra,
476
+ });
477
+ };
478
+
479
+ const createDefaultResponseWithLifecycle = createDefaultResponse
480
+ ? async () => {
481
+ try {
482
+ if (!config.agent) {
483
+ return await createDefaultResponse();
484
+ }
485
+
486
+ if (parsed.tools.length > 0) {
487
+ if (!config.sessionManager) {
488
+ return await createDefaultResponse();
489
+ }
490
+
491
+ return await createAgUiRuntimeInjectedToolsStreamResponse(
492
+ config.agent,
493
+ parsed,
494
+ context,
495
+ config.sessionManager,
496
+ {
497
+ onFinish: () => invokeLifecycle("onFinish"),
498
+ onError: (error) => invokeLifecycle("onError", { error }),
499
+ onToolCallSeen: (toolCallId) => invokeLifecycle("onToolCallSeen", { toolCallId }),
500
+ },
501
+ );
502
+ }
503
+
504
+ return await createAgUiRuntimeDirectStreamResponse(
505
+ config.agent,
506
+ parsed,
507
+ context,
508
+ {
509
+ onFinish: () => invokeLifecycle("onFinish"),
510
+ onError: (error) => invokeLifecycle("onError", { error }),
511
+ onToolCallSeen: (toolCallId) => invokeLifecycle("onToolCallSeen", { toolCallId }),
512
+ },
513
+ );
514
+ } catch (error) {
515
+ await invokeLifecycleCallbackAndWait(config.onError, {
516
+ request: parsed,
517
+ error,
518
+ });
519
+ throw error;
520
+ }
521
+ }
522
+ : undefined;
523
+
417
524
  if (config.execute) {
418
525
  return await config.execute({
419
526
  request,
420
527
  agUiInput: parsed,
421
528
  context,
422
- createDefaultResponse,
529
+ createDefaultResponse: createDefaultResponseWithLifecycle,
423
530
  });
424
531
  }
425
532
 
426
- if (createDefaultResponse) {
427
- return await createDefaultResponse();
533
+ if (createDefaultResponseWithLifecycle) {
534
+ return await createDefaultResponseWithLifecycle();
428
535
  }
429
536
 
430
537
  throw new Error("createAgUiRuntimeHandler configuration became invalid during execution.");
@@ -147,6 +147,7 @@ export {
147
147
  type AgUiRuntimeHandlerExecute,
148
148
  type AgUiRuntimeHandlerExecuteInput,
149
149
  type AgUiRuntimeHandlerOptions,
150
+ type AgUiRuntimeLifecycleContext,
150
151
  createAgUiRuntimeHandler,
151
152
  } from "./ag-ui-runtime-handler.js";
152
153
  export {
@@ -191,6 +192,8 @@ export {
191
192
  type AgUiDetachedStartRequest,
192
193
  AgUiDetachedStartRequestSchema,
193
194
  createAgUiDetachedStartHandler,
195
+ executeAgUiDetachedStart,
196
+ type ExecuteAgUiDetachedStartInput,
194
197
  } from "./ag-ui-detached-start.js";
195
198
  export {
196
199
  type AgUiCancelHandlerOptions,
@@ -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.223";
3
+ export const VERSION = "0.1.225";