import { SQLiteClient, SearchResult, DocumentRecord, ChunkRecord } from './sqlite-client.js';
import { ConnectionPool, getConnectionPool } from '../db/connection-pool.js';
export interface Document {
uri: string;
title: string;
content: string;
}
export class RAGService {
private readonly connectionPool: ConnectionPool;
constructor(connectionPool?: ConnectionPool) {
this.connectionPool = connectionPool ?? getConnectionPool();
}
async search(query: string, limit: number = 5): Promise<SearchResult[]> {
try {
console.log(`🔍 Поиск: "${query}" (лимит: ${limit})`);
// Получаем SQLiteClient из пула соединений
const sqliteClient = await this.connectionPool.getSQLiteClient();
// Выполняем поиск через SQLite
const results = await sqliteClient.search(query, { limit });
if (results.isErr()) {
throw new Error(`Ошибка поиска: ${results.error.message}`);
}
console.log(`✅ Найдено результатов: ${results.value.length}`);
return results.value;
} catch (error) {
console.error('Ошибка поиска:', error);
throw new Error(`Ошибка поиска: ${error}`);
}
}
async addDocument(uri: string, content: string, title: string): Promise<void> {
try {
console.log(`📄 Добавление документа: ${title} (${uri})`);
// Получаем SQLiteClient из пула соединений
const sqliteClient = await this.connectionPool.getSQLiteClient();
// Проверяем, существует ли уже документ
const existingDocResult = await sqliteClient.getDocument(uri);
if (existingDocResult.isErr()) {
throw new Error(`Ошибка проверки документа: ${existingDocResult.error.message}`);
}
const existingDoc = existingDocResult.value;
if (existingDoc) {
// Обновляем существующий документ
const updateResult = await sqliteClient.updateDocument(uri, title, content);
if (updateResult.isErr()) {
throw new Error(`Ошибка обновления документа: ${updateResult.error.message}`);
}
console.log(`✅ Документ "${title}" обновлен в корпусе`);
} else {
// Добавляем новый документ
const addResult = await sqliteClient.addDocument(uri, title, content);
if (addResult.isErr()) {
throw new Error(`Ошибка добавления документа: ${addResult.error.message}`);
}
const docId = addResult.value;
console.log(`✅ Документ "${title}" добавлен в корпус (ID: ${docId})`);
}
} catch (error) {
console.error('Ошибка добавления документа:', error);
throw new Error(`Ошибка добавления документа: ${error}`);
}
}
async getDocument(uri: string): Promise<Document | null> {
try {
console.log(`📖 Получение документа: ${uri}`);
// Получаем SQLiteClient из пула соединений
const sqliteClient = await this.connectionPool.getSQLiteClient();
const docResult = await sqliteClient.getDocument(uri);
if (docResult.isErr()) {
throw new Error(`Ошибка получения документа: ${docResult.error.message}`);
}
const doc = docResult.value;
if (!doc) return null;
// Получаем чанки документа
const chunksResult = await sqliteClient.getDocumentChunks(doc.id);
if (chunksResult.isErr()) {
throw new Error(`Ошибка получения чанков: ${chunksResult.error.message}`);
}
const chunks = chunksResult.value;
const content = chunks.map((chunk: any) => chunk.text).join('\n\n');
return {
uri: doc.uri,
title: doc.title,
content
};
} catch (error) {
console.error('Ошибка получения документа:', error);
throw new Error(`Ошибка получения документа: ${error}`);
}
}
async listDocuments(): Promise<Document[]> {
try {
console.log('📚 Получение списка документов');
// Получаем SQLiteClient из пула соединений
const sqliteClient = await this.connectionPool.getSQLiteClient();
const docsResult = await sqliteClient.getDocuments();
if (docsResult.isErr()) {
throw new Error(`Ошибка получения документов: ${docsResult.error.message}`);
}
const docs = docsResult.value;
return docs.map((doc: any) => ({
uri: doc.uri,
title: doc.title,
content: '' // Не загружаем содержимое для списка
}));
} catch (error) {
console.error('Ошибка получения списка документов:', error);
throw new Error(`Ошибка получения списка документов: ${error}`);
}
}
}