export interface Document { id: string; content: string; metadata: DocumentMetadata; source: string; chunks?: DocumentChunk[]; } export interface DocumentMetadata { title?: string; author?: string; createdAt: Date; updatedAt: Date; fileType: string; fileSize: number; language?: string; tags?: string[]; categories?: string[]; description?: string; } export interface DocumentChunk { id: string; content: string; metadata: ChunkMetadata; embedding?: number[]; } export interface ChunkMetadata { documentId: string; chunkIndex: number; startOffset: number; endOffset: number; tokens: number; source: string; } export interface SearchResult { chunk: DocumentChunk; score: number; document: Document; } export interface EmbeddingModel { embed(text: string): Promise; embedBatch(texts: string[]): Promise; } export interface VectorStore { addDocuments(documents: Document[]): Promise; search(query: string, k?: number): Promise; delete(documentId: string): Promise; update(document: Document): Promise; } export interface RAGConfig { embeddingModel: string; chunkSize: number; chunkOverlap: number; vectorStorePath: string; supabaseConfig: { url: string; anonKey: string; bucket: string; }; llmConfig: { modelName: string; temperature: number; maxTokens: number; apiKey: string; }; } export interface ChatMessage { id: string; role: "user" | "assistant" | "system"; content: string; timestamp: Date; updatedAt?: Date; metadata?: { sources?: SearchResult[]; model?: string; tokenCount?: number; error?: string; [key: string]: any; }; } export interface ConversationContext { id: string; messages: ChatMessage[]; sessionId?: string; userId?: string; createdAt: Date; updatedAt: Date; metadata?: Record; }