{"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        messagesById.set(event.messageId, {\n          id: event.messageId,\n          role: \"tool\",\n          content: event.content,\n          toolCallId: event.toolCallId,\n        });\n        break;\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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"}