@skroyc/ag-ui-middleware-callbacks 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +33 -28
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +15 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import * as langchain from 'langchain';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { Operation } from 'fast-json-patch';
|
|
4
|
+
import { EventType } from '@ag-ui/core';
|
|
5
|
+
export { EventSchemas, EventType } from '@ag-ui/core';
|
|
4
6
|
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
5
7
|
import { BaseMessage } from '@langchain/core/messages';
|
|
6
|
-
export { EventSchemas, EventType } from '@ag-ui/core';
|
|
7
8
|
export { AGUI_MEDIA_TYPE, decode as decodeProtobuf, encode as encodeProtobuf } from '@ag-ui/proto';
|
|
8
9
|
|
|
9
10
|
/**
|
|
@@ -45,7 +46,7 @@ interface Message {
|
|
|
45
46
|
error?: string;
|
|
46
47
|
}
|
|
47
48
|
interface RunStartedEvent {
|
|
48
|
-
type:
|
|
49
|
+
type: EventType.RUN_STARTED;
|
|
49
50
|
threadId: string;
|
|
50
51
|
runId: string;
|
|
51
52
|
parentRunId?: string;
|
|
@@ -53,42 +54,42 @@ interface RunStartedEvent {
|
|
|
53
54
|
timestamp?: number;
|
|
54
55
|
}
|
|
55
56
|
interface RunFinishedEvent {
|
|
56
|
-
type:
|
|
57
|
+
type: EventType.RUN_FINISHED;
|
|
57
58
|
threadId: string;
|
|
58
59
|
runId: string;
|
|
59
60
|
result?: unknown;
|
|
60
61
|
timestamp?: number;
|
|
61
62
|
}
|
|
62
63
|
interface RunErrorEvent {
|
|
63
|
-
type:
|
|
64
|
+
type: EventType.RUN_ERROR;
|
|
64
65
|
message: string;
|
|
65
66
|
code?: string;
|
|
66
67
|
timestamp?: number;
|
|
67
68
|
}
|
|
68
69
|
interface StepStartedEvent {
|
|
69
|
-
type:
|
|
70
|
+
type: EventType.STEP_STARTED;
|
|
70
71
|
stepName: string;
|
|
71
72
|
timestamp?: number;
|
|
72
73
|
}
|
|
73
74
|
interface StepFinishedEvent {
|
|
74
|
-
type:
|
|
75
|
+
type: EventType.STEP_FINISHED;
|
|
75
76
|
stepName: string;
|
|
76
77
|
timestamp?: number;
|
|
77
78
|
}
|
|
78
79
|
interface TextMessageStartEvent {
|
|
79
|
-
type:
|
|
80
|
+
type: EventType.TEXT_MESSAGE_START;
|
|
80
81
|
messageId: string;
|
|
81
82
|
role?: "developer" | "system" | "assistant" | "user";
|
|
82
83
|
timestamp?: number;
|
|
83
84
|
}
|
|
84
85
|
interface TextMessageContentEvent {
|
|
85
|
-
type:
|
|
86
|
+
type: EventType.TEXT_MESSAGE_CONTENT;
|
|
86
87
|
messageId: string;
|
|
87
88
|
delta: string;
|
|
88
89
|
timestamp?: number;
|
|
89
90
|
}
|
|
90
91
|
interface TextMessageEndEvent {
|
|
91
|
-
type:
|
|
92
|
+
type: EventType.TEXT_MESSAGE_END;
|
|
92
93
|
messageId: string;
|
|
93
94
|
timestamp?: number;
|
|
94
95
|
}
|
|
@@ -96,32 +97,32 @@ interface TextMessageEndEvent {
|
|
|
96
97
|
* TextMessageChunk (convenience): Auto-expands to Start → Content → End
|
|
97
98
|
*/
|
|
98
99
|
interface TextMessageChunkEvent {
|
|
99
|
-
type:
|
|
100
|
+
type: EventType.TEXT_MESSAGE_CHUNK;
|
|
100
101
|
messageId?: string;
|
|
101
102
|
role?: "developer" | "system" | "assistant" | "user";
|
|
102
103
|
delta?: string;
|
|
103
104
|
timestamp?: number;
|
|
104
105
|
}
|
|
105
106
|
interface ToolCallStartEvent {
|
|
106
|
-
type:
|
|
107
|
+
type: EventType.TOOL_CALL_START;
|
|
107
108
|
toolCallId: string;
|
|
108
109
|
toolCallName: string;
|
|
109
110
|
parentMessageId?: string;
|
|
110
111
|
timestamp?: number;
|
|
111
112
|
}
|
|
112
113
|
interface ToolCallArgsEvent {
|
|
113
|
-
type:
|
|
114
|
+
type: EventType.TOOL_CALL_ARGS;
|
|
114
115
|
toolCallId: string;
|
|
115
116
|
delta: string;
|
|
116
117
|
timestamp?: number;
|
|
117
118
|
}
|
|
118
119
|
interface ToolCallEndEvent {
|
|
119
|
-
type:
|
|
120
|
+
type: EventType.TOOL_CALL_END;
|
|
120
121
|
toolCallId: string;
|
|
121
122
|
timestamp?: number;
|
|
122
123
|
}
|
|
123
124
|
interface ToolCallResultEvent {
|
|
124
|
-
type:
|
|
125
|
+
type: EventType.TOOL_CALL_RESULT;
|
|
125
126
|
messageId: string;
|
|
126
127
|
toolCallId: string;
|
|
127
128
|
content: string;
|
|
@@ -132,7 +133,7 @@ interface ToolCallResultEvent {
|
|
|
132
133
|
* ToolCallChunk (convenience): Auto-expands to Start → Args → End
|
|
133
134
|
*/
|
|
134
135
|
interface ToolCallChunkEvent {
|
|
135
|
-
type:
|
|
136
|
+
type: EventType.TOOL_CALL_CHUNK;
|
|
136
137
|
toolCallId?: string;
|
|
137
138
|
toolCallName?: string;
|
|
138
139
|
parentMessageId?: string;
|
|
@@ -140,22 +141,22 @@ interface ToolCallChunkEvent {
|
|
|
140
141
|
timestamp?: number;
|
|
141
142
|
}
|
|
142
143
|
interface StateSnapshotEvent {
|
|
143
|
-
type:
|
|
144
|
+
type: EventType.STATE_SNAPSHOT;
|
|
144
145
|
snapshot: unknown;
|
|
145
146
|
timestamp?: number;
|
|
146
147
|
}
|
|
147
148
|
interface StateDeltaEvent {
|
|
148
|
-
type:
|
|
149
|
+
type: EventType.STATE_DELTA;
|
|
149
150
|
delta: Operation[];
|
|
150
151
|
timestamp?: number;
|
|
151
152
|
}
|
|
152
153
|
interface MessagesSnapshotEvent {
|
|
153
|
-
type:
|
|
154
|
+
type: EventType.MESSAGES_SNAPSHOT;
|
|
154
155
|
messages: Message[];
|
|
155
156
|
timestamp?: number;
|
|
156
157
|
}
|
|
157
158
|
interface ActivitySnapshotEvent {
|
|
158
|
-
type:
|
|
159
|
+
type: EventType.ACTIVITY_SNAPSHOT;
|
|
159
160
|
messageId: string;
|
|
160
161
|
activityType: string;
|
|
161
162
|
content: Record<string, unknown>;
|
|
@@ -163,45 +164,49 @@ interface ActivitySnapshotEvent {
|
|
|
163
164
|
timestamp?: number;
|
|
164
165
|
}
|
|
165
166
|
interface ActivityDeltaEvent {
|
|
166
|
-
type:
|
|
167
|
+
type: EventType.ACTIVITY_DELTA;
|
|
167
168
|
messageId: string;
|
|
168
169
|
activityType: string;
|
|
169
170
|
patch: Operation[];
|
|
170
171
|
timestamp?: number;
|
|
171
172
|
}
|
|
172
173
|
interface ThinkingStartEvent {
|
|
173
|
-
type:
|
|
174
|
+
type: EventType.THINKING_START;
|
|
174
175
|
title?: string;
|
|
175
176
|
messageId?: string;
|
|
176
177
|
timestamp?: number;
|
|
177
178
|
}
|
|
178
179
|
interface ThinkingTextMessageStartEvent {
|
|
179
|
-
type:
|
|
180
|
+
type: EventType.THINKING_TEXT_MESSAGE_START;
|
|
180
181
|
messageId: string;
|
|
181
182
|
timestamp?: number;
|
|
182
183
|
}
|
|
183
184
|
interface ThinkingTextMessageContentEvent {
|
|
184
|
-
type:
|
|
185
|
+
type: EventType.THINKING_TEXT_MESSAGE_CONTENT;
|
|
185
186
|
messageId: string;
|
|
186
187
|
delta: string;
|
|
187
188
|
timestamp?: number;
|
|
188
189
|
}
|
|
189
190
|
interface ThinkingTextMessageEndEvent {
|
|
190
|
-
type:
|
|
191
|
+
type: EventType.THINKING_TEXT_MESSAGE_END;
|
|
191
192
|
messageId: string;
|
|
192
193
|
timestamp?: number;
|
|
193
194
|
}
|
|
194
195
|
interface ThinkingEndEvent {
|
|
195
|
-
type:
|
|
196
|
+
type: EventType.THINKING_END;
|
|
196
197
|
timestamp?: number;
|
|
197
198
|
}
|
|
198
199
|
interface RawEvent {
|
|
199
|
-
type:
|
|
200
|
+
type: EventType.RAW;
|
|
200
201
|
event: unknown;
|
|
201
202
|
source?: string;
|
|
202
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Custom event for application-specific functionality.
|
|
206
|
+
* Allows passing arbitrary named events with any payload.
|
|
207
|
+
*/
|
|
203
208
|
interface CustomEvent {
|
|
204
|
-
type:
|
|
209
|
+
type: EventType.CUSTOM;
|
|
205
210
|
name: string;
|
|
206
211
|
value: unknown;
|
|
207
212
|
}
|
|
@@ -687,4 +692,4 @@ declare function createValidatingTransport<T extends {
|
|
|
687
692
|
onValidationError?: (event: AGUIEvent, error: ValidationResult['error']) => void;
|
|
688
693
|
}): T;
|
|
689
694
|
|
|
690
|
-
export { type AGUIAgentConfig, AGUICallbackHandler, type AGUIEvent, type AGUIMiddlewareOptions, AGUIMiddlewareOptionsSchema, type AGUITransport, type Message, type MessageRole, type ProtobufTransport, type SSETransport, type ToolCall, type ValidationResult, cleanLangChainData, computeStateDelta, createAGUIAgent, createAGUIMiddleware, createProtobufTransport, createSSETransport, createValidatingTransport, decodeEventWithFraming, encodeEventWithFraming, expandEvent, extractToolOutput, generateId, isValidEvent, mapLangChainMessageToAGUI, validateEvent };
|
|
695
|
+
export { type AGUIAgentConfig, AGUICallbackHandler, type AGUIEvent, type AGUIMiddlewareOptions, AGUIMiddlewareOptionsSchema, type AGUITransport, type ActivityDeltaEvent, type ActivitySnapshotEvent, type CustomEvent, type Message, type MessageRole, type MessagesSnapshotEvent, type ProtobufTransport, type RawEvent, type RunErrorEvent, type RunFinishedEvent, type RunStartedEvent, type SSETransport, type StateDeltaEvent, type StateSnapshotEvent, type StepFinishedEvent, type StepStartedEvent, type TextMessageChunkEvent, type TextMessageContentEvent, type TextMessageEndEvent, type TextMessageStartEvent, type ThinkingEndEvent, type ThinkingStartEvent, type ThinkingTextMessageContentEvent, type ThinkingTextMessageEndEvent, type ThinkingTextMessageStartEvent, type ToolCall, type ToolCallArgsEvent, type ToolCallChunkEvent, type ToolCallEndEvent, type ToolCallResultEvent, type ToolCallStartEvent, type ValidationResult, cleanLangChainData, computeStateDelta, createAGUIAgent, createAGUIMiddleware, createProtobufTransport, createSSETransport, createValidatingTransport, decodeEventWithFraming, encodeEventWithFraming, expandEvent, extractToolOutput, generateId, isValidEvent, mapLangChainMessageToAGUI, validateEvent };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {createMiddleware,createAgent}from'langchain';import {z as z$1}from'zod';import {compare}from'fast-json-patch';import {HumanMessage,AIMessage,ToolMessage,SystemMessage,ChatMessage}from'@langchain/core/messages';import {EventSchemas}from'@ag-ui/core';export{EventSchemas,EventType}from'@ag-ui/core';import {BaseCallbackHandler}from'@langchain/core/callbacks/base';import {encode,decode,AGUI_MEDIA_TYPE}from'@ag-ui/proto';export{AGUI_MEDIA_TYPE,decode as decodeProtobuf,encode as encodeProtobuf}from'@ag-ui/proto';function T(){return crypto.randomUUID()}function E(n,e){if(!n)throw new Error("baseId is required for deterministic ID generation");let t=`${n}-${e}`,s=0;for(let o=0;o<t.length;o++){let c=t.charCodeAt(o);s=(s<<5)-s+c,s=s&s;}let r=Math.abs(s).toString(16).padStart(8,"0");return `${n}-${r}`}function A(n,e){return compare(n,e)}function I(n){let e=n.id||T(),t="assistant",s,r,o=typeof n.content=="string"?n.content:JSON.stringify(n.content);if(n instanceof HumanMessage||n.role==="user"||n._getType?.()==="human")t="user";else if(n instanceof AIMessage||n.role==="assistant"||n._getType?.()==="ai"){t="assistant";let c=n.tool_calls||n.kwargs?.tool_calls;c&&c.length>0&&(s=c.map(p=>({id:p.id,type:"function",function:{name:p.name,arguments:typeof p.args=="string"?p.args:JSON.stringify(p.args)}})));}else n instanceof ToolMessage||n.role==="tool"||n._getType?.()==="tool"?(t="tool",r=n.tool_call_id||n.kwargs?.tool_call_id):n instanceof SystemMessage||n.role==="system"||n._getType?.()==="system"?t="system":(n instanceof ChatMessage||n.role)&&(t=n.role);return {id:e,role:t,content:o,toolCalls:s,toolCallId:r,name:n.name}}function y(n){if(n==null)return n;if(Array.isArray(n))return n.map(y);if(typeof n=="object"){if((n.lc===1||n.lc_serializable===true)&&(n.kwargs||n.lc_kwargs)){let t=n.kwargs||n.lc_kwargs;return y(t)}let e={};for(let[t,s]of Object.entries(n))t==="lc"||t==="type"||t==="id"||t.startsWith("lc_")||(e[t]=y(s));return e}return n}function _(n){if(n==null)return "";let e=n;if(typeof n=="string")try{e=JSON.parse(n);}catch{return n}if(typeof e!="object")return String(e);e.lc===1||e.lc_serializable===true||e.type==="constructor"&&Array.isArray(e.id);let s=e.kwargs||e.lc_kwargs||e;return s&&s.content!==void 0?typeof s.content=="string"?s.content:JSON.stringify(s.content):e.result!==void 0?typeof e.result=="string"?e.result:JSON.stringify(e.result):e.output!==void 0?typeof e.output=="string"?e.output:JSON.stringify(e.output):JSON.stringify(y(e))}var C=z$1.object({transport:z$1.custom(n=>n&&typeof n.emit=="function",{message:"Transport must have an emit function"}),emitToolResults:z$1.boolean().default(true),emitStateSnapshots:z$1.enum(["initial","final","all","none"]).default("initial"),emitActivities:z$1.boolean().default(false),maxUIPayloadSize:z$1.number().positive().default(50*1024),chunkLargeResults:z$1.boolean().default(false),threadIdOverride:z$1.string().optional(),runIdOverride:z$1.string().optional(),errorDetailLevel:z$1.enum(["full","message","code","none"]).default("message"),stateMapper:z$1.custom().optional(),resultMapper:z$1.custom().optional(),activityMapper:z$1.custom().optional(),validateEvents:z$1.union([z$1.boolean(),z$1.literal("strict")]).default(false)});function M(n){try{let e=EventSchemas.safeParse(n);return e.success?{success:!0,data:n}:{success:!1,error:{message:"Event validation failed",issues:e.error.issues.map(t=>({path:t.path,message:t.message}))}}}catch(e){return {success:false,error:{message:e instanceof Error?e.message:"Unknown validation error",issues:[]}}}}function K(n){return M(n).success}function w(n,e={}){let{throwOnInvalid:t=false,onValidationError:s}=e;return {...n,emit:r=>{let o=M(r);if(!o.success&&(s?s(r,o.error):console.warn("[AG-UI Validation] Invalid event:",r.type,o.error),t))throw new Error(`Invalid AG-UI event: ${o.error?.message}`);n.emit(r);}}}function z(n){return n===true||n==="strict"}function F(n){let e=n;if(e.messages&&Array.isArray(e.messages)){let t=e.messages[e.messages.length-1];if(t&&typeof t.content=="string")return t.content.substring(0,100)+(t.content.length>100?"...":"")}return "[no input preview]"}function j(n){let e=n;if(e.messages&&Array.isArray(e.messages)){let t=e.messages[e.messages.length-1];if(t?.toolCalls?.length)return "tool_calls";if(t?.content)return "text"}return "unknown"}function B(n){let e=n;return !!(e.messages&&e.messages.some(t=>t.toolCalls?.length>0))}async function U(n,e,t,s,r,o,c){if(!e)return;let p=`activity-${e}-${t}`,d={status:r,timestamp:Date.now(),...c},l=o?o(d):d;if(!s.currentActivityId||s.currentActivityId!==p)s.currentActivityId=p,s.currentActivityType="AGENT_STEP",s.activityContent=l,n.emit({type:"ACTIVITY_SNAPSHOT",messageId:p,activityType:"AGENT_STEP",content:l,replace:true});else {let g=A(s.activityContent,l);g.length>0&&(s.activityContent=l,n.emit({type:"ACTIVITY_DELTA",messageId:p,activityType:"AGENT_STEP",patch:g}));}}function x(n){let e=C.parse(n),t=e.transport;z(e.validateEvents)&&(t=w(e.transport,{throwOnInvalid:e.validateEvents==="strict"}));let s,r,o,c=0,p={currentActivityId:void 0,currentActivityType:"AGENT_STEP",activityContent:{}};return createMiddleware({name:"ag-ui-lifecycle",contextSchema:z$1.object({run_id:z$1.string().optional(),runId:z$1.string().optional(),thread_id:z$1.string().optional(),threadId:z$1.string().optional()}),beforeAgent:async(l,g)=>{c=0;let i=g,a=i.config?.configurable||i.configurable;s=a?.threadId||a?.thread_id||a?.checkpoint_id||e.threadIdOverride||i.context?.threadId||i.context?.thread_id||"",r=e.runIdOverride||a?.run_id||i.runId||i.id||i.context?.runId||i.context?.run_id||i.config?.runId||crypto.randomUUID();try{if(t.emit({type:"RUN_STARTED",threadId:s,runId:r,input:y(i.config?.input),timestamp:Date.now()}),e.emitStateSnapshots==="initial"||e.emitStateSnapshots==="all"){let h=e.stateMapper?e.stateMapper(l):y(l);!e.stateMapper&&h&&typeof h=="object"&&delete h.messages,t.emit({type:"STATE_SNAPSHOT",snapshot:h,timestamp:Date.now()});}let f=l;f.messages&&Array.isArray(f.messages)&&t.emit({type:"MESSAGES_SNAPSHOT",messages:f.messages.map(I),timestamp:Date.now()});}catch{}let m=i.config;return m&&(m.metadata={...m.metadata||{},agui_runId:r}),{}},beforeModel:async(l,g)=>{let i=c++,a=E(r,i),m=`model_call_${a}`;o=m;let h=g.config;h&&(h.metadata={...h.metadata||{},agui_messageId:a});try{t.emit({type:"STEP_STARTED",stepName:m,timestamp:Date.now()}),e.emitActivities&&await U(t,r,i,p,"started",e.activityMapper,{stepName:m,modelName:g.config?.model?._modelType||"unknown",inputPreview:F(l)});}catch{}return {}},afterModel:async(l,g)=>{try{if(t.emit({type:"STEP_FINISHED",stepName:o||"",timestamp:Date.now()}),e.emitActivities&&o){let i=c-1;await U(t,r,i,p,"completed",e.activityMapper,{stepName:o,outputType:j(l),hasToolCalls:B(l)});}if(e.emitStateSnapshots!=="none"){let i=y(l),a=e.stateMapper?e.stateMapper(i):i;!e.stateMapper&&a&&typeof a=="object"&&delete a.messages,(a?Object.keys(a).filter(f=>a[f]!==void 0&&a[f]!==null):[]).length>0&&t.emit({type:"STATE_SNAPSHOT",snapshot:a,timestamp:Date.now()});}}catch{}return o=void 0,{}},afterAgent:async(l,g)=>{try{if(e.emitStateSnapshots==="final"||e.emitStateSnapshots==="all"){let a=e.stateMapper?e.stateMapper(l):y(l);!e.stateMapper&&a&&typeof a=="object"&&delete a.messages,t.emit({type:"STATE_SNAPSHOT",snapshot:a,timestamp:Date.now()});}let i=l;if(i.error){let a=i.error,m=a instanceof Error?a.message:String(a);t.emit({type:"RUN_ERROR",message:e.errorDetailLevel==="full"||e.errorDetailLevel==="message"?m:"",code:"AGENT_EXECUTION_ERROR",timestamp:Date.now()});}else t.emit({type:"RUN_FINISHED",threadId:s,runId:r,result:e.resultMapper?e.resultMapper(l):void 0,timestamp:Date.now()});}catch{}return {}}})}function S(n){switch(n.type){case "TEXT_MESSAGE_CHUNK":{let e=n.messageId||T(),t=[];return n.role&&t.push({type:"TEXT_MESSAGE_START",messageId:e,role:n.role}),n.delta&&t.push({type:"TEXT_MESSAGE_CONTENT",messageId:e,delta:n.delta}),n.role&&n.delta&&t.push({type:"TEXT_MESSAGE_END",messageId:e}),t.length>0?t:[n]}case "TOOL_CALL_CHUNK":{let e=n.toolCallId||T(),t=[];return n.toolCallName&&t.push({type:"TOOL_CALL_START",toolCallId:e,toolCallName:n.toolCallName,parentMessageId:n.parentMessageId}),n.delta&&t.push({type:"TOOL_CALL_ARGS",toolCallId:e,delta:n.delta}),n.toolCallName&&n.delta&&t.push({type:"TOOL_CALL_END",toolCallId:e,parentMessageId:n.parentMessageId}),t.length>0?t:[n]}default:return [n]}}var b=class extends BaseCallbackHandler{name="ag-ui-callback";messageIds=new Map;latestMessageIds=new Map;agentRunIds=new Map;parentToAuthoritativeId=new Map;thinkingIds=new Map;toolCallInfo=new Map;toolCallNames=new Map;agentTurnTracker=new Map;pendingToolCalls=new Map;accumulatedToolArgs=new Map;transport;maxUIPayloadSize;chunkLargeResults;constructor(e,t){super({raiseError:false}),this.transport=e,this.maxUIPayloadSize=t?.maxUIPayloadSize??50*1024,this.chunkLargeResults=t?.chunkLargeResults??false;}dispose(){this.messageIds.clear(),this.latestMessageIds.clear(),this.agentRunIds.clear(),this.parentToAuthoritativeId.clear(),this.thinkingIds.clear(),this.toolCallInfo.clear(),this.toolCallNames.clear(),this.agentTurnTracker.clear(),this.pendingToolCalls.clear(),this.accumulatedToolArgs.clear();}async emitTextChunk(e,t="assistant",s){let r=S({type:"TEXT_MESSAGE_CHUNK",messageId:e,role:t,delta:s});for(let o of r)await this.transport.emit(o);}async emitToolChunk(e,t,s,r){let o=S({type:"TOOL_CALL_CHUNK",toolCallId:e,toolCallName:t,delta:s,parentMessageId:r});for(let c of o)await this.transport.emit(c);}async handleLLMStart(e,t,s,r,o,c,p,d){let l=p?.agui_runId||p?.run_id||p?.configurable?.run_id||r||s;this.agentRunIds.set(s,l),r&&this.parentToAuthoritativeId.set(r,l);let g=p?.agui_messageId;if(g)this.messageIds.set(s,g),this.latestMessageIds.set(l,g),this.transport.emit({type:"TEXT_MESSAGE_START",messageId:g,role:"assistant",timestamp:Date.now()});else {let i=this.agentTurnTracker.get(l)||0;this.agentTurnTracker.set(l,i+1);let a=E(l,i);this.messageIds.set(s,a),this.latestMessageIds.set(l,a),this.transport.emit({type:"TEXT_MESSAGE_START",messageId:a,role:"assistant",timestamp:Date.now()});}}async handleLLMNewToken(e,t,s,r,o,c){let p=this.messageIds.get(s);if(p)try{let d=c?.chunk?.message?.additional_kwargs?.reasoning_content||c?.chunk?.message?.additional_kwargs?.reasoning;if(d){let g=this.thinkingIds.get(s);if(!g){let a=this.agentRunIds.get(s)||(r?this.parentToAuthoritativeId.get(r):null)||r||s;g=E(a,(this.agentTurnTracker.get(a)||1)+100),this.thinkingIds.set(s,g),this.transport.emit({type:"THINKING_START",timestamp:Date.now()}),this.transport.emit({type:"THINKING_TEXT_MESSAGE_START",messageId:g,timestamp:Date.now()});}let i=typeof d=="string"?d:d.text||JSON.stringify(d);this.transport.emit({type:"THINKING_TEXT_MESSAGE_CONTENT",messageId:g,delta:i,timestamp:Date.now()});}e&&e.length>0&&this.transport.emit({type:"TEXT_MESSAGE_CONTENT",messageId:p,delta:e,timestamp:Date.now()});let l=c?.chunk?.message?.tool_call_chunks;if(l&&Array.isArray(l)){let g=this.agentRunIds.get(s)||(r?this.parentToAuthoritativeId.get(r):null)||r||s,i=this.pendingToolCalls.get(g)||[];for(let a of l)if(a.id&&a.args){let m=this.accumulatedToolArgs.get(a.id)||"",f=m+a.args;f!==m&&this.accumulatedToolArgs.set(a.id,f),i.includes(a.id)||i.push(a.id);}i.length>0&&this.pendingToolCalls.set(g,i);}}catch{}}async handleLLMEnd(e,t,s,r,o){let c=this.messageIds.get(t),p=this.thinkingIds.get(t);try{if(e&&typeof e=="object"){let d=e.tool_calls||e.kwargs?.tool_calls;if(Array.isArray(d)){let l=this.agentRunIds.get(t)||(s?this.parentToAuthoritativeId.get(s):null)||s||t,g=this.pendingToolCalls.get(l)||[];for(let i of d)i.id&&!g.includes(i.id)&&(g.push(i.id),i.function?.name&&this.toolCallNames.set(i.id,i.function.name),i.function?.arguments&&this.accumulatedToolArgs.set(i.id,i.function.arguments));this.pendingToolCalls.set(l,g);}}c&&this.transport.emit({type:"TEXT_MESSAGE_END",messageId:c,timestamp:Date.now()}),p&&(this.transport.emit({type:"THINKING_TEXT_MESSAGE_END",messageId:p,timestamp:Date.now()}),this.transport.emit({type:"THINKING_END",timestamp:Date.now()}),this.thinkingIds.delete(t)),this.messageIds.delete(t);}catch{}}async handleLLMError(e,t,s){this.messageIds.delete(t),this.thinkingIds.delete(t);let r=this.agentRunIds.get(t)||(s?this.parentToAuthoritativeId.get(s):null)||s||t;this.pendingToolCalls.delete(r),this.agentRunIds.delete(t);}async handleToolStart(e,t,s,r,o,c,p){let d=s,l=p||e.kwargs?.name||e.name||e.func?.name||e.getName?.()||e.toolName||e._name||"unknown_tool";try{if(c?.tool_call_id&&typeof c.tool_call_id=="string"){d=c.tool_call_id;let a=this.toolCallNames.get(d);a&&a!=="unknown_tool"&&(l=a);}else if(t)try{let a=typeof t=="string"?JSON.parse(t):t;a&&typeof a=="object"&&(a.tool_call_id?d=a.tool_call_id:a.id&&(d=a.id),a.name&&(l=a.name));}catch{}if(d===s&&this.accumulatedToolArgs.size>0&&t){for(let[a,m]of this.accumulatedToolArgs)if(t.includes(m)||m.includes(t)){d=a;let f=this.toolCallNames.get(a);f&&f!=="unknown_tool"&&(l=f);break}}}catch{}try{if(c?.tool_call_id&&typeof c.tool_call_id=="string")d=c.tool_call_id;else if(t)try{let a=typeof t=="string"?JSON.parse(t):t;a&&typeof a=="object"&&(a.tool_call_id?d=a.tool_call_id:a.id&&(d=a.id),a.name&&(l=a.name));}catch{}if(d===s&&this.accumulatedToolArgs.size>0&&t){for(let[a,m]of this.accumulatedToolArgs)if(t.includes(m)||m.includes(t)){d=a;break}}}catch{}this.toolCallInfo.set(s,{id:d,name:l});let g=(r?this.parentToAuthoritativeId.get(r):null)||r||"",i=this.latestMessageIds.get(g);try{this.transport.emit({type:"TOOL_CALL_START",toolCallId:d,toolCallName:l,parentMessageId:i,timestamp:Date.now()});let a=this.accumulatedToolArgs.get(d);a&&(this.transport.emit({type:"TOOL_CALL_ARGS",toolCallId:d,delta:a,timestamp:Date.now()}),this.accumulatedToolArgs.delete(d));}catch{}}async handleToolEnd(e,t,s){let r=this.toolCallInfo.get(t);this.toolCallInfo.delete(t),r?.id&&this.toolCallNames.delete(r.id);let o=(s?this.parentToAuthoritativeId.get(s):null)||s||"",c=this.latestMessageIds.get(o);try{let d=r?.id??t;if(e&&typeof e=="object"){let l=e.kwargs||e.lc_kwargs;l?.tool_call_id&&(d=l.tool_call_id);}this.transport.emit({type:"TOOL_CALL_END",toolCallId:d,timestamp:Date.now()}),this.emitToolResultWithPolicy(e,d,c,r?.name);}catch{}}async handleToolError(e,t,s){let r=this.toolCallInfo.get(t);this.toolCallInfo.delete(t),r?.id&&this.accumulatedToolArgs.delete(r.id);let o=(s?this.parentToAuthoritativeId.get(s):null)||s||"";this.latestMessageIds.get(o);try{this.transport.emit({type:"TOOL_CALL_END",toolCallId:r?.id??t,timestamp:Date.now()});}catch{}}chunkString(e,t){let s=[],r=e;for(;r.length>0;){if(new Blob([r]).size<=t){s.push(r);break}let o=t,c=r.lastIndexOf(" ",t),p=r.lastIndexOf(`
|
|
2
|
-
`,t),d=Math.max(c,
|
|
1
|
+
import {createMiddleware,createAgent}from'langchain';import {z as z$1}from'zod';import*as U from'fast-json-patch';import {HumanMessage,AIMessage,ToolMessage,SystemMessage,ChatMessage}from'@langchain/core/messages';import {EventSchemas,EventType}from'@ag-ui/core';export{EventSchemas,EventType}from'@ag-ui/core';import {BaseCallbackHandler}from'@langchain/core/callbacks/base';import {encode,decode,AGUI_MEDIA_TYPE}from'@ag-ui/proto';export{AGUI_MEDIA_TYPE,decode as decodeProtobuf,encode as encodeProtobuf}from'@ag-ui/proto';function h(){return crypto.randomUUID()}function v(n,e){if(!n)throw new Error("baseId is required for deterministic ID generation");let t=`${n}-${e}`,s=0;for(let o=0;o<t.length;o++){let c=t.charCodeAt(o);s=(s<<5)-s+c,s=s&s;}let a=Math.abs(s).toString(16).padStart(8,"0");return `${n}-${a}`}function I(n,e){return U.compare(n,e)}function C(n){let e=n.id||h(),t="assistant",s,a,o=typeof n.content=="string"?n.content:JSON.stringify(n.content);if(n instanceof HumanMessage||n.role==="user"||n._getType?.()==="human")t="user";else if(n instanceof AIMessage||n.role==="assistant"||n._getType?.()==="ai"){t="assistant";let c=n.tool_calls||n.kwargs?.tool_calls;c&&c.length>0&&(s=c.map(g=>({id:g.id,type:"function",function:{name:g.name,arguments:typeof g.args=="string"?g.args:JSON.stringify(g.args)}})));}else n instanceof ToolMessage||n.role==="tool"||n._getType?.()==="tool"?(t="tool",a=n.tool_call_id||n.kwargs?.tool_call_id):n instanceof SystemMessage||n.role==="system"||n._getType?.()==="system"?t="system":(n instanceof ChatMessage||n.role)&&(t=n.role);return {id:e,role:t,content:o,toolCalls:s,toolCallId:a,name:n.name}}function T(n){if(n==null)return n;if(Array.isArray(n))return n.map(T);if(typeof n=="object"){if((n.lc===1||n.lc_serializable===true)&&(n.kwargs||n.lc_kwargs)){let t=n.kwargs||n.lc_kwargs;return T(t)}let e={};for(let[t,s]of Object.entries(n))t==="lc"||t==="type"||t==="id"||t.startsWith("lc_")||(e[t]=T(s));return e}return n}function _(n){if(n==null)return "";let e=n;if(typeof n=="string")try{e=JSON.parse(n);}catch{return n}if(typeof e!="object")return String(e);e.lc===1||e.lc_serializable===true||e.type==="constructor"&&Array.isArray(e.id);let s=e.kwargs||e.lc_kwargs||e;return s&&s.content!==void 0?typeof s.content=="string"?s.content:JSON.stringify(s.content):e.result!==void 0?typeof e.result=="string"?e.result:JSON.stringify(e.result):e.output!==void 0?typeof e.output=="string"?e.output:JSON.stringify(e.output):JSON.stringify(T(e))}var M=z$1.object({transport:z$1.custom(n=>n&&typeof n.emit=="function",{message:"Transport must have an emit function"}),emitToolResults:z$1.boolean().default(true),emitStateSnapshots:z$1.enum(["initial","final","all","none"]).default("initial"),emitActivities:z$1.boolean().default(false),maxUIPayloadSize:z$1.number().positive().default(50*1024),chunkLargeResults:z$1.boolean().default(false),threadIdOverride:z$1.string().optional(),runIdOverride:z$1.string().optional(),errorDetailLevel:z$1.enum(["full","message","code","none"]).default("message"),stateMapper:z$1.custom().optional(),resultMapper:z$1.custom().optional(),activityMapper:z$1.custom().optional(),validateEvents:z$1.union([z$1.boolean(),z$1.literal("strict")]).default(false)});function x(n){try{let e=EventSchemas.safeParse(n);return e.success?{success:!0,data:n}:{success:!1,error:{message:"Event validation failed",issues:e.error.issues.map(t=>({path:t.path,message:t.message}))}}}catch(e){return {success:false,error:{message:e instanceof Error?e.message:"Unknown validation error",issues:[]}}}}function V(n){return x(n).success}function w(n,e={}){let{throwOnInvalid:t=false,onValidationError:s}=e;return {...n,emit:a=>{let o=x(a);if(!o.success&&(s?s(a,o.error):console.warn("[AG-UI Validation] Invalid event:",a.type,o.error),t))throw new Error(`Invalid AG-UI event: ${o.error?.message}`);n.emit(a);}}}function z(n){return n===true||n==="strict"}function B(n){let e=n;if(e.messages&&Array.isArray(e.messages)){let t=e.messages[e.messages.length-1];if(t&&typeof t.content=="string")return t.content.substring(0,100)+(t.content.length>100?"...":"")}return "[no input preview]"}function J(n){let e=n;if(e.messages&&Array.isArray(e.messages)){let t=e.messages[e.messages.length-1];if(t?.toolCalls?.length)return "tool_calls";if(t?.content)return "text"}return "unknown"}function $(n){let e=n;return !!(e.messages&&e.messages.some(t=>t.toolCalls?.length>0))}async function G(n,e,t,s,a,o,c){if(!e)return;let g=`activity-${e}-${t}`,d={status:a,timestamp:Date.now(),...c},l=o?o(d):d;if(!s.currentActivityId||s.currentActivityId!==g)s.currentActivityId=g,s.currentActivityType="AGENT_STEP",s.activityContent=l,n.emit({type:EventType.ACTIVITY_SNAPSHOT,messageId:g,activityType:"AGENT_STEP",content:l,replace:true});else {let m=I(s.activityContent,l);m.length>0&&(s.activityContent=l,n.emit({type:EventType.ACTIVITY_DELTA,messageId:g,activityType:"AGENT_STEP",patch:m}));}}function k(n){let e=M.parse(n),t=e.transport;z(e.validateEvents)&&(t=w(e.transport,{throwOnInvalid:e.validateEvents==="strict"}));let s,a,o,c=0,g={currentActivityId:void 0,currentActivityType:"AGENT_STEP",activityContent:{}};return createMiddleware({name:"ag-ui-lifecycle",contextSchema:z$1.object({run_id:z$1.string().optional(),runId:z$1.string().optional(),thread_id:z$1.string().optional(),threadId:z$1.string().optional()}),beforeAgent:async(l,m)=>{c=0;let i=m,r=i.config?.configurable||i.configurable;s=r?.threadId||r?.thread_id||r?.checkpoint_id||e.threadIdOverride||i.context?.threadId||i.context?.thread_id||"",a=e.runIdOverride||r?.run_id||i.runId||i.id||i.context?.runId||i.context?.run_id||i.config?.runId||crypto.randomUUID();try{if(t.emit({type:EventType.RUN_STARTED,threadId:s,runId:a,input:T(i.config?.input),timestamp:Date.now()}),e.emitStateSnapshots==="initial"||e.emitStateSnapshots==="all"){let E=e.stateMapper?e.stateMapper(l):T(l);!e.stateMapper&&E&&typeof E=="object"&&delete E.messages,t.emit({type:EventType.STATE_SNAPSHOT,snapshot:E,timestamp:Date.now()});}let y=l;y.messages&&Array.isArray(y.messages)&&t.emit({type:EventType.MESSAGES_SNAPSHOT,messages:y.messages.map(C),timestamp:Date.now()});}catch{}let u=i.config;return u&&(u.metadata={...u.metadata||{},agui_runId:a}),{}},beforeModel:async(l,m)=>{let i=c++,r=v(a,i),u=`model_call_${r}`;o=u;let E=m.config;E&&(E.metadata={...E.metadata||{},agui_messageId:r});try{t.emit({type:EventType.STEP_STARTED,stepName:u,timestamp:Date.now()}),e.emitActivities&&await G(t,a,i,g,"started",e.activityMapper,{stepName:u,modelName:m.config?.model?._modelType||"unknown",inputPreview:B(l)});}catch{}return {}},afterModel:async(l,m)=>{try{if(t.emit({type:EventType.STEP_FINISHED,stepName:o||"",timestamp:Date.now()}),e.emitActivities&&o){let i=c-1;await G(t,a,i,g,"completed",e.activityMapper,{stepName:o,outputType:J(l),hasToolCalls:$(l)});}if(e.emitStateSnapshots!=="none"){let i=T(l),r=e.stateMapper?e.stateMapper(i):i;!e.stateMapper&&r&&typeof r=="object"&&delete r.messages,(r?Object.keys(r).filter(y=>r[y]!==void 0&&r[y]!==null):[]).length>0&&t.emit({type:EventType.STATE_SNAPSHOT,snapshot:r,timestamp:Date.now()});}}catch{}return o=void 0,{}},afterAgent:async(l,m)=>{try{if(e.emitStateSnapshots==="final"||e.emitStateSnapshots==="all"){let r=e.stateMapper?e.stateMapper(l):T(l);!e.stateMapper&&r&&typeof r=="object"&&delete r.messages,t.emit({type:EventType.STATE_SNAPSHOT,snapshot:r,timestamp:Date.now()});}let i=l;if(i.error){let r=i.error,u=r instanceof Error?r.message:String(r);t.emit({type:EventType.RUN_ERROR,message:e.errorDetailLevel==="full"||e.errorDetailLevel==="message"?u:"",code:"AGENT_EXECUTION_ERROR",timestamp:Date.now()});}else t.emit({type:EventType.RUN_FINISHED,threadId:s,runId:a,result:e.resultMapper?e.resultMapper(l):void 0,timestamp:Date.now()});}catch{}return {}}})}function A(n){switch(n.type){case EventType.TEXT_MESSAGE_CHUNK:{let e=n,t=e.messageId||h(),s=[];return e.role&&s.push({type:EventType.TEXT_MESSAGE_START,messageId:t,role:e.role}),e.delta&&s.push({type:EventType.TEXT_MESSAGE_CONTENT,messageId:t,delta:e.delta}),e.role&&e.delta&&s.push({type:EventType.TEXT_MESSAGE_END,messageId:t}),s.length>0?s:[n]}case EventType.TOOL_CALL_CHUNK:{let e=n,t=e.toolCallId||h(),s=[];return e.toolCallName&&s.push({type:EventType.TOOL_CALL_START,toolCallId:t,toolCallName:e.toolCallName,parentMessageId:e.parentMessageId}),e.delta&&s.push({type:EventType.TOOL_CALL_ARGS,toolCallId:t,delta:e.delta}),e.toolCallName&&e.delta&&s.push({type:EventType.TOOL_CALL_END,toolCallId:t,parentMessageId:e.parentMessageId}),s.length>0?s:[n]}default:return [n]}}var b=class extends BaseCallbackHandler{name="ag-ui-callback";messageIds=new Map;latestMessageIds=new Map;agentRunIds=new Map;parentToAuthoritativeId=new Map;thinkingIds=new Map;toolCallInfo=new Map;toolCallNames=new Map;agentTurnTracker=new Map;pendingToolCalls=new Map;accumulatedToolArgs=new Map;transport;maxUIPayloadSize;chunkLargeResults;constructor(e,t){super({raiseError:false}),this.transport=e,this.maxUIPayloadSize=t?.maxUIPayloadSize??50*1024,this.chunkLargeResults=t?.chunkLargeResults??false;}dispose(){this.messageIds.clear(),this.latestMessageIds.clear(),this.agentRunIds.clear(),this.parentToAuthoritativeId.clear(),this.thinkingIds.clear(),this.toolCallInfo.clear(),this.toolCallNames.clear(),this.agentTurnTracker.clear(),this.pendingToolCalls.clear(),this.accumulatedToolArgs.clear();}async emitTextChunk(e,t="assistant",s){let a=A({type:EventType.TEXT_MESSAGE_CHUNK,messageId:e,role:t,delta:s});for(let o of a)await this.transport.emit(o);}async emitToolChunk(e,t,s,a){let o=A({type:EventType.TOOL_CALL_CHUNK,toolCallId:e,toolCallName:t,delta:s,parentMessageId:a});for(let c of o)await this.transport.emit(c);}async handleLLMStart(e,t,s,a,o,c,g,d){let l=g?.agui_runId||g?.run_id||g?.configurable?.run_id||a||s;this.agentRunIds.set(s,l),a&&this.parentToAuthoritativeId.set(a,l);let m=g?.agui_messageId;if(m)this.messageIds.set(s,m),this.latestMessageIds.set(l,m),this.transport.emit({type:EventType.TEXT_MESSAGE_START,messageId:m,role:"assistant",timestamp:Date.now()});else {let i=this.agentTurnTracker.get(l)||0;this.agentTurnTracker.set(l,i+1);let r=v(l,i);this.messageIds.set(s,r),this.latestMessageIds.set(l,r),this.transport.emit({type:EventType.TEXT_MESSAGE_START,messageId:r,role:"assistant",timestamp:Date.now()});}}async handleLLMNewToken(e,t,s,a,o,c){let g=this.messageIds.get(s);if(g)try{let d=c?.chunk?.message?.additional_kwargs?.reasoning_content||c?.chunk?.message?.additional_kwargs?.reasoning;if(d){let m=this.thinkingIds.get(s);if(!m){let r=this.agentRunIds.get(s)||(a?this.parentToAuthoritativeId.get(a):null)||a||s;m=v(r,(this.agentTurnTracker.get(r)||1)+100),this.thinkingIds.set(s,m),this.transport.emit({type:EventType.THINKING_START,timestamp:Date.now()}),this.transport.emit({type:EventType.THINKING_TEXT_MESSAGE_START,messageId:m,timestamp:Date.now()});}let i=typeof d=="string"?d:d.text||JSON.stringify(d);this.transport.emit({type:EventType.THINKING_TEXT_MESSAGE_CONTENT,messageId:m,delta:i,timestamp:Date.now()});}e&&e.length>0&&this.transport.emit({type:EventType.TEXT_MESSAGE_CONTENT,messageId:g,delta:e,timestamp:Date.now()});let l=c?.chunk?.message?.tool_call_chunks;if(l&&Array.isArray(l)){let m=this.agentRunIds.get(s)||(a?this.parentToAuthoritativeId.get(a):null)||a||s,i=this.pendingToolCalls.get(m)||[];for(let r of l)if(r.id&&r.args){let u=this.accumulatedToolArgs.get(r.id)||"",y=u+r.args;y!==u&&this.accumulatedToolArgs.set(r.id,y),i.includes(r.id)||i.push(r.id);}i.length>0&&this.pendingToolCalls.set(m,i);}}catch{}}async handleLLMEnd(e,t,s,a,o){let c=this.messageIds.get(t),g=this.thinkingIds.get(t);try{if(e&&typeof e=="object"){let d=e.tool_calls||e.kwargs?.tool_calls;if(Array.isArray(d)){let l=this.agentRunIds.get(t)||(s?this.parentToAuthoritativeId.get(s):null)||s||t,m=this.pendingToolCalls.get(l)||[];for(let i of d)i.id&&!m.includes(i.id)&&(m.push(i.id),i.function?.name&&this.toolCallNames.set(i.id,i.function.name),i.function?.arguments&&this.accumulatedToolArgs.set(i.id,i.function.arguments));this.pendingToolCalls.set(l,m);}}c&&this.transport.emit({type:EventType.TEXT_MESSAGE_END,messageId:c,timestamp:Date.now()}),g&&(this.transport.emit({type:EventType.THINKING_TEXT_MESSAGE_END,messageId:g,timestamp:Date.now()}),this.transport.emit({type:EventType.THINKING_END,timestamp:Date.now()}),this.thinkingIds.delete(t)),this.messageIds.delete(t);}catch{}}async handleLLMError(e,t,s){this.messageIds.delete(t),this.thinkingIds.delete(t);let a=this.agentRunIds.get(t)||(s?this.parentToAuthoritativeId.get(s):null)||s||t;this.pendingToolCalls.delete(a),this.agentRunIds.delete(t);}async handleToolStart(e,t,s,a,o,c,g){let d=s,l=g||e.kwargs?.name||e.name||e.func?.name||e.getName?.()||e.toolName||e._name||"unknown_tool";try{if(c?.tool_call_id&&typeof c.tool_call_id=="string"){d=c.tool_call_id;let r=this.toolCallNames.get(d);r&&r!=="unknown_tool"&&(l=r);}else if(t)try{let r=typeof t=="string"?JSON.parse(t):t;r&&typeof r=="object"&&(r.tool_call_id?d=r.tool_call_id:r.id&&(d=r.id),r.name&&(l=r.name));}catch{}if(d===s&&this.accumulatedToolArgs.size>0&&t){for(let[r,u]of this.accumulatedToolArgs)if(t.includes(u)||u.includes(t)){d=r;let y=this.toolCallNames.get(r);y&&y!=="unknown_tool"&&(l=y);break}}}catch{}try{if(c?.tool_call_id&&typeof c.tool_call_id=="string")d=c.tool_call_id;else if(t)try{let r=typeof t=="string"?JSON.parse(t):t;r&&typeof r=="object"&&(r.tool_call_id?d=r.tool_call_id:r.id&&(d=r.id),r.name&&(l=r.name));}catch{}if(d===s&&this.accumulatedToolArgs.size>0&&t){for(let[r,u]of this.accumulatedToolArgs)if(t.includes(u)||u.includes(t)){d=r;break}}}catch{}this.toolCallInfo.set(s,{id:d,name:l});let m=(a?this.parentToAuthoritativeId.get(a):null)||a||"",i=this.latestMessageIds.get(m);try{this.transport.emit({type:EventType.TOOL_CALL_START,toolCallId:d,toolCallName:l,parentMessageId:i,timestamp:Date.now()});let r=this.accumulatedToolArgs.get(d);r&&(this.transport.emit({type:EventType.TOOL_CALL_ARGS,toolCallId:d,delta:r,timestamp:Date.now()}),this.accumulatedToolArgs.delete(d));}catch{}}async handleToolEnd(e,t,s){let a=this.toolCallInfo.get(t);this.toolCallInfo.delete(t),a?.id&&this.toolCallNames.delete(a.id);let o=(s?this.parentToAuthoritativeId.get(s):null)||s||"",c=this.latestMessageIds.get(o);try{let d=a?.id??t;if(e&&typeof e=="object"){let l=e.kwargs||e.lc_kwargs;l?.tool_call_id&&(d=l.tool_call_id);}this.transport.emit({type:EventType.TOOL_CALL_END,toolCallId:d,timestamp:Date.now()}),this.emitToolResultWithPolicy(e,d,c,a?.name);}catch{}}async handleToolError(e,t,s){let a=this.toolCallInfo.get(t);this.toolCallInfo.delete(t),a?.id&&this.accumulatedToolArgs.delete(a.id);let o=(s?this.parentToAuthoritativeId.get(s):null)||s||"";this.latestMessageIds.get(o);try{this.transport.emit({type:EventType.TOOL_CALL_END,toolCallId:a?.id??t,timestamp:Date.now()});}catch{}}chunkString(e,t){let s=[],a=e;for(;a.length>0;){if(new Blob([a]).size<=t){s.push(a);break}let o=t,c=a.lastIndexOf(" ",t),g=a.lastIndexOf(`
|
|
2
|
+
`,t),d=Math.max(c,g);if(d>t*.5)o=d;else {for(;o>0&&a.charCodeAt(o-1)>127;)o--;o===0&&(o=t);}s.push(a.substring(0,o)),a=a.substring(o).trim();}return s}emitToolResultWithPolicy(e,t,s,a){let o=_(e),c=h(),g=new Blob([o]).size;if(g<=this.maxUIPayloadSize){this.transport.emit({type:EventType.TOOL_CALL_RESULT,messageId:c,toolCallId:t,content:o,role:"tool",timestamp:Date.now()});return}if(this.chunkLargeResults){let i=this.chunkString(o,this.maxUIPayloadSize);for(let r=0;r<i.length;r++)this.transport.emit({type:EventType.CUSTOM,name:"LARGE_RESULT_CHUNK",value:{toolCallId:t,chunk:i[r],index:r,total:i.length}});return}let d=` [Truncated: ${g-this.maxUIPayloadSize+50} bytes]`,l=this.maxUIPayloadSize-d.length,m=o.substring(0,Math.max(0,l))+d;this.transport.emit({type:EventType.TOOL_CALL_RESULT,messageId:c,toolCallId:t,content:m,role:"tool",timestamp:Date.now()});}};function Y(n){let e=k({transport:n.transport,emitToolResults:n.middlewareOptions?.emitToolResults??true,emitStateSnapshots:n.middlewareOptions?.emitStateSnapshots??"initial",emitActivities:n.middlewareOptions?.emitActivities??false,maxUIPayloadSize:n.middlewareOptions?.maxUIPayloadSize??51200,chunkLargeResults:n.middlewareOptions?.chunkLargeResults??false,threadIdOverride:n.middlewareOptions?.threadIdOverride,runIdOverride:n.middlewareOptions?.runIdOverride,errorDetailLevel:n.middlewareOptions?.errorDetailLevel??"message",stateMapper:n.middlewareOptions?.stateMapper,resultMapper:n.middlewareOptions?.resultMapper,activityMapper:n.middlewareOptions?.activityMapper,validateEvents:n.middlewareOptions?.validateEvents??false}),t=createAgent({model:n.model,tools:n.tools,middleware:[e]});return t&&typeof t.withListeners=="function"?t.withListeners({onError:s=>{try{let a=s.config?.configurable?.threadId,o=s.config?.configurable?.runId;n.transport.emit({type:EventType.RUN_ERROR,message:typeof s.error=="string"?s.error:s.error?.message||"Agent execution failed",code:"AGENT_EXECUTION_ERROR",timestamp:Date.now()});}catch{}}}):t}function Q(n,e){e.setHeader("Content-Type","text/event-stream"),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive"),e.setHeader("X-Accel-Buffering","no");let t=new AbortController;n.on("close",()=>t.abort());let s=[],a=false;async function o(){for(a=true;s.length>0&&e.write;){let c=s.shift();try{e.write(`data: ${JSON.stringify(c)}
|
|
3
3
|
|
|
4
|
-
`);}catch{break}}
|
|
4
|
+
`);}catch{break}}a=false;}return {emit:c=>{s.push(c),a||o();},signal:t.signal,disconnect:e.end?()=>{e.end?.();}:void 0,isConnected:()=>!t.signal.aborted}}function O(n){let e=te(n),t=encode(e),s=new DataView(new ArrayBuffer(4));s.setUint32(0,t.length,false);let a=new Uint8Array(4+t.length);return a.set(new Uint8Array(s.buffer),0),a.set(t,4),a}function R(n){if(n.length<4)throw new Error("Invalid protobuf frame: insufficient data for length prefix");let e=new DataView(n.buffer,n.byteOffset).getUint32(0,false);if(n.length<4+e)throw new Error("Invalid protobuf frame: insufficient data for payload");let t=n.slice(4,4+e),s=decode(t);return ne(s)}function te(n){let e={...n};if(n.type===EventType.MESSAGES_SNAPSHOT){let t=n;t.messages&&(e.messages=t.messages.map(s=>({...s,toolCalls:s.tool_calls?.map(a=>({id:a.id,type:a.type,function:a.function})),tool_calls:void 0,toolCallId:s.tool_call_id,tool_call_id:void 0})));}return e}function ne(n){let e={...n};return n.type===EventType.MESSAGES_SNAPSHOT&&n.messages&&(e.messages=n.messages.map(t=>({...t,tool_calls:t.toolCalls?.map(s=>({id:s.id,type:s.type,function:s.function})),toolCalls:void 0,tool_call_id:t.toolCallId,toolCallId:void 0}))),e}function se(n,e){e.setHeader("Content-Type",AGUI_MEDIA_TYPE),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive"),e.setHeader("X-Accel-Buffering","no");let t=new AbortController;n.on("close",()=>t.abort());let s=[],a=false;async function o(){for(a=true;s.length>0&&e.write;){let c=s.shift();try{let g=O(c);e.write(g);}catch{break}}a=false;}return {emit:c=>{s.push(c),a||o();},signal:t.signal,disconnect:e.end?()=>{e.end?.();}:void 0,isConnected:()=>!t.signal.aborted,encodeEvent:O,decodeEvent:R}}export{b as AGUICallbackHandler,M as AGUIMiddlewareOptionsSchema,T as cleanLangChainData,I as computeStateDelta,Y as createAGUIAgent,k as createAGUIMiddleware,se as createProtobufTransport,Q as createSSETransport,w as createValidatingTransport,R as decodeEventWithFraming,O as encodeEventWithFraming,A as expandEvent,_ as extractToolOutput,h as generateId,V as isValidEvent,C as mapLangChainMessageToAGUI,x as validateEvent};//# sourceMappingURL=index.js.map
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/idGenerator.ts","../src/utils/stateDiff.ts","../src/utils/messageMapper.ts","../src/utils/cleaner.ts","../src/middleware/types.ts","../src/utils/validation.ts","../src/middleware/createAGUIMiddleware.ts","../src/utils/eventNormalizer.ts","../src/callbacks/AGUICallbackHandler.ts","../src/createAGUIAgent.ts","../src/transports/createSSETransport.ts","../src/transports/createProtobufTransport.ts"],"names":["generateId","generateDeterministicId","baseId","index","str","hash","i","char","hex","computeStateDelta","oldState","newState","compare","mapLangChainMessageToAGUI","message","id","role","toolCalls","toolCallId","content","HumanMessage","AIMessage","toolCallsFromLLM","tc","ToolMessage","SystemMessage","ChatMessage","cleanLangChainData","data","kwargs","result","key","value","extractToolOutput","output","parsed","AGUIMiddlewareOptionsSchema","z","val","validateEvent","event","EventSchemas","issue","err","isValidEvent","createValidatingTransport","transport","options","throwOnInvalid","onValidationError","isValidationEnabled","validateEvents","getInputPreview","state","stateAny","lastMessage","getOutputType","hasToolCalls","m","emitActivityUpdate","currentRunId","stepIndex","activityTracker","status","activityMapper","details","activityId","baseContent","finalContent","patch","createAGUIMiddleware","validated","threadId","runId","currentStepName","modelTurnIndex","createMiddleware","runtime","runtimeAny","configurable","snapshot","configAny","turnIndex","messageId","stepName","_runtime","filteredState","k","error","errorMessage","expandEvent","results","AGUICallbackHandler","BaseCallbackHandler","delta","events","toolCallName","parentMessageId","_llm","_prompts","_parentRunId","_extraParams","_tags","_metadata","_runName","agentRunId","middlewareMessageId","token","_idx","fields","reasoningContent","thinkingId","toolCallChunks","pending","chunk","previousArgs","newArgs","_output","_error","tool","input","parentRunId","metadata","runName","storedName","args","accumulatedArgs","toolInfo","finalToolCallId","maxChunkSize","chunks","remaining","splitPoint","spaceIndex","newlineIndex","boundaryIndex","resultMessageId","contentSize","truncationMessage","availableSpace","truncatedContent","createAGUIAgent","config","middleware","agent","createAgent","run","createSSETransport","req","res","controller","queue","draining","drain","encodeEventWithFraming","coreEvent","convertToProtobufEvent","eventBytes","encode","lengthPrefix","decodeEventWithFraming","length","decoded","decode","convertFromProtobufEvent","baseEvent","msg","createProtobufTransport","AGUI_MEDIA_TYPE","framedData"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ID Generator Utility\n * \n * Generates unique IDs using crypto.randomUUID() or deterministic hashing.\n */\n\n/**\n * Generate a unique ID using crypto.randomUUID()\n * \n * @returns A UUID v4 string (e.g., \"550e8400-e29b-41d4-a716-446655440000\")\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Generate a deterministic ID from a base ID and an index.\n * Useful for coordinating between Middleware and Callbacks without direct communication.\n * \n * @param baseId - The base ID (e.g., runId)\n * @param index - The turn index\n * @returns A deterministic hyphenated string [prefix]-[hash]\n */\nexport function generateDeterministicId(baseId: string, index: number): string {\n if (!baseId) {\n throw new Error(\"baseId is required for deterministic ID generation\");\n }\n\n const str = `${baseId}-${index}`;\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n // Return a stable hex string\n const hex = Math.abs(hash).toString(16).padStart(8, '0');\n \n // Use the baseId as the prefix to ensure uniqueness across different runs.\n // We keep the full baseId to avoid any ambiguity or collision risk.\n return `${baseId}-${hex}`;\n}\n","/**\n * State Diff Utility\n * \n * Computes JSON Patch deltas between two state objects.\n * Uses fast-json-patch's compare function to generate RFC 6902 patch operations.\n */\n\nimport { compare, type Operation } from \"fast-json-patch\";\n\n/**\n * Compute the delta between two state objects using JSON Patch (RFC 6902).\n * \n * @param oldState - The previous state object\n * @param newState - The updated state object\n * @returns An array of JSON Patch operations describing the changes\n */\nexport function computeStateDelta(\n oldState: unknown,\n newState: unknown\n): Operation[] {\n return compare(oldState as any, newState as any);\n}\n","import { \n BaseMessage, \n HumanMessage, \n AIMessage, \n ToolMessage, \n SystemMessage,\n ChatMessage\n} from \"@langchain/core/messages\";\nimport { generateId } from \"./idGenerator\";\nimport type { Message, ToolCall } from \"../events\";\n\n/**\n * Maps a LangChain BaseMessage to an AG-UI Protocol Message.\n * \n * @param message - The LangChain message to map\n * @returns An AG-UI Protocol compliant Message object\n */\nexport function mapLangChainMessageToAGUI(message: BaseMessage): Message {\n const id = (message as any).id || generateId();\n let role: Message[\"role\"] = \"assistant\";\n let toolCalls: ToolCall[] | undefined;\n let toolCallId: string | undefined;\n let content = typeof message.content === \"string\" ? message.content : JSON.stringify(message.content);\n\n if (message instanceof HumanMessage || (message as any).role === \"user\" || (message as any)._getType?.() === \"human\") {\n role = \"user\";\n } else if (message instanceof AIMessage || (message as any).role === \"assistant\" || (message as any)._getType?.() === \"ai\") {\n role = \"assistant\";\n const toolCallsFromLLM = (message as any).tool_calls || (message as any).kwargs?.tool_calls;\n if (toolCallsFromLLM && toolCallsFromLLM.length > 0) {\n toolCalls = toolCallsFromLLM.map((tc: any) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: typeof tc.args === \"string\" ? tc.args : JSON.stringify(tc.args)\n }\n }));\n }\n } else if (message instanceof ToolMessage || (message as any).role === \"tool\" || (message as any)._getType?.() === \"tool\") {\n role = \"tool\";\n toolCallId = (message as any).tool_call_id || (message as any).kwargs?.tool_call_id;\n } else if (message instanceof SystemMessage || (message as any).role === \"system\" || (message as any)._getType?.() === \"system\") {\n role = \"system\";\n } else if (message instanceof ChatMessage) {\n role = message.role as any;\n } else if ((message as any).role) {\n role = (message as any).role;\n }\n\n return {\n id,\n role,\n content,\n toolCalls,\n toolCallId,\n name: (message as any).name\n };\n}\n","/**\n * Utility to clean up LangChain serialized objects from state/output.\n */\n\n/**\n * Recursively removes 'lc', 'type', 'id' (LangChain internal) fields and \n * flattens 'kwargs' if present.\n */\nexport function cleanLangChainData(data: any): any {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map(cleanLangChainData);\n }\n\n if (typeof data === \"object\") {\n // Check if it's a LangChain serialized object\n if ((data.lc === 1 || data.lc_serializable === true) && (data.kwargs || data.lc_kwargs)) {\n const kwargs = data.kwargs || data.lc_kwargs;\n const cleaned = cleanLangChainData(kwargs);\n return cleaned;\n }\n\n const result: any = {};\n for (const [key, value] of Object.entries(data)) {\n // Skip internal metadata often found in LangChain objects\n if (key === \"lc\" || key === \"type\" || key === \"id\" || key.startsWith(\"lc_\")) {\n continue;\n }\n result[key] = cleanLangChainData(value);\n }\n return result;\n }\n\n return data;\n}\n\n/**\n * Extracts content from a tool output if it's a serialized ToolMessage or object.\n */\nexport function extractToolOutput(output: any): string {\n if (output === null || output === undefined) {\n return \"\";\n }\n\n // If it's already a string, try to parse it (it might be a JSON-encoded LangChain message)\n let parsed = output;\n if (typeof output === \"string\") {\n try {\n parsed = JSON.parse(output);\n } catch {\n return output;\n }\n }\n\n // Now 'parsed' is either an object or the original output if it wasn't valid JSON\n\n if (typeof parsed !== \"object\") {\n return String(parsed);\n }\n\n // Handle LangChain message structures (lc: 1 or lc_serializable: true)\n const isLangChainMessage = parsed.lc === 1 || parsed.lc_serializable === true || (parsed.type === \"constructor\" && Array.isArray(parsed.id));\n const kwargs = parsed.kwargs || parsed.lc_kwargs || parsed;\n\n if (kwargs && kwargs.content !== undefined) {\n return typeof kwargs.content === \"string\" \n ? kwargs.content \n : JSON.stringify(kwargs.content);\n }\n\n // If it's a plain object but has a 'result' or 'output' field\n if (parsed.result !== undefined) return typeof parsed.result === \"string\" ? parsed.result : JSON.stringify(parsed.result);\n if (parsed.output !== undefined) return typeof parsed.output === \"string\" ? parsed.output : JSON.stringify(parsed.output);\n\n // If no specific field found, return stringified version of the object (but cleaned)\n return JSON.stringify(cleanLangChainData(parsed));\n}\n","/**\n * AG-UI Middleware Types and Configuration\n * \n * Defines the middleware options schema and types for AG-UI protocol integration.\n */\n\nimport { z } from \"zod\";\nimport type { AGUITransport } from \"../transports/types\";\n\n/**\n * Middleware options schema with Zod validation.\n */\nexport const AGUIMiddlewareOptionsSchema = z.object({\n // Transport (required)\n transport: z.custom<AGUITransport>(\n (val) => val && typeof (val as AGUITransport).emit === \"function\",\n {\n message: \"Transport must have an emit function\",\n }\n ),\n\n // Event control\n emitToolResults: z.boolean().default(true),\n emitStateSnapshots: z.enum([\"initial\", \"final\", \"all\", \"none\"]).default(\"initial\"),\n emitActivities: z.boolean().default(false),\n\n // Smart Emission Policy\n maxUIPayloadSize: z.number().positive().default(50 * 1024), // 50KB\n chunkLargeResults: z.boolean().default(false),\n\n // Session Override\n threadIdOverride: z.string().optional(),\n runIdOverride: z.string().optional(),\n\n // Error Handling\n errorDetailLevel: z.enum([\"full\", \"message\", \"code\", \"none\"]).default(\"message\"),\n\n // Data Mappers (New in Protocol Compliance)\n stateMapper: z.custom<(state: any) => any>().optional(),\n resultMapper: z.custom<(result: any) => any>().optional(),\n activityMapper: z.custom<(node: any) => any>().optional(),\n \n // Validation (New - @ag-ui/core integration)\n /**\n * Enable runtime validation of events against @ag-ui/core schemas.\n * Disabled by default for performance. Enable in development for debugging.\n * \n * - false (default): No validation, events emitted as-is\n * - true: Validate events, log warnings for invalid events\n * - \"strict\": Validate events, throw on invalid events\n */\n validateEvents: z.union([\n z.boolean(),\n z.literal(\"strict\"),\n ]).default(false),\n});\n\n/**\n * Inferred type for middleware options.\n */\nexport type AGUIMiddlewareOptions = z.infer<typeof AGUIMiddlewareOptionsSchema>;\n","/**\n * AG-UI Event Validation Utilities\n * \n * Provides optional runtime validation of AG-UI events using @ag-ui/core Zod schemas.\n * Validation is disabled by default for performance; enable in development for debugging.\n * \n * @example\n * ```typescript\n * import { validateEvent, isValidEvent } from './utils/validation';\n * \n * // Safe validation (returns result object)\n * const result = validateEvent(event);\n * if (result.success) {\n * console.log('Valid event:', result.data);\n * } else {\n * console.error('Invalid event:', result.error);\n * }\n * \n * // Boolean check\n * if (isValidEvent(event)) {\n * // event is valid\n * }\n * ```\n */\n\nimport { EventSchemas } from '@ag-ui/core';\nimport type { AGUIEvent } from '../events';\n\n/**\n * Result of event validation.\n */\nexport interface ValidationResult<T = AGUIEvent> {\n success: boolean;\n data?: T;\n error?: {\n message: string;\n issues: Array<{\n path: (string | number)[];\n message: string;\n }>;\n };\n}\n\n/**\n * Validate an AG-UI event against @ag-ui/core schemas.\n * \n * Events are now emitted with camelCase field names (toolCalls, toolCallId)\n * which matches the @ag-ui/core schema directly.\n * \n * @param event - The event to validate\n * @returns ValidationResult with success status and any errors\n */\nexport function validateEvent(event: unknown): ValidationResult {\n try {\n const result = EventSchemas.safeParse(event);\n \n if (result.success) {\n return {\n success: true,\n data: event as AGUIEvent,\n };\n }\n \n return {\n success: false,\n error: {\n message: 'Event validation failed',\n issues: result.error.issues.map(issue => ({\n path: issue.path,\n message: issue.message,\n })),\n },\n };\n } catch (err) {\n return {\n success: false,\n error: {\n message: err instanceof Error ? err.message : 'Unknown validation error',\n issues: [],\n },\n };\n }\n}\n\n/**\n * Check if an event is valid according to @ag-ui/core schemas.\n * \n * @param event - The event to check\n * @returns true if valid, false otherwise\n */\nexport function isValidEvent(event: unknown): event is AGUIEvent {\n return validateEvent(event).success;\n}\n\n/**\n * Create a validating transport wrapper.\n * Wraps any AGUITransport to add validation before emission.\n * \n * @param transport - The transport to wrap\n * @param options - Validation options\n * @returns Wrapped transport with validation\n */\nexport function createValidatingTransport<T extends { emit: (event: AGUIEvent) => void }>(\n transport: T,\n options: {\n /** Throw on invalid events (default: false - just log warning) */\n throwOnInvalid?: boolean;\n /** Custom logger for validation errors */\n onValidationError?: (event: AGUIEvent, error: ValidationResult['error']) => void;\n } = {}\n): T {\n const { throwOnInvalid = false, onValidationError } = options;\n \n return {\n ...transport,\n emit: (event: AGUIEvent) => {\n const result = validateEvent(event);\n \n if (!result.success) {\n if (onValidationError) {\n onValidationError(event, result.error);\n } else {\n console.warn('[AG-UI Validation] Invalid event:', event.type, result.error);\n }\n \n if (throwOnInvalid) {\n throw new Error(`Invalid AG-UI event: ${result.error?.message}`);\n }\n }\n \n // Always emit (validation is advisory)\n transport.emit(event);\n },\n };\n}\n","/**\n * AG-UI Middleware Factory\n *\n * Creates middleware that integrates LangChain agents with the AG-UI protocol.\n */\n\nimport { createMiddleware } from \"langchain\";\nimport { z } from \"zod\";\nimport { generateDeterministicId } from \"../utils/idGenerator\";\nimport { computeStateDelta } from \"../utils/stateDiff\";\nimport { mapLangChainMessageToAGUI } from \"../utils/messageMapper\";\nimport { cleanLangChainData } from \"../utils/cleaner\";\nimport {\n AGUIMiddlewareOptionsSchema,\n type AGUIMiddlewareOptions,\n} from \"./types\";\nimport { createValidatingTransport } from \"../utils/validation\";\n\n/**\n * Check if validateEvents mode is truthy (true or \"strict\").\n */\nfunction isValidationEnabled(validateEvents: AGUIMiddlewareOptions['validateEvents']): boolean {\n return validateEvents === true || validateEvents === \"strict\";\n}\n\n/**\n * Interface for tracking agent execution activities.\n */\ninterface ActivityTracker {\n currentActivityId: string | undefined;\n currentActivityType: string;\n activityContent: Record<string, any>;\n}\n\n/**\n * Helper function to get a preview of the input for activity content.\n */\nfunction getInputPreview(state: unknown): string {\n const stateAny = state as any;\n if (stateAny.messages && Array.isArray(stateAny.messages)) {\n const lastMessage = stateAny.messages[stateAny.messages.length - 1];\n if (lastMessage && typeof lastMessage.content === \"string\") {\n return lastMessage.content.substring(0, 100) + (lastMessage.content.length > 100 ? \"...\" : \"\");\n }\n }\n return \"[no input preview]\";\n}\n\n/**\n * Helper function to get the type of output from state.\n */\nfunction getOutputType(state: unknown): string {\n const stateAny = state as any;\n if (stateAny.messages && Array.isArray(stateAny.messages)) {\n const lastMessage = stateAny.messages[stateAny.messages.length - 1];\n if (lastMessage?.toolCalls?.length) return \"tool_calls\";\n if (lastMessage?.content) return \"text\";\n }\n return \"unknown\";\n}\n\n/**\n * Helper function to check if state contains tool calls.\n */\nfunction hasToolCalls(state: unknown): boolean {\n const stateAny = state as any;\n return !!(stateAny.messages && stateAny.messages.some((m: any) => m.toolCalls?.length > 0));\n}\n\n/**\n * Emit ACTIVITY_SNAPSHOT or ACTIVITY_DELTA based on current state.\n * ACTIVITY_SNAPSHOT = new activity or significant change\n * ACTIVITY_DELTA = incremental update\n */\nasync function emitActivityUpdate(\n transport: any,\n currentRunId: string | undefined,\n stepIndex: number,\n activityTracker: ActivityTracker,\n status: \"started\" | \"processing\" | \"completed\",\n activityMapper: ((node: any) => any) | undefined,\n details?: Record<string, any>\n): Promise<void> {\n if (!currentRunId) return;\n\n const activityId = `activity-${currentRunId}-${stepIndex}`;\n const baseContent = {\n status,\n timestamp: Date.now(),\n ...details,\n };\n\n // Apply activityMapper if provided\n const finalContent = activityMapper ? activityMapper(baseContent) : baseContent;\n\n if (!activityTracker.currentActivityId || activityTracker.currentActivityId !== activityId) {\n // New activity - emit SNAPSHOT\n activityTracker.currentActivityId = activityId;\n activityTracker.currentActivityType = \"AGENT_STEP\";\n activityTracker.activityContent = finalContent;\n\n transport.emit({\n type: \"ACTIVITY_SNAPSHOT\",\n messageId: activityId,\n activityType: \"AGENT_STEP\",\n content: finalContent,\n replace: true,\n });\n } else {\n // Existing activity - emit DELTA\n const patch = computeStateDelta(activityTracker.activityContent, finalContent);\n if (patch.length > 0) {\n activityTracker.activityContent = finalContent;\n\n transport.emit({\n type: \"ACTIVITY_DELTA\",\n messageId: activityId,\n activityType: \"AGENT_STEP\",\n patch,\n });\n }\n }\n}\n\n/**\n * Create AG-UI middleware for LangChain agents.\n *\n * @param options - Middleware configuration options\n * @returns AgentMiddleware instance with lifecycle hooks\n */\nexport function createAGUIMiddleware(options: AGUIMiddlewareOptions) {\n // Validate options at creation time\n const validated = AGUIMiddlewareOptionsSchema.parse(options);\n \n // Wrap transport with validation if enabled\n // In \"strict\" mode, throw on invalid events; in true mode, log warnings\n let transport = validated.transport;\n if (isValidationEnabled(validated.validateEvents)) {\n transport = createValidatingTransport(validated.transport, {\n throwOnInvalid: validated.validateEvents === \"strict\",\n });\n }\n \n let threadId: string | undefined;\n let runId: string | undefined;\n let currentStepName: string | undefined = undefined;\n let modelTurnIndex = 0;\n\n const activityTracker: ActivityTracker = {\n currentActivityId: undefined,\n currentActivityType: \"AGENT_STEP\",\n activityContent: {},\n };\n\n const activityStates = new Map<string, any>();\n\n return createMiddleware({\n name: \"ag-ui-lifecycle\",\n contextSchema: z.object({\n run_id: z.string().optional(),\n runId: z.string().optional(),\n thread_id: z.string().optional(),\n threadId: z.string().optional(),\n }) as any,\n\n beforeAgent: async (state, runtime) => {\n modelTurnIndex = 0;\n const runtimeAny = runtime as any;\n const configurable = runtimeAny.config?.configurable || runtimeAny.configurable;\n \n threadId =\n (configurable?.threadId as string | undefined) ||\n (configurable?.thread_id as string | undefined) ||\n (configurable?.checkpoint_id as string | undefined) ||\n validated.threadIdOverride ||\n (runtimeAny.context?.threadId as string | undefined) ||\n (runtimeAny.context?.thread_id as string | undefined) ||\n \"\";\n\n // Exhaustive search for Run ID - generate fallback if not found\n runId =\n validated.runIdOverride ||\n (configurable?.run_id as string | undefined) ||\n (runtimeAny.runId as string | undefined) ||\n (runtimeAny.id as string | undefined) ||\n (runtimeAny.context?.runId as string | undefined) ||\n (runtimeAny.context?.run_id as string | undefined) ||\n (runtimeAny.config?.runId as string | undefined) ||\n crypto.randomUUID(); // Generate fallback for streamEvents compatibility\n\n try {\n transport.emit({\n type: \"RUN_STARTED\",\n threadId,\n runId,\n input: cleanLangChainData(runtimeAny.config?.input),\n timestamp: Date.now(),\n });\n\n if (\n validated.emitStateSnapshots === \"initial\" ||\n validated.emitStateSnapshots === \"all\"\n ) {\n const snapshot = validated.stateMapper \n ? validated.stateMapper(state) \n : cleanLangChainData(state);\n \n // Remove messages from state snapshot by default to avoid redundancy\n if (!validated.stateMapper && snapshot && typeof snapshot === \"object\") {\n delete (snapshot as any).messages;\n }\n\n transport.emit({\n type: \"STATE_SNAPSHOT\",\n snapshot,\n timestamp: Date.now(),\n });\n }\n \n const stateAny = state as any;\n if (stateAny.messages && Array.isArray(stateAny.messages)) {\n transport.emit({\n type: \"MESSAGES_SNAPSHOT\",\n messages: stateAny.messages.map(mapLangChainMessageToAGUI),\n timestamp: Date.now(),\n });\n }\n } catch {\n // Fail-safe\n }\n\n // Store runId in metadata for callback coordination\n // This allows callbacks to use the same runId as middleware\n const configAny = runtimeAny.config as any;\n if (configAny) {\n configAny.metadata = {\n ...(configAny.metadata || {}),\n agui_runId: runId,\n };\n }\n\n return {};\n },\n\n beforeModel: async (state, runtime) => {\n const turnIndex = modelTurnIndex++;\n const messageId = generateDeterministicId(runId!, turnIndex);\n const stepName = `model_call_${messageId}`;\n currentStepName = stepName;\n\n // Store messageId in metadata for callback coordination\n // This ensures callbacks use the same messageId as middleware\n const runtimeAny = runtime as any;\n const configAny = runtimeAny.config as any;\n if (configAny) {\n configAny.metadata = {\n ...(configAny.metadata || {}),\n agui_messageId: messageId,\n };\n }\n\n try {\n transport.emit({\n type: \"STEP_STARTED\",\n stepName,\n timestamp: Date.now(),\n // REMOVED: runId, threadId\n });\n\n // Emit ACTIVITY_SNAPSHOT for new activity if activities are enabled\n if (validated.emitActivities) {\n await emitActivityUpdate(\n transport,\n runId,\n turnIndex,\n activityTracker,\n \"started\",\n validated.activityMapper,\n {\n stepName,\n modelName: (runtime as any).config?.model?._modelType || \"unknown\",\n inputPreview: getInputPreview(state),\n } as Record<string, any>\n );\n }\n\n // TEXT_MESSAGE_START is handled by AGUICallbackHandler\n // It reads messageId from metadata in handleLLMStart\n } catch {\n // Fail-safe\n }\n\n return {};\n },\n\n afterModel: async (state, _runtime) => {\n try {\n // TEXT_MESSAGE_END is handled by AGUICallbackHandler\n // It uses the same messageId from metadata coordination\n\n transport.emit({\n type: \"STEP_FINISHED\",\n stepName: currentStepName || \"\",\n timestamp: Date.now(),\n // REMOVED: runId, threadId\n });\n\n // Emit ACTIVITY_DELTA for completed activity if activities are enabled\n if (validated.emitActivities && currentStepName) {\n const turnIndex = modelTurnIndex - 1;\n await emitActivityUpdate(\n transport,\n runId,\n turnIndex,\n activityTracker,\n \"completed\",\n validated.activityMapper,\n {\n stepName: currentStepName,\n outputType: getOutputType(state),\n hasToolCalls: hasToolCalls(state),\n } as Record<string, any>\n );\n }\n\n // Emit STATE_SNAPSHOT after state-stabilizing events (not during streaming)\n // Per AG-UI spec and LangGraph implementation: emit only when streaming has completed\n // and state is stable. STATE_DELTA is NOT used in actual LangGraph implementations.\n if (validated.emitStateSnapshots !== \"none\") {\n // Only emit STATE_SNAPSHOT after streaming completes (state-stabilizing event)\n // This follows the LangGraph pattern: emit after tool/text streaming ends\n const filteredState = cleanLangChainData(state);\n const snapshot = validated.stateMapper \n ? validated.stateMapper(filteredState) \n : filteredState;\n \n // Remove messages from state snapshot (messages are in MESSAGES_SNAPSHOT)\n if (!validated.stateMapper && snapshot && typeof snapshot === \"object\") {\n delete (snapshot as any).messages;\n }\n \n // Only emit if we have meaningful state to share\n const stateKeys = snapshot ? Object.keys(snapshot).filter(k => snapshot[k] !== undefined && snapshot[k] !== null) : [];\n if (stateKeys.length > 0) {\n transport.emit({\n type: \"STATE_SNAPSHOT\",\n snapshot,\n timestamp: Date.now(),\n });\n }\n }\n } catch {\n // Fail-safe\n }\n\n currentStepName = undefined;\n return {};\n },\n\n afterAgent: async (state, _runtime) => {\n try {\n if (\n validated.emitStateSnapshots === \"final\" ||\n validated.emitStateSnapshots === \"all\"\n ) {\n const snapshot = validated.stateMapper \n ? validated.stateMapper(state) \n : cleanLangChainData(state);\n \n // Remove messages from state snapshot by default to avoid redundancy\n if (!validated.stateMapper && snapshot && typeof snapshot === \"object\") {\n delete (snapshot as any).messages;\n }\n\n transport.emit({\n type: \"STATE_SNAPSHOT\",\n snapshot,\n timestamp: Date.now(),\n });\n }\n\n const stateAny = state as any;\n if (stateAny.error) {\n const error = stateAny.error;\n const errorMessage = error instanceof Error ? error.message : String(error);\n transport.emit({\n type: \"RUN_ERROR\",\n message:\n validated.errorDetailLevel === \"full\" ||\n validated.errorDetailLevel === \"message\"\n ? errorMessage\n : \"\",\n code: \"AGENT_EXECUTION_ERROR\",\n timestamp: Date.now(),\n // REMOVED: threadId, runId, parentRunId\n });\n } else {\n transport.emit({\n type: \"RUN_FINISHED\",\n threadId: threadId!,\n runId: runId!,\n result: validated.resultMapper ? validated.resultMapper(state) : undefined,\n timestamp: Date.now(),\n });\n }\n } catch {\n // Fail-safe\n }\n\n return {};\n },\n });\n}\n","import type {\n AGUIEvent,\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n} from \"../events\";\nimport { generateId } from \"./idGenerator\";\n\n/**\n * Normalizes and expands convenience events into their explicit counterparts.\n *\n * @param event - The event to expand\n * @returns An array of explicit AG-UI events\n */\nexport function expandEvent(event: AGUIEvent): AGUIEvent[] {\n switch (event.type) {\n case \"TEXT_MESSAGE_CHUNK\": {\n const messageId = event.messageId || generateId();\n const results: AGUIEvent[] = [];\n\n if (event.role) {\n results.push({\n type: \"TEXT_MESSAGE_START\",\n messageId,\n role: event.role,\n } as TextMessageStartEvent);\n }\n\n if (event.delta) {\n results.push({\n type: \"TEXT_MESSAGE_CONTENT\",\n messageId,\n delta: event.delta,\n } as TextMessageContentEvent);\n }\n\n // If it has a role and delta, we assume it's a complete short message\n if (event.role && event.delta) {\n results.push({\n type: \"TEXT_MESSAGE_END\",\n messageId,\n } as TextMessageEndEvent);\n }\n\n return results.length > 0 ? results : [event];\n }\n\n case \"TOOL_CALL_CHUNK\": {\n const toolCallId = event.toolCallId || generateId();\n const results: AGUIEvent[] = [];\n\n if (event.toolCallName) {\n results.push({\n type: \"TOOL_CALL_START\",\n toolCallId,\n toolCallName: event.toolCallName,\n parentMessageId: event.parentMessageId,\n } as ToolCallStartEvent);\n }\n\n if (event.delta) {\n results.push({\n type: \"TOOL_CALL_ARGS\",\n toolCallId,\n delta: event.delta,\n } as ToolCallArgsEvent);\n }\n\n if (event.toolCallName && event.delta) {\n results.push({\n type: \"TOOL_CALL_END\",\n toolCallId,\n parentMessageId: event.parentMessageId,\n } as ToolCallEndEvent);\n }\n\n return results.length > 0 ? results : [event];\n }\n\n default:\n return [event];\n }\n}\n","/**\n * AG-UI Callback Handler\n * \n * Handles streaming events for LLM tokens and tool calls.\n */\n\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { generateId, generateDeterministicId } from \"../utils/idGenerator\";\nimport { extractToolOutput } from \"../utils/cleaner\";\nimport { expandEvent } from \"../utils/eventNormalizer\";\nimport type { AGUITransport } from \"../transports/types\";\n\n/**\n * Configuration options for the callback handler.\n */\nexport interface AGUICallbackHandlerOptions {\n /** Maximum payload size in bytes for UI events (default: 50KB) */\n maxUIPayloadSize?: number;\n /** Whether to chunk large payloads instead of truncating */\n chunkLargeResults?: boolean;\n}\n\n/**\n * Callback handler for AG-UI protocol streaming events.\n * Handles LLM token streaming and tool call lifecycle events.\n */\nexport class AGUICallbackHandler extends BaseCallbackHandler {\n name = \"ag-ui-callback\";\n\n private messageIds = new Map<string, string>();\n private latestMessageIds = new Map<string, string>();\n private agentRunIds = new Map<string, string>(); // Maps current runId to authoritative agentRunId\n private parentToAuthoritativeId = new Map<string, string>(); // Maps internal parentRunId to authoritative agentRunId\n private thinkingIds = new Map<string, string>();\n private toolCallInfo = new Map<string, { id: string; name: string }>();\n private toolCallNames = new Map<string, string>(); // Maps toolCallId to tool name from LLM tool_calls\n private agentTurnTracker = new Map<string, number>();\n private pendingToolCalls = new Map<string, string[]>();\n private accumulatedToolArgs = new Map<string, string>(); // Accumulates partial args for streaming tool calls\n private transport: AGUITransport;\n \n private maxUIPayloadSize: number;\n private chunkLargeResults: boolean;\n\n constructor(transport: AGUITransport, options?: AGUICallbackHandlerOptions) {\n super({ raiseError: false });\n this.transport = transport;\n this.maxUIPayloadSize = options?.maxUIPayloadSize ?? 50 * 1024;\n this.chunkLargeResults = options?.chunkLargeResults ?? false;\n }\n\n dispose(): void {\n this.messageIds.clear();\n this.latestMessageIds.clear();\n this.agentRunIds.clear();\n this.parentToAuthoritativeId.clear();\n this.thinkingIds.clear();\n this.toolCallInfo.clear();\n this.toolCallNames.clear();\n this.agentTurnTracker.clear();\n this.pendingToolCalls.clear();\n this.accumulatedToolArgs.clear();\n }\n\n // ==================== Convenience Methods for Chunk Events ====================\n\n /**\n * Emit a TEXT_MESSAGE_CHUNK event (convenience method)\n * Auto-expands to START → CONTENT → END lifecycle\n * \n * Use this for simple cases where you have the complete message at once\n * instead of handling the streaming lifecycle manually.\n * \n * @param messageId - Unique message identifier (auto-generated if not provided)\n * @param role - Message role (defaults to \"assistant\")\n * @param delta - Text content to emit\n */\n async emitTextChunk(\n messageId: string,\n role: \"assistant\" | \"user\" | \"system\" | \"developer\" = \"assistant\",\n delta: string\n ): Promise<void> {\n const events = expandEvent({\n type: \"TEXT_MESSAGE_CHUNK\",\n messageId,\n role,\n delta,\n } as any);\n \n for (const event of events) {\n await this.transport.emit(event);\n }\n }\n\n /**\n * Emit a TOOL_CALL_CHUNK event (convenience method)\n * Auto-expands to START → ARGS → END lifecycle\n * \n * Use this for simple tool calls where you have the complete arguments at once\n * instead of handling the streaming lifecycle manually.\n * \n * @param toolCallId - Unique tool call identifier (auto-generated if not provided)\n * @param toolCallName - Name of the tool being called\n * @param delta - Tool arguments (JSON string)\n * @param parentMessageId - ID of the message that triggered this tool call\n */\n async emitToolChunk(\n toolCallId: string,\n toolCallName: string,\n delta: string,\n parentMessageId?: string\n ): Promise<void> {\n const events = expandEvent({\n type: \"TOOL_CALL_CHUNK\",\n toolCallId,\n toolCallName,\n delta,\n parentMessageId,\n } as any);\n \n for (const event of events) {\n await this.transport.emit(event);\n }\n }\n\n // ==================== LLM Callbacks ====================\n\n override async handleLLMStart(\n _llm: any,\n _prompts: string[],\n runId: string,\n _parentRunId?: string,\n _extraParams?: Record<string, unknown>,\n _tags?: string[],\n _metadata?: Record<string, unknown>,\n _runName?: string\n ): Promise<void> {\n // Priority: metadata.agui_messageId (from middleware) > metadata.run_id > parentRunId > runId\n const agentRunId =\n ((_metadata as any)?.agui_runId as string | undefined) ||\n ((_metadata as any)?.run_id as string | undefined) ||\n ((_metadata as any)?.configurable?.run_id as string | undefined) ||\n _parentRunId ||\n runId;\n\n this.agentRunIds.set(runId, agentRunId);\n if (_parentRunId) {\n this.parentToAuthoritativeId.set(_parentRunId, agentRunId);\n }\n\n // Check if middleware sent us a messageId via metadata\n const middlewareMessageId = (_metadata as any)?.agui_messageId as string | undefined;\n \n if (middlewareMessageId) {\n // Use middleware's messageId for coordination\n this.messageIds.set(runId, middlewareMessageId);\n this.latestMessageIds.set(agentRunId, middlewareMessageId);\n \n // Emit TEXT_MESSAGE_START (coordination with middleware)\n this.transport.emit({\n type: \"TEXT_MESSAGE_START\",\n messageId: middlewareMessageId,\n role: \"assistant\",\n timestamp: Date.now(),\n });\n } else {\n // Generate our own messageId if middleware didn't provide one\n const turnIndex = this.agentTurnTracker.get(agentRunId) || 0;\n this.agentTurnTracker.set(agentRunId, turnIndex + 1);\n\n const messageId = generateDeterministicId(agentRunId, turnIndex);\n this.messageIds.set(runId, messageId);\n this.latestMessageIds.set(agentRunId, messageId);\n \n // Emit TEXT_MESSAGE_START (no middleware coordination)\n this.transport.emit({\n type: \"TEXT_MESSAGE_START\",\n messageId,\n role: \"assistant\",\n timestamp: Date.now(),\n });\n }\n }\n\n override async handleLLMNewToken(\n token: string,\n _idx: any,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n fields?: any\n ): Promise<void> {\n const messageId = this.messageIds.get(runId);\n if (!messageId) return;\n\n try {\n // Handle Reasoning Tokens (e.g., DeepSeek, OpenAI o1)\n const reasoningContent = fields?.chunk?.message?.additional_kwargs?.reasoning_content ||\n fields?.chunk?.message?.additional_kwargs?.reasoning;\n if (reasoningContent) {\n let thinkingId = this.thinkingIds.get(runId);\n if (!thinkingId) {\n const agentRunId = this.agentRunIds.get(runId) ||\n (_parentRunId ? this.parentToAuthoritativeId.get(_parentRunId) : null) ||\n _parentRunId ||\n runId;\n thinkingId = generateDeterministicId(agentRunId, (this.agentTurnTracker.get(agentRunId) || 1) + 100); // Offset for thinking\n this.thinkingIds.set(runId, thinkingId);\n this.transport.emit({\n type: \"THINKING_START\",\n timestamp: Date.now(),\n });\n this.transport.emit({\n type: \"THINKING_TEXT_MESSAGE_START\",\n messageId: thinkingId,\n timestamp: Date.now(),\n });\n }\n\n const delta = typeof reasoningContent === 'string'\n ? reasoningContent\n : ((reasoningContent as any).text || JSON.stringify(reasoningContent));\n\n this.transport.emit({\n type: \"THINKING_TEXT_MESSAGE_CONTENT\",\n messageId: thinkingId,\n delta,\n timestamp: Date.now(),\n });\n }\n\n // Emit TEXT_MESSAGE_CONTENT for streaming tokens\n if (token && token.length > 0) {\n this.transport.emit({\n type: \"TEXT_MESSAGE_CONTENT\",\n messageId,\n delta: token,\n timestamp: Date.now(),\n });\n }\n\n // Emit TOOL_CALL_ARGS for streaming tool arguments (may contain partial JSON fragments)\n const toolCallChunks = fields?.chunk?.message?.tool_call_chunks;\n if (toolCallChunks && Array.isArray(toolCallChunks)) {\n const agentRunId = this.agentRunIds.get(runId) || \n (_parentRunId ? this.parentToAuthoritativeId.get(_parentRunId) : null) || \n _parentRunId || \n runId;\n \n // Track tool call IDs for correlation with handleToolStart\n const pending = this.pendingToolCalls.get(agentRunId) || [];\n \n for (const chunk of toolCallChunks) {\n if (chunk.id && chunk.args) {\n // Accumulate partial args by toolCallId\n const previousArgs = this.accumulatedToolArgs.get(chunk.id) || \"\";\n const newArgs = previousArgs + chunk.args;\n \n // Only accumulate if args have changed (avoid duplicate accumulations)\n if (newArgs !== previousArgs) {\n this.accumulatedToolArgs.set(chunk.id, newArgs);\n }\n \n // Track this tool call ID for later correlation\n if (!pending.includes(chunk.id)) {\n pending.push(chunk.id);\n }\n }\n }\n \n if (pending.length > 0) {\n this.pendingToolCalls.set(agentRunId, pending);\n }\n }\n } catch {\n // Fail-safe\n }\n }\n\n override async handleLLMEnd(\n _output: any,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n _extraParams?: Record<string, unknown>\n ): Promise<void> {\n const messageId = this.messageIds.get(runId);\n const thinkingId = this.thinkingIds.get(runId);\n\n try {\n // Collect any tool calls from final output that we missed during streaming\n if (_output && typeof _output === \"object\") {\n const toolCalls = _output.tool_calls || (_output.kwargs?.tool_calls);\n if (Array.isArray(toolCalls)) {\n const agentRunId = this.agentRunIds.get(runId) ||\n (_parentRunId ? this.parentToAuthoritativeId.get(_parentRunId) : null) ||\n _parentRunId ||\n runId;\n const pending = this.pendingToolCalls.get(agentRunId) || [];\n for (const tc of toolCalls) {\n if (tc.id && !pending.includes(tc.id)) {\n pending.push(tc.id);\n \n // Store tool name for later use in handleToolStart\n if (tc.function?.name) {\n this.toolCallNames.set(tc.id, tc.function.name);\n }\n \n // Accumulate tool call args for later emission in handleToolStart\n if (tc.function?.arguments) {\n this.accumulatedToolArgs.set(tc.id, tc.function.arguments);\n }\n }\n }\n this.pendingToolCalls.set(agentRunId, pending);\n }\n }\n\n // Emit TEXT_MESSAGE_END\n if (messageId) {\n this.transport.emit({\n type: \"TEXT_MESSAGE_END\",\n messageId,\n timestamp: Date.now(),\n });\n }\n\n if (thinkingId) {\n this.transport.emit({\n type: \"THINKING_TEXT_MESSAGE_END\",\n messageId: thinkingId,\n timestamp: Date.now(),\n });\n this.transport.emit({\n type: \"THINKING_END\",\n timestamp: Date.now(),\n });\n this.thinkingIds.delete(runId);\n }\n\n // Cleanup\n this.messageIds.delete(runId);\n } catch {\n // Fail-safe\n }\n }\n\n override async handleLLMError(\n _error: Error,\n runId: string,\n _parentRunId?: string\n ): Promise<void> {\n this.messageIds.delete(runId);\n this.thinkingIds.delete(runId);\n const agentRunId = this.agentRunIds.get(runId) ||\n (_parentRunId ? this.parentToAuthoritativeId.get(_parentRunId) : null) ||\n _parentRunId ||\n runId;\n this.pendingToolCalls.delete(agentRunId);\n this.agentRunIds.delete(runId);\n }\n\n // ==================== Tool Callbacks ====================\n\n override async handleToolStart(\n tool: any,\n input: string,\n runId: string,\n parentRunId?: string,\n _tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string\n ): Promise<void> {\n let toolCallId = runId;\n \n // Try to get tool name from various sources (in priority order):\n // 1. runName parameter (most direct - provided by LangChain)\n // 2. From tool object properties (tool.kwargs.name)\n // 3. From stored tool names (populated in handleLLMEnd from LLM tool_calls)\n // 4. From input JSON\n // 5. Default to \"unknown_tool\"\n let toolCallName = runName || \n (tool as any).kwargs?.name ||\n (tool as any).name || \n (tool as any).func?.name || \n (tool as any).getName?.() || \n (tool as any).toolName ||\n (tool as any)._name ||\n \"unknown_tool\"; // Ensure always populated\n\n try {\n // Priority order for toolCallId (MUST use LangChain IDs only):\n // 1. metadata.tool_call_id (modern LangChain pattern)\n // 2. Input's tool_call_id or id field (from tool invocation)\n // 3. Match accumulated streaming args by content\n \n // 1. Check metadata for tool_call_id (if provided)\n if (metadata?.tool_call_id && typeof metadata.tool_call_id === \"string\") {\n toolCallId = metadata.tool_call_id;\n \n // If we have a stored tool name for this ID, use it\n const storedName = this.toolCallNames.get(toolCallId);\n if (storedName && storedName !== \"unknown_tool\") {\n toolCallName = storedName;\n }\n }\n // 2. Check input for tool_call_id or id\n else if (input) {\n try {\n const parsed = typeof input === \"string\" ? JSON.parse(input) : input;\n if (parsed && typeof parsed === \"object\") {\n if (parsed.tool_call_id) {\n toolCallId = parsed.tool_call_id;\n } else if (parsed.id) {\n toolCallId = parsed.id;\n }\n if (parsed.name) {\n toolCallName = parsed.name;\n }\n }\n } catch {\n // Not JSON, ignore\n }\n }\n // 3. Match accumulated streaming args by content comparison\n if (toolCallId === runId && this.accumulatedToolArgs.size > 0 && input) {\n // Find matching accumulated ID by comparing args content\n for (const [id, args] of this.accumulatedToolArgs) {\n if (input.includes(args) || args.includes(input)) {\n toolCallId = id;\n \n // If we have a stored tool name for this ID, use it\n const storedName = this.toolCallNames.get(id);\n if (storedName && storedName !== \"unknown_tool\") {\n toolCallName = storedName;\n }\n break;\n }\n }\n }\n } catch {\n // Use defaults\n }\n\n try {\n // Priority order for toolCallId (MUST use LangChain IDs only):\n // 1. metadata.tool_call_id (modern LangChain pattern)\n // 2. Input's tool_call_id or id field (from tool invocation)\n // 3. Match accumulated streaming args by content\n \n // 1. Check metadata for tool_call_id (if provided)\n if (metadata?.tool_call_id && typeof metadata.tool_call_id === \"string\") {\n toolCallId = metadata.tool_call_id;\n }\n // 2. Check input for tool_call_id or id\n else if (input) {\n try {\n const parsed = typeof input === \"string\" ? JSON.parse(input) : input;\n if (parsed && typeof parsed === \"object\") {\n if (parsed.tool_call_id) {\n toolCallId = parsed.tool_call_id;\n } else if (parsed.id) {\n toolCallId = parsed.id;\n }\n if (parsed.name) {\n toolCallName = parsed.name;\n }\n }\n } catch {\n // Not JSON, ignore\n }\n }\n // 3. Match accumulated streaming args by content comparison\n if (toolCallId === runId && this.accumulatedToolArgs.size > 0 && input) {\n // Find matching accumulated ID by comparing args content\n for (const [id, args] of this.accumulatedToolArgs) {\n if (input.includes(args) || args.includes(input)) {\n toolCallId = id;\n break;\n }\n }\n }\n } catch {\n // Use defaults\n }\n\n this.toolCallInfo.set(runId, { id: toolCallId, name: toolCallName });\n\n const agentRunId = (parentRunId ? this.parentToAuthoritativeId.get(parentRunId) : null) || parentRunId || \"\";\n const messageId = this.latestMessageIds.get(agentRunId);\n\n try {\n // Emit TOOL_CALL_START first\n this.transport.emit({\n type: \"TOOL_CALL_START\",\n toolCallId,\n toolCallName,\n parentMessageId: messageId,\n timestamp: Date.now(),\n });\n\n // Emit accumulated TOOL_CALL_ARGS (from streaming in handleLLMNewToken)\n // This preserves real-time streaming while maintaining protocol sequence\n const accumulatedArgs = this.accumulatedToolArgs.get(toolCallId);\n if (accumulatedArgs) {\n this.transport.emit({\n type: \"TOOL_CALL_ARGS\",\n toolCallId,\n delta: accumulatedArgs,\n timestamp: Date.now(),\n });\n // Clean up accumulated args\n this.accumulatedToolArgs.delete(toolCallId);\n }\n } catch {\n // Fail-safe\n }\n }\n\n override async handleToolEnd(\n output: any,\n runId: string,\n parentRunId?: string\n ): Promise<void> {\n const toolInfo = this.toolCallInfo.get(runId);\n this.toolCallInfo.delete(runId);\n\n // Cleanup tool name mapping\n if (toolInfo?.id) {\n this.toolCallNames.delete(toolInfo.id);\n }\n\n const agentRunId = (parentRunId ? this.parentToAuthoritativeId.get(parentRunId) : null) || parentRunId || \"\";\n const messageId = this.latestMessageIds.get(agentRunId);\n\n try {\n const endToolCallId = toolInfo?.id ?? runId;\n\n // If output is a LangChain message, it might contain the real tool_call_id\n let finalToolCallId = endToolCallId;\n if (output && typeof output === \"object\") {\n const kwargs = output.kwargs || output.lc_kwargs;\n if (kwargs?.tool_call_id) {\n finalToolCallId = kwargs.tool_call_id;\n }\n }\n\n this.transport.emit({\n type: \"TOOL_CALL_END\",\n toolCallId: finalToolCallId,\n timestamp: Date.now(),\n });\n\n this.emitToolResultWithPolicy(output, finalToolCallId, messageId, toolInfo?.name);\n } catch {\n // Fail-safe\n }\n }\n\n override async handleToolError(\n _error: Error,\n runId: string,\n parentRunId?: string\n ): Promise<void> {\n const toolInfo = this.toolCallInfo.get(runId);\n this.toolCallInfo.delete(runId);\n \n // Cleanup accumulated tool args for this tool call\n if (toolInfo?.id) {\n this.accumulatedToolArgs.delete(toolInfo.id);\n }\n \n const agentRunId = (parentRunId ? this.parentToAuthoritativeId.get(parentRunId) : null) || parentRunId || \"\";\n const messageId = this.latestMessageIds.get(agentRunId);\n\n try {\n this.transport.emit({\n type: \"TOOL_CALL_END\",\n toolCallId: toolInfo?.id ?? runId,\n timestamp: Date.now(),\n });\n } catch {\n // Fail-safe\n }\n }\n\n // ==================== Smart Emission ====================\n\n private chunkString(content: string, maxChunkSize: number): string[] {\n const chunks: string[] = [];\n let remaining = content;\n \n while (remaining.length > 0) {\n if (new Blob([remaining]).size <= maxChunkSize) {\n chunks.push(remaining);\n break;\n }\n \n let splitPoint = maxChunkSize;\n const spaceIndex = remaining.lastIndexOf(' ', maxChunkSize);\n const newlineIndex = remaining.lastIndexOf('\\n', maxChunkSize);\n const boundaryIndex = Math.max(spaceIndex, newlineIndex);\n \n if (boundaryIndex > maxChunkSize * 0.5) {\n splitPoint = boundaryIndex;\n } else {\n while (splitPoint > 0 && remaining.charCodeAt(splitPoint - 1) > 127) {\n splitPoint--;\n }\n if (splitPoint === 0) {\n splitPoint = maxChunkSize;\n }\n }\n \n chunks.push(remaining.substring(0, splitPoint));\n remaining = remaining.substring(splitPoint).trim();\n }\n \n return chunks;\n }\n\n private emitToolResultWithPolicy(\n output: any,\n toolCallId: string,\n messageId: string | undefined,\n toolCallName?: string\n ): void {\n let content = extractToolOutput(output);\n const resultMessageId = generateId();\n const contentSize = new Blob([content]).size;\n \n if (contentSize <= this.maxUIPayloadSize) {\n this.transport.emit({\n type: \"TOOL_CALL_RESULT\",\n messageId: resultMessageId,\n toolCallId,\n content,\n role: \"tool\",\n timestamp: Date.now(),\n });\n return;\n }\n \n if (this.chunkLargeResults) {\n const chunks = this.chunkString(content, this.maxUIPayloadSize);\n for (let i = 0; i < chunks.length; i++) {\n // Use CUSTOM event or a new event type for large result chunks\n // to avoid collision with ToolCallChunk which is for arguments\n this.transport.emit({\n type: \"CUSTOM\",\n name: \"LARGE_RESULT_CHUNK\",\n value: {\n toolCallId,\n chunk: chunks[i],\n index: i,\n total: chunks.length\n }\n });\n }\n return;\n }\n\n const truncationMessage = ` [Truncated: ${contentSize - this.maxUIPayloadSize + 50} bytes]`;\n const availableSpace = this.maxUIPayloadSize - truncationMessage.length;\n const truncatedContent = content.substring(0, Math.max(0, availableSpace)) + truncationMessage;\n\n this.transport.emit({\n type: \"TOOL_CALL_RESULT\",\n messageId: resultMessageId,\n toolCallId,\n content: truncatedContent,\n role: \"tool\",\n timestamp: Date.now(),\n });\n }\n}\n","/**\n * AG-UI Agent Factory\n *\n * Creates a LangChain agent with automatic AG-UI protocol integration.\n *\n * Architecture:\n * - Uses createAgent() from langchain package\n * - Returns agent with callbacks bound to graph via withConfig\n * - Emits lifecycle events for agent execution (RUN_STARTED, RUN_FINISHED, etc.)\n * - Callbacks are merged with user-provided callbacks by LangChain\n * - Abort signal from context enables client disconnect handling\n */\n\nimport { createAgent } from \"langchain\";\nimport { AGUICallbackHandler, type AGUICallbackHandlerOptions } from \"./callbacks/AGUICallbackHandler\";\nimport { createAGUIMiddleware } from \"./middleware/createAGUIMiddleware\";\nimport type { AGUITransport } from \"./transports/types\";\nimport type { AGUIMiddlewareOptions } from \"./middleware/types\";\n\n/**\n * Configuration for creating an AG-UI enabled agent.\n */\nexport interface AGUIAgentConfig {\n /** The language model to use */\n model: any;\n /** The tools available to the agent */\n tools: any[];\n /** The transport for AG-UI events */\n transport: AGUITransport;\n /** Optional middleware configuration */\n middlewareOptions?: Partial<AGUIMiddlewareOptions>;\n /** Optional callback handler configuration */\n callbackOptions?: AGUICallbackHandlerOptions;\n}\n\n/**\n * Create an AG-UI enabled agent.\n *\n * This function creates a LangChain agent with automatic AG-UI protocol integration:\n * - Middleware handles lifecycle events (RUN_STARTED, RUN_FINISHED, etc.)\n * - Callbacks handle streaming events (TEXT_MESSAGE_CONTENT, TOOL_CALL_ARGS, etc.)\n * - Callbacks must be passed at runtime via agent.streamEvents() config\n * - Guaranteed cleanup via middleware wrapModelCall with try-finally\n *\n * Note: Callbacks are not bound to the model here because:\n * 1. Some models (like MockChatModel in tests) don't properly support withConfig()\n * 2. Users should pass callbacks at runtime for proper streaming\n *\n * @param config - Agent configuration\n * @returns An agent with AG-UI protocol support\n */\nexport function createAGUIAgent(config: AGUIAgentConfig) {\n // Create middleware with transport\n const middleware = createAGUIMiddleware({\n transport: config.transport,\n emitToolResults: config.middlewareOptions?.emitToolResults ?? true,\n emitStateSnapshots: config.middlewareOptions?.emitStateSnapshots ?? \"initial\",\n emitActivities: config.middlewareOptions?.emitActivities ?? false,\n maxUIPayloadSize: config.middlewareOptions?.maxUIPayloadSize ?? 50 * 1024,\n chunkLargeResults: config.middlewareOptions?.chunkLargeResults ?? false,\n threadIdOverride: config.middlewareOptions?.threadIdOverride,\n runIdOverride: config.middlewareOptions?.runIdOverride,\n errorDetailLevel: config.middlewareOptions?.errorDetailLevel ?? \"message\",\n stateMapper: config.middlewareOptions?.stateMapper,\n resultMapper: config.middlewareOptions?.resultMapper,\n activityMapper: config.middlewareOptions?.activityMapper,\n validateEvents: config.middlewareOptions?.validateEvents ?? false,\n });\n\n // Create base agent with middleware\n // Note: Callbacks are NOT bound here - they must be passed at runtime\n const agent = createAgent({\n model: config.model,\n tools: config.tools,\n middleware: [middleware],\n });\n\n // Attach global listeners for guaranteed cleanup and error handling if supported\n if (agent && typeof (agent as any).withListeners === \"function\") {\n return (agent as any).withListeners({\n onError: (run: any) => {\n try {\n // Extract threadId and runId from run config if available\n const threadId = run.config?.configurable?.threadId as string | undefined;\n const agentRunId = run.config?.configurable?.runId as string | undefined;\n config.transport.emit({\n type: \"RUN_ERROR\",\n message: typeof run.error === \"string\" ? run.error : (run.error as any)?.message || \"Agent execution failed\",\n code: \"AGENT_EXECUTION_ERROR\",\n timestamp: Date.now(),\n // REMOVED: threadId, runId\n });\n } catch {\n // Fail-safe\n }\n },\n });\n }\n\n return agent;\n}\n","/**\n * SSE Transport Implementation\n * \n * Server-Sent Events transport for AG-UI protocol.\n * Provides:\n * - Proper SSE headers\n * - Fail-safe emission (never throws on client disconnect)\n * - Abort signal integration for client disconnect handling\n * - Backpressure handling with queue-based emission\n */\n\nimport type { AGUIEvent } from \"../events\";\nimport type { AGUITransport } from \"./types\";\n\n/**\n * Extended SSE transport interface with abort signal.\n */\nexport interface SSETransport extends AGUITransport {\n /** Abort signal triggered on client disconnect */\n signal: AbortSignal;\n}\n\n/**\n * HTTP request interface for SSE transport.\n */\ninterface SSETransportRequest {\n on(event: string, callback: () => void): void;\n}\n\n/**\n * HTTP response interface for SSE transport.\n */\ninterface SSETransportResponse {\n setHeader(name: string, value: string): SSETransportResponse;\n write(data: string): boolean;\n end?(): void;\n}\n\n/**\n * Create an SSE transport for Server-Sent Events.\n * \n * @param req - HTTP request object (listens for 'close' event)\n * @param res - HTTP response object\n * @returns SSETransport with emit method and abort signal\n */\nexport function createSSETransport(\n req: SSETransportRequest,\n res: SSETransportResponse\n): SSETransport {\n // Set proper SSE headers\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\");\n\n // Create abort controller for client disconnect handling\n const controller = new AbortController();\n req.on(\"close\", () => controller.abort());\n\n // Backpressure queue\n const queue: AGUIEvent[] = [];\n let draining = false;\n\n /**\n * Drain the event queue to the response.\n */\n async function drain(): Promise<void> {\n draining = true;\n while (queue.length > 0 && res.write) {\n const event = queue.shift()!;\n try {\n res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n } catch {\n // Client disconnected - stop draining\n break;\n }\n }\n draining = false;\n }\n\n return {\n emit: (event: AGUIEvent) => {\n queue.push(event);\n if (!draining) {\n drain();\n }\n },\n\n signal: controller.signal,\n\n disconnect: res.end\n ? () => {\n res.end?.();\n }\n : undefined,\n\n isConnected: () => !controller.signal.aborted,\n };\n}\n","/**\n * Protobuf Transport Implementation\n * \n * Protocol Buffer transport for AG-UI protocol.\n * Provides:\n * - Binary encoding using @ag-ui/proto\n * - 4-byte Big-Endian length prefix per protocol spec\n * - Fail-safe emission (never throws on client disconnect)\n * - Abort signal integration for client disconnect handling\n * - Backpressure handling with queue-based emission\n * \n * Protobuf provides 60-80% smaller payloads compared to JSON/SSE.\n * \n * @see https://docs.ag-ui.com/introduction\n */\n\nimport { encode, decode, AGUI_MEDIA_TYPE } from '@ag-ui/proto';\nimport type { AGUIEvent } from \"../events\";\nimport type { AGUITransport, ProtobufTransport } from \"./types\";\n\n/**\n * Re-export the official AG-UI media type for content negotiation.\n */\nexport { AGUI_MEDIA_TYPE };\n\n/**\n * HTTP request interface for Protobuf transport.\n */\ninterface ProtobufTransportRequest {\n on(event: string, callback: () => void): void;\n}\n\n/**\n * HTTP response interface for Protobuf transport.\n */\ninterface ProtobufTransportResponse {\n setHeader(name: string, value: string): ProtobufTransportResponse;\n write(data: Buffer | Uint8Array): boolean;\n end?(): void;\n}\n\n/**\n * Encode an AG-UI event with 4-byte Big-Endian length prefix.\n * \n * Per AG-UI protocol spec:\n * ┌─────────────────┬──────────────────────────────────┐\n * │ Length (4 BE) │ Protobuf Event Bytes │\n * └─────────────────┴──────────────────────────────────┘\n * \n * @param event - The AG-UI event to encode\n * @returns Uint8Array with length prefix + protobuf bytes\n */\nexport function encodeEventWithFraming(event: AGUIEvent): Uint8Array {\n // Convert our event type to @ag-ui/core BaseEvent format\n // The @ag-ui/proto encode function expects a BaseEvent from @ag-ui/core\n const coreEvent = convertToProtobufEvent(event);\n \n // Encode to protobuf bytes\n const eventBytes = encode(coreEvent);\n \n // Create 4-byte Big-Endian length prefix\n const lengthPrefix = new DataView(new ArrayBuffer(4));\n lengthPrefix.setUint32(0, eventBytes.length, false); // false = Big-Endian\n \n // Concatenate length + payload\n const result = new Uint8Array(4 + eventBytes.length);\n result.set(new Uint8Array(lengthPrefix.buffer), 0);\n result.set(eventBytes, 4);\n \n return result;\n}\n\n/**\n * Decode a framed protobuf event (with 4-byte length prefix).\n * \n * @param data - Buffer containing length prefix + protobuf bytes\n * @returns The decoded AG-UI event\n */\nexport function decodeEventWithFraming(data: Uint8Array): AGUIEvent {\n if (data.length < 4) {\n throw new Error(\"Invalid protobuf frame: insufficient data for length prefix\");\n }\n \n const length = new DataView(data.buffer, data.byteOffset).getUint32(0, false); // Big-Endian\n \n if (data.length < 4 + length) {\n throw new Error(\"Invalid protobuf frame: insufficient data for payload\");\n }\n \n const eventBytes = data.slice(4, 4 + length);\n const decoded = decode(eventBytes);\n \n // Convert back to our event format\n return convertFromProtobufEvent(decoded) as AGUIEvent;\n}\n\n/**\n * Convert our event format to @ag-ui/core BaseEvent format.\n * Handles field name differences (e.g., tool_calls → toolCalls).\n */\nfunction convertToProtobufEvent(event: AGUIEvent): any {\n const baseEvent: any = { ...event };\n \n // Handle Message objects in MESSAGES_SNAPSHOT\n if (event.type === \"MESSAGES_SNAPSHOT\" && event.messages) {\n baseEvent.messages = event.messages.map((msg: any) => ({\n ...msg,\n // Convert tool_calls to toolCalls if present\n toolCalls: msg.tool_calls?.map((tc: any) => ({\n id: tc.id,\n type: tc.type,\n function: tc.function,\n })),\n // Remove snake_case version\n tool_calls: undefined,\n // Convert tool_call_id to toolCallId\n toolCallId: msg.tool_call_id,\n tool_call_id: undefined,\n }));\n }\n \n return baseEvent;\n}\n\n/**\n * Convert @ag-ui/core BaseEvent format back to our event format.\n * Handles field name differences (e.g., toolCalls → tool_calls).\n */\nfunction convertFromProtobufEvent(event: any): AGUIEvent {\n const result: any = { ...event };\n \n // Handle Message objects in MESSAGES_SNAPSHOT\n if (event.type === \"MESSAGES_SNAPSHOT\" && event.messages) {\n result.messages = event.messages.map((msg: any) => ({\n ...msg,\n // Convert toolCalls to tool_calls if present\n tool_calls: msg.toolCalls?.map((tc: any) => ({\n id: tc.id,\n type: tc.type,\n function: tc.function,\n })),\n // Remove camelCase version\n toolCalls: undefined,\n // Convert toolCallId to tool_call_id\n tool_call_id: msg.toolCallId,\n toolCallId: undefined,\n }));\n }\n \n return result;\n}\n\n/**\n * Create a Protobuf transport for binary AG-UI protocol communication.\n * \n * @param req - HTTP request object (listens for 'close' event)\n * @param res - HTTP response object\n * @returns ProtobufTransport with emit method and abort signal\n * \n * @example\n * ```typescript\n * app.post('/api/agent', (req, res) => {\n * const acceptProtobuf = req.headers.accept?.includes(AGUI_MEDIA_TYPE);\n * \n * if (acceptProtobuf) {\n * const transport = createProtobufTransport(req, res);\n * // Use transport.emit() for binary encoding\n * } else {\n * const transport = createSSETransport(req, res);\n * // Use transport.emit() for JSON/SSE\n * }\n * });\n * ```\n */\nexport function createProtobufTransport(\n req: ProtobufTransportRequest,\n res: ProtobufTransportResponse\n): ProtobufTransport {\n // Set proper Protobuf headers\n res.setHeader(\"Content-Type\", AGUI_MEDIA_TYPE);\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\");\n\n // Create abort controller for client disconnect handling\n const controller = new AbortController();\n req.on(\"close\", () => controller.abort());\n\n // Backpressure queue\n const queue: AGUIEvent[] = [];\n let draining = false;\n\n /**\n * Drain the event queue to the response.\n */\n async function drain(): Promise<void> {\n draining = true;\n while (queue.length > 0 && res.write) {\n const event = queue.shift()!;\n try {\n const framedData = encodeEventWithFraming(event);\n res.write(framedData);\n } catch {\n // Client disconnected or encoding error - stop draining\n break;\n }\n }\n draining = false;\n }\n\n return {\n emit: (event: AGUIEvent) => {\n queue.push(event);\n if (!draining) {\n drain();\n }\n },\n\n signal: controller.signal,\n\n disconnect: res.end\n ? () => {\n res.end?.();\n }\n : undefined,\n\n isConnected: () => !controller.signal.aborted,\n \n // Protobuf-specific utilities\n encodeEvent: encodeEventWithFraming,\n decodeEvent: decodeEventWithFraming,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/idGenerator.ts","../src/utils/stateDiff.ts","../src/utils/messageMapper.ts","../src/utils/cleaner.ts","../src/middleware/types.ts","../src/utils/validation.ts","../src/middleware/createAGUIMiddleware.ts","../src/utils/eventNormalizer.ts","../src/callbacks/AGUICallbackHandler.ts","../src/createAGUIAgent.ts","../src/transports/createSSETransport.ts","../src/transports/createProtobufTransport.ts"],"names":["generateId","generateDeterministicId","baseId","index","str","hash","i","char","hex","computeStateDelta","oldState","newState","mapLangChainMessageToAGUI","message","id","role","toolCalls","toolCallId","content","HumanMessage","AIMessage","toolCallsFromLLM","tc","ToolMessage","SystemMessage","ChatMessage","cleanLangChainData","data","kwargs","result","key","value","extractToolOutput","output","parsed","AGUIMiddlewareOptionsSchema","z","val","validateEvent","event","EventSchemas","issue","err","isValidEvent","createValidatingTransport","transport","options","throwOnInvalid","onValidationError","isValidationEnabled","validateEvents","getInputPreview","state","stateAny","lastMessage","getOutputType","hasToolCalls","m","emitActivityUpdate","currentRunId","stepIndex","activityTracker","status","activityMapper","details","activityId","baseContent","finalContent","EventType","patch","createAGUIMiddleware","validated","threadId","runId","currentStepName","modelTurnIndex","createMiddleware","runtime","runtimeAny","configurable","snapshot","configAny","turnIndex","messageId","stepName","_runtime","filteredState","k","error","errorMessage","expandEvent","chunkEvent","results","AGUICallbackHandler","BaseCallbackHandler","delta","events","toolCallName","parentMessageId","_llm","_prompts","_parentRunId","_extraParams","_tags","_metadata","_runName","agentRunId","middlewareMessageId","token","_idx","fields","reasoningContent","thinkingId","toolCallChunks","pending","chunk","previousArgs","newArgs","_output","_error","tool","input","parentRunId","metadata","runName","storedName","args","accumulatedArgs","toolInfo","finalToolCallId","maxChunkSize","chunks","remaining","splitPoint","spaceIndex","newlineIndex","boundaryIndex","resultMessageId","contentSize","truncationMessage","availableSpace","truncatedContent","createAGUIAgent","config","middleware","agent","createAgent","run","createSSETransport","req","res","controller","queue","draining","drain","encodeEventWithFraming","coreEvent","convertToProtobufEvent","eventBytes","encode","lengthPrefix","decodeEventWithFraming","length","decoded","decode","convertFromProtobufEvent","baseEvent","messagesEvent","msg","createProtobufTransport","AGUI_MEDIA_TYPE","framedData"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ID Generator Utility\n * \n * Generates unique IDs using crypto.randomUUID() or deterministic hashing.\n */\n\n/**\n * Generate a unique ID using crypto.randomUUID()\n * \n * @returns A UUID v4 string (e.g., \"550e8400-e29b-41d4-a716-446655440000\")\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Generate a deterministic ID from a base ID and an index.\n * Useful for coordinating between Middleware and Callbacks without direct communication.\n * \n * @param baseId - The base ID (e.g., runId)\n * @param index - The turn index\n * @returns A deterministic hyphenated string [prefix]-[hash]\n */\nexport function generateDeterministicId(baseId: string, index: number): string {\n if (!baseId) {\n throw new Error(\"baseId is required for deterministic ID generation\");\n }\n\n const str = `${baseId}-${index}`;\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n // Return a stable hex string\n const hex = Math.abs(hash).toString(16).padStart(8, '0');\n \n // Use the baseId as the prefix to ensure uniqueness across different runs.\n // We keep the full baseId to avoid any ambiguity or collision risk.\n return `${baseId}-${hex}`;\n}\n","/**\n * State Diff Utility\n *\n * Computes JSON Patch deltas between two state objects.\n * Uses fast-json-patch's compare function to generate RFC 6902 patch operations.\n */\n\nimport * as jsonpatch from \"fast-json-patch\";\nimport type { Operation } from \"fast-json-patch\";\n\n/**\n * Compute the delta between two state objects using JSON Patch (RFC 6902).\n *\n * @param oldState - The previous state object\n * @param newState - The updated state object\n * @returns An array of JSON Patch operations describing the changes\n */\nexport function computeStateDelta(\n oldState: unknown,\n newState: unknown\n): Operation[] {\n return jsonpatch.compare(oldState as any, newState as any);\n}\n","import { \n BaseMessage, \n HumanMessage, \n AIMessage, \n ToolMessage, \n SystemMessage,\n ChatMessage\n} from \"@langchain/core/messages\";\nimport { generateId } from \"./idGenerator\";\nimport type { Message, ToolCall } from \"../events\";\n\n/**\n * Maps a LangChain BaseMessage to an AG-UI Protocol Message.\n * \n * @param message - The LangChain message to map\n * @returns An AG-UI Protocol compliant Message object\n */\nexport function mapLangChainMessageToAGUI(message: BaseMessage): Message {\n const id = (message as any).id || generateId();\n let role: Message[\"role\"] = \"assistant\";\n let toolCalls: ToolCall[] | undefined;\n let toolCallId: string | undefined;\n let content = typeof message.content === \"string\" ? message.content : JSON.stringify(message.content);\n\n if (message instanceof HumanMessage || (message as any).role === \"user\" || (message as any)._getType?.() === \"human\") {\n role = \"user\";\n } else if (message instanceof AIMessage || (message as any).role === \"assistant\" || (message as any)._getType?.() === \"ai\") {\n role = \"assistant\";\n const toolCallsFromLLM = (message as any).tool_calls || (message as any).kwargs?.tool_calls;\n if (toolCallsFromLLM && toolCallsFromLLM.length > 0) {\n toolCalls = toolCallsFromLLM.map((tc: any) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: typeof tc.args === \"string\" ? tc.args : JSON.stringify(tc.args)\n }\n }));\n }\n } else if (message instanceof ToolMessage || (message as any).role === \"tool\" || (message as any)._getType?.() === \"tool\") {\n role = \"tool\";\n toolCallId = (message as any).tool_call_id || (message as any).kwargs?.tool_call_id;\n } else if (message instanceof SystemMessage || (message as any).role === \"system\" || (message as any)._getType?.() === \"system\") {\n role = \"system\";\n } else if (message instanceof ChatMessage) {\n role = message.role as any;\n } else if ((message as any).role) {\n role = (message as any).role;\n }\n\n return {\n id,\n role,\n content,\n toolCalls,\n toolCallId,\n name: (message as any).name\n };\n}\n","/**\n * Utility to clean up LangChain serialized objects from state/output.\n */\n\n/**\n * Recursively removes 'lc', 'type', 'id' (LangChain internal) fields and \n * flattens 'kwargs' if present.\n */\nexport function cleanLangChainData(data: any): any {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map(cleanLangChainData);\n }\n\n if (typeof data === \"object\") {\n // Check if it's a LangChain serialized object\n if ((data.lc === 1 || data.lc_serializable === true) && (data.kwargs || data.lc_kwargs)) {\n const kwargs = data.kwargs || data.lc_kwargs;\n const cleaned = cleanLangChainData(kwargs);\n return cleaned;\n }\n\n const result: any = {};\n for (const [key, value] of Object.entries(data)) {\n // Skip internal metadata often found in LangChain objects\n if (key === \"lc\" || key === \"type\" || key === \"id\" || key.startsWith(\"lc_\")) {\n continue;\n }\n result[key] = cleanLangChainData(value);\n }\n return result;\n }\n\n return data;\n}\n\n/**\n * Extracts content from a tool output if it's a serialized ToolMessage or object.\n */\nexport function extractToolOutput(output: any): string {\n if (output === null || output === undefined) {\n return \"\";\n }\n\n // If it's already a string, try to parse it (it might be a JSON-encoded LangChain message)\n let parsed = output;\n if (typeof output === \"string\") {\n try {\n parsed = JSON.parse(output);\n } catch {\n return output;\n }\n }\n\n // Now 'parsed' is either an object or the original output if it wasn't valid JSON\n\n if (typeof parsed !== \"object\") {\n return String(parsed);\n }\n\n // Handle LangChain message structures (lc: 1 or lc_serializable: true)\n const isLangChainMessage = parsed.lc === 1 || parsed.lc_serializable === true || (parsed.type === \"constructor\" && Array.isArray(parsed.id));\n const kwargs = parsed.kwargs || parsed.lc_kwargs || parsed;\n\n if (kwargs && kwargs.content !== undefined) {\n return typeof kwargs.content === \"string\" \n ? kwargs.content \n : JSON.stringify(kwargs.content);\n }\n\n // If it's a plain object but has a 'result' or 'output' field\n if (parsed.result !== undefined) return typeof parsed.result === \"string\" ? parsed.result : JSON.stringify(parsed.result);\n if (parsed.output !== undefined) return typeof parsed.output === \"string\" ? parsed.output : JSON.stringify(parsed.output);\n\n // If no specific field found, return stringified version of the object (but cleaned)\n return JSON.stringify(cleanLangChainData(parsed));\n}\n","/**\n * AG-UI Middleware Types and Configuration\n * \n * Defines the middleware options schema and types for AG-UI protocol integration.\n */\n\nimport { z } from \"zod\";\nimport type { AGUITransport } from \"../transports/types\";\n\n/**\n * Middleware options schema with Zod validation.\n */\nexport const AGUIMiddlewareOptionsSchema = z.object({\n // Transport (required)\n transport: z.custom<AGUITransport>(\n (val) => val && typeof (val as AGUITransport).emit === \"function\",\n {\n message: \"Transport must have an emit function\",\n }\n ),\n\n // Event control\n emitToolResults: z.boolean().default(true),\n emitStateSnapshots: z.enum([\"initial\", \"final\", \"all\", \"none\"]).default(\"initial\"),\n emitActivities: z.boolean().default(false),\n\n // Smart Emission Policy\n maxUIPayloadSize: z.number().positive().default(50 * 1024), // 50KB\n chunkLargeResults: z.boolean().default(false),\n\n // Session Override\n threadIdOverride: z.string().optional(),\n runIdOverride: z.string().optional(),\n\n // Error Handling\n errorDetailLevel: z.enum([\"full\", \"message\", \"code\", \"none\"]).default(\"message\"),\n\n // Data Mappers (New in Protocol Compliance)\n stateMapper: z.custom<(state: any) => any>().optional(),\n resultMapper: z.custom<(result: any) => any>().optional(),\n activityMapper: z.custom<(node: any) => any>().optional(),\n \n // Validation (New - @ag-ui/core integration)\n /**\n * Enable runtime validation of events against @ag-ui/core schemas.\n * Disabled by default for performance. Enable in development for debugging.\n * \n * - false (default): No validation, events emitted as-is\n * - true: Validate events, log warnings for invalid events\n * - \"strict\": Validate events, throw on invalid events\n */\n validateEvents: z.union([\n z.boolean(),\n z.literal(\"strict\"),\n ]).default(false),\n});\n\n/**\n * Inferred type for middleware options.\n */\nexport type AGUIMiddlewareOptions = z.infer<typeof AGUIMiddlewareOptionsSchema>;\n","/**\n * AG-UI Event Validation Utilities\n * \n * Provides optional runtime validation of AG-UI events using @ag-ui/core Zod schemas.\n * Validation is disabled by default for performance; enable in development for debugging.\n * \n * @example\n * ```typescript\n * import { validateEvent, isValidEvent } from './utils/validation';\n * \n * // Safe validation (returns result object)\n * const result = validateEvent(event);\n * if (result.success) {\n * console.log('Valid event:', result.data);\n * } else {\n * console.error('Invalid event:', result.error);\n * }\n * \n * // Boolean check\n * if (isValidEvent(event)) {\n * // event is valid\n * }\n * ```\n */\n\nimport { EventSchemas } from '@ag-ui/core';\nimport type { AGUIEvent } from '../events';\n\n/**\n * Result of event validation.\n */\nexport interface ValidationResult<T = AGUIEvent> {\n success: boolean;\n data?: T;\n error?: {\n message: string;\n issues: Array<{\n path: (string | number)[];\n message: string;\n }>;\n };\n}\n\n/**\n * Validate an AG-UI event against @ag-ui/core schemas.\n * \n * Events are now emitted with camelCase field names (toolCalls, toolCallId)\n * which matches the @ag-ui/core schema directly.\n * \n * @param event - The event to validate\n * @returns ValidationResult with success status and any errors\n */\nexport function validateEvent(event: unknown): ValidationResult {\n try {\n const result = EventSchemas.safeParse(event);\n \n if (result.success) {\n return {\n success: true,\n data: event as AGUIEvent,\n };\n }\n \n return {\n success: false,\n error: {\n message: 'Event validation failed',\n issues: result.error.issues.map(issue => ({\n path: issue.path,\n message: issue.message,\n })),\n },\n };\n } catch (err) {\n return {\n success: false,\n error: {\n message: err instanceof Error ? err.message : 'Unknown validation error',\n issues: [],\n },\n };\n }\n}\n\n/**\n * Check if an event is valid according to @ag-ui/core schemas.\n * \n * @param event - The event to check\n * @returns true if valid, false otherwise\n */\nexport function isValidEvent(event: unknown): event is AGUIEvent {\n return validateEvent(event).success;\n}\n\n/**\n * Create a validating transport wrapper.\n * Wraps any AGUITransport to add validation before emission.\n * \n * @param transport - The transport to wrap\n * @param options - Validation options\n * @returns Wrapped transport with validation\n */\nexport function createValidatingTransport<T extends { emit: (event: AGUIEvent) => void }>(\n transport: T,\n options: {\n /** Throw on invalid events (default: false - just log warning) */\n throwOnInvalid?: boolean;\n /** Custom logger for validation errors */\n onValidationError?: (event: AGUIEvent, error: ValidationResult['error']) => void;\n } = {}\n): T {\n const { throwOnInvalid = false, onValidationError } = options;\n \n return {\n ...transport,\n emit: (event: AGUIEvent) => {\n const result = validateEvent(event);\n \n if (!result.success) {\n if (onValidationError) {\n onValidationError(event, result.error);\n } else {\n console.warn('[AG-UI Validation] Invalid event:', event.type, result.error);\n }\n \n if (throwOnInvalid) {\n throw new Error(`Invalid AG-UI event: ${result.error?.message}`);\n }\n }\n \n // Always emit (validation is advisory)\n transport.emit(event);\n },\n };\n}\n","/**\n * AG-UI Middleware Factory\n *\n * Creates middleware that integrates LangChain agents with the AG-UI protocol.\n */\n\nimport { createMiddleware } from \"langchain\";\nimport { z } from \"zod\";\nimport { generateDeterministicId } from \"../utils/idGenerator\";\nimport { computeStateDelta } from \"../utils/stateDiff\";\nimport { mapLangChainMessageToAGUI } from \"../utils/messageMapper\";\nimport { cleanLangChainData } from \"../utils/cleaner\";\nimport {\n AGUIMiddlewareOptionsSchema,\n type AGUIMiddlewareOptions,\n} from \"./types\";\nimport { createValidatingTransport } from \"../utils/validation\";\nimport { EventType } from \"../events\";\n\n/**\n * Check if validateEvents mode is truthy (true or \"strict\").\n */\nfunction isValidationEnabled(validateEvents: AGUIMiddlewareOptions['validateEvents']): boolean {\n return validateEvents === true || validateEvents === \"strict\";\n}\n\n/**\n * Interface for tracking agent execution activities.\n */\ninterface ActivityTracker {\n currentActivityId: string | undefined;\n currentActivityType: string;\n activityContent: Record<string, any>;\n}\n\n/**\n * Helper function to get a preview of the input for activity content.\n */\nfunction getInputPreview(state: unknown): string {\n const stateAny = state as any;\n if (stateAny.messages && Array.isArray(stateAny.messages)) {\n const lastMessage = stateAny.messages[stateAny.messages.length - 1];\n if (lastMessage && typeof lastMessage.content === \"string\") {\n return lastMessage.content.substring(0, 100) + (lastMessage.content.length > 100 ? \"...\" : \"\");\n }\n }\n return \"[no input preview]\";\n}\n\n/**\n * Helper function to get the type of output from state.\n */\nfunction getOutputType(state: unknown): string {\n const stateAny = state as any;\n if (stateAny.messages && Array.isArray(stateAny.messages)) {\n const lastMessage = stateAny.messages[stateAny.messages.length - 1];\n if (lastMessage?.toolCalls?.length) return \"tool_calls\";\n if (lastMessage?.content) return \"text\";\n }\n return \"unknown\";\n}\n\n/**\n * Helper function to check if state contains tool calls.\n */\nfunction hasToolCalls(state: unknown): boolean {\n const stateAny = state as any;\n return !!(stateAny.messages && stateAny.messages.some((m: any) => m.toolCalls?.length > 0));\n}\n\n/**\n * Emit ACTIVITY_SNAPSHOT or ACTIVITY_DELTA based on current state.\n * ACTIVITY_SNAPSHOT = new activity or significant change\n * ACTIVITY_DELTA = incremental update\n */\nasync function emitActivityUpdate(\n transport: any,\n currentRunId: string | undefined,\n stepIndex: number,\n activityTracker: ActivityTracker,\n status: \"started\" | \"processing\" | \"completed\",\n activityMapper: ((node: any) => any) | undefined,\n details?: Record<string, any>\n): Promise<void> {\n if (!currentRunId) return;\n\n const activityId = `activity-${currentRunId}-${stepIndex}`;\n const baseContent = {\n status,\n timestamp: Date.now(),\n ...details,\n };\n\n // Apply activityMapper if provided\n const finalContent = activityMapper ? activityMapper(baseContent) : baseContent;\n\n if (!activityTracker.currentActivityId || activityTracker.currentActivityId !== activityId) {\n // New activity - emit SNAPSHOT\n activityTracker.currentActivityId = activityId;\n activityTracker.currentActivityType = \"AGENT_STEP\";\n activityTracker.activityContent = finalContent;\n\n transport.emit({\n type: EventType.ACTIVITY_SNAPSHOT,\n messageId: activityId,\n activityType: \"AGENT_STEP\",\n content: finalContent,\n replace: true,\n });\n } else {\n // Existing activity - emit DELTA\n const patch = computeStateDelta(activityTracker.activityContent, finalContent);\n if (patch.length > 0) {\n activityTracker.activityContent = finalContent;\n\n transport.emit({\n type: EventType.ACTIVITY_DELTA,\n messageId: activityId,\n activityType: \"AGENT_STEP\",\n patch,\n });\n }\n }\n}\n\n/**\n * Create AG-UI middleware for LangChain agents.\n *\n * @param options - Middleware configuration options\n * @returns AgentMiddleware instance with lifecycle hooks\n */\nexport function createAGUIMiddleware(options: AGUIMiddlewareOptions) {\n // Validate options at creation time\n const validated = AGUIMiddlewareOptionsSchema.parse(options);\n \n // Wrap transport with validation if enabled\n // In \"strict\" mode, throw on invalid events; in true mode, log warnings\n let transport = validated.transport;\n if (isValidationEnabled(validated.validateEvents)) {\n transport = createValidatingTransport(validated.transport, {\n throwOnInvalid: validated.validateEvents === \"strict\",\n });\n }\n \n let threadId: string | undefined;\n let runId: string | undefined;\n let currentStepName: string | undefined = undefined;\n let modelTurnIndex = 0;\n\n const activityTracker: ActivityTracker = {\n currentActivityId: undefined,\n currentActivityType: \"AGENT_STEP\",\n activityContent: {},\n };\n\n const activityStates = new Map<string, any>();\n\n return createMiddleware({\n name: \"ag-ui-lifecycle\",\n contextSchema: z.object({\n run_id: z.string().optional(),\n runId: z.string().optional(),\n thread_id: z.string().optional(),\n threadId: z.string().optional(),\n }) as any,\n\n beforeAgent: async (state, runtime) => {\n modelTurnIndex = 0;\n const runtimeAny = runtime as any;\n const configurable = runtimeAny.config?.configurable || runtimeAny.configurable;\n \n threadId =\n (configurable?.threadId as string | undefined) ||\n (configurable?.thread_id as string | undefined) ||\n (configurable?.checkpoint_id as string | undefined) ||\n validated.threadIdOverride ||\n (runtimeAny.context?.threadId as string | undefined) ||\n (runtimeAny.context?.thread_id as string | undefined) ||\n \"\";\n\n // Exhaustive search for Run ID - generate fallback if not found\n runId =\n validated.runIdOverride ||\n (configurable?.run_id as string | undefined) ||\n (runtimeAny.runId as string | undefined) ||\n (runtimeAny.id as string | undefined) ||\n (runtimeAny.context?.runId as string | undefined) ||\n (runtimeAny.context?.run_id as string | undefined) ||\n (runtimeAny.config?.runId as string | undefined) ||\n crypto.randomUUID(); // Generate fallback for streamEvents compatibility\n\n try {\n transport.emit({\n type: EventType.RUN_STARTED,\n threadId,\n runId,\n input: cleanLangChainData(runtimeAny.config?.input),\n timestamp: Date.now(),\n });\n\n if (\n validated.emitStateSnapshots === \"initial\" ||\n validated.emitStateSnapshots === \"all\"\n ) {\n const snapshot = validated.stateMapper \n ? validated.stateMapper(state) \n : cleanLangChainData(state);\n \n // Remove messages from state snapshot by default to avoid redundancy\n if (!validated.stateMapper && snapshot && typeof snapshot === \"object\") {\n delete (snapshot as any).messages;\n }\n\n transport.emit({\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n timestamp: Date.now(),\n });\n }\n \n const stateAny = state as any;\n if (stateAny.messages && Array.isArray(stateAny.messages)) {\n transport.emit({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: stateAny.messages.map(mapLangChainMessageToAGUI),\n timestamp: Date.now(),\n });\n }\n } catch {\n // Fail-safe\n }\n\n // Store runId in metadata for callback coordination\n // This allows callbacks to use the same runId as middleware\n const configAny = runtimeAny.config as any;\n if (configAny) {\n configAny.metadata = {\n ...(configAny.metadata || {}),\n agui_runId: runId,\n };\n }\n\n return {};\n },\n\n beforeModel: async (state, runtime) => {\n const turnIndex = modelTurnIndex++;\n const messageId = generateDeterministicId(runId!, turnIndex);\n const stepName = `model_call_${messageId}`;\n currentStepName = stepName;\n\n // Store messageId in metadata for callback coordination\n // This ensures callbacks use the same messageId as middleware\n const runtimeAny = runtime as any;\n const configAny = runtimeAny.config as any;\n if (configAny) {\n configAny.metadata = {\n ...(configAny.metadata || {}),\n agui_messageId: messageId,\n };\n }\n\n try {\n transport.emit({\n type: EventType.STEP_STARTED,\n stepName,\n timestamp: Date.now(),\n // REMOVED: runId, threadId\n });\n\n // Emit ACTIVITY_SNAPSHOT for new activity if activities are enabled\n if (validated.emitActivities) {\n await emitActivityUpdate(\n transport,\n runId,\n turnIndex,\n activityTracker,\n \"started\",\n validated.activityMapper,\n {\n stepName,\n modelName: (runtime as any).config?.model?._modelType || \"unknown\",\n inputPreview: getInputPreview(state),\n } as Record<string, any>\n );\n }\n\n // TEXT_MESSAGE_START is handled by AGUICallbackHandler\n // It reads messageId from metadata in handleLLMStart\n } catch {\n // Fail-safe\n }\n\n return {};\n },\n\n afterModel: async (state, _runtime) => {\n try {\n // TEXT_MESSAGE_END is handled by AGUICallbackHandler\n // It uses the same messageId from metadata coordination\n\n transport.emit({\n type: EventType.STEP_FINISHED,\n stepName: currentStepName || \"\",\n timestamp: Date.now(),\n // REMOVED: runId, threadId\n });\n\n // Emit ACTIVITY_DELTA for completed activity if activities are enabled\n if (validated.emitActivities && currentStepName) {\n const turnIndex = modelTurnIndex - 1;\n await emitActivityUpdate(\n transport,\n runId,\n turnIndex,\n activityTracker,\n \"completed\",\n validated.activityMapper,\n {\n stepName: currentStepName,\n outputType: getOutputType(state),\n hasToolCalls: hasToolCalls(state),\n } as Record<string, any>\n );\n }\n\n // Emit STATE_SNAPSHOT after state-stabilizing events (not during streaming)\n // Per AG-UI spec and LangGraph implementation: emit only when streaming has completed\n // and state is stable. STATE_DELTA is NOT used in actual LangGraph implementations.\n if (validated.emitStateSnapshots !== \"none\") {\n // Only emit STATE_SNAPSHOT after streaming completes (state-stabilizing event)\n // This follows the LangGraph pattern: emit after tool/text streaming ends\n const filteredState = cleanLangChainData(state);\n const snapshot = validated.stateMapper \n ? validated.stateMapper(filteredState) \n : filteredState;\n \n // Remove messages from state snapshot (messages are in MESSAGES_SNAPSHOT)\n if (!validated.stateMapper && snapshot && typeof snapshot === \"object\") {\n delete (snapshot as any).messages;\n }\n \n // Only emit if we have meaningful state to share\n const stateKeys = snapshot ? Object.keys(snapshot).filter(k => snapshot[k] !== undefined && snapshot[k] !== null) : [];\n if (stateKeys.length > 0) {\n transport.emit({\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n timestamp: Date.now(),\n });\n }\n }\n } catch {\n // Fail-safe\n }\n\n currentStepName = undefined;\n return {};\n },\n\n afterAgent: async (state, _runtime) => {\n try {\n if (\n validated.emitStateSnapshots === \"final\" ||\n validated.emitStateSnapshots === \"all\"\n ) {\n const snapshot = validated.stateMapper \n ? validated.stateMapper(state) \n : cleanLangChainData(state);\n \n // Remove messages from state snapshot by default to avoid redundancy\n if (!validated.stateMapper && snapshot && typeof snapshot === \"object\") {\n delete (snapshot as any).messages;\n }\n\n transport.emit({\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n timestamp: Date.now(),\n });\n }\n\n const stateAny = state as any;\n if (stateAny.error) {\n const error = stateAny.error;\n const errorMessage = error instanceof Error ? error.message : String(error);\n transport.emit({\n type: EventType.RUN_ERROR,\n message:\n validated.errorDetailLevel === \"full\" ||\n validated.errorDetailLevel === \"message\"\n ? errorMessage\n : \"\",\n code: \"AGENT_EXECUTION_ERROR\",\n timestamp: Date.now(),\n // REMOVED: threadId, runId, parentRunId\n });\n } else {\n transport.emit({\n type: EventType.RUN_FINISHED,\n threadId: threadId!,\n runId: runId!,\n result: validated.resultMapper ? validated.resultMapper(state) : undefined,\n timestamp: Date.now(),\n });\n }\n } catch {\n // Fail-safe\n }\n\n return {};\n },\n });\n}\n","import type {\n AGUIEvent,\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageChunkEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallChunkEvent,\n} from \"../events\";\nimport { EventType } from \"../events\";\nimport { generateId } from \"./idGenerator\";\n\n/**\n * Normalizes and expands convenience events into their explicit counterparts.\n *\n * @param event - The event to expand\n * @returns An array of explicit AG-UI events\n */\nexport function expandEvent(event: AGUIEvent): AGUIEvent[] {\n switch (event.type) {\n case EventType.TEXT_MESSAGE_CHUNK: {\n const chunkEvent = event as TextMessageChunkEvent;\n const messageId = chunkEvent.messageId || generateId();\n const results: AGUIEvent[] = [];\n\n if (chunkEvent.role) {\n results.push({\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n role: chunkEvent.role,\n } as TextMessageStartEvent);\n }\n\n if (chunkEvent.delta) {\n results.push({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n delta: chunkEvent.delta,\n } as TextMessageContentEvent);\n }\n\n // If it has a role and delta, we assume it's a complete short message\n if (chunkEvent.role && chunkEvent.delta) {\n results.push({\n type: EventType.TEXT_MESSAGE_END,\n messageId,\n } as TextMessageEndEvent);\n }\n\n return results.length > 0 ? results : [event];\n }\n\n case EventType.TOOL_CALL_CHUNK: {\n const chunkEvent = event as ToolCallChunkEvent;\n const toolCallId = chunkEvent.toolCallId || generateId();\n const results: AGUIEvent[] = [];\n\n if (chunkEvent.toolCallName) {\n results.push({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName: chunkEvent.toolCallName,\n parentMessageId: chunkEvent.parentMessageId,\n } as ToolCallStartEvent);\n }\n\n if (chunkEvent.delta) {\n results.push({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: chunkEvent.delta,\n } as ToolCallArgsEvent);\n }\n\n if (chunkEvent.toolCallName && chunkEvent.delta) {\n results.push({\n type: EventType.TOOL_CALL_END,\n toolCallId,\n parentMessageId: chunkEvent.parentMessageId,\n } as ToolCallEndEvent);\n }\n\n return results.length > 0 ? results : [event];\n }\n\n default:\n return [event];\n }\n}\n","/**\n * AG-UI Callback Handler\n * \n * Handles streaming events for LLM tokens and tool calls.\n */\n\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { generateId, generateDeterministicId } from \"../utils/idGenerator\";\nimport { extractToolOutput } from \"../utils/cleaner\";\nimport { expandEvent } from \"../utils/eventNormalizer\";\nimport type { AGUITransport } from \"../transports/types\";\nimport { EventType, type TextMessageChunkEvent, type ToolCallChunkEvent } from \"../events\";\n\n/**\n * Configuration options for the callback handler.\n */\nexport interface AGUICallbackHandlerOptions {\n /** Maximum payload size in bytes for UI events (default: 50KB) */\n maxUIPayloadSize?: number;\n /** Whether to chunk large payloads instead of truncating */\n chunkLargeResults?: boolean;\n}\n\n/**\n * Callback handler for AG-UI protocol streaming events.\n * Handles LLM token streaming and tool call lifecycle events.\n */\nexport class AGUICallbackHandler extends BaseCallbackHandler {\n name = \"ag-ui-callback\";\n\n private messageIds = new Map<string, string>();\n private latestMessageIds = new Map<string, string>();\n private agentRunIds = new Map<string, string>(); // Maps current runId to authoritative agentRunId\n private parentToAuthoritativeId = new Map<string, string>(); // Maps internal parentRunId to authoritative agentRunId\n private thinkingIds = new Map<string, string>();\n private toolCallInfo = new Map<string, { id: string; name: string }>();\n private toolCallNames = new Map<string, string>(); // Maps toolCallId to tool name from LLM tool_calls\n private agentTurnTracker = new Map<string, number>();\n private pendingToolCalls = new Map<string, string[]>();\n private accumulatedToolArgs = new Map<string, string>(); // Accumulates partial args for streaming tool calls\n private transport: AGUITransport;\n \n private maxUIPayloadSize: number;\n private chunkLargeResults: boolean;\n\n constructor(transport: AGUITransport, options?: AGUICallbackHandlerOptions) {\n super({ raiseError: false });\n this.transport = transport;\n this.maxUIPayloadSize = options?.maxUIPayloadSize ?? 50 * 1024;\n this.chunkLargeResults = options?.chunkLargeResults ?? false;\n }\n\n dispose(): void {\n this.messageIds.clear();\n this.latestMessageIds.clear();\n this.agentRunIds.clear();\n this.parentToAuthoritativeId.clear();\n this.thinkingIds.clear();\n this.toolCallInfo.clear();\n this.toolCallNames.clear();\n this.agentTurnTracker.clear();\n this.pendingToolCalls.clear();\n this.accumulatedToolArgs.clear();\n }\n\n // ==================== Convenience Methods for Chunk Events ====================\n\n /**\n * Emit a TEXT_MESSAGE_CHUNK event (convenience method)\n * Auto-expands to START → CONTENT → END lifecycle\n * \n * Use this for simple cases where you have the complete message at once\n * instead of handling the streaming lifecycle manually.\n * \n * @param messageId - Unique message identifier (auto-generated if not provided)\n * @param role - Message role (defaults to \"assistant\")\n * @param delta - Text content to emit\n */\n async emitTextChunk(\n messageId: string,\n role: \"assistant\" | \"user\" | \"system\" | \"developer\" = \"assistant\",\n delta: string\n ): Promise<void> {\n const events = expandEvent({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n role,\n delta,\n } as TextMessageChunkEvent);\n \n for (const event of events) {\n await this.transport.emit(event);\n }\n }\n\n /**\n * Emit a TOOL_CALL_CHUNK event (convenience method)\n * Auto-expands to START → ARGS → END lifecycle\n * \n * Use this for simple tool calls where you have the complete arguments at once\n * instead of handling the streaming lifecycle manually.\n * \n * @param toolCallId - Unique tool call identifier (auto-generated if not provided)\n * @param toolCallName - Name of the tool being called\n * @param delta - Tool arguments (JSON string)\n * @param parentMessageId - ID of the message that triggered this tool call\n */\n async emitToolChunk(\n toolCallId: string,\n toolCallName: string,\n delta: string,\n parentMessageId?: string\n ): Promise<void> {\n const events = expandEvent({\n type: EventType.TOOL_CALL_CHUNK,\n toolCallId,\n toolCallName,\n delta,\n parentMessageId,\n } as ToolCallChunkEvent);\n \n for (const event of events) {\n await this.transport.emit(event);\n }\n }\n\n // ==================== LLM Callbacks ====================\n\n override async handleLLMStart(\n _llm: any,\n _prompts: string[],\n runId: string,\n _parentRunId?: string,\n _extraParams?: Record<string, unknown>,\n _tags?: string[],\n _metadata?: Record<string, unknown>,\n _runName?: string\n ): Promise<void> {\n // Priority: metadata.agui_messageId (from middleware) > metadata.run_id > parentRunId > runId\n const agentRunId =\n ((_metadata as any)?.agui_runId as string | undefined) ||\n ((_metadata as any)?.run_id as string | undefined) ||\n ((_metadata as any)?.configurable?.run_id as string | undefined) ||\n _parentRunId ||\n runId;\n\n this.agentRunIds.set(runId, agentRunId);\n if (_parentRunId) {\n this.parentToAuthoritativeId.set(_parentRunId, agentRunId);\n }\n\n // Check if middleware sent us a messageId via metadata\n const middlewareMessageId = (_metadata as any)?.agui_messageId as string | undefined;\n \n if (middlewareMessageId) {\n // Use middleware's messageId for coordination\n this.messageIds.set(runId, middlewareMessageId);\n this.latestMessageIds.set(agentRunId, middlewareMessageId);\n \n // Emit TEXT_MESSAGE_START (coordination with middleware)\n this.transport.emit({\n type: EventType.TEXT_MESSAGE_START,\n messageId: middlewareMessageId,\n role: \"assistant\",\n timestamp: Date.now(),\n });\n } else {\n // Generate our own messageId if middleware didn't provide one\n const turnIndex = this.agentTurnTracker.get(agentRunId) || 0;\n this.agentTurnTracker.set(agentRunId, turnIndex + 1);\n\n const messageId = generateDeterministicId(agentRunId, turnIndex);\n this.messageIds.set(runId, messageId);\n this.latestMessageIds.set(agentRunId, messageId);\n \n // Emit TEXT_MESSAGE_START (no middleware coordination)\n this.transport.emit({\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n role: \"assistant\",\n timestamp: Date.now(),\n });\n }\n }\n\n override async handleLLMNewToken(\n token: string,\n _idx: any,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n fields?: any\n ): Promise<void> {\n const messageId = this.messageIds.get(runId);\n if (!messageId) return;\n\n try {\n // Handle Reasoning Tokens (e.g., DeepSeek, OpenAI o1)\n const reasoningContent = fields?.chunk?.message?.additional_kwargs?.reasoning_content ||\n fields?.chunk?.message?.additional_kwargs?.reasoning;\n if (reasoningContent) {\n let thinkingId = this.thinkingIds.get(runId);\n if (!thinkingId) {\n const agentRunId = this.agentRunIds.get(runId) ||\n (_parentRunId ? this.parentToAuthoritativeId.get(_parentRunId) : null) ||\n _parentRunId ||\n runId;\n thinkingId = generateDeterministicId(agentRunId, (this.agentTurnTracker.get(agentRunId) || 1) + 100); // Offset for thinking\n this.thinkingIds.set(runId, thinkingId);\n this.transport.emit({\n type: EventType.THINKING_START,\n timestamp: Date.now(),\n });\n this.transport.emit({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n messageId: thinkingId,\n timestamp: Date.now(),\n });\n }\n\n const delta = typeof reasoningContent === 'string'\n ? reasoningContent\n : ((reasoningContent as any).text || JSON.stringify(reasoningContent));\n\n this.transport.emit({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n messageId: thinkingId,\n delta,\n timestamp: Date.now(),\n });\n }\n\n // Emit TEXT_MESSAGE_CONTENT for streaming tokens\n if (token && token.length > 0) {\n this.transport.emit({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n delta: token,\n timestamp: Date.now(),\n });\n }\n\n // Emit TOOL_CALL_ARGS for streaming tool arguments (may contain partial JSON fragments)\n const toolCallChunks = fields?.chunk?.message?.tool_call_chunks;\n if (toolCallChunks && Array.isArray(toolCallChunks)) {\n const agentRunId = this.agentRunIds.get(runId) || \n (_parentRunId ? this.parentToAuthoritativeId.get(_parentRunId) : null) || \n _parentRunId || \n runId;\n \n // Track tool call IDs for correlation with handleToolStart\n const pending = this.pendingToolCalls.get(agentRunId) || [];\n \n for (const chunk of toolCallChunks) {\n if (chunk.id && chunk.args) {\n // Accumulate partial args by toolCallId\n const previousArgs = this.accumulatedToolArgs.get(chunk.id) || \"\";\n const newArgs = previousArgs + chunk.args;\n \n // Only accumulate if args have changed (avoid duplicate accumulations)\n if (newArgs !== previousArgs) {\n this.accumulatedToolArgs.set(chunk.id, newArgs);\n }\n \n // Track this tool call ID for later correlation\n if (!pending.includes(chunk.id)) {\n pending.push(chunk.id);\n }\n }\n }\n \n if (pending.length > 0) {\n this.pendingToolCalls.set(agentRunId, pending);\n }\n }\n } catch {\n // Fail-safe\n }\n }\n\n override async handleLLMEnd(\n _output: any,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n _extraParams?: Record<string, unknown>\n ): Promise<void> {\n const messageId = this.messageIds.get(runId);\n const thinkingId = this.thinkingIds.get(runId);\n\n try {\n // Collect any tool calls from final output that we missed during streaming\n if (_output && typeof _output === \"object\") {\n const toolCalls = _output.tool_calls || (_output.kwargs?.tool_calls);\n if (Array.isArray(toolCalls)) {\n const agentRunId = this.agentRunIds.get(runId) ||\n (_parentRunId ? this.parentToAuthoritativeId.get(_parentRunId) : null) ||\n _parentRunId ||\n runId;\n const pending = this.pendingToolCalls.get(agentRunId) || [];\n for (const tc of toolCalls) {\n if (tc.id && !pending.includes(tc.id)) {\n pending.push(tc.id);\n \n // Store tool name for later use in handleToolStart\n if (tc.function?.name) {\n this.toolCallNames.set(tc.id, tc.function.name);\n }\n \n // Accumulate tool call args for later emission in handleToolStart\n if (tc.function?.arguments) {\n this.accumulatedToolArgs.set(tc.id, tc.function.arguments);\n }\n }\n }\n this.pendingToolCalls.set(agentRunId, pending);\n }\n }\n\n // Emit TEXT_MESSAGE_END\n if (messageId) {\n this.transport.emit({\n type: EventType.TEXT_MESSAGE_END,\n messageId,\n timestamp: Date.now(),\n });\n }\n\n if (thinkingId) {\n this.transport.emit({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n messageId: thinkingId,\n timestamp: Date.now(),\n });\n this.transport.emit({\n type: EventType.THINKING_END,\n timestamp: Date.now(),\n });\n this.thinkingIds.delete(runId);\n }\n\n // Cleanup\n this.messageIds.delete(runId);\n } catch {\n // Fail-safe\n }\n }\n\n override async handleLLMError(\n _error: Error,\n runId: string,\n _parentRunId?: string\n ): Promise<void> {\n this.messageIds.delete(runId);\n this.thinkingIds.delete(runId);\n const agentRunId = this.agentRunIds.get(runId) ||\n (_parentRunId ? this.parentToAuthoritativeId.get(_parentRunId) : null) ||\n _parentRunId ||\n runId;\n this.pendingToolCalls.delete(agentRunId);\n this.agentRunIds.delete(runId);\n }\n\n // ==================== Tool Callbacks ====================\n\n override async handleToolStart(\n tool: any,\n input: string,\n runId: string,\n parentRunId?: string,\n _tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string\n ): Promise<void> {\n let toolCallId = runId;\n \n // Try to get tool name from various sources (in priority order):\n // 1. runName parameter (most direct - provided by LangChain)\n // 2. From tool object properties (tool.kwargs.name)\n // 3. From stored tool names (populated in handleLLMEnd from LLM tool_calls)\n // 4. From input JSON\n // 5. Default to \"unknown_tool\"\n let toolCallName = runName || \n (tool as any).kwargs?.name ||\n (tool as any).name || \n (tool as any).func?.name || \n (tool as any).getName?.() || \n (tool as any).toolName ||\n (tool as any)._name ||\n \"unknown_tool\"; // Ensure always populated\n\n try {\n // Priority order for toolCallId (MUST use LangChain IDs only):\n // 1. metadata.tool_call_id (modern LangChain pattern)\n // 2. Input's tool_call_id or id field (from tool invocation)\n // 3. Match accumulated streaming args by content\n \n // 1. Check metadata for tool_call_id (if provided)\n if (metadata?.tool_call_id && typeof metadata.tool_call_id === \"string\") {\n toolCallId = metadata.tool_call_id;\n \n // If we have a stored tool name for this ID, use it\n const storedName = this.toolCallNames.get(toolCallId);\n if (storedName && storedName !== \"unknown_tool\") {\n toolCallName = storedName;\n }\n }\n // 2. Check input for tool_call_id or id\n else if (input) {\n try {\n const parsed = typeof input === \"string\" ? JSON.parse(input) : input;\n if (parsed && typeof parsed === \"object\") {\n if (parsed.tool_call_id) {\n toolCallId = parsed.tool_call_id;\n } else if (parsed.id) {\n toolCallId = parsed.id;\n }\n if (parsed.name) {\n toolCallName = parsed.name;\n }\n }\n } catch {\n // Not JSON, ignore\n }\n }\n // 3. Match accumulated streaming args by content comparison\n if (toolCallId === runId && this.accumulatedToolArgs.size > 0 && input) {\n // Find matching accumulated ID by comparing args content\n for (const [id, args] of this.accumulatedToolArgs) {\n if (input.includes(args) || args.includes(input)) {\n toolCallId = id;\n \n // If we have a stored tool name for this ID, use it\n const storedName = this.toolCallNames.get(id);\n if (storedName && storedName !== \"unknown_tool\") {\n toolCallName = storedName;\n }\n break;\n }\n }\n }\n } catch {\n // Use defaults\n }\n\n try {\n // Priority order for toolCallId (MUST use LangChain IDs only):\n // 1. metadata.tool_call_id (modern LangChain pattern)\n // 2. Input's tool_call_id or id field (from tool invocation)\n // 3. Match accumulated streaming args by content\n \n // 1. Check metadata for tool_call_id (if provided)\n if (metadata?.tool_call_id && typeof metadata.tool_call_id === \"string\") {\n toolCallId = metadata.tool_call_id;\n }\n // 2. Check input for tool_call_id or id\n else if (input) {\n try {\n const parsed = typeof input === \"string\" ? JSON.parse(input) : input;\n if (parsed && typeof parsed === \"object\") {\n if (parsed.tool_call_id) {\n toolCallId = parsed.tool_call_id;\n } else if (parsed.id) {\n toolCallId = parsed.id;\n }\n if (parsed.name) {\n toolCallName = parsed.name;\n }\n }\n } catch {\n // Not JSON, ignore\n }\n }\n // 3. Match accumulated streaming args by content comparison\n if (toolCallId === runId && this.accumulatedToolArgs.size > 0 && input) {\n // Find matching accumulated ID by comparing args content\n for (const [id, args] of this.accumulatedToolArgs) {\n if (input.includes(args) || args.includes(input)) {\n toolCallId = id;\n break;\n }\n }\n }\n } catch {\n // Use defaults\n }\n\n this.toolCallInfo.set(runId, { id: toolCallId, name: toolCallName });\n\n const agentRunId = (parentRunId ? this.parentToAuthoritativeId.get(parentRunId) : null) || parentRunId || \"\";\n const messageId = this.latestMessageIds.get(agentRunId);\n\n try {\n // Emit TOOL_CALL_START first\n this.transport.emit({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n parentMessageId: messageId,\n timestamp: Date.now(),\n });\n\n // Emit accumulated TOOL_CALL_ARGS (from streaming in handleLLMNewToken)\n // This preserves real-time streaming while maintaining protocol sequence\n const accumulatedArgs = this.accumulatedToolArgs.get(toolCallId);\n if (accumulatedArgs) {\n this.transport.emit({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: accumulatedArgs,\n timestamp: Date.now(),\n });\n // Clean up accumulated args\n this.accumulatedToolArgs.delete(toolCallId);\n }\n } catch {\n // Fail-safe\n }\n }\n\n override async handleToolEnd(\n output: any,\n runId: string,\n parentRunId?: string\n ): Promise<void> {\n const toolInfo = this.toolCallInfo.get(runId);\n this.toolCallInfo.delete(runId);\n\n // Cleanup tool name mapping\n if (toolInfo?.id) {\n this.toolCallNames.delete(toolInfo.id);\n }\n\n const agentRunId = (parentRunId ? this.parentToAuthoritativeId.get(parentRunId) : null) || parentRunId || \"\";\n const messageId = this.latestMessageIds.get(agentRunId);\n\n try {\n const endToolCallId = toolInfo?.id ?? runId;\n\n // If output is a LangChain message, it might contain the real tool_call_id\n let finalToolCallId = endToolCallId;\n if (output && typeof output === \"object\") {\n const kwargs = output.kwargs || output.lc_kwargs;\n if (kwargs?.tool_call_id) {\n finalToolCallId = kwargs.tool_call_id;\n }\n }\n\n this.transport.emit({\n type: EventType.TOOL_CALL_END,\n toolCallId: finalToolCallId,\n timestamp: Date.now(),\n });\n\n this.emitToolResultWithPolicy(output, finalToolCallId, messageId, toolInfo?.name);\n } catch {\n // Fail-safe\n }\n }\n\n override async handleToolError(\n _error: Error,\n runId: string,\n parentRunId?: string\n ): Promise<void> {\n const toolInfo = this.toolCallInfo.get(runId);\n this.toolCallInfo.delete(runId);\n \n // Cleanup accumulated tool args for this tool call\n if (toolInfo?.id) {\n this.accumulatedToolArgs.delete(toolInfo.id);\n }\n \n const agentRunId = (parentRunId ? this.parentToAuthoritativeId.get(parentRunId) : null) || parentRunId || \"\";\n const messageId = this.latestMessageIds.get(agentRunId);\n\n try {\n this.transport.emit({\n type: EventType.TOOL_CALL_END,\n toolCallId: toolInfo?.id ?? runId,\n timestamp: Date.now(),\n });\n } catch {\n // Fail-safe\n }\n }\n\n // ==================== Smart Emission ====================\n\n private chunkString(content: string, maxChunkSize: number): string[] {\n const chunks: string[] = [];\n let remaining = content;\n \n while (remaining.length > 0) {\n if (new Blob([remaining]).size <= maxChunkSize) {\n chunks.push(remaining);\n break;\n }\n \n let splitPoint = maxChunkSize;\n const spaceIndex = remaining.lastIndexOf(' ', maxChunkSize);\n const newlineIndex = remaining.lastIndexOf('\\n', maxChunkSize);\n const boundaryIndex = Math.max(spaceIndex, newlineIndex);\n \n if (boundaryIndex > maxChunkSize * 0.5) {\n splitPoint = boundaryIndex;\n } else {\n while (splitPoint > 0 && remaining.charCodeAt(splitPoint - 1) > 127) {\n splitPoint--;\n }\n if (splitPoint === 0) {\n splitPoint = maxChunkSize;\n }\n }\n \n chunks.push(remaining.substring(0, splitPoint));\n remaining = remaining.substring(splitPoint).trim();\n }\n \n return chunks;\n }\n\n private emitToolResultWithPolicy(\n output: any,\n toolCallId: string,\n messageId: string | undefined,\n toolCallName?: string\n ): void {\n let content = extractToolOutput(output);\n const resultMessageId = generateId();\n const contentSize = new Blob([content]).size;\n \n if (contentSize <= this.maxUIPayloadSize) {\n this.transport.emit({\n type: EventType.TOOL_CALL_RESULT,\n messageId: resultMessageId,\n toolCallId,\n content,\n role: \"tool\",\n timestamp: Date.now(),\n });\n return;\n }\n \n if (this.chunkLargeResults) {\n const chunks = this.chunkString(content, this.maxUIPayloadSize);\n for (let i = 0; i < chunks.length; i++) {\n // Use CUSTOM event or a new event type for large result chunks\n // to avoid collision with ToolCallChunk which is for arguments\n this.transport.emit({\n type: EventType.CUSTOM,\n name: \"LARGE_RESULT_CHUNK\",\n value: {\n toolCallId,\n chunk: chunks[i],\n index: i,\n total: chunks.length\n }\n });\n }\n return;\n }\n\n const truncationMessage = ` [Truncated: ${contentSize - this.maxUIPayloadSize + 50} bytes]`;\n const availableSpace = this.maxUIPayloadSize - truncationMessage.length;\n const truncatedContent = content.substring(0, Math.max(0, availableSpace)) + truncationMessage;\n\n this.transport.emit({\n type: EventType.TOOL_CALL_RESULT,\n messageId: resultMessageId,\n toolCallId,\n content: truncatedContent,\n role: \"tool\",\n timestamp: Date.now(),\n });\n }\n}\n","/**\n * AG-UI Agent Factory\n *\n * Creates a LangChain agent with automatic AG-UI protocol integration.\n *\n * Architecture:\n * - Uses createAgent() from langchain package\n * - Returns agent with callbacks bound to graph via withConfig\n * - Emits lifecycle events for agent execution (RUN_STARTED, RUN_FINISHED, etc.)\n * - Callbacks are merged with user-provided callbacks by LangChain\n * - Abort signal from context enables client disconnect handling\n */\n\nimport { createAgent } from \"langchain\";\nimport { AGUICallbackHandler, type AGUICallbackHandlerOptions } from \"./callbacks/AGUICallbackHandler\";\nimport { createAGUIMiddleware } from \"./middleware/createAGUIMiddleware\";\nimport type { AGUITransport } from \"./transports/types\";\nimport type { AGUIMiddlewareOptions } from \"./middleware/types\";\nimport { EventType } from \"./events\";\n\n/**\n * Configuration for creating an AG-UI enabled agent.\n */\nexport interface AGUIAgentConfig {\n /** The language model to use */\n model: any;\n /** The tools available to the agent */\n tools: any[];\n /** The transport for AG-UI events */\n transport: AGUITransport;\n /** Optional middleware configuration */\n middlewareOptions?: Partial<AGUIMiddlewareOptions>;\n /** Optional callback handler configuration */\n callbackOptions?: AGUICallbackHandlerOptions;\n}\n\n/**\n * Create an AG-UI enabled agent.\n *\n * This function creates a LangChain agent with automatic AG-UI protocol integration:\n * - Middleware handles lifecycle events (RUN_STARTED, RUN_FINISHED, etc.)\n * - Callbacks handle streaming events (TEXT_MESSAGE_CONTENT, TOOL_CALL_ARGS, etc.)\n * - Callbacks must be passed at runtime via agent.streamEvents() config\n * - Guaranteed cleanup via middleware wrapModelCall with try-finally\n *\n * Note: Callbacks are not bound to the model here because:\n * 1. Some models (like MockChatModel in tests) don't properly support withConfig()\n * 2. Users should pass callbacks at runtime for proper streaming\n *\n * @param config - Agent configuration\n * @returns An agent with AG-UI protocol support\n */\nexport function createAGUIAgent(config: AGUIAgentConfig) {\n // Create middleware with transport\n const middleware = createAGUIMiddleware({\n transport: config.transport,\n emitToolResults: config.middlewareOptions?.emitToolResults ?? true,\n emitStateSnapshots: config.middlewareOptions?.emitStateSnapshots ?? \"initial\",\n emitActivities: config.middlewareOptions?.emitActivities ?? false,\n maxUIPayloadSize: config.middlewareOptions?.maxUIPayloadSize ?? 50 * 1024,\n chunkLargeResults: config.middlewareOptions?.chunkLargeResults ?? false,\n threadIdOverride: config.middlewareOptions?.threadIdOverride,\n runIdOverride: config.middlewareOptions?.runIdOverride,\n errorDetailLevel: config.middlewareOptions?.errorDetailLevel ?? \"message\",\n stateMapper: config.middlewareOptions?.stateMapper,\n resultMapper: config.middlewareOptions?.resultMapper,\n activityMapper: config.middlewareOptions?.activityMapper,\n validateEvents: config.middlewareOptions?.validateEvents ?? false,\n });\n\n // Create base agent with middleware\n // Note: Callbacks are NOT bound here - they must be passed at runtime\n const agent = createAgent({\n model: config.model,\n tools: config.tools,\n middleware: [middleware],\n });\n\n // Attach global listeners for guaranteed cleanup and error handling if supported\n if (agent && typeof (agent as any).withListeners === \"function\") {\n return (agent as any).withListeners({\n onError: (run: any) => {\n try {\n // Extract threadId and runId from run config if available\n const threadId = run.config?.configurable?.threadId as string | undefined;\n const agentRunId = run.config?.configurable?.runId as string | undefined;\n config.transport.emit({\n type: EventType.RUN_ERROR,\n message: typeof run.error === \"string\" ? run.error : (run.error as any)?.message || \"Agent execution failed\",\n code: \"AGENT_EXECUTION_ERROR\",\n timestamp: Date.now(),\n // REMOVED: threadId, runId\n });\n } catch {\n // Fail-safe\n }\n },\n });\n }\n\n return agent;\n}\n","/**\n * SSE Transport Implementation\n * \n * Server-Sent Events transport for AG-UI protocol.\n * Provides:\n * - Proper SSE headers\n * - Fail-safe emission (never throws on client disconnect)\n * - Abort signal integration for client disconnect handling\n * - Backpressure handling with queue-based emission\n */\n\nimport type { AGUIEvent } from \"../events\";\nimport type { AGUITransport } from \"./types\";\n\n/**\n * Extended SSE transport interface with abort signal.\n */\nexport interface SSETransport extends AGUITransport {\n /** Abort signal triggered on client disconnect */\n signal: AbortSignal;\n}\n\n/**\n * HTTP request interface for SSE transport.\n */\ninterface SSETransportRequest {\n on(event: string, callback: () => void): void;\n}\n\n/**\n * HTTP response interface for SSE transport.\n */\ninterface SSETransportResponse {\n setHeader(name: string, value: string): SSETransportResponse;\n write(data: string): boolean;\n end?(): void;\n}\n\n/**\n * Create an SSE transport for Server-Sent Events.\n * \n * @param req - HTTP request object (listens for 'close' event)\n * @param res - HTTP response object\n * @returns SSETransport with emit method and abort signal\n */\nexport function createSSETransport(\n req: SSETransportRequest,\n res: SSETransportResponse\n): SSETransport {\n // Set proper SSE headers\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\");\n\n // Create abort controller for client disconnect handling\n const controller = new AbortController();\n req.on(\"close\", () => controller.abort());\n\n // Backpressure queue\n const queue: AGUIEvent[] = [];\n let draining = false;\n\n /**\n * Drain the event queue to the response.\n */\n async function drain(): Promise<void> {\n draining = true;\n while (queue.length > 0 && res.write) {\n const event = queue.shift()!;\n try {\n res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n } catch {\n // Client disconnected - stop draining\n break;\n }\n }\n draining = false;\n }\n\n return {\n emit: (event: AGUIEvent) => {\n queue.push(event);\n if (!draining) {\n drain();\n }\n },\n\n signal: controller.signal,\n\n disconnect: res.end\n ? () => {\n res.end?.();\n }\n : undefined,\n\n isConnected: () => !controller.signal.aborted,\n };\n}\n","/**\n * Protobuf Transport Implementation\n * \n * Protocol Buffer transport for AG-UI protocol.\n * Provides:\n * - Binary encoding using @ag-ui/proto\n * - 4-byte Big-Endian length prefix per protocol spec\n * - Fail-safe emission (never throws on client disconnect)\n * - Abort signal integration for client disconnect handling\n * - Backpressure handling with queue-based emission\n * \n * Protobuf provides 60-80% smaller payloads compared to JSON/SSE.\n * \n * @see https://docs.ag-ui.com/introduction\n */\n\nimport { encode, decode, AGUI_MEDIA_TYPE } from '@ag-ui/proto';\nimport type { AGUIEvent, MessagesSnapshotEvent } from \"../events\";\nimport type { AGUITransport, ProtobufTransport } from \"./types\";\nimport { EventType } from \"../events\";\n\n/**\n * Re-export the official AG-UI media type for content negotiation.\n */\nexport { AGUI_MEDIA_TYPE };\n\n/**\n * HTTP request interface for Protobuf transport.\n */\ninterface ProtobufTransportRequest {\n on(event: string, callback: () => void): void;\n}\n\n/**\n * HTTP response interface for Protobuf transport.\n */\ninterface ProtobufTransportResponse {\n setHeader(name: string, value: string): ProtobufTransportResponse;\n write(data: Buffer | Uint8Array): boolean;\n end?(): void;\n}\n\n/**\n * Encode an AG-UI event with 4-byte Big-Endian length prefix.\n * \n * Per AG-UI protocol spec:\n * ┌─────────────────┬──────────────────────────────────┐\n * │ Length (4 BE) │ Protobuf Event Bytes │\n * └─────────────────┴──────────────────────────────────┘\n * \n * @param event - The AG-UI event to encode\n * @returns Uint8Array with length prefix + protobuf bytes\n */\nexport function encodeEventWithFraming(event: AGUIEvent): Uint8Array {\n // Convert our event type to @ag-ui/core BaseEvent format\n // The @ag-ui/proto encode function expects a BaseEvent from @ag-ui/core\n const coreEvent = convertToProtobufEvent(event);\n \n // Encode to protobuf bytes\n const eventBytes = encode(coreEvent);\n \n // Create 4-byte Big-Endian length prefix\n const lengthPrefix = new DataView(new ArrayBuffer(4));\n lengthPrefix.setUint32(0, eventBytes.length, false); // false = Big-Endian\n \n // Concatenate length + payload\n const result = new Uint8Array(4 + eventBytes.length);\n result.set(new Uint8Array(lengthPrefix.buffer), 0);\n result.set(eventBytes, 4);\n \n return result;\n}\n\n/**\n * Decode a framed protobuf event (with 4-byte length prefix).\n * \n * @param data - Buffer containing length prefix + protobuf bytes\n * @returns The decoded AG-UI event\n */\nexport function decodeEventWithFraming(data: Uint8Array): AGUIEvent {\n if (data.length < 4) {\n throw new Error(\"Invalid protobuf frame: insufficient data for length prefix\");\n }\n \n const length = new DataView(data.buffer, data.byteOffset).getUint32(0, false); // Big-Endian\n \n if (data.length < 4 + length) {\n throw new Error(\"Invalid protobuf frame: insufficient data for payload\");\n }\n \n const eventBytes = data.slice(4, 4 + length);\n const decoded = decode(eventBytes);\n \n // Convert back to our event format\n return convertFromProtobufEvent(decoded) as AGUIEvent;\n}\n\n/**\n * Convert our event format to @ag-ui/core BaseEvent format.\n * Handles field name differences (e.g., tool_calls → toolCalls).\n */\nfunction convertToProtobufEvent(event: AGUIEvent): any {\n const baseEvent: any = { ...event };\n \n // Handle Message objects in MESSAGES_SNAPSHOT\n if (event.type === EventType.MESSAGES_SNAPSHOT) {\n const messagesEvent = event as MessagesSnapshotEvent;\n if (messagesEvent.messages) {\n baseEvent.messages = messagesEvent.messages.map((msg: any) => ({\n ...msg,\n // Convert tool_calls to toolCalls if present\n toolCalls: msg.tool_calls?.map((tc: any) => ({\n id: tc.id,\n type: tc.type,\n function: tc.function,\n })),\n // Remove snake_case version\n tool_calls: undefined,\n // Convert tool_call_id to toolCallId\n toolCallId: msg.tool_call_id,\n tool_call_id: undefined,\n }));\n }\n }\n \n return baseEvent;\n}\n\n/**\n * Convert @ag-ui/core BaseEvent format back to our event format.\n * Handles field name differences (e.g., toolCalls → tool_calls).\n */\nfunction convertFromProtobufEvent(event: any): AGUIEvent {\n const result: any = { ...event };\n \n // Handle Message objects in MESSAGES_SNAPSHOT\n if (event.type === EventType.MESSAGES_SNAPSHOT) {\n if (event.messages) {\n result.messages = event.messages.map((msg: any) => ({\n ...msg,\n // Convert toolCalls to tool_calls if present\n tool_calls: msg.toolCalls?.map((tc: any) => ({\n id: tc.id,\n type: tc.type,\n function: tc.function,\n })),\n // Remove camelCase version\n toolCalls: undefined,\n // Convert toolCallId to tool_call_id\n tool_call_id: msg.toolCallId,\n toolCallId: undefined,\n }));\n }\n }\n \n return result;\n}\n\n/**\n * Create a Protobuf transport for binary AG-UI protocol communication.\n * \n * @param req - HTTP request object (listens for 'close' event)\n * @param res - HTTP response object\n * @returns ProtobufTransport with emit method and abort signal\n * \n * @example\n * ```typescript\n * app.post('/api/agent', (req, res) => {\n * const acceptProtobuf = req.headers.accept?.includes(AGUI_MEDIA_TYPE);\n * \n * if (acceptProtobuf) {\n * const transport = createProtobufTransport(req, res);\n * // Use transport.emit() for binary encoding\n * } else {\n * const transport = createSSETransport(req, res);\n * // Use transport.emit() for JSON/SSE\n * }\n * });\n * ```\n */\nexport function createProtobufTransport(\n req: ProtobufTransportRequest,\n res: ProtobufTransportResponse\n): ProtobufTransport {\n // Set proper Protobuf headers\n res.setHeader(\"Content-Type\", AGUI_MEDIA_TYPE);\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\");\n\n // Create abort controller for client disconnect handling\n const controller = new AbortController();\n req.on(\"close\", () => controller.abort());\n\n // Backpressure queue\n const queue: AGUIEvent[] = [];\n let draining = false;\n\n /**\n * Drain the event queue to the response.\n */\n async function drain(): Promise<void> {\n draining = true;\n while (queue.length > 0 && res.write) {\n const event = queue.shift()!;\n try {\n const framedData = encodeEventWithFraming(event);\n res.write(framedData);\n } catch {\n // Client disconnected or encoding error - stop draining\n break;\n }\n }\n draining = false;\n }\n\n return {\n emit: (event: AGUIEvent) => {\n queue.push(event);\n if (!draining) {\n drain();\n }\n },\n\n signal: controller.signal,\n\n disconnect: res.end\n ? () => {\n res.end?.();\n }\n : undefined,\n\n isConnected: () => !controller.signal.aborted,\n \n // Protobuf-specific utilities\n encodeEvent: encodeEventWithFraming,\n decodeEvent: decodeEventWithFraming,\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skroyc/ag-ui-middleware-callbacks",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "LangChain.js integration providing middleware and callbacks for AG-UI protocol compatibility",
|
|
5
|
-
"keywords": [
|
|
5
|
+
"keywords": [
|
|
6
|
+
"langchain",
|
|
7
|
+
"ag-ui",
|
|
8
|
+
"middleware",
|
|
9
|
+
"callbacks",
|
|
10
|
+
"agent",
|
|
11
|
+
"streaming"
|
|
12
|
+
],
|
|
6
13
|
"author": "SkrOYC <oscar@ocmasesorias.com>",
|
|
7
14
|
"license": "MIT",
|
|
8
15
|
"repository": {
|
|
@@ -13,7 +20,12 @@
|
|
|
13
20
|
"engines": {
|
|
14
21
|
"node": ">=18.0.0"
|
|
15
22
|
},
|
|
16
|
-
"files": [
|
|
23
|
+
"files": [
|
|
24
|
+
"dist/",
|
|
25
|
+
"package.json",
|
|
26
|
+
"README.md",
|
|
27
|
+
"LICENSE"
|
|
28
|
+
],
|
|
17
29
|
"main": "./dist/index.js",
|
|
18
30
|
"module": "./dist/index.js",
|
|
19
31
|
"types": "./dist/index.d.mts",
|