@ag-ui/langgraph 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, ThinkingTextMessageStartEvent, ThinkingTextMessageContentEvent, ThinkingTextMessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ThinkingStartEvent, ThinkingEndEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, AgentConfig, AbstractAgent, RunAgentInput, HttpAgent } from '@ag-ui/client';
2
+ import * as _langchain_langgraph_sdk_dist_types_stream from '@langchain/langgraph-sdk/dist/types.stream';
2
3
  import * as _langchain_langgraph_sdk from '@langchain/langgraph-sdk';
3
- import { Message, Client, Config, Assistant, StreamMode, Thread } from '@langchain/langgraph-sdk';
4
+ import { AssistantGraph, Message, Client, Config, Assistant, StreamMode, ThreadState, Thread } from '@langchain/langgraph-sdk';
4
5
  import { Subscriber, Observable } from 'rxjs';
5
6
  import { MessageType } from '@langchain/core/messages';
6
7
  import { RunsStreamPayload } from '@langchain/langgraph-sdk/dist/types';
@@ -40,6 +41,7 @@ interface RunMetadata {
40
41
  exitingNode?: boolean;
41
42
  manuallyEmittedState?: State | null;
42
43
  threadId?: string;
44
+ graphInfo?: AssistantGraph;
43
45
  }
44
46
  type MessagesInProgressRecord = Record<string, MessageInProgress | null>;
45
47
  interface ToolCall {
@@ -85,6 +87,9 @@ type RunAgentExtendedInput<TStreamMode extends StreamMode | StreamMode[] = Strea
85
87
  threadMetadata?: Record<string, any>;
86
88
  };
87
89
  };
90
+ interface RegenerateInput extends RunAgentExtendedInput {
91
+ messageCheckpoint: Message;
92
+ }
88
93
  interface LangGraphAgentConfig extends AgentConfig {
89
94
  client?: Client;
90
95
  deploymentUrl: string;
@@ -104,11 +109,26 @@ declare class LangGraphAgent extends AbstractAgent {
104
109
  thinkingProcess: null | ThinkingInProgress;
105
110
  activeRun?: RunMetadata;
106
111
  subscriber: Subscriber<ProcessedEvents>;
112
+ constantSchemaKeys: string[];
107
113
  constructor(config: LangGraphAgentConfig);
108
114
  dispatchEvent(event: ProcessedEvents): boolean;
109
115
  run(input: RunAgentInput): Observable<ProcessedEvents>;
110
- handleStreamEvents(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>): Promise<void>;
111
- handleSingleEvent(event: any, state: State): void;
116
+ runAgentStream(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>): Promise<void>;
117
+ prepareRegenerateStream(input: RegenerateInput, streamMode: StreamMode | StreamMode[]): Promise<void | {
118
+ streamResponse: _langchain_langgraph_sdk_dist_types_stream.TypedAsyncGenerator<"messages" | "values" | "updates" | "events" | "debug" | "tasks" | "checkpoints" | "custom" | "messages-tuple" | StreamMode[], false, _langchain_langgraph_sdk.DefaultValues, _langchain_langgraph_sdk.DefaultValues, unknown>;
119
+ state: ThreadState<_langchain_langgraph_sdk.DefaultValues>;
120
+ streamMode: StreamMode | StreamMode[];
121
+ }>;
122
+ prepareStream(input: RunAgentExtendedInput, streamMode: StreamMode | StreamMode[]): Promise<void | {
123
+ streamResponse: _langchain_langgraph_sdk_dist_types_stream.TypedAsyncGenerator<"messages" | "values" | "updates" | "events" | "debug" | "tasks" | "checkpoints" | "custom" | "messages-tuple" | StreamMode[], false, _langchain_langgraph_sdk.DefaultValues, _langchain_langgraph_sdk.DefaultValues, unknown>;
124
+ state: ThreadState<_langchain_langgraph_sdk.DefaultValues>;
125
+ streamMode: StreamMode | StreamMode[];
126
+ } | {
127
+ streamResponse: _langchain_langgraph_sdk_dist_types_stream.TypedAsyncGenerator<"messages" | "values" | "updates" | "events" | "debug" | "tasks" | "checkpoints" | "custom" | "messages-tuple" | StreamMode[], false, _langchain_langgraph_sdk.DefaultValues, _langchain_langgraph_sdk.DefaultValues, unknown>;
128
+ state: ThreadState<State>;
129
+ }>;
130
+ handleStreamEvents(stream: Awaited<ReturnType<typeof this.prepareStream> | ReturnType<typeof this.prepareRegenerateStream>>, threadId: string, subscriber: Subscriber<ProcessedEvents>, input: RunAgentExtendedInput, streamMode: StreamMode | StreamMode[]): Promise<void>;
131
+ handleSingleEvent(event: any): void;
112
132
  handleThinkingEvent(reasoningData: LangGraphReasoning): void;
113
133
  getStateSnapshot(state: State): State;
114
134
  getOrCreateThread(threadId: string, threadMetadata?: Record<string, any>): Promise<Thread>;
@@ -126,6 +146,10 @@ declare class LangGraphAgent extends AbstractAgent {
126
146
  langGraphDefaultMergeState(state: State, messages: Message[], tools: any): State;
127
147
  startStep(nodeName: string): void;
128
148
  endStep(): void;
149
+ getCheckpointByMessage(messageId: string, threadId: string, checkpoint?: null | {
150
+ checkpoint_id?: null | string;
151
+ checkpoint_ns: string;
152
+ }): Promise<ThreadState>;
129
153
  }
130
154
 
131
155
  declare class LangGraphHttpAgent extends HttpAgent {
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, ThinkingTextMessageStartEvent, ThinkingTextMessageContentEvent, ThinkingTextMessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ThinkingStartEvent, ThinkingEndEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, AgentConfig, AbstractAgent, RunAgentInput, HttpAgent } from '@ag-ui/client';
2
+ import * as _langchain_langgraph_sdk_dist_types_stream from '@langchain/langgraph-sdk/dist/types.stream';
2
3
  import * as _langchain_langgraph_sdk from '@langchain/langgraph-sdk';
3
- import { Message, Client, Config, Assistant, StreamMode, Thread } from '@langchain/langgraph-sdk';
4
+ import { AssistantGraph, Message, Client, Config, Assistant, StreamMode, ThreadState, Thread } from '@langchain/langgraph-sdk';
4
5
  import { Subscriber, Observable } from 'rxjs';
5
6
  import { MessageType } from '@langchain/core/messages';
6
7
  import { RunsStreamPayload } from '@langchain/langgraph-sdk/dist/types';
@@ -40,6 +41,7 @@ interface RunMetadata {
40
41
  exitingNode?: boolean;
41
42
  manuallyEmittedState?: State | null;
42
43
  threadId?: string;
44
+ graphInfo?: AssistantGraph;
43
45
  }
44
46
  type MessagesInProgressRecord = Record<string, MessageInProgress | null>;
45
47
  interface ToolCall {
@@ -85,6 +87,9 @@ type RunAgentExtendedInput<TStreamMode extends StreamMode | StreamMode[] = Strea
85
87
  threadMetadata?: Record<string, any>;
86
88
  };
87
89
  };
90
+ interface RegenerateInput extends RunAgentExtendedInput {
91
+ messageCheckpoint: Message;
92
+ }
88
93
  interface LangGraphAgentConfig extends AgentConfig {
89
94
  client?: Client;
90
95
  deploymentUrl: string;
@@ -104,11 +109,26 @@ declare class LangGraphAgent extends AbstractAgent {
104
109
  thinkingProcess: null | ThinkingInProgress;
105
110
  activeRun?: RunMetadata;
106
111
  subscriber: Subscriber<ProcessedEvents>;
112
+ constantSchemaKeys: string[];
107
113
  constructor(config: LangGraphAgentConfig);
108
114
  dispatchEvent(event: ProcessedEvents): boolean;
109
115
  run(input: RunAgentInput): Observable<ProcessedEvents>;
110
- handleStreamEvents(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>): Promise<void>;
111
- handleSingleEvent(event: any, state: State): void;
116
+ runAgentStream(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>): Promise<void>;
117
+ prepareRegenerateStream(input: RegenerateInput, streamMode: StreamMode | StreamMode[]): Promise<void | {
118
+ streamResponse: _langchain_langgraph_sdk_dist_types_stream.TypedAsyncGenerator<"messages" | "values" | "updates" | "events" | "debug" | "tasks" | "checkpoints" | "custom" | "messages-tuple" | StreamMode[], false, _langchain_langgraph_sdk.DefaultValues, _langchain_langgraph_sdk.DefaultValues, unknown>;
119
+ state: ThreadState<_langchain_langgraph_sdk.DefaultValues>;
120
+ streamMode: StreamMode | StreamMode[];
121
+ }>;
122
+ prepareStream(input: RunAgentExtendedInput, streamMode: StreamMode | StreamMode[]): Promise<void | {
123
+ streamResponse: _langchain_langgraph_sdk_dist_types_stream.TypedAsyncGenerator<"messages" | "values" | "updates" | "events" | "debug" | "tasks" | "checkpoints" | "custom" | "messages-tuple" | StreamMode[], false, _langchain_langgraph_sdk.DefaultValues, _langchain_langgraph_sdk.DefaultValues, unknown>;
124
+ state: ThreadState<_langchain_langgraph_sdk.DefaultValues>;
125
+ streamMode: StreamMode | StreamMode[];
126
+ } | {
127
+ streamResponse: _langchain_langgraph_sdk_dist_types_stream.TypedAsyncGenerator<"messages" | "values" | "updates" | "events" | "debug" | "tasks" | "checkpoints" | "custom" | "messages-tuple" | StreamMode[], false, _langchain_langgraph_sdk.DefaultValues, _langchain_langgraph_sdk.DefaultValues, unknown>;
128
+ state: ThreadState<State>;
129
+ }>;
130
+ handleStreamEvents(stream: Awaited<ReturnType<typeof this.prepareStream> | ReturnType<typeof this.prepareRegenerateStream>>, threadId: string, subscriber: Subscriber<ProcessedEvents>, input: RunAgentExtendedInput, streamMode: StreamMode | StreamMode[]): Promise<void>;
131
+ handleSingleEvent(event: any): void;
112
132
  handleThinkingEvent(reasoningData: LangGraphReasoning): void;
113
133
  getStateSnapshot(state: State): State;
114
134
  getOrCreateThread(threadId: string, threadMetadata?: Record<string, any>): Promise<Thread>;
@@ -126,6 +146,10 @@ declare class LangGraphAgent extends AbstractAgent {
126
146
  langGraphDefaultMergeState(state: State, messages: Message[], tools: any): State;
127
147
  startStep(nodeName: string): void;
128
148
  endStep(): void;
149
+ getCheckpointByMessage(messageId: string, threadId: string, checkpoint?: null | {
150
+ checkpoint_id?: null | string;
151
+ checkpoint_ns: string;
152
+ }): Promise<ThreadState>;
129
153
  }
130
154
 
131
155
  declare class LangGraphHttpAgent extends HttpAgent {
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- "use strict";var k=Object.defineProperty,Mt=Object.defineProperties,Rt=Object.getOwnPropertyDescriptor,It=Object.getOwnPropertyDescriptors,Ct=Object.getOwnPropertyNames,nt=Object.getOwnPropertySymbols;var it=Object.prototype.hasOwnProperty,Nt=Object.prototype.propertyIsEnumerable;var st=(a,t)=>(t=Symbol[a])?t:Symbol.for("Symbol."+a);var at=(a,t,e)=>t in a?k(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e,p=(a,t)=>{for(var e in t||(t={}))it.call(t,e)&&at(a,e,t[e]);if(nt)for(var e of nt(t))Nt.call(t,e)&&at(a,e,t[e]);return a},f=(a,t)=>Mt(a,It(t));var xt=(a,t)=>{for(var e in t)k(a,e,{get:t[e],enumerable:!0})},At=(a,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ct(t))!it.call(a,n)&&n!==e&&k(a,n,{get:()=>t[n],enumerable:!(s=Rt(t,n))||s.enumerable});return a};var kt=a=>At(k({},"__esModule",{value:!0}),a);var rt=(a,t,e)=>(t=a[st("asyncIterator")])?t.call(a):(a=a[st("iterator")](),t={},e=(s,n)=>(n=a[s])&&(t[s]=r=>new Promise((c,h,l)=>(r=n.call(a,r),l=r.done,Promise.resolve(r.value).then(E=>c({value:E,done:l}),h)))),e("next"),e("return"),t);var Pt={};xt(Pt,{CustomEventNames:()=>lt,LangGraphAgent:()=>K,LangGraphEventTypes:()=>ot,LangGraphHttpAgent:()=>U});module.exports=kt(Pt);var St=require("@ag-ui/client");var ut=require("rxjs"),pt=require("@langchain/langgraph-sdk"),mt=require("crypto"),Et=require("@langchain/core/messages");var ot=(d=>(d.OnChainStart="on_chain_start",d.OnChainStream="on_chain_stream",d.OnChainEnd="on_chain_end",d.OnChatModelStart="on_chat_model_start",d.OnChatModelStream="on_chat_model_stream",d.OnChatModelEnd="on_chat_model_end",d.OnToolStart="on_tool_start",d.OnToolEnd="on_tool_end",d.OnCustomEvent="on_custom_event",d.OnInterrupt="on_interrupt",d))(ot||{}),lt=(n=>(n.ManuallyEmitMessage="manually_emit_message",n.ManuallyEmitToolCall="manually_emit_tool_call",n.ManuallyEmitState="manually_emit_state",n.Exit="exit",n))(lt||{});var i=require("@ag-ui/client");var O=["tools"];function w(a,t){return Object.fromEntries(Object.entries(a).filter(([e])=>t.includes(e)))}function dt({mode:a,state:t,schemaKeys:e}){let s=a==="start"?t:null;return s&&(e!=null&&e.input)&&(s=w(s,[...O,...e.input])),s}function ht(a){return a.map(t=>{var e;switch(t.type){case"human":return{id:t.id,role:"user",content:P(M(t.content))};case"ai":let s=M(t.content);return{id:t.id,role:"assistant",content:s?P(s):"",toolCalls:(e=t.tool_calls)==null?void 0:e.map(n=>({id:n.id,type:"function",function:{name:n.name,arguments:JSON.stringify(n.args)}}))};case"system":return{id:t.id,role:"system",content:P(M(t.content))};case"tool":return{id:t.id,role:"tool",content:P(M(t.content)),toolCallId:t.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function gt(a){return a.map((t,e)=>{var s,n;switch(t.role){case"user":return{id:t.id,role:t.role,content:t.content,type:"human"};case"assistant":return{id:t.id,type:"ai",role:t.role,content:(s=t.content)!=null?s:"",tool_calls:((n=t.toolCalls)!=null?n:[]).map(r=>({id:r.id,name:r.function.name,args:JSON.parse(r.function.arguments),type:"tool_call"}))};case"system":return{id:t.id,role:t.role,content:t.content,type:"system"};case"tool":return{content:t.content,role:t.role,type:t.role,tool_call_id:t.toolCallId,id:t.id};default:throw console.error(`Message role ${t.role} is not implemented`),new Error("message role is not supported.")}})}function P(a){return typeof a=="string"?a:JSON.stringify(a)}function ct(a){var e,s,n,r,c;let t=(e=a.chunk)==null?void 0:e.content;if(t&&Array.isArray(t)&&t.length&&t[0])return t[0].thinking?{text:t[0].thinking,type:"text",index:t[0].index}:null;if((r=(n=(s=a.chunk.additional_kwargs)==null?void 0:s.reasoning)==null?void 0:n.summary)!=null&&r[0]){let h=(c=a.chunk.additional_kwargs)==null?void 0:c.reasoning.summary[0];return!h||!h.text?null:{type:"text",text:h.text,index:h.index}}return null}function M(a){var t;if(!a)return null;if(typeof a=="string")return a;if(Array.isArray(a)&&a.length){let e=(t=a.find(s=>s.type==="text"))==null?void 0:t.text;return e!=null?e:null}return null}var K=class extends i.AbstractAgent{constructor(t){var e,s;super(t),this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(s=t==null?void 0:t.client)!=null?s:new pt.Client({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:p({},(e=t.propertyHeaders)!=null?e:{})})}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return this.activeRun={id:t.runId,threadId:t.threadId},new ut.Observable(e=>(this.handleStreamEvents(t,e),()=>{}))}async handleStreamEvents(t,e){var X,F,j,B,$,Y,V,W,q,z,Q,Z,tt;let{threadId:s,state:n,messages:r,tools:c,context:h,forwardedProps:l}=t;this.subscriber=e;let E=!1;this.activeRun.manuallyEmittedState=null;let d=l==null?void 0:l.nodeName;this.activeRun.nodeName=d,this.activeRun.nodeName==="__end__"&&(this.activeRun.nodeName=void 0);let o=s!=null?s:(0,mt.randomUUID)();this.assistant||(this.assistant=await this.getAssistant());let v=await this.getOrCreateThread(o,l==null?void 0:l.threadMetadata);this.activeRun.threadId=v.thread_id;let g=(X=await this.client.threads.getState(v.thread_id))!=null?X:{values:{}},L=g.values,G=gt(r);n.messages=L.messages,n=this.langGraphDefaultMergeState(n,G,c);let N=await this.client.assistants.getGraph(this.assistant.assistant_id),x=o&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(x==="continue"&&!((F=l==null?void 0:l.command)!=null&&F.resume)){let u=N.edges.find(y=>y.target===this.activeRun.nodeName);await this.client.threads.updateState(o,{values:n,asNode:u==null?void 0:u.source})}this.activeRun.schemaKeys=await this.getSchemaKeys();let R=dt({mode:x,state:n,schemaKeys:this.activeRun.schemaKeys}),I,C=[this.assistantConfig,l==null?void 0:l.config].filter(Boolean);C.length&&(I=await this.mergeConfigs({configs:C,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let A=f(p({},l),{streamMode:(j=l==null?void 0:l.streamMode)!=null?j:["events","values","updates"],input:R,config:I}),S=(Y=($=(B=g.tasks)==null?void 0:B[0])==null?void 0:$.interrupts)!=null?Y:[];if(S!=null&&S.length&&!((V=l==null?void 0:l.command)!=null&&V.resume))return this.dispatchEvent({type:i.EventType.RUN_STARTED,threadId:o,runId:t.runId}),S.forEach(u=>{this.dispatchEvent({type:i.EventType.CUSTOM,name:"on_interrupt",value:typeof u.value=="string"?u.value:JSON.stringify(u.value),rawEvent:u})}),this.dispatchEvent({type:i.EventType.RUN_FINISHED,threadId:o,runId:t.runId}),e.complete();let vt=this.client.runs.stream(o,this.assistant.assistant_id,A);this.activeRun.prevNodeName=null;let J={},b=n;try{this.dispatchEvent({type:i.EventType.RUN_STARTED,threadId:o,runId:this.activeRun.id});try{for(var ye=rt(vt),_e,Te,Me;_e=!(Te=await ye.next()).done;_e=!1){let m=Te.value;if(!A.streamMode.includes(m.event))continue;let H=m;if(m.event==="error"){this.dispatchEvent({type:i.EventType.RUN_ERROR,message:m.data.message,rawEvent:m});break}if(m.event==="updates")continue;if(m.event==="values"){J=H.data;continue}let _=H.data,T=_.metadata.langgraph_node,et=_.event,_t=_.metadata;if(this.activeRun.id=_t.run_id,T&&T!==this.activeRun.nodeName&&(this.activeRun.nodeName&&this.activeRun.nodeName!==d&&this.endStep(),this.startStep(T)),E=E||et==="on_custom_event"&&_.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===T&&et==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),N.nodes.some(Tt=>Tt.id===T)&&(this.activeRun.nodeName=T),b=(W=this.activeRun.manuallyEmittedState)!=null?W:J,!this.activeRun.nodeName)continue;(JSON.stringify(b)!==JSON.stringify(n)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(n=b,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:i.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(n),rawEvent:H})),this.dispatchEvent({type:i.EventType.RAW,event:_}),this.handleSingleEvent(_,n)}}catch(Te){Me=[Te]}finally{try{_e&&(Te=ye.return)&&await Te.call(ye)}finally{if(Me)throw Me[0]}}n=await this.client.threads.getState(o);let u=n.tasks,y=(z=(q=u==null?void 0:u[0])==null?void 0:q.interrupts)!=null?z:[],ft=n.next.length===0,yt=(Q=n.metadata.writes)!=null?Q:{},D=this.activeRun.nodeName;return y!=null&&y.length||(D=ft?"__end__":(Z=n.next[0])!=null?Z:Object.keys(yt)[0]),y.forEach(m=>{this.dispatchEvent({type:i.EventType.CUSTOM,name:"on_interrupt",value:typeof m.value=="string"?m.value:JSON.stringify(m.value),rawEvent:m})}),this.activeRun.nodeName!=D&&(this.endStep(),this.startStep(D)),this.endStep(),this.dispatchEvent({type:i.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(n.values)}),this.dispatchEvent({type:i.EventType.MESSAGES_SNAPSHOT,messages:ht((tt=n.values.messages)!=null?tt:[])}),this.dispatchEvent({type:i.EventType.RUN_FINISHED,threadId:o,runId:this.activeRun.id}),this.activeRun=void 0,e.complete()}catch(u){return e.error(u)}}handleSingleEvent(t,e){var s,n,r,c,h,l;switch(t.event){case"on_chat_model_stream":let E=(s=t.metadata["emit-messages"])!=null?s:!0,d=(n=t.metadata["emit-tool-calls"])!=null?n:!0;if(t.data.chunk.response_metadata.finish_reason)return;let o=this.getMessageInProgress(this.activeRun.id),v=!!(o!=null&&o.id),g=(r=t.data.chunk.tool_call_chunks)==null?void 0:r[0],L=(c=t.metadata.predict_state)==null?void 0:c.some(S=>S.tool===(g==null?void 0:g.name)),G=!v&&(g==null?void 0:g.name),N=v&&(o==null?void 0:o.toolCallId)&&(g==null?void 0:g.args),x=v&&(o==null?void 0:o.toolCallId)&&!g,R=ct(t.data),I=M(t.data.chunk.content),C=!!(!g&&I),A=v&&!(o!=null&&o.toolCallId)&&!C;if(R){this.handleThinkingEvent(R);break}if(!R&&this.thinkingProcess&&(this.dispatchEvent({type:i.EventType.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:i.EventType.THINKING_END}),this.thinkingProcess=null),L&&this.dispatchEvent({type:i.EventType.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),x){this.dispatchEvent({type:i.EventType.TOOL_CALL_END,toolCallId:o==null?void 0:o.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(A){this.dispatchEvent({type:i.EventType.TEXT_MESSAGE_END,messageId:o.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(G&&d){this.dispatchEvent({type:i.EventType.TOOL_CALL_START,toolCallId:g.id,toolCallName:g.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:g.id,toolCallName:g.name});break}if(N&&d){this.dispatchEvent({type:i.EventType.TOOL_CALL_ARGS,toolCallId:o==null?void 0:o.toolCallId,delta:g.args,rawEvent:t});break}if(C&&E){o||(this.dispatchEvent({type:i.EventType.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.chunk.id,rawEvent:t}),this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:null,toolCallName:null}),o=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:i.EventType.TEXT_MESSAGE_CONTENT,messageId:o.id,delta:I,rawEvent:t});break}break;case"on_chat_model_end":if((h=this.getMessageInProgress(this.activeRun.id))!=null&&h.toolCallId){this.dispatchEvent({type:i.EventType.TOOL_CALL_END,toolCallId:this.getMessageInProgress(this.activeRun.id).toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if((l=this.getMessageInProgress(this.activeRun.id))!=null&&l.id){this.dispatchEvent({type:i.EventType.TEXT_MESSAGE_END,messageId:this.getMessageInProgress(this.activeRun.id).id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}break;case"on_custom_event":if(t.name==="manually_emit_message"){this.dispatchEvent({type:i.EventType.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:i.EventType.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:i.EventType.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:i.EventType.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:i.EventType.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:i.EventType.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:i.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(e),rawEvent:t})),this.dispatchEvent({type:i.EventType.CUSTOM,name:t.name,value:t.data,rawEvent:t});break}}handleThinkingEvent(t){var s;if(!t||!t.type||!t.text)return;let e=t.index;(s=this.thinkingProcess)!=null&&s.index&&this.thinkingProcess.index!==e&&(this.thinkingProcess.type&&this.dispatchEvent({type:i.EventType.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:i.EventType.THINKING_END}),this.thinkingProcess=null),this.thinkingProcess||(this.dispatchEvent({type:i.EventType.THINKING_START}),this.thinkingProcess={index:e}),this.thinkingProcess.type!==t.type&&(this.dispatchEvent({type:i.EventType.THINKING_TEXT_MESSAGE_START}),this.thinkingProcess.type=t.type),this.thinkingProcess.type&&this.dispatchEvent({type:i.EventType.THINKING_TEXT_MESSAGE_CONTENT,delta:t.text})}getStateSnapshot(t){let e=this.activeRun.schemaKeys;return e!=null&&e.output&&(t=w(t,[...O,...e.output])),t}async getOrCreateThread(t,e){let s;try{try{s=await this.getThread(t)}catch(n){s=await this.createThread({threadId:t,metadata:e})}}catch(n){throw new Error(`Failed to create thread: ${n.message}`)}return s}async getThread(t){return this.client.threads.get(t)}async createThread(t){return this.client.threads.create(t)}async mergeConfigs({configs:t,assistant:e,schemaKeys:s}){return t.reduce((n,r)=>{var o;let c=n.configurable;r.configurable&&(c=s!=null&&s.config?w(r==null?void 0:r.configurable,[...O,...(o=s==null?void 0:s.config)!=null?o:[]]):r==null?void 0:r.configurable);let h=f(p(p({},n),r),{configurable:c}),l=n.recursion_limit==null&&r.recursion_limit===25,E=JSON.stringify(h)!==JSON.stringify(n),d=l&&JSON.stringify(f(p({},h),{recursion_limit:null}))===JSON.stringify(f(p({},n),{recursion_limit:null}));return E&&!d?p(p({},n),h):n},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=f(p({},this.messagesInProcess),{[t]:p(p({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(s=>s.graph_id===this.graphId);if(!e)throw console.error(`
1
+ "use strict";var J=Object.defineProperty,ut=Object.defineProperties,pt=Object.getOwnPropertyDescriptor,mt=Object.getOwnPropertyDescriptors,Et=Object.getOwnPropertyNames,B=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,et=Object.prototype.propertyIsEnumerable;var Z=(a,s)=>(s=Symbol[a])?s:Symbol.for("Symbol."+a);var tt=(a,s,t)=>s in a?J(a,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[s]=t,m=(a,s)=>{for(var t in s||(s={}))j.call(s,t)&&tt(a,t,s[t]);if(B)for(var t of B(s))et.call(s,t)&&tt(a,t,s[t]);return a},S=(a,s)=>ut(a,mt(s));var st=(a,s)=>{var t={};for(var e in a)j.call(a,e)&&s.indexOf(e)<0&&(t[e]=a[e]);if(a!=null&&B)for(var e of B(a))s.indexOf(e)<0&&et.call(a,e)&&(t[e]=a[e]);return t};var St=(a,s)=>{for(var t in s)J(a,t,{get:s[t],enumerable:!0})},ft=(a,s,t,e)=>{if(s&&typeof s=="object"||typeof s=="function")for(let n of Et(s))!j.call(a,n)&&n!==t&&J(a,n,{get:()=>s[n],enumerable:!(e=pt(s,n))||e.enumerable});return a};var vt=a=>ft(J({},"__esModule",{value:!0}),a);var nt=(a,s,t)=>(s=a[Z("asyncIterator")])?s.call(a):(a=a[Z("iterator")](),s={},t=(e,n)=>(n=a[e])&&(s[e]=i=>new Promise((h,o,c)=>(i=n.call(a,i),c=i.done,Promise.resolve(i.value).then(d=>h({value:d,done:c}),o)))),t("next"),t("return"),s);var yt={};St(yt,{CustomEventNames:()=>it,LangGraphAgent:()=>Y,LangGraphEventTypes:()=>at,LangGraphHttpAgent:()=>q});module.exports=vt(yt);var gt=require("@ag-ui/client");var ht=require("rxjs"),dt=require("@langchain/langgraph-sdk"),W=require("crypto");var at=(g=>(g.OnChainStart="on_chain_start",g.OnChainStream="on_chain_stream",g.OnChainEnd="on_chain_end",g.OnChatModelStart="on_chat_model_start",g.OnChatModelStream="on_chat_model_stream",g.OnChatModelEnd="on_chat_model_end",g.OnToolStart="on_tool_start",g.OnToolEnd="on_tool_end",g.OnCustomEvent="on_custom_event",g.OnInterrupt="on_interrupt",g))(at||{}),it=(n=>(n.ManuallyEmitMessage="manually_emit_message",n.ManuallyEmitToolCall="manually_emit_tool_call",n.ManuallyEmitState="manually_emit_state",n.Exit="exit",n))(it||{});var l=require("@ag-ui/client");var $=["messages","tools"];function F(a,s){return Object.fromEntries(Object.entries(a).filter(([t])=>s.includes(t)))}function rt({mode:a,state:s,schemaKeys:t}){let e=a==="start"?s:null;return e&&(t!=null&&t.input)&&(e=F(e,[...$,...t.input])),e}function ot(a){return a.map(s=>{var t;switch(s.type){case"human":return{id:s.id,role:"user",content:X(w(s.content))};case"ai":let e=w(s.content);return{id:s.id,role:"assistant",content:e?X(e):"",toolCalls:(t=s.tool_calls)==null?void 0:t.map(n=>({id:n.id,type:"function",function:{name:n.name,arguments:JSON.stringify(n.args)}}))};case"system":return{id:s.id,role:"system",content:X(w(s.content))};case"tool":return{id:s.id,role:"tool",content:X(w(s.content)),toolCallId:s.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function V(a){return a.map((s,t)=>{var e,n;switch(s.role){case"user":return{id:s.id,role:s.role,content:s.content,type:"human"};case"assistant":return{id:s.id,type:"ai",role:s.role,content:(e=s.content)!=null?e:"",tool_calls:((n=s.toolCalls)!=null?n:[]).map(i=>({id:i.id,name:i.function.name,args:JSON.parse(i.function.arguments),type:"tool_call"}))};case"system":return{id:s.id,role:s.role,content:s.content,type:"system"};case"tool":return{content:s.content,role:s.role,type:s.role,tool_call_id:s.toolCallId,id:s.id};default:throw console.error(`Message role ${s.role} is not implemented`),new Error("message role is not supported.")}})}function X(a){return typeof a=="string"?a:JSON.stringify(a)}function lt(a){var t,e,n,i,h;let s=(t=a.chunk)==null?void 0:t.content;if(s&&Array.isArray(s)&&s.length&&s[0])return s[0].thinking?{text:s[0].thinking,type:"text",index:s[0].index}:null;if((i=(n=(e=a.chunk.additional_kwargs)==null?void 0:e.reasoning)==null?void 0:n.summary)!=null&&i[0]){let o=(h=a.chunk.additional_kwargs)==null?void 0:h.reasoning.summary[0];return!o||!o.text?null:{type:"text",text:o.text,index:o.index}}return null}function w(a){var s;if(!a)return null;if(typeof a=="string")return a;if(Array.isArray(a)&&a.length){let t=(s=a.find(e=>e.type==="text"))==null?void 0:s.text;return t!=null?t:null}return null}var Y=class extends l.AbstractAgent{constructor(t){var e,n;super(t);this.constantSchemaKeys=$;this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(n=t==null?void 0:t.client)!=null?n:new dt.Client({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:m({},(e=t.propertyHeaders)!=null?e:{})})}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return new ht.Observable(e=>(this.runAgentStream(t,e),()=>{}))}async runAgentStream(t,e){var o,c,d;this.activeRun={id:t.runId,threadId:t.threadId},this.subscriber=e,this.assistant||(this.assistant=await this.getAssistant());let n=(o=t.threadId)!=null?o:(0,W.randomUUID)(),i=(d=(c=t.forwardedProps)==null?void 0:c.streamMode)!=null?d:["events","values","updates"],h=await this.prepareStream(S(m({},t),{threadId:n}),i);if(!h)return e.error("No stream to regenerate");await this.handleStreamEvents(h,n,e,t,i)}async prepareRegenerateStream(t,e){var d,g;let{threadId:n,messageCheckpoint:i,tools:h}=t,o=await this.getCheckpointByMessage(i.id,n);if(this.assistant||(this.assistant=await this.getAssistant()),!o)return this.subscriber.error("No checkpoint found for message");let c=await this.client.threads.updateState(n,{values:this.langGraphDefaultMergeState(o.values,[],h),checkpointId:o.checkpoint.checkpoint_id,asNode:(g=(d=o.next)==null?void 0:d[0])!=null?g:"__start__"});return{streamResponse:this.client.runs.stream(n,this.assistant.assistant_id,{input:this.langGraphDefaultMergeState(o.values,[i],h),checkpointId:c.checkpoint.checkpoint_id,streamMode:e}),state:o,streamMode:e}}async prepareStream(t,e){var G,L,b,C,k,H,U,P;let{threadId:n,state:i,messages:h,tools:o,context:c,forwardedProps:d}=t;this.activeRun.manuallyEmittedState=null;let g=d==null?void 0:d.nodeName;this.activeRun.nodeName=g,this.activeRun.nodeName==="__end__"&&(this.activeRun.nodeName=void 0);let r=n!=null?n:(0,W.randomUUID)();this.assistant||(this.assistant=await this.getAssistant());let E=await this.getOrCreateThread(r,d==null?void 0:d.threadMetadata);this.activeRun.threadId=E.thread_id;let p=(G=await this.client.threads.getState(E.thread_id))!=null?G:{values:{}},T=(L=p.values.messages)!=null?L:[],M=V(h),v=this.langGraphDefaultMergeState(S(m({},i),{messages:T}),M,o),y=S(m({},p),{values:S(m({},v),{messages:[...T,...v.messages]})}),I=y.values;if(this.activeRun.schemaKeys=await this.getSchemaKeys(),((b=p.values.messages)!=null?b:[]).length>h.filter(u=>u.role!=="system").length){let u=null;for(let _=h.length-1;_>=0;_--)if(h[_].role==="user"){u=V([h[_]])[0];break}return u?this.prepareRegenerateStream(S(m({},t),{messageCheckpoint:u}),e):this.subscriber.error("No user message found in messages to regenerate")}this.activeRun.graphInfo=await this.client.assistants.getGraph(this.assistant.assistant_id);let R=!((C=d==null?void 0:d.command)!=null&&C.resume)&&r&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(R==="continue"){let u=this.activeRun.graphInfo.edges.find(_=>_.target===this.activeRun.nodeName);await this.client.threads.updateState(r,{values:i,asNode:u==null?void 0:u.source})}let N=rt({mode:R,state:I,schemaKeys:this.activeRun.schemaKeys}),A,f=[this.assistantConfig,d==null?void 0:d.config].filter(Boolean);f.length&&(A=await this.mergeConfigs({configs:f,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let K=S(m({},d),{streamMode:e,input:N,config:A}),x=(U=(H=(k=p.tasks)==null?void 0:k[0])==null?void 0:H.interrupts)!=null?U:[];return x!=null&&x.length&&!((P=d==null?void 0:d.command)!=null&&P.resume)?(this.dispatchEvent({type:l.EventType.RUN_STARTED,threadId:r,runId:t.runId}),x.forEach(u=>{this.dispatchEvent({type:l.EventType.CUSTOM,name:"on_interrupt",value:typeof u.value=="string"?u.value:JSON.stringify(u.value),rawEvent:u})}),this.dispatchEvent({type:l.EventType.RUN_FINISHED,threadId:r,runId:t.runId}),this.subscriber.complete()):{streamResponse:this.client.runs.stream(r,this.assistant.assistant_id,K),state:y}}async handleStreamEvents(t,e,n,i,h){var T,M,v,y,f,K,x,G,L,b;let{forwardedProps:o}=i,c=o==null?void 0:o.nodeName;this.subscriber=n;let d=!1;if(!t)return;let{streamResponse:g,state:r}=t;this.activeRun.prevNodeName=null;let E={},p=r;try{this.dispatchEvent({type:l.EventType.RUN_STARTED,threadId:e,runId:this.activeRun.id}),(T=o==null?void 0:o.command)!=null&&T.resume&&this.activeRun.nodeName&&this.startStep(this.activeRun.nodeName);try{for(var I=nt(g),R,N,A;R=!(N=await I.next()).done;R=!1){let u=N.value;if(!h.includes(u.event))continue;let _=u;if(u.event==="error"){this.dispatchEvent({type:l.EventType.RUN_ERROR,message:u.data.message,rawEvent:u});break}if(u.event==="updates")continue;if(u.event==="values"){E=_.data;continue}let D=_.data,z=(M=D.metadata)!=null?M:{},O=z.langgraph_node,Q=D.event;if(this.activeRun.id=z.run_id,O&&O!==this.activeRun.nodeName&&(this.activeRun.nodeName&&this.activeRun.nodeName!==c&&this.endStep(),this.startStep(O)),d=d||Q==="on_custom_event"&&D.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===O&&Q==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),(v=this.activeRun.graphInfo)!=null&&v.nodes.some(ct=>ct.id===O)&&(this.activeRun.nodeName=O),p.values=(y=this.activeRun.manuallyEmittedState)!=null?y:E,!this.activeRun.nodeName)continue;(JSON.stringify(p)!==JSON.stringify(r)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(r=p,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:l.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(r),rawEvent:_})),this.dispatchEvent({type:l.EventType.RAW,event:D}),this.handleSingleEvent(D)}}catch(N){A=[N]}finally{try{R&&(N=I.return)&&await N.call(I)}finally{if(A)throw A[0]}}r=await this.client.threads.getState(e);let C=r.tasks,k=(K=(f=C==null?void 0:C[0])==null?void 0:f.interrupts)!=null?K:[],H=r.next.length===0,U=(G=(x=r.metadata)==null?void 0:x.writes)!=null?G:{},P=this.activeRun.nodeName;return k!=null&&k.length||(P=H?"__end__":(L=r.next[0])!=null?L:Object.keys(U)[0]),k.forEach(u=>{this.dispatchEvent({type:l.EventType.CUSTOM,name:"on_interrupt",value:typeof u.value=="string"?u.value:JSON.stringify(u.value),rawEvent:u})}),this.activeRun.nodeName!=P&&(this.endStep(),this.startStep(P)),this.endStep(),this.dispatchEvent({type:l.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(r.values)}),this.dispatchEvent({type:l.EventType.MESSAGES_SNAPSHOT,messages:ot((b=r.values.messages)!=null?b:[])}),this.dispatchEvent({type:l.EventType.RUN_FINISHED,threadId:e,runId:this.activeRun.id}),this.activeRun=void 0,n.complete()}catch(C){return n.error(C)}}handleSingleEvent(t){var e,n,i,h,o,c;switch(t.event){case"on_chat_model_stream":let d=(e=t.metadata["emit-messages"])!=null?e:!0,g=(n=t.metadata["emit-tool-calls"])!=null?n:!0;if(t.data.chunk.response_metadata.finish_reason)return;let r=this.getMessageInProgress(this.activeRun.id),E=!!(r!=null&&r.id),p=(i=t.data.chunk.tool_call_chunks)==null?void 0:i[0],T=(h=t.metadata.predict_state)==null?void 0:h.some(f=>f.tool===(p==null?void 0:p.name)),M=!E&&(p==null?void 0:p.name),v=E&&(r==null?void 0:r.toolCallId)&&(p==null?void 0:p.args),y=E&&(r==null?void 0:r.toolCallId)&&!p,I=lt(t.data),R=w(t.data.chunk.content),N=!!(!p&&R),A=E&&!(r!=null&&r.toolCallId)&&!N;if(I){this.handleThinkingEvent(I);break}if(!I&&this.thinkingProcess&&(this.dispatchEvent({type:l.EventType.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:l.EventType.THINKING_END}),this.thinkingProcess=null),T&&this.dispatchEvent({type:l.EventType.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),y){this.dispatchEvent({type:l.EventType.TOOL_CALL_END,toolCallId:r==null?void 0:r.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(A){this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_END,messageId:r.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(M&&g){this.dispatchEvent({type:l.EventType.TOOL_CALL_START,toolCallId:p.id,toolCallName:p.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:p.id,toolCallName:p.name});break}if(v&&g){this.dispatchEvent({type:l.EventType.TOOL_CALL_ARGS,toolCallId:r==null?void 0:r.toolCallId,delta:p.args,rawEvent:t});break}if(N&&d){r||(this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.chunk.id,rawEvent:t}),this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:null,toolCallName:null}),r=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_CONTENT,messageId:r.id,delta:R,rawEvent:t});break}break;case"on_chat_model_end":if((o=this.getMessageInProgress(this.activeRun.id))!=null&&o.toolCallId){this.dispatchEvent({type:l.EventType.TOOL_CALL_END,toolCallId:this.getMessageInProgress(this.activeRun.id).toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if((c=this.getMessageInProgress(this.activeRun.id))!=null&&c.id){this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_END,messageId:this.getMessageInProgress(this.activeRun.id).id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}break;case"on_custom_event":if(t.name==="manually_emit_message"){this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:l.EventType.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:l.EventType.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:l.EventType.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:l.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(this.activeRun.manuallyEmittedState),rawEvent:t})),this.dispatchEvent({type:l.EventType.CUSTOM,name:t.name,value:t.data,rawEvent:t});break}}handleThinkingEvent(t){var n;if(!t||!t.type||!t.text)return;let e=t.index;(n=this.thinkingProcess)!=null&&n.index&&this.thinkingProcess.index!==e&&(this.thinkingProcess.type&&this.dispatchEvent({type:l.EventType.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:l.EventType.THINKING_END}),this.thinkingProcess=null),this.thinkingProcess||(this.dispatchEvent({type:l.EventType.THINKING_START}),this.thinkingProcess={index:e}),this.thinkingProcess.type!==t.type&&(this.dispatchEvent({type:l.EventType.THINKING_TEXT_MESSAGE_START}),this.thinkingProcess.type=t.type),this.thinkingProcess.type&&this.dispatchEvent({type:l.EventType.THINKING_TEXT_MESSAGE_CONTENT,delta:t.text})}getStateSnapshot(t){let e=this.activeRun.schemaKeys;return e!=null&&e.output&&(t=F(t,[...this.constantSchemaKeys,...e.output])),t}async getOrCreateThread(t,e){let n;try{try{n=await this.getThread(t)}catch(i){n=await this.createThread({threadId:t,metadata:e})}}catch(i){throw new Error(`Failed to create thread: ${i.message}`)}return n}async getThread(t){return this.client.threads.get(t)}async createThread(t){return this.client.threads.create(t)}async mergeConfigs({configs:t,assistant:e,schemaKeys:n}){return t.reduce((i,h)=>{var E;let o=i.configurable;h.configurable&&(o=n!=null&&n.config?F(h==null?void 0:h.configurable,[...this.constantSchemaKeys,...(E=n==null?void 0:n.config)!=null?E:[]]):h==null?void 0:h.configurable);let c=S(m(m({},i),h),{configurable:o}),d=i.recursion_limit==null&&h.recursion_limit===25,g=JSON.stringify(c)!==JSON.stringify(i),r=d&&JSON.stringify(S(m({},c),{recursion_limit:null}))===JSON.stringify(S(m({},i),{recursion_limit:null}));return g&&!r?m(m({},i),c):i},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=S(m({},this.messagesInProcess),{[t]:m(m({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(n=>n.graph_id===this.graphId);if(!e)throw console.error(`
2
2
  No agent found with graph ID ${this.graphId} found..
3
3
 
4
4
 
5
- These are the available agents: [${t.map(s=>`${s.graph_id} (ID: ${s.assistant_id})`).join(", ")}]
6
- `),new Error("No agent id found");return e}async getSchemaKeys(){var e,s,n;let t=["messages"];try{let r=await this.client.assistants.getSchemas(this.assistant.assistant_id),c=null;if((e=r.config_schema)!=null&&e.properties&&(c=Object.keys(r.config_schema.properties)),!((s=r.input_schema)!=null&&s.properties)||!((n=r.output_schema)!=null&&n.properties))return{config:[],input:t,output:t};let h=Object.keys(r.input_schema.properties),l=Object.keys(r.output_schema.properties);return{input:h&&h.length?[...h,...t]:null,output:l&&l.length?[...l,...t]:null,config:c}}catch(r){return{config:[],input:t,output:t}}}langGraphDefaultMergeState(t,e,s){var E;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let n=t.messages||[],r=new Set(n.map(d=>d.id)),c=new Set(e.map(d=>d.id)),h=[];e.length<n.length&&(h=n.filter(d=>!c.has(d.id)).map(d=>new Et.RemoveMessage({id:d.id})));let l=e.filter(d=>!r.has(d.id));return f(p({},t),{messages:[...h,...l],tools:[...(E=t.tools)!=null?E:[],...s]})}startStep(t){this.dispatchEvent({type:i.EventType.STEP_STARTED,stepName:t}),this.activeRun.nodeName=t}endStep(){if(!this.activeRun.nodeName)throw new Error("No active step to end");this.dispatchEvent({type:i.EventType.STEP_FINISHED,stepName:this.activeRun.nodeName}),this.activeRun.nodeName=void 0}};var U=class extends St.HttpAgent{};0&&(module.exports={CustomEventNames,LangGraphAgent,LangGraphEventTypes,LangGraphHttpAgent});
5
+ These are the available agents: [${t.map(n=>`${n.graph_id} (ID: ${n.assistant_id})`).join(", ")}]
6
+ `),new Error("No agent id found");return e}async getSchemaKeys(){var t,e,n;try{let i=await this.client.assistants.getSchemas(this.assistant.assistant_id),h=null;if((t=i.config_schema)!=null&&t.properties&&(h=Object.keys(i.config_schema.properties)),!((e=i.input_schema)!=null&&e.properties)||!((n=i.output_schema)!=null&&n.properties))return{config:[],input:null,output:null};let o=Object.keys(i.input_schema.properties),c=Object.keys(i.output_schema.properties);return{input:o&&o.length?[...o,...this.constantSchemaKeys]:null,output:c&&c.length?[...c,...this.constantSchemaKeys]:null,config:h}}catch(i){return{config:[],input:this.constantSchemaKeys,output:this.constantSchemaKeys}}}langGraphDefaultMergeState(t,e,n){var d;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let i=t.messages||[],h=new Set(i.map(g=>g.id)),o=e.filter(g=>!h.has(g.id)),c=[...(d=t.tools)!=null?d:[],...n!=null?n:[]].map(g=>g.type?g:{type:"function",function:{name:g.name,description:g.description,parameters:g.parameters}});return S(m({},t),{messages:o,tools:c})}startStep(t){this.dispatchEvent({type:l.EventType.STEP_STARTED,stepName:t}),this.activeRun.nodeName=t}endStep(){if(!this.activeRun.nodeName)throw new Error("No active step to end");this.dispatchEvent({type:l.EventType.STEP_FINISHED,stepName:this.activeRun.nodeName}),this.activeRun.nodeName=void 0}async getCheckpointByMessage(t,e,n){var v,I;let i=n!=null&&n.checkpoint_id?{checkpoint:{checkpoint_id:n.checkpoint_id}}:void 0,o=[...await this.client.threads.getHistory(e,i)].reverse(),c=o.find(R=>{var N;return(N=R.values.messages)==null?void 0:N.some(A=>A.id===t)});if(!c)throw new Error("Message not found");let d=(v=c.values.messages)!=null?v:[],g=d.findIndex(R=>R.id===t);if(d.slice(g+1).length)return this.getCheckpointByMessage(t,e,c.parent_checkpoint);let E=o.indexOf(c),y=c.values,{messages:p}=y,T=st(y,["messages"]),M=(I=o[E-1])!=null?I:S(m({},c),{values:{}});return S(m({},M),{values:m(m({},M.values),T)})}};var q=class extends gt.HttpAgent{};0&&(module.exports={CustomEventNames,LangGraphAgent,LangGraphEventTypes,LangGraphHttpAgent});
7
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/types.ts","../src/utils.ts"],"sourcesContent":["import { HttpAgent } from \"@ag-ui/client\";\n\nexport * from './agent'\nexport class LangGraphHttpAgent extends HttpAgent {}","import { Observable, Subscriber } from \"rxjs\";\nimport {\n Client as LangGraphClient,\n EventsStreamEvent,\n StreamMode,\n Config as LangGraphConfig,\n ThreadState,\n Assistant,\n Message as LangGraphMessage,\n Config,\n Interrupt,\n Thread\n} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport { RemoveMessage } from \"@langchain/core/messages\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n ThinkingInProgress,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\n LangGraphReasoning\n} from \"./types\";\nimport {\n AbstractAgent,\n AgentConfig,\n CustomEvent,\n EventType,\n MessagesSnapshotEvent,\n RawEvent,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateDeltaEvent,\n StateSnapshotEvent,\n StepFinishedEvent,\n StepStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ThinkingTextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingStartEvent,\n ThinkingEndEvent,\n} from \"@ag-ui/client\";\nimport { RunsStreamPayload } from \"@langchain/langgraph-sdk/dist/types\";\nimport {\n aguiMessagesToLangChain,\n DEFAULT_SCHEMA_KEYS,\n filterObjectBySchemaKeys,\n getStreamPayloadInput,\n langchainMessagesToAgui,\n resolveMessageContent,\n resolveReasoningContent\n} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ThinkingTextMessageStartEvent\n | ThinkingTextMessageContentEvent\n | ThinkingTextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\n | ThinkingStartEvent\n | ThinkingEndEvent\n | StateSnapshotEvent\n | StateDeltaEvent\n | MessagesSnapshotEvent\n | RawEvent\n | CustomEvent\n | RunStartedEvent\n | RunFinishedEvent\n | RunErrorEvent\n | StepStartedEvent\n | StepFinishedEvent;\n\ntype RunAgentExtendedInput<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n> = Omit<RunAgentInput, \"forwardedProps\"> & {\n forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, \"input\"> & {\n nodeName?: string;\n threadMetadata?: Record<string, any>;\n };\n};\n\nexport interface LangGraphAgentConfig extends AgentConfig {\n client?: LangGraphClient;\n deploymentUrl: string;\n langsmithApiKey?: string;\n propertyHeaders?: Record<string, string>;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n}\n\nexport class LangGraphAgent extends AbstractAgent {\n client: LangGraphClient;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n assistant?: Assistant;\n messagesInProcess: MessagesInProgressRecord;\n thinkingProcess: null | ThinkingInProgress;\n activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\n this.thinkingProcess = null\n this.client =\n config?.client ??\n new LangGraphClient({\n apiUrl: config.deploymentUrl,\n apiKey: config.langsmithApiKey,\n defaultHeaders: { ...(config.propertyHeaders ?? {}) },\n });\n }\n\n dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n };\n return new Observable<ProcessedEvents>((subscriber) => {\n this.handleStreamEvents(input, subscriber);\n return () => {};\n });\n }\n\n async handleStreamEvents(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n let { threadId: inputThreadId, state, messages, tools, context, forwardedProps } = input;\n this.subscriber = subscriber;\n let shouldExit = false;\n // If a manual emittance happens, it is the ultimate source of truth of state, unless a node has exited.\n // Therefore, this value should either hold null, or the only edition of state that should be used.\n this.activeRun!.manuallyEmittedState = null;\n\n const nodeNameInput = forwardedProps?.nodeName;\n this.activeRun!.nodeName = nodeNameInput;\n if (this.activeRun!.nodeName === '__end__') {\n this.activeRun!.nodeName = undefined;\n }\n\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n const thread = await this.getOrCreateThread(threadId, forwardedProps?.threadMetadata);\n this.activeRun!.threadId = thread.thread_id;\n const agentState = await this.client.threads.getState(thread.thread_id) ?? { values: {} } as ThreadState\n\n const agentStateValues = agentState.values as State;\n const aguiToLangChainMessage = aguiMessagesToLangChain(messages);\n\n state.messages = agentStateValues.messages;\n state = this.langGraphDefaultMergeState(state, aguiToLangChainMessage, tools);\n const graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\n\n const mode =\n threadId && this.activeRun!.nodeName != \"__end__\" && this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\" && !forwardedProps?.command?.resume) {\n const nodeBefore = graphInfo.edges.find(e => e.target === this.activeRun!.nodeName);\n await this.client.threads.updateState(threadId, {\n values: state,\n asNode: nodeBefore?.source,\n });\n }\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n let payloadConfig: LangGraphConfig | undefined;\n const configsToMerge = [this.assistantConfig, forwardedProps?.config].filter(\n Boolean,\n ) as LangGraphConfig[];\n if (configsToMerge.length) {\n payloadConfig = await this.mergeConfigs({\n configs: configsToMerge,\n assistant: this.assistant,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n }\n const payload = {\n ...forwardedProps,\n streamMode:\n forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[]),\n input: payloadInput,\n config: payloadConfig,\n };\n\n // If there are still outstanding unresolved interrupts, we must force resolution of them before moving forward\n const interrupts = (agentState.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n if (interrupts?.length && !forwardedProps?.command?.resume) {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: input.runId,\n });\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: input.runId,\n });\n return subscriber.complete();\n }\n\n const streamResponse = this.client.runs.stream(threadId, this.assistant.assistant_id, payload);\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {};\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n\n for await (let streamResponseChunk of streamResponse) {\n // @ts-ignore\n if (!payload.streamMode.includes(streamResponseChunk.event as StreamMode)) {\n continue;\n }\n\n // Force event type, as data is not properly defined on the LG side.\n type EventsChunkData = {\n __interrupt__?: any;\n metadata: Record<string, any>;\n event: string;\n data: any;\n [key: string]: unknown;\n };\n const chunk = streamResponseChunk as EventsStreamEvent & { data: EventsChunkData };\n\n if (streamResponseChunk.event === \"error\") {\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: streamResponseChunk.data.message,\n rawEvent: streamResponseChunk,\n });\n break;\n }\n\n if (streamResponseChunk.event === \"updates\") continue;\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n }\n\n const chunkData = chunk.data;\n const currentNodeName = chunkData.metadata.langgraph_node;\n const eventType = chunkData.event;\n const metadata = chunkData.metadata;\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n if (this.activeRun!.nodeName && this.activeRun!.nodeName !== nodeNameInput) {\n this.endStep()\n }\n\n this.startStep(currentNodeName)\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (graphInfo[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.activeRun!.nodeName = currentNodeName\n }\n\n updatedState = this.activeRun!.manuallyEmittedState ?? latestStateValues;\n\n if (!this.activeRun!.nodeName) {\n continue;\n }\n\n const hasStateDiff = JSON.stringify(updatedState) !== JSON.stringify(state);\n // We should not update snapshot while a message is in progress.\n if (\n (hasStateDiff ||\n this.activeRun!.prevNodeName != this.activeRun!.nodeName ||\n this.activeRun!.exitingNode) &&\n !Boolean(this.getMessageInProgress(this.activeRun!.id))\n ) {\n state = updatedState;\n this.activeRun!.prevNodeName = this.activeRun!.nodeName;\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n rawEvent: chunk,\n });\n }\n\n this.dispatchEvent({\n type: EventType.RAW,\n event: chunkData,\n });\n\n this.handleSingleEvent(chunkData, state);\n }\n\n state = await this.client.threads.getState(threadId);\n const tasks = state.tasks\n const interrupts = (tasks?.[0]?.interrupts ?? []) as Interrupt[];\n const isEndNode = state.next.length === 0\n const writes = state.metadata.writes ?? {}\n\n let newNodeName = this.activeRun!.nodeName!\n\n if (!interrupts?.length) {\n newNodeName = isEndNode ? '__end__' : (state.next[0] ?? Object.keys(writes)[0]);\n }\n\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n if (this.activeRun!.nodeName != newNodeName) {\n this.endStep()\n this.startStep(newNodeName)\n }\n\n this.endStep()\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state.values),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui(state.values.messages ?? []),\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.activeRun = undefined;\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any, state: State): void {\n switch (event.event) {\n case LangGraphEventTypes.OnChatModelStream:\n let shouldEmitMessages = event.metadata[\"emit-messages\"] ?? true;\n let shouldEmitToolCalls = event.metadata[\"emit-tool-calls\"] ?? true;\n\n if (event.data.chunk.response_metadata.finish_reason) return;\n let currentStream = this.getMessageInProgress(this.activeRun!.id);\n const hasCurrentStream = Boolean(currentStream?.id);\n const toolCallData = event.data.chunk.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata[\"predict_state\"]?.some(\n (predictStateTool: PredictStateTool) => predictStateTool.tool === toolCallData?.name,\n );\n\n const isToolCallStartEvent = !hasCurrentStream && toolCallData?.name;\n const isToolCallArgsEvent =\n hasCurrentStream && currentStream?.toolCallId && toolCallData?.args;\n const isToolCallEndEvent = hasCurrentStream && currentStream?.toolCallId && !toolCallData;\n\n const reasoningData = resolveReasoningContent(event.data);\n const messageContent = resolveMessageContent(event.data.chunk.content);\n const isMessageContentEvent = Boolean(!toolCallData && messageContent);\n\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\n\n if (reasoningData) {\n this.handleThinkingEvent(reasoningData)\n break;\n }\n\n if (!reasoningData && this.thinkingProcess) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n })\n this.dispatchEvent({\n type: EventType.THINKING_END,\n })\n this.thinkingProcess = null;\n }\n\n if (toolCallUsedToPredictState) {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"predict_state\"],\n });\n }\n\n if (isToolCallEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: currentStream?.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isMessageEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: currentStream!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isToolCallStartEvent && shouldEmitToolCalls) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n parentMessageId: event.data.chunk.id,\n rawEvent: event,\n });\n if (resolved) {\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n });\n }\n break;\n }\n\n // Tool call args: emit ActionExecutionArgs\n if (isToolCallArgsEvent && shouldEmitToolCalls) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: currentStream?.toolCallId!,\n delta: toolCallData.args,\n rawEvent: event,\n });\n break;\n }\n\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n // No existing message yet, also init the message\n if (!currentStream) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: null,\n toolCallName: null,\n });\n currentStream = this.getMessageInProgress(this.activeRun!.id);\n }\n\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: messageContent!,\n rawEvent: event,\n });\n break;\n }\n\n break;\n case LangGraphEventTypes.OnChatModelEnd:\n if (this.getMessageInProgress(this.activeRun!.id)?.toolCallId) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: this.getMessageInProgress(this.activeRun!.id)!.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n if (this.getMessageInProgress(this.activeRun!.id)?.id) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: this.getMessageInProgress(this.activeRun!.id)!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n break;\n case LangGraphEventTypes.OnCustomEvent:\n if (event.name === CustomEventNames.ManuallyEmitMessage) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.message_id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.data.message_id,\n delta: event.data.message,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.data.message_id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitToolCall) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: event.data.id,\n toolCallName: event.data.name,\n parentMessageId: event.data.id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: event.data.id,\n delta: event.data.args,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: event.data.id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitState) {\n this.activeRun!.manuallyEmittedState = event.data;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n rawEvent: event,\n });\n }\n\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: event.name,\n value: event.data,\n rawEvent: event,\n });\n break;\n }\n }\n\n handleThinkingEvent(reasoningData: LangGraphReasoning) {\n if (!reasoningData || !reasoningData.type || !reasoningData.text) {\n return;\n }\n\n const thinkingStepIndex = reasoningData.index;\n\n if (this.thinkingProcess?.index && this.thinkingProcess.index !== thinkingStepIndex) {\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n })\n }\n this.dispatchEvent({\n type: EventType.THINKING_END,\n })\n this.thinkingProcess = null;\n }\n\n if (!this.thinkingProcess) {\n // No thinking step yet. Start a new one\n this.dispatchEvent({\n type: EventType.THINKING_START,\n })\n this.thinkingProcess = {\n index: thinkingStepIndex,\n };\n }\n\n\n if (this.thinkingProcess.type !== reasoningData.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n })\n this.thinkingProcess.type = reasoningData.type\n }\n\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n delta: reasoningData.text\n })\n }\n }\n\n getStateSnapshot(state: State) {\n const schemaKeys = this.activeRun!.schemaKeys!;\n // Do not emit state keys that are not part of the output schema\n if (schemaKeys?.output) {\n state = filterObjectBySchemaKeys(state, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThread(threadId: string, threadMetadata?: Record<string, any>): Promise<Thread> {\n let thread: Thread;\n try {\n try {\n thread = await this.getThread(threadId);\n } catch (error) {\n thread = await this.createThread({\n threadId,\n metadata: threadMetadata\n });\n }\n } catch (error: unknown) {\n throw new Error(`Failed to create thread: ${(error as Error).message}`);\n }\n\n return thread;\n }\n\n async getThread(threadId: string) {\n return this.client.threads.get(threadId);\n }\n\n async createThread(payload?: Parameters<typeof this.client.threads.create>[0]) {\n return this.client.threads.create(payload);\n }\n\n async mergeConfigs({\n configs,\n assistant,\n schemaKeys,\n }: {\n configs: Config[];\n assistant: Assistant;\n schemaKeys: SchemaKeys;\n }) {\n return configs.reduce((acc, cfg) => {\n let filteredConfigurable = acc.configurable;\n\n if (cfg.configurable) {\n filteredConfigurable = schemaKeys?.config\n ? filterObjectBySchemaKeys(cfg?.configurable, [\n ...DEFAULT_SCHEMA_KEYS,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) =>\n searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"messages\"];\n\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\n if (graphSchema.config_schema?.properties) {\n configSchema = Object.keys(graphSchema.config_schema.properties);\n }\n if (!graphSchema.input_schema?.properties || !graphSchema.output_schema?.properties) {\n return { config: [], input: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input: inputSchema && inputSchema.length ? [...inputSchema, ...CONSTANT_KEYS] : null,\n output: outputSchema && outputSchema.length ? [...outputSchema, ...CONSTANT_KEYS] : null,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], tools: any): State {\n if (messages.length > 0 && \"role\" in messages[0] && messages[0].role === \"system\") {\n // remove system message\n messages = messages.slice(1);\n }\n\n // merge with existing messages\n const existingMessages: LangGraphPlatformMessage[] = state.messages || [];\n const existingMessageIds = new Set(existingMessages.map((message) => message.id));\n const messageIds = new Set(messages.map((message) => message.id));\n\n let removedMessages: RemoveMessage[] = [];\n if (messages.length < existingMessages.length) {\n // Messages were removed\n removedMessages = existingMessages\n .filter((m) => !messageIds.has(m.id))\n .map((m) => new RemoveMessage({ id: m.id! }));\n }\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n return {\n ...state,\n messages: [...removedMessages, ...newMessages],\n tools: [...(state.tools ?? []), ...tools],\n };\n }\n\n startStep(nodeName: string) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: nodeName,\n });\n this.activeRun!.nodeName = nodeName;\n }\n\n endStep() {\n if (!this.activeRun!.nodeName) {\n throw new Error(\"No active step to end\");\n }\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n this.activeRun!.nodeName = undefined;\n }\n}\n\nexport * from \"./types\";\n","import { Message } from \"@langchain/langgraph-sdk\";\nimport { MessageType } from \"@langchain/core/messages\";\n\nexport enum LangGraphEventTypes {\n OnChainStart = \"on_chain_start\",\n OnChainStream = \"on_chain_stream\",\n OnChainEnd = \"on_chain_end\",\n OnChatModelStart = \"on_chat_model_start\",\n OnChatModelStream = \"on_chat_model_stream\",\n OnChatModelEnd = \"on_chat_model_end\",\n OnToolStart = \"on_tool_start\",\n OnToolEnd = \"on_tool_end\",\n OnCustomEvent = \"on_custom_event\",\n OnInterrupt = \"on_interrupt\",\n}\n\nexport type State = Record<string, any>;\n\nexport type SchemaKeys = {\n input: string[] | null;\n output: string[] | null;\n config: string[] | null;\n} | null;\n\nexport type MessageInProgress = {\n id: string;\n toolCallId?: string | null;\n toolCallName?: string | null;\n};\n\nexport type ThinkingInProgress = {\n index: number;\n type?: LangGraphReasoning['type'];\n}\n\nexport interface RunMetadata {\n id: string;\n schemaKeys?: SchemaKeys;\n nodeName?: string;\n prevNodeName?: string | null;\n exitingNode?: boolean;\n manuallyEmittedState?: State | null;\n threadId?: string;\n}\n\nexport type MessagesInProgressRecord = Record<string, MessageInProgress | null>;\n\n// The following types are our own definition to the messages accepted by LangGraph Platform, enhanced with some of our extra data.\nexport interface ToolCall {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\ntype BaseLangGraphPlatformMessage = Omit<\n Message,\n | \"isResultMessage\"\n | \"isTextMessage\"\n | \"isImageMessage\"\n | \"isActionExecutionMessage\"\n | \"isAgentStateMessage\"\n | \"type\"\n | \"createdAt\"\n> & {\n content: string;\n role: string;\n additional_kwargs?: Record<string, unknown>;\n type: MessageType;\n};\n\ninterface LangGraphPlatformResultMessage extends BaseLangGraphPlatformMessage {\n tool_call_id: string;\n name: string;\n}\n\ninterface LangGraphPlatformActionExecutionMessage extends BaseLangGraphPlatformMessage {\n tool_calls: ToolCall[];\n}\n\nexport type LangGraphPlatformMessage =\n | LangGraphPlatformActionExecutionMessage\n | LangGraphPlatformResultMessage\n | BaseLangGraphPlatformMessage;\n\nexport enum CustomEventNames {\n ManuallyEmitMessage = \"manually_emit_message\",\n ManuallyEmitToolCall = \"manually_emit_tool_call\",\n ManuallyEmitState = \"manually_emit_state\",\n Exit = \"exit\",\n}\n\nexport interface PredictStateTool {\n tool: string;\n state_key: string;\n tool_argument: string;\n}\n\nexport interface LangGraphReasoning {\n type: 'text';\n text: string;\n index: number\n}\n","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys, LangGraphReasoning } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/client\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"ai\":\n const content = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: content ? stringifyIfNeeded(content) : '',\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n\nexport function resolveReasoningContent(eventData: any): LangGraphReasoning | null {\n const content = eventData.chunk?.content\n\n // Anthropic reasoning response\n if (content && Array.isArray(content) && content.length && content[0]) {\n if (!content[0].thinking) return null\n return {\n text: content[0].thinking,\n type: 'text',\n index: content[0].index,\n }\n }\n\n /// OpenAI reasoning response\n if (eventData.chunk.additional_kwargs?.reasoning?.summary?.[0]) {\n const data = eventData.chunk.additional_kwargs?.reasoning.summary[0]\n if (!data || !data.text) return null\n return {\n type: 'text',\n text: data.text,\n index: data.index,\n }\n }\n\n return null\n}\n\nexport function resolveMessageContent(content?: LangGraphMessage['content']): string | null {\n if (!content) return null;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content) && content.length) {\n const contentText = content.find(c => c.type === 'text')?.text\n return contentText ?? null;\n }\n\n return null\n}\n"],"mappings":"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","names":["index_exports","__export","CustomEventNames","LangGraphAgent","LangGraphEventTypes","LangGraphHttpAgent","__toCommonJS","import_client","import_rxjs","import_langgraph_sdk","import_node_crypto","import_messages","LangGraphEventTypes","CustomEventNames","import_client","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","resolveMessageContent","content","tc","aguiMessagesToLangChain","index","_b","item","resolveReasoningContent","eventData","_c","_d","_e","data","contentText","c","LangGraphAgent","config","_a","_b","LangGraphClient","__spreadValues","event","input","subscriber","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","inputThreadId","state","messages","tools","context","forwardedProps","shouldExit","nodeNameInput","threadId","thread","agentState","agentStateValues","aguiToLangChainMessage","aguiMessagesToLangChain","graphInfo","mode","nodeBefore","e","payloadInput","getStreamPayloadInput","payloadConfig","configsToMerge","payload","__spreadProps","interrupts","interrupt","streamResponse","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","chunk","chunkData","currentNodeName","eventType","metadata","node","tasks","isEndNode","writes","newNodeName","langchainMessagesToAgui","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","reasoningData","resolveReasoningContent","messageContent","resolveMessageContent","isMessageContentEvent","isMessageEndEvent","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","DEFAULT_SCHEMA_KEYS","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","CONSTANT_KEYS","graphSchema","configSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","messageIds","removedMessages","m","newMessages","nodeName","LangGraphHttpAgent"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/types.ts","../src/utils.ts"],"sourcesContent":["import { HttpAgent } from \"@ag-ui/client\";\n\nexport * from './agent'\nexport class LangGraphHttpAgent extends HttpAgent {}","import { Observable, Subscriber } from \"rxjs\";\nimport {\n Client as LangGraphClient,\n EventsStreamEvent,\n StreamMode,\n Config as LangGraphConfig,\n ThreadState,\n Assistant,\n Message as LangGraphMessage,\n Config,\n Interrupt,\n Thread\n} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n ThinkingInProgress,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\n LangGraphReasoning\n} from \"./types\";\nimport {\n AbstractAgent,\n AgentConfig,\n CustomEvent,\n EventType,\n MessagesSnapshotEvent,\n RawEvent,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateDeltaEvent,\n StateSnapshotEvent,\n StepFinishedEvent,\n StepStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ThinkingTextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingStartEvent,\n ThinkingEndEvent,\n Message as AGUIMessage,\n} from \"@ag-ui/client\";\nimport { RunsStreamPayload } from \"@langchain/langgraph-sdk/dist/types\";\nimport {\n aguiMessagesToLangChain,\n DEFAULT_SCHEMA_KEYS,\n filterObjectBySchemaKeys,\n getStreamPayloadInput,\n langchainMessagesToAgui,\n resolveMessageContent,\n resolveReasoningContent\n} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ThinkingTextMessageStartEvent\n | ThinkingTextMessageContentEvent\n | ThinkingTextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\n | ThinkingStartEvent\n | ThinkingEndEvent\n | StateSnapshotEvent\n | StateDeltaEvent\n | MessagesSnapshotEvent\n | RawEvent\n | CustomEvent\n | RunStartedEvent\n | RunFinishedEvent\n | RunErrorEvent\n | StepStartedEvent\n | StepFinishedEvent;\n\ntype RunAgentExtendedInput<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n> = Omit<RunAgentInput, \"forwardedProps\"> & {\n forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, \"input\"> & {\n nodeName?: string;\n threadMetadata?: Record<string, any>;\n };\n};\n\ninterface RegenerateInput extends RunAgentExtendedInput {\n messageCheckpoint: LangGraphMessage;\n}\n\nexport interface LangGraphAgentConfig extends AgentConfig {\n client?: LangGraphClient;\n deploymentUrl: string;\n langsmithApiKey?: string;\n propertyHeaders?: Record<string, string>;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n}\n\nexport class LangGraphAgent extends AbstractAgent {\n client: LangGraphClient;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n assistant?: Assistant;\n messagesInProcess: MessagesInProgressRecord;\n thinkingProcess: null | ThinkingInProgress;\n activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n constantSchemaKeys: string[] = DEFAULT_SCHEMA_KEYS;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\n this.thinkingProcess = null\n this.client =\n config?.client ??\n new LangGraphClient({\n apiUrl: config.deploymentUrl,\n apiKey: config.langsmithApiKey,\n defaultHeaders: { ...(config.propertyHeaders ?? {}) },\n });\n }\n\n dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n return new Observable<ProcessedEvents>((subscriber) => {\n this.runAgentStream(input, subscriber);\n return () => {};\n });\n }\n\n async runAgentStream(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n };\n this.subscriber = subscriber;\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n const threadId = input.threadId ?? randomUUID();\n const streamMode = input.forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[])\n const preparedStream = await this.prepareStream({ ...input, threadId }, streamMode)\n\n if (!preparedStream) {\n return subscriber.error('No stream to regenerate');\n }\n\n await this.handleStreamEvents(preparedStream, threadId, subscriber, input, streamMode)\n }\n\n async prepareRegenerateStream(input: RegenerateInput, streamMode: StreamMode | StreamMode[]) {\n const { threadId, messageCheckpoint, tools } = input\n\n const timeTravelCheckpoint = await this.getCheckpointByMessage(messageCheckpoint!.id!, threadId);\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n if (!timeTravelCheckpoint) {\n return this.subscriber.error('No checkpoint found for message');\n }\n\n const fork = await this.client.threads.updateState(\n threadId,\n {\n values: this.langGraphDefaultMergeState(timeTravelCheckpoint.values, [], tools),\n checkpointId: timeTravelCheckpoint.checkpoint.checkpoint_id!,\n asNode: timeTravelCheckpoint.next?.[0] ?? \"__start__\"\n }\n );\n\n return {\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, {\n input: this.langGraphDefaultMergeState(timeTravelCheckpoint.values, [messageCheckpoint], tools),\n // @ts-ignore\n checkpointId: fork.checkpoint.checkpoint_id!,\n streamMode,\n }),\n state: timeTravelCheckpoint,\n streamMode,\n };\n }\n\n async prepareStream(input: RunAgentExtendedInput, streamMode: StreamMode | StreamMode[]) {\n let { threadId: inputThreadId, state: inputState, messages, tools, context, forwardedProps } = input;\n // If a manual emittance happens, it is the ultimate source of truth of state, unless a node has exited.\n // Therefore, this value should either hold null, or the only edition of state that should be used.\n this.activeRun!.manuallyEmittedState = null;\n\n const nodeNameInput = forwardedProps?.nodeName;\n this.activeRun!.nodeName = nodeNameInput;\n if (this.activeRun!.nodeName === '__end__') {\n this.activeRun!.nodeName = undefined;\n }\n\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n const thread = await this.getOrCreateThread(threadId, forwardedProps?.threadMetadata);\n this.activeRun!.threadId = thread.thread_id;\n\n const agentState: ThreadState<State> = await this.client.threads.getState(thread.thread_id) ?? { values: {} } as ThreadState<State>\n const agentStateMessages = agentState.values.messages ?? []\n const inputMessagesToLangchain = aguiMessagesToLangChain(messages)\n const stateValuesDiff = this.langGraphDefaultMergeState({ ...inputState, messages: agentStateMessages }, inputMessagesToLangchain, tools);\n // Messages are a combination of existing messages in state + everything that was newly sent\n let threadState = {\n ...agentState,\n values: { ...stateValuesDiff, messages: [...agentStateMessages, ...stateValuesDiff.messages] },\n }\n let stateValues = threadState.values;\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n if ((agentState.values.messages ?? []).length > messages.filter((m) => m.role !== \"system\").length) {\n let lastUserMessage: LangGraphMessage | null = null;\n // Find the first user message by working backwards from the last message\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"user\") {\n lastUserMessage = aguiMessagesToLangChain([messages[i]])[0];\n break;\n }\n }\n\n if (!lastUserMessage) {\n return this.subscriber.error('No user message found in messages to regenerate');\n }\n\n return this.prepareRegenerateStream({ ...input, messageCheckpoint: lastUserMessage }, streamMode)\n }\n this.activeRun!.graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\n\n const mode =\n !forwardedProps?.command?.resume && threadId && this.activeRun!.nodeName != \"__end__\" && this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\") {\n const nodeBefore = this.activeRun!.graphInfo.edges.find(e => e.target === this.activeRun!.nodeName);\n await this.client.threads.updateState(threadId, {\n values: inputState,\n asNode: nodeBefore?.source,\n });\n }\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state: stateValues,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n let payloadConfig: LangGraphConfig | undefined;\n const configsToMerge = [this.assistantConfig, forwardedProps?.config].filter(\n Boolean,\n ) as LangGraphConfig[];\n if (configsToMerge.length) {\n payloadConfig = await this.mergeConfigs({\n configs: configsToMerge,\n assistant: this.assistant,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n }\n const payload = {\n ...forwardedProps,\n streamMode,\n input: payloadInput,\n config: payloadConfig,\n };\n\n // If there are still outstanding unresolved interrupts, we must force resolution of them before moving forward\n const interrupts = (agentState.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n if (interrupts?.length && !forwardedProps?.command?.resume) {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: input.runId,\n });\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: input.runId,\n });\n return this.subscriber.complete();\n }\n\n return {\n // @ts-ignore\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, payload),\n state: threadState as ThreadState<State>,\n }\n }\n\n async handleStreamEvents(\n stream: Awaited<ReturnType<typeof this.prepareStream> | ReturnType<typeof this.prepareRegenerateStream>>,\n threadId: string,\n subscriber: Subscriber<ProcessedEvents>,\n input: RunAgentExtendedInput,\n streamMode: StreamMode | StreamMode[]\n ) {\n const { forwardedProps } = input\n const nodeNameInput = forwardedProps?.nodeName;\n this.subscriber = subscriber;\n let shouldExit = false;\n if (!stream) return;\n\n let { streamResponse, state } = stream;\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {} as ThreadState<State>[\"values\"];\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n\n // In case of resume (interrupt), re-start resumed step\n if (forwardedProps?.command?.resume && this.activeRun!.nodeName) {\n this.startStep(this.activeRun!.nodeName)\n }\n\n for await (let streamResponseChunk of streamResponse) {\n // @ts-ignore\n if (!streamMode.includes(streamResponseChunk.event as StreamMode)) {\n continue;\n }\n\n // Force event type, as data is not properly defined on the LG side.\n type EventsChunkData = {\n __interrupt__?: any;\n metadata: Record<string, any>;\n event: string;\n data: any;\n [key: string]: unknown;\n };\n const chunk = streamResponseChunk as EventsStreamEvent & { data: EventsChunkData };\n\n if (streamResponseChunk.event === \"error\") {\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: streamResponseChunk.data.message,\n rawEvent: streamResponseChunk,\n });\n break;\n }\n\n if (streamResponseChunk.event === \"updates\") continue;\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n }\n\n const chunkData = chunk.data;\n const metadata = chunkData.metadata ?? {};\n const currentNodeName = metadata.langgraph_node;\n const eventType = chunkData.event;\n\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n if (this.activeRun!.nodeName && this.activeRun!.nodeName !== nodeNameInput) {\n this.endStep()\n }\n\n this.startStep(currentNodeName)\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (this.activeRun!.graphInfo?.[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.activeRun!.nodeName = currentNodeName\n }\n\n updatedState.values = this.activeRun!.manuallyEmittedState ?? latestStateValues;\n\n if (!this.activeRun!.nodeName) {\n continue;\n }\n\n const hasStateDiff = JSON.stringify(updatedState) !== JSON.stringify(state);\n // We should not update snapshot while a message is in progress.\n if (\n (hasStateDiff ||\n this.activeRun!.prevNodeName != this.activeRun!.nodeName ||\n this.activeRun!.exitingNode) &&\n !Boolean(this.getMessageInProgress(this.activeRun!.id))\n ) {\n state = updatedState;\n this.activeRun!.prevNodeName = this.activeRun!.nodeName;\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n rawEvent: chunk,\n });\n }\n\n this.dispatchEvent({\n type: EventType.RAW,\n event: chunkData,\n });\n\n this.handleSingleEvent(chunkData);\n }\n\n state = await this.client.threads.getState(threadId);\n const tasks = state.tasks\n const interrupts = (tasks?.[0]?.interrupts ?? []) as Interrupt[];\n const isEndNode = state.next.length === 0\n const writes = state.metadata?.writes ?? {}\n\n let newNodeName = this.activeRun!.nodeName!\n\n if (!interrupts?.length) {\n newNodeName = isEndNode ? '__end__' : (state.next[0] ?? Object.keys(writes)[0]);\n }\n\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n if (this.activeRun!.nodeName != newNodeName) {\n this.endStep()\n this.startStep(newNodeName)\n }\n\n this.endStep()\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state.values),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui((state.values as { messages: any[] }).messages ?? []),\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.activeRun = undefined;\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any): void {\n switch (event.event) {\n case LangGraphEventTypes.OnChatModelStream:\n let shouldEmitMessages = event.metadata[\"emit-messages\"] ?? true;\n let shouldEmitToolCalls = event.metadata[\"emit-tool-calls\"] ?? true;\n\n if (event.data.chunk.response_metadata.finish_reason) return;\n let currentStream = this.getMessageInProgress(this.activeRun!.id);\n const hasCurrentStream = Boolean(currentStream?.id);\n const toolCallData = event.data.chunk.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata[\"predict_state\"]?.some(\n (predictStateTool: PredictStateTool) => predictStateTool.tool === toolCallData?.name,\n );\n\n const isToolCallStartEvent = !hasCurrentStream && toolCallData?.name;\n const isToolCallArgsEvent =\n hasCurrentStream && currentStream?.toolCallId && toolCallData?.args;\n const isToolCallEndEvent = hasCurrentStream && currentStream?.toolCallId && !toolCallData;\n\n const reasoningData = resolveReasoningContent(event.data);\n const messageContent = resolveMessageContent(event.data.chunk.content);\n const isMessageContentEvent = Boolean(!toolCallData && messageContent);\n\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\n\n if (reasoningData) {\n this.handleThinkingEvent(reasoningData)\n break;\n }\n\n if (!reasoningData && this.thinkingProcess) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n })\n this.dispatchEvent({\n type: EventType.THINKING_END,\n })\n this.thinkingProcess = null;\n }\n\n if (toolCallUsedToPredictState) {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"predict_state\"],\n });\n }\n\n if (isToolCallEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: currentStream?.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isMessageEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: currentStream!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isToolCallStartEvent && shouldEmitToolCalls) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n parentMessageId: event.data.chunk.id,\n rawEvent: event,\n });\n if (resolved) {\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n });\n }\n break;\n }\n\n // Tool call args: emit ActionExecutionArgs\n if (isToolCallArgsEvent && shouldEmitToolCalls) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: currentStream?.toolCallId!,\n delta: toolCallData.args,\n rawEvent: event,\n });\n break;\n }\n\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n // No existing message yet, also init the message\n if (!currentStream) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: null,\n toolCallName: null,\n });\n currentStream = this.getMessageInProgress(this.activeRun!.id);\n }\n\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: messageContent!,\n rawEvent: event,\n });\n break;\n }\n\n break;\n case LangGraphEventTypes.OnChatModelEnd:\n if (this.getMessageInProgress(this.activeRun!.id)?.toolCallId) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: this.getMessageInProgress(this.activeRun!.id)!.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n if (this.getMessageInProgress(this.activeRun!.id)?.id) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: this.getMessageInProgress(this.activeRun!.id)!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n break;\n case LangGraphEventTypes.OnCustomEvent:\n if (event.name === CustomEventNames.ManuallyEmitMessage) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.message_id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.data.message_id,\n delta: event.data.message,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.data.message_id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitToolCall) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: event.data.id,\n toolCallName: event.data.name,\n parentMessageId: event.data.id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: event.data.id,\n delta: event.data.args,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: event.data.id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitState) {\n this.activeRun!.manuallyEmittedState = event.data;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(this.activeRun!.manuallyEmittedState!),\n rawEvent: event,\n });\n }\n\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: event.name,\n value: event.data,\n rawEvent: event,\n });\n break;\n }\n }\n\n handleThinkingEvent(reasoningData: LangGraphReasoning) {\n if (!reasoningData || !reasoningData.type || !reasoningData.text) {\n return;\n }\n\n const thinkingStepIndex = reasoningData.index;\n\n if (this.thinkingProcess?.index && this.thinkingProcess.index !== thinkingStepIndex) {\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n })\n }\n this.dispatchEvent({\n type: EventType.THINKING_END,\n })\n this.thinkingProcess = null;\n }\n\n if (!this.thinkingProcess) {\n // No thinking step yet. Start a new one\n this.dispatchEvent({\n type: EventType.THINKING_START,\n })\n this.thinkingProcess = {\n index: thinkingStepIndex,\n };\n }\n\n\n if (this.thinkingProcess.type !== reasoningData.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n })\n this.thinkingProcess.type = reasoningData.type\n }\n\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n delta: reasoningData.text\n })\n }\n }\n\n getStateSnapshot(state: State) {\n const schemaKeys = this.activeRun!.schemaKeys!;\n // Do not emit state keys that are not part of the output schema\n if (schemaKeys?.output) {\n state = filterObjectBySchemaKeys(state, [...this.constantSchemaKeys, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThread(threadId: string, threadMetadata?: Record<string, any>): Promise<Thread> {\n let thread: Thread;\n try {\n try {\n thread = await this.getThread(threadId);\n } catch (error) {\n thread = await this.createThread({\n threadId,\n metadata: threadMetadata\n });\n }\n } catch (error: unknown) {\n throw new Error(`Failed to create thread: ${(error as Error).message}`);\n }\n\n return thread;\n }\n\n async getThread(threadId: string) {\n return this.client.threads.get(threadId);\n }\n\n async createThread(payload?: Parameters<typeof this.client.threads.create>[0]) {\n return this.client.threads.create(payload);\n }\n\n async mergeConfigs({\n configs,\n assistant,\n schemaKeys,\n }: {\n configs: Config[];\n assistant: Assistant;\n schemaKeys: SchemaKeys;\n }) {\n return configs.reduce((acc, cfg) => {\n let filteredConfigurable = acc.configurable;\n\n if (cfg.configurable) {\n filteredConfigurable = schemaKeys?.config\n ? filterObjectBySchemaKeys(cfg?.configurable, [\n ...this.constantSchemaKeys,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) =>\n searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\n if (graphSchema.config_schema?.properties) {\n configSchema = Object.keys(graphSchema.config_schema.properties);\n }\n if (!graphSchema.input_schema?.properties || !graphSchema.output_schema?.properties) {\n return { config: [], input: null, output: null };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input: inputSchema && inputSchema.length ? [...inputSchema, ...this.constantSchemaKeys] : null,\n output: outputSchema && outputSchema.length ? [...outputSchema, ...this.constantSchemaKeys] : null,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: this.constantSchemaKeys, output: this.constantSchemaKeys };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], tools: any): State {\n if (messages.length > 0 && \"role\" in messages[0] && messages[0].role === \"system\") {\n // remove system message\n messages = messages.slice(1);\n }\n\n // merge with existing messages\n const existingMessages: LangGraphPlatformMessage[] = state.messages || [];\n const existingMessageIds = new Set(existingMessages.map((message) => message.id));\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n const langGraphTools = [...(state.tools ?? []), ...(tools ?? [])].map(tool => {\n if (tool.type) {\n return tool\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n }\n }\n })\n\n return {\n ...state,\n messages: newMessages,\n tools: langGraphTools,\n };\n }\n\n startStep(nodeName: string) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: nodeName,\n });\n this.activeRun!.nodeName = nodeName;\n }\n\n endStep() {\n if (!this.activeRun!.nodeName) {\n throw new Error(\"No active step to end\");\n }\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n this.activeRun!.nodeName = undefined;\n }\n\n async getCheckpointByMessage(\n messageId: string,\n threadId: string,\n checkpoint?: null | {\n checkpoint_id?: null | string;\n checkpoint_ns: string;\n }\n ): Promise<ThreadState> {\n const options = checkpoint?.checkpoint_id ? {\n checkpoint: { checkpoint_id: checkpoint.checkpoint_id }\n } : undefined\n const history = await this.client.threads.getHistory(threadId, options);\n const reversed = [...history].reverse(); // oldest → newest\n\n let targetState = reversed.find((state) =>\n (state.values as State).messages?.some((m: LangGraphPlatformMessage) => m.id === messageId),\n );\n\n if (!targetState) throw new Error(\"Message not found\");\n\n const targetStateMessages = (targetState.values as State).messages ?? [];\n const messageIndex = targetStateMessages.findIndex(\n (m: LangGraphPlatformMessage) => m.id === messageId,\n );\n const messagesAfter = targetStateMessages.slice(messageIndex + 1);\n if (messagesAfter.length) {\n return this.getCheckpointByMessage(messageId, threadId, targetState.parent_checkpoint)\n }\n\n const targetStateIndex = reversed.indexOf(targetState);\n\n const { messages, ...targetStateValuesWithoutMessages } = targetState.values as State\n const selectedCheckpoint = reversed[targetStateIndex - 1] ?? { ...targetState, values: {} }\n return { ...selectedCheckpoint, values: { ...selectedCheckpoint.values, ...targetStateValuesWithoutMessages } };\n }\n}\n\nexport * from \"./types\";\n","import { AssistantGraph, Message } from \"@langchain/langgraph-sdk\";\nimport { MessageType } from \"@langchain/core/messages\";\n\nexport enum LangGraphEventTypes {\n OnChainStart = \"on_chain_start\",\n OnChainStream = \"on_chain_stream\",\n OnChainEnd = \"on_chain_end\",\n OnChatModelStart = \"on_chat_model_start\",\n OnChatModelStream = \"on_chat_model_stream\",\n OnChatModelEnd = \"on_chat_model_end\",\n OnToolStart = \"on_tool_start\",\n OnToolEnd = \"on_tool_end\",\n OnCustomEvent = \"on_custom_event\",\n OnInterrupt = \"on_interrupt\",\n}\n\nexport type State = Record<string, any>;\n\nexport type SchemaKeys = {\n input: string[] | null;\n output: string[] | null;\n config: string[] | null;\n} | null;\n\nexport type MessageInProgress = {\n id: string;\n toolCallId?: string | null;\n toolCallName?: string | null;\n};\n\nexport type ThinkingInProgress = {\n index: number;\n type?: LangGraphReasoning['type'];\n}\n\nexport interface RunMetadata {\n id: string;\n schemaKeys?: SchemaKeys;\n nodeName?: string;\n prevNodeName?: string | null;\n exitingNode?: boolean;\n manuallyEmittedState?: State | null;\n threadId?: string;\n graphInfo?: AssistantGraph\n}\n\nexport type MessagesInProgressRecord = Record<string, MessageInProgress | null>;\n\n// The following types are our own definition to the messages accepted by LangGraph Platform, enhanced with some of our extra data.\nexport interface ToolCall {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\ntype BaseLangGraphPlatformMessage = Omit<\n Message,\n | \"isResultMessage\"\n | \"isTextMessage\"\n | \"isImageMessage\"\n | \"isActionExecutionMessage\"\n | \"isAgentStateMessage\"\n | \"type\"\n | \"createdAt\"\n> & {\n content: string;\n role: string;\n additional_kwargs?: Record<string, unknown>;\n type: MessageType;\n};\n\ninterface LangGraphPlatformResultMessage extends BaseLangGraphPlatformMessage {\n tool_call_id: string;\n name: string;\n}\n\ninterface LangGraphPlatformActionExecutionMessage extends BaseLangGraphPlatformMessage {\n tool_calls: ToolCall[];\n}\n\nexport type LangGraphPlatformMessage =\n | LangGraphPlatformActionExecutionMessage\n | LangGraphPlatformResultMessage\n | BaseLangGraphPlatformMessage;\n\nexport enum CustomEventNames {\n ManuallyEmitMessage = \"manually_emit_message\",\n ManuallyEmitToolCall = \"manually_emit_tool_call\",\n ManuallyEmitState = \"manually_emit_state\",\n Exit = \"exit\",\n}\n\nexport interface PredictStateTool {\n tool: string;\n state_key: string;\n tool_argument: string;\n}\n\nexport interface LangGraphReasoning {\n type: 'text';\n text: string;\n index: number\n}\n","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys, LangGraphReasoning } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/client\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"messages\", \"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"ai\":\n const content = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: content ? stringifyIfNeeded(content) : '',\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n\nexport function resolveReasoningContent(eventData: any): LangGraphReasoning | null {\n const content = eventData.chunk?.content\n\n // Anthropic reasoning response\n if (content && Array.isArray(content) && content.length && content[0]) {\n if (!content[0].thinking) return null\n return {\n text: content[0].thinking,\n type: 'text',\n index: content[0].index,\n }\n }\n\n /// OpenAI reasoning response\n if (eventData.chunk.additional_kwargs?.reasoning?.summary?.[0]) {\n const data = eventData.chunk.additional_kwargs?.reasoning.summary[0]\n if (!data || !data.text) return null\n return {\n type: 'text',\n text: data.text,\n index: data.index,\n }\n }\n\n return null\n}\n\nexport function resolveMessageContent(content?: LangGraphMessage['content']): string | null {\n if (!content) return null;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content) && content.length) {\n const contentText = content.find(c => c.type === 'text')?.text\n return contentText ?? null;\n }\n\n return null\n}\n"],"mappings":"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","names":["index_exports","__export","CustomEventNames","LangGraphAgent","LangGraphEventTypes","LangGraphHttpAgent","__toCommonJS","import_client","import_rxjs","import_langgraph_sdk","import_node_crypto","LangGraphEventTypes","CustomEventNames","import_client","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","resolveMessageContent","content","tc","aguiMessagesToLangChain","index","_b","item","resolveReasoningContent","eventData","_c","_d","_e","data","contentText","c","LangGraphAgent","config","_a","_b","DEFAULT_SCHEMA_KEYS","LangGraphClient","__spreadValues","event","input","subscriber","_c","threadId","streamMode","preparedStream","__spreadProps","messageCheckpoint","tools","timeTravelCheckpoint","fork","_d","_e","_f","_g","_h","inputThreadId","inputState","messages","context","forwardedProps","nodeNameInput","thread","agentState","agentStateMessages","inputMessagesToLangchain","aguiMessagesToLangChain","stateValuesDiff","threadState","stateValues","m","lastUserMessage","i","mode","nodeBefore","e","payloadInput","getStreamPayloadInput","payloadConfig","configsToMerge","payload","interrupts","interrupt","stream","_i","_j","shouldExit","streamResponse","state","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","chunk","chunkData","metadata","currentNodeName","eventType","node","tasks","isEndNode","writes","newNodeName","langchainMessagesToAgui","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","reasoningData","resolveReasoningContent","messageContent","resolveMessageContent","isMessageContentEvent","isMessageEndEvent","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","graphSchema","configSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","newMessages","langGraphTools","tool","nodeName","messageId","checkpoint","options","reversed","targetState","targetStateMessages","messageIndex","targetStateIndex","targetStateValuesWithoutMessages","__objRest","selectedCheckpoint","LangGraphHttpAgent"]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
- var pt=Object.defineProperty,mt=Object.defineProperties;var Et=Object.getOwnPropertyDescriptors;var Z=Object.getOwnPropertySymbols;var St=Object.prototype.hasOwnProperty,vt=Object.prototype.propertyIsEnumerable;var tt=(a,t)=>(t=Symbol[a])?t:Symbol.for("Symbol."+a);var et=(a,t,e)=>t in a?pt(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e,p=(a,t)=>{for(var e in t||(t={}))St.call(t,e)&&et(a,e,t[e]);if(Z)for(var e of Z(t))vt.call(t,e)&&et(a,e,t[e]);return a},f=(a,t)=>mt(a,Et(t));var nt=(a,t,e)=>(t=a[tt("asyncIterator")])?t.call(a):(a=a[tt("iterator")](),t={},e=(s,n)=>(n=a[s])&&(t[s]=r=>new Promise((c,h,l)=>(r=n.call(a,r),l=r.done,Promise.resolve(r.value).then(E=>c({value:E,done:l}),h)))),e("next"),e("return"),t);import{HttpAgent as Ct}from"@ag-ui/client";import{Observable as _t}from"rxjs";import{Client as Tt}from"@langchain/langgraph-sdk";import{randomUUID as Mt}from"crypto";import{RemoveMessage as Rt}from"@langchain/core/messages";var ft=(d=>(d.OnChainStart="on_chain_start",d.OnChainStream="on_chain_stream",d.OnChainEnd="on_chain_end",d.OnChatModelStart="on_chat_model_start",d.OnChatModelStream="on_chat_model_stream",d.OnChatModelEnd="on_chat_model_end",d.OnToolStart="on_tool_start",d.OnToolEnd="on_tool_end",d.OnCustomEvent="on_custom_event",d.OnInterrupt="on_interrupt",d))(ft||{}),yt=(n=>(n.ManuallyEmitMessage="manually_emit_message",n.ManuallyEmitToolCall="manually_emit_tool_call",n.ManuallyEmitState="manually_emit_state",n.Exit="exit",n))(yt||{});import{AbstractAgent as It,EventType as i}from"@ag-ui/client";var P=["tools"];function O(a,t){return Object.fromEntries(Object.entries(a).filter(([e])=>t.includes(e)))}function st({mode:a,state:t,schemaKeys:e}){let s=a==="start"?t:null;return s&&(e!=null&&e.input)&&(s=O(s,[...P,...e.input])),s}function at(a){return a.map(t=>{var e;switch(t.type){case"human":return{id:t.id,role:"user",content:k(M(t.content))};case"ai":let s=M(t.content);return{id:t.id,role:"assistant",content:s?k(s):"",toolCalls:(e=t.tool_calls)==null?void 0:e.map(n=>({id:n.id,type:"function",function:{name:n.name,arguments:JSON.stringify(n.args)}}))};case"system":return{id:t.id,role:"system",content:k(M(t.content))};case"tool":return{id:t.id,role:"tool",content:k(M(t.content)),toolCallId:t.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function it(a){return a.map((t,e)=>{var s,n;switch(t.role){case"user":return{id:t.id,role:t.role,content:t.content,type:"human"};case"assistant":return{id:t.id,type:"ai",role:t.role,content:(s=t.content)!=null?s:"",tool_calls:((n=t.toolCalls)!=null?n:[]).map(r=>({id:r.id,name:r.function.name,args:JSON.parse(r.function.arguments),type:"tool_call"}))};case"system":return{id:t.id,role:t.role,content:t.content,type:"system"};case"tool":return{content:t.content,role:t.role,type:t.role,tool_call_id:t.toolCallId,id:t.id};default:throw console.error(`Message role ${t.role} is not implemented`),new Error("message role is not supported.")}})}function k(a){return typeof a=="string"?a:JSON.stringify(a)}function rt(a){var e,s,n,r,c;let t=(e=a.chunk)==null?void 0:e.content;if(t&&Array.isArray(t)&&t.length&&t[0])return t[0].thinking?{text:t[0].thinking,type:"text",index:t[0].index}:null;if((r=(n=(s=a.chunk.additional_kwargs)==null?void 0:s.reasoning)==null?void 0:n.summary)!=null&&r[0]){let h=(c=a.chunk.additional_kwargs)==null?void 0:c.reasoning.summary[0];return!h||!h.text?null:{type:"text",text:h.text,index:h.index}}return null}function M(a){var t;if(!a)return null;if(typeof a=="string")return a;if(Array.isArray(a)&&a.length){let e=(t=a.find(s=>s.type==="text"))==null?void 0:t.text;return e!=null?e:null}return null}var ot=class extends It{constructor(t){var e,s;super(t),this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(s=t==null?void 0:t.client)!=null?s:new Tt({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:p({},(e=t.propertyHeaders)!=null?e:{})})}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return this.activeRun={id:t.runId,threadId:t.threadId},new _t(e=>(this.handleStreamEvents(t,e),()=>{}))}async handleStreamEvents(t,e){var K,U,J,X,F,j,B,$,Y,V,W,q,z;let{threadId:s,state:n,messages:r,tools:c,context:h,forwardedProps:l}=t;this.subscriber=e;let E=!1;this.activeRun.manuallyEmittedState=null;let d=l==null?void 0:l.nodeName;this.activeRun.nodeName=d,this.activeRun.nodeName==="__end__"&&(this.activeRun.nodeName=void 0);let o=s!=null?s:Mt();this.assistant||(this.assistant=await this.getAssistant());let v=await this.getOrCreateThread(o,l==null?void 0:l.threadMetadata);this.activeRun.threadId=v.thread_id;let g=(K=await this.client.threads.getState(v.thread_id))!=null?K:{values:{}},w=g.values,L=it(r);n.messages=w.messages,n=this.langGraphDefaultMergeState(n,L,c);let N=await this.client.assistants.getGraph(this.assistant.assistant_id),x=o&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(x==="continue"&&!((U=l==null?void 0:l.command)!=null&&U.resume)){let u=N.edges.find(y=>y.target===this.activeRun.nodeName);await this.client.threads.updateState(o,{values:n,asNode:u==null?void 0:u.source})}this.activeRun.schemaKeys=await this.getSchemaKeys();let R=st({mode:x,state:n,schemaKeys:this.activeRun.schemaKeys}),I,C=[this.assistantConfig,l==null?void 0:l.config].filter(Boolean);C.length&&(I=await this.mergeConfigs({configs:C,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let A=f(p({},l),{streamMode:(J=l==null?void 0:l.streamMode)!=null?J:["events","values","updates"],input:R,config:I}),S=(j=(F=(X=g.tasks)==null?void 0:X[0])==null?void 0:F.interrupts)!=null?j:[];if(S!=null&&S.length&&!((B=l==null?void 0:l.command)!=null&&B.resume))return this.dispatchEvent({type:i.RUN_STARTED,threadId:o,runId:t.runId}),S.forEach(u=>{this.dispatchEvent({type:i.CUSTOM,name:"on_interrupt",value:typeof u.value=="string"?u.value:JSON.stringify(u.value),rawEvent:u})}),this.dispatchEvent({type:i.RUN_FINISHED,threadId:o,runId:t.runId}),e.complete();let dt=this.client.runs.stream(o,this.assistant.assistant_id,A);this.activeRun.prevNodeName=null;let H={},G=n;try{this.dispatchEvent({type:i.RUN_STARTED,threadId:o,runId:this.activeRun.id});try{for(var Te=nt(dt),Me,Re,Ie;Me=!(Re=await Te.next()).done;Me=!1){let m=Re.value;if(!A.streamMode.includes(m.event))continue;let D=m;if(m.event==="error"){this.dispatchEvent({type:i.RUN_ERROR,message:m.data.message,rawEvent:m});break}if(m.event==="updates")continue;if(m.event==="values"){H=D.data;continue}let _=D.data,T=_.metadata.langgraph_node,Q=_.event,ct=_.metadata;if(this.activeRun.id=ct.run_id,T&&T!==this.activeRun.nodeName&&(this.activeRun.nodeName&&this.activeRun.nodeName!==d&&this.endStep(),this.startStep(T)),E=E||Q==="on_custom_event"&&_.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===T&&Q==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),N.nodes.some(ut=>ut.id===T)&&(this.activeRun.nodeName=T),G=($=this.activeRun.manuallyEmittedState)!=null?$:H,!this.activeRun.nodeName)continue;(JSON.stringify(G)!==JSON.stringify(n)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(n=G,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:i.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(n),rawEvent:D})),this.dispatchEvent({type:i.RAW,event:_}),this.handleSingleEvent(_,n)}}catch(Re){Ie=[Re]}finally{try{Me&&(Re=Te.return)&&await Re.call(Te)}finally{if(Ie)throw Ie[0]}}n=await this.client.threads.getState(o);let u=n.tasks,y=(V=(Y=u==null?void 0:u[0])==null?void 0:Y.interrupts)!=null?V:[],ht=n.next.length===0,gt=(W=n.metadata.writes)!=null?W:{},b=this.activeRun.nodeName;return y!=null&&y.length||(b=ht?"__end__":(q=n.next[0])!=null?q:Object.keys(gt)[0]),y.forEach(m=>{this.dispatchEvent({type:i.CUSTOM,name:"on_interrupt",value:typeof m.value=="string"?m.value:JSON.stringify(m.value),rawEvent:m})}),this.activeRun.nodeName!=b&&(this.endStep(),this.startStep(b)),this.endStep(),this.dispatchEvent({type:i.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(n.values)}),this.dispatchEvent({type:i.MESSAGES_SNAPSHOT,messages:at((z=n.values.messages)!=null?z:[])}),this.dispatchEvent({type:i.RUN_FINISHED,threadId:o,runId:this.activeRun.id}),this.activeRun=void 0,e.complete()}catch(u){return e.error(u)}}handleSingleEvent(t,e){var s,n,r,c,h,l;switch(t.event){case"on_chat_model_stream":let E=(s=t.metadata["emit-messages"])!=null?s:!0,d=(n=t.metadata["emit-tool-calls"])!=null?n:!0;if(t.data.chunk.response_metadata.finish_reason)return;let o=this.getMessageInProgress(this.activeRun.id),v=!!(o!=null&&o.id),g=(r=t.data.chunk.tool_call_chunks)==null?void 0:r[0],w=(c=t.metadata.predict_state)==null?void 0:c.some(S=>S.tool===(g==null?void 0:g.name)),L=!v&&(g==null?void 0:g.name),N=v&&(o==null?void 0:o.toolCallId)&&(g==null?void 0:g.args),x=v&&(o==null?void 0:o.toolCallId)&&!g,R=rt(t.data),I=M(t.data.chunk.content),C=!!(!g&&I),A=v&&!(o!=null&&o.toolCallId)&&!C;if(R){this.handleThinkingEvent(R);break}if(!R&&this.thinkingProcess&&(this.dispatchEvent({type:i.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:i.THINKING_END}),this.thinkingProcess=null),w&&this.dispatchEvent({type:i.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),x){this.dispatchEvent({type:i.TOOL_CALL_END,toolCallId:o==null?void 0:o.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(A){this.dispatchEvent({type:i.TEXT_MESSAGE_END,messageId:o.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(L&&d){this.dispatchEvent({type:i.TOOL_CALL_START,toolCallId:g.id,toolCallName:g.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:g.id,toolCallName:g.name});break}if(N&&d){this.dispatchEvent({type:i.TOOL_CALL_ARGS,toolCallId:o==null?void 0:o.toolCallId,delta:g.args,rawEvent:t});break}if(C&&E){o||(this.dispatchEvent({type:i.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.chunk.id,rawEvent:t}),this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:null,toolCallName:null}),o=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:i.TEXT_MESSAGE_CONTENT,messageId:o.id,delta:I,rawEvent:t});break}break;case"on_chat_model_end":if((h=this.getMessageInProgress(this.activeRun.id))!=null&&h.toolCallId){this.dispatchEvent({type:i.TOOL_CALL_END,toolCallId:this.getMessageInProgress(this.activeRun.id).toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if((l=this.getMessageInProgress(this.activeRun.id))!=null&&l.id){this.dispatchEvent({type:i.TEXT_MESSAGE_END,messageId:this.getMessageInProgress(this.activeRun.id).id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}break;case"on_custom_event":if(t.name==="manually_emit_message"){this.dispatchEvent({type:i.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:i.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:i.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:i.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:i.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:i.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:i.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(e),rawEvent:t})),this.dispatchEvent({type:i.CUSTOM,name:t.name,value:t.data,rawEvent:t});break}}handleThinkingEvent(t){var s;if(!t||!t.type||!t.text)return;let e=t.index;(s=this.thinkingProcess)!=null&&s.index&&this.thinkingProcess.index!==e&&(this.thinkingProcess.type&&this.dispatchEvent({type:i.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:i.THINKING_END}),this.thinkingProcess=null),this.thinkingProcess||(this.dispatchEvent({type:i.THINKING_START}),this.thinkingProcess={index:e}),this.thinkingProcess.type!==t.type&&(this.dispatchEvent({type:i.THINKING_TEXT_MESSAGE_START}),this.thinkingProcess.type=t.type),this.thinkingProcess.type&&this.dispatchEvent({type:i.THINKING_TEXT_MESSAGE_CONTENT,delta:t.text})}getStateSnapshot(t){let e=this.activeRun.schemaKeys;return e!=null&&e.output&&(t=O(t,[...P,...e.output])),t}async getOrCreateThread(t,e){let s;try{try{s=await this.getThread(t)}catch(n){s=await this.createThread({threadId:t,metadata:e})}}catch(n){throw new Error(`Failed to create thread: ${n.message}`)}return s}async getThread(t){return this.client.threads.get(t)}async createThread(t){return this.client.threads.create(t)}async mergeConfigs({configs:t,assistant:e,schemaKeys:s}){return t.reduce((n,r)=>{var o;let c=n.configurable;r.configurable&&(c=s!=null&&s.config?O(r==null?void 0:r.configurable,[...P,...(o=s==null?void 0:s.config)!=null?o:[]]):r==null?void 0:r.configurable);let h=f(p(p({},n),r),{configurable:c}),l=n.recursion_limit==null&&r.recursion_limit===25,E=JSON.stringify(h)!==JSON.stringify(n),d=l&&JSON.stringify(f(p({},h),{recursion_limit:null}))===JSON.stringify(f(p({},n),{recursion_limit:null}));return E&&!d?p(p({},n),h):n},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=f(p({},this.messagesInProcess),{[t]:p(p({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(s=>s.graph_id===this.graphId);if(!e)throw console.error(`
1
+ var ot=Object.defineProperty,lt=Object.defineProperties;var ht=Object.getOwnPropertyDescriptors;var B=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var W=(a,s)=>(s=Symbol[a])?s:Symbol.for("Symbol."+a);var Y=(a,s,t)=>s in a?ot(a,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[s]=t,m=(a,s)=>{for(var t in s||(s={}))q.call(s,t)&&Y(a,t,s[t]);if(B)for(var t of B(s))z.call(s,t)&&Y(a,t,s[t]);return a},S=(a,s)=>lt(a,ht(s));var Q=(a,s)=>{var t={};for(var e in a)q.call(a,e)&&s.indexOf(e)<0&&(t[e]=a[e]);if(a!=null&&B)for(var e of B(a))s.indexOf(e)<0&&z.call(a,e)&&(t[e]=a[e]);return t};var Z=(a,s,t)=>(s=a[W("asyncIterator")])?s.call(a):(a=a[W("iterator")](),s={},t=(e,n)=>(n=a[e])&&(s[e]=i=>new Promise((l,o,c)=>(i=n.call(a,i),c=i.done,Promise.resolve(i.value).then(h=>l({value:h,done:c}),o)))),t("next"),t("return"),s);import{HttpAgent as mt}from"@ag-ui/client";import{Observable as ct}from"rxjs";import{Client as ut}from"@langchain/langgraph-sdk";import{randomUUID as nt}from"crypto";var dt=(g=>(g.OnChainStart="on_chain_start",g.OnChainStream="on_chain_stream",g.OnChainEnd="on_chain_end",g.OnChatModelStart="on_chat_model_start",g.OnChatModelStream="on_chat_model_stream",g.OnChatModelEnd="on_chat_model_end",g.OnToolStart="on_tool_start",g.OnToolEnd="on_tool_end",g.OnCustomEvent="on_custom_event",g.OnInterrupt="on_interrupt",g))(dt||{}),gt=(n=>(n.ManuallyEmitMessage="manually_emit_message",n.ManuallyEmitToolCall="manually_emit_tool_call",n.ManuallyEmitState="manually_emit_state",n.Exit="exit",n))(gt||{});import{AbstractAgent as pt,EventType as d}from"@ag-ui/client";var F=["messages","tools"];function X(a,s){return Object.fromEntries(Object.entries(a).filter(([t])=>s.includes(t)))}function tt({mode:a,state:s,schemaKeys:t}){let e=a==="start"?s:null;return e&&(t!=null&&t.input)&&(e=X(e,[...F,...t.input])),e}function et(a){return a.map(s=>{var t;switch(s.type){case"human":return{id:s.id,role:"user",content:J(w(s.content))};case"ai":let e=w(s.content);return{id:s.id,role:"assistant",content:e?J(e):"",toolCalls:(t=s.tool_calls)==null?void 0:t.map(n=>({id:n.id,type:"function",function:{name:n.name,arguments:JSON.stringify(n.args)}}))};case"system":return{id:s.id,role:"system",content:J(w(s.content))};case"tool":return{id:s.id,role:"tool",content:J(w(s.content)),toolCallId:s.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function j(a){return a.map((s,t)=>{var e,n;switch(s.role){case"user":return{id:s.id,role:s.role,content:s.content,type:"human"};case"assistant":return{id:s.id,type:"ai",role:s.role,content:(e=s.content)!=null?e:"",tool_calls:((n=s.toolCalls)!=null?n:[]).map(i=>({id:i.id,name:i.function.name,args:JSON.parse(i.function.arguments),type:"tool_call"}))};case"system":return{id:s.id,role:s.role,content:s.content,type:"system"};case"tool":return{content:s.content,role:s.role,type:s.role,tool_call_id:s.toolCallId,id:s.id};default:throw console.error(`Message role ${s.role} is not implemented`),new Error("message role is not supported.")}})}function J(a){return typeof a=="string"?a:JSON.stringify(a)}function st(a){var t,e,n,i,l;let s=(t=a.chunk)==null?void 0:t.content;if(s&&Array.isArray(s)&&s.length&&s[0])return s[0].thinking?{text:s[0].thinking,type:"text",index:s[0].index}:null;if((i=(n=(e=a.chunk.additional_kwargs)==null?void 0:e.reasoning)==null?void 0:n.summary)!=null&&i[0]){let o=(l=a.chunk.additional_kwargs)==null?void 0:l.reasoning.summary[0];return!o||!o.text?null:{type:"text",text:o.text,index:o.index}}return null}function w(a){var s;if(!a)return null;if(typeof a=="string")return a;if(Array.isArray(a)&&a.length){let t=(s=a.find(e=>e.type==="text"))==null?void 0:s.text;return t!=null?t:null}return null}var at=class extends pt{constructor(t){var e,n;super(t);this.constantSchemaKeys=F;this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(n=t==null?void 0:t.client)!=null?n:new ut({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:m({},(e=t.propertyHeaders)!=null?e:{})})}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return new ct(e=>(this.runAgentStream(t,e),()=>{}))}async runAgentStream(t,e){var o,c,h;this.activeRun={id:t.runId,threadId:t.threadId},this.subscriber=e,this.assistant||(this.assistant=await this.getAssistant());let n=(o=t.threadId)!=null?o:nt(),i=(h=(c=t.forwardedProps)==null?void 0:c.streamMode)!=null?h:["events","values","updates"],l=await this.prepareStream(S(m({},t),{threadId:n}),i);if(!l)return e.error("No stream to regenerate");await this.handleStreamEvents(l,n,e,t,i)}async prepareRegenerateStream(t,e){var h,g;let{threadId:n,messageCheckpoint:i,tools:l}=t,o=await this.getCheckpointByMessage(i.id,n);if(this.assistant||(this.assistant=await this.getAssistant()),!o)return this.subscriber.error("No checkpoint found for message");let c=await this.client.threads.updateState(n,{values:this.langGraphDefaultMergeState(o.values,[],l),checkpointId:o.checkpoint.checkpoint_id,asNode:(g=(h=o.next)==null?void 0:h[0])!=null?g:"__start__"});return{streamResponse:this.client.runs.stream(n,this.assistant.assistant_id,{input:this.langGraphDefaultMergeState(o.values,[i],l),checkpointId:c.checkpoint.checkpoint_id,streamMode:e}),state:o,streamMode:e}}async prepareStream(t,e){var G,L,b,C,k,H,U,P;let{threadId:n,state:i,messages:l,tools:o,context:c,forwardedProps:h}=t;this.activeRun.manuallyEmittedState=null;let g=h==null?void 0:h.nodeName;this.activeRun.nodeName=g,this.activeRun.nodeName==="__end__"&&(this.activeRun.nodeName=void 0);let r=n!=null?n:nt();this.assistant||(this.assistant=await this.getAssistant());let E=await this.getOrCreateThread(r,h==null?void 0:h.threadMetadata);this.activeRun.threadId=E.thread_id;let p=(G=await this.client.threads.getState(E.thread_id))!=null?G:{values:{}},T=(L=p.values.messages)!=null?L:[],M=j(l),v=this.langGraphDefaultMergeState(S(m({},i),{messages:T}),M,o),y=S(m({},p),{values:S(m({},v),{messages:[...T,...v.messages]})}),I=y.values;if(this.activeRun.schemaKeys=await this.getSchemaKeys(),((b=p.values.messages)!=null?b:[]).length>l.filter(u=>u.role!=="system").length){let u=null;for(let _=l.length-1;_>=0;_--)if(l[_].role==="user"){u=j([l[_]])[0];break}return u?this.prepareRegenerateStream(S(m({},t),{messageCheckpoint:u}),e):this.subscriber.error("No user message found in messages to regenerate")}this.activeRun.graphInfo=await this.client.assistants.getGraph(this.assistant.assistant_id);let R=!((C=h==null?void 0:h.command)!=null&&C.resume)&&r&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(R==="continue"){let u=this.activeRun.graphInfo.edges.find(_=>_.target===this.activeRun.nodeName);await this.client.threads.updateState(r,{values:i,asNode:u==null?void 0:u.source})}let N=tt({mode:R,state:I,schemaKeys:this.activeRun.schemaKeys}),A,f=[this.assistantConfig,h==null?void 0:h.config].filter(Boolean);f.length&&(A=await this.mergeConfigs({configs:f,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let K=S(m({},h),{streamMode:e,input:N,config:A}),x=(U=(H=(k=p.tasks)==null?void 0:k[0])==null?void 0:H.interrupts)!=null?U:[];return x!=null&&x.length&&!((P=h==null?void 0:h.command)!=null&&P.resume)?(this.dispatchEvent({type:d.RUN_STARTED,threadId:r,runId:t.runId}),x.forEach(u=>{this.dispatchEvent({type:d.CUSTOM,name:"on_interrupt",value:typeof u.value=="string"?u.value:JSON.stringify(u.value),rawEvent:u})}),this.dispatchEvent({type:d.RUN_FINISHED,threadId:r,runId:t.runId}),this.subscriber.complete()):{streamResponse:this.client.runs.stream(r,this.assistant.assistant_id,K),state:y}}async handleStreamEvents(t,e,n,i,l){var T,M,v,y,f,K,x,G,L,b;let{forwardedProps:o}=i,c=o==null?void 0:o.nodeName;this.subscriber=n;let h=!1;if(!t)return;let{streamResponse:g,state:r}=t;this.activeRun.prevNodeName=null;let E={},p=r;try{this.dispatchEvent({type:d.RUN_STARTED,threadId:e,runId:this.activeRun.id}),(T=o==null?void 0:o.command)!=null&&T.resume&&this.activeRun.nodeName&&this.startStep(this.activeRun.nodeName);try{for(var I=Z(g),R,N,A;R=!(N=await I.next()).done;R=!1){let u=N.value;if(!l.includes(u.event))continue;let _=u;if(u.event==="error"){this.dispatchEvent({type:d.RUN_ERROR,message:u.data.message,rawEvent:u});break}if(u.event==="updates")continue;if(u.event==="values"){E=_.data;continue}let D=_.data,$=(M=D.metadata)!=null?M:{},O=$.langgraph_node,V=D.event;if(this.activeRun.id=$.run_id,O&&O!==this.activeRun.nodeName&&(this.activeRun.nodeName&&this.activeRun.nodeName!==c&&this.endStep(),this.startStep(O)),h=h||V==="on_custom_event"&&D.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===O&&V==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),(v=this.activeRun.graphInfo)!=null&&v.nodes.some(rt=>rt.id===O)&&(this.activeRun.nodeName=O),p.values=(y=this.activeRun.manuallyEmittedState)!=null?y:E,!this.activeRun.nodeName)continue;(JSON.stringify(p)!==JSON.stringify(r)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(r=p,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:d.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(r),rawEvent:_})),this.dispatchEvent({type:d.RAW,event:D}),this.handleSingleEvent(D)}}catch(N){A=[N]}finally{try{R&&(N=I.return)&&await N.call(I)}finally{if(A)throw A[0]}}r=await this.client.threads.getState(e);let C=r.tasks,k=(K=(f=C==null?void 0:C[0])==null?void 0:f.interrupts)!=null?K:[],H=r.next.length===0,U=(G=(x=r.metadata)==null?void 0:x.writes)!=null?G:{},P=this.activeRun.nodeName;return k!=null&&k.length||(P=H?"__end__":(L=r.next[0])!=null?L:Object.keys(U)[0]),k.forEach(u=>{this.dispatchEvent({type:d.CUSTOM,name:"on_interrupt",value:typeof u.value=="string"?u.value:JSON.stringify(u.value),rawEvent:u})}),this.activeRun.nodeName!=P&&(this.endStep(),this.startStep(P)),this.endStep(),this.dispatchEvent({type:d.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(r.values)}),this.dispatchEvent({type:d.MESSAGES_SNAPSHOT,messages:et((b=r.values.messages)!=null?b:[])}),this.dispatchEvent({type:d.RUN_FINISHED,threadId:e,runId:this.activeRun.id}),this.activeRun=void 0,n.complete()}catch(C){return n.error(C)}}handleSingleEvent(t){var e,n,i,l,o,c;switch(t.event){case"on_chat_model_stream":let h=(e=t.metadata["emit-messages"])!=null?e:!0,g=(n=t.metadata["emit-tool-calls"])!=null?n:!0;if(t.data.chunk.response_metadata.finish_reason)return;let r=this.getMessageInProgress(this.activeRun.id),E=!!(r!=null&&r.id),p=(i=t.data.chunk.tool_call_chunks)==null?void 0:i[0],T=(l=t.metadata.predict_state)==null?void 0:l.some(f=>f.tool===(p==null?void 0:p.name)),M=!E&&(p==null?void 0:p.name),v=E&&(r==null?void 0:r.toolCallId)&&(p==null?void 0:p.args),y=E&&(r==null?void 0:r.toolCallId)&&!p,I=st(t.data),R=w(t.data.chunk.content),N=!!(!p&&R),A=E&&!(r!=null&&r.toolCallId)&&!N;if(I){this.handleThinkingEvent(I);break}if(!I&&this.thinkingProcess&&(this.dispatchEvent({type:d.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:d.THINKING_END}),this.thinkingProcess=null),T&&this.dispatchEvent({type:d.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),y){this.dispatchEvent({type:d.TOOL_CALL_END,toolCallId:r==null?void 0:r.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(A){this.dispatchEvent({type:d.TEXT_MESSAGE_END,messageId:r.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(M&&g){this.dispatchEvent({type:d.TOOL_CALL_START,toolCallId:p.id,toolCallName:p.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:p.id,toolCallName:p.name});break}if(v&&g){this.dispatchEvent({type:d.TOOL_CALL_ARGS,toolCallId:r==null?void 0:r.toolCallId,delta:p.args,rawEvent:t});break}if(N&&h){r||(this.dispatchEvent({type:d.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.chunk.id,rawEvent:t}),this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:null,toolCallName:null}),r=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:d.TEXT_MESSAGE_CONTENT,messageId:r.id,delta:R,rawEvent:t});break}break;case"on_chat_model_end":if((o=this.getMessageInProgress(this.activeRun.id))!=null&&o.toolCallId){this.dispatchEvent({type:d.TOOL_CALL_END,toolCallId:this.getMessageInProgress(this.activeRun.id).toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if((c=this.getMessageInProgress(this.activeRun.id))!=null&&c.id){this.dispatchEvent({type:d.TEXT_MESSAGE_END,messageId:this.getMessageInProgress(this.activeRun.id).id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}break;case"on_custom_event":if(t.name==="manually_emit_message"){this.dispatchEvent({type:d.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:d.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:d.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:d.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:d.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:d.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:d.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(this.activeRun.manuallyEmittedState),rawEvent:t})),this.dispatchEvent({type:d.CUSTOM,name:t.name,value:t.data,rawEvent:t});break}}handleThinkingEvent(t){var n;if(!t||!t.type||!t.text)return;let e=t.index;(n=this.thinkingProcess)!=null&&n.index&&this.thinkingProcess.index!==e&&(this.thinkingProcess.type&&this.dispatchEvent({type:d.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:d.THINKING_END}),this.thinkingProcess=null),this.thinkingProcess||(this.dispatchEvent({type:d.THINKING_START}),this.thinkingProcess={index:e}),this.thinkingProcess.type!==t.type&&(this.dispatchEvent({type:d.THINKING_TEXT_MESSAGE_START}),this.thinkingProcess.type=t.type),this.thinkingProcess.type&&this.dispatchEvent({type:d.THINKING_TEXT_MESSAGE_CONTENT,delta:t.text})}getStateSnapshot(t){let e=this.activeRun.schemaKeys;return e!=null&&e.output&&(t=X(t,[...this.constantSchemaKeys,...e.output])),t}async getOrCreateThread(t,e){let n;try{try{n=await this.getThread(t)}catch(i){n=await this.createThread({threadId:t,metadata:e})}}catch(i){throw new Error(`Failed to create thread: ${i.message}`)}return n}async getThread(t){return this.client.threads.get(t)}async createThread(t){return this.client.threads.create(t)}async mergeConfigs({configs:t,assistant:e,schemaKeys:n}){return t.reduce((i,l)=>{var E;let o=i.configurable;l.configurable&&(o=n!=null&&n.config?X(l==null?void 0:l.configurable,[...this.constantSchemaKeys,...(E=n==null?void 0:n.config)!=null?E:[]]):l==null?void 0:l.configurable);let c=S(m(m({},i),l),{configurable:o}),h=i.recursion_limit==null&&l.recursion_limit===25,g=JSON.stringify(c)!==JSON.stringify(i),r=h&&JSON.stringify(S(m({},c),{recursion_limit:null}))===JSON.stringify(S(m({},i),{recursion_limit:null}));return g&&!r?m(m({},i),c):i},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=S(m({},this.messagesInProcess),{[t]:m(m({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(n=>n.graph_id===this.graphId);if(!e)throw console.error(`
2
2
  No agent found with graph ID ${this.graphId} found..
3
3
 
4
4
 
5
- These are the available agents: [${t.map(s=>`${s.graph_id} (ID: ${s.assistant_id})`).join(", ")}]
6
- `),new Error("No agent id found");return e}async getSchemaKeys(){var e,s,n;let t=["messages"];try{let r=await this.client.assistants.getSchemas(this.assistant.assistant_id),c=null;if((e=r.config_schema)!=null&&e.properties&&(c=Object.keys(r.config_schema.properties)),!((s=r.input_schema)!=null&&s.properties)||!((n=r.output_schema)!=null&&n.properties))return{config:[],input:t,output:t};let h=Object.keys(r.input_schema.properties),l=Object.keys(r.output_schema.properties);return{input:h&&h.length?[...h,...t]:null,output:l&&l.length?[...l,...t]:null,config:c}}catch(r){return{config:[],input:t,output:t}}}langGraphDefaultMergeState(t,e,s){var E;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let n=t.messages||[],r=new Set(n.map(d=>d.id)),c=new Set(e.map(d=>d.id)),h=[];e.length<n.length&&(h=n.filter(d=>!c.has(d.id)).map(d=>new Rt({id:d.id})));let l=e.filter(d=>!r.has(d.id));return f(p({},t),{messages:[...h,...l],tools:[...(E=t.tools)!=null?E:[],...s]})}startStep(t){this.dispatchEvent({type:i.STEP_STARTED,stepName:t}),this.activeRun.nodeName=t}endStep(){if(!this.activeRun.nodeName)throw new Error("No active step to end");this.dispatchEvent({type:i.STEP_FINISHED,stepName:this.activeRun.nodeName}),this.activeRun.nodeName=void 0}};var lt=class extends Ct{};export{yt as CustomEventNames,ot as LangGraphAgent,ft as LangGraphEventTypes,lt as LangGraphHttpAgent};
5
+ These are the available agents: [${t.map(n=>`${n.graph_id} (ID: ${n.assistant_id})`).join(", ")}]
6
+ `),new Error("No agent id found");return e}async getSchemaKeys(){var t,e,n;try{let i=await this.client.assistants.getSchemas(this.assistant.assistant_id),l=null;if((t=i.config_schema)!=null&&t.properties&&(l=Object.keys(i.config_schema.properties)),!((e=i.input_schema)!=null&&e.properties)||!((n=i.output_schema)!=null&&n.properties))return{config:[],input:null,output:null};let o=Object.keys(i.input_schema.properties),c=Object.keys(i.output_schema.properties);return{input:o&&o.length?[...o,...this.constantSchemaKeys]:null,output:c&&c.length?[...c,...this.constantSchemaKeys]:null,config:l}}catch(i){return{config:[],input:this.constantSchemaKeys,output:this.constantSchemaKeys}}}langGraphDefaultMergeState(t,e,n){var h;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let i=t.messages||[],l=new Set(i.map(g=>g.id)),o=e.filter(g=>!l.has(g.id)),c=[...(h=t.tools)!=null?h:[],...n!=null?n:[]].map(g=>g.type?g:{type:"function",function:{name:g.name,description:g.description,parameters:g.parameters}});return S(m({},t),{messages:o,tools:c})}startStep(t){this.dispatchEvent({type:d.STEP_STARTED,stepName:t}),this.activeRun.nodeName=t}endStep(){if(!this.activeRun.nodeName)throw new Error("No active step to end");this.dispatchEvent({type:d.STEP_FINISHED,stepName:this.activeRun.nodeName}),this.activeRun.nodeName=void 0}async getCheckpointByMessage(t,e,n){var v,I;let i=n!=null&&n.checkpoint_id?{checkpoint:{checkpoint_id:n.checkpoint_id}}:void 0,o=[...await this.client.threads.getHistory(e,i)].reverse(),c=o.find(R=>{var N;return(N=R.values.messages)==null?void 0:N.some(A=>A.id===t)});if(!c)throw new Error("Message not found");let h=(v=c.values.messages)!=null?v:[],g=h.findIndex(R=>R.id===t);if(h.slice(g+1).length)return this.getCheckpointByMessage(t,e,c.parent_checkpoint);let E=o.indexOf(c),y=c.values,{messages:p}=y,T=Q(y,["messages"]),M=(I=o[E-1])!=null?I:S(m({},c),{values:{}});return S(m({},M),{values:m(m({},M.values),T)})}};var it=class extends mt{};export{gt as CustomEventNames,at as LangGraphAgent,dt as LangGraphEventTypes,it as LangGraphHttpAgent};
7
7
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/types.ts","../src/utils.ts"],"sourcesContent":["import { HttpAgent } from \"@ag-ui/client\";\n\nexport * from './agent'\nexport class LangGraphHttpAgent extends HttpAgent {}","import { Observable, Subscriber } from \"rxjs\";\nimport {\n Client as LangGraphClient,\n EventsStreamEvent,\n StreamMode,\n Config as LangGraphConfig,\n ThreadState,\n Assistant,\n Message as LangGraphMessage,\n Config,\n Interrupt,\n Thread\n} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport { RemoveMessage } from \"@langchain/core/messages\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n ThinkingInProgress,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\n LangGraphReasoning\n} from \"./types\";\nimport {\n AbstractAgent,\n AgentConfig,\n CustomEvent,\n EventType,\n MessagesSnapshotEvent,\n RawEvent,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateDeltaEvent,\n StateSnapshotEvent,\n StepFinishedEvent,\n StepStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ThinkingTextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingStartEvent,\n ThinkingEndEvent,\n} from \"@ag-ui/client\";\nimport { RunsStreamPayload } from \"@langchain/langgraph-sdk/dist/types\";\nimport {\n aguiMessagesToLangChain,\n DEFAULT_SCHEMA_KEYS,\n filterObjectBySchemaKeys,\n getStreamPayloadInput,\n langchainMessagesToAgui,\n resolveMessageContent,\n resolveReasoningContent\n} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ThinkingTextMessageStartEvent\n | ThinkingTextMessageContentEvent\n | ThinkingTextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\n | ThinkingStartEvent\n | ThinkingEndEvent\n | StateSnapshotEvent\n | StateDeltaEvent\n | MessagesSnapshotEvent\n | RawEvent\n | CustomEvent\n | RunStartedEvent\n | RunFinishedEvent\n | RunErrorEvent\n | StepStartedEvent\n | StepFinishedEvent;\n\ntype RunAgentExtendedInput<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n> = Omit<RunAgentInput, \"forwardedProps\"> & {\n forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, \"input\"> & {\n nodeName?: string;\n threadMetadata?: Record<string, any>;\n };\n};\n\nexport interface LangGraphAgentConfig extends AgentConfig {\n client?: LangGraphClient;\n deploymentUrl: string;\n langsmithApiKey?: string;\n propertyHeaders?: Record<string, string>;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n}\n\nexport class LangGraphAgent extends AbstractAgent {\n client: LangGraphClient;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n assistant?: Assistant;\n messagesInProcess: MessagesInProgressRecord;\n thinkingProcess: null | ThinkingInProgress;\n activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\n this.thinkingProcess = null\n this.client =\n config?.client ??\n new LangGraphClient({\n apiUrl: config.deploymentUrl,\n apiKey: config.langsmithApiKey,\n defaultHeaders: { ...(config.propertyHeaders ?? {}) },\n });\n }\n\n dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n };\n return new Observable<ProcessedEvents>((subscriber) => {\n this.handleStreamEvents(input, subscriber);\n return () => {};\n });\n }\n\n async handleStreamEvents(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n let { threadId: inputThreadId, state, messages, tools, context, forwardedProps } = input;\n this.subscriber = subscriber;\n let shouldExit = false;\n // If a manual emittance happens, it is the ultimate source of truth of state, unless a node has exited.\n // Therefore, this value should either hold null, or the only edition of state that should be used.\n this.activeRun!.manuallyEmittedState = null;\n\n const nodeNameInput = forwardedProps?.nodeName;\n this.activeRun!.nodeName = nodeNameInput;\n if (this.activeRun!.nodeName === '__end__') {\n this.activeRun!.nodeName = undefined;\n }\n\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n const thread = await this.getOrCreateThread(threadId, forwardedProps?.threadMetadata);\n this.activeRun!.threadId = thread.thread_id;\n const agentState = await this.client.threads.getState(thread.thread_id) ?? { values: {} } as ThreadState\n\n const agentStateValues = agentState.values as State;\n const aguiToLangChainMessage = aguiMessagesToLangChain(messages);\n\n state.messages = agentStateValues.messages;\n state = this.langGraphDefaultMergeState(state, aguiToLangChainMessage, tools);\n const graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\n\n const mode =\n threadId && this.activeRun!.nodeName != \"__end__\" && this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\" && !forwardedProps?.command?.resume) {\n const nodeBefore = graphInfo.edges.find(e => e.target === this.activeRun!.nodeName);\n await this.client.threads.updateState(threadId, {\n values: state,\n asNode: nodeBefore?.source,\n });\n }\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n let payloadConfig: LangGraphConfig | undefined;\n const configsToMerge = [this.assistantConfig, forwardedProps?.config].filter(\n Boolean,\n ) as LangGraphConfig[];\n if (configsToMerge.length) {\n payloadConfig = await this.mergeConfigs({\n configs: configsToMerge,\n assistant: this.assistant,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n }\n const payload = {\n ...forwardedProps,\n streamMode:\n forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[]),\n input: payloadInput,\n config: payloadConfig,\n };\n\n // If there are still outstanding unresolved interrupts, we must force resolution of them before moving forward\n const interrupts = (agentState.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n if (interrupts?.length && !forwardedProps?.command?.resume) {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: input.runId,\n });\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: input.runId,\n });\n return subscriber.complete();\n }\n\n const streamResponse = this.client.runs.stream(threadId, this.assistant.assistant_id, payload);\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {};\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n\n for await (let streamResponseChunk of streamResponse) {\n // @ts-ignore\n if (!payload.streamMode.includes(streamResponseChunk.event as StreamMode)) {\n continue;\n }\n\n // Force event type, as data is not properly defined on the LG side.\n type EventsChunkData = {\n __interrupt__?: any;\n metadata: Record<string, any>;\n event: string;\n data: any;\n [key: string]: unknown;\n };\n const chunk = streamResponseChunk as EventsStreamEvent & { data: EventsChunkData };\n\n if (streamResponseChunk.event === \"error\") {\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: streamResponseChunk.data.message,\n rawEvent: streamResponseChunk,\n });\n break;\n }\n\n if (streamResponseChunk.event === \"updates\") continue;\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n }\n\n const chunkData = chunk.data;\n const currentNodeName = chunkData.metadata.langgraph_node;\n const eventType = chunkData.event;\n const metadata = chunkData.metadata;\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n if (this.activeRun!.nodeName && this.activeRun!.nodeName !== nodeNameInput) {\n this.endStep()\n }\n\n this.startStep(currentNodeName)\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (graphInfo[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.activeRun!.nodeName = currentNodeName\n }\n\n updatedState = this.activeRun!.manuallyEmittedState ?? latestStateValues;\n\n if (!this.activeRun!.nodeName) {\n continue;\n }\n\n const hasStateDiff = JSON.stringify(updatedState) !== JSON.stringify(state);\n // We should not update snapshot while a message is in progress.\n if (\n (hasStateDiff ||\n this.activeRun!.prevNodeName != this.activeRun!.nodeName ||\n this.activeRun!.exitingNode) &&\n !Boolean(this.getMessageInProgress(this.activeRun!.id))\n ) {\n state = updatedState;\n this.activeRun!.prevNodeName = this.activeRun!.nodeName;\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n rawEvent: chunk,\n });\n }\n\n this.dispatchEvent({\n type: EventType.RAW,\n event: chunkData,\n });\n\n this.handleSingleEvent(chunkData, state);\n }\n\n state = await this.client.threads.getState(threadId);\n const tasks = state.tasks\n const interrupts = (tasks?.[0]?.interrupts ?? []) as Interrupt[];\n const isEndNode = state.next.length === 0\n const writes = state.metadata.writes ?? {}\n\n let newNodeName = this.activeRun!.nodeName!\n\n if (!interrupts?.length) {\n newNodeName = isEndNode ? '__end__' : (state.next[0] ?? Object.keys(writes)[0]);\n }\n\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n if (this.activeRun!.nodeName != newNodeName) {\n this.endStep()\n this.startStep(newNodeName)\n }\n\n this.endStep()\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state.values),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui(state.values.messages ?? []),\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.activeRun = undefined;\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any, state: State): void {\n switch (event.event) {\n case LangGraphEventTypes.OnChatModelStream:\n let shouldEmitMessages = event.metadata[\"emit-messages\"] ?? true;\n let shouldEmitToolCalls = event.metadata[\"emit-tool-calls\"] ?? true;\n\n if (event.data.chunk.response_metadata.finish_reason) return;\n let currentStream = this.getMessageInProgress(this.activeRun!.id);\n const hasCurrentStream = Boolean(currentStream?.id);\n const toolCallData = event.data.chunk.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata[\"predict_state\"]?.some(\n (predictStateTool: PredictStateTool) => predictStateTool.tool === toolCallData?.name,\n );\n\n const isToolCallStartEvent = !hasCurrentStream && toolCallData?.name;\n const isToolCallArgsEvent =\n hasCurrentStream && currentStream?.toolCallId && toolCallData?.args;\n const isToolCallEndEvent = hasCurrentStream && currentStream?.toolCallId && !toolCallData;\n\n const reasoningData = resolveReasoningContent(event.data);\n const messageContent = resolveMessageContent(event.data.chunk.content);\n const isMessageContentEvent = Boolean(!toolCallData && messageContent);\n\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\n\n if (reasoningData) {\n this.handleThinkingEvent(reasoningData)\n break;\n }\n\n if (!reasoningData && this.thinkingProcess) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n })\n this.dispatchEvent({\n type: EventType.THINKING_END,\n })\n this.thinkingProcess = null;\n }\n\n if (toolCallUsedToPredictState) {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"predict_state\"],\n });\n }\n\n if (isToolCallEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: currentStream?.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isMessageEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: currentStream!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isToolCallStartEvent && shouldEmitToolCalls) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n parentMessageId: event.data.chunk.id,\n rawEvent: event,\n });\n if (resolved) {\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n });\n }\n break;\n }\n\n // Tool call args: emit ActionExecutionArgs\n if (isToolCallArgsEvent && shouldEmitToolCalls) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: currentStream?.toolCallId!,\n delta: toolCallData.args,\n rawEvent: event,\n });\n break;\n }\n\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n // No existing message yet, also init the message\n if (!currentStream) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: null,\n toolCallName: null,\n });\n currentStream = this.getMessageInProgress(this.activeRun!.id);\n }\n\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: messageContent!,\n rawEvent: event,\n });\n break;\n }\n\n break;\n case LangGraphEventTypes.OnChatModelEnd:\n if (this.getMessageInProgress(this.activeRun!.id)?.toolCallId) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: this.getMessageInProgress(this.activeRun!.id)!.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n if (this.getMessageInProgress(this.activeRun!.id)?.id) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: this.getMessageInProgress(this.activeRun!.id)!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n break;\n case LangGraphEventTypes.OnCustomEvent:\n if (event.name === CustomEventNames.ManuallyEmitMessage) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.message_id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.data.message_id,\n delta: event.data.message,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.data.message_id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitToolCall) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: event.data.id,\n toolCallName: event.data.name,\n parentMessageId: event.data.id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: event.data.id,\n delta: event.data.args,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: event.data.id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitState) {\n this.activeRun!.manuallyEmittedState = event.data;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n rawEvent: event,\n });\n }\n\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: event.name,\n value: event.data,\n rawEvent: event,\n });\n break;\n }\n }\n\n handleThinkingEvent(reasoningData: LangGraphReasoning) {\n if (!reasoningData || !reasoningData.type || !reasoningData.text) {\n return;\n }\n\n const thinkingStepIndex = reasoningData.index;\n\n if (this.thinkingProcess?.index && this.thinkingProcess.index !== thinkingStepIndex) {\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n })\n }\n this.dispatchEvent({\n type: EventType.THINKING_END,\n })\n this.thinkingProcess = null;\n }\n\n if (!this.thinkingProcess) {\n // No thinking step yet. Start a new one\n this.dispatchEvent({\n type: EventType.THINKING_START,\n })\n this.thinkingProcess = {\n index: thinkingStepIndex,\n };\n }\n\n\n if (this.thinkingProcess.type !== reasoningData.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n })\n this.thinkingProcess.type = reasoningData.type\n }\n\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n delta: reasoningData.text\n })\n }\n }\n\n getStateSnapshot(state: State) {\n const schemaKeys = this.activeRun!.schemaKeys!;\n // Do not emit state keys that are not part of the output schema\n if (schemaKeys?.output) {\n state = filterObjectBySchemaKeys(state, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThread(threadId: string, threadMetadata?: Record<string, any>): Promise<Thread> {\n let thread: Thread;\n try {\n try {\n thread = await this.getThread(threadId);\n } catch (error) {\n thread = await this.createThread({\n threadId,\n metadata: threadMetadata\n });\n }\n } catch (error: unknown) {\n throw new Error(`Failed to create thread: ${(error as Error).message}`);\n }\n\n return thread;\n }\n\n async getThread(threadId: string) {\n return this.client.threads.get(threadId);\n }\n\n async createThread(payload?: Parameters<typeof this.client.threads.create>[0]) {\n return this.client.threads.create(payload);\n }\n\n async mergeConfigs({\n configs,\n assistant,\n schemaKeys,\n }: {\n configs: Config[];\n assistant: Assistant;\n schemaKeys: SchemaKeys;\n }) {\n return configs.reduce((acc, cfg) => {\n let filteredConfigurable = acc.configurable;\n\n if (cfg.configurable) {\n filteredConfigurable = schemaKeys?.config\n ? filterObjectBySchemaKeys(cfg?.configurable, [\n ...DEFAULT_SCHEMA_KEYS,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) =>\n searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"messages\"];\n\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\n if (graphSchema.config_schema?.properties) {\n configSchema = Object.keys(graphSchema.config_schema.properties);\n }\n if (!graphSchema.input_schema?.properties || !graphSchema.output_schema?.properties) {\n return { config: [], input: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input: inputSchema && inputSchema.length ? [...inputSchema, ...CONSTANT_KEYS] : null,\n output: outputSchema && outputSchema.length ? [...outputSchema, ...CONSTANT_KEYS] : null,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], tools: any): State {\n if (messages.length > 0 && \"role\" in messages[0] && messages[0].role === \"system\") {\n // remove system message\n messages = messages.slice(1);\n }\n\n // merge with existing messages\n const existingMessages: LangGraphPlatformMessage[] = state.messages || [];\n const existingMessageIds = new Set(existingMessages.map((message) => message.id));\n const messageIds = new Set(messages.map((message) => message.id));\n\n let removedMessages: RemoveMessage[] = [];\n if (messages.length < existingMessages.length) {\n // Messages were removed\n removedMessages = existingMessages\n .filter((m) => !messageIds.has(m.id))\n .map((m) => new RemoveMessage({ id: m.id! }));\n }\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n return {\n ...state,\n messages: [...removedMessages, ...newMessages],\n tools: [...(state.tools ?? []), ...tools],\n };\n }\n\n startStep(nodeName: string) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: nodeName,\n });\n this.activeRun!.nodeName = nodeName;\n }\n\n endStep() {\n if (!this.activeRun!.nodeName) {\n throw new Error(\"No active step to end\");\n }\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n this.activeRun!.nodeName = undefined;\n }\n}\n\nexport * from \"./types\";\n","import { Message } from \"@langchain/langgraph-sdk\";\nimport { MessageType } from \"@langchain/core/messages\";\n\nexport enum LangGraphEventTypes {\n OnChainStart = \"on_chain_start\",\n OnChainStream = \"on_chain_stream\",\n OnChainEnd = \"on_chain_end\",\n OnChatModelStart = \"on_chat_model_start\",\n OnChatModelStream = \"on_chat_model_stream\",\n OnChatModelEnd = \"on_chat_model_end\",\n OnToolStart = \"on_tool_start\",\n OnToolEnd = \"on_tool_end\",\n OnCustomEvent = \"on_custom_event\",\n OnInterrupt = \"on_interrupt\",\n}\n\nexport type State = Record<string, any>;\n\nexport type SchemaKeys = {\n input: string[] | null;\n output: string[] | null;\n config: string[] | null;\n} | null;\n\nexport type MessageInProgress = {\n id: string;\n toolCallId?: string | null;\n toolCallName?: string | null;\n};\n\nexport type ThinkingInProgress = {\n index: number;\n type?: LangGraphReasoning['type'];\n}\n\nexport interface RunMetadata {\n id: string;\n schemaKeys?: SchemaKeys;\n nodeName?: string;\n prevNodeName?: string | null;\n exitingNode?: boolean;\n manuallyEmittedState?: State | null;\n threadId?: string;\n}\n\nexport type MessagesInProgressRecord = Record<string, MessageInProgress | null>;\n\n// The following types are our own definition to the messages accepted by LangGraph Platform, enhanced with some of our extra data.\nexport interface ToolCall {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\ntype BaseLangGraphPlatformMessage = Omit<\n Message,\n | \"isResultMessage\"\n | \"isTextMessage\"\n | \"isImageMessage\"\n | \"isActionExecutionMessage\"\n | \"isAgentStateMessage\"\n | \"type\"\n | \"createdAt\"\n> & {\n content: string;\n role: string;\n additional_kwargs?: Record<string, unknown>;\n type: MessageType;\n};\n\ninterface LangGraphPlatformResultMessage extends BaseLangGraphPlatformMessage {\n tool_call_id: string;\n name: string;\n}\n\ninterface LangGraphPlatformActionExecutionMessage extends BaseLangGraphPlatformMessage {\n tool_calls: ToolCall[];\n}\n\nexport type LangGraphPlatformMessage =\n | LangGraphPlatformActionExecutionMessage\n | LangGraphPlatformResultMessage\n | BaseLangGraphPlatformMessage;\n\nexport enum CustomEventNames {\n ManuallyEmitMessage = \"manually_emit_message\",\n ManuallyEmitToolCall = \"manually_emit_tool_call\",\n ManuallyEmitState = \"manually_emit_state\",\n Exit = \"exit\",\n}\n\nexport interface PredictStateTool {\n tool: string;\n state_key: string;\n tool_argument: string;\n}\n\nexport interface LangGraphReasoning {\n type: 'text';\n text: string;\n index: number\n}\n","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys, LangGraphReasoning } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/client\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"ai\":\n const content = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: content ? stringifyIfNeeded(content) : '',\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n\nexport function resolveReasoningContent(eventData: any): LangGraphReasoning | null {\n const content = eventData.chunk?.content\n\n // Anthropic reasoning response\n if (content && Array.isArray(content) && content.length && content[0]) {\n if (!content[0].thinking) return null\n return {\n text: content[0].thinking,\n type: 'text',\n index: content[0].index,\n }\n }\n\n /// OpenAI reasoning response\n if (eventData.chunk.additional_kwargs?.reasoning?.summary?.[0]) {\n const data = eventData.chunk.additional_kwargs?.reasoning.summary[0]\n if (!data || !data.text) return null\n return {\n type: 'text',\n text: data.text,\n index: data.index,\n }\n }\n\n return null\n}\n\nexport function resolveMessageContent(content?: LangGraphMessage['content']): string | null {\n if (!content) return null;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content) && content.length) {\n const contentText = content.find(c => c.type === 'text')?.text\n return contentText ?? null;\n }\n\n return null\n}\n"],"mappings":"8tBAAA,OAAS,aAAAA,OAAiB,gBCA1B,OAAS,cAAAC,OAA8B,OACvC,OACE,UAAUC,OAUL,2BACP,OAAS,cAAAC,OAAkB,SAC3B,OAAS,iBAAAC,OAAqB,2BCXvB,IAAKC,QACVA,EAAA,aAAe,iBACfA,EAAA,cAAgB,kBAChBA,EAAA,WAAa,eACbA,EAAA,iBAAmB,sBACnBA,EAAA,kBAAoB,uBACpBA,EAAA,eAAiB,oBACjBA,EAAA,YAAc,gBACdA,EAAA,UAAY,cACZA,EAAA,cAAgB,kBAChBA,EAAA,YAAc,eAVJA,QAAA,IAiFAC,QACVA,EAAA,oBAAsB,wBACtBA,EAAA,qBAAuB,0BACvBA,EAAA,kBAAoB,sBACpBA,EAAA,KAAO,OAJGA,QAAA,IDxDZ,OACE,iBAAAC,GAGA,aAAAC,MAsBK,gBElDA,IAAMC,EAAsB,CAAC,OAAO,EAEpC,SAASC,EAAyBC,EAA0BC,EAAsB,CACvF,OAAO,OAAO,YAAY,OAAO,QAAQD,CAAG,EAAE,OAAO,CAAC,CAACE,CAAG,IAAMD,EAAW,SAASC,CAAG,CAAC,CAAC,CAC3F,CAEO,SAASC,GAAsB,CACpC,KAAAC,EACA,MAAAC,EACA,WAAAJ,CACF,EAIG,CACD,IAAIK,EAAQF,IAAS,QAAUC,EAAQ,KAEvC,OAAIC,IAASL,GAAA,MAAAA,EAAY,SACvBK,EAAQP,EAAyBO,EAAO,CAAC,GAAGR,EAAqB,GAAGG,EAAW,KAAK,CAAC,GAGhFK,CACT,CAEO,SAASC,GAAwBC,EAAyC,CAC/E,OAAOA,EAAS,IAAKC,GAAY,CA7BnC,IAAAC,EA8BI,OAAQD,EAAQ,KAAM,CACpB,IAAK,QACH,MAAO,CACL,GAAIA,EAAQ,GACZ,KAAM,OACN,QAASE,EAAkBC,EAAsBH,EAAQ,OAAO,CAAC,CACnE,EACF,IAAK,KACH,IAAMI,EAAUD,EAAsBH,EAAQ,OAAO,EACrD,MAAO,CACL,GAAIA,EAAQ,GACZ,KAAM,YACN,QAASI,EAAUF,EAAkBE,CAAO,EAAI,GAChD,WAAWH,EAAAD,EAAQ,aAAR,YAAAC,EAAoB,IAAKI,IAAQ,CAC1C,GAAIA,EAAG,GACP,KAAM,WACN,SAAU,CACR,KAAMA,EAAG,KACT,UAAW,KAAK,UAAUA,EAAG,IAAI,CACnC,CACF,GACF,EACF,IAAK,SACH,MAAO,CACL,GAAIL,EAAQ,GACZ,KAAM,SACN,QAASE,EAAkBC,EAAsBH,EAAQ,OAAO,CAAC,CACnE,EACF,IAAK,OACH,MAAO,CACL,GAAIA,EAAQ,GACZ,KAAM,OACN,QAASE,EAAkBC,EAAsBH,EAAQ,OAAO,CAAC,EACjE,WAAYA,EAAQ,YACtB,EACF,QACE,MAAM,IAAI,MAAM,wDAAwD,CAC5E,CACF,CAAC,CACH,CAEO,SAASM,GAAwBP,EAAyC,CAC/E,OAAOA,EAAS,IAAI,CAACC,EAASO,IAAU,CAxE1C,IAAAN,EAAAO,EAyEI,OAAQR,EAAQ,KAAM,CACpB,IAAK,OACH,MAAO,CACL,GAAIA,EAAQ,GACZ,KAAMA,EAAQ,KACd,QAASA,EAAQ,QACjB,KAAM,OACR,EACF,IAAK,YACH,MAAO,CACL,GAAIA,EAAQ,GACZ,KAAM,KACN,KAAMA,EAAQ,KACd,SAASC,EAAAD,EAAQ,UAAR,KAAAC,EAAmB,GAC5B,aAAaO,EAAAR,EAAQ,YAAR,KAAAQ,EAAqB,CAAC,GAAG,IAAKH,IAAkB,CAC3D,GAAIA,EAAG,GACP,KAAMA,EAAG,SAAS,KAClB,KAAM,KAAK,MAAMA,EAAG,SAAS,SAAS,EACtC,KAAM,WACR,EAAE,CACJ,EACF,IAAK,SACH,MAAO,CACL,GAAIL,EAAQ,GACZ,KAAMA,EAAQ,KACd,QAASA,EAAQ,QACjB,KAAM,QACR,EACF,IAAK,OACH,MAAO,CACL,QAASA,EAAQ,QACjB,KAAMA,EAAQ,KACd,KAAMA,EAAQ,KACd,aAAcA,EAAQ,WACtB,GAAIA,EAAQ,EACd,EACF,QACE,cAAQ,MAAM,gBAAgBA,EAAQ,IAAI,qBAAqB,EACzD,IAAI,MAAM,gCAAgC,CACpD,CACF,CAAC,CACH,CAEA,SAASE,EAAkBO,EAAW,CACpC,OAAI,OAAOA,GAAS,SAAiBA,EAC9B,KAAK,UAAUA,CAAI,CAC5B,CAEO,SAASC,GAAwBC,EAA2C,CAzHnF,IAAAV,EAAAO,EAAAI,EAAAC,EAAAC,EA0HE,IAAMV,GAAUH,EAAAU,EAAU,QAAV,YAAAV,EAAiB,QAGjC,GAAIG,GAAW,MAAM,QAAQA,CAAO,GAAKA,EAAQ,QAAUA,EAAQ,CAAC,EAClE,OAAKA,EAAQ,CAAC,EAAE,SACT,CACL,KAAMA,EAAQ,CAAC,EAAE,SACjB,KAAM,OACN,MAAOA,EAAQ,CAAC,EAAE,KACpB,EALiC,KASnC,IAAIS,GAAAD,GAAAJ,EAAAG,EAAU,MAAM,oBAAhB,YAAAH,EAAmC,YAAnC,YAAAI,EAA8C,UAA9C,MAAAC,EAAwD,GAAI,CAC9D,IAAME,GAAOD,EAAAH,EAAU,MAAM,oBAAhB,YAAAG,EAAmC,UAAU,QAAQ,GAClE,MAAI,CAACC,GAAQ,CAACA,EAAK,KAAa,KACzB,CACL,KAAM,OACN,KAAMA,EAAK,KACX,MAAOA,EAAK,KACd,CACF,CAEA,OAAO,IACT,CAEO,SAASZ,EAAsBC,EAAsD,CApJ5F,IAAAH,EAqJE,GAAI,CAACG,EAAS,OAAO,KAErB,GAAI,OAAOA,GAAY,SACrB,OAAOA,EAGT,GAAI,MAAM,QAAQA,CAAO,GAAKA,EAAQ,OAAQ,CAC5C,IAAMY,GAAcf,EAAAG,EAAQ,KAAKa,GAAKA,EAAE,OAAS,MAAM,IAAnC,YAAAhB,EAAsC,KAC1D,OAAOe,GAAA,KAAAA,EAAe,IACxB,CAEA,OAAO,IACT,CFpDO,IAAME,GAAN,cAA6BC,EAAc,CAYhD,YAAYC,EAA8B,CAzH5C,IAAAC,EAAAC,EA0HI,MAAMF,CAAM,EACZ,KAAK,kBAAoB,CAAC,EAC1B,KAAK,UAAYA,EAAO,UACxB,KAAK,QAAUA,EAAO,QACtB,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,gBAAkB,KACvB,KAAK,QACHE,EAAAF,GAAA,YAAAA,EAAQ,SAAR,KAAAE,EACA,IAAIC,GAAgB,CAClB,OAAQH,EAAO,cACf,OAAQA,EAAO,gBACf,eAAgBI,EAAA,IAAMH,EAAAD,EAAO,kBAAP,KAAAC,EAA0B,CAAC,EACnD,CAAC,CACL,CAEA,cAAcI,EAAwB,CACpC,YAAK,WAAW,KAAKA,CAAK,EACnB,EACT,CAEA,IAAIC,EAAsB,CACxB,YAAK,UAAY,CACf,GAAIA,EAAM,MACV,SAAUA,EAAM,QAClB,EACO,IAAIC,GAA6BC,IACtC,KAAK,mBAAmBF,EAAOE,CAAU,EAClC,IAAM,CAAC,EACf,CACH,CAEA,MAAM,mBAAmBF,EAA8BE,EAAyC,CAzJlG,IAAAP,EAAAC,EAAAO,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA0JI,GAAI,CAAE,SAAUC,EAAe,MAAAC,EAAO,SAAAC,EAAU,MAAAC,EAAO,QAAAC,EAAS,eAAAC,CAAe,EAAInB,EACnF,KAAK,WAAaE,EAClB,IAAIkB,EAAa,GAGjB,KAAK,UAAW,qBAAuB,KAEvC,IAAMC,EAAgBF,GAAA,YAAAA,EAAgB,SACtC,KAAK,UAAW,SAAWE,EACvB,KAAK,UAAW,WAAa,YAC/B,KAAK,UAAW,SAAW,QAG7B,IAAMC,EAAWR,GAAA,KAAAA,EAAiBS,GAAW,EAExC,KAAK,YACR,KAAK,UAAY,MAAM,KAAK,aAAa,GAG3C,IAAMC,EAAS,MAAM,KAAK,kBAAkBF,EAAUH,GAAA,YAAAA,EAAgB,cAAc,EACpF,KAAK,UAAW,SAAWK,EAAO,UAClC,IAAMC,GAAa9B,EAAA,MAAM,KAAK,OAAO,QAAQ,SAAS6B,EAAO,SAAS,IAAnD,KAAA7B,EAAwD,CAAE,OAAQ,CAAC,CAAE,EAElF+B,EAAmBD,EAAW,OAC9BE,EAAyBC,GAAwBZ,CAAQ,EAE/DD,EAAM,SAAWW,EAAiB,SAClCX,EAAQ,KAAK,2BAA2BA,EAAOY,EAAwBV,CAAK,EAC5E,IAAMY,EAAY,MAAM,KAAK,OAAO,WAAW,SAAS,KAAK,UAAU,YAAY,EAE7EC,EACJR,GAAY,KAAK,UAAW,UAAY,WAAa,KAAK,UAAW,SACjE,WACA,QAEN,GAAIQ,IAAS,YAAc,GAAClC,EAAAuB,GAAA,YAAAA,EAAgB,UAAhB,MAAAvB,EAAyB,QAAQ,CAC3D,IAAMmC,EAAaF,EAAU,MAAM,KAAKG,GAAKA,EAAE,SAAW,KAAK,UAAW,QAAQ,EAClF,MAAM,KAAK,OAAO,QAAQ,YAAYV,EAAU,CAC9C,OAAQP,EACR,OAAQgB,GAAA,YAAAA,EAAY,MACtB,CAAC,CACH,CACA,KAAK,UAAW,WAAa,MAAM,KAAK,cAAc,EAEtD,IAAME,EAAeC,GAAsB,CACzC,KAAAJ,EACA,MAAAf,EACA,WAAY,KAAK,UAAW,UAC9B,CAAC,EAEGoB,EACEC,EAAiB,CAAC,KAAK,gBAAiBjB,GAAA,YAAAA,EAAgB,MAAM,EAAE,OACpE,OACF,EACIiB,EAAe,SACjBD,EAAgB,MAAM,KAAK,aAAa,CACtC,QAASC,EACT,UAAW,KAAK,UAChB,WAAY,KAAK,UAAW,UAC9B,CAAC,GAEH,IAAMC,EAAUC,EAAAxC,EAAA,GACXqB,GADW,CAEd,YACEhB,EAAAgB,GAAA,YAAAA,EAAgB,aAAhB,KAAAhB,EAA+B,CAAC,SAAU,SAAU,SAAS,EAC/D,MAAO8B,EACP,OAAQE,CACV,GAGMI,GAAcjC,GAAAD,GAAAD,EAAAqB,EAAW,QAAX,YAAArB,EAAmB,KAAnB,YAAAC,EAAuB,aAAvB,KAAAC,EAAqC,CAAC,EAC1D,GAAIiC,GAAA,MAAAA,EAAY,QAAU,GAAChC,EAAAY,GAAA,YAAAA,EAAgB,UAAhB,MAAAZ,EAAyB,QAClD,YAAK,cAAc,CACjB,KAAMiC,EAAU,YAChB,SAAAlB,EACA,MAAOtB,EAAM,KACf,CAAC,EAEDuC,EAAW,QAASE,GAAc,CAChC,KAAK,cAAc,CACjB,KAAMD,EAAU,OAChB,oBACA,MACE,OAAOC,EAAU,OAAU,SAAWA,EAAU,MAAQ,KAAK,UAAUA,EAAU,KAAK,EACxF,SAAUA,CACZ,CAAC,CACH,CAAC,EAED,KAAK,cAAc,CACjB,KAAMD,EAAU,aAChB,SAAAlB,EACA,MAAOtB,EAAM,KACf,CAAC,EACME,EAAW,SAAS,EAG7B,IAAMwC,GAAiB,KAAK,OAAO,KAAK,OAAOpB,EAAU,KAAK,UAAU,aAAce,CAAO,EAE7F,KAAK,UAAW,aAAe,KAC/B,IAAIM,EAAoB,CAAC,EACrBC,EAAe7B,EAEnB,GAAI,CACF,KAAK,cAAc,CACjB,KAAMyB,EAAU,YAChB,SAAAlB,EACA,MAAO,KAAK,UAAW,EACzB,CAAC,EAED,YAAAuB,GAAAC,GAAsCJ,IAAtCK,GAAAC,GAAAC,GAAAF,GAAA,EAAAC,GAAA,MAAAH,GAAA,aAAAE,GAAA,GAAsD,CAA3C,IAAIG,EAAfF,GAAA,MAEE,GAAI,CAACX,EAAQ,WAAW,SAASa,EAAoB,KAAmB,EACtE,SAWF,IAAMC,EAAQD,EAEd,GAAIA,EAAoB,QAAU,QAAS,CACzC,KAAK,cAAc,CACjB,KAAMV,EAAU,UAChB,QAASU,EAAoB,KAAK,QAClC,SAAUA,CACZ,CAAC,EACD,KACF,CAEA,GAAIA,EAAoB,QAAU,UAAW,SAE7C,GAAIA,EAAoB,QAAU,SAAU,CAC1CP,EAAoBQ,EAAM,KAC1B,QACF,CAEA,IAAMC,EAAYD,EAAM,KAClBE,EAAkBD,EAAU,SAAS,eACrCE,EAAYF,EAAU,MACtBG,GAAWH,EAAU,SA+B3B,GA9BA,KAAK,UAAW,GAAKG,GAAS,OAE1BF,GAAmBA,IAAoB,KAAK,UAAW,WACrD,KAAK,UAAW,UAAY,KAAK,UAAW,WAAahC,GAC3D,KAAK,QAAQ,EAGf,KAAK,UAAUgC,CAAe,GAGhCjC,EACEA,GACCkC,IAAc,mBACbF,EAAU,OAAS,OAEvB,KAAK,UAAW,YACd,KAAK,UAAW,WAAaC,GAC7BC,IAAc,eACZ,KAAK,UAAW,cAClB,KAAK,UAAW,qBAAuB,MAKrCzB,EAAU,MAAS,KAAM2B,IAASA,GAAK,KAAOH,CAAe,IAC/D,KAAK,UAAW,SAAWA,GAG7BT,GAAepC,EAAA,KAAK,UAAW,uBAAhB,KAAAA,EAAwCmC,EAEnD,CAAC,KAAK,UAAW,SACnB,UAGmB,KAAK,UAAUC,CAAY,IAAM,KAAK,UAAU7B,CAAK,GAItE,KAAK,UAAW,cAAgB,KAAK,UAAW,UAChD,KAAK,UAAW,cAClB,CAAS,KAAK,qBAAqB,KAAK,UAAW,EAAE,IAErDA,EAAQ6B,EACR,KAAK,UAAW,aAAe,KAAK,UAAW,SAE/C,KAAK,cAAc,CACjB,KAAMJ,EAAU,eAChB,SAAU,KAAK,iBAAiBzB,CAAK,EACrC,SAAUoC,CACZ,CAAC,GAGH,KAAK,cAAc,CACjB,KAAMX,EAAU,IAChB,MAAOY,CACT,CAAC,EAED,KAAK,kBAAkBA,EAAWrC,CAAK,CACzC,QA9FAiC,GAvQN,CAuQMC,GAAA,CAAAD,WAAA,KAAAD,KAAAC,GAAAH,GAAA,eAAAG,GAAA,KAAAH,WAAA,IAAAI,GAAA,MAAAA,GAAA,IAgGAlC,EAAQ,MAAM,KAAK,OAAO,QAAQ,SAASO,CAAQ,EACnD,IAAMmC,EAAQ1C,EAAM,MACdwB,GAAc7B,GAAAD,EAAAgD,GAAA,YAAAA,EAAQ,KAAR,YAAAhD,EAAY,aAAZ,KAAAC,EAA0B,CAAC,EACzCgD,GAAY3C,EAAM,KAAK,SAAW,EAClC4C,IAAShD,EAAAI,EAAM,SAAS,SAAf,KAAAJ,EAAyB,CAAC,EAErCiD,EAAc,KAAK,UAAW,SAElC,OAAKrB,GAAA,MAAAA,EAAY,SACfqB,EAAcF,GAAY,WAAa9C,EAAAG,EAAM,KAAK,CAAC,IAAZ,KAAAH,EAAiB,OAAO,KAAK+C,EAAM,EAAE,CAAC,GAI/EpB,EAAW,QAASE,GAAc,CAChC,KAAK,cAAc,CACjB,KAAMD,EAAU,OAChB,oBACA,MACE,OAAOC,EAAU,OAAU,SAAWA,EAAU,MAAQ,KAAK,UAAUA,EAAU,KAAK,EACxF,SAAUA,CACZ,CAAC,CACH,CAAC,EAEG,KAAK,UAAW,UAAYmB,IAC9B,KAAK,QAAQ,EACb,KAAK,UAAUA,CAAW,GAG5B,KAAK,QAAQ,EACb,KAAK,cAAc,CACjB,KAAMpB,EAAU,eAChB,SAAU,KAAK,iBAAiBzB,EAAM,MAAM,CAC9C,CAAC,EACD,KAAK,cAAc,CACjB,KAAMyB,EAAU,kBAChB,SAAUqB,IAAwBhD,EAAAE,EAAM,OAAO,WAAb,KAAAF,EAAyB,CAAC,CAAC,CAC/D,CAAC,EAED,KAAK,cAAc,CACjB,KAAM2B,EAAU,aAChB,SAAAlB,EACA,MAAO,KAAK,UAAW,EACzB,CAAC,EACD,KAAK,UAAY,OACVpB,EAAW,SAAS,CAC7B,OAAS8B,EAAG,CACV,OAAO9B,EAAW,MAAM8B,CAAC,CAC3B,CACF,CAEA,kBAAkBjC,EAAYgB,EAAoB,CAzZpD,IAAApB,EAAAC,EAAAO,EAAAC,EAAAC,EAAAC,EA0ZI,OAAQP,EAAM,MAAO,CACnB,2BACE,IAAI+D,GAAqBnE,EAAAI,EAAM,SAAS,eAAe,IAA9B,KAAAJ,EAAmC,GACxDoE,GAAsBnE,EAAAG,EAAM,SAAS,iBAAiB,IAAhC,KAAAH,EAAqC,GAE/D,GAAIG,EAAM,KAAK,MAAM,kBAAkB,cAAe,OACtD,IAAIiE,EAAgB,KAAK,qBAAqB,KAAK,UAAW,EAAE,EAC1DC,EAAmB,GAAQD,GAAA,MAAAA,EAAe,IAC1CE,GAAe/D,EAAAJ,EAAM,KAAK,MAAM,mBAAjB,YAAAI,EAAoC,GACnDgE,GAA6B/D,EAAAL,EAAM,SAAS,gBAAf,YAAAK,EAAiC,KACjEgE,GAAuCA,EAAiB,QAASF,GAAA,YAAAA,EAAc,OAG5EG,EAAuB,CAACJ,IAAoBC,GAAA,YAAAA,EAAc,MAC1DI,EACJL,IAAoBD,GAAA,YAAAA,EAAe,cAAcE,GAAA,YAAAA,EAAc,MAC3DK,EAAqBN,IAAoBD,GAAA,YAAAA,EAAe,aAAc,CAACE,EAEvEM,EAAgBC,GAAwB1E,EAAM,IAAI,EAClD2E,EAAiBC,EAAsB5E,EAAM,KAAK,MAAM,OAAO,EAC/D6E,EAAwB,GAAQ,CAACV,GAAgBQ,GAEjDG,EACJZ,GAAoB,EAACD,GAAA,MAAAA,EAAe,aAAc,CAACY,EAErD,GAAIJ,EAAe,CACjB,KAAK,oBAAoBA,CAAa,EACtC,KACF,CAoBA,GAlBI,CAACA,GAAiB,KAAK,kBACzB,KAAK,cAAc,CACjB,KAAMhC,EAAU,yBAClB,CAAC,EACD,KAAK,cAAc,CACjB,KAAMA,EAAU,YAClB,CAAC,EACD,KAAK,gBAAkB,MAGrB2B,GACF,KAAK,cAAc,CACjB,KAAM3B,EAAU,OAChB,KAAM,eACN,MAAOzC,EAAM,SAAS,aACxB,CAAC,EAGCwE,EAAoB,CACL,KAAK,cAAc,CAClC,KAAM/B,EAAU,cAChB,WAAYwB,GAAA,YAAAA,EAAe,WAC3B,SAAUjE,CACZ,CAAC,IAEC,KAAK,kBAAkB,KAAK,UAAW,EAAE,EAAI,MAE/C,KACF,CAEA,GAAI8E,EAAmB,CACJ,KAAK,cAAc,CAClC,KAAMrC,EAAU,iBAChB,UAAWwB,EAAe,GAC1B,SAAUjE,CACZ,CAAC,IAEC,KAAK,kBAAkB,KAAK,UAAW,EAAE,EAAI,MAE/C,KACF,CAEA,GAAIsE,GAAwBN,EAAqB,CAC9B,KAAK,cAAc,CAClC,KAAMvB,EAAU,gBAChB,WAAY0B,EAAa,GACzB,aAAcA,EAAa,KAC3B,gBAAiBnE,EAAM,KAAK,MAAM,GAClC,SAAUA,CACZ,CAAC,GAEC,KAAK,qBAAqB,KAAK,UAAW,GAAI,CAC5C,GAAIA,EAAM,KAAK,MAAM,GACrB,WAAYmE,EAAa,GACzB,aAAcA,EAAa,IAC7B,CAAC,EAEH,KACF,CAGA,GAAII,GAAuBP,EAAqB,CAC9C,KAAK,cAAc,CACjB,KAAMvB,EAAU,eAChB,WAAYwB,GAAA,YAAAA,EAAe,WAC3B,MAAOE,EAAa,KACpB,SAAUnE,CACZ,CAAC,EACD,KACF,CAGA,GAAI6E,GAAyBd,EAAoB,CAE1CE,IACH,KAAK,cAAc,CACjB,KAAMxB,EAAU,mBAChB,KAAM,YACN,UAAWzC,EAAM,KAAK,MAAM,GAC5B,SAAUA,CACZ,CAAC,EACD,KAAK,qBAAqB,KAAK,UAAW,GAAI,CAC5C,GAAIA,EAAM,KAAK,MAAM,GACrB,WAAY,KACZ,aAAc,IAChB,CAAC,EACDiE,EAAgB,KAAK,qBAAqB,KAAK,UAAW,EAAE,GAG9D,KAAK,cAAc,CACjB,KAAMxB,EAAU,qBAChB,UAAWwB,EAAe,GAC1B,MAAOU,EACP,SAAU3E,CACZ,CAAC,EACD,KACF,CAEA,MACF,wBACE,IAAIM,EAAA,KAAK,qBAAqB,KAAK,UAAW,EAAE,IAA5C,MAAAA,EAA+C,WAAY,CAC5C,KAAK,cAAc,CAClC,KAAMmC,EAAU,cAChB,WAAY,KAAK,qBAAqB,KAAK,UAAW,EAAE,EAAG,WAC3D,SAAUzC,CACZ,CAAC,IAEC,KAAK,kBAAkB,KAAK,UAAW,EAAE,EAAI,MAE/C,KACF,CACA,IAAIO,EAAA,KAAK,qBAAqB,KAAK,UAAW,EAAE,IAA5C,MAAAA,EAA+C,GAAI,CACpC,KAAK,cAAc,CAClC,KAAMkC,EAAU,iBAChB,UAAW,KAAK,qBAAqB,KAAK,UAAW,EAAE,EAAG,GAC1D,SAAUzC,CACZ,CAAC,IAEC,KAAK,kBAAkB,KAAK,UAAW,EAAE,EAAI,MAE/C,KACF,CACA,MACF,sBACE,GAAIA,EAAM,OAAS,wBAAsC,CACvD,KAAK,cAAc,CACjB,KAAMyC,EAAU,mBAChB,KAAM,YACN,UAAWzC,EAAM,KAAK,WACtB,SAAUA,CACZ,CAAC,EACD,KAAK,cAAc,CACjB,KAAMyC,EAAU,qBAChB,UAAWzC,EAAM,KAAK,WACtB,MAAOA,EAAM,KAAK,QAClB,SAAUA,CACZ,CAAC,EACD,KAAK,cAAc,CACjB,KAAMyC,EAAU,iBAChB,UAAWzC,EAAM,KAAK,WACtB,SAAUA,CACZ,CAAC,EACD,KACF,CAEA,GAAIA,EAAM,OAAS,0BAAuC,CACxD,KAAK,cAAc,CACjB,KAAMyC,EAAU,gBAChB,WAAYzC,EAAM,KAAK,GACvB,aAAcA,EAAM,KAAK,KACzB,gBAAiBA,EAAM,KAAK,GAC5B,SAAUA,CACZ,CAAC,EACD,KAAK,cAAc,CACjB,KAAMyC,EAAU,eAChB,WAAYzC,EAAM,KAAK,GACvB,MAAOA,EAAM,KAAK,KAClB,SAAUA,CACZ,CAAC,EACD,KAAK,cAAc,CACjB,KAAMyC,EAAU,cAChB,WAAYzC,EAAM,KAAK,GACvB,SAAUA,CACZ,CAAC,EACD,KACF,CAEIA,EAAM,OAAS,wBACjB,KAAK,UAAW,qBAAuBA,EAAM,KAC7C,KAAK,cAAc,CACjB,KAAMyC,EAAU,eAChB,SAAU,KAAK,iBAAiBzB,CAAK,EACrC,SAAUhB,CACZ,CAAC,GAGH,KAAK,cAAc,CACjB,KAAMyC,EAAU,OAChB,KAAMzC,EAAM,KACZ,MAAOA,EAAM,KACb,SAAUA,CACZ,CAAC,EACD,KACJ,CACF,CAEA,oBAAoByE,EAAmC,CAlnBzD,IAAA7E,EAmnBI,GAAI,CAAC6E,GAAiB,CAACA,EAAc,MAAQ,CAACA,EAAc,KAC1D,OAGF,IAAMM,EAAoBN,EAAc,OAEpC7E,EAAA,KAAK,kBAAL,MAAAA,EAAsB,OAAS,KAAK,gBAAgB,QAAUmF,IAC5D,KAAK,gBAAgB,MACvB,KAAK,cAAc,CACjB,KAAMtC,EAAU,yBAClB,CAAC,EAEH,KAAK,cAAc,CACjB,KAAMA,EAAU,YAClB,CAAC,EACD,KAAK,gBAAkB,MAGpB,KAAK,kBAER,KAAK,cAAc,CACjB,KAAMA,EAAU,cAClB,CAAC,EACD,KAAK,gBAAkB,CACrB,MAAOsC,CACT,GAIE,KAAK,gBAAgB,OAASN,EAAc,OAC9C,KAAK,cAAc,CACjB,KAAMhC,EAAU,2BAClB,CAAC,EACD,KAAK,gBAAgB,KAAOgC,EAAc,MAGxC,KAAK,gBAAgB,MACvB,KAAK,cAAc,CACjB,KAAMhC,EAAU,8BAChB,MAAOgC,EAAc,IACvB,CAAC,CAEL,CAEA,iBAAiBzD,EAAc,CAC7B,IAAMgE,EAAa,KAAK,UAAW,WAEnC,OAAIA,GAAA,MAAAA,EAAY,SACdhE,EAAQiE,EAAyBjE,EAAO,CAAC,GAAGkE,EAAqB,GAAGF,EAAW,MAAM,CAAC,GAGjFhE,CACT,CAEA,MAAM,kBAAkBO,EAAkB4D,EAAuD,CAC/F,IAAI1D,EACJ,GAAI,CACF,GAAI,CACFA,EAAS,MAAM,KAAK,UAAUF,CAAQ,CACxC,OAAS2B,EAAO,CACdzB,EAAS,MAAM,KAAK,aAAa,CAC/B,SAAAF,EACA,SAAU4D,CACZ,CAAC,CACH,CACF,OAASjC,EAAgB,CACvB,MAAM,IAAI,MAAM,4BAA6BA,EAAgB,OAAO,EAAE,CACxE,CAEA,OAAOzB,CACT,CAEA,MAAM,UAAUF,EAAkB,CAChC,OAAO,KAAK,OAAO,QAAQ,IAAIA,CAAQ,CACzC,CAEA,MAAM,aAAae,EAA4D,CAC7E,OAAO,KAAK,OAAO,QAAQ,OAAOA,CAAO,CAC3C,CAEA,MAAM,aAAa,CACE,QAAA8C,EACA,UAAAC,EACA,WAAAL,CACF,EAIhB,CACD,OAAOI,EAAQ,OAAO,CAACE,EAAKC,IAAQ,CA5sBxC,IAAA3F,EA6sBM,IAAI4F,EAAuBF,EAAI,aAE3BC,EAAI,eACNC,EAAuBR,GAAA,MAAAA,EAAY,OAC/BC,EAAyBM,GAAA,YAAAA,EAAK,aAAc,CAC5C,GAAGL,EACH,IAAItF,EAAAoF,GAAA,YAAAA,EAAY,SAAZ,KAAApF,EAAsB,CAAC,CAC7B,CAAC,EACC2F,GAAA,YAAAA,EAAK,cAGX,IAAME,EAAYlD,EAAAxC,IAAA,GACbuF,GACAC,GAFa,CAGhB,aAAcC,CAChB,GAGME,EACJJ,EAAI,iBAAmB,MAAQC,EAAI,kBAAoB,GAEnDI,EAAsB,KAAK,UAAUF,CAAS,IAAM,KAAK,UAAUH,CAAG,EAGtEM,EACJF,GACA,KAAK,UAAUnD,EAAAxC,EAAA,GAAK0F,GAAL,CAAgB,gBAAiB,IAAK,EAAC,IACtD,KAAK,UAAUlD,EAAAxC,EAAA,GAAKuF,GAAL,CAAU,gBAAiB,IAAK,EAAC,EAElD,OAAIK,GAAuB,CAACC,EACnB7F,IAAA,GACFuF,GACAG,GAIAH,CACT,EAAGD,EAAU,MAAM,CACrB,CAEA,qBAAqBQ,EAAe,CAClC,OAAO,KAAK,kBAAkBA,CAAK,CACrC,CAEA,qBAAqBA,EAAeC,EAAyB,CAC3D,KAAK,kBAAoBvD,EAAAxC,EAAA,GACpB,KAAK,mBADe,CAEvB,CAAC8F,CAAK,EAAG9F,IAAA,GACH,KAAK,kBAAkB8F,CAAK,GAC7BC,EAEP,EACF,CAEA,MAAM,cAAmC,CACvC,IAAMC,EAAa,MAAM,KAAK,OAAO,WAAW,OAAO,EACjDC,EAAqBD,EAAW,KACnCE,GACCA,EAAa,WAAa,KAAK,OACnC,EACA,GAAI,CAACD,EACH,cAAQ,MAAM;AAAA,qCACiB,KAAK,OAAO;AAAA;AAAA;AAAA,yCAERD,EAAW,IAAKG,GAAM,GAAGA,EAAE,QAAQ,SAASA,EAAE,YAAY,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,OAC3G,EACK,IAAI,MAAM,mBAAmB,EAGrC,OAAOF,CACT,CAEA,MAAM,eAAqC,CArxB7C,IAAApG,EAAAC,EAAAO,EAsxBI,IAAM+F,EAAgB,CAAC,UAAU,EAEjC,GAAI,CACF,IAAMC,EAAc,MAAM,KAAK,OAAO,WAAW,WAAW,KAAK,UAAW,YAAY,EACpFC,EAAe,KAInB,IAHIzG,EAAAwG,EAAY,gBAAZ,MAAAxG,EAA2B,aAC7ByG,EAAe,OAAO,KAAKD,EAAY,cAAc,UAAU,GAE7D,GAACvG,EAAAuG,EAAY,eAAZ,MAAAvG,EAA0B,aAAc,GAACO,EAAAgG,EAAY,gBAAZ,MAAAhG,EAA2B,YACvE,MAAO,CAAE,OAAQ,CAAC,EAAG,MAAO+F,EAAe,OAAQA,CAAc,EAEnE,IAAMG,EAAc,OAAO,KAAKF,EAAY,aAAa,UAAU,EAC7DG,EAAe,OAAO,KAAKH,EAAY,cAAc,UAAU,EAErE,MAAO,CACL,MAAOE,GAAeA,EAAY,OAAS,CAAC,GAAGA,EAAa,GAAGH,CAAa,EAAI,KAChF,OAAQI,GAAgBA,EAAa,OAAS,CAAC,GAAGA,EAAc,GAAGJ,CAAa,EAAI,KACpF,OAAQE,CACV,CACF,OAASpE,EAAG,CACV,MAAO,CAAE,OAAQ,CAAC,EAAG,MAAOkE,EAAe,OAAQA,CAAc,CACnE,CACF,CAEA,2BAA2BnF,EAAcC,EAA8BC,EAAmB,CA9yB5F,IAAAtB,EA+yBQqB,EAAS,OAAS,GAAK,SAAUA,EAAS,CAAC,GAAKA,EAAS,CAAC,EAAE,OAAS,WAEvEA,EAAWA,EAAS,MAAM,CAAC,GAI7B,IAAMuF,EAA+CxF,EAAM,UAAY,CAAC,EAClEyF,EAAqB,IAAI,IAAID,EAAiB,IAAKE,GAAYA,EAAQ,EAAE,CAAC,EAC1EC,EAAa,IAAI,IAAI1F,EAAS,IAAKyF,GAAYA,EAAQ,EAAE,CAAC,EAE5DE,EAAmC,CAAC,EACpC3F,EAAS,OAASuF,EAAiB,SAErCI,EAAkBJ,EACf,OAAQK,GAAM,CAACF,EAAW,IAAIE,EAAE,EAAE,CAAC,EACnC,IAAKA,GAAM,IAAIC,GAAc,CAAE,GAAID,EAAE,EAAI,CAAC,CAAC,GAGhD,IAAME,EAAc9F,EAAS,OAAQyF,GAAY,CAACD,EAAmB,IAAIC,EAAQ,EAAE,CAAC,EAEpF,OAAOnE,EAAAxC,EAAA,GACFiB,GADE,CAEL,SAAU,CAAC,GAAG4F,EAAiB,GAAGG,CAAW,EAC7C,MAAO,CAAC,IAAInH,EAAAoB,EAAM,QAAN,KAAApB,EAAe,CAAC,EAAI,GAAGsB,CAAK,CAC1C,EACF,CAEA,UAAU8F,EAAkB,CAC1B,KAAK,cAAc,CACjB,KAAMvE,EAAU,aAChB,SAAUuE,CACZ,CAAC,EACD,KAAK,UAAW,SAAWA,CAC7B,CAEA,SAAU,CACR,GAAI,CAAC,KAAK,UAAW,SACnB,MAAM,IAAI,MAAM,uBAAuB,EAEzC,KAAK,cAAc,CACjB,KAAMvE,EAAU,cAChB,SAAU,KAAK,UAAW,QAC5B,CAAC,EACD,KAAK,UAAW,SAAW,MAC7B,CACF,EDz1BO,IAAMwE,GAAN,cAAiCC,EAAU,CAAC","names":["HttpAgent","Observable","LangGraphClient","randomUUID","RemoveMessage","LangGraphEventTypes","CustomEventNames","AbstractAgent","EventType","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","resolveMessageContent","content","tc","aguiMessagesToLangChain","index","_b","item","resolveReasoningContent","eventData","_c","_d","_e","data","contentText","c","LangGraphAgent","AbstractAgent","config","_a","_b","LangGraphClient","__spreadValues","event","input","Observable","subscriber","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","inputThreadId","state","messages","tools","context","forwardedProps","shouldExit","nodeNameInput","threadId","randomUUID","thread","agentState","agentStateValues","aguiToLangChainMessage","aguiMessagesToLangChain","graphInfo","mode","nodeBefore","e","payloadInput","getStreamPayloadInput","payloadConfig","configsToMerge","payload","__spreadProps","interrupts","EventType","interrupt","streamResponse","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","chunk","chunkData","currentNodeName","eventType","metadata","node","tasks","isEndNode","writes","newNodeName","langchainMessagesToAgui","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","reasoningData","resolveReasoningContent","messageContent","resolveMessageContent","isMessageContentEvent","isMessageEndEvent","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","DEFAULT_SCHEMA_KEYS","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","CONSTANT_KEYS","graphSchema","configSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","messageIds","removedMessages","m","RemoveMessage","newMessages","nodeName","LangGraphHttpAgent","HttpAgent"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/types.ts","../src/utils.ts"],"sourcesContent":["import { HttpAgent } from \"@ag-ui/client\";\n\nexport * from './agent'\nexport class LangGraphHttpAgent extends HttpAgent {}","import { Observable, Subscriber } from \"rxjs\";\nimport {\n Client as LangGraphClient,\n EventsStreamEvent,\n StreamMode,\n Config as LangGraphConfig,\n ThreadState,\n Assistant,\n Message as LangGraphMessage,\n Config,\n Interrupt,\n Thread\n} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n ThinkingInProgress,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\n LangGraphReasoning\n} from \"./types\";\nimport {\n AbstractAgent,\n AgentConfig,\n CustomEvent,\n EventType,\n MessagesSnapshotEvent,\n RawEvent,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateDeltaEvent,\n StateSnapshotEvent,\n StepFinishedEvent,\n StepStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ThinkingTextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingStartEvent,\n ThinkingEndEvent,\n Message as AGUIMessage,\n} from \"@ag-ui/client\";\nimport { RunsStreamPayload } from \"@langchain/langgraph-sdk/dist/types\";\nimport {\n aguiMessagesToLangChain,\n DEFAULT_SCHEMA_KEYS,\n filterObjectBySchemaKeys,\n getStreamPayloadInput,\n langchainMessagesToAgui,\n resolveMessageContent,\n resolveReasoningContent\n} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ThinkingTextMessageStartEvent\n | ThinkingTextMessageContentEvent\n | ThinkingTextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\n | ThinkingStartEvent\n | ThinkingEndEvent\n | StateSnapshotEvent\n | StateDeltaEvent\n | MessagesSnapshotEvent\n | RawEvent\n | CustomEvent\n | RunStartedEvent\n | RunFinishedEvent\n | RunErrorEvent\n | StepStartedEvent\n | StepFinishedEvent;\n\ntype RunAgentExtendedInput<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n> = Omit<RunAgentInput, \"forwardedProps\"> & {\n forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, \"input\"> & {\n nodeName?: string;\n threadMetadata?: Record<string, any>;\n };\n};\n\ninterface RegenerateInput extends RunAgentExtendedInput {\n messageCheckpoint: LangGraphMessage;\n}\n\nexport interface LangGraphAgentConfig extends AgentConfig {\n client?: LangGraphClient;\n deploymentUrl: string;\n langsmithApiKey?: string;\n propertyHeaders?: Record<string, string>;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n}\n\nexport class LangGraphAgent extends AbstractAgent {\n client: LangGraphClient;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n assistant?: Assistant;\n messagesInProcess: MessagesInProgressRecord;\n thinkingProcess: null | ThinkingInProgress;\n activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n constantSchemaKeys: string[] = DEFAULT_SCHEMA_KEYS;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\n this.thinkingProcess = null\n this.client =\n config?.client ??\n new LangGraphClient({\n apiUrl: config.deploymentUrl,\n apiKey: config.langsmithApiKey,\n defaultHeaders: { ...(config.propertyHeaders ?? {}) },\n });\n }\n\n dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n return new Observable<ProcessedEvents>((subscriber) => {\n this.runAgentStream(input, subscriber);\n return () => {};\n });\n }\n\n async runAgentStream(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n };\n this.subscriber = subscriber;\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n const threadId = input.threadId ?? randomUUID();\n const streamMode = input.forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[])\n const preparedStream = await this.prepareStream({ ...input, threadId }, streamMode)\n\n if (!preparedStream) {\n return subscriber.error('No stream to regenerate');\n }\n\n await this.handleStreamEvents(preparedStream, threadId, subscriber, input, streamMode)\n }\n\n async prepareRegenerateStream(input: RegenerateInput, streamMode: StreamMode | StreamMode[]) {\n const { threadId, messageCheckpoint, tools } = input\n\n const timeTravelCheckpoint = await this.getCheckpointByMessage(messageCheckpoint!.id!, threadId);\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n if (!timeTravelCheckpoint) {\n return this.subscriber.error('No checkpoint found for message');\n }\n\n const fork = await this.client.threads.updateState(\n threadId,\n {\n values: this.langGraphDefaultMergeState(timeTravelCheckpoint.values, [], tools),\n checkpointId: timeTravelCheckpoint.checkpoint.checkpoint_id!,\n asNode: timeTravelCheckpoint.next?.[0] ?? \"__start__\"\n }\n );\n\n return {\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, {\n input: this.langGraphDefaultMergeState(timeTravelCheckpoint.values, [messageCheckpoint], tools),\n // @ts-ignore\n checkpointId: fork.checkpoint.checkpoint_id!,\n streamMode,\n }),\n state: timeTravelCheckpoint,\n streamMode,\n };\n }\n\n async prepareStream(input: RunAgentExtendedInput, streamMode: StreamMode | StreamMode[]) {\n let { threadId: inputThreadId, state: inputState, messages, tools, context, forwardedProps } = input;\n // If a manual emittance happens, it is the ultimate source of truth of state, unless a node has exited.\n // Therefore, this value should either hold null, or the only edition of state that should be used.\n this.activeRun!.manuallyEmittedState = null;\n\n const nodeNameInput = forwardedProps?.nodeName;\n this.activeRun!.nodeName = nodeNameInput;\n if (this.activeRun!.nodeName === '__end__') {\n this.activeRun!.nodeName = undefined;\n }\n\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n const thread = await this.getOrCreateThread(threadId, forwardedProps?.threadMetadata);\n this.activeRun!.threadId = thread.thread_id;\n\n const agentState: ThreadState<State> = await this.client.threads.getState(thread.thread_id) ?? { values: {} } as ThreadState<State>\n const agentStateMessages = agentState.values.messages ?? []\n const inputMessagesToLangchain = aguiMessagesToLangChain(messages)\n const stateValuesDiff = this.langGraphDefaultMergeState({ ...inputState, messages: agentStateMessages }, inputMessagesToLangchain, tools);\n // Messages are a combination of existing messages in state + everything that was newly sent\n let threadState = {\n ...agentState,\n values: { ...stateValuesDiff, messages: [...agentStateMessages, ...stateValuesDiff.messages] },\n }\n let stateValues = threadState.values;\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n if ((agentState.values.messages ?? []).length > messages.filter((m) => m.role !== \"system\").length) {\n let lastUserMessage: LangGraphMessage | null = null;\n // Find the first user message by working backwards from the last message\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"user\") {\n lastUserMessage = aguiMessagesToLangChain([messages[i]])[0];\n break;\n }\n }\n\n if (!lastUserMessage) {\n return this.subscriber.error('No user message found in messages to regenerate');\n }\n\n return this.prepareRegenerateStream({ ...input, messageCheckpoint: lastUserMessage }, streamMode)\n }\n this.activeRun!.graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\n\n const mode =\n !forwardedProps?.command?.resume && threadId && this.activeRun!.nodeName != \"__end__\" && this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\") {\n const nodeBefore = this.activeRun!.graphInfo.edges.find(e => e.target === this.activeRun!.nodeName);\n await this.client.threads.updateState(threadId, {\n values: inputState,\n asNode: nodeBefore?.source,\n });\n }\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state: stateValues,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n let payloadConfig: LangGraphConfig | undefined;\n const configsToMerge = [this.assistantConfig, forwardedProps?.config].filter(\n Boolean,\n ) as LangGraphConfig[];\n if (configsToMerge.length) {\n payloadConfig = await this.mergeConfigs({\n configs: configsToMerge,\n assistant: this.assistant,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n }\n const payload = {\n ...forwardedProps,\n streamMode,\n input: payloadInput,\n config: payloadConfig,\n };\n\n // If there are still outstanding unresolved interrupts, we must force resolution of them before moving forward\n const interrupts = (agentState.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n if (interrupts?.length && !forwardedProps?.command?.resume) {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: input.runId,\n });\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: input.runId,\n });\n return this.subscriber.complete();\n }\n\n return {\n // @ts-ignore\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, payload),\n state: threadState as ThreadState<State>,\n }\n }\n\n async handleStreamEvents(\n stream: Awaited<ReturnType<typeof this.prepareStream> | ReturnType<typeof this.prepareRegenerateStream>>,\n threadId: string,\n subscriber: Subscriber<ProcessedEvents>,\n input: RunAgentExtendedInput,\n streamMode: StreamMode | StreamMode[]\n ) {\n const { forwardedProps } = input\n const nodeNameInput = forwardedProps?.nodeName;\n this.subscriber = subscriber;\n let shouldExit = false;\n if (!stream) return;\n\n let { streamResponse, state } = stream;\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {} as ThreadState<State>[\"values\"];\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n\n // In case of resume (interrupt), re-start resumed step\n if (forwardedProps?.command?.resume && this.activeRun!.nodeName) {\n this.startStep(this.activeRun!.nodeName)\n }\n\n for await (let streamResponseChunk of streamResponse) {\n // @ts-ignore\n if (!streamMode.includes(streamResponseChunk.event as StreamMode)) {\n continue;\n }\n\n // Force event type, as data is not properly defined on the LG side.\n type EventsChunkData = {\n __interrupt__?: any;\n metadata: Record<string, any>;\n event: string;\n data: any;\n [key: string]: unknown;\n };\n const chunk = streamResponseChunk as EventsStreamEvent & { data: EventsChunkData };\n\n if (streamResponseChunk.event === \"error\") {\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: streamResponseChunk.data.message,\n rawEvent: streamResponseChunk,\n });\n break;\n }\n\n if (streamResponseChunk.event === \"updates\") continue;\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n }\n\n const chunkData = chunk.data;\n const metadata = chunkData.metadata ?? {};\n const currentNodeName = metadata.langgraph_node;\n const eventType = chunkData.event;\n\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n if (this.activeRun!.nodeName && this.activeRun!.nodeName !== nodeNameInput) {\n this.endStep()\n }\n\n this.startStep(currentNodeName)\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (this.activeRun!.graphInfo?.[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.activeRun!.nodeName = currentNodeName\n }\n\n updatedState.values = this.activeRun!.manuallyEmittedState ?? latestStateValues;\n\n if (!this.activeRun!.nodeName) {\n continue;\n }\n\n const hasStateDiff = JSON.stringify(updatedState) !== JSON.stringify(state);\n // We should not update snapshot while a message is in progress.\n if (\n (hasStateDiff ||\n this.activeRun!.prevNodeName != this.activeRun!.nodeName ||\n this.activeRun!.exitingNode) &&\n !Boolean(this.getMessageInProgress(this.activeRun!.id))\n ) {\n state = updatedState;\n this.activeRun!.prevNodeName = this.activeRun!.nodeName;\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n rawEvent: chunk,\n });\n }\n\n this.dispatchEvent({\n type: EventType.RAW,\n event: chunkData,\n });\n\n this.handleSingleEvent(chunkData);\n }\n\n state = await this.client.threads.getState(threadId);\n const tasks = state.tasks\n const interrupts = (tasks?.[0]?.interrupts ?? []) as Interrupt[];\n const isEndNode = state.next.length === 0\n const writes = state.metadata?.writes ?? {}\n\n let newNodeName = this.activeRun!.nodeName!\n\n if (!interrupts?.length) {\n newNodeName = isEndNode ? '__end__' : (state.next[0] ?? Object.keys(writes)[0]);\n }\n\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n if (this.activeRun!.nodeName != newNodeName) {\n this.endStep()\n this.startStep(newNodeName)\n }\n\n this.endStep()\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state.values),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui((state.values as { messages: any[] }).messages ?? []),\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.activeRun = undefined;\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any): void {\n switch (event.event) {\n case LangGraphEventTypes.OnChatModelStream:\n let shouldEmitMessages = event.metadata[\"emit-messages\"] ?? true;\n let shouldEmitToolCalls = event.metadata[\"emit-tool-calls\"] ?? true;\n\n if (event.data.chunk.response_metadata.finish_reason) return;\n let currentStream = this.getMessageInProgress(this.activeRun!.id);\n const hasCurrentStream = Boolean(currentStream?.id);\n const toolCallData = event.data.chunk.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata[\"predict_state\"]?.some(\n (predictStateTool: PredictStateTool) => predictStateTool.tool === toolCallData?.name,\n );\n\n const isToolCallStartEvent = !hasCurrentStream && toolCallData?.name;\n const isToolCallArgsEvent =\n hasCurrentStream && currentStream?.toolCallId && toolCallData?.args;\n const isToolCallEndEvent = hasCurrentStream && currentStream?.toolCallId && !toolCallData;\n\n const reasoningData = resolveReasoningContent(event.data);\n const messageContent = resolveMessageContent(event.data.chunk.content);\n const isMessageContentEvent = Boolean(!toolCallData && messageContent);\n\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\n\n if (reasoningData) {\n this.handleThinkingEvent(reasoningData)\n break;\n }\n\n if (!reasoningData && this.thinkingProcess) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n })\n this.dispatchEvent({\n type: EventType.THINKING_END,\n })\n this.thinkingProcess = null;\n }\n\n if (toolCallUsedToPredictState) {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"predict_state\"],\n });\n }\n\n if (isToolCallEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: currentStream?.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isMessageEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: currentStream!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isToolCallStartEvent && shouldEmitToolCalls) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n parentMessageId: event.data.chunk.id,\n rawEvent: event,\n });\n if (resolved) {\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n });\n }\n break;\n }\n\n // Tool call args: emit ActionExecutionArgs\n if (isToolCallArgsEvent && shouldEmitToolCalls) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: currentStream?.toolCallId!,\n delta: toolCallData.args,\n rawEvent: event,\n });\n break;\n }\n\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n // No existing message yet, also init the message\n if (!currentStream) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: null,\n toolCallName: null,\n });\n currentStream = this.getMessageInProgress(this.activeRun!.id);\n }\n\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: messageContent!,\n rawEvent: event,\n });\n break;\n }\n\n break;\n case LangGraphEventTypes.OnChatModelEnd:\n if (this.getMessageInProgress(this.activeRun!.id)?.toolCallId) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: this.getMessageInProgress(this.activeRun!.id)!.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n if (this.getMessageInProgress(this.activeRun!.id)?.id) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: this.getMessageInProgress(this.activeRun!.id)!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n break;\n case LangGraphEventTypes.OnCustomEvent:\n if (event.name === CustomEventNames.ManuallyEmitMessage) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.message_id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.data.message_id,\n delta: event.data.message,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.data.message_id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitToolCall) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: event.data.id,\n toolCallName: event.data.name,\n parentMessageId: event.data.id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: event.data.id,\n delta: event.data.args,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: event.data.id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitState) {\n this.activeRun!.manuallyEmittedState = event.data;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(this.activeRun!.manuallyEmittedState!),\n rawEvent: event,\n });\n }\n\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: event.name,\n value: event.data,\n rawEvent: event,\n });\n break;\n }\n }\n\n handleThinkingEvent(reasoningData: LangGraphReasoning) {\n if (!reasoningData || !reasoningData.type || !reasoningData.text) {\n return;\n }\n\n const thinkingStepIndex = reasoningData.index;\n\n if (this.thinkingProcess?.index && this.thinkingProcess.index !== thinkingStepIndex) {\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n })\n }\n this.dispatchEvent({\n type: EventType.THINKING_END,\n })\n this.thinkingProcess = null;\n }\n\n if (!this.thinkingProcess) {\n // No thinking step yet. Start a new one\n this.dispatchEvent({\n type: EventType.THINKING_START,\n })\n this.thinkingProcess = {\n index: thinkingStepIndex,\n };\n }\n\n\n if (this.thinkingProcess.type !== reasoningData.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n })\n this.thinkingProcess.type = reasoningData.type\n }\n\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n delta: reasoningData.text\n })\n }\n }\n\n getStateSnapshot(state: State) {\n const schemaKeys = this.activeRun!.schemaKeys!;\n // Do not emit state keys that are not part of the output schema\n if (schemaKeys?.output) {\n state = filterObjectBySchemaKeys(state, [...this.constantSchemaKeys, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThread(threadId: string, threadMetadata?: Record<string, any>): Promise<Thread> {\n let thread: Thread;\n try {\n try {\n thread = await this.getThread(threadId);\n } catch (error) {\n thread = await this.createThread({\n threadId,\n metadata: threadMetadata\n });\n }\n } catch (error: unknown) {\n throw new Error(`Failed to create thread: ${(error as Error).message}`);\n }\n\n return thread;\n }\n\n async getThread(threadId: string) {\n return this.client.threads.get(threadId);\n }\n\n async createThread(payload?: Parameters<typeof this.client.threads.create>[0]) {\n return this.client.threads.create(payload);\n }\n\n async mergeConfigs({\n configs,\n assistant,\n schemaKeys,\n }: {\n configs: Config[];\n assistant: Assistant;\n schemaKeys: SchemaKeys;\n }) {\n return configs.reduce((acc, cfg) => {\n let filteredConfigurable = acc.configurable;\n\n if (cfg.configurable) {\n filteredConfigurable = schemaKeys?.config\n ? filterObjectBySchemaKeys(cfg?.configurable, [\n ...this.constantSchemaKeys,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) =>\n searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\n if (graphSchema.config_schema?.properties) {\n configSchema = Object.keys(graphSchema.config_schema.properties);\n }\n if (!graphSchema.input_schema?.properties || !graphSchema.output_schema?.properties) {\n return { config: [], input: null, output: null };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input: inputSchema && inputSchema.length ? [...inputSchema, ...this.constantSchemaKeys] : null,\n output: outputSchema && outputSchema.length ? [...outputSchema, ...this.constantSchemaKeys] : null,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: this.constantSchemaKeys, output: this.constantSchemaKeys };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], tools: any): State {\n if (messages.length > 0 && \"role\" in messages[0] && messages[0].role === \"system\") {\n // remove system message\n messages = messages.slice(1);\n }\n\n // merge with existing messages\n const existingMessages: LangGraphPlatformMessage[] = state.messages || [];\n const existingMessageIds = new Set(existingMessages.map((message) => message.id));\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n const langGraphTools = [...(state.tools ?? []), ...(tools ?? [])].map(tool => {\n if (tool.type) {\n return tool\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n }\n }\n })\n\n return {\n ...state,\n messages: newMessages,\n tools: langGraphTools,\n };\n }\n\n startStep(nodeName: string) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: nodeName,\n });\n this.activeRun!.nodeName = nodeName;\n }\n\n endStep() {\n if (!this.activeRun!.nodeName) {\n throw new Error(\"No active step to end\");\n }\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n this.activeRun!.nodeName = undefined;\n }\n\n async getCheckpointByMessage(\n messageId: string,\n threadId: string,\n checkpoint?: null | {\n checkpoint_id?: null | string;\n checkpoint_ns: string;\n }\n ): Promise<ThreadState> {\n const options = checkpoint?.checkpoint_id ? {\n checkpoint: { checkpoint_id: checkpoint.checkpoint_id }\n } : undefined\n const history = await this.client.threads.getHistory(threadId, options);\n const reversed = [...history].reverse(); // oldest → newest\n\n let targetState = reversed.find((state) =>\n (state.values as State).messages?.some((m: LangGraphPlatformMessage) => m.id === messageId),\n );\n\n if (!targetState) throw new Error(\"Message not found\");\n\n const targetStateMessages = (targetState.values as State).messages ?? [];\n const messageIndex = targetStateMessages.findIndex(\n (m: LangGraphPlatformMessage) => m.id === messageId,\n );\n const messagesAfter = targetStateMessages.slice(messageIndex + 1);\n if (messagesAfter.length) {\n return this.getCheckpointByMessage(messageId, threadId, targetState.parent_checkpoint)\n }\n\n const targetStateIndex = reversed.indexOf(targetState);\n\n const { messages, ...targetStateValuesWithoutMessages } = targetState.values as State\n const selectedCheckpoint = reversed[targetStateIndex - 1] ?? { ...targetState, values: {} }\n return { ...selectedCheckpoint, values: { ...selectedCheckpoint.values, ...targetStateValuesWithoutMessages } };\n }\n}\n\nexport * from \"./types\";\n","import { AssistantGraph, Message } from \"@langchain/langgraph-sdk\";\nimport { MessageType } from \"@langchain/core/messages\";\n\nexport enum LangGraphEventTypes {\n OnChainStart = \"on_chain_start\",\n OnChainStream = \"on_chain_stream\",\n OnChainEnd = \"on_chain_end\",\n OnChatModelStart = \"on_chat_model_start\",\n OnChatModelStream = \"on_chat_model_stream\",\n OnChatModelEnd = \"on_chat_model_end\",\n OnToolStart = \"on_tool_start\",\n OnToolEnd = \"on_tool_end\",\n OnCustomEvent = \"on_custom_event\",\n OnInterrupt = \"on_interrupt\",\n}\n\nexport type State = Record<string, any>;\n\nexport type SchemaKeys = {\n input: string[] | null;\n output: string[] | null;\n config: string[] | null;\n} | null;\n\nexport type MessageInProgress = {\n id: string;\n toolCallId?: string | null;\n toolCallName?: string | null;\n};\n\nexport type ThinkingInProgress = {\n index: number;\n type?: LangGraphReasoning['type'];\n}\n\nexport interface RunMetadata {\n id: string;\n schemaKeys?: SchemaKeys;\n nodeName?: string;\n prevNodeName?: string | null;\n exitingNode?: boolean;\n manuallyEmittedState?: State | null;\n threadId?: string;\n graphInfo?: AssistantGraph\n}\n\nexport type MessagesInProgressRecord = Record<string, MessageInProgress | null>;\n\n// The following types are our own definition to the messages accepted by LangGraph Platform, enhanced with some of our extra data.\nexport interface ToolCall {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\ntype BaseLangGraphPlatformMessage = Omit<\n Message,\n | \"isResultMessage\"\n | \"isTextMessage\"\n | \"isImageMessage\"\n | \"isActionExecutionMessage\"\n | \"isAgentStateMessage\"\n | \"type\"\n | \"createdAt\"\n> & {\n content: string;\n role: string;\n additional_kwargs?: Record<string, unknown>;\n type: MessageType;\n};\n\ninterface LangGraphPlatformResultMessage extends BaseLangGraphPlatformMessage {\n tool_call_id: string;\n name: string;\n}\n\ninterface LangGraphPlatformActionExecutionMessage extends BaseLangGraphPlatformMessage {\n tool_calls: ToolCall[];\n}\n\nexport type LangGraphPlatformMessage =\n | LangGraphPlatformActionExecutionMessage\n | LangGraphPlatformResultMessage\n | BaseLangGraphPlatformMessage;\n\nexport enum CustomEventNames {\n ManuallyEmitMessage = \"manually_emit_message\",\n ManuallyEmitToolCall = \"manually_emit_tool_call\",\n ManuallyEmitState = \"manually_emit_state\",\n Exit = \"exit\",\n}\n\nexport interface PredictStateTool {\n tool: string;\n state_key: string;\n tool_argument: string;\n}\n\nexport interface LangGraphReasoning {\n type: 'text';\n text: string;\n index: number\n}\n","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys, LangGraphReasoning } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/client\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"messages\", \"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"ai\":\n const content = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: content ? stringifyIfNeeded(content) : '',\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n\nexport function resolveReasoningContent(eventData: any): LangGraphReasoning | null {\n const content = eventData.chunk?.content\n\n // Anthropic reasoning response\n if (content && Array.isArray(content) && content.length && content[0]) {\n if (!content[0].thinking) return null\n return {\n text: content[0].thinking,\n type: 'text',\n index: content[0].index,\n }\n }\n\n /// OpenAI reasoning response\n if (eventData.chunk.additional_kwargs?.reasoning?.summary?.[0]) {\n const data = eventData.chunk.additional_kwargs?.reasoning.summary[0]\n if (!data || !data.text) return null\n return {\n type: 'text',\n text: data.text,\n index: data.index,\n }\n }\n\n return null\n}\n\nexport function resolveMessageContent(content?: LangGraphMessage['content']): string | null {\n if (!content) return null;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content) && content.length) {\n const contentText = content.find(c => c.type === 'text')?.text\n return contentText ?? null;\n }\n\n return null\n}\n"],"mappings":"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","names":["HttpAgent","Observable","LangGraphClient","randomUUID","LangGraphEventTypes","CustomEventNames","AbstractAgent","EventType","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","resolveMessageContent","content","tc","aguiMessagesToLangChain","index","_b","item","resolveReasoningContent","eventData","_c","_d","_e","data","contentText","c","LangGraphAgent","AbstractAgent","config","_a","_b","DEFAULT_SCHEMA_KEYS","LangGraphClient","__spreadValues","event","input","Observable","subscriber","_c","threadId","randomUUID","streamMode","preparedStream","__spreadProps","messageCheckpoint","tools","timeTravelCheckpoint","fork","_d","_e","_f","_g","_h","inputThreadId","inputState","messages","context","forwardedProps","nodeNameInput","thread","agentState","agentStateMessages","inputMessagesToLangchain","aguiMessagesToLangChain","stateValuesDiff","threadState","stateValues","m","lastUserMessage","i","mode","nodeBefore","e","payloadInput","getStreamPayloadInput","payloadConfig","configsToMerge","payload","interrupts","EventType","interrupt","stream","_i","_j","shouldExit","streamResponse","state","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","chunk","chunkData","metadata","currentNodeName","eventType","node","tasks","isEndNode","writes","newNodeName","langchainMessagesToAgui","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","reasoningData","resolveReasoningContent","messageContent","resolveMessageContent","isMessageContentEvent","isMessageEndEvent","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","graphSchema","configSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","newMessages","langGraphTools","tool","nodeName","messageId","checkpoint","options","reversed","targetState","targetStateMessages","messageIndex","targetStateIndex","targetStateValuesWithoutMessages","__objRest","selectedCheckpoint","LangGraphHttpAgent","HttpAgent"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ag-ui/langgraph",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
@@ -14,11 +14,11 @@
14
14
  "README.md"
15
15
  ],
16
16
  "dependencies": {
17
- "@langchain/core": "^0.3.38",
18
- "@langchain/langgraph-sdk": "^0.0.78",
17
+ "@langchain/core": "^0.3.66",
18
+ "@langchain/langgraph-sdk": "^0.0.105",
19
19
  "partial-json": "^0.1.7",
20
20
  "rxjs": "7.8.1",
21
- "@ag-ui/client": "0.0.35"
21
+ "@ag-ui/client": "0.0.36"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/jest": "^29.5.14",
@@ -31,7 +31,7 @@
31
31
  "scripts": {
32
32
  "build": "tsup",
33
33
  "dev": "tsup --watch",
34
- "clean": "rm -rf dist",
34
+ "clean": "rm -rf dist .turbo node_modules",
35
35
  "typecheck": "tsc --noEmit",
36
36
  "test": "jest",
37
37
  "link:global": "pnpm link --global",