solver-sdk 1.7.6 → 1.7.8
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 +65 -4
- package/dist/cjs/api/projects-api.js.map +1 -1
- package/dist/cjs/code-solver-sdk.js +1 -1
- package/dist/cjs/utils/code-solver-websocket-client.js +14 -6
- package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/cjs/utils/reasoning-auth-helper.js +58 -0
- package/dist/cjs/utils/reasoning-auth-helper.js.map +1 -0
- package/dist/esm/api/projects-api.js +65 -4
- package/dist/esm/api/projects-api.js.map +1 -1
- package/dist/esm/code-solver-sdk.js +1 -1
- package/dist/esm/utils/code-solver-websocket-client.js +14 -6
- package/dist/esm/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/esm/utils/reasoning-auth-helper.js +54 -0
- package/dist/esm/utils/reasoning-auth-helper.js.map +1 -0
- package/dist/types/api/projects-api.d.ts +38 -1
- package/dist/types/api/projects-api.d.ts.map +1 -1
- package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -1
- package/dist/types/utils/reasoning-auth-helper.d.ts +24 -0
- package/dist/types/utils/reasoning-auth-helper.d.ts.map +1 -0
- package/docs/indexing/INDEXING.md +156 -550
- package/package.json +1 -1
|
@@ -1,625 +1,231 @@
|
|
|
1
|
-
# Индексация проектов
|
|
1
|
+
# Индексация проектов
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Это руководство описывает, как использовать SDK для индексации проектов и отдельных файлов.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Инициализация SDK
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- [Быстрый старт](#быстрый-старт)
|
|
9
|
-
- [API для индексации](#api-для-индексации)
|
|
10
|
-
- [Работа с проектами по ID](#работа-с-проектами-по-id)
|
|
11
|
-
- [Работа с проектами по пути](#работа-с-проектами-по-пути)
|
|
12
|
-
- [Инкрементальная индексация](#инкрементальная-индексация)
|
|
13
|
-
- [Отслеживание процесса индексации](#отслеживание-процесса-индексации)
|
|
14
|
-
- [Подключение к WebSocket](#подключение-к-websocket)
|
|
15
|
-
- [События WebSocket](#события-websocket)
|
|
16
|
-
- [Сценарии использования](#сценарии-использования)
|
|
17
|
-
- [Индексация существующего проекта](#индексация-существующего-проекта)
|
|
18
|
-
- [Создание и индексация проекта по пути](#создание-и-индексация-проекта-по-пути)
|
|
19
|
-
- [Интеграция с IDE](#интеграция-с-ide)
|
|
20
|
-
- [Наблюдение за файловой системой](#наблюдение-за-файловой-системой)
|
|
21
|
-
- [Обработка ошибок](#обработка-ошибок)
|
|
7
|
+
Прежде чем использовать функции индексации, необходимо инициализировать SDK с указанием API ключа:
|
|
22
8
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
Индексация проекта - это процесс сканирования и анализа файлов проекта для дальнейшего поиска и обработки информации. Solver SDK предоставляет набор методов для создания проектов, управления индексацией и отслеживания этого процесса в реальном времени через WebSocket соединения.
|
|
26
|
-
|
|
27
|
-
## Быстрый старт
|
|
28
|
-
|
|
29
|
-
Вот простой пример, как создать и проиндексировать проект, используя SDK:
|
|
30
|
-
|
|
31
|
-
```javascript
|
|
9
|
+
```typescript
|
|
32
10
|
import { CodeSolverSDK } from 'solver-sdk';
|
|
33
|
-
import path from 'path';
|
|
34
11
|
|
|
35
|
-
// 1. Инициализация SDK
|
|
36
12
|
const sdk = new CodeSolverSDK({
|
|
37
13
|
baseURL: 'https://api.example.com',
|
|
38
|
-
apiKey: '
|
|
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} для поиска`);
|
|
14
|
+
apiKey: 'ваш_api_ключ', // API ключ обязателен для авторизации WebSocket соединений
|
|
81
15
|
});
|
|
82
16
|
```
|
|
83
17
|
|
|
84
|
-
##
|
|
85
|
-
|
|
86
|
-
SDK предоставляет два способа работы с проектами: по ID проекта и по пути к проекту на диске.
|
|
18
|
+
## Индексация проекта
|
|
87
19
|
|
|
88
|
-
###
|
|
20
|
+
### Запуск индексации
|
|
89
21
|
|
|
90
|
-
|
|
91
|
-
|-------|----------|
|
|
92
|
-
| `sdk.projects.indexProject(projectId, options)` | Запускает индексацию проекта |
|
|
93
|
-
| `sdk.projects.stopIndexing(projectId)` | Останавливает индексацию проекта |
|
|
94
|
-
| `sdk.projects.getIndexingStatus(projectId)` | Получает текущий статус индексации |
|
|
95
|
-
| `sdk.projects.updateFileIndex(projectId, filePath, options)` | Обновляет индекс конкретного файла |
|
|
22
|
+
Для запуска индексации проекта используйте метод `indexProject` или его псевдоним `startIndexing`:
|
|
96
23
|
|
|
97
|
-
|
|
24
|
+
```typescript
|
|
25
|
+
// Полная индексация проекта
|
|
26
|
+
await sdk.projects.indexProject('идентификатор_проекта', {
|
|
27
|
+
indexingMode: 'full'
|
|
28
|
+
});
|
|
98
29
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
forceFull: false, // true для принудительной полной переиндексации
|
|
103
|
-
includePatterns: ['**/*.js', '**/*.ts'], // glob паттерны для включения файлов
|
|
104
|
-
excludePatterns: ['**/node_modules/**'] // glob паттерны для исключения файлов
|
|
30
|
+
// Инкрементальная индексация (только изменившиеся файлы)
|
|
31
|
+
await sdk.projects.indexProject('идентификатор_проекта', {
|
|
32
|
+
indexingMode: 'incremental'
|
|
105
33
|
});
|
|
106
|
-
console.log('Индексация запущена. Задача:', result.taskId);
|
|
107
34
|
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
35
|
+
// Автоматический выбор режима индексации (рекомендуется)
|
|
36
|
+
await sdk.projects.indexProject('идентификатор_проекта', {
|
|
37
|
+
indexingMode: 'auto'
|
|
38
|
+
});
|
|
111
39
|
|
|
112
|
-
//
|
|
113
|
-
await sdk.projects.
|
|
114
|
-
|
|
40
|
+
// Псевдоним startIndexing (работает аналогично indexProject)
|
|
41
|
+
await sdk.projects.startIndexing('идентификатор_проекта', {
|
|
42
|
+
indexingMode: 'auto'
|
|
43
|
+
});
|
|
115
44
|
```
|
|
116
45
|
|
|
117
|
-
###
|
|
46
|
+
### Режимы индексации
|
|
118
47
|
|
|
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)` | Проверяет существование проекта и при необходимости создает резервную копию |
|
|
48
|
+
SDK поддерживает следующие режимы индексации:
|
|
125
49
|
|
|
126
|
-
|
|
50
|
+
- **full** - полная переиндексация всех файлов проекта
|
|
51
|
+
- **incremental** - индексация только изменившихся файлов (более быстрая)
|
|
52
|
+
- **auto** - автоматический выбор режима на основе метаданных проекта
|
|
127
53
|
|
|
128
|
-
|
|
129
|
-
// Получить проект по пути (создать, если не существует)
|
|
130
|
-
const project = await sdk.projects.getOrCreateProject(
|
|
131
|
-
'/path/to/project',
|
|
132
|
-
'Название проекта' // опционально
|
|
133
|
-
);
|
|
134
|
-
console.log(`Проект ID: ${project.id}`);
|
|
54
|
+
Вы также можете использовать флаг `forceFull` для принудительной полной индексации:
|
|
135
55
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
forceFull: true
|
|
139
|
-
excludePatterns: ['node_modules', '.git']
|
|
56
|
+
```typescript
|
|
57
|
+
await sdk.projects.indexProject('идентификатор_проекта', {
|
|
58
|
+
forceFull: true
|
|
140
59
|
});
|
|
141
|
-
|
|
60
|
+
```
|
|
142
61
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
62
|
+
### Фильтрация файлов
|
|
63
|
+
|
|
64
|
+
Можно указать шаблоны включения и исключения файлов:
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
await sdk.projects.indexProject('идентификатор_проекта', {
|
|
68
|
+
indexingMode: 'auto',
|
|
69
|
+
includePatterns: ['**/*.js', '**/*.ts', '**/*.jsx', '**/*.tsx'],
|
|
70
|
+
excludePatterns: ['**/node_modules/**', '**/dist/**', '**/build/**']
|
|
148
71
|
});
|
|
149
|
-
console.log(`Проект ${result.projectId} создан и индексируется`);
|
|
150
72
|
```
|
|
151
73
|
|
|
152
|
-
|
|
74
|
+
## Обновление индекса отдельных файлов
|
|
153
75
|
|
|
154
|
-
|
|
76
|
+
Для индексации одного файла используйте метод `updateFileIndex`:
|
|
155
77
|
|
|
156
|
-
```
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
'
|
|
78
|
+
```typescript
|
|
79
|
+
// Индексация файла с чтением его содержимого с диска
|
|
80
|
+
await sdk.projects.updateFileIndex(
|
|
81
|
+
'идентификатор_проекта',
|
|
82
|
+
'путь/к/файлу.js'
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
// Индексация с передачей содержимого файла
|
|
86
|
+
await sdk.projects.updateFileIndex(
|
|
87
|
+
'идентификатор_проекта',
|
|
88
|
+
'путь/к/файлу.js',
|
|
161
89
|
{
|
|
162
|
-
content: '
|
|
163
|
-
force:
|
|
90
|
+
content: 'содержимое файла',
|
|
91
|
+
force: true // Принудительная индексация, даже если файл не изменился
|
|
164
92
|
}
|
|
165
93
|
);
|
|
166
94
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
```javascript
|
|
178
|
-
// Обновление нескольких файлов
|
|
179
|
-
const filesToUpdate = [
|
|
180
|
-
{ path: 'src/components/App.js' },
|
|
181
|
-
{ path: 'src/utils/helpers.js', content: 'export function helper() {}' }
|
|
182
|
-
];
|
|
183
|
-
|
|
184
|
-
const results = await Promise.all(
|
|
185
|
-
filesToUpdate.map(file =>
|
|
186
|
-
sdk.projects.updateFileIndex(projectId, file.path, { content: file.content })
|
|
187
|
-
)
|
|
95
|
+
// С дополнительными опциями
|
|
96
|
+
await sdk.projects.updateFileIndex(
|
|
97
|
+
'идентификатор_проекта',
|
|
98
|
+
'путь/к/файлу.ts',
|
|
99
|
+
{
|
|
100
|
+
content: 'содержимое файла',
|
|
101
|
+
language: 'typescript', // Явное указание языка
|
|
102
|
+
updateDependencies: true // Обновление зависимостей после индексации
|
|
103
|
+
}
|
|
188
104
|
);
|
|
189
|
-
|
|
190
|
-
console.log(`Обновлено ${results.length} файлов`);
|
|
191
105
|
```
|
|
192
106
|
|
|
193
|
-
##
|
|
194
|
-
|
|
195
|
-
SDK предоставляет мощный механизм отслеживания процесса индексации в реальном времени через WebSocket соединения.
|
|
107
|
+
## Работа с новыми проектами
|
|
196
108
|
|
|
197
|
-
###
|
|
198
|
-
|
|
199
|
-
```javascript
|
|
200
|
-
// Подключение к WebSocket для событий индексации
|
|
201
|
-
await sdk.projects.connectWebSocket();
|
|
109
|
+
### Создание и индексация проекта
|
|
202
110
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
// Установка обработчиков событий
|
|
211
|
-
sdk.projects.on('indexing_start', (data) => {
|
|
212
|
-
console.log(`Индексация началась для проекта: ${data.projectId}`);
|
|
111
|
+
```typescript
|
|
112
|
+
// Создание проекта и немедленная индексация
|
|
113
|
+
const result = await sdk.projects.createAndIndexProject('/путь/к/проекту', {
|
|
114
|
+
name: 'Название проекта',
|
|
115
|
+
indexingMode: 'full',
|
|
116
|
+
excludePatterns: ['**/node_modules/**', '**/dist/**']
|
|
213
117
|
});
|
|
214
118
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
119
|
+
console.log(`Проект создан с ID: ${result.projectId}`);
|
|
120
|
+
console.log(`Статус индексации: ${result.indexingStatus}`);
|
|
121
|
+
```
|
|
218
122
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
123
|
+
### Поиск или создание проекта
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
// Найти существующий проект или создать новый
|
|
127
|
+
const project = await sdk.projects.getOrCreateProject('/путь/к/проекту', 'Название проекта');
|
|
128
|
+
console.log(`ID проекта: ${project.id}`);
|
|
223
129
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
130
|
+
// После получения проекта можно запустить индексацию
|
|
131
|
+
await sdk.projects.indexProject(project.id, {
|
|
132
|
+
indexingMode: 'auto'
|
|
227
133
|
});
|
|
228
134
|
```
|
|
229
135
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
| Событие | Описание | Данные |
|
|
233
|
-
|---------|----------|--------|
|
|
234
|
-
| `indexing_start` | Начало процесса индексации | `{ projectId: string }` |
|
|
235
|
-
| `indexing_progress` | Обновление прогресса | `{ projectId: string, totalFiles: number, indexedFiles: number, progress: number, startTime: string, elapsedTime: number, estimatedTimeRemaining?: number }` |
|
|
236
|
-
| `indexing_complete` | Завершение индексации | `{ projectId: string, totalFiles: number, indexedFiles: number, skippedFiles: number, startTime: string, endTime: string, totalTime: number }` |
|
|
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 }` |
|
|
240
|
-
|
|
241
|
-
## Сценарии использования
|
|
242
|
-
|
|
243
|
-
### Индексация существующего проекта
|
|
244
|
-
|
|
245
|
-
Пример полного процесса индексации с использованием Promise:
|
|
246
|
-
|
|
247
|
-
```javascript
|
|
248
|
-
async function indexProject(projectId) {
|
|
249
|
-
return new Promise(async (resolve, reject) => {
|
|
250
|
-
try {
|
|
251
|
-
// Подключение к WebSocket
|
|
252
|
-
await sdk.projects.connectWebSocket();
|
|
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 минут
|
|
306
|
-
} catch (error) {
|
|
307
|
-
sdk.projects.disconnectWebSocket();
|
|
308
|
-
reject(error);
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// Использование
|
|
314
|
-
indexProject('your-project-id')
|
|
315
|
-
.then(result => console.log('Результат:', result))
|
|
316
|
-
.catch(error => console.error('Ошибка:', error));
|
|
317
|
-
```
|
|
136
|
+
## Управление индексацией
|
|
318
137
|
|
|
319
|
-
###
|
|
320
|
-
|
|
321
|
-
```javascript
|
|
322
|
-
async function createAndIndexProjectByPath(projectPath, options = {}) {
|
|
323
|
-
try {
|
|
324
|
-
// Подключение к WebSocket
|
|
325
|
-
await sdk.projects.connectWebSocket();
|
|
326
|
-
|
|
327
|
-
// Установка обработчиков
|
|
328
|
-
const cleanup = () => sdk.projects.disconnectWebSocket();
|
|
329
|
-
|
|
330
|
-
sdk.projects.on('indexing_progress', (data) => {
|
|
331
|
-
console.log(`Прогресс: ${data.progress}%`);
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
sdk.projects.on('indexing_error', (error) => {
|
|
335
|
-
console.error(`Ошибка: ${error.message}`);
|
|
336
|
-
cleanup();
|
|
337
|
-
});
|
|
338
|
-
|
|
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
|
-
);
|
|
348
|
-
|
|
349
|
-
console.log(`Проект создан, ID: ${result.projectId}`);
|
|
350
|
-
|
|
351
|
-
// Ожидание завершения индексации
|
|
352
|
-
return new Promise((resolve, reject) => {
|
|
353
|
-
sdk.projects.on('indexing_complete', (data) => {
|
|
354
|
-
console.log('Индексация завершена успешно!');
|
|
355
|
-
cleanup();
|
|
356
|
-
resolve({
|
|
357
|
-
projectId: result.projectId,
|
|
358
|
-
indexingStats: data
|
|
359
|
-
});
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
// Таймаут
|
|
363
|
-
setTimeout(() => {
|
|
364
|
-
cleanup();
|
|
365
|
-
reject(new Error('Таймаут ожидания индексации'));
|
|
366
|
-
}, 300000); // 5 минут
|
|
367
|
-
});
|
|
368
|
-
} catch (error) {
|
|
369
|
-
sdk.projects.disconnectWebSocket();
|
|
370
|
-
throw error;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
138
|
+
### Проверка статуса индексации
|
|
373
139
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
140
|
+
```typescript
|
|
141
|
+
// Получение текущего статуса индексации
|
|
142
|
+
const status = await sdk.projects.getIndexingStatus('идентификатор_проекта');
|
|
143
|
+
console.log(`Статус: ${status.status}`);
|
|
144
|
+
console.log(`Количество файлов: ${status.fileCount}`);
|
|
145
|
+
console.log(`Статистика по языкам:`, status.languageStats);
|
|
378
146
|
```
|
|
379
147
|
|
|
380
|
-
###
|
|
381
|
-
|
|
382
|
-
Пример интеграции в расширение VS Code/Cursor:
|
|
148
|
+
### Отмена индексации
|
|
383
149
|
|
|
384
|
-
```
|
|
385
|
-
//
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
apiKey: vscode.workspace.getConfiguration('mySolverExtension').get('apiKey'),
|
|
389
|
-
timeout: 15000
|
|
390
|
-
});
|
|
150
|
+
```typescript
|
|
151
|
+
// Отмена текущей индексации
|
|
152
|
+
await sdk.projects.cancelIndexing('идентификатор_проекта');
|
|
153
|
+
```
|
|
391
154
|
|
|
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
|
-
}
|
|
400
|
-
|
|
401
|
-
const workspacePath = workspaceFolders[0].uri.fsPath;
|
|
402
|
-
const workspaceName = path.basename(workspacePath);
|
|
403
|
-
|
|
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(() => {
|
|
412
|
-
sdk.projects.disconnectWebSocket();
|
|
413
|
-
vscode.window.showInformationMessage('Индексация отменена');
|
|
414
|
-
});
|
|
415
|
-
|
|
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) {
|
|
464
|
-
sdk.projects.disconnectWebSocket();
|
|
465
|
-
vscode.window.showErrorMessage(`Ошибка: ${error.message}`);
|
|
466
|
-
}
|
|
467
|
-
});
|
|
468
|
-
}
|
|
155
|
+
### Очистка ошибок индексации
|
|
469
156
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
);
|
|
157
|
+
```typescript
|
|
158
|
+
// Очистка ошибки, если индексация завершилась с ошибкой
|
|
159
|
+
await sdk.projects.clearIndexingError('идентификатор_проекта');
|
|
474
160
|
```
|
|
475
161
|
|
|
476
|
-
|
|
162
|
+
## Отслеживание индексации через WebSocket
|
|
477
163
|
|
|
478
|
-
|
|
164
|
+
SDK поддерживает отслеживание процесса индексации в реальном времени через WebSocket:
|
|
479
165
|
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
async function watchAndIndex(projectId, projectPath) {
|
|
485
|
-
// Подключение WebSocket
|
|
486
|
-
await sdk.projects.connectWebSocket();
|
|
487
|
-
|
|
488
|
-
// Установка обработчиков
|
|
489
|
-
sdk.projects.on('file_indexed', (data) => {
|
|
490
|
-
console.log(`Файл проиндексирован: ${data.filePath}`);
|
|
491
|
-
});
|
|
492
|
-
|
|
493
|
-
// Настройка наблюдателя за файловой системой
|
|
494
|
-
const watcher = chokidar.watch(projectPath, {
|
|
495
|
-
ignored: [
|
|
496
|
-
/(^|[\/\\])\../, // скрытые файлы
|
|
497
|
-
'**/node_modules/**',
|
|
498
|
-
'**/dist/**',
|
|
499
|
-
'**/.git/**'
|
|
500
|
-
],
|
|
501
|
-
persistent: true,
|
|
502
|
-
ignoreInitial: true
|
|
503
|
-
});
|
|
504
|
-
|
|
505
|
-
// Обработка изменений файлов
|
|
506
|
-
watcher.on('change', async (filePath) => {
|
|
507
|
-
try {
|
|
508
|
-
// Получаем относительный путь
|
|
509
|
-
const relPath = path.relative(projectPath, filePath);
|
|
510
|
-
|
|
511
|
-
console.log(`Обнаружено изменение файла: ${relPath}`);
|
|
512
|
-
|
|
513
|
-
// Обновляем индекс для измененного файла
|
|
514
|
-
await sdk.projects.updateFileIndex(projectId, relPath);
|
|
515
|
-
} catch (error) {
|
|
516
|
-
console.error(`Ошибка при обновлении индекса: ${error.message}`);
|
|
517
|
-
}
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
console.log(`Наблюдение за директорией ${projectPath} для проекта ${projectId} запущено`);
|
|
521
|
-
|
|
522
|
-
// Возвращаем функцию для остановки наблюдения
|
|
523
|
-
return {
|
|
524
|
-
stop: () => {
|
|
525
|
-
watcher.close();
|
|
526
|
-
sdk.projects.disconnectWebSocket();
|
|
527
|
-
console.log(`Наблюдение за директорией ${projectPath} остановлено`);
|
|
528
|
-
}
|
|
529
|
-
};
|
|
530
|
-
}
|
|
166
|
+
```typescript
|
|
167
|
+
// Подключение к WebSocket
|
|
168
|
+
await sdk.projects.connectWebSocket();
|
|
531
169
|
|
|
532
|
-
//
|
|
533
|
-
|
|
534
|
-
|
|
170
|
+
// Подписка на события индексации отдельных файлов
|
|
171
|
+
sdk.projects.on('file_indexed', (data) => {
|
|
172
|
+
console.log(`Файл индексирован: ${data.file.path}`);
|
|
173
|
+
console.log(`Язык: ${data.file.language}`);
|
|
174
|
+
console.log(`Тип изменения: ${data.file.changeType}`);
|
|
175
|
+
});
|
|
535
176
|
|
|
536
|
-
|
|
177
|
+
// Подписка на событие завершения индексации
|
|
178
|
+
sdk.projects.on('indexing_complete', (data) => {
|
|
179
|
+
console.log(`Индексация завершена для проекта ${data.projectId}`);
|
|
180
|
+
console.log(`Всего файлов: ${data.stats.totalFiles}`);
|
|
181
|
+
console.log(`Проиндексировано: ${data.stats.indexed}`);
|
|
182
|
+
console.log(`Ошибок: ${data.stats.failed}`);
|
|
183
|
+
console.log(`Время индексации: ${data.stats.time}мс`);
|
|
184
|
+
});
|
|
537
185
|
|
|
538
|
-
//
|
|
539
|
-
|
|
186
|
+
// Отключение от WebSocket после завершения работы
|
|
187
|
+
await sdk.projects.disconnectWebSocket();
|
|
540
188
|
```
|
|
541
189
|
|
|
542
190
|
## Обработка ошибок
|
|
543
191
|
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
### Ошибки HTTP API
|
|
547
|
-
|
|
548
|
-
```javascript
|
|
192
|
+
```typescript
|
|
549
193
|
try {
|
|
550
|
-
await sdk.projects.indexProject(
|
|
194
|
+
await sdk.projects.indexProject('идентификатор_проекта', {
|
|
195
|
+
indexingMode: 'full'
|
|
196
|
+
});
|
|
551
197
|
} catch (error) {
|
|
552
|
-
|
|
553
|
-
if (error.status === 404) {
|
|
198
|
+
if (error.message.includes('не найден')) {
|
|
554
199
|
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) {
|
|
200
|
+
} else if (error.message.includes('forbidden')) {
|
|
566
201
|
console.error('Ошибка авторизации. Проверьте API ключ');
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
console.error('Неизвестная ошибка:', error.message);
|
|
202
|
+
} else {
|
|
203
|
+
console.error(`Ошибка индексации: ${error.message}`);
|
|
570
204
|
}
|
|
571
205
|
}
|
|
572
206
|
```
|
|
573
207
|
|
|
574
|
-
|
|
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
|
-
}
|
|
208
|
+
## Авторизация WebSocket
|
|
620
209
|
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
210
|
+
Начиная с версии 1.7.7, SDK автоматически добавляет API ключ в качестве параметра `authToken` при подключении WebSocket, что обеспечивает корректную авторизацию для всех операций через WebSocket (индексация, рассуждения и т.д.).
|
|
211
|
+
|
|
212
|
+
Для корректной работы WebSocket соединений:
|
|
213
|
+
1. **Обязательно указывайте `apiKey` при инициализации SDK**
|
|
214
|
+
2. Подключайтесь к WebSocket перед использованием событий
|
|
215
|
+
3. Отключайтесь от WebSocket после завершения работы
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
// Корректная инициализация с apiKey
|
|
219
|
+
const sdk = new CodeSolverSDK({
|
|
220
|
+
baseURL: 'https://api.example.com',
|
|
221
|
+
apiKey: 'ваш_api_ключ' // Обязательно для WebSocket авторизации
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
// Подключение
|
|
225
|
+
await sdk.projects.connectWebSocket();
|
|
226
|
+
|
|
227
|
+
// Использование WebSocket...
|
|
624
228
|
|
|
625
|
-
|
|
229
|
+
// Отключение
|
|
230
|
+
await sdk.projects.disconnectWebSocket();
|
|
231
|
+
```
|