Package Exports
- solver-sdk
Readme
Code Solver SDK
🚀 Официальный JavaScript/TypeScript SDK для Code Solver API
Современный SDK для интеграции с Code Solver - платформой для анализа кода, векторного поиска и AI-ассистента. Поддерживает WebSocket для real-time уведомлений и delta-chunking для эффективной синхронизации.
📦 Установка
npm install solver-sdk🚀 Быстрый старт
import { CodeSolverSDK } from 'solver-sdk';
const sdk = new CodeSolverSDK({
baseURL: 'http://localhost:3000',
apiKey: 'your-api-key',
webSocket: { enabled: true } // Включить WebSocket для real-time уведомлений
});
// Подключение к WebSocket
await sdk.connectWebSocket();
// Создание проекта
const project = await sdk.projects.createProject('My Project', '/path/to/project');
// Запуск индексации с real-time статусом
const indexResult = await sdk.indexing.indexProject('/path', 'My Project');
// Подписка на real-time уведомления
sdk.projectSync.on('sync-status-update', (status) => {
console.log(`Индексация: ${status.progress}%`);
});
// Поиск по коду
const results = await sdk.search.searchCode(project.id, {
query: 'function authenticate',
limit: 10
});📖 API Reference
🏗️ Инициализация SDK
new CodeSolverSDK(options)
interface CodeSolverSDKOptions {
baseURL: string; // URL API сервера
apiKey?: string; // API ключ для авторизации
timeout?: number; // Таймаут запросов (по умолчанию 45000ms)
headers?: Record<string, string>; // Дополнительные HTTP заголовки
// WebSocket настройки
webSocket?: {
enabled?: boolean; // Включить WebSocket (по умолчанию true)
connectionTimeout?: number; // Таймаут подключения (10000ms)
maxRetries?: number; // Максимум попыток переподключения (3)
retryDelay?: number; // Задержка между попытками (2000ms)
debug?: boolean; // Отладочные логи (false)
};
// Delta-Chunking настройки
deltaChunking?: {
enabled?: boolean; // Включить delta-chunking (по умолчанию true)
chunkSize?: number; // Размер чанка (4096 байт)
maxConcurrentChunks?: number; // Максимум параллельных чанков (5)
};
}📁 Projects API (sdk.projects)
Управление проектами
// Создание проекта
createProject(name: string, path: string, data?: any): Promise<Project>
// Получение всех проектов
getAllProjects(): Promise<Project[]>
getProjects(): Promise<Project[]> // Псевдоним
// Получение проекта по ID
getProject(projectId: string): Promise<Project | null>
// Поиск или создание проекта
findOrCreateProject(projectPath: string, projectName: string, description?: string): Promise<Project>
// Удаление проекта
deleteProject(projectId: string): Promise<void>
// Получение статуса индексации проекта
getIndexingStatus(projectId: string): Promise<any>Примеры использования
// Создание нового проекта
const project = await sdk.projects.createProject(
'My Web App',
'/Users/dev/my-web-app',
{ description: 'React приложение' }
);
// Получение всех проектов пользователя
const projects = await sdk.projects.getAllProjects();
console.log(`У вас ${projects.length} проектов`);
// Поиск существующего или создание нового
const project = await sdk.projects.findOrCreateProject(
'/path/to/project',
'My Project',
'Описание проекта'
);🚀 Indexing API (sdk.indexing)
Управление индексацией
// Создание проекта и запуск индексации
indexProject(projectPath: string, projectName: string, description?: string): Promise<IndexProjectResult>
// Получение статуса индексации (с кэшированием)
getStatus(projectId: string): Promise<IndexingStatus>
// Ожидание завершения индексации (DEPRECATED - используйте WebSocket)
waitForCompletion(projectId: string, timeout?: number): Promise<IndexingStatus>
// Отмена индексации
cancelIndexing(projectId: string): Promise<void>
// Перезапуск индексации
restartIndexing(projectId: string): Promise<IndexingStatus>Типы данных
interface IndexingStatus {
status: string; // 'pending' | 'processing' | 'completed' | 'failed'
progress: number; // Прогресс 0-100
totalFiles?: number; // Общее количество файлов
processedFiles?: number; // Обработано файлов
currentFile?: string; // Текущий обрабатываемый файл
error?: string; // Сообщение об ошибке
updatedAt?: string; // Время последнего обновления
}Примеры использования
// Запуск индексации
const result = await sdk.indexing.indexProject(
'/Users/dev/my-project',
'My Project'
);
console.log('Project ID:', result.projectId);
// Получение статуса (единичный запрос)
const status = await sdk.indexing.getStatus(result.projectId);
console.log(`Прогресс: ${status.progress}%`);
// ⚠️ ВАЖНО: Для real-time статуса используйте WebSocket!
sdk.projectSync.on('sync-status-update', (status) => {
console.log(`Статус обновлен: ${status.status}, прогресс: ${status.progress}%`);
});🔍 Search API (sdk.search)
Поиск по коду
// Основной поиск по коду
searchCode(projectId: string, params: SearchCodeParams): Promise<SearchResult[]>
searchCode(params: SearchCodeParams): Promise<SearchResult[]> // Альтернативная сигнатура
// Семантический поиск
semanticSearch(projectId: string, params: Omit<SearchCodeParams, 'projectId'>): Promise<SearchResult[]>
// Поиск функций
searchFunctions(projectId: string, params: SearchFunctionsParams): Promise<FunctionSearchResult>Параметры поиска
interface SearchCodeParams {
projectId?: string; // ID проекта (если не передан отдельно)
query: string; // Поисковый запрос
limit?: number; // Максимум результатов (по умолчанию 10)
maxResults?: number; // Альтернативное название для limit
semantic?: boolean; // Флаг семантического поиска
}
interface SearchResult {
id: string; // Уникальный ID результата
score: number; // Оценка релевантности (0-1)
filePath: string; // Путь к файлу
fileName: string; // Имя файла
language: string; // Язык программирования
snippet: string; // Фрагмент кода
line: number; // Номер строки
size: number; // Размер фрагмента
indexedAt?: string; // Время индексации
}Примеры использования
// Обычный поиск
const results = await sdk.search.searchCode('project-id', {
query: 'function authenticate',
limit: 20
});
results.forEach(result => {
console.log(`${result.fileName}:${result.line} - ${result.snippet}`);
});
// Семантический поиск
const semanticResults = await sdk.search.semanticSearch('project-id', {
query: 'user authentication logic'
});
// Альтернативная сигнатура
const results = await sdk.search.searchCode({
projectId: 'project-id',
query: 'error handling',
limit: 5
});🔌 WebSocket API (sdk.projectSync)
Real-time уведомления
// Подключение к WebSocket
connectWebSocket(): Promise<void>
// Отключение от WebSocket
disconnectWebSocket(): void
// Проверка статуса подключения
isWebSocketConnected: boolean
// Подписка на проект
projectSync.subscribeToProject(projectId: string): void
// Отписка от проекта
projectSync.unsubscribeFromProject(projectId: string): void
// Обработчики событий
projectSync.on(eventName: string, handler: Function): void
projectSync.off(eventName: string, handler: Function): voidСобытия WebSocket
// Обновление статуса синхронизации
'sync-status-update': (data: SyncStatusUpdate) => void
// Прогресс синхронизации
'sync-progress': (data: SyncProgressEvent) => void
// Завершение синхронизации
'sync-completed': (data: SyncCompletedEvent) => void
// Ошибки
'error': (data: ErrorEvent) => void
// Подключение/отключение
'connected': (data: { socketId: string }) => void
'disconnected': (data: { reason: string }) => voidПримеры использования
// Подключение и подписка на проект
await sdk.connectWebSocket();
sdk.projectSync.subscribeToProject('project-id');
// Обработка событий
sdk.projectSync.on('sync-status-update', (status) => {
console.log(`Проект ${status.projectId}: ${status.status} (${status.progress}%)`);
});
sdk.projectSync.on('sync-completed', (data) => {
if (data.success) {
console.log(`Синхронизация завершена за ${data.duration}мс`);
} else {
console.error(`Ошибка синхронизации: ${data.error}`);
}
});
sdk.projectSync.on('error', (error) => {
console.error(`WebSocket ошибка: ${error.error}`);
});
// Отключение
sdk.disconnectWebSocket();🔄 Delta-Chunking API (sdk.deltaSync)
Синхронизация с delta-chunking
// Инициализация синхронизации
initializeSync(projectId: string, options?: SyncOptions): Promise<SyncResult>
// Отправка delta чанков
sendDeltaChunks(projectId: string, chunks: EncryptedChunk[]): Promise<void>
// Финализация синхронизации
finalizeDeltaSync(projectId: string): Promise<SyncResult>
// Отмена синхронизации
cancelDeltaSync(projectId: string): Promise<void>
// Получение статуса синхронизации
getSyncStatus(projectId: string): Promise<SyncStatus>Типы данных
interface SyncOptions {
incremental?: boolean; // Инкрементальная синхронизация
compression?: boolean; // Сжатие чанков
encryption?: boolean; // Шифрование чанков
}
interface EncryptedChunk {
id: string; // ID чанка
data: string; // Зашифрованные данные (base64)
hash: string; // SHA-256 хэш
size: number; // Размер оригинальных данных
metadata?: any; // Дополнительные метаданные
}
interface SyncResult {
sessionId: string; // ID сессии синхронизации
status: string; // Статус операции
message?: string; // Сообщение о результате
chunksProcessed?: number; // Количество обработанных чанков
}Примеры использования
// Полный цикл delta-chunking синхронизации
const syncResult = await sdk.deltaSync.initializeSync('project-id', {
incremental: true,
compression: true
});
console.log('Сессия синхронизации:', syncResult.sessionId);
// Подготовка и отправка чанков
const chunks = [
{
id: 'chunk-1',
data: btoa('console.log("Hello World");'), // base64
hash: 'sha256-hash',
size: 26
}
];
await sdk.deltaSync.sendDeltaChunks('project-id', chunks);
// Финализация
const finalResult = await sdk.deltaSync.finalizeDeltaSync('project-id');
console.log('Синхронизация завершена:', finalResult.status);
// Мониторинг через WebSocket
sdk.projectSync.on('sync-progress', (progress) => {
console.log(`Обработано ${progress.currentChunk}/${progress.totalChunks} чанков`);
});💬 Chat API (sdk.chat)
AI-ассистент
// Отправка сообщения
sendMessage(messages: Message[], options?: ChatOptions): Promise<ChatResponse>
// Потоковый чат
streamChat(messages: Message[], options?: StreamChatOptions): AsyncGenerator<ChatChunk>
// Чат с контекстом проекта
chatWithContext(projectId: string, message: string, options?: ChatOptions): Promise<ChatResponse>Примеры использования
// Простой чат
const response = await sdk.chat.sendMessage([
{ role: 'user', content: 'Объясни что такое async/await' }
]);
console.log(response.choices[0].message.content);
// Потоковый чат
const stream = sdk.chat.streamChat([
{ role: 'user', content: 'Напиши функцию сортировки' }
]);
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || '');
}
// Чат с контекстом проекта
const contextResponse = await sdk.chat.chatWithContext(
'project-id',
'Найди баги в моем коде'
);🛡️ Безопасность и Лимиты
SDK автоматически обрабатывает rate limiting и кэширование:
Rate Limits
- Indexing Status: 5 запросов/минуту (используйте WebSocket для real-time)
- Projects: 30 запросов/минуту
- Global: 10/сек, 100/мин, 1000/час
Кэширование
- Indexing Status: 10 секунд TTL
- Projects: 30 секунд TTL
Рекомендации
// ✅ Правильно: WebSocket для real-time статуса
sdk.projectSync.on('sync-status-update', callback);
// ❌ Неправильно: Polling статуса
// setInterval(() => sdk.indexing.getStatus(id), 2000);🔧 Обработка ошибок
try {
const project = await sdk.projects.createProject('Test', '/path');
} catch (error) {
if (error.status === 401) {
console.error('Неверный API ключ');
} else if (error.status === 429) {
console.error('Превышен rate limit');
} else {
console.error('Ошибка API:', error.message);
}
}
// WebSocket ошибки
sdk.projectSync.on('error', (error) => {
if (error.recoverable) {
console.warn('Временная ошибка WebSocket:', error.error);
} else {
console.error('Критическая ошибка WebSocket:', error.error);
}
});🚀 Продвинутое использование
Настройка HTTP клиента
const sdk = new CodeSolverSDK({
baseURL: 'https://api.codesolver.dev',
apiKey: process.env.CODESOLVER_API_KEY,
timeout: 60000,
headers: {
'User-Agent': 'MyApp/1.0.0',
'X-Custom-Header': 'value'
}
});WebSocket с переподключением
const sdk = new CodeSolverSDK({
baseURL: 'wss://api.codesolver.dev',
webSocket: {
enabled: true,
maxRetries: 5,
retryDelay: 3000,
debug: true
}
});
sdk.projectSync.on('connected', () => {
console.log('WebSocket подключен');
});
sdk.projectSync.on('disconnected', (data) => {
console.log('WebSocket отключен:', data.reason);
});Delta-Chunking с шифрованием
const syncResult = await sdk.deltaSync.initializeSync('project-id', {
incremental: true,
compression: true,
encryption: true
});
// Шифрование чанков на клиенте
const encryptedChunks = chunks.map(chunk => ({
...chunk,
data: encrypt(chunk.data), // Ваша функция шифрования
hash: sha256(chunk.data)
}));
await sdk.deltaSync.sendDeltaChunks('project-id', encryptedChunks);📊 Мониторинг и диагностика
// Диагностика API
const diagnosis = await sdk.diagnoseAPI();
console.log('Статус API:', diagnosis);
// Health check
const health = await sdk.httpClient.get('/health');
console.log('Здоровье сервера:', health);
// Детальная информация о системе
const info = await sdk.httpClient.get('/health/info');
console.log('Информация о системе:', info);🔄 Миграция с предыдущих версий
С версии 4.x на 5.x
// Старый способ (4.x)
const status = await sdk.projects.getIndexingStatus(projectId);
// Новый способ (5.x)
const status = await sdk.indexing.getStatus(projectId);
// Или лучше - WebSocket
sdk.projectSync.on('sync-status-update', (status) => {
// Real-time статус
});📝 Changelog
v5.1.3 (Latest)
- ✅ Добавлен
IndexingApiдля управления индексацией - ✅ Добавлен
ProjectSyncClientдля WebSocket уведомлений - ✅ Исправлена генерация URL в
SearchApi - ✅ Добавлен метод
semanticSearch - ✅ Добавлен метод
findOrCreateProject - ✅ Улучшена обработка ошибок WebSocket
- ✅ Обновлена документация и примеры
v5.0.0
- 🚀 Полная переработка архитектуры
- 🔌 WebSocket поддержка для real-time уведомлений
- 🔄 Delta-chunking для эффективной синхронизации
- 🛡️ Встроенное rate limiting и кэширование
📞 Поддержка
- GitHub: Issues
- Email: support@codesolver.dev
- Документация: docs.codesolver.dev
📄 Лицензия
MIT License - см. LICENSE файл.
🚀 Code Solver SDK v5.1.3 - Создано с ❤️ для разработчиков