{"version":3,"file":"summarize.cjs","sources":["../../../src/messages/summarize.ts"],"sourcesContent":["import { HumanMessage, BaseMessage } from '@langchain/core/messages';\nimport type { TokenCounter } from '@/types/run';\n\nexport type SummarizeTier = 'full' | 'simple' | 'emergency';\n\nexport type SummarizeConfig = {\n  /** Max tokens for the summary output */\n  maxOutputTokens?: number;\n  /** Token counter for validation */\n  tokenCounter?: TokenCounter;\n  /** Max tokens the summary should fit within */\n  summaryBudget?: number;\n  /** Whether this is a multi-agent conversation */\n  isMultiAgent?: boolean;\n  /** Current agent workflow state for multi-agent context */\n  agentWorkflowState?: {\n    currentAgentId: string;\n    agentChain: string[];\n    pendingAgents: string[];\n  };\n};\n\nexport type SummarizeResult = {\n  summary: string;\n  tier: SummarizeTier;\n  tokenCount?: number;\n  messagesCompacted: number;\n};\n\nconst MAX_MESSAGE_CHARS = 4000;\nconst MAX_TRUNCATED_CHARS = 500;\nconst SIMPLE_MAX_TOKENS = 512;\n\nexport const FULL_SUMMARY_TEMPLATE = `Analyze this conversation and produce a structured summary covering each section below. Be precise and preserve actionable details.\n\n## 1. Task Overview & User Intent\nWhat the user originally asked for and their high-level goal.\n\n## 2. Technical Context\nLanguages, frameworks, libraries, APIs, and architectural patterns involved.\n\n## 3. Files & Code State\nAll file paths mentioned, their current state, and any pending modifications.\n\n## 4. Problem Resolution History\nProblems encountered, debugging steps taken, and their outcomes.\n\n## 5. Agent Workflow State\n{agent_workflow}\n\n## 6. Tool Results Summary\nTools called, their inputs, and key outputs (omit verbose raw data).\n\n## 7. Progress Tracking\nWhat has been completed, what remains, and any blockers.\n\n## 8. Active Working State\nVariables, configurations, and runtime state that must be preserved.\n\n## 9. Continuation Plan\nImmediate next steps and the order in which they should be executed.\n\n## 10. Critical Context\nAny constraints, warnings, edge cases, or decisions that must not be lost.\n\nConversation:\n{conversation}\n\nStructured Summary:`;\n\nexport const SIMPLE_SUMMARY_TEMPLATE =\n  \"Summarize this conversation preserving: user's original request, key decisions, current task state, and any file paths mentioned.\\n\\nConversation:\\n{conversation}\\n\\nSummary:\";\n\nexport function formatMessagesForSummary(messages: BaseMessage[]): string {\n  const parts: string[] = [];\n  for (const message of messages) {\n    const role = message.getType();\n    const raw =\n      typeof message.content === 'string'\n        ? message.content\n        : JSON.stringify(message.content);\n    const content =\n      raw.length > MAX_MESSAGE_CHARS\n        ? raw.slice(0, MAX_MESSAGE_CHARS) + '...'\n        : raw;\n    parts.push(`${role}: ${content}`);\n  }\n  return parts.join('\\n');\n}\n\nexport function buildFullSummaryPrompt(\n  conversation: string,\n  config?: SummarizeConfig\n): string {\n  let agentWorkflow = 'N/A (single-agent conversation)';\n  if (config?.isMultiAgent === true && config.agentWorkflowState != null) {\n    const { currentAgentId, agentChain, pendingAgents } =\n      config.agentWorkflowState;\n    agentWorkflow = [\n      `Current agent: ${currentAgentId}`,\n      `Agent chain: ${agentChain.join(' -> ')}`,\n      `Pending agents: ${pendingAgents.length > 0 ? pendingAgents.join(', ') : 'none'}`,\n    ].join('\\n');\n  }\n\n  return FULL_SUMMARY_TEMPLATE.replace(\n    '{agent_workflow}',\n    agentWorkflow\n  ).replace('{conversation}', conversation);\n}\n\nexport function buildSimpleSummaryPrompt(conversation: string): string {\n  return SIMPLE_SUMMARY_TEMPLATE.replace('{conversation}', conversation);\n}\n\nexport function createEmergencySummary(messages: BaseMessage[]): string {\n  let firstUserContent = '';\n  let lastAIContent = '';\n  const toolNames = new Set<string>();\n\n  for (const message of messages) {\n    const type = message.getType();\n    const content =\n      typeof message.content === 'string'\n        ? message.content\n        : JSON.stringify(message.content);\n\n    if (type === 'human' && firstUserContent.length === 0) {\n      firstUserContent = content.slice(0, MAX_TRUNCATED_CHARS);\n    }\n    if (type === 'ai') {\n      lastAIContent = content.slice(0, MAX_TRUNCATED_CHARS);\n    }\n    if (type === 'tool') {\n      const name = message.name;\n      if (name != null && name.length > 0) {\n        toolNames.add(name);\n      }\n    }\n  }\n\n  const toolList = toolNames.size > 0 ? [...toolNames].join(', ') : 'none';\n  return [\n    '[Emergency Context Summary]',\n    `Original request: ${firstUserContent}`,\n    `Last response: ${lastAIContent}`,\n    `Tools used: ${toolList}`,\n    `Messages compacted: ${messages.length}`,\n  ].join('\\n');\n}\n\nexport function validateSummarySize(\n  summary: string,\n  budget: number,\n  tokenCounter: TokenCounter\n): boolean {\n  const count = tokenCounter(new HumanMessage(summary));\n  return count <= budget;\n}\n\nexport async function summarize(\n  messages: BaseMessage[],\n  callback: (prompt: string, maxTokens: number) => Promise<string | undefined>,\n  config?: SummarizeConfig\n): Promise<SummarizeResult> {\n  const messageCount = messages.length;\n  const maxOutputTokens = config?.maxOutputTokens ?? 1024;\n\n  // Tier 1: Full structured summary\n  try {\n    const conversation = formatMessagesForSummary(messages);\n    const prompt = buildFullSummaryPrompt(conversation, config);\n    const result = await callback(prompt, maxOutputTokens);\n\n    if (result != null && result.length > 0) {\n      if (\n        config?.summaryBudget != null &&\n        config.summaryBudget > 0 &&\n        config.tokenCounter != null\n      ) {\n        if (\n          validateSummarySize(result, config.summaryBudget, config.tokenCounter)\n        ) {\n          return {\n            summary: result,\n            tier: 'full',\n            messagesCompacted: messageCount,\n          };\n        }\n      } else {\n        return {\n          summary: result,\n          tier: 'full',\n          messagesCompacted: messageCount,\n        };\n      }\n    }\n  } catch {\n    // Fall through to Tier 2\n  }\n\n  // Tier 2: Simple summary\n  try {\n    const conversation = formatMessagesForSummary(messages);\n    const prompt = buildSimpleSummaryPrompt(conversation);\n    const result = await callback(prompt, SIMPLE_MAX_TOKENS);\n\n    if (result != null && result.length > 0) {\n      return {\n        summary: result,\n        tier: 'simple',\n        messagesCompacted: messageCount,\n      };\n    }\n  } catch {\n    // Fall through to Tier 3\n  }\n\n  // Tier 3: Emergency (no LLM)\n  const summary = createEmergencySummary(messages);\n  return { summary, tier: 'emergency', messagesCompacted: messageCount };\n}\n"],"names":["HumanMessage"],"mappings":"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"}