{"version":3,"sources":["../../src/agents/llm/LLMProvider.ts","../../src/agents/types.ts","../../src/utils/id.ts","../../src/agents/llm/OpenAIProvider.ts","../../src/agents/llm/AnthropicProvider.ts","../../src/summarization/types.ts","../../src/summarization/extractive.ts","../../src/summarization/ConversationSummarizer.ts"],"names":["CompressionLevel"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * LLM Provider Interface\n *\n * Defines the contract for LLM providers to integrate with the agent system\n */\n\nimport { Message, ToolCall } from '../types';\n\n/**\n * Chat request parameters\n */\nexport interface ChatRequest {\n  messages: Message[];\n  tools?: Array<{\n    name: string;\n    description: string;\n    parameters: Record<string, unknown>;\n  }>;\n  temperature?: number;\n  maxTokens?: number;\n  topP?: number;\n  streaming?: boolean;\n  onStream?: (chunk: string) => void | Promise<void>;\n}\n\n/**\n * Chat response\n */\nexport interface ChatResponse {\n  content: string;\n  toolCalls?: ToolCall[];\n  finishReason?: 'stop' | 'tool_calls' | 'length' | 'content_filter';\n  usage?: {\n    promptTokens: number;\n    completionTokens: number;\n    totalTokens: number;\n  };\n}\n\n/**\n * Base LLM provider interface\n */\nexport abstract class LLMProvider {\n  protected config: any;\n\n  constructor(config: any) {\n    this.config = config;\n  }\n\n  /**\n   * Send a chat request to the LLM\n   */\n  abstract chat(request: ChatRequest): Promise<ChatResponse>;\n\n  /**\n   * Get provider name\n   */\n  abstract getProviderName(): string;\n}\n","/**\n * AIKIT Agent Orchestration System - Type Definitions\n *\n * This module defines the core types for the AI agent execution framework.\n * Provides type-safe interfaces for agents, tools, and execution traces.\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Tool Definition Types\n// ============================================================================\n\n/**\n * Schema definition for tool parameters using Zod\n */\nexport type ToolParameterSchema = z.ZodObject<any> | z.ZodType<any>;\n\n/**\n * Tool metadata and configuration\n */\nexport interface ToolDefinition<TParams = any, TResult = any> {\n  /**\n   * Unique identifier for the tool\n   */\n  name: string;\n\n  /**\n   * Human-readable description of what the tool does\n   * This is used by the LLM to understand when to use the tool\n   */\n  description: string;\n\n  /**\n   * Zod schema for validating tool parameters\n   */\n  parameters: ToolParameterSchema;\n\n  /**\n   * The actual function that executes the tool\n   * @param params - Validated parameters matching the schema\n   * @returns Promise resolving to the tool result\n   */\n  execute: (params: TParams) => Promise<TResult>;\n\n  /**\n   * Optional retry configuration\n   */\n  retry?: {\n    maxAttempts: number;\n    backoffMs: number;\n  };\n\n  /**\n   * Optional timeout in milliseconds\n   */\n  timeoutMs?: number;\n\n  /**\n   * Optional metadata for categorization and filtering\n   */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Runtime tool call request from the LLM\n */\nexport interface ToolCall {\n  /**\n   * Unique ID for this specific tool call invocation\n   */\n  id: string;\n\n  /**\n   * Name of the tool to execute\n   */\n  name: string;\n\n  /**\n   * Parameters to pass to the tool (validated against schema)\n   */\n  parameters: Record<string, unknown>;\n}\n\n/**\n * Result of a tool execution\n */\nexport interface ToolResult {\n  /**\n   * ID of the tool call this result corresponds to\n   */\n  toolCallId: string;\n\n  /**\n   * Name of the tool that was executed\n   */\n  toolName: string;\n\n  /**\n   * The result data from the tool execution\n   */\n  result: unknown;\n\n  /**\n   * Error information if the tool execution failed\n   */\n  error?: {\n    message: string;\n    code?: string;\n    stack?: string;\n  };\n\n  /**\n   * Execution metadata\n   */\n  metadata: {\n    durationMs: number;\n    timestamp: string;\n    retryCount?: number;\n  };\n}\n\n// ============================================================================\n// Agent Types\n// ============================================================================\n\n/**\n * Agent configuration\n */\nexport interface AgentConfig {\n  /**\n   * Unique identifier for the agent\n   */\n  id: string;\n\n  /**\n   * Human-readable name\n   */\n  name: string;\n\n  /**\n   * Description of the agent's purpose and capabilities\n   */\n  description?: string;\n\n  /**\n   * System prompt that defines the agent's behavior\n   */\n  systemPrompt: string;\n\n  /**\n   * LLM provider configuration\n   */\n  llm: {\n    provider: 'openai' | 'anthropic' | 'google' | 'custom';\n    model: string;\n    temperature?: number;\n    maxTokens?: number;\n    topP?: number;\n    apiKey?: string;\n    baseUrl?: string;\n  };\n\n  /**\n   * Tools available to this agent\n   */\n  tools: ToolDefinition[];\n\n  /**\n   * Maximum number of execution steps before stopping\n   */\n  maxSteps?: number;\n\n  /**\n   * Whether to enable streaming responses\n   */\n  streaming?: boolean;\n\n  /**\n   * Custom metadata\n   */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Message in the agent conversation\n */\nexport interface Message {\n  role: 'system' | 'user' | 'assistant' | 'tool';\n  content: string;\n  name?: string; // For tool messages\n  toolCalls?: ToolCall[];\n  toolCallId?: string; // For tool result messages\n  timestamp?: string;\n}\n\n/**\n * Agent state during execution\n */\nexport interface AgentState {\n  /**\n   * Current step number in the execution\n   */\n  step: number;\n\n  /**\n   * Conversation history\n   */\n  messages: Message[];\n\n  /**\n   * Pending tool calls waiting to be executed\n   */\n  pendingToolCalls: ToolCall[];\n\n  /**\n   * Results from completed tool calls\n   */\n  toolResults: ToolResult[];\n\n  /**\n   * Whether the agent has finished execution\n   */\n  isComplete: boolean;\n\n  /**\n   * Final response if execution is complete\n   */\n  finalResponse?: string;\n\n  /**\n   * Error information if execution failed\n   */\n  error?: {\n    message: string;\n    step: number;\n    cause?: unknown;\n  };\n}\n\n// ============================================================================\n// Execution Trace Types\n// ============================================================================\n\n/**\n * Types of events in the execution trace\n */\nexport type TraceEventType =\n  | 'agent_start'\n  | 'agent_end'\n  | 'llm_request'\n  | 'llm_response'\n  | 'llm_stream_start'\n  | 'llm_stream_chunk'\n  | 'llm_stream_end'\n  | 'tool_call_request'\n  | 'tool_call_start'\n  | 'tool_call_end'\n  | 'tool_call_error'\n  | 'step_start'\n  | 'step_end'\n  | 'error';\n\n/**\n * Individual trace event\n */\nexport interface TraceEvent {\n  /**\n   * Event type\n   */\n  type: TraceEventType;\n\n  /**\n   * Timestamp when the event occurred\n   */\n  timestamp: string;\n\n  /**\n   * Step number during which this event occurred\n   */\n  step?: number;\n\n  /**\n   * Event-specific data\n   */\n  data: Record<string, unknown>;\n\n  /**\n   * Duration in milliseconds (for start/end pairs)\n   */\n  durationMs?: number;\n}\n\n/**\n * Complete execution trace\n */\nexport interface ExecutionTrace {\n  /**\n   * Unique execution ID\n   */\n  executionId: string;\n\n  /**\n   * Agent ID\n   */\n  agentId: string;\n\n  /**\n   * Start timestamp\n   */\n  startTime: string;\n\n  /**\n   * End timestamp\n   */\n  endTime?: string;\n\n  /**\n   * Total duration in milliseconds\n   */\n  durationMs?: number;\n\n  /**\n   * All trace events in chronological order\n   */\n  events: TraceEvent[];\n\n  /**\n   * Final agent state\n   */\n  finalState?: AgentState;\n\n  /**\n   * Execution statistics\n   */\n  stats: {\n    totalSteps: number;\n    totalToolCalls: number;\n    totalLLMCalls: number;\n    totalTokensUsed?: number;\n    successfulToolCalls: number;\n    failedToolCalls: number;\n  };\n}\n\n// ============================================================================\n// Streaming Types\n// ============================================================================\n\n/**\n * Streaming event types\n */\nexport type StreamEventType =\n  | 'start'\n  | 'step'\n  | 'thought'\n  | 'tool_call'\n  | 'tool_result'\n  | 'text_chunk'\n  | 'final_answer'\n  | 'complete'\n  | 'error';\n\n/**\n * Base streaming event\n */\nexport interface StreamEvent {\n  type: StreamEventType;\n  timestamp: string;\n  data: unknown;\n}\n\n/**\n * Streaming callback handler\n */\nexport type StreamCallback = (event: StreamEvent) => void | Promise<void>;\n\n/**\n * Agent step event for streaming\n */\nexport interface AgentStepEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'step';\n\n  /**\n   * Current step number\n   */\n  step: number;\n\n  /**\n   * Step timestamp\n   */\n  timestamp: string;\n\n  /**\n   * Step metadata\n   */\n  metadata?: {\n    messagesCount?: number;\n    pendingToolCalls?: number;\n  };\n}\n\n/**\n * Thought event - agent's reasoning/thinking\n */\nexport interface ThoughtEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'thought';\n\n  /**\n   * The thought/reasoning content\n   */\n  content: string;\n\n  /**\n   * Step number during which this thought occurred\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Tool call event\n */\nexport interface ToolCallEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'tool_call';\n\n  /**\n   * The tool call details\n   */\n  toolCall: ToolCall;\n\n  /**\n   * Step number\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Tool result event\n */\nexport interface ToolResultEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'tool_result';\n\n  /**\n   * The tool execution result\n   */\n  result: ToolResult;\n\n  /**\n   * Step number\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Final answer event\n */\nexport interface FinalAnswerEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'final_answer';\n\n  /**\n   * The final answer/response\n   */\n  answer: string;\n\n  /**\n   * Step number\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'error';\n\n  /**\n   * Error message\n   */\n  error: string;\n\n  /**\n   * Error code\n   */\n  code?: string;\n\n  /**\n   * Step number where error occurred\n   */\n  step?: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Union type of all agent execution streaming events\n */\nexport type AgentExecutionEvent =\n  | AgentStepEvent\n  | ThoughtEvent\n  | ToolCallEvent\n  | ToolResultEvent\n  | FinalAnswerEvent\n  | ErrorEvent;\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Base error for agent system\n */\nexport class AgentError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public context?: Record<string, unknown>\n  ) {\n    super(message);\n    this.name = 'AgentError';\n  }\n}\n\n/**\n * Tool execution error\n */\nexport class ToolExecutionError extends AgentError {\n  constructor(\n    message: string,\n    public toolName: string,\n    public toolCallId: string,\n    context?: Record<string, unknown>\n  ) {\n    super(message, 'TOOL_EXECUTION_ERROR', { ...context, toolName, toolCallId });\n    this.name = 'ToolExecutionError';\n  }\n}\n\n/**\n * Tool validation error\n */\nexport class ToolValidationError extends AgentError {\n  constructor(\n    message: string,\n    public toolName: string,\n    public validationErrors: z.ZodError,\n    context?: Record<string, unknown>\n  ) {\n    super(message, 'TOOL_VALIDATION_ERROR', {\n      ...context,\n      toolName,\n      errors: validationErrors.errors,\n    });\n    this.name = 'ToolValidationError';\n  }\n}\n\n/**\n * LLM error\n */\nexport class LLMError extends AgentError {\n  constructor(\n    message: string,\n    public provider: string,\n    context?: Record<string, unknown>\n  ) {\n    super(message, 'LLM_ERROR', { ...context, provider });\n    this.name = 'LLMError';\n  }\n}\n\n/**\n * Max steps exceeded error\n */\nexport class MaxStepsExceededError extends AgentError {\n  constructor(maxSteps: number, context?: Record<string, unknown>) {\n    super(\n      `Agent exceeded maximum steps: ${maxSteps}`,\n      'MAX_STEPS_EXCEEDED',\n      { ...context, maxSteps }\n    );\n    this.name = 'MaxStepsExceededError';\n  }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Extract parameter type from tool definition\n */\nexport type ToolParams<T extends ToolDefinition> = T extends ToolDefinition<\n  infer P,\n  any\n>\n  ? P\n  : never;\n\n/**\n * Extract result type from tool definition\n */\nexport type ToolResultType<T extends ToolDefinition> = T extends ToolDefinition<\n  any,\n  infer R\n>\n  ? R\n  : never;\n\n/**\n * Type-safe tool registry\n */\nexport type ToolRegistry = Map<string, ToolDefinition>;\n\n// ============================================================================\n// Agent Swarm Types\n// ============================================================================\n\n/**\n * Role of an agent in the swarm\n */\nexport type AgentRole = 'supervisor' | 'specialist';\n\n/**\n * Specialist agent configuration for swarm\n */\nexport interface SpecialistAgent {\n  /**\n   * Unique identifier for the specialist\n   */\n  id: string;\n\n  /**\n   * Agent instance\n   */\n  agent: any; // Will be Agent type, avoiding circular dependency\n\n  /**\n   * Specialization area/domain\n   */\n  specialization: string;\n\n  /**\n   * Keywords/tags that trigger this specialist\n   */\n  keywords?: string[];\n\n  /**\n   * Priority when multiple specialists match (higher = preferred)\n   */\n  priority?: number;\n\n  /**\n   * Whether this specialist can handle multiple tasks concurrently\n   */\n  concurrent?: boolean;\n}\n\n/**\n * Task routing decision\n */\nexport interface TaskRoutingDecision {\n  /**\n   * ID of the specialist agent to handle the task\n   */\n  specialistId: string;\n\n  /**\n   * Reason for routing to this specialist\n   */\n  reason: string;\n\n  /**\n   * Confidence score (0-1)\n   */\n  confidence: number;\n}\n\n/**\n * Specialist execution result\n */\nexport interface SpecialistResult {\n  /**\n   * ID of the specialist that executed the task\n   */\n  specialistId: string;\n\n  /**\n   * Specialization area\n   */\n  specialization: string;\n\n  /**\n   * Response from the specialist\n   */\n  response: string;\n\n  /**\n   * Execution trace from the specialist\n   */\n  trace: ExecutionTrace;\n\n  /**\n   * Whether execution was successful\n   */\n  success: boolean;\n\n  /**\n   * Error if execution failed\n   */\n  error?: Error;\n\n  /**\n   * Execution metadata\n   */\n  metadata: {\n    startTime: string;\n    endTime: string;\n    durationMs: number;\n  };\n}\n\n/**\n * Configuration for AgentSwarm\n */\nexport interface SwarmConfig {\n  /**\n   * Unique identifier for the swarm\n   */\n  id: string;\n\n  /**\n   * Human-readable name\n   */\n  name: string;\n\n  /**\n   * Description of the swarm's purpose\n   */\n  description?: string;\n\n  /**\n   * Supervisor agent that coordinates specialists\n   */\n  supervisor: any; // Will be Agent type, avoiding circular dependency\n\n  /**\n   * Specialist agents in the swarm\n   */\n  specialists: SpecialistAgent[];\n\n  /**\n   * Maximum number of concurrent specialist executions\n   */\n  maxConcurrent?: number;\n\n  /**\n   * Whether to enable parallel execution of independent tasks\n   */\n  parallelExecution?: boolean;\n\n  /**\n   * Timeout for specialist executions (milliseconds)\n   */\n  specialistTimeoutMs?: number;\n\n  /**\n   * Custom routing strategy\n   */\n  customRouter?: (\n    task: string,\n    specialists: SpecialistAgent[]\n  ) => Promise<TaskRoutingDecision>;\n\n  /**\n   * Custom result synthesizer\n   */\n  customSynthesizer?: (\n    results: SpecialistResult[]\n  ) => Promise<string>;\n\n  /**\n   * Custom metadata\n   */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Swarm execution result\n */\nexport interface SwarmResult {\n  /**\n   * Final synthesized response\n   */\n  response: string;\n\n  /**\n   * Results from individual specialists\n   */\n  specialistResults: SpecialistResult[];\n\n  /**\n   * Combined execution trace from all agents\n   */\n  combinedTrace: ExecutionTrace;\n\n  /**\n   * Supervisor's decision-making trace\n   */\n  supervisorTrace: ExecutionTrace;\n\n  /**\n   * Whether execution was successful\n   */\n  success: boolean;\n\n  /**\n   * Error if execution failed\n   */\n  error?: Error;\n\n  /**\n   * Execution statistics\n   */\n  stats: {\n    totalSpecialistsInvoked: number;\n    successfulSpecialists: number;\n    failedSpecialists: number;\n    totalDurationMs: number;\n    parallelExecutions: number;\n  };\n}\n","/**\n * ID generation utilities\n */\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix?: string): string {\n  const timestamp = Date.now().toString(36);\n  const randomPart = Math.random().toString(36).substring(2, 9);\n  const id = `${timestamp}-${randomPart}`;\n  return prefix ? `${prefix}-${id}` : id;\n}\n\n/**\n * Generate a short unique ID\n */\nexport function generateShortId(): string {\n  return Math.random().toString(36).substring(2, 9);\n}\n","/**\n * OpenAI LLM Provider\n *\n * Integration with OpenAI's chat completion API\n */\n\nimport { LLMProvider, ChatRequest, ChatResponse } from './LLMProvider';\nimport { ToolCall, LLMError } from '../types';\nimport { generateShortId } from '../../utils/id';\n\n/**\n * OpenAI-specific configuration\n */\nexport interface OpenAIConfig {\n  apiKey: string;\n  model: string;\n  baseUrl?: string;\n  organization?: string;\n  temperature?: number;\n  maxTokens?: number;\n  topP?: number;\n}\n\n/**\n * OpenAI provider implementation\n */\nexport class OpenAIProvider extends LLMProvider {\n  private apiKey: string;\n  private baseUrl: string;\n  private model: string;\n\n  constructor(config: OpenAIConfig) {\n    super(config);\n    this.apiKey = config.apiKey || process.env['OPENAI_API_KEY'] || '';\n    this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';\n    this.model = config.model;\n\n    if (!this.apiKey) {\n      throw new LLMError('OpenAI API key is required', 'openai', { config });\n    }\n  }\n\n  /**\n   * Send chat request to OpenAI\n   */\n  async chat(request: ChatRequest): Promise<ChatResponse> {\n    try {\n      const messages = this.convertMessages(request.messages);\n      const tools = request.tools ? this.convertTools(request.tools) : undefined;\n\n      const payload: any = {\n        model: this.model,\n        messages,\n        temperature: request.temperature ?? this.config.temperature ?? 0.7,\n        max_tokens: request.maxTokens ?? this.config.maxTokens,\n        top_p: request.topP ?? this.config.topP,\n        stream: request.streaming ?? false,\n      };\n\n      if (tools && tools.length > 0) {\n        payload.tools = tools;\n        payload.tool_choice = 'auto';\n      }\n\n      // Handle streaming\n      if (request.streaming && request.onStream) {\n        return await this.streamChat(payload, request.onStream);\n      }\n\n      // Regular non-streaming chat\n      const response = await fetch(`${this.baseUrl}/chat/completions`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Bearer ${this.apiKey}`,\n          ...(this.config.organization && {\n            'OpenAI-Organization': this.config.organization,\n          }),\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        const error = await response.json();\n        throw new Error(error.error?.message || 'OpenAI API error');\n      }\n\n      const data = await response.json();\n      return this.parseResponse(data);\n    } catch (error) {\n      const errorObj = error as Error;\n      throw new LLMError(\n        `OpenAI chat failed: ${errorObj.message}`,\n        'openai',\n        { model: this.model, error: errorObj }\n      );\n    }\n  }\n\n  /**\n   * Stream chat completion\n   */\n  private async streamChat(\n    payload: any,\n    onStream: (chunk: string) => void | Promise<void>\n  ): Promise<ChatResponse> {\n    const response = await fetch(`${this.baseUrl}/chat/completions`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: `Bearer ${this.apiKey}`,\n        ...(this.config.organization && {\n          'OpenAI-Organization': this.config.organization,\n        }),\n      },\n      body: JSON.stringify(payload),\n    });\n\n    if (!response.ok) {\n      const error = await response.json();\n      throw new Error(error.error?.message || 'OpenAI API error');\n    }\n\n    const reader = response.body?.getReader();\n    if (!reader) {\n      throw new Error('No response body');\n    }\n\n    const decoder = new TextDecoder();\n    let content = '';\n    let toolCalls: ToolCall[] | undefined;\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n\n        const chunk = decoder.decode(value);\n        const lines = chunk.split('\\n').filter((line) => line.trim() !== '');\n\n        for (const line of lines) {\n          if (line.startsWith('data: ')) {\n            const data = line.slice(6);\n            if (data === '[DONE]') continue;\n\n            try {\n              const parsed = JSON.parse(data);\n              const delta = parsed.choices?.[0]?.delta;\n\n              if (delta?.content) {\n                content += delta.content;\n                await onStream(delta.content);\n              }\n\n              if (delta?.tool_calls) {\n                toolCalls = this.parseToolCalls(delta.tool_calls);\n              }\n            } catch (e) {\n              // Skip invalid JSON\n            }\n          }\n        }\n      }\n    } finally {\n      reader.releaseLock();\n    }\n\n    return {\n      content,\n      toolCalls,\n      finishReason: toolCalls ? 'tool_calls' : 'stop',\n    };\n  }\n\n  /**\n   * Parse OpenAI response\n   */\n  private parseResponse(data: any): ChatResponse {\n    const choice = data.choices?.[0];\n    if (!choice) {\n      throw new Error('No choices in OpenAI response');\n    }\n\n    const message = choice.message;\n    const toolCalls = message.tool_calls\n      ? this.parseToolCalls(message.tool_calls)\n      : undefined;\n\n    return {\n      content: message.content || '',\n      toolCalls,\n      finishReason: this.mapFinishReason(choice.finish_reason),\n      usage: data.usage\n        ? {\n            promptTokens: data.usage.prompt_tokens,\n            completionTokens: data.usage.completion_tokens,\n            totalTokens: data.usage.total_tokens,\n          }\n        : undefined,\n    };\n  }\n\n  /**\n   * Convert messages to OpenAI format\n   */\n  private convertMessages(messages: any[]): any[] {\n    return messages.map((msg) => {\n      const converted: any = {\n        role: msg.role,\n        content: msg.content,\n      };\n\n      if (msg.name) {\n        converted.name = msg.name;\n      }\n\n      if (msg.toolCalls) {\n        converted.tool_calls = msg.toolCalls.map((tc: ToolCall) => ({\n          id: tc.id,\n          type: 'function',\n          function: {\n            name: tc.name,\n            arguments: JSON.stringify(tc.parameters),\n          },\n        }));\n      }\n\n      if (msg.toolCallId) {\n        converted.tool_call_id = msg.toolCallId;\n      }\n\n      return converted;\n    });\n  }\n\n  /**\n   * Convert tools to OpenAI format\n   */\n  private convertTools(tools: any[]): any[] {\n    return tools.map((tool) => ({\n      type: 'function',\n      function: {\n        name: tool.name,\n        description: tool.description,\n        parameters: tool.parameters,\n      },\n    }));\n  }\n\n  /**\n   * Parse tool calls from OpenAI response\n   */\n  private parseToolCalls(toolCalls: any[]): ToolCall[] {\n    return toolCalls.map((tc) => ({\n      id: tc.id || `tool-${generateShortId()}`,\n      name: tc.function.name,\n      parameters: JSON.parse(tc.function.arguments || '{}'),\n    }));\n  }\n\n  /**\n   * Map OpenAI finish reason to standard format\n   */\n  private mapFinishReason(\n    reason: string\n  ): 'stop' | 'tool_calls' | 'length' | 'content_filter' {\n    switch (reason) {\n      case 'stop':\n        return 'stop';\n      case 'tool_calls':\n        return 'tool_calls';\n      case 'length':\n        return 'length';\n      case 'content_filter':\n        return 'content_filter';\n      default:\n        return 'stop';\n    }\n  }\n\n  getProviderName(): string {\n    return 'openai';\n  }\n}\n","/**\n * Anthropic LLM Provider\n *\n * Integration with Anthropic's Claude API\n */\n\nimport { LLMProvider, ChatRequest, ChatResponse } from './LLMProvider';\nimport { ToolCall, LLMError } from '../types';\n// import { generateShortId } from '../../utils/id';\n\n/**\n * Anthropic-specific configuration\n */\nexport interface AnthropicConfig {\n  apiKey: string;\n  model: string;\n  baseUrl?: string;\n  temperature?: number;\n  maxTokens?: number;\n  topP?: number;\n}\n\n/**\n * Anthropic provider implementation\n */\nexport class AnthropicProvider extends LLMProvider {\n  private apiKey: string;\n  private baseUrl: string;\n  private model: string;\n\n  constructor(config: AnthropicConfig) {\n    super(config);\n    this.apiKey = config.apiKey || process.env['ANTHROPIC_API_KEY'] || '';\n    this.baseUrl = config.baseUrl || 'https://api.anthropic.com/v1';\n    this.model = config.model;\n\n    if (!this.apiKey) {\n      throw new LLMError('Anthropic API key is required', 'anthropic', { config });\n    }\n  }\n\n  /**\n   * Send chat request to Anthropic\n   */\n  async chat(request: ChatRequest): Promise<ChatResponse> {\n    try {\n      const { system, messages } = this.convertMessages(request.messages);\n      const tools = request.tools ? this.convertTools(request.tools) : undefined;\n\n      const payload: any = {\n        model: this.model,\n        messages,\n        max_tokens: request.maxTokens ?? this.config.maxTokens ?? 4096,\n        temperature: request.temperature ?? this.config.temperature ?? 0.7,\n        top_p: request.topP ?? this.config.topP,\n        stream: request.streaming ?? false,\n      };\n\n      if (system) {\n        payload.system = system;\n      }\n\n      if (tools && tools.length > 0) {\n        payload.tools = tools;\n      }\n\n      // Handle streaming\n      if (request.streaming && request.onStream) {\n        return await this.streamChat(payload, request.onStream);\n      }\n\n      // Regular non-streaming chat\n      const response = await fetch(`${this.baseUrl}/messages`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'x-api-key': this.apiKey,\n          'anthropic-version': '2023-06-01',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        const error = await response.json();\n        throw new Error(error.error?.message || 'Anthropic API error');\n      }\n\n      const data = await response.json();\n      return this.parseResponse(data);\n    } catch (error) {\n      const errorObj = error as Error;\n      throw new LLMError(\n        `Anthropic chat failed: ${errorObj.message}`,\n        'anthropic',\n        { model: this.model, error: errorObj }\n      );\n    }\n  }\n\n  /**\n   * Stream chat completion\n   */\n  private async streamChat(\n    payload: any,\n    onStream: (chunk: string) => void | Promise<void>\n  ): Promise<ChatResponse> {\n    const response = await fetch(`${this.baseUrl}/messages`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'x-api-key': this.apiKey,\n        'anthropic-version': '2023-06-01',\n      },\n      body: JSON.stringify(payload),\n    });\n\n    if (!response.ok) {\n      const error = await response.json();\n      throw new Error(error.error?.message || 'Anthropic API error');\n    }\n\n    const reader = response.body?.getReader();\n    if (!reader) {\n      throw new Error('No response body');\n    }\n\n    const decoder = new TextDecoder();\n    let content = '';\n    let toolCalls: ToolCall[] | undefined;\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n\n        const chunk = decoder.decode(value);\n        const lines = chunk.split('\\n').filter((line) => line.trim() !== '');\n\n        for (const line of lines) {\n          if (line.startsWith('data: ')) {\n            const data = line.slice(6);\n\n            try {\n              const parsed = JSON.parse(data);\n\n              if (parsed.type === 'content_block_delta') {\n                const delta = parsed.delta;\n                if (delta.type === 'text_delta' && delta.text) {\n                  content += delta.text;\n                  await onStream(delta.text);\n                }\n              }\n\n              if (parsed.type === 'content_block_start') {\n                const block = parsed.content_block;\n                if (block.type === 'tool_use') {\n                  if (!toolCalls) toolCalls = [];\n                  toolCalls.push({\n                    id: block.id,\n                    name: block.name,\n                    parameters: {},\n                  });\n                }\n              }\n\n              if (parsed.type === 'content_block_delta') {\n                const delta = parsed.delta;\n                if (delta.type === 'input_json_delta' && delta.partial_json) {\n                  // Accumulate tool parameters\n                  if (toolCalls && toolCalls.length > 0) {\n                    const lastTool = toolCalls[toolCalls.length - 1];\n                    // Note: This is simplified - real implementation would\n                    // need to properly accumulate JSON chunks\n                    if (lastTool) {\n                      try {\n                        lastTool.parameters = JSON.parse(delta.partial_json);\n                      } catch {\n                        // Continue accumulating\n                      }\n                    }\n                  }\n                }\n              }\n            } catch (e) {\n              // Skip invalid JSON\n            }\n          }\n        }\n      }\n    } finally {\n      reader.releaseLock();\n    }\n\n    return {\n      content,\n      toolCalls,\n      finishReason: toolCalls ? 'tool_calls' : 'stop',\n    };\n  }\n\n  /**\n   * Parse Anthropic response\n   */\n  private parseResponse(data: any): ChatResponse {\n    let content = '';\n    let toolCalls: ToolCall[] | undefined;\n\n    // Anthropic returns content as an array of blocks\n    if (data.content && Array.isArray(data.content)) {\n      for (const block of data.content) {\n        if (block.type === 'text') {\n          content += block.text;\n        } else if (block.type === 'tool_use') {\n          if (!toolCalls) toolCalls = [];\n          toolCalls.push({\n            id: block.id,\n            name: block.name,\n            parameters: block.input || {},\n          });\n        }\n      }\n    }\n\n    return {\n      content,\n      toolCalls,\n      finishReason: this.mapStopReason(data.stop_reason),\n      usage: data.usage\n        ? {\n            promptTokens: data.usage.input_tokens,\n            completionTokens: data.usage.output_tokens,\n            totalTokens: data.usage.input_tokens + data.usage.output_tokens,\n          }\n        : undefined,\n    };\n  }\n\n  /**\n   * Convert messages to Anthropic format\n   */\n  private convertMessages(messages: any[]): {\n    system?: string;\n    messages: any[];\n  } {\n    let system: string | undefined;\n    const anthropicMessages: any[] = [];\n\n    for (const msg of messages) {\n      if (msg.role === 'system') {\n        system = msg.content;\n        continue;\n      }\n\n      if (msg.role === 'tool') {\n        // Tool result message\n        anthropicMessages.push({\n          role: 'user',\n          content: [\n            {\n              type: 'tool_result',\n              tool_use_id: msg.toolCallId,\n              content: msg.content,\n            },\n          ],\n        });\n      } else if (msg.toolCalls) {\n        // Assistant message with tool calls\n        const content: any[] = [];\n\n        if (msg.content) {\n          content.push({\n            type: 'text',\n            text: msg.content,\n          });\n        }\n\n        for (const tc of msg.toolCalls) {\n          content.push({\n            type: 'tool_use',\n            id: tc.id,\n            name: tc.name,\n            input: tc.parameters,\n          });\n        }\n\n        anthropicMessages.push({\n          role: 'assistant',\n          content,\n        });\n      } else {\n        // Regular message\n        anthropicMessages.push({\n          role: msg.role === 'user' ? 'user' : 'assistant',\n          content: msg.content,\n        });\n      }\n    }\n\n    return { system, messages: anthropicMessages };\n  }\n\n  /**\n   * Convert tools to Anthropic format\n   */\n  private convertTools(tools: any[]): any[] {\n    return tools.map((tool) => ({\n      name: tool.name,\n      description: tool.description,\n      input_schema: tool.parameters,\n    }));\n  }\n\n  /**\n   * Map Anthropic stop reason to standard format\n   */\n  private mapStopReason(\n    reason: string\n  ): 'stop' | 'tool_calls' | 'length' | 'content_filter' {\n    switch (reason) {\n      case 'end_turn':\n        return 'stop';\n      case 'tool_use':\n        return 'tool_calls';\n      case 'max_tokens':\n        return 'length';\n      case 'stop_sequence':\n        return 'stop';\n      default:\n        return 'stop';\n    }\n  }\n\n  getProviderName(): string {\n    return 'anthropic';\n  }\n}\n","/**\n * Type definitions for conversation summarization\n */\n\nimport { Message } from '../types';\n\n/**\n * Compression level for summaries\n */\nexport enum CompressionLevel {\n  /** Very brief summary - key points only */\n  BRIEF = 'brief',\n  /** Moderate summary - balanced detail */\n  MODERATE = 'moderate',\n  /** Detailed summary - comprehensive */\n  DETAILED = 'detailed',\n}\n\n/**\n * Summarization strategy\n */\nexport type SummaryStrategy =\n  | 'single-pass'\n  | 'rolling'\n  | 'hierarchical'\n  | 'extractive'\n  | 'hybrid';\n\n/**\n * LLM provider for summarization\n */\nexport type SummaryProvider = 'openai' | 'anthropic';\n\n/**\n * Configuration for conversation summarization\n */\nexport interface SummaryConfig {\n  /**\n   * Summarization strategy to use\n   */\n  strategy: SummaryStrategy;\n\n  /**\n   * Compression level\n   */\n  compressionLevel: CompressionLevel;\n\n  /**\n   * LLM provider for summarization\n   */\n  provider: SummaryProvider;\n\n  /**\n   * Provider-specific configuration\n   */\n  providerConfig: {\n    apiKey: string;\n    model: string;\n    temperature?: number;\n    maxTokens?: number;\n  };\n\n  /**\n   * Custom prompt template for summarization\n   */\n  customPrompt?: string;\n\n  /**\n   * Chunk size for rolling and hierarchical strategies (number of messages)\n   */\n  chunkSize?: number;\n\n  /**\n   * Maximum number of key points to extract\n   */\n  maxKeyPoints?: number;\n\n  /**\n   * Whether to cache summaries\n   */\n  enableCache?: boolean;\n\n  /**\n   * Cache TTL in seconds (0 = no expiration)\n   */\n  cacheTTL?: number;\n\n  /**\n   * Whether to include metadata in summaries\n   */\n  includeMetadata?: boolean;\n\n  /**\n   * Custom metadata to include in summary\n   */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Summary of a conversation or conversation chunk\n */\nexport interface Summary {\n  /**\n   * Unique identifier for this summary\n   */\n  id: string;\n\n  /**\n   * Conversation ID this summary belongs to\n   */\n  conversationId: string;\n\n  /**\n   * The summarized content\n   */\n  content: string;\n\n  /**\n   * Key points extracted from the conversation\n   */\n  keyPoints?: string[];\n\n  /**\n   * Strategy used to generate this summary\n   */\n  strategy: SummaryStrategy;\n\n  /**\n   * Compression level used\n   */\n  compressionLevel: CompressionLevel;\n\n  /**\n   * Number of messages summarized\n   */\n  messageCount: number;\n\n  /**\n   * Range of messages summarized (indices)\n   */\n  messageRange?: {\n    start: number;\n    end: number;\n  };\n\n  /**\n   * Timestamp when summary was created\n   */\n  createdAt: number;\n\n  /**\n   * Timestamp when summary was last updated\n   */\n  updatedAt?: number;\n\n  /**\n   * Token usage for generating this summary\n   */\n  usage?: {\n    promptTokens: number;\n    completionTokens: number;\n    totalTokens: number;\n  };\n\n  /**\n   * Parent summary ID (for hierarchical summaries)\n   */\n  parentSummaryId?: string;\n\n  /**\n   * Child summary IDs (for hierarchical summaries)\n   */\n  childSummaryIds?: string[];\n\n  /**\n   * Custom metadata\n   */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Result of a summarization operation\n */\nexport interface SummarizationResult {\n  /**\n   * The primary summary\n   */\n  summary: Summary;\n\n  /**\n   * Additional summaries (for hierarchical strategy)\n   */\n  additionalSummaries?: Summary[];\n\n  /**\n   * Whether the summary was retrieved from cache\n   */\n  cached: boolean;\n\n  /**\n   * Total time taken to generate summary (ms)\n   */\n  durationMs: number;\n}\n\n/**\n * Options for summarization\n */\nexport interface SummarizeOptions {\n  /**\n   * Start index for messages to summarize\n   */\n  startIndex?: number;\n\n  /**\n   * End index for messages to summarize\n   */\n  endIndex?: number;\n\n  /**\n   * Whether to force regeneration (skip cache)\n   */\n  forceRegenerate?: boolean;\n\n  /**\n   * Additional context to include in summarization\n   */\n  context?: string;\n\n  /**\n   * Custom metadata for this summary\n   */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Cache entry for summaries\n */\nexport interface SummaryCacheEntry {\n  /**\n   * Cache key\n   */\n  key: string;\n\n  /**\n   * Cached summary\n   */\n  summary: Summary;\n\n  /**\n   * Timestamp when cached\n   */\n  cachedAt: number;\n\n  /**\n   * TTL in seconds\n   */\n  ttl: number;\n}\n\n/**\n * Statistics for summarization operations\n */\nexport interface SummarizationStats {\n  /**\n   * Total number of summaries generated\n   */\n  totalSummaries: number;\n\n  /**\n   * Number of cached summaries used\n   */\n  cacheHits: number;\n\n  /**\n   * Number of summaries regenerated\n   */\n  cacheMisses: number;\n\n  /**\n   * Total tokens used for summarization\n   */\n  totalTokens: number;\n\n  /**\n   * Average time per summary (ms)\n   */\n  averageDurationMs: number;\n\n  /**\n   * Total time spent on summarization (ms)\n   */\n  totalDurationMs: number;\n}\n\n/**\n * Extractive summary sentence\n */\nexport interface ExtractedSentence {\n  /**\n   * The extracted sentence\n   */\n  text: string;\n\n  /**\n   * Score/importance of this sentence\n   */\n  score: number;\n\n  /**\n   * Source message index\n   */\n  messageIndex: number;\n\n  /**\n   * Role of the message author\n   */\n  role: string;\n}\n\n/**\n * Options for incremental summarization\n */\nexport interface IncrementalSummaryOptions {\n  /**\n   * Existing summary to build upon\n   */\n  existingSummary: Summary;\n\n  /**\n   * New messages to incorporate\n   */\n  newMessages: Message[];\n\n  /**\n   * Whether to merge or append new content\n   */\n  mode: 'merge' | 'append';\n}\n","/**\n * Extractive summarization utilities\n *\n * Extract key sentences from conversations without using LLMs\n */\n\nimport { Message, MessageContent } from '../types';\nimport { ExtractedSentence } from './types';\n\n/**\n * Extract text content from a message\n */\nfunction getTextContent(content: string | MessageContent | MessageContent[]): string {\n  if (typeof content === 'string') {\n    return content;\n  }\n  if (Array.isArray(content)) {\n    return content\n      .filter((c): c is MessageContent & { type: 'text' } => c.type === 'text')\n      .map((c) => c.data)\n      .join(' ');\n  }\n  return content.type === 'text' ? content.data : '';\n}\n\n/**\n * Simple word tokenizer\n */\nfunction tokenize(text: string): string[] {\n  return text\n    .toLowerCase()\n    .replace(/[^\\w\\s]/g, ' ')\n    .split(/\\s+/)\n    .filter((word) => word.length > 0);\n}\n\n/**\n * Calculate term frequency for a document\n */\nfunction calculateTF(words: string[]): Map<string, number> {\n  const tf = new Map<string, number>();\n  const totalWords = words.length;\n\n  for (const word of words) {\n    tf.set(word, (tf.get(word) || 0) + 1 / totalWords);\n  }\n\n  return tf;\n}\n\n/**\n * Calculate inverse document frequency across all messages\n */\nfunction calculateIDF(messages: Message[]): Map<string, number> {\n  const idf = new Map<string, number>();\n  const totalDocs = messages.length;\n  const docFrequency = new Map<string, number>();\n\n  // Count document frequency\n  for (const message of messages) {\n    const words = new Set(tokenize(getTextContent(message.content)));\n    for (const word of words) {\n      docFrequency.set(word, (docFrequency.get(word) || 0) + 1);\n    }\n  }\n\n  // Calculate IDF\n  for (const [word, freq] of docFrequency) {\n    idf.set(word, Math.log(totalDocs / freq));\n  }\n\n  return idf;\n}\n\n/**\n * Calculate TF-IDF scores for sentences\n */\nfunction calculateTFIDF(\n  sentence: string,\n  tf: Map<string, number>,\n  idf: Map<string, number>\n): number {\n  const words = tokenize(sentence);\n  let score = 0;\n\n  for (const word of words) {\n    const tfScore = tf.get(word) || 0;\n    const idfScore = idf.get(word) || 0;\n    score += tfScore * idfScore;\n  }\n\n  return score / (words.length || 1);\n}\n\n/**\n * Split text into sentences\n */\nfunction splitIntoSentences(text: string): string[] {\n  // Simple sentence splitting - handles common cases\n  return text\n    .split(/[.!?]+/)\n    .map((s) => s.trim())\n    .filter((s) => s.length > 10); // Filter out very short fragments\n}\n\n/**\n * Extract key sentences from messages using TF-IDF\n */\nexport function extractKeySentences(\n  messages: Message[],\n  maxSentences: number = 5\n): ExtractedSentence[] {\n  if (messages.length === 0) {\n    return [];\n  }\n\n  // Calculate IDF across all messages\n  const idf = calculateIDF(messages);\n\n  const scoredSentences: ExtractedSentence[] = [];\n\n  // Process each message\n  for (let i = 0; i < messages.length; i++) {\n    const message = messages[i];\n    if (!message) continue; // Skip if message is undefined (shouldn't happen)\n\n    const sentences = splitIntoSentences(getTextContent(message.content));\n    const words = tokenize(getTextContent(message.content));\n    const tf = calculateTF(words);\n\n    for (const sentence of sentences) {\n      const score = calculateTFIDF(sentence, tf, idf);\n\n      // Boost score for user messages (often contain questions/requests)\n      const roleBoost = message.role === 'user' ? 1.2 : 1.0;\n\n      scoredSentences.push({\n        text: sentence,\n        score: score * roleBoost,\n        messageIndex: i,\n        role: message.role,\n      });\n    }\n  }\n\n  // Sort by score and return top N\n  return scoredSentences\n    .sort((a, b) => b.score - a.score)\n    .slice(0, maxSentences);\n}\n\n/**\n * Extract key points from messages (distinct from sentences)\n */\nexport function extractKeyPoints(\n  messages: Message[],\n  maxPoints: number = 5\n): string[] {\n  const sentences = extractKeySentences(messages, maxPoints * 2);\n\n  // Group consecutive sentences from same message\n  const points: string[] = [];\n  const seen = new Set<number>();\n\n  for (const sentence of sentences) {\n    if (points.length >= maxPoints) break;\n    if (seen.has(sentence.messageIndex)) continue;\n\n    points.push(sentence.text);\n    seen.add(sentence.messageIndex);\n  }\n\n  return points;\n}\n\n/**\n * Create an extractive summary from messages\n */\nexport function createExtractiveSummary(\n  messages: Message[],\n  maxSentences: number = 5\n): string {\n  const sentences = extractKeySentences(messages, maxSentences);\n\n  // Sort by message index to maintain chronological order\n  const orderedSentences = sentences.sort(\n    (a, b) => a.messageIndex - b.messageIndex\n  );\n\n  return orderedSentences.map((s) => s.text).join('. ') + '.';\n}\n\n/**\n * Calculate conversation diversity (vocabulary richness)\n */\nexport function calculateDiversity(messages: Message[]): number {\n  const allWords = messages.flatMap((m) => tokenize(getTextContent(m.content)));\n  const uniqueWords = new Set(allWords);\n\n  if (allWords.length === 0) return 0;\n\n  return uniqueWords.size / allWords.length;\n}\n\n/**\n * Identify important keywords in conversation\n */\nexport function extractKeywords(\n  messages: Message[],\n  topN: number = 10\n): string[] {\n  const idf = calculateIDF(messages);\n  const allWords = messages.flatMap((m) => tokenize(getTextContent(m.content)));\n  const tf = calculateTF(allWords);\n\n  // Calculate TF-IDF for each word\n  const wordScores = new Map<string, number>();\n  for (const [word, tfScore] of tf) {\n    const idfScore = idf.get(word) || 0;\n    wordScores.set(word, tfScore * idfScore);\n  }\n\n  // Filter out common stop words\n  const stopWords = new Set([\n    'the',\n    'a',\n    'an',\n    'and',\n    'or',\n    'but',\n    'in',\n    'on',\n    'at',\n    'to',\n    'for',\n    'of',\n    'with',\n    'by',\n    'from',\n    'as',\n    'is',\n    'was',\n    'are',\n    'were',\n    'be',\n    'been',\n    'being',\n    'have',\n    'has',\n    'had',\n    'do',\n    'does',\n    'did',\n    'will',\n    'would',\n    'should',\n    'could',\n    'can',\n    'may',\n    'might',\n    'must',\n    'this',\n    'that',\n    'these',\n    'those',\n    'i',\n    'you',\n    'he',\n    'she',\n    'it',\n    'we',\n    'they',\n    'what',\n    'which',\n    'who',\n    'when',\n    'where',\n    'why',\n    'how',\n  ]);\n\n  const filteredScores = Array.from(wordScores.entries()).filter(\n    ([word]) => !stopWords.has(word) && word.length > 2\n  );\n\n  return filteredScores\n    .sort((a, b) => b[1] - a[1])\n    .slice(0, topN)\n    .map(([word]) => word);\n}\n","/**\n * Conversation Summarizer\n *\n * Automatic summarization of long conversations using various strategies\n */\n\nimport { Message } from '../types';\nimport { LLMProvider } from '../agents/llm/LLMProvider';\nimport { OpenAIProvider } from '../agents/llm/OpenAIProvider';\nimport { AnthropicProvider } from '../agents/llm/AnthropicProvider';\nimport { generateShortId } from '../utils/id';\nimport {\n  SummaryConfig,\n  Summary,\n  SummarizationResult,\n  SummarizeOptions,\n  CompressionLevel,\n  SummaryStrategy,\n  SummaryCacheEntry,\n  SummarizationStats,\n  IncrementalSummaryOptions,\n} from './types';\nimport {\n  extractKeySentences,\n  extractKeyPoints,\n  createExtractiveSummary,\n  extractKeywords,\n} from './extractive';\n\n/**\n * Default prompts for different compression levels\n */\nconst DEFAULT_PROMPTS = {\n  [CompressionLevel.BRIEF]:\n    'Provide a very brief 2-3 sentence summary of this conversation, focusing only on the most critical points.',\n  [CompressionLevel.MODERATE]:\n    'Summarize this conversation in a paragraph, covering the main topics and key decisions.',\n  [CompressionLevel.DETAILED]:\n    'Provide a comprehensive summary of this conversation, including all important topics, decisions, and context.',\n};\n\n/**\n * Conversation Summarizer\n */\nexport class ConversationSummarizer {\n  private config: SummaryConfig;\n  private provider: LLMProvider;\n  private cache: Map<string, SummaryCacheEntry>;\n  private stats: SummarizationStats;\n\n  constructor(config: SummaryConfig) {\n    this.config = {\n      chunkSize: 10,\n      maxKeyPoints: 5,\n      enableCache: true,\n      cacheTTL: 3600, // 1 hour default\n      includeMetadata: true,\n      ...config,\n    };\n\n    this.provider = this.createProvider();\n    this.cache = new Map();\n    this.stats = {\n      totalSummaries: 0,\n      cacheHits: 0,\n      cacheMisses: 0,\n      totalTokens: 0,\n      averageDurationMs: 0,\n      totalDurationMs: 0,\n    };\n  }\n\n  /**\n   * Create LLM provider based on configuration\n   */\n  private createProvider(): LLMProvider {\n    const { provider, providerConfig } = this.config;\n\n    if (provider === 'openai') {\n      return new OpenAIProvider({\n        apiKey: providerConfig.apiKey,\n        model: providerConfig.model,\n        temperature: providerConfig.temperature ?? 0.3,\n        maxTokens: providerConfig.maxTokens ?? 1000,\n      });\n    } else if (provider === 'anthropic') {\n      return new AnthropicProvider({\n        apiKey: providerConfig.apiKey,\n        model: providerConfig.model,\n        temperature: providerConfig.temperature ?? 0.3,\n        maxTokens: providerConfig.maxTokens ?? 1000,\n      });\n    }\n\n    throw new Error(`Unsupported provider: ${provider}`);\n  }\n\n  /**\n   * Summarize a conversation\n   */\n  async summarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions = {}\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n\n    // Apply message range if specified\n    const startIdx = options.startIndex ?? 0;\n    const endIdx = options.endIndex ?? messages.length;\n    const messagesToSummarize = messages.slice(startIdx, endIdx);\n\n    if (messagesToSummarize.length === 0) {\n      throw new Error('No messages to summarize');\n    }\n\n    // Check cache if enabled\n    if (this.config.enableCache && !options.forceRegenerate) {\n      const cached = this.getCachedSummary(\n        conversationId,\n        startIdx,\n        endIdx,\n        this.config.strategy\n      );\n      if (cached) {\n        this.stats.cacheHits++;\n        return {\n          summary: cached,\n          cached: true,\n          durationMs: Date.now() - startTime,\n        };\n      }\n    }\n\n    this.stats.cacheMisses++;\n\n    // Generate summary based on strategy\n    let result: SummarizationResult;\n\n    switch (this.config.strategy) {\n      case 'single-pass':\n        result = await this.singlePassSummarize(\n          conversationId,\n          messagesToSummarize,\n          options\n        );\n        break;\n      case 'rolling':\n        result = await this.rollingSummarize(\n          conversationId,\n          messagesToSummarize,\n          options\n        );\n        break;\n      case 'hierarchical':\n        result = await this.hierarchicalSummarize(\n          conversationId,\n          messagesToSummarize,\n          options\n        );\n        break;\n      case 'extractive':\n        result = await this.extractiveSummarize(\n          conversationId,\n          messagesToSummarize,\n          options\n        );\n        break;\n      case 'hybrid':\n        result = await this.hybridSummarize(\n          conversationId,\n          messagesToSummarize,\n          options\n        );\n        break;\n      default:\n        throw new Error(`Unsupported strategy: ${this.config.strategy}`);\n    }\n\n    // Update message range\n    result.summary.messageRange = { start: startIdx, end: endIdx };\n\n    // Cache the result\n    if (this.config.enableCache) {\n      this.cacheSummary(result.summary);\n    }\n\n    // Update stats\n    this.stats.totalSummaries++;\n    this.stats.totalDurationMs += result.durationMs;\n    this.stats.averageDurationMs =\n      this.stats.totalDurationMs / this.stats.totalSummaries;\n    if (result.summary.usage) {\n      this.stats.totalTokens += result.summary.usage.totalTokens;\n    }\n\n    return result;\n  }\n\n  /**\n   * Single-pass summarization - summarize entire conversation in one LLM call\n   */\n  private async singlePassSummarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n\n    const prompt = this.buildPrompt(messages, options.context);\n    const response = await this.provider.chat({\n      messages: [\n        {\n          role: 'system',\n          content: this.config.customPrompt || DEFAULT_PROMPTS[this.config.compressionLevel],\n          timestamp: new Date().toISOString(),\n        },\n        {\n          role: 'user',\n          content: prompt,\n          timestamp: new Date().toISOString(),\n        },\n      ],\n      temperature: this.config.providerConfig.temperature,\n      maxTokens: this.config.providerConfig.maxTokens,\n    });\n\n    const summary: Summary = {\n      id: `sum-${generateShortId()}`,\n      conversationId,\n      content: response.content,\n      keyPoints: this.extractKeyPointsFromSummary(response.content),\n      strategy: 'single-pass',\n      compressionLevel: this.config.compressionLevel,\n      messageCount: messages.length,\n      createdAt: Date.now(),\n      usage: response.usage,\n      metadata: options.metadata,\n    };\n\n    return {\n      summary,\n      cached: false,\n      durationMs: Date.now() - startTime,\n    };\n  }\n\n  /**\n   * Rolling summarization - summarize in chunks, then summarize summaries\n   */\n  private async rollingSummarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n    const chunkSize = this.config.chunkSize ?? 10;\n\n    // Split into chunks\n    const chunks: Message[][] = [];\n    for (let i = 0; i < messages.length; i += chunkSize) {\n      chunks.push(messages.slice(i, i + chunkSize));\n    }\n\n    // Summarize each chunk\n    const chunkSummaries: string[] = [];\n    let totalUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n\n    for (const chunk of chunks) {\n      const prompt = this.buildPrompt(chunk, options.context);\n      const response = await this.provider.chat({\n        messages: [\n          {\n            role: 'system',\n            content: 'Summarize this portion of the conversation concisely.',\n            timestamp: new Date().toISOString(),\n          },\n          {\n            role: 'user',\n            content: prompt,\n            timestamp: new Date().toISOString(),\n          },\n        ],\n        temperature: this.config.providerConfig.temperature,\n        maxTokens: this.config.providerConfig.maxTokens,\n      });\n\n      chunkSummaries.push(response.content);\n      if (response.usage) {\n        totalUsage.promptTokens += response.usage.promptTokens;\n        totalUsage.completionTokens += response.usage.completionTokens;\n        totalUsage.totalTokens += response.usage.totalTokens;\n      }\n    }\n\n    // Summarize the summaries\n    const finalPrompt = `Combine these summaries into a ${this.config.compressionLevel} summary:\\n\\n${chunkSummaries.join('\\n\\n')}`;\n    const finalResponse = await this.provider.chat({\n      messages: [\n        {\n          role: 'system',\n          content: this.config.customPrompt || DEFAULT_PROMPTS[this.config.compressionLevel],\n          timestamp: new Date().toISOString(),\n        },\n        {\n          role: 'user',\n          content: finalPrompt,\n          timestamp: new Date().toISOString(),\n        },\n      ],\n      temperature: this.config.providerConfig.temperature,\n      maxTokens: this.config.providerConfig.maxTokens,\n    });\n\n    if (finalResponse.usage) {\n      totalUsage.promptTokens += finalResponse.usage.promptTokens;\n      totalUsage.completionTokens += finalResponse.usage.completionTokens;\n      totalUsage.totalTokens += finalResponse.usage.totalTokens;\n    }\n\n    const summary: Summary = {\n      id: `sum-${generateShortId()}`,\n      conversationId,\n      content: finalResponse.content,\n      keyPoints: this.extractKeyPointsFromSummary(finalResponse.content),\n      strategy: 'rolling',\n      compressionLevel: this.config.compressionLevel,\n      messageCount: messages.length,\n      createdAt: Date.now(),\n      usage: totalUsage,\n      metadata: options.metadata,\n    };\n\n    return {\n      summary,\n      cached: false,\n      durationMs: Date.now() - startTime,\n    };\n  }\n\n  /**\n   * Hierarchical summarization - create multi-level summaries\n   */\n  private async hierarchicalSummarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n    const chunkSize = this.config.chunkSize ?? 10;\n\n    // Create leaf-level summaries\n    const leafSummaries: Summary[] = [];\n    let totalUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n\n    for (let i = 0; i < messages.length; i += chunkSize) {\n      const chunk = messages.slice(i, i + chunkSize);\n      const prompt = this.buildPrompt(chunk, options.context);\n      const response = await this.provider.chat({\n        messages: [\n          {\n            role: 'system',\n            content: 'Summarize this portion of the conversation.',\n            timestamp: new Date().toISOString(),\n          },\n          {\n            role: 'user',\n            content: prompt,\n            timestamp: new Date().toISOString(),\n          },\n        ],\n        temperature: this.config.providerConfig.temperature,\n        maxTokens: this.config.providerConfig.maxTokens ?? 500,\n      });\n\n      if (response.usage) {\n        totalUsage.promptTokens += response.usage.promptTokens;\n        totalUsage.completionTokens += response.usage.completionTokens;\n        totalUsage.totalTokens += response.usage.totalTokens;\n      }\n\n      leafSummaries.push({\n        id: `sum-${generateShortId()}`,\n        conversationId,\n        content: response.content,\n        strategy: 'hierarchical',\n        compressionLevel: CompressionLevel.MODERATE,\n        messageCount: chunk.length,\n        messageRange: { start: i, end: i + chunk.length },\n        createdAt: Date.now(),\n        usage: response.usage,\n      });\n    }\n\n    // Create root summary from leaf summaries\n    const leafContents = leafSummaries.map((s) => s.content).join('\\n\\n');\n    const finalResponse = await this.provider.chat({\n      messages: [\n        {\n          role: 'system',\n          content: this.config.customPrompt || DEFAULT_PROMPTS[this.config.compressionLevel],\n          timestamp: new Date().toISOString(),\n        },\n        {\n          role: 'user',\n          content: `Create a ${this.config.compressionLevel} summary from these section summaries:\\n\\n${leafContents}`,\n          timestamp: new Date().toISOString(),\n        },\n      ],\n      temperature: this.config.providerConfig.temperature,\n      maxTokens: this.config.providerConfig.maxTokens,\n    });\n\n    if (finalResponse.usage) {\n      totalUsage.promptTokens += finalResponse.usage.promptTokens;\n      totalUsage.completionTokens += finalResponse.usage.completionTokens;\n      totalUsage.totalTokens += finalResponse.usage.totalTokens;\n    }\n\n    const rootSummary: Summary = {\n      id: `sum-${generateShortId()}`,\n      conversationId,\n      content: finalResponse.content,\n      keyPoints: this.extractKeyPointsFromSummary(finalResponse.content),\n      strategy: 'hierarchical',\n      compressionLevel: this.config.compressionLevel,\n      messageCount: messages.length,\n      createdAt: Date.now(),\n      usage: totalUsage,\n      childSummaryIds: leafSummaries.map((s) => s.id),\n      metadata: options.metadata,\n    };\n\n    // Link parent to children\n    leafSummaries.forEach((leaf) => {\n      leaf.parentSummaryId = rootSummary.id;\n    });\n\n    return {\n      summary: rootSummary,\n      additionalSummaries: leafSummaries,\n      cached: false,\n      durationMs: Date.now() - startTime,\n    };\n  }\n\n  /**\n   * Extractive summarization - extract key sentences without LLM\n   */\n  private async extractiveSummarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n\n    // Determine number of sentences based on compression level\n    const sentenceCount = {\n      [CompressionLevel.BRIEF]: 3,\n      [CompressionLevel.MODERATE]: 5,\n      [CompressionLevel.DETAILED]: 10,\n    }[this.config.compressionLevel];\n\n    const content = createExtractiveSummary(messages, sentenceCount);\n    const keyPoints = extractKeyPoints(\n      messages,\n      this.config.maxKeyPoints ?? 5\n    );\n\n    const summary: Summary = {\n      id: `sum-${generateShortId()}`,\n      conversationId,\n      content,\n      keyPoints,\n      strategy: 'extractive',\n      compressionLevel: this.config.compressionLevel,\n      messageCount: messages.length,\n      createdAt: Date.now(),\n      metadata: options.metadata,\n    };\n\n    return {\n      summary,\n      cached: false,\n      durationMs: Date.now() - startTime,\n    };\n  }\n\n  /**\n   * Hybrid summarization - combine extractive and abstractive approaches\n   */\n  private async hybridSummarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n\n    // First, extract key sentences\n    const keySentences = extractKeySentences(messages, 10);\n    const keywords = extractKeywords(messages, 15);\n\n    // Build context from extracted content\n    const extractedContext = keySentences.map((s) => s.text).join(' ');\n\n    // Use LLM to create coherent summary from extracted content\n    const prompt = `Based on these key points from a conversation:\\n\\n${extractedContext}\\n\\nKey topics: ${keywords.join(', ')}\\n\\nCreate a ${this.config.compressionLevel} coherent summary.`;\n\n    const response = await this.provider.chat({\n      messages: [\n        {\n          role: 'system',\n          content: this.config.customPrompt || DEFAULT_PROMPTS[this.config.compressionLevel],\n          timestamp: new Date().toISOString(),\n        },\n        {\n          role: 'user',\n          content: prompt,\n          timestamp: new Date().toISOString(),\n        },\n      ],\n      temperature: this.config.providerConfig.temperature,\n      maxTokens: this.config.providerConfig.maxTokens,\n    });\n\n    const summary: Summary = {\n      id: `sum-${generateShortId()}`,\n      conversationId,\n      content: response.content,\n      keyPoints: keywords.slice(0, this.config.maxKeyPoints ?? 5),\n      strategy: 'hybrid',\n      compressionLevel: this.config.compressionLevel,\n      messageCount: messages.length,\n      createdAt: Date.now(),\n      usage: response.usage,\n      metadata: options.metadata,\n    };\n\n    return {\n      summary,\n      cached: false,\n      durationMs: Date.now() - startTime,\n    };\n  }\n\n  /**\n   * Incremental summarization - append new messages to existing summary\n   */\n  async summarizeIncremental(\n    options: IncrementalSummaryOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n    const { existingSummary, newMessages, mode } = options;\n\n    if (mode === 'append') {\n      // Simple append - add new summary to existing\n      const newSummaryResult = await this.summarize(\n        existingSummary.conversationId,\n        newMessages,\n        { forceRegenerate: true }\n      );\n\n      const combinedSummary: Summary = {\n        ...existingSummary,\n        id: `sum-${generateShortId()}`,\n        content: `${existingSummary.content}\\n\\n${newSummaryResult.summary.content}`,\n        messageCount:\n          existingSummary.messageCount + newMessages.length,\n        updatedAt: Date.now(),\n      };\n\n      return {\n        summary: combinedSummary,\n        cached: false,\n        durationMs: Date.now() - startTime,\n      };\n    } else {\n      // Merge mode - re-summarize with context\n      const prompt = `Previous summary: ${existingSummary.content}\\n\\nNew messages to incorporate:\\n${this.buildPrompt(newMessages)}\\n\\nUpdate the summary to include the new information.`;\n\n      const response = await this.provider.chat({\n        messages: [\n          {\n            role: 'system',\n            content: this.config.customPrompt || DEFAULT_PROMPTS[this.config.compressionLevel],\n            timestamp: new Date().toISOString(),\n          },\n          {\n            role: 'user',\n            content: prompt,\n            timestamp: new Date().toISOString(),\n          },\n        ],\n        temperature: this.config.providerConfig.temperature,\n        maxTokens: this.config.providerConfig.maxTokens,\n      });\n\n      const mergedSummary: Summary = {\n        ...existingSummary,\n        id: `sum-${generateShortId()}`,\n        content: response.content,\n        keyPoints: this.extractKeyPointsFromSummary(response.content),\n        messageCount:\n          existingSummary.messageCount + newMessages.length,\n        updatedAt: Date.now(),\n        usage: response.usage,\n      };\n\n      return {\n        summary: mergedSummary,\n        cached: false,\n        durationMs: Date.now() - startTime,\n      };\n    }\n  }\n\n  /**\n   * Build prompt from messages\n   */\n  private buildPrompt(messages: Message[], context?: string): string {\n    const conversationText = messages\n      .map((m) => `${m.role}: ${m.content}`)\n      .join('\\n\\n');\n\n    if (context) {\n      return `Context: ${context}\\n\\nConversation:\\n${conversationText}`;\n    }\n\n    return `Conversation:\\n${conversationText}`;\n  }\n\n  /**\n   * Extract key points from summary text\n   */\n  private extractKeyPointsFromSummary(summary: string): string[] {\n    // Simple extraction - look for bullet points or numbered lists\n    const bulletPoints = summary.match(/^[-•*]\\s+(.+)$/gm);\n    if (bulletPoints) {\n      return bulletPoints\n        .map((p) => p.replace(/^[-•*]\\s+/, '').trim())\n        .slice(0, this.config.maxKeyPoints ?? 5);\n    }\n\n    const numberedPoints = summary.match(/^\\d+\\.\\s+(.+)$/gm);\n    if (numberedPoints) {\n      return numberedPoints\n        .map((p) => p.replace(/^\\d+\\.\\s+/, '').trim())\n        .slice(0, this.config.maxKeyPoints ?? 5);\n    }\n\n    // Fallback - split by sentences and take first few\n    return summary\n      .split(/[.!?]+/)\n      .map((s) => s.trim())\n      .filter((s) => s.length > 10)\n      .slice(0, this.config.maxKeyPoints ?? 5);\n  }\n\n  /**\n   * Get cached summary if available and not expired\n   */\n  private getCachedSummary(\n    conversationId: string,\n    startIdx: number,\n    endIdx: number,\n    strategy: SummaryStrategy\n  ): Summary | null {\n    const key = this.getCacheKey(conversationId, startIdx, endIdx, strategy);\n    const entry = this.cache.get(key);\n\n    if (!entry) return null;\n\n    // Check if expired\n    const now = Date.now();\n    const age = (now - entry.cachedAt) / 1000; // seconds\n    if (entry.ttl > 0 && age > entry.ttl) {\n      this.cache.delete(key);\n      return null;\n    }\n\n    return entry.summary;\n  }\n\n  /**\n   * Cache a summary\n   */\n  private cacheSummary(summary: Summary): void {\n    if (!summary.messageRange) return;\n\n    const key = this.getCacheKey(\n      summary.conversationId,\n      summary.messageRange.start,\n      summary.messageRange.end,\n      summary.strategy\n    );\n\n    this.cache.set(key, {\n      key,\n      summary,\n      cachedAt: Date.now(),\n      ttl: this.config.cacheTTL ?? 3600,\n    });\n  }\n\n  /**\n   * Generate cache key\n   */\n  private getCacheKey(\n    conversationId: string,\n    startIdx: number,\n    endIdx: number,\n    strategy: SummaryStrategy\n  ): string {\n    return `${conversationId}:${startIdx}:${endIdx}:${strategy}:${this.config.compressionLevel}`;\n  }\n\n  /**\n   * Clear cache\n   */\n  clearCache(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Get summarization statistics\n   */\n  getStats(): SummarizationStats {\n    return { ...this.stats };\n  }\n\n  /**\n   * Reset statistics\n   */\n  resetStats(): void {\n    this.stats = {\n      totalSummaries: 0,\n      cacheHits: 0,\n      cacheMisses: 0,\n      totalTokens: 0,\n      averageDurationMs: 0,\n      totalDurationMs: 0,\n    };\n  }\n}\n"]}