@copilotkit/runtime 0.0.0-fix-global-styles-20260220090200 → 0.0.0-fix-langgraphhttpagent-loadagentstate-20260220224632

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.
Files changed (44) hide show
  1. package/CHANGELOG.md +6 -4
  2. package/dist/langgraph.cjs +5 -3
  3. package/dist/langgraph.d.cts +3 -1
  4. package/dist/langgraph.d.mts +3 -1
  5. package/dist/langgraph.mjs +3 -1
  6. package/dist/lib/runtime/agent-integrations/langgraph/agent.cjs +14 -0
  7. package/dist/lib/runtime/agent-integrations/langgraph/agent.cjs.map +1 -1
  8. package/dist/lib/runtime/agent-integrations/langgraph/agent.d.cts +22 -4
  9. package/dist/lib/runtime/agent-integrations/langgraph/agent.d.cts.map +1 -1
  10. package/dist/lib/runtime/agent-integrations/langgraph/agent.d.mts +22 -4
  11. package/dist/lib/runtime/agent-integrations/langgraph/agent.d.mts.map +1 -1
  12. package/dist/lib/runtime/agent-integrations/langgraph/agent.mjs +14 -1
  13. package/dist/lib/runtime/agent-integrations/langgraph/agent.mjs.map +1 -1
  14. package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.cjs +62 -0
  15. package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.cjs.map +1 -0
  16. package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.d.cts +15 -0
  17. package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.d.cts.map +1 -0
  18. package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.d.mts +15 -0
  19. package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.d.mts.map +1 -0
  20. package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.mjs +61 -0
  21. package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.mjs.map +1 -0
  22. package/dist/lib/runtime/agent-integrations/langgraph/index.d.cts +3 -1
  23. package/dist/lib/runtime/agent-integrations/langgraph/index.d.mts +3 -1
  24. package/dist/lib/runtime/agent-integrations/langgraph/load-state.cjs +80 -0
  25. package/dist/lib/runtime/agent-integrations/langgraph/load-state.cjs.map +1 -0
  26. package/dist/lib/runtime/agent-integrations/langgraph/load-state.d.cts +21 -0
  27. package/dist/lib/runtime/agent-integrations/langgraph/load-state.d.cts.map +1 -0
  28. package/dist/lib/runtime/agent-integrations/langgraph/load-state.d.mts +21 -0
  29. package/dist/lib/runtime/agent-integrations/langgraph/load-state.d.mts.map +1 -0
  30. package/dist/lib/runtime/agent-integrations/langgraph/load-state.mjs +79 -0
  31. package/dist/lib/runtime/agent-integrations/langgraph/load-state.mjs.map +1 -0
  32. package/dist/lib/runtime/copilot-runtime.d.cts +4 -4
  33. package/dist/lib/runtime/copilot-runtime.d.cts.map +1 -1
  34. package/dist/lib/runtime/copilot-runtime.d.mts +4 -4
  35. package/dist/lib/runtime/copilot-runtime.d.mts.map +1 -1
  36. package/dist/package.cjs +2 -1
  37. package/dist/package.mjs +2 -1
  38. package/package.json +11 -10
  39. package/src/lib/runtime/agent-integrations/langgraph/agent.ts +31 -2
  40. package/src/lib/runtime/agent-integrations/langgraph/convert-messages.test.ts +206 -0
  41. package/src/lib/runtime/agent-integrations/langgraph/convert-messages.ts +86 -0
  42. package/src/lib/runtime/agent-integrations/langgraph/index.ts +2 -0
  43. package/src/lib/runtime/agent-integrations/langgraph/load-state.test.ts +167 -0
  44. package/src/lib/runtime/agent-integrations/langgraph/load-state.ts +136 -0
package/CHANGELOG.md CHANGED
@@ -1,14 +1,16 @@
1
1
  # @copilotkit/runtime
2
2
 
3
- ## 0.0.0-fix-global-styles-20260220090200
3
+ ## 0.0.0-fix-langgraphhttpagent-loadagentstate-20260220224632
4
4
 
5
5
  ### Patch Changes
6
6
 
7
+ - 3334faf: feat(runtime): add thread rehydration support for LangGraph agents
7
8
  - ef0f539: Add reasoning support and default components for reasoning messages
9
+ - Updated dependencies [3334faf]
8
10
  - Updated dependencies [ef0f539]
9
- - @copilotkitnext/runtime@0.0.0-fix-global-styles-20260220090200
10
- - @copilotkit/shared@0.0.0-fix-global-styles-20260220090200
11
- - @copilotkitnext/agent@0.0.0-fix-global-styles-20260220090200
11
+ - @copilotkitnext/runtime@0.0.0-fix-langgraphhttpagent-loadagentstate-20260220224632
12
+ - @copilotkit/shared@0.0.0-fix-langgraphhttpagent-loadagentstate-20260220224632
13
+ - @copilotkitnext/agent@0.0.0-fix-langgraphhttpagent-loadagentstate-20260220224632
12
14
 
13
15
  ## 1.51.5-next.3
14
16
 
@@ -1,10 +1,12 @@
1
1
  require("reflect-metadata");
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
- const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
4
3
  const require_consts = require('./lib/runtime/agent-integrations/langgraph/consts.cjs');
5
4
  const require_agent = require('./lib/runtime/agent-integrations/langgraph/agent.cjs');
6
- let _ag_ui_langgraph = require("@ag-ui/langgraph");
5
+ const require_convert_messages = require('./lib/runtime/agent-integrations/langgraph/convert-messages.cjs');
6
+ const require_load_state = require('./lib/runtime/agent-integrations/langgraph/load-state.cjs');
7
7
 
8
8
  exports.CustomEventNames = require_consts.CustomEventNames;
9
9
  exports.LangGraphAgent = require_agent.LangGraphAgent;
10
- exports.LangGraphHttpAgent = _ag_ui_langgraph.LangGraphHttpAgent;
10
+ exports.LangGraphHttpAgent = require_agent.LangGraphHttpAgent;
11
+ exports.convertLangGraphMessages = require_convert_messages.convertLangGraphMessages;
12
+ exports.loadLangGraphPostgresState = require_load_state.loadLangGraphPostgresState;
@@ -1,5 +1,7 @@
1
1
 
2
2
  import { CustomEventNames, PredictStateTool, TextMessageEvents, ToolCallEvents } from "./lib/runtime/agent-integrations/langgraph/consts.cjs";
3
3
  import { LangGraphAgent, LangGraphHttpAgent } from "./lib/runtime/agent-integrations/langgraph/agent.cjs";
4
+ import { convertLangGraphMessages } from "./lib/runtime/agent-integrations/langgraph/convert-messages.cjs";
5
+ import { PostgresClient, loadLangGraphPostgresState } from "./lib/runtime/agent-integrations/langgraph/load-state.cjs";
4
6
  import "./lib/runtime/agent-integrations/langgraph/index.cjs";
5
- export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent, PredictStateTool, TextMessageEvents, ToolCallEvents };
7
+ export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent, PostgresClient, PredictStateTool, TextMessageEvents, ToolCallEvents, convertLangGraphMessages, loadLangGraphPostgresState };
@@ -1,5 +1,7 @@
1
1
  import "reflect-metadata";
2
2
  import { CustomEventNames, PredictStateTool, TextMessageEvents, ToolCallEvents } from "./lib/runtime/agent-integrations/langgraph/consts.mjs";
3
3
  import { LangGraphAgent, LangGraphHttpAgent } from "./lib/runtime/agent-integrations/langgraph/agent.mjs";
4
+ import { convertLangGraphMessages } from "./lib/runtime/agent-integrations/langgraph/convert-messages.mjs";
5
+ import { PostgresClient, loadLangGraphPostgresState } from "./lib/runtime/agent-integrations/langgraph/load-state.mjs";
4
6
  import "./lib/runtime/agent-integrations/langgraph/index.mjs";
5
- export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent, PredictStateTool, TextMessageEvents, ToolCallEvents };
7
+ export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent, PostgresClient, PredictStateTool, TextMessageEvents, ToolCallEvents, convertLangGraphMessages, loadLangGraphPostgresState };
@@ -1,5 +1,7 @@
1
1
  import "reflect-metadata";
2
2
  import { CustomEventNames } from "./lib/runtime/agent-integrations/langgraph/consts.mjs";
3
3
  import { LangGraphAgent, LangGraphHttpAgent } from "./lib/runtime/agent-integrations/langgraph/agent.mjs";
4
+ import { convertLangGraphMessages } from "./lib/runtime/agent-integrations/langgraph/convert-messages.mjs";
5
+ import { loadLangGraphPostgresState } from "./lib/runtime/agent-integrations/langgraph/load-state.mjs";
4
6
 
5
- export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent };
7
+ export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent, convertLangGraphMessages, loadLangGraphPostgresState };
@@ -128,8 +128,22 @@ var LangGraphAgent = class extends _ag_ui_langgraph.LangGraphAgent {
128
128
  context: schemaKeys.context ? [...schemaKeys.context, ...CONSTANT_KEYS] : null
129
129
  };
130
130
  }
131
+ async loadState(threadId) {
132
+ return { state: (await this.client.threads.getState(threadId)).values };
133
+ }
134
+ };
135
+ var LangGraphHttpAgent = class extends _ag_ui_langgraph.LangGraphHttpAgent {
136
+ constructor(config) {
137
+ super(config);
138
+ this._loadState = config.loadState;
139
+ }
140
+ async loadState(threadId, headers) {
141
+ if (!this._loadState) return null;
142
+ return this._loadState(threadId, headers);
143
+ }
131
144
  };
132
145
 
133
146
  //#endregion
134
147
  exports.LangGraphAgent = LangGraphAgent;
148
+ exports.LangGraphHttpAgent = LangGraphHttpAgent;
135
149
  //# sourceMappingURL=agent.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.cjs","names":["AGUILangGraphAgent","EventType","CustomEventNames","LangGraphEventTypes"],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["import { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport { RawEvent } from \"@ag-ui/core\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent,\n type LangGraphAgentConfig,\n ProcessedEvents,\n SchemaKeys,\n type State,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport { Message as LangGraphMessage } from \"@langchain/langgraph-sdk/dist/types.messages\";\nimport { ThreadState } from \"@langchain/langgraph-sdk\";\n\ninterface CopilotKitStateEnrichment {\n copilotkit: {\n actions: StateEnrichment[\"ag-ui\"][\"tools\"];\n context: StateEnrichment[\"ag-ui\"][\"context\"];\n };\n}\n\nimport { RunAgentInput, EventType, CustomEvent } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport {\n CustomEventNames,\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nexport { CustomEventNames };\n\nexport class LangGraphAgent extends AGUILangGraphAgent {\n constructor(config: LangGraphAgentConfig) {\n super(config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n if (event.type === EventType.CUSTOM) {\n // const event = processedEvent as unknown as CustomEvent;\n const customEvent = event as unknown as CustomEvent;\n\n if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitMessage) {\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: customEvent.value.message_id,\n delta: customEvent.value.message,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall\n ) {\n this.subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId: customEvent.value.id,\n toolCallName: customEvent.value.name,\n parentMessageId: customEvent.value.id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: customEvent.value.id,\n delta: customEvent.value.args,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId: customEvent.value.id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name ===\n CustomEventNames.CopilotKitManuallyEmitIntermediateState\n ) {\n this.activeRun.manuallyEmittedState = customEvent.value;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun.manuallyEmittedState,\n } as ThreadState<State>),\n rawEvent: event,\n });\n return true;\n }\n\n if (customEvent.name === CustomEventNames.CopilotKitExit) {\n this.subscriber.next({\n type: EventType.CUSTOM,\n name: \"Exit\",\n value: true,\n });\n return true;\n }\n }\n\n // Intercept all text message and tool call events and check if should disable\n const rawEvent = (event as ToolCallEvents | TextMessageEvents).rawEvent;\n if (!rawEvent) {\n this.subscriber.next(event);\n return true;\n }\n\n const isMessageEvent =\n event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CONTENT ||\n event.type === EventType.TEXT_MESSAGE_END;\n const isToolEvent =\n event.type === EventType.TOOL_CALL_START ||\n event.type === EventType.TOOL_CALL_ARGS ||\n event.type === EventType.TOOL_CALL_END;\n if (\"copilotkit:emit-tool-calls\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-tool-calls\"] === false &&\n isToolEvent\n ) {\n return false;\n }\n }\n if (\"copilotkit:emit-messages\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-messages\"] === false &&\n isMessageEvent\n ) {\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput) {\n return super.run(input).pipe(\n map((processedEvent) => {\n // Turn raw event into emit state snapshot from tool call event\n if (processedEvent.type === EventType.RAW) {\n // Get the LangGraph event from the AGUI event.\n const event =\n (processedEvent as RawEvent).event ??\n (processedEvent as RawEvent).rawEvent;\n\n const eventType = event.event;\n const toolCallData = event.data?.chunk?.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata?.[\n \"copilotkit:emit-intermediate-state\"\n ]?.some(\n (predictStateTool: PredictStateTool) =>\n predictStateTool.tool === toolCallData?.name,\n );\n\n if (\n eventType === LangGraphEventTypes.OnChatModelStream &&\n toolCallUsedToPredictState\n ) {\n return {\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"copilotkit:emit-intermediate-state\"],\n };\n }\n }\n\n return processedEvent;\n }),\n );\n }\n\n langGraphDefaultMergeState(\n state: State,\n messages: LangGraphMessage[],\n input: RunAgentInput,\n ): State<StateEnrichment & CopilotKitStateEnrichment> {\n const aguiMergedState = super.langGraphDefaultMergeState(\n state,\n messages,\n input,\n );\n const { tools: returnedTools, \"ag-ui\": agui } = aguiMergedState;\n // tolerate undefined and de-duplicate by stable key (id | name | key)\n const rawCombinedTools = [\n ...((returnedTools as any[]) ?? []),\n ...((agui?.tools as any[]) ?? []),\n ];\n const combinedTools = Array.from(\n new Map(\n rawCombinedTools.map((t: any) => [\n t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t),\n t,\n ]),\n ).values(),\n );\n\n return {\n ...aguiMergedState,\n copilotkit: {\n actions: combinedTools,\n context: agui?.context ?? [],\n },\n };\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"copilotkit\"];\n const schemaKeys = await super.getSchemaKeys();\n return {\n config: schemaKeys.config,\n input: schemaKeys.input ? [...schemaKeys.input, ...CONSTANT_KEYS] : null,\n output: schemaKeys.output\n ? [...schemaKeys.output, ...CONSTANT_KEYS]\n : null,\n context: schemaKeys.context\n ? [...schemaKeys.context, ...CONSTANT_KEYS]\n : null,\n };\n }\n}\n\nexport { LangGraphHttpAgent };\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent.cjs","names":["AGUILangGraphAgent","EventType","CustomEventNames","LangGraphEventTypes","AGUILangGraphHttpAgent"],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["import { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport { RawEvent } from \"@ag-ui/core\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent as AGUILangGraphHttpAgent,\n type LangGraphAgentConfig,\n ProcessedEvents,\n SchemaKeys,\n type State,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport type { HttpAgentConfig, Message } from \"@ag-ui/client\";\nimport { Message as LangGraphMessage } from \"@langchain/langgraph-sdk/dist/types.messages\";\nimport { ThreadState } from \"@langchain/langgraph-sdk\";\n\ninterface CopilotKitStateEnrichment {\n copilotkit: {\n actions: StateEnrichment[\"ag-ui\"][\"tools\"];\n context: StateEnrichment[\"ag-ui\"][\"context\"];\n };\n}\n\nimport { RunAgentInput, EventType, CustomEvent } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport {\n CustomEventNames,\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nexport { CustomEventNames };\n\nexport class LangGraphAgent extends AGUILangGraphAgent {\n constructor(config: LangGraphAgentConfig) {\n super(config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n if (event.type === EventType.CUSTOM) {\n // const event = processedEvent as unknown as CustomEvent;\n const customEvent = event as unknown as CustomEvent;\n\n if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitMessage) {\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: customEvent.value.message_id,\n delta: customEvent.value.message,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall\n ) {\n this.subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId: customEvent.value.id,\n toolCallName: customEvent.value.name,\n parentMessageId: customEvent.value.id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: customEvent.value.id,\n delta: customEvent.value.args,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId: customEvent.value.id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name ===\n CustomEventNames.CopilotKitManuallyEmitIntermediateState\n ) {\n this.activeRun.manuallyEmittedState = customEvent.value;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun.manuallyEmittedState,\n } as ThreadState<State>),\n rawEvent: event,\n });\n return true;\n }\n\n if (customEvent.name === CustomEventNames.CopilotKitExit) {\n this.subscriber.next({\n type: EventType.CUSTOM,\n name: \"Exit\",\n value: true,\n });\n return true;\n }\n }\n\n // Intercept all text message and tool call events and check if should disable\n const rawEvent = (event as ToolCallEvents | TextMessageEvents).rawEvent;\n if (!rawEvent) {\n this.subscriber.next(event);\n return true;\n }\n\n const isMessageEvent =\n event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CONTENT ||\n event.type === EventType.TEXT_MESSAGE_END;\n const isToolEvent =\n event.type === EventType.TOOL_CALL_START ||\n event.type === EventType.TOOL_CALL_ARGS ||\n event.type === EventType.TOOL_CALL_END;\n if (\"copilotkit:emit-tool-calls\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-tool-calls\"] === false &&\n isToolEvent\n ) {\n return false;\n }\n }\n if (\"copilotkit:emit-messages\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-messages\"] === false &&\n isMessageEvent\n ) {\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput) {\n return super.run(input).pipe(\n map((processedEvent) => {\n // Turn raw event into emit state snapshot from tool call event\n if (processedEvent.type === EventType.RAW) {\n // Get the LangGraph event from the AGUI event.\n const event =\n (processedEvent as RawEvent).event ??\n (processedEvent as RawEvent).rawEvent;\n\n const eventType = event.event;\n const toolCallData = event.data?.chunk?.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata?.[\n \"copilotkit:emit-intermediate-state\"\n ]?.some(\n (predictStateTool: PredictStateTool) =>\n predictStateTool.tool === toolCallData?.name,\n );\n\n if (\n eventType === LangGraphEventTypes.OnChatModelStream &&\n toolCallUsedToPredictState\n ) {\n return {\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"copilotkit:emit-intermediate-state\"],\n };\n }\n }\n\n return processedEvent;\n }),\n );\n }\n\n langGraphDefaultMergeState(\n state: State,\n messages: LangGraphMessage[],\n input: RunAgentInput,\n ): State<StateEnrichment & CopilotKitStateEnrichment> {\n const aguiMergedState = super.langGraphDefaultMergeState(\n state,\n messages,\n input,\n );\n const { tools: returnedTools, \"ag-ui\": agui } = aguiMergedState;\n // tolerate undefined and de-duplicate by stable key (id | name | key)\n const rawCombinedTools = [\n ...((returnedTools as any[]) ?? []),\n ...((agui?.tools as any[]) ?? []),\n ];\n const combinedTools = Array.from(\n new Map(\n rawCombinedTools.map((t: any) => [\n t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t),\n t,\n ]),\n ).values(),\n );\n\n return {\n ...aguiMergedState,\n copilotkit: {\n actions: combinedTools,\n context: agui?.context ?? [],\n },\n };\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"copilotkit\"];\n const schemaKeys = await super.getSchemaKeys();\n return {\n config: schemaKeys.config,\n input: schemaKeys.input ? [...schemaKeys.input, ...CONSTANT_KEYS] : null,\n output: schemaKeys.output\n ? [...schemaKeys.output, ...CONSTANT_KEYS]\n : null,\n context: schemaKeys.context\n ? [...schemaKeys.context, ...CONSTANT_KEYS]\n : null,\n };\n }\n\n async loadState(threadId: string) {\n const threadState = await this.client.threads.getState(threadId);\n return {\n state: threadState.values as Record<string, any>,\n };\n }\n}\n\ntype LoadStateFn = (\n threadId: string,\n headers?: Record<string, string>,\n) => Promise<{ state: Record<string, any>; messages?: Message[] } | null>;\n\ninterface LangGraphHttpAgentConfig extends HttpAgentConfig {\n loadState?: LoadStateFn;\n}\n\nexport class LangGraphHttpAgent extends AGUILangGraphHttpAgent {\n private _loadState?: LoadStateFn;\n\n constructor(config: LangGraphHttpAgentConfig) {\n super(config);\n this._loadState = config.loadState;\n }\n\n async loadState(threadId: string, headers?: Record<string, string>) {\n if (!this._loadState) return null;\n return this._loadState(threadId, headers);\n }\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
 
2
2
  import { CustomEventNames } from "./consts.cjs";
3
3
  import * as rxjs from "rxjs";
4
- import { EventType, RunAgentInput } from "@ag-ui/client";
4
+ import { EventType, HttpAgentConfig, Message, RunAgentInput } from "@ag-ui/client";
5
5
  import * as zod from "zod";
6
6
  import { LangGraphAgent, LangGraphAgentConfig, LangGraphHttpAgent, ProcessedEvents, SchemaKeys, State, StateEnrichment } from "@ag-ui/langgraph";
7
- import { Message } from "@langchain/langgraph-sdk/dist/types.messages";
7
+ import { Message as Message$1 } from "@langchain/langgraph-sdk/dist/types.messages";
8
8
 
9
9
  //#region src/lib/runtime/agent-integrations/langgraph/agent.d.ts
10
10
  interface CopilotKitStateEnrichment {
@@ -843,9 +843,27 @@ declare class LangGraphAgent$1 extends LangGraphAgent {
843
843
  name: string;
844
844
  value: any;
845
845
  }>;
846
- langGraphDefaultMergeState(state: State, messages: Message[], input: RunAgentInput): State<StateEnrichment & CopilotKitStateEnrichment>;
846
+ langGraphDefaultMergeState(state: State, messages: Message$1[], input: RunAgentInput): State<StateEnrichment & CopilotKitStateEnrichment>;
847
847
  getSchemaKeys(): Promise<SchemaKeys>;
848
+ loadState(threadId: string): Promise<{
849
+ state: Record<string, any>;
850
+ }>;
851
+ }
852
+ type LoadStateFn = (threadId: string, headers?: Record<string, string>) => Promise<{
853
+ state: Record<string, any>;
854
+ messages?: Message[];
855
+ } | null>;
856
+ interface LangGraphHttpAgentConfig extends HttpAgentConfig {
857
+ loadState?: LoadStateFn;
858
+ }
859
+ declare class LangGraphHttpAgent$1 extends LangGraphHttpAgent {
860
+ private _loadState?;
861
+ constructor(config: LangGraphHttpAgentConfig);
862
+ loadState(threadId: string, headers?: Record<string, string>): Promise<{
863
+ state: Record<string, any>;
864
+ messages?: Message[];
865
+ }>;
848
866
  }
849
867
  //#endregion
850
- export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent };
868
+ export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent$1 as LangGraphHttpAgent };
851
869
  //# sourceMappingURL=agent.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.cts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;;UAeU,yBAAA;EACR,UAAA;IACE,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;EAAA;AAAA;AAAA,cAeA,gBAAA,SAAuB,cAAA;cACtB,MAAA,EAAQ,oBAAA;EAIpB,aAAA,CAAc,KAAA,EAAO,eAAA;EAgHrB,GAAA,CAAI,KAAA,EAAO,aAAA,QAAa,UAAA,KAAA,gBAAA;+BAAA,GAAA,CAAA,SAAA;;;;;;;+BAAA,GAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCxB,0BAAA,CACE,KAAA,EAAO,KAAA,EACP,QAAA,EAAU,OAAA,IACV,KAAA,EAAO,aAAA,GACN,KAAA,CAAM,eAAA,GAAkB,yBAAA;EA8BrB,aAAA,CAAA,GAAiB,OAAA,CAAQ,UAAA;AAAA"}
1
+ {"version":3,"file":"agent.d.cts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;;UAgBU,yBAAA;EACR,UAAA;IACE,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;EAAA;AAAA;AAAA,cAeA,gBAAA,SAAuB,cAAA;cACtB,MAAA,EAAQ,oBAAA;EAIpB,aAAA,CAAc,KAAA,EAAO,eAAA;EAgHrB,GAAA,CAAI,KAAA,EAAO,aAAA,QAAa,UAAA,KAAA,gBAAA;+BAAA,GAAA,CAAA,SAAA;;;;;;;+BAAA,GAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCxB,0BAAA,CACE,KAAA,EAAO,KAAA,EACP,QAAA,EAAU,SAAA,IACV,KAAA,EAAO,aAAA,GACN,KAAA,CAAM,eAAA,GAAkB,yBAAA;EA8BrB,aAAA,CAAA,GAAiB,OAAA,CAAQ,UAAA;EAezB,SAAA,CAAU,QAAA,WAAgB,OAAA;WAGC,MAAA;EAAA;AAAA;AAAA,KAK9B,WAAA,IACH,QAAA,UACA,OAAA,GAAU,MAAA,qBACP,OAAA;EAAU,KAAA,EAAO,MAAA;EAAqB,QAAA,GAAW,OAAA;AAAA;AAAA,UAE5C,wBAAA,SAAiC,eAAA;EACzC,SAAA,GAAY,WAAA;AAAA;AAAA,cAGD,oBAAA,SAA2B,kBAAA;EAAA,QAC9B,UAAA;cAEI,MAAA,EAAQ,wBAAA;EAKd,SAAA,CAAU,QAAA,UAAkB,OAAA,GAAU,MAAA,mBAAsB,OAAA;WAd9C,MAAA;eAAgC,OAAA;EAAA;AAAA"}
@@ -2,9 +2,9 @@ import "reflect-metadata";
2
2
  import { CustomEventNames } from "./consts.mjs";
3
3
  import * as rxjs from "rxjs";
4
4
  import { LangGraphAgent, LangGraphAgentConfig, LangGraphHttpAgent, ProcessedEvents, SchemaKeys, State, StateEnrichment } from "@ag-ui/langgraph";
5
- import { EventType, RunAgentInput } from "@ag-ui/client";
5
+ import { EventType, HttpAgentConfig, Message, RunAgentInput } from "@ag-ui/client";
6
6
  import * as zod from "zod";
7
- import { Message } from "@langchain/langgraph-sdk/dist/types.messages";
7
+ import { Message as Message$1 } from "@langchain/langgraph-sdk/dist/types.messages";
8
8
 
9
9
  //#region src/lib/runtime/agent-integrations/langgraph/agent.d.ts
10
10
  interface CopilotKitStateEnrichment {
@@ -843,9 +843,27 @@ declare class LangGraphAgent$1 extends LangGraphAgent {
843
843
  name: string;
844
844
  value: any;
845
845
  }>;
846
- langGraphDefaultMergeState(state: State, messages: Message[], input: RunAgentInput): State<StateEnrichment & CopilotKitStateEnrichment>;
846
+ langGraphDefaultMergeState(state: State, messages: Message$1[], input: RunAgentInput): State<StateEnrichment & CopilotKitStateEnrichment>;
847
847
  getSchemaKeys(): Promise<SchemaKeys>;
848
+ loadState(threadId: string): Promise<{
849
+ state: Record<string, any>;
850
+ }>;
851
+ }
852
+ type LoadStateFn = (threadId: string, headers?: Record<string, string>) => Promise<{
853
+ state: Record<string, any>;
854
+ messages?: Message[];
855
+ } | null>;
856
+ interface LangGraphHttpAgentConfig extends HttpAgentConfig {
857
+ loadState?: LoadStateFn;
858
+ }
859
+ declare class LangGraphHttpAgent$1 extends LangGraphHttpAgent {
860
+ private _loadState?;
861
+ constructor(config: LangGraphHttpAgentConfig);
862
+ loadState(threadId: string, headers?: Record<string, string>): Promise<{
863
+ state: Record<string, any>;
864
+ messages?: Message[];
865
+ }>;
848
866
  }
849
867
  //#endregion
850
- export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent };
868
+ export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent$1 as LangGraphHttpAgent };
851
869
  //# sourceMappingURL=agent.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.mts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;;UAeU,yBAAA;EACR,UAAA;IACE,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;EAAA;AAAA;AAAA,cAeA,gBAAA,SAAuB,cAAA;cACtB,MAAA,EAAQ,oBAAA;EAIpB,aAAA,CAAc,KAAA,EAAO,eAAA;EAgHrB,GAAA,CAAI,KAAA,EAAO,aAAA,QAAa,UAAA,KAAA,gBAAA;+BAAA,GAAA,CAAA,SAAA;;;;;;;+BAAA,GAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCxB,0BAAA,CACE,KAAA,EAAO,KAAA,EACP,QAAA,EAAU,OAAA,IACV,KAAA,EAAO,aAAA,GACN,KAAA,CAAM,eAAA,GAAkB,yBAAA;EA8BrB,aAAA,CAAA,GAAiB,OAAA,CAAQ,UAAA;AAAA"}
1
+ {"version":3,"file":"agent.d.mts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;;UAgBU,yBAAA;EACR,UAAA;IACE,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;EAAA;AAAA;AAAA,cAeA,gBAAA,SAAuB,cAAA;cACtB,MAAA,EAAQ,oBAAA;EAIpB,aAAA,CAAc,KAAA,EAAO,eAAA;EAgHrB,GAAA,CAAI,KAAA,EAAO,aAAA,QAAa,UAAA,KAAA,gBAAA;+BAAA,GAAA,CAAA,SAAA;;;;;;;+BAAA,GAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCxB,0BAAA,CACE,KAAA,EAAO,KAAA,EACP,QAAA,EAAU,SAAA,IACV,KAAA,EAAO,aAAA,GACN,KAAA,CAAM,eAAA,GAAkB,yBAAA;EA8BrB,aAAA,CAAA,GAAiB,OAAA,CAAQ,UAAA;EAezB,SAAA,CAAU,QAAA,WAAgB,OAAA;WAGC,MAAA;EAAA;AAAA;AAAA,KAK9B,WAAA,IACH,QAAA,UACA,OAAA,GAAU,MAAA,qBACP,OAAA;EAAU,KAAA,EAAO,MAAA;EAAqB,QAAA,GAAW,OAAA;AAAA;AAAA,UAE5C,wBAAA,SAAiC,eAAA;EACzC,SAAA,GAAY,WAAA;AAAA;AAAA,cAGD,oBAAA,SAA2B,kBAAA;EAAA,QAC9B,UAAA;cAEI,MAAA,EAAQ,wBAAA;EAKd,SAAA,CAAU,QAAA,UAAkB,OAAA,GAAU,MAAA,mBAAsB,OAAA;WAd9C,MAAA;eAAgC,OAAA;EAAA;AAAA"}
@@ -127,8 +127,21 @@ var LangGraphAgent$1 = class extends LangGraphAgent {
127
127
  context: schemaKeys.context ? [...schemaKeys.context, ...CONSTANT_KEYS] : null
128
128
  };
129
129
  }
130
+ async loadState(threadId) {
131
+ return { state: (await this.client.threads.getState(threadId)).values };
132
+ }
133
+ };
134
+ var LangGraphHttpAgent$1 = class extends LangGraphHttpAgent {
135
+ constructor(config) {
136
+ super(config);
137
+ this._loadState = config.loadState;
138
+ }
139
+ async loadState(threadId, headers) {
140
+ if (!this._loadState) return null;
141
+ return this._loadState(threadId, headers);
142
+ }
130
143
  };
131
144
 
132
145
  //#endregion
133
- export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent };
146
+ export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent$1 as LangGraphHttpAgent };
134
147
  //# sourceMappingURL=agent.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.mjs","names":["LangGraphAgent","AGUILangGraphAgent"],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["import { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport { RawEvent } from \"@ag-ui/core\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent,\n type LangGraphAgentConfig,\n ProcessedEvents,\n SchemaKeys,\n type State,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport { Message as LangGraphMessage } from \"@langchain/langgraph-sdk/dist/types.messages\";\nimport { ThreadState } from \"@langchain/langgraph-sdk\";\n\ninterface CopilotKitStateEnrichment {\n copilotkit: {\n actions: StateEnrichment[\"ag-ui\"][\"tools\"];\n context: StateEnrichment[\"ag-ui\"][\"context\"];\n };\n}\n\nimport { RunAgentInput, EventType, CustomEvent } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport {\n CustomEventNames,\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nexport { CustomEventNames };\n\nexport class LangGraphAgent extends AGUILangGraphAgent {\n constructor(config: LangGraphAgentConfig) {\n super(config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n if (event.type === EventType.CUSTOM) {\n // const event = processedEvent as unknown as CustomEvent;\n const customEvent = event as unknown as CustomEvent;\n\n if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitMessage) {\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: customEvent.value.message_id,\n delta: customEvent.value.message,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall\n ) {\n this.subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId: customEvent.value.id,\n toolCallName: customEvent.value.name,\n parentMessageId: customEvent.value.id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: customEvent.value.id,\n delta: customEvent.value.args,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId: customEvent.value.id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name ===\n CustomEventNames.CopilotKitManuallyEmitIntermediateState\n ) {\n this.activeRun.manuallyEmittedState = customEvent.value;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun.manuallyEmittedState,\n } as ThreadState<State>),\n rawEvent: event,\n });\n return true;\n }\n\n if (customEvent.name === CustomEventNames.CopilotKitExit) {\n this.subscriber.next({\n type: EventType.CUSTOM,\n name: \"Exit\",\n value: true,\n });\n return true;\n }\n }\n\n // Intercept all text message and tool call events and check if should disable\n const rawEvent = (event as ToolCallEvents | TextMessageEvents).rawEvent;\n if (!rawEvent) {\n this.subscriber.next(event);\n return true;\n }\n\n const isMessageEvent =\n event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CONTENT ||\n event.type === EventType.TEXT_MESSAGE_END;\n const isToolEvent =\n event.type === EventType.TOOL_CALL_START ||\n event.type === EventType.TOOL_CALL_ARGS ||\n event.type === EventType.TOOL_CALL_END;\n if (\"copilotkit:emit-tool-calls\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-tool-calls\"] === false &&\n isToolEvent\n ) {\n return false;\n }\n }\n if (\"copilotkit:emit-messages\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-messages\"] === false &&\n isMessageEvent\n ) {\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput) {\n return super.run(input).pipe(\n map((processedEvent) => {\n // Turn raw event into emit state snapshot from tool call event\n if (processedEvent.type === EventType.RAW) {\n // Get the LangGraph event from the AGUI event.\n const event =\n (processedEvent as RawEvent).event ??\n (processedEvent as RawEvent).rawEvent;\n\n const eventType = event.event;\n const toolCallData = event.data?.chunk?.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata?.[\n \"copilotkit:emit-intermediate-state\"\n ]?.some(\n (predictStateTool: PredictStateTool) =>\n predictStateTool.tool === toolCallData?.name,\n );\n\n if (\n eventType === LangGraphEventTypes.OnChatModelStream &&\n toolCallUsedToPredictState\n ) {\n return {\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"copilotkit:emit-intermediate-state\"],\n };\n }\n }\n\n return processedEvent;\n }),\n );\n }\n\n langGraphDefaultMergeState(\n state: State,\n messages: LangGraphMessage[],\n input: RunAgentInput,\n ): State<StateEnrichment & CopilotKitStateEnrichment> {\n const aguiMergedState = super.langGraphDefaultMergeState(\n state,\n messages,\n input,\n );\n const { tools: returnedTools, \"ag-ui\": agui } = aguiMergedState;\n // tolerate undefined and de-duplicate by stable key (id | name | key)\n const rawCombinedTools = [\n ...((returnedTools as any[]) ?? []),\n ...((agui?.tools as any[]) ?? []),\n ];\n const combinedTools = Array.from(\n new Map(\n rawCombinedTools.map((t: any) => [\n t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t),\n t,\n ]),\n ).values(),\n );\n\n return {\n ...aguiMergedState,\n copilotkit: {\n actions: combinedTools,\n context: agui?.context ?? [],\n },\n };\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"copilotkit\"];\n const schemaKeys = await super.getSchemaKeys();\n return {\n config: schemaKeys.config,\n input: schemaKeys.input ? [...schemaKeys.input, ...CONSTANT_KEYS] : null,\n output: schemaKeys.output\n ? [...schemaKeys.output, ...CONSTANT_KEYS]\n : null,\n context: schemaKeys.context\n ? [...schemaKeys.context, ...CONSTANT_KEYS]\n : null,\n };\n }\n}\n\nexport { LangGraphHttpAgent };\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent.mjs","names":["LangGraphAgent","AGUILangGraphAgent","LangGraphHttpAgent","AGUILangGraphHttpAgent"],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["import { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport { RawEvent } from \"@ag-ui/core\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent as AGUILangGraphHttpAgent,\n type LangGraphAgentConfig,\n ProcessedEvents,\n SchemaKeys,\n type State,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport type { HttpAgentConfig, Message } from \"@ag-ui/client\";\nimport { Message as LangGraphMessage } from \"@langchain/langgraph-sdk/dist/types.messages\";\nimport { ThreadState } from \"@langchain/langgraph-sdk\";\n\ninterface CopilotKitStateEnrichment {\n copilotkit: {\n actions: StateEnrichment[\"ag-ui\"][\"tools\"];\n context: StateEnrichment[\"ag-ui\"][\"context\"];\n };\n}\n\nimport { RunAgentInput, EventType, CustomEvent } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport {\n CustomEventNames,\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nexport { CustomEventNames };\n\nexport class LangGraphAgent extends AGUILangGraphAgent {\n constructor(config: LangGraphAgentConfig) {\n super(config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n if (event.type === EventType.CUSTOM) {\n // const event = processedEvent as unknown as CustomEvent;\n const customEvent = event as unknown as CustomEvent;\n\n if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitMessage) {\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: customEvent.value.message_id,\n delta: customEvent.value.message,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall\n ) {\n this.subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId: customEvent.value.id,\n toolCallName: customEvent.value.name,\n parentMessageId: customEvent.value.id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: customEvent.value.id,\n delta: customEvent.value.args,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId: customEvent.value.id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name ===\n CustomEventNames.CopilotKitManuallyEmitIntermediateState\n ) {\n this.activeRun.manuallyEmittedState = customEvent.value;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun.manuallyEmittedState,\n } as ThreadState<State>),\n rawEvent: event,\n });\n return true;\n }\n\n if (customEvent.name === CustomEventNames.CopilotKitExit) {\n this.subscriber.next({\n type: EventType.CUSTOM,\n name: \"Exit\",\n value: true,\n });\n return true;\n }\n }\n\n // Intercept all text message and tool call events and check if should disable\n const rawEvent = (event as ToolCallEvents | TextMessageEvents).rawEvent;\n if (!rawEvent) {\n this.subscriber.next(event);\n return true;\n }\n\n const isMessageEvent =\n event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CONTENT ||\n event.type === EventType.TEXT_MESSAGE_END;\n const isToolEvent =\n event.type === EventType.TOOL_CALL_START ||\n event.type === EventType.TOOL_CALL_ARGS ||\n event.type === EventType.TOOL_CALL_END;\n if (\"copilotkit:emit-tool-calls\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-tool-calls\"] === false &&\n isToolEvent\n ) {\n return false;\n }\n }\n if (\"copilotkit:emit-messages\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-messages\"] === false &&\n isMessageEvent\n ) {\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput) {\n return super.run(input).pipe(\n map((processedEvent) => {\n // Turn raw event into emit state snapshot from tool call event\n if (processedEvent.type === EventType.RAW) {\n // Get the LangGraph event from the AGUI event.\n const event =\n (processedEvent as RawEvent).event ??\n (processedEvent as RawEvent).rawEvent;\n\n const eventType = event.event;\n const toolCallData = event.data?.chunk?.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata?.[\n \"copilotkit:emit-intermediate-state\"\n ]?.some(\n (predictStateTool: PredictStateTool) =>\n predictStateTool.tool === toolCallData?.name,\n );\n\n if (\n eventType === LangGraphEventTypes.OnChatModelStream &&\n toolCallUsedToPredictState\n ) {\n return {\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"copilotkit:emit-intermediate-state\"],\n };\n }\n }\n\n return processedEvent;\n }),\n );\n }\n\n langGraphDefaultMergeState(\n state: State,\n messages: LangGraphMessage[],\n input: RunAgentInput,\n ): State<StateEnrichment & CopilotKitStateEnrichment> {\n const aguiMergedState = super.langGraphDefaultMergeState(\n state,\n messages,\n input,\n );\n const { tools: returnedTools, \"ag-ui\": agui } = aguiMergedState;\n // tolerate undefined and de-duplicate by stable key (id | name | key)\n const rawCombinedTools = [\n ...((returnedTools as any[]) ?? []),\n ...((agui?.tools as any[]) ?? []),\n ];\n const combinedTools = Array.from(\n new Map(\n rawCombinedTools.map((t: any) => [\n t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t),\n t,\n ]),\n ).values(),\n );\n\n return {\n ...aguiMergedState,\n copilotkit: {\n actions: combinedTools,\n context: agui?.context ?? [],\n },\n };\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"copilotkit\"];\n const schemaKeys = await super.getSchemaKeys();\n return {\n config: schemaKeys.config,\n input: schemaKeys.input ? [...schemaKeys.input, ...CONSTANT_KEYS] : null,\n output: schemaKeys.output\n ? [...schemaKeys.output, ...CONSTANT_KEYS]\n : null,\n context: schemaKeys.context\n ? [...schemaKeys.context, ...CONSTANT_KEYS]\n : null,\n };\n }\n\n async loadState(threadId: string) {\n const threadState = await this.client.threads.getState(threadId);\n return {\n state: threadState.values as Record<string, any>,\n };\n }\n}\n\ntype LoadStateFn = (\n threadId: string,\n headers?: Record<string, string>,\n) => Promise<{ state: Record<string, any>; messages?: Message[] } | null>;\n\ninterface LangGraphHttpAgentConfig extends HttpAgentConfig {\n loadState?: LoadStateFn;\n}\n\nexport class LangGraphHttpAgent extends AGUILangGraphHttpAgent {\n private _loadState?: LoadStateFn;\n\n constructor(config: LangGraphHttpAgentConfig) {\n super(config);\n this._loadState = config.loadState;\n }\n\n async loadState(threadId: string, headers?: Record<string, string>) {\n if (!this._loadState) return null;\n return this._loadState(threadId, headers);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ require("reflect-metadata");
2
+
3
+ //#region src/lib/runtime/agent-integrations/langgraph/convert-messages.ts
4
+ /**
5
+ * Convert an array of LangGraph messages to AG-UI Message format.
6
+ *
7
+ * LangGraph messages use `type` ("human", "ai", "tool", "system") while
8
+ * AG-UI uses `role` ("user", "assistant", "tool", "system") with different
9
+ * required fields per role.
10
+ */
11
+ function convertLangGraphMessages(messages) {
12
+ return messages.map((msg) => {
13
+ const msgType = msg.type;
14
+ if (msgType === "tool") return {
15
+ id: msg.id,
16
+ role: "tool",
17
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content ?? ""),
18
+ toolCallId: msg.tool_call_id ?? msg.id
19
+ };
20
+ if (msgType === "human") {
21
+ let content;
22
+ if (typeof msg.content === "string") content = msg.content;
23
+ else if (Array.isArray(msg.content)) content = msg.content.filter((p) => p.type === "text").map((p) => p.text).join("") || "";
24
+ else content = String(msg.content ?? "");
25
+ return {
26
+ id: msg.id,
27
+ role: "user",
28
+ content
29
+ };
30
+ }
31
+ if (msgType === "ai") {
32
+ const base = {
33
+ id: msg.id,
34
+ role: "assistant"
35
+ };
36
+ if (typeof msg.content === "string" && msg.content.length > 0) base.content = msg.content;
37
+ else if (Array.isArray(msg.content)) {
38
+ const text = msg.content.filter((p) => p.type === "text").map((p) => p.text).join("");
39
+ if (text.length > 0) base.content = text;
40
+ }
41
+ if (msg.tool_calls?.length) base.toolCalls = msg.tool_calls.map((tc) => ({
42
+ id: tc.id,
43
+ type: "function",
44
+ function: {
45
+ name: tc.name,
46
+ arguments: typeof tc.args === "string" ? tc.args : JSON.stringify(tc.args)
47
+ }
48
+ }));
49
+ return base;
50
+ }
51
+ if (msgType === "system") return {
52
+ id: msg.id,
53
+ role: "system",
54
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content ?? "")
55
+ };
56
+ return null;
57
+ }).filter((msg) => msg !== null);
58
+ }
59
+
60
+ //#endregion
61
+ exports.convertLangGraphMessages = convertLangGraphMessages;
62
+ //# sourceMappingURL=convert-messages.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-messages.cjs","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/convert-messages.ts"],"sourcesContent":["import type { Message } from \"@ag-ui/client\";\n\n/**\n * Convert an array of LangGraph messages to AG-UI Message format.\n *\n * LangGraph messages use `type` (\"human\", \"ai\", \"tool\", \"system\") while\n * AG-UI uses `role` (\"user\", \"assistant\", \"tool\", \"system\") with different\n * required fields per role.\n */\nexport function convertLangGraphMessages(messages: any[]): Message[] {\n return messages\n .map((msg: any): Message | null => {\n const msgType: string = msg.type;\n\n if (msgType === \"tool\") {\n return {\n id: msg.id,\n role: \"tool\" as const,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content ?? \"\"),\n toolCallId: msg.tool_call_id ?? msg.id,\n };\n }\n\n if (msgType === \"human\") {\n let content: string;\n if (typeof msg.content === \"string\") {\n content = msg.content;\n } else if (Array.isArray(msg.content)) {\n content =\n msg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\"\") || \"\";\n } else {\n content = String(msg.content ?? \"\");\n }\n return { id: msg.id, role: \"user\" as const, content };\n }\n\n if (msgType === \"ai\") {\n const base: Record<string, unknown> = {\n id: msg.id,\n role: \"assistant\" as const,\n };\n if (typeof msg.content === \"string\" && msg.content.length > 0) {\n base.content = msg.content;\n } else if (Array.isArray(msg.content)) {\n const text = msg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\"\");\n if (text.length > 0) base.content = text;\n }\n if (msg.tool_calls?.length) {\n base.toolCalls = msg.tool_calls.map((tc: any) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments:\n typeof tc.args === \"string\" ? tc.args : JSON.stringify(tc.args),\n },\n }));\n }\n return base as Message;\n }\n\n if (msgType === \"system\") {\n return {\n id: msg.id,\n role: \"system\" as const,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content ?? \"\"),\n };\n }\n\n // Unknown type - return null to be filtered\n return null;\n })\n .filter((msg): msg is Message => msg !== null);\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,yBAAyB,UAA4B;AACnE,QAAO,SACJ,KAAK,QAA6B;EACjC,MAAM,UAAkB,IAAI;AAE5B,MAAI,YAAY,OACd,QAAO;GACL,IAAI,IAAI;GACR,MAAM;GACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,KAAK,UAAU,IAAI,WAAW,GAAG;GACvC,YAAY,IAAI,gBAAgB,IAAI;GACrC;AAGH,MAAI,YAAY,SAAS;GACvB,IAAI;AACJ,OAAI,OAAO,IAAI,YAAY,SACzB,WAAU,IAAI;YACL,MAAM,QAAQ,IAAI,QAAQ,CACnC,WACE,IAAI,QACD,QAAQ,MAAW,EAAE,SAAS,OAAO,CACrC,KAAK,MAAW,EAAE,KAAK,CACvB,KAAK,GAAG,IAAI;OAEjB,WAAU,OAAO,IAAI,WAAW,GAAG;AAErC,UAAO;IAAE,IAAI,IAAI;IAAI,MAAM;IAAiB;IAAS;;AAGvD,MAAI,YAAY,MAAM;GACpB,MAAM,OAAgC;IACpC,IAAI,IAAI;IACR,MAAM;IACP;AACD,OAAI,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,SAAS,EAC1D,MAAK,UAAU,IAAI;YACV,MAAM,QAAQ,IAAI,QAAQ,EAAE;IACrC,MAAM,OAAO,IAAI,QACd,QAAQ,MAAW,EAAE,SAAS,OAAO,CACrC,KAAK,MAAW,EAAE,KAAK,CACvB,KAAK,GAAG;AACX,QAAI,KAAK,SAAS,EAAG,MAAK,UAAU;;AAEtC,OAAI,IAAI,YAAY,OAClB,MAAK,YAAY,IAAI,WAAW,KAAK,QAAa;IAChD,IAAI,GAAG;IACP,MAAM;IACN,UAAU;KACR,MAAM,GAAG;KACT,WACE,OAAO,GAAG,SAAS,WAAW,GAAG,OAAO,KAAK,UAAU,GAAG,KAAK;KAClE;IACF,EAAE;AAEL,UAAO;;AAGT,MAAI,YAAY,SACd,QAAO;GACL,IAAI,IAAI;GACR,MAAM;GACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,KAAK,UAAU,IAAI,WAAW,GAAG;GACxC;AAIH,SAAO;GACP,CACD,QAAQ,QAAwB,QAAQ,KAAK"}
@@ -0,0 +1,15 @@
1
+
2
+ import { Message } from "@ag-ui/client";
3
+
4
+ //#region src/lib/runtime/agent-integrations/langgraph/convert-messages.d.ts
5
+ /**
6
+ * Convert an array of LangGraph messages to AG-UI Message format.
7
+ *
8
+ * LangGraph messages use `type` ("human", "ai", "tool", "system") while
9
+ * AG-UI uses `role` ("user", "assistant", "tool", "system") with different
10
+ * required fields per role.
11
+ */
12
+ declare function convertLangGraphMessages(messages: any[]): Message[];
13
+ //#endregion
14
+ export { convertLangGraphMessages };
15
+ //# sourceMappingURL=convert-messages.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-messages.d.cts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/convert-messages.ts"],"mappings":";;;;;;AASA;;;;;iBAAgB,wBAAA,CAAyB,QAAA,UAAkB,OAAA"}
@@ -0,0 +1,15 @@
1
+ import "reflect-metadata";
2
+ import { Message } from "@ag-ui/client";
3
+
4
+ //#region src/lib/runtime/agent-integrations/langgraph/convert-messages.d.ts
5
+ /**
6
+ * Convert an array of LangGraph messages to AG-UI Message format.
7
+ *
8
+ * LangGraph messages use `type` ("human", "ai", "tool", "system") while
9
+ * AG-UI uses `role` ("user", "assistant", "tool", "system") with different
10
+ * required fields per role.
11
+ */
12
+ declare function convertLangGraphMessages(messages: any[]): Message[];
13
+ //#endregion
14
+ export { convertLangGraphMessages };
15
+ //# sourceMappingURL=convert-messages.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-messages.d.mts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/convert-messages.ts"],"mappings":";;;;;;AASA;;;;;iBAAgB,wBAAA,CAAyB,QAAA,UAAkB,OAAA"}
@@ -0,0 +1,61 @@
1
+ import "reflect-metadata";
2
+ //#region src/lib/runtime/agent-integrations/langgraph/convert-messages.ts
3
+ /**
4
+ * Convert an array of LangGraph messages to AG-UI Message format.
5
+ *
6
+ * LangGraph messages use `type` ("human", "ai", "tool", "system") while
7
+ * AG-UI uses `role` ("user", "assistant", "tool", "system") with different
8
+ * required fields per role.
9
+ */
10
+ function convertLangGraphMessages(messages) {
11
+ return messages.map((msg) => {
12
+ const msgType = msg.type;
13
+ if (msgType === "tool") return {
14
+ id: msg.id,
15
+ role: "tool",
16
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content ?? ""),
17
+ toolCallId: msg.tool_call_id ?? msg.id
18
+ };
19
+ if (msgType === "human") {
20
+ let content;
21
+ if (typeof msg.content === "string") content = msg.content;
22
+ else if (Array.isArray(msg.content)) content = msg.content.filter((p) => p.type === "text").map((p) => p.text).join("") || "";
23
+ else content = String(msg.content ?? "");
24
+ return {
25
+ id: msg.id,
26
+ role: "user",
27
+ content
28
+ };
29
+ }
30
+ if (msgType === "ai") {
31
+ const base = {
32
+ id: msg.id,
33
+ role: "assistant"
34
+ };
35
+ if (typeof msg.content === "string" && msg.content.length > 0) base.content = msg.content;
36
+ else if (Array.isArray(msg.content)) {
37
+ const text = msg.content.filter((p) => p.type === "text").map((p) => p.text).join("");
38
+ if (text.length > 0) base.content = text;
39
+ }
40
+ if (msg.tool_calls?.length) base.toolCalls = msg.tool_calls.map((tc) => ({
41
+ id: tc.id,
42
+ type: "function",
43
+ function: {
44
+ name: tc.name,
45
+ arguments: typeof tc.args === "string" ? tc.args : JSON.stringify(tc.args)
46
+ }
47
+ }));
48
+ return base;
49
+ }
50
+ if (msgType === "system") return {
51
+ id: msg.id,
52
+ role: "system",
53
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content ?? "")
54
+ };
55
+ return null;
56
+ }).filter((msg) => msg !== null);
57
+ }
58
+
59
+ //#endregion
60
+ export { convertLangGraphMessages };
61
+ //# sourceMappingURL=convert-messages.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-messages.mjs","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/convert-messages.ts"],"sourcesContent":["import type { Message } from \"@ag-ui/client\";\n\n/**\n * Convert an array of LangGraph messages to AG-UI Message format.\n *\n * LangGraph messages use `type` (\"human\", \"ai\", \"tool\", \"system\") while\n * AG-UI uses `role` (\"user\", \"assistant\", \"tool\", \"system\") with different\n * required fields per role.\n */\nexport function convertLangGraphMessages(messages: any[]): Message[] {\n return messages\n .map((msg: any): Message | null => {\n const msgType: string = msg.type;\n\n if (msgType === \"tool\") {\n return {\n id: msg.id,\n role: \"tool\" as const,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content ?? \"\"),\n toolCallId: msg.tool_call_id ?? msg.id,\n };\n }\n\n if (msgType === \"human\") {\n let content: string;\n if (typeof msg.content === \"string\") {\n content = msg.content;\n } else if (Array.isArray(msg.content)) {\n content =\n msg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\"\") || \"\";\n } else {\n content = String(msg.content ?? \"\");\n }\n return { id: msg.id, role: \"user\" as const, content };\n }\n\n if (msgType === \"ai\") {\n const base: Record<string, unknown> = {\n id: msg.id,\n role: \"assistant\" as const,\n };\n if (typeof msg.content === \"string\" && msg.content.length > 0) {\n base.content = msg.content;\n } else if (Array.isArray(msg.content)) {\n const text = msg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\"\");\n if (text.length > 0) base.content = text;\n }\n if (msg.tool_calls?.length) {\n base.toolCalls = msg.tool_calls.map((tc: any) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments:\n typeof tc.args === \"string\" ? tc.args : JSON.stringify(tc.args),\n },\n }));\n }\n return base as Message;\n }\n\n if (msgType === \"system\") {\n return {\n id: msg.id,\n role: \"system\" as const,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content ?? \"\"),\n };\n }\n\n // Unknown type - return null to be filtered\n return null;\n })\n .filter((msg): msg is Message => msg !== null);\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,yBAAyB,UAA4B;AACnE,QAAO,SACJ,KAAK,QAA6B;EACjC,MAAM,UAAkB,IAAI;AAE5B,MAAI,YAAY,OACd,QAAO;GACL,IAAI,IAAI;GACR,MAAM;GACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,KAAK,UAAU,IAAI,WAAW,GAAG;GACvC,YAAY,IAAI,gBAAgB,IAAI;GACrC;AAGH,MAAI,YAAY,SAAS;GACvB,IAAI;AACJ,OAAI,OAAO,IAAI,YAAY,SACzB,WAAU,IAAI;YACL,MAAM,QAAQ,IAAI,QAAQ,CACnC,WACE,IAAI,QACD,QAAQ,MAAW,EAAE,SAAS,OAAO,CACrC,KAAK,MAAW,EAAE,KAAK,CACvB,KAAK,GAAG,IAAI;OAEjB,WAAU,OAAO,IAAI,WAAW,GAAG;AAErC,UAAO;IAAE,IAAI,IAAI;IAAI,MAAM;IAAiB;IAAS;;AAGvD,MAAI,YAAY,MAAM;GACpB,MAAM,OAAgC;IACpC,IAAI,IAAI;IACR,MAAM;IACP;AACD,OAAI,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,SAAS,EAC1D,MAAK,UAAU,IAAI;YACV,MAAM,QAAQ,IAAI,QAAQ,EAAE;IACrC,MAAM,OAAO,IAAI,QACd,QAAQ,MAAW,EAAE,SAAS,OAAO,CACrC,KAAK,MAAW,EAAE,KAAK,CACvB,KAAK,GAAG;AACX,QAAI,KAAK,SAAS,EAAG,MAAK,UAAU;;AAEtC,OAAI,IAAI,YAAY,OAClB,MAAK,YAAY,IAAI,WAAW,KAAK,QAAa;IAChD,IAAI,GAAG;IACP,MAAM;IACN,UAAU;KACR,MAAM,GAAG;KACT,WACE,OAAO,GAAG,SAAS,WAAW,GAAG,OAAO,KAAK,UAAU,GAAG,KAAK;KAClE;IACF,EAAE;AAEL,UAAO;;AAGT,MAAI,YAAY,SACd,QAAO;GACL,IAAI,IAAI;GACR,MAAM;GACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,KAAK,UAAU,IAAI,WAAW,GAAG;GACxC;AAIH,SAAO;GACP,CACD,QAAQ,QAAwB,QAAQ,KAAK"}
@@ -1,3 +1,5 @@
1
1
 
2
2
  import { CustomEventNames, PredictStateTool, TextMessageEvents, ToolCallEvents } from "./consts.cjs";
3
- import { LangGraphAgent, LangGraphHttpAgent } from "./agent.cjs";
3
+ import { LangGraphAgent, LangGraphHttpAgent } from "./agent.cjs";
4
+ import { convertLangGraphMessages } from "./convert-messages.cjs";
5
+ import { PostgresClient, loadLangGraphPostgresState } from "./load-state.cjs";
@@ -1,3 +1,5 @@
1
1
  import "reflect-metadata";
2
2
  import { CustomEventNames, PredictStateTool, TextMessageEvents, ToolCallEvents } from "./consts.mjs";
3
- import { LangGraphAgent, LangGraphHttpAgent } from "./agent.mjs";
3
+ import { LangGraphAgent, LangGraphHttpAgent } from "./agent.mjs";
4
+ import { convertLangGraphMessages } from "./convert-messages.mjs";
5
+ import { PostgresClient, loadLangGraphPostgresState } from "./load-state.mjs";
@@ -0,0 +1,80 @@
1
+ require("reflect-metadata");
2
+ const require_runtime = require('../../../../_virtual/_rolldown/runtime.cjs');
3
+ let _msgpack_msgpack = require("@msgpack/msgpack");
4
+
5
+ //#region src/lib/runtime/agent-integrations/langgraph/load-state.ts
6
+ const extensionCodec = new _msgpack_msgpack.ExtensionCodec();
7
+ const noEncode = () => new Uint8Array(0);
8
+ for (const type of [
9
+ 0,
10
+ 1,
11
+ 2
12
+ ]) extensionCodec.register({
13
+ type,
14
+ encode: noEncode,
15
+ decode: (data) => {
16
+ const tup = (0, _msgpack_msgpack.decode)(data, { extensionCodec });
17
+ return tup[2] ?? tup[1];
18
+ }
19
+ });
20
+ extensionCodec.register({
21
+ type: 3,
22
+ encode: noEncode,
23
+ decode: (data) => {
24
+ const tup = (0, _msgpack_msgpack.decode)(data, { extensionCodec });
25
+ return tup[3] ?? tup[2];
26
+ }
27
+ });
28
+ for (const type of [4, 5]) extensionCodec.register({
29
+ type,
30
+ encode: noEncode,
31
+ decode: (data) => {
32
+ const tup = (0, _msgpack_msgpack.decode)(data, { extensionCodec });
33
+ return tup[2] ?? tup[1];
34
+ }
35
+ });
36
+ function decodeMsgpack(buf) {
37
+ return (0, _msgpack_msgpack.decode)(buf, { extensionCodec });
38
+ }
39
+ /**
40
+ * Query LangGraph's PostgreSQL checkpoint tables and reconstruct the thread's
41
+ * channel_values (the agent state).
42
+ *
43
+ * Returns `null` when no checkpoint exists for the given `threadId`.
44
+ */
45
+ async function loadLangGraphPostgresState(threadId, client) {
46
+ const { rows } = await client.query(`SELECT
47
+ checkpoint,
48
+ (
49
+ SELECT array_agg(array[bl.channel::bytea, bl.type::bytea, bl.blob])
50
+ FROM jsonb_each_text(checkpoint -> 'channel_versions') cv
51
+ INNER JOIN checkpoint_blobs bl
52
+ ON bl.thread_id = checkpoints.thread_id
53
+ AND bl.checkpoint_ns = checkpoints.checkpoint_ns
54
+ AND bl.channel = cv.key
55
+ AND bl.version = cv.value
56
+ ) AS channel_values
57
+ FROM checkpoints
58
+ WHERE thread_id = $1 AND checkpoint_ns = ''
59
+ ORDER BY checkpoint_id DESC
60
+ LIMIT 1`, [threadId]);
61
+ if (rows.length === 0) return null;
62
+ const row = rows[0];
63
+ const state = { ...row.checkpoint.channel_values ?? {} };
64
+ const blobRows = row.channel_values;
65
+ if (blobRows) for (const triple of blobRows) {
66
+ const channel = triple[0].toString("utf-8");
67
+ const type = triple[1].toString("utf-8");
68
+ const blob = triple[2];
69
+ try {
70
+ if (type === "msgpack" && blob) state[channel] = decodeMsgpack(blob);
71
+ else if (type === "json" && blob) state[channel] = JSON.parse(blob.toString("utf-8"));
72
+ else if (type === "bytes" && blob) state[channel] = blob;
73
+ } catch {}
74
+ }
75
+ return state;
76
+ }
77
+
78
+ //#endregion
79
+ exports.loadLangGraphPostgresState = loadLangGraphPostgresState;
80
+ //# sourceMappingURL=load-state.cjs.map