solver-sdk 5.1.3 → 5.1.5
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 +475 -364
- package/dist/cjs/api/indexing-api.js +182 -0
- package/dist/cjs/api/indexing-api.js.map +1 -0
- package/dist/cjs/api/projects-api.js +42 -3
- package/dist/cjs/api/projects-api.js.map +1 -1
- package/dist/cjs/api/search-api.js +19 -2
- package/dist/cjs/api/search-api.js.map +1 -1
- package/dist/cjs/code-solver-sdk.js +62 -5
- package/dist/cjs/code-solver-sdk.js.map +1 -1
- package/dist/cjs/utils/project-sync-client.js +284 -0
- package/dist/cjs/utils/project-sync-client.js.map +1 -0
- package/dist/esm/api/indexing-api.js +178 -0
- package/dist/esm/api/indexing-api.js.map +1 -0
- package/dist/esm/api/projects-api.js +42 -3
- package/dist/esm/api/projects-api.js.map +1 -1
- package/dist/esm/api/search-api.js +19 -2
- package/dist/esm/api/search-api.js.map +1 -1
- package/dist/esm/code-solver-sdk.js +62 -5
- package/dist/esm/code-solver-sdk.js.map +1 -1
- package/dist/esm/utils/project-sync-client.js +280 -0
- package/dist/esm/utils/project-sync-client.js.map +1 -0
- package/dist/types/api/indexing-api.d.ts +131 -0
- package/dist/types/api/indexing-api.d.ts.map +1 -0
- package/dist/types/api/projects-api.d.ts +31 -2
- package/dist/types/api/projects-api.d.ts.map +1 -1
- package/dist/types/api/search-api.d.ts +7 -0
- package/dist/types/api/search-api.d.ts.map +1 -1
- package/dist/types/code-solver-sdk.d.ts +30 -1
- package/dist/types/code-solver-sdk.d.ts.map +1 -1
- package/dist/types/interfaces/sdk-options.d.ts +16 -0
- package/dist/types/interfaces/sdk-options.d.ts.map +1 -1
- package/dist/types/utils/project-sync-client.d.ts +142 -0
- package/dist/types/utils/project-sync-client.d.ts.map +1 -0
- package/package.json +14 -8
package/README.md
CHANGED
|
@@ -1,29 +1,8 @@
|
|
|
1
|
-
# Code Solver SDK
|
|
1
|
+
# Code Solver SDK
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
> Без legacy кода, без мертвых методов, только актуальный API
|
|
3
|
+
🚀 **Официальный JavaScript/TypeScript SDK для Code Solver API**
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
## 🎯 Основные возможности
|
|
9
|
-
|
|
10
|
-
- **🔄 Delta-Chunking** - Cursor-like инкрементальная синхронизация проектов
|
|
11
|
-
- **💬 Chat API** - взаимодействие с AI моделями (Claude, GPT)
|
|
12
|
-
- **🔍 Code Search** - семантический поиск по коду и функциям
|
|
13
|
-
- **📊 Project Indexing** - индексация и анализ проектов с **богатой информацией**
|
|
14
|
-
- **📝 Context API** - получение контекста для AI
|
|
15
|
-
- **🛠️ Code Modification** - модификация кода через AI
|
|
16
|
-
- **🔇 Настраиваемое логирование** - полный контроль над выводом в консоль
|
|
17
|
-
- **✨ Улучшенная типизация** - полные TypeScript типы с примерами и документацией
|
|
18
|
-
|
|
19
|
-
## 🚀 Что нового в v5.1.0
|
|
20
|
-
|
|
21
|
-
> **🔄 Delta-Chunking API** - добавлена полная документация для новой архитектуры синхронизации
|
|
22
|
-
|
|
23
|
-
- ✨ **Delta-Chunking интеграция** - встроено в основной CodeSolverSDK класс
|
|
24
|
-
- 📝 **Полная документация** - все методы, типы и примеры использования
|
|
25
|
-
- 🔐 **Шифрование и chunking** - конфигурация encryption и chunking опций
|
|
26
|
-
- 🎯 **Готово к продакшену** - интеграция с backend полностью реализована
|
|
5
|
+
Современный SDK для интеграции с Code Solver - платформой для анализа кода, векторного поиска и AI-ассистента. Поддерживает WebSocket для real-time уведомлений и delta-chunking для эффективной синхронизации.
|
|
27
6
|
|
|
28
7
|
## 📦 Установка
|
|
29
8
|
|
|
@@ -31,453 +10,585 @@ JavaScript/TypeScript SDK для работы с Code Solver API. Предост
|
|
|
31
10
|
npm install solver-sdk
|
|
32
11
|
```
|
|
33
12
|
|
|
34
|
-
## ⚙️ Конфигурация
|
|
35
|
-
|
|
36
|
-
```javascript
|
|
37
|
-
const sdk = await CodeSolverSDK.create({
|
|
38
|
-
baseURL: 'http://localhost:3000', // Обязательный
|
|
39
|
-
apiKey: 'your-api-key', // Опционально
|
|
40
|
-
timeout: 30000, // Таймаут запросов (мс)
|
|
41
|
-
debug: 'error' // Уровень логирования
|
|
42
|
-
});
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### 📊 Уровни логирования
|
|
46
|
-
- `'silent'` - полное отключение
|
|
47
|
-
- `'error'` - только ошибки (рекомендуется)
|
|
48
|
-
- `'warn'` - предупреждения и ошибки
|
|
49
|
-
- `'info'` - базовая информация
|
|
50
|
-
- `'debug'` - подробная отладка
|
|
51
|
-
|
|
52
13
|
## 🚀 Быстрый старт
|
|
53
14
|
|
|
54
15
|
```javascript
|
|
55
16
|
import { CodeSolverSDK } from 'solver-sdk';
|
|
56
17
|
|
|
57
|
-
|
|
58
|
-
const sdk = await CodeSolverSDK.create({
|
|
18
|
+
const sdk = new CodeSolverSDK({
|
|
59
19
|
baseURL: 'http://localhost:3000',
|
|
60
|
-
|
|
20
|
+
apiKey: 'your-api-key',
|
|
21
|
+
webSocket: { enabled: true } // Включить WebSocket для real-time уведомлений
|
|
61
22
|
});
|
|
62
23
|
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
'My Project',
|
|
66
|
-
'/path/to/project'
|
|
67
|
-
);
|
|
24
|
+
// Подключение к WebSocket
|
|
25
|
+
await sdk.connectWebSocket();
|
|
68
26
|
|
|
69
|
-
//
|
|
70
|
-
await sdk.projects.
|
|
27
|
+
// Создание проекта
|
|
28
|
+
const project = await sdk.projects.createProject('My Project', '/path/to/project');
|
|
29
|
+
|
|
30
|
+
// Запуск индексации с real-time статусом
|
|
31
|
+
const indexResult = await sdk.indexing.indexProject('/path', 'My Project');
|
|
71
32
|
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
console.log(
|
|
33
|
+
// Подписка на real-time уведомления
|
|
34
|
+
sdk.projectSync.on('sync-status-update', (status) => {
|
|
35
|
+
console.log(`Индексация: ${status.progress}%`);
|
|
36
|
+
});
|
|
75
37
|
|
|
76
|
-
//
|
|
38
|
+
// Поиск по коду
|
|
77
39
|
const results = await sdk.search.searchCode(project.id, {
|
|
78
|
-
query: 'function
|
|
40
|
+
query: 'function authenticate',
|
|
79
41
|
limit: 10
|
|
80
42
|
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 📖 API Reference
|
|
46
|
+
|
|
47
|
+
### 🏗️ Инициализация SDK
|
|
81
48
|
|
|
82
|
-
|
|
83
|
-
const response = await sdk.chat.chat([
|
|
84
|
-
{ role: 'user', content: 'Объясни найденный код' }
|
|
85
|
-
], { projectId: project.id });
|
|
49
|
+
#### `new CodeSolverSDK(options)`
|
|
86
50
|
|
|
87
|
-
|
|
51
|
+
```typescript
|
|
52
|
+
interface CodeSolverSDKOptions {
|
|
53
|
+
baseURL: string; // URL API сервера
|
|
54
|
+
apiKey?: string; // API ключ для авторизации
|
|
55
|
+
timeout?: number; // Таймаут запросов (по умолчанию 45000ms)
|
|
56
|
+
headers?: Record<string, string>; // Дополнительные HTTP заголовки
|
|
57
|
+
|
|
58
|
+
// WebSocket настройки
|
|
59
|
+
webSocket?: {
|
|
60
|
+
enabled?: boolean; // Включить WebSocket (по умолчанию true)
|
|
61
|
+
connectionTimeout?: number; // Таймаут подключения (10000ms)
|
|
62
|
+
maxRetries?: number; // Максимум попыток переподключения (3)
|
|
63
|
+
retryDelay?: number; // Задержка между попытками (2000ms)
|
|
64
|
+
debug?: boolean; // Отладочные логи (false)
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Delta-Chunking настройки
|
|
68
|
+
deltaChunking?: {
|
|
69
|
+
enabled?: boolean; // Включить delta-chunking (по умолчанию true)
|
|
70
|
+
chunkSize?: number; // Размер чанка (4096 байт)
|
|
71
|
+
maxConcurrentChunks?: number; // Максимум параллельных чанков (5)
|
|
72
|
+
};
|
|
73
|
+
}
|
|
88
74
|
```
|
|
89
75
|
|
|
90
|
-
|
|
76
|
+
### 📁 Projects API (`sdk.projects`)
|
|
91
77
|
|
|
92
|
-
|
|
93
|
-
|
|
78
|
+
#### Управление проектами
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
94
81
|
// Создание проекта
|
|
95
|
-
|
|
96
|
-
|
|
82
|
+
createProject(name: string, path: string, data?: any): Promise<Project>
|
|
83
|
+
|
|
84
|
+
// Получение всех проектов
|
|
85
|
+
getAllProjects(): Promise<Project[]>
|
|
86
|
+
getProjects(): Promise<Project[]> // Псевдоним
|
|
97
87
|
|
|
98
|
-
// Получение
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
88
|
+
// Получение проекта по ID
|
|
89
|
+
getProject(projectId: string): Promise<Project | null>
|
|
90
|
+
|
|
91
|
+
// Поиск или создание проекта
|
|
92
|
+
findOrCreateProject(projectPath: string, projectName: string, description?: string): Promise<Project>
|
|
93
|
+
|
|
94
|
+
// Получение статуса индексации проекта
|
|
95
|
+
getIndexingStatus(projectId: string): Promise<any>
|
|
102
96
|
```
|
|
103
97
|
|
|
104
|
-
|
|
98
|
+
#### Примеры использования
|
|
99
|
+
|
|
105
100
|
```javascript
|
|
106
|
-
//
|
|
107
|
-
await sdk.projects.
|
|
108
|
-
|
|
101
|
+
// Создание нового проекта
|
|
102
|
+
const project = await sdk.projects.createProject(
|
|
103
|
+
'My Web App',
|
|
104
|
+
'/Users/dev/my-web-app',
|
|
105
|
+
{ description: 'React приложение' }
|
|
106
|
+
);
|
|
109
107
|
|
|
110
|
-
//
|
|
111
|
-
const
|
|
112
|
-
console.log(
|
|
108
|
+
// Получение всех проектов пользователя
|
|
109
|
+
const projects = await sdk.projects.getAllProjects();
|
|
110
|
+
console.log(`У вас ${projects.length} проектов`);
|
|
111
|
+
|
|
112
|
+
// Поиск существующего или создание нового
|
|
113
|
+
const project = await sdk.projects.findOrCreateProject(
|
|
114
|
+
'/path/to/project',
|
|
115
|
+
'My Project',
|
|
116
|
+
'Описание проекта'
|
|
117
|
+
);
|
|
113
118
|
```
|
|
114
119
|
|
|
115
|
-
###
|
|
120
|
+
### 🚀 Indexing API (`sdk.indexing`)
|
|
121
|
+
|
|
122
|
+
#### Управление индексацией
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
// Создание проекта и запуск индексации
|
|
126
|
+
indexProject(projectPath: string, projectName: string, description?: string): Promise<IndexProjectResult>
|
|
127
|
+
|
|
128
|
+
// Получение статуса индексации
|
|
129
|
+
getStatus(projectId: string): Promise<IndexingStatus>
|
|
130
|
+
|
|
131
|
+
// Ожидание завершения индексации (DEPRECATED - используйте WebSocket)
|
|
132
|
+
waitForCompletion(projectId: string, timeout?: number): Promise<IndexingStatus>
|
|
133
|
+
|
|
134
|
+
// Отмена индексации
|
|
135
|
+
cancelIndexing(projectId: string): Promise<void>
|
|
136
|
+
|
|
137
|
+
// Перезапуск индексации
|
|
138
|
+
restartIndexing(projectId: string): Promise<IndexingStatus>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
#### Типы данных
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
interface IndexingStatus {
|
|
145
|
+
status: string; // 'pending' | 'processing' | 'completed' | 'failed'
|
|
146
|
+
progress: number; // Прогресс 0-100
|
|
147
|
+
totalFiles?: number; // Общее количество файлов
|
|
148
|
+
processedFiles?: number; // Обработано файлов
|
|
149
|
+
currentFile?: string; // Текущий обрабатываемый файл
|
|
150
|
+
error?: string; // Сообщение об ошибке
|
|
151
|
+
updatedAt?: string; // Время последнего обновления
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### Примеры использования
|
|
156
|
+
|
|
116
157
|
```javascript
|
|
117
|
-
//
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
158
|
+
// Запуск индексации
|
|
159
|
+
const result = await sdk.indexing.indexProject(
|
|
160
|
+
'/Users/dev/my-project',
|
|
161
|
+
'My Project'
|
|
162
|
+
);
|
|
163
|
+
console.log('Project ID:', result.projectId);
|
|
164
|
+
|
|
165
|
+
// Получение статуса (единичный запрос)
|
|
166
|
+
const status = await sdk.indexing.getStatus(result.projectId);
|
|
167
|
+
console.log(`Прогресс: ${status.progress}%`);
|
|
168
|
+
|
|
169
|
+
// ⚠️ ВАЖНО: Для real-time статуса используйте WebSocket!
|
|
170
|
+
sdk.projectSync.on('sync-status-update', (status) => {
|
|
171
|
+
console.log(`Статус обновлен: ${status.status}, прогресс: ${status.progress}%`);
|
|
121
172
|
});
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### 🔍 Search API (`sdk.search`)
|
|
176
|
+
|
|
177
|
+
#### Поиск по коду
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
// Основной поиск по коду
|
|
181
|
+
searchCode(projectId: string, params: SearchCodeParams): Promise<SearchResult[]>
|
|
182
|
+
searchCode(params: SearchCodeParams): Promise<SearchResult[]> // Альтернативная сигнатура
|
|
183
|
+
|
|
184
|
+
// Семантический поиск
|
|
185
|
+
semanticSearch(projectId: string, params: Omit<SearchCodeParams, 'projectId'>): Promise<SearchResult[]>
|
|
122
186
|
|
|
123
187
|
// Поиск функций
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
188
|
+
searchFunctions(projectId: string, params: SearchFunctionsParams): Promise<FunctionSearchResult>
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
#### Параметры поиска
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
interface SearchCodeParams {
|
|
195
|
+
projectId?: string; // ID проекта (если не передан отдельно)
|
|
196
|
+
query: string; // Поисковый запрос
|
|
197
|
+
limit?: number; // Максимум результатов (по умолчанию 10)
|
|
198
|
+
maxResults?: number; // Альтернативное название для limit
|
|
199
|
+
semantic?: boolean; // Флаг семантического поиска
|
|
200
|
+
}
|
|
128
201
|
|
|
129
|
-
|
|
130
|
-
|
|
202
|
+
interface SearchResult {
|
|
203
|
+
id: string; // Уникальный ID результата
|
|
204
|
+
score: number; // Оценка релевантности (0-1)
|
|
205
|
+
filePath: string; // Путь к файлу
|
|
206
|
+
fileName: string; // Имя файла
|
|
207
|
+
language: string; // Язык программирования
|
|
208
|
+
snippet: string; // Фрагмент кода
|
|
209
|
+
line: number; // Номер строки
|
|
210
|
+
size: number; // Размер фрагмента
|
|
211
|
+
indexedAt?: string; // Время индексации
|
|
212
|
+
}
|
|
131
213
|
```
|
|
132
214
|
|
|
133
|
-
|
|
215
|
+
#### Примеры использования
|
|
216
|
+
|
|
134
217
|
```javascript
|
|
135
|
-
// Обычный
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
218
|
+
// Обычный поиск
|
|
219
|
+
const results = await sdk.search.searchCode('project-id', {
|
|
220
|
+
query: 'function authenticate',
|
|
221
|
+
limit: 20
|
|
222
|
+
});
|
|
139
223
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
224
|
+
results.forEach(result => {
|
|
225
|
+
console.log(`${result.fileName}:${result.line} - ${result.snippet}`);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Семантический поиск
|
|
229
|
+
const semanticResults = await sdk.search.semanticSearch('project-id', {
|
|
230
|
+
query: 'user authentication logic'
|
|
231
|
+
});
|
|
144
232
|
|
|
145
|
-
//
|
|
146
|
-
const
|
|
147
|
-
projectId,
|
|
148
|
-
|
|
233
|
+
// Альтернативная сигнатура
|
|
234
|
+
const results = await sdk.search.searchCode({
|
|
235
|
+
projectId: 'project-id',
|
|
236
|
+
query: 'error handling',
|
|
237
|
+
limit: 5
|
|
149
238
|
});
|
|
150
239
|
```
|
|
151
240
|
|
|
152
|
-
|
|
241
|
+
### 🔌 WebSocket API (`sdk.projectSync`)
|
|
153
242
|
|
|
154
|
-
|
|
155
|
-
> Инкрементальные обновления, шифрование, real-time статус
|
|
243
|
+
#### Real-time уведомления
|
|
156
244
|
|
|
157
|
-
|
|
245
|
+
```typescript
|
|
246
|
+
// Подключение к WebSocket
|
|
247
|
+
connectWebSocket(): Promise<void>
|
|
158
248
|
|
|
159
|
-
|
|
160
|
-
|
|
249
|
+
// Отключение от WebSocket
|
|
250
|
+
disconnectWebSocket(): void
|
|
161
251
|
|
|
162
|
-
//
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
key: 'your-32-char-encryption-key-here!' // 32 символа
|
|
171
|
-
},
|
|
172
|
-
chunking: {
|
|
173
|
-
maxTokens: 400, // Максимальный размер чанка
|
|
174
|
-
minTokens: 100, // Минимальный размер чанка
|
|
175
|
-
useTreeSitter: false, // Пока простая разбивка
|
|
176
|
-
preserveContext: true // Сохранять контекст между чанками
|
|
177
|
-
},
|
|
178
|
-
fileWatching: {
|
|
179
|
-
enabled: false, // Автоматическое наблюдение (в разработке)
|
|
180
|
-
pollInterval: 1000, // Интервал проверки изменений
|
|
181
|
-
ignorePatterns: ['node_modules/**'] // Игнорируемые файлы
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
debug: 'error'
|
|
185
|
-
});
|
|
252
|
+
// Проверка статуса подключения
|
|
253
|
+
isWebSocketConnected: boolean
|
|
254
|
+
|
|
255
|
+
// Подписка на проект
|
|
256
|
+
projectSync.subscribeToProject(projectId: string): void
|
|
257
|
+
|
|
258
|
+
// Отписка от проекта
|
|
259
|
+
projectSync.unsubscribeFromProject(projectId: string): void
|
|
186
260
|
|
|
187
|
-
//
|
|
188
|
-
|
|
261
|
+
// Обработчики событий
|
|
262
|
+
projectSync.on(eventName: string, handler: Function): void
|
|
263
|
+
projectSync.off(eventName: string, handler: Function): void
|
|
189
264
|
```
|
|
190
265
|
|
|
191
|
-
|
|
266
|
+
#### События WebSocket
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
// Обновление статуса синхронизации
|
|
270
|
+
'sync-status-update': (data: SyncStatusUpdate) => void
|
|
271
|
+
|
|
272
|
+
// Прогресс синхронизации
|
|
273
|
+
'sync-progress': (data: SyncProgressEvent) => void
|
|
274
|
+
|
|
275
|
+
// Завершение синхронизации
|
|
276
|
+
'sync-completed': (data: SyncCompletedEvent) => void
|
|
277
|
+
|
|
278
|
+
// Ошибки
|
|
279
|
+
'error': (data: ErrorEvent) => void
|
|
280
|
+
|
|
281
|
+
// Подключение/отключение
|
|
282
|
+
'connected': (data: { socketId: string }) => void
|
|
283
|
+
'disconnected': (data: { reason: string }) => void
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
#### Примеры использования
|
|
192
287
|
|
|
193
288
|
```javascript
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
289
|
+
// Подключение и подписка на проект
|
|
290
|
+
await sdk.connectWebSocket();
|
|
291
|
+
sdk.projectSync.subscribeToProject('project-id');
|
|
292
|
+
|
|
293
|
+
// Обработка событий
|
|
294
|
+
sdk.projectSync.on('sync-status-update', (status) => {
|
|
295
|
+
console.log(`Проект ${status.projectId}: ${status.status} (${status.progress}%)`);
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
sdk.projectSync.on('sync-completed', (data) => {
|
|
299
|
+
if (data.success) {
|
|
300
|
+
console.log(`Синхронизация завершена за ${data.duration}мс`);
|
|
301
|
+
} else {
|
|
302
|
+
console.error(`Ошибка синхронизации: ${data.error}`);
|
|
207
303
|
}
|
|
208
304
|
});
|
|
209
305
|
|
|
210
|
-
|
|
306
|
+
sdk.projectSync.on('error', (error) => {
|
|
307
|
+
console.error(`WebSocket ошибка: ${error.error}`);
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
// Отключение
|
|
311
|
+
sdk.disconnectWebSocket();
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### 🔄 Delta-Chunking API (`sdk.deltaSync`)
|
|
315
|
+
|
|
316
|
+
#### Синхронизация с delta-chunking
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
// Инициализация синхронизации
|
|
320
|
+
initializeSync(projectId: string, options?: SyncOptions): Promise<SyncResult>
|
|
321
|
+
|
|
322
|
+
// Отправка delta чанков
|
|
323
|
+
sendDeltaChunks(projectId: string, chunks: EncryptedChunk[]): Promise<void>
|
|
324
|
+
|
|
325
|
+
// Финализация синхронизации
|
|
326
|
+
finalizeDeltaSync(projectId: string): Promise<SyncResult>
|
|
327
|
+
|
|
328
|
+
// Отмена синхронизации
|
|
329
|
+
cancelDeltaSync(projectId: string): Promise<void>
|
|
330
|
+
|
|
331
|
+
// Получение статуса синхронизации
|
|
332
|
+
getSyncStatus(projectId: string): Promise<SyncStatus>
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
#### Типы данных
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
interface SyncOptions {
|
|
339
|
+
incremental?: boolean; // Инкрементальная синхронизация
|
|
340
|
+
compression?: boolean; // Сжатие чанков
|
|
341
|
+
encryption?: boolean; // Шифрование чанков
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
interface EncryptedChunk {
|
|
345
|
+
id: string; // ID чанка
|
|
346
|
+
data: string; // Зашифрованные данные (base64)
|
|
347
|
+
hash: string; // SHA-256 хэш
|
|
348
|
+
size: number; // Размер оригинальных данных
|
|
349
|
+
metadata?: any; // Дополнительные метаданные
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
interface SyncResult {
|
|
353
|
+
sessionId: string; // ID сессии синхронизации
|
|
354
|
+
status: string; // Статус операции
|
|
355
|
+
message?: string; // Сообщение о результате
|
|
356
|
+
chunksProcessed?: number; // Количество обработанных чанков
|
|
357
|
+
}
|
|
211
358
|
```
|
|
212
359
|
|
|
213
|
-
|
|
360
|
+
#### Примеры использования
|
|
214
361
|
|
|
215
362
|
```javascript
|
|
216
|
-
//
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
363
|
+
// Полный цикл delta-chunking синхронизации
|
|
364
|
+
const syncResult = await sdk.deltaSync.initializeSync('project-id', {
|
|
365
|
+
incremental: true,
|
|
366
|
+
compression: true
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
console.log('Сессия синхронизации:', syncResult.sessionId);
|
|
370
|
+
|
|
371
|
+
// Подготовка и отправка чанков
|
|
372
|
+
const chunks = [
|
|
223
373
|
{
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
374
|
+
id: 'chunk-1',
|
|
375
|
+
data: btoa('console.log("Hello World");'), // base64
|
|
376
|
+
hash: 'sha256-hash',
|
|
377
|
+
size: 26
|
|
227
378
|
}
|
|
228
379
|
];
|
|
229
380
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
381
|
+
await sdk.deltaSync.sendDeltaChunks('project-id', chunks);
|
|
382
|
+
|
|
383
|
+
// Финализация
|
|
384
|
+
const finalResult = await sdk.deltaSync.finalizeDeltaSync('project-id');
|
|
385
|
+
console.log('Синхронизация завершена:', finalResult.status);
|
|
386
|
+
|
|
387
|
+
// Мониторинг через WebSocket
|
|
388
|
+
sdk.projectSync.on('sync-progress', (progress) => {
|
|
389
|
+
console.log(`Обработано ${progress.currentChunk}/${progress.totalChunks} чанков`);
|
|
235
390
|
});
|
|
236
391
|
```
|
|
237
392
|
|
|
238
|
-
###
|
|
393
|
+
### 💬 Chat API (`sdk.chat`)
|
|
239
394
|
|
|
240
|
-
|
|
241
|
-
// Запуск file watcher (в разработке)
|
|
242
|
-
const watcher = await sdk.startAutoSync('project-id', '/path/to/watch');
|
|
395
|
+
#### AI-ассистент
|
|
243
396
|
|
|
244
|
-
|
|
245
|
-
|
|
397
|
+
```typescript
|
|
398
|
+
// Отправка сообщения
|
|
399
|
+
sendMessage(messages: Message[], options?: ChatOptions): Promise<ChatResponse>
|
|
246
400
|
|
|
247
|
-
//
|
|
248
|
-
|
|
249
|
-
console.log('🔴 File watcher остановлен');
|
|
401
|
+
// Потоковый чат
|
|
402
|
+
streamChat(messages: Message[], options?: StreamChatOptions): AsyncGenerator<ChatChunk>
|
|
250
403
|
```
|
|
251
404
|
|
|
252
|
-
|
|
405
|
+
#### Примеры использования
|
|
253
406
|
|
|
254
407
|
```javascript
|
|
255
|
-
//
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
408
|
+
// Простой чат
|
|
409
|
+
const response = await sdk.chat.sendMessage([
|
|
410
|
+
{ role: 'user', content: 'Объясни что такое async/await' }
|
|
411
|
+
]);
|
|
412
|
+
|
|
413
|
+
console.log(response.choices[0].message.content);
|
|
414
|
+
|
|
415
|
+
// Потоковый чат
|
|
416
|
+
const stream = sdk.chat.streamChat([
|
|
417
|
+
{ role: 'user', content: 'Напиши функцию сортировки' }
|
|
418
|
+
]);
|
|
419
|
+
|
|
420
|
+
for await (const chunk of stream) {
|
|
421
|
+
process.stdout.write(chunk.choices[0]?.delta?.content || '');
|
|
263
422
|
}
|
|
264
423
|
```
|
|
265
424
|
|
|
266
|
-
|
|
425
|
+
## 💡 Рекомендации по использованию
|
|
426
|
+
|
|
427
|
+
### Real-time уведомления
|
|
428
|
+
Для получения актуальных данных в реальном времени используйте WebSocket:
|
|
267
429
|
|
|
268
430
|
```javascript
|
|
269
|
-
|
|
431
|
+
// ✅ Правильно: WebSocket для real-time статуса
|
|
432
|
+
await sdk.connectWebSocket();
|
|
433
|
+
sdk.projectSync.on('sync-status-update', (status) => {
|
|
434
|
+
console.log(`Статус: ${status.status}, прогресс: ${status.progress}%`);
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
// ❌ Избегайте частых REST запросов
|
|
438
|
+
// setInterval(() => sdk.indexing.getStatus(id), 2000);
|
|
439
|
+
```
|
|
270
440
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
const percent = Math.round((current / total) * 100);
|
|
287
|
-
console.log(`🔄 Синхронизация: ${percent}% (${current}/${total} чанков)`);
|
|
288
|
-
},
|
|
289
|
-
ignorePatterns: ['node_modules/**', 'dist/**', '*.log']
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
// 3. Результат
|
|
293
|
-
console.log('🎉 Синхронизация завершена:', {
|
|
294
|
-
success: result.success,
|
|
295
|
-
processedChunks: result.processedChunks,
|
|
296
|
-
duration: result.duration + 'ms',
|
|
297
|
-
newFiles: result.details?.newFiles,
|
|
298
|
-
changedFiles: result.details?.changedFiles
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
// 4. Проверка финального статуса
|
|
302
|
-
const status = await sdk.getSyncStatus('my-project-id');
|
|
303
|
-
console.log(`✅ Финальный статус: ${status.status}`);
|
|
304
|
-
|
|
305
|
-
} catch (error) {
|
|
306
|
-
console.error('❌ Ошибка синхронизации:', error.message);
|
|
307
|
-
|
|
308
|
-
// Отменяем если что-то пошло не так
|
|
309
|
-
await sdk.cancelSync('my-project-id');
|
|
441
|
+
### Обработка лимитов
|
|
442
|
+
SDK автоматически обрабатывает ограничения сервера. При превышении лимитов возвращается ошибка 429.
|
|
443
|
+
|
|
444
|
+
## 🔧 Обработка ошибок
|
|
445
|
+
|
|
446
|
+
```javascript
|
|
447
|
+
try {
|
|
448
|
+
const project = await sdk.projects.createProject('Test', '/path');
|
|
449
|
+
} catch (error) {
|
|
450
|
+
if (error.status === 401) {
|
|
451
|
+
console.error('Неверный API ключ');
|
|
452
|
+
} else if (error.status === 429) {
|
|
453
|
+
console.error('Слишком много запросов, попробуйте позже');
|
|
454
|
+
} else {
|
|
455
|
+
console.error('Ошибка API:', error.message);
|
|
310
456
|
}
|
|
311
457
|
}
|
|
312
458
|
|
|
313
|
-
//
|
|
314
|
-
|
|
459
|
+
// WebSocket ошибки
|
|
460
|
+
sdk.projectSync.on('error', (error) => {
|
|
461
|
+
if (error.recoverable) {
|
|
462
|
+
console.warn('Временная ошибка WebSocket:', error.error);
|
|
463
|
+
} else {
|
|
464
|
+
console.error('Критическая ошибка WebSocket:', error.error);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
315
467
|
```
|
|
316
468
|
|
|
317
|
-
##
|
|
469
|
+
## 🚀 Продвинутое использование
|
|
318
470
|
|
|
319
|
-
###
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
// ... и еще 10+ полей
|
|
332
|
-
}
|
|
471
|
+
### Настройка HTTP клиента
|
|
472
|
+
|
|
473
|
+
```javascript
|
|
474
|
+
const sdk = new CodeSolverSDK({
|
|
475
|
+
baseURL: 'https://api.codesolver.dev',
|
|
476
|
+
apiKey: process.env.CODESOLVER_API_KEY,
|
|
477
|
+
timeout: 60000,
|
|
478
|
+
headers: {
|
|
479
|
+
'User-Agent': 'MyApp/1.0.0',
|
|
480
|
+
'X-Custom-Header': 'value'
|
|
481
|
+
}
|
|
482
|
+
});
|
|
333
483
|
```
|
|
334
484
|
|
|
335
|
-
###
|
|
485
|
+
### WebSocket с переподключением
|
|
336
486
|
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
key: string; // 32-символьный ключ для AES-256
|
|
348
|
-
};
|
|
349
|
-
|
|
350
|
-
chunking?: {
|
|
351
|
-
maxTokens?: number; // Максимальный размер чанка (по умолчанию: 400)
|
|
352
|
-
minTokens?: number; // Минимальный размер чанка (по умолчанию: 100)
|
|
353
|
-
useTreeSitter?: boolean; // Использовать tree-sitter парсер (в разработке)
|
|
354
|
-
preserveContext?: boolean; // Сохранять контекст между чанками
|
|
355
|
-
};
|
|
356
|
-
|
|
357
|
-
fileWatching?: {
|
|
358
|
-
enabled: boolean; // Включить автоматическое наблюдение за изменениями
|
|
359
|
-
pollInterval?: number; // Интервал проверки изменений в мс (по умолчанию: 1000)
|
|
360
|
-
ignorePatterns?: string[]; // Паттерны для игнорирования файлов
|
|
361
|
-
};
|
|
362
|
-
};
|
|
363
|
-
timeout?: number; // Таймаут запросов (мс)
|
|
364
|
-
debug?: 'silent' | 'error' | 'warn' | 'info' | 'debug';
|
|
365
|
-
}
|
|
487
|
+
```javascript
|
|
488
|
+
const sdk = new CodeSolverSDK({
|
|
489
|
+
baseURL: 'wss://api.codesolver.dev',
|
|
490
|
+
webSocket: {
|
|
491
|
+
enabled: true,
|
|
492
|
+
maxRetries: 5,
|
|
493
|
+
retryDelay: 3000,
|
|
494
|
+
debug: true
|
|
495
|
+
}
|
|
496
|
+
});
|
|
366
497
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
batchSize?: number; // Размер батча для загрузки чанков (по умолчанию: 50)
|
|
371
|
-
ignorePatterns?: string[]; // Паттерны для игнорирования файлов
|
|
372
|
-
includeExtensions?: string[]; // Включать только определенные расширения
|
|
373
|
-
maxFileSizeKB?: number; // Максимальный размер файла для обработки (KB)
|
|
374
|
-
onProgress?: (current: number, total: number) => void; // Callback прогресса
|
|
375
|
-
timeoutMs?: number; // Таймаут для операций
|
|
376
|
-
}
|
|
498
|
+
sdk.projectSync.on('connected', () => {
|
|
499
|
+
console.log('WebSocket подключен');
|
|
500
|
+
});
|
|
377
501
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
sessionId?: string;
|
|
383
|
-
processedChunks: number;
|
|
384
|
-
totalChunks: number;
|
|
385
|
-
duration: number; // Время выполнения в мс
|
|
386
|
-
error?: string;
|
|
387
|
-
details?: {
|
|
388
|
-
newFiles: number;
|
|
389
|
-
changedFiles: number;
|
|
390
|
-
deletedFiles: number;
|
|
391
|
-
failedChunks: number;
|
|
392
|
-
};
|
|
393
|
-
}
|
|
502
|
+
sdk.projectSync.on('disconnected', (data) => {
|
|
503
|
+
console.log('WebSocket отключен:', data.reason);
|
|
504
|
+
});
|
|
505
|
+
```
|
|
394
506
|
|
|
395
|
-
|
|
396
|
-
interface SyncStatus {
|
|
397
|
-
status: 'inactive' | 'initializing' | 'active' | 'finalizing' | 'completed' | 'failed';
|
|
398
|
-
progress?: number; // 0-100%
|
|
399
|
-
chunksReceived?: number;
|
|
400
|
-
chunksProcessed?: number;
|
|
401
|
-
sessionId?: string;
|
|
402
|
-
errors?: string[];
|
|
403
|
-
startTime?: Date;
|
|
404
|
-
estimatedCompletion?: Date;
|
|
405
|
-
}
|
|
507
|
+
### Delta-Chunking с шифрованием
|
|
406
508
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
stop(): Promise<void>;
|
|
414
|
-
}
|
|
509
|
+
```javascript
|
|
510
|
+
const syncResult = await sdk.deltaSync.initializeSync('project-id', {
|
|
511
|
+
incremental: true,
|
|
512
|
+
compression: true,
|
|
513
|
+
encryption: true
|
|
514
|
+
});
|
|
415
515
|
|
|
416
|
-
//
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
}
|
|
516
|
+
// Шифрование чанков на клиенте
|
|
517
|
+
const encryptedChunks = chunks.map(chunk => ({
|
|
518
|
+
...chunk,
|
|
519
|
+
data: encrypt(chunk.data), // Ваша функция шифрования
|
|
520
|
+
hash: sha256(chunk.data)
|
|
521
|
+
}));
|
|
522
|
+
|
|
523
|
+
await sdk.deltaSync.sendDeltaChunks('project-id', encryptedChunks);
|
|
422
524
|
```
|
|
423
525
|
|
|
424
|
-
##
|
|
526
|
+
## 📊 Мониторинг и диагностика
|
|
425
527
|
|
|
426
528
|
```javascript
|
|
427
|
-
|
|
529
|
+
// Диагностика API
|
|
530
|
+
const diagnosis = await sdk.diagnoseAPI();
|
|
531
|
+
console.log('Статус API:', diagnosis);
|
|
428
532
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
533
|
+
// Health check
|
|
534
|
+
const health = await sdk.httpClient.get('/health');
|
|
535
|
+
console.log('Здоровье сервера:', health);
|
|
432
536
|
|
|
433
|
-
//
|
|
434
|
-
const
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
// Ожидание индексации
|
|
438
|
-
let status;
|
|
439
|
-
do {
|
|
440
|
-
status = await sdk.projects.getIndexingStatus(project.id);
|
|
441
|
-
console.log(`${status.status}: ${status.progress}%`);
|
|
442
|
-
await new Promise(r => setTimeout(r, 2000));
|
|
443
|
-
} while (status.status === 'indexing');
|
|
444
|
-
|
|
445
|
-
// Поиск и чат
|
|
446
|
-
const results = await sdk.search.searchCode(project.id, {
|
|
447
|
-
query: 'function main',
|
|
448
|
-
limit: 5
|
|
449
|
-
});
|
|
450
|
-
|
|
451
|
-
const response = await sdk.chat.chat([
|
|
452
|
-
{ role: 'user', content: 'Explain this code' }
|
|
453
|
-
], { projectId: project.id });
|
|
537
|
+
// Детальная информация о системе
|
|
538
|
+
const info = await sdk.httpClient.get('/health/info');
|
|
539
|
+
console.log('Информация о системе:', info);
|
|
454
540
|
```
|
|
455
541
|
|
|
456
|
-
##
|
|
542
|
+
## 🔄 Миграция с предыдущих версий
|
|
543
|
+
|
|
544
|
+
### С версии 4.x на 5.x
|
|
457
545
|
|
|
458
546
|
```javascript
|
|
459
|
-
//
|
|
460
|
-
const
|
|
461
|
-
console.log('Backend доступен:', response.ok);
|
|
547
|
+
// Старый способ (4.x)
|
|
548
|
+
const status = await sdk.projects.getIndexingStatus(projectId);
|
|
462
549
|
|
|
463
|
-
//
|
|
464
|
-
const
|
|
465
|
-
baseURL: 'http://localhost:3000',
|
|
466
|
-
timeout: 120000 // 2 минуты
|
|
467
|
-
});
|
|
550
|
+
// Новый способ (5.x)
|
|
551
|
+
const status = await sdk.indexing.getStatus(projectId);
|
|
468
552
|
|
|
469
|
-
//
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
debug: 'debug'
|
|
553
|
+
// Или лучше - WebSocket
|
|
554
|
+
sdk.projectSync.on('sync-status-update', (status) => {
|
|
555
|
+
// Real-time статус
|
|
473
556
|
});
|
|
474
557
|
```
|
|
475
558
|
|
|
559
|
+
## 📝 Changelog
|
|
560
|
+
|
|
561
|
+
### v5.1.5 (Latest)
|
|
562
|
+
- ✅ Исправлена документация - убраны детали внутренней реализации
|
|
563
|
+
- ✅ Удалены несуществующие методы из документации
|
|
564
|
+
- ✅ Сосредоточено только на пользовательском API
|
|
565
|
+
|
|
566
|
+
### v5.1.4
|
|
567
|
+
- ✅ Полная документация всех API методов
|
|
568
|
+
- ✅ Добавлен `IndexingApi` для управления индексацией
|
|
569
|
+
- ✅ Добавлен `ProjectSyncClient` для WebSocket уведомлений
|
|
570
|
+
- ✅ Исправлена генерация URL в `SearchApi`
|
|
571
|
+
- ✅ Добавлен метод `semanticSearch`
|
|
572
|
+
- ✅ Добавлен метод `findOrCreateProject`
|
|
573
|
+
- ✅ Улучшена обработка ошибок WebSocket
|
|
574
|
+
- ✅ Обновлена документация и примеры
|
|
575
|
+
|
|
576
|
+
### v5.0.0
|
|
577
|
+
- 🚀 Полная переработка архитектуры
|
|
578
|
+
- 🔌 WebSocket поддержка для real-time уведомлений
|
|
579
|
+
- 🔄 Delta-chunking для эффективной синхронизации
|
|
580
|
+
- 🛡️ Автоматическая обработка лимитов сервера
|
|
581
|
+
|
|
582
|
+
## 📞 Поддержка
|
|
583
|
+
|
|
584
|
+
- **GitHub**: [Issues](https://github.com/codesolver/solver-sdk/issues)
|
|
585
|
+
- **Email**: support@codesolver.dev
|
|
586
|
+
- **Документация**: [docs.codesolver.dev](https://docs.codesolver.dev)
|
|
587
|
+
|
|
476
588
|
## 📄 Лицензия
|
|
477
589
|
|
|
478
|
-
MIT License
|
|
590
|
+
MIT License - см. [LICENSE](LICENSE) файл.
|
|
479
591
|
|
|
480
592
|
---
|
|
481
593
|
|
|
482
|
-
|
|
483
|
-
> История изменений: [CHANGELOG.md](CHANGELOG.md)
|
|
594
|
+
**🚀 Code Solver SDK v5.1.5** - Создано с ❤️ для разработчиков
|