@macrow/copilotkit-langgraph-history 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +308 -0
- package/dist/index.cjs +947 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +647 -0
- package/dist/index.d.ts +647 -0
- package/dist/index.js +936 -0
- package/dist/index.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runner/constants.ts","../src/utils/create-isolated-agent.ts","../src/utils/message-transformer.ts","../src/events/custom-events.ts","../src/events/langgraph-events.ts","../src/utils/stream-processor.ts","../src/runner/history-hydrating-runner.ts"],"names":["LangGraphAgent","Client","CustomEventNames","LangGraphEventTypes","AgentRunner","Observable","EventType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Default timeout for LangGraph Client HTTP requests (30 minutes).\n * Long timeout supports long-running agent workflows.\n */\nexport const DEFAULT_TIMEOUT = 30 * 60 * 1000; // 30 minutes in milliseconds\n\n/**\n * Default number of history checkpoints to fetch.\n */\nexport const DEFAULT_HISTORY_LIMIT = 100;\n\n/**\n * Maximum history limit allowed by the LangGraph API.\n */\nexport const MAX_HISTORY_LIMIT = 1000;\n","/**\n * LangGraph Agent Isolation Utilities\n *\n * Fixes shared state contamination in Vercel serverless (Fluid Compute)\n * where CopilotKit's LangGraphAgent can get wrong deploymentUrl due to\n * module-level state being shared between bundled routes.\n *\n * Root cause: CopilotKit's clone() passes config by reference, not by value.\n * Our fix: Create completely isolated agents with verified URLs.\n */\n\nimport { LangGraphAgent } from \"@copilotkit/runtime/langgraph\";\nimport { Client } from \"@langchain/langgraph-sdk\";\nimport { DEFAULT_TIMEOUT } from \"../runner/constants\";\nimport type { RequestHook } from \"@langchain/langgraph-sdk/client\";\n\n/**\n * Internal type for accessing protected Client properties.\n * The LangGraph SDK Client has apiUrl as protected, but we need to\n * verify it for contamination detection.\n */\ntype ClientInternals = {\n apiUrl: string;\n};\n\n/**\n * Configuration for creating an isolated LangGraph agent.\n */\nexport interface CreateIsolatedAgentConfig {\n /**\n * LangGraph deployment URL.\n */\n deploymentUrl: string;\n\n /**\n * Graph ID for the agent.\n */\n graphId: string;\n\n /**\n * LangSmith API key for authentication (optional).\n */\n langsmithApiKey?: string;\n\n /**\n * Client timeout in milliseconds.\n * Default: 1800000 (30 minutes)\n */\n clientTimeoutMs?: number;\n\n /**\n * Enable debug mode on the agent.\n */\n debug?: boolean;\n\n /**\n * Optional request hook for the client.\n */\n onRequest?: RequestHook;\n}\n\n/**\n * Creates a completely isolated LangGraphAgent that cannot be contaminated\n * by shared module state. This is the \"nuclear option\" fix for serverless\n * environments like Vercel Fluid Compute.\n *\n * Key features:\n * 1. Creates agent with fresh, frozen config\n * 2. Verifies the internal client has correct URL\n * 3. Force-replaces client if contamination detected\n *\n * @example\n * ```typescript\n * const agent = createIsolatedAgent({\n * deploymentUrl: process.env.LANGGRAPH_DEPLOYMENT_URL!,\n * graphId: \"my-agent\",\n * langsmithApiKey: process.env.LANGSMITH_API_KEY,\n * });\n * ```\n */\nexport function createIsolatedAgent(\n config: CreateIsolatedAgentConfig\n): LangGraphAgent {\n const timeout = config.clientTimeoutMs ?? DEFAULT_TIMEOUT;\n\n // Create frozen config to prevent mutation\n const isolatedConfig = Object.freeze({\n deploymentUrl: String(config.deploymentUrl),\n graphId: String(config.graphId),\n langsmithApiKey: config.langsmithApiKey\n ? String(config.langsmithApiKey)\n : undefined,\n debug: Boolean(config.debug),\n });\n\n // Create agent with isolated config\n const agent = new LangGraphAgent(isolatedConfig);\n\n // CRITICAL: Verify the agent's internal client has correct URL\n // We need to access the protected apiUrl property for verification\n const clientInternals = agent.client as unknown as ClientInternals;\n const expectedUrl = config.deploymentUrl.replace(/\\/$/, \"\");\n const actualUrl = clientInternals.apiUrl?.replace(/\\/$/, \"\");\n\n if (expectedUrl !== actualUrl) {\n // CONTAMINATION DETECTED - Force replace the client\n console.warn(\n `[LangGraphHistory] URL mismatch detected! Expected: ${expectedUrl}, Got: ${actualUrl}. Replacing client.`\n );\n\n // Create new client with correct URL and configured timeout\n const newClient = new Client({\n apiUrl: config.deploymentUrl,\n apiKey: config.langsmithApiKey,\n timeoutMs: timeout,\n onRequest: config.onRequest,\n });\n\n // Replace the client on the agent\n // LangGraphAgent.client is public, so this assignment is valid at runtime\n Object.assign(agent, { client: newClient });\n }\n\n return agent;\n}\n","import type { LangGraphMessage } from \"../runner/types\";\n\n/**\n * Transformed message in CopilotKit format.\n */\nexport interface TransformedMessage {\n id: string;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n content: string;\n toolCalls?: Array<{\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n }>;\n toolCallId?: string;\n}\n\n/**\n * Extracts text content from LangGraph message content.\n * Handles both string and array formats.\n */\nexport function extractContent(\n content: string | Array<{ type: string; text?: string }>\n): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (Array.isArray(content)) {\n // Handle array format - extract text from content blocks\n return content\n .map((block) => {\n if (block.type === \"text\" && block.text) {\n return block.text;\n }\n return \"\";\n })\n .filter((text) => text.length > 0)\n .join(\"\\n\");\n }\n\n return \"\";\n}\n\n/**\n * Transforms LangGraph messages to CopilotKit message format.\n *\n * Based on the `ut` function from @ag-ui/langgraph but adapted\n * for standalone use.\n */\nexport function transformMessages(\n messages: LangGraphMessage[],\n options?: { debug?: boolean }\n): TransformedMessage[] {\n const result: TransformedMessage[] = [];\n\n for (const msg of messages) {\n try {\n let transformed: TransformedMessage | null = null;\n\n switch (msg.type) {\n case \"human\": {\n const content = extractContent(msg.content);\n transformed = {\n id: msg.id,\n role: \"user\",\n content,\n };\n break;\n }\n\n case \"ai\": {\n const content = extractContent(msg.content);\n transformed = {\n id: msg.id,\n role: \"assistant\",\n content: content || \"\",\n toolCalls: msg.tool_calls?.map((toolCall) => ({\n id: toolCall.id,\n type: \"function\" as const,\n function: {\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.args),\n },\n })),\n };\n break;\n }\n\n case \"system\": {\n const content = extractContent(msg.content);\n transformed = {\n id: msg.id,\n role: \"system\",\n content,\n };\n break;\n }\n\n case \"tool\": {\n const content = extractContent(msg.content);\n transformed = {\n id: msg.id,\n role: \"tool\",\n content,\n toolCallId: msg.tool_call_id,\n };\n break;\n }\n\n default:\n if (options?.debug) {\n console.warn(\n `[HistoryHydratingRunner] Unknown message type: ${(msg as LangGraphMessage).type}`\n );\n }\n }\n\n if (transformed) {\n result.push(transformed);\n }\n } catch (error) {\n if (options?.debug) {\n console.warn(\n \"[HistoryHydratingRunner] Failed to transform message:\",\n msg,\n error\n );\n }\n }\n }\n\n return result;\n}\n","/**\n * Custom event names that CopilotKit uses for manual emissions.\n * These match exactly what CopilotKit's LangGraphAgent expects.\n */\nexport enum CustomEventNames {\n CopilotKitManuallyEmitMessage = \"copilotkit_manually_emit_message\",\n CopilotKitManuallyEmitToolCall = \"copilotkit_manually_emit_tool_call\",\n CopilotKitManuallyEmitIntermediateState = \"copilotkit_manually_emit_intermediate_state\",\n CopilotKitExit = \"copilotkit_exit\",\n}\n","/**\n * LangGraph event types for stream processing.\n * These correspond to LangChain/LangGraph lifecycle events.\n */\nexport enum LangGraphEventTypes {\n OnChatModelStart = \"on_chat_model_start\",\n OnChatModelStream = \"on_chat_model_stream\",\n OnChatModelEnd = \"on_chat_model_end\",\n OnToolStart = \"on_tool_start\",\n OnToolEnd = \"on_tool_end\",\n OnChainStart = \"on_chain_start\",\n OnChainEnd = \"on_chain_end\",\n}\n","import type { BaseEvent } from \"@ag-ui/core\";\nimport type {\n CustomStreamEvent,\n ErrorStreamEvent,\n EventsStreamEvent,\n MetadataStreamEvent,\n UpdatesStreamEvent,\n ValuesStreamEvent,\n} from \"@langchain/langgraph-sdk\";\nimport { CustomEventNames } from \"../events/custom-events\";\nimport { LangGraphEventTypes } from \"../events/langgraph-events\";\nimport type { PredictStateTool } from \"../runner/types\";\n\n/**\n * Context for stream processing.\n */\nexport interface StreamProcessorContext {\n threadId: string;\n runId: string;\n subscriber: { next: (event: BaseEvent) => void };\n startedMessages?: Set<string>;\n startedToolCalls?: Set<string>;\n debug?: boolean;\n manuallyEmittedState?: Record<string, unknown>;\n}\n\n/**\n * Stream chunk from LangGraph.\n */\nexport interface StreamChunk {\n id?: string;\n event: string;\n data: unknown;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Processes a single stream chunk and transforms it to BaseEvent format.\n *\n * Based on CopilotKit's event processing patterns from the agent's .run method.\n * Handles all event types including custom events, metadata filtering, and\n * transformations for TEXT_MESSAGE and TOOL_CALL events.\n */\nexport async function processStreamChunk(\n chunk: StreamChunk,\n context: StreamProcessorContext\n): Promise<{ runId: string; manuallyEmittedState?: Record<string, unknown> }> {\n const { event, data } = chunk;\n let { runId } = context;\n const { threadId, subscriber, startedMessages, startedToolCalls, debug } =\n context;\n let manuallyEmittedState = context.manuallyEmittedState;\n\n // Handle different event types\n switch (event) {\n case \"metadata\": {\n // Metadata events contain run and thread information\n const metadataData = data as MetadataStreamEvent[\"data\"];\n // Update runId if provided in metadata\n if (metadataData.run_id) {\n runId = metadataData.run_id;\n }\n break;\n }\n\n case \"events\": {\n // LangChain events (on_chat_model_stream, on_tool_start, etc.)\n const eventsData = data as EventsStreamEvent[\"data\"];\n\n // First, emit the RAW event - CopilotKit processes these for intermediate state\n const rawEvent: BaseEvent = {\n type: \"RAW\" as unknown as BaseEvent[\"type\"],\n event: eventsData.event,\n name: eventsData.name,\n data: eventsData.data,\n run_id: eventsData.run_id,\n metadata: chunk.metadata,\n rawEvent: {\n id: runId,\n event: eventsData.event,\n name: eventsData.name,\n data: eventsData.data,\n run_id: eventsData.run_id,\n metadata: chunk.metadata,\n },\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent;\n\n // Check for intermediate state prediction (like CopilotKit does)\n const eventType = eventsData.event;\n const toolCallData = (eventsData.data as { chunk?: { tool_call_chunks?: Array<{ name?: string }> } })?.chunk\n ?.tool_call_chunks?.[0];\n const metadata = chunk.metadata || {};\n const emitIntermediateState = metadata[\n \"copilotkit:emit-intermediate-state\"\n ] as PredictStateTool[] | undefined;\n const toolCallUsedToPredictState = emitIntermediateState?.some(\n (predictStateTool: PredictStateTool) =>\n predictStateTool.tool === toolCallData?.name\n );\n\n if (\n eventType === LangGraphEventTypes.OnChatModelStream &&\n toolCallUsedToPredictState\n ) {\n // Transform to PredictState custom event\n subscriber.next({\n type: \"CUSTOM\" as unknown as BaseEvent[\"type\"],\n name: \"PredictState\",\n value: metadata[\"copilotkit:emit-intermediate-state\"],\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n break;\n }\n\n // Process chat model streaming for TEXT_MESSAGE events\n if (eventType === LangGraphEventTypes.OnChatModelStream) {\n const messageChunk = (eventsData.data as { chunk?: { content?: string | unknown[] } })?.chunk;\n if (messageChunk?.content) {\n // Check metadata to see if we should emit messages\n if (\n \"copilotkit:emit-messages\" in metadata &&\n metadata[\"copilotkit:emit-messages\"] === false\n ) {\n // Skip message emission\n break;\n }\n\n // Use the event's run_id as the message ID - must match OnChatModelStart/End\n const messageId = eventsData.run_id || runId;\n const delta =\n typeof messageChunk.content === \"string\"\n ? messageChunk.content\n : \"\";\n\n // If joining mid-stream, emit START first if we haven't seen it\n if (startedMessages && !startedMessages.has(messageId)) {\n subscriber.next({\n type: \"TEXT_MESSAGE_START\" as unknown as BaseEvent[\"type\"],\n role: \"assistant\",\n messageId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n startedMessages.add(messageId);\n }\n\n // Emit TEXT_MESSAGE_CONTENT event\n subscriber.next({\n type: \"TEXT_MESSAGE_CONTENT\" as unknown as BaseEvent[\"type\"],\n messageId,\n delta,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n }\n }\n\n // Process chat model start for TEXT_MESSAGE_START\n if (eventType === LangGraphEventTypes.OnChatModelStart) {\n const eventMetadata = chunk.metadata || {};\n if (\n \"copilotkit:emit-messages\" in eventMetadata &&\n eventMetadata[\"copilotkit:emit-messages\"] === false\n ) {\n break;\n }\n\n // Use the event's run_id as the message ID - this is the unique identifier for this message\n const messageId = eventsData.run_id || runId;\n\n // Only emit START if not already started\n if (!startedMessages || !startedMessages.has(messageId)) {\n subscriber.next({\n type: \"TEXT_MESSAGE_START\" as unknown as BaseEvent[\"type\"],\n role: \"assistant\",\n messageId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n\n // Track that we've started this message\n if (startedMessages) {\n startedMessages.add(messageId);\n }\n }\n }\n\n // Process chat model end for TEXT_MESSAGE_END\n if (eventType === LangGraphEventTypes.OnChatModelEnd) {\n const eventMetadata = chunk.metadata || {};\n if (\n \"copilotkit:emit-messages\" in eventMetadata &&\n eventMetadata[\"copilotkit:emit-messages\"] === false\n ) {\n break;\n }\n\n // Use the event's run_id as the message ID - this matches what we used in OnChatModelStart\n const messageId = eventsData.run_id || runId;\n\n // If joining mid-stream, emit START first if we haven't seen it\n if (startedMessages && !startedMessages.has(messageId)) {\n subscriber.next({\n type: \"TEXT_MESSAGE_START\" as unknown as BaseEvent[\"type\"],\n role: \"assistant\",\n messageId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n startedMessages.add(messageId);\n }\n\n subscriber.next({\n type: \"TEXT_MESSAGE_END\" as unknown as BaseEvent[\"type\"],\n messageId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n }\n\n // Process tool start for TOOL_CALL_START\n if (eventType === LangGraphEventTypes.OnToolStart) {\n const eventMetadata = chunk.metadata || {};\n if (\n \"copilotkit:emit-tool-calls\" in eventMetadata &&\n eventMetadata[\"copilotkit:emit-tool-calls\"] === false\n ) {\n break;\n }\n\n const toolData = (eventsData.data as { input?: unknown })?.input;\n const toolName = eventsData.name;\n // Use the event's run_id as the tool call ID - this is the unique identifier for this specific tool call\n const toolCallId = eventsData.run_id || runId;\n\n // Only emit START if not already started\n if (!startedToolCalls || !startedToolCalls.has(toolCallId)) {\n subscriber.next({\n type: \"TOOL_CALL_START\" as unknown as BaseEvent[\"type\"],\n toolCallId,\n toolCallName: toolName,\n parentMessageId: runId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n\n // Track that we've started this tool call\n if (startedToolCalls) {\n startedToolCalls.add(toolCallId);\n }\n }\n\n // Emit args if available\n if (toolData) {\n subscriber.next({\n type: \"TOOL_CALL_ARGS\" as unknown as BaseEvent[\"type\"],\n toolCallId,\n delta: JSON.stringify(toolData),\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n }\n }\n\n // Process tool end for TOOL_CALL_END\n if (eventType === LangGraphEventTypes.OnToolEnd) {\n const eventMetadata = chunk.metadata || {};\n if (\n \"copilotkit:emit-tool-calls\" in eventMetadata &&\n eventMetadata[\"copilotkit:emit-tool-calls\"] === false\n ) {\n break;\n }\n\n // Use the event's run_id as the tool call ID - this matches what we used in OnToolStart\n const toolCallId = eventsData.run_id || runId;\n const toolName = eventsData.name;\n\n // If joining mid-stream, emit START first if we haven't seen it\n if (startedToolCalls && !startedToolCalls.has(toolCallId)) {\n subscriber.next({\n type: \"TOOL_CALL_START\" as unknown as BaseEvent[\"type\"],\n toolCallId,\n toolCallName: toolName,\n parentMessageId: runId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n startedToolCalls.add(toolCallId);\n }\n\n subscriber.next({\n type: \"TOOL_CALL_END\" as unknown as BaseEvent[\"type\"],\n toolCallId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n }\n\n // Also emit as generic CUSTOM event for any other processing\n subscriber.next({\n type: \"CUSTOM\" as unknown as BaseEvent[\"type\"],\n name: eventsData.event,\n value: JSON.stringify(eventsData.data),\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n break;\n }\n\n case \"updates\": {\n // State updates from nodes - emit as STATE_SNAPSHOT\n const updatesData = data as UpdatesStreamEvent<unknown>[\"data\"];\n\n subscriber.next({\n type: \"STATE_SNAPSHOT\" as unknown as BaseEvent[\"type\"],\n snapshot: updatesData,\n rawEvent: {\n id: runId,\n event: \"updates\",\n data: updatesData,\n },\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n break;\n }\n\n case \"values\": {\n // Complete state values after a step - emit as STATE_SNAPSHOT\n const valuesData = data as ValuesStreamEvent<unknown>[\"data\"];\n\n subscriber.next({\n type: \"STATE_SNAPSHOT\" as unknown as BaseEvent[\"type\"],\n snapshot: valuesData,\n rawEvent: {\n id: runId,\n event: \"values\",\n data: valuesData,\n },\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n break;\n }\n\n case \"custom\": {\n // Custom events emitted from within nodes\n const customData = data as CustomStreamEvent<unknown>[\"data\"];\n\n // Handle CopilotKit-specific custom events\n const result = handleCustomEvent(\n customData,\n threadId,\n runId,\n subscriber,\n manuallyEmittedState\n );\n manuallyEmittedState = result.manuallyEmittedState;\n break;\n }\n\n case \"error\": {\n // Error events\n const errorData = data as ErrorStreamEvent[\"data\"];\n\n if (debug) {\n console.error(\n \"[HistoryHydratingRunner] Stream error:\",\n errorData.message\n );\n }\n\n subscriber.next({\n type: \"CUSTOM\" as unknown as BaseEvent[\"type\"],\n name: \"on_error\",\n value: JSON.stringify(errorData),\n rawEvent: {\n id: runId,\n error: errorData.error,\n message: errorData.message,\n },\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n break;\n }\n\n default: {\n // Log unknown events for debugging\n if (debug) {\n console.log(\n `[HistoryHydratingRunner] Unhandled event type: ${event}`,\n data\n );\n }\n }\n }\n\n return { runId, manuallyEmittedState };\n}\n\n/**\n * Handles CopilotKit-specific custom events.\n * These are events with special names that trigger specific transformations.\n */\nfunction handleCustomEvent(\n customData: unknown,\n threadId: string,\n runId: string,\n subscriber: { next: (event: BaseEvent) => void },\n manuallyEmittedState?: Record<string, unknown>\n): { manuallyEmittedState?: Record<string, unknown> } {\n const rawEvent = {\n id: runId,\n data: customData,\n };\n\n // Check if this is a named custom event\n const typedData = customData as { name?: string; event?: string; value?: unknown };\n const eventName = typedData?.name || typedData?.event;\n\n switch (eventName) {\n case CustomEventNames.CopilotKitManuallyEmitMessage: {\n // Transform to TEXT_MESSAGE events\n const value = typedData.value as { message_id?: string; message?: string } | undefined;\n const messageId = value?.message_id || runId;\n const message = value?.message || \"\";\n\n subscriber.next({\n type: \"TEXT_MESSAGE_START\" as unknown as BaseEvent[\"type\"],\n role: \"assistant\",\n messageId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n\n subscriber.next({\n type: \"TEXT_MESSAGE_CONTENT\" as unknown as BaseEvent[\"type\"],\n messageId,\n delta: message,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n\n subscriber.next({\n type: \"TEXT_MESSAGE_END\" as unknown as BaseEvent[\"type\"],\n messageId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n break;\n }\n\n case CustomEventNames.CopilotKitManuallyEmitToolCall: {\n // Transform to TOOL_CALL events\n const value = typedData.value as { id?: string; name?: string; args?: unknown } | undefined;\n const toolCallId = value?.id || runId;\n const toolCallName = value?.name || \"\";\n const args = value?.args || {};\n\n subscriber.next({\n type: \"TOOL_CALL_START\" as unknown as BaseEvent[\"type\"],\n toolCallId,\n toolCallName,\n parentMessageId: toolCallId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n\n subscriber.next({\n type: \"TOOL_CALL_ARGS\" as unknown as BaseEvent[\"type\"],\n toolCallId,\n delta: JSON.stringify(args),\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n\n subscriber.next({\n type: \"TOOL_CALL_END\" as unknown as BaseEvent[\"type\"],\n toolCallId,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n break;\n }\n\n case CustomEventNames.CopilotKitManuallyEmitIntermediateState: {\n // Store manually emitted state and emit STATE_SNAPSHOT\n manuallyEmittedState = typedData.value as Record<string, unknown>;\n\n subscriber.next({\n type: \"STATE_SNAPSHOT\" as unknown as BaseEvent[\"type\"],\n snapshot: manuallyEmittedState,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n break;\n }\n\n case CustomEventNames.CopilotKitExit: {\n // Emit Exit custom event\n subscriber.next({\n type: \"CUSTOM\" as unknown as BaseEvent[\"type\"],\n name: \"Exit\",\n value: true,\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n break;\n }\n\n default: {\n // Generic custom event - emit as-is\n subscriber.next({\n type: \"CUSTOM\" as unknown as BaseEvent[\"type\"],\n name: eventName || \"on_custom_event\",\n value: JSON.stringify(customData),\n rawEvent,\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n }\n }\n\n return { manuallyEmittedState };\n}\n","/**\n * HistoryHydratingAgentRunner\n *\n * A custom AgentRunner that extends CopilotKit's base runner to add\n * message history hydration support for LangGraph threads.\n *\n * Fixes the issue where page refreshes don't load historical messages\n * by fetching thread state and emitting MESSAGES_SNAPSHOT events.\n */\n\nimport { type BaseEvent, EventType } from \"@ag-ui/core\";\nimport { LangGraphAgent } from \"@copilotkit/runtime/langgraph\";\nimport {\n AgentRunner,\n type AgentRunnerConnectRequest,\n type AgentRunnerRunRequest,\n type AgentRunnerStopRequest,\n} from \"@copilotkitnext/runtime\";\nimport { Client, type Run, type StreamMode } from \"@langchain/langgraph-sdk\";\nimport { Observable } from \"rxjs\";\n\nimport {\n DEFAULT_HISTORY_LIMIT,\n DEFAULT_TIMEOUT,\n MAX_HISTORY_LIMIT,\n} from \"./constants\";\nimport type {\n FrozenAgentConfig,\n HistoryHydratingRunnerConfig,\n LangGraphMessage,\n StateExtractor,\n ThreadState,\n} from \"./types\";\nimport { createIsolatedAgent } from \"../utils/create-isolated-agent\";\nimport { transformMessages } from \"../utils/message-transformer\";\nimport { processStreamChunk, type StreamChunk } from \"../utils/stream-processor\";\n\n/**\n * Custom AgentRunner that extends CopilotKit's base runner to add\n * message history hydration support for LangGraph threads.\n *\n * @example\n * ```typescript\n * import { HistoryHydratingAgentRunner, createIsolatedAgent } from 'copilotkit-langgraph-history';\n *\n * const agent = createIsolatedAgent({\n * deploymentUrl: process.env.LANGGRAPH_DEPLOYMENT_URL!,\n * graphId: \"my-agent\",\n * langsmithApiKey: process.env.LANGSMITH_API_KEY,\n * });\n *\n * const runner = new HistoryHydratingAgentRunner({\n * agent,\n * deploymentUrl: process.env.LANGGRAPH_DEPLOYMENT_URL!,\n * graphId: \"my-agent\",\n * langsmithApiKey: process.env.LANGSMITH_API_KEY,\n * historyLimit: 100,\n * });\n *\n * const runtime = new CopilotRuntime({\n * agents: { \"my-agent\": agent },\n * runner,\n * });\n * ```\n */\nexport class HistoryHydratingAgentRunner extends AgentRunner {\n private agent: LangGraphAgent;\n private historyLimit: number;\n private debug: boolean;\n private stateExtractor?: StateExtractor;\n private activeRun: {\n manuallyEmittedState?: Record<string, unknown>;\n } = {};\n\n /**\n * Frozen agent config to prevent shared state contamination.\n * We store the raw config values and create fresh Agent/Client instances per request.\n * This is critical because Vercel serverless can bundle multiple routes together,\n * causing module-level state to leak between different agent configurations.\n */\n private readonly frozenConfig: Readonly<FrozenAgentConfig>;\n\n constructor(config: HistoryHydratingRunnerConfig) {\n super();\n this.agent = config.agent;\n this.debug = config.debug ?? false;\n this.stateExtractor = config.stateExtractor;\n\n // LangGraph API has a maximum limit of 1000 for history endpoint\n this.historyLimit = Math.min(\n config.historyLimit ?? DEFAULT_HISTORY_LIMIT,\n MAX_HISTORY_LIMIT\n );\n\n // Freeze the config to prevent mutation\n this.frozenConfig = Object.freeze({\n deploymentUrl: config.deploymentUrl,\n graphId: config.graphId,\n langsmithApiKey: config.langsmithApiKey,\n clientTimeoutMs: config.clientTimeoutMs ?? DEFAULT_TIMEOUT,\n onRequest: config.onRequest,\n });\n }\n\n /**\n * Creates a fresh LangGraphAgent instance using the frozen config.\n * Uses our isolated agent creator to prevent shared state contamination.\n */\n private createFreshAgent(): LangGraphAgent {\n return createIsolatedAgent({\n deploymentUrl: this.frozenConfig.deploymentUrl,\n graphId: this.frozenConfig.graphId,\n langsmithApiKey: this.frozenConfig.langsmithApiKey,\n clientTimeoutMs: this.frozenConfig.clientTimeoutMs,\n onRequest: this.frozenConfig.onRequest,\n });\n }\n\n /**\n * Creates a fresh LangGraph Client instance using the frozen config.\n * This prevents shared state contamination in serverless environments.\n */\n private createFreshClient(): Client {\n return new Client({\n apiUrl: this.frozenConfig.deploymentUrl,\n apiKey: this.frozenConfig.langsmithApiKey,\n timeoutMs: this.frozenConfig.clientTimeoutMs,\n onRequest: this.frozenConfig.onRequest,\n });\n }\n\n /**\n * Log a message if debug mode is enabled.\n */\n private log(message: string, ...args: unknown[]): void {\n if (this.debug) {\n console.log(`[HistoryHydratingRunner] ${message}`, ...args);\n }\n }\n\n /**\n * Log a warning.\n */\n private warn(message: string, ...args: unknown[]): void {\n console.warn(`[HistoryHydratingRunner] ${message}`, ...args);\n }\n\n /**\n * Log an error.\n */\n private error(message: string, ...args: unknown[]): void {\n console.error(`[HistoryHydratingRunner] ${message}`, ...args);\n }\n\n /**\n * Run the agent with a FRESH agent instance.\n * CRITICAL: We cannot trust request.agent (cloned by CopilotKit) because\n * its internal Client may have been corrupted by shared module state in\n * Vercel serverless environments. Create a completely fresh agent with\n * our frozen config to guarantee the correct deployment URL is used.\n */\n run(request: AgentRunnerRunRequest) {\n // Create a fresh agent to bypass any shared state contamination\n const freshAgent = this.createFreshAgent();\n\n // Extract state values using the configured extractor or default passthrough\n const inputWithProps = request.input as typeof request.input & {\n forwardedProps?: { configurable?: Record<string, unknown> };\n };\n const forwardedProps = inputWithProps.forwardedProps;\n const existingState = (request.input.state || {}) as Record<string, unknown>;\n\n let enrichedState: Record<string, unknown>;\n\n if (this.stateExtractor) {\n // Use custom state extractor\n const extractedState = this.stateExtractor(request.input, forwardedProps);\n enrichedState = {\n ...existingState,\n ...extractedState,\n };\n } else {\n // Default: just pass through existing state\n enrichedState = existingState;\n }\n\n this.log(\"State extraction:\", {\n hasStateExtractor: !!this.stateExtractor,\n hasForwardedProps: !!forwardedProps,\n hasState: !!request.input.state,\n threadId: request.input.threadId,\n });\n\n // CRITICAL: Set state on the fresh agent before running\n // This ensures the agent has the state configured before the run starts\n freshAgent.setState(enrichedState);\n\n // Create modified input with state values injected\n // This ensures LangGraph starts with these values from the first message\n const inputWithState = {\n ...request.input,\n state: enrichedState,\n };\n\n return freshAgent.run(inputWithState);\n }\n\n /**\n * Delegate isRunning to the agent.\n */\n async isRunning(): Promise<boolean> {\n return this.agent.isRunning;\n }\n\n /**\n * Delegate stop to the agent.\n */\n async stop(_request: AgentRunnerStopRequest): Promise<boolean | undefined> {\n const result = this.agent.abortRun();\n return result !== undefined ? result : true;\n }\n\n /**\n * Override connect to add history hydration support.\n *\n * When reconnecting to a thread:\n * 1. Fetches ALL thread history (checkpoints) from LangGraph\n * 2. Extracts and deduplicates messages from all checkpoints\n * 3. Transforms historical messages to CopilotKit format\n * 4. Emits MESSAGES_SNAPSHOT and STATE_SNAPSHOT events\n * 5. Completes the observable\n */\n connect(request: AgentRunnerConnectRequest): Observable<BaseEvent> {\n const { threadId } = request;\n\n // CRITICAL: Create a fresh Client per connect() call to prevent\n // shared state contamination in Vercel serverless environments.\n const client = this.createFreshClient();\n\n return new Observable<BaseEvent>((subscriber) => {\n const hydrate = async () => {\n try {\n // Fetch ALL thread history (checkpoints) from LangGraph\n // Using fresh client to ensure correct URL\n const history = await client.threads.getHistory(threadId, {\n limit: this.historyLimit > 0 ? this.historyLimit : DEFAULT_HISTORY_LIMIT,\n });\n\n if (!history || history.length === 0) {\n this.warn(`No history found for thread ${threadId}`);\n // Still emit required events so frontend doesn't get empty response\n const fallbackRunId =\n \"hydration_\" + Math.random().toString(36).slice(2);\n subscriber.next({\n type: EventType.RUN_STARTED,\n timestamp: Date.now(),\n threadId,\n runId: fallbackRunId,\n } as BaseEvent);\n subscriber.next({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: [],\n timestamp: Date.now(),\n threadId,\n runId: fallbackRunId,\n } as BaseEvent);\n subscriber.next({\n type: EventType.RUN_FINISHED,\n timestamp: Date.now(),\n threadId,\n runId: fallbackRunId,\n } as BaseEvent);\n subscriber.complete();\n return;\n }\n\n // Extract messages from all checkpoints\n // Checkpoints are returned newest-first, so we reverse to get chronological order\n const allMessages: LangGraphMessage[] = [];\n const seenMessageIds = new Set<string>();\n\n // Process checkpoints in reverse order (oldest to newest) to maintain chronological order\n for (const checkpoint of history.reverse()) {\n const state = checkpoint as unknown as ThreadState;\n if (state.values?.messages) {\n const messages = (state.values.messages ||\n []) as LangGraphMessage[];\n\n // Add messages we haven't seen yet (deduplicate by ID)\n for (const msg of messages) {\n if (!seenMessageIds.has(msg.id)) {\n seenMessageIds.add(msg.id);\n allMessages.push(msg);\n }\n }\n }\n }\n\n this.log(\n `Loaded ${allMessages.length} unique messages from ${history.length} checkpoints`\n );\n\n // Apply history limit if configured (after deduplication)\n const limitedMessages =\n this.historyLimit > 0\n ? allMessages.slice(-this.historyLimit)\n : allMessages;\n\n // Transform LangGraph messages to CopilotKit format\n const transformedMessages = transformMessages(limitedMessages, {\n debug: this.debug,\n });\n\n // Fetch runs to get the latest runId\n let runId: string;\n try {\n const runs = await client.runs.list(threadId);\n // Use the most recent run ID if available\n runId =\n runs && runs.length > 0\n ? runs[0]!.run_id\n : \"hydration_\" + Math.random().toString(36).slice(2);\n } catch (error) {\n this.warn(\"Failed to fetch runs, using generated ID:\", error);\n runId = \"hydration_\" + Math.random().toString(36).slice(2);\n }\n\n // Emit RUN_STARTED event first - CopilotKit requires this as the first event\n subscriber.next({\n type: EventType.RUN_STARTED,\n timestamp: Date.now(),\n threadId,\n runId,\n } as BaseEvent);\n\n // Emit MESSAGES_SNAPSHOT event - this is what the frontend needs for hydration\n subscriber.next({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: transformedMessages,\n timestamp: Date.now(),\n threadId,\n runId,\n } as BaseEvent);\n\n // Get the latest checkpoint state (first in original history, last after reverse)\n const latestState = history[\n history.length - 1\n ] as unknown as ThreadState;\n\n // Emit STATE_SNAPSHOT event with latest state values\n // This hydrates other state fields like searchTools, triggers, plan, etc.\n if (latestState.values) {\n subscriber.next({\n type: \"STATE_SNAPSHOT\" as unknown as typeof EventType.CUSTOM,\n snapshot: latestState.values,\n rawEvent: {\n id: runId,\n event: \"values\",\n data: latestState.values,\n },\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n }\n\n // Check for interrupts in tasks from the latest checkpoint\n const interruptedTask = latestState.tasks?.find(\n (task) => task.interrupts && task.interrupts.length > 0\n );\n\n if (\n interruptedTask &&\n interruptedTask.interrupts &&\n interruptedTask.interrupts.length > 0\n ) {\n const interrupt = interruptedTask.interrupts[0];\n const interruptValue = interrupt?.value;\n\n // Emit custom interrupt event\n subscriber.next({\n type: \"CUSTOM\" as unknown as typeof EventType.CUSTOM,\n name: \"on_interrupt\",\n value: JSON.stringify(interruptValue),\n rawEvent: {\n id: runId,\n value: interruptValue,\n },\n timestamp: Date.now(),\n threadId,\n runId,\n } as unknown as BaseEvent);\n }\n\n // Check if thread is busy and has an active run to join (from latest checkpoint)\n const isThreadBusy = latestState.next && latestState.next.length > 0;\n\n let activeRun: Run | undefined;\n if (isThreadBusy) {\n try {\n const runs = await client.runs.list(threadId);\n // Find the most recent active run\n activeRun = runs?.find(\n (run: Run) =>\n run.status === \"running\" || run.status === \"pending\"\n );\n } catch (error) {\n this.warn(\"Failed to check for active runs:\", error);\n }\n }\n\n // If there's an active run, join the stream\n if (activeRun) {\n this.log(`Joining active stream for run ${activeRun.run_id}`);\n try {\n await this.joinAndProcessStream(\n client,\n threadId,\n activeRun.run_id,\n subscriber\n );\n } catch (error) {\n this.error(\"Error joining stream:\", error);\n // Continue to complete even if stream joining fails\n }\n } else {\n // No active run - emit RUN_FINISHED and complete\n subscriber.next({\n type: EventType.RUN_FINISHED,\n timestamp: Date.now(),\n threadId,\n runId,\n } as BaseEvent);\n }\n\n // Complete - history hydration done\n subscriber.complete();\n } catch (error) {\n this.error(\"Failed to hydrate history:\", error);\n // Fall back: emit required events so frontend doesn't get empty response\n const fallbackRunId =\n \"hydration_error_\" + Math.random().toString(36).slice(2);\n subscriber.next({\n type: EventType.RUN_STARTED,\n timestamp: Date.now(),\n threadId,\n runId: fallbackRunId,\n } as BaseEvent);\n subscriber.next({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: [],\n timestamp: Date.now(),\n threadId,\n runId: fallbackRunId,\n } as BaseEvent);\n subscriber.next({\n type: EventType.RUN_FINISHED,\n timestamp: Date.now(),\n threadId,\n runId: fallbackRunId,\n } as BaseEvent);\n subscriber.complete();\n }\n };\n\n hydrate();\n });\n }\n\n /**\n * Joins an active stream and processes its events.\n *\n * This method connects to an already-running LangGraph execution and\n * processes all incoming events, transforming them to BaseEvent format.\n *\n * Tracks started messages and tool calls to handle mid-stream joins where\n * we might receive CONTENT/END events without having seen START events.\n */\n private async joinAndProcessStream(\n client: Client,\n threadId: string,\n runId: string,\n subscriber: {\n next: (event: BaseEvent) => void;\n complete: () => void;\n error: (err: unknown) => void;\n }\n ): Promise<void> {\n // Track which messages and tool calls we've started\n // to handle mid-stream joins\n const startedMessages = new Set<string>();\n const startedToolCalls = new Set<string>();\n\n try {\n // Join the stream with multiple stream modes to get comprehensive event coverage\n // Using the fresh client passed from connect() to ensure correct URL\n const stream = client.runs.joinStream(threadId, runId, {\n streamMode: [\"events\", \"values\", \"updates\", \"custom\"] as StreamMode[],\n });\n\n let currentRunId = runId;\n let manuallyEmittedState = this.activeRun.manuallyEmittedState;\n\n // Process each chunk from the stream\n for await (const chunk of stream) {\n try {\n const result = await processStreamChunk(chunk as StreamChunk, {\n threadId,\n runId: currentRunId,\n subscriber,\n startedMessages,\n startedToolCalls,\n debug: this.debug,\n manuallyEmittedState,\n });\n currentRunId = result.runId;\n manuallyEmittedState = result.manuallyEmittedState;\n } catch (chunkError) {\n this.error(\"Error processing stream chunk:\", chunkError);\n // Continue processing other chunks even if one fails\n }\n }\n\n // Update active run state\n this.activeRun.manuallyEmittedState = manuallyEmittedState;\n\n // Stream completed - check for interrupts before finishing\n try {\n const state = await client.threads.getState(threadId);\n const threadState = state as unknown as ThreadState;\n\n // Check for interrupts in the final state\n const interruptedTask = threadState.tasks?.find(\n (task) => task.interrupts && task.interrupts.length > 0\n );\n\n if (\n interruptedTask &&\n interruptedTask.interrupts &&\n interruptedTask.interrupts.length > 0\n ) {\n const interrupt = interruptedTask.interrupts[0];\n const interruptValue = interrupt?.value;\n\n // Emit custom interrupt event\n subscriber.next({\n type: \"CUSTOM\" as unknown as typeof EventType.CUSTOM,\n name: \"on_interrupt\",\n value: JSON.stringify(interruptValue),\n rawEvent: {\n id: currentRunId,\n value: interruptValue,\n },\n timestamp: Date.now(),\n threadId,\n runId: currentRunId,\n } as unknown as BaseEvent);\n }\n } catch (stateError) {\n this.warn(\"Failed to check for interrupts after stream:\", stateError);\n }\n\n // Stream completed - emit RUN_FINISHED\n subscriber.next({\n type: EventType.RUN_FINISHED,\n timestamp: Date.now(),\n threadId,\n runId: currentRunId,\n } as BaseEvent);\n } catch (error) {\n this.error(\"Error in joinAndProcessStream:\", error);\n\n // Emit error event\n subscriber.next({\n type: EventType.RUN_FINISHED,\n timestamp: Date.now(),\n threadId,\n runId,\n } as BaseEvent);\n\n throw error;\n }\n }\n}\n"]}
|