{"version":3,"sources":["../../src/search/SemanticSearch.ts"],"names":["i"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Semantic search implementation for conversation history\n *\n * Provides vector-based semantic search using OpenAI embeddings API.\n * Supports similarity search, ranking, and filtering across conversations.\n */\n\nimport OpenAI from 'openai'\nimport { Message } from '../types'\nimport { ConversationStore } from '../store/ConversationStore'\nimport {\n  EmbeddingConfig,\n  SearchOptions,\n  SearchResult,\n  SimilarMessageOptions,\n  ConversationSearchOptions,\n  BatchEmbeddingRequest,\n  BatchEmbeddingResponse,\n  EmbeddingCacheEntry,\n  SearchStats,\n  SearchFilter,\n  EmbeddingModel,\n} from './types'\n\n/**\n * Semantic search engine for conversation messages\n */\nexport class SemanticSearch {\n  private openai: OpenAI\n  private config: Required<Omit<EmbeddingConfig, 'apiKey'>>\n  private store: ConversationStore\n  private embeddingCache: Map<string, EmbeddingCacheEntry>\n  private stats: SearchStats\n\n  constructor(store: ConversationStore, config: EmbeddingConfig) {\n    if (!config.apiKey) {\n      throw new Error('OpenAI API key is required')\n    }\n\n    this.store = store\n    this.openai = new OpenAI({\n      apiKey: config.apiKey,\n      maxRetries: config.maxRetries ?? 3,\n      timeout: config.timeout ?? 30000,\n    })\n\n    this.config = {\n      model: config.model ?? 'text-embedding-3-small',\n      batchSize: config.batchSize ?? 100,\n      dimensions: config.dimensions ?? 1536,\n      maxRetries: config.maxRetries ?? 3,\n      timeout: config.timeout ?? 30000,\n    }\n\n    this.embeddingCache = new Map()\n    this.stats = {\n      totalMessages: 0,\n      totalConversations: 0,\n      totalEmbeddings: 0,\n      cacheHitRate: 0,\n      avgEmbeddingTime: 0,\n    }\n  }\n\n  /**\n   * Generate embedding for a single text\n   */\n  private async generateEmbedding(text: string): Promise<number[]> {\n    const cacheKey = this.getCacheKey(text, this.config.model)\n    const cached = this.embeddingCache.get(cacheKey)\n\n    if (cached && !this.isCacheExpired(cached)) {\n      return cached.embedding\n    }\n\n    const startTime = Date.now()\n\n    try {\n      const response = await this.openai.embeddings.create({\n        model: this.config.model,\n        input: text,\n        dimensions: this.config.dimensions,\n      })\n\n      const embedding = response.data[0]?.embedding\n      if (!embedding) {\n        throw new Error('Failed to generate embedding')\n      }\n      const duration = Date.now() - startTime\n\n      // Update cache\n      this.embeddingCache.set(cacheKey, {\n        text,\n        embedding,\n        model: this.config.model,\n        cachedAt: Date.now(),\n        ttl: 3600000, // 1 hour\n      })\n\n      // Update stats\n      this.stats.totalEmbeddings++\n      this.updateAvgEmbeddingTime(duration)\n\n      return embedding\n    } catch (error) {\n      throw new Error(\n        `Failed to generate embedding: ${error instanceof Error ? error.message : String(error)}`\n      )\n    }\n  }\n\n  /**\n   * Generate embeddings for multiple texts in batches\n   */\n  async generateBatchEmbeddings(\n    request: BatchEmbeddingRequest\n  ): Promise<BatchEmbeddingResponse> {\n    const { texts, model, dimensions } = request\n    const embedModel = model ?? this.config.model\n    const embedDimensions = dimensions ?? this.config.dimensions\n\n    if (texts.length === 0) {\n      return {\n        embeddings: [],\n        model: embedModel,\n        usage: { promptTokens: 0, totalTokens: 0 },\n      }\n    }\n\n    const embeddings: number[][] = []\n    let totalPromptTokens = 0\n    let totalTokens = 0\n\n    // Process in batches\n    for (let i = 0; i < texts.length; i += this.config.batchSize) {\n      const batch = texts.slice(i, i + this.config.batchSize)\n      const batchEmbeddings: number[][] = []\n\n      // Check cache first\n      const uncachedTexts: string[] = []\n      const uncachedIndices: number[] = []\n\n      batch.forEach((text, index) => {\n        const cacheKey = this.getCacheKey(text, embedModel)\n        const cached = this.embeddingCache.get(cacheKey)\n\n        if (cached && !this.isCacheExpired(cached)) {\n          batchEmbeddings[index] = cached.embedding\n        } else {\n          uncachedTexts.push(text)\n          uncachedIndices.push(index)\n        }\n      })\n\n      // Generate embeddings for uncached texts\n      if (uncachedTexts.length > 0) {\n        const response = await this.openai.embeddings.create({\n          model: embedModel,\n          input: uncachedTexts,\n          dimensions: embedDimensions,\n        })\n\n        uncachedIndices.forEach((index, i) => {\n          const embedding = response.data[i]?.embedding\n          if (embedding) {\n            batchEmbeddings[index] = embedding\n\n            // Cache the result\n            const text = uncachedTexts[i]\n            if (text) {\n              this.embeddingCache.set(this.getCacheKey(text, embedModel), {\n                text,\n                embedding,\n                model: embedModel,\n                cachedAt: Date.now(),\n                ttl: 3600000,\n              })\n            }\n          }\n        })\n\n        totalPromptTokens += response.usage.prompt_tokens\n        totalTokens += response.usage.total_tokens\n        this.stats.totalEmbeddings += uncachedTexts.length\n      }\n\n      embeddings.push(...batchEmbeddings)\n    }\n\n    this.updateCacheHitRate()\n\n    return {\n      embeddings,\n      model: embedModel,\n      usage: {\n        promptTokens: totalPromptTokens,\n        totalTokens,\n      },\n    }\n  }\n\n  /**\n   * Search messages by semantic similarity\n   */\n  async searchMessages(\n    query: string,\n    options: SearchOptions = {}\n  ): Promise<SearchResult[]> {\n    const {\n      topK = 10,\n      threshold = 0.0,\n      filter,\n    } = options\n\n    // Generate query embedding\n    const queryEmbedding = await this.generateEmbedding(query)\n\n    // Get messages from store based on filter\n    const messages = await this.getFilteredMessages(filter)\n\n    if (messages.length === 0) {\n      return []\n    }\n\n    // Generate embeddings for all messages\n    const messageEmbeddings = await this.generateBatchEmbeddings({\n      texts: messages.map((m) => this.getMessageContentAsString(m.content)),\n      model: this.config.model,\n      dimensions: this.config.dimensions,\n    })\n\n    // Calculate similarities and create results\n    const results: SearchResult[] = []\n\n    messages.forEach((message, index) => {\n      const embedding = messageEmbeddings.embeddings[index]\n      if (!embedding) return\n      const similarity = this.cosineSimilarity(queryEmbedding, embedding)\n\n      if (similarity >= threshold) {\n        results.push({\n          message,\n          similarity: {\n            score: similarity,\n            distance: 1 - similarity,\n            rank: 0, // Will be set after sorting\n          },\n          conversationId: (message as any).conversationId,\n        })\n      }\n    })\n\n    // Sort by similarity (descending)\n    results.sort((a, b) => b.similarity.score - a.similarity.score)\n\n    // Set ranks and limit results\n    const topResults = results.slice(0, topK)\n    topResults.forEach((result, index) => {\n      result.similarity.rank = index + 1\n    })\n\n    return topResults\n  }\n\n  /**\n   * Find similar messages to a given message\n   */\n  async findSimilarMessages(\n    messageId: string,\n    options: SimilarMessageOptions = {}\n  ): Promise<SearchResult[]> {\n    const {\n      topK = 5,\n      threshold = 0.5,\n      includeSelf = false,\n      filter,\n    } = options\n\n    // Find the source message\n    const sourceMessage = await this.findMessageById(messageId)\n    if (!sourceMessage) {\n      throw new Error(`Message with id ${messageId} not found`)\n    }\n\n    // Search using the source message content\n    const results = await this.searchMessages(\n      this.getMessageContentAsString(sourceMessage.content),\n      {\n        topK: includeSelf ? topK : topK + 1,\n        threshold,\n        filter,\n      }\n    )\n\n    // Filter out the source message if not included\n    const filteredResults = includeSelf\n      ? results\n      : results.filter((r) => r.message.id !== messageId)\n\n    return filteredResults.slice(0, topK)\n  }\n\n  /**\n   * Search across multiple conversations\n   */\n  async searchConversations(\n    query: string,\n    options: ConversationSearchOptions = {}\n  ): Promise<SearchResult[]> {\n    const {\n      topK = 10,\n      threshold = 0.0,\n      filter,\n      conversationIds,\n      maxConversations,\n    } = options\n\n    // Get list of conversations to search\n    let targetConversationIds: string[]\n\n    if (conversationIds && conversationIds.length > 0) {\n      targetConversationIds = conversationIds\n    } else {\n      const allConversationIds = await this.store.list()\n      targetConversationIds = maxConversations\n        ? allConversationIds.slice(0, maxConversations)\n        : allConversationIds\n    }\n\n    // Update filter to include conversation IDs\n    const updatedFilter: SearchFilter = {\n      ...filter,\n    }\n\n    // Search messages\n    const results = await this.searchMessages(query, {\n      topK,\n      threshold,\n      filter: updatedFilter,\n    })\n\n    // Filter results by conversation IDs\n    const filteredResults = conversationIds\n      ? results.filter((r) =>\n          conversationIds.includes(r.conversationId || '')\n        )\n      : results\n\n    // Update stats\n    this.stats.totalConversations = targetConversationIds.length\n\n    return filteredResults\n  }\n\n  /**\n   * Convert message content to a string for embedding\n   */\n  private getMessageContentAsString(\n    content: Message['content']\n  ): string {\n    if (typeof content === 'string') {\n      return content\n    }\n    if (Array.isArray(content)) {\n      return content\n        .map((part) => {\n          if (typeof part === 'string') return part\n          if (part && typeof part === 'object' && 'text' in part) {\n            return (part as { text: string }).text\n          }\n          return ''\n        })\n        .join(' ')\n    }\n    if (content && typeof content === 'object' && 'text' in content) {\n      return (content as { text: string }).text\n    }\n    return String(content)\n  }\n\n  /**\n   * Calculate cosine similarity between two vectors\n   */\n  private cosineSimilarity(a: number[], b: number[]): number {\n    if (a.length !== b.length) {\n      throw new Error('Vectors must have the same length')\n    }\n\n    let dotProduct = 0\n    let normA = 0\n    let normB = 0\n\n    for (let i = 0; i < a.length; i++) {\n      const aVal = a[i] ?? 0\n      const bVal = b[i] ?? 0\n      dotProduct += aVal * bVal\n      normA += aVal * aVal\n      normB += bVal * bVal\n    }\n\n    const denominator = Math.sqrt(normA) * Math.sqrt(normB)\n\n    if (denominator === 0) {\n      return 0\n    }\n\n    return dotProduct / denominator\n  }\n\n  /**\n   * Get filtered messages from the store\n   */\n  private async getFilteredMessages(\n    filter?: SearchFilter\n  ): Promise<(Message & { conversationId?: string })[]> {\n    const conversationIds = await this.store.list()\n    const allMessages: (Message & { conversationId?: string })[] = []\n\n    for (const conversationId of conversationIds) {\n      const conversation = await this.store.load(conversationId)\n\n      if (!conversation) {\n        continue\n      }\n\n      let messages = conversation.messages\n\n      // Apply filters\n      if (filter) {\n        messages = messages.filter((message) => {\n          // Filter by conversation ID\n          if (\n            filter.conversationId &&\n            conversationId !== filter.conversationId\n          ) {\n            return false\n          }\n\n          // Filter by role\n          if (filter.role && message.role !== filter.role) {\n            return false\n          }\n\n          // Filter by date range\n          if (filter.startDate && message.timestamp < filter.startDate) {\n            return false\n          }\n\n          if (filter.endDate && message.timestamp > filter.endDate) {\n            return false\n          }\n\n          return true\n        })\n      }\n\n      // Add conversation ID to messages\n      const messagesWithConvId = messages.map((m) => ({\n        ...m,\n        conversationId,\n      }))\n\n      allMessages.push(...messagesWithConvId)\n    }\n\n    this.stats.totalMessages = allMessages.length\n\n    return allMessages\n  }\n\n  /**\n   * Find a message by ID across all conversations\n   */\n  private async findMessageById(\n    messageId: string\n  ): Promise<Message | null> {\n    const conversationIds = await this.store.list()\n\n    for (const conversationId of conversationIds) {\n      const conversation = await this.store.load(conversationId)\n\n      if (!conversation) {\n        continue\n      }\n\n      const message = conversation.messages.find((m) => m.id === messageId)\n\n      if (message) {\n        return message\n      }\n    }\n\n    return null\n  }\n\n  /**\n   * Generate cache key for an embedding\n   */\n  private getCacheKey(text: string, model: EmbeddingModel): string {\n    // Simple hash function for the cache key\n    const hash = this.simpleHash(text)\n    return `${model}:${hash}`\n  }\n\n  /**\n   * Simple hash function for cache keys\n   */\n  private simpleHash(str: string): string {\n    let hash = 0\n    for (let i = 0; i < str.length; i++) {\n      const char = str.charCodeAt(i)\n      hash = (hash << 5) - hash + char\n      hash = hash & hash // Convert to 32bit integer\n    }\n    return Math.abs(hash).toString(36)\n  }\n\n  /**\n   * Check if a cache entry is expired\n   */\n  private isCacheExpired(entry: EmbeddingCacheEntry): boolean {\n    if (!entry.ttl) {\n      return false\n    }\n\n    return Date.now() - entry.cachedAt > entry.ttl\n  }\n\n  /**\n   * Update average embedding time\n   */\n  private updateAvgEmbeddingTime(duration: number): void {\n    const totalTime =\n      (this.stats.avgEmbeddingTime || 0) * (this.stats.totalEmbeddings - 1) +\n      duration\n    this.stats.avgEmbeddingTime = totalTime / this.stats.totalEmbeddings\n  }\n\n  /**\n   * Update cache hit rate\n   */\n  private updateCacheHitRate(): void {\n    const totalRequests = this.stats.totalEmbeddings\n    const cacheSize = this.embeddingCache.size\n\n    if (totalRequests > 0) {\n      this.stats.cacheHitRate = cacheSize / totalRequests\n    }\n  }\n\n  /**\n   * Get search statistics\n   */\n  getStats(): SearchStats {\n    return { ...this.stats }\n  }\n\n  /**\n   * Clear the embedding cache\n   */\n  clearCache(): void {\n    this.embeddingCache.clear()\n  }\n\n  /**\n   * Get the current cache size\n   */\n  getCacheSize(): number {\n    return this.embeddingCache.size\n  }\n}\n"]}