solver-sdk 7.1.3 → 7.3.0

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,535 +1,383 @@
1
- # Code Solver SDK v7.1.1
1
+ # Code Solver SDK v7.3.0
2
2
 
3
- Backend SDK для интеграции с Code Solver API (Pure Cloud-First)
3
+ AI-powered code analysis SDK. 100% typed, production ready.
4
4
 
5
- ## 📑 Навигация
5
+ ## Install
6
6
 
7
- **Быстрый старт:**
8
- - [Установка](#-установка-github-packages---private) • [Быстрый старт](#-быстрый-старт) • [Быстрая справка](#-быстрая-справка)
9
-
10
- **Работа с проектами:**
11
- - [Индексация](#индексация-проекта) • [Real-time прогресс](#websocket-api-sdkprojectsync) • [Recovery](#session-recovery)
7
+ ```bash
8
+ npm install solver-sdk@7.3.0
9
+ ```
12
10
 
13
- **Типы и решение проблем:**
14
- - [Ключевые типы](#-ключевые-типы-данных) • [Решение проблем](#-быстрое-решение-проблем) • [API Reference](#-api-reference-подробно)
11
+ ## Quick Start
15
12
 
16
- ---
13
+ ```typescript
14
+ import { CodeSolverSDK } from 'solver-sdk';
17
15
 
18
- ## 🔒 Установка (GitHub Packages - Private)
16
+ const sdk = await CodeSolverSDK.create({
17
+ baseURL: 'https://api.example.com',
18
+ getAuthToken: async () => getToken()
19
+ });
19
20
 
20
- SDK теперь приватный и публикуется в GitHub Packages.
21
+ // Projects
22
+ const projects = await sdk.projects.getAllProjects();
23
+ await sdk.projects.createProject('MyProject');
21
24
 
22
- ### Требования:
23
- - GitHub Personal Access Token с правами `read:packages`
24
- - Доступ к организации `AndroidSprintTeam`
25
+ // Chat with Thinking
26
+ const response = await sdk.chat.chat([
27
+ { role: 'user', content: 'explain this code' }
28
+ ], { thinking: { type: 'enabled', budget_tokens: 10000 } });
25
29
 
26
- ### Установка:
30
+ // Search
31
+ const results = await sdk.search.searchCode({
32
+ projectId,
33
+ query: 'authentication function'
34
+ });
27
35
 
28
- ```bash
29
- # 1. Создай .npmrc в корне проекта
30
- cat > .npmrc << 'EOF'
31
- //npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN
32
- @androidsprintteam:registry=https://npm.pkg.github.com
33
- always-auth=true
34
- EOF
35
-
36
- # 2. Установи SDK
37
- npm install @androidsprintteam/solver-sdk
36
+ // User & Updates
37
+ const profile = await sdk.user.getProfile();
38
+ const update = await sdk.updates.checkForUpdates({...});
38
39
  ```
39
40
 
40
- **Создание токена:** https://github.com/settings/tokens/new (scopes: `read:packages`, `repo`)
41
+ ## API Overview
41
42
 
42
- **Полная документация:** см. `GITHUB_PACKAGES_SETUP.md`
43
+ | Feature | Methods | Status |
44
+ |---------|---------|--------|
45
+ | **Projects** | 19 | ✅ Full CRUD + state |
46
+ | **Delta Chunking** | 7 | ✅ Encrypted sync |
47
+ | **Chat** | 12 | ✅ Streaming + Extended Thinking |
48
+ | **Search** | 4 | ✅ Vector-based |
49
+ | **Tools** | 5 | ✅ AI tool schemas |
50
+ | **Models** | 5 | ✅ Provider info |
51
+ | **Updates** | 5 | ✅ Auto-check + changelog |
52
+ | **User** | 1 | ✅ Profile |
53
+ | **Auth** | 2 | ✅ Token revocation + logout |
43
54
 
44
- ## 🚀 Быстрый старт
55
+ ## Auth
45
56
 
46
- ### Локальная разработка
47
57
  ```typescript
48
- import { CodeSolverSDK } from '@androidsprintteam/solver-sdk';
49
-
58
+ // Local dev
50
59
  const sdk = await CodeSolverSDK.create({
51
60
  baseURL: 'http://localhost:3000',
52
- apiKey: 'your-api-key'
61
+ getAuthToken: async () => 'your-token'
53
62
  });
54
- ```
55
63
 
56
- ### Production с OAuth
57
- ```typescript
58
- const sdk = await CodeSolverSDK.create({
59
- baseURL: 'https://workai.su/api/v1',
60
- headers: { Authorization: `Bearer ${oauth_token}` },
61
- webSocket: { enabled: true }
62
- });
63
- ```
64
-
65
- ### 🔑 Динамическое обновление токена (v6.1.4+)
66
- ```typescript
64
+ // Production with token refresh
67
65
  const sdk = await CodeSolverSDK.create({
68
- baseURL: 'https://workai.su/api/v1',
66
+ baseURL: 'https://api.example.com',
69
67
  getAuthToken: async () => {
70
- if (authManager.isTokenExpired()) {
71
- await authManager.refreshAccessToken();
68
+ if (isTokenExpired()) {
69
+ await refreshToken();
72
70
  }
73
- return authManager.getAccessToken();
71
+ return getToken();
74
72
  }
75
73
  });
76
74
  ```
77
75
 
78
- ## 📖 Быстрая справка
79
-
80
- | Задача | Метод | Назначение |
81
- |--------|-------|------------|
82
- | **Индексация** |
83
- | Синхронизировать проект | `sdk.deltaManager.syncEncryptedChunks(projectId, chunks, rootHash)` | Единственный способ индексации |
84
- | Проверить статус | `sdk.projects.getProjectState(projectId, clientRootHash?)` | Получить состояние + totalFiles |
85
- | Проверить recovery | `sdk.projects.getRecoveryStatus(projectId)` | Нужно ли возобновить прерванную синхронизацию |
86
- | Возобновить синхронизацию | `sdk.projects.resumeSync(projectId)` | Продолжить прерванную индексацию |
87
- | **Real-time прогресс** |
88
- | Подключить WebSocket | `await sdk.connectWebSocket()` | Для live обновлений |
89
- | Подписаться на проект | `sdk.projectSync.subscribeToProject(projectId)` | Получать события по проекту |
90
- | Прогресс индексации | `sdk.projectSync.on('sync-progress', callback)` | `data.processedFiles / data.totalFiles` |
91
- | Завершение индексации | `sdk.projectSync.on('sync-completed', callback)` | `data.statistics.totalFiles` |
92
- | **Проекты** |
93
- | Получить все проекты | `sdk.projects.getAllProjects()` | Список всех проектов |
94
- | Найти или создать | `sdk.projects.findOrCreateProject(name)` | Idempotent создание |
95
- | Получить проект | `sdk.projects.getProject(projectId)` | Детали проекта |
96
- | **Поиск** |
97
- | Поиск по коду | `sdk.search.searchCode(projectId, query)` | Semantic search с reranker |
98
- | Поиск функций | `sdk.search.searchFunctions(projectId, query)` | Только функции/методы |
99
- | **Чат** |
100
- | Streaming чат | `sdk.chat.streamChat(messages, options)` | AsyncGenerator chunks |
101
- | Обычный чат | `sdk.chat.chat(messages, options)` | Promise response |
102
-
103
- ## 📖 API Reference (подробно)
104
-
105
- <details>
106
- <summary><b>Projects API</b> (<code>sdk.projects</code>) - управление проектами</summary>
76
+ ## WebSocket (Real-time)
107
77
 
108
78
  ```typescript
109
- // Основные методы
110
- getAllProjects(): Promise<Project[]>
111
- getProject(projectId: string): Promise<Project>
112
- findOrCreateProject(projectName: string): Promise<Project>
113
-
114
- // Индексация
115
- getProjectState(projectId: string, clientRootHash?: string): Promise<ProjectState>
116
- getIndexingStatus(projectId: string): Promise<any>
117
-
118
- // Recovery
119
- getRecoveryStatus(projectId: string): Promise<any>
120
- resumeSync(projectId: string, options?: any): Promise<any>
121
- cancelRecovery(projectId: string): Promise<any>
122
- ```
79
+ // Connect
80
+ await sdk.connectWebSocket();
123
81
 
124
- </details>
82
+ // Subscribe to project
83
+ sdk.projectSync.subscribeToProject(projectId);
125
84
 
126
- <details>
127
- <summary><b>Delta Manager API</b> (<code>sdk.deltaManager</code>) - индексация проекта</summary>
85
+ // Listen for updates
86
+ sdk.projectSync.on('sync-progress', (data) => {
87
+ console.log(`Progress: ${data.processedFiles}/${data.totalFiles}`);
88
+ });
128
89
 
129
- ```typescript
130
- // Основной метод индексации
131
- syncEncryptedChunks(
132
- projectId: string,
133
- encryptedChunks: any[],
134
- rootHash: string,
135
- options?: { batchSize?: number; onProgress?: (current, total) => void }
136
- ): Promise<any>
137
-
138
- // Вспомогательные
139
- getSyncStatus(projectId: string): Promise<SyncStatus>
140
- cancelSync(projectId: string): Promise<boolean>
141
- cleanupDeletedFiles(projectId: string, activeFiles: any[]): Promise<any>
90
+ sdk.projectSync.on('sync-completed', (data) => {
91
+ console.log(`Done: ${data.statistics.totalFiles} files`);
92
+ });
142
93
  ```
143
94
 
144
- </details>
95
+ ## Error Handling
145
96
 
146
- <details>
147
- <summary><b>Search API</b> (<code>sdk.search</code>) - поиск по коду</summary>
97
+ By default, 401/403 auth errors return `null` instead of throwing:
148
98
 
149
99
  ```typescript
150
- searchCode(projectId: string, query: string, options?: any): Promise<any[]>
151
- searchFunctions(projectId: string, query: string, options?: any): Promise<any[]>
152
- semanticSearch(projectId: string, query: string, options?: any): Promise<any[]>
153
- ```
100
+ const projects = await sdk.projects.getAllProjects();
101
+ if (!projects) {
102
+ // Token expired - refresh and retry
103
+ await refreshToken();
104
+ }
154
105
 
155
- </details>
106
+ // To throw errors instead:
107
+ const sdk = await CodeSolverSDK.create({
108
+ suppressAuthErrors: false
109
+ });
110
+ ```
156
111
 
157
- <details>
158
- <summary><b>Chat API</b> (<code>sdk.chat</code>) - AI чат</summary>
112
+ ## Types
159
113
 
160
114
  ```typescript
161
- // Streaming
162
- streamChat(messages: ChatMessage[], options?: ChatStreamOptions): AsyncGenerator<ChatStreamChunk>
163
-
164
- // Обычный
165
- chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
166
- chatWithRegionFailover(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
115
+ import {
116
+ ChatMessage,
117
+ ChatOptions,
118
+ Project,
119
+ ProjectState,
120
+ SearchResult,
121
+ UserProfile
122
+ } from 'solver-sdk';
167
123
  ```
168
124
 
169
- </details>
125
+ ## Debug
170
126
 
171
- ### WebSocket API (`sdk.projectSync`)
172
127
  ```typescript
173
- // Подключение
174
- await sdk.connectWebSocket()
175
- sdk.disconnectWebSocket()
176
- sdk.isWebSocketConnected
177
-
178
- // Подписка
179
- sdk.projectSync.subscribeToProject(projectId)
180
- sdk.projectSync.unsubscribeFromProject(projectId)
181
-
182
- // События
183
- sdk.projectSync.on('sync-status-update', callback) // {projectId, status, timestamp}
184
- sdk.projectSync.on('sync-progress', callback) // {projectId, progress, processedFiles, totalFiles}
185
- sdk.projectSync.on('sync-completed', callback) // {projectId, processedChunks, statistics}
186
- sdk.projectSync.on('sync-error', callback) // {projectId, error, timestamp}
187
-
188
- // Пример: Cursor-like прогресс по файлам (v7.1.1+)
189
- sdk.projectSync.on('sync-progress', (data) => {
190
- if (data.totalFiles && data.processedFiles) {
191
- // User-friendly: "450 of 722 files"
192
- console.log(`${data.processedFiles}/${data.totalFiles} files (${data.progress}%)`);
193
- updateUI(data.processedFiles, data.totalFiles, data.progress);
194
- } else {
195
- // Fallback: chunks (для старых версий backend)
196
- console.log(`${data.currentChunk}/${data.totalChunks} chunks`);
197
- }
198
- });
199
-
200
- sdk.projectSync.on('sync-completed', (data) => {
201
- const files = data.statistics?.totalFiles || 0;
202
- console.log(`Indexed ${files} files in ${data.duration}ms`);
128
+ const sdk = await CodeSolverSDK.create({
129
+ debug: 'verbose', // silent | error | warn | info | debug | verbose
130
+ webSocket: { debug: true }
203
131
  });
204
132
  ```
205
133
 
206
- ## 🔧 Как работать с SDK
134
+ ## Delta Chunking (Indexing)
207
135
 
208
- ### Индексация проекта
209
136
  ```typescript
210
- // ✅ ЕДИНСТВЕННЫЙ способ индексации (v6.2.2+):
137
+ // ✅ Main indexing method
211
138
  await sdk.deltaManager.syncEncryptedChunks(projectId, chunks, rootHash, {
212
139
  batchSize: 50,
213
140
  onProgress: (current, total) => console.log(`${current}/${total}`)
214
141
  });
215
142
 
216
- // УДАЛЕНО: sdk.projects.startIndexing() - больше не существует
217
- // УДАЛЕНО: filesystem индексация на сервере
143
+ // Check sync status
144
+ const state = await sdk.projects.getProjectState(projectId, clientRootHash);
145
+ if (state.syncRequired) {
146
+ // Needs sync
147
+ }
148
+
149
+ // Cancel ongoing sync
150
+ await sdk.deltaManager.cancelSync(projectId);
218
151
  ```
219
152
 
220
- **Важно:** Client Extension создает chunks → SDK отправляет на сервер → Сервер индексирует
153
+ ## Session Recovery
221
154
 
222
- ### Session Recovery
223
155
  ```typescript
224
- // Всегда проверять при старте проекта
156
+ // Always check on project open
225
157
  const recovery = await sdk.projects.getRecoveryStatus(projectId);
226
158
  if (recovery.needsRecovery) {
227
- // v6.2.2+: показывает "480 из 642 файлов" вместо "0 из 0"
228
- // Показать диалог: Continue (67%) — 480/642 files | Start Fresh
229
- await sdk.projects.resumeSync(projectId); // или cancelRecovery()
159
+ const { processedFiles, totalFiles, percentage } = recovery.progress;
160
+
161
+ // Show dialog: "Continue (67%) 480/642 files" or "Start Fresh"
162
+ await sdk.projects.resumeSync(projectId); // Continue
163
+ // OR
164
+ await sdk.projects.cancelRecovery(projectId); // Start over
230
165
  }
231
166
  ```
232
167
 
233
- ### WebSocket
234
- - Требуется **OAuth токен** в production
235
- - Автоматическое переподключение при разрыве
236
- - События фильтруются по `projectId`
237
- - Fallback на HTTP polling если недоступен
238
-
239
- ### Авторизация
240
- - **Локально**: `apiKey` для HTTP API
241
- - **Production**: OAuth `access_token` для HTTP + WebSocket
242
- - **v6.1.4+**: `getAuthToken()` для автоматического обновления токенов
243
-
244
- ### Graceful Auth Errors (v7.0.1+)
245
- По умолчанию SDK **тихо обрабатывает** 401/403 ошибки (возвращает `null`) вместо выброса исключения.
246
- Это предотвращает `ERR` логи в VS Code Extension Host.
168
+ ## Key Types
247
169
 
170
+ ### ProjectState
248
171
  ```typescript
249
- const sdk = await CodeSolverSDK.create({
250
- baseURL: 'https://workai.su/api/v1',
251
- suppressAuthErrors: true // По умолчанию true
252
- });
172
+ interface ProjectState {
173
+ projectId: string;
174
+ merkleRootHash: string | null;
175
+ totalFiles: number; // For UI display
176
+ indexingStatus: 'pending' | 'in-progress' | 'complete' | 'failed';
177
+ syncRequired?: boolean; // Compare with client hash
178
+ }
179
+ ```
253
180
 
254
- // Если токен истек, SDK вернет null вместо throw
255
- const projects = await sdk.projects.getAllProjects();
256
- if (!projects) {
257
- // Extension сам обрабатывает auth ошибку
258
- await authManager.refreshToken();
181
+ ### SyncProgressEvent
182
+ ```typescript
183
+ interface SyncProgressEvent {
184
+ projectId: string;
185
+ progress: number; // 0-100
186
+ processedFiles: number; // 450
187
+ totalFiles: number; // 722
188
+ stage: 'receiving_chunks' | 'processing_chunks' | 'creating_embeddings' | 'finalizing';
259
189
  }
260
190
  ```
261
191
 
262
- **Отключить (старое поведение):**
192
+ ### RecoveryInfo
263
193
  ```typescript
264
- const sdk = await CodeSolverSDK.create({
265
- suppressAuthErrors: false // SDK будет бросать ошибки как раньше
266
- });
194
+ interface RecoveryInfo {
195
+ needsRecovery: boolean;
196
+ progress: {
197
+ processedFiles: number;
198
+ totalFiles: number;
199
+ percentage: number; // 0-100
200
+ };
201
+ canResume: boolean;
202
+ }
267
203
  ```
268
204
 
269
- ## 📝 Примеры
205
+ ## Troubleshooting
270
206
 
271
- ### Базовый workflow
207
+ ### "0 files" after indexing
272
208
  ```typescript
273
- const sdk = await CodeSolverSDK.create({
274
- baseURL: 'https://workai.su/api/v1',
275
- getAuthToken: () => authManager.getAccessToken()
276
- });
277
-
278
- // 1. Найти/создать проект
279
- const project = await sdk.projects.findOrCreateProject('/path/to/project');
209
+ const state = await sdk.projects.getProjectState(projectId);
210
+ console.log(state.totalFiles); // Should be > 0
211
+ // If 0: update backend to latest version
212
+ ```
280
213
 
281
- // 2. Проверить recovery
282
- const recovery = await sdk.projects.getRecoveryStatus(project.id);
283
- if (recovery.needsRecovery) {
284
- await sdk.projects.resumeSync(project.id);
285
- return;
286
- }
214
+ ### No WebSocket updates
215
+ ```typescript
216
+ // 1. Check connection
217
+ console.log(sdk.isWebSocketConnected); // should be true
287
218
 
288
- // 3. Проверить нужна ли синхронизация
289
- const state = await sdk.projects.getProjectState(project.id, clientRootHash);
290
- if (!state.syncRequired) {
291
- console.log('Проект синхронизирован');
292
- return;
293
- }
219
+ // 2. Verify subscription
220
+ sdk.projectSync.subscribeToProject(projectId);
294
221
 
295
- // 4. Подключить WebSocket для прогресса
296
- await sdk.connectWebSocket();
297
- sdk.projectSync.subscribeToProject(project.id);
298
- sdk.projectSync.on('sync-progress', (data) => {
299
- console.log(`Прогресс: ${data.progress}%`);
222
+ // 3. Ensure OAuth token (production)
223
+ const sdk = await CodeSolverSDK.create({
224
+ getAuthToken: () => authManager.getAccessToken()
300
225
  });
301
226
 
302
- // 5. Синхронизировать
303
- await sdk.deltaManager.syncEncryptedChunks(project.id, chunks, rootHash);
304
-
305
- // 6. Поиск по проекту
306
- const results = await sdk.search.searchCode(project.id, 'function handleClick');
227
+ // 4. Fallback to HTTP polling
228
+ const status = await sdk.projects.getIndexingStatus(projectId);
307
229
  ```
308
230
 
309
- ### Chat с streaming
231
+ ### Interrupted sync
310
232
  ```typescript
311
- for await (const chunk of sdk.chat.streamChat(messages, { model: 'claude-3-5-sonnet' })) {
312
- if (chunk.type === 'content_block_delta') {
313
- process.stdout.write(chunk.delta.text);
314
- }
233
+ const recovery = await sdk.projects.getRecoveryStatus(projectId);
234
+ if (recovery.needsRecovery) {
235
+ // Option 1: Resume
236
+ await sdk.projects.resumeSync(projectId);
237
+
238
+ // Option 2: Cancel and restart
239
+ await sdk.projects.cancelRecovery(projectId);
315
240
  }
316
241
  ```
317
242
 
318
- ## ℹ️ Архитектура
243
+ ## API Reference
319
244
 
320
- **Pure Cloud-First:**
321
- - Backend SDK — HTTP клиент (НЕ работает с файлами)
322
- - Client Extension — сканирует файлы, создает chunks
323
- - Только Delta-Chunking — filesystem индексация удалена
324
-
325
- <details>
326
- <summary><b>Миграция с v6.x</b></summary>
327
-
328
- **BREAKING CHANGES:**
329
- - ❌ Удален `sdk.projects.startIndexing()`
330
- - ✅ Используйте `sdk.deltaManager.syncEncryptedChunks()`
245
+ ### Projects (`sdk.projects`)
331
246
 
332
247
  ```typescript
333
- // ❌ Старый код:
334
- // await sdk.projects.startIndexing(projectId);
335
-
336
- // Новый код:
337
- const chunks = await extension.scanAndCreateChunks();
338
- const hash = extension.calculateMerkleRoot();
339
- await sdk.deltaManager.syncEncryptedChunks(projectId, chunks, hash);
248
+ getAllProjects(): Promise<Project[]>
249
+ getProjects(): Promise<Project[]>
250
+ getProject(projectId: string): Promise<Project>
251
+ createProject(name: string, data?: any, options?: ProjectOptions): Promise<Project>
252
+ findOrCreateProject(name: string): Promise<Project>
253
+ deleteProject(projectId: string): Promise<void>
254
+ getReadyProjects(): Promise<Project[]>
255
+ getProjectState(projectId: string, clientRootHash?: string): Promise<ProjectState>
256
+ getProjectStatus(projectId: string): Promise<any>
257
+ getIndexingStatus(projectId: string): Promise<any>
258
+ cancelIndexing(projectId: string): Promise<boolean>
259
+ clearIndexingError(projectId: string): Promise<boolean>
260
+ getRecoveryStatus(projectId: string): Promise<RecoveryInfo>
261
+ resumeSync(projectId: string, options?: any): Promise<any>
262
+ cancelRecovery(projectId: string): Promise<void>
263
+ initializeDeltaSync(projectId: string, params: any): Promise<any>
264
+ resetIndexing(projectId: string): Promise<any>
265
+ restartIndexing(projectId: string): Promise<any>
266
+ getFilePathMapping(projectId: string): Promise<any>
340
267
  ```
341
268
 
342
- </details>
343
-
344
- ## 📦 Ключевые типы данных
269
+ ### Delta Manager (`sdk.deltaManager`)
345
270
 
346
- ### ProjectState (v7.1.0+)
347
271
  ```typescript
348
- interface ProjectState {
349
- projectId: string;
350
- projectName: string;
351
- merkleRootHash: string | null; // Server Merkle root для сравнения
352
- lastIndexedAt: Date | null;
353
- totalChunks: number; // Технические детали
354
- totalFiles: number; // Количество файлов для UI
355
- indexingStatus: 'pending' | 'in-progress' | 'complete' | 'failed' | 'cancelled';
356
- syncRequired?: boolean; // true если нужна синхронизация
357
- lastSyncSessionId?: string;
358
- }
359
-
360
- // Использование:
361
- const state = await sdk.projects.getProjectState(projectId, clientRootHash);
362
- if (state.syncRequired) {
363
- // Нужна синхронизация
364
- }
365
- console.log(`${state.totalFiles} files indexed`);
272
+ initSync(projectId: string, request: SyncInitRequest): Promise<any>
273
+ uploadChunkBatch(projectId: string, chunks: any[]): Promise<any>
274
+ uploadChunksWithRetry(projectId: string, chunks: any[], options?: any): Promise<any>
275
+ finalizeSync(projectId: string): Promise<SyncResult>
276
+ getSyncStatus(projectId: string): Promise<SyncStatus>
277
+ cancelSync(projectId: string): Promise<{ success: boolean; message?: string }>
278
+ cleanupFiles(projectId: string, activeFiles: string[]): Promise<any>
366
279
  ```
367
280
 
368
- ### SyncProgressEvent (v7.1.1+)
369
- ```typescript
370
- interface SyncProgressEvent {
371
- projectId: string;
372
- sessionId: string;
373
- stage: 'receiving_chunks' | 'processing_chunks' | 'creating_embeddings' | 'updating_tree' | 'finalizing';
374
- progress: number; // 0-100
375
-
376
- // User-friendly (файлы) - основное для UI
377
- processedFiles?: number; // 450
378
- totalFiles?: number; // 722
379
-
380
- // Technical (чанки) - опционально
381
- currentChunk?: number;
382
- totalChunks?: number;
383
-
384
- estimatedTimeRemaining?: number; // секунды
385
- details?: string;
386
- timestamp: Date;
387
- }
388
-
389
- // Использование:
390
- sdk.projectSync.on('sync-progress', (data) => {
391
- if (data.totalFiles) {
392
- statusBar.text = `${data.processedFiles}/${data.totalFiles} files`;
393
- }
394
- });
395
- ```
281
+ ### Chat (`sdk.chat`)
396
282
 
397
- ### SyncCompletedEvent (v7.1.1+)
398
283
  ```typescript
399
- interface SyncCompletedEvent {
400
- projectId: string;
401
- sessionId: string;
402
- status: 'success' | 'failed' | 'cancelled';
403
- totalProcessed: number;
404
- duration: number; // миллисекунды
405
- errors?: string[];
406
- warnings?: string[];
407
- statistics?: {
408
- filesIndexed: number;
409
- embeddingsCreated: number;
410
- chunksProcessed: number;
411
- totalSize: number;
412
- totalFiles?: number; // ✨ Для финального отображения
413
- };
414
- }
284
+ chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
285
+ chatCompletion(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
286
+ chatWithRegionFailover(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
287
+ streamChat(messages: ChatMessage[], options?: ChatStreamOptions): AsyncGenerator<ChatStreamChunk>
288
+ streamPrompt(prompt: string, options?: ChatStreamOptions): AsyncGenerator<ChatStreamChunk>
289
+ sendContinuation(requestId: string, messages: ChatMessage[]): AsyncGenerator<ChatStreamChunk>
290
+ sendPromptWithRegionFailover(prompt: string, options?: ChatOptions): Promise<string>
291
+ checkAvailability(): Promise<boolean>
292
+ cancelRequest(requestId: string): Promise<void>
293
+ getStreamsStats(): Promise<any>
294
+ cleanupStaleStreams(timeoutMs?: number): Promise<any>
295
+ cancelUserStreams(reason?: string): Promise<number>
415
296
  ```
416
297
 
417
- ### RecoveryInfo
298
+ ### Search (`sdk.search`)
299
+
418
300
  ```typescript
419
- interface RecoveryInfo {
420
- sessionId: string;
421
- projectId: string;
422
- projectName: string;
423
- status: 'interrupted' | 'paused' | 'active' | 'uploading';
424
- progress: {
425
- received: number; // Чанки получены
426
- processed: number; // Чанки обработаны
427
- total: number; // Всего ожидается
428
- percentage: number; // 0-100
429
- processedFiles?: number; // ✨ Файлы обработаны
430
- totalFiles?: number; // ✨ Всего файлов
431
- filesPercentage?: number; // ✨ 0-100 по файлам
432
- };
433
- canResume: boolean;
434
- needsRecovery: boolean;
435
- interruptedAt?: Date;
436
- }
301
+ searchCode(projectIdOrParams: string | SearchCodeParams, params?: SearchCodeParams): Promise<SearchResult[]>
302
+ searchFunctions(projectIdOrParams: string | SearchFunctionsParams, params?: SearchFunctionsParams): Promise<FunctionSearchResult>
303
+ semanticSearch(projectId: string, params: SearchCodeParams): Promise<SearchResult[]>
304
+ getFunctionStats(projectId: string): Promise<{ stats: { totalFunctions: number } }>
437
305
  ```
438
306
 
439
- ## 🆘 Быстрое решение проблем
307
+ ### Tools (`sdk.tools`)
440
308
 
441
- ### Проблема: "0 files" после индексации
442
309
  ```typescript
443
- // Проверить:
444
- const state = await sdk.projects.getProjectState(projectId);
445
- console.log(state.totalFiles); // Должно быть > 0
446
-
447
- // Если 0 - backend не сохранил totalFiles
448
- // Решение: Обновите backend до последней версии
310
+ getSchemas(): Promise<ToolsResponse>
311
+ findToolByName(name: string): Promise<ToolSchema | null>
312
+ getToolsStats(): Promise<{ total: number; categories: Record<string, number>; mostUsed?: string[] }>
313
+ validateToolSchema(tool: ToolSchema): boolean
314
+ createToolSchema(name: string, description: string, properties: any, required?: string[]): ToolSchema
449
315
  ```
450
316
 
451
- ### Проблема: Нет WebSocket обновлений
452
- ```typescript
453
- // 1. Проверить подключение
454
- console.log(sdk.isWebSocketConnected); // должно быть true
455
-
456
- // 2. Проверить подписку
457
- sdk.projectSync.subscribeToProject(projectId);
458
-
459
- // 3. Проверить токен (production)
460
- const sdk = await CodeSolverSDK.create({
461
- baseURL: 'https://workai.su/api/v1',
462
- getAuthToken: () => authManager.getAccessToken() // OAuth required
463
- });
317
+ ### User (`sdk.user`)
464
318
 
465
- // 4. Fallback на HTTP polling
466
- const status = await sdk.projects.getIndexingStatus(projectId);
319
+ ```typescript
320
+ getProfile(): Promise<UserProfile>
467
321
  ```
468
322
 
469
- ### Проблема: Прерванная синхронизация
323
+ ### Auth (`sdk.auth`)
324
+
470
325
  ```typescript
471
- // Проверить recovery status
472
- const recovery = await sdk.projects.getRecoveryStatus(projectId);
473
- if (recovery.needsRecovery) {
474
- // Показать UI диалог
475
- const percentage = recovery.progress.filesPercentage || recovery.progress.percentage;
476
- const files = `${recovery.progress.processedFiles}/${recovery.progress.totalFiles}`;
477
-
478
- // Пользователь выбирает:
479
- await sdk.projects.resumeSync(projectId); // Продолжить
480
- // или
481
- await sdk.projects.cancelRecovery(projectId); // Начать заново
482
- }
326
+ revokeToken(token: string): Promise<{ ok: boolean }>
327
+ logout(): Promise<{ ok: boolean }>
483
328
  ```
484
329
 
485
- ### Проблема: 401/403 ошибки
486
- ```typescript
487
- // v7.0.1+: По умолчанию возвращает null
488
- const projects = await sdk.projects.getAllProjects();
489
- if (!projects) {
490
- // Токен истек
491
- await authManager.refreshToken();
492
- // Повторить запрос
493
- }
330
+ ### Models (`sdk.models`)
494
331
 
495
- // Старое поведение (throw):
496
- const sdk = await CodeSolverSDK.create({
497
- suppressAuthErrors: false
498
- });
332
+ ```typescript
333
+ getAllModels(): Promise<any[]>
334
+ getModels(): Promise<any[]>
335
+ getAvailableModels(): Promise<any[]>
336
+ getProviderModels(providerId: string): Promise<ProviderModels>
337
+ getModelInfo(modelId: string): Promise<any>
499
338
  ```
500
339
 
501
- ## 📚 Справка
340
+ ### Updates (`sdk.updates`)
502
341
 
503
- ### TypeScript типы
504
342
  ```typescript
505
- import {
506
- ChatMessage,
507
- ChatOptions,
508
- Project,
509
- ProjectState,
510
- SyncProgressEvent,
511
- SyncCompletedEvent,
512
- RecoveryInfo
513
- } from '@androidsprintteam/solver-sdk';
343
+ checkForUpdates(options: UpdateCheckOptions): Promise<UpdateResponse>
344
+ getChangelog(version: string, locale: string): Promise<string>
345
+ sendStats(event: UpdateStatsEvent): Promise<void>
346
+ getLatestVersion(channel?: string): Promise<LatestVersionInfo>
347
+ checkAvailability(): Promise<boolean>
514
348
  ```
515
349
 
516
- ### Debug режим
350
+ ### WebSocket (`sdk.projectSync`)
351
+
517
352
  ```typescript
518
- const sdk = await CodeSolverSDK.create({
519
- debug: 'verbose', // silent | error | warn | info | debug | verbose
520
- webSocket: { debug: true }
521
- });
353
+ connectWebSocket(): Promise<void>
354
+ disconnectWebSocket(): void
355
+ isWebSocketConnected: boolean
356
+ projectSync.subscribeToProject(projectId: string): void
357
+ projectSync.unsubscribeFromProject(projectId: string): void
358
+ projectSync.on('sync-status-update', callback): void
359
+ projectSync.on('sync-progress', callback): void
360
+ projectSync.on('sync-completed', callback): void
361
+ projectSync.on('sync-error', callback): void
362
+ projectSync.off(event: string, callback): void
522
363
  ```
523
364
 
524
- ### Обработка ошибок
365
+ ### Utility
366
+
525
367
  ```typescript
526
- try {
527
- await sdk.projects.getProject(projectId);
528
- } catch (error) {
529
- console.error(`[HTTP ${error.status}] ${error.message}`);
530
- }
368
+ checkHealth(): Promise<boolean>
369
+ version: string
370
+ baseURL: string
531
371
  ```
532
372
 
533
- ## 📄 License
373
+ ## Docs
374
+
375
+ - **Full verification:** [SDK_v7.2.0_FINAL_REPORT.md](../docs/sdk/SDK_v7.2.0_FINAL_REPORT.md)
376
+ - **Migration guide:** [SDK_v7.2.0_MIGRATION.md](../docs/sdk/SDK_v7.2.0_MIGRATION.md)
377
+ - **Architecture:** [ARCHITECTURE_NOTES.md](../docs/sdk/ARCHITECTURE_NOTES.md)
378
+
379
+ All methods have JSDoc comments - check IDE autocomplete for full reference.
380
+
381
+ ---
534
382
 
535
- MIT
383
+ **Status:** ✅ Production Ready | **v7.3.0** | **License:** MIT