@skroyc/ag-ui-middleware-callbacks 1.0.1 → 1.0.2
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.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {createMiddleware,createAgent}from'langchain';import {z as z$1}from'zod';import*as k from'fast-json-patch';import {HumanMessage,AIMessage,ToolMessage,SystemMessage,ChatMessage}from'@langchain/core/messages';import {EventType,EventSchemas}from'@ag-ui/core';import {BaseCallbackHandler}from'@langchain/core/callbacks/base';function I(){return crypto.randomUUID()}function A(s,e){if(!s)throw new Error("baseId is required for deterministic ID generation");let t=`${s}-${e}`,n=0;for(let l=0;l<t.length;l++){let c=t.charCodeAt(l);n=(n<<5)-n+c,n=n&n;}let i=Math.abs(n).toString(16).padStart(8,"0");return `${s}-${i}`}function M(s,e){return k.compare(s,e)}function O(s){let e=s.id||I(),t="assistant",n,i,l=typeof s.content=="string"?s.content:JSON.stringify(s.content);if(s instanceof HumanMessage||s.role==="user"||s._getType?.()==="human")t="user";else if(s instanceof AIMessage||s.role==="assistant"||s._getType?.()==="ai"){t="assistant";let c=s.tool_calls||s.kwargs?.tool_calls;c&&c.length>0&&(n=c.map(g=>({id:g.id,type:"function",function:{name:g.name,arguments:typeof g.args=="string"?g.args:JSON.stringify(g.args)}})));}else s instanceof ToolMessage||s.role==="tool"||s._getType?.()==="tool"?(t="tool",i=s.tool_call_id||s.kwargs?.tool_call_id):s instanceof SystemMessage||s.role==="system"||s._getType?.()==="system"?t="system":(s instanceof ChatMessage||s.role)&&(t=s.role);return {id:e,role:t,content:l,toolCalls:n,toolCallId:i,name:s.name}}function v(s){if(s==null)return s;if(Array.isArray(s))return s.map(v);if(typeof s=="object"){if((s.lc===1||s.lc_serializable===true)&&(s.kwargs||s.lc_kwargs)){let t=s.kwargs||s.lc_kwargs;return v(t)}let e={};for(let[t,n]of Object.entries(s))t==="lc"||t==="type"||t==="id"||t.startsWith("lc_")||(e[t]=v(n));return e}return s}function N(s){if(s==null)return "";let e=s;if(typeof s=="string")try{e=JSON.parse(s);}catch{return s}if(typeof e!="object")return String(e);e.lc===1||e.lc_serializable===true||e.type==="constructor"&&Array.isArray(e.id);let n=e.kwargs||e.lc_kwargs||e;return n&&n.content!==void 0?typeof n.content=="string"?n.content:JSON.stringify(n.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(v(e))}var x=z$1.object({onEvent:z$1.custom(s=>typeof s=="function",{message:"onEvent must be a 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 w(s){try{let e=EventSchemas.safeParse(s);return e.success?{success:!0,data:s}:{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 L(s){return w(s).success}function z(s){return s===true||s==="strict"}function V(s){let e=s;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 X(s){let e=s;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 K(s){let e=s;return !!(e.messages&&e.messages.some(t=>t.toolCalls?.length>0))}async function B(s,e,t,n,i,l,c){if(!e)return;let g=`activity-${e}-${t}`,d={status:i,timestamp:Date.now(),...c},o=l?l(d):d;if(!n.currentActivityId||n.currentActivityId!==g)n.currentActivityId=g,n.currentActivityType="AGENT_STEP",n.activityContent=o,s({type:EventType.ACTIVITY_SNAPSHOT,messageId:g,activityType:"AGENT_STEP",content:o,replace:true});else {let m=M(n.activityContent,o);m.length>0&&(n.activityContent=o,s({type:EventType.ACTIVITY_DELTA,messageId:g,activityType:"AGENT_STEP",patch:m}));}}function C(s){let e=x.parse(s),t=o=>{if(z(e.validateEvents)&&!L(o)){let r=w(o).error;if(e.validateEvents==="strict")throw new Error(`Invalid AG-UI event: ${r?.message}`);console.warn("[AG-UI Validation] Invalid event:",o.type,r);}e.onEvent(o);},n,i,l,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(o,m)=>{c=0;let r=m,a=r.config?.configurable||r.configurable;n=a?.threadId||a?.thread_id||a?.checkpoint_id||e.threadIdOverride||r.context?.threadId||r.context?.thread_id||"",i=e.runIdOverride||a?.run_id||r.runId||r.id||r.context?.runId||r.context?.run_id||r.config?.runId||crypto.randomUUID();try{if(t({type:EventType.RUN_STARTED,threadId:n,runId:i,input:v(r.config?.input),timestamp:Date.now()}),e.emitStateSnapshots==="initial"||e.emitStateSnapshots==="all"){let E=e.stateMapper?e.stateMapper(o):v(o);!e.stateMapper&&E&&typeof E=="object"&&delete E.messages,t({type:EventType.STATE_SNAPSHOT,snapshot:E,timestamp:Date.now()});}let h=o;h.messages&&Array.isArray(h.messages)&&t({type:EventType.MESSAGES_SNAPSHOT,messages:h.messages.map(O),timestamp:Date.now()});}catch{}let p=r.config;return p&&(p.metadata={...p.metadata||{},agui_runId:i}),{}},beforeModel:async(o,m)=>{let r=c++,a=A(i,r),p=`model_call_${a}`;l=p;let E=m.config;E&&(E.metadata={...E.metadata||{},agui_messageId:a});try{t({type:EventType.STEP_STARTED,stepName:p,timestamp:Date.now()}),e.emitActivities&&await B(t,i,r,g,"started",e.activityMapper,{stepName:p,modelName:m.config?.model?._modelType||"unknown",inputPreview:V(o)});}catch{}return {}},afterModel:async(o,m)=>{try{if(t({type:EventType.STEP_FINISHED,stepName:l||"",timestamp:Date.now()}),e.emitActivities&&l){let r=c-1;await B(t,i,r,g,"completed",e.activityMapper,{stepName:l,outputType:X(o),hasToolCalls:K(o)});}if(e.emitStateSnapshots!=="none"){let r=v(o),a=e.stateMapper?e.stateMapper(r):r;!e.stateMapper&&a&&typeof a=="object"&&delete a.messages,(a?Object.keys(a).filter(h=>a[h]!==void 0&&a[h]!==null):[]).length>0&&t({type:EventType.STATE_SNAPSHOT,snapshot:a,timestamp:Date.now()});}}catch{}return l=void 0,{}},afterAgent:async(o,m)=>{try{if(e.emitStateSnapshots==="final"||e.emitStateSnapshots==="all"){let a=e.stateMapper?e.stateMapper(o):v(o);!e.stateMapper&&a&&typeof a=="object"&&delete a.messages,t({type:EventType.STATE_SNAPSHOT,snapshot:a,timestamp:Date.now()});}let r=o;if(r.error){let a=r.error,p=a instanceof Error?a.message:String(a);t({type:EventType.RUN_ERROR,message:e.errorDetailLevel==="full"||e.errorDetailLevel==="message"?p:"",code:"AGENT_EXECUTION_ERROR",timestamp:Date.now()});}else t({type:EventType.RUN_FINISHED,threadId:n,runId:i,result:e.resultMapper?e.resultMapper(o):void 0,timestamp:Date.now()});}catch{}return {}}})}function S(s){switch(s.type){case EventType.TEXT_MESSAGE_CHUNK:{let e=s,t=e.messageId||I(),n=[];return e.role&&n.push({type:EventType.TEXT_MESSAGE_START,messageId:t,role:e.role}),e.delta&&n.push({type:EventType.TEXT_MESSAGE_CONTENT,messageId:t,delta:e.delta}),e.role&&e.delta&&n.push({type:EventType.TEXT_MESSAGE_END,messageId:t}),n.length>0?n:[s]}case EventType.TOOL_CALL_CHUNK:{let e=s,t=e.toolCallId||I(),n=[];return e.toolCallName&&n.push({type:EventType.TOOL_CALL_START,toolCallId:t,toolCallName:e.toolCallName,parentMessageId:e.parentMessageId}),e.delta&&n.push({type:EventType.TOOL_CALL_ARGS,toolCallId:t,delta:e.delta}),e.toolCallName&&e.delta&&n.push({type:EventType.TOOL_CALL_END,toolCallId:t,parentMessageId:e.parentMessageId}),n.length>0?n:[s]}default:return [s]}}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;emitCallback;_enabled;_emitTextMessages;_emitToolCalls;_emitThinking;maxUIPayloadSize;chunkLargeResults;constructor(e){super({raiseError:false}),this.emitCallback=e.onEvent,this._enabled=e?.enabled??true,this._emitTextMessages=e?.emitTextMessages??true,this._emitToolCalls=e?.emitToolCalls??true,this._emitThinking=e?.emitThinking??true,this.maxUIPayloadSize=e?.maxUIPayloadSize??50*1024,this.chunkLargeResults=e?.chunkLargeResults??false;}get enabled(){return this._enabled}set enabled(e){this._enabled=e;}get emitTextMessages(){return this._emitTextMessages}set emitTextMessages(e){this._emitTextMessages=e;}get emitToolCalls(){return this._emitToolCalls}set emitToolCalls(e){this._emitToolCalls=e;}get emitThinking(){return this._emitThinking}set emitThinking(e){this._emitThinking=e;}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",n){if(!this.enabled||!this.emitTextMessages)return;let i=S({type:EventType.TEXT_MESSAGE_CHUNK,messageId:e,role:t,delta:n});for(let l of i)this.emitCallback(l);}async emitToolChunk(e,t,n,i){if(!this.enabled||!this.emitToolCalls)return;let l=S({type:EventType.TOOL_CALL_CHUNK,toolCallId:e,toolCallName:t,delta:n,parentMessageId:i});for(let c of l)this.emitCallback(c);}async handleLLMStart(e,t,n,i,l,c,g,d){if(!this.enabled||!this.emitTextMessages)return;let o=g?.agui_runId||g?.run_id||g?.configurable?.run_id||i||n;this.agentRunIds.set(n,o),i&&this.parentToAuthoritativeId.set(i,o);let m=g?.agui_messageId;if(m)this.messageIds.set(n,m),this.latestMessageIds.set(o,m),this.emitCallback({type:EventType.TEXT_MESSAGE_START,messageId:m,role:"assistant",timestamp:Date.now()});else {let r=this.agentTurnTracker.get(o)||0;this.agentTurnTracker.set(o,r+1);let a=A(o,r);this.messageIds.set(n,a),this.latestMessageIds.set(o,a),this.emitCallback({type:EventType.TEXT_MESSAGE_START,messageId:a,role:"assistant",timestamp:Date.now()});}}async handleLLMNewToken(e,t,n,i,l,c){if(!this.enabled)return;let g=this.messageIds.get(n);if(!(!g&&!this.emitThinking))try{let d=c?.chunk?.message?.additional_kwargs?.reasoning_content||c?.chunk?.message?.additional_kwargs?.reasoning;if(d&&this.emitThinking){let m=this.thinkingIds.get(n);if(!m){let a=this.agentRunIds.get(n)||(i?this.parentToAuthoritativeId.get(i):null)||i||n;m=A(a,(this.agentTurnTracker.get(a)||1)+100),this.thinkingIds.set(n,m),this.emitCallback({type:EventType.THINKING_START,timestamp:Date.now()}),this.emitCallback({type:EventType.THINKING_TEXT_MESSAGE_START,messageId:m,timestamp:Date.now()});}let r=typeof d=="string"?d:d.text||JSON.stringify(d);this.emitCallback({type:EventType.THINKING_TEXT_MESSAGE_CONTENT,messageId:m,delta:r,timestamp:Date.now()});}e&&e.length>0&&this.emitTextMessages&&g&&this.emitCallback({type:EventType.TEXT_MESSAGE_CONTENT,messageId:g,delta:e,timestamp:Date.now()});let o=c?.chunk?.message?.tool_call_chunks;if(o&&Array.isArray(o)&&this.emitToolCalls){let m=this.agentRunIds.get(n)||(i?this.parentToAuthoritativeId.get(i):null)||i||n,r=this.pendingToolCalls.get(m)||[];for(let a of o)if(a.id&&a.args){let p=this.accumulatedToolArgs.get(a.id)||"",h=p+a.args;h!==p&&this.accumulatedToolArgs.set(a.id,h),r.includes(a.id)||r.push(a.id);}r.length>0&&this.pendingToolCalls.set(m,r);}}catch{}}async handleLLMEnd(e,t,n,i,l){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 o=this.agentRunIds.get(t)||(n?this.parentToAuthoritativeId.get(n):null)||n||t,m=this.pendingToolCalls.get(o)||[];for(let r of d)r.id&&!m.includes(r.id)&&(m.push(r.id),r.function?.name&&this.toolCallNames.set(r.id,r.function.name),r.function?.arguments&&this.accumulatedToolArgs.set(r.id,r.function.arguments));this.pendingToolCalls.set(o,m);}}}catch{}if(!this.enabled){this.messageIds.delete(t),this.thinkingIds.delete(t);return}c&&this.emitTextMessages&&this.emitCallback({type:EventType.TEXT_MESSAGE_END,messageId:c,timestamp:Date.now()}),g&&(this.emitThinking&&(this.emitCallback({type:EventType.THINKING_TEXT_MESSAGE_END,messageId:g,timestamp:Date.now()}),this.emitCallback({type:EventType.THINKING_END,timestamp:Date.now()})),this.thinkingIds.delete(t)),this.messageIds.delete(t);}async handleLLMError(e,t,n){if(!this.enabled)return;this.messageIds.delete(t),this.thinkingIds.delete(t);let i=this.agentRunIds.get(t)||(n?this.parentToAuthoritativeId.get(n):null)||n||t;this.pendingToolCalls.delete(i),this.agentRunIds.delete(t);}async handleToolStart(e,t,n,i,l,c,g){if(!this.enabled||!this.emitToolCalls)return;let d=n,o=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 a=this.toolCallNames.get(d);a&&a!=="unknown_tool"&&(o=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&&(o=a.name));}catch{}if(d===n&&this.accumulatedToolArgs.size>0&&t){for(let[a,p]of this.accumulatedToolArgs)if(t.includes(p)||p.includes(t)){d=a;let h=this.toolCallNames.get(a);h&&h!=="unknown_tool"&&(o=h);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&&(o=a.name));}catch{}if(d===n&&this.accumulatedToolArgs.size>0&&t){for(let[a,p]of this.accumulatedToolArgs)if(t.includes(p)||p.includes(t)){d=a;break}}}catch{}this.toolCallInfo.set(n,{id:d,name:o});let m=(i?this.parentToAuthoritativeId.get(i):null)||i||"",r=this.latestMessageIds.get(m);try{this.emitCallback({type:EventType.TOOL_CALL_START,toolCallId:d,toolCallName:o,parentMessageId:r,timestamp:Date.now()});let a=this.accumulatedToolArgs.get(d);a&&(this.emitCallback({type:EventType.TOOL_CALL_ARGS,toolCallId:d,delta:a,timestamp:Date.now()}),this.accumulatedToolArgs.delete(d));}catch{}}async handleToolEnd(e,t,n){if(!this.enabled||!this.emitToolCalls)return;let i=this.toolCallInfo.get(t);this.toolCallInfo.delete(t),i?.id&&this.toolCallNames.delete(i.id);let l=(n?this.parentToAuthoritativeId.get(n):null)||n||"",c=this.latestMessageIds.get(l);try{let d=i?.id??t;if(e&&typeof e=="object"){let o=e.kwargs||e.lc_kwargs;o?.tool_call_id&&(d=o.tool_call_id);}this.emitCallback({type:EventType.TOOL_CALL_END,toolCallId:d,timestamp:Date.now()}),this.emitToolResultWithPolicy(e,d,c,i?.name);}catch{}}async handleToolError(e,t,n){if(!this.enabled||!this.emitToolCalls)return;let i=this.toolCallInfo.get(t);this.toolCallInfo.delete(t),i?.id&&this.accumulatedToolArgs.delete(i.id);let l=(n?this.parentToAuthoritativeId.get(n):null)||n||"";this.latestMessageIds.get(l);try{this.emitCallback({type:EventType.TOOL_CALL_END,toolCallId:i?.id??t,timestamp:Date.now()});}catch{}}chunkString(e,t){let n=[],i=e;for(;i.length>0;){if(new Blob([i]).size<=t){n.push(i);break}let l=t,c=i.lastIndexOf(" ",t),g=i.lastIndexOf(`
|
|
2
|
-
`,t),
|
|
1
|
+
import {createMiddleware,createAgent}from'langchain';import {z}from'zod';import*as M from'fast-json-patch';import {HumanMessage,AIMessage,ToolMessage,SystemMessage,ChatMessage}from'@langchain/core/messages';import {EventType,EventSchemas}from'@ag-ui/core';import {BaseCallbackHandler}from'@langchain/core/callbacks/base';function I(){return crypto.randomUUID()}function A(s,e){if(!s)throw new Error("baseId is required for deterministic ID generation");let t=`${s}-${e}`,n=0;for(let l=0;l<t.length;l++){let d=t.charCodeAt(l);n=(n<<5)-n+d,n=n&n;}let i=Math.abs(n).toString(16).padStart(8,"0");return `${s}-${i}`}function k(s,e){return M.compare(s,e)}function O(s){let e=s.id||I(),t="assistant",n,i,l=typeof s.content=="string"?s.content:JSON.stringify(s.content);if(s instanceof HumanMessage||s.role==="user"||s._getType?.()==="human")t="user";else if(s instanceof AIMessage||s.role==="assistant"||s._getType?.()==="ai"){t="assistant";let d=s.tool_calls||s.kwargs?.tool_calls;d&&d.length>0&&(n=d.map(g=>({id:g.id,type:"function",function:{name:g.name,arguments:typeof g.args=="string"?g.args:JSON.stringify(g.args)}})));}else s instanceof ToolMessage||s.role==="tool"||s._getType?.()==="tool"?(t="tool",i=s.tool_call_id||s.kwargs?.tool_call_id):s instanceof SystemMessage||s.role==="system"||s._getType?.()==="system"?t="system":(s instanceof ChatMessage||s.role)&&(t=s.role);return {id:e,role:t,content:l,toolCalls:n,toolCallId:i,name:s.name}}function v(s){if(s==null)return s;if(Array.isArray(s))return s.map(v);if(typeof s=="object"){if((s.lc===1||s.lc_serializable===true)&&(s.kwargs||s.lc_kwargs)){let t=s.kwargs||s.lc_kwargs;return v(t)}let e={};for(let[t,n]of Object.entries(s))t==="lc"||t==="type"||t==="id"||t.startsWith("lc_")||(e[t]=v(n));return e}return s}function N(s){if(s==null)return "";let e=s;if(typeof s=="string")try{e=JSON.parse(s);}catch{return s}if(typeof e!="object")return String(e);e.lc===1||e.lc_serializable===true||e.type==="constructor"&&Array.isArray(e.id);let n=e.kwargs||e.lc_kwargs||e;return n&&n.content!==void 0?typeof n.content=="string"?n.content:JSON.stringify(n.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(v(e))}var x=z.object({onEvent:z.custom(s=>typeof s=="function",{message:"onEvent must be a function"}),emitToolResults:z.boolean().default(true),emitStateSnapshots:z.enum(["initial","final","all","none"]).default("initial"),emitActivities:z.boolean().default(false),maxUIPayloadSize:z.number().positive().default(50*1024),chunkLargeResults:z.boolean().default(false),threadIdOverride:z.string().optional(),runIdOverride:z.string().optional(),errorDetailLevel:z.enum(["full","message","code","none"]).default("message"),stateMapper:z.custom().optional(),resultMapper:z.custom().optional(),activityMapper:z.custom().optional(),validateEvents:z.union([z.boolean(),z.literal("strict")]).default(false)});function w(s){try{let e=EventSchemas.safeParse(s);return e.success?{success:!0,data:s}:{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 L(s){return w(s).success}function j(s){return s===true||s==="strict"}function V(s){let e=s;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 X(s){let e=s;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 K(s){let e=s;return !!(e.messages&&e.messages.some(t=>t.toolCalls?.length>0))}async function B(s,e,t,n,i,l,d){if(!e)return;let g=`activity-${e}-${t}`,c={status:i,timestamp:Date.now(),...d},r=l?l(c):c;if(!n.currentActivityId||n.currentActivityId!==g)n.currentActivityId=g,n.currentActivityType="AGENT_STEP",n.activityContent=r,s({type:EventType.ACTIVITY_SNAPSHOT,messageId:g,activityType:"AGENT_STEP",content:r,replace:true});else {let m=k(n.activityContent,r);m.length>0&&(n.activityContent=r,s({type:EventType.ACTIVITY_DELTA,messageId:g,activityType:"AGENT_STEP",patch:m}));}}function C(s){let e=x.parse(s),t=r=>{if(j(e.validateEvents)&&!L(r)){let o=w(r).error;if(e.validateEvents==="strict")throw new Error(`Invalid AG-UI event: ${o?.message}`);console.warn("[AG-UI Validation] Invalid event:",r.type,o);}e.onEvent(r);},n,i,l,d=0,g={currentActivityId:void 0,currentActivityType:"AGENT_STEP",activityContent:{}};return createMiddleware({name:"ag-ui-lifecycle",contextSchema:z.object({run_id:z.string().optional(),runId:z.string().optional(),thread_id:z.string().optional(),threadId:z.string().optional()}),beforeAgent:async(r,m)=>{d=0;let o=m,a=o.config?.configurable||o.configurable;n=a?.threadId||a?.thread_id||a?.checkpoint_id||e.threadIdOverride||o.context?.threadId||o.context?.thread_id||"",i=e.runIdOverride||a?.run_id||o.runId||o.id||o.context?.runId||o.context?.run_id||o.config?.runId||crypto.randomUUID();try{if(t({type:EventType.RUN_STARTED,threadId:n,runId:i,input:v(o.config?.input),timestamp:Date.now()}),e.emitStateSnapshots==="initial"||e.emitStateSnapshots==="all"){let E=e.stateMapper?e.stateMapper(r):v(r);!e.stateMapper&&E&&typeof E=="object"&&delete E.messages,t({type:EventType.STATE_SNAPSHOT,snapshot:E,timestamp:Date.now()});}let h=r;h.messages&&Array.isArray(h.messages)&&t({type:EventType.MESSAGES_SNAPSHOT,messages:h.messages.map(O),timestamp:Date.now()});}catch{}let p=o.config;return p&&(p.metadata={...p.metadata||{},agui_runId:i}),{}},beforeModel:async(r,m)=>{let o=d++,a=A(i,o),p=`model_call_${a}`;l=p;let E=m.config;E&&(E.metadata={...E.metadata||{},agui_messageId:a});try{t({type:EventType.STEP_STARTED,stepName:p,timestamp:Date.now()}),e.emitActivities&&await B(t,i,o,g,"started",e.activityMapper,{stepName:p,modelName:m.config?.model?._modelType||"unknown",inputPreview:V(r)});}catch{}return {}},afterModel:async(r,m)=>{try{if(t({type:EventType.STEP_FINISHED,stepName:l||"",timestamp:Date.now()}),e.emitActivities&&l){let o=d-1;await B(t,i,o,g,"completed",e.activityMapper,{stepName:l,outputType:X(r),hasToolCalls:K(r)});}if(e.emitStateSnapshots!=="none"){let o=v(r),a=e.stateMapper?e.stateMapper(o):o;!e.stateMapper&&a&&typeof a=="object"&&delete a.messages,(a?Object.keys(a).filter(h=>a[h]!==void 0&&a[h]!==null):[]).length>0&&t({type:EventType.STATE_SNAPSHOT,snapshot:a,timestamp:Date.now()});}}catch{}return l=void 0,{}},afterAgent:async(r,m)=>{try{if(e.emitStateSnapshots==="final"||e.emitStateSnapshots==="all"){let a=e.stateMapper?e.stateMapper(r):v(r);!e.stateMapper&&a&&typeof a=="object"&&delete a.messages,t({type:EventType.STATE_SNAPSHOT,snapshot:a,timestamp:Date.now()});}let o=r;if(o.error){let a=o.error,p=a instanceof Error?a.message:String(a);t({type:EventType.RUN_ERROR,message:e.errorDetailLevel==="full"||e.errorDetailLevel==="message"?p:"",code:"AGENT_EXECUTION_ERROR",timestamp:Date.now()});}else t({type:EventType.RUN_FINISHED,threadId:n,runId:i,result:e.resultMapper?e.resultMapper(r):void 0,timestamp:Date.now()});}catch{}return {}}})}function S(s){switch(s.type){case EventType.TEXT_MESSAGE_CHUNK:{let e=s,t=e.messageId||I(),n=[];return e.role&&n.push({type:EventType.TEXT_MESSAGE_START,messageId:t,role:e.role}),e.delta&&n.push({type:EventType.TEXT_MESSAGE_CONTENT,messageId:t,delta:e.delta}),e.role&&e.delta&&n.push({type:EventType.TEXT_MESSAGE_END,messageId:t}),n.length>0?n:[s]}case EventType.TOOL_CALL_CHUNK:{let e=s,t=e.toolCallId||I(),n=[];return e.toolCallName&&n.push({type:EventType.TOOL_CALL_START,toolCallId:t,toolCallName:e.toolCallName,parentMessageId:e.parentMessageId}),e.delta&&n.push({type:EventType.TOOL_CALL_ARGS,toolCallId:t,delta:e.delta}),e.toolCallName&&e.delta&&n.push({type:EventType.TOOL_CALL_END,toolCallId:t,parentMessageId:e.parentMessageId}),n.length>0?n:[s]}default:return [s]}}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;emitCallback;_enabled;_emitTextMessages;_emitToolCalls;_emitThinking;maxUIPayloadSize;chunkLargeResults;constructor(e){super({raiseError:false}),this.emitCallback=e.onEvent,this._enabled=e?.enabled??true,this._emitTextMessages=e?.emitTextMessages??true,this._emitToolCalls=e?.emitToolCalls??true,this._emitThinking=e?.emitThinking??true,this.maxUIPayloadSize=e?.maxUIPayloadSize??50*1024,this.chunkLargeResults=e?.chunkLargeResults??false;}get enabled(){return this._enabled}set enabled(e){this._enabled=e;}get emitTextMessages(){return this._emitTextMessages}set emitTextMessages(e){this._emitTextMessages=e;}get emitToolCalls(){return this._emitToolCalls}set emitToolCalls(e){this._emitToolCalls=e;}get emitThinking(){return this._emitThinking}set emitThinking(e){this._emitThinking=e;}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",n){if(!this.enabled||!this.emitTextMessages)return;let i=S({type:EventType.TEXT_MESSAGE_CHUNK,messageId:e,role:t,delta:n});for(let l of i)this.emitCallback(l);}async emitToolChunk(e,t,n,i){if(!this.enabled||!this.emitToolCalls)return;let l=S({type:EventType.TOOL_CALL_CHUNK,toolCallId:e,toolCallName:t,delta:n,parentMessageId:i});for(let d of l)this.emitCallback(d);}async handleLLMStart(e,t,n,i,l,d,g,c){if(!this.enabled||!this.emitTextMessages)return;let r=g?.agui_runId||g?.run_id||g?.configurable?.run_id||i||n;this.agentRunIds.set(n,r),i&&this.parentToAuthoritativeId.set(i,r);let m=g?.agui_messageId;if(m)this.messageIds.set(n,m),this.latestMessageIds.set(r,m),this.emitCallback({type:EventType.TEXT_MESSAGE_START,messageId:m,role:"assistant",timestamp:Date.now()});else {let o=this.agentTurnTracker.get(r)||0;this.agentTurnTracker.set(r,o+1);let a=A(r,o);this.messageIds.set(n,a),this.latestMessageIds.set(r,a),this.emitCallback({type:EventType.TEXT_MESSAGE_START,messageId:a,role:"assistant",timestamp:Date.now()});}}async handleLLMNewToken(e,t,n,i,l,d){if(!this.enabled)return;let g=this.messageIds.get(n);if(!(!g&&!this.emitThinking))try{let c=d?.chunk?.message?.additional_kwargs?.reasoning_content||d?.chunk?.message?.additional_kwargs?.reasoning;if(c&&this.emitThinking){let m=this.thinkingIds.get(n);if(!m){let a=this.agentRunIds.get(n)||(i?this.parentToAuthoritativeId.get(i):null)||i||n;m=A(a,(this.agentTurnTracker.get(a)||1)+100),this.thinkingIds.set(n,m),this.emitCallback({type:EventType.THINKING_START,timestamp:Date.now()}),this.emitCallback({type:EventType.THINKING_TEXT_MESSAGE_START,messageId:m,timestamp:Date.now()});}let o=typeof c=="string"?c:c.text||JSON.stringify(c);this.emitCallback({type:EventType.THINKING_TEXT_MESSAGE_CONTENT,messageId:m,delta:o,timestamp:Date.now()});}e&&e.length>0&&this.emitTextMessages&&g&&this.emitCallback({type:EventType.TEXT_MESSAGE_CONTENT,messageId:g,delta:e,timestamp:Date.now()});let r=d?.chunk?.message?.tool_call_chunks;if(r&&Array.isArray(r)&&this.emitToolCalls){let m=this.agentRunIds.get(n)||(i?this.parentToAuthoritativeId.get(i):null)||i||n,o=this.pendingToolCalls.get(m)||[];for(let a of r)if(a.id&&a.args){let p=this.accumulatedToolArgs.get(a.id)||"",h=p+a.args;h!==p&&this.accumulatedToolArgs.set(a.id,h),o.includes(a.id)||o.push(a.id);}o.length>0&&this.pendingToolCalls.set(m,o);}}catch{}}async handleLLMEnd(e,t,n,i,l){let d=this.messageIds.get(t),g=this.thinkingIds.get(t);try{if(e&&typeof e=="object"){let c=e.tool_calls||e.kwargs?.tool_calls;if(Array.isArray(c)){let r=this.agentRunIds.get(t)||(n?this.parentToAuthoritativeId.get(n):null)||n||t,m=this.pendingToolCalls.get(r)||[];for(let o of c)o.id&&!m.includes(o.id)&&(m.push(o.id),o.function?.name&&this.toolCallNames.set(o.id,o.function.name),o.function?.arguments&&this.accumulatedToolArgs.set(o.id,o.function.arguments));this.pendingToolCalls.set(r,m);}}}catch{}if(!this.enabled){this.messageIds.delete(t),this.thinkingIds.delete(t);return}d&&this.emitTextMessages&&this.emitCallback({type:EventType.TEXT_MESSAGE_END,messageId:d,timestamp:Date.now()}),g&&(this.emitThinking&&(this.emitCallback({type:EventType.THINKING_TEXT_MESSAGE_END,messageId:g,timestamp:Date.now()}),this.emitCallback({type:EventType.THINKING_END,timestamp:Date.now()})),this.thinkingIds.delete(t)),this.messageIds.delete(t);}async handleLLMError(e,t,n){if(!this.enabled)return;this.messageIds.delete(t),this.thinkingIds.delete(t);let i=this.agentRunIds.get(t)||(n?this.parentToAuthoritativeId.get(n):null)||n||t;this.pendingToolCalls.delete(i),this.agentRunIds.delete(t);}async handleToolStart(e,t,n,i,l,d,g){if(!this.enabled||!this.emitToolCalls)return;let c=n,r=g||e.kwargs?.name||e.name||e.func?.name||e.getName?.()||e.toolName||e._name||"unknown_tool";try{if(d?.tool_call_id&&typeof d.tool_call_id=="string"){c=d.tool_call_id;let a=this.toolCallNames.get(c);a&&a!=="unknown_tool"&&(r=a);}else if(t)try{let a=typeof t=="string"?JSON.parse(t):t;a&&typeof a=="object"&&(a.tool_call_id?c=a.tool_call_id:a.id&&(c=a.id),a.name&&(r=a.name));}catch{}if(c===n&&this.accumulatedToolArgs.size>0&&t){for(let[a,p]of this.accumulatedToolArgs)if(t.includes(p)||p.includes(t)){c=a;let h=this.toolCallNames.get(a);h&&h!=="unknown_tool"&&(r=h);break}}}catch{}try{if(d?.tool_call_id&&typeof d.tool_call_id=="string")c=d.tool_call_id;else if(t)try{let a=typeof t=="string"?JSON.parse(t):t;a&&typeof a=="object"&&(a.tool_call_id?c=a.tool_call_id:a.id&&(c=a.id),a.name&&(r=a.name));}catch{}if(c===n&&this.accumulatedToolArgs.size>0&&t){for(let[a,p]of this.accumulatedToolArgs)if(t.includes(p)||p.includes(t)){c=a;break}}}catch{}this.toolCallInfo.set(n,{id:c,name:r});let m=(i?this.parentToAuthoritativeId.get(i):null)||i||"",o=this.latestMessageIds.get(m);try{this.emitCallback({type:EventType.TOOL_CALL_START,toolCallId:c,toolCallName:r,parentMessageId:o,timestamp:Date.now()});let a=this.accumulatedToolArgs.get(c);a&&(this.emitCallback({type:EventType.TOOL_CALL_ARGS,toolCallId:c,delta:a,timestamp:Date.now()}),this.accumulatedToolArgs.delete(c));}catch{}}async handleToolEnd(e,t,n){if(!this.enabled||!this.emitToolCalls)return;let i=this.toolCallInfo.get(t);this.toolCallInfo.delete(t),i?.id&&this.toolCallNames.delete(i.id);let l=(n?this.parentToAuthoritativeId.get(n):null)||n||"",d=this.latestMessageIds.get(l);try{let g=i?.id??t;this.emitCallback({type:EventType.TOOL_CALL_END,toolCallId:g,timestamp:Date.now()}),this.emitToolResultWithPolicy(e,g,d,i?.name);}catch{}}async handleToolError(e,t,n){if(!this.enabled||!this.emitToolCalls)return;let i=this.toolCallInfo.get(t);this.toolCallInfo.delete(t),i?.id&&this.accumulatedToolArgs.delete(i.id);let l=(n?this.parentToAuthoritativeId.get(n):null)||n||"";this.latestMessageIds.get(l);try{this.emitCallback({type:EventType.TOOL_CALL_END,toolCallId:i?.id??t,timestamp:Date.now()});}catch{}}chunkString(e,t){let n=[],i=e;for(;i.length>0;){if(new Blob([i]).size<=t){n.push(i);break}let l=t,d=i.lastIndexOf(" ",t),g=i.lastIndexOf(`
|
|
2
|
+
`,t),c=Math.max(d,g);if(c>t*.5)l=c;else {for(;l>0&&i.charCodeAt(l-1)>127;)l--;l===0&&(l=t);}n.push(i.substring(0,l)),i=i.substring(l).trim();}return n}emitToolResultWithPolicy(e,t,n,i){let l=N(e),d=I(),g=new Blob([l]).size;if(g<=this.maxUIPayloadSize){this.emitCallback({type:EventType.TOOL_CALL_RESULT,messageId:d,toolCallId:t,content:l,role:"tool",timestamp:Date.now()});return}if(this.chunkLargeResults){let o=this.chunkString(l,this.maxUIPayloadSize);for(let a=0;a<o.length;a++)this.emitCallback({type:EventType.CUSTOM,name:"LARGE_RESULT_CHUNK",value:{toolCallId:t,chunk:o[a],index:a,total:o.length}});return}let c=` [Truncated: ${g-this.maxUIPayloadSize+50} bytes]`,r=this.maxUIPayloadSize-c.length,m=l.substring(0,Math.max(0,r))+c;this.emitCallback({type:EventType.TOOL_CALL_RESULT,messageId:d,toolCallId:t,content:m,role:"tool",timestamp:Date.now()});}};function F(s){let e=C({onEvent:s.onEvent,emitToolResults:s.middlewareOptions?.emitToolResults??true,emitStateSnapshots:s.middlewareOptions?.emitStateSnapshots??"initial",emitActivities:s.middlewareOptions?.emitActivities??false,maxUIPayloadSize:s.middlewareOptions?.maxUIPayloadSize??51200,chunkLargeResults:s.middlewareOptions?.chunkLargeResults??false,threadIdOverride:s.middlewareOptions?.threadIdOverride,runIdOverride:s.middlewareOptions?.runIdOverride,errorDetailLevel:s.middlewareOptions?.errorDetailLevel??"message",stateMapper:s.middlewareOptions?.stateMapper,resultMapper:s.middlewareOptions?.resultMapper,activityMapper:s.middlewareOptions?.activityMapper,validateEvents:s.middlewareOptions?.validateEvents??false}),t=createAgent({model:s.model,tools:s.tools,middleware:[e]});return t&&typeof t.withListeners=="function"?t.withListeners({onError:n=>{try{let i=n.config?.configurable?.threadId,l=n.config?.configurable?.runId;s.onEvent({type:EventType.RUN_ERROR,message:typeof n.error=="string"?n.error:n.error?.message||"Agent execution failed",code:"AGENT_EXECUTION_ERROR",timestamp:Date.now()});}catch{}}}):t}export{b as AGUICallbackHandler,F as createAGUIAgent,C as createAGUIMiddleware};//# sourceMappingURL=index.js.map
|
|
3
3
|
//# 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"],"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","isValidationEnabled","validateEvents","getInputPreview","state","stateAny","lastMessage","getOutputType","hasToolCalls","m","emitActivityUpdate","emitCallback","currentRunId","stepIndex","activityTracker","status","activityMapper","details","activityId","baseContent","finalContent","EventType","patch","createAGUIMiddleware","options","validated","emitEvent","error","threadId","runId","currentStepName","modelTurnIndex","createMiddleware","runtime","runtimeAny","configurable","snapshot","configAny","turnIndex","messageId","stepName","_runtime","filteredState","k","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"],"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, Role } from \"@ag-ui/core\";\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: 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 { BaseEvent } from '@ag-ui/core';\n\n/**\n * Middleware options schema with Zod validation.\n */\nexport const AGUIMiddlewareOptionsSchema = z.object({\n // Callback function (required)\n onEvent: z.custom<((event: BaseEvent) => void)>(\n (val) => typeof val === \"function\",\n {\n message: \"onEvent must be a 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 { BaseEvent } from '../events';\n\n/**\n * Result of event validation.\n */\nexport interface ValidationResult<T = BaseEvent> {\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 BaseEvent,\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 BaseEvent {\n return validateEvent(event).success;\n}\n\n/**\n * Create a validating callback wrapper.\n * Wraps any callback function to add validation before emission.\n * \n * @param callback - The callback function to wrap\n * @param options - Validation options\n * @returns Wrapped callback with validation\n */\nexport function createValidatingCallback<T extends { emit: (event: BaseEvent) => void }>(\n callback: 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: BaseEvent, error: ValidationResult['error']) => void;\n } = {}\n): T {\n const { throwOnInvalid = false, onValidationError } = options;\n \n return {\n ...callback,\n emit: (event: BaseEvent) => {\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 callback.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 { validateEvent, isValidEvent } from \"../utils/validation\";\nimport { type BaseEvent, EventType } from \"@ag-ui/core\";\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 emitCallback: (event: BaseEvent) => void,\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 emitCallback({\n type: EventType.ACTIVITY_SNAPSHOT,\n messageId: activityId,\n activityType: \"AGENT_STEP\",\n content: finalContent,\n replace: true,\n } as BaseEvent);\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 emitCallback({\n type: EventType.ACTIVITY_DELTA,\n messageId: activityId,\n activityType: \"AGENT_STEP\",\n patch,\n } as BaseEvent);\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 // Create emit function with optional validation\n // In \"strict\" mode, throw on invalid events; in true mode, log warnings\n const emitEvent = (event: BaseEvent) => {\n if (isValidationEnabled(validated.validateEvents)) {\n const isValid = isValidEvent(event);\n if (!isValid) {\n const error = validateEvent(event).error;\n if (validated.validateEvents === \"strict\") {\n throw new Error(`Invalid AG-UI event: ${error?.message}`);\n } else {\n console.warn('[AG-UI Validation] Invalid event:', (event as any).type, error);\n }\n }\n }\n validated.onEvent(event);\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 emitEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId,\n input: cleanLangChainData(runtimeAny.config?.input),\n timestamp: Date.now(),\n } as BaseEvent);\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 emitEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n \n const stateAny = state as any;\n if (stateAny.messages && Array.isArray(stateAny.messages)) {\n emitEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: stateAny.messages.map(mapLangChainMessageToAGUI),\n timestamp: Date.now(),\n } as BaseEvent);\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 emitEvent({\n type: EventType.STEP_STARTED,\n stepName,\n timestamp: Date.now(),\n // REMOVED: runId, threadId\n } as BaseEvent);\n\n // Emit ACTIVITY_SNAPSHOT for new activity if activities are enabled\n if (validated.emitActivities) {\n await emitActivityUpdate(\n emitEvent,\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 emitEvent({\n type: EventType.STEP_FINISHED,\n stepName: currentStepName || \"\",\n timestamp: Date.now(),\n // REMOVED: runId, threadId\n } as BaseEvent);\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 emitEvent,\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 emitEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n timestamp: Date.now(),\n } as BaseEvent);\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 emitEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n timestamp: Date.now(),\n } as BaseEvent);\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 emitEvent({\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 } as BaseEvent);\n } else {\n emitEvent({\n type: EventType.RUN_FINISHED,\n threadId: threadId!,\n runId: runId!,\n result: validated.resultMapper ? validated.resultMapper(state) : undefined,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n } catch {\n // Fail-safe\n }\n\n return {};\n },\n });\n}\n","import { EventType, type BaseEvent } 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: BaseEvent): BaseEvent[] {\n switch (event.type) {\n case EventType.TEXT_MESSAGE_CHUNK: {\n const chunkEvent = event as any;\n const messageId = chunkEvent.messageId || generateId();\n const results: BaseEvent[] = [];\n\n if (chunkEvent.role) {\n results.push({\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n role: chunkEvent.role,\n } as unknown as BaseEvent);\n }\n\n if (chunkEvent.delta) {\n results.push({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n delta: chunkEvent.delta,\n } as unknown as BaseEvent);\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 unknown as BaseEvent);\n }\n\n return results.length > 0 ? results : [event];\n }\n\n case EventType.TOOL_CALL_CHUNK: {\n const chunkEvent = event as any;\n const toolCallId = chunkEvent.toolCallId || generateId();\n const results: BaseEvent[] = [];\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 unknown as BaseEvent);\n }\n\n if (chunkEvent.delta) {\n results.push({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: chunkEvent.delta,\n } as unknown as BaseEvent);\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 unknown as BaseEvent);\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 BaseEvent, EventType } from \"@ag-ui/core\";\n\n/**\n * Configuration options for the callback handler.\n */\nexport interface AGUICallbackHandlerOptions {\n /** Callback function for emitting AG-UI events */\n onEvent: (event: BaseEvent) => void;\n /** Master toggle - when false, no events are emitted (default: true) */\n enabled?: boolean;\n /** Emit TEXT_MESSAGE events: START, CONTENT, END (default: true) */\n emitTextMessages?: boolean;\n /** Emit TOOL_CALL events: START, ARGS, END, RESULT (default: true) */\n emitToolCalls?: boolean;\n /** Emit THINKING events: START, TEXT_MESSAGE_*, END (default: true) */\n emitThinking?: boolean;\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 emitCallback: (event: BaseEvent) => void;\n\n private _enabled: boolean;\n private _emitTextMessages: boolean;\n private _emitToolCalls: boolean;\n private _emitThinking: boolean;\n\n private maxUIPayloadSize: number;\n private chunkLargeResults: boolean;\n\n constructor(options: AGUICallbackHandlerOptions) {\n super({ raiseError: false });\n this.emitCallback = options.onEvent;\n this._enabled = options?.enabled ?? true;\n this._emitTextMessages = options?.emitTextMessages ?? true;\n this._emitToolCalls = options?.emitToolCalls ?? true;\n this._emitThinking = options?.emitThinking ?? true;\n this.maxUIPayloadSize = options?.maxUIPayloadSize ?? 50 * 1024;\n this.chunkLargeResults = options?.chunkLargeResults ?? false;\n }\n\n // ==================== Public Accessors for Runtime Toggle ====================\n\n /** Master toggle - when false, no events are emitted */\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n /** Control TEXT_MESSAGE event emission */\n get emitTextMessages(): boolean {\n return this._emitTextMessages;\n }\n\n set emitTextMessages(value: boolean) {\n this._emitTextMessages = value;\n }\n\n /** Control TOOL_CALL event emission */\n get emitToolCalls(): boolean {\n return this._emitToolCalls;\n }\n\n set emitToolCalls(value: boolean) {\n this._emitToolCalls = value;\n }\n\n /** Control THINKING event emission */\n get emitThinking(): boolean {\n return this._emitThinking;\n }\n\n set emitThinking(value: boolean) {\n this._emitThinking = value;\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 if (!this.enabled || !this.emitTextMessages) return;\n\n const events = expandEvent({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n role,\n delta,\n } as BaseEvent);\n \n for (const event of events) {\n this.emitCallback(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 if (!this.enabled || !this.emitToolCalls) return;\n\n const events = expandEvent({\n type: EventType.TOOL_CALL_CHUNK,\n toolCallId,\n toolCallName,\n delta,\n parentMessageId,\n } as BaseEvent);\n \n for (const event of events) {\n this.emitCallback(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 if (!this.enabled || !this.emitTextMessages) return;\n\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.emitCallback({\n type: EventType.TEXT_MESSAGE_START,\n messageId: middlewareMessageId,\n role: \"assistant\",\n timestamp: Date.now(),\n } as BaseEvent);\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.emitCallback({\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n role: \"assistant\",\n timestamp: Date.now(),\n } as BaseEvent);\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 if (!this.enabled) return;\n\n const messageId = this.messageIds.get(runId);\n if (!messageId && !this.emitThinking) 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 && this.emitThinking) {\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.emitCallback({\n type: EventType.THINKING_START,\n timestamp: Date.now(),\n } as BaseEvent);\n this.emitCallback({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n messageId: thinkingId,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n\n const delta = typeof reasoningContent === 'string'\n ? reasoningContent\n : ((reasoningContent as any).text || JSON.stringify(reasoningContent));\n\n this.emitCallback({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n messageId: thinkingId,\n delta,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n\n // Emit TEXT_MESSAGE_CONTENT for streaming tokens\n if (token && token.length > 0 && this.emitTextMessages && messageId) {\n this.emitCallback({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n delta: token,\n timestamp: Date.now(),\n } as BaseEvent);\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) && this.emitToolCalls) {\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 // Collect tool calls from output for subsequent tool callbacks\n // We collect even when disabled, so that tool callbacks have the data they need\n // (tool callbacks will check their own emit flags before emitting)\n try {\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 } catch {\n // Fail-safe\n }\n\n // Skip event emission if disabled\n if (!this.enabled) {\n this.messageIds.delete(runId);\n this.thinkingIds.delete(runId);\n return;\n }\n\n // Emit TEXT_MESSAGE_END\n if (messageId && this.emitTextMessages) {\n this.emitCallback({\n type: EventType.TEXT_MESSAGE_END,\n messageId,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n\n // Emit THINKING_END events\n if (thinkingId) {\n if (this.emitThinking) {\n this.emitCallback({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n messageId: thinkingId,\n timestamp: Date.now(),\n } as BaseEvent);\n this.emitCallback({\n type: EventType.THINKING_END,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n // Always clean up - even if emitThinking was toggled off\n this.thinkingIds.delete(runId);\n }\n\n // Cleanup\n this.messageIds.delete(runId);\n }\n\n override async handleLLMError(\n _error: Error,\n runId: string,\n _parentRunId?: string\n ): Promise<void> {\n if (!this.enabled) return;\n\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 if (!this.enabled || !this.emitToolCalls) return;\n\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.emitCallback({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n parentMessageId: messageId,\n timestamp: Date.now(),\n } as BaseEvent);\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.emitCallback({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: accumulatedArgs,\n timestamp: Date.now(),\n } as BaseEvent);\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 if (!this.enabled || !this.emitToolCalls) return;\n\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.emitCallback({\n type: EventType.TOOL_CALL_END,\n toolCallId: finalToolCallId,\n timestamp: Date.now(),\n } as BaseEvent);\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 if (!this.enabled || !this.emitToolCalls) return;\n\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.emitCallback({\n type: EventType.TOOL_CALL_END,\n toolCallId: toolInfo?.id ?? runId,\n timestamp: Date.now(),\n } as BaseEvent);\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.emitCallback({\n type: EventType.TOOL_CALL_RESULT,\n messageId: resultMessageId,\n toolCallId,\n content,\n role: \"tool\",\n timestamp: Date.now(),\n } as BaseEvent);\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.emitCallback({\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 } as BaseEvent);\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.emitCallback({\n type: EventType.TOOL_CALL_RESULT,\n messageId: resultMessageId,\n toolCallId,\n content: truncatedContent,\n role: \"tool\",\n timestamp: Date.now(),\n } as BaseEvent);\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 { AGUIMiddlewareOptions } from \"./middleware/types\";\nimport { EventType, type BaseEvent } 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 /** Callback function for AG-UI events */\n onEvent: (event: BaseEvent) => void;\n /** Optional middleware configuration */\n middlewareOptions?: Partial<AGUIMiddlewareOptions>;\n /** Optional callback handler configuration */\n callbackOptions?: Omit<AGUICallbackHandlerOptions, 'onEvent'>;\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 callback\n const middleware = createAGUIMiddleware({\n onEvent: config.onEvent,\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.onEvent({\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 } as BaseEvent);\n } catch {\n // Fail-safe\n }\n },\n });\n }\n\n return agent;\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"],"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","isValidationEnabled","validateEvents","getInputPreview","state","stateAny","lastMessage","getOutputType","hasToolCalls","m","emitActivityUpdate","emitCallback","currentRunId","stepIndex","activityTracker","status","activityMapper","details","activityId","baseContent","finalContent","EventType","patch","createAGUIMiddleware","options","validated","emitEvent","error","threadId","runId","currentStepName","modelTurnIndex","createMiddleware","runtime","runtimeAny","configurable","snapshot","configAny","turnIndex","messageId","stepName","_runtime","filteredState","k","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","maxChunkSize","chunks","remaining","splitPoint","spaceIndex","newlineIndex","boundaryIndex","resultMessageId","contentSize","truncationMessage","availableSpace","truncatedContent","createAGUIAgent","config","middleware","agent","createAgent","run"],"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, Role } from \"@ag-ui/core\";\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: 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 { BaseEvent } from '@ag-ui/core';\n\n/**\n * Middleware options schema with Zod validation.\n */\nexport const AGUIMiddlewareOptionsSchema = z.object({\n // Callback function (required)\n onEvent: z.custom<((event: BaseEvent) => void)>(\n (val) => typeof val === \"function\",\n {\n message: \"onEvent must be a 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 { BaseEvent } from '../events';\n\n/**\n * Result of event validation.\n */\nexport interface ValidationResult<T = BaseEvent> {\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 BaseEvent,\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 BaseEvent {\n return validateEvent(event).success;\n}\n\n/**\n * Create a validating callback wrapper.\n * Wraps any callback function to add validation before emission.\n * \n * @param callback - The callback function to wrap\n * @param options - Validation options\n * @returns Wrapped callback with validation\n */\nexport function createValidatingCallback<T extends { emit: (event: BaseEvent) => void }>(\n callback: 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: BaseEvent, error: ValidationResult['error']) => void;\n } = {}\n): T {\n const { throwOnInvalid = false, onValidationError } = options;\n \n return {\n ...callback,\n emit: (event: BaseEvent) => {\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 callback.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 { validateEvent, isValidEvent } from \"../utils/validation\";\nimport { type BaseEvent, EventType } from \"@ag-ui/core\";\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 emitCallback: (event: BaseEvent) => void,\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 emitCallback({\n type: EventType.ACTIVITY_SNAPSHOT,\n messageId: activityId,\n activityType: \"AGENT_STEP\",\n content: finalContent,\n replace: true,\n } as BaseEvent);\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 emitCallback({\n type: EventType.ACTIVITY_DELTA,\n messageId: activityId,\n activityType: \"AGENT_STEP\",\n patch,\n } as BaseEvent);\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 // Create emit function with optional validation\n // In \"strict\" mode, throw on invalid events; in true mode, log warnings\n const emitEvent = (event: BaseEvent) => {\n if (isValidationEnabled(validated.validateEvents)) {\n const isValid = isValidEvent(event);\n if (!isValid) {\n const error = validateEvent(event).error;\n if (validated.validateEvents === \"strict\") {\n throw new Error(`Invalid AG-UI event: ${error?.message}`);\n } else {\n console.warn('[AG-UI Validation] Invalid event:', (event as any).type, error);\n }\n }\n }\n validated.onEvent(event);\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 emitEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId,\n input: cleanLangChainData(runtimeAny.config?.input),\n timestamp: Date.now(),\n } as BaseEvent);\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 emitEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n \n const stateAny = state as any;\n if (stateAny.messages && Array.isArray(stateAny.messages)) {\n emitEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: stateAny.messages.map(mapLangChainMessageToAGUI),\n timestamp: Date.now(),\n } as BaseEvent);\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 emitEvent({\n type: EventType.STEP_STARTED,\n stepName,\n timestamp: Date.now(),\n // REMOVED: runId, threadId\n } as BaseEvent);\n\n // Emit ACTIVITY_SNAPSHOT for new activity if activities are enabled\n if (validated.emitActivities) {\n await emitActivityUpdate(\n emitEvent,\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 emitEvent({\n type: EventType.STEP_FINISHED,\n stepName: currentStepName || \"\",\n timestamp: Date.now(),\n // REMOVED: runId, threadId\n } as BaseEvent);\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 emitEvent,\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 emitEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n timestamp: Date.now(),\n } as BaseEvent);\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 emitEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n timestamp: Date.now(),\n } as BaseEvent);\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 emitEvent({\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 } as BaseEvent);\n } else {\n emitEvent({\n type: EventType.RUN_FINISHED,\n threadId: threadId!,\n runId: runId!,\n result: validated.resultMapper ? validated.resultMapper(state) : undefined,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n } catch {\n // Fail-safe\n }\n\n return {};\n },\n });\n}\n","import { EventType, type BaseEvent } 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: BaseEvent): BaseEvent[] {\n switch (event.type) {\n case EventType.TEXT_MESSAGE_CHUNK: {\n const chunkEvent = event as any;\n const messageId = chunkEvent.messageId || generateId();\n const results: BaseEvent[] = [];\n\n if (chunkEvent.role) {\n results.push({\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n role: chunkEvent.role,\n } as unknown as BaseEvent);\n }\n\n if (chunkEvent.delta) {\n results.push({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n delta: chunkEvent.delta,\n } as unknown as BaseEvent);\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 unknown as BaseEvent);\n }\n\n return results.length > 0 ? results : [event];\n }\n\n case EventType.TOOL_CALL_CHUNK: {\n const chunkEvent = event as any;\n const toolCallId = chunkEvent.toolCallId || generateId();\n const results: BaseEvent[] = [];\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 unknown as BaseEvent);\n }\n\n if (chunkEvent.delta) {\n results.push({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: chunkEvent.delta,\n } as unknown as BaseEvent);\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 unknown as BaseEvent);\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 BaseEvent, EventType } from \"@ag-ui/core\";\n\n/**\n * Configuration options for the callback handler.\n */\nexport interface AGUICallbackHandlerOptions {\n /** Callback function for emitting AG-UI events */\n onEvent: (event: BaseEvent) => void;\n /** Master toggle - when false, no events are emitted (default: true) */\n enabled?: boolean;\n /** Emit TEXT_MESSAGE events: START, CONTENT, END (default: true) */\n emitTextMessages?: boolean;\n /** Emit TOOL_CALL events: START, ARGS, END, RESULT (default: true) */\n emitToolCalls?: boolean;\n /** Emit THINKING events: START, TEXT_MESSAGE_*, END (default: true) */\n emitThinking?: boolean;\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 emitCallback: (event: BaseEvent) => void;\n\n private _enabled: boolean;\n private _emitTextMessages: boolean;\n private _emitToolCalls: boolean;\n private _emitThinking: boolean;\n\n private maxUIPayloadSize: number;\n private chunkLargeResults: boolean;\n\n constructor(options: AGUICallbackHandlerOptions) {\n super({ raiseError: false });\n this.emitCallback = options.onEvent;\n this._enabled = options?.enabled ?? true;\n this._emitTextMessages = options?.emitTextMessages ?? true;\n this._emitToolCalls = options?.emitToolCalls ?? true;\n this._emitThinking = options?.emitThinking ?? true;\n this.maxUIPayloadSize = options?.maxUIPayloadSize ?? 50 * 1024;\n this.chunkLargeResults = options?.chunkLargeResults ?? false;\n }\n\n // ==================== Public Accessors for Runtime Toggle ====================\n\n /** Master toggle - when false, no events are emitted */\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n /** Control TEXT_MESSAGE event emission */\n get emitTextMessages(): boolean {\n return this._emitTextMessages;\n }\n\n set emitTextMessages(value: boolean) {\n this._emitTextMessages = value;\n }\n\n /** Control TOOL_CALL event emission */\n get emitToolCalls(): boolean {\n return this._emitToolCalls;\n }\n\n set emitToolCalls(value: boolean) {\n this._emitToolCalls = value;\n }\n\n /** Control THINKING event emission */\n get emitThinking(): boolean {\n return this._emitThinking;\n }\n\n set emitThinking(value: boolean) {\n this._emitThinking = value;\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 if (!this.enabled || !this.emitTextMessages) return;\n\n const events = expandEvent({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n role,\n delta,\n } as BaseEvent);\n \n for (const event of events) {\n this.emitCallback(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 if (!this.enabled || !this.emitToolCalls) return;\n\n const events = expandEvent({\n type: EventType.TOOL_CALL_CHUNK,\n toolCallId,\n toolCallName,\n delta,\n parentMessageId,\n } as BaseEvent);\n \n for (const event of events) {\n this.emitCallback(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 if (!this.enabled || !this.emitTextMessages) return;\n\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.emitCallback({\n type: EventType.TEXT_MESSAGE_START,\n messageId: middlewareMessageId,\n role: \"assistant\",\n timestamp: Date.now(),\n } as BaseEvent);\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.emitCallback({\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n role: \"assistant\",\n timestamp: Date.now(),\n } as BaseEvent);\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 if (!this.enabled) return;\n\n const messageId = this.messageIds.get(runId);\n if (!messageId && !this.emitThinking) 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 && this.emitThinking) {\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.emitCallback({\n type: EventType.THINKING_START,\n timestamp: Date.now(),\n } as BaseEvent);\n this.emitCallback({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n messageId: thinkingId,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n\n const delta = typeof reasoningContent === 'string'\n ? reasoningContent\n : ((reasoningContent as any).text || JSON.stringify(reasoningContent));\n\n this.emitCallback({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n messageId: thinkingId,\n delta,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n\n // Emit TEXT_MESSAGE_CONTENT for streaming tokens\n if (token && token.length > 0 && this.emitTextMessages && messageId) {\n this.emitCallback({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n delta: token,\n timestamp: Date.now(),\n } as BaseEvent);\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) && this.emitToolCalls) {\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 // Collect tool calls from output for subsequent tool callbacks\n // We collect even when disabled, so that tool callbacks have the data they need\n // (tool callbacks will check their own emit flags before emitting)\n try {\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 } catch {\n // Fail-safe\n }\n\n // Skip event emission if disabled\n if (!this.enabled) {\n this.messageIds.delete(runId);\n this.thinkingIds.delete(runId);\n return;\n }\n\n // Emit TEXT_MESSAGE_END\n if (messageId && this.emitTextMessages) {\n this.emitCallback({\n type: EventType.TEXT_MESSAGE_END,\n messageId,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n\n // Emit THINKING_END events\n if (thinkingId) {\n if (this.emitThinking) {\n this.emitCallback({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n messageId: thinkingId,\n timestamp: Date.now(),\n } as BaseEvent);\n this.emitCallback({\n type: EventType.THINKING_END,\n timestamp: Date.now(),\n } as BaseEvent);\n }\n // Always clean up - even if emitThinking was toggled off\n this.thinkingIds.delete(runId);\n }\n\n // Cleanup\n this.messageIds.delete(runId);\n }\n\n override async handleLLMError(\n _error: Error,\n runId: string,\n _parentRunId?: string\n ): Promise<void> {\n if (!this.enabled) return;\n\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 if (!this.enabled || !this.emitToolCalls) return;\n\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.emitCallback({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n parentMessageId: messageId,\n timestamp: Date.now(),\n } as BaseEvent);\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.emitCallback({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: accumulatedArgs,\n timestamp: Date.now(),\n } as BaseEvent);\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 if (!this.enabled || !this.emitToolCalls) return;\n\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 toolCallId = toolInfo?.id ?? runId;\n\n this.emitCallback({\n type: EventType.TOOL_CALL_END,\n toolCallId,\n timestamp: Date.now(),\n } as BaseEvent);\n\n this.emitToolResultWithPolicy(output, toolCallId, 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 if (!this.enabled || !this.emitToolCalls) return;\n\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.emitCallback({\n type: EventType.TOOL_CALL_END,\n toolCallId: toolInfo?.id ?? runId,\n timestamp: Date.now(),\n } as BaseEvent);\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.emitCallback({\n type: EventType.TOOL_CALL_RESULT,\n messageId: resultMessageId,\n toolCallId,\n content,\n role: \"tool\",\n timestamp: Date.now(),\n } as BaseEvent);\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.emitCallback({\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 } as BaseEvent);\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.emitCallback({\n type: EventType.TOOL_CALL_RESULT,\n messageId: resultMessageId,\n toolCallId,\n content: truncatedContent,\n role: \"tool\",\n timestamp: Date.now(),\n } as BaseEvent);\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 { AGUIMiddlewareOptions } from \"./middleware/types\";\nimport { EventType, type BaseEvent } 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 /** Callback function for AG-UI events */\n onEvent: (event: BaseEvent) => void;\n /** Optional middleware configuration */\n middlewareOptions?: Partial<AGUIMiddlewareOptions>;\n /** Optional callback handler configuration */\n callbackOptions?: Omit<AGUICallbackHandlerOptions, 'onEvent'>;\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 callback\n const middleware = createAGUIMiddleware({\n onEvent: config.onEvent,\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.onEvent({\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 } as BaseEvent);\n } catch {\n // Fail-safe\n }\n },\n });\n }\n\n return agent;\n}\n"]}
|