solver-sdk 2.8.0 → 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.
Files changed (197) hide show
  1. package/README.md +200 -368
  2. package/dist/cjs/api/chat-api/index.js +23 -49
  3. package/dist/cjs/api/chat-api/index.js.map +1 -1
  4. package/dist/cjs/api/chat-api/interfaces.js +1 -0
  5. package/dist/cjs/api/chat-api/interfaces.js.map +1 -1
  6. package/dist/cjs/api/context-api.js +6 -1
  7. package/dist/cjs/api/context-api.js.map +1 -1
  8. package/dist/cjs/api/models-api.js +43 -60
  9. package/dist/cjs/api/models-api.js.map +1 -1
  10. package/dist/cjs/api/projects-api.js +63 -293
  11. package/dist/cjs/api/projects-api.js.map +1 -1
  12. package/dist/cjs/api/search-api.js +131 -8
  13. package/dist/cjs/api/search-api.js.map +1 -1
  14. package/dist/cjs/code-solver-sdk.js +68 -322
  15. package/dist/cjs/code-solver-sdk.js.map +1 -1
  16. package/dist/cjs/index.js +3 -19
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/utils/logger.js +4 -4
  19. package/dist/cjs/utils/logger.js.map +1 -1
  20. package/dist/esm/api/chat-api/index.js +22 -48
  21. package/dist/esm/api/chat-api/index.js.map +1 -1
  22. package/dist/esm/api/chat-api/interfaces.js +1 -0
  23. package/dist/esm/api/chat-api/interfaces.js.map +1 -1
  24. package/dist/esm/api/context-api.js +6 -1
  25. package/dist/esm/api/context-api.js.map +1 -1
  26. package/dist/esm/api/models-api.js +43 -60
  27. package/dist/esm/api/models-api.js.map +1 -1
  28. package/dist/esm/api/projects-api.js +63 -293
  29. package/dist/esm/api/projects-api.js.map +1 -1
  30. package/dist/esm/api/search-api.js +131 -8
  31. package/dist/esm/api/search-api.js.map +1 -1
  32. package/dist/esm/code-solver-sdk.js +68 -322
  33. package/dist/esm/code-solver-sdk.js.map +1 -1
  34. package/dist/esm/index.js +2 -18
  35. package/dist/esm/index.js.map +1 -1
  36. package/dist/esm/utils/logger.js +3 -3
  37. package/dist/esm/utils/logger.js.map +1 -1
  38. package/dist/types/api/chat-api/index.d.ts +1 -13
  39. package/dist/types/api/chat-api/index.d.ts.map +1 -1
  40. package/dist/types/api/chat-api/interfaces.d.ts +6 -54
  41. package/dist/types/api/chat-api/interfaces.d.ts.map +1 -1
  42. package/dist/types/api/chat-api/models.d.ts +3 -26
  43. package/dist/types/api/chat-api/models.d.ts.map +1 -1
  44. package/dist/types/api/context-api.d.ts.map +1 -1
  45. package/dist/types/api/models-api.d.ts +31 -62
  46. package/dist/types/api/models-api.d.ts.map +1 -1
  47. package/dist/types/api/projects-api.d.ts +47 -126
  48. package/dist/types/api/projects-api.d.ts.map +1 -1
  49. package/dist/types/api/search-api.d.ts +147 -6
  50. package/dist/types/api/search-api.d.ts.map +1 -1
  51. package/dist/types/code-solver-sdk.d.ts +36 -86
  52. package/dist/types/code-solver-sdk.d.ts.map +1 -1
  53. package/dist/types/index.d.ts +1 -14
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/dist/types/interfaces/sdk-options.d.ts +18 -66
  56. package/dist/types/interfaces/sdk-options.d.ts.map +1 -1
  57. package/dist/types/utils/logger.d.ts +3 -3
  58. package/dist/types/utils/logger.d.ts.map +1 -1
  59. package/docs/README.md +53 -37
  60. package/docs/VSCODE_INTEGRATION.md +208 -371
  61. package/docs/indexing/INDEXING.md +658 -335
  62. package/package.json +26 -23
  63. package/dist/cjs/api/agents-api.js +0 -94
  64. package/dist/cjs/api/agents-api.js.map +0 -1
  65. package/dist/cjs/api/chat-api/websocket-helpers.js +0 -211
  66. package/dist/cjs/api/chat-api/websocket-helpers.js.map +0 -1
  67. package/dist/cjs/api/dependencies-api.js +0 -286
  68. package/dist/cjs/api/dependencies-api.js.map +0 -1
  69. package/dist/cjs/constants/websocket-events.constants.js +0 -170
  70. package/dist/cjs/constants/websocket-events.constants.js.map +0 -1
  71. package/dist/cjs/constants/websocket-namespaces.constants.js +0 -22
  72. package/dist/cjs/constants/websocket-namespaces.constants.js.map +0 -1
  73. package/dist/cjs/interfaces/websocket/callbacks.interfaces.js +0 -3
  74. package/dist/cjs/interfaces/websocket/callbacks.interfaces.js.map +0 -1
  75. package/dist/cjs/interfaces/websocket/client-options.interfaces.js +0 -3
  76. package/dist/cjs/interfaces/websocket/client-options.interfaces.js.map +0 -1
  77. package/dist/cjs/interfaces/websocket/events.interfaces.js +0 -3
  78. package/dist/cjs/interfaces/websocket/events.interfaces.js.map +0 -1
  79. package/dist/cjs/interfaces/websocket/vscode-command.interfaces.js +0 -42
  80. package/dist/cjs/interfaces/websocket/vscode-command.interfaces.js.map +0 -1
  81. package/dist/cjs/simple-indexing-client.js +0 -138
  82. package/dist/cjs/simple-indexing-client.js.map +0 -1
  83. package/dist/cjs/utils/code-solver-websocket-client.js +0 -497
  84. package/dist/cjs/utils/code-solver-websocket-client.js.map +0 -1
  85. package/dist/cjs/utils/connection-state-manager.js +0 -133
  86. package/dist/cjs/utils/connection-state-manager.js.map +0 -1
  87. package/dist/cjs/utils/indexing-websocket-client.js +0 -107
  88. package/dist/cjs/utils/indexing-websocket-client.js.map +0 -1
  89. package/dist/cjs/utils/session-manager.js +0 -114
  90. package/dist/cjs/utils/session-manager.js.map +0 -1
  91. package/dist/cjs/utils/simple-connection-monitor.js +0 -52
  92. package/dist/cjs/utils/simple-connection-monitor.js.map +0 -1
  93. package/dist/cjs/utils/websocket-client.js +0 -638
  94. package/dist/cjs/utils/websocket-client.js.map +0 -1
  95. package/dist/cjs/ws/base-ws-client.js +0 -280
  96. package/dist/cjs/ws/base-ws-client.js.map +0 -1
  97. package/dist/cjs/ws/dependencies-ws-client.js +0 -11
  98. package/dist/cjs/ws/dependencies-ws-client.js.map +0 -1
  99. package/dist/cjs/ws/file-editing-ws-client.js +0 -162
  100. package/dist/cjs/ws/file-editing-ws-client.js.map +0 -1
  101. package/dist/cjs/ws/filesystem-ws-client.js +0 -305
  102. package/dist/cjs/ws/filesystem-ws-client.js.map +0 -1
  103. package/dist/cjs/ws/indexing-ws-client.js +0 -275
  104. package/dist/cjs/ws/indexing-ws-client.js.map +0 -1
  105. package/dist/cjs/ws/notifications-ws-client.js +0 -12
  106. package/dist/cjs/ws/notifications-ws-client.js.map +0 -1
  107. package/dist/esm/api/agents-api.js +0 -90
  108. package/dist/esm/api/agents-api.js.map +0 -1
  109. package/dist/esm/api/chat-api/websocket-helpers.js +0 -205
  110. package/dist/esm/api/chat-api/websocket-helpers.js.map +0 -1
  111. package/dist/esm/api/dependencies-api.js +0 -282
  112. package/dist/esm/api/dependencies-api.js.map +0 -1
  113. package/dist/esm/constants/websocket-events.constants.js +0 -167
  114. package/dist/esm/constants/websocket-events.constants.js.map +0 -1
  115. package/dist/esm/constants/websocket-namespaces.constants.js +0 -19
  116. package/dist/esm/constants/websocket-namespaces.constants.js.map +0 -1
  117. package/dist/esm/interfaces/websocket/callbacks.interfaces.js +0 -2
  118. package/dist/esm/interfaces/websocket/callbacks.interfaces.js.map +0 -1
  119. package/dist/esm/interfaces/websocket/client-options.interfaces.js +0 -2
  120. package/dist/esm/interfaces/websocket/client-options.interfaces.js.map +0 -1
  121. package/dist/esm/interfaces/websocket/events.interfaces.js +0 -2
  122. package/dist/esm/interfaces/websocket/events.interfaces.js.map +0 -1
  123. package/dist/esm/interfaces/websocket/vscode-command.interfaces.js +0 -39
  124. package/dist/esm/interfaces/websocket/vscode-command.interfaces.js.map +0 -1
  125. package/dist/esm/simple-indexing-client.js +0 -134
  126. package/dist/esm/simple-indexing-client.js.map +0 -1
  127. package/dist/esm/utils/code-solver-websocket-client.js +0 -492
  128. package/dist/esm/utils/code-solver-websocket-client.js.map +0 -1
  129. package/dist/esm/utils/connection-state-manager.js +0 -129
  130. package/dist/esm/utils/connection-state-manager.js.map +0 -1
  131. package/dist/esm/utils/indexing-websocket-client.js +0 -103
  132. package/dist/esm/utils/indexing-websocket-client.js.map +0 -1
  133. package/dist/esm/utils/session-manager.js +0 -109
  134. package/dist/esm/utils/session-manager.js.map +0 -1
  135. package/dist/esm/utils/simple-connection-monitor.js +0 -48
  136. package/dist/esm/utils/simple-connection-monitor.js.map +0 -1
  137. package/dist/esm/utils/websocket-client.js +0 -634
  138. package/dist/esm/utils/websocket-client.js.map +0 -1
  139. package/dist/esm/ws/base-ws-client.js +0 -276
  140. package/dist/esm/ws/base-ws-client.js.map +0 -1
  141. package/dist/esm/ws/dependencies-ws-client.js +0 -7
  142. package/dist/esm/ws/dependencies-ws-client.js.map +0 -1
  143. package/dist/esm/ws/file-editing-ws-client.js +0 -158
  144. package/dist/esm/ws/file-editing-ws-client.js.map +0 -1
  145. package/dist/esm/ws/filesystem-ws-client.js +0 -301
  146. package/dist/esm/ws/filesystem-ws-client.js.map +0 -1
  147. package/dist/esm/ws/indexing-ws-client.js +0 -271
  148. package/dist/esm/ws/indexing-ws-client.js.map +0 -1
  149. package/dist/esm/ws/notifications-ws-client.js +0 -8
  150. package/dist/esm/ws/notifications-ws-client.js.map +0 -1
  151. package/dist/types/api/agents-api.d.ts +0 -141
  152. package/dist/types/api/agents-api.d.ts.map +0 -1
  153. package/dist/types/api/chat-api/websocket-helpers.d.ts +0 -40
  154. package/dist/types/api/chat-api/websocket-helpers.d.ts.map +0 -1
  155. package/dist/types/api/dependencies-api.d.ts +0 -109
  156. package/dist/types/api/dependencies-api.d.ts.map +0 -1
  157. package/dist/types/constants/websocket-events.constants.d.ts +0 -144
  158. package/dist/types/constants/websocket-events.constants.d.ts.map +0 -1
  159. package/dist/types/constants/websocket-namespaces.constants.d.ts +0 -17
  160. package/dist/types/constants/websocket-namespaces.constants.d.ts.map +0 -1
  161. package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts +0 -30
  162. package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts.map +0 -1
  163. package/dist/types/interfaces/websocket/client-options.interfaces.d.ts +0 -51
  164. package/dist/types/interfaces/websocket/client-options.interfaces.d.ts.map +0 -1
  165. package/dist/types/interfaces/websocket/events.interfaces.d.ts +0 -165
  166. package/dist/types/interfaces/websocket/events.interfaces.d.ts.map +0 -1
  167. package/dist/types/interfaces/websocket/vscode-command.interfaces.d.ts +0 -56
  168. package/dist/types/interfaces/websocket/vscode-command.interfaces.d.ts.map +0 -1
  169. package/dist/types/simple-indexing-client.d.ts +0 -66
  170. package/dist/types/simple-indexing-client.d.ts.map +0 -1
  171. package/dist/types/utils/code-solver-websocket-client.d.ts +0 -144
  172. package/dist/types/utils/code-solver-websocket-client.d.ts.map +0 -1
  173. package/dist/types/utils/connection-state-manager.d.ts +0 -94
  174. package/dist/types/utils/connection-state-manager.d.ts.map +0 -1
  175. package/dist/types/utils/indexing-websocket-client.d.ts +0 -123
  176. package/dist/types/utils/indexing-websocket-client.d.ts.map +0 -1
  177. package/dist/types/utils/session-manager.d.ts +0 -98
  178. package/dist/types/utils/session-manager.d.ts.map +0 -1
  179. package/dist/types/utils/simple-connection-monitor.d.ts +0 -26
  180. package/dist/types/utils/simple-connection-monitor.d.ts.map +0 -1
  181. package/dist/types/utils/websocket-client.d.ts +0 -233
  182. package/dist/types/utils/websocket-client.d.ts.map +0 -1
  183. package/dist/types/ws/base-ws-client.d.ts +0 -119
  184. package/dist/types/ws/base-ws-client.d.ts.map +0 -1
  185. package/dist/types/ws/dependencies-ws-client.d.ts +0 -6
  186. package/dist/types/ws/dependencies-ws-client.d.ts.map +0 -1
  187. package/dist/types/ws/file-editing-ws-client.d.ts +0 -85
  188. package/dist/types/ws/file-editing-ws-client.d.ts.map +0 -1
  189. package/dist/types/ws/filesystem-ws-client.d.ts +0 -201
  190. package/dist/types/ws/filesystem-ws-client.d.ts.map +0 -1
  191. package/dist/types/ws/indexing-ws-client.d.ts +0 -94
  192. package/dist/types/ws/indexing-ws-client.d.ts.map +0 -1
  193. package/dist/types/ws/notifications-ws-client.d.ts +0 -5
  194. package/dist/types/ws/notifications-ws-client.d.ts.map +0 -1
  195. package/docs/ARCHITECTURE.md +0 -268
  196. package/docs/QUICK_START.md +0 -126
  197. package/docs/WEBSOCKET.md +0 -472
@@ -1,436 +1,759 @@
1
- # Индексация проектов v2.5.0
1
+ # 📊 Руководство по индексации проектов
2
2
 
3
- Руководство по индексации проектов в AI Solver SDK v2.5.0.
4
-
5
- ## Инициализация SDK
3
+ ## 🚀 Быстрый старт
6
4
 
7
5
  ```javascript
8
- import { CodeSolverSDK } from '@ai-solver/sdk';
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
- ## Основной workflow индексации
24
+ ## 📋 Основные методы индексации
18
25
 
19
- ### 1. Создание проекта
26
+ ### 1. Поиск/создание проекта
20
27
 
21
- ```javascript
22
- const project = await sdk.projects.create({
23
- name: 'My Code Project',
24
- path: '/path/to/project',
25
- description: 'Project for AI analysis'
26
- });
28
+ ```typescript
29
+ // Найти существующий или создать новый проект
30
+ const project = await sdk.projects.findOrCreateProject(
31
+ projectPath: string,
32
+ projectName?: string
33
+ ): Promise<Project>
27
34
 
28
- console.log('Project created:', project.id);
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
- ```javascript
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
- console.log('Indexing started for project:', project.id);
64
+ await sdk.projects.startIndexing(project.id, {
65
+ forceFull: true, // Полная переиндексация
66
+ excludePatterns: ['node_modules/**', '*.log']
67
+ });
38
68
  ```
39
69
 
40
- ### 3. Проверка статуса
70
+ **Опции индексации:**
71
+ ```typescript
72
+ interface IndexingOptions {
73
+ forceFull?: boolean; // Полная переиндексация (по умолчанию: false)
74
+ excludePatterns?: string[]; // Паттерны исключения
75
+ includePatterns?: string[]; // Паттерны включения
76
+ maxFileSize?: number; // Максимальный размер файла (байты)
77
+ }
78
+ ```
41
79
 
42
- ```javascript
43
- // Получение статуса индексации
44
- const status = await sdk.projects.getIndexingStatus(project.id);
80
+ ### 3. Мониторинг статуса
45
81
 
46
- console.log('Indexing status:', status.indexStatus);
47
- console.log('Progress:', status.indexingProgress);
48
- console.log('Files indexed:', status.filesIndexed);
82
+ ```typescript
83
+ // Получить текущий статус проекта
84
+ const status = await sdk.projects.getProjectStatus(
85
+ projectId: string
86
+ ): Promise<ProjectStatus>
49
87
  ```
50
88
 
51
- ## WebSocket мониторинг индексации
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
- ```javascript
56
- // Подключение к projects WebSocket
57
- await sdk.projects.connectWebSocket();
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.onIndexingComplete((data) => {
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.onIndexingError((error) => {
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 indexProjectWithMonitoring(projectPath, projectName) {
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
- console.log('🔍 Creating project...');
101
-
102
- // 1. Создание проекта
103
- const project = await sdk.projects.create({
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
- // 4. Запуск индексации
141
- console.log('🚀 Starting indexing...');
145
+ // 2. Запустить индексацию
146
+ console.log('🚀 Запуск индексации...');
142
147
  await sdk.projects.startIndexing(project.id);
143
148
 
144
- // 5. Ожидание завершения
145
- while (!indexingComplete) {
146
- await new Promise(resolve => setTimeout(resolve, 1000));
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
- // 6. Проверка финального статуса
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('❌ Indexing workflow failed:', error.message);
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 result = await indexProjectWithMonitoring(
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
- ## API Endpoints для индексации
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
- id: "proj_abc123",
216
- name: "My Project",
217
- path: "/path/to/project",
218
- description: "Project description",
219
- indexStatus: "completed", // pending, indexing, completed, failed
220
- indexingProgress: 100,
221
- filesIndexed: 150,
222
- lastIndexed: "2025-06-28T12:00:00Z",
223
- createdAt: "2025-06-28T11:00:00Z",
224
- updatedAt: "2025-06-28T12:00:00Z"
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
- ### Indexing Status
305
+ ## 🎯 Интеграция с VS Code Extension
306
+
307
+ ### Базовая интеграция
229
308
 
230
309
  ```javascript
231
- {
232
- projectId: "proj_abc123",
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
- ### Progress Event
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
- ```javascript
246
- {
247
- projectId: "proj_abc123",
248
- percentage: 75,
249
- processedFiles: 112,
250
- totalFiles: 150,
251
- currentFile: "src/components/App.tsx",
252
- status: "indexing",
253
- filesPerSecond: 8.5,
254
- estimatedTimeRemaining: 4500
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
- ### Complete Event
426
+ ### Автоматическая индексация при изменениях
259
427
 
260
428
  ```javascript
261
- {
262
- projectId: "proj_abc123",
263
- totalFiles: 150,
264
- duration: 18750,
265
- success: true,
266
- errors: [],
267
- statistics: {
268
- byLanguage: {
269
- "typescript": 45,
270
- "javascript": 38,
271
- "css": 12,
272
- "html": 8,
273
- "json": 5,
274
- "markdown": 2
275
- },
276
- totalLines: 12450,
277
- totalSize: 1024000
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
- status: 404,
290
- code: 'PROJECT_NOT_FOUND',
291
- message: 'Project with ID "proj_123" not found'
292
- }
293
-
294
- // Индексация уже запущена
295
- {
296
- status: 409,
297
- code: 'INDEXING_IN_PROGRESS',
298
- message: 'Indexing is already in progress for this project'
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
- status: 500,
304
- code: 'FILESYSTEM_ERROR',
305
- message: 'Cannot access project files',
306
- details: {
307
- path: '/path/to/project',
308
- error: 'Permission denied'
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
- ### Стратегия retry
570
+ ## 🚨 Обработка ошибок
571
+
572
+ ### Типичные ошибки и решения
314
573
 
315
574
  ```javascript
316
- async function retryableIndexing(projectId, maxRetries = 3) {
317
- for (let attempt = 1; attempt <= maxRetries; attempt++) {
318
- try {
319
- await sdk.projects.startIndexing(projectId);
320
- console.log('✅ Indexing started successfully');
321
- return true;
322
-
323
- } catch (error) {
324
- console.warn(`⚠️ Attempt ${attempt} failed:`, error.message);
325
-
326
- // Не повторяем для клиентских ошибок
327
- if (error.status >= 400 && error.status < 500) {
328
- throw error;
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
- if (attempt === maxRetries) {
333
- throw error;
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
- ### Проверка доступности API
655
+ ### 1. Оптимизация производительности
347
656
 
348
657
  ```javascript
349
- // Проверка endpoints для индексации
350
- const diagnostics = await sdk.diagnoseAPI();
351
-
352
- const indexingEndpoints = [
353
- '/api/v1/projects',
354
- '/api/v1/projects/:id/index'
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
- indexingEndpoints.forEach(endpoint => {
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
- ### WebSocket диагностика
673
+ ### 2. Управление ресурсами
368
674
 
369
675
  ```javascript
370
- // Проверка WebSocket для projects
371
- const wsStatus = await sdk.diagnoseWebSocket();
372
-
373
- if (wsStatus.projects?.connected) {
374
- console.log('✅ Projects WebSocket - Connected');
375
- } else {
376
- console.error('❌ Projects WebSocket - Disconnected');
377
- console.error('Error:', wsStatus.projects?.error);
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
- // ✅ Правильно - с WebSocket
387
- await sdk.projects.connectWebSocket();
388
- sdk.projects.onIndexingProgress(handleProgress);
389
- await sdk.projects.startIndexing(projectId);
390
-
391
- // ❌ Неэффективно - polling
392
- await sdk.projects.startIndexing(projectId);
393
- while (true) {
394
- const status = await sdk.projects.getIndexingStatus(projectId);
395
- if (status.indexStatus === 'completed') break;
396
- await new Promise(resolve => setTimeout(resolve, 5000));
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
- ### 2. Правильно управляйте WebSocket
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
- ```javascript
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
- **Документация индексации для SDK v2.5.0**
435
- **Совместимость:** AI Solver Backend v1.0.0
436
- **Обновлено:** 28 июня 2025
755
+ **Помните:**
756
+ - Всегда обрабатывайте ошибки
757
+ - Показывайте прогресс пользователю
758
+ - Исключайте ненужные файлы
759
+ - Тестируйте результаты индексации