solver-sdk 1.7.5 → 1.7.6

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.
@@ -5,20 +5,87 @@
5
5
  ## Содержание
6
6
 
7
7
  - [Введение](#введение)
8
+ - [Быстрый старт](#быстрый-старт)
8
9
  - [API для индексации](#api-для-индексации)
9
- - [Инкрементальная индексация](#инкрементальная-индексация)
10
+ - [Работа с проектами по ID](#работа-с-проектами-по-id)
11
+ - [Работа с проектами по пути](#работа-с-проектами-по-пути)
12
+ - [Инкрементальная индексация](#инкрементальная-индексация)
10
13
  - [Отслеживание процесса индексации](#отслеживание-процесса-индексации)
11
- - [События WebSocket](#события-websocket)
14
+ - [Подключение к WebSocket](#подключение-к-websocket)
15
+ - [События WebSocket](#события-websocket)
16
+ - [Сценарии использования](#сценарии-использования)
17
+ - [Индексация существующего проекта](#индексация-существующего-проекта)
18
+ - [Создание и индексация проекта по пути](#создание-и-индексация-проекта-по-пути)
19
+ - [Интеграция с IDE](#интеграция-с-ide)
20
+ - [Наблюдение за файловой системой](#наблюдение-за-файловой-системой)
12
21
  - [Обработка ошибок](#обработка-ошибок)
13
- - [Примеры использования](#примеры-использования)
14
22
 
15
23
  ## Введение
16
24
 
17
- Индексация проекта - это процесс сканирования и анализа файлов проекта для дальнейшего поиска и обработки информации. Solver SDK предоставляет набор методов для управления индексацией проектов и отслеживания этого процесса.
25
+ Индексация проекта - это процесс сканирования и анализа файлов проекта для дальнейшего поиска и обработки информации. Solver SDK предоставляет набор методов для создания проектов, управления индексацией и отслеживания этого процесса в реальном времени через WebSocket соединения.
26
+
27
+ ## Быстрый старт
28
+
29
+ Вот простой пример, как создать и проиндексировать проект, используя SDK:
30
+
31
+ ```javascript
32
+ import { CodeSolverSDK } from 'solver-sdk';
33
+ import path from 'path';
34
+
35
+ // 1. Инициализация SDK
36
+ const sdk = new CodeSolverSDK({
37
+ baseURL: 'https://api.example.com',
38
+ apiKey: 'your-api-key'
39
+ });
40
+
41
+ // 2. Создание и индексация проекта
42
+ async function indexMyProject() {
43
+ try {
44
+ // Путь к проекту
45
+ const projectPath = '/path/to/your/project';
46
+
47
+ // Создание и индексация в одной операции
48
+ const result = await sdk.projects.createAndIndexProject(
49
+ projectPath,
50
+ {
51
+ name: path.basename(projectPath),
52
+ excludePatterns: ['node_modules', '.git', 'dist']
53
+ }
54
+ );
55
+
56
+ console.log(`Проект создан и индексация начата. ID проекта: ${result.projectId}`);
57
+
58
+ // 3. Мониторинг прогресса индексации (опционально)
59
+ await sdk.projects.connectWebSocket();
60
+
61
+ sdk.projects.on('indexing_progress', (data) => {
62
+ console.log(`Прогресс индексации: ${data.progress}%`);
63
+ });
64
+
65
+ sdk.projects.on('indexing_complete', () => {
66
+ console.log('Индексация успешно завершена!');
67
+ sdk.projects.disconnectWebSocket();
68
+ });
69
+
70
+ return result.projectId;
71
+ } catch (error) {
72
+ console.error(`Ошибка: ${error.message}`);
73
+ sdk.projects.disconnectWebSocket();
74
+ throw error;
75
+ }
76
+ }
77
+
78
+ // Запуск индексации
79
+ indexMyProject().then(projectId => {
80
+ console.log(`Готово! Используйте ID проекта ${projectId} для поиска`);
81
+ });
82
+ ```
18
83
 
19
84
  ## API для индексации
20
85
 
21
- ### Основные методы
86
+ SDK предоставляет два способа работы с проектами: по ID проекта и по пути к проекту на диске.
87
+
88
+ ### Работа с проектами по ID
22
89
 
23
90
  | Метод | Описание |
24
91
  |-------|----------|
@@ -27,10 +94,10 @@
27
94
  | `sdk.projects.getIndexingStatus(projectId)` | Получает текущий статус индексации |
28
95
  | `sdk.projects.updateFileIndex(projectId, filePath, options)` | Обновляет индекс конкретного файла |
29
96
 
30
- ### Пример использования API
97
+ #### Запуск и остановка индексации
31
98
 
32
99
  ```javascript
33
- // Запуск индексации
100
+ // Запуск индексации по ID проекта
34
101
  const result = await sdk.projects.indexProject(projectId, {
35
102
  forceFull: false, // true для принудительной полной переиндексации
36
103
  includePatterns: ['**/*.js', '**/*.ts'], // glob паттерны для включения файлов
@@ -47,11 +114,44 @@ await sdk.projects.stopIndexing(projectId);
47
114
  console.log('Индексация остановлена');
48
115
  ```
49
116
 
50
- ## Инкрементальная индексация
117
+ ### Работа с проектами по пути
118
+
119
+ | Метод | Описание |
120
+ |-------|----------|
121
+ | `sdk.projects.getOrCreateProject(path, name?)` | Получает существующий или создает новый проект по пути |
122
+ | `sdk.projects.indexProjectByPath(path, options)` | Запускает индексацию проекта по указанному пути |
123
+ | `sdk.projects.createAndIndexProject(path, options)` | Создает проект и сразу запускает его индексацию |
124
+ | `sdk.projects.ensureProjectExists(projectId, options)` | Проверяет существование проекта и при необходимости создает резервную копию |
125
+
126
+ #### Создание и индексация
127
+
128
+ ```javascript
129
+ // Получить проект по пути (создать, если не существует)
130
+ const project = await sdk.projects.getOrCreateProject(
131
+ '/path/to/project',
132
+ 'Название проекта' // опционально
133
+ );
134
+ console.log(`Проект ID: ${project.id}`);
135
+
136
+ // Индексация проекта по пути
137
+ const indexResult = await sdk.projects.indexProjectByPath('/path/to/project', {
138
+ forceFull: true, // принудительная полная индексация
139
+ excludePatterns: ['node_modules', '.git']
140
+ });
141
+ console.log(`Индексация запущена для проекта ${indexResult.projectId}`);
142
+
143
+ // Создание и индексация в одной операции
144
+ const result = await sdk.projects.createAndIndexProject('/path/to/project', {
145
+ name: 'Мой проект',
146
+ forceFull: false,
147
+ excludePatterns: ['node_modules', '.git']
148
+ });
149
+ console.log(`Проект ${result.projectId} создан и индексируется`);
150
+ ```
51
151
 
52
- В SDK версии 1.7.2 добавлена поддержка инкрементальной индексации отдельных файлов, что позволяет обновлять только изменившиеся файлы без необходимости переиндексации всего проекта.
152
+ ### Инкрементальная индексация
53
153
 
54
- ### Обновление индекса отдельного файла
154
+ SDK поддерживает инкрементальную индексацию, позволяющую обновлять только изменившиеся файлы.
55
155
 
56
156
  ```javascript
57
157
  // Обновление индекса файла с передачей содержимого
@@ -64,29 +164,15 @@ const result = await sdk.projects.updateFileIndex(
64
164
  }
65
165
  );
66
166
 
67
- console.log(`Файл ${result.filePath} успешно проиндексирован`);
167
+ console.log(`Файл ${result.filePath} проиндексирован`);
68
168
  console.log(`Метаданные файла:`, result.fileIndex);
69
169
 
70
- // Альтернативный вариант через ContextApi
71
- await sdk.context.updateFileIndex(
72
- projectId,
73
- 'src/components/App.js',
74
- 'console.log("Hello World");',
75
- false // force flag
76
- );
77
- ```
78
-
79
- ### Инкрементальная индексация из файловой системы
80
-
81
- ```javascript
82
170
  // Обновление индекса без передачи содержимого
83
171
  // SDK прочитает файл с диска
84
- const result = await sdk.projects.updateFileIndex(projectId, 'src/components/App.js');
85
-
86
- console.log(`Файл ${result.filePath} успешно проиндексирован`);
172
+ const result2 = await sdk.projects.updateFileIndex(projectId, 'src/utils/helper.js');
87
173
  ```
88
174
 
89
- ### Пакетное обновление нескольких файлов
175
+ #### Пакетное обновление
90
176
 
91
177
  ```javascript
92
178
  // Обновление нескольких файлов
@@ -106,25 +192,21 @@ console.log(`Обновлено ${results.length} файлов`);
106
192
 
107
193
  ## Отслеживание процесса индексации
108
194
 
109
- Для отслеживания процесса индексации в реальном времени используется WebSocket соединение. SDK предоставляет методы для подключения к серверу и получения событий о ходе индексации.
195
+ SDK предоставляет мощный механизм отслеживания процесса индексации в реальном времени через WebSocket соединения.
110
196
 
111
- ### Подключение к WebSocket (версия 1.7.2)
197
+ ### Подключение к WebSocket
112
198
 
113
199
  ```javascript
114
- // Прямое подключение к пространству имен индексации
200
+ // Подключение к WebSocket для событий индексации
115
201
  await sdk.projects.connectWebSocket();
116
202
 
117
- // Проверка подключения
203
+ // Проверка успешного подключения
118
204
  if (sdk.projects.isWebSocketConnected()) {
119
- console.log('Успешно подключено к WebSocket серверу');
205
+ console.log('Успешно подключено к WebSocket');
120
206
  } else {
121
- console.error('Не удалось подключиться к WebSocket серверу');
207
+ console.error('Не удалось подключиться к WebSocket');
122
208
  }
123
- ```
124
209
 
125
- ### Установка обработчиков событий
126
-
127
- ```javascript
128
210
  // Установка обработчиков событий
129
211
  sdk.projects.on('indexing_start', (data) => {
130
212
  console.log(`Индексация началась для проекта: ${data.projectId}`);
@@ -136,266 +218,408 @@ sdk.projects.on('indexing_progress', (data) => {
136
218
 
137
219
  sdk.projects.on('indexing_complete', (data) => {
138
220
  console.log(`Индексация завершена! Проиндексировано ${data.indexedFiles} файлов`);
221
+ sdk.projects.disconnectWebSocket(); // Отключение от WebSocket
139
222
  });
140
223
 
141
224
  sdk.projects.on('indexing_error', (data) => {
142
225
  console.error(`Ошибка индексации: ${data.message}`);
143
- });
144
-
145
- sdk.projects.on('file_indexed', (data) => {
146
- console.log(`Файл проиндексирован: ${data.filePath}`);
147
- });
148
-
149
- sdk.projects.on('error', (error) => {
150
- console.error(`Ошибка WebSocket: ${error.message}`);
226
+ sdk.projects.disconnectWebSocket();
151
227
  });
152
228
  ```
153
229
 
154
- ### Отключение от WebSocket
155
-
156
- ```javascript
157
- // Отключение от пространства имен индексации
158
- await sdk.projects.disconnectWebSocket();
159
-
160
- // Или через WebSocketClient
161
- const wsClient = sdk.getWebSocketClient();
162
- await wsClient.disconnect(WebSocketNamespace.INDEXING);
163
-
164
- // Отключение от всех пространств имен
165
- await wsClient.disconnectAll();
166
- ```
167
-
168
- ## События WebSocket
169
-
170
- При индексации проектов сервер отправляет следующие типы событий:
230
+ ### События WebSocket
171
231
 
172
232
  | Событие | Описание | Данные |
173
233
  |---------|----------|--------|
174
234
  | `indexing_start` | Начало процесса индексации | `{ projectId: string }` |
175
- | `indexing_progress` | Обновление прогресса индексации | `{ projectId: string, totalFiles: number, indexedFiles: number, progress: number, startTime: string, elapsedTime: number, estimatedTimeRemaining?: number }` |
235
+ | `indexing_progress` | Обновление прогресса | `{ projectId: string, totalFiles: number, indexedFiles: number, progress: number, startTime: string, elapsedTime: number, estimatedTimeRemaining?: number }` |
176
236
  | `indexing_complete` | Завершение индексации | `{ projectId: string, totalFiles: number, indexedFiles: number, skippedFiles: number, startTime: string, endTime: string, totalTime: number }` |
177
- | `indexing_error` | Ошибка при индексации | `{ projectId: string, message: string, code?: string, details?: any }` |
178
- | `file_indexed` | Отдельный файл проиндексирован | `{ projectId: string, filePath: string, fileIndex: object }` |
179
- | `file_index_error` | Ошибка при индексации файла | `{ projectId: string, filePath: string, message: string }` |
237
+ | `indexing_error` | Ошибка индексации | `{ projectId: string, message: string, code?: string, details?: any }` |
238
+ | `file_indexed` | Файл проиндексирован | `{ projectId: string, filePath: string, fileIndex: object }` |
239
+ | `file_index_error` | Ошибка индексации файла | `{ projectId: string, filePath: string, message: string }` |
180
240
 
181
- ## Обработка ошибок
182
-
183
- При работе с индексацией могут возникать различные ошибки. Вот типичные ошибки и способы их обработки:
184
-
185
- ### Ошибки HTTP API
241
+ ## Сценарии использования
186
242
 
187
- ```javascript
188
- try {
189
- await sdk.projects.indexProject(projectId);
190
- } catch (error) {
191
- if (error.status === 404) {
192
- console.error('Проект не найден');
193
- } else if (error.status === 409) {
194
- console.error('Индексация уже запущена для этого проекта');
195
- } else {
196
- console.error('Неизвестная ошибка:', error.message);
197
- }
198
- }
199
- ```
243
+ ### Индексация существующего проекта
200
244
 
201
- ### Ошибки WebSocket
245
+ Пример полного процесса индексации с использованием Promise:
202
246
 
203
247
  ```javascript
204
- // Подключение с обработкой ошибок
205
- try {
206
- await sdk.projects.connectWebSocket();
207
- } catch (error) {
208
- console.error('Ошибка подключения WebSocket:', error);
209
- }
210
-
211
- // Обработчик ошибок WebSocket
212
- sdk.projects.on('error', (error) => {
213
- console.error('Ошибка WebSocket:', error);
214
- });
215
-
216
- // Обработка отключения
217
- sdk.projects.on('disconnect', () => {
218
- console.log('WebSocket соединение прервано');
219
-
220
- // Автоматическое переподключение
221
- setTimeout(async () => {
248
+ async function indexProject(projectId) {
249
+ return new Promise(async (resolve, reject) => {
222
250
  try {
251
+ // Подключение к WebSocket
223
252
  await sdk.projects.connectWebSocket();
224
- console.log('Переподключено к WebSocket');
253
+
254
+ // Создаем объект для отслеживания прогресса
255
+ const progress = {
256
+ started: false,
257
+ percentage: 0,
258
+ filesIndexed: 0,
259
+ totalFiles: 0
260
+ };
261
+
262
+ // Установка обработчиков
263
+ sdk.projects.on('indexing_start', () => {
264
+ progress.started = true;
265
+ console.log('Индексация началась');
266
+ });
267
+
268
+ sdk.projects.on('indexing_progress', (data) => {
269
+ progress.percentage = data.progress;
270
+ progress.filesIndexed = data.indexedFiles;
271
+ progress.totalFiles = data.totalFiles;
272
+ console.log(`Прогресс: ${data.progress}%`);
273
+ });
274
+
275
+ sdk.projects.on('indexing_complete', (data) => {
276
+ console.log('Индексация завершена!');
277
+ sdk.projects.disconnectWebSocket();
278
+ resolve({
279
+ success: true,
280
+ projectId,
281
+ stats: {
282
+ totalFiles: data.totalFiles,
283
+ indexedFiles: data.indexedFiles,
284
+ totalTime: data.totalTime
285
+ }
286
+ });
287
+ });
288
+
289
+ sdk.projects.on('indexing_error', (error) => {
290
+ console.error(`Ошибка: ${error.message}`);
291
+ sdk.projects.disconnectWebSocket();
292
+ reject(new Error(error.message));
293
+ });
294
+
295
+ // Запуск индексации
296
+ await sdk.projects.indexProject(projectId);
297
+ console.log('Запрос на индексацию отправлен');
298
+
299
+ // Таймаут для защиты от зависания
300
+ setTimeout(() => {
301
+ if (!progress.started || progress.percentage < 100) {
302
+ sdk.projects.disconnectWebSocket();
303
+ reject(new Error('Таймаут индексации'));
304
+ }
305
+ }, 300000); // 5 минут
225
306
  } catch (error) {
226
- console.error('Не удалось переподключиться:', error);
307
+ sdk.projects.disconnectWebSocket();
308
+ reject(error);
227
309
  }
228
- }, 3000);
229
- });
230
- ```
310
+ });
311
+ }
231
312
 
232
- ## Примеры использования
313
+ // Использование
314
+ indexProject('your-project-id')
315
+ .then(result => console.log('Результат:', result))
316
+ .catch(error => console.error('Ошибка:', error));
317
+ ```
233
318
 
234
- ### Базовый пример индексации
319
+ ### Создание и индексация проекта по пути
235
320
 
236
321
  ```javascript
237
- // Инициализация SDK
238
- const sdk = new CodeSolverSDK({
239
- baseURL: 'https://localhost:3000',
240
- apiKey: 'your-api-key',
241
- websocket: {
242
- reconnect: true // Автоматическое переподключение
243
- }
244
- });
245
-
246
- // Запуск индексации
247
- async function indexProject(projectId) {
322
+ async function createAndIndexProjectByPath(projectPath, options = {}) {
248
323
  try {
249
- // Подключаемся к WebSocket пространству имен индексации
324
+ // Подключение к WebSocket
250
325
  await sdk.projects.connectWebSocket();
251
326
 
252
- // Устанавливаем обработчики событий
327
+ // Установка обработчиков
328
+ const cleanup = () => sdk.projects.disconnectWebSocket();
329
+
253
330
  sdk.projects.on('indexing_progress', (data) => {
254
331
  console.log(`Прогресс: ${data.progress}%`);
255
332
  });
256
333
 
257
- sdk.projects.on('indexing_complete', (data) => {
258
- console.log('Индексация завершена!');
334
+ sdk.projects.on('indexing_error', (error) => {
335
+ console.error(`Ошибка: ${error.message}`);
336
+ cleanup();
259
337
  });
260
338
 
261
- // Запускаем индексацию
262
- const result = await sdk.projects.indexProject(projectId);
263
- console.log('Индексация запущена:', result);
339
+ // Создание и индексация проекта
340
+ const result = await sdk.projects.createAndIndexProject(
341
+ projectPath,
342
+ {
343
+ name: options.name || path.basename(projectPath),
344
+ forceFull: options.forceFull || false,
345
+ excludePatterns: options.excludePatterns || ['node_modules', '.git']
346
+ }
347
+ );
264
348
 
265
- // Ждем завершения индексации
349
+ console.log(`Проект создан, ID: ${result.projectId}`);
350
+
351
+ // Ожидание завершения индексации
266
352
  return new Promise((resolve, reject) => {
267
353
  sdk.projects.on('indexing_complete', (data) => {
268
- sdk.projects.disconnectWebSocket();
269
- resolve(data);
354
+ console.log('Индексация завершена успешно!');
355
+ cleanup();
356
+ resolve({
357
+ projectId: result.projectId,
358
+ indexingStats: data
359
+ });
270
360
  });
271
361
 
272
- sdk.projects.on('indexing_error', (error) => {
273
- sdk.projects.disconnectWebSocket();
274
- reject(new Error(error.message));
275
- });
276
-
277
- // Таймаут на случай, если что-то пойдет не так
362
+ // Таймаут
278
363
  setTimeout(() => {
279
- sdk.projects.disconnectWebSocket();
280
- reject(new Error('Таймаут индексации'));
281
- }, 120000); // 2 минуты
364
+ cleanup();
365
+ reject(new Error('Таймаут ожидания индексации'));
366
+ }, 300000); // 5 минут
282
367
  });
283
368
  } catch (error) {
284
- console.error('Ошибка индексации:', error);
369
+ sdk.projects.disconnectWebSocket();
285
370
  throw error;
286
371
  }
287
372
  }
373
+
374
+ // Использование
375
+ createAndIndexProjectByPath('/path/to/project')
376
+ .then(result => console.log(`Проект ${result.projectId} успешно создан и проиндексирован`))
377
+ .catch(error => console.error(`Ошибка: ${error.message}`));
288
378
  ```
289
379
 
290
- ### Пример с отображением прогресс-бара
380
+ ### Интеграция с IDE
381
+
382
+ Пример интеграции в расширение VS Code/Cursor:
291
383
 
292
384
  ```javascript
293
- const progressBar = require('progress');
385
+ // Инициализация SDK в расширении
386
+ const sdk = new CodeSolverSDK({
387
+ baseURL: 'https://api.example.com',
388
+ apiKey: vscode.workspace.getConfiguration('mySolverExtension').get('apiKey'),
389
+ timeout: 15000
390
+ });
294
391
 
295
- async function indexWithProgressBar(projectId) {
296
- // Создаем прогресс-бар
297
- let bar = null;
298
-
299
- // Подключаемся к WebSocket
300
- await sdk.projects.connectWebSocket();
301
-
302
- // Устанавливаем обработчики событий
303
- sdk.projects.on('indexing_start', () => {
304
- console.log('Индексация началась...');
305
- });
306
-
307
- sdk.projects.on('indexing_progress', (data) => {
308
- if (!bar) {
309
- bar = new progressBar('Индексация [:bar] :percent :etas', {
310
- complete: '=',
311
- incomplete: ' ',
312
- width: 50,
313
- total: 100
314
- });
315
- }
316
-
317
- bar.update(data.progress / 100);
318
- });
319
-
320
- sdk.projects.on('indexing_complete', (data) => {
321
- if (bar) {
322
- bar.update(1.0); // Заполняем прогресс-бар
323
- }
324
- console.log(`\nИндексация завершена! Обработано ${data.indexedFiles} файлов за ${data.totalTime.toFixed(2)} секунд`);
325
- });
392
+ // Функция для индексации активного рабочего пространства
393
+ async function indexCurrentWorkspace() {
394
+ // Получаем текущую рабочую директорию
395
+ const workspaceFolders = vscode.workspace.workspaceFolders;
396
+ if (!workspaceFolders || workspaceFolders.length === 0) {
397
+ vscode.window.showErrorMessage('Откройте папку проекта для индексации');
398
+ return;
399
+ }
326
400
 
327
- // Запускаем индексацию
328
- await sdk.projects.indexProject(projectId);
401
+ const workspacePath = workspaceFolders[0].uri.fsPath;
402
+ const workspaceName = path.basename(workspacePath);
329
403
 
330
- // Возвращаем Promise, который разрешится при завершении индексации
331
- return new Promise((resolve, reject) => {
332
- sdk.projects.on('indexing_complete', (data) => {
404
+ // Показываем индикатор прогресса в VS Code
405
+ vscode.window.withProgress({
406
+ location: vscode.ProgressLocation.Notification,
407
+ title: 'Индексация проекта',
408
+ cancellable: true
409
+ }, async (progress, token) => {
410
+ // Обработчик отмены
411
+ token.onCancellationRequested(() => {
333
412
  sdk.projects.disconnectWebSocket();
334
- resolve(data);
413
+ vscode.window.showInformationMessage('Индексация отменена');
335
414
  });
336
415
 
337
- sdk.projects.on('indexing_error', (error) => {
416
+ try {
417
+ // Подключаем WebSocket
418
+ await sdk.projects.connectWebSocket();
419
+
420
+ // Начинаем индексацию
421
+ const result = await sdk.projects.createAndIndexProject(
422
+ workspacePath,
423
+ {
424
+ name: workspaceName,
425
+ excludePatterns: [
426
+ 'node_modules', '.git', 'dist', 'build',
427
+ ...vscode.workspace.getConfiguration('search').get('exclude')
428
+ ]
429
+ }
430
+ );
431
+
432
+ // Сохраняем ID проекта в настройках VS Code
433
+ await vscode.workspace.getConfiguration().update(
434
+ 'mySolverExtension.projectId',
435
+ result.projectId,
436
+ vscode.ConfigurationTarget.Workspace
437
+ );
438
+
439
+ progress.report({ message: 'Индексация началась...', increment: 5 });
440
+
441
+ // Мониторинг прогресса
442
+ sdk.projects.on('indexing_progress', (data) => {
443
+ progress.report({
444
+ message: `${data.progress}% (${data.indexedFiles}/${data.totalFiles})`,
445
+ increment: data.progress / 20 // для плавного обновления
446
+ });
447
+ });
448
+
449
+ // Возвращаем Promise, который разрешится при завершении
450
+ return new Promise((resolve) => {
451
+ sdk.projects.on('indexing_complete', () => {
452
+ sdk.projects.disconnectWebSocket();
453
+ vscode.window.showInformationMessage('Индексация успешно завершена!');
454
+ resolve();
455
+ });
456
+
457
+ sdk.projects.on('indexing_error', (error) => {
458
+ sdk.projects.disconnectWebSocket();
459
+ vscode.window.showErrorMessage(`Ошибка индексации: ${error.message}`);
460
+ resolve();
461
+ });
462
+ });
463
+ } catch (error) {
338
464
  sdk.projects.disconnectWebSocket();
339
- reject(new Error(error.message));
340
- });
465
+ vscode.window.showErrorMessage(`Ошибка: ${error.message}`);
466
+ }
341
467
  });
342
468
  }
469
+
470
+ // Регистрация команды в VS Code
471
+ context.subscriptions.push(
472
+ vscode.commands.registerCommand('mySolverExtension.indexProject', indexCurrentWorkspace)
473
+ );
343
474
  ```
344
475
 
345
- ### Инкрементальное обновление файлов при изменении
476
+ ### Наблюдение за файловой системой
477
+
478
+ Пример автоматического обновления индекса при изменении файлов:
346
479
 
347
480
  ```javascript
348
- const fs = require('fs');
349
- const path = require('path');
350
481
  const chokidar = require('chokidar');
482
+ const path = require('path');
351
483
 
352
- // Функция для наблюдения за изменениями в директории и инкрементальной индексации
353
- async function watchAndIndex(projectId, dirPath) {
354
- // Подключение WebSocket для получения уведомлений о индексации
484
+ async function watchAndIndex(projectId, projectPath) {
485
+ // Подключение WebSocket
355
486
  await sdk.projects.connectWebSocket();
356
487
 
357
- // Устанавливаем обработчики для отдельных файлов
488
+ // Установка обработчиков
358
489
  sdk.projects.on('file_indexed', (data) => {
359
490
  console.log(`Файл проиндексирован: ${data.filePath}`);
360
491
  });
361
492
 
362
- sdk.projects.on('file_index_error', (data) => {
363
- console.error(`Ошибка индексации файла ${data.filePath}: ${data.message}`);
364
- });
365
-
366
- // Создаем наблюдателя за файловой системой
367
- const watcher = chokidar.watch(dirPath, {
368
- ignored: /(^|[\/\\])\../, // Игнорировать скрытые файлы
493
+ // Настройка наблюдателя за файловой системой
494
+ const watcher = chokidar.watch(projectPath, {
495
+ ignored: [
496
+ /(^|[\/\\])\../, // скрытые файлы
497
+ '**/node_modules/**',
498
+ '**/dist/**',
499
+ '**/.git/**'
500
+ ],
369
501
  persistent: true,
370
502
  ignoreInitial: true
371
503
  });
372
504
 
373
- // При изменении файла, обновляем его индекс
505
+ // Обработка изменений файлов
374
506
  watcher.on('change', async (filePath) => {
375
507
  try {
376
- // Получаем путь относительно корня проекта
377
- const relPath = path.relative(dirPath, filePath);
508
+ // Получаем относительный путь
509
+ const relPath = path.relative(projectPath, filePath);
378
510
 
379
- console.log(`Файл изменился: ${relPath}`);
511
+ console.log(`Обнаружено изменение файла: ${relPath}`);
380
512
 
381
- // Обновляем индекс файла
513
+ // Обновляем индекс для измененного файла
382
514
  await sdk.projects.updateFileIndex(projectId, relPath);
383
-
384
- console.log(`Отправлен запрос на обновление индекса файла: ${relPath}`);
385
515
  } catch (error) {
386
- console.error(`Ошибка обновления индекса: ${error.message}`);
516
+ console.error(`Ошибка при обновлении индекса: ${error.message}`);
387
517
  }
388
518
  });
389
519
 
390
- console.log(`Наблюдение за директорией ${dirPath} началось`);
520
+ console.log(`Наблюдение за директорией ${projectPath} для проекта ${projectId} запущено`);
391
521
 
392
522
  // Возвращаем функцию для остановки наблюдения
393
- return () => {
394
- watcher.close();
395
- sdk.projects.disconnectWebSocket();
396
- console.log('Наблюдение остановлено');
523
+ return {
524
+ stop: () => {
525
+ watcher.close();
526
+ sdk.projects.disconnectWebSocket();
527
+ console.log(`Наблюдение за директорией ${projectPath} остановлено`);
528
+ }
397
529
  };
398
530
  }
531
+
532
+ // Использование
533
+ const projectId = 'your-project-id';
534
+ const projectPath = '/path/to/project';
535
+
536
+ const watcher = await watchAndIndex(projectId, projectPath);
537
+
538
+ // Позже можно остановить наблюдение
539
+ // watcher.stop();
540
+ ```
541
+
542
+ ## Обработка ошибок
543
+
544
+ При интеграции с SDK рекомендуется использовать надежную обработку ошибок.
545
+
546
+ ### Ошибки HTTP API
547
+
548
+ ```javascript
549
+ try {
550
+ await sdk.projects.indexProject(projectId);
551
+ } catch (error) {
552
+ // Проверка статус-кодов
553
+ if (error.status === 404) {
554
+ console.error('Проект не найден');
555
+ // Возможное создание нового проекта
556
+ const newProject = await sdk.projects.createProject('Новый проект', projectPath);
557
+ await sdk.projects.indexProject(newProject.id);
558
+ }
559
+ else if (error.status === 409) {
560
+ console.error('Индексация уже запущена');
561
+ // Можно проверить текущий статус
562
+ const status = await sdk.projects.getIndexingStatus(projectId);
563
+ console.log(`Текущий прогресс: ${status.progress}%`);
564
+ }
565
+ else if (error.status === 401 || error.status === 403) {
566
+ console.error('Ошибка авторизации. Проверьте API ключ');
567
+ }
568
+ else {
569
+ console.error('Неизвестная ошибка:', error.message);
570
+ }
571
+ }
572
+ ```
573
+
574
+ ### Надежное подключение к WebSocket
575
+
576
+ ```javascript
577
+ // Функция для надежного подключения с автоматическим переподключением
578
+ async function establishReliableConnection(projectId, maxRetries = 3) {
579
+ let retries = 0;
580
+ let connected = false;
581
+
582
+ while (!connected && retries < maxRetries) {
583
+ try {
584
+ await sdk.projects.connectWebSocket();
585
+ connected = sdk.projects.isWebSocketConnected();
586
+
587
+ if (connected) {
588
+ console.log('Подключение к WebSocket установлено');
589
+
590
+ // Обработка отключений
591
+ sdk.projects.on('disconnect', () => {
592
+ console.log('WebSocket соединение прервано, переподключение...');
593
+ setTimeout(() => {
594
+ sdk.projects.connectWebSocket().catch(e => {
595
+ console.error('Ошибка переподключения:', e.message);
596
+ });
597
+ }, 2000);
598
+ });
599
+
600
+ return true;
601
+ }
602
+
603
+ retries++;
604
+ console.log(`Не удалось подключиться, попытка ${retries}/${maxRetries}...`);
605
+ await new Promise(resolve => setTimeout(resolve, 1000 * retries));
606
+ } catch (error) {
607
+ retries++;
608
+ console.error(`Ошибка подключения: ${error.message}`);
609
+ await new Promise(resolve => setTimeout(resolve, 1000 * retries));
610
+ }
611
+ }
612
+
613
+ if (!connected) {
614
+ console.error('Не удалось установить WebSocket соединение после нескольких попыток');
615
+ return false;
616
+ }
617
+
618
+ return connected;
619
+ }
620
+
621
+ // Использование
622
+ await establishReliableConnection(projectId);
399
623
  ```
400
624
 
401
625
  Дополнительные примеры использования API индексации можно найти в файле `solver-sdk/examples/indexing-example.js`.