solver-sdk 6.0.0 → 6.0.2

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.
package/README.md CHANGED
@@ -1,8 +1,6 @@
1
- # Code Solver SDK
1
+ # Code Solver SDK v6.0.1
2
2
 
3
- 🚀 **Официальный JavaScript/TypeScript SDK для Code Solver API**
4
-
5
- Современный SDK для интеграции с Code Solver - платформой для анализа кода, векторного поиска и AI-ассистента. Поддерживает WebSocket для real-time уведомлений и delta-chunking для эффективной синхронизации.
3
+ Backend SDK для интеграции с Code Solver API
6
4
 
7
5
  ## 📦 Установка
8
6
 
@@ -10,1070 +8,73 @@
10
8
  npm install solver-sdk
11
9
  ```
12
10
 
13
- ## 🚀 Быстрый старт
11
+ ## 🚀 Инициализация
14
12
 
15
13
  ```typescript
16
14
  import { CodeSolverSDK } from 'solver-sdk';
17
15
 
18
16
  const sdk = new CodeSolverSDK({
19
17
  baseURL: 'http://localhost:3000',
20
- apiKey: 'your-api-key',
21
- webSocket: { enabled: true }
18
+ apiKey: 'your-api-key'
22
19
  });
23
-
24
- // 🔄 Cursor-like workflow для VS Code расширения
25
- async function openProject(projectPath: string) {
26
- // 1. Создать/найти проект
27
- const project = await sdk.projects.findOrCreateProject(projectPath, projectName);
28
-
29
- // 2. Проверить прерванные сессии
30
- const recovery = await sdk.projects.getRecoveryStatus(project.id);
31
- if (recovery.hasInterruptedSession) {
32
- // Показать диалог: "Continue indexing (67%)" или "Start fresh"
33
- const choice = await showRecoveryDialog(recovery.recoveryInfo);
34
- if (choice === 'continue') {
35
- await sdk.projects.resumeSync(project.id);
36
- } else {
37
- await sdk.projects.cancelRecovery(project.id);
38
- }
39
- }
40
-
41
- // 3. Smart Sync - проверить нужна ли синхронизация
42
- const hash = await computeMerkleRootHash(projectPath);
43
- const state = await sdk.projects.getProjectState(project.id, hash);
44
-
45
- if (state.syncRequired) {
46
- await sdk.projects.initializeDeltaSync(project.id, hash);
47
- }
48
- }
49
20
  ```
50
21
 
51
22
  ## 📖 API Reference
52
23
 
53
- ### 🏗️ Инициализация SDK
54
-
55
- #### `new CodeSolverSDK(options)`
56
-
57
- ```typescript
58
- interface CodeSolverSDKOptions {
59
- baseURL: string; // URL API сервера
60
- apiKey?: string; // API ключ для авторизации
61
- timeout?: number; // Таймаут запросов (по умолчанию 45000ms)
62
- headers?: Record<string, string>; // Дополнительные HTTP заголовки
63
-
64
- // WebSocket настройки
65
- webSocket?: {
66
- enabled?: boolean; // Включить WebSocket (по умолчанию true)
67
- connectionTimeout?: number; // Таймаут подключения (10000ms)
68
- maxRetries?: number; // Максимум попыток переподключения (3)
69
- retryDelay?: number; // Задержка между попытками (2000ms)
70
- debug?: boolean; // Отладочные логи (false)
71
- };
72
-
73
- // Delta-Chunking настройки
74
- deltaChunking?: {
75
- enabled?: boolean; // Включить delta-chunking (по умолчанию true)
76
-
77
- // Настройки разбиения на чанки (точная архитектура)
78
- chunking?: {
79
- maxChars?: number; // Максимум символов в чанке (2000, ~500 токенов)
80
- minChars?: number; // Минимум символов в чанке (500, ~130 токенов)
81
- useTreeSitter?: boolean; // Использовать tree-sitter парсер (в разработке)
82
- preserveContext?: boolean; // Сохранять контекст между чанками
83
- };
84
-
85
- maxConcurrentChunks?: number; // Максимум параллельных чанков (5)
86
- };
87
- }
88
- ```
89
-
90
- ### 📁 Projects API (`sdk.projects`)
91
-
92
- #### 🏗️ Управление проектами
93
-
24
+ ### Projects API (`sdk.projects`)
94
25
  ```typescript
95
- // Создание проекта
96
- createProject(name: string, path: string, data?: any): Promise<Project>
97
-
98
- // Получение всех проектов
26
+ createProject(name: string, data?: any): Promise<Project>
99
27
  getAllProjects(): Promise<Project[]>
100
- getProjects(): Promise<Project[]> // Псевдоним
101
-
102
- // Получение проекта по ID
103
- getProject(projectId: string): Promise<Project | null>
104
-
105
- // Поиск или создание проекта
106
- findOrCreateProject(projectPath: string, projectName: string, description?: string): Promise<Project>
107
- ```
108
-
109
- #### 📊 Управление состоянием и индексацией
110
-
111
- ```typescript
112
- // Получение статуса индексации проекта
113
- getIndexingStatus(projectId: string): Promise<any>
28
+ getProject(projectId: string): Promise<Project>
29
+ findOrCreateProject(projectName: string): Promise<Project>
30
+ deleteProject(projectId: string): Promise<void>
114
31
 
115
- // 🔍 Проверка состояния проекта (новое в v5.3.2+)
116
32
  getProjectState(projectId: string, clientRootHash?: string): Promise<ProjectState>
33
+ getIndexingStatus(projectId: string): Promise<any>
34
+ startIndexing(projectId: string, options?: any): Promise<any>
35
+ cancelIndexing(projectId: string): Promise<boolean>
36
+ resetIndexing(projectId: string): Promise<any>
37
+ restartIndexing(projectId: string): Promise<any>
117
38
 
118
- // 🔄 Проверка прерванных сессий (новое в v5.5.0+)
119
- getRecoveryStatus(projectId: string): Promise<{
120
- hasInterruptedSession: boolean;
121
- recoveryInfo?: RecoveryInfo;
122
- }>
123
-
124
- // 🔄 Возобновление прерванной синхронизации (новое в v5.5.0+)
125
- resumeSync(projectId: string, options?: ResumeOptions): Promise<{
126
- success: boolean;
127
- message: string;
128
- sessionId?: string;
129
- continueFromBatch?: number;
130
- resumeEndpoint?: string;
131
- }>
132
-
133
- // 🗑️ Отмена прерванной сессии (новое в v5.5.0+)
134
- cancelRecovery(projectId: string): Promise<{
135
- success: boolean;
136
- message: string;
137
- }>
138
- ```
139
-
140
- #### 🧹 Управление данными проекта
141
-
142
- ```typescript
143
- // 🧹 Очистка удаленных файлов (новое в v5.4.0+)
144
- cleanupDeletedFiles(projectId: string, activeFiles: ActiveFile[]): Promise<FileCleanupResult>
145
-
146
- // 🔍 Получение mapping обфусцированных путей (новое в v5.4.0+)
147
- getFilePathMapping(projectId: string): Promise<{
148
- success: boolean;
149
- files: FilePathMapping[];
150
- }>
151
- ```
152
-
153
-
154
-
155
-
156
- ### 🔍 Search API (`sdk.search`)
157
-
158
- #### Поиск по коду
159
-
160
- ```typescript
161
- // Основной поиск по коду
162
- searchCode(projectId: string, params: SearchCodeParams): Promise<SearchResult[]>
163
- searchCode(params: SearchCodeParams): Promise<SearchResult[]> // Альтернативная сигнатура
164
-
165
- // Семантический поиск
166
- semanticSearch(projectId: string, params: Omit<SearchCodeParams, 'projectId'>): Promise<SearchResult[]>
167
-
168
- // Поиск функций
169
- searchFunctions(projectId: string, params: SearchFunctionsParams): Promise<FunctionSearchResult>
170
- ```
171
-
172
- #### Параметры поиска
173
-
174
- ```typescript
175
- interface SearchCodeParams {
176
- projectId?: string; // ID проекта (если не передан отдельно)
177
- query: string; // Поисковый запрос
178
- limit?: number; // Максимум результатов (по умолчанию 10)
179
- maxResults?: number; // Альтернативное название для limit
180
- semantic?: boolean; // Флаг семантического поиска
181
- }
182
-
183
- interface SearchResult {
184
- id: string; // Уникальный ID результата
185
- score: number; // Оценка релевантности (0-1)
186
- filePath: string; // Путь к файлу
187
- fileName: string; // Имя файла
188
- language: string; // Язык программирования
189
- snippet: string; // Фрагмент кода
190
- line: number; // Номер строки
191
- size: number; // Размер фрагмента
192
- indexedAt?: string; // Время индексации
193
- }
194
- ```
195
-
196
- #### Примеры использования
197
-
198
- ```javascript
199
- // Обычный поиск
200
- const results = await sdk.search.searchCode('project-id', {
201
- query: 'function authenticate',
202
- limit: 20
203
- });
204
-
205
- results.forEach(result => {
206
- console.log(`${result.fileName}:${result.line} - ${result.snippet}`);
207
- });
208
-
209
- // Семантический поиск
210
- const semanticResults = await sdk.search.semanticSearch('project-id', {
211
- query: 'user authentication logic'
212
- });
213
-
214
- // Альтернативная сигнатура
215
- const results = await sdk.search.searchCode({
216
- projectId: 'project-id',
217
- query: 'error handling',
218
- limit: 5
219
- });
220
- ```
221
-
222
- ### 🔌 WebSocket API (`sdk.projectSync`)
223
-
224
- #### Real-time уведомления
225
-
226
- ```typescript
227
- // Подключение к WebSocket
228
- connectWebSocket(): Promise<void>
229
-
230
- // Отключение от WebSocket
231
- disconnectWebSocket(): void
232
-
233
- // Проверка статуса подключения
234
- isWebSocketConnected: boolean
235
-
236
- // Подписка на проект
237
- projectSync.subscribeToProject(projectId: string): void
238
-
239
- // Отписка от проекта
240
- projectSync.unsubscribeFromProject(projectId: string): void
241
-
242
- // Обработчики событий
243
- projectSync.on(eventName: string, handler: Function): void
244
- projectSync.off(eventName: string, handler: Function): void
245
- ```
246
-
247
- #### События WebSocket
248
-
249
- ```typescript
250
- // Обновление статуса синхронизации
251
- 'sync-status-update': (data: SyncStatusUpdate) => void
252
-
253
- // Прогресс синхронизации
254
- 'sync-progress': (data: SyncProgressEvent) => void
255
-
256
- // Завершение синхронизации
257
- 'sync-completed': (data: SyncCompletedEvent) => void
258
-
259
- // Ошибки
260
- 'error': (data: ErrorEvent) => void
261
-
262
- // Подключение/отключение
263
- 'connected': (data: { socketId: string }) => void
264
- 'disconnected': (data: { reason: string }) => void
265
- ```
266
-
267
- #### Примеры использования
268
-
269
- ```javascript
270
- // Подключение и подписка на проект
271
- await sdk.connectWebSocket();
272
- sdk.projectSync.subscribeToProject('project-id');
273
-
274
- // Обработка событий
275
- sdk.projectSync.on('sync-status-update', (status) => {
276
- console.log(`Проект ${status.projectId}: ${status.status} (${status.progress}%)`);
277
- });
278
-
279
- sdk.projectSync.on('sync-completed', (data) => {
280
- if (data.success) {
281
- console.log(`Синхронизация завершена за ${data.duration}мс`);
282
- } else {
283
- console.error(`Ошибка синхронизации: ${data.error}`);
284
- }
285
- });
286
-
287
- sdk.projectSync.on('error', (error) => {
288
- console.error(`WebSocket ошибка: ${error.error}`);
289
- });
290
-
291
- // Отключение
292
- sdk.disconnectWebSocket();
293
- ```
294
-
295
- ---
39
+ getRecoveryStatus(projectId: string): Promise<any>
40
+ resumeSync(projectId: string, options?: any): Promise<any>
41
+ cancelRecovery(projectId: string): Promise<any>
42
+ initializeDeltaSync(projectId: string, clientRootHash: string): Promise<any>
296
43
 
297
- ## 🔧 **API Reference**
44
+ sendInitialSync(projectId: string, request: any): Promise<any>
45
+ sendDeltaSync(projectId: string, batchRequest: any): Promise<any>
46
+ getDeltaSyncStatus(projectId: string): Promise<any>
47
+ finalizeDeltaSync(projectId: string): Promise<any>
48
+ cancelDeltaSync(projectId: string): Promise<any>
298
49
 
299
- ### Projects API (`sdk.projects`)
300
- ```typescript
301
- createProject(name: string, data?: any): Promise<Project>
302
- getAllProjects(): Promise<Project[]>
303
- getProject(projectId: string): Promise<Project | null>
304
- findOrCreateProject(projectPath: string, projectName: string): Promise<Project>
305
- getProjectState(projectId: string, clientRootHash?: string): Promise<ProjectState>
306
- getRecoveryStatus(projectId: string): Promise<RecoveryStatus>
307
- resumeSync(projectId: string, options?: ResumeOptions): Promise<ResumeResult>
308
- cancelRecovery(projectId: string): Promise<{ success: boolean }>
309
- initializeDeltaSync(projectId: string, clientRootHash: string): Promise<SyncInitResult>
310
- resetIndexing(projectId: string): Promise<ResetResult>
311
- deleteProject(projectId: string): Promise<void>
50
+ getFilePathMapping(projectId: string): Promise<any>
312
51
  ```
313
52
 
314
- ### Delta Manager API (`sdk.deltaManager`)
53
+ ### Delta Manager API (`sdk.deltaManager`)
315
54
  ```typescript
316
- syncEncryptedChunks(projectId: string, encryptedChunks: EncryptedChunk[], rootHash: string, options?: SyncOptions): Promise<SyncResult>
317
- cleanupDeletedFiles(projectId: string, currentFiles: FileContent[]): Promise<CleanupResult>
318
- getSyncStatus(projectId: string): Promise<SyncStatus>
55
+ syncEncryptedChunks(projectId: string, encryptedChunks: any[], rootHash: string, options?: any): Promise<any>
56
+ getSyncStatus(projectId: string): Promise<any>
319
57
  cancelSync(projectId: string): Promise<boolean>
320
58
  ```
321
59
 
322
60
  ### Chat API (`sdk.chat`)
323
61
  ```typescript
324
- chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
325
- chatStream(messages: ChatMessage[], options?: ChatOptions): Promise<AsyncIterable<ChatStreamChunk>>
62
+ chat(messages: any[], options?: any): Promise<any>
63
+ chatStream(messages: any[], options?: any): Promise<AsyncIterable<any>>
326
64
  cancelCurrentRequest(): void
327
65
  ```
328
66
 
329
67
  ### Search API (`sdk.search`)
330
68
  ```typescript
331
- search(query: string, options?: SearchOptions): Promise<SearchResult[]>
332
- searchThenFetch(query: string, options?: SearchThenFetchOptions): Promise<SearchThenFetchResult>
69
+ search(query: string, options?: any): Promise<any[]>
70
+ searchThenFetch(query: string, options?: any): Promise<any>
333
71
  ```
334
72
 
335
73
  ### WebSocket API (`sdk.projectSync`)
336
74
  ```typescript
337
75
  connectProjectSync(projectId: string): Promise<void>
338
- onSyncProgress(callback: (progress: SyncProgressEvent) => void): void
339
- onSyncCompleted(callback: (result: SyncCompletedEvent) => void): void
340
- onSyncError(callback: (error: SyncErrorEvent) => void): void
76
+ onSyncProgress(callback: Function): void
77
+ onSyncCompleted(callback: Function): void
78
+ onSyncError(callback: Function): void
341
79
  disconnectWebSocket(): void
342
- ```
343
-
344
- ---
345
-
346
- ## 🔧 **Backend SDK API Reference**
347
-
348
- ### 🏗️ **Projects API (`sdk.projects`)**
349
-
350
- #### ✅ **Основные методы для клиента:**
351
-
352
- ```typescript
353
- // 🔍 Управление проектами
354
- createProject(name: string, data?: any): Promise<Project>
355
- getAllProjects(): Promise<Project[]>
356
- getProject(projectId: string): Promise<Project | null>
357
- findOrCreateProject(projectPath: string, projectName: string): Promise<Project>
358
-
359
- // 📊 Smart Sync - проверка состояния проекта
360
- getProjectState(projectId: string, clientRootHash?: string): Promise<ProjectState>
361
-
362
- // 🔄 Session Recovery - восстановление прерванных сессий
363
- getRecoveryStatus(projectId: string): Promise<RecoveryStatus>
364
- resumeSync(projectId: string, options?: ResumeOptions): Promise<ResumeResult>
365
- cancelRecovery(projectId: string): Promise<{ success: boolean }>
366
-
367
- // 🚀 Delta Sync инициализация
368
- initializeDeltaSync(projectId: string, clientRootHash: string): Promise<{
369
- needsSync: boolean;
370
- sessionId?: string;
371
- lastSyncHash?: string;
372
- }>
373
-
374
- // 🧹 Очистка и управление
375
- resetIndexing(projectId: string): Promise<ResetResult>
376
- deleteProject(projectId: string): Promise<void>
377
- ```
378
-
379
- ### 🔄 **Delta Manager API (`sdk.deltaManager`)**
380
-
381
- #### ✅ **Методы для отправки chunks:**
382
-
383
- ```typescript
384
- // 📤 Отправка готовых зашифрованных chunks на сервер
385
- syncEncryptedChunks(
386
- projectId: string,
387
- encryptedChunks: EncryptedChunk[],
388
- rootHash: string,
389
- options?: SyncOptions
390
- ): Promise<SyncResult>
391
-
392
- // 🧹 Очистка удаленных файлов из векторной базы
393
- cleanupDeletedFiles(
394
- projectId: string,
395
- currentFiles: FileContent[]
396
- ): Promise<CleanupResult>
397
-
398
- // 📊 Получение статуса синхронизации
399
- getSyncStatus(projectId: string): Promise<SyncStatus>
400
-
401
- // ❌ Отмена синхронизации
402
- cancelSync(projectId: string): Promise<boolean>
403
- ```
404
-
405
- ### 💬 **Chat API (`sdk.chat`)**
406
-
407
- ```typescript
408
- // 💬 Отправка сообщения в чат
409
- chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
410
-
411
- // 🌊 Потоковая отправка (streaming)
412
- chatStream(messages: ChatMessage[], options?: ChatOptions): Promise<AsyncIterable<ChatStreamChunk>>
413
-
414
- // ❌ Отмена активного запроса
415
- cancelCurrentRequest(): void
416
- ```
417
-
418
- ### 🔍 **Search API (`sdk.search`)**
419
-
420
- ```typescript
421
- // 🔍 Векторный поиск по коду
422
- search(query: string, options?: SearchOptions): Promise<SearchResult[]>
423
-
424
- // 🔍 Поиск с последующей выборкой контекста
425
- searchThenFetch(query: string, options?: SearchThenFetchOptions): Promise<SearchThenFetchResult>
426
- ```
427
-
428
- ### 🌐 **WebSocket API (`sdk.projectSync`)**
429
-
430
- ```typescript
431
- // 🔌 Подключение к WebSocket для real-time уведомлений
432
- connectProjectSync(projectId: string): Promise<void>
433
-
434
- // 📡 Подписка на события синхронизации
435
- onSyncProgress(callback: (progress: SyncProgressEvent) => void): void
436
- onSyncCompleted(callback: (result: SyncCompletedEvent) => void): void
437
- onSyncError(callback: (error: SyncErrorEvent) => void): void
438
-
439
- // 🔌 Отключение WebSocket
440
- disconnectWebSocket(): void
441
-
442
- /**
443
- * 🧹 Полная очистка проекта (удаление всех данных)
444
- */
445
- async function clearProjectData(projectId: string) {
446
- // ВНИМАНИЕ: Это удалит ВСЕ проиндексированные данные!
447
-
448
- // Способ 1: Удалить проект полностью
449
- await sdk.projects.deleteProject(projectId);
450
- console.log('✅ Проект и все данные удалены полностью');
451
-
452
- // Способ 2: Очистить только файлы (оставить проект)
453
- const result = await sdk.cleanupDeletedFiles(projectId, []); // Пустой список = удалить все
454
- console.log(`✅ Очищено: ${result.deletedFromQdrant} векторов, ${result.deletedFromPostgres} записей`);
455
- }
456
- ```
457
-
458
- ### 📊 **Мониторинг прогресса индексации**
459
-
460
- ```typescript
461
- // Real-time мониторинг через WebSocket
462
- await sdk.connectWebSocket();
463
-
464
- sdk.projectSync.on('sync-progress', (progress) => {
465
- updateProgressBar({
466
- percentage: progress.progress,
467
- stage: progress.stage,
468
- currentFile: progress.currentChunk,
469
- totalFiles: progress.totalChunks,
470
- eta: calculateETA(progress)
471
- });
472
- });
473
-
474
- sdk.projectSync.on('sync-completed', (result) => {
475
- if (result.success) {
476
- showSuccessMessage(`✅ Indexing completed: ${result.totalProcessed} files processed`);
477
- } else {
478
- showErrorMessage(`❌ Indexing failed: ${result.errors.join(', ')}`);
479
- }
480
- });
481
-
482
- // Периодическая проверка статуса (альтернатива WebSocket)
483
- const interval = setInterval(async () => {
484
- const status = await sdk.projects.getDeltaSyncStatus(projectId);
485
-
486
- updateProgressUI({
487
- progress: status.progress,
488
- chunksProcessed: status.chunksProcessed,
489
- totalChunks: status.totalChunks,
490
- errors: status.errors
491
- });
492
-
493
- if (status.status === 'completed' || status.status === 'failed') {
494
- clearInterval(interval);
495
- }
496
- }, 2000);
497
- ```
498
-
499
- ---
500
-
501
- ### 🔄 Delta-Chunking API (`sdk.deltaSync`)
502
-
503
- #### Синхронизация с delta-chunking
504
-
505
- ```typescript
506
- // Инициализация синхронизации
507
- initializeSync(projectId: string, options?: SyncOptions): Promise<SyncResult>
508
-
509
- // Отправка delta чанков
510
- sendDeltaChunks(projectId: string, chunks: EncryptedChunk[]): Promise<void>
511
-
512
- // Финализация синхронизации
513
- finalizeDeltaSync(projectId: string): Promise<SyncResult>
514
-
515
- // Отмена синхронизации
516
- cancelDeltaSync(projectId: string): Promise<void>
517
-
518
- // Получение статуса синхронизации
519
- getSyncStatus(projectId: string): Promise<SyncStatus>
520
- ```
521
-
522
- #### Типы данных
523
-
524
- ```typescript
525
- interface SyncOptions {
526
- incremental?: boolean; // Инкрементальная синхронизация
527
- compression?: boolean; // Сжатие чанков
528
- encryption?: boolean; // Шифрование чанков
529
- }
530
-
531
- interface EncryptedChunk {
532
- id: string; // ID чанка
533
- data: string; // Зашифрованные данные (base64)
534
- hash: string; // SHA-256 хэш
535
- size: number; // Размер оригинальных данных
536
- metadata?: any; // Дополнительные метаданные
537
- }
538
-
539
- interface SyncResult {
540
- sessionId: string; // ID сессии синхронизации
541
- status: string; // Статус операции
542
- message?: string; // Сообщение о результате
543
- chunksProcessed?: number; // Количество обработанных чанков
544
- }
545
- ```
546
-
547
- #### Примеры использования
548
-
549
- ```javascript
550
- // Полный цикл delta-chunking синхронизации с оптимальной конфигурацией
551
- const sdk = new CodeSolverSDK({
552
- baseURL: 'https://api.codesolver.app',
553
- apiKey: 'your-api-key',
554
- deltaChunking: {
555
- enabled: true,
556
- chunking: {
557
- maxChars: 2000, // Оптимальный размер для большинства файлов (~500 токенов)
558
- minChars: 500, // Минимум для избежания мелких чанков (~130 токенов)
559
- }
560
- }
561
- });
562
-
563
- const syncResult = await sdk.deltaSync.initializeSync('project-id', {
564
- incremental: true,
565
- compression: true
566
- });
567
-
568
- console.log('Сессия синхронизации:', syncResult.sessionId);
569
-
570
- // Подготовка и отправка чанков
571
- const chunks = [
572
- {
573
- id: 'chunk-1',
574
- data: btoa('console.log("Hello World");'), // base64
575
- hash: 'sha256-hash',
576
- size: 26
577
- }
578
- ];
579
-
580
- await sdk.deltaSync.sendDeltaChunks('project-id', chunks);
581
-
582
- // Финализация
583
- const finalResult = await sdk.deltaSync.finalizeDeltaSync('project-id');
584
- console.log('Синхронизация завершена:', finalResult.status);
585
-
586
- // Мониторинг через WebSocket
587
- sdk.projectSync.on('sync-progress', (progress) => {
588
- console.log(`Обработано ${progress.currentChunk}/${progress.totalChunks} чанков`);
589
- });
590
- ```
591
-
592
- ### 💬 Chat API (`sdk.chat`)
593
-
594
- #### AI-ассистент
595
-
596
- ```typescript
597
- // Отправка сообщения
598
- sendMessage(messages: Message[], options?: ChatOptions): Promise<ChatResponse>
599
-
600
- // Потоковый чат
601
- streamChat(messages: Message[], options?: StreamChatOptions): AsyncGenerator<ChatChunk>
602
-
603
- // Continuation для interleaved thinking с tool_result
604
- sendContinuation(messages: Message[], options?: StreamChatOptions): AsyncGenerator<ChatChunk>
605
- ```
606
-
607
- #### Примеры использования
608
-
609
- ```javascript
610
- // Простой чат
611
- const response = await sdk.chat.sendMessage([
612
- { role: 'user', content: 'Объясни что такое async/await' }
613
- ]);
614
-
615
- console.log(response.choices[0].message.content);
616
-
617
- // Потоковый чат
618
- const stream = sdk.chat.streamChat([
619
- { role: 'user', content: 'Напиши функцию сортировки' }
620
- ]);
621
-
622
- for await (const chunk of stream) {
623
- process.stdout.write(chunk.choices[0]?.delta?.content || '');
624
- }
625
-
626
- // Continuation после выполнения tool_use
627
- const continuationMessages = [
628
- { role: 'user', content: 'прочитай README файл' },
629
- { role: 'assistant', content: [
630
- { type: 'thinking', thinking: '...', signature: '...' },
631
- { type: 'tool_use', id: 'toolu_abc123', name: 'read_file', input: { file_path: 'README.md' } }
632
- ]},
633
- { role: 'user', content: [{
634
- type: 'tool_result',
635
- tool_use_id: 'toolu_abc123',
636
- content: 'Содержимое README файла...'
637
- }]}
638
- ];
639
-
640
- for await (const chunk of sdk.chat.sendContinuation(continuationMessages)) {
641
- console.log('Continuation chunk:', chunk);
642
- }
643
- ```
644
-
645
- ---
646
-
647
- ## 🛠️ **УПРАВЛЕНИЕ ДАННЫМИ ПРОЕКТА**
648
-
649
- ### 🧹 **Очистка и управление файлами**
650
-
651
- ```typescript
652
- /**
653
- * 🧹 Очистка удаленных файлов (рекомендуется вызывать регулярно)
654
- */
655
- async function cleanupDeletedFiles(projectId: string, workspacePath: string) {
656
- // Получить список активных файлов в workspace
657
- const activeFiles = await getWorkspaceFiles(workspacePath);
658
-
659
- // Очистить удаленные файлы из индекса
660
- const result = await sdk.cleanupDeletedFiles(projectId, activeFiles.map(file => ({
661
- filePath: file.path,
662
- fileHash: file.hash,
663
- lastModified: file.lastModified
664
- })));
665
-
666
- console.log(`🧹 Cleanup completed:`);
667
- console.log(` - Removed from Qdrant: ${result.deletedFromQdrant} vectors`);
668
- console.log(` - Removed from PostgreSQL: ${result.deletedFromPostgres} records`);
669
- console.log(` - Active files: ${result.activeFiles}`);
670
- }
671
-
672
- /**
673
- * 🔄 Управление индексацией проекта
674
- */
675
- async function manageProjectIndexing(projectId: string) {
676
- // Вариант 1: Сбросить индексацию (проект остается)
677
- const reset = await sdk.projects.resetIndexing(projectId);
678
- console.log(`✅ Индексация сброшена: ${reset.clearedData.vectorsDeleted} векторов очищено`);
679
-
680
- // Вариант 2: Перезапустить индексацию (сброс + подготовка)
681
- const restart = await sdk.projects.restartIndexing(projectId);
682
- if (restart.readyForNewSync) {
683
- console.log('✅ Готов к новой индексации');
684
- // Начать новую синхронизацию
685
- const hash = await computeMerkleRootHash(workspacePath);
686
- await sdk.projects.initializeDeltaSync(projectId, hash);
687
- }
688
-
689
- // Вариант 3: Очистить только удаленные файлы
690
- const result = await sdk.cleanupDeletedFiles(projectId, []); // Пустой список = удалить все
691
- console.log(`✅ Файлы очищены: ${result.deletedFromQdrant + result.deletedFromPostgres} записей`);
692
-
693
- // Вариант 4: Удалить проект полностью
694
- await sdk.projects.deleteProject(projectId);
695
- console.log('✅ Проект полностью удален из системы');
696
- }
697
-
698
- /**
699
- * 🔍 Диагностика состояния проекта
700
- */
701
- async function diagnoseProject(projectId: string) {
702
- // Получить детальное состояние
703
- const state = await sdk.projects.getProjectState(projectId);
704
- console.log(`📊 Project State:`);
705
- console.log(` - Name: ${state.projectName}`);
706
- console.log(` - Total chunks: ${state.totalChunks}`);
707
- console.log(` - Status: ${state.indexingStatus}`);
708
- console.log(` - Last indexed: ${state.lastIndexedAt}`);
709
- console.log(` - Merkle hash: ${state.merkleRootHash?.substring(0, 8)}...`);
710
-
711
- // Проверить прерванные сессии
712
- const recovery = await sdk.projects.getRecoveryStatus(projectId);
713
- if (recovery.hasInterruptedSession) {
714
- const info = recovery.recoveryInfo!;
715
- console.log(`⚠️ Interrupted session found:`);
716
- console.log(` - Progress: ${info.progress.percentage}% (${info.progress.processed}/${info.progress.total})`);
717
- console.log(` - Interrupted: ${info.interruptedAt}`);
718
- console.log(` - Can resume: ${info.canResume}`);
719
- console.log(` - Reason: ${info.resumeReason}`);
720
- }
721
-
722
- // Получить file mapping для отладки
723
- const mapping = await sdk.projects.getFilePathMapping(projectId);
724
- console.log(`📁 File mapping: ${mapping.files.length} files indexed`);
725
- }
726
- ```
727
-
728
- ### ⚠️ **Troubleshooting и восстановление**
729
-
730
- ```typescript
731
- /**
732
- * 🚨 Экстренное восстановление при проблемах
733
- */
734
- async function emergencyRecovery(projectId: string) {
735
- try {
736
- console.log('🚨 Starting emergency recovery...');
737
-
738
- // 1. Проверить состояние проекта
739
- const state = await sdk.projects.getProjectState(projectId);
740
- console.log(`Current state: ${state.indexingStatus}`);
741
-
742
- // 2. Отменить все прерванные сессии
743
- const cancelled = await sdk.projects.cancelRecovery(projectId);
744
- if (cancelled.success) {
745
- console.log('✅ Cancelled interrupted sessions');
746
- }
747
-
748
- // 3. Очистить поврежденные данные (если нужно)
749
- const cleaned = await sdk.cleanupDeletedFiles(projectId, []);
750
- console.log(`🧹 Cleaned ${cleaned.deletedFromQdrant + cleaned.deletedFromPostgres} corrupted records`);
751
-
752
- // 4. Начать полную ресинхронизацию
753
- const merkleHash = await computeMerkleRootHash(workspacePath);
754
- await sdk.projects.initializeDeltaSync(projectId, merkleHash);
755
-
756
- console.log('✅ Emergency recovery completed, full resync started');
757
-
758
- } catch (error) {
759
- console.error('❌ Emergency recovery failed:', error);
760
-
761
- // Последний шанс: удалить и пересоздать проект
762
- await sdk.projects.deleteProject(projectId);
763
- const newProject = await sdk.projects.createProject(projectName, projectPath);
764
- console.log(`🆕 Created new project: ${newProject.id}`);
765
- }
766
- }
767
-
768
- /**
769
- * 🔄 Принудительное возобновление (для сложных случаев)
770
- */
771
- async function forceResumeSync(projectId: string) {
772
- const resumed = await sdk.projects.resumeSync(projectId, {
773
- forceResume: true, // Игнорировать canResume=false
774
- skipDuplicates: true, // Пропустить дубликаты
775
- continueFromLastBatch: false // Начать сначала, но с сохраненным прогрессом
776
- });
777
-
778
- if (resumed.success) {
779
- console.log('✅ Force resume successful');
780
- return resumed;
781
- } else {
782
- console.error('❌ Force resume failed, falling back to fresh sync');
783
- return await startFreshIndexing(projectId);
784
- }
785
- }
786
- ```
787
-
788
- ---
789
-
790
- ## 💡 Рекомендации по использованию
791
-
792
- ### Real-time уведомления
793
- Для получения актуальных данных в реальном времени используйте WebSocket:
794
-
795
- ```javascript
796
- // ✅ Правильно: WebSocket для real-time статуса
797
- await sdk.connectWebSocket();
798
- sdk.projectSync.on('sync-status-update', (status) => {
799
- console.log(`Статус: ${status.status}, прогресс: ${status.progress}%`);
800
- });
801
-
802
- // ❌ Избегайте частых REST запросов
803
- // setInterval(() => sdk.indexing.getStatus(id), 2000);
804
- ```
805
-
806
- ### Обработка лимитов
807
- SDK автоматически обрабатывает ограничения сервера. При превышении лимитов возвращается ошибка 429.
808
-
809
- ## 🔧 Обработка ошибок
810
-
811
- ```javascript
812
- try {
813
- const project = await sdk.projects.createProject('Test', '/path');
814
- } catch (error) {
815
- if (error.status === 401) {
816
- console.error('Неверный API ключ');
817
- } else if (error.status === 429) {
818
- console.error('Слишком много запросов, попробуйте позже');
819
- } else {
820
- console.error('Ошибка API:', error.message);
821
- }
822
- }
823
-
824
- // WebSocket ошибки
825
- sdk.projectSync.on('error', (error) => {
826
- if (error.recoverable) {
827
- console.warn('Временная ошибка WebSocket:', error.error);
828
- } else {
829
- console.error('Критическая ошибка WebSocket:', error.error);
830
- }
831
- });
832
- ```
833
-
834
- ## 🚀 Продвинутое использование
835
-
836
- ### Настройка HTTP клиента
837
-
838
- ```javascript
839
- const sdk = new CodeSolverSDK({
840
- baseURL: 'https://api.codesolver.dev',
841
- apiKey: process.env.CODESOLVER_API_KEY,
842
- timeout: 60000,
843
- headers: {
844
- 'User-Agent': 'MyApp/1.0.0',
845
- 'X-Custom-Header': 'value'
846
- }
847
- });
848
- ```
849
-
850
- ### WebSocket с переподключением
851
-
852
- ```javascript
853
- const sdk = new CodeSolverSDK({
854
- baseURL: 'wss://api.codesolver.dev',
855
- webSocket: {
856
- enabled: true,
857
- maxRetries: 5,
858
- retryDelay: 3000,
859
- debug: true
860
- }
861
- });
862
-
863
- sdk.projectSync.on('connected', () => {
864
- console.log('WebSocket подключен');
865
- });
866
-
867
- sdk.projectSync.on('disconnected', (data) => {
868
- console.log('WebSocket отключен:', data.reason);
869
- });
870
- ```
871
-
872
- ### Delta-Chunking с шифрованием
873
-
874
- ```javascript
875
- const syncResult = await sdk.deltaSync.initializeSync('project-id', {
876
- incremental: true,
877
- compression: true,
878
- encryption: true
879
- });
880
-
881
- // Шифрование чанков на клиенте
882
- const encryptedChunks = chunks.map(chunk => ({
883
- ...chunk,
884
- data: encrypt(chunk.data), // Ваша функция шифрования
885
- hash: sha256(chunk.data)
886
- }));
887
-
888
- await sdk.deltaSync.sendDeltaChunks('project-id', encryptedChunks);
889
- ```
890
-
891
- ## 📊 Мониторинг и диагностика
892
-
893
- ```javascript
894
- // Диагностика API
895
- const diagnosis = await sdk.diagnoseAPI();
896
- console.log('Статус API:', diagnosis);
897
-
898
- // Health check
899
- const health = await sdk.httpClient.get('/health');
900
- console.log('Здоровье сервера:', health);
901
-
902
- // Детальная информация о системе
903
- const info = await sdk.httpClient.get('/health/info');
904
- console.log('Информация о системе:', info);
905
- ```
906
-
907
- ## 🔄 Миграция с предыдущих версий
908
-
909
- ### С версии 4.x на 5.x
910
-
911
- ```javascript
912
- // Старый способ (4.x)
913
- const status = await sdk.projects.getIndexingStatus(projectId);
914
-
915
- // Новый способ (5.x)
916
- const status = await sdk.indexing.getStatus(projectId);
917
-
918
- // Или лучше - WebSocket
919
- sdk.projectSync.on('sync-status-update', (status) => {
920
- // Real-time статус
921
- });
922
- ```
923
-
924
- ## 📝 Changelog
925
-
926
- ### v5.2.0 (Latest) - КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ
927
- - 🚨 **ОТКЛЮЧЕН waitForCompletion()** - предотвращение polling
928
- - 🛡️ **Усилен rate limiting** статуса (2 запроса/минуту)
929
- - ✅ **Принудительное использование WebSocket** для real-time уведомлений
930
- - 📖 **Обновлена документация** с четкими инструкциями
931
-
932
- ### v5.1.5
933
- - ✅ Исправлена документация - убраны детали внутренней реализации
934
- - ✅ Удалены несуществующие методы из документации
935
- - ✅ Сосредоточено только на пользовательском API
936
-
937
- ### v5.1.4
938
- - ✅ Полная документация всех API методов
939
- - ✅ Добавлен `IndexingApi` для управления индексацией
940
- - ✅ Добавлен `ProjectSyncClient` для WebSocket уведомлений
941
- - ✅ Исправлена генерация URL в `SearchApi`
942
- - ✅ Добавлен метод `semanticSearch`
943
- - ✅ Добавлен метод `findOrCreateProject`
944
- - ✅ Улучшена обработка ошибок WebSocket
945
- - ✅ Обновлена документация и примеры
946
-
947
- ### v5.0.0
948
- - 🚀 Полная переработка архитектуры
949
- - 🔌 WebSocket поддержка для real-time уведомлений
950
- - 🔄 Delta-chunking для эффективной синхронизации
951
- - 🛡️ Автоматическая обработка лимитов сервера
952
-
953
- ---
954
-
955
- ## 📋 **QUICK REFERENCE - Управление индексацией**
956
-
957
- ### 🔄 **Основные методы (обязательные для VS Code расширения)**
958
-
959
- | Метод | Описание | Когда использовать |
960
- |-------|----------|-------------------|
961
- | `getRecoveryStatus(projectId)` | Проверка прерванных сессий | При открытии проекта |
962
- | `getProjectState(projectId, hash?)` | Проверка актуальности | Перед синхронизацией |
963
- | `resumeSync(projectId, options?)` | Продолжить прерванную синхронизацию | Кнопка "Continue" |
964
- | `cancelRecovery(projectId)` | Отменить прерванную сессию | Кнопка "Start Fresh" |
965
- | `initializeDeltaSync(projectId, hash)` | Начать новую синхронизацию | Новая индексация |
966
- | `finalizeDeltaSync(projectId)` | Завершить синхронизацию | После отправки всех батчей |
967
- | `cleanupDeletedFiles(projectId, files)` | Очистить удаленные файлы | При изменении файлов |
968
- | `resetIndexing(projectId)` | **Сброс индексации** | Очистить данные, сохранить проект |
969
- | `restartIndexing(projectId)` | **Перезапуск индексации** | Сброс + подготовка к новой |
970
- | `deleteProject(projectId)` | **Полное удаление проекта** | Удалить проект и все данные |
971
-
972
- ### 🎯 **Полный список методов управления индексацией**
973
-
974
- ```typescript
975
- // 🔍 ПРОВЕРКА СОСТОЯНИЯ
976
- await sdk.projects.getProjectState(projectId, clientHash) // Нужна ли синхронизация?
977
- await sdk.projects.getRecoveryStatus(projectId) // Есть ли прерванные сессии?
978
- await sdk.projects.getDeltaSyncStatus(projectId) // Текущий статус синхронизации
979
-
980
- // 🚀 УПРАВЛЕНИЕ СИНХРОНИЗАЦИЕЙ
981
- await sdk.projects.initializeDeltaSync(projectId, hash) // Начать новую синхронизацию
982
- await sdk.projects.resumeSync(projectId, options) // Продолжить прерванную
983
- await sdk.projects.finalizeDeltaSync(projectId) // Завершить синхронизацию
984
- await sdk.projects.cancelDeltaSync(projectId) // Отменить активную синхронизацию
985
-
986
- // 🔄 УПРАВЛЕНИЕ ПРЕРЫВАНИЯМИ
987
- await sdk.projects.cancelRecovery(projectId) // Отменить восстановление
988
-
989
- // 🧹 УПРАВЛЕНИЕ ДАННЫМИ
990
- await sdk.cleanupDeletedFiles(projectId, activeFiles) // Очистить удаленные файлы
991
- await sdk.projects.getFilePathMapping(projectId) // Получить mapping файлов
992
- await sdk.projects.resetIndexing(projectId) // Сброс индексации (проект остается)
993
- await sdk.projects.restartIndexing(projectId) // Перезапуск индексации
994
- await sdk.projects.deleteProject(projectId) // ПОЛНОЕ удаление проекта
995
-
996
- // 📊 МОНИТОРИНГ (WebSocket)
997
- sdk.projectSync.on('sync-progress', callback) // Real-time прогресс
998
- sdk.projectSync.on('sync-completed', callback) // Завершение синхронизации
999
- sdk.projectSync.on('sync-status-update', callback) // Обновления статуса
1000
- ```
1001
-
1002
- ### 🎯 **Cursor-like UX Pattern**
1003
-
1004
- ```typescript
1005
- // Главный workflow для VS Code расширения
1006
- async function openProject(projectPath: string) {
1007
- // 1. Создать/найти проект
1008
- const project = await sdk.projects.findOrCreateProject(projectPath, projectName);
1009
-
1010
- // 2. Проверить прерванные сессии
1011
- const recovery = await sdk.projects.getRecoveryStatus(project.id);
1012
-
1013
- if (recovery.hasInterruptedSession) {
1014
- // Показать диалог: "Continue indexing (67%)" или "Start fresh"
1015
- const choice = await vscode.window.showInformationMessage(
1016
- `Indexing was interrupted at ${recovery.recoveryInfo.progress.percentage}%. Continue?`,
1017
- 'Continue', 'Start Fresh'
1018
- );
1019
-
1020
- if (choice === 'Continue') {
1021
- await sdk.projects.resumeSync(project.id);
1022
- } else {
1023
- await sdk.projects.cancelRecovery(project.id);
1024
- }
1025
- }
1026
-
1027
- // 3. Проверить нужна ли синхронизация
1028
- const hash = await computeMerkleRootHash(projectPath);
1029
- const state = await sdk.projects.getProjectState(project.id, hash);
1030
-
1031
- if (state.syncRequired) {
1032
- await sdk.projects.initializeDeltaSync(project.id, hash);
1033
- }
1034
- }
1035
- ```
1036
-
1037
- ### 🚨 **Error Handling Best Practices**
1038
-
1039
- ```typescript
1040
- // Обработка всех возможных ошибок
1041
- try {
1042
- await performDeltaSync(projectId, merkleHash);
1043
- await sdk.projects.finalizeDeltaSync(projectId); // ОБЯЗАТЕЛЬНО!
1044
- } catch (error) {
1045
- console.error('Sync failed:', error);
1046
-
1047
- // Система автоматически пометит сессию для восстановления
1048
- // При следующем открытии пользователь увидит "Continue indexing"
1049
- }
1050
- ```
1051
-
1052
- ---
1053
-
1054
- ## 📞 Поддержка
1055
-
1056
- - **GitHub**: [Issues](https://github.com/codesolver/solver-sdk/issues)
1057
- - **Email**: support@codesolver.dev
1058
- - **Документация**: [docs.codesolver.dev](https://docs.codesolver.dev)
1059
-
1060
- ## 📄 Лицензия
1061
-
1062
- MIT License - см. [LICENSE](LICENSE) файл.
1063
-
1064
- ---
1065
-
1066
- **🚀 Code Solver SDK v5.6.0** - Создано с ❤️ для разработчиков
1067
-
1068
- ### 🎯 **НОВОЕ В v5.6.0: Advanced Indexing Management**
1069
- - 🔄 **resetIndexing()** - сброс индексации (проект остается)
1070
- - 🚀 **restartIndexing()** - перезапуск индексации + подготовка
1071
- - 🎯 **Гибкий контроль** - точное управление без удаления проекта
1072
- - 📖 **Enhanced UX** - готовые паттерны для VS Code
1073
-
1074
- ### 🎯 **v5.5.0: Resilient Sync System**
1075
- - 🔄 **Cursor-like Recovery** - восстановление прерванных сессий
1076
- - 📊 **Детальный прогресс** - процент завершения и ETA
1077
- - 🛡️ **Автоматическая обработка прерываний** - сеть, падения, ошибки
1078
- - 🧹 **Smart Cleanup** - точная очистка удаленных файлов
1079
- - 🎨 **Production UX** - готовые паттерны для VS Code расширений
80
+ ```