solver-sdk 3.1.2 → 3.1.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.
- package/README.md +5 -3
- package/dist/cjs/code-solver-sdk.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/esm/code-solver-sdk.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/types/index.d.ts +1 -1
- package/package.json +2 -3
- package/docs/AUTHENTICATION.md +0 -316
- package/docs/ERROR_HANDLING.md +0 -613
- package/docs/README.md +0 -53
- package/docs/VSCODE_INTEGRATION.md +0 -269
- package/docs/features/THINKING.md +0 -324
- package/docs/indexing/INDEXING.md +0 -759
|
@@ -1,759 +0,0 @@
|
|
|
1
|
-
# 📊 Руководство по индексации проектов
|
|
2
|
-
|
|
3
|
-
## 🚀 Быстрый старт
|
|
4
|
-
|
|
5
|
-
```javascript
|
|
6
|
-
import { CodeSolverSDK } from 'solver-sdk';
|
|
7
|
-
|
|
8
|
-
const sdk = await CodeSolverSDK.create({
|
|
9
|
-
baseURL: 'http://localhost:3000'
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
// 1. Создать/найти проект → 2. Запустить индексацию → 3. Мониторить прогресс
|
|
13
|
-
const project = await sdk.projects.findOrCreateProject('/path/to/project', 'Project Name');
|
|
14
|
-
await sdk.projects.startIndexing(project.id);
|
|
15
|
-
|
|
16
|
-
// Ожидание завершения
|
|
17
|
-
while (true) {
|
|
18
|
-
const status = await sdk.projects.getProjectStatus(project.id);
|
|
19
|
-
if (status.status === 'ready') break;
|
|
20
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
21
|
-
}
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## 📋 Основные методы индексации
|
|
25
|
-
|
|
26
|
-
### 1. Поиск/создание проекта
|
|
27
|
-
|
|
28
|
-
```typescript
|
|
29
|
-
// Найти существующий или создать новый проект
|
|
30
|
-
const project = await sdk.projects.findOrCreateProject(
|
|
31
|
-
projectPath: string,
|
|
32
|
-
projectName?: string
|
|
33
|
-
): Promise<Project>
|
|
34
|
-
|
|
35
|
-
// Примеры:
|
|
36
|
-
const project1 = await sdk.projects.findOrCreateProject('/path/to/my-project');
|
|
37
|
-
const project2 = await sdk.projects.findOrCreateProject('/path/to/my-project', 'My Project');
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
**Результат:**
|
|
41
|
-
```typescript
|
|
42
|
-
interface Project {
|
|
43
|
-
id: string; // "12345678-1234-1234-1234-123456789012"
|
|
44
|
-
name: string; // "My Project"
|
|
45
|
-
path: string; // "/path/to/my-project"
|
|
46
|
-
status: 'idle' | 'indexing' | 'ready' | 'error';
|
|
47
|
-
createdAt: string; // "2024-01-01T12:00:00Z"
|
|
48
|
-
updatedAt: string; // "2024-01-01T12:00:00Z"
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### 2. Запуск индексации
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
// Запустить индексацию проекта
|
|
56
|
-
await sdk.projects.startIndexing(
|
|
57
|
-
projectId: string,
|
|
58
|
-
options?: IndexingOptions
|
|
59
|
-
): Promise<IndexingResponse>
|
|
60
|
-
|
|
61
|
-
// Примеры:
|
|
62
|
-
await sdk.projects.startIndexing(project.id);
|
|
63
|
-
|
|
64
|
-
await sdk.projects.startIndexing(project.id, {
|
|
65
|
-
forceFull: true, // Полная переиндексация
|
|
66
|
-
excludePatterns: ['node_modules/**', '*.log']
|
|
67
|
-
});
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
**Опции индексации:**
|
|
71
|
-
```typescript
|
|
72
|
-
interface IndexingOptions {
|
|
73
|
-
forceFull?: boolean; // Полная переиндексация (по умолчанию: false)
|
|
74
|
-
excludePatterns?: string[]; // Паттерны исключения
|
|
75
|
-
includePatterns?: string[]; // Паттерны включения
|
|
76
|
-
maxFileSize?: number; // Максимальный размер файла (байты)
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### 3. Мониторинг статуса
|
|
81
|
-
|
|
82
|
-
```typescript
|
|
83
|
-
// Получить текущий статус проекта
|
|
84
|
-
const status = await sdk.projects.getProjectStatus(
|
|
85
|
-
projectId: string
|
|
86
|
-
): Promise<ProjectStatus>
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**Статус индексации:**
|
|
90
|
-
```typescript
|
|
91
|
-
interface ProjectStatus {
|
|
92
|
-
status: 'idle' | 'indexing' | 'ready' | 'error';
|
|
93
|
-
progress?: number; // 0-100
|
|
94
|
-
totalFiles?: number; // Общее количество файлов
|
|
95
|
-
processedFiles?: number; // Обработано файлов
|
|
96
|
-
currentFile?: string; // Текущий обрабатываемый файл
|
|
97
|
-
error?: string; // Текст ошибки (если status === 'error')
|
|
98
|
-
startTime?: string; // Время начала индексации
|
|
99
|
-
estimatedTime?: number; // Примерное время завершения (секунды)
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### 4. Управление индексацией
|
|
104
|
-
|
|
105
|
-
```typescript
|
|
106
|
-
// Отменить индексацию
|
|
107
|
-
await sdk.projects.cancelIndexing(projectId: string): Promise<boolean>
|
|
108
|
-
|
|
109
|
-
// Очистить ошибку индексации
|
|
110
|
-
await sdk.projects.clearIndexingError(projectId: string): Promise<boolean>
|
|
111
|
-
|
|
112
|
-
// Удалить проект
|
|
113
|
-
await sdk.projects.deleteProject(projectId: string): Promise<void>
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### 5. Получение списка проектов
|
|
117
|
-
|
|
118
|
-
```typescript
|
|
119
|
-
// Все проекты
|
|
120
|
-
const allProjects = await sdk.projects.getAllProjects(): Promise<Project[]>
|
|
121
|
-
|
|
122
|
-
// Только готовые к работе проекты (проиндексированные)
|
|
123
|
-
const readyProjects = await sdk.projects.getReadyProjects(): Promise<Project[]>
|
|
124
|
-
|
|
125
|
-
// Конкретный проект
|
|
126
|
-
const project = await sdk.projects.getProject(projectId: string): Promise<Project>
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## 🔄 Workflow индексации
|
|
130
|
-
|
|
131
|
-
### Простой workflow
|
|
132
|
-
|
|
133
|
-
```javascript
|
|
134
|
-
async function simpleIndexing(projectPath, projectName) {
|
|
135
|
-
const sdk = await CodeSolverSDK.create({
|
|
136
|
-
baseURL: 'http://localhost:3000'
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
try {
|
|
140
|
-
// 1. Создать/найти проект
|
|
141
|
-
console.log('📁 Создание проекта...');
|
|
142
|
-
const project = await sdk.projects.findOrCreateProject(projectPath, projectName);
|
|
143
|
-
console.log(`✅ Проект создан: ${project.id}`);
|
|
144
|
-
|
|
145
|
-
// 2. Запустить индексацию
|
|
146
|
-
console.log('🚀 Запуск индексации...');
|
|
147
|
-
await sdk.projects.startIndexing(project.id);
|
|
148
|
-
|
|
149
|
-
// 3. Ожидание завершения
|
|
150
|
-
console.log('⏳ Ожидание завершения...');
|
|
151
|
-
while (true) {
|
|
152
|
-
const status = await sdk.projects.getProjectStatus(project.id);
|
|
153
|
-
|
|
154
|
-
if (status.status === 'ready') {
|
|
155
|
-
console.log('✅ Индексация завершена!');
|
|
156
|
-
break;
|
|
157
|
-
} else if (status.status === 'error') {
|
|
158
|
-
throw new Error(`Ошибка индексации: ${status.error}`);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Показать прогресс
|
|
162
|
-
if (status.progress) {
|
|
163
|
-
console.log(`📊 Прогресс: ${status.progress}%`);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
return project;
|
|
170
|
-
|
|
171
|
-
} catch (error) {
|
|
172
|
-
console.error('❌ Ошибка:', error.message);
|
|
173
|
-
throw error;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// Использование
|
|
178
|
-
const project = await simpleIndexing('/path/to/my-project', 'My Project');
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
### Продвинутый workflow с обработкой ошибок
|
|
182
|
-
|
|
183
|
-
```javascript
|
|
184
|
-
async function advancedIndexing(projectPath, options = {}) {
|
|
185
|
-
const sdk = await CodeSolverSDK.create({
|
|
186
|
-
baseURL: 'http://localhost:3000'
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
const {
|
|
190
|
-
projectName = 'Auto Project',
|
|
191
|
-
timeout = 300000, // 5 минут
|
|
192
|
-
retryAttempts = 3,
|
|
193
|
-
excludePatterns = ['node_modules/**', '*.log', '.git/**']
|
|
194
|
-
} = options;
|
|
195
|
-
|
|
196
|
-
let project;
|
|
197
|
-
let attempt = 0;
|
|
198
|
-
|
|
199
|
-
while (attempt < retryAttempts) {
|
|
200
|
-
try {
|
|
201
|
-
attempt++;
|
|
202
|
-
console.log(`🔄 Попытка ${attempt}/${retryAttempts}`);
|
|
203
|
-
|
|
204
|
-
// 1. Создать/найти проект
|
|
205
|
-
project = await sdk.projects.findOrCreateProject(projectPath, projectName);
|
|
206
|
-
console.log(`📁 Проект: ${project.name} (${project.id})`);
|
|
207
|
-
|
|
208
|
-
// 2. Проверить текущий статус
|
|
209
|
-
let status = await sdk.projects.getProjectStatus(project.id);
|
|
210
|
-
|
|
211
|
-
// Если уже готов - возвращаем
|
|
212
|
-
if (status.status === 'ready') {
|
|
213
|
-
console.log('✅ Проект уже проиндексирован');
|
|
214
|
-
return project;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Если есть ошибка - очищаем
|
|
218
|
-
if (status.status === 'error') {
|
|
219
|
-
console.log('🧹 Очистка предыдущей ошибки...');
|
|
220
|
-
await sdk.projects.clearIndexingError(project.id);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// Если идет индексация - отменяем
|
|
224
|
-
if (status.status === 'indexing') {
|
|
225
|
-
console.log('⏹️ Отмена текущей индексации...');
|
|
226
|
-
await sdk.projects.cancelIndexing(project.id);
|
|
227
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// 3. Запустить новую индексацию
|
|
231
|
-
console.log('🚀 Запуск индексации...');
|
|
232
|
-
await sdk.projects.startIndexing(project.id, {
|
|
233
|
-
forceFull: attempt > 1, // При повторной попытке - полная индексация
|
|
234
|
-
excludePatterns
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
// 4. Мониторинг с таймаутом
|
|
238
|
-
const startTime = Date.now();
|
|
239
|
-
let lastProgress = 0;
|
|
240
|
-
|
|
241
|
-
while (Date.now() - startTime < timeout) {
|
|
242
|
-
status = await sdk.projects.getProjectStatus(project.id);
|
|
243
|
-
|
|
244
|
-
if (status.status === 'ready') {
|
|
245
|
-
console.log('✅ Индексация завершена успешно!');
|
|
246
|
-
|
|
247
|
-
// Получить статистику
|
|
248
|
-
try {
|
|
249
|
-
const stats = await sdk.search.getFunctionStats(project.id);
|
|
250
|
-
console.log(`📈 Статистика: ${stats.stats.totalFunctions} функций найдено`);
|
|
251
|
-
} catch (error) {
|
|
252
|
-
console.log('⚠️ Не удалось получить статистику функций');
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return project;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
if (status.status === 'error') {
|
|
259
|
-
throw new Error(`Ошибка индексации: ${status.error}`);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// Показать прогресс только если изменился
|
|
263
|
-
if (status.progress && status.progress !== lastProgress) {
|
|
264
|
-
lastProgress = status.progress;
|
|
265
|
-
const processedInfo = status.processedFiles && status.totalFiles
|
|
266
|
-
? ` (${status.processedFiles}/${status.totalFiles} файлов)`
|
|
267
|
-
: '';
|
|
268
|
-
console.log(`📊 Прогресс: ${status.progress}%${processedInfo}`);
|
|
269
|
-
|
|
270
|
-
if (status.currentFile) {
|
|
271
|
-
console.log(`📄 Обрабатывается: ${status.currentFile}`);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// Таймаут - отменяем индексацию
|
|
279
|
-
console.log('⏰ Таймаут индексации, отмена...');
|
|
280
|
-
await sdk.projects.cancelIndexing(project.id);
|
|
281
|
-
throw new Error('Превышен таймаут индексации');
|
|
282
|
-
|
|
283
|
-
} catch (error) {
|
|
284
|
-
console.error(`❌ Ошибка на попытке ${attempt}:`, error.message);
|
|
285
|
-
|
|
286
|
-
if (attempt >= retryAttempts) {
|
|
287
|
-
throw new Error(`Не удалось проиндексировать проект после ${retryAttempts} попыток: ${error.message}`);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// Ждем перед повторной попыткой
|
|
291
|
-
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
// Использование
|
|
297
|
-
const project = await advancedIndexing('/path/to/my-project', {
|
|
298
|
-
projectName: 'My React App',
|
|
299
|
-
timeout: 600000, // 10 минут
|
|
300
|
-
retryAttempts: 2,
|
|
301
|
-
excludePatterns: ['node_modules/**', 'dist/**', '*.log']
|
|
302
|
-
});
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
## 🎯 Интеграция с VS Code Extension
|
|
306
|
-
|
|
307
|
-
### Базовая интеграция
|
|
308
|
-
|
|
309
|
-
```javascript
|
|
310
|
-
import * as vscode from 'vscode';
|
|
311
|
-
import { CodeSolverSDK } from 'solver-sdk';
|
|
312
|
-
|
|
313
|
-
class ProjectIndexer {
|
|
314
|
-
constructor() {
|
|
315
|
-
this.sdk = null;
|
|
316
|
-
this.currentProject = null;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
async initialize() {
|
|
320
|
-
this.sdk = await CodeSolverSDK.create({
|
|
321
|
-
baseURL: 'http://localhost:3000'
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
async indexCurrentWorkspace() {
|
|
326
|
-
if (!vscode.workspace.workspaceFolders) {
|
|
327
|
-
vscode.window.showErrorMessage('Нет открытой рабочей области');
|
|
328
|
-
return;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
const workspaceFolder = vscode.workspace.workspaceFolders[0];
|
|
332
|
-
const projectPath = workspaceFolder.uri.fsPath;
|
|
333
|
-
const projectName = workspaceFolder.name;
|
|
334
|
-
|
|
335
|
-
return vscode.window.withProgress({
|
|
336
|
-
location: vscode.ProgressLocation.Notification,
|
|
337
|
-
title: 'Индексация проекта',
|
|
338
|
-
cancellable: true
|
|
339
|
-
}, async (progress, token) => {
|
|
340
|
-
try {
|
|
341
|
-
// Создать проект
|
|
342
|
-
progress.report({ message: 'Создание проекта...' });
|
|
343
|
-
const project = await this.sdk.projects.findOrCreateProject(projectPath, projectName);
|
|
344
|
-
this.currentProject = project;
|
|
345
|
-
|
|
346
|
-
// Запустить индексацию
|
|
347
|
-
progress.report({ message: 'Запуск индексации...' });
|
|
348
|
-
await this.sdk.projects.startIndexing(project.id);
|
|
349
|
-
|
|
350
|
-
// Мониторинг прогресса
|
|
351
|
-
while (!token.isCancellationRequested) {
|
|
352
|
-
const status = await this.sdk.projects.getProjectStatus(project.id);
|
|
353
|
-
|
|
354
|
-
if (status.status === 'ready') {
|
|
355
|
-
vscode.window.showInformationMessage('✅ Индексация завершена!');
|
|
356
|
-
break;
|
|
357
|
-
} else if (status.status === 'error') {
|
|
358
|
-
throw new Error(status.error);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
const progressPercentage = status.progress || 0;
|
|
362
|
-
const message = status.currentFile
|
|
363
|
-
? `${progressPercentage}% - ${status.currentFile}`
|
|
364
|
-
: `${progressPercentage}%`;
|
|
365
|
-
|
|
366
|
-
progress.report({
|
|
367
|
-
increment: progressPercentage,
|
|
368
|
-
message
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
// Отмена по запросу пользователя
|
|
375
|
-
if (token.isCancellationRequested) {
|
|
376
|
-
await this.sdk.projects.cancelIndexing(project.id);
|
|
377
|
-
vscode.window.showWarningMessage('Индексация отменена');
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
} catch (error) {
|
|
381
|
-
vscode.window.showErrorMessage(`Ошибка индексации: ${error.message}`);
|
|
382
|
-
}
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
async getReadyProjects() {
|
|
387
|
-
return await this.sdk.projects.getReadyProjects();
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
// Регистрация команд в extension.ts
|
|
392
|
-
export function activate(context: vscode.ExtensionContext) {
|
|
393
|
-
const indexer = new ProjectIndexer();
|
|
394
|
-
|
|
395
|
-
// Инициализация при активации
|
|
396
|
-
indexer.initialize();
|
|
397
|
-
|
|
398
|
-
// Команда индексации
|
|
399
|
-
const indexCommand = vscode.commands.registerCommand(
|
|
400
|
-
'myExtension.indexProject',
|
|
401
|
-
() => indexer.indexCurrentWorkspace()
|
|
402
|
-
);
|
|
403
|
-
|
|
404
|
-
// Команда просмотра проектов
|
|
405
|
-
const projectsCommand = vscode.commands.registerCommand(
|
|
406
|
-
'myExtension.showProjects',
|
|
407
|
-
async () => {
|
|
408
|
-
const projects = await indexer.getReadyProjects();
|
|
409
|
-
const items = projects.map(p => ({
|
|
410
|
-
label: p.name,
|
|
411
|
-
description: p.path,
|
|
412
|
-
project: p
|
|
413
|
-
}));
|
|
414
|
-
|
|
415
|
-
const selected = await vscode.window.showQuickPick(items);
|
|
416
|
-
if (selected) {
|
|
417
|
-
vscode.window.showInformationMessage(`Выбран проект: ${selected.project.name}`);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
);
|
|
421
|
-
|
|
422
|
-
context.subscriptions.push(indexCommand, projectsCommand);
|
|
423
|
-
}
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
### Автоматическая индексация при изменениях
|
|
427
|
-
|
|
428
|
-
```javascript
|
|
429
|
-
class AutoIndexer {
|
|
430
|
-
constructor(sdk) {
|
|
431
|
-
this.sdk = sdk;
|
|
432
|
-
this.indexingQueue = new Set();
|
|
433
|
-
this.debounceTimers = new Map();
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
startWatching() {
|
|
437
|
-
// Отслеживание изменений файлов
|
|
438
|
-
vscode.workspace.onDidSaveTextDocument(async (document) => {
|
|
439
|
-
await this.onFileChanged(document.uri.fsPath);
|
|
440
|
-
});
|
|
441
|
-
|
|
442
|
-
// Отслеживание создания файлов
|
|
443
|
-
vscode.workspace.onDidCreateFiles(async (event) => {
|
|
444
|
-
for (const file of event.files) {
|
|
445
|
-
await this.onFileChanged(file.fsPath);
|
|
446
|
-
}
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
// Отслеживание удаления файлов
|
|
450
|
-
vscode.workspace.onDidDeleteFiles(async (event) => {
|
|
451
|
-
for (const file of event.files) {
|
|
452
|
-
await this.onFileDeleted(file.fsPath);
|
|
453
|
-
}
|
|
454
|
-
});
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
async onFileChanged(filePath) {
|
|
458
|
-
const workspaceFolder = vscode.workspace.getWorkspaceFolder(vscode.Uri.file(filePath));
|
|
459
|
-
if (!workspaceFolder) return;
|
|
460
|
-
|
|
461
|
-
const projectPath = workspaceFolder.uri.fsPath;
|
|
462
|
-
|
|
463
|
-
// Debounce - не чаще раза в 5 секунд для одного проекта
|
|
464
|
-
if (this.debounceTimers.has(projectPath)) {
|
|
465
|
-
clearTimeout(this.debounceTimers.get(projectPath));
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
this.debounceTimers.set(projectPath, setTimeout(async () => {
|
|
469
|
-
await this.reindexFile(projectPath, filePath);
|
|
470
|
-
this.debounceTimers.delete(projectPath);
|
|
471
|
-
}, 5000));
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
async reindexFile(projectPath, filePath) {
|
|
475
|
-
try {
|
|
476
|
-
// Найти проект
|
|
477
|
-
const project = await this.sdk.projects.findOrCreateProject(projectPath);
|
|
478
|
-
|
|
479
|
-
// Переиндексировать конкретный файл (если поддерживается)
|
|
480
|
-
const relativePath = path.relative(projectPath, filePath);
|
|
481
|
-
|
|
482
|
-
// Пока используем полную переиндексацию
|
|
483
|
-
if (!this.indexingQueue.has(project.id)) {
|
|
484
|
-
this.indexingQueue.add(project.id);
|
|
485
|
-
|
|
486
|
-
await this.sdk.projects.startIndexing(project.id, {
|
|
487
|
-
forceFull: false // Инкрементальная индексация
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
// Ждем завершения
|
|
491
|
-
while (true) {
|
|
492
|
-
const status = await this.sdk.projects.getProjectStatus(project.id);
|
|
493
|
-
if (status.status !== 'indexing') break;
|
|
494
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
this.indexingQueue.delete(project.id);
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
} catch (error) {
|
|
501
|
-
console.error('Ошибка автоиндексации:', error.message);
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
## 📊 Статистика и мониторинг
|
|
508
|
-
|
|
509
|
-
### Получение детальной статистики
|
|
510
|
-
|
|
511
|
-
```javascript
|
|
512
|
-
async function getProjectStatistics(projectId) {
|
|
513
|
-
const sdk = await CodeSolverSDK.create({
|
|
514
|
-
baseURL: 'http://localhost:3000'
|
|
515
|
-
});
|
|
516
|
-
|
|
517
|
-
try {
|
|
518
|
-
// Общая информация о проекте
|
|
519
|
-
const project = await sdk.projects.getProject(projectId);
|
|
520
|
-
console.log('📁 Проект:', project);
|
|
521
|
-
|
|
522
|
-
// Статистика функций
|
|
523
|
-
const functionStats = await sdk.search.getFunctionStats(projectId);
|
|
524
|
-
console.log('📊 Статистика функций:', functionStats.stats);
|
|
525
|
-
|
|
526
|
-
// Тест поиска для проверки качества индексации
|
|
527
|
-
const searchTest = await sdk.search.searchCode(projectId, {
|
|
528
|
-
query: 'function',
|
|
529
|
-
limit: 5
|
|
530
|
-
});
|
|
531
|
-
console.log('🔍 Тестовый поиск:', searchTest.length, 'результатов');
|
|
532
|
-
|
|
533
|
-
const functionSearch = await sdk.search.searchFunctions(projectId, {
|
|
534
|
-
query: 'main',
|
|
535
|
-
limit: 3
|
|
536
|
-
});
|
|
537
|
-
console.log('🎯 Поиск функций:', functionSearch.resultsCount, 'найдено');
|
|
538
|
-
|
|
539
|
-
return {
|
|
540
|
-
project,
|
|
541
|
-
functionStats: functionStats.stats,
|
|
542
|
-
searchQuality: {
|
|
543
|
-
basicSearch: searchTest.length,
|
|
544
|
-
functionSearch: functionSearch.resultsCount
|
|
545
|
-
}
|
|
546
|
-
};
|
|
547
|
-
|
|
548
|
-
} catch (error) {
|
|
549
|
-
console.error('Ошибка получения статистики:', error.message);
|
|
550
|
-
return null;
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
// Использование
|
|
555
|
-
const stats = await getProjectStatistics('12345678-1234-1234-1234-123456789012');
|
|
556
|
-
if (stats) {
|
|
557
|
-
console.log(`
|
|
558
|
-
📈 Отчет по проекту ${stats.project.name}:
|
|
559
|
-
• Всего функций: ${stats.functionStats.totalFunctions}
|
|
560
|
-
• Функции: ${stats.functionStats.functions}
|
|
561
|
-
• Методы: ${stats.functionStats.methods}
|
|
562
|
-
• Классы: ${stats.functionStats.classes}
|
|
563
|
-
• Интерфейсы: ${stats.functionStats.interfaces}
|
|
564
|
-
• Поиск работает: ${stats.searchQuality.basicSearch > 0 ? '✅' : '❌'}
|
|
565
|
-
• Поиск функций работает: ${stats.searchQuality.functionSearch > 0 ? '✅' : '❌'}
|
|
566
|
-
`);
|
|
567
|
-
}
|
|
568
|
-
```
|
|
569
|
-
|
|
570
|
-
## 🚨 Обработка ошибок
|
|
571
|
-
|
|
572
|
-
### Типичные ошибки и решения
|
|
573
|
-
|
|
574
|
-
```javascript
|
|
575
|
-
async function robustIndexing(projectPath, projectName) {
|
|
576
|
-
const sdk = await CodeSolverSDK.create({
|
|
577
|
-
baseURL: 'http://localhost:3000'
|
|
578
|
-
});
|
|
579
|
-
|
|
580
|
-
try {
|
|
581
|
-
const project = await sdk.projects.findOrCreateProject(projectPath, projectName);
|
|
582
|
-
await sdk.projects.startIndexing(project.id);
|
|
583
|
-
|
|
584
|
-
// Мониторинг с обработкой ошибок
|
|
585
|
-
while (true) {
|
|
586
|
-
try {
|
|
587
|
-
const status = await sdk.projects.getProjectStatus(project.id);
|
|
588
|
-
|
|
589
|
-
if (status.status === 'ready') {
|
|
590
|
-
console.log('✅ Успешно завершено');
|
|
591
|
-
return project;
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
if (status.status === 'error') {
|
|
595
|
-
// Обработка различных типов ошибок
|
|
596
|
-
if (status.error?.includes('timeout')) {
|
|
597
|
-
console.log('⏰ Ошибка таймаута, повторная попытка...');
|
|
598
|
-
await sdk.projects.clearIndexingError(project.id);
|
|
599
|
-
await sdk.projects.startIndexing(project.id, { forceFull: true });
|
|
600
|
-
continue;
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
if (status.error?.includes('disk space')) {
|
|
604
|
-
throw new Error('❌ Недостаточно места на диске');
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
if (status.error?.includes('permission')) {
|
|
608
|
-
throw new Error('❌ Нет прав доступа к файлам проекта');
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
throw new Error(`❌ Ошибка индексации: ${status.error}`);
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
615
|
-
|
|
616
|
-
} catch (networkError) {
|
|
617
|
-
// Обработка сетевых ошибок
|
|
618
|
-
if (networkError.code === 'ECONNREFUSED') {
|
|
619
|
-
throw new Error('❌ Сервер недоступен. Проверьте что бэкенд запущен на http://localhost:3000');
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
if (networkError.response?.status === 404) {
|
|
623
|
-
throw new Error('❌ API endpoint не найден. Проверьте версию SDK и бэкенда');
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
if (networkError.response?.status === 500) {
|
|
627
|
-
console.log('⚠️ Временная ошибка сервера, повторная попытка через 10 секунд...');
|
|
628
|
-
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
629
|
-
continue;
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
throw networkError;
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
} catch (error) {
|
|
637
|
-
console.error('💥 Критическая ошибка:', error.message);
|
|
638
|
-
|
|
639
|
-
// Попытка очистки
|
|
640
|
-
try {
|
|
641
|
-
if (project?.id) {
|
|
642
|
-
await sdk.projects.cancelIndexing(project.id);
|
|
643
|
-
}
|
|
644
|
-
} catch (cleanupError) {
|
|
645
|
-
console.error('Ошибка очистки:', cleanupError.message);
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
throw error;
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
```
|
|
652
|
-
|
|
653
|
-
## 📝 Лучшие практики
|
|
654
|
-
|
|
655
|
-
### 1. Оптимизация производительности
|
|
656
|
-
|
|
657
|
-
```javascript
|
|
658
|
-
// ✅ Правильно - исключить ненужные файлы
|
|
659
|
-
const excludePatterns = [
|
|
660
|
-
'node_modules/**',
|
|
661
|
-
'.git/**',
|
|
662
|
-
'dist/**',
|
|
663
|
-
'build/**',
|
|
664
|
-
'*.log',
|
|
665
|
-
'*.tmp',
|
|
666
|
-
'.cache/**',
|
|
667
|
-
'coverage/**'
|
|
668
|
-
];
|
|
669
|
-
|
|
670
|
-
await sdk.projects.startIndexing(project.id, { excludePatterns });
|
|
671
|
-
```
|
|
672
|
-
|
|
673
|
-
### 2. Управление ресурсами
|
|
674
|
-
|
|
675
|
-
```javascript
|
|
676
|
-
// ✅ Правильно - одно подключение на приложение
|
|
677
|
-
class IndexingManager {
|
|
678
|
-
constructor() {
|
|
679
|
-
this.sdk = null;
|
|
680
|
-
this.activeIndexing = new Map();
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
async initialize() {
|
|
684
|
-
if (!this.sdk) {
|
|
685
|
-
this.sdk = await CodeSolverSDK.create({
|
|
686
|
-
baseURL: 'http://localhost:3000'
|
|
687
|
-
});
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
|
|
691
|
-
async indexProject(projectPath) {
|
|
692
|
-
// Предотвращение параллельной индексации одного проекта
|
|
693
|
-
if (this.activeIndexing.has(projectPath)) {
|
|
694
|
-
throw new Error('Проект уже индексируется');
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
this.activeIndexing.set(projectPath, true);
|
|
698
|
-
|
|
699
|
-
try {
|
|
700
|
-
// ... логика индексации
|
|
701
|
-
} finally {
|
|
702
|
-
this.activeIndexing.delete(projectPath);
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
```
|
|
707
|
-
|
|
708
|
-
### 3. Пользовательский интерфейс
|
|
709
|
-
|
|
710
|
-
```javascript
|
|
711
|
-
// ✅ Правильно - информативная обратная связь
|
|
712
|
-
async function indexWithUI(projectPath) {
|
|
713
|
-
const statusDiv = document.getElementById('indexing-status');
|
|
714
|
-
const progressBar = document.getElementById('progress-bar');
|
|
715
|
-
|
|
716
|
-
try {
|
|
717
|
-
statusDiv.textContent = '🚀 Запуск индексации...';
|
|
718
|
-
|
|
719
|
-
const project = await sdk.projects.findOrCreateProject(projectPath);
|
|
720
|
-
await sdk.projects.startIndexing(project.id);
|
|
721
|
-
|
|
722
|
-
while (true) {
|
|
723
|
-
const status = await sdk.projects.getProjectStatus(project.id);
|
|
724
|
-
|
|
725
|
-
if (status.status === 'ready') {
|
|
726
|
-
statusDiv.textContent = '✅ Индексация завершена!';
|
|
727
|
-
progressBar.style.width = '100%';
|
|
728
|
-
break;
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
if (status.progress) {
|
|
732
|
-
progressBar.style.width = `${status.progress}%`;
|
|
733
|
-
statusDiv.textContent = `📊 ${status.progress}% - ${status.currentFile || 'Обработка...'}`;
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
} catch (error) {
|
|
740
|
-
statusDiv.textContent = `❌ Ошибка: ${error.message}`;
|
|
741
|
-
progressBar.style.backgroundColor = 'red';
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
```
|
|
745
|
-
|
|
746
|
-
## 🎯 Заключение
|
|
747
|
-
|
|
748
|
-
Индексация - ключевая функция для работы с поиском и AI анализом кода. Основные шаги:
|
|
749
|
-
|
|
750
|
-
1. **Создание проекта** - `findOrCreateProject()`
|
|
751
|
-
2. **Запуск индексации** - `startIndexing()`
|
|
752
|
-
3. **Мониторинг прогресса** - `getProjectStatus()`
|
|
753
|
-
4. **Использование результатов** - поиск функций и кода
|
|
754
|
-
|
|
755
|
-
**Помните:**
|
|
756
|
-
- Всегда обрабатывайте ошибки
|
|
757
|
-
- Показывайте прогресс пользователю
|
|
758
|
-
- Исключайте ненужные файлы
|
|
759
|
-
- Тестируйте результаты индексации
|