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.
- package/dist/cjs/api/projects-api.js +211 -0
- package/dist/cjs/api/projects-api.js.map +1 -1
- package/dist/esm/api/projects-api.js +211 -0
- package/dist/esm/api/projects-api.js.map +1 -1
- package/dist/types/api/projects-api.d.ts +76 -0
- package/dist/types/api/projects-api.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +8 -0
- package/dist/types/types/index.d.ts.map +1 -1
- package/docs/API_REFERENCE.md +296 -32
- package/docs/INTEGRATION_EXAMPLES.md +342 -0
- package/docs/README.md +84 -35
- package/docs/WEBSOCKET.md +144 -14
- package/docs/indexing/INDEXING.md +434 -210
- package/package.json +2 -2
|
@@ -5,20 +5,87 @@
|
|
|
5
5
|
## Содержание
|
|
6
6
|
|
|
7
7
|
- [Введение](#введение)
|
|
8
|
+
- [Быстрый старт](#быстрый-старт)
|
|
8
9
|
- [API для индексации](#api-для-индексации)
|
|
9
|
-
- [
|
|
10
|
+
- [Работа с проектами по ID](#работа-с-проектами-по-id)
|
|
11
|
+
- [Работа с проектами по пути](#работа-с-проектами-по-пути)
|
|
12
|
+
- [Инкрементальная индексация](#инкрементальная-индексация)
|
|
10
13
|
- [Отслеживание процесса индексации](#отслеживание-процесса-индексации)
|
|
11
|
-
- [
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
195
|
+
SDK предоставляет мощный механизм отслеживания процесса индексации в реальном времени через WebSocket соединения.
|
|
110
196
|
|
|
111
|
-
### Подключение к WebSocket
|
|
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
|
-
###
|
|
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` | Обновление прогресса
|
|
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` | Ошибка
|
|
178
|
-
| `file_indexed` |
|
|
179
|
-
| `file_index_error` | Ошибка
|
|
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
|
-
|
|
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
|
-
|
|
245
|
+
Пример полного процесса индексации с использованием Promise:
|
|
202
246
|
|
|
203
247
|
```javascript
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
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
|
-
|
|
307
|
+
sdk.projects.disconnectWebSocket();
|
|
308
|
+
reject(error);
|
|
227
309
|
}
|
|
228
|
-
}
|
|
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
|
-
|
|
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
|
-
//
|
|
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('
|
|
258
|
-
console.
|
|
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.
|
|
263
|
-
|
|
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
|
-
|
|
269
|
-
|
|
354
|
+
console.log('Индексация завершена успешно!');
|
|
355
|
+
cleanup();
|
|
356
|
+
resolve({
|
|
357
|
+
projectId: result.projectId,
|
|
358
|
+
indexingStats: data
|
|
359
|
+
});
|
|
270
360
|
});
|
|
271
361
|
|
|
272
|
-
|
|
273
|
-
sdk.projects.disconnectWebSocket();
|
|
274
|
-
reject(new Error(error.message));
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
// Таймаут на случай, если что-то пойдет не так
|
|
362
|
+
// Таймаут
|
|
278
363
|
setTimeout(() => {
|
|
279
|
-
|
|
280
|
-
reject(new Error('Таймаут индексации'));
|
|
281
|
-
},
|
|
364
|
+
cleanup();
|
|
365
|
+
reject(new Error('Таймаут ожидания индексации'));
|
|
366
|
+
}, 300000); // 5 минут
|
|
282
367
|
});
|
|
283
368
|
} catch (error) {
|
|
284
|
-
|
|
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
|
-
|
|
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
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
-
|
|
401
|
+
const workspacePath = workspaceFolders[0].uri.fsPath;
|
|
402
|
+
const workspaceName = path.basename(workspacePath);
|
|
329
403
|
|
|
330
|
-
//
|
|
331
|
-
|
|
332
|
-
|
|
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
|
-
|
|
413
|
+
vscode.window.showInformationMessage('Индексация отменена');
|
|
335
414
|
});
|
|
336
415
|
|
|
337
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
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(
|
|
508
|
+
// Получаем относительный путь
|
|
509
|
+
const relPath = path.relative(projectPath, filePath);
|
|
378
510
|
|
|
379
|
-
console.log(
|
|
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(`Ошибка
|
|
516
|
+
console.error(`Ошибка при обновлении индекса: ${error.message}`);
|
|
387
517
|
}
|
|
388
518
|
});
|
|
389
519
|
|
|
390
|
-
console.log(`Наблюдение за директорией ${
|
|
520
|
+
console.log(`Наблюдение за директорией ${projectPath} для проекта ${projectId} запущено`);
|
|
391
521
|
|
|
392
522
|
// Возвращаем функцию для остановки наблюдения
|
|
393
|
-
return
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
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`.
|