@copilotkit/runtime 1.79.1 → 1.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/agent/index.cjs.map +1 -1
  2. package/dist/agent/index.d.cts +4 -2
  3. package/dist/agent/index.d.cts.map +1 -1
  4. package/dist/agent/index.d.mts +4 -2
  5. package/dist/agent/index.d.mts.map +1 -1
  6. package/dist/agent/index.mjs.map +1 -1
  7. package/dist/lib/runtime/agent-integrations/langgraph/agent.cjs +25 -1
  8. package/dist/lib/runtime/agent-integrations/langgraph/agent.cjs.map +1 -1
  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.map +1 -1
  11. package/dist/lib/runtime/agent-integrations/langgraph/agent.mjs +25 -1
  12. package/dist/lib/runtime/agent-integrations/langgraph/agent.mjs.map +1 -1
  13. package/dist/package.cjs +1 -1
  14. package/dist/package.mjs +1 -1
  15. package/dist/v2/index.cjs +1 -0
  16. package/dist/v2/index.d.cts +2 -2
  17. package/dist/v2/index.d.mts +2 -2
  18. package/dist/v2/index.mjs +2 -2
  19. package/dist/v2/runtime/core/middleware-sse-parser.cjs +11 -2
  20. package/dist/v2/runtime/core/middleware-sse-parser.cjs.map +1 -1
  21. package/dist/v2/runtime/core/middleware-sse-parser.mjs +11 -2
  22. package/dist/v2/runtime/core/middleware-sse-parser.mjs.map +1 -1
  23. package/dist/v2/runtime/core/package-info.cjs +1 -1
  24. package/dist/v2/runtime/core/package-info.mjs +1 -1
  25. package/dist/v2/runtime/handlers/intelligence/run.cjs +2 -3
  26. package/dist/v2/runtime/handlers/intelligence/run.cjs.map +1 -1
  27. package/dist/v2/runtime/handlers/intelligence/run.mjs +2 -3
  28. package/dist/v2/runtime/handlers/intelligence/run.mjs.map +1 -1
  29. package/dist/v2/runtime/handlers/shared/sse-response.cjs +39 -0
  30. package/dist/v2/runtime/handlers/shared/sse-response.cjs.map +1 -1
  31. package/dist/v2/runtime/handlers/shared/sse-response.mjs +39 -0
  32. package/dist/v2/runtime/handlers/shared/sse-response.mjs.map +1 -1
  33. package/dist/v2/runtime/index.d.cts +1 -1
  34. package/dist/v2/runtime/index.d.mts +1 -1
  35. package/dist/v2/runtime/intelligence-platform/client.cjs +16 -0
  36. package/dist/v2/runtime/intelligence-platform/client.cjs.map +1 -1
  37. package/dist/v2/runtime/intelligence-platform/client.d.cts +14 -0
  38. package/dist/v2/runtime/intelligence-platform/client.d.cts.map +1 -1
  39. package/dist/v2/runtime/intelligence-platform/client.d.mts +14 -0
  40. package/dist/v2/runtime/intelligence-platform/client.d.mts.map +1 -1
  41. package/dist/v2/runtime/intelligence-platform/client.mjs +16 -0
  42. package/dist/v2/runtime/intelligence-platform/client.mjs.map +1 -1
  43. package/dist/v2/runtime/runner/agent-runner.cjs +16 -0
  44. package/dist/v2/runtime/runner/agent-runner.cjs.map +1 -1
  45. package/dist/v2/runtime/runner/agent-runner.d.cts +11 -1
  46. package/dist/v2/runtime/runner/agent-runner.d.cts.map +1 -1
  47. package/dist/v2/runtime/runner/agent-runner.d.mts +11 -1
  48. package/dist/v2/runtime/runner/agent-runner.d.mts.map +1 -1
  49. package/dist/v2/runtime/runner/agent-runner.mjs +16 -1
  50. package/dist/v2/runtime/runner/agent-runner.mjs.map +1 -1
  51. package/dist/v2/runtime/runner/in-memory.cjs +1 -1
  52. package/dist/v2/runtime/runner/in-memory.cjs.map +1 -1
  53. package/dist/v2/runtime/runner/in-memory.mjs +2 -2
  54. package/dist/v2/runtime/runner/in-memory.mjs.map +1 -1
  55. package/dist/v2/runtime/runner/index.d.cts +1 -1
  56. package/dist/v2/runtime/runner/index.d.mts +1 -1
  57. package/dist/v2/runtime/runner/index.mjs +1 -1
  58. package/dist/v2/runtime/runner/intelligence.cjs +2 -2
  59. package/dist/v2/runtime/runner/intelligence.cjs.map +1 -1
  60. package/dist/v2/runtime/runner/intelligence.mjs +3 -3
  61. package/dist/v2/runtime/runner/intelligence.mjs.map +1 -1
  62. package/package.json +6 -6
@@ -7,6 +7,30 @@ let _ag_ui_client = require("@ag-ui/client");
7
7
  let _ag_ui_langgraph = require("@ag-ui/langgraph");
8
8
 
9
9
  //#region src/v1-deprecated/lib/runtime/agent-integrations/langgraph/agent.ts
10
+ /**
11
+ * Copy `name`, `description` and `parameters` from an OpenAI-style
12
+ * `{ function: { ... } }` descriptor to the top level, so Python agents that
13
+ * read `tool["parameters"]` get the real schema instead of `None` (#6570).
14
+ * Non-null fields already at the top level win, and `function` is kept intact.
15
+ * A top-level `null` is backfilled too: Python `None` comes back as `null`
16
+ * when state is restored from a checkpoint.
17
+ *
18
+ * Scope: this only normalizes `copilotkit.actions` for the v1 `LangGraphAgent`.
19
+ * `state["tools"]` and `ag-ui.tools` stay nested, and v2 users of
20
+ * `@ag-ui/langgraph` see no change. The full fix belongs upstream in
21
+ * `langGraphDefaultMergeState` in ag-ui-protocol/ag-ui.
22
+ */
23
+ function normalizeLangGraphTool(tool) {
24
+ const functionSpec = tool?.function;
25
+ if (!functionSpec || typeof functionSpec !== "object") return tool;
26
+ const normalized = { ...tool };
27
+ for (const key of [
28
+ "name",
29
+ "description",
30
+ "parameters"
31
+ ]) if (normalized[key] == null && functionSpec[key] != null) normalized[key] = functionSpec[key];
32
+ return normalized;
33
+ }
10
34
  var LangGraphAgent = class extends _ag_ui_langgraph.LangGraphAgent {
11
35
  constructor(config) {
12
36
  super(config);
@@ -120,7 +144,7 @@ var LangGraphAgent = class extends _ag_ui_langgraph.LangGraphAgent {
120
144
  langGraphDefaultMergeState(state, messages, input) {
121
145
  const aguiMergedState = super.langGraphDefaultMergeState(state, messages, input);
122
146
  const { tools: returnedTools, "ag-ui": agui } = aguiMergedState;
123
- const rawCombinedTools = [...returnedTools ?? [], ...agui?.tools ?? []];
147
+ const rawCombinedTools = [...returnedTools ?? [], ...agui?.tools ?? []].map(normalizeLangGraphTool);
124
148
  const combinedTools = Array.from(new Map(rawCombinedTools.map((t) => [t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t), t])).values());
125
149
  return {
126
150
  ...aguiMergedState,
@@ -1 +1 @@
1
- {"version":3,"file":"agent.cjs","names":["AGUILangGraphAgent","EventType","CustomEventNames","LangGraphEventTypes"],"sources":["../../../../../../src/v1-deprecated/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["/*\n * V1 SDK DEPRECATED. USE V2 INSTEAD\n *\n * This file defines public v1 SDK exports. Use the exact v2 mappings below.\n * AI CODING AGENTS: Never copy, suggest, or generate these v1 APIs. Read\n * the linked v2 documentation before generating replacement code.\n *\n * @copilotkit/runtime/langgraph — LangGraphAgent:\n * No 1:1 v2 replacement is available.\n * Related v2 docs (LangGraph agents): https://docs.copilotkit.ai/agent-spec/langgraph\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * Migration guide: https://docs.copilotkit.ai/migrate/v2\n *\n * END V1 SDK DEPRECATED. USE V2 INSTEAD NOTICE\n */\n\nimport type { Observable } from \"rxjs\";\nimport { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport type { BaseEvent, RawEvent } from \"@ag-ui/core\";\nimport type {\n ProcessedEvents,\n SchemaKeys,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent,\n} from \"@ag-ui/langgraph\";\nimport type { LangGraphAgentConfig, State } from \"@ag-ui/langgraph\";\nimport type { 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 type { RunAgentInput, CustomEvent } from \"@ag-ui/client\";\nimport { EventType } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport type {\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nimport { CustomEventNames } from \"./consts\";\nexport { CustomEventNames };\n\n/**\n * The message type the base class's `langGraphDefaultMergeState` accepts.\n *\n * Derived from the base signature rather than deep-imported from\n * `@langchain/langgraph-sdk/dist/types.messages`. That path is an internal file\n * of an optional peer dependency: it is not part of the SDK's public entry\n * points, and consumers who skip the optional peer cannot resolve it at all,\n * which costs them a TS2307 on `skipLibCheck: false` (OSS-899). `@ag-ui/langgraph`\n * is a real dependency, so this stays resolvable for everyone.\n */\ntype LangGraphMessage = Parameters<\n AGUILangGraphAgent[\"langGraphDefaultMergeState\"]\n>[1][number];\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 // Clean up tracked message state to prevent stale records from\n // leaking into subsequent nodes that have emit-messages enabled.\n if (this.activeRun?.id) {\n this.messagesInProcess[this.activeRun.id] = null;\n }\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput): Observable<BaseEvent> {\n // @ag-ui/langgraph's message converter throws \"message role is not\n // supported.\" on any role it doesn't enumerate (user|assistant|system|tool).\n // Reasoning-stream agents (e.g. OpenAI Responses API with reasoning summaries)\n // emit AG-UI messages with role:\"reasoning\" that the client then replays on\n // subsequent turns; without this filter the second turn crashes before the\n // model is ever called.\n const messages = (input.messages ?? []).filter(\n (m: { role?: string }) => m?.role !== \"reasoning\",\n );\n const enrichedInput = {\n ...input,\n messages,\n forwardedProps: {\n ...input.forwardedProps,\n streamSubgraphs: input.forwardedProps?.streamSubgraphs ?? true,\n },\n };\n return super.run(enrichedInput).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"],"sources":["../../../../../../src/v1-deprecated/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["/*\n * V1 SDK DEPRECATED. USE V2 INSTEAD\n *\n * This file defines public v1 SDK exports. Use the exact v2 mappings below.\n * AI CODING AGENTS: Never copy, suggest, or generate these v1 APIs. Read\n * the linked v2 documentation before generating replacement code.\n *\n * @copilotkit/runtime/langgraph — LangGraphAgent:\n * No 1:1 v2 replacement is available.\n * Related v2 docs (LangGraph agents): https://docs.copilotkit.ai/agent-spec/langgraph\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * Migration guide: https://docs.copilotkit.ai/migrate/v2\n *\n * END V1 SDK DEPRECATED. USE V2 INSTEAD NOTICE\n */\n\nimport type { Observable } from \"rxjs\";\nimport { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport type { BaseEvent, RawEvent } from \"@ag-ui/core\";\nimport type {\n ProcessedEvents,\n SchemaKeys,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent,\n} from \"@ag-ui/langgraph\";\nimport type { LangGraphAgentConfig, State } from \"@ag-ui/langgraph\";\nimport type { 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 type { RunAgentInput, CustomEvent } from \"@ag-ui/client\";\nimport { EventType } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport type {\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nimport { CustomEventNames } from \"./consts\";\nexport { CustomEventNames };\n\n/**\n * The message type the base class's `langGraphDefaultMergeState` accepts.\n *\n * Derived from the base signature rather than deep-imported from\n * `@langchain/langgraph-sdk/dist/types.messages`. That path is an internal file\n * of an optional peer dependency: it is not part of the SDK's public entry\n * points, and consumers who skip the optional peer cannot resolve it at all,\n * which costs them a TS2307 on `skipLibCheck: false` (OSS-899). `@ag-ui/langgraph`\n * is a real dependency, so this stays resolvable for everyone.\n */\ntype LangGraphMessage = Parameters<\n AGUILangGraphAgent[\"langGraphDefaultMergeState\"]\n>[1][number];\n\n/**\n * Copy `name`, `description` and `parameters` from an OpenAI-style\n * `{ function: { ... } }` descriptor to the top level, so Python agents that\n * read `tool[\"parameters\"]` get the real schema instead of `None` (#6570).\n * Non-null fields already at the top level win, and `function` is kept intact.\n * A top-level `null` is backfilled too: Python `None` comes back as `null`\n * when state is restored from a checkpoint.\n *\n * Scope: this only normalizes `copilotkit.actions` for the v1 `LangGraphAgent`.\n * `state[\"tools\"]` and `ag-ui.tools` stay nested, and v2 users of\n * `@ag-ui/langgraph` see no change. The full fix belongs upstream in\n * `langGraphDefaultMergeState` in ag-ui-protocol/ag-ui.\n */\nfunction normalizeLangGraphTool(tool: any): any {\n const functionSpec = tool?.function;\n if (!functionSpec || typeof functionSpec !== \"object\") return tool;\n\n const normalized = { ...tool };\n for (const key of [\"name\", \"description\", \"parameters\"] as const) {\n if (normalized[key] == null && functionSpec[key] != null) {\n normalized[key] = functionSpec[key];\n }\n }\n return normalized;\n}\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 // Clean up tracked message state to prevent stale records from\n // leaking into subsequent nodes that have emit-messages enabled.\n if (this.activeRun?.id) {\n this.messagesInProcess[this.activeRun.id] = null;\n }\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput): Observable<BaseEvent> {\n // @ag-ui/langgraph's message converter throws \"message role is not\n // supported.\" on any role it doesn't enumerate (user|assistant|system|tool).\n // Reasoning-stream agents (e.g. OpenAI Responses API with reasoning summaries)\n // emit AG-UI messages with role:\"reasoning\" that the client then replays on\n // subsequent turns; without this filter the second turn crashes before the\n // model is ever called.\n const messages = (input.messages ?? []).filter(\n (m: { role?: string }) => m?.role !== \"reasoning\",\n );\n const enrichedInput = {\n ...input,\n messages,\n forwardedProps: {\n ...input.forwardedProps,\n streamSubgraphs: input.forwardedProps?.streamSubgraphs ?? true,\n },\n };\n return super.run(enrichedInput).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, normalize nested descriptors, and de-duplicate by\n // stable key (id | name | key). Normalizing first means a nested tool\n // collapses with a flat tool of the same name; the later entry wins.\n const rawCombinedTools = [\n ...((returnedTools as any[]) ?? []),\n ...((agui?.tools as any[]) ?? []),\n ].map(normalizeLangGraphTool);\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 +1 @@
1
- {"version":3,"file":"agent.d.cts","names":[],"sources":["../../../../../../src/v1-deprecated/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;UAmCU,yBAAA;EACR,UAAA;IACE,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;EAAA;AAAA;;;;;AAce;;;;;AAgB5B;KAJK,gBAAA,GAAmB,UAAA,CACtB,cAAA;AAAA,cAGW,gBAAA,SAAuB,cAAA;cACtB,MAAA,EAAQ,oBAAA;EAIpB,aAAA,CAAc,KAAA,EAAO,eAAA;EAqHrB,GAAA,CAAI,KAAA,EAAO,aAAA,GAAgB,UAAA,CAAW,WAAA;EAqDtC,0BAAA,CACE,KAAA,EAAO,KAAA,EACP,QAAA,EAAU,gBAAA,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/v1-deprecated/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;UAmCU,yBAAA;EACR,UAAA;IACE,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;EAAA;AAAA;;;;;AAce;;;;;AA0C5B;KA9BK,gBAAA,GAAmB,UAAA,CACtB,cAAA;AAAA,cA6BW,gBAAA,SAAuB,cAAA;cACtB,MAAA,EAAQ,oBAAA;EAIpB,aAAA,CAAc,KAAA,EAAO,eAAA;EAqHrB,GAAA,CAAI,KAAA,EAAO,aAAA,GAAgB,UAAA,CAAW,WAAA;EAqDtC,0BAAA,CACE,KAAA,EAAO,KAAA,EACP,QAAA,EAAU,gBAAA,IACV,KAAA,EAAO,aAAA,GACN,KAAA,CAAM,eAAA,GAAkB,yBAAA;EAgCrB,aAAA,CAAA,GAAiB,OAAA,CAAQ,UAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.mts","names":[],"sources":["../../../../../../src/v1-deprecated/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;UAmCU,yBAAA;EACR,UAAA;IACE,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;EAAA;AAAA;;;;;AAce;;;;;AAgB5B;KAJK,gBAAA,GAAmB,UAAA,CACtB,cAAA;AAAA,cAGW,gBAAA,SAAuB,cAAA;cACtB,MAAA,EAAQ,oBAAA;EAIpB,aAAA,CAAc,KAAA,EAAO,eAAA;EAqHrB,GAAA,CAAI,KAAA,EAAO,aAAA,GAAgB,UAAA,CAAW,WAAA;EAqDtC,0BAAA,CACE,KAAA,EAAO,KAAA,EACP,QAAA,EAAU,gBAAA,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/v1-deprecated/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;UAmCU,yBAAA;EACR,UAAA;IACE,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;EAAA;AAAA;;;;;AAce;;;;;AA0C5B;KA9BK,gBAAA,GAAmB,UAAA,CACtB,cAAA;AAAA,cA6BW,gBAAA,SAAuB,cAAA;cACtB,MAAA,EAAQ,oBAAA;EAIpB,aAAA,CAAc,KAAA,EAAO,eAAA;EAqHrB,GAAA,CAAI,KAAA,EAAO,aAAA,GAAgB,UAAA,CAAW,WAAA;EAqDtC,0BAAA,CACE,KAAA,EAAO,KAAA,EACP,QAAA,EAAU,gBAAA,IACV,KAAA,EAAO,aAAA,GACN,KAAA,CAAM,eAAA,GAAkB,yBAAA;EAgCrB,aAAA,CAAA,GAAiB,OAAA,CAAQ,UAAA;AAAA"}
@@ -6,6 +6,30 @@ import { EventType } from "@ag-ui/client";
6
6
  import { LangGraphAgent, LangGraphHttpAgent } from "@ag-ui/langgraph";
7
7
 
8
8
  //#region src/v1-deprecated/lib/runtime/agent-integrations/langgraph/agent.ts
9
+ /**
10
+ * Copy `name`, `description` and `parameters` from an OpenAI-style
11
+ * `{ function: { ... } }` descriptor to the top level, so Python agents that
12
+ * read `tool["parameters"]` get the real schema instead of `None` (#6570).
13
+ * Non-null fields already at the top level win, and `function` is kept intact.
14
+ * A top-level `null` is backfilled too: Python `None` comes back as `null`
15
+ * when state is restored from a checkpoint.
16
+ *
17
+ * Scope: this only normalizes `copilotkit.actions` for the v1 `LangGraphAgent`.
18
+ * `state["tools"]` and `ag-ui.tools` stay nested, and v2 users of
19
+ * `@ag-ui/langgraph` see no change. The full fix belongs upstream in
20
+ * `langGraphDefaultMergeState` in ag-ui-protocol/ag-ui.
21
+ */
22
+ function normalizeLangGraphTool(tool) {
23
+ const functionSpec = tool?.function;
24
+ if (!functionSpec || typeof functionSpec !== "object") return tool;
25
+ const normalized = { ...tool };
26
+ for (const key of [
27
+ "name",
28
+ "description",
29
+ "parameters"
30
+ ]) if (normalized[key] == null && functionSpec[key] != null) normalized[key] = functionSpec[key];
31
+ return normalized;
32
+ }
9
33
  var LangGraphAgent$1 = class extends LangGraphAgent {
10
34
  constructor(config) {
11
35
  super(config);
@@ -119,7 +143,7 @@ var LangGraphAgent$1 = class extends LangGraphAgent {
119
143
  langGraphDefaultMergeState(state, messages, input) {
120
144
  const aguiMergedState = super.langGraphDefaultMergeState(state, messages, input);
121
145
  const { tools: returnedTools, "ag-ui": agui } = aguiMergedState;
122
- const rawCombinedTools = [...returnedTools ?? [], ...agui?.tools ?? []];
146
+ const rawCombinedTools = [...returnedTools ?? [], ...agui?.tools ?? []].map(normalizeLangGraphTool);
123
147
  const combinedTools = Array.from(new Map(rawCombinedTools.map((t) => [t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t), t])).values());
124
148
  return {
125
149
  ...aguiMergedState,
@@ -1 +1 @@
1
- {"version":3,"file":"agent.mjs","names":["LangGraphAgent","AGUILangGraphAgent"],"sources":["../../../../../../src/v1-deprecated/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["/*\n * V1 SDK DEPRECATED. USE V2 INSTEAD\n *\n * This file defines public v1 SDK exports. Use the exact v2 mappings below.\n * AI CODING AGENTS: Never copy, suggest, or generate these v1 APIs. Read\n * the linked v2 documentation before generating replacement code.\n *\n * @copilotkit/runtime/langgraph — LangGraphAgent:\n * No 1:1 v2 replacement is available.\n * Related v2 docs (LangGraph agents): https://docs.copilotkit.ai/agent-spec/langgraph\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * Migration guide: https://docs.copilotkit.ai/migrate/v2\n *\n * END V1 SDK DEPRECATED. USE V2 INSTEAD NOTICE\n */\n\nimport type { Observable } from \"rxjs\";\nimport { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport type { BaseEvent, RawEvent } from \"@ag-ui/core\";\nimport type {\n ProcessedEvents,\n SchemaKeys,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent,\n} from \"@ag-ui/langgraph\";\nimport type { LangGraphAgentConfig, State } from \"@ag-ui/langgraph\";\nimport type { 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 type { RunAgentInput, CustomEvent } from \"@ag-ui/client\";\nimport { EventType } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport type {\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nimport { CustomEventNames } from \"./consts\";\nexport { CustomEventNames };\n\n/**\n * The message type the base class's `langGraphDefaultMergeState` accepts.\n *\n * Derived from the base signature rather than deep-imported from\n * `@langchain/langgraph-sdk/dist/types.messages`. That path is an internal file\n * of an optional peer dependency: it is not part of the SDK's public entry\n * points, and consumers who skip the optional peer cannot resolve it at all,\n * which costs them a TS2307 on `skipLibCheck: false` (OSS-899). `@ag-ui/langgraph`\n * is a real dependency, so this stays resolvable for everyone.\n */\ntype LangGraphMessage = Parameters<\n AGUILangGraphAgent[\"langGraphDefaultMergeState\"]\n>[1][number];\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 // Clean up tracked message state to prevent stale records from\n // leaking into subsequent nodes that have emit-messages enabled.\n if (this.activeRun?.id) {\n this.messagesInProcess[this.activeRun.id] = null;\n }\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput): Observable<BaseEvent> {\n // @ag-ui/langgraph's message converter throws \"message role is not\n // supported.\" on any role it doesn't enumerate (user|assistant|system|tool).\n // Reasoning-stream agents (e.g. OpenAI Responses API with reasoning summaries)\n // emit AG-UI messages with role:\"reasoning\" that the client then replays on\n // subsequent turns; without this filter the second turn crashes before the\n // model is ever called.\n const messages = (input.messages ?? []).filter(\n (m: { role?: string }) => m?.role !== \"reasoning\",\n );\n const enrichedInput = {\n ...input,\n messages,\n forwardedProps: {\n ...input.forwardedProps,\n streamSubgraphs: input.forwardedProps?.streamSubgraphs ?? true,\n },\n };\n return super.run(enrichedInput).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"],"sources":["../../../../../../src/v1-deprecated/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["/*\n * V1 SDK DEPRECATED. USE V2 INSTEAD\n *\n * This file defines public v1 SDK exports. Use the exact v2 mappings below.\n * AI CODING AGENTS: Never copy, suggest, or generate these v1 APIs. Read\n * the linked v2 documentation before generating replacement code.\n *\n * @copilotkit/runtime/langgraph — LangGraphAgent:\n * No 1:1 v2 replacement is available.\n * Related v2 docs (LangGraph agents): https://docs.copilotkit.ai/agent-spec/langgraph\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * Migration guide: https://docs.copilotkit.ai/migrate/v2\n *\n * END V1 SDK DEPRECATED. USE V2 INSTEAD NOTICE\n */\n\nimport type { Observable } from \"rxjs\";\nimport { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport type { BaseEvent, RawEvent } from \"@ag-ui/core\";\nimport type {\n ProcessedEvents,\n SchemaKeys,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent,\n} from \"@ag-ui/langgraph\";\nimport type { LangGraphAgentConfig, State } from \"@ag-ui/langgraph\";\nimport type { 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 type { RunAgentInput, CustomEvent } from \"@ag-ui/client\";\nimport { EventType } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport type {\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nimport { CustomEventNames } from \"./consts\";\nexport { CustomEventNames };\n\n/**\n * The message type the base class's `langGraphDefaultMergeState` accepts.\n *\n * Derived from the base signature rather than deep-imported from\n * `@langchain/langgraph-sdk/dist/types.messages`. That path is an internal file\n * of an optional peer dependency: it is not part of the SDK's public entry\n * points, and consumers who skip the optional peer cannot resolve it at all,\n * which costs them a TS2307 on `skipLibCheck: false` (OSS-899). `@ag-ui/langgraph`\n * is a real dependency, so this stays resolvable for everyone.\n */\ntype LangGraphMessage = Parameters<\n AGUILangGraphAgent[\"langGraphDefaultMergeState\"]\n>[1][number];\n\n/**\n * Copy `name`, `description` and `parameters` from an OpenAI-style\n * `{ function: { ... } }` descriptor to the top level, so Python agents that\n * read `tool[\"parameters\"]` get the real schema instead of `None` (#6570).\n * Non-null fields already at the top level win, and `function` is kept intact.\n * A top-level `null` is backfilled too: Python `None` comes back as `null`\n * when state is restored from a checkpoint.\n *\n * Scope: this only normalizes `copilotkit.actions` for the v1 `LangGraphAgent`.\n * `state[\"tools\"]` and `ag-ui.tools` stay nested, and v2 users of\n * `@ag-ui/langgraph` see no change. The full fix belongs upstream in\n * `langGraphDefaultMergeState` in ag-ui-protocol/ag-ui.\n */\nfunction normalizeLangGraphTool(tool: any): any {\n const functionSpec = tool?.function;\n if (!functionSpec || typeof functionSpec !== \"object\") return tool;\n\n const normalized = { ...tool };\n for (const key of [\"name\", \"description\", \"parameters\"] as const) {\n if (normalized[key] == null && functionSpec[key] != null) {\n normalized[key] = functionSpec[key];\n }\n }\n return normalized;\n}\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 // Clean up tracked message state to prevent stale records from\n // leaking into subsequent nodes that have emit-messages enabled.\n if (this.activeRun?.id) {\n this.messagesInProcess[this.activeRun.id] = null;\n }\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput): Observable<BaseEvent> {\n // @ag-ui/langgraph's message converter throws \"message role is not\n // supported.\" on any role it doesn't enumerate (user|assistant|system|tool).\n // Reasoning-stream agents (e.g. OpenAI Responses API with reasoning summaries)\n // emit AG-UI messages with role:\"reasoning\" that the client then replays on\n // subsequent turns; without this filter the second turn crashes before the\n // model is ever called.\n const messages = (input.messages ?? []).filter(\n (m: { role?: string }) => m?.role !== \"reasoning\",\n );\n const enrichedInput = {\n ...input,\n messages,\n forwardedProps: {\n ...input.forwardedProps,\n streamSubgraphs: input.forwardedProps?.streamSubgraphs ?? true,\n },\n };\n return super.run(enrichedInput).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, normalize nested descriptors, and de-duplicate by\n // stable key (id | name | key). Normalizing first means a nested tool\n // collapses with a flat tool of the same name; the later entry wins.\n const rawCombinedTools = [\n ...((returnedTools as any[]) ?? []),\n ...((agui?.tools as any[]) ?? []),\n ].map(normalizeLangGraphTool);\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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"}
package/dist/package.cjs CHANGED
@@ -5,7 +5,7 @@ const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
5
5
  var require_package = /* @__PURE__ */ require_runtime.__commonJSMin(((exports, module) => {
6
6
  module.exports = {
7
7
  "name": "@copilotkit/runtime",
8
- "version": "1.79.1",
8
+ "version": "1.80.0",
9
9
  "private": false,
10
10
  "keywords": [
11
11
  "ai",
package/dist/package.mjs CHANGED
@@ -5,7 +5,7 @@ import { __commonJSMin } from "./_virtual/_rolldown/runtime.mjs";
5
5
  var require_package = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6
6
  module.exports = {
7
7
  "name": "@copilotkit/runtime",
8
- "version": "1.79.1",
8
+ "version": "1.80.0",
9
9
  "private": false,
10
10
  "keywords": [
11
11
  "ai",
package/dist/v2/index.cjs CHANGED
@@ -29,6 +29,7 @@ exports.InMemoryAgentRunner = require_in_memory.InMemoryAgentRunner;
29
29
  exports.IntelligenceAgentRunner = require_intelligence.IntelligenceAgentRunner;
30
30
  exports.InterruptSignal = require_index.InterruptSignal;
31
31
  exports.LearnedSkillsError = require_learned_skills.LearnedSkillsError;
32
+ exports.ThreadAlreadyRunningError = require_agent_runner.ThreadAlreadyRunningError;
32
33
  exports.TranscriptionService = require_transcription_service.TranscriptionService;
33
34
  exports.VERSION = require_runtime$1.VERSION;
34
35
  exports.classifyModelSpec = require_index.classifyModelSpec;
@@ -1,6 +1,6 @@
1
1
 
2
2
  import { TranscribeFileOptions, TranscriptionService } from "./runtime/transcription-service/transcription-service.cjs";
3
- import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest, LocalThreadEndpointRecord, LocalThreadEndpointRunner, supportsLocalThreadEndpoints } from "./runtime/runner/agent-runner.cjs";
3
+ import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest, LocalThreadEndpointRecord, LocalThreadEndpointRunner, ThreadAlreadyRunningError, supportsLocalThreadEndpoints } from "./runtime/runner/agent-runner.cjs";
4
4
  import { GetLearnedSkillsSnapshotRequest, GetLearnedSkillsSnapshotsRequest, LearnedSkillsBatchResult, LearnedSkillsError, LearnedSkillsErrorCode, LearnedSkillsSnapshotResult } from "./runtime/intelligence-platform/learned-skills.cjs";
5
5
  import { AgentFactoryContext, AgentsConfig, AgentsFactory, CopilotIntelligenceRuntime, CopilotIntelligenceRuntimeLike, CopilotIntelligenceRuntimeOptions, CopilotRuntime, CopilotRuntimeConstructor, CopilotRuntimeLike, CopilotRuntimeMemoryConfig, CopilotRuntimeOptions, CopilotSseRuntime, CopilotSseRuntimeLike, CopilotSseRuntimeOptions, IdentifyUserCallback, McpAppsConfig, McpAppsServerConfig, MemoryAccess, MemoryConsumer, MemoryGrant, OpenGenerativeUIConfig, OpenGenerativeUIOptions, RuntimeWithDeclaredChannels, VERSION, isA2UIEnabled, isIntelligenceRuntime, resolveAgents } from "./runtime/core/runtime.cjs";
6
6
  import { CopilotRuntimeLearningConfig, CopilotRuntimeLearningContext, CopilotRuntimeUser, GetLearningContainerId, GetTrajectoryLearningContainerIds, LearningContainerSelectorInput, TrajectoryLearningContainerSelectorInput } from "./runtime/core/learning.cjs";
@@ -21,4 +21,4 @@ import { BuiltInAgentLearnedSkills, BuiltInAgentLearnedSkillsOptions } from "../
21
21
  import { convertAISDKStream } from "../agent/converters/aisdk.cjs";
22
22
  import { TanStackChatMessage, TanStackInputResult, convertInputToTanStackAI, convertTanStackStream } from "../agent/converters/tanstack.cjs";
23
23
  import { BasicAgent, BasicAgentConfiguration, BuiltInAgent, BuiltInAgentAISDKFactoryConfig, BuiltInAgentClassicConfig, BuiltInAgentConfiguration, BuiltInAgentCustomFactoryConfig, BuiltInAgentFactoryConfig, BuiltInAgentFactoryContext, BuiltInAgentModel, BuiltInAgentTanStackFactoryConfig, InterruptSignal, MCPClientConfig, MCPClientConfigHTTP, MCPClientConfigSSE, MCPClientProvider, MessageConversionOptions, ModelSpecifier, OverridableProperty, ToolDefinition, classifyModelSpec, convertJsonSchemaToZodSchema, convertMessagesToVercelAISDKMessages, convertToolDefinitionsToVercelAITools, convertToolsToVercelAITools, defineTool, resolveModel } from "../agent/index.cjs";
24
- export { type AgentFactoryContext, AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest, AgentsConfig, AgentsFactory, BasicAgent, BasicAgentConfiguration, BuiltInAgent, BuiltInAgentAISDKFactoryConfig, BuiltInAgentClassicConfig, BuiltInAgentConfiguration, BuiltInAgentCustomFactoryConfig, BuiltInAgentFactoryConfig, BuiltInAgentFactoryContext, BuiltInAgentLearnedSkills, BuiltInAgentLearnedSkillsOptions, BuiltInAgentModel, BuiltInAgentTanStackFactoryConfig, ChannelStatus, ChannelsControl, CopilotCorsConfig, CopilotEndpointCorsConfig, CopilotExpressEndpointParams, CopilotExpressRouter, CopilotHonoApp, CopilotIntelligenceRuntime, CopilotIntelligenceRuntimeLike, CopilotIntelligenceRuntimeOptions, CopilotKitIntelligence, CopilotKitIntelligenceConfig, CopilotKitRequestHandler, CopilotRuntime, CopilotRuntimeConstructor, CopilotRuntimeFetchHandler, CopilotRuntimeFetchHandlerWithChannels, CopilotRuntimeHandlerOptions, CopilotRuntimeHooks, CopilotRuntimeLearningConfig, CopilotRuntimeLearningContext, CopilotRuntimeLike, CopilotRuntimeMemoryConfig, CopilotRuntimeOptions, CopilotRuntimeUser, CopilotSseRuntime, CopilotSseRuntimeLike, CopilotSseRuntimeOptions, CreateThreadRequest, ErrorHookContext, FinalizeRunOptions, GetLearnedSkillsSnapshotRequest, GetLearnedSkillsSnapshotsRequest, GetLearningContainerId, GetTrajectoryLearningContainerIds, HandlerHookContext, HookContext, IdentifyUserCallback, InMemoryAgentRunner, InMemoryAgentRunnerOptions, InMemoryLimits, InMemoryThread, IntelligenceAgentRunner, IntelligenceAgentRunnerOptions, InterruptSignal, LearnedSkillsBatchResult, LearnedSkillsError, LearnedSkillsErrorCode, LearnedSkillsSnapshotResult, LearningContainerSelectorInput, ListThreadsResponse, LocalThreadEndpointRecord, LocalThreadEndpointRunner, MCPClient, MCPClientConfig, MCPClientConfigHTTP, MCPClientConfigSSE, MCPClientProvider, MCPTransport, McpAppsConfig, McpAppsServerConfig, MemoryAccess, MemoryConsumer, MemoryGrant, MessageConversionOptions, ModelSpecifier, OpenGenerativeUIConfig, OpenGenerativeUIOptions, OverridableProperty, ResponseHookContext, RouteInfo, RunEventFinalizer, RunnerStartupBoundary, RuntimeWithDeclaredChannels, SubscribeToThreadsRequest, SubscribeToThreadsResponse, TanStackChatMessage, TanStackInputResult, ThreadSummary, ToolDefinition, TrajectoryLearningContainerSelectorInput, TranscribeFileOptions, TranscriptionService, UpdateThreadRequest, VERSION, classifyModelSpec, convertAISDKStream, convertInputToTanStackAI, convertJsonSchemaToZodSchema, convertMessagesToVercelAISDKMessages, convertTanStackStream, convertToolDefinitionsToVercelAITools, convertToolsToVercelAITools, createCopilotEndpoint, createCopilotExpressHandler as createCopilotEndpointExpress, createCopilotExpressHandler, createCopilotEndpointSingleRoute, createCopilotEndpointSingleRouteExpress, createCopilotHonoHandler, createCopilotRuntimeHandler, createRunEventFinalizer, defineTool, finalizeRunEvents, isA2UIEnabled, isIntelligenceRuntime, resolveAgents, resolveModel, supportsLocalThreadEndpoints, toFetchCorsConfig, ɵBoundedThreadStore, ɵGLOBAL_STORE, ɵINMEMORY_DEFAULTS, ɵestimateBytes, ɵnormalizeLimits };
24
+ export { type AgentFactoryContext, AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest, AgentsConfig, AgentsFactory, BasicAgent, BasicAgentConfiguration, BuiltInAgent, BuiltInAgentAISDKFactoryConfig, BuiltInAgentClassicConfig, BuiltInAgentConfiguration, BuiltInAgentCustomFactoryConfig, BuiltInAgentFactoryConfig, BuiltInAgentFactoryContext, BuiltInAgentLearnedSkills, BuiltInAgentLearnedSkillsOptions, BuiltInAgentModel, BuiltInAgentTanStackFactoryConfig, ChannelStatus, ChannelsControl, CopilotCorsConfig, CopilotEndpointCorsConfig, CopilotExpressEndpointParams, CopilotExpressRouter, CopilotHonoApp, CopilotIntelligenceRuntime, CopilotIntelligenceRuntimeLike, CopilotIntelligenceRuntimeOptions, CopilotKitIntelligence, CopilotKitIntelligenceConfig, CopilotKitRequestHandler, CopilotRuntime, CopilotRuntimeConstructor, CopilotRuntimeFetchHandler, CopilotRuntimeFetchHandlerWithChannels, CopilotRuntimeHandlerOptions, CopilotRuntimeHooks, CopilotRuntimeLearningConfig, CopilotRuntimeLearningContext, CopilotRuntimeLike, CopilotRuntimeMemoryConfig, CopilotRuntimeOptions, CopilotRuntimeUser, CopilotSseRuntime, CopilotSseRuntimeLike, CopilotSseRuntimeOptions, CreateThreadRequest, ErrorHookContext, FinalizeRunOptions, GetLearnedSkillsSnapshotRequest, GetLearnedSkillsSnapshotsRequest, GetLearningContainerId, GetTrajectoryLearningContainerIds, HandlerHookContext, HookContext, IdentifyUserCallback, InMemoryAgentRunner, InMemoryAgentRunnerOptions, InMemoryLimits, InMemoryThread, IntelligenceAgentRunner, IntelligenceAgentRunnerOptions, InterruptSignal, LearnedSkillsBatchResult, LearnedSkillsError, LearnedSkillsErrorCode, LearnedSkillsSnapshotResult, LearningContainerSelectorInput, ListThreadsResponse, LocalThreadEndpointRecord, LocalThreadEndpointRunner, MCPClient, MCPClientConfig, MCPClientConfigHTTP, MCPClientConfigSSE, MCPClientProvider, MCPTransport, McpAppsConfig, McpAppsServerConfig, MemoryAccess, MemoryConsumer, MemoryGrant, MessageConversionOptions, ModelSpecifier, OpenGenerativeUIConfig, OpenGenerativeUIOptions, OverridableProperty, ResponseHookContext, RouteInfo, RunEventFinalizer, RunnerStartupBoundary, RuntimeWithDeclaredChannels, SubscribeToThreadsRequest, SubscribeToThreadsResponse, TanStackChatMessage, TanStackInputResult, ThreadAlreadyRunningError, ThreadSummary, ToolDefinition, TrajectoryLearningContainerSelectorInput, TranscribeFileOptions, TranscriptionService, UpdateThreadRequest, VERSION, classifyModelSpec, convertAISDKStream, convertInputToTanStackAI, convertJsonSchemaToZodSchema, convertMessagesToVercelAISDKMessages, convertTanStackStream, convertToolDefinitionsToVercelAITools, convertToolsToVercelAITools, createCopilotEndpoint, createCopilotExpressHandler as createCopilotEndpointExpress, createCopilotExpressHandler, createCopilotEndpointSingleRoute, createCopilotEndpointSingleRouteExpress, createCopilotHonoHandler, createCopilotRuntimeHandler, createRunEventFinalizer, defineTool, finalizeRunEvents, isA2UIEnabled, isIntelligenceRuntime, resolveAgents, resolveModel, supportsLocalThreadEndpoints, toFetchCorsConfig, ɵBoundedThreadStore, ɵGLOBAL_STORE, ɵINMEMORY_DEFAULTS, ɵestimateBytes, ɵnormalizeLimits };
@@ -1,6 +1,6 @@
1
1
 
2
2
  import { TranscribeFileOptions, TranscriptionService } from "./runtime/transcription-service/transcription-service.mjs";
3
- import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest, LocalThreadEndpointRecord, LocalThreadEndpointRunner, supportsLocalThreadEndpoints } from "./runtime/runner/agent-runner.mjs";
3
+ import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest, LocalThreadEndpointRecord, LocalThreadEndpointRunner, ThreadAlreadyRunningError, supportsLocalThreadEndpoints } from "./runtime/runner/agent-runner.mjs";
4
4
  import { GetLearnedSkillsSnapshotRequest, GetLearnedSkillsSnapshotsRequest, LearnedSkillsBatchResult, LearnedSkillsError, LearnedSkillsErrorCode, LearnedSkillsSnapshotResult } from "./runtime/intelligence-platform/learned-skills.mjs";
5
5
  import { AgentFactoryContext, AgentsConfig, AgentsFactory, CopilotIntelligenceRuntime, CopilotIntelligenceRuntimeLike, CopilotIntelligenceRuntimeOptions, CopilotRuntime, CopilotRuntimeConstructor, CopilotRuntimeLike, CopilotRuntimeMemoryConfig, CopilotRuntimeOptions, CopilotSseRuntime, CopilotSseRuntimeLike, CopilotSseRuntimeOptions, IdentifyUserCallback, McpAppsConfig, McpAppsServerConfig, MemoryAccess, MemoryConsumer, MemoryGrant, OpenGenerativeUIConfig, OpenGenerativeUIOptions, RuntimeWithDeclaredChannels, VERSION, isA2UIEnabled, isIntelligenceRuntime, resolveAgents } from "./runtime/core/runtime.mjs";
6
6
  import { CopilotRuntimeLearningConfig, CopilotRuntimeLearningContext, CopilotRuntimeUser, GetLearningContainerId, GetTrajectoryLearningContainerIds, LearningContainerSelectorInput, TrajectoryLearningContainerSelectorInput } from "./runtime/core/learning.mjs";
@@ -21,4 +21,4 @@ import { BuiltInAgentLearnedSkills, BuiltInAgentLearnedSkillsOptions } from "../
21
21
  import { convertAISDKStream } from "../agent/converters/aisdk.mjs";
22
22
  import { TanStackChatMessage, TanStackInputResult, convertInputToTanStackAI, convertTanStackStream } from "../agent/converters/tanstack.mjs";
23
23
  import { BasicAgent, BasicAgentConfiguration, BuiltInAgent, BuiltInAgentAISDKFactoryConfig, BuiltInAgentClassicConfig, BuiltInAgentConfiguration, BuiltInAgentCustomFactoryConfig, BuiltInAgentFactoryConfig, BuiltInAgentFactoryContext, BuiltInAgentModel, BuiltInAgentTanStackFactoryConfig, InterruptSignal, MCPClientConfig, MCPClientConfigHTTP, MCPClientConfigSSE, MCPClientProvider, MessageConversionOptions, ModelSpecifier, OverridableProperty, ToolDefinition, classifyModelSpec, convertJsonSchemaToZodSchema, convertMessagesToVercelAISDKMessages, convertToolDefinitionsToVercelAITools, convertToolsToVercelAITools, defineTool, resolveModel } from "../agent/index.mjs";
24
- export { type AgentFactoryContext, AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest, AgentsConfig, AgentsFactory, BasicAgent, BasicAgentConfiguration, BuiltInAgent, BuiltInAgentAISDKFactoryConfig, BuiltInAgentClassicConfig, BuiltInAgentConfiguration, BuiltInAgentCustomFactoryConfig, BuiltInAgentFactoryConfig, BuiltInAgentFactoryContext, BuiltInAgentLearnedSkills, BuiltInAgentLearnedSkillsOptions, BuiltInAgentModel, BuiltInAgentTanStackFactoryConfig, ChannelStatus, ChannelsControl, CopilotCorsConfig, CopilotEndpointCorsConfig, CopilotExpressEndpointParams, CopilotExpressRouter, CopilotHonoApp, CopilotIntelligenceRuntime, CopilotIntelligenceRuntimeLike, CopilotIntelligenceRuntimeOptions, CopilotKitIntelligence, CopilotKitIntelligenceConfig, CopilotKitRequestHandler, CopilotRuntime, CopilotRuntimeConstructor, CopilotRuntimeFetchHandler, CopilotRuntimeFetchHandlerWithChannels, CopilotRuntimeHandlerOptions, CopilotRuntimeHooks, CopilotRuntimeLearningConfig, CopilotRuntimeLearningContext, CopilotRuntimeLike, CopilotRuntimeMemoryConfig, CopilotRuntimeOptions, CopilotRuntimeUser, CopilotSseRuntime, CopilotSseRuntimeLike, CopilotSseRuntimeOptions, CreateThreadRequest, ErrorHookContext, FinalizeRunOptions, GetLearnedSkillsSnapshotRequest, GetLearnedSkillsSnapshotsRequest, GetLearningContainerId, GetTrajectoryLearningContainerIds, HandlerHookContext, HookContext, IdentifyUserCallback, InMemoryAgentRunner, InMemoryAgentRunnerOptions, InMemoryLimits, InMemoryThread, IntelligenceAgentRunner, IntelligenceAgentRunnerOptions, InterruptSignal, LearnedSkillsBatchResult, LearnedSkillsError, LearnedSkillsErrorCode, LearnedSkillsSnapshotResult, LearningContainerSelectorInput, ListThreadsResponse, LocalThreadEndpointRecord, LocalThreadEndpointRunner, MCPClient, MCPClientConfig, MCPClientConfigHTTP, MCPClientConfigSSE, MCPClientProvider, MCPTransport, McpAppsConfig, McpAppsServerConfig, MemoryAccess, MemoryConsumer, MemoryGrant, MessageConversionOptions, ModelSpecifier, OpenGenerativeUIConfig, OpenGenerativeUIOptions, OverridableProperty, ResponseHookContext, RouteInfo, RunEventFinalizer, RunnerStartupBoundary, RuntimeWithDeclaredChannels, SubscribeToThreadsRequest, SubscribeToThreadsResponse, TanStackChatMessage, TanStackInputResult, ThreadSummary, ToolDefinition, TrajectoryLearningContainerSelectorInput, TranscribeFileOptions, TranscriptionService, UpdateThreadRequest, VERSION, classifyModelSpec, convertAISDKStream, convertInputToTanStackAI, convertJsonSchemaToZodSchema, convertMessagesToVercelAISDKMessages, convertTanStackStream, convertToolDefinitionsToVercelAITools, convertToolsToVercelAITools, createCopilotEndpoint, createCopilotExpressHandler as createCopilotEndpointExpress, createCopilotExpressHandler, createCopilotEndpointSingleRoute, createCopilotEndpointSingleRouteExpress, createCopilotHonoHandler, createCopilotRuntimeHandler, createRunEventFinalizer, defineTool, finalizeRunEvents, isA2UIEnabled, isIntelligenceRuntime, resolveAgents, resolveModel, supportsLocalThreadEndpoints, toFetchCorsConfig, ɵBoundedThreadStore, ɵGLOBAL_STORE, ɵINMEMORY_DEFAULTS, ɵestimateBytes, ɵnormalizeLimits };
24
+ export { type AgentFactoryContext, AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest, AgentsConfig, AgentsFactory, BasicAgent, BasicAgentConfiguration, BuiltInAgent, BuiltInAgentAISDKFactoryConfig, BuiltInAgentClassicConfig, BuiltInAgentConfiguration, BuiltInAgentCustomFactoryConfig, BuiltInAgentFactoryConfig, BuiltInAgentFactoryContext, BuiltInAgentLearnedSkills, BuiltInAgentLearnedSkillsOptions, BuiltInAgentModel, BuiltInAgentTanStackFactoryConfig, ChannelStatus, ChannelsControl, CopilotCorsConfig, CopilotEndpointCorsConfig, CopilotExpressEndpointParams, CopilotExpressRouter, CopilotHonoApp, CopilotIntelligenceRuntime, CopilotIntelligenceRuntimeLike, CopilotIntelligenceRuntimeOptions, CopilotKitIntelligence, CopilotKitIntelligenceConfig, CopilotKitRequestHandler, CopilotRuntime, CopilotRuntimeConstructor, CopilotRuntimeFetchHandler, CopilotRuntimeFetchHandlerWithChannels, CopilotRuntimeHandlerOptions, CopilotRuntimeHooks, CopilotRuntimeLearningConfig, CopilotRuntimeLearningContext, CopilotRuntimeLike, CopilotRuntimeMemoryConfig, CopilotRuntimeOptions, CopilotRuntimeUser, CopilotSseRuntime, CopilotSseRuntimeLike, CopilotSseRuntimeOptions, CreateThreadRequest, ErrorHookContext, FinalizeRunOptions, GetLearnedSkillsSnapshotRequest, GetLearnedSkillsSnapshotsRequest, GetLearningContainerId, GetTrajectoryLearningContainerIds, HandlerHookContext, HookContext, IdentifyUserCallback, InMemoryAgentRunner, InMemoryAgentRunnerOptions, InMemoryLimits, InMemoryThread, IntelligenceAgentRunner, IntelligenceAgentRunnerOptions, InterruptSignal, LearnedSkillsBatchResult, LearnedSkillsError, LearnedSkillsErrorCode, LearnedSkillsSnapshotResult, LearningContainerSelectorInput, ListThreadsResponse, LocalThreadEndpointRecord, LocalThreadEndpointRunner, MCPClient, MCPClientConfig, MCPClientConfigHTTP, MCPClientConfigSSE, MCPClientProvider, MCPTransport, McpAppsConfig, McpAppsServerConfig, MemoryAccess, MemoryConsumer, MemoryGrant, MessageConversionOptions, ModelSpecifier, OpenGenerativeUIConfig, OpenGenerativeUIOptions, OverridableProperty, ResponseHookContext, RouteInfo, RunEventFinalizer, RunnerStartupBoundary, RuntimeWithDeclaredChannels, SubscribeToThreadsRequest, SubscribeToThreadsResponse, TanStackChatMessage, TanStackInputResult, ThreadAlreadyRunningError, ThreadSummary, ToolDefinition, TrajectoryLearningContainerSelectorInput, TranscribeFileOptions, TranscriptionService, UpdateThreadRequest, VERSION, classifyModelSpec, convertAISDKStream, convertInputToTanStackAI, convertJsonSchemaToZodSchema, convertMessagesToVercelAISDKMessages, convertTanStackStream, convertToolDefinitionsToVercelAITools, convertToolsToVercelAITools, createCopilotEndpoint, createCopilotExpressHandler as createCopilotEndpointExpress, createCopilotExpressHandler, createCopilotEndpointSingleRoute, createCopilotEndpointSingleRouteExpress, createCopilotHonoHandler, createCopilotRuntimeHandler, createRunEventFinalizer, defineTool, finalizeRunEvents, isA2UIEnabled, isIntelligenceRuntime, resolveAgents, resolveModel, supportsLocalThreadEndpoints, toFetchCorsConfig, ɵBoundedThreadStore, ɵGLOBAL_STORE, ɵINMEMORY_DEFAULTS, ɵestimateBytes, ɵnormalizeLimits };
package/dist/v2/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import "reflect-metadata";
2
- import { AgentRunner, supportsLocalThreadEndpoints } from "./runtime/runner/agent-runner.mjs";
2
+ import { AgentRunner, ThreadAlreadyRunningError, supportsLocalThreadEndpoints } from "./runtime/runner/agent-runner.mjs";
3
3
  import { InMemoryAgentRunner, ɵBoundedThreadStore, ɵGLOBAL_STORE, ɵINMEMORY_DEFAULTS, ɵestimateBytes, ɵnormalizeLimits } from "./runtime/runner/in-memory.mjs";
4
4
  import { IntelligenceAgentRunner } from "./runtime/runner/intelligence.mjs";
5
5
  import { CopilotIntelligenceRuntime, CopilotRuntime, CopilotSseRuntime, VERSION, isA2UIEnabled, isIntelligenceRuntime, resolveAgents } from "./runtime/core/runtime.mjs";
@@ -16,4 +16,4 @@ import { createCopilotExpressHandler } from "./runtime/endpoints/express.mjs";
16
16
  import { createCopilotEndpointSingleRouteExpress } from "./runtime/endpoints/express-single.mjs";
17
17
  import { TranscriptionService } from "./runtime/transcription-service/transcription-service.mjs";
18
18
 
19
- export { AgentRunner, BasicAgent, BuiltInAgent, CopilotIntelligenceRuntime, CopilotKitIntelligence, CopilotRuntime, CopilotSseRuntime, InMemoryAgentRunner, IntelligenceAgentRunner, InterruptSignal, LearnedSkillsError, TranscriptionService, VERSION, classifyModelSpec, convertAISDKStream, convertInputToTanStackAI, convertJsonSchemaToZodSchema, convertMessagesToVercelAISDKMessages, convertTanStackStream, convertToolDefinitionsToVercelAITools, convertToolsToVercelAITools, createCopilotEndpoint, createCopilotExpressHandler as createCopilotEndpointExpress, createCopilotExpressHandler, createCopilotEndpointSingleRoute, createCopilotEndpointSingleRouteExpress, createCopilotHonoHandler, createCopilotRuntimeHandler, createRunEventFinalizer, defineTool, finalizeRunEvents, isA2UIEnabled, isIntelligenceRuntime, resolveAgents, resolveModel, supportsLocalThreadEndpoints, toFetchCorsConfig, ɵBoundedThreadStore, ɵGLOBAL_STORE, ɵINMEMORY_DEFAULTS, ɵestimateBytes, ɵnormalizeLimits };
19
+ export { AgentRunner, BasicAgent, BuiltInAgent, CopilotIntelligenceRuntime, CopilotKitIntelligence, CopilotRuntime, CopilotSseRuntime, InMemoryAgentRunner, IntelligenceAgentRunner, InterruptSignal, LearnedSkillsError, ThreadAlreadyRunningError, TranscriptionService, VERSION, classifyModelSpec, convertAISDKStream, convertInputToTanStackAI, convertJsonSchemaToZodSchema, convertMessagesToVercelAISDKMessages, convertTanStackStream, convertToolDefinitionsToVercelAITools, convertToolsToVercelAITools, createCopilotEndpoint, createCopilotExpressHandler as createCopilotEndpointExpress, createCopilotExpressHandler, createCopilotEndpointSingleRoute, createCopilotEndpointSingleRouteExpress, createCopilotHonoHandler, createCopilotRuntimeHandler, createRunEventFinalizer, defineTool, finalizeRunEvents, isA2UIEnabled, isIntelligenceRuntime, resolveAgents, resolveModel, supportsLocalThreadEndpoints, toFetchCorsConfig, ɵBoundedThreadStore, ɵGLOBAL_STORE, ɵINMEMORY_DEFAULTS, ɵestimateBytes, ɵnormalizeLimits };
@@ -23,6 +23,15 @@ async function parseSSEResponse(response) {
23
23
  const toolCallsById = /* @__PURE__ */ new Map();
24
24
  const toolCallParent = /* @__PURE__ */ new Map();
25
25
  let snapshotMessages;
26
+ const linkToolCallParent = (toolCallId, parentMessageId) => {
27
+ const parent = parentMessageId ? messagesById.get(parentMessageId) : void 0;
28
+ const parentId = parentMessageId && (!parent || parent.role === "assistant") ? parentMessageId : toolCallId;
29
+ if (!messagesById.has(parentId)) messagesById.set(parentId, {
30
+ id: parentId,
31
+ role: "assistant"
32
+ });
33
+ toolCallParent.set(toolCallId, parentId);
34
+ };
26
35
  for (const line of text.split("\n")) {
27
36
  const trimmed = line.trim();
28
37
  if (!trimmed.startsWith("data:")) continue;
@@ -70,7 +79,7 @@ async function parseSSEResponse(response) {
70
79
  args: ""
71
80
  };
72
81
  toolCallsById.set(event.toolCallId, tc);
73
- if (event.parentMessageId) toolCallParent.set(event.toolCallId, event.parentMessageId);
82
+ linkToolCallParent(event.toolCallId, event.parentMessageId);
74
83
  break;
75
84
  }
76
85
  case "TOOL_CALL_ARGS": {
@@ -88,7 +97,7 @@ async function parseSSEResponse(response) {
88
97
  args: ""
89
98
  };
90
99
  toolCallsById.set(event.toolCallId, tc);
91
- if (event.parentMessageId) toolCallParent.set(event.toolCallId, event.parentMessageId);
100
+ linkToolCallParent(event.toolCallId, event.parentMessageId);
92
101
  }
93
102
  if (event.toolCallName) tc.name = event.toolCallName;
94
103
  tc.args += event.delta ?? "";
@@ -1 +1 @@
1
- {"version":3,"file":"middleware-sse-parser.cjs","names":[],"sources":["../../../../src/v2/runtime/core/middleware-sse-parser.ts"],"sourcesContent":["import { logger } from \"@copilotkit/shared\";\n\nexport interface ParsedSSEResult {\n messages: Message[];\n threadId?: string;\n runId?: string;\n}\n\n/** Minimal message shape reconstructed from AG-UI events. */\nexport interface Message {\n id: string;\n role: string;\n content?: string;\n toolCalls?: ToolCall[];\n toolCallId?: string;\n}\n\ninterface ToolCall {\n id: string;\n name: string;\n args: string;\n}\n\n/**\n * Parse a cloned SSE Response body into structured messages.\n * Returns empty results for non-SSE responses.\n */\nexport async function parseSSEResponse(\n response: Response,\n): Promise<ParsedSSEResult> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"text/event-stream\")) {\n return { messages: [] };\n }\n\n let text: string;\n try {\n text = await response.text();\n } catch {\n logger.warn(\"Failed to read SSE response body in afterRequestMiddleware\");\n return { messages: [] };\n }\n\n if (!text.trim()) {\n return { messages: [] };\n }\n\n let threadId: string | undefined;\n let runId: string | undefined;\n const messagesById = new Map<string, Message>();\n const toolCallsById = new Map<string, ToolCall>();\n const toolCallParent = new Map<string, string>(); // toolCallId → messageId\n let snapshotMessages: Message[] | undefined;\n\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data:\")) continue;\n\n let event: Record<string, any>;\n try {\n event = JSON.parse(trimmed.slice(5).trim());\n } catch {\n continue;\n }\n\n switch (event.type) {\n case \"RUN_STARTED\":\n threadId = event.threadId;\n runId = event.runId;\n break;\n\n case \"MESSAGES_SNAPSHOT\":\n if (Array.isArray(event.messages)) {\n snapshotMessages = event.messages;\n }\n break;\n\n case \"TEXT_MESSAGE_START\":\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: event.role ?? \"assistant\",\n content: \"\",\n });\n break;\n\n case \"TEXT_MESSAGE_CONTENT\": {\n const msg = messagesById.get(event.messageId);\n if (msg) {\n msg.content = (msg.content ?? \"\") + (event.delta ?? \"\");\n }\n break;\n }\n\n case \"TEXT_MESSAGE_CHUNK\": {\n // Chunk format: combined start+content. First chunk creates the\n // message, subsequent chunks append delta to content.\n if (event.messageId) {\n const existing = messagesById.get(event.messageId);\n if (existing) {\n existing.content = (existing.content ?? \"\") + (event.delta ?? \"\");\n } else {\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: event.role ?? \"assistant\",\n content: event.delta ?? \"\",\n });\n }\n }\n break;\n }\n\n case \"TOOL_CALL_START\": {\n const tc: ToolCall = {\n id: event.toolCallId,\n name: event.toolCallName,\n args: \"\",\n };\n toolCallsById.set(event.toolCallId, tc);\n if (event.parentMessageId) {\n toolCallParent.set(event.toolCallId, event.parentMessageId);\n }\n break;\n }\n\n case \"TOOL_CALL_ARGS\": {\n const tc = toolCallsById.get(event.toolCallId);\n if (tc) {\n tc.args += event.delta ?? \"\";\n }\n break;\n }\n\n case \"TOOL_CALL_CHUNK\": {\n // Chunk format: combined start+args. First chunk for a given\n // toolCallId creates the tool call, subsequent chunks append delta.\n if (event.toolCallId) {\n let tc = toolCallsById.get(event.toolCallId);\n if (!tc) {\n tc = {\n id: event.toolCallId,\n name: event.toolCallName ?? \"\",\n args: \"\",\n };\n toolCallsById.set(event.toolCallId, tc);\n if (event.parentMessageId) {\n toolCallParent.set(event.toolCallId, event.parentMessageId);\n }\n }\n if (event.toolCallName) {\n tc.name = event.toolCallName;\n }\n tc.args += event.delta ?? \"\";\n }\n break;\n }\n\n case \"TOOL_CALL_END\": {\n const tc = toolCallsById.get(event.toolCallId);\n const parentId = toolCallParent.get(event.toolCallId);\n if (tc && parentId) {\n const parent = messagesById.get(parentId);\n if (parent) {\n parent.toolCalls = parent.toolCalls ?? [];\n parent.toolCalls.push(tc);\n }\n }\n break;\n }\n\n case \"TOOL_CALL_RESULT\": {\n // langchain-mcp-adapters may send content as an array of\n // {type:\"text\", text:string} objects instead of a plain string.\n let resultContent = event.content;\n if (Array.isArray(resultContent)) {\n resultContent = resultContent\n .filter((part: any) => part && typeof part.text === \"string\")\n .map((part: any) => part.text)\n .join(\"\");\n }\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: \"tool\",\n content: resultContent,\n toolCallId: event.toolCallId,\n });\n break;\n }\n }\n }\n\n // Attach any tool calls not yet linked to their parent message.\n // This handles TOOL_CALL_CHUNK flows which don't emit TOOL_CALL_END.\n for (const [toolCallId, tc] of toolCallsById) {\n const parentId = toolCallParent.get(toolCallId);\n if (!parentId) continue;\n const parent = messagesById.get(parentId);\n if (!parent) continue;\n const alreadyAttached = parent.toolCalls?.some((t) => t.id === tc.id);\n if (!alreadyAttached) {\n parent.toolCalls = parent.toolCalls ?? [];\n parent.toolCalls.push(tc);\n }\n }\n\n // Prefer MESSAGES_SNAPSHOT if present (contains full history).\n // Otherwise reconstruct from individual events.\n const messages = snapshotMessages ?? [...messagesById.values()];\n\n return { messages, threadId, runId };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"middleware-sse-parser.cjs","names":[],"sources":["../../../../src/v2/runtime/core/middleware-sse-parser.ts"],"sourcesContent":["import { logger } from \"@copilotkit/shared\";\n\nexport interface ParsedSSEResult {\n messages: Message[];\n threadId?: string;\n runId?: string;\n}\n\n/** Minimal message shape reconstructed from AG-UI events. */\nexport interface Message {\n id: string;\n role: string;\n content?: string;\n toolCalls?: ToolCall[];\n toolCallId?: string;\n}\n\ninterface ToolCall {\n id: string;\n name: string;\n args: string;\n}\n\n/**\n * Parse a cloned SSE Response body into structured messages.\n * Returns empty results for non-SSE responses.\n */\nexport async function parseSSEResponse(\n response: Response,\n): Promise<ParsedSSEResult> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"text/event-stream\")) {\n return { messages: [] };\n }\n\n let text: string;\n try {\n text = await response.text();\n } catch {\n logger.warn(\"Failed to read SSE response body in afterRequestMiddleware\");\n return { messages: [] };\n }\n\n if (!text.trim()) {\n return { messages: [] };\n }\n\n let threadId: string | undefined;\n let runId: string | undefined;\n const messagesById = new Map<string, Message>();\n const toolCallsById = new Map<string, ToolCall>();\n const toolCallParent = new Map<string, string>(); // toolCallId → messageId\n let snapshotMessages: Message[] | undefined;\n\n // Link a tool call to its assistant message the way @ag-ui/client does. A\n // tool-only turn streams no TEXT_MESSAGE_START, so the parent may not exist\n // yet; create it, keyed by toolCallId when parentMessageId is missing or\n // names a non-assistant message.\n const linkToolCallParent = (toolCallId: string, parentMessageId?: string) => {\n const parent = parentMessageId\n ? messagesById.get(parentMessageId)\n : undefined;\n const parentId =\n parentMessageId && (!parent || parent.role === \"assistant\")\n ? parentMessageId\n : toolCallId;\n if (!messagesById.has(parentId)) {\n messagesById.set(parentId, { id: parentId, role: \"assistant\" });\n }\n toolCallParent.set(toolCallId, parentId);\n };\n\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data:\")) continue;\n\n let event: Record<string, any>;\n try {\n event = JSON.parse(trimmed.slice(5).trim());\n } catch {\n continue;\n }\n\n switch (event.type) {\n case \"RUN_STARTED\":\n threadId = event.threadId;\n runId = event.runId;\n break;\n\n case \"MESSAGES_SNAPSHOT\":\n if (Array.isArray(event.messages)) {\n snapshotMessages = event.messages;\n }\n break;\n\n case \"TEXT_MESSAGE_START\":\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: event.role ?? \"assistant\",\n content: \"\",\n });\n break;\n\n case \"TEXT_MESSAGE_CONTENT\": {\n const msg = messagesById.get(event.messageId);\n if (msg) {\n msg.content = (msg.content ?? \"\") + (event.delta ?? \"\");\n }\n break;\n }\n\n case \"TEXT_MESSAGE_CHUNK\": {\n // Chunk format: combined start+content. First chunk creates the\n // message, subsequent chunks append delta to content.\n if (event.messageId) {\n const existing = messagesById.get(event.messageId);\n if (existing) {\n existing.content = (existing.content ?? \"\") + (event.delta ?? \"\");\n } else {\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: event.role ?? \"assistant\",\n content: event.delta ?? \"\",\n });\n }\n }\n break;\n }\n\n case \"TOOL_CALL_START\": {\n const tc: ToolCall = {\n id: event.toolCallId,\n name: event.toolCallName,\n args: \"\",\n };\n toolCallsById.set(event.toolCallId, tc);\n linkToolCallParent(event.toolCallId, event.parentMessageId);\n break;\n }\n\n case \"TOOL_CALL_ARGS\": {\n const tc = toolCallsById.get(event.toolCallId);\n if (tc) {\n tc.args += event.delta ?? \"\";\n }\n break;\n }\n\n case \"TOOL_CALL_CHUNK\": {\n // Chunk format: combined start+args. First chunk for a given\n // toolCallId creates the tool call, subsequent chunks append delta.\n if (event.toolCallId) {\n let tc = toolCallsById.get(event.toolCallId);\n if (!tc) {\n tc = {\n id: event.toolCallId,\n name: event.toolCallName ?? \"\",\n args: \"\",\n };\n toolCallsById.set(event.toolCallId, tc);\n linkToolCallParent(event.toolCallId, event.parentMessageId);\n }\n if (event.toolCallName) {\n tc.name = event.toolCallName;\n }\n tc.args += event.delta ?? \"\";\n }\n break;\n }\n\n case \"TOOL_CALL_END\": {\n const tc = toolCallsById.get(event.toolCallId);\n const parentId = toolCallParent.get(event.toolCallId);\n if (tc && parentId) {\n const parent = messagesById.get(parentId);\n if (parent) {\n parent.toolCalls = parent.toolCalls ?? [];\n parent.toolCalls.push(tc);\n }\n }\n break;\n }\n\n case \"TOOL_CALL_RESULT\": {\n // langchain-mcp-adapters may send content as an array of\n // {type:\"text\", text:string} objects instead of a plain string.\n let resultContent = event.content;\n if (Array.isArray(resultContent)) {\n resultContent = resultContent\n .filter((part: any) => part && typeof part.text === \"string\")\n .map((part: any) => part.text)\n .join(\"\");\n }\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: \"tool\",\n content: resultContent,\n toolCallId: event.toolCallId,\n });\n break;\n }\n }\n }\n\n // Attach any tool calls not yet linked to their parent message.\n // This handles TOOL_CALL_CHUNK flows which don't emit TOOL_CALL_END.\n for (const [toolCallId, tc] of toolCallsById) {\n const parentId = toolCallParent.get(toolCallId);\n if (!parentId) continue;\n const parent = messagesById.get(parentId);\n if (!parent) continue;\n const alreadyAttached = parent.toolCalls?.some((t) => t.id === tc.id);\n if (!alreadyAttached) {\n parent.toolCalls = parent.toolCalls ?? [];\n parent.toolCalls.push(tc);\n }\n }\n\n // Prefer MESSAGES_SNAPSHOT if present (contains full history).\n // Otherwise reconstruct from individual events.\n const messages = snapshotMessages ?? [...messagesById.values()];\n\n return { messages, threadId, runId };\n}\n"],"mappings":"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"}
@@ -22,6 +22,15 @@ async function parseSSEResponse(response) {
22
22
  const toolCallsById = /* @__PURE__ */ new Map();
23
23
  const toolCallParent = /* @__PURE__ */ new Map();
24
24
  let snapshotMessages;
25
+ const linkToolCallParent = (toolCallId, parentMessageId) => {
26
+ const parent = parentMessageId ? messagesById.get(parentMessageId) : void 0;
27
+ const parentId = parentMessageId && (!parent || parent.role === "assistant") ? parentMessageId : toolCallId;
28
+ if (!messagesById.has(parentId)) messagesById.set(parentId, {
29
+ id: parentId,
30
+ role: "assistant"
31
+ });
32
+ toolCallParent.set(toolCallId, parentId);
33
+ };
25
34
  for (const line of text.split("\n")) {
26
35
  const trimmed = line.trim();
27
36
  if (!trimmed.startsWith("data:")) continue;
@@ -69,7 +78,7 @@ async function parseSSEResponse(response) {
69
78
  args: ""
70
79
  };
71
80
  toolCallsById.set(event.toolCallId, tc);
72
- if (event.parentMessageId) toolCallParent.set(event.toolCallId, event.parentMessageId);
81
+ linkToolCallParent(event.toolCallId, event.parentMessageId);
73
82
  break;
74
83
  }
75
84
  case "TOOL_CALL_ARGS": {
@@ -87,7 +96,7 @@ async function parseSSEResponse(response) {
87
96
  args: ""
88
97
  };
89
98
  toolCallsById.set(event.toolCallId, tc);
90
- if (event.parentMessageId) toolCallParent.set(event.toolCallId, event.parentMessageId);
99
+ linkToolCallParent(event.toolCallId, event.parentMessageId);
91
100
  }
92
101
  if (event.toolCallName) tc.name = event.toolCallName;
93
102
  tc.args += event.delta ?? "";
@@ -1 +1 @@
1
- {"version":3,"file":"middleware-sse-parser.mjs","names":[],"sources":["../../../../src/v2/runtime/core/middleware-sse-parser.ts"],"sourcesContent":["import { logger } from \"@copilotkit/shared\";\n\nexport interface ParsedSSEResult {\n messages: Message[];\n threadId?: string;\n runId?: string;\n}\n\n/** Minimal message shape reconstructed from AG-UI events. */\nexport interface Message {\n id: string;\n role: string;\n content?: string;\n toolCalls?: ToolCall[];\n toolCallId?: string;\n}\n\ninterface ToolCall {\n id: string;\n name: string;\n args: string;\n}\n\n/**\n * Parse a cloned SSE Response body into structured messages.\n * Returns empty results for non-SSE responses.\n */\nexport async function parseSSEResponse(\n response: Response,\n): Promise<ParsedSSEResult> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"text/event-stream\")) {\n return { messages: [] };\n }\n\n let text: string;\n try {\n text = await response.text();\n } catch {\n logger.warn(\"Failed to read SSE response body in afterRequestMiddleware\");\n return { messages: [] };\n }\n\n if (!text.trim()) {\n return { messages: [] };\n }\n\n let threadId: string | undefined;\n let runId: string | undefined;\n const messagesById = new Map<string, Message>();\n const toolCallsById = new Map<string, ToolCall>();\n const toolCallParent = new Map<string, string>(); // toolCallId → messageId\n let snapshotMessages: Message[] | undefined;\n\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data:\")) continue;\n\n let event: Record<string, any>;\n try {\n event = JSON.parse(trimmed.slice(5).trim());\n } catch {\n continue;\n }\n\n switch (event.type) {\n case \"RUN_STARTED\":\n threadId = event.threadId;\n runId = event.runId;\n break;\n\n case \"MESSAGES_SNAPSHOT\":\n if (Array.isArray(event.messages)) {\n snapshotMessages = event.messages;\n }\n break;\n\n case \"TEXT_MESSAGE_START\":\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: event.role ?? \"assistant\",\n content: \"\",\n });\n break;\n\n case \"TEXT_MESSAGE_CONTENT\": {\n const msg = messagesById.get(event.messageId);\n if (msg) {\n msg.content = (msg.content ?? \"\") + (event.delta ?? \"\");\n }\n break;\n }\n\n case \"TEXT_MESSAGE_CHUNK\": {\n // Chunk format: combined start+content. First chunk creates the\n // message, subsequent chunks append delta to content.\n if (event.messageId) {\n const existing = messagesById.get(event.messageId);\n if (existing) {\n existing.content = (existing.content ?? \"\") + (event.delta ?? \"\");\n } else {\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: event.role ?? \"assistant\",\n content: event.delta ?? \"\",\n });\n }\n }\n break;\n }\n\n case \"TOOL_CALL_START\": {\n const tc: ToolCall = {\n id: event.toolCallId,\n name: event.toolCallName,\n args: \"\",\n };\n toolCallsById.set(event.toolCallId, tc);\n if (event.parentMessageId) {\n toolCallParent.set(event.toolCallId, event.parentMessageId);\n }\n break;\n }\n\n case \"TOOL_CALL_ARGS\": {\n const tc = toolCallsById.get(event.toolCallId);\n if (tc) {\n tc.args += event.delta ?? \"\";\n }\n break;\n }\n\n case \"TOOL_CALL_CHUNK\": {\n // Chunk format: combined start+args. First chunk for a given\n // toolCallId creates the tool call, subsequent chunks append delta.\n if (event.toolCallId) {\n let tc = toolCallsById.get(event.toolCallId);\n if (!tc) {\n tc = {\n id: event.toolCallId,\n name: event.toolCallName ?? \"\",\n args: \"\",\n };\n toolCallsById.set(event.toolCallId, tc);\n if (event.parentMessageId) {\n toolCallParent.set(event.toolCallId, event.parentMessageId);\n }\n }\n if (event.toolCallName) {\n tc.name = event.toolCallName;\n }\n tc.args += event.delta ?? \"\";\n }\n break;\n }\n\n case \"TOOL_CALL_END\": {\n const tc = toolCallsById.get(event.toolCallId);\n const parentId = toolCallParent.get(event.toolCallId);\n if (tc && parentId) {\n const parent = messagesById.get(parentId);\n if (parent) {\n parent.toolCalls = parent.toolCalls ?? [];\n parent.toolCalls.push(tc);\n }\n }\n break;\n }\n\n case \"TOOL_CALL_RESULT\": {\n // langchain-mcp-adapters may send content as an array of\n // {type:\"text\", text:string} objects instead of a plain string.\n let resultContent = event.content;\n if (Array.isArray(resultContent)) {\n resultContent = resultContent\n .filter((part: any) => part && typeof part.text === \"string\")\n .map((part: any) => part.text)\n .join(\"\");\n }\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: \"tool\",\n content: resultContent,\n toolCallId: event.toolCallId,\n });\n break;\n }\n }\n }\n\n // Attach any tool calls not yet linked to their parent message.\n // This handles TOOL_CALL_CHUNK flows which don't emit TOOL_CALL_END.\n for (const [toolCallId, tc] of toolCallsById) {\n const parentId = toolCallParent.get(toolCallId);\n if (!parentId) continue;\n const parent = messagesById.get(parentId);\n if (!parent) continue;\n const alreadyAttached = parent.toolCalls?.some((t) => t.id === tc.id);\n if (!alreadyAttached) {\n parent.toolCalls = parent.toolCalls ?? [];\n parent.toolCalls.push(tc);\n }\n }\n\n // Prefer MESSAGES_SNAPSHOT if present (contains full history).\n // Otherwise reconstruct from individual events.\n const messages = snapshotMessages ?? [...messagesById.values()];\n\n return { messages, threadId, runId };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"middleware-sse-parser.mjs","names":[],"sources":["../../../../src/v2/runtime/core/middleware-sse-parser.ts"],"sourcesContent":["import { logger } from \"@copilotkit/shared\";\n\nexport interface ParsedSSEResult {\n messages: Message[];\n threadId?: string;\n runId?: string;\n}\n\n/** Minimal message shape reconstructed from AG-UI events. */\nexport interface Message {\n id: string;\n role: string;\n content?: string;\n toolCalls?: ToolCall[];\n toolCallId?: string;\n}\n\ninterface ToolCall {\n id: string;\n name: string;\n args: string;\n}\n\n/**\n * Parse a cloned SSE Response body into structured messages.\n * Returns empty results for non-SSE responses.\n */\nexport async function parseSSEResponse(\n response: Response,\n): Promise<ParsedSSEResult> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"text/event-stream\")) {\n return { messages: [] };\n }\n\n let text: string;\n try {\n text = await response.text();\n } catch {\n logger.warn(\"Failed to read SSE response body in afterRequestMiddleware\");\n return { messages: [] };\n }\n\n if (!text.trim()) {\n return { messages: [] };\n }\n\n let threadId: string | undefined;\n let runId: string | undefined;\n const messagesById = new Map<string, Message>();\n const toolCallsById = new Map<string, ToolCall>();\n const toolCallParent = new Map<string, string>(); // toolCallId → messageId\n let snapshotMessages: Message[] | undefined;\n\n // Link a tool call to its assistant message the way @ag-ui/client does. A\n // tool-only turn streams no TEXT_MESSAGE_START, so the parent may not exist\n // yet; create it, keyed by toolCallId when parentMessageId is missing or\n // names a non-assistant message.\n const linkToolCallParent = (toolCallId: string, parentMessageId?: string) => {\n const parent = parentMessageId\n ? messagesById.get(parentMessageId)\n : undefined;\n const parentId =\n parentMessageId && (!parent || parent.role === \"assistant\")\n ? parentMessageId\n : toolCallId;\n if (!messagesById.has(parentId)) {\n messagesById.set(parentId, { id: parentId, role: \"assistant\" });\n }\n toolCallParent.set(toolCallId, parentId);\n };\n\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data:\")) continue;\n\n let event: Record<string, any>;\n try {\n event = JSON.parse(trimmed.slice(5).trim());\n } catch {\n continue;\n }\n\n switch (event.type) {\n case \"RUN_STARTED\":\n threadId = event.threadId;\n runId = event.runId;\n break;\n\n case \"MESSAGES_SNAPSHOT\":\n if (Array.isArray(event.messages)) {\n snapshotMessages = event.messages;\n }\n break;\n\n case \"TEXT_MESSAGE_START\":\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: event.role ?? \"assistant\",\n content: \"\",\n });\n break;\n\n case \"TEXT_MESSAGE_CONTENT\": {\n const msg = messagesById.get(event.messageId);\n if (msg) {\n msg.content = (msg.content ?? \"\") + (event.delta ?? \"\");\n }\n break;\n }\n\n case \"TEXT_MESSAGE_CHUNK\": {\n // Chunk format: combined start+content. First chunk creates the\n // message, subsequent chunks append delta to content.\n if (event.messageId) {\n const existing = messagesById.get(event.messageId);\n if (existing) {\n existing.content = (existing.content ?? \"\") + (event.delta ?? \"\");\n } else {\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: event.role ?? \"assistant\",\n content: event.delta ?? \"\",\n });\n }\n }\n break;\n }\n\n case \"TOOL_CALL_START\": {\n const tc: ToolCall = {\n id: event.toolCallId,\n name: event.toolCallName,\n args: \"\",\n };\n toolCallsById.set(event.toolCallId, tc);\n linkToolCallParent(event.toolCallId, event.parentMessageId);\n break;\n }\n\n case \"TOOL_CALL_ARGS\": {\n const tc = toolCallsById.get(event.toolCallId);\n if (tc) {\n tc.args += event.delta ?? \"\";\n }\n break;\n }\n\n case \"TOOL_CALL_CHUNK\": {\n // Chunk format: combined start+args. First chunk for a given\n // toolCallId creates the tool call, subsequent chunks append delta.\n if (event.toolCallId) {\n let tc = toolCallsById.get(event.toolCallId);\n if (!tc) {\n tc = {\n id: event.toolCallId,\n name: event.toolCallName ?? \"\",\n args: \"\",\n };\n toolCallsById.set(event.toolCallId, tc);\n linkToolCallParent(event.toolCallId, event.parentMessageId);\n }\n if (event.toolCallName) {\n tc.name = event.toolCallName;\n }\n tc.args += event.delta ?? \"\";\n }\n break;\n }\n\n case \"TOOL_CALL_END\": {\n const tc = toolCallsById.get(event.toolCallId);\n const parentId = toolCallParent.get(event.toolCallId);\n if (tc && parentId) {\n const parent = messagesById.get(parentId);\n if (parent) {\n parent.toolCalls = parent.toolCalls ?? [];\n parent.toolCalls.push(tc);\n }\n }\n break;\n }\n\n case \"TOOL_CALL_RESULT\": {\n // langchain-mcp-adapters may send content as an array of\n // {type:\"text\", text:string} objects instead of a plain string.\n let resultContent = event.content;\n if (Array.isArray(resultContent)) {\n resultContent = resultContent\n .filter((part: any) => part && typeof part.text === \"string\")\n .map((part: any) => part.text)\n .join(\"\");\n }\n messagesById.set(event.messageId, {\n id: event.messageId,\n role: \"tool\",\n content: resultContent,\n toolCallId: event.toolCallId,\n });\n break;\n }\n }\n }\n\n // Attach any tool calls not yet linked to their parent message.\n // This handles TOOL_CALL_CHUNK flows which don't emit TOOL_CALL_END.\n for (const [toolCallId, tc] of toolCallsById) {\n const parentId = toolCallParent.get(toolCallId);\n if (!parentId) continue;\n const parent = messagesById.get(parentId);\n if (!parent) continue;\n const alreadyAttached = parent.toolCalls?.some((t) => t.id === tc.id);\n if (!alreadyAttached) {\n parent.toolCalls = parent.toolCalls ?? [];\n parent.toolCalls.push(tc);\n }\n }\n\n // Prefer MESSAGES_SNAPSHOT if present (contains full history).\n // Otherwise reconstruct from individual events.\n const messages = snapshotMessages ?? [...messagesById.values()];\n\n return { messages, threadId, runId };\n}\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ require("reflect-metadata");
2
2
 
3
3
  //#region src/v2/runtime/core/package-info.ts
4
4
  const RUNTIME_PACKAGE_NAME = "@copilotkit/runtime";
5
- const RUNTIME_PACKAGE_VERSION = "1.79.1";
5
+ const RUNTIME_PACKAGE_VERSION = "1.80.0";
6
6
 
7
7
  //#endregion
8
8
  exports.RUNTIME_PACKAGE_NAME = RUNTIME_PACKAGE_NAME;
@@ -1,7 +1,7 @@
1
1
  import "reflect-metadata";
2
2
  //#region src/v2/runtime/core/package-info.ts
3
3
  const RUNTIME_PACKAGE_NAME = "@copilotkit/runtime";
4
- const RUNTIME_PACKAGE_VERSION = "1.79.1";
4
+ const RUNTIME_PACKAGE_VERSION = "1.80.0";
5
5
 
6
6
  //#endregion
7
7
  export { RUNTIME_PACKAGE_NAME, RUNTIME_PACKAGE_VERSION };
@@ -154,11 +154,10 @@ async function handleIntelligenceRun({ runtime, request, agentId, agent, input,
154
154
  };
155
155
  let persistedInputMessages;
156
156
  if (Array.isArray(input.messages)) try {
157
- const history = await runtime.intelligence.getThreadMessages({
157
+ const historicMessageIds = new Set(await runtime.intelligence.ɵgetThreadMessageIds({
158
158
  threadId: canonicalThreadId,
159
159
  userId
160
- });
161
- const historicMessageIds = new Set(history.messages.map((message) => message.id));
160
+ }));
162
161
  persistedInputMessages = input.messages.filter((message) => !historicMessageIds.has(message.id));
163
162
  } catch (error) {
164
163
  _copilotkit_shared.logger.error("Thread history lookup failed:", error);