solver-sdk 1.7.2 → 1.7.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.
@@ -0,0 +1,183 @@
1
+ # Справочник WebSocket событий SDK
2
+
3
+ Этот документ содержит полный список WebSocket событий, используемых в SDK версии 1.7.2.
4
+
5
+ ## Содержание
6
+
7
+ - [Типы событий](#типы-событий)
8
+ - [События рассуждений и сессий](#события-рассуждений-и-сессий)
9
+ - [События контекста](#события-контекста)
10
+ - [События чата и мышления](#события-чата-и-мышления)
11
+ - [События разработки и тестирования](#события-разработки-и-тестирования)
12
+ - [События соединения](#события-соединения)
13
+ - [События индексации](#события-индексации)
14
+ - [События зависимостей](#события-зависимостей)
15
+ - [Использование событий](#использование-событий)
16
+ - [Низкоуровневое API](#низкоуровневое-api)
17
+ - [Высокоуровневое API](#высокоуровневое-api)
18
+ - [Диагностика ошибок](#диагностика-ошибок)
19
+
20
+ ## Типы событий
21
+
22
+ ### События рассуждений и сессий
23
+
24
+ | Константа SDK | Строковое значение | Описание | Данные |
25
+ |---------------|-------------------|----------|--------|
26
+ | `REASONING_CREATED` | `reasoning:created` | Создано новое рассуждение | `{ reasoningId: string, metadata?: object }` |
27
+ | `JOINED_REASONING` | `joined_reasoning` | Клиент присоединился к рассуждению | `{ reasoningId: string, success: boolean }` |
28
+ | `JOIN_REASONING` | `join_reasoning` | Запрос на присоединение к рассуждению | `{ reasoningId: string }` |
29
+ | `JOIN_RESPONSE` | `join_response` | Ответ на запрос присоединения | `{ success: boolean, reasoningId: string, error?: string }` |
30
+ | `JOIN` | `join` | Запрос на присоединение к пространству имен | `{ namespace: string }` |
31
+ | `JOINED` | `joined` | Успешное присоединение к пространству имен | `{ namespace: string, socketId: string }` |
32
+ | `REASONING_STATUS_UPDATE` | `reasoning_status_update` | Обновление статуса рассуждения | `{ reasoningId: string, status: string }` |
33
+ | `START_REASONING` | `start_reasoning` | Запрос на начало рассуждения | `{ reasoningId: string }` |
34
+ | `REASONING_STARTED` | `reasoning_started` | Рассуждение начато | `{ reasoningId: string, startTime: string }` |
35
+
36
+ ### События контекста
37
+
38
+ | Константа SDK | Строковое значение | Описание | Данные |
39
+ |---------------|-------------------|----------|--------|
40
+ | `UPDATE_CONTEXT_OPTIONS` | `update_context_options` | Обновление опций контекста | `{ reasoningId: string, options: ContextOptions }` |
41
+ | `ESTIMATE_CONTEXT` | `estimate_context` | Запрос на оценку контекста | `{ reasoningId: string, projectId: string }` |
42
+ | `CONTEXT_OPTIONS_UPDATED` | `context_options_updated` | Опции контекста обновлены | `{ reasoningId: string, options: ContextOptions }` |
43
+ | `CONTEXT_ESTIMATION` | `context_estimation` | Результат оценки контекста | `{ reasoningId: string, estimation: ContextEstimation }` |
44
+ | `SET_PROJECT_CONTEXT` | `set_project_context` | Установка контекста проекта | `{ reasoningId: string, projectId: string }` |
45
+ | `PROJECT_CONTEXT_SET` | `project_context_set` | Контекст проекта установлен | `{ reasoningId: string, projectId: string, success: boolean }` |
46
+
47
+ ### События чата и мышления
48
+
49
+ | Константа SDK | Строковое значение | Описание | Данные |
50
+ |---------------|-------------------|----------|--------|
51
+ | `CHAT_REQUEST` | `chat_request` | Запрос на чат | `{ reasoningId: string, messages: Message[] }` |
52
+ | `CHAT_STARTED` | `chat_started` | Начало обработки запроса чата | `{ reasoningId: string, requestId: string }` |
53
+ | `MESSAGE_START` | `message_start` | Начало сообщения от модели | `{ model: string, type: string, id: string }` |
54
+ | `CONTENT_BLOCK_START` | `content_block_start` | Начало блока контента | `{ index: number, type: string, id: string }` |
55
+ | `THINKING_DELTA` | `thinking_delta` | Фрагмент мышления | `{ text: string, index: number }` |
56
+ | `THINKING_BLOCK_DELTA` | `thinking_block_delta` | Дельта блока мышления | `{ delta: string, index: number }` |
57
+ | `TEXT_DELTA` | `text_delta` | Фрагмент текстового ответа | `{ text: string, index: number }` |
58
+ | `CONTENT_BLOCK_DELTA` | `content_block_delta` | Общая дельта блока контента | `{ delta: string, index: number, type: string }` |
59
+ | `CONTENT_BLOCK_STOP` | `content_block_stop` | Завершение блока контента | `{ index: number, type: string, id: string }` |
60
+ | `MESSAGE_STOP` | `message_stop` | Завершение сообщения | `{ type: string, id: string }` |
61
+ | `CHAT_COMPLETE` | `chat_complete` | Завершение чата | `{ reasoningId: string, requestId: string }` |
62
+
63
+ ### События разработки и тестирования
64
+
65
+ | Константа SDK | Строковое значение | Описание | Данные |
66
+ |---------------|-------------------|----------|--------|
67
+ | `TYPESCRIPT_ERRORS` | `typescript_errors` | Запрос на получение ошибок TypeScript | `{ reasoningId: string, projectId: string, files: string[] }` |
68
+ | `TYPESCRIPT_ERRORS_RECEIVED` | `typescript_errors_received` | Получены ошибки TypeScript | `{ reasoningId: string, errors: TypeScriptError[] }` |
69
+ | `CREATE_TEST_MODULES` | `create_test_modules` | Запрос на создание тестовых модулей | `{ reasoningId: string, files: string[] }` |
70
+ | `TEST_MODULES_CREATED` | `test_modules_created` | Тестовые модули созданы | `{ reasoningId: string, modules: TestModule[] }` |
71
+ | `ANALYZE_CODE` | `analyze_code` | Запрос на анализ кода | `{ reasoningId: string, code: string, language: string }` |
72
+ | `CODE_ANALYSIS` | `code_analysis` | Результат анализа кода | `{ reasoningId: string, analysis: CodeAnalysis }` |
73
+
74
+ ### События соединения
75
+
76
+ | Константа SDK | Строковое значение | Описание | Данные |
77
+ |---------------|-------------------|----------|--------|
78
+ | `AUTHENTICATE` | `authenticate` | Аутентификация клиента | `{ apiKey: string }` |
79
+ | `AUTHENTICATION_RESULT` | `authentication_result` | Результат аутентификации | `{ success: boolean, error?: string }` |
80
+ | `CONNECTION_PING` | `connection_ping` | Проверка активности соединения | `{ timestamp: number, id: string }` |
81
+ | `CONNECTION_PONG` | `connection_pong` | Ответ на проверку соединения | `{ timestamp: number, id: string, serverTime: number }` |
82
+ | `RECONNECT_TOKEN` | `reconnect_token` | Токен для переподключения | `{ token: string, namespace: string }` |
83
+ | `DISCONNECT` | `disconnect` | Отключение от сервера | `{ reason: string }` |
84
+ | `ERROR` | `error` | Ошибка соединения | `{ message: string, code?: string, details?: any }` |
85
+ | `CONNECTION_TIMEOUT` | `connection_timeout` | Таймаут соединения | `{ namespace: string, lastPingTime: number }` |
86
+
87
+ ### События индексации
88
+
89
+ | Константа SDK | Строковое значение | Описание | Данные |
90
+ |---------------|-------------------|----------|--------|
91
+ | `INDEXING_START` | `indexing_start` | Начало процесса индексации | `{ projectId: string }` |
92
+ | `INDEXING_PROGRESS` | `indexing_progress` | Обновление прогресса индексации | `{ projectId: string, totalFiles: number, indexedFiles: number, progress: number }` |
93
+ | `INDEXING_COMPLETE` | `indexing_complete` | Завершение индексации | `{ projectId: string, totalFiles: number, indexedFiles: number }` |
94
+ | `INDEXING_ERROR` | `indexing_error` | Ошибка при индексации | `{ projectId: string, message: string }` |
95
+ | `FILE_INDEXED` | `file_indexed` | Отдельный файл проиндексирован | `{ projectId: string, filePath: string, fileIndex: object }` |
96
+ | `FILE_INDEX_ERROR` | `file_index_error` | Ошибка при индексации файла | `{ projectId: string, filePath: string, message: string }` |
97
+
98
+ ### События зависимостей
99
+
100
+ | Константа SDK | Строковое значение | Описание | Данные |
101
+ |---------------|-------------------|----------|--------|
102
+ | `DEPENDENCY_UPDATE` | `dependency_update` | Обновление зависимостей | `{ projectId: string, files: string[], type: string }` |
103
+ | `DEPENDENCY_ANALYSIS` | `dependency_analysis` | Анализ зависимостей | `{ projectId: string, analysis: DependencyAnalysis }` |
104
+ | `DEPENDENCY_GRAPH_READY` | `dependency_graph_ready` | Граф зависимостей готов | `{ projectId: string, nodes: number, edges: number }` |
105
+ | `DEPENDENCY_CYCLE_FOUND` | `dependency_cycle_found` | Найден цикл в зависимостях | `{ projectId: string, cycle: string[] }` |
106
+
107
+ ## Использование событий
108
+
109
+ ### Низкоуровневое API
110
+
111
+ Для работы с событиями через низкоуровневое API WebSocket клиента:
112
+
113
+ ```javascript
114
+ const wsClient = sdk.getWebSocketClient();
115
+
116
+ // Подписка на событие
117
+ wsClient.on('thinking_delta', (data) => {
118
+ console.log('Получен фрагмент мышления:', data.text);
119
+ });
120
+
121
+ // Отправка события
122
+ wsClient.emit('join_reasoning', { reasoningId: 'my-reasoning-id' });
123
+
124
+ // Отправка события с ожиданием ответа
125
+ const response = await wsClient.emitWithResponse('join_reasoning',
126
+ { reasoningId: 'my-reasoning-id' },
127
+ 'join_response', // Тип ожидаемого ответа
128
+ 10000 // Таймаут в миллисекундах
129
+ );
130
+ ```
131
+
132
+ ### Высокоуровневое API
133
+
134
+ Для работы с событиями через высокоуровневое API модулей SDK (версия 1.7.2+):
135
+
136
+ ```javascript
137
+ // Чат и рассуждения
138
+ await sdk.chat.connectWebSocket();
139
+ sdk.chat.on('thinking_delta', (data) => {
140
+ console.log('Фрагмент мышления:', data.text);
141
+ });
142
+
143
+ // Зависимости
144
+ await sdk.dependencies.connectWebSocket(projectId);
145
+ sdk.dependencies.on('dependency_update', (data) => {
146
+ console.log('Обновление зависимостей:', data);
147
+ });
148
+
149
+ // Проекты и индексация
150
+ await sdk.projects.connectWebSocket();
151
+ sdk.projects.on('indexing_progress', (data) => {
152
+ console.log('Прогресс индексации:', data.progress);
153
+ });
154
+ ```
155
+
156
+ ## Диагностика ошибок
157
+
158
+ Возможные причины проблем с событиями WebSocket:
159
+
160
+ 1. **Неверный формат события** - убедитесь, что отправляете корректные данные в соответствии с ожидаемой структурой.
161
+ 2. **Неправильный порядок событий** - некоторые события должны следовать в определенном порядке (например, `authenticate` → `join` → `join_reasoning`).
162
+ 3. **Таймауты** - события с ожиданием ответа могут завершиться ошибкой по таймауту.
163
+ 4. **Разрыв соединения** - проверьте стабильность соединения с помощью механизма ping/pong.
164
+
165
+ Для диагностики используйте:
166
+
167
+ ```javascript
168
+ // Включение расширенного логирования
169
+ const sdk = new CodeSolverSDK({
170
+ websocket: {
171
+ debug: true
172
+ }
173
+ });
174
+
175
+ // Диагностика соединения
176
+ const diagnostics = sdk.getWebSocketClient().diagnoseConnection(WebSocketNamespace.REASONING);
177
+ console.log('Диагностика:', diagnostics);
178
+
179
+ // Мониторинг всех событий
180
+ sdk.getWebSocketClient().onAny((eventName, ...args) => {
181
+ console.log(`Событие ${eventName}:`, args);
182
+ });
183
+ ```
@@ -0,0 +1,401 @@
1
+ # Индексация проектов в Solver SDK
2
+
3
+ Данный документ описывает процесс индексации проектов через SDK и отслеживания этого процесса с помощью WebSocket соединений.
4
+
5
+ ## Содержание
6
+
7
+ - [Введение](#введение)
8
+ - [API для индексации](#api-для-индексации)
9
+ - [Инкрементальная индексация](#инкрементальная-индексация)
10
+ - [Отслеживание процесса индексации](#отслеживание-процесса-индексации)
11
+ - [События WebSocket](#события-websocket)
12
+ - [Обработка ошибок](#обработка-ошибок)
13
+ - [Примеры использования](#примеры-использования)
14
+
15
+ ## Введение
16
+
17
+ Индексация проекта - это процесс сканирования и анализа файлов проекта для дальнейшего поиска и обработки информации. Solver SDK предоставляет набор методов для управления индексацией проектов и отслеживания этого процесса.
18
+
19
+ ## API для индексации
20
+
21
+ ### Основные методы
22
+
23
+ | Метод | Описание |
24
+ |-------|----------|
25
+ | `sdk.projects.indexProject(projectId, options)` | Запускает индексацию проекта |
26
+ | `sdk.projects.stopIndexing(projectId)` | Останавливает индексацию проекта |
27
+ | `sdk.projects.getIndexingStatus(projectId)` | Получает текущий статус индексации |
28
+ | `sdk.projects.updateFileIndex(projectId, filePath, options)` | Обновляет индекс конкретного файла |
29
+
30
+ ### Пример использования API
31
+
32
+ ```javascript
33
+ // Запуск индексации
34
+ const result = await sdk.projects.indexProject(projectId, {
35
+ forceFull: false, // true для принудительной полной переиндексации
36
+ includePatterns: ['**/*.js', '**/*.ts'], // glob паттерны для включения файлов
37
+ excludePatterns: ['**/node_modules/**'] // glob паттерны для исключения файлов
38
+ });
39
+ console.log('Индексация запущена. Задача:', result.taskId);
40
+
41
+ // Получение статуса индексации
42
+ const status = await sdk.projects.getIndexingStatus(projectId);
43
+ console.log(`Статус: ${status.status}, прогресс: ${status.progress}%`);
44
+
45
+ // Остановка индексации
46
+ await sdk.projects.stopIndexing(projectId);
47
+ console.log('Индексация остановлена');
48
+ ```
49
+
50
+ ## Инкрементальная индексация
51
+
52
+ В SDK версии 1.7.2 добавлена поддержка инкрементальной индексации отдельных файлов, что позволяет обновлять только изменившиеся файлы без необходимости переиндексации всего проекта.
53
+
54
+ ### Обновление индекса отдельного файла
55
+
56
+ ```javascript
57
+ // Обновление индекса файла с передачей содержимого
58
+ const result = await sdk.projects.updateFileIndex(
59
+ projectId,
60
+ 'src/components/App.js',
61
+ {
62
+ content: 'console.log("Hello World");', // содержимое файла
63
+ force: false // true для принудительного обновления
64
+ }
65
+ );
66
+
67
+ console.log(`Файл ${result.filePath} успешно проиндексирован`);
68
+ console.log(`Метаданные файла:`, result.fileIndex);
69
+
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
+ // Обновление индекса без передачи содержимого
83
+ // SDK прочитает файл с диска
84
+ const result = await sdk.projects.updateFileIndex(projectId, 'src/components/App.js');
85
+
86
+ console.log(`Файл ${result.filePath} успешно проиндексирован`);
87
+ ```
88
+
89
+ ### Пакетное обновление нескольких файлов
90
+
91
+ ```javascript
92
+ // Обновление нескольких файлов
93
+ const filesToUpdate = [
94
+ { path: 'src/components/App.js' },
95
+ { path: 'src/utils/helpers.js', content: 'export function helper() {}' }
96
+ ];
97
+
98
+ const results = await Promise.all(
99
+ filesToUpdate.map(file =>
100
+ sdk.projects.updateFileIndex(projectId, file.path, { content: file.content })
101
+ )
102
+ );
103
+
104
+ console.log(`Обновлено ${results.length} файлов`);
105
+ ```
106
+
107
+ ## Отслеживание процесса индексации
108
+
109
+ Для отслеживания процесса индексации в реальном времени используется WebSocket соединение. SDK предоставляет методы для подключения к серверу и получения событий о ходе индексации.
110
+
111
+ ### Подключение к WebSocket (версия 1.7.2)
112
+
113
+ ```javascript
114
+ // Прямое подключение к пространству имен индексации
115
+ await sdk.projects.connectWebSocket();
116
+
117
+ // Проверка подключения
118
+ if (sdk.projects.isWebSocketConnected()) {
119
+ console.log('Успешно подключено к WebSocket серверу');
120
+ } else {
121
+ console.error('Не удалось подключиться к WebSocket серверу');
122
+ }
123
+ ```
124
+
125
+ ### Установка обработчиков событий
126
+
127
+ ```javascript
128
+ // Установка обработчиков событий
129
+ sdk.projects.on('indexing_start', (data) => {
130
+ console.log(`Индексация началась для проекта: ${data.projectId}`);
131
+ });
132
+
133
+ sdk.projects.on('indexing_progress', (data) => {
134
+ console.log(`Прогресс: ${data.progress}% (${data.indexedFiles}/${data.totalFiles} файлов)`);
135
+ });
136
+
137
+ sdk.projects.on('indexing_complete', (data) => {
138
+ console.log(`Индексация завершена! Проиндексировано ${data.indexedFiles} файлов`);
139
+ });
140
+
141
+ sdk.projects.on('indexing_error', (data) => {
142
+ 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}`);
151
+ });
152
+ ```
153
+
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
+ При индексации проектов сервер отправляет следующие типы событий:
171
+
172
+ | Событие | Описание | Данные |
173
+ |---------|----------|--------|
174
+ | `indexing_start` | Начало процесса индексации | `{ projectId: string }` |
175
+ | `indexing_progress` | Обновление прогресса индексации | `{ projectId: string, totalFiles: number, indexedFiles: number, progress: number, startTime: string, elapsedTime: number, estimatedTimeRemaining?: number }` |
176
+ | `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 }` |
180
+
181
+ ## Обработка ошибок
182
+
183
+ При работе с индексацией могут возникать различные ошибки. Вот типичные ошибки и способы их обработки:
184
+
185
+ ### Ошибки HTTP API
186
+
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
+ ```
200
+
201
+ ### Ошибки WebSocket
202
+
203
+ ```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 () => {
222
+ try {
223
+ await sdk.projects.connectWebSocket();
224
+ console.log('Переподключено к WebSocket');
225
+ } catch (error) {
226
+ console.error('Не удалось переподключиться:', error);
227
+ }
228
+ }, 3000);
229
+ });
230
+ ```
231
+
232
+ ## Примеры использования
233
+
234
+ ### Базовый пример индексации
235
+
236
+ ```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) {
248
+ try {
249
+ // Подключаемся к WebSocket пространству имен индексации
250
+ await sdk.projects.connectWebSocket();
251
+
252
+ // Устанавливаем обработчики событий
253
+ sdk.projects.on('indexing_progress', (data) => {
254
+ console.log(`Прогресс: ${data.progress}%`);
255
+ });
256
+
257
+ sdk.projects.on('indexing_complete', (data) => {
258
+ console.log('Индексация завершена!');
259
+ });
260
+
261
+ // Запускаем индексацию
262
+ const result = await sdk.projects.indexProject(projectId);
263
+ console.log('Индексация запущена:', result);
264
+
265
+ // Ждем завершения индексации
266
+ return new Promise((resolve, reject) => {
267
+ sdk.projects.on('indexing_complete', (data) => {
268
+ sdk.projects.disconnectWebSocket();
269
+ resolve(data);
270
+ });
271
+
272
+ sdk.projects.on('indexing_error', (error) => {
273
+ sdk.projects.disconnectWebSocket();
274
+ reject(new Error(error.message));
275
+ });
276
+
277
+ // Таймаут на случай, если что-то пойдет не так
278
+ setTimeout(() => {
279
+ sdk.projects.disconnectWebSocket();
280
+ reject(new Error('Таймаут индексации'));
281
+ }, 120000); // 2 минуты
282
+ });
283
+ } catch (error) {
284
+ console.error('Ошибка индексации:', error);
285
+ throw error;
286
+ }
287
+ }
288
+ ```
289
+
290
+ ### Пример с отображением прогресс-бара
291
+
292
+ ```javascript
293
+ const progressBar = require('progress');
294
+
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
+ });
326
+
327
+ // Запускаем индексацию
328
+ await sdk.projects.indexProject(projectId);
329
+
330
+ // Возвращаем Promise, который разрешится при завершении индексации
331
+ return new Promise((resolve, reject) => {
332
+ sdk.projects.on('indexing_complete', (data) => {
333
+ sdk.projects.disconnectWebSocket();
334
+ resolve(data);
335
+ });
336
+
337
+ sdk.projects.on('indexing_error', (error) => {
338
+ sdk.projects.disconnectWebSocket();
339
+ reject(new Error(error.message));
340
+ });
341
+ });
342
+ }
343
+ ```
344
+
345
+ ### Инкрементальное обновление файлов при изменении
346
+
347
+ ```javascript
348
+ const fs = require('fs');
349
+ const path = require('path');
350
+ const chokidar = require('chokidar');
351
+
352
+ // Функция для наблюдения за изменениями в директории и инкрементальной индексации
353
+ async function watchAndIndex(projectId, dirPath) {
354
+ // Подключение WebSocket для получения уведомлений о индексации
355
+ await sdk.projects.connectWebSocket();
356
+
357
+ // Устанавливаем обработчики для отдельных файлов
358
+ sdk.projects.on('file_indexed', (data) => {
359
+ console.log(`Файл проиндексирован: ${data.filePath}`);
360
+ });
361
+
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: /(^|[\/\\])\../, // Игнорировать скрытые файлы
369
+ persistent: true,
370
+ ignoreInitial: true
371
+ });
372
+
373
+ // При изменении файла, обновляем его индекс
374
+ watcher.on('change', async (filePath) => {
375
+ try {
376
+ // Получаем путь относительно корня проекта
377
+ const relPath = path.relative(dirPath, filePath);
378
+
379
+ console.log(`Файл изменился: ${relPath}`);
380
+
381
+ // Обновляем индекс файла
382
+ await sdk.projects.updateFileIndex(projectId, relPath);
383
+
384
+ console.log(`Отправлен запрос на обновление индекса файла: ${relPath}`);
385
+ } catch (error) {
386
+ console.error(`Ошибка обновления индекса: ${error.message}`);
387
+ }
388
+ });
389
+
390
+ console.log(`Наблюдение за директорией ${dirPath} началось`);
391
+
392
+ // Возвращаем функцию для остановки наблюдения
393
+ return () => {
394
+ watcher.close();
395
+ sdk.projects.disconnectWebSocket();
396
+ console.log('Наблюдение остановлено');
397
+ };
398
+ }
399
+ ```
400
+
401
+ Дополнительные примеры использования API индексации можно найти в файле `solver-sdk/examples/indexing-example.js`.