solver-sdk 2.3.0 → 2.6.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.
Files changed (45) hide show
  1. package/README.md +94 -41
  2. package/dist/cjs/api/dependencies-api.js +2 -4
  3. package/dist/cjs/api/dependencies-api.js.map +1 -1
  4. package/dist/cjs/api/projects-api.js +34 -56
  5. package/dist/cjs/api/projects-api.js.map +1 -1
  6. package/dist/cjs/api/reasoning-api.js +31 -17
  7. package/dist/cjs/api/reasoning-api.js.map +1 -1
  8. package/dist/cjs/code-solver-sdk.js +83 -0
  9. package/dist/cjs/code-solver-sdk.js.map +1 -1
  10. package/dist/cjs/index.js +1 -1
  11. package/dist/cjs/utils/message-helpers.js +15 -37
  12. package/dist/cjs/utils/message-helpers.js.map +1 -1
  13. package/dist/esm/api/dependencies-api.js +2 -4
  14. package/dist/esm/api/dependencies-api.js.map +1 -1
  15. package/dist/esm/api/projects-api.js +34 -56
  16. package/dist/esm/api/projects-api.js.map +1 -1
  17. package/dist/esm/api/reasoning-api.js +31 -17
  18. package/dist/esm/api/reasoning-api.js.map +1 -1
  19. package/dist/esm/code-solver-sdk.js +83 -0
  20. package/dist/esm/code-solver-sdk.js.map +1 -1
  21. package/dist/esm/index.js +1 -1
  22. package/dist/esm/utils/message-helpers.js +16 -38
  23. package/dist/esm/utils/message-helpers.js.map +1 -1
  24. package/dist/types/api/dependencies-api.d.ts.map +1 -1
  25. package/dist/types/api/projects-api.d.ts.map +1 -1
  26. package/dist/types/api/reasoning-api.d.ts +21 -10
  27. package/dist/types/api/reasoning-api.d.ts.map +1 -1
  28. package/dist/types/code-solver-sdk.d.ts +20 -0
  29. package/dist/types/code-solver-sdk.d.ts.map +1 -1
  30. package/dist/types/index.d.ts +1 -1
  31. package/dist/types/interfaces/sdk-options.d.ts +5 -0
  32. package/dist/types/interfaces/sdk-options.d.ts.map +1 -1
  33. package/dist/types/utils/message-helpers.d.ts +4 -3
  34. package/dist/types/utils/message-helpers.d.ts.map +1 -1
  35. package/docs/API_REFERENCE.md +495 -96
  36. package/docs/AUTHENTICATION.md +291 -36
  37. package/docs/ERROR_HANDLING.md +544 -104
  38. package/docs/INTEGRATION_GUIDE_V2.5.md +516 -0
  39. package/docs/README.md +260 -75
  40. package/docs/README_V2.5.md +266 -0
  41. package/docs/WEBSOCKET.md +374 -111
  42. package/docs/indexing/INDEXING.md +372 -167
  43. package/package.json +1 -1
  44. package/docs/INTEGRATION_EXAMPLES.md +0 -328
  45. package/docs/PING_PONG.md +0 -113
@@ -1,173 +1,613 @@
1
- # Обработка ошибок в SDK
1
+ # Обработка ошибок v2.5.0
2
2
 
3
- SDK предоставляет различные механизмы обработки ошибок для HTTP запросов и WebSocket соединений.
3
+ Полная документация по обработке ошибок в AI Solver SDK v2.5.0.
4
+
5
+ ## Философия "Fail Fast"
6
+
7
+ SDK v2.5.0 следует принципу "fail fast" - ошибки возникают сразу при обнаружении проблем, без тихих fallback'ов.
4
8
 
5
9
  ## Обработка HTTP ошибок
6
10
 
7
11
  ### Использование try/catch
8
12
 
9
- Рекомендуемый способ обработки ошибок - использование конструкции `try/catch`:
13
+ Рекомендуемый способ обработки ошибок:
10
14
 
11
15
  ```javascript
16
+ import { CodeSolverSDK } from '@ai-solver/sdk';
17
+
12
18
  try {
13
- // Выполнение запроса
14
- const projects = await sdk.projects.getAllProjects();
15
- console.log('Получено проектов:', projects.length);
19
+ const projects = await sdk.projects.getAll();
20
+ console.log('✅ Получено проектов:', projects.total);
16
21
  } catch (error) {
17
- console.error('Ошибка при получении проектов:', error);
22
+ console.error(' Ошибка:', error.message);
18
23
 
19
- // Можно проверить тип ошибки
24
+ // Проверка типа ошибки
20
25
  if (error.status === 401) {
21
- console.error('Ошибка авторизации. Проверьте API ключ.');
26
+ console.error('🔑 Ошибка аутентификации');
22
27
  } else if (error.status === 404) {
23
- console.error('Ресурс не найден.');
28
+ console.error('🔍 Ресурс не найден');
24
29
  } else if (error.code === 'NETWORK_ERROR') {
25
- console.error('Проблема с сетевым соединением.');
30
+ console.error('🌐 Проблема сети');
26
31
  }
27
32
  }
28
33
  ```
29
34
 
30
- ### Глобальный обработчик ошибок
35
+ ### Структура ошибок
31
36
 
32
- Можно установить глобальный обработчик ошибок SDK:
37
+ SDK v2.5.0 возвращает стандартизированные ошибки:
33
38
 
34
39
  ```javascript
35
- // Установка глобального обработчика
36
- CodeSolverSDK.setErrorHandler((error) => {
37
- console.error('Глобальная ошибка SDK:', error);
38
- // Отправка информации об ошибке в мониторинг
39
- sendToMonitoring(error);
40
- });
41
-
42
- // После этого необработанные ошибки SDK будут передаваться в этот обработчик
40
+ // Пример объекта ошибки
41
+ {
42
+ name: 'APIError',
43
+ message: 'Project not found',
44
+ status: 404,
45
+ code: 'PROJECT_NOT_FOUND',
46
+ endpoint: '/api/v1/projects/123',
47
+ method: 'GET',
48
+ timestamp: '2025-06-28T12:00:00Z',
49
+ requestId: 'req_abc123'
50
+ }
43
51
  ```
44
52
 
45
- ## Обработка ошибок WebSocket
53
+ ## Обработка WebSocket ошибок
46
54
 
47
55
  ### Обработка событий ошибок
48
56
 
49
- SDK позволяет подписаться на события ошибок для различных API:
50
-
51
57
  ```javascript
52
- // Для индексации проектов
53
- sdk.projects.on('error', (error) => {
54
- console.error('Ошибка индексации:', error);
58
+ // Projects WebSocket ошибки
59
+ await sdk.projects.connectWebSocket();
60
+
61
+ sdk.projects.onIndexingError((error) => {
62
+ console.error('❌ Indexing error:', error.message);
63
+ console.error('📁 Project:', error.projectId);
64
+ console.error('📄 File:', error.fileName);
55
65
  });
56
66
 
57
- // Для рассуждений
58
- sdk.reasoning.on('error', (error) => {
59
- console.error('Ошибка рассуждения:', error);
67
+ // Reasoning WebSocket ошибки
68
+ await sdk.reasoning.connectWebSocket();
69
+
70
+ sdk.reasoning.onReasoningError((error) => {
71
+ console.error('❌ Reasoning error:', error.message);
72
+ console.error('🆔 Reasoning ID:', error.reasoningId);
60
73
  });
61
- ```
62
74
 
63
- ### Обработка ошибок соединения
75
+ // Chat WebSocket ошибки
76
+ await sdk.chat.connectWebSocket();
64
77
 
65
- При использовании высокоуровневых методов подключения можно обрабатывать ошибки соединения:
78
+ sdk.chat.on('error', (error) => {
79
+ console.error('❌ Chat error:', error.message);
80
+ });
81
+ ```
82
+
83
+ ### Обработка ошибок подключения
66
84
 
67
85
  ```javascript
68
86
  try {
69
- // Попытка подключения к WebSocket
70
- await sdk.connect();
71
- console.log('Подключение установлено');
87
+ await sdk.projects.connectWebSocket();
88
+ console.log('✅ Projects WebSocket connected');
72
89
  } catch (error) {
73
- console.error('Ошибка подключения:', error);
90
+ console.error(' WebSocket connection failed:', error.message);
91
+
92
+ if (error.code === 'WS_CONNECTION_REFUSED') {
93
+ console.error('🔌 Server unavailable');
94
+ } else if (error.code === 'WS_AUTH_FAILED') {
95
+ console.error('🔑 Authentication failed');
96
+ }
74
97
  }
75
98
  ```
76
99
 
77
- ### Автоматическое переподключение
100
+ ## Диагностика ошибок
78
101
 
79
- SDK поддерживает автоматическое переподключение в случае разрыва соединения:
102
+ ### API диагностика
80
103
 
81
104
  ```javascript
82
- const sdk = new CodeSolverSDK({
83
- baseURL: 'https://api.example.com',
84
- apiKey: 'your-api-key',
85
- websocket: {
86
- reconnect: true, // Включить автоматическое переподключение
87
- reconnectAttempts: 5, // Максимальное число попыток
88
- reconnectDelay: 3000 // Задержка между попытками (мс)
105
+ // Полная диагностика всех endpoints
106
+ const diagnostics = await sdk.diagnoseAPI();
107
+ console.log('📊 API Diagnostics:', diagnostics);
108
+
109
+ /* Пример результата:
110
+ {
111
+ '/api/v1/projects': {
112
+ status: 200,
113
+ success: true,
114
+ responseTime: 120
115
+ },
116
+ '/api/v1/reasoning': {
117
+ status: 401,
118
+ success: false,
119
+ error: 'Invalid API key'
120
+ },
121
+ '/api/v1/chat': {
122
+ status: 500,
123
+ success: false,
124
+ error: 'Internal server error'
89
125
  }
90
- });
126
+ }
127
+ */
128
+ ```
129
+
130
+ ### WebSocket диагностика
131
+
132
+ ```javascript
133
+ // Диагностика WebSocket соединений
134
+ const wsStatus = await sdk.diagnoseWebSocket();
135
+ console.log('🔌 WebSocket status:', wsStatus);
136
+
137
+ /* Пример результата:
138
+ {
139
+ projects: {
140
+ connected: true,
141
+ url: 'ws://localhost:3000/projects'
142
+ },
143
+ reasoning: {
144
+ connected: false,
145
+ error: 'Connection timeout'
146
+ },
147
+ chat: {
148
+ connected: true,
149
+ latency: 45
150
+ }
151
+ }
152
+ */
91
153
  ```
92
154
 
93
- ## Типичные ошибки и их решения
155
+ ## Типы ошибок
156
+
157
+ ### HTTP ошибки
94
158
 
95
- ### Ошибки подключения
159
+ #### 400 Bad Request
96
160
 
97
- | Код ошибки | Описание | Решение |
98
- |------------|----------|---------|
99
- | `NETWORK_ERROR` | Ошибка сети | Проверьте подключение к Интернету |
100
- | `ETIMEDOUT` | Таймаут соединения | Увеличьте значение `timeout` в настройках SDK |
101
- | `CONNECTION_REFUSED` | Соединение отклонено | Проверьте правильность URL и доступность сервера |
102
- | `CERT_ERROR` | Ошибка сертификата | Используйте параметр `rejectUnauthorized: false` для локальной разработки |
161
+ ```javascript
162
+ {
163
+ status: 400,
164
+ code: 'VALIDATION_ERROR',
165
+ message: 'Invalid project data',
166
+ details: {
167
+ field: 'name',
168
+ issue: 'Name is required'
169
+ }
170
+ }
171
+ ```
103
172
 
104
- ### Ошибки аутентификации
173
+ **Решение:** Проверьте корректность входных данных.
105
174
 
106
- | Код ошибки | Описание | Решение |
107
- |------------|----------|---------|
108
- | `401 Unauthorized` | Неверный API ключ | Проверьте правильность API ключа |
109
- | `403 Forbidden` | Недостаточно прав | Проверьте права доступа для API ключа |
110
- | `AUTH_EXPIRED` | Срок действия токена истек | Обновите API ключ |
175
+ #### 401 Unauthorized
111
176
 
112
- ### Ошибки индексации
177
+ ```javascript
178
+ {
179
+ status: 401,
180
+ code: 'AUTH_INVALID_KEY',
181
+ message: 'Invalid or missing API key'
182
+ }
183
+ ```
113
184
 
114
- | Код ошибки | Описание | Решение |
115
- |------------|----------|---------|
116
- | `PROJECT_NOT_FOUND` | Проект не найден | Проверьте ID проекта |
117
- | `INDEXING_IN_PROGRESS` | Индексация уже выполняется | Дождитесь завершения текущей индексации |
118
- | `INDEXING_ERROR` | Ошибка во время индексации | Проверьте лог ошибок на сервере |
185
+ **Решение:** Проверьте API ключ в настройках SDK.
119
186
 
120
- ## Пример комплексной обработки ошибок
187
+ #### 403 Forbidden
121
188
 
122
189
  ```javascript
123
- async function initializeSDK() {
190
+ {
191
+ status: 403,
192
+ code: 'AUTH_INSUFFICIENT_SCOPE',
193
+ message: 'Insufficient permissions',
194
+ required_scope: 'projects:write'
195
+ }
196
+ ```
197
+
198
+ **Решение:** Используйте API ключ с необходимыми правами.
199
+
200
+ #### 404 Not Found
201
+
202
+ ```javascript
203
+ {
204
+ status: 404,
205
+ code: 'PROJECT_NOT_FOUND',
206
+ message: 'Project with ID "123" not found'
207
+ }
208
+ ```
209
+
210
+ **Решение:** Проверьте правильность ID ресурса.
211
+
212
+ #### 429 Too Many Requests
213
+
214
+ ```javascript
215
+ {
216
+ status: 429,
217
+ code: 'RATE_LIMIT_EXCEEDED',
218
+ message: 'Rate limit exceeded',
219
+ retry_after: 60
220
+ }
221
+ ```
222
+
223
+ **Решение:** Подождите указанное время или используйте Production ключ.
224
+
225
+ #### 500 Internal Server Error
226
+
227
+ ```javascript
228
+ {
229
+ status: 500,
230
+ code: 'INTERNAL_ERROR',
231
+ message: 'Internal server error',
232
+ incident_id: 'inc_abc123'
233
+ }
234
+ ```
235
+
236
+ **Решение:** Сообщите о проблеме с указанием incident_id.
237
+
238
+ ### WebSocket ошибки
239
+
240
+ #### WS_CONNECTION_REFUSED
241
+
242
+ ```javascript
243
+ {
244
+ code: 'WS_CONNECTION_REFUSED',
245
+ message: 'WebSocket connection refused',
246
+ namespace: 'projects'
247
+ }
248
+ ```
249
+
250
+ **Решение:** Проверьте доступность сервера.
251
+
252
+ #### WS_AUTH_FAILED
253
+
254
+ ```javascript
255
+ {
256
+ code: 'WS_AUTH_FAILED',
257
+ message: 'WebSocket authentication failed',
258
+ namespace: 'reasoning'
259
+ }
260
+ ```
261
+
262
+ **Решение:** Проверьте API ключ.
263
+
264
+ #### WS_TIMEOUT
265
+
266
+ ```javascript
267
+ {
268
+ code: 'WS_TIMEOUT',
269
+ message: 'WebSocket connection timeout',
270
+ timeout: 30000
271
+ }
272
+ ```
273
+
274
+ **Решение:** Увеличьте timeout или проверьте сеть.
275
+
276
+ ### Network ошибки
277
+
278
+ #### NETWORK_ERROR
279
+
280
+ ```javascript
281
+ {
282
+ code: 'NETWORK_ERROR',
283
+ message: 'Network request failed',
284
+ cause: 'ECONNREFUSED'
285
+ }
286
+ ```
287
+
288
+ **Решение:** Проверьте подключение к интернету и доступность сервера.
289
+
290
+ #### TIMEOUT_ERROR
291
+
292
+ ```javascript
293
+ {
294
+ code: 'TIMEOUT_ERROR',
295
+ message: 'Request timeout after 30000ms',
296
+ timeout: 30000
297
+ }
298
+ ```
299
+
300
+ **Решение:** Увеличьте timeout в настройках SDK.
301
+
302
+ ## Стратегии обработки ошибок
303
+
304
+ ### Retry стратегия
305
+
306
+ ```javascript
307
+ async function retryableRequest(operation, maxRetries = 3) {
308
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
309
+ try {
310
+ return await operation();
311
+ } catch (error) {
312
+ console.warn(`⚠️ Attempt ${attempt} failed:`, error.message);
313
+
314
+ // Не повторяем для клиентских ошибок
315
+ if (error.status >= 400 && error.status < 500) {
316
+ throw error;
317
+ }
318
+
319
+ // Последняя попытка
320
+ if (attempt === maxRetries) {
321
+ throw error;
322
+ }
323
+
324
+ // Экспоненциальная задержка
325
+ const delay = Math.pow(2, attempt) * 1000;
326
+ await new Promise(resolve => setTimeout(resolve, delay));
327
+ }
328
+ }
329
+ }
330
+
331
+ // Использование
332
+ try {
333
+ const projects = await retryableRequest(() => sdk.projects.getAll());
334
+ } catch (error) {
335
+ console.error('❌ All retries failed:', error.message);
336
+ }
337
+ ```
338
+
339
+ ### Circuit Breaker
340
+
341
+ ```javascript
342
+ class CircuitBreaker {
343
+ constructor(threshold = 5, timeout = 60000) {
344
+ this.threshold = threshold;
345
+ this.timeout = timeout;
346
+ this.failures = 0;
347
+ this.state = 'CLOSED'; // CLOSED, OPEN, HALF_OPEN
348
+ this.nextAttempt = Date.now();
349
+ }
350
+
351
+ async execute(operation) {
352
+ if (this.state === 'OPEN') {
353
+ if (Date.now() < this.nextAttempt) {
354
+ throw new Error('Circuit breaker is OPEN');
355
+ }
356
+ this.state = 'HALF_OPEN';
357
+ }
358
+
359
+ try {
360
+ const result = await operation();
361
+ this.onSuccess();
362
+ return result;
363
+ } catch (error) {
364
+ this.onFailure();
365
+ throw error;
366
+ }
367
+ }
368
+
369
+ onSuccess() {
370
+ this.failures = 0;
371
+ this.state = 'CLOSED';
372
+ }
373
+
374
+ onFailure() {
375
+ this.failures++;
376
+ if (this.failures >= this.threshold) {
377
+ this.state = 'OPEN';
378
+ this.nextAttempt = Date.now() + this.timeout;
379
+ }
380
+ }
381
+ }
382
+
383
+ // Использование
384
+ const breaker = new CircuitBreaker();
385
+
386
+ try {
387
+ const result = await breaker.execute(() => sdk.chat.send(messages));
388
+ } catch (error) {
389
+ console.error('❌ Circuit breaker error:', error.message);
390
+ }
391
+ ```
392
+
393
+ ### Graceful degradation
394
+
395
+ ```javascript
396
+ async function robustProjectCreation(projectData) {
124
397
  try {
125
- // Проверка доступности API
126
- const isHealthy = await sdk.checkHealth();
127
-
128
- if (!isHealthy) {
129
- console.error('API недоступен, пробуем резервный сервер');
130
- // Создаем новый экземпляр SDK с резервным URL
131
- return new CodeSolverSDK({
132
- baseURL: 'https://backup-api.example.com',
133
- apiKey: 'your-api-key'
134
- });
398
+ // Основной путь
399
+ const project = await sdk.projects.create(projectData);
400
+ console.log('✅ Project created:', project.id);
401
+
402
+ // Запуск индексации
403
+ try {
404
+ await sdk.projects.startIndexing(project.id);
405
+ console.log('✅ Indexing started');
406
+ } catch (indexError) {
407
+ console.warn('⚠️ Indexing failed, but project created:', indexError.message);
135
408
  }
136
409
 
137
- // Подключение к WebSocket
138
- await sdk.connect();
139
- console.log('SDK успешно инициализирован');
410
+ return project;
140
411
 
141
- return sdk;
142
412
  } catch (error) {
143
- console.error('Ошибка при инициализации SDK:', error);
413
+ console.error(' Project creation failed:', error.message);
144
414
 
145
- // Логирование ошибки для отладки
146
- logError('SDK_INIT_ERROR', error);
415
+ // Fallback: сохраняем локально
416
+ const localProject = {
417
+ id: `local_${Date.now()}`,
418
+ name: projectData.name,
419
+ path: projectData.path,
420
+ local: true
421
+ };
147
422
 
148
- // В зависимости от ошибки предпринимаем разные действия
149
- if (error.code === 'CONNECTION_ERROR') {
150
- console.warn('Продолжаем работу без WebSocket подключения');
151
- return sdk; // Возвращаем SDK, но без WebSocket функциональности
152
- }
423
+ localStorage.setItem(`project_${localProject.id}`, JSON.stringify(localProject));
424
+ console.log('💾 Project saved locally:', localProject.id);
153
425
 
154
- // Для критических ошибок выбрасываем исключение
155
- throw new Error(`Не удалось инициализировать SDK: ${error.message}`);
426
+ return localProject;
156
427
  }
157
428
  }
429
+ ```
430
+
431
+ ## Мониторинг ошибок
432
+
433
+ ### Логирование ошибок
434
+
435
+ ```javascript
436
+ function logError(error, context = {}) {
437
+ const errorLog = {
438
+ timestamp: new Date().toISOString(),
439
+ error: {
440
+ name: error.name,
441
+ message: error.message,
442
+ status: error.status,
443
+ code: error.code,
444
+ stack: error.stack
445
+ },
446
+ context: {
447
+ ...context,
448
+ userAgent: navigator.userAgent,
449
+ url: window.location.href,
450
+ userId: getCurrentUserId()
451
+ }
452
+ };
453
+
454
+ // Отправка в систему мониторинга
455
+ sendToMonitoring(errorLog);
456
+
457
+ // Локальное логирование
458
+ console.error('🚨 Error logged:', errorLog);
459
+ }
158
460
 
159
461
  // Использование
160
- const sdk = await initializeSDK().catch(error => {
161
- console.error('Критическая ошибка:', error);
162
- // Показываем пользователю сообщение об ошибке
163
- showErrorMessage('Не удалось подключиться к серверу');
462
+ try {
463
+ await sdk.reasoning.start(reasoningId);
464
+ } catch (error) {
465
+ logError(error, {
466
+ operation: 'reasoning_start',
467
+ reasoningId: reasoningId,
468
+ projectId: projectId
469
+ });
470
+ }
471
+ ```
472
+
473
+ ### Метрики ошибок
474
+
475
+ ```javascript
476
+ class ErrorMetrics {
477
+ constructor() {
478
+ this.errors = new Map();
479
+ }
480
+
481
+ record(error) {
482
+ const key = `${error.code || 'UNKNOWN'}_${error.status || 0}`;
483
+ const count = this.errors.get(key) || 0;
484
+ this.errors.set(key, count + 1);
485
+ }
164
486
 
165
- // Возвращаем отключенную версию SDK или null
166
- return null;
487
+ getReport() {
488
+ const report = Array.from(this.errors.entries())
489
+ .map(([error, count]) => ({ error, count }))
490
+ .sort((a, b) => b.count - a.count);
491
+
492
+ return {
493
+ totalErrors: Array.from(this.errors.values()).reduce((a, b) => a + b, 0),
494
+ topErrors: report.slice(0, 5),
495
+ allErrors: report
496
+ };
497
+ }
498
+ }
499
+
500
+ // Глобальные метрики
501
+ const errorMetrics = new ErrorMetrics();
502
+
503
+ // Автоматическая регистрация ошибок
504
+ window.addEventListener('unhandledrejection', (event) => {
505
+ errorMetrics.record(event.reason);
167
506
  });
507
+ ```
508
+
509
+ ## Пример комплексной обработки
510
+
511
+ ```javascript
512
+ async function initializeAIWorkflow(projectPath, query) {
513
+ const sdk = CodeSolverSDK.create({
514
+ baseURL: 'http://localhost:3000',
515
+ apiKey: process.env.AI_SOLVER_API_KEY,
516
+ autoConnect: false
517
+ });
518
+
519
+ try {
520
+ // 1. Диагностика API
521
+ console.log('🔍 Diagnosing API...');
522
+ const apiStatus = await sdk.diagnoseAPI();
523
+
524
+ const healthyEndpoints = Object.entries(apiStatus)
525
+ .filter(([_, status]) => status.success)
526
+ .map(([endpoint]) => endpoint);
527
+
528
+ if (healthyEndpoints.length === 0) {
529
+ throw new Error('No healthy endpoints available');
530
+ }
531
+
532
+ console.log('✅ Healthy endpoints:', healthyEndpoints);
533
+
534
+ // 2. Создание проекта
535
+ console.log('📁 Creating project...');
536
+ const project = await retryableRequest(() =>
537
+ sdk.projects.create({
538
+ name: 'AI Analysis Project',
539
+ path: projectPath
540
+ })
541
+ );
542
+
543
+ // 3. Индексация с WebSocket
544
+ console.log('📊 Starting indexing...');
545
+ await sdk.projects.connectWebSocket();
546
+
547
+ let indexingComplete = false;
548
+ sdk.projects.onIndexingComplete(() => {
549
+ indexingComplete = true;
550
+ console.log('✅ Indexing completed');
551
+ sdk.projects.disconnectWebSocket();
552
+ });
553
+
554
+ sdk.projects.onIndexingError((error) => {
555
+ console.error('❌ Indexing failed:', error.message);
556
+ sdk.projects.disconnectWebSocket();
557
+ });
558
+
559
+ await sdk.projects.startIndexing(project.id);
560
+
561
+ // Ожидание завершения индексации
562
+ while (!indexingComplete) {
563
+ await new Promise(resolve => setTimeout(resolve, 1000));
564
+ }
565
+
566
+ // 4. AI Reasoning
567
+ console.log('🧠 Starting reasoning...');
568
+ await sdk.reasoning.connectWebSocket();
569
+
570
+ const reasoning = await sdk.reasoning.create({
571
+ projectId: project.id,
572
+ query: query
573
+ });
574
+
575
+ await sdk.reasoning.start(reasoning.id);
576
+
577
+ return {
578
+ project,
579
+ reasoning,
580
+ success: true
581
+ };
582
+
583
+ } catch (error) {
584
+ console.error('❌ Workflow failed:', error.message);
585
+
586
+ // Очистка ресурсов
587
+ try {
588
+ await sdk.projects.disconnectWebSocket();
589
+ await sdk.reasoning.disconnectWebSocket();
590
+ } catch (cleanupError) {
591
+ console.warn('⚠️ Cleanup warning:', cleanupError.message);
592
+ }
593
+
594
+ // Регистрация ошибки
595
+ logError(error, {
596
+ workflow: 'ai_analysis',
597
+ projectPath,
598
+ query
599
+ });
600
+
601
+ return {
602
+ error: error.message,
603
+ success: false
604
+ };
605
+ }
606
+ }
607
+ ```
608
+
609
+ ---
168
610
 
169
- if (sdk) {
170
- // Продолжаем работу с SDK
171
- } else {
172
- // Работаем в режиме ограниченной функциональности
173
- }
611
+ **Документация обработки ошибок для SDK v2.5.0**
612
+ **Принцип:** Fail Fast, явные ошибки, надежная диагностика
613
+ **Обновлено:** 28 июня 2025