solver-sdk 3.1.1 → 3.1.3

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.
@@ -1,613 +0,0 @@
1
- # Обработка ошибок v2.5.0
2
-
3
- Полная документация по обработке ошибок в AI Solver SDK v2.5.0.
4
-
5
- ## Философия "Fail Fast"
6
-
7
- SDK v2.5.0 следует принципу "fail fast" - ошибки возникают сразу при обнаружении проблем, без тихих fallback'ов.
8
-
9
- ## Обработка HTTP ошибок
10
-
11
- ### Использование try/catch
12
-
13
- Рекомендуемый способ обработки ошибок:
14
-
15
- ```javascript
16
- import { CodeSolverSDK } from '@ai-solver/sdk';
17
-
18
- try {
19
- const projects = await sdk.projects.getAll();
20
- console.log('✅ Получено проектов:', projects.total);
21
- } catch (error) {
22
- console.error('❌ Ошибка:', error.message);
23
-
24
- // Проверка типа ошибки
25
- if (error.status === 401) {
26
- console.error('🔑 Ошибка аутентификации');
27
- } else if (error.status === 404) {
28
- console.error('🔍 Ресурс не найден');
29
- } else if (error.code === 'NETWORK_ERROR') {
30
- console.error('🌐 Проблема сети');
31
- }
32
- }
33
- ```
34
-
35
- ### Структура ошибок
36
-
37
- SDK v2.5.0 возвращает стандартизированные ошибки:
38
-
39
- ```javascript
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
- }
51
- ```
52
-
53
- ## Обработка WebSocket ошибок
54
-
55
- ### Обработка событий ошибок
56
-
57
- ```javascript
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);
65
- });
66
-
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);
73
- });
74
-
75
- // Chat WebSocket ошибки
76
- await sdk.chat.connectWebSocket();
77
-
78
- sdk.chat.on('error', (error) => {
79
- console.error('❌ Chat error:', error.message);
80
- });
81
- ```
82
-
83
- ### Обработка ошибок подключения
84
-
85
- ```javascript
86
- try {
87
- await sdk.projects.connectWebSocket();
88
- console.log('✅ Projects WebSocket connected');
89
- } catch (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
- }
97
- }
98
- ```
99
-
100
- ## Диагностика ошибок
101
-
102
- ### API диагностика
103
-
104
- ```javascript
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'
125
- }
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
- */
153
- ```
154
-
155
- ## Типы ошибок
156
-
157
- ### HTTP ошибки
158
-
159
- #### 400 Bad Request
160
-
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
- ```
172
-
173
- **Решение:** Проверьте корректность входных данных.
174
-
175
- #### 401 Unauthorized
176
-
177
- ```javascript
178
- {
179
- status: 401,
180
- code: 'AUTH_INVALID_KEY',
181
- message: 'Invalid or missing API key'
182
- }
183
- ```
184
-
185
- **Решение:** Проверьте API ключ в настройках SDK.
186
-
187
- #### 403 Forbidden
188
-
189
- ```javascript
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) {
397
- try {
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);
408
- }
409
-
410
- return project;
411
-
412
- } catch (error) {
413
- console.error('❌ Project creation failed:', error.message);
414
-
415
- // Fallback: сохраняем локально
416
- const localProject = {
417
- id: `local_${Date.now()}`,
418
- name: projectData.name,
419
- path: projectData.path,
420
- local: true
421
- };
422
-
423
- localStorage.setItem(`project_${localProject.id}`, JSON.stringify(localProject));
424
- console.log('💾 Project saved locally:', localProject.id);
425
-
426
- return localProject;
427
- }
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
- }
460
-
461
- // Использование
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
- }
486
-
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);
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
- ---
610
-
611
- **Документация обработки ошибок для SDK v2.5.0**
612
- **Принцип:** Fail Fast, явные ошибки, надежная диагностика
613
- **Обновлено:** 28 июня 2025
package/docs/README.md DELETED
@@ -1,53 +0,0 @@
1
- # Code Solver SDK - Документация
2
-
3
- > **JavaScript/TypeScript SDK для VS Code Extensions**
4
- > Подключение к AI бэкенду для индексации, поиска и работы с кодом
5
-
6
- ## 📚 Основная документация
7
-
8
- ### [📊 Индексация проектов](indexing/INDEXING.md)
9
- **Подробное руководство по индексации:**
10
- - Создание и поиск проектов
11
- - Запуск и мониторинг индексации
12
- - Workflow с обработкой ошибок
13
- - Практические примеры
14
-
15
- ### [🔧 Интеграция с VS Code](VSCODE_INTEGRATION.md)
16
- **Готовые примеры для Extensions:**
17
- - Базовая настройка SDK
18
- - Индексация с прогресс-баром
19
- - Поиск функций с навигацией
20
- - AI Chat интеграция
21
- - Конфигурация package.json
22
-
23
- ### [🚨 Обработка ошибок](ERROR_HANDLING.md)
24
- **Как правильно обрабатывать ошибки:**
25
- - Сетевые ошибки
26
- - Ошибки индексации
27
- - Retry логика
28
- - Graceful degradation
29
-
30
- ## 🚀 Быстрый старт
31
-
32
- ```javascript
33
- import { CodeSolverSDK } from 'solver-sdk';
34
-
35
- // 1. Инициализация
36
- const sdk = await CodeSolverSDK.create({
37
- baseURL: 'http://localhost:3000'
38
- });
39
-
40
- // 2. Создание проекта
41
- const project = await sdk.projects.findOrCreateProject('/path/to/project', 'My Project');
42
-
43
- // 3. Индексация
44
- await sdk.projects.startIndexing(project.id);
45
-
46
- // 4. Поиск функций
47
- const results = await sdk.search.searchFunctions(project.id, {
48
- query: 'user authentication',
49
- limit: 10
50
- });
51
- ```
52
-
53
- SDK готов к продакшену! ��