{"version":3,"file":"tools.mjs","sources":["../../../src/messages/tools.ts"],"sourcesContent":["// src/messages/toolDiscovery.ts\nimport { AIMessageChunk, ToolMessage } from '@langchain/core/messages';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport { Constants, MessageTypes } from '@/common';\nimport { findLastIndex } from './core';\n\ntype ToolSearchArtifact = {\n  tool_references?: Array<{ tool_name: string }>;\n};\n\n/**\n * Extracts discovered tool names from tool search results in the current turn.\n * Only processes tool search messages after the latest AI message with tool calls.\n *\n * Similar pattern to formatArtifactPayload - finds relevant messages efficiently\n * by identifying the latest AI parent and only processing subsequent tool messages.\n *\n * @param messages - All messages in the conversation\n * @returns Array of discovered tool names (empty if no new discoveries)\n */\nexport function extractToolDiscoveries(messages: BaseMessage[]): string[] {\n  if (messages.length === 0) return [];\n  const lastMessage = messages[messages.length - 1];\n  // Use getType() instead of instanceof to avoid module mismatch issues\n  if (lastMessage.getType() !== MessageTypes.TOOL) return [];\n  const lastToolMessage = lastMessage as ToolMessage;\n\n  // Find the latest AIMessage with tool_calls that this tool message belongs to\n  const latestAIParentIndex = findLastIndex(\n    messages,\n    (msg) =>\n      (msg instanceof AIMessageChunk &&\n        (msg.tool_calls?.length ?? 0) > 0 &&\n        msg.tool_calls?.some((tc) => tc.id === lastToolMessage.tool_call_id)) ??\n      false\n  );\n\n  if (latestAIParentIndex === -1) return [];\n\n  // Collect tool_call_ids from the AI message\n  const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n  const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n  // Only process tool search results after the AI message that belong to this turn\n  const discoveredNames: string[] = [];\n  for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n    const msg = messages[i];\n    // Use getType() instead of instanceof to avoid module mismatch issues\n    if (msg.getType() !== MessageTypes.TOOL) continue;\n    const toolMsg = msg as ToolMessage;\n    if (toolMsg.name !== Constants.TOOL_SEARCH) continue;\n    if (!toolCallIds.has(toolMsg.tool_call_id)) continue;\n\n    // This is a tool search result from the current turn\n    if (typeof toolMsg.artifact === 'object' && toolMsg.artifact != null) {\n      const artifact = toolMsg.artifact as ToolSearchArtifact;\n      if (artifact.tool_references && artifact.tool_references.length > 0) {\n        for (const ref of artifact.tool_references) {\n          discoveredNames.push(ref.tool_name);\n        }\n      }\n    }\n  }\n\n  return discoveredNames;\n}\n\n/**\n * Checks if the current turn has any tool search results.\n * Quick check to avoid full extraction when not needed.\n */\nexport function hasToolSearchInCurrentTurn(messages: BaseMessage[]): boolean {\n  if (messages.length === 0) return false;\n  const lastMessage = messages[messages.length - 1];\n  // Use getType() instead of instanceof to avoid module mismatch issues\n  if (lastMessage.getType() !== MessageTypes.TOOL) return false;\n  const lastToolMessage = lastMessage as ToolMessage;\n\n  // Find the latest AIMessage with tool_calls\n  const latestAIParentIndex = findLastIndex(\n    messages,\n    (msg) =>\n      (msg instanceof AIMessageChunk &&\n        (msg.tool_calls?.length ?? 0) > 0 &&\n        msg.tool_calls?.some((tc) => tc.id === lastToolMessage.tool_call_id)) ??\n      false\n  );\n\n  if (latestAIParentIndex === -1) return false;\n\n  const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n  const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n  // Check if any tool search results exist after the AI message\n  // Use getType() instead of instanceof to avoid module mismatch issues\n  for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n    const msg = messages[i];\n    if (\n      msg.getType() === MessageTypes.TOOL &&\n      (msg as ToolMessage).name === Constants.TOOL_SEARCH &&\n      toolCallIds.has((msg as ToolMessage).tool_call_id)\n    ) {\n      return true;\n    }\n  }\n\n  return false;\n}\n"],"names":[],"mappings":"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"}