solver-sdk 2.7.5 → 3.1.0
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 +200 -368
- package/dist/cjs/api/chat-api/index.js +23 -49
- package/dist/cjs/api/chat-api/index.js.map +1 -1
- package/dist/cjs/api/chat-api/interfaces.js +1 -0
- package/dist/cjs/api/chat-api/interfaces.js.map +1 -1
- package/dist/cjs/api/context-api.js +6 -1
- package/dist/cjs/api/context-api.js.map +1 -1
- package/dist/cjs/api/models-api.js +43 -60
- package/dist/cjs/api/models-api.js.map +1 -1
- package/dist/cjs/api/projects-api.js +63 -293
- package/dist/cjs/api/projects-api.js.map +1 -1
- package/dist/cjs/api/search-api.js +131 -8
- package/dist/cjs/api/search-api.js.map +1 -1
- package/dist/cjs/code-solver-sdk.js +68 -322
- package/dist/cjs/code-solver-sdk.js.map +1 -1
- package/dist/cjs/index.js +3 -19
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/utils/logger.js +4 -4
- package/dist/cjs/utils/logger.js.map +1 -1
- package/dist/esm/api/chat-api/index.js +22 -48
- package/dist/esm/api/chat-api/index.js.map +1 -1
- package/dist/esm/api/chat-api/interfaces.js +1 -0
- package/dist/esm/api/chat-api/interfaces.js.map +1 -1
- package/dist/esm/api/context-api.js +6 -1
- package/dist/esm/api/context-api.js.map +1 -1
- package/dist/esm/api/models-api.js +43 -60
- package/dist/esm/api/models-api.js.map +1 -1
- package/dist/esm/api/projects-api.js +63 -293
- package/dist/esm/api/projects-api.js.map +1 -1
- package/dist/esm/api/search-api.js +131 -8
- package/dist/esm/api/search-api.js.map +1 -1
- package/dist/esm/code-solver-sdk.js +68 -322
- package/dist/esm/code-solver-sdk.js.map +1 -1
- package/dist/esm/index.js +2 -18
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/logger.js +3 -3
- package/dist/esm/utils/logger.js.map +1 -1
- package/dist/types/api/chat-api/index.d.ts +1 -13
- package/dist/types/api/chat-api/index.d.ts.map +1 -1
- package/dist/types/api/chat-api/interfaces.d.ts +6 -54
- package/dist/types/api/chat-api/interfaces.d.ts.map +1 -1
- package/dist/types/api/chat-api/models.d.ts +3 -26
- package/dist/types/api/chat-api/models.d.ts.map +1 -1
- package/dist/types/api/context-api.d.ts.map +1 -1
- package/dist/types/api/models-api.d.ts +31 -62
- package/dist/types/api/models-api.d.ts.map +1 -1
- package/dist/types/api/projects-api.d.ts +47 -126
- package/dist/types/api/projects-api.d.ts.map +1 -1
- package/dist/types/api/search-api.d.ts +147 -6
- package/dist/types/api/search-api.d.ts.map +1 -1
- package/dist/types/code-solver-sdk.d.ts +36 -86
- package/dist/types/code-solver-sdk.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -14
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/interfaces/sdk-options.d.ts +18 -66
- package/dist/types/interfaces/sdk-options.d.ts.map +1 -1
- package/dist/types/utils/logger.d.ts +3 -3
- package/dist/types/utils/logger.d.ts.map +1 -1
- package/docs/README.md +53 -37
- package/docs/VSCODE_INTEGRATION.md +208 -371
- package/docs/indexing/INDEXING.md +658 -335
- package/package.json +26 -23
- package/dist/cjs/api/agents-api.js +0 -94
- package/dist/cjs/api/agents-api.js.map +0 -1
- package/dist/cjs/api/chat-api/websocket-helpers.js +0 -211
- package/dist/cjs/api/chat-api/websocket-helpers.js.map +0 -1
- package/dist/cjs/api/dependencies-api.js +0 -286
- package/dist/cjs/api/dependencies-api.js.map +0 -1
- package/dist/cjs/constants/websocket-events.constants.js +0 -170
- package/dist/cjs/constants/websocket-events.constants.js.map +0 -1
- package/dist/cjs/constants/websocket-namespaces.constants.js +0 -22
- package/dist/cjs/constants/websocket-namespaces.constants.js.map +0 -1
- package/dist/cjs/interfaces/websocket/callbacks.interfaces.js +0 -3
- package/dist/cjs/interfaces/websocket/callbacks.interfaces.js.map +0 -1
- package/dist/cjs/interfaces/websocket/client-options.interfaces.js +0 -3
- package/dist/cjs/interfaces/websocket/client-options.interfaces.js.map +0 -1
- package/dist/cjs/interfaces/websocket/events.interfaces.js +0 -3
- package/dist/cjs/interfaces/websocket/events.interfaces.js.map +0 -1
- package/dist/cjs/interfaces/websocket/vscode-command.interfaces.js +0 -42
- package/dist/cjs/interfaces/websocket/vscode-command.interfaces.js.map +0 -1
- package/dist/cjs/simple-indexing-client.js +0 -138
- package/dist/cjs/simple-indexing-client.js.map +0 -1
- package/dist/cjs/utils/code-solver-websocket-client.js +0 -497
- package/dist/cjs/utils/code-solver-websocket-client.js.map +0 -1
- package/dist/cjs/utils/connection-state-manager.js +0 -133
- package/dist/cjs/utils/connection-state-manager.js.map +0 -1
- package/dist/cjs/utils/indexing-websocket-client.js +0 -107
- package/dist/cjs/utils/indexing-websocket-client.js.map +0 -1
- package/dist/cjs/utils/session-manager.js +0 -114
- package/dist/cjs/utils/session-manager.js.map +0 -1
- package/dist/cjs/utils/simple-connection-monitor.js +0 -52
- package/dist/cjs/utils/simple-connection-monitor.js.map +0 -1
- package/dist/cjs/utils/websocket-client.js +0 -638
- package/dist/cjs/utils/websocket-client.js.map +0 -1
- package/dist/cjs/ws/base-ws-client.js +0 -280
- package/dist/cjs/ws/base-ws-client.js.map +0 -1
- package/dist/cjs/ws/dependencies-ws-client.js +0 -11
- package/dist/cjs/ws/dependencies-ws-client.js.map +0 -1
- package/dist/cjs/ws/file-editing-ws-client.js +0 -162
- package/dist/cjs/ws/file-editing-ws-client.js.map +0 -1
- package/dist/cjs/ws/filesystem-ws-client.js +0 -305
- package/dist/cjs/ws/filesystem-ws-client.js.map +0 -1
- package/dist/cjs/ws/indexing-ws-client.js +0 -275
- package/dist/cjs/ws/indexing-ws-client.js.map +0 -1
- package/dist/cjs/ws/notifications-ws-client.js +0 -12
- package/dist/cjs/ws/notifications-ws-client.js.map +0 -1
- package/dist/esm/api/agents-api.js +0 -90
- package/dist/esm/api/agents-api.js.map +0 -1
- package/dist/esm/api/chat-api/websocket-helpers.js +0 -205
- package/dist/esm/api/chat-api/websocket-helpers.js.map +0 -1
- package/dist/esm/api/dependencies-api.js +0 -282
- package/dist/esm/api/dependencies-api.js.map +0 -1
- package/dist/esm/constants/websocket-events.constants.js +0 -167
- package/dist/esm/constants/websocket-events.constants.js.map +0 -1
- package/dist/esm/constants/websocket-namespaces.constants.js +0 -19
- package/dist/esm/constants/websocket-namespaces.constants.js.map +0 -1
- package/dist/esm/interfaces/websocket/callbacks.interfaces.js +0 -2
- package/dist/esm/interfaces/websocket/callbacks.interfaces.js.map +0 -1
- package/dist/esm/interfaces/websocket/client-options.interfaces.js +0 -2
- package/dist/esm/interfaces/websocket/client-options.interfaces.js.map +0 -1
- package/dist/esm/interfaces/websocket/events.interfaces.js +0 -2
- package/dist/esm/interfaces/websocket/events.interfaces.js.map +0 -1
- package/dist/esm/interfaces/websocket/vscode-command.interfaces.js +0 -39
- package/dist/esm/interfaces/websocket/vscode-command.interfaces.js.map +0 -1
- package/dist/esm/simple-indexing-client.js +0 -134
- package/dist/esm/simple-indexing-client.js.map +0 -1
- package/dist/esm/utils/code-solver-websocket-client.js +0 -492
- package/dist/esm/utils/code-solver-websocket-client.js.map +0 -1
- package/dist/esm/utils/connection-state-manager.js +0 -129
- package/dist/esm/utils/connection-state-manager.js.map +0 -1
- package/dist/esm/utils/indexing-websocket-client.js +0 -103
- package/dist/esm/utils/indexing-websocket-client.js.map +0 -1
- package/dist/esm/utils/session-manager.js +0 -109
- package/dist/esm/utils/session-manager.js.map +0 -1
- package/dist/esm/utils/simple-connection-monitor.js +0 -48
- package/dist/esm/utils/simple-connection-monitor.js.map +0 -1
- package/dist/esm/utils/websocket-client.js +0 -634
- package/dist/esm/utils/websocket-client.js.map +0 -1
- package/dist/esm/ws/base-ws-client.js +0 -276
- package/dist/esm/ws/base-ws-client.js.map +0 -1
- package/dist/esm/ws/dependencies-ws-client.js +0 -7
- package/dist/esm/ws/dependencies-ws-client.js.map +0 -1
- package/dist/esm/ws/file-editing-ws-client.js +0 -158
- package/dist/esm/ws/file-editing-ws-client.js.map +0 -1
- package/dist/esm/ws/filesystem-ws-client.js +0 -301
- package/dist/esm/ws/filesystem-ws-client.js.map +0 -1
- package/dist/esm/ws/indexing-ws-client.js +0 -271
- package/dist/esm/ws/indexing-ws-client.js.map +0 -1
- package/dist/esm/ws/notifications-ws-client.js +0 -8
- package/dist/esm/ws/notifications-ws-client.js.map +0 -1
- package/dist/types/api/agents-api.d.ts +0 -141
- package/dist/types/api/agents-api.d.ts.map +0 -1
- package/dist/types/api/chat-api/websocket-helpers.d.ts +0 -40
- package/dist/types/api/chat-api/websocket-helpers.d.ts.map +0 -1
- package/dist/types/api/dependencies-api.d.ts +0 -109
- package/dist/types/api/dependencies-api.d.ts.map +0 -1
- package/dist/types/constants/websocket-events.constants.d.ts +0 -144
- package/dist/types/constants/websocket-events.constants.d.ts.map +0 -1
- package/dist/types/constants/websocket-namespaces.constants.d.ts +0 -17
- package/dist/types/constants/websocket-namespaces.constants.d.ts.map +0 -1
- package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts +0 -30
- package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts.map +0 -1
- package/dist/types/interfaces/websocket/client-options.interfaces.d.ts +0 -51
- package/dist/types/interfaces/websocket/client-options.interfaces.d.ts.map +0 -1
- package/dist/types/interfaces/websocket/events.interfaces.d.ts +0 -165
- package/dist/types/interfaces/websocket/events.interfaces.d.ts.map +0 -1
- package/dist/types/interfaces/websocket/vscode-command.interfaces.d.ts +0 -56
- package/dist/types/interfaces/websocket/vscode-command.interfaces.d.ts.map +0 -1
- package/dist/types/simple-indexing-client.d.ts +0 -66
- package/dist/types/simple-indexing-client.d.ts.map +0 -1
- package/dist/types/utils/code-solver-websocket-client.d.ts +0 -144
- package/dist/types/utils/code-solver-websocket-client.d.ts.map +0 -1
- package/dist/types/utils/connection-state-manager.d.ts +0 -94
- package/dist/types/utils/connection-state-manager.d.ts.map +0 -1
- package/dist/types/utils/indexing-websocket-client.d.ts +0 -123
- package/dist/types/utils/indexing-websocket-client.d.ts.map +0 -1
- package/dist/types/utils/session-manager.d.ts +0 -98
- package/dist/types/utils/session-manager.d.ts.map +0 -1
- package/dist/types/utils/simple-connection-monitor.d.ts +0 -26
- package/dist/types/utils/simple-connection-monitor.d.ts.map +0 -1
- package/dist/types/utils/websocket-client.d.ts +0 -233
- package/dist/types/utils/websocket-client.d.ts.map +0 -1
- package/dist/types/ws/base-ws-client.d.ts +0 -119
- package/dist/types/ws/base-ws-client.d.ts.map +0 -1
- package/dist/types/ws/dependencies-ws-client.d.ts +0 -6
- package/dist/types/ws/dependencies-ws-client.d.ts.map +0 -1
- package/dist/types/ws/file-editing-ws-client.d.ts +0 -85
- package/dist/types/ws/file-editing-ws-client.d.ts.map +0 -1
- package/dist/types/ws/filesystem-ws-client.d.ts +0 -201
- package/dist/types/ws/filesystem-ws-client.d.ts.map +0 -1
- package/dist/types/ws/indexing-ws-client.d.ts +0 -94
- package/dist/types/ws/indexing-ws-client.d.ts.map +0 -1
- package/dist/types/ws/notifications-ws-client.d.ts +0 -5
- package/dist/types/ws/notifications-ws-client.d.ts.map +0 -1
- package/docs/ARCHITECTURE.md +0 -268
- package/docs/QUICK_START.md +0 -126
- package/docs/WEBSOCKET.md +0 -472
|
@@ -1,436 +1,759 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 📊 Руководство по индексации проектов
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Инициализация SDK
|
|
3
|
+
## 🚀 Быстрый старт
|
|
6
4
|
|
|
7
5
|
```javascript
|
|
8
|
-
import { CodeSolverSDK } from '
|
|
6
|
+
import { CodeSolverSDK } from 'solver-sdk';
|
|
9
7
|
|
|
10
|
-
const sdk = CodeSolverSDK.create({
|
|
11
|
-
baseURL: 'http://localhost:3000'
|
|
12
|
-
apiKey: 'dev_sk_test_12345678',
|
|
13
|
-
autoConnect: false
|
|
8
|
+
const sdk = await CodeSolverSDK.create({
|
|
9
|
+
baseURL: 'http://localhost:3000'
|
|
14
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
|
+
}
|
|
15
22
|
```
|
|
16
23
|
|
|
17
|
-
##
|
|
24
|
+
## 📋 Основные методы индексации
|
|
18
25
|
|
|
19
|
-
### 1.
|
|
26
|
+
### 1. Поиск/создание проекта
|
|
20
27
|
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
```typescript
|
|
29
|
+
// Найти существующий или создать новый проект
|
|
30
|
+
const project = await sdk.projects.findOrCreateProject(
|
|
31
|
+
projectPath: string,
|
|
32
|
+
projectName?: string
|
|
33
|
+
): Promise<Project>
|
|
27
34
|
|
|
28
|
-
|
|
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
|
+
}
|
|
29
50
|
```
|
|
30
51
|
|
|
31
52
|
### 2. Запуск индексации
|
|
32
53
|
|
|
33
|
-
```
|
|
34
|
-
//
|
|
54
|
+
```typescript
|
|
55
|
+
// Запустить индексацию проекта
|
|
56
|
+
await sdk.projects.startIndexing(
|
|
57
|
+
projectId: string,
|
|
58
|
+
options?: IndexingOptions
|
|
59
|
+
): Promise<IndexingResponse>
|
|
60
|
+
|
|
61
|
+
// Примеры:
|
|
35
62
|
await sdk.projects.startIndexing(project.id);
|
|
36
63
|
|
|
37
|
-
|
|
64
|
+
await sdk.projects.startIndexing(project.id, {
|
|
65
|
+
forceFull: true, // Полная переиндексация
|
|
66
|
+
excludePatterns: ['node_modules/**', '*.log']
|
|
67
|
+
});
|
|
38
68
|
```
|
|
39
69
|
|
|
40
|
-
|
|
70
|
+
**Опции индексации:**
|
|
71
|
+
```typescript
|
|
72
|
+
interface IndexingOptions {
|
|
73
|
+
forceFull?: boolean; // Полная переиндексация (по умолчанию: false)
|
|
74
|
+
excludePatterns?: string[]; // Паттерны исключения
|
|
75
|
+
includePatterns?: string[]; // Паттерны включения
|
|
76
|
+
maxFileSize?: number; // Максимальный размер файла (байты)
|
|
77
|
+
}
|
|
78
|
+
```
|
|
41
79
|
|
|
42
|
-
|
|
43
|
-
// Получение статуса индексации
|
|
44
|
-
const status = await sdk.projects.getIndexingStatus(project.id);
|
|
80
|
+
### 3. Мониторинг статуса
|
|
45
81
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
82
|
+
```typescript
|
|
83
|
+
// Получить текущий статус проекта
|
|
84
|
+
const status = await sdk.projects.getProjectStatus(
|
|
85
|
+
projectId: string
|
|
86
|
+
): Promise<ProjectStatus>
|
|
49
87
|
```
|
|
50
88
|
|
|
51
|
-
|
|
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
|
+
```
|
|
52
102
|
|
|
53
|
-
###
|
|
103
|
+
### 4. Управление индексацией
|
|
54
104
|
|
|
55
|
-
```
|
|
56
|
-
//
|
|
57
|
-
await sdk.projects.
|
|
58
|
-
|
|
59
|
-
// Отслеживание прогресса
|
|
60
|
-
sdk.projects.onIndexingProgress((data) => {
|
|
61
|
-
console.log(`Progress: ${data.percentage}%`);
|
|
62
|
-
console.log(`Files: ${data.processedFiles}/${data.totalFiles}`);
|
|
63
|
-
console.log(`Current file: ${data.currentFile}`);
|
|
64
|
-
console.log(`Speed: ${data.filesPerSecond} files/sec`);
|
|
65
|
-
});
|
|
105
|
+
```typescript
|
|
106
|
+
// Отменить индексацию
|
|
107
|
+
await sdk.projects.cancelIndexing(projectId: string): Promise<boolean>
|
|
66
108
|
|
|
67
|
-
//
|
|
68
|
-
sdk.projects.
|
|
69
|
-
console.log('✅ Indexing completed!');
|
|
70
|
-
console.log('Project ID:', data.projectId);
|
|
71
|
-
console.log('Total files:', data.totalFiles);
|
|
72
|
-
console.log('Duration:', data.duration + 'ms');
|
|
73
|
-
console.log('Success:', data.success);
|
|
74
|
-
|
|
75
|
-
// Отключение WebSocket
|
|
76
|
-
sdk.projects.disconnectWebSocket();
|
|
77
|
-
});
|
|
109
|
+
// Очистить ошибку индексации
|
|
110
|
+
await sdk.projects.clearIndexingError(projectId: string): Promise<boolean>
|
|
78
111
|
|
|
79
|
-
//
|
|
80
|
-
sdk.projects.
|
|
81
|
-
console.error('❌ Indexing error:', error.message);
|
|
82
|
-
console.error('Project:', error.projectId);
|
|
83
|
-
console.error('File:', error.fileName);
|
|
84
|
-
|
|
85
|
-
sdk.projects.disconnectWebSocket();
|
|
86
|
-
});
|
|
112
|
+
// Удалить проект
|
|
113
|
+
await sdk.projects.deleteProject(projectId: string): Promise<void>
|
|
87
114
|
```
|
|
88
115
|
|
|
89
|
-
|
|
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
|
|
90
132
|
|
|
91
133
|
```javascript
|
|
92
|
-
async function
|
|
93
|
-
const sdk = CodeSolverSDK.create({
|
|
94
|
-
baseURL: 'http://localhost:3000'
|
|
95
|
-
apiKey: process.env.AI_SOLVER_API_KEY,
|
|
96
|
-
autoConnect: false
|
|
134
|
+
async function simpleIndexing(projectPath, projectName) {
|
|
135
|
+
const sdk = await CodeSolverSDK.create({
|
|
136
|
+
baseURL: 'http://localhost:3000'
|
|
97
137
|
});
|
|
98
138
|
|
|
99
139
|
try {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
name: projectName,
|
|
105
|
-
path: projectPath,
|
|
106
|
-
description: `AI analysis project for ${projectName}`
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
console.log('✅ Project created:', project.id);
|
|
110
|
-
|
|
111
|
-
// 2. Подключение к WebSocket для мониторинга
|
|
112
|
-
console.log('🔌 Connecting to WebSocket...');
|
|
113
|
-
await sdk.projects.connectWebSocket();
|
|
114
|
-
|
|
115
|
-
// 3. Настройка обработчиков событий
|
|
116
|
-
let indexingComplete = false;
|
|
117
|
-
|
|
118
|
-
sdk.projects.onIndexingProgress((data) => {
|
|
119
|
-
const progress = Math.round(data.percentage);
|
|
120
|
-
console.log(`📊 [${progress}%] ${data.currentFile || 'Processing...'}`);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
sdk.projects.onIndexingComplete((data) => {
|
|
124
|
-
console.log('🎉 Indexing completed successfully!');
|
|
125
|
-
console.log(`📈 Statistics:`);
|
|
126
|
-
console.log(` - Total files: ${data.totalFiles}`);
|
|
127
|
-
console.log(` - Duration: ${data.duration}ms`);
|
|
128
|
-
console.log(` - Success: ${data.success}`);
|
|
129
|
-
|
|
130
|
-
indexingComplete = true;
|
|
131
|
-
sdk.projects.disconnectWebSocket();
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
sdk.projects.onIndexingError((error) => {
|
|
135
|
-
console.error('💥 Indexing failed:', error.message);
|
|
136
|
-
indexingComplete = true;
|
|
137
|
-
sdk.projects.disconnectWebSocket();
|
|
138
|
-
});
|
|
140
|
+
// 1. Создать/найти проект
|
|
141
|
+
console.log('📁 Создание проекта...');
|
|
142
|
+
const project = await sdk.projects.findOrCreateProject(projectPath, projectName);
|
|
143
|
+
console.log(`✅ Проект создан: ${project.id}`);
|
|
139
144
|
|
|
140
|
-
//
|
|
141
|
-
console.log('🚀
|
|
145
|
+
// 2. Запустить индексацию
|
|
146
|
+
console.log('🚀 Запуск индексации...');
|
|
142
147
|
await sdk.projects.startIndexing(project.id);
|
|
143
148
|
|
|
144
|
-
//
|
|
145
|
-
|
|
146
|
-
|
|
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));
|
|
147
167
|
}
|
|
148
168
|
|
|
149
|
-
|
|
150
|
-
const finalStatus = await sdk.projects.getIndexingStatus(project.id);
|
|
151
|
-
console.log('📋 Final status:', finalStatus);
|
|
152
|
-
|
|
153
|
-
return {
|
|
154
|
-
success: true,
|
|
155
|
-
project: project,
|
|
156
|
-
status: finalStatus
|
|
157
|
-
};
|
|
169
|
+
return project;
|
|
158
170
|
|
|
159
171
|
} catch (error) {
|
|
160
|
-
console.error('❌
|
|
161
|
-
|
|
162
|
-
// Очистка ресурсов
|
|
163
|
-
try {
|
|
164
|
-
await sdk.projects.disconnectWebSocket();
|
|
165
|
-
} catch (cleanupError) {
|
|
166
|
-
console.warn('⚠️ Cleanup warning:', cleanupError.message);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
return {
|
|
170
|
-
success: false,
|
|
171
|
-
error: error.message
|
|
172
|
-
};
|
|
172
|
+
console.error('❌ Ошибка:', error.message);
|
|
173
|
+
throw error;
|
|
173
174
|
}
|
|
174
175
|
}
|
|
175
176
|
|
|
176
177
|
// Использование
|
|
177
|
-
const
|
|
178
|
-
'/path/to/my/project',
|
|
179
|
-
'My AI Project'
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
if (result.success) {
|
|
183
|
-
console.log('🎯 Project ready for AI analysis!');
|
|
184
|
-
} else {
|
|
185
|
-
console.error('💔 Indexing failed:', result.error);
|
|
186
|
-
}
|
|
178
|
+
const project = await simpleIndexing('/path/to/my-project', 'My Project');
|
|
187
179
|
```
|
|
188
180
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
### HTTP API
|
|
192
|
-
|
|
193
|
-
| Endpoint | Method | Описание |
|
|
194
|
-
|----------|--------|----------|
|
|
195
|
-
| `/api/v1/projects` | POST | Создание проекта |
|
|
196
|
-
| `/api/v1/projects/:id` | GET | Получение проекта |
|
|
197
|
-
| `/api/v1/projects` | GET | Список проектов |
|
|
198
|
-
| `/api/v1/projects/:id/index` | POST | Запуск индексации |
|
|
199
|
-
| `/api/v1/projects/:id/index/status` | GET | Статус индексации |
|
|
200
|
-
|
|
201
|
-
### WebSocket Events
|
|
202
|
-
|
|
203
|
-
| Event | Namespace | Описание |
|
|
204
|
-
|-------|-----------|----------|
|
|
205
|
-
| `indexing_progress` | `/projects` | Прогресс индексации |
|
|
206
|
-
| `indexing_complete` | `/projects` | Завершение индексации |
|
|
207
|
-
| `indexing_error` | `/projects` | Ошибка индексации |
|
|
208
|
-
|
|
209
|
-
## Структуры данных
|
|
210
|
-
|
|
211
|
-
### Project Object
|
|
181
|
+
### Продвинутый workflow с обработкой ошибок
|
|
212
182
|
|
|
213
183
|
```javascript
|
|
214
|
-
{
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
+
}
|
|
225
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
|
+
});
|
|
226
303
|
```
|
|
227
304
|
|
|
228
|
-
|
|
305
|
+
## 🎯 Интеграция с VS Code Extension
|
|
306
|
+
|
|
307
|
+
### Базовая интеграция
|
|
229
308
|
|
|
230
309
|
```javascript
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
indexStatus: "completed",
|
|
234
|
-
indexingProgress: 100,
|
|
235
|
-
filesIndexed: 150,
|
|
236
|
-
totalFiles: 150,
|
|
237
|
-
lastUpdated: "2025-06-28T12:00:00Z",
|
|
238
|
-
startedAt: "2025-06-28T11:45:00Z",
|
|
239
|
-
completedAt: "2025-06-28T12:00:00Z"
|
|
240
|
-
}
|
|
241
|
-
```
|
|
310
|
+
import * as vscode from 'vscode';
|
|
311
|
+
import { CodeSolverSDK } from 'solver-sdk';
|
|
242
312
|
|
|
243
|
-
|
|
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
|
+
}
|
|
244
390
|
|
|
245
|
-
|
|
246
|
-
{
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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);
|
|
255
423
|
}
|
|
256
424
|
```
|
|
257
425
|
|
|
258
|
-
###
|
|
426
|
+
### Автоматическая индексация при изменениях
|
|
259
427
|
|
|
260
428
|
```javascript
|
|
261
|
-
{
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
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
|
+
}
|
|
278
503
|
}
|
|
279
504
|
}
|
|
280
505
|
```
|
|
281
506
|
|
|
282
|
-
##
|
|
507
|
+
## 📊 Статистика и мониторинг
|
|
283
508
|
|
|
284
|
-
###
|
|
509
|
+
### Получение детальной статистики
|
|
285
510
|
|
|
286
511
|
```javascript
|
|
287
|
-
|
|
288
|
-
{
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
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
|
+
}
|
|
299
552
|
}
|
|
300
553
|
|
|
301
|
-
//
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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
|
+
`);
|
|
310
567
|
}
|
|
311
568
|
```
|
|
312
569
|
|
|
313
|
-
|
|
570
|
+
## 🚨 Обработка ошибок
|
|
571
|
+
|
|
572
|
+
### Типичные ошибки и решения
|
|
314
573
|
|
|
315
574
|
```javascript
|
|
316
|
-
async function
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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;
|
|
329
633
|
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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);
|
|
334
643
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
const delay = Math.pow(2, attempt) * 1000;
|
|
338
|
-
await new Promise(resolve => setTimeout(resolve, delay));
|
|
644
|
+
} catch (cleanupError) {
|
|
645
|
+
console.error('Ошибка очистки:', cleanupError.message);
|
|
339
646
|
}
|
|
647
|
+
|
|
648
|
+
throw error;
|
|
340
649
|
}
|
|
341
650
|
}
|
|
342
651
|
```
|
|
343
652
|
|
|
344
|
-
##
|
|
653
|
+
## 📝 Лучшие практики
|
|
345
654
|
|
|
346
|
-
###
|
|
655
|
+
### 1. Оптимизация производительности
|
|
347
656
|
|
|
348
657
|
```javascript
|
|
349
|
-
//
|
|
350
|
-
const
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
'
|
|
354
|
-
'
|
|
658
|
+
// ✅ Правильно - исключить ненужные файлы
|
|
659
|
+
const excludePatterns = [
|
|
660
|
+
'node_modules/**',
|
|
661
|
+
'.git/**',
|
|
662
|
+
'dist/**',
|
|
663
|
+
'build/**',
|
|
664
|
+
'*.log',
|
|
665
|
+
'*.tmp',
|
|
666
|
+
'.cache/**',
|
|
667
|
+
'coverage/**'
|
|
355
668
|
];
|
|
356
669
|
|
|
357
|
-
|
|
358
|
-
const status = diagnostics[endpoint];
|
|
359
|
-
if (status?.success) {
|
|
360
|
-
console.log(`✅ ${endpoint} - OK`);
|
|
361
|
-
} else {
|
|
362
|
-
console.error(`❌ ${endpoint} - ${status?.error || 'Failed'}`);
|
|
363
|
-
}
|
|
364
|
-
});
|
|
670
|
+
await sdk.projects.startIndexing(project.id, { excludePatterns });
|
|
365
671
|
```
|
|
366
672
|
|
|
367
|
-
###
|
|
673
|
+
### 2. Управление ресурсами
|
|
368
674
|
|
|
369
675
|
```javascript
|
|
370
|
-
//
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
|
|
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
|
+
}
|
|
378
705
|
}
|
|
379
706
|
```
|
|
380
707
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
### 1. Используйте WebSocket мониторинг
|
|
708
|
+
### 3. Пользовательский интерфейс
|
|
384
709
|
|
|
385
710
|
```javascript
|
|
386
|
-
// ✅ Правильно -
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
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
|
+
}
|
|
397
743
|
}
|
|
398
744
|
```
|
|
399
745
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
```javascript
|
|
403
|
-
// ✅ Отключайтесь после завершения
|
|
404
|
-
sdk.projects.onIndexingComplete(() => {
|
|
405
|
-
sdk.projects.disconnectWebSocket();
|
|
406
|
-
});
|
|
407
|
-
|
|
408
|
-
// ✅ Отключайтесь при ошибках
|
|
409
|
-
sdk.projects.onIndexingError(() => {
|
|
410
|
-
sdk.projects.disconnectWebSocket();
|
|
411
|
-
});
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
### 3. Обрабатывайте большие проекты
|
|
746
|
+
## 🎯 Заключение
|
|
415
747
|
|
|
416
|
-
|
|
417
|
-
// Для больших проектов показывайте детальный прогресс
|
|
418
|
-
sdk.projects.onIndexingProgress((data) => {
|
|
419
|
-
const { percentage, currentFile, filesPerSecond } = data;
|
|
420
|
-
|
|
421
|
-
// Обновление UI
|
|
422
|
-
updateProgressBar(percentage);
|
|
423
|
-
updateCurrentFile(currentFile);
|
|
424
|
-
updateSpeed(filesPerSecond);
|
|
425
|
-
|
|
426
|
-
// Оценка времени
|
|
427
|
-
const remaining = (100 - percentage) / filesPerSecond;
|
|
428
|
-
updateETA(remaining);
|
|
429
|
-
});
|
|
430
|
-
```
|
|
748
|
+
Индексация - ключевая функция для работы с поиском и AI анализом кода. Основные шаги:
|
|
431
749
|
|
|
432
|
-
|
|
750
|
+
1. **Создание проекта** - `findOrCreateProject()`
|
|
751
|
+
2. **Запуск индексации** - `startIndexing()`
|
|
752
|
+
3. **Мониторинг прогресса** - `getProjectStatus()`
|
|
753
|
+
4. **Использование результатов** - поиск функций и кода
|
|
433
754
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
755
|
+
**Помните:**
|
|
756
|
+
- Всегда обрабатывайте ошибки
|
|
757
|
+
- Показывайте прогресс пользователю
|
|
758
|
+
- Исключайте ненужные файлы
|
|
759
|
+
- Тестируйте результаты индексации
|