{"version":3,"file":"prune.mjs","sources":["../../../src/messages/prune.ts"],"sourcesContent":["import {\n  AIMessage,\n  BaseMessage,\n  ToolMessage,\n  UsageMetadata,\n} from '@langchain/core/messages';\nimport type {\n  ThinkingContentText,\n  MessageContentComplex,\n  ReasoningContentText,\n} from '@/types/stream';\nimport type { TokenCounter } from '@/types/run';\nimport { ContentTypes, Constants, Providers } from '@/common';\nimport type { ContextPruningConfig } from '@/types/graph';\nimport {\n  calculateMaxToolResultChars,\n  truncateToolResultContent,\n  truncateToolInput,\n} from '@/utils/truncation';\nimport { applyContextPruning } from './contextPruning';\n\nexport type PruneMessagesFactoryParams = {\n  provider?: Providers;\n  maxTokens: number;\n  startIndex: number;\n  tokenCounter: TokenCounter;\n  indexTokenCountMap: Record<string, number | undefined>;\n  thinkingEnabled?: boolean;\n  /**\n   * Optional position-based content degradation config. When `enabled: true`,\n   * tool result messages outside the protected zone (system + last N assistant\n   * turns + image content) are soft-trimmed (head + tail) once their\n   * position-age exceeds `softTrimRatio`, then hard-cleared with a placeholder\n   * once age exceeds `hardClearRatio`. Defaults disabled to preserve existing\n   * behavior — opt in per deployment.\n   */\n  contextPruningConfig?: ContextPruningConfig;\n};\nexport type PruneMessagesParams = {\n  messages: BaseMessage[];\n  usageMetadata?: Partial<UsageMetadata>;\n  startType?: ReturnType<BaseMessage['getType']>;\n};\n\nfunction isIndexInContext(\n  arrayA: unknown[],\n  arrayB: unknown[],\n  targetIndex: number\n): boolean {\n  const startingIndexInA = arrayA.length - arrayB.length;\n  return targetIndex >= startingIndexInA;\n}\n\nfunction addThinkingBlock(\n  message: AIMessage,\n  thinkingBlock: ThinkingContentText | ReasoningContentText\n): AIMessage {\n  const content: MessageContentComplex[] = Array.isArray(message.content)\n    ? (message.content as MessageContentComplex[])\n    : [\n        {\n          type: ContentTypes.TEXT,\n          text: message.content,\n        },\n      ];\n  /** Edge case, the message already has the thinking block */\n  if (content[0].type === thinkingBlock.type) {\n    return message;\n  }\n  content.unshift(thinkingBlock);\n  return new AIMessage({\n    ...message,\n    content,\n  });\n}\n\n/**\n * Calculates the total tokens from a single usage object\n *\n * @param usage The usage metadata object containing token information\n * @returns An object containing the total input and output tokens\n */\nexport function calculateTotalTokens(\n  usage: Partial<UsageMetadata>\n): UsageMetadata {\n  const baseInputTokens = Number(usage.input_tokens) || 0;\n  const cacheCreation = Number(usage.input_token_details?.cache_creation) || 0;\n  const cacheRead = Number(usage.input_token_details?.cache_read) || 0;\n\n  const totalInputTokens = baseInputTokens + cacheCreation + cacheRead;\n  const totalOutputTokens = Number(usage.output_tokens) || 0;\n\n  return {\n    input_tokens: totalInputTokens,\n    output_tokens: totalOutputTokens,\n    total_tokens: totalInputTokens + totalOutputTokens,\n  };\n}\n\nexport type PruningResult = {\n  context: BaseMessage[];\n  remainingContextTokens: number;\n  messagesToRefine: BaseMessage[];\n  thinkingStartIndex?: number;\n};\n\n/**\n * Processes an array of messages and returns a context of messages that fit within a specified token limit.\n * It iterates over the messages from newest to oldest, adding them to the context until the token limit is reached.\n *\n * @param options Configuration options for processing messages\n * @returns Object containing the message context, remaining tokens, messages not included, and summary index\n */\n/**\n * Builds an emergency context from first and last message pairs when normal pruning\n * removes all AI messages. Preserves conversation continuity by keeping boundaries.\n */\nfunction buildEmergencyContext(\n  messages: BaseMessage[],\n  endIndex: number\n): BaseMessage[] {\n  const result: BaseMessage[] = [];\n  const instructions = endIndex > 0 ? messages[0] : undefined;\n  if (instructions) {\n    result.push(instructions);\n  }\n\n  /** Find first user+AI pair after system message */\n  for (let i = endIndex; i < messages.length - 1; i++) {\n    const current = messages[i];\n    const next = messages[i + 1];\n    if (current.getType() === 'human' && next.getType() === 'ai') {\n      result.push(current, next);\n      break;\n    }\n  }\n\n  /** Find last user+AI pair */\n  for (let i = messages.length - 1; i > endIndex; i--) {\n    const current = messages[i];\n    const prev = messages[i - 1];\n    if (current.getType() === 'ai' && prev.getType() === 'human') {\n      if (!result.includes(prev)) {\n        result.push(prev, current);\n      }\n      break;\n    }\n  }\n\n  return result;\n}\n\nexport function getMessagesWithinTokenLimit({\n  messages: _messages,\n  maxContextTokens,\n  indexTokenCountMap,\n  startType: _startType,\n  thinkingEnabled,\n  tokenCounter,\n  thinkingStartIndex: _thinkingStartIndex = -1,\n  reasoningType = ContentTypes.THINKING,\n  instructionTokens: _instructionTokens = 0,\n}: {\n  messages: BaseMessage[];\n  maxContextTokens: number;\n  indexTokenCountMap: Record<string, number | undefined>;\n  startType?: string | string[];\n  thinkingEnabled?: boolean;\n  tokenCounter: TokenCounter;\n  thinkingStartIndex?: number;\n  reasoningType?: ContentTypes.THINKING | ContentTypes.REASONING_CONTENT;\n  /**\n   * Token overhead for instructions (system message + tool schemas + summary)\n   * that are NOT included in `messages`. When messages[0] is already a\n   * SystemMessage the budget is deducted from its indexTokenCountMap entry\n   * as before; otherwise this value is subtracted from the available budget.\n   */\n  instructionTokens?: number;\n}): PruningResult {\n  // Every reply is primed with <|start|>assistant<|message|>, so we\n  // start with 3 tokens for the label after all messages have been counted.\n  let currentTokenCount = 3;\n  const instructions =\n    _messages[0]?.getType() === 'system' ? _messages[0] : undefined;\n  const instructionsTokenCount =\n    instructions != null ? (indexTokenCountMap[0] ?? 0) : _instructionTokens;\n  const initialContextTokens = maxContextTokens - instructionsTokenCount;\n  let remainingContextTokens = initialContextTokens;\n  let startType = _startType;\n  const originalLength = _messages.length;\n  const messages = [..._messages];\n  /**\n   * IMPORTANT: this context array gets reversed at the end, since the latest messages get pushed first.\n   *\n   * This may be confusing to read, but it is done to ensure the context is in the correct order for the model.\n   * */\n  let context: Array<BaseMessage | undefined> = [];\n\n  let thinkingStartIndex = _thinkingStartIndex;\n  let thinkingEndIndex = -1;\n  let thinkingBlock: ThinkingContentText | ReasoningContentText | undefined;\n  const endIndex = instructions != null ? 1 : 0;\n  const prunedMemory: BaseMessage[] = [];\n\n  if (_thinkingStartIndex > -1) {\n    const thinkingMessageContent = messages[_thinkingStartIndex]?.content;\n    if (Array.isArray(thinkingMessageContent)) {\n      thinkingBlock = thinkingMessageContent.find(\n        (content) => content.type === reasoningType\n      ) as ThinkingContentText | undefined;\n    }\n  }\n\n  if (currentTokenCount < remainingContextTokens) {\n    let currentIndex = messages.length;\n    while (\n      messages.length > 0 &&\n      currentTokenCount < remainingContextTokens &&\n      currentIndex > endIndex\n    ) {\n      currentIndex--;\n      if (messages.length === 1 && instructions) {\n        break;\n      }\n      const poppedMessage = messages.pop();\n      if (!poppedMessage) continue;\n      const messageType = poppedMessage.getType();\n      if (\n        thinkingEnabled === true &&\n        thinkingEndIndex === -1 &&\n        currentIndex === originalLength - 1 &&\n        (messageType === 'ai' || messageType === 'tool')\n      ) {\n        thinkingEndIndex = currentIndex;\n      }\n      if (\n        thinkingEndIndex > -1 &&\n        !thinkingBlock &&\n        thinkingStartIndex < 0 &&\n        messageType === 'ai' &&\n        Array.isArray(poppedMessage.content)\n      ) {\n        thinkingBlock = poppedMessage.content.find(\n          (content) => content.type === reasoningType\n        ) as ThinkingContentText | undefined;\n        thinkingStartIndex = thinkingBlock != null ? currentIndex : -1;\n      }\n      /** False start, the latest message was not part of a multi-assistant/tool sequence of messages */\n      if (\n        thinkingEndIndex > -1 &&\n        currentIndex === thinkingEndIndex - 1 &&\n        messageType !== 'ai' &&\n        messageType !== 'tool'\n      ) {\n        thinkingEndIndex = -1;\n      }\n\n      const tokenCount = indexTokenCountMap[currentIndex] ?? 0;\n\n      if (\n        prunedMemory.length === 0 &&\n        currentTokenCount + tokenCount <= remainingContextTokens\n      ) {\n        context.push(poppedMessage);\n        currentTokenCount += tokenCount;\n      } else {\n        prunedMemory.push(poppedMessage);\n        if (thinkingEndIndex > -1 && thinkingStartIndex < 0) {\n          continue;\n        }\n        break;\n      }\n    }\n\n    if (context[context.length - 1]?.getType() === 'tool') {\n      startType = ['ai', 'human'];\n    }\n\n    if (startType != null && startType.length > 0 && context.length > 0) {\n      let requiredTypeIndex = -1;\n\n      let totalTokens = 0;\n      for (let i = context.length - 1; i >= 0; i--) {\n        const currentType = context[i]?.getType() ?? '';\n        if (\n          Array.isArray(startType)\n            ? startType.includes(currentType)\n            : currentType === startType\n        ) {\n          requiredTypeIndex = i + 1;\n          break;\n        }\n        const originalIndex = originalLength - 1 - i;\n        totalTokens += indexTokenCountMap[originalIndex] ?? 0;\n      }\n\n      if (requiredTypeIndex > 0) {\n        currentTokenCount -= totalTokens;\n        context = context.slice(0, requiredTypeIndex);\n      }\n    }\n  }\n\n  if (instructions && originalLength > 0) {\n    context.push(_messages[0] as BaseMessage);\n    messages.shift();\n  }\n\n  remainingContextTokens -= currentTokenCount;\n  const result: PruningResult = {\n    remainingContextTokens,\n    context: [] as BaseMessage[],\n    messagesToRefine: prunedMemory,\n  };\n\n  if (thinkingStartIndex > -1) {\n    result.thinkingStartIndex = thinkingStartIndex;\n  }\n\n  if (\n    prunedMemory.length === 0 ||\n    thinkingEndIndex < 0 ||\n    (thinkingStartIndex > -1 &&\n      isIndexInContext(_messages, context, thinkingStartIndex))\n  ) {\n    // we reverse at this step to ensure the context is in the correct order for the model, and we need to work backwards\n    result.context = context.reverse() as BaseMessage[];\n    return result;\n  }\n\n  if (thinkingEndIndex > -1 && thinkingStartIndex < 0) {\n    throw new Error(\n      'The payload is malformed. There is a thinking sequence but no \"AI\" messages with thinking blocks.'\n    );\n  }\n\n  if (!thinkingBlock) {\n    throw new Error(\n      'The payload is malformed. There is a thinking sequence but no thinking block found.'\n    );\n  }\n\n  // Since we have a thinking sequence, we need to find the last assistant message\n  // in the latest AI/tool sequence to add the thinking block that falls outside of the current context\n  // Latest messages are ordered first.\n  let assistantIndex = -1;\n  for (let i = 0; i < context.length; i++) {\n    const currentMessage = context[i];\n    const type = currentMessage?.getType();\n    if (type === 'ai') {\n      assistantIndex = i;\n    }\n    if (assistantIndex > -1 && (type === 'human' || type === 'system')) {\n      break;\n    }\n  }\n\n  if (assistantIndex === -1) {\n    /** Emergency fallback: keep first and last message pairs instead of crashing */\n    const emergencyContext = buildEmergencyContext(_messages, endIndex);\n    return {\n      remainingContextTokens: 0,\n      context: emergencyContext,\n      messagesToRefine: _messages.filter((m) => !emergencyContext.includes(m)),\n    };\n  }\n\n  thinkingStartIndex = originalLength - 1 - assistantIndex;\n  const thinkingTokenCount = tokenCounter(\n    new AIMessage({ content: [thinkingBlock] })\n  );\n  const newRemainingCount = remainingContextTokens - thinkingTokenCount;\n  const newMessage = addThinkingBlock(\n    context[assistantIndex] as AIMessage,\n    thinkingBlock\n  );\n  context[assistantIndex] = newMessage;\n  if (newRemainingCount > 0) {\n    result.context = context.reverse() as BaseMessage[];\n    return result;\n  }\n\n  const thinkingMessage: AIMessage = context[assistantIndex] as AIMessage;\n  // now we need to an additional round of pruning but making the thinking block fit\n  const newThinkingMessageTokenCount =\n    (indexTokenCountMap[thinkingStartIndex] ?? 0) + thinkingTokenCount;\n  remainingContextTokens = initialContextTokens - newThinkingMessageTokenCount;\n  currentTokenCount = 3;\n  let newContext: BaseMessage[] = [];\n  const secondRoundMessages = [..._messages];\n  let currentIndex = secondRoundMessages.length;\n  while (\n    secondRoundMessages.length > 0 &&\n    currentTokenCount < remainingContextTokens &&\n    currentIndex > thinkingStartIndex\n  ) {\n    currentIndex--;\n    const poppedMessage = secondRoundMessages.pop();\n    if (!poppedMessage) continue;\n    const tokenCount = indexTokenCountMap[currentIndex] ?? 0;\n    if (currentTokenCount + tokenCount <= remainingContextTokens) {\n      newContext.push(poppedMessage);\n      currentTokenCount += tokenCount;\n    } else {\n      messages.push(poppedMessage);\n      break;\n    }\n  }\n\n  const firstMessage: AIMessage = newContext[newContext.length - 1];\n  const firstMessageType = newContext[newContext.length - 1].getType();\n  if (firstMessageType === 'tool') {\n    startType = ['ai', 'human'];\n  }\n\n  if (startType != null && startType.length > 0 && newContext.length > 0) {\n    let requiredTypeIndex = -1;\n\n    let totalTokens = 0;\n    for (let i = newContext.length - 1; i >= 0; i--) {\n      const currentType = newContext[i]?.getType() ?? '';\n      if (\n        Array.isArray(startType)\n          ? startType.includes(currentType)\n          : currentType === startType\n      ) {\n        requiredTypeIndex = i + 1;\n        break;\n      }\n      const originalIndex = originalLength - 1 - i;\n      totalTokens += indexTokenCountMap[originalIndex] ?? 0;\n    }\n\n    if (requiredTypeIndex > 0) {\n      currentTokenCount -= totalTokens;\n      newContext = newContext.slice(0, requiredTypeIndex);\n    }\n  }\n\n  if (firstMessageType === 'ai') {\n    const newMessage = addThinkingBlock(firstMessage, thinkingBlock);\n    newContext[newContext.length - 1] = newMessage;\n  } else {\n    newContext.push(thinkingMessage);\n  }\n\n  if (instructions && originalLength > 0) {\n    newContext.push(_messages[0] as BaseMessage);\n    secondRoundMessages.shift();\n  }\n\n  result.context = newContext.reverse();\n  return result;\n}\n\nexport function checkValidNumber(value: unknown): value is number {\n  return typeof value === 'number' && !isNaN(value) && value > 0;\n}\n\n/**\n * Returns the set of tool_call ids referenced by an AIMessage — both via the\n * canonical `tool_calls` array and via inline `tool_use` / `tool_call` content\n * blocks (Anthropic-style content arrays).\n */\nfunction getToolCallIds(message: BaseMessage): Set<string> {\n  if (message.getType() !== 'ai') {\n    return new Set<string>();\n  }\n\n  const ids = new Set<string>();\n  const aiMessage = message as AIMessage;\n  for (const toolCall of aiMessage.tool_calls ?? []) {\n    if (typeof toolCall.id === 'string' && toolCall.id.length > 0) {\n      ids.add(toolCall.id);\n    }\n  }\n\n  if (Array.isArray(aiMessage.content)) {\n    for (const part of aiMessage.content) {\n      if (typeof part !== 'object') {\n        continue;\n      }\n      const record = part as { type?: unknown; id?: unknown };\n      if (\n        (record.type === 'tool_use' || record.type === 'tool_call') &&\n        typeof record.id === 'string' &&\n        record.id.length > 0\n      ) {\n        ids.add(record.id);\n      }\n    }\n  }\n\n  return ids;\n}\n\nfunction getToolResultId(message: BaseMessage): string | null {\n  if (message.getType() !== 'tool') {\n    return null;\n  }\n  const toolMessage = message as ToolMessage & {\n    tool_call_id?: unknown;\n    toolCallId?: unknown;\n  };\n  if (\n    typeof toolMessage.tool_call_id === 'string' &&\n    toolMessage.tool_call_id.length > 0\n  ) {\n    return toolMessage.tool_call_id;\n  }\n  if (\n    typeof toolMessage.toolCallId === 'string' &&\n    toolMessage.toolCallId.length > 0\n  ) {\n    return toolMessage.toolCallId;\n  }\n  return null;\n}\n\nfunction resolveTokenCountForMessage({\n  message,\n  messageIndexMap,\n  tokenCounter,\n  indexTokenCountMap,\n}: {\n  message: BaseMessage;\n  messageIndexMap: Map<BaseMessage, number>;\n  tokenCounter: TokenCounter;\n  indexTokenCountMap: Record<string, number | undefined>;\n}): number {\n  const originalIndex = messageIndexMap.get(message) ?? -1;\n  if (originalIndex > -1 && indexTokenCountMap[originalIndex] != null) {\n    return indexTokenCountMap[originalIndex] as number;\n  }\n  return tokenCounter(message);\n}\n\n/**\n * Repairs orphan tool messages in a pruned context. Drops `ToolMessage`s whose\n * matching `AIMessage` was pruned, and strips orphan `tool_use` content blocks\n * (and `tool_calls` entries) from `AIMessage`s whose corresponding tool results\n * are missing. Without this, Anthropic / Bedrock / OpenAI reject the request\n * with a structural validation 400.\n *\n * Intended to run on the post-prune `context` array (not the pre-prune\n * `allMessages`). The dropped messages are returned so the caller can append\n * them to `messagesToRefine` for summarization fidelity.\n */\nexport function repairOrphanedToolMessages({\n  context,\n  allMessages,\n  tokenCounter,\n  indexTokenCountMap,\n}: {\n  context: BaseMessage[];\n  allMessages: BaseMessage[];\n  tokenCounter: TokenCounter;\n  indexTokenCountMap: Record<string, number | undefined>;\n}): {\n  context: BaseMessage[];\n  reclaimedTokens: number;\n  droppedOrphanCount: number;\n  /** Messages removed from context during orphan repair.  These should be\n   *  appended to `messagesToRefine` so that summarization can still see them\n   *  (e.g. a ToolMessage whose parent AI was pruned). */\n  droppedMessages: BaseMessage[];\n} {\n  const messageIndexMap = new Map<BaseMessage, number>();\n  for (let i = 0; i < allMessages.length; i++) {\n    messageIndexMap.set(allMessages[i], i);\n  }\n\n  const validToolCallIds = new Set<string>();\n  const presentToolResultIds = new Set<string>();\n  for (const message of context) {\n    for (const id of getToolCallIds(message)) {\n      validToolCallIds.add(id);\n    }\n    const resultId = getToolResultId(message);\n    if (resultId != null) {\n      presentToolResultIds.add(resultId);\n    }\n  }\n\n  let reclaimedTokens = 0;\n  let droppedOrphanCount = 0;\n  const repairedContext: BaseMessage[] = [];\n  const droppedMessages: BaseMessage[] = [];\n\n  for (const message of context) {\n    if (message.getType() === 'tool') {\n      const toolResultId = getToolResultId(message);\n      if (toolResultId == null || !validToolCallIds.has(toolResultId)) {\n        droppedOrphanCount += 1;\n        reclaimedTokens += resolveTokenCountForMessage({\n          message,\n          tokenCounter,\n          messageIndexMap,\n          indexTokenCountMap,\n        });\n        droppedMessages.push(message);\n        continue;\n      }\n      repairedContext.push(message);\n      continue;\n    }\n\n    if (message.getType() === 'ai' && message instanceof AIMessage) {\n      const toolCallIds = getToolCallIds(message);\n      if (toolCallIds.size > 0) {\n        let hasOrphanToolCalls = false;\n        for (const id of toolCallIds) {\n          if (!presentToolResultIds.has(id)) {\n            hasOrphanToolCalls = true;\n            break;\n          }\n        }\n        if (hasOrphanToolCalls) {\n          const originalTokens = resolveTokenCountForMessage({\n            message,\n            messageIndexMap,\n            tokenCounter,\n            indexTokenCountMap,\n          });\n          const stripped = stripOrphanToolUseBlocks(\n            message,\n            presentToolResultIds\n          );\n          if (stripped != null) {\n            const strippedTokens = tokenCounter(stripped);\n            reclaimedTokens += originalTokens - strippedTokens;\n            repairedContext.push(stripped);\n          } else {\n            droppedOrphanCount += 1;\n            reclaimedTokens += originalTokens;\n            droppedMessages.push(message);\n          }\n          continue;\n        }\n      }\n    }\n\n    repairedContext.push(message);\n  }\n\n  return {\n    context: repairedContext,\n    reclaimedTokens,\n    droppedOrphanCount,\n    droppedMessages,\n  };\n}\n\n/**\n * Strips tool_use content blocks and tool_calls entries from an AI message\n * when their corresponding ToolMessages are not in the context.\n * Returns null if the message has no content left after stripping.\n */\nfunction stripOrphanToolUseBlocks(\n  message: AIMessage,\n  presentToolResultIds: Set<string>\n): AIMessage | null {\n  const keptToolCalls = (message.tool_calls ?? []).filter(\n    (tc) => typeof tc.id === 'string' && presentToolResultIds.has(tc.id)\n  );\n\n  let keptContent: MessageContentComplex[] | string;\n  if (Array.isArray(message.content)) {\n    const filtered = (message.content as MessageContentComplex[]).filter(\n      (block) => {\n        if (typeof block !== 'object') {\n          return true;\n        }\n        const record = block as { type?: unknown; id?: unknown };\n        if (\n          (record.type === 'tool_use' || record.type === 'tool_call') &&\n          typeof record.id === 'string'\n        ) {\n          return presentToolResultIds.has(record.id);\n        }\n        return true;\n      }\n    );\n\n    if (filtered.length === 0) {\n      return null;\n    }\n    keptContent = filtered;\n  } else {\n    keptContent = message.content;\n  }\n\n  return new AIMessage({\n    ...message,\n    content: keptContent,\n    tool_calls: keptToolCalls.length > 0 ? keptToolCalls : undefined,\n  });\n}\n\n/**\n * Lightweight structural cleanup: strips orphan tool_use blocks from AI messages\n * and drops orphan ToolMessages whose AI counterpart is missing.\n *\n * Unlike `repairOrphanedToolMessages`, this does NOT track tokens — it is\n * intended as a final safety net right before model invocation to prevent\n * Anthropic / Bedrock structural validation errors.\n *\n * Uses duck-typing instead of `getType()` because messages at this stage\n * may be plain objects (from LangGraph state serialization) rather than\n * proper BaseMessage class instances.\n *\n * Includes a fast-path: if every tool_call has a matching tool_result and\n * vice-versa, the original array is returned immediately with zero allocation.\n */\nexport function sanitizeOrphanToolBlocks(\n  messages: BaseMessage[]\n): BaseMessage[] {\n  const allToolCallIds = new Set<string>();\n  const allToolResultIds = new Set<string>();\n\n  for (const msg of messages) {\n    const msgAny = msg as unknown as Record<string, unknown>;\n    const toolCalls = msgAny.tool_calls as Array<{ id?: string }> | undefined;\n    if (Array.isArray(toolCalls)) {\n      for (const tc of toolCalls) {\n        if (\n          typeof tc.id === 'string' &&\n          tc.id.length > 0 &&\n          !tc.id.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX)\n        ) {\n          allToolCallIds.add(tc.id);\n        }\n      }\n    }\n    if (Array.isArray(msgAny.content)) {\n      for (const block of msgAny.content as Array<Record<string, unknown>>) {\n        if (\n          typeof block === 'object' &&\n          (block.type === 'tool_use' || block.type === 'tool_call') &&\n          typeof block.id === 'string' &&\n          !block.id.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX)\n        ) {\n          allToolCallIds.add(block.id);\n        }\n      }\n    }\n    const toolCallId = msgAny.tool_call_id as string | undefined;\n    if (typeof toolCallId === 'string' && toolCallId.length > 0) {\n      allToolResultIds.add(toolCallId);\n    }\n  }\n\n  let hasOrphans = false;\n  for (const id of allToolCallIds) {\n    if (!allToolResultIds.has(id)) {\n      hasOrphans = true;\n      break;\n    }\n  }\n  if (!hasOrphans) {\n    for (const id of allToolResultIds) {\n      if (!allToolCallIds.has(id)) {\n        hasOrphans = true;\n        break;\n      }\n    }\n  }\n  if (!hasOrphans) {\n    return messages;\n  }\n\n  const result: BaseMessage[] = [];\n  const strippedAiIndices = new Set<number>();\n\n  for (const msg of messages) {\n    const msgAny = msg as unknown as Record<string, unknown>;\n    const msgType =\n      typeof (msg as { getType?: unknown }).getType === 'function'\n        ? msg.getType()\n        : ((msgAny.role as string | undefined) ??\n          (msgAny._type as string | undefined));\n\n    const toolCallId = msgAny.tool_call_id as string | undefined;\n    if (\n      (msgType === 'tool' || msg instanceof ToolMessage) &&\n      typeof toolCallId === 'string' &&\n      !allToolCallIds.has(toolCallId)\n    ) {\n      continue;\n    }\n\n    const toolCalls = msgAny.tool_calls as Array<{ id?: string }> | undefined;\n    if (\n      (msgType === 'ai' ||\n        msgType === 'assistant' ||\n        msg instanceof AIMessage) &&\n      Array.isArray(toolCalls) &&\n      toolCalls.length > 0\n    ) {\n      const hasOrphanCalls = toolCalls.some(\n        (tc) => typeof tc.id === 'string' && !allToolResultIds.has(tc.id)\n      );\n      if (hasOrphanCalls) {\n        if (msg instanceof AIMessage) {\n          const stripped = stripOrphanToolUseBlocks(msg, allToolResultIds);\n          if (stripped != null) {\n            strippedAiIndices.add(result.length);\n            result.push(stripped);\n          }\n          continue;\n        }\n        const keptToolCalls = toolCalls.filter(\n          (tc) => typeof tc.id === 'string' && allToolResultIds.has(tc.id)\n        );\n        const keptContent = Array.isArray(msgAny.content)\n          ? (msgAny.content as Array<Record<string, unknown>>).filter(\n              (block) => {\n                if (typeof block !== 'object') return true;\n                if (\n                  (block.type === 'tool_use' || block.type === 'tool_call') &&\n                  typeof block.id === 'string'\n                ) {\n                  return allToolResultIds.has(block.id);\n                }\n                return true;\n              }\n            )\n          : msgAny.content;\n        if (\n          keptToolCalls.length === 0 &&\n          Array.isArray(keptContent) &&\n          keptContent.length === 0\n        ) {\n          continue;\n        }\n        strippedAiIndices.add(result.length);\n        const patched = Object.create(\n          Object.getPrototypeOf(msg),\n          Object.getOwnPropertyDescriptors(msg)\n        );\n        patched.tool_calls = keptToolCalls.length > 0 ? keptToolCalls : [];\n        patched.content = keptContent;\n        result.push(patched as BaseMessage);\n        continue;\n      }\n    }\n\n    result.push(msg);\n  }\n\n  // Bedrock/Anthropic require the conversation to end with a user message;\n  // a stripped AI message (tool_use removed) represents a dead-end exchange.\n  while (result.length > 0 && strippedAiIndices.has(result.length - 1)) {\n    result.pop();\n  }\n\n  return result;\n}\n\n/**\n * Pre-flight truncation: truncates oversized tool result string content before\n * the budget walker runs. Older results get smaller budgets (recency factor),\n * with a 200-char floor so even ancient entries keep diagnostic signal. Returns\n * the number of ToolMessages truncated.\n */\nexport function preFlightTruncateToolResults(params: {\n  messages: BaseMessage[];\n  maxContextTokens: number;\n  indexTokenCountMap: Record<string, number | undefined>;\n  tokenCounter: TokenCounter;\n}): number {\n  const { messages, maxContextTokens, indexTokenCountMap, tokenCounter } =\n    params;\n  const baseMaxChars = calculateMaxToolResultChars(maxContextTokens);\n  let truncatedCount = 0;\n\n  const toolIndices: number[] = [];\n  for (let i = 0; i < messages.length; i++) {\n    if (messages[i].getType() === 'tool') {\n      toolIndices.push(i);\n    }\n  }\n\n  for (let t = 0; t < toolIndices.length; t++) {\n    const i = toolIndices[t];\n    const message = messages[i];\n    const content = message.content;\n    if (typeof content !== 'string') {\n      continue;\n    }\n\n    const position = toolIndices.length > 1 ? t / (toolIndices.length - 1) : 1;\n    const recencyFactor = 0.2 + 0.8 * position;\n    const maxChars = Math.max(200, Math.floor(baseMaxChars * recencyFactor));\n\n    if (content.length <= maxChars) {\n      continue;\n    }\n\n    const truncated = truncateToolResultContent(content, maxChars);\n    const cloned = new ToolMessage({\n      content: truncated,\n      tool_call_id: (message as ToolMessage).tool_call_id,\n      name: message.name,\n      id: message.id,\n      additional_kwargs: message.additional_kwargs,\n      response_metadata: message.response_metadata,\n    });\n    messages[i] = cloned;\n    indexTokenCountMap[i] = tokenCounter(cloned);\n    truncatedCount++;\n  }\n\n  return truncatedCount;\n}\n\n/**\n * Pre-flight truncation: truncates oversized `tool_use` input fields in AI messages.\n *\n * Tool call inputs (arguments) can be very large — e.g., code evaluation payloads from\n * MCP tools like chrome-devtools. Since these tool calls have already been executed,\n * the model only needs a summary of what was called, not the full arguments. Truncating\n * them before pruning can prevent entire messages from being dropped.\n *\n * Uses 15% of the context window (in estimated characters, ~4 chars/token) as the\n * per-input cap, capped at 200K chars.\n *\n * @returns The number of AI messages that had tool_use inputs truncated.\n */\nexport function preFlightTruncateToolCallInputs(params: {\n  messages: BaseMessage[];\n  maxContextTokens: number;\n  indexTokenCountMap: Record<string, number | undefined>;\n  tokenCounter: TokenCounter;\n}): number {\n  const { messages, maxContextTokens, indexTokenCountMap, tokenCounter } =\n    params;\n  const maxInputChars = Math.min(\n    Math.floor(maxContextTokens * 0.15) * 4,\n    200_000\n  );\n  let truncatedCount = 0;\n\n  for (let i = 0; i < messages.length; i++) {\n    const message = messages[i];\n    if (message.getType() !== 'ai') {\n      continue;\n    }\n    if (!Array.isArray(message.content)) {\n      continue;\n    }\n\n    const originalContent = message.content as MessageContentComplex[];\n    const state = { changed: false };\n    const newContent = originalContent.map((block) => {\n      if (typeof block !== 'object') {\n        return block;\n      }\n      const record = block as Record<string, unknown>;\n      if (record.type !== 'tool_use' && record.type !== 'tool_call') {\n        return block;\n      }\n\n      const input = record.input;\n      if (input == null) {\n        return block;\n      }\n      const serialized =\n        typeof input === 'string' ? input : JSON.stringify(input);\n      if (serialized.length <= maxInputChars) {\n        return block;\n      }\n\n      state.changed = true;\n      // Replaces original input with { _truncated, _originalChars } —\n      // safe because the tool call already executed in a prior turn.\n      return {\n        ...record,\n        input: truncateToolInput(serialized, maxInputChars),\n      };\n    });\n\n    if (!state.changed) {\n      continue;\n    }\n\n    const aiMsg = message as AIMessage;\n    const newToolCalls = (aiMsg.tool_calls ?? []).map((tc) => {\n      const serializedArgs = JSON.stringify(tc.args);\n      if (serializedArgs.length <= maxInputChars) {\n        return tc;\n      }\n      // Replaces original args with { _truncated, _originalChars } —\n      // safe because the tool call already executed in a prior turn.\n      return {\n        ...tc,\n        args: truncateToolInput(serializedArgs, maxInputChars),\n      };\n    });\n\n    messages[i] = new AIMessage({\n      ...aiMsg,\n      content: newContent,\n      tool_calls: newToolCalls.length > 0 ? newToolCalls : undefined,\n    });\n    indexTokenCountMap[i] = tokenCounter(messages[i]);\n    truncatedCount++;\n  }\n\n  return truncatedCount;\n}\n\ntype ThinkingBlocks = {\n  thinking_blocks?: Array<{\n    type: 'thinking';\n    thinking: string;\n    signature: string;\n  }>;\n};\n\nexport function createPruneMessages(factoryParams: PruneMessagesFactoryParams) {\n  const indexTokenCountMap = { ...factoryParams.indexTokenCountMap };\n  let lastTurnStartIndex = factoryParams.startIndex;\n  let lastCutOffIndex = 0;\n  let totalTokens = Object.values(indexTokenCountMap).reduce(\n    (a = 0, b = 0) => a + b,\n    0\n  ) as number;\n  let runThinkingStartIndex = -1;\n  /**\n   * Original (pre-truncation) tool result content keyed by message index.\n   * Lets the summarizer see full tool outputs even after pre-flight truncation\n   * has shortened them in the live messages array. Cleared whenever the\n   * factory is recreated (e.g. after a summarization checkpoint).\n   */\n  const originalToolContent = new Map<number, string>();\n  return function pruneMessages(params: PruneMessagesParams): {\n    context: BaseMessage[];\n    indexTokenCountMap: Record<string, number | undefined>;\n    messagesToRefine: BaseMessage[];\n    originalToolContent?: Map<number, string>;\n  } {\n    if (\n      factoryParams.provider === Providers.OPENAI &&\n      factoryParams.thinkingEnabled === true\n    ) {\n      for (let i = lastTurnStartIndex; i < params.messages.length; i++) {\n        const m = params.messages[i];\n        if (\n          m.getType() === 'ai' &&\n          typeof m.additional_kwargs.reasoning_content === 'string' &&\n          Array.isArray(\n            (\n              m.additional_kwargs.provider_specific_fields as\n                | ThinkingBlocks\n                | undefined\n            )?.thinking_blocks\n          ) &&\n          (m as AIMessage).tool_calls &&\n          ((m as AIMessage).tool_calls?.length ?? 0) > 0\n        ) {\n          const message = m as AIMessage;\n          const thinkingBlocks = (\n            message.additional_kwargs.provider_specific_fields as ThinkingBlocks\n          ).thinking_blocks;\n          const signature =\n            thinkingBlocks?.[thinkingBlocks.length - 1].signature;\n          const thinkingBlock: ThinkingContentText = {\n            signature,\n            type: ContentTypes.THINKING,\n            thinking: message.additional_kwargs.reasoning_content as string,\n          };\n\n          params.messages[i] = new AIMessage({\n            ...message,\n            content: [thinkingBlock],\n            additional_kwargs: {\n              ...message.additional_kwargs,\n              reasoning_content: undefined,\n            },\n          });\n        }\n      }\n    }\n\n    let currentUsage: UsageMetadata | undefined;\n    if (\n      params.usageMetadata &&\n      (checkValidNumber(params.usageMetadata.input_tokens) ||\n        (checkValidNumber(params.usageMetadata.input_token_details) &&\n          (checkValidNumber(\n            params.usageMetadata.input_token_details.cache_creation\n          ) ||\n            checkValidNumber(\n              params.usageMetadata.input_token_details.cache_read\n            )))) &&\n      checkValidNumber(params.usageMetadata.output_tokens)\n    ) {\n      currentUsage = calculateTotalTokens(params.usageMetadata);\n      totalTokens = currentUsage.total_tokens;\n    }\n\n    const newOutputs = new Set<number>();\n    for (let i = lastTurnStartIndex; i < params.messages.length; i++) {\n      const message = params.messages[i];\n      if (\n        i === lastTurnStartIndex &&\n        indexTokenCountMap[i] === undefined &&\n        currentUsage\n      ) {\n        indexTokenCountMap[i] = currentUsage.output_tokens;\n      } else if (indexTokenCountMap[i] === undefined) {\n        indexTokenCountMap[i] = factoryParams.tokenCounter(message);\n        if (currentUsage) {\n          newOutputs.add(i);\n        }\n        totalTokens += indexTokenCountMap[i] ?? 0;\n      }\n    }\n\n    // If `currentUsage` is defined, we need to distribute the current total tokens to our `indexTokenCountMap`,\n    // We must distribute it in a weighted manner, so that the total token count is equal to `currentUsage.total_tokens`,\n    // relative the manually counted tokens in `indexTokenCountMap`.\n    // EDGE CASE: when the resulting context gets pruned, we should not distribute the usage for messages that are not in the context.\n    if (currentUsage) {\n      let totalIndexTokens = 0;\n      if (params.messages[0].getType() === 'system') {\n        totalIndexTokens += indexTokenCountMap[0] ?? 0;\n      }\n      for (let i = lastCutOffIndex; i < params.messages.length; i++) {\n        if (i === 0 && params.messages[0].getType() === 'system') {\n          continue;\n        }\n        if (newOutputs.has(i)) {\n          continue;\n        }\n        totalIndexTokens += indexTokenCountMap[i] ?? 0;\n      }\n\n      // Calculate ratio based only on messages that remain in the context\n      const ratio = currentUsage.total_tokens / totalIndexTokens;\n      const isRatioSafe = ratio >= 1 / 3 && ratio <= 2.5;\n\n      // Apply the ratio adjustment only to messages at or after lastCutOffIndex, and only if the ratio is safe\n      if (isRatioSafe) {\n        if (\n          params.messages[0].getType() === 'system' &&\n          lastCutOffIndex !== 0\n        ) {\n          indexTokenCountMap[0] = Math.round(\n            (indexTokenCountMap[0] ?? 0) * ratio\n          );\n        }\n\n        for (let i = lastCutOffIndex; i < params.messages.length; i++) {\n          if (newOutputs.has(i)) {\n            continue;\n          }\n          indexTokenCountMap[i] = Math.round(\n            (indexTokenCountMap[i] ?? 0) * ratio\n          );\n        }\n      }\n    }\n\n    lastTurnStartIndex = params.messages.length;\n    if (lastCutOffIndex === 0 && totalTokens <= factoryParams.maxTokens) {\n      return {\n        context: params.messages,\n        indexTokenCountMap,\n        messagesToRefine: [],\n      };\n    }\n\n    /*\n     * Pre-flight truncation: chop oversized tool result content and oversized\n     * tool_use input args BEFORE the budget walker runs. Older results get\n     * smaller per-message budgets (recencyFactor) so they degrade first while\n     * recent turns stay intact. Saves the originals in `originalToolContent`\n     * keyed by message index so the summarizer can later reconstruct full\n     * fidelity even after the live array was shortened.\n     */\n    for (let i = 0; i < params.messages.length; i++) {\n      const m = params.messages[i];\n      if (\n        m.getType() === 'tool' &&\n        typeof m.content === 'string' &&\n        !originalToolContent.has(i)\n      ) {\n        originalToolContent.set(i, m.content);\n      }\n    }\n    preFlightTruncateToolResults({\n      messages: params.messages,\n      maxContextTokens: factoryParams.maxTokens,\n      indexTokenCountMap,\n      tokenCounter: factoryParams.tokenCounter,\n    });\n    preFlightTruncateToolCallInputs({\n      messages: params.messages,\n      maxContextTokens: factoryParams.maxTokens,\n      indexTokenCountMap,\n      tokenCounter: factoryParams.tokenCounter,\n    });\n\n    /*\n     * Position-based content degradation: soft-trim then hard-clear older tool\n     * results before the budget walker runs. Off by default — caller opts in\n     * via `contextPruningConfig.enabled`.\n     */\n    if (factoryParams.contextPruningConfig?.enabled) {\n      applyContextPruning({\n        messages: params.messages,\n        indexTokenCountMap,\n        tokenCounter: factoryParams.tokenCounter,\n        config: factoryParams.contextPruningConfig,\n      });\n    }\n\n    const { context, thinkingStartIndex, messagesToRefine } =\n      getMessagesWithinTokenLimit({\n        maxContextTokens: factoryParams.maxTokens,\n        messages: params.messages,\n        indexTokenCountMap,\n        startType: params.startType,\n        thinkingEnabled: factoryParams.thinkingEnabled,\n        tokenCounter: factoryParams.tokenCounter,\n        reasoningType:\n          factoryParams.provider === Providers.BEDROCK\n            ? ContentTypes.REASONING_CONTENT\n            : ContentTypes.THINKING,\n        thinkingStartIndex:\n          factoryParams.thinkingEnabled === true\n            ? runThinkingStartIndex\n            : undefined,\n      });\n    runThinkingStartIndex = thinkingStartIndex ?? -1;\n\n    /*\n     * Orphan repair pass — drops tool messages whose AIMessage was pruned and\n     * strips orphan tool_use blocks from AIMessages whose tool results are\n     * missing. Without this, the budget walker can split tool_use ↔ tool_result\n     * pairs and the provider rejects the request with a structural 400.\n     * Dropped messages flow into messagesToRefine for summarization.\n     */\n    const repaired = repairOrphanedToolMessages({\n      context,\n      allMessages: params.messages,\n      tokenCounter: factoryParams.tokenCounter,\n      indexTokenCountMap,\n    });\n    const finalContext = repaired.context;\n    const finalMessagesToRefine =\n      repaired.droppedMessages.length > 0\n        ? [...messagesToRefine, ...repaired.droppedMessages]\n        : messagesToRefine;\n\n    /** The index is the first value of `context`, index relative to `params.messages` */\n    lastCutOffIndex = Math.max(\n      params.messages.length -\n        (finalContext.length -\n          (finalContext[0]?.getType() === 'system' ? 1 : 0)),\n      0\n    );\n\n    return {\n      context: finalContext,\n      indexTokenCountMap,\n      messagesToRefine: finalMessagesToRefine,\n      originalToolContent,\n    };\n  };\n}\n\n/** Calculates context utilization as a percentage (0-100) */\nexport function getContextUtilization(\n  indexTokenCountMap: Record<string, number | undefined>,\n  instructionTokens: number,\n  maxContextTokens: number\n): number {\n  if (maxContextTokens <= 0) return 0;\n  let totalTokens = instructionTokens;\n  for (const key in indexTokenCountMap) {\n    totalTokens += indexTokenCountMap[key] ?? 0;\n  }\n  return (totalTokens / maxContextTokens) * 100;\n}\n"],"names":[],"mappings":"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"}