{"version":3,"file":"format.cjs","sources":["../../../src/messages/format.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n  AIMessage,\n  AIMessageChunk,\n  ToolMessage,\n  BaseMessage,\n  HumanMessage,\n  SystemMessage,\n} from '@langchain/core/messages';\nimport type { MessageContentImageUrl } from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type {\n  ExtendedMessageContent,\n  MessageContentComplex,\n  ReasoningContentText,\n  ToolCallContent,\n  ToolCallPart,\n  TPayload,\n  TMessage,\n} from '@/types';\nimport { Providers, ContentTypes, Constants } from '@/common';\nimport { processToolOutput } from '@/utils/toonFormat';\n\ninterface MediaMessageParams {\n  message: {\n    role: string;\n    content: string;\n    name?: string;\n    [key: string]: any;\n  };\n  mediaParts: MessageContentComplex[];\n  endpoint?: Providers;\n}\n\n/**\n * Formats a message with media content (images, documents, videos, audios) to API payload format.\n *\n * @param params - The parameters for formatting.\n * @returns - The formatted message.\n */\nexport const formatMediaMessage = ({\n  message,\n  endpoint,\n  mediaParts,\n}: MediaMessageParams): {\n  role: string;\n  content: MessageContentComplex[];\n  name?: string;\n  [key: string]: any;\n} => {\n  // Create a new object to avoid mutating the input\n  const result: {\n    role: string;\n    content: MessageContentComplex[];\n    name?: string;\n    [key: string]: any;\n  } = {\n    ...message,\n    content: [] as MessageContentComplex[],\n  };\n\n  if (endpoint === Providers.ANTHROPIC) {\n    result.content = [\n      ...mediaParts,\n      { type: ContentTypes.TEXT, text: message.content },\n    ] as MessageContentComplex[];\n    return result;\n  }\n\n  result.content = [\n    { type: ContentTypes.TEXT, text: message.content },\n    ...mediaParts,\n  ] as MessageContentComplex[];\n\n  return result;\n};\n\ninterface MessageInput {\n  role?: string;\n  _name?: string;\n  sender?: string;\n  text?: string;\n  content?: string | MessageContentComplex[];\n  image_urls?: MessageContentImageUrl[];\n  documents?: MessageContentComplex[];\n  videos?: MessageContentComplex[];\n  audios?: MessageContentComplex[];\n  lc_id?: string[];\n  [key: string]: any;\n}\n\ninterface FormatMessageParams {\n  message: MessageInput;\n  userName?: string;\n  assistantName?: string;\n  endpoint?: Providers;\n  langChain?: boolean;\n}\n\ninterface FormattedMessage {\n  role: string;\n  content: string | MessageContentComplex[];\n  name?: string;\n  [key: string]: any;\n}\n\n/**\n * Formats a message to OpenAI payload format based on the provided options.\n *\n * @param params - The parameters for formatting.\n * @returns - The formatted message.\n */\nexport const formatMessage = ({\n  message,\n  userName,\n  endpoint,\n  assistantName,\n  langChain = false,\n}: FormatMessageParams):\n  | FormattedMessage\n  | HumanMessage\n  | AIMessage\n  | SystemMessage => {\n  // eslint-disable-next-line prefer-const\n  let { role: _role, _name, sender, text, content: _content, lc_id } = message;\n  if (lc_id && lc_id[2] && !langChain) {\n    const roleMapping: Record<string, string> = {\n      SystemMessage: 'system',\n      HumanMessage: 'user',\n      AIMessage: 'assistant',\n    };\n    _role = roleMapping[lc_id[2]] || _role;\n  }\n  const role =\n    _role ??\n    (sender != null && sender && sender.toLowerCase() === 'user'\n      ? 'user'\n      : 'assistant');\n  const content = _content ?? text ?? '';\n  const formattedMessage: FormattedMessage = {\n    role,\n    content,\n  };\n\n  // Set name fields first\n  if (_name != null && _name) {\n    formattedMessage.name = _name;\n  }\n\n  if (userName != null && userName && formattedMessage.role === 'user') {\n    formattedMessage.name = userName;\n  }\n\n  if (\n    assistantName != null &&\n    assistantName &&\n    formattedMessage.role === 'assistant'\n  ) {\n    formattedMessage.name = assistantName;\n  }\n\n  if (formattedMessage.name != null && formattedMessage.name) {\n    // Conform to API regex: ^[a-zA-Z0-9_-]{1,64}$\n    // https://community.openai.com/t/the-format-of-the-name-field-in-the-documentation-is-incorrect/175684/2\n    formattedMessage.name = formattedMessage.name.replace(\n      /[^a-zA-Z0-9_-]/g,\n      '_'\n    );\n\n    if (formattedMessage.name.length > 64) {\n      formattedMessage.name = formattedMessage.name.substring(0, 64);\n    }\n  }\n\n  const { image_urls, documents, videos, audios } = message;\n  const mediaParts: MessageContentComplex[] = [];\n\n  if (Array.isArray(documents) && documents.length > 0) {\n    mediaParts.push(...documents);\n  }\n\n  if (Array.isArray(videos) && videos.length > 0) {\n    mediaParts.push(...videos);\n  }\n\n  if (Array.isArray(audios) && audios.length > 0) {\n    mediaParts.push(...audios);\n  }\n\n  if (Array.isArray(image_urls) && image_urls.length > 0) {\n    mediaParts.push(...image_urls);\n  }\n\n  if (mediaParts.length > 0 && role === 'user') {\n    const mediaMessage = formatMediaMessage({\n      message: {\n        ...formattedMessage,\n        content:\n          typeof formattedMessage.content === 'string'\n            ? formattedMessage.content\n            : '',\n      },\n      mediaParts,\n      endpoint,\n    });\n\n    if (!langChain) {\n      return mediaMessage;\n    }\n\n    return new HumanMessage(mediaMessage);\n  }\n\n  if (!langChain) {\n    return formattedMessage;\n  }\n\n  if (role === 'user') {\n    return new HumanMessage(formattedMessage);\n  } else if (role === 'assistant') {\n    return new AIMessage(formattedMessage);\n  } else {\n    return new SystemMessage(formattedMessage);\n  }\n};\n\n/**\n * Formats an array of messages for LangChain.\n *\n * @param messages - The array of messages to format.\n * @param formatOptions - The options for formatting each message.\n * @returns - The array of formatted LangChain messages.\n */\nexport const formatLangChainMessages = (\n  messages: Array<MessageInput>,\n  formatOptions: Omit<FormatMessageParams, 'message' | 'langChain'>\n): Array<HumanMessage | AIMessage | SystemMessage> => {\n  return messages.map((msg) => {\n    const formatted = formatMessage({\n      ...formatOptions,\n      message: msg,\n      langChain: true,\n    });\n    return formatted as HumanMessage | AIMessage | SystemMessage;\n  });\n};\n\ninterface LangChainMessage {\n  lc_kwargs?: {\n    additional_kwargs?: Record<string, any>;\n    [key: string]: any;\n  };\n  kwargs?: {\n    additional_kwargs?: Record<string, any>;\n    [key: string]: any;\n  };\n  [key: string]: any;\n}\n\n/**\n * Formats a LangChain message object by merging properties from `lc_kwargs` or `kwargs` and `additional_kwargs`.\n *\n * @param message - The message object to format.\n * @returns - The formatted LangChain message.\n */\nexport const formatFromLangChain = (\n  message: LangChainMessage\n): Record<string, any> => {\n  const kwargs = message.lc_kwargs ?? message.kwargs ?? {};\n  const { additional_kwargs = {}, ...message_kwargs } = kwargs;\n  return {\n    ...message_kwargs,\n    ...additional_kwargs,\n  };\n};\n\n/**\n * Helper function to format an assistant message\n * @param message The message to format\n * @returns Array of formatted messages\n */\nfunction formatAssistantMessage(\n  message: Partial<TMessage>\n): Array<AIMessage | ToolMessage> {\n  const formattedMessages: Array<AIMessage | ToolMessage> = [];\n  let currentContent: MessageContentComplex[] = [];\n  let lastAIMessage: AIMessage | null = null;\n  let hasReasoning = false;\n\n  if (Array.isArray(message.content)) {\n    for (const part of message.content as Array<\n      MessageContentComplex | undefined | null\n    >) {\n      if (part == null) {\n        continue;\n      }\n      if (part.type === ContentTypes.TEXT && part.tool_call_ids) {\n        /*\n        If there's pending content, it needs to be aggregated as a single string to prepare for tool calls.\n        For Anthropic models, the \"tool_calls\" field on a message is only respected if content is a string.\n        */\n        if (currentContent.length > 0) {\n          let content = currentContent.reduce((acc, curr) => {\n            if (curr.type === ContentTypes.TEXT) {\n              return `${acc}${String(curr[ContentTypes.TEXT] ?? '')}\\n`;\n            }\n            return acc;\n          }, '');\n          content =\n            `${content}\\n${part[ContentTypes.TEXT] ?? part.text ?? ''}`.trim();\n          lastAIMessage = new AIMessage({ content });\n          formattedMessages.push(lastAIMessage);\n          currentContent = [];\n          continue;\n        }\n        // Create a new AIMessage with this text and prepare for tool calls\n        lastAIMessage = new AIMessage({\n          content: part.text != null ? part.text : '',\n        });\n        formattedMessages.push(lastAIMessage);\n      } else if (part.type === ContentTypes.TOOL_CALL) {\n        // Skip malformed tool call entries without tool_call property\n        if (part.tool_call == null) {\n          continue;\n        }\n\n        // Note: `tool_calls` list is defined when constructed by `AIMessage` class, and outputs should be excluded from it\n        const {\n          output,\n          args: _args,\n          ..._tool_call\n        } = part.tool_call as ToolCallPart;\n\n        // Skip invalid tool calls that have no name AND no output\n        if (\n          _tool_call.name == null ||\n          (_tool_call.name === '' && (output == null || output === ''))\n        ) {\n          continue;\n        }\n\n        if (!lastAIMessage) {\n          // \"Heal\" the payload by creating an AIMessage to precede the tool call\n          lastAIMessage = new AIMessage({ content: '' });\n          formattedMessages.push(lastAIMessage);\n        }\n\n        const tool_call: ToolCallPart = _tool_call;\n        // TODO: investigate; args as dictionary may need to be providers-or-tool-specific\n        let args: any = _args;\n        try {\n          if (typeof _args === 'string') {\n            args = JSON.parse(_args);\n          }\n        } catch {\n          if (typeof _args === 'string') {\n            args = { input: _args };\n          }\n        }\n\n        tool_call.args = args;\n        if (!lastAIMessage.tool_calls) {\n          lastAIMessage.tool_calls = [];\n        }\n        lastAIMessage.tool_calls.push(tool_call as ToolCall);\n\n        // Apply TOON compression to historical tool outputs for context efficiency\n        // processToolOutput handles: JSON→TOON conversion, already-TOON detection (skip), truncation\n        // Skip TOON for content_tool — its output is line-numbered source code that must stay verbatim\n        // for accurate edit (str_replace) matching.\n        const processedOutput =\n          output != null\n            ? processToolOutput(output, {\n                enableToon: tool_call.name !== 'content_tool',\n              }).content\n            : '';\n\n        formattedMessages.push(\n          new ToolMessage({\n            tool_call_id: tool_call.id ?? '',\n            name: tool_call.name,\n            content: processedOutput,\n          })\n        );\n      } else if (\n        part.type === ContentTypes.THINK ||\n        part.type === ContentTypes.THINKING ||\n        part.type === ContentTypes.REASONING_CONTENT ||\n        part.type === 'redacted_thinking'\n      ) {\n        hasReasoning = true;\n        continue;\n      } else if (\n        part.type === ContentTypes.ERROR ||\n        part.type === ContentTypes.AGENT_UPDATE\n      ) {\n        continue;\n      } else {\n        if (\n          part.type === ContentTypes.TEXT &&\n          !String(part.text ?? '').trim()\n        ) {\n          continue;\n        }\n        currentContent.push(part);\n      }\n    }\n  }\n\n  if (hasReasoning && currentContent.length > 0) {\n    const content = currentContent\n      .reduce((acc, curr) => {\n        if (curr.type === ContentTypes.TEXT) {\n          return `${acc}${String(curr[ContentTypes.TEXT] ?? '')}\\n`;\n        }\n        return acc;\n      }, '')\n      .trim();\n\n    if (content) {\n      formattedMessages.push(new AIMessage({ content }));\n    }\n  } else if (currentContent.length > 0) {\n    formattedMessages.push(new AIMessage({ content: currentContent }));\n  }\n\n  return formattedMessages;\n}\n\n/**\n * Labels all agent content for parallel patterns (fan-out/fan-in)\n * Groups consecutive content by agent and wraps with clear labels\n */\nfunction labelAllAgentContent(\n  contentParts: MessageContentComplex[],\n  agentIdMap: Record<number, string>,\n  agentNames?: Record<string, string>\n): MessageContentComplex[] {\n  const result: MessageContentComplex[] = [];\n  let currentAgentId: string | undefined;\n  let agentContentBuffer: MessageContentComplex[] = [];\n\n  const flushAgentBuffer = (): void => {\n    if (agentContentBuffer.length === 0) {\n      return;\n    }\n\n    if (currentAgentId != null && currentAgentId !== '') {\n      const agentName = (agentNames?.[currentAgentId] ?? '') || currentAgentId;\n      const formattedParts: string[] = [];\n\n      formattedParts.push(`--- ${agentName} ---`);\n\n      for (const part of agentContentBuffer) {\n        if (part.type === ContentTypes.THINK) {\n          const thinkContent = (part as ReasoningContentText).think || '';\n          if (thinkContent) {\n            formattedParts.push(\n              `${agentName}: ${JSON.stringify({\n                type: 'think',\n                think: thinkContent,\n              })}`\n            );\n          }\n        } else if (part.type === ContentTypes.TEXT) {\n          const textContent: string = part.text ?? '';\n          if (textContent) {\n            formattedParts.push(`${agentName}: ${textContent}`);\n          }\n        } else if (part.type === ContentTypes.TOOL_CALL) {\n          formattedParts.push(\n            `${agentName}: ${JSON.stringify({\n              type: 'tool_call',\n              tool_call: (part as ToolCallContent).tool_call,\n            })}`\n          );\n        }\n      }\n\n      formattedParts.push(`--- End of ${agentName} ---`);\n\n      // Create a single text content part with all agent content\n      result.push({\n        type: ContentTypes.TEXT,\n        text: formattedParts.join('\\n\\n'),\n      } as MessageContentComplex);\n    } else {\n      // No agent ID, pass through as-is\n      result.push(...agentContentBuffer);\n    }\n\n    agentContentBuffer = [];\n  };\n\n  for (let i = 0; i < contentParts.length; i++) {\n    const part = contentParts[i];\n    const agentId = agentIdMap[i];\n\n    // If agent changed, flush previous buffer\n    if (agentId !== currentAgentId && currentAgentId !== undefined) {\n      flushAgentBuffer();\n    }\n\n    currentAgentId = agentId;\n    agentContentBuffer.push(part);\n  }\n\n  // Flush any remaining content\n  flushAgentBuffer();\n\n  return result;\n}\n\n/**\n * Groups content parts by agent and formats them with agent labels\n * This preprocesses multi-agent content to prevent identity confusion\n *\n * @param contentParts - The content parts from a run\n * @param agentIdMap - Map of content part index to agent ID\n * @param agentNames - Optional map of agent ID to display name\n * @param options - Configuration options\n * @param options.labelNonTransferContent - If true, labels all agent transitions (for parallel patterns)\n * @returns Modified content parts with agent labels where appropriate\n */\nexport const labelContentByAgent = (\n  contentParts: MessageContentComplex[],\n  agentIdMap?: Record<number, string>,\n  agentNames?: Record<string, string>,\n  options?: { labelNonTransferContent?: boolean }\n): MessageContentComplex[] => {\n  if (!agentIdMap || Object.keys(agentIdMap).length === 0) {\n    return contentParts;\n  }\n\n  // If labelNonTransferContent is true, use a different strategy for parallel patterns\n  if (options?.labelNonTransferContent === true) {\n    return labelAllAgentContent(contentParts, agentIdMap, agentNames);\n  }\n\n  const result: MessageContentComplex[] = [];\n  let currentAgentId: string | undefined;\n  let agentContentBuffer: MessageContentComplex[] = [];\n  let transferToolCallIndex: number | undefined;\n  let transferToolCallId: string | undefined;\n\n  const flushAgentBuffer = (): void => {\n    if (agentContentBuffer.length === 0) {\n      return;\n    }\n\n    // If this is content from a transferred agent, format it specially\n    if (\n      currentAgentId != null &&\n      currentAgentId !== '' &&\n      transferToolCallIndex !== undefined\n    ) {\n      const agentName = (agentNames?.[currentAgentId] ?? '') || currentAgentId;\n      const formattedParts: string[] = [];\n\n      formattedParts.push(`--- Transfer to ${agentName} ---`);\n\n      for (const part of agentContentBuffer) {\n        if (part.type === ContentTypes.THINK) {\n          formattedParts.push(\n            `${agentName}: ${JSON.stringify({\n              type: 'think',\n              think: (part as ReasoningContentText).think,\n            })}`\n          );\n        } else if ('text' in part && part.type === ContentTypes.TEXT) {\n          const textContent: string = part.text ?? '';\n          if (textContent) {\n            formattedParts.push(\n              `${agentName}: ${JSON.stringify({\n                type: 'text',\n                text: textContent,\n              })}`\n            );\n          }\n        } else if (part.type === ContentTypes.TOOL_CALL) {\n          formattedParts.push(\n            `${agentName}: ${JSON.stringify({\n              type: 'tool_call',\n              tool_call: (part as ToolCallContent).tool_call,\n            })}`\n          );\n        }\n      }\n\n      formattedParts.push(`--- End of ${agentName} response ---`);\n\n      // Find the tool call that triggered this transfer and update its output\n      if (transferToolCallIndex < result.length) {\n        const transferToolCall = result[transferToolCallIndex];\n        if (\n          transferToolCall.type === ContentTypes.TOOL_CALL &&\n          transferToolCall.tool_call?.id === transferToolCallId\n        ) {\n          transferToolCall.tool_call.output = formattedParts.join('\\n\\n');\n        }\n      }\n    } else {\n      // Not from a transfer, add as-is\n      result.push(...agentContentBuffer);\n    }\n\n    agentContentBuffer = [];\n    transferToolCallIndex = undefined;\n    transferToolCallId = undefined;\n  };\n\n  for (let i = 0; i < contentParts.length; i++) {\n    const part = contentParts[i];\n    const agentId = agentIdMap[i];\n\n    // Check if this is a transfer tool call\n    const isTransferTool =\n      (part.type === ContentTypes.TOOL_CALL &&\n        (part as ToolCallContent).tool_call?.name?.startsWith(\n          'lc_transfer_to_'\n        )) ??\n      false;\n\n    // If agent changed, flush previous buffer\n    if (agentId !== currentAgentId && currentAgentId !== undefined) {\n      flushAgentBuffer();\n    }\n\n    currentAgentId = agentId;\n\n    if (isTransferTool) {\n      // Flush any existing buffer first\n      flushAgentBuffer();\n      // Add the transfer tool call to result\n      result.push(part);\n      // Mark that the next agent's content should be captured\n      transferToolCallIndex = result.length - 1;\n      transferToolCallId = (part as ToolCallContent).tool_call?.id;\n      currentAgentId = undefined; // Reset to capture the next agent\n    } else {\n      agentContentBuffer.push(part);\n    }\n  }\n\n  flushAgentBuffer();\n\n  return result;\n};\n\n/** Extracts tool names from a tool_search output JSON string. */\nfunction extractToolNamesFromSearchOutput(output: string): string[] {\n  try {\n    const parsed: unknown = JSON.parse(output);\n    if (\n      typeof parsed === 'object' &&\n      parsed !== null &&\n      Array.isArray((parsed as Record<string, unknown>).tools)\n    ) {\n      return (\n        (parsed as Record<string, unknown>).tools as Array<{ name?: string }>\n      )\n        .map((t) => t.name)\n        .filter((name): name is string => typeof name === 'string');\n    }\n  } catch {\n    /** Output may have warnings prepended, try to find JSON within it */\n    const jsonMatch = output.match(/\\{[\\s\\S]*\\}/);\n    if (jsonMatch) {\n      try {\n        const parsed: unknown = JSON.parse(jsonMatch[0]);\n        if (\n          typeof parsed === 'object' &&\n          parsed !== null &&\n          Array.isArray((parsed as Record<string, unknown>).tools)\n        ) {\n          return (\n            (parsed as Record<string, unknown>).tools as Array<{\n              name?: string;\n            }>\n          )\n            .map((t) => t.name)\n            .filter((name): name is string => typeof name === 'string');\n        }\n      } catch {\n        /* ignore */\n      }\n    }\n  }\n  return [];\n}\n\n/** Extracts the skillName from a skill tool_call's args (string or object). */\nfunction extractSkillName(args: unknown): string | undefined {\n  let parsed: Record<string, unknown> | undefined;\n  if (typeof args === 'string') {\n    try {\n      parsed = JSON.parse(args) as Record<string, unknown>;\n    } catch {\n      /* malformed args — skip */\n    }\n  } else {\n    parsed = args as Record<string, unknown> | undefined;\n  }\n  const name = parsed?.skillName;\n  return typeof name === 'string' && name !== '' ? name : undefined;\n}\n\n/**\n * Formats an array of messages for LangChain, handling tool calls and creating ToolMessage instances.\n *\n * @param payload - The array of messages to format.\n * @param indexTokenCountMap - Optional map of message indices to token counts.\n * @param tools - Optional set of tool names that are allowed in the request.\n * @param skills - Optional map of skill name to body for reconstructing skill HumanMessages.\n *   When SkillTool is invoked, the body is injected as a HumanMessage into LangGraph state\n *   but NOT persisted to conversation history. On follow-up runs the skill body is lost.\n *   Pass `skills` to reconstruct the HumanMessage at the right position after each skill\n *   ToolMessage. Upstream PRs #96 / #97.\n * @returns - Object containing formatted messages and updated indexTokenCountMap if provided.\n */\nexport const formatAgentMessages = (\n  payload: TPayload,\n  indexTokenCountMap?: Record<number, number | undefined>,\n  tools?: Set<string>,\n  skills?: Map<string, string>\n): {\n  messages: Array<HumanMessage | AIMessage | SystemMessage | ToolMessage>;\n  indexTokenCountMap?: Record<number, number>;\n} => {\n  const messages: Array<\n    HumanMessage | AIMessage | SystemMessage | ToolMessage\n  > = [];\n  // If indexTokenCountMap is provided, create a new map to track the updated indices\n  const updatedIndexTokenCountMap: Record<number, number> = {};\n  // Keep track of the mapping from original payload indices to result indices\n  const indexMapping: Record<number, number[] | undefined> = {};\n\n  /**\n   * Create a mutable copy of the tools set that can be expanded dynamically.\n   * When we encounter tool_search results, we add discovered tools to this set,\n   * making their subsequent tool calls valid.\n   */\n  const discoveredTools = tools ? new Set(tools) : undefined;\n\n  // Process messages with tool conversion if tools set is provided\n  for (let i = 0; i < payload.length; i++) {\n    const message = payload[i];\n    // Q: Store the current length of messages to track where this payload message starts in the result?\n    // const startIndex = messages.length;\n    if (typeof message.content === 'string') {\n      message.content = [\n        { type: ContentTypes.TEXT, [ContentTypes.TEXT]: message.content },\n      ];\n    }\n    if (message.role !== 'assistant') {\n      messages.push(\n        formatMessage({\n          message: message as MessageInput,\n          langChain: true,\n        }) as HumanMessage | AIMessage | SystemMessage\n      );\n\n      // Update the index mapping for this message\n      indexMapping[i] = [messages.length - 1];\n      continue;\n    }\n\n    // For assistant messages, track the starting index before processing\n    const startMessageIndex = messages.length;\n\n    /**\n     * If tools set is provided, process tool_calls:\n     * - Keep valid tool_calls (tools in the set or dynamically discovered)\n     * - Convert invalid tool_calls to string representation for context preservation\n     * - Dynamically expand the set when tool_search results are encountered\n     */\n    let processedMessage = message;\n    let pendingSkillNames: Set<string> | undefined;\n    if (discoveredTools) {\n      const content = message.content;\n      if (content && Array.isArray(content)) {\n        const filteredContent: typeof content = [];\n        const invalidToolCallIds = new Set<string>();\n        const invalidToolStrings: string[] = [];\n\n        for (const part of content) {\n          if (part.type !== ContentTypes.TOOL_CALL) {\n            filteredContent.push(part);\n            continue;\n          }\n\n          /** Skip malformed tool_call entries */\n          if (\n            part.tool_call == null ||\n            part.tool_call.name == null ||\n            part.tool_call.name === ''\n          ) {\n            if (\n              typeof part.tool_call?.id === 'string' &&\n              part.tool_call.id !== ''\n            ) {\n              invalidToolCallIds.add(part.tool_call.id);\n            }\n            continue;\n          }\n\n          const toolName = part.tool_call.name;\n\n          /**\n           * If this is a tool_search result with output, extract discovered tool names\n           * and add them to the discoveredTools set for subsequent validation.\n           */\n          if (\n            toolName === Constants.TOOL_SEARCH &&\n            typeof part.tool_call.output === 'string' &&\n            part.tool_call.output !== ''\n          ) {\n            const extracted = extractToolNamesFromSearchOutput(\n              part.tool_call.output\n            );\n            for (const name of extracted) {\n              discoveredTools.add(name);\n            }\n          }\n\n          if (discoveredTools.has(toolName)) {\n            /** Valid tool - keep it */\n            filteredContent.push(part);\n            // Skill body reconstruction (upstream PRs #96/#97): when a\n            // SkillTool tool_call is present in this assistant turn, mark\n            // the skill name so we can reconstruct the body HumanMessage\n            // after the assistant turn has been pushed.\n            if (toolName === Constants.SKILL_TOOL && skills?.size) {\n              const skillName = extractSkillName(part.tool_call.args);\n              if (skillName) {\n                (pendingSkillNames ??= new Set()).add(skillName);\n              }\n            }\n          } else {\n            /** Invalid tool - convert to string for context preservation */\n            if (\n              typeof part.tool_call.id === 'string' &&\n              part.tool_call.id !== ''\n            ) {\n              invalidToolCallIds.add(part.tool_call.id);\n            }\n            const output = part.tool_call.output ?? '';\n            invalidToolStrings.push(`Tool: ${toolName}, ${output}`);\n          }\n        }\n\n        /** Remove tool_call_ids references to invalid tools from text parts */\n        if (invalidToolCallIds.size > 0) {\n          for (const part of filteredContent) {\n            if (\n              part.type === ContentTypes.TEXT &&\n              Array.isArray(part.tool_call_ids)\n            ) {\n              part.tool_call_ids = part.tool_call_ids.filter(\n                (id: string) => !invalidToolCallIds.has(id)\n              );\n              if (part.tool_call_ids.length === 0) {\n                delete part.tool_call_ids;\n              }\n            }\n          }\n        }\n\n        /** Append invalid tool strings to the content for context preservation */\n        if (invalidToolStrings.length > 0) {\n          /** Find the last text part or create one */\n          let lastTextPartIndex = -1;\n          for (let j = filteredContent.length - 1; j >= 0; j--) {\n            if (filteredContent[j].type === ContentTypes.TEXT) {\n              lastTextPartIndex = j;\n              break;\n            }\n          }\n\n          const invalidToolText = invalidToolStrings.join('\\n');\n          if (lastTextPartIndex >= 0) {\n            const lastTextPart = filteredContent[lastTextPartIndex] as {\n              type: string;\n              [ContentTypes.TEXT]?: string;\n              text?: string;\n            };\n            const existingText =\n              lastTextPart[ContentTypes.TEXT] ?? lastTextPart.text ?? '';\n            filteredContent[lastTextPartIndex] = {\n              ...lastTextPart,\n              [ContentTypes.TEXT]: existingText\n                ? `${existingText}\\n${invalidToolText}`\n                : invalidToolText,\n            };\n          } else {\n            /** No text part exists, create one */\n            filteredContent.push({\n              type: ContentTypes.TEXT,\n              [ContentTypes.TEXT]: invalidToolText,\n            });\n          }\n        }\n\n        /** Use filtered content if we made any changes */\n        if (\n          filteredContent.length !== content.length ||\n          invalidToolStrings.length > 0\n        ) {\n          processedMessage = { ...message, content: filteredContent };\n        }\n      }\n    }\n\n    // When tools filtering is off, still detect skill tool_calls for body reconstruction.\n    if (!discoveredTools && skills?.size) {\n      const content = processedMessage.content;\n      if (Array.isArray(content)) {\n        for (const part of content) {\n          if (\n            part.type !== ContentTypes.TOOL_CALL ||\n            part.tool_call?.name !== Constants.SKILL_TOOL\n          ) {\n            continue;\n          }\n          const skillName = extractSkillName(part.tool_call.args);\n          if (skillName) {\n            (pendingSkillNames ??= new Set()).add(skillName);\n          }\n        }\n      }\n    }\n\n    // Process the assistant message using the helper function\n    const formattedMessages = formatAssistantMessage(processedMessage);\n    messages.push(...formattedMessages);\n\n    // Capture index range BEFORE skill body injection so injected\n    // HumanMessages are excluded from the assistant's token distribution\n    // (upstream PR #97 fix).\n    const endMessageIndex = messages.length;\n\n    if (pendingSkillNames?.size) {\n      for (const skillName of pendingSkillNames) {\n        const body = skills?.get(skillName);\n        if (body) {\n          messages.push(\n            new HumanMessage({\n              content: body,\n              additional_kwargs: {\n                role: 'user',\n                isMeta: true,\n                source: 'skill',\n                skillName,\n              },\n            })\n          );\n        }\n      }\n    }\n\n    const resultIndices = [];\n    for (let j = startMessageIndex; j < endMessageIndex; j++) {\n      resultIndices.push(j);\n    }\n    indexMapping[i] = resultIndices;\n  }\n\n  if (indexTokenCountMap) {\n    for (\n      let originalIndex = 0;\n      originalIndex < payload.length;\n      originalIndex++\n    ) {\n      const resultIndices = indexMapping[originalIndex] || [];\n      const tokenCount = indexTokenCountMap[originalIndex];\n\n      if (tokenCount === undefined) {\n        continue;\n      }\n\n      const msgCount = resultIndices.length;\n      if (msgCount === 1) {\n        updatedIndexTokenCountMap[resultIndices[0]] = tokenCount;\n        continue;\n      }\n\n      if (msgCount < 2) {\n        continue;\n      }\n\n      let totalLength = 0;\n      const lastIdx = msgCount - 1;\n      const lengths = new Array<number>(msgCount);\n      for (let k = 0; k < msgCount; k++) {\n        const msg = messages[resultIndices[k]];\n        const { content } = msg;\n        let len = 0;\n        if (typeof content === 'string') {\n          len = content.length;\n        } else if (Array.isArray(content)) {\n          for (const part of content as Array<\n            Record<string, unknown> | string | undefined\n          >) {\n            if (typeof part === 'string') {\n              len += part.length;\n            } else if (part != null && typeof part === 'object') {\n              const val = part.text ?? part.content;\n              if (typeof val === 'string') {\n                len += val.length;\n              }\n            }\n          }\n        }\n        const toolCalls = (msg as AIMessage).tool_calls;\n        if (Array.isArray(toolCalls)) {\n          for (const tc of toolCalls as Array<Record<string, unknown>>) {\n            if (typeof tc.name === 'string') {\n              len += tc.name.length;\n            }\n            const { args } = tc;\n            if (typeof args === 'string') {\n              len += args.length;\n            } else if (args != null) {\n              len += JSON.stringify(args).length;\n            }\n          }\n        }\n        lengths[k] = len;\n        totalLength += len;\n      }\n\n      if (totalLength === 0) {\n        const countPerMessage = Math.floor(tokenCount / msgCount);\n        for (let k = 0; k < lastIdx; k++) {\n          updatedIndexTokenCountMap[resultIndices[k]] = countPerMessage;\n        }\n        updatedIndexTokenCountMap[resultIndices[lastIdx]] =\n          tokenCount - countPerMessage * lastIdx;\n      } else {\n        let distributed = 0;\n        for (let k = 0; k < lastIdx; k++) {\n          const share = Math.floor((lengths[k] / totalLength) * tokenCount);\n          updatedIndexTokenCountMap[resultIndices[k]] = share;\n          distributed += share;\n        }\n        updatedIndexTokenCountMap[resultIndices[lastIdx]] =\n          tokenCount - distributed;\n      }\n    }\n  }\n\n  return {\n    messages,\n    indexTokenCountMap: indexTokenCountMap\n      ? updatedIndexTokenCountMap\n      : undefined,\n  };\n};\n\n/**\n * Adds a value at key 0 for system messages and shifts all key indices by one in an indexTokenCountMap.\n * This is useful when adding a system message at the beginning of a conversation.\n *\n * @param indexTokenCountMap - The original map of message indices to token counts\n * @param instructionsTokenCount - The token count for the system message to add at index 0\n * @returns A new map with the system message at index 0 and all other indices shifted by 1\n */\nexport function shiftIndexTokenCountMap(\n  indexTokenCountMap: Record<number, number>,\n  instructionsTokenCount: number\n): Record<number, number> {\n  // Create a new map to avoid modifying the original\n  const shiftedMap: Record<number, number> = {};\n  shiftedMap[0] = instructionsTokenCount;\n\n  // Shift all existing indices by 1\n  for (const [indexStr, tokenCount] of Object.entries(indexTokenCountMap)) {\n    const index = Number(indexStr);\n    shiftedMap[index + 1] = tokenCount;\n  }\n\n  return shiftedMap;\n}\n\n/** Block types that contain binary image data and must be preserved structurally. */\nconst IMAGE_BLOCK_TYPES = new Set(['image_url', 'image']);\n\n/** Checks whether a BaseMessage is a tool-role message. */\nconst isToolMessage = (m: BaseMessage): boolean =>\n  m instanceof ToolMessage || ('role' in m && (m as any).role === 'tool');\n\n/** Flushes accumulated text chunks into `parts` as a single text block. */\nfunction flushTextChunks(\n  textChunks: string[],\n  parts: MessageContentComplex[]\n): void {\n  if (textChunks.length === 0) {\n    return;\n  }\n  parts.push({\n    type: ContentTypes.TEXT,\n    text: textChunks.join('\\n'),\n  } as MessageContentComplex);\n  textChunks.length = 0;\n}\n\n/**\n * Appends a single message's content to the running `textChunks` / `parts`\n * accumulators.  Image blocks are shallow-copied into `parts` as-is so that\n * binary data (base64 images) never becomes text tokens.  All other block\n * types are serialized to text — unrecognized types are JSON-serialized\n * rather than silently dropped.\n *\n * When `content` is an array containing tool_use blocks, `tool_calls` is NOT\n * additionally serialized (avoiding double output).  `tool_calls` is used as\n * a fallback when `content` is a plain string or an array with no tool_use.\n */\nfunction appendMessageContent(\n  msg: BaseMessage,\n  role: string,\n  textChunks: string[],\n  parts: MessageContentComplex[]\n): void {\n  const { content } = msg;\n\n  if (typeof content === 'string') {\n    if (content) {\n      textChunks.push(`${role}: ${content}`);\n    }\n    appendToolCalls(msg, role, textChunks);\n    return;\n  }\n\n  if (!Array.isArray(content)) {\n    appendToolCalls(msg, role, textChunks);\n    return;\n  }\n\n  let hasToolUseBlock = false;\n\n  for (const block of content as ExtendedMessageContent[]) {\n    if (IMAGE_BLOCK_TYPES.has(block.type ?? '')) {\n      flushTextChunks(textChunks, parts);\n      parts.push({ ...block } as MessageContentComplex);\n      continue;\n    }\n\n    if (block.type === 'tool_use') {\n      hasToolUseBlock = true;\n      textChunks.push(\n        `${role}: [tool_use] ${String(block.name ?? '')} ${JSON.stringify(block.input ?? {})}`\n      );\n      continue;\n    }\n\n    const text = block.text ?? block.input;\n    if (typeof text === 'string' && text) {\n      textChunks.push(`${role}: ${text}`);\n      continue;\n    }\n\n    // Fallback: serialize unrecognized block types to preserve context\n    if (block.type != null && block.type !== '') {\n      textChunks.push(`${role}: [${block.type}] ${JSON.stringify(block)}`);\n    }\n  }\n\n  // If content array had no tool_use blocks, fall back to tool_calls metadata\n  // (handles edge case: empty content array with tool_calls populated)\n  if (!hasToolUseBlock) {\n    appendToolCalls(msg, role, textChunks);\n  }\n}\n\nfunction appendToolCalls(\n  msg: BaseMessage,\n  role: string,\n  textChunks: string[]\n): void {\n  if (role !== 'AI') {\n    return;\n  }\n  const aiMsg = msg as AIMessage;\n  if (!aiMsg.tool_calls || aiMsg.tool_calls.length === 0) {\n    return;\n  }\n  for (const tc of aiMsg.tool_calls) {\n    textChunks.push(`AI: [tool_call] ${tc.name}(${JSON.stringify(tc.args)})`);\n  }\n}\n\n/**\n * Ensures compatibility when switching from a non-thinking agent to a thinking-enabled agent.\n * Converts AI messages with tool calls (that lack thinking/reasoning blocks) into buffer strings,\n * avoiding the thinking block signature requirement.\n *\n * Recognizes the following as valid thinking/reasoning blocks:\n * - ContentTypes.THINKING (Anthropic)\n * - ContentTypes.REASONING_CONTENT (Bedrock)\n * - ContentTypes.REASONING (VertexAI / Google)\n * - 'redacted_thinking'\n *\n * @param messages - Array of messages to process\n * @param provider - The provider being used (unused but kept for future compatibility)\n * @returns The messages array with tool sequences converted to buffer strings if necessary\n */\nexport function ensureThinkingBlockInMessages(\n  messages: BaseMessage[],\n  _provider: Providers\n): BaseMessage[] {\n  if (messages.length === 0) {\n    return messages;\n  }\n\n  // If the last message is already a HumanMessage, there is no trailing tool\n  // sequence to convert — return early to preserve prompt caching and avoid\n  // redundant token overhead from re-processing the entire history.\n  const lastMsg = messages[messages.length - 1];\n  const lastIsHuman =\n    lastMsg instanceof HumanMessage ||\n    ('role' in lastMsg && (lastMsg as any).role === 'user');\n  if (lastIsHuman) {\n    return messages;\n  }\n\n  const result: BaseMessage[] = [];\n  let i = 0;\n\n  while (i < messages.length) {\n    const msg = messages[i];\n    /** Detect AI messages by instanceof OR by role, in case cache-control cloning\n     produced a plain object that lost the LangChain prototype. */\n    const isAI =\n      msg instanceof AIMessage ||\n      msg instanceof AIMessageChunk ||\n      ('role' in msg && (msg as any).role === 'assistant');\n\n    if (!isAI) {\n      result.push(msg);\n      i++;\n      continue;\n    }\n\n    const aiMsg = msg as AIMessage | AIMessageChunk;\n    const hasToolCalls = aiMsg.tool_calls && aiMsg.tool_calls.length > 0;\n    const contentIsArray = Array.isArray(aiMsg.content);\n\n    // Check if the message has tool calls or tool_use content\n    let hasToolUse = hasToolCalls ?? false;\n    let hasThinkingBlock = false;\n\n    if (contentIsArray && aiMsg.content.length > 0) {\n      for (const c of aiMsg.content as ExtendedMessageContent[]) {\n        if (typeof c !== 'object') {\n          continue;\n        }\n        if (c.type === 'tool_use') {\n          hasToolUse = true;\n        } else if (\n          c.type === ContentTypes.THINKING ||\n          c.type === ContentTypes.REASONING_CONTENT ||\n          c.type === ContentTypes.REASONING ||\n          c.type === 'redacted_thinking'\n        ) {\n          hasThinkingBlock = true;\n        }\n        if (hasToolUse && hasThinkingBlock) {\n          break;\n        }\n      }\n    }\n\n    // Bedrock also stores reasoning in additional_kwargs (may not be in content array)\n    if (\n      !hasThinkingBlock &&\n      aiMsg.additional_kwargs.reasoning_content != null\n    ) {\n      hasThinkingBlock = true;\n    }\n\n    // If message has tool use but no thinking block, check whether this is a\n    // continuation of a thinking-enabled agent's chain before converting.\n    // Bedrock reasoning models can produce multiple AI→Tool rounds after an\n    // initial reasoning response: the first AI message has reasoning_content,\n    // but follow-ups have content: \"\" with only tool_calls. These are the\n    // same agent's turn and must NOT be converted to HumanMessages.\n    if (hasToolUse && !hasThinkingBlock) {\n      // Walk backwards — if an earlier AI message in the same chain (before\n      // the nearest HumanMessage) has a thinking/reasoning block, this is a\n      // continuation of a thinking-enabled turn, not a non-thinking handoff.\n      if (chainHasThinkingBlock(messages, i)) {\n        result.push(msg);\n        i++;\n        continue;\n      }\n\n      // Build structured content in a single pass over the AI + following\n      // ToolMessages — preserves image blocks as-is to avoid serializing\n      // binary data as text (which caused 174× token amplification).\n      const parts: MessageContentComplex[] = [];\n      const textChunks: string[] = ['[Previous agent context]'];\n\n      appendMessageContent(msg, 'AI', textChunks, parts);\n\n      let j = i + 1;\n      while (j < messages.length && isToolMessage(messages[j])) {\n        appendMessageContent(messages[j], 'Tool', textChunks, parts);\n        j++;\n      }\n\n      flushTextChunks(textChunks, parts);\n      result.push(new HumanMessage({ content: parts }));\n      i = j;\n    } else {\n      // Keep the message as is\n      result.push(msg);\n      i++;\n    }\n  }\n\n  return result;\n}\n\n/**\n * Walks backwards from `currentIndex` through the message array to check\n * whether an earlier AI message in the same \"chain\" (no HumanMessage boundary)\n * contains a thinking/reasoning block.\n *\n * A \"chain\" is a contiguous sequence of AI + Tool messages with no intervening\n * HumanMessage. Bedrock reasoning models produce reasoning on the first AI\n * response, then issue follow-up tool calls with `content: \"\"` and no\n * reasoning block. These follow-ups are part of the same thinking-enabled\n * turn and should not be converted.\n */\nfunction chainHasThinkingBlock(\n  messages: BaseMessage[],\n  currentIndex: number\n): boolean {\n  for (let k = currentIndex - 1; k >= 0; k--) {\n    const prev = messages[k];\n\n    // HumanMessage = turn boundary — stop searching\n    if (\n      prev instanceof HumanMessage ||\n      ('role' in prev && (prev as any).role === 'user')\n    ) {\n      return false;\n    }\n\n    // Check AI messages for thinking/reasoning blocks\n    const isPrevAI =\n      prev instanceof AIMessage ||\n      prev instanceof AIMessageChunk ||\n      ('role' in prev && (prev as any).role === 'assistant');\n\n    if (isPrevAI) {\n      const prevAiMsg = prev as AIMessage | AIMessageChunk;\n\n      if (Array.isArray(prevAiMsg.content) && prevAiMsg.content.length > 0) {\n        const content = prevAiMsg.content as ExtendedMessageContent[];\n        if (\n          content.some(\n            (c) =>\n              typeof c === 'object' &&\n              (c.type === ContentTypes.THINKING ||\n                c.type === ContentTypes.REASONING_CONTENT ||\n                c.type === ContentTypes.REASONING ||\n                c.type === 'redacted_thinking')\n          )\n        ) {\n          return true;\n        }\n      }\n\n      // Bedrock also stores reasoning in additional_kwargs\n      if (prevAiMsg.additional_kwargs.reasoning_content != null) {\n        return true;\n      }\n    }\n\n    // ToolMessages are part of the chain — keep walking back\n  }\n\n  return false;\n}\n"],"names":["Providers","ContentTypes","HumanMessage","AIMessage","SystemMessage","processToolOutput","ToolMessage","messages","Constants","AIMessageChunk"],"mappings":"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"}