solver-sdk 5.1.1 → 5.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +485 -365
  2. package/dist/cjs/api/indexing-api.js +182 -0
  3. package/dist/cjs/api/indexing-api.js.map +1 -0
  4. package/dist/cjs/api/projects-api.js +55 -29
  5. package/dist/cjs/api/projects-api.js.map +1 -1
  6. package/dist/cjs/api/search-api.js +19 -2
  7. package/dist/cjs/api/search-api.js.map +1 -1
  8. package/dist/cjs/code-solver-sdk.js +65 -6
  9. package/dist/cjs/code-solver-sdk.js.map +1 -1
  10. package/dist/cjs/utils/project-sync-client.js +284 -0
  11. package/dist/cjs/utils/project-sync-client.js.map +1 -0
  12. package/dist/esm/api/indexing-api.js +178 -0
  13. package/dist/esm/api/indexing-api.js.map +1 -0
  14. package/dist/esm/api/projects-api.js +55 -29
  15. package/dist/esm/api/projects-api.js.map +1 -1
  16. package/dist/esm/api/search-api.js +19 -2
  17. package/dist/esm/api/search-api.js.map +1 -1
  18. package/dist/esm/code-solver-sdk.js +65 -6
  19. package/dist/esm/code-solver-sdk.js.map +1 -1
  20. package/dist/esm/utils/project-sync-client.js +280 -0
  21. package/dist/esm/utils/project-sync-client.js.map +1 -0
  22. package/dist/types/api/indexing-api.d.ts +131 -0
  23. package/dist/types/api/indexing-api.d.ts.map +1 -0
  24. package/dist/types/api/projects-api.d.ts +31 -2
  25. package/dist/types/api/projects-api.d.ts.map +1 -1
  26. package/dist/types/api/search-api.d.ts +7 -0
  27. package/dist/types/api/search-api.d.ts.map +1 -1
  28. package/dist/types/code-solver-sdk.d.ts +30 -1
  29. package/dist/types/code-solver-sdk.d.ts.map +1 -1
  30. package/dist/types/interfaces/sdk-options.d.ts +16 -0
  31. package/dist/types/interfaces/sdk-options.d.ts.map +1 -1
  32. package/dist/types/utils/project-sync-client.d.ts +142 -0
  33. package/dist/types/utils/project-sync-client.d.ts.map +1 -0
  34. package/package.json +14 -8
package/README.md CHANGED
@@ -1,29 +1,8 @@
1
- # Code Solver SDK v5.1.0
1
+ # Code Solver SDK
2
2
 
3
- > **🗑️ Ультра-чистый JavaScript/TypeScript SDK для VS Code Extensions**
4
- > Без legacy кода, без мертвых методов, только актуальный API
3
+ 🚀 **Официальный JavaScript/TypeScript SDK для Code Solver API**
5
4
 
6
- JavaScript/TypeScript SDK для работы с Code Solver API. Предоставляет простой интерфейс для индексации кода, семантического поиска функций, работы с AI чатом и **новую Delta-Chunking архитектуру** для Cursor-подобной синхронизации проектов.
7
-
8
- ## 🎯 Основные возможности
9
-
10
- - **🔄 Delta-Chunking** - Cursor-like инкрементальная синхронизация проектов
11
- - **💬 Chat API** - взаимодействие с AI моделями (Claude, GPT)
12
- - **🔍 Code Search** - семантический поиск по коду и функциям
13
- - **📊 Project Indexing** - индексация и анализ проектов с **богатой информацией**
14
- - **📝 Context API** - получение контекста для AI
15
- - **🛠️ Code Modification** - модификация кода через AI
16
- - **🔇 Настраиваемое логирование** - полный контроль над выводом в консоль
17
- - **✨ Улучшенная типизация** - полные TypeScript типы с примерами и документацией
18
-
19
- ## 🚀 Что нового в v5.1.0
20
-
21
- > **🔄 Delta-Chunking API** - добавлена полная документация для новой архитектуры синхронизации
22
-
23
- - ✨ **Delta-Chunking интеграция** - встроено в основной CodeSolverSDK класс
24
- - 📝 **Полная документация** - все методы, типы и примеры использования
25
- - 🔐 **Шифрование и chunking** - конфигурация encryption и chunking опций
26
- - 🎯 **Готово к продакшену** - интеграция с backend полностью реализована
5
+ Современный SDK для интеграции с Code Solver - платформой для анализа кода, векторного поиска и AI-ассистента. Поддерживает WebSocket для real-time уведомлений и delta-chunking для эффективной синхронизации.
27
6
 
28
7
  ## 📦 Установка
29
8
 
@@ -31,453 +10,594 @@ JavaScript/TypeScript SDK для работы с Code Solver API. Предост
31
10
  npm install solver-sdk
32
11
  ```
33
12
 
34
- ## ⚙️ Конфигурация
35
-
36
- ```javascript
37
- const sdk = await CodeSolverSDK.create({
38
- baseURL: 'http://localhost:3000', // Обязательный
39
- apiKey: 'your-api-key', // Опционально
40
- timeout: 30000, // Таймаут запросов (мс)
41
- debug: 'error' // Уровень логирования
42
- });
43
- ```
44
-
45
- ### 📊 Уровни логирования
46
- - `'silent'` - полное отключение
47
- - `'error'` - только ошибки (рекомендуется)
48
- - `'warn'` - предупреждения и ошибки
49
- - `'info'` - базовая информация
50
- - `'debug'` - подробная отладка
51
-
52
13
  ## 🚀 Быстрый старт
53
14
 
54
15
  ```javascript
55
16
  import { CodeSolverSDK } from 'solver-sdk';
56
17
 
57
- // Создание SDK
58
- const sdk = await CodeSolverSDK.create({
18
+ const sdk = new CodeSolverSDK({
59
19
  baseURL: 'http://localhost:3000',
60
- debug: 'error' // Рекомендуемый уровень для production
20
+ apiKey: 'your-api-key',
21
+ webSocket: { enabled: true } // Включить WebSocket для real-time уведомлений
61
22
  });
62
23
 
63
- // 1. Создание проекта (с автоматической дедупликацией)
64
- const project = await sdk.projects.createProject(
65
- 'My Project',
66
- '/path/to/project'
67
- );
24
+ // Подключение к WebSocket
25
+ await sdk.connectWebSocket();
68
26
 
69
- // 2. Запуск индексации
70
- await sdk.projects.startIndexing(project.id);
27
+ // Создание проекта
28
+ const project = await sdk.projects.createProject('My Project', '/path/to/project');
29
+
30
+ // Запуск индексации с real-time статусом
31
+ const indexResult = await sdk.indexing.indexProject('/path', 'My Project');
71
32
 
72
- // 3. Проверка статуса
73
- const status = await sdk.projects.getIndexingStatus(project.id);
74
- console.log(`Статус: ${status.status}, прогресс: ${status.progress}%`);
33
+ // Подписка на real-time уведомления
34
+ sdk.projectSync.on('sync-status-update', (status) => {
35
+ console.log(`Индексация: ${status.progress}%`);
36
+ });
75
37
 
76
- // 4. Поиск в коде
38
+ // Поиск по коду
77
39
  const results = await sdk.search.searchCode(project.id, {
78
- query: 'function calculateSum',
40
+ query: 'function authenticate',
79
41
  limit: 10
80
42
  });
43
+ ```
44
+
45
+ ## 📖 API Reference
46
+
47
+ ### 🏗️ Инициализация SDK
81
48
 
82
- // 5. Чат с AI
83
- const response = await sdk.chat.chat([
84
- { role: 'user', content: 'Объясни найденный код' }
85
- ], { projectId: project.id });
49
+ #### `new CodeSolverSDK(options)`
86
50
 
87
- console.log(response.content);
51
+ ```typescript
52
+ interface CodeSolverSDKOptions {
53
+ baseURL: string; // URL API сервера
54
+ apiKey?: string; // API ключ для авторизации
55
+ timeout?: number; // Таймаут запросов (по умолчанию 45000ms)
56
+ headers?: Record<string, string>; // Дополнительные HTTP заголовки
57
+
58
+ // WebSocket настройки
59
+ webSocket?: {
60
+ enabled?: boolean; // Включить WebSocket (по умолчанию true)
61
+ connectionTimeout?: number; // Таймаут подключения (10000ms)
62
+ maxRetries?: number; // Максимум попыток переподключения (3)
63
+ retryDelay?: number; // Задержка между попытками (2000ms)
64
+ debug?: boolean; // Отладочные логи (false)
65
+ };
66
+
67
+ // Delta-Chunking настройки
68
+ deltaChunking?: {
69
+ enabled?: boolean; // Включить delta-chunking (по умолчанию true)
70
+ chunkSize?: number; // Размер чанка (4096 байт)
71
+ maxConcurrentChunks?: number; // Максимум параллельных чанков (5)
72
+ };
73
+ }
88
74
  ```
89
75
 
90
- ## 📋 API Методы
76
+ ### 📁 Projects API (`sdk.projects`)
91
77
 
92
- ### 📁 Projects API
93
- ```javascript
78
+ #### Управление проектами
79
+
80
+ ```typescript
94
81
  // Создание проекта
95
- await sdk.projects.createProject('Project Name', '/project/path');
96
- await sdk.projects.createProject('Project Name', '/project/path', { description: 'Optional' });
82
+ createProject(name: string, path: string, data?: any): Promise<Project>
83
+
84
+ // Получение всех проектов
85
+ getAllProjects(): Promise<Project[]>
86
+ getProjects(): Promise<Project[]> // Псевдоним
97
87
 
98
- // Получение проектов
99
- await sdk.projects.getAllProjects(); // Все проекты
100
- await sdk.projects.getReadyProjects(); // Только готовые к работе
101
- await sdk.projects.getProject(projectId); // Конкретный проект с полной информацией
88
+ // Получение проекта по ID
89
+ getProject(projectId: string): Promise<Project | null>
90
+
91
+ // Поиск или создание проекта
92
+ findOrCreateProject(projectPath: string, projectName: string, description?: string): Promise<Project>
93
+
94
+ // Удаление проекта
95
+ deleteProject(projectId: string): Promise<void>
96
+
97
+ // Получение статуса индексации проекта
98
+ getIndexingStatus(projectId: string): Promise<any>
102
99
  ```
103
100
 
104
- ### ⚙️ Indexing API
101
+ #### Примеры использования
102
+
105
103
  ```javascript
106
- // Управление индексацией
107
- await sdk.projects.startIndexing(projectId);
108
- await sdk.projects.cancelIndexing(projectId);
104
+ // Создание нового проекта
105
+ const project = await sdk.projects.createProject(
106
+ 'My Web App',
107
+ '/Users/dev/my-web-app',
108
+ { description: 'React приложение' }
109
+ );
109
110
 
110
- // Статус индексации
111
- const status = await sdk.projects.getIndexingStatus(projectId);
112
- console.log(`${status.status}: ${status.progress}%`);
111
+ // Получение всех проектов пользователя
112
+ const projects = await sdk.projects.getAllProjects();
113
+ console.log( вас ${projects.length} проектов`);
114
+
115
+ // Поиск существующего или создание нового
116
+ const project = await sdk.projects.findOrCreateProject(
117
+ '/path/to/project',
118
+ 'My Project',
119
+ 'Описание проекта'
120
+ );
121
+ ```
122
+
123
+ ### 🚀 Indexing API (`sdk.indexing`)
124
+
125
+ #### Управление индексацией
126
+
127
+ ```typescript
128
+ // Создание проекта и запуск индексации
129
+ indexProject(projectPath: string, projectName: string, description?: string): Promise<IndexProjectResult>
130
+
131
+ // Получение статуса индексации (с кэшированием)
132
+ getStatus(projectId: string): Promise<IndexingStatus>
133
+
134
+ // Ожидание завершения индексации (DEPRECATED - используйте WebSocket)
135
+ waitForCompletion(projectId: string, timeout?: number): Promise<IndexingStatus>
136
+
137
+ // Отмена индексации
138
+ cancelIndexing(projectId: string): Promise<void>
139
+
140
+ // Перезапуск индексации
141
+ restartIndexing(projectId: string): Promise<IndexingStatus>
142
+ ```
143
+
144
+ #### Типы данных
145
+
146
+ ```typescript
147
+ interface IndexingStatus {
148
+ status: string; // 'pending' | 'processing' | 'completed' | 'failed'
149
+ progress: number; // Прогресс 0-100
150
+ totalFiles?: number; // Общее количество файлов
151
+ processedFiles?: number; // Обработано файлов
152
+ currentFile?: string; // Текущий обрабатываемый файл
153
+ error?: string; // Сообщение об ошибке
154
+ updatedAt?: string; // Время последнего обновления
155
+ }
113
156
  ```
114
157
 
115
- ### 🔍 Search API
158
+ #### Примеры использования
159
+
116
160
  ```javascript
117
- // Поиск в коде
118
- const results = await sdk.search.searchCode(projectId, {
119
- query: 'function name',
120
- limit: 20
161
+ // Запуск индексации
162
+ const result = await sdk.indexing.indexProject(
163
+ '/Users/dev/my-project',
164
+ 'My Project'
165
+ );
166
+ console.log('Project ID:', result.projectId);
167
+
168
+ // Получение статуса (единичный запрос)
169
+ const status = await sdk.indexing.getStatus(result.projectId);
170
+ console.log(`Прогресс: ${status.progress}%`);
171
+
172
+ // ⚠️ ВАЖНО: Для real-time статуса используйте WebSocket!
173
+ sdk.projectSync.on('sync-status-update', (status) => {
174
+ console.log(`Статус обновлен: ${status.status}, прогресс: ${status.progress}%`);
121
175
  });
176
+ ```
177
+
178
+ ### 🔍 Search API (`sdk.search`)
179
+
180
+ #### Поиск по коду
181
+
182
+ ```typescript
183
+ // Основной поиск по коду
184
+ searchCode(projectId: string, params: SearchCodeParams): Promise<SearchResult[]>
185
+ searchCode(params: SearchCodeParams): Promise<SearchResult[]> // Альтернативная сигнатура
186
+
187
+ // Семантический поиск
188
+ semanticSearch(projectId: string, params: Omit<SearchCodeParams, 'projectId'>): Promise<SearchResult[]>
122
189
 
123
190
  // Поиск функций
124
- const functions = await sdk.search.searchFunctions(projectId, {
125
- query: 'calculateSum',
126
- limit: 10
127
- });
191
+ searchFunctions(projectId: string, params: SearchFunctionsParams): Promise<FunctionSearchResult>
192
+ ```
128
193
 
129
- // Статистика
130
- const stats = await sdk.search.getFunctionStats(projectId);
194
+ #### Параметры поиска
195
+
196
+ ```typescript
197
+ interface SearchCodeParams {
198
+ projectId?: string; // ID проекта (если не передан отдельно)
199
+ query: string; // Поисковый запрос
200
+ limit?: number; // Максимум результатов (по умолчанию 10)
201
+ maxResults?: number; // Альтернативное название для limit
202
+ semantic?: boolean; // Флаг семантического поиска
203
+ }
204
+
205
+ interface SearchResult {
206
+ id: string; // Уникальный ID результата
207
+ score: number; // Оценка релевантности (0-1)
208
+ filePath: string; // Путь к файлу
209
+ fileName: string; // Имя файла
210
+ language: string; // Язык программирования
211
+ snippet: string; // Фрагмент кода
212
+ line: number; // Номер строки
213
+ size: number; // Размер фрагмента
214
+ indexedAt?: string; // Время индексации
215
+ }
131
216
  ```
132
217
 
133
- ### 💬 Chat API
218
+ #### Примеры использования
219
+
134
220
  ```javascript
135
- // Обычный чат
136
- const response = await sdk.chat.chat([
137
- { role: 'user', content: 'Explain this code' }
138
- ], { projectId });
139
-
140
- // Потоковый чат
141
- for await (const chunk of sdk.chat.streamChat(messages, { projectId })) {
142
- console.log(chunk.text);
143
- }
221
+ // Обычный поиск
222
+ const results = await sdk.search.searchCode('project-id', {
223
+ query: 'function authenticate',
224
+ limit: 20
225
+ });
144
226
 
145
- // С thinking (мышление Claude)
146
- const response = await sdk.chat.chat(messages, {
147
- projectId,
148
- thinking: { type: 'enabled', budget_tokens: 5000 }
227
+ results.forEach(result => {
228
+ console.log(`${result.fileName}:${result.line} - ${result.snippet}`);
229
+ });
230
+
231
+ // Семантический поиск
232
+ const semanticResults = await sdk.search.semanticSearch('project-id', {
233
+ query: 'user authentication logic'
234
+ });
235
+
236
+ // Альтернативная сигнатура
237
+ const results = await sdk.search.searchCode({
238
+ projectId: 'project-id',
239
+ query: 'error handling',
240
+ limit: 5
149
241
  });
150
242
  ```
151
243
 
152
- ## 🔄 Delta-Chunking API
244
+ ### 🔌 WebSocket API (`sdk.projectSync`)
153
245
 
154
- > **🚀 Новый Cursor-подобный подход к синхронизации проектов**
155
- > Инкрементальные обновления, шифрование, real-time статус
246
+ #### Real-time уведомления
156
247
 
157
- ### Создание SDK с Delta-Chunking
248
+ ```typescript
249
+ // Подключение к WebSocket
250
+ connectWebSocket(): Promise<void>
158
251
 
159
- ```javascript
160
- import { CodeSolverSDK } from 'solver-sdk';
252
+ // Отключение от WebSocket
253
+ disconnectWebSocket(): void
161
254
 
162
- // Создание SDK с включенным delta-chunking
163
- const sdk = await CodeSolverSDK.create({
164
- baseURL: 'http://localhost:3000',
165
- apiKey: 'your-api-key',
166
- deltaChunking: { // ✨ Опциональная секция
167
- enabled: true, // Включить delta-chunking
168
- encryption: {
169
- enabled: true,
170
- key: 'your-32-char-encryption-key-here!' // 32 символа
171
- },
172
- chunking: {
173
- maxTokens: 400, // Максимальный размер чанка
174
- minTokens: 100, // Минимальный размер чанка
175
- useTreeSitter: false, // Пока простая разбивка
176
- preserveContext: true // Сохранять контекст между чанками
177
- },
178
- fileWatching: {
179
- enabled: false, // Автоматическое наблюдение (в разработке)
180
- pollInterval: 1000, // Интервал проверки изменений
181
- ignorePatterns: ['node_modules/**'] // Игнорируемые файлы
182
- }
183
- },
184
- debug: 'error'
185
- });
255
+ // Проверка статуса подключения
256
+ isWebSocketConnected: boolean
257
+
258
+ // Подписка на проект
259
+ projectSync.subscribeToProject(projectId: string): void
260
+
261
+ // Отписка от проекта
262
+ projectSync.unsubscribeFromProject(projectId: string): void
186
263
 
187
- // Проверяем что delta-chunking включен
188
- console.log('Delta-chunking доступен:', sdk.isDeltaChunkingEnabled);
264
+ // Обработчики событий
265
+ projectSync.on(eventName: string, handler: Function): void
266
+ projectSync.off(eventName: string, handler: Function): void
189
267
  ```
190
268
 
191
- ### Синхронизация проекта
269
+ #### События WebSocket
270
+
271
+ ```typescript
272
+ // Обновление статуса синхронизации
273
+ 'sync-status-update': (data: SyncStatusUpdate) => void
274
+
275
+ // Прогресс синхронизации
276
+ 'sync-progress': (data: SyncProgressEvent) => void
277
+
278
+ // Завершение синхронизации
279
+ 'sync-completed': (data: SyncCompletedEvent) => void
280
+
281
+ // Ошибки
282
+ 'error': (data: ErrorEvent) => void
283
+
284
+ // Подключение/отключение
285
+ 'connected': (data: { socketId: string }) => void
286
+ 'disconnected': (data: { reason: string }) => void
287
+ ```
288
+
289
+ #### Примеры использования
192
290
 
193
291
  ```javascript
194
- // Основной метод синхронизации (только если deltaChunking.enabled = true)
195
- const result = await sdk.syncProject('project-id', '/path/to/project', {
196
- forceFull: false, // Инкрементальная синхронизация
197
- batchSize: 50, // Чанков за раз
198
- ignorePatterns: [ // Игнорировать файлы/папки
199
- 'node_modules/**',
200
- '*.log',
201
- '.git/**'
202
- ],
203
- includeExtensions: ['.ts', '.js', '.py'], // Только эти расширения
204
- maxFileSizeKB: 1024, // Максимальный размер файла 1MB
205
- onProgress: (current, total) => { // Callback прогресса
206
- console.log(`Прогресс: ${current}/${total} (${Math.round(current/total*100)}%)`);
292
+ // Подключение и подписка на проект
293
+ await sdk.connectWebSocket();
294
+ sdk.projectSync.subscribeToProject('project-id');
295
+
296
+ // Обработка событий
297
+ sdk.projectSync.on('sync-status-update', (status) => {
298
+ console.log(`Проект ${status.projectId}: ${status.status} (${status.progress}%)`);
299
+ });
300
+
301
+ sdk.projectSync.on('sync-completed', (data) => {
302
+ if (data.success) {
303
+ console.log(`Синхронизация завершена за ${data.duration}мс`);
304
+ } else {
305
+ console.error(`Ошибка синхронизации: ${data.error}`);
207
306
  }
208
307
  });
209
308
 
210
- console.log(`✅ Синхронизация завершена: ${result.processedChunks} чанков`);
309
+ sdk.projectSync.on('error', (error) => {
310
+ console.error(`WebSocket ошибка: ${error.error}`);
311
+ });
312
+
313
+ // Отключение
314
+ sdk.disconnectWebSocket();
315
+ ```
316
+
317
+ ### 🔄 Delta-Chunking API (`sdk.deltaSync`)
318
+
319
+ #### Синхронизация с delta-chunking
320
+
321
+ ```typescript
322
+ // Инициализация синхронизации
323
+ initializeSync(projectId: string, options?: SyncOptions): Promise<SyncResult>
324
+
325
+ // Отправка delta чанков
326
+ sendDeltaChunks(projectId: string, chunks: EncryptedChunk[]): Promise<void>
327
+
328
+ // Финализация синхронизации
329
+ finalizeDeltaSync(projectId: string): Promise<SyncResult>
330
+
331
+ // Отмена синхронизации
332
+ cancelDeltaSync(projectId: string): Promise<void>
333
+
334
+ // Получение статуса синхронизации
335
+ getSyncStatus(projectId: string): Promise<SyncStatus>
211
336
  ```
212
337
 
213
- ### Синхронизация файлов (для браузера)
338
+ #### Типы данных
339
+
340
+ ```typescript
341
+ interface SyncOptions {
342
+ incremental?: boolean; // Инкрементальная синхронизация
343
+ compression?: boolean; // Сжатие чанков
344
+ encryption?: boolean; // Шифрование чанков
345
+ }
346
+
347
+ interface EncryptedChunk {
348
+ id: string; // ID чанка
349
+ data: string; // Зашифрованные данные (base64)
350
+ hash: string; // SHA-256 хэш
351
+ size: number; // Размер оригинальных данных
352
+ metadata?: any; // Дополнительные метаданные
353
+ }
354
+
355
+ interface SyncResult {
356
+ sessionId: string; // ID сессии синхронизации
357
+ status: string; // Статус операции
358
+ message?: string; // Сообщение о результате
359
+ chunksProcessed?: number; // Количество обработанных чанков
360
+ }
361
+ ```
362
+
363
+ #### Примеры использования
214
364
 
215
365
  ```javascript
216
- // Для web/браузерных приложений без доступа к файловой системе
217
- const files = [
218
- {
219
- path: 'src/index.ts',
220
- content: 'console.log("Hello World");',
221
- size: 28
222
- },
366
+ // Полный цикл delta-chunking синхронизации
367
+ const syncResult = await sdk.deltaSync.initializeSync('project-id', {
368
+ incremental: true,
369
+ compression: true
370
+ });
371
+
372
+ console.log('Сессия синхронизации:', syncResult.sessionId);
373
+
374
+ // Подготовка и отправка чанков
375
+ const chunks = [
223
376
  {
224
- path: 'src/utils.ts',
225
- content: 'export const sum = (a, b) => a + b;',
226
- size: 37
377
+ id: 'chunk-1',
378
+ data: btoa('console.log("Hello World");'), // base64
379
+ hash: 'sha256-hash',
380
+ size: 26
227
381
  }
228
382
  ];
229
383
 
230
- const result = await sdk.syncFiles('project-id', files, {
231
- batchSize: 20,
232
- onProgress: (current, total) => {
233
- console.log(`📤 Загружено: ${current}/${total}`);
234
- }
384
+ await sdk.deltaSync.sendDeltaChunks('project-id', chunks);
385
+
386
+ // Финализация
387
+ const finalResult = await sdk.deltaSync.finalizeDeltaSync('project-id');
388
+ console.log('Синхронизация завершена:', finalResult.status);
389
+
390
+ // Мониторинг через WebSocket
391
+ sdk.projectSync.on('sync-progress', (progress) => {
392
+ console.log(`Обработано ${progress.currentChunk}/${progress.totalChunks} чанков`);
235
393
  });
236
394
  ```
237
395
 
238
- ### Автоматическое наблюдение за изменениями
396
+ ### 💬 Chat API (`sdk.chat`)
239
397
 
240
- ```javascript
241
- // Запуск file watcher (в разработке)
242
- const watcher = await sdk.startAutoSync('project-id', '/path/to/watch');
398
+ #### AI-ассистент
243
399
 
244
- // Проверка активности
245
- console.log(`👀 Auto-sync активен: ${watcher.isActive}`);
400
+ ```typescript
401
+ // Отправка сообщения
402
+ sendMessage(messages: Message[], options?: ChatOptions): Promise<ChatResponse>
403
+
404
+ // Потоковый чат
405
+ streamChat(messages: Message[], options?: StreamChatOptions): AsyncGenerator<ChatChunk>
246
406
 
247
- // Остановка наблюдения
248
- await watcher.stop();
249
- console.log('🔴 File watcher остановлен');
407
+ // Чат с контекстом проекта
408
+ chatWithContext(projectId: string, message: string, options?: ChatOptions): Promise<ChatResponse>
250
409
  ```
251
410
 
252
- ### Статус и управление
411
+ #### Примеры использования
253
412
 
254
413
  ```javascript
255
- // Проверка статуса синхронизации
256
- const status = await sdk.getSyncStatus('project-id');
257
- console.log(`📊 Статус: ${status.status}, прогресс: ${status.progress || 0}%`);
258
-
259
- // Отмена активной синхронизации
260
- const cancelled = await sdk.cancelSync('project-id');
261
- if (cancelled) {
262
- console.log('❌ Синхронизация отменена');
414
+ // Простой чат
415
+ const response = await sdk.chat.sendMessage([
416
+ { role: 'user', content: 'Объясни что такое async/await' }
417
+ ]);
418
+
419
+ console.log(response.choices[0].message.content);
420
+
421
+ // Потоковый чат
422
+ const stream = sdk.chat.streamChat([
423
+ { role: 'user', content: 'Напиши функцию сортировки' }
424
+ ]);
425
+
426
+ for await (const chunk of stream) {
427
+ process.stdout.write(chunk.choices[0]?.delta?.content || '');
263
428
  }
429
+
430
+ // Чат с контекстом проекта
431
+ const contextResponse = await sdk.chat.chatWithContext(
432
+ 'project-id',
433
+ 'Найди баги в моем коде'
434
+ );
264
435
  ```
265
436
 
266
- ### Полный пример workflow
437
+ ## 🛡️ Безопасность и Лимиты
438
+
439
+ SDK автоматически обрабатывает rate limiting и кэширование:
440
+
441
+ ### Rate Limits
442
+ - **Indexing Status**: 5 запросов/минуту (используйте WebSocket для real-time)
443
+ - **Projects**: 30 запросов/минуту
444
+ - **Global**: 10/сек, 100/мин, 1000/час
267
445
 
446
+ ### Кэширование
447
+ - **Indexing Status**: 10 секунд TTL
448
+ - **Projects**: 30 секунд TTL
449
+
450
+ ### Рекомендации
268
451
  ```javascript
269
- import { CodeSolverSDK } from 'solver-sdk';
452
+ // Правильно: WebSocket для real-time статуса
453
+ sdk.projectSync.on('sync-status-update', callback);
270
454
 
271
- async function syncProject() {
272
- // 1. Создание SDK
273
- const sdk = await CodeSolverSDK.create({
274
- baseURL: 'http://localhost:3000',
275
- deltaChunking: {
276
- enabled: true,
277
- encryption: { enabled: true, key: 'my-secret-key-32-characters-long!' }
278
- },
279
- debug: 'info'
280
- });
281
-
282
- try {
283
- // 2. Синхронизация с прогрессом
284
- const result = await sdk.syncProject('my-project-id', './my-project', {
285
- onProgress: (current, total) => {
286
- const percent = Math.round((current / total) * 100);
287
- console.log(`🔄 Синхронизация: ${percent}% (${current}/${total} чанков)`);
288
- },
289
- ignorePatterns: ['node_modules/**', 'dist/**', '*.log']
290
- });
291
-
292
- // 3. Результат
293
- console.log('🎉 Синхронизация завершена:', {
294
- success: result.success,
295
- processedChunks: result.processedChunks,
296
- duration: result.duration + 'ms',
297
- newFiles: result.details?.newFiles,
298
- changedFiles: result.details?.changedFiles
299
- });
300
-
301
- // 4. Проверка финального статуса
302
- const status = await sdk.getSyncStatus('my-project-id');
303
- console.log(`✅ Финальный статус: ${status.status}`);
304
-
305
- } catch (error) {
306
- console.error('❌ Ошибка синхронизации:', error.message);
307
-
308
- // Отменяем если что-то пошло не так
309
- await sdk.cancelSync('my-project-id');
455
+ // Неправильно: Polling статуса
456
+ // setInterval(() => sdk.indexing.getStatus(id), 2000);
457
+ ```
458
+
459
+ ## 🔧 Обработка ошибок
460
+
461
+ ```javascript
462
+ try {
463
+ const project = await sdk.projects.createProject('Test', '/path');
464
+ } catch (error) {
465
+ if (error.status === 401) {
466
+ console.error('Неверный API ключ');
467
+ } else if (error.status === 429) {
468
+ console.error('Превышен rate limit');
469
+ } else {
470
+ console.error('Ошибка API:', error.message);
310
471
  }
311
472
  }
312
473
 
313
- // Запуск
314
- syncProject();
474
+ // WebSocket ошибки
475
+ sdk.projectSync.on('error', (error) => {
476
+ if (error.recoverable) {
477
+ console.warn('Временная ошибка WebSocket:', error.error);
478
+ } else {
479
+ console.error('Критическая ошибка WebSocket:', error.error);
480
+ }
481
+ });
315
482
  ```
316
483
 
317
- ## 💡 Типы данных
484
+ ## 🚀 Продвинутое использование
318
485
 
319
- ### Project
320
- ```typescript
321
- interface Project {
322
- id: string;
323
- name: string;
324
- path: string;
325
- ready: boolean; // Готов к работе
326
- fileCount: number; // Количество файлов
327
- indexStatus: 'pending' | 'indexing' | 'indexed' | 'failed' | 'cancelled';
328
- indexingProgress?: number; // 0-100%
329
- languageStats?: {[lang: string]: number}; // Статистика языков
330
- indexingErrors?: any[]; // Ошибки индексации
331
- // ... и еще 10+ полей
332
- }
486
+ ### Настройка HTTP клиента
487
+
488
+ ```javascript
489
+ const sdk = new CodeSolverSDK({
490
+ baseURL: 'https://api.codesolver.dev',
491
+ apiKey: process.env.CODESOLVER_API_KEY,
492
+ timeout: 60000,
493
+ headers: {
494
+ 'User-Agent': 'MyApp/1.0.0',
495
+ 'X-Custom-Header': 'value'
496
+ }
497
+ });
333
498
  ```
334
499
 
335
- ### Delta-Chunking Types
500
+ ### WebSocket с переподключением
336
501
 
337
- ```typescript
338
- // Расширенная конфигурация CodeSolverSDK с delta-chunking
339
- interface CodeSolverSDKOptions {
340
- baseURL: string;
341
- apiKey?: string;
342
- deltaChunking?: { // ✨ Опциональная секция
343
- enabled: boolean; // Включение delta-chunking функциональности
344
-
345
- encryption?: {
346
- enabled: boolean; // Включить шифрование чанков
347
- key: string; // 32-символьный ключ для AES-256
348
- };
349
-
350
- chunking?: {
351
- maxTokens?: number; // Максимальный размер чанка (по умолчанию: 400)
352
- minTokens?: number; // Минимальный размер чанка (по умолчанию: 100)
353
- useTreeSitter?: boolean; // Использовать tree-sitter парсер (в разработке)
354
- preserveContext?: boolean; // Сохранять контекст между чанками
355
- };
356
-
357
- fileWatching?: {
358
- enabled: boolean; // Включить автоматическое наблюдение за изменениями
359
- pollInterval?: number; // Интервал проверки изменений в мс (по умолчанию: 1000)
360
- ignorePatterns?: string[]; // Паттерны для игнорирования файлов
361
- };
362
- };
363
- timeout?: number; // Таймаут запросов (мс)
364
- debug?: 'silent' | 'error' | 'warn' | 'info' | 'debug';
365
- }
502
+ ```javascript
503
+ const sdk = new CodeSolverSDK({
504
+ baseURL: 'wss://api.codesolver.dev',
505
+ webSocket: {
506
+ enabled: true,
507
+ maxRetries: 5,
508
+ retryDelay: 3000,
509
+ debug: true
510
+ }
511
+ });
366
512
 
367
- // Опции синхронизации
368
- interface SyncOptions {
369
- forceFull?: boolean; // Принудительная полная синхронизация
370
- batchSize?: number; // Размер батча для загрузки чанков (по умолчанию: 50)
371
- ignorePatterns?: string[]; // Паттерны для игнорирования файлов
372
- includeExtensions?: string[]; // Включать только определенные расширения
373
- maxFileSizeKB?: number; // Максимальный размер файла для обработки (KB)
374
- onProgress?: (current: number, total: number) => void; // Callback прогресса
375
- timeoutMs?: number; // Таймаут для операций
376
- }
513
+ sdk.projectSync.on('connected', () => {
514
+ console.log('WebSocket подключен');
515
+ });
377
516
 
378
- // Результат синхронизации
379
- interface SyncResult {
380
- success: boolean;
381
- projectId: string;
382
- sessionId?: string;
383
- processedChunks: number;
384
- totalChunks: number;
385
- duration: number; // Время выполнения в мс
386
- error?: string;
387
- details?: {
388
- newFiles: number;
389
- changedFiles: number;
390
- deletedFiles: number;
391
- failedChunks: number;
392
- };
393
- }
517
+ sdk.projectSync.on('disconnected', (data) => {
518
+ console.log('WebSocket отключен:', data.reason);
519
+ });
520
+ ```
394
521
 
395
- // Статус синхронизации
396
- interface SyncStatus {
397
- status: 'inactive' | 'initializing' | 'active' | 'finalizing' | 'completed' | 'failed';
398
- progress?: number; // 0-100%
399
- chunksReceived?: number;
400
- chunksProcessed?: number;
401
- sessionId?: string;
402
- errors?: string[];
403
- startTime?: Date;
404
- estimatedCompletion?: Date;
405
- }
522
+ ### Delta-Chunking с шифрованием
406
523
 
407
- // File watcher для автоматической синхронизации
408
- interface FileWatcher {
409
- projectId: string;
410
- watchPath: string;
411
- isActive: boolean;
412
- start(): Promise<void>;
413
- stop(): Promise<void>;
414
- }
524
+ ```javascript
525
+ const syncResult = await sdk.deltaSync.initializeSync('project-id', {
526
+ incremental: true,
527
+ compression: true,
528
+ encryption: true
529
+ });
415
530
 
416
- // Контент файла
417
- interface FileContent {
418
- path: string; // Относительный путь файла
419
- content: string; // Содержимое файла
420
- size: number; // Размер в байтах
421
- }
531
+ // Шифрование чанков на клиенте
532
+ const encryptedChunks = chunks.map(chunk => ({
533
+ ...chunk,
534
+ data: encrypt(chunk.data), // Ваша функция шифрования
535
+ hash: sha256(chunk.data)
536
+ }));
537
+
538
+ await sdk.deltaSync.sendDeltaChunks('project-id', encryptedChunks);
422
539
  ```
423
540
 
424
- ## 📚 Пример использования
541
+ ## 📊 Мониторинг и диагностика
425
542
 
426
543
  ```javascript
427
- import { CodeSolverSDK } from 'solver-sdk';
544
+ // Диагностика API
545
+ const diagnosis = await sdk.diagnoseAPI();
546
+ console.log('Статус API:', diagnosis);
428
547
 
429
- const sdk = await CodeSolverSDK.create({
430
- baseURL: 'http://localhost:3000'
431
- });
548
+ // Health check
549
+ const health = await sdk.httpClient.get('/health');
550
+ console.log('Здоровье сервера:', health);
432
551
 
433
- // Работа с проектом
434
- const project = await sdk.projects.createProject('My App', '/path/to/app');
435
- await sdk.projects.startIndexing(project.id);
436
-
437
- // Ожидание индексации
438
- let status;
439
- do {
440
- status = await sdk.projects.getIndexingStatus(project.id);
441
- console.log(`${status.status}: ${status.progress}%`);
442
- await new Promise(r => setTimeout(r, 2000));
443
- } while (status.status === 'indexing');
444
-
445
- // Поиск и чат
446
- const results = await sdk.search.searchCode(project.id, {
447
- query: 'function main',
448
- limit: 5
449
- });
450
-
451
- const response = await sdk.chat.chat([
452
- { role: 'user', content: 'Explain this code' }
453
- ], { projectId: project.id });
552
+ // Детальная информация о системе
553
+ const info = await sdk.httpClient.get('/health/info');
554
+ console.log('Информация о системе:', info);
454
555
  ```
455
556
 
456
- ## 🔧 Устранение неполадок
557
+ ## 🔄 Миграция с предыдущих версий
558
+
559
+ ### С версии 4.x на 5.x
457
560
 
458
561
  ```javascript
459
- // Проверка подключения
460
- const response = await fetch('http://localhost:3000/health');
461
- console.log('Backend доступен:', response.ok);
562
+ // Старый способ (4.x)
563
+ const status = await sdk.projects.getIndexingStatus(projectId);
462
564
 
463
- // Увеличение таймаута для больших проектов
464
- const sdk = await CodeSolverSDK.create({
465
- baseURL: 'http://localhost:3000',
466
- timeout: 120000 // 2 минуты
467
- });
565
+ // Новый способ (5.x)
566
+ const status = await sdk.indexing.getStatus(projectId);
468
567
 
469
- // Отладка с подробными логами
470
- const sdk = await CodeSolverSDK.create({
471
- baseURL: 'http://localhost:3000',
472
- debug: 'debug'
568
+ // Или лучше - WebSocket
569
+ sdk.projectSync.on('sync-status-update', (status) => {
570
+ // Real-time статус
473
571
  });
474
572
  ```
475
573
 
574
+ ## 📝 Changelog
575
+
576
+ ### v5.1.3 (Latest)
577
+ - ✅ Добавлен `IndexingApi` для управления индексацией
578
+ - ✅ Добавлен `ProjectSyncClient` для WebSocket уведомлений
579
+ - ✅ Исправлена генерация URL в `SearchApi`
580
+ - ✅ Добавлен метод `semanticSearch`
581
+ - ✅ Добавлен метод `findOrCreateProject`
582
+ - ✅ Улучшена обработка ошибок WebSocket
583
+ - ✅ Обновлена документация и примеры
584
+
585
+ ### v5.0.0
586
+ - 🚀 Полная переработка архитектуры
587
+ - 🔌 WebSocket поддержка для real-time уведомлений
588
+ - 🔄 Delta-chunking для эффективной синхронизации
589
+ - 🛡️ Встроенное rate limiting и кэширование
590
+
591
+ ## 📞 Поддержка
592
+
593
+ - **GitHub**: [Issues](https://github.com/codesolver/solver-sdk/issues)
594
+ - **Email**: support@codesolver.dev
595
+ - **Документация**: [docs.codesolver.dev](https://docs.codesolver.dev)
596
+
476
597
  ## 📄 Лицензия
477
598
 
478
- MIT License
599
+ MIT License - см. [LICENSE](LICENSE) файл.
479
600
 
480
601
  ---
481
602
 
482
- > **Документация актуальна для v5.0.0**
483
- > История изменений: [CHANGELOG.md](CHANGELOG.md)
603
+ **🚀 Code Solver SDK v5.1.3** - Создано с ❤️ для разработчиков