solver-sdk 2.6.2 → 2.7.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 +44 -55
- package/dist/cjs/api/chat-api/index.js +68 -68
- package/dist/cjs/api/chat-api/index.js.map +1 -1
- package/dist/cjs/api/projects-api.js +7 -0
- package/dist/cjs/api/projects-api.js.map +1 -1
- package/dist/cjs/code-solver-sdk.js +24 -2
- package/dist/cjs/code-solver-sdk.js.map +1 -1
- package/dist/cjs/constants/websocket-events.constants.js +5 -0
- package/dist/cjs/constants/websocket-events.constants.js.map +1 -1
- package/dist/cjs/constants/websocket-namespaces.constants.js +2 -0
- package/dist/cjs/constants/websocket-namespaces.constants.js.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interfaces/websocket/vscode-command.interfaces.js +42 -0
- package/dist/cjs/interfaces/websocket/vscode-command.interfaces.js.map +1 -0
- package/dist/cjs/utils/http-client.js +11 -3
- package/dist/cjs/utils/http-client.js.map +1 -1
- package/dist/cjs/ws/file-editing-ws-client.js +162 -0
- package/dist/cjs/ws/file-editing-ws-client.js.map +1 -0
- package/dist/esm/api/chat-api/index.js +68 -68
- package/dist/esm/api/chat-api/index.js.map +1 -1
- package/dist/esm/api/projects-api.js +7 -0
- package/dist/esm/api/projects-api.js.map +1 -1
- package/dist/esm/code-solver-sdk.js +24 -2
- package/dist/esm/code-solver-sdk.js.map +1 -1
- package/dist/esm/constants/websocket-events.constants.js +5 -0
- package/dist/esm/constants/websocket-events.constants.js.map +1 -1
- package/dist/esm/constants/websocket-namespaces.constants.js +2 -0
- package/dist/esm/constants/websocket-namespaces.constants.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interfaces/websocket/vscode-command.interfaces.js +39 -0
- package/dist/esm/interfaces/websocket/vscode-command.interfaces.js.map +1 -0
- package/dist/esm/utils/http-client.js +11 -3
- package/dist/esm/utils/http-client.js.map +1 -1
- package/dist/esm/ws/file-editing-ws-client.js +158 -0
- package/dist/esm/ws/file-editing-ws-client.js.map +1 -0
- package/dist/types/api/chat-api/index.d.ts +7 -0
- package/dist/types/api/chat-api/index.d.ts.map +1 -1
- package/dist/types/api/chat-api/interfaces.d.ts +7 -0
- package/dist/types/api/chat-api/interfaces.d.ts.map +1 -1
- package/dist/types/api/chat-api/models.d.ts +10 -1
- package/dist/types/api/chat-api/models.d.ts.map +1 -1
- package/dist/types/api/projects-api.d.ts +18 -0
- package/dist/types/api/projects-api.d.ts.map +1 -1
- package/dist/types/code-solver-sdk.d.ts +8 -0
- package/dist/types/code-solver-sdk.d.ts.map +1 -1
- package/dist/types/constants/websocket-events.constants.d.ts +5 -1
- package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
- package/dist/types/constants/websocket-namespaces.constants.d.ts +3 -1
- package/dist/types/constants/websocket-namespaces.constants.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/interfaces/websocket/vscode-command.interfaces.d.ts +56 -0
- package/dist/types/interfaces/websocket/vscode-command.interfaces.d.ts.map +1 -0
- package/dist/types/utils/http-client.d.ts.map +1 -1
- package/dist/types/ws/file-editing-ws-client.d.ts +85 -0
- package/dist/types/ws/file-editing-ws-client.d.ts.map +1 -0
- package/docs/ARCHITECTURE.md +268 -0
- package/docs/QUICK_START.md +126 -0
- package/docs/README.md +25 -279
- package/docs/VSCODE_INTEGRATION.md +432 -0
- package/docs/WEBSOCKET.md +49 -10
- package/package.json +1 -1
- package/docs/API_REFERENCE.md +0 -703
- package/docs/INTEGRATION_GUIDE_V2.5.md +0 -516
- package/docs/README_V2.5.md +0 -266
|
@@ -1,516 +0,0 @@
|
|
|
1
|
-
# 🚀 Полное руководство по интеграции SDK v2.5.0
|
|
2
|
-
|
|
3
|
-
Это руководство показывает, как правильно интегрировать Code Solver SDK v2.5.0 в production проект.
|
|
4
|
-
|
|
5
|
-
## 📋 Содержание
|
|
6
|
-
|
|
7
|
-
- [Быстрый старт](#быстрый-старт)
|
|
8
|
-
- [Инициализация](#инициализация)
|
|
9
|
-
- [WebSocket управление](#websocket-управление)
|
|
10
|
-
- [API диагностика](#api-диагностика)
|
|
11
|
-
- [Работа с проектами](#работа-с-проектами)
|
|
12
|
-
- [Рассуждения и мышление](#рассуждения-и-мышление)
|
|
13
|
-
- [Обработка ошибок](#обработка-ошибок)
|
|
14
|
-
- [Best practices](#best-practices)
|
|
15
|
-
|
|
16
|
-
## 🚀 Быстрый старт
|
|
17
|
-
|
|
18
|
-
### Установка
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
npm install solver-sdk
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
### Минимальный рабочий пример
|
|
25
|
-
|
|
26
|
-
```javascript
|
|
27
|
-
import { CodeSolverSDK } from 'solver-sdk';
|
|
28
|
-
|
|
29
|
-
// ✅ Рекомендуемый способ (с валидацией)
|
|
30
|
-
const sdk = await CodeSolverSDK.create({
|
|
31
|
-
baseURL: 'http://localhost:3000',
|
|
32
|
-
apiKey: 'your-api-key',
|
|
33
|
-
websocket: { autoConnect: false }
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
// Проверка API
|
|
37
|
-
const diagnosis = await sdk.diagnoseAPI();
|
|
38
|
-
if (diagnosis.healthy) {
|
|
39
|
-
console.log('✅ SDK готов к работе');
|
|
40
|
-
} else {
|
|
41
|
-
console.log('❌ Проблемы:', diagnosis.errors);
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## 🎮 Инициализация
|
|
46
|
-
|
|
47
|
-
### Способ 1: С валидацией API (рекомендуется)
|
|
48
|
-
|
|
49
|
-
```javascript
|
|
50
|
-
try {
|
|
51
|
-
const sdk = await CodeSolverSDK.create({
|
|
52
|
-
baseURL: 'http://localhost:3000',
|
|
53
|
-
apiKey: 'your-api-key',
|
|
54
|
-
websocket: {
|
|
55
|
-
autoConnect: false, // Контролируем WebSocket вручную
|
|
56
|
-
reconnect: true, // Автоматическое переподключение
|
|
57
|
-
reconnectAttempts: 3, // Максимум 3 попытки
|
|
58
|
-
reconnectDelay: 1000 // Задержка между попытками
|
|
59
|
-
},
|
|
60
|
-
timeout: 30000, // Таймаут HTTP запросов
|
|
61
|
-
debug: true // Включить отладочные логи
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
console.log('✅ SDK инициализирован с валидацией API');
|
|
65
|
-
} catch (error) {
|
|
66
|
-
console.error('❌ Ошибка инициализации:', error.message);
|
|
67
|
-
// API недоступен или неправильные настройки
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Способ 2: Быстрая инициализация
|
|
72
|
-
|
|
73
|
-
```javascript
|
|
74
|
-
// Без проверки API - для быстрого старта
|
|
75
|
-
const sdk = new CodeSolverSDK({
|
|
76
|
-
baseURL: 'http://localhost:3000',
|
|
77
|
-
apiKey: 'your-api-key',
|
|
78
|
-
websocket: { autoConnect: false }
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// Проверка отдельно
|
|
82
|
-
const isHealthy = await sdk.checkHealth();
|
|
83
|
-
console.log(`API статус: ${isHealthy ? 'OK' : 'недоступен'}`);
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
## 🔌 WebSocket управление
|
|
87
|
-
|
|
88
|
-
### Контролируемое подключение
|
|
89
|
-
|
|
90
|
-
```javascript
|
|
91
|
-
// ❌ СТАРЫЙ способ (автоматическое подключение)
|
|
92
|
-
// const sdk = new CodeSolverSDK(); // WebSocket подключался сразу
|
|
93
|
-
|
|
94
|
-
// ✅ НОВЫЙ способ v2.5.0 (ручное управление)
|
|
95
|
-
const sdk = new CodeSolverSDK({
|
|
96
|
-
websocket: { autoConnect: false } // Важно!
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
// Подключение только когда нужно
|
|
100
|
-
if (needIndexing) {
|
|
101
|
-
const indexingClient = sdk.getIndexingClient();
|
|
102
|
-
const connected = await indexingClient.connectToIndexing();
|
|
103
|
-
|
|
104
|
-
if (connected) {
|
|
105
|
-
console.log('✅ WebSocket для индексации подключен');
|
|
106
|
-
|
|
107
|
-
// Подписка на события
|
|
108
|
-
sdk.projects.on('indexing_progress', (data) => {
|
|
109
|
-
console.log(`Прогресс: ${data.progress}%`);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (needReasoning) {
|
|
115
|
-
await sdk.reasoning.connectWebSocket();
|
|
116
|
-
console.log('✅ WebSocket для рассуждений подключен');
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### Обработка ошибок WebSocket
|
|
121
|
-
|
|
122
|
-
```javascript
|
|
123
|
-
// ✅ Честные ошибки v2.5.0 (без fallback'ов)
|
|
124
|
-
try {
|
|
125
|
-
sdk.projects.on('indexing_complete', callback);
|
|
126
|
-
} catch (error) {
|
|
127
|
-
console.error('❌ WebSocket не подключен:', error.message);
|
|
128
|
-
// Нужно подключиться перед использованием
|
|
129
|
-
await sdk.projects.connectWebSocket();
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// ✅ Проверка перед использованием
|
|
133
|
-
if (sdk.projects.isWebSocketConnected()) {
|
|
134
|
-
sdk.projects.emitSocketEvent('custom_event', data);
|
|
135
|
-
} else {
|
|
136
|
-
console.log('WebSocket не подключен, подключаемся...');
|
|
137
|
-
await sdk.projects.connectWebSocket();
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## 🔍 API диагностика
|
|
142
|
-
|
|
143
|
-
### Полная диагностика
|
|
144
|
-
|
|
145
|
-
```javascript
|
|
146
|
-
const diagnosis = await sdk.diagnoseAPI();
|
|
147
|
-
|
|
148
|
-
console.log(`API здоровье: ${diagnosis.healthy ? 'OK' : 'Проблемы'}`);
|
|
149
|
-
console.log(`Проверено endpoints: ${diagnosis.total}`);
|
|
150
|
-
console.log(`Работающих: ${diagnosis.working}`);
|
|
151
|
-
console.log(`Проблемных: ${diagnosis.failed}`);
|
|
152
|
-
|
|
153
|
-
if (!diagnosis.healthy) {
|
|
154
|
-
console.log('\nПроблемные endpoints:');
|
|
155
|
-
diagnosis.errors.forEach(error => {
|
|
156
|
-
console.log(`❌ ${error}`);
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
console.log('\nРабочие endpoints:');
|
|
160
|
-
diagnosis.working.forEach(endpoint => {
|
|
161
|
-
console.log(`✅ ${endpoint}`);
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Диагностика WebSocket
|
|
167
|
-
|
|
168
|
-
```javascript
|
|
169
|
-
// Проверка состояния всех WebSocket соединений
|
|
170
|
-
const wsStatus = {
|
|
171
|
-
projects: sdk.projects.isWebSocketConnected(),
|
|
172
|
-
reasoning: sdk.reasoning.isWebSocketConnected(),
|
|
173
|
-
dependencies: sdk.dependencies.isWebSocketConnected()
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
console.log('WebSocket статус:', wsStatus);
|
|
177
|
-
|
|
178
|
-
// Подключение только нужных сервисов
|
|
179
|
-
for (const [service, connected] of Object.entries(wsStatus)) {
|
|
180
|
-
if (!connected && needService[service]) {
|
|
181
|
-
await sdk[service].connectWebSocket();
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
## 📁 Работа с проектами
|
|
187
|
-
|
|
188
|
-
### Создание и индексация
|
|
189
|
-
|
|
190
|
-
```javascript
|
|
191
|
-
try {
|
|
192
|
-
// Создание проекта
|
|
193
|
-
const project = await sdk.projects.createProject(
|
|
194
|
-
'My Project',
|
|
195
|
-
'/path/to/project',
|
|
196
|
-
{
|
|
197
|
-
excludePatterns: ['node_modules', '.git', 'dist']
|
|
198
|
-
}
|
|
199
|
-
);
|
|
200
|
-
|
|
201
|
-
console.log('✅ Проект создан:', project.id);
|
|
202
|
-
|
|
203
|
-
// Индексация с WebSocket мониторингом
|
|
204
|
-
await sdk.projects.connectWebSocket();
|
|
205
|
-
|
|
206
|
-
sdk.projects.on('indexing_progress', (data) => {
|
|
207
|
-
console.log(`📊 Прогресс: ${data.progress}% (${data.processedFiles}/${data.totalFiles})`);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
sdk.projects.on('indexing_complete', (data) => {
|
|
211
|
-
console.log(`✅ Индексация завершена: ${data.success ? 'успешно' : 'с ошибками'}`);
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
// Запуск индексации
|
|
215
|
-
const indexResult = await sdk.projects.indexProject(project.id, {
|
|
216
|
-
indexingMode: 'auto', // auto, full, incremental
|
|
217
|
-
forceFull: false
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
console.log('✅ Индексация запущена:', indexResult);
|
|
221
|
-
|
|
222
|
-
} catch (error) {
|
|
223
|
-
console.error('❌ Ошибка работы с проектом:', error.message);
|
|
224
|
-
}
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
## 🧠 Рассуждения и мышление
|
|
228
|
-
|
|
229
|
-
### Новые алиасы методов v2.5.0
|
|
230
|
-
|
|
231
|
-
```javascript
|
|
232
|
-
// ✅ Короткие алиасы (новое в v2.5.0)
|
|
233
|
-
const reasoning = await sdk.reasoning.create({
|
|
234
|
-
projectId: project.id,
|
|
235
|
-
query: 'Объясни архитектуру проекта'
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
await sdk.reasoning.start(reasoning.id);
|
|
239
|
-
const result = await sdk.reasoning.getReasoning(reasoning.id);
|
|
240
|
-
await sdk.reasoning.stop(reasoning.id);
|
|
241
|
-
|
|
242
|
-
// ✅ Полные названия (совместимость)
|
|
243
|
-
const reasoning2 = await sdk.reasoning.createReasoning({
|
|
244
|
-
projectId: project.id,
|
|
245
|
-
query: 'Как улучшить производительность?'
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
await sdk.reasoning.startReasoning(reasoning2.id);
|
|
249
|
-
await sdk.reasoning.stopReasoning(reasoning2.id);
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
### Потоковое мышление с Anthropic
|
|
253
|
-
|
|
254
|
-
```javascript
|
|
255
|
-
// Настройка для Anthropic Claude thinking
|
|
256
|
-
const stream = await sdk.chat.streamChatWithThinking([
|
|
257
|
-
{
|
|
258
|
-
role: 'user',
|
|
259
|
-
content: [
|
|
260
|
-
{
|
|
261
|
-
type: 'text',
|
|
262
|
-
text: 'Объясни, как работает этот код:'
|
|
263
|
-
},
|
|
264
|
-
{
|
|
265
|
-
type: 'text',
|
|
266
|
-
text: codeContent
|
|
267
|
-
}
|
|
268
|
-
]
|
|
269
|
-
}
|
|
270
|
-
], {
|
|
271
|
-
model: 'claude-3-5-sonnet-20241022',
|
|
272
|
-
thinking: true, // Включаем мышление
|
|
273
|
-
preserveSignature: true // Сохраняем подписи
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
// Обработка потока
|
|
277
|
-
for await (const chunk of stream) {
|
|
278
|
-
if (chunk.type === 'thinking') {
|
|
279
|
-
console.log('🤔 Мышление:', chunk.thinking);
|
|
280
|
-
} else if (chunk.type === 'content') {
|
|
281
|
-
process.stdout.write(chunk.content);
|
|
282
|
-
} else if (chunk.type === 'signature') {
|
|
283
|
-
console.log('🔐 Подпись сохранена');
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
## ❌ Обработка ошибок
|
|
289
|
-
|
|
290
|
-
### "Fail Fast" подход v2.5.0
|
|
291
|
-
|
|
292
|
-
```javascript
|
|
293
|
-
// ✅ Честные ошибки (без fallback'ов)
|
|
294
|
-
try {
|
|
295
|
-
// WebSocket методы сразу бросают ошибку
|
|
296
|
-
sdk.projects.on('event', callback);
|
|
297
|
-
} catch (error) {
|
|
298
|
-
console.error('❌ WebSocket не подключен');
|
|
299
|
-
// Решение: подключиться перед использованием
|
|
300
|
-
await sdk.projects.connectWebSocket();
|
|
301
|
-
sdk.projects.on('event', callback);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
try {
|
|
305
|
-
// API методы честно сообщают о проблемах
|
|
306
|
-
const projects = await sdk.projects.getAllProjects();
|
|
307
|
-
} catch (error) {
|
|
308
|
-
console.error('❌ API ошибка:', error.message);
|
|
309
|
-
|
|
310
|
-
// Диагностика проблемы
|
|
311
|
-
const diagnosis = await sdk.diagnoseAPI();
|
|
312
|
-
if (!diagnosis.healthy) {
|
|
313
|
-
console.log('Проблема с API endpoints:', diagnosis.errors);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### Retry логика
|
|
319
|
-
|
|
320
|
-
```javascript
|
|
321
|
-
async function withRetry(operation, maxAttempts = 3) {
|
|
322
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
323
|
-
try {
|
|
324
|
-
return await operation();
|
|
325
|
-
} catch (error) {
|
|
326
|
-
console.log(`Попытка ${attempt}/${maxAttempts} неудачна:`, error.message);
|
|
327
|
-
|
|
328
|
-
if (attempt === maxAttempts) {
|
|
329
|
-
throw error; // Последняя попытка - бросаем ошибку
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// Экспоненциальная задержка
|
|
333
|
-
await new Promise(resolve => setTimeout(resolve, 1000 * attempt));
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// Использование
|
|
339
|
-
const projects = await withRetry(() => sdk.projects.getAllProjects());
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
## 💡 Best Practices
|
|
343
|
-
|
|
344
|
-
### 1. Инициализация в production
|
|
345
|
-
|
|
346
|
-
```javascript
|
|
347
|
-
class SolverSDKManager {
|
|
348
|
-
constructor(config) {
|
|
349
|
-
this.config = config;
|
|
350
|
-
this.sdk = null;
|
|
351
|
-
this.isReady = false;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
async initialize() {
|
|
355
|
-
try {
|
|
356
|
-
// Валидация с таймаутом
|
|
357
|
-
this.sdk = await Promise.race([
|
|
358
|
-
CodeSolverSDK.create({
|
|
359
|
-
...this.config,
|
|
360
|
-
websocket: { autoConnect: false }
|
|
361
|
-
}),
|
|
362
|
-
new Promise((_, reject) =>
|
|
363
|
-
setTimeout(() => reject(new Error('Timeout')), 10000)
|
|
364
|
-
)
|
|
365
|
-
]);
|
|
366
|
-
|
|
367
|
-
// Диагностика
|
|
368
|
-
const diagnosis = await this.sdk.diagnoseAPI();
|
|
369
|
-
if (!diagnosis.healthy) {
|
|
370
|
-
throw new Error(`API проблемы: ${diagnosis.errors.join(', ')}`);
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
this.isReady = true;
|
|
374
|
-
console.log('✅ SDK готов к production использованию');
|
|
375
|
-
|
|
376
|
-
} catch (error) {
|
|
377
|
-
console.error('❌ Не удалось инициализировать SDK:', error.message);
|
|
378
|
-
throw error;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
ensureReady() {
|
|
383
|
-
if (!this.isReady) {
|
|
384
|
-
throw new Error('SDK не инициализирован. Вызовите initialize() сначала.');
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
async getProjects() {
|
|
389
|
-
this.ensureReady();
|
|
390
|
-
return this.sdk.projects.getAllProjects();
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// Использование
|
|
395
|
-
const sdkManager = new SolverSDKManager({
|
|
396
|
-
baseURL: process.env.SOLVER_API_URL,
|
|
397
|
-
apiKey: process.env.SOLVER_API_KEY
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
await sdkManager.initialize();
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
### 2. WebSocket lifecycle управление
|
|
404
|
-
|
|
405
|
-
```javascript
|
|
406
|
-
class WebSocketManager {
|
|
407
|
-
constructor(sdk) {
|
|
408
|
-
this.sdk = sdk;
|
|
409
|
-
this.connections = new Set();
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
async connectService(serviceName) {
|
|
413
|
-
if (this.connections.has(serviceName)) {
|
|
414
|
-
return; // Уже подключен
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
const service = this.sdk[serviceName];
|
|
418
|
-
const connected = await service.connectWebSocket();
|
|
419
|
-
|
|
420
|
-
if (connected) {
|
|
421
|
-
this.connections.add(serviceName);
|
|
422
|
-
console.log(`✅ ${serviceName} WebSocket подключен`);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
async disconnectAll() {
|
|
427
|
-
for (const serviceName of this.connections) {
|
|
428
|
-
await this.sdk[serviceName].disconnectWebSocket();
|
|
429
|
-
}
|
|
430
|
-
this.connections.clear();
|
|
431
|
-
console.log('✅ Все WebSocket соединения закрыты');
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
isServiceConnected(serviceName) {
|
|
435
|
-
return this.connections.has(serviceName);
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
// Использование
|
|
440
|
-
const wsManager = new WebSocketManager(sdk);
|
|
441
|
-
|
|
442
|
-
// Подключение по требованию
|
|
443
|
-
if (needIndexing) await wsManager.connectService('projects');
|
|
444
|
-
if (needReasoning) await wsManager.connectService('reasoning');
|
|
445
|
-
|
|
446
|
-
// Cleanup при завершении работы
|
|
447
|
-
process.on('SIGINT', () => {
|
|
448
|
-
wsManager.disconnectAll();
|
|
449
|
-
process.exit(0);
|
|
450
|
-
});
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
### 3. Error boundary для React
|
|
454
|
-
|
|
455
|
-
```jsx
|
|
456
|
-
import React, { Component } from 'react';
|
|
457
|
-
|
|
458
|
-
class SDKErrorBoundary extends Component {
|
|
459
|
-
constructor(props) {
|
|
460
|
-
super(props);
|
|
461
|
-
this.state = { hasError: false, error: null };
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
static getDerivedStateFromError(error) {
|
|
465
|
-
return { hasError: true, error };
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
componentDidCatch(error, errorInfo) {
|
|
469
|
-
// Логируем ошибки SDK
|
|
470
|
-
console.error('SDK Error:', error);
|
|
471
|
-
|
|
472
|
-
// Диагностика при ошибке
|
|
473
|
-
if (this.props.sdk) {
|
|
474
|
-
this.props.sdk.diagnoseAPI().then(diagnosis => {
|
|
475
|
-
if (!diagnosis.healthy) {
|
|
476
|
-
console.error('API проблемы:', diagnosis.errors);
|
|
477
|
-
}
|
|
478
|
-
});
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
render() {
|
|
483
|
-
if (this.state.hasError) {
|
|
484
|
-
return (
|
|
485
|
-
<div className="error-boundary">
|
|
486
|
-
<h2>⚠️ Ошибка SDK</h2>
|
|
487
|
-
<p>{this.state.error?.message}</p>
|
|
488
|
-
<button onClick={() => this.setState({ hasError: false })}>
|
|
489
|
-
Попробовать снова
|
|
490
|
-
</button>
|
|
491
|
-
</div>
|
|
492
|
-
);
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
return this.props.children;
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
// Использование
|
|
500
|
-
<SDKErrorBoundary sdk={sdk}>
|
|
501
|
-
<YourApp />
|
|
502
|
-
</SDKErrorBoundary>
|
|
503
|
-
```
|
|
504
|
-
|
|
505
|
-
## 🎯 Заключение
|
|
506
|
-
|
|
507
|
-
SDK v2.5.0 готов к production использованию с полным контролем над инициализацией, WebSocket соединениями и честной обработкой ошибок.
|
|
508
|
-
|
|
509
|
-
**Ключевые принципы:**
|
|
510
|
-
- ✅ Используйте `autoConnect: false` для контроля WebSocket
|
|
511
|
-
- ✅ Применяйте `diagnoseAPI()` для проверки endpoints
|
|
512
|
-
- ✅ Обрабатывайте честные ошибки без fallback'ов
|
|
513
|
-
- ✅ Подключайте WebSocket только когда нужно
|
|
514
|
-
- ✅ Используйте алиасы методов для удобства
|
|
515
|
-
|
|
516
|
-
**Результат:** Стабильная работа в production без скрытых проблем!
|