{"version":3,"file":"messages-v2.cjs","names":["BaseCallbackHandler","ToolMessage","BaseMessage","BaseMessageChunk"],"sources":["../../src/pregel/messages-v2.ts"],"sourcesContent":["import { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport {\n  BaseMessage,\n  ToolMessage,\n  BaseMessageChunk,\n} from \"@langchain/core/messages\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport { ChatGeneration, LLMResult } from \"@langchain/core/outputs\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\n\nimport { TAG_HIDDEN, TAG_NOSTREAM } from \"../constants.js\";\nimport { StreamChunk } from \"./stream.js\";\n\ntype Meta = [string[], Record<string, unknown>];\ntype CompatibleContentBlock = { type: string; [key: string]: unknown };\n\nfunction getResponseMetadata(\n  message: BaseMessage\n): Record<string, unknown> | undefined {\n  if (\n    \"response_metadata\" in message &&\n    typeof message.response_metadata === \"object\" &&\n    message.response_metadata != null\n  ) {\n    return message.response_metadata as Record<string, unknown>;\n  }\n  return undefined;\n}\n\nfunction getUsageMetadata(\n  message: BaseMessage\n): Record<string, unknown> | undefined {\n  if (\n    \"usage_metadata\" in message &&\n    typeof message.usage_metadata === \"object\" &&\n    message.usage_metadata != null\n  ) {\n    return message.usage_metadata as Record<string, unknown>;\n  }\n  return undefined;\n}\n\nfunction startBlockFor(block: CompatibleContentBlock): CompatibleContentBlock {\n  switch (block.type) {\n    case \"text\":\n      return { type: \"text\", text: \"\" };\n    case \"reasoning\":\n      return { type: \"reasoning\", reasoning: \"\" };\n    case \"tool_call\":\n    case \"tool_call_chunk\":\n      return {\n        type: \"tool_call_chunk\",\n        ...(block.id != null ? { id: block.id } : {}),\n        ...(block.name != null ? { name: block.name } : {}),\n        args: \"\",\n      };\n    default:\n      return block;\n  }\n}\n\nfunction deltaFor(\n  block: CompatibleContentBlock\n): ChatModelStreamEvent | undefined {\n  switch (block.type) {\n    case \"text\": {\n      const text = typeof block.text === \"string\" ? block.text : \"\";\n      return text.length > 0\n        ? {\n            event: \"content-block-delta\",\n            index: typeof block.index === \"number\" ? block.index : 0,\n            delta: { type: \"text-delta\", text },\n          }\n        : undefined;\n    }\n    case \"reasoning\": {\n      const reasoning =\n        typeof block.reasoning === \"string\" ? block.reasoning : \"\";\n      return reasoning.length > 0\n        ? {\n            event: \"content-block-delta\",\n            index: typeof block.index === \"number\" ? block.index : 0,\n            delta: { type: \"reasoning-delta\", reasoning },\n          }\n        : undefined;\n    }\n    case \"tool_call_chunk\":\n      return {\n        event: \"content-block-delta\",\n        index: typeof block.index === \"number\" ? block.index : 0,\n        delta: {\n          type: \"block-delta\",\n          fields: { ...block, type: \"tool_call_chunk\" },\n        },\n      };\n    default:\n      return undefined;\n  }\n}\n\n/**\n * A callback handler that implements protocol-native stream_mode=messages.\n *\n * LangChain Core owns chat model content-block event construction. This handler\n * only captures LangGraph metadata, forwards Core events to the Pregel messages\n * channel, and emits a small non-streaming fallback for models that cannot\n * produce stream events.\n */\nexport class StreamProtocolMessagesHandler extends BaseCallbackHandler {\n  name = \"StreamProtocolMessagesHandler\";\n\n  streamFn: (streamChunk: StreamChunk) => void;\n\n  metadatas: Record<string, Meta | undefined> = {};\n\n  seen: Record<string, BaseMessage | true> = {};\n\n  streamedRunIds = new Set<string>();\n\n  stableMessageIdMap: Record<string, string> = {};\n\n  lc_prefer_chat_model_stream_events = true;\n\n  constructor(streamFn: (streamChunk: StreamChunk) => void) {\n    super();\n    this.streamFn = streamFn;\n  }\n\n  private normalizeMessageId(message: BaseMessage, runId: string | undefined) {\n    let messageId = message.id;\n\n    if (runId != null) {\n      if (ToolMessage.isInstance(message)) {\n        messageId ??= `run-${runId}-tool-${message.tool_call_id}`;\n      } else {\n        if (messageId == null || messageId === `run-${runId}`) {\n          messageId =\n            this.stableMessageIdMap[runId] ?? messageId ?? `run-${runId}`;\n        }\n        this.stableMessageIdMap[runId] ??= messageId;\n      }\n    }\n\n    if (messageId !== message.id) {\n      // eslint-disable-next-line no-param-reassign\n      message.id = messageId;\n      // eslint-disable-next-line no-param-reassign\n      message.lc_kwargs.id = messageId;\n    }\n\n    if (message.id != null) this.seen[message.id] = message;\n    return message.id;\n  }\n\n  private emit(meta: Meta, data: ChatModelStreamEvent, runId?: string) {\n    const metadata = runId != null ? { ...meta[1], run_id: runId } : meta[1];\n    this.streamFn([meta[0], \"messages\", [data, metadata]]);\n  }\n\n  private emitFinalMessage(\n    meta: Meta,\n    message: BaseMessage,\n    runId: string | undefined,\n    dedupe = false\n  ) {\n    const existingId =\n      message.id ??\n      (runId != null ? this.stableMessageIdMap[runId] : undefined);\n    if (dedupe && existingId != null && this.seen[existingId] !== undefined) {\n      return;\n    }\n\n    const messageId = this.normalizeMessageId(message, runId);\n    const role =\n      message.type === \"human\"\n        ? \"human\"\n        : message.type === \"system\"\n          ? \"system\"\n          : message.type === \"tool\"\n            ? \"tool\"\n            : \"ai\";\n    const toolCallId =\n      role === \"tool\" && ToolMessage.isInstance(message)\n        ? message.tool_call_id\n        : undefined;\n\n    this.emit(\n      meta,\n      {\n        event: \"message-start\",\n        ...(messageId != null ? { id: messageId } : {}),\n        ...(role !== \"ai\" ? ({ role } as Record<string, unknown>) : {}),\n        ...(typeof toolCallId === \"string\"\n          ? ({ tool_call_id: toolCallId } as Record<string, unknown>)\n          : {}),\n      } as ChatModelStreamEvent,\n      runId\n    );\n\n    const contentBlocks: CompatibleContentBlock[] = Array.isArray(\n      message.content\n    )\n      ? (message.content as CompatibleContentBlock[])\n      : typeof message.content === \"string\" && message.content.length > 0\n        ? [{ type: \"text\", text: message.content }]\n        : [];\n\n    contentBlocks.forEach((block, offset) => {\n      const index = typeof block.index === \"number\" ? block.index : offset;\n      this.emit(\n        meta,\n        {\n          event: \"content-block-start\",\n          index,\n          content: startBlockFor(block),\n        },\n        runId\n      );\n      const delta = deltaFor({ ...block, index });\n      if (delta != null) {\n        this.emit(meta, delta, runId);\n      }\n      this.emit(\n        meta,\n        {\n          event: \"content-block-finish\",\n          index,\n          content: block,\n        },\n        runId\n      );\n    });\n\n    this.emit(\n      meta,\n      {\n        event: \"message-finish\",\n        ...(getUsageMetadata(message) != null\n          ? { usage: getUsageMetadata(message) }\n          : {}),\n        ...(getResponseMetadata(message) != null\n          ? { responseMetadata: getResponseMetadata(message) }\n          : {}),\n      },\n      runId\n    );\n  }\n\n  handleChatModelStart(\n    _llm: Serialized,\n    _messages: BaseMessage[][],\n    runId: string,\n    _parentRunId?: string,\n    _extraParams?: Record<string, unknown>,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    name?: string\n  ) {\n    if (\n      metadata &&\n      (!tags || (!tags.includes(TAG_NOSTREAM) && !tags.includes(\"nostream\")))\n    ) {\n      this.metadatas[runId] = [\n        (metadata.langgraph_checkpoint_ns as string).split(\"|\"),\n        { tags, name, ...metadata },\n      ];\n    }\n  }\n\n  handleLLMNewToken() {\n    // Core v2 stream events are forwarded via handleChatModelStreamEvent.\n  }\n\n  handleChatModelStreamEvent(event: ChatModelStreamEvent, runId: string) {\n    const meta = this.metadatas[runId];\n    if (meta === undefined) return;\n\n    let forwarded = event;\n    if (event.event === \"message-start\") {\n      this.streamedRunIds.add(runId);\n      const id = event.id ?? `run-${runId}`;\n      this.seen[id] = true;\n      this.stableMessageIdMap[runId] ??= id;\n      if (event.id == null) {\n        forwarded = { ...event, id };\n      }\n    }\n\n    this.emit(meta, forwarded, runId);\n  }\n\n  handleLLMEnd(output: LLMResult, runId: string) {\n    const meta = this.metadatas[runId];\n    if (meta === undefined) return;\n\n    const chatGeneration = output.generations?.[0]?.[0] as ChatGeneration;\n    const message = BaseMessage.isInstance(chatGeneration?.message)\n      ? chatGeneration.message\n      : undefined;\n\n    if (message != null) {\n      if (this.streamedRunIds.has(runId)) {\n        const messageId = this.normalizeMessageId(message, runId);\n        if (messageId != null) this.seen[messageId] = message;\n      } else {\n        this.emitFinalMessage(meta, message, runId, true);\n      }\n    }\n\n    this.streamedRunIds.delete(runId);\n    delete this.metadatas[runId];\n    delete this.stableMessageIdMap[runId];\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  handleLLMError(_err: any, runId: string) {\n    this.streamedRunIds.delete(runId);\n    delete this.metadatas[runId];\n    delete this.stableMessageIdMap[runId];\n  }\n\n  handleChainStart(\n    _chain: Serialized,\n    inputs: ChainValues,\n    runId: string,\n    _parentRunId?: string,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    _runType?: string,\n    name?: string\n  ) {\n    if (\n      metadata !== undefined &&\n      name === metadata.langgraph_node &&\n      (tags === undefined || !tags.includes(TAG_HIDDEN))\n    ) {\n      this.metadatas[runId] = [\n        (metadata.langgraph_checkpoint_ns as string).split(\"|\"),\n        { tags, name, ...metadata },\n      ];\n\n      if (typeof inputs === \"object\") {\n        for (const value of Object.values(inputs)) {\n          if (\n            (BaseMessage.isInstance(value) ||\n              BaseMessageChunk.isInstance(value)) &&\n            value.id !== undefined\n          ) {\n            this.seen[value.id] = value;\n          } else if (Array.isArray(value)) {\n            for (const item of value) {\n              if (\n                (BaseMessage.isInstance(item) ||\n                  BaseMessageChunk.isInstance(item)) &&\n                item.id !== undefined\n              ) {\n                this.seen[item.id] = item;\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  handleChainEnd(outputs: ChainValues, runId: string) {\n    const meta = this.metadatas[runId];\n    delete this.metadatas[runId];\n    if (meta === undefined) return;\n\n    const emitMessage = (value: unknown) => {\n      if (BaseMessage.isInstance(value) && !ToolMessage.isInstance(value)) {\n        this.emitFinalMessage(meta, value, runId, true);\n      }\n    };\n\n    if (BaseMessage.isInstance(outputs)) {\n      emitMessage(outputs);\n    } else if (Array.isArray(outputs)) {\n      for (const value of outputs) emitMessage(value);\n    } else if (outputs != null && typeof outputs === \"object\") {\n      for (const value of Object.values(outputs)) {\n        if (Array.isArray(value)) {\n          for (const item of value) emitMessage(item);\n        } else {\n          emitMessage(value);\n        }\n      }\n    }\n\n    delete this.stableMessageIdMap[runId];\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  handleChainError(_err: any, runId: string) {\n    delete this.metadatas[runId];\n    delete this.stableMessageIdMap[runId];\n  }\n}\n"],"mappings":"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"}