solver-sdk 5.1.1 → 5.1.4
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 +485 -365
- 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 +55 -29
- 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 +65 -6
- 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 +55 -29
- 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 +65 -6
- 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,594 @@ 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
|
+
deleteProject(projectId: string): Promise<void>
|
|
96
|
+
|
|
97
|
+
// Получение статуса индексации проекта
|
|
98
|
+
getIndexingStatus(projectId: string): Promise<any>
|
|
102
99
|
```
|
|
103
100
|
|
|
104
|
-
|
|
101
|
+
#### Примеры использования
|
|
102
|
+
|
|
105
103
|
```javascript
|
|
106
|
-
//
|
|
107
|
-
await sdk.projects.
|
|
108
|
-
|
|
104
|
+
// Создание нового проекта
|
|
105
|
+
const project = await sdk.projects.createProject(
|
|
106
|
+
'My Web App',
|
|
107
|
+
'/Users/dev/my-web-app',
|
|
108
|
+
{ description: 'React приложение' }
|
|
109
|
+
);
|
|
109
110
|
|
|
110
|
-
//
|
|
111
|
-
const
|
|
112
|
-
console.log(
|
|
111
|
+
// Получение всех проектов пользователя
|
|
112
|
+
const projects = await sdk.projects.getAllProjects();
|
|
113
|
+
console.log(`У вас ${projects.length} проектов`);
|
|
114
|
+
|
|
115
|
+
// Поиск существующего или создание нового
|
|
116
|
+
const project = await sdk.projects.findOrCreateProject(
|
|
117
|
+
'/path/to/project',
|
|
118
|
+
'My Project',
|
|
119
|
+
'Описание проекта'
|
|
120
|
+
);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 🚀 Indexing API (`sdk.indexing`)
|
|
124
|
+
|
|
125
|
+
#### Управление индексацией
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
// Создание проекта и запуск индексации
|
|
129
|
+
indexProject(projectPath: string, projectName: string, description?: string): Promise<IndexProjectResult>
|
|
130
|
+
|
|
131
|
+
// Получение статуса индексации (с кэшированием)
|
|
132
|
+
getStatus(projectId: string): Promise<IndexingStatus>
|
|
133
|
+
|
|
134
|
+
// Ожидание завершения индексации (DEPRECATED - используйте WebSocket)
|
|
135
|
+
waitForCompletion(projectId: string, timeout?: number): Promise<IndexingStatus>
|
|
136
|
+
|
|
137
|
+
// Отмена индексации
|
|
138
|
+
cancelIndexing(projectId: string): Promise<void>
|
|
139
|
+
|
|
140
|
+
// Перезапуск индексации
|
|
141
|
+
restartIndexing(projectId: string): Promise<IndexingStatus>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
#### Типы данных
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
interface IndexingStatus {
|
|
148
|
+
status: string; // 'pending' | 'processing' | 'completed' | 'failed'
|
|
149
|
+
progress: number; // Прогресс 0-100
|
|
150
|
+
totalFiles?: number; // Общее количество файлов
|
|
151
|
+
processedFiles?: number; // Обработано файлов
|
|
152
|
+
currentFile?: string; // Текущий обрабатываемый файл
|
|
153
|
+
error?: string; // Сообщение об ошибке
|
|
154
|
+
updatedAt?: string; // Время последнего обновления
|
|
155
|
+
}
|
|
113
156
|
```
|
|
114
157
|
|
|
115
|
-
|
|
158
|
+
#### Примеры использования
|
|
159
|
+
|
|
116
160
|
```javascript
|
|
117
|
-
//
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
161
|
+
// Запуск индексации
|
|
162
|
+
const result = await sdk.indexing.indexProject(
|
|
163
|
+
'/Users/dev/my-project',
|
|
164
|
+
'My Project'
|
|
165
|
+
);
|
|
166
|
+
console.log('Project ID:', result.projectId);
|
|
167
|
+
|
|
168
|
+
// Получение статуса (единичный запрос)
|
|
169
|
+
const status = await sdk.indexing.getStatus(result.projectId);
|
|
170
|
+
console.log(`Прогресс: ${status.progress}%`);
|
|
171
|
+
|
|
172
|
+
// ⚠️ ВАЖНО: Для real-time статуса используйте WebSocket!
|
|
173
|
+
sdk.projectSync.on('sync-status-update', (status) => {
|
|
174
|
+
console.log(`Статус обновлен: ${status.status}, прогресс: ${status.progress}%`);
|
|
121
175
|
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 🔍 Search API (`sdk.search`)
|
|
179
|
+
|
|
180
|
+
#### Поиск по коду
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// Основной поиск по коду
|
|
184
|
+
searchCode(projectId: string, params: SearchCodeParams): Promise<SearchResult[]>
|
|
185
|
+
searchCode(params: SearchCodeParams): Promise<SearchResult[]> // Альтернативная сигнатура
|
|
186
|
+
|
|
187
|
+
// Семантический поиск
|
|
188
|
+
semanticSearch(projectId: string, params: Omit<SearchCodeParams, 'projectId'>): Promise<SearchResult[]>
|
|
122
189
|
|
|
123
190
|
// Поиск функций
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
limit: 10
|
|
127
|
-
});
|
|
191
|
+
searchFunctions(projectId: string, params: SearchFunctionsParams): Promise<FunctionSearchResult>
|
|
192
|
+
```
|
|
128
193
|
|
|
129
|
-
|
|
130
|
-
|
|
194
|
+
#### Параметры поиска
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
interface SearchCodeParams {
|
|
198
|
+
projectId?: string; // ID проекта (если не передан отдельно)
|
|
199
|
+
query: string; // Поисковый запрос
|
|
200
|
+
limit?: number; // Максимум результатов (по умолчанию 10)
|
|
201
|
+
maxResults?: number; // Альтернативное название для limit
|
|
202
|
+
semantic?: boolean; // Флаг семантического поиска
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
interface SearchResult {
|
|
206
|
+
id: string; // Уникальный ID результата
|
|
207
|
+
score: number; // Оценка релевантности (0-1)
|
|
208
|
+
filePath: string; // Путь к файлу
|
|
209
|
+
fileName: string; // Имя файла
|
|
210
|
+
language: string; // Язык программирования
|
|
211
|
+
snippet: string; // Фрагмент кода
|
|
212
|
+
line: number; // Номер строки
|
|
213
|
+
size: number; // Размер фрагмента
|
|
214
|
+
indexedAt?: string; // Время индексации
|
|
215
|
+
}
|
|
131
216
|
```
|
|
132
217
|
|
|
133
|
-
|
|
218
|
+
#### Примеры использования
|
|
219
|
+
|
|
134
220
|
```javascript
|
|
135
|
-
// Обычный
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
// Потоковый чат
|
|
141
|
-
for await (const chunk of sdk.chat.streamChat(messages, { projectId })) {
|
|
142
|
-
console.log(chunk.text);
|
|
143
|
-
}
|
|
221
|
+
// Обычный поиск
|
|
222
|
+
const results = await sdk.search.searchCode('project-id', {
|
|
223
|
+
query: 'function authenticate',
|
|
224
|
+
limit: 20
|
|
225
|
+
});
|
|
144
226
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
227
|
+
results.forEach(result => {
|
|
228
|
+
console.log(`${result.fileName}:${result.line} - ${result.snippet}`);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// Семантический поиск
|
|
232
|
+
const semanticResults = await sdk.search.semanticSearch('project-id', {
|
|
233
|
+
query: 'user authentication logic'
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
// Альтернативная сигнатура
|
|
237
|
+
const results = await sdk.search.searchCode({
|
|
238
|
+
projectId: 'project-id',
|
|
239
|
+
query: 'error handling',
|
|
240
|
+
limit: 5
|
|
149
241
|
});
|
|
150
242
|
```
|
|
151
243
|
|
|
152
|
-
|
|
244
|
+
### 🔌 WebSocket API (`sdk.projectSync`)
|
|
153
245
|
|
|
154
|
-
|
|
155
|
-
> Инкрементальные обновления, шифрование, real-time статус
|
|
246
|
+
#### Real-time уведомления
|
|
156
247
|
|
|
157
|
-
|
|
248
|
+
```typescript
|
|
249
|
+
// Подключение к WebSocket
|
|
250
|
+
connectWebSocket(): Promise<void>
|
|
158
251
|
|
|
159
|
-
|
|
160
|
-
|
|
252
|
+
// Отключение от WebSocket
|
|
253
|
+
disconnectWebSocket(): void
|
|
161
254
|
|
|
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
|
-
});
|
|
255
|
+
// Проверка статуса подключения
|
|
256
|
+
isWebSocketConnected: boolean
|
|
257
|
+
|
|
258
|
+
// Подписка на проект
|
|
259
|
+
projectSync.subscribeToProject(projectId: string): void
|
|
260
|
+
|
|
261
|
+
// Отписка от проекта
|
|
262
|
+
projectSync.unsubscribeFromProject(projectId: string): void
|
|
186
263
|
|
|
187
|
-
//
|
|
188
|
-
|
|
264
|
+
// Обработчики событий
|
|
265
|
+
projectSync.on(eventName: string, handler: Function): void
|
|
266
|
+
projectSync.off(eventName: string, handler: Function): void
|
|
189
267
|
```
|
|
190
268
|
|
|
191
|
-
|
|
269
|
+
#### События WebSocket
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
// Обновление статуса синхронизации
|
|
273
|
+
'sync-status-update': (data: SyncStatusUpdate) => void
|
|
274
|
+
|
|
275
|
+
// Прогресс синхронизации
|
|
276
|
+
'sync-progress': (data: SyncProgressEvent) => void
|
|
277
|
+
|
|
278
|
+
// Завершение синхронизации
|
|
279
|
+
'sync-completed': (data: SyncCompletedEvent) => void
|
|
280
|
+
|
|
281
|
+
// Ошибки
|
|
282
|
+
'error': (data: ErrorEvent) => void
|
|
283
|
+
|
|
284
|
+
// Подключение/отключение
|
|
285
|
+
'connected': (data: { socketId: string }) => void
|
|
286
|
+
'disconnected': (data: { reason: string }) => void
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
#### Примеры использования
|
|
192
290
|
|
|
193
291
|
```javascript
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
292
|
+
// Подключение и подписка на проект
|
|
293
|
+
await sdk.connectWebSocket();
|
|
294
|
+
sdk.projectSync.subscribeToProject('project-id');
|
|
295
|
+
|
|
296
|
+
// Обработка событий
|
|
297
|
+
sdk.projectSync.on('sync-status-update', (status) => {
|
|
298
|
+
console.log(`Проект ${status.projectId}: ${status.status} (${status.progress}%)`);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
sdk.projectSync.on('sync-completed', (data) => {
|
|
302
|
+
if (data.success) {
|
|
303
|
+
console.log(`Синхронизация завершена за ${data.duration}мс`);
|
|
304
|
+
} else {
|
|
305
|
+
console.error(`Ошибка синхронизации: ${data.error}`);
|
|
207
306
|
}
|
|
208
307
|
});
|
|
209
308
|
|
|
210
|
-
|
|
309
|
+
sdk.projectSync.on('error', (error) => {
|
|
310
|
+
console.error(`WebSocket ошибка: ${error.error}`);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// Отключение
|
|
314
|
+
sdk.disconnectWebSocket();
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### 🔄 Delta-Chunking API (`sdk.deltaSync`)
|
|
318
|
+
|
|
319
|
+
#### Синхронизация с delta-chunking
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
// Инициализация синхронизации
|
|
323
|
+
initializeSync(projectId: string, options?: SyncOptions): Promise<SyncResult>
|
|
324
|
+
|
|
325
|
+
// Отправка delta чанков
|
|
326
|
+
sendDeltaChunks(projectId: string, chunks: EncryptedChunk[]): Promise<void>
|
|
327
|
+
|
|
328
|
+
// Финализация синхронизации
|
|
329
|
+
finalizeDeltaSync(projectId: string): Promise<SyncResult>
|
|
330
|
+
|
|
331
|
+
// Отмена синхронизации
|
|
332
|
+
cancelDeltaSync(projectId: string): Promise<void>
|
|
333
|
+
|
|
334
|
+
// Получение статуса синхронизации
|
|
335
|
+
getSyncStatus(projectId: string): Promise<SyncStatus>
|
|
211
336
|
```
|
|
212
337
|
|
|
213
|
-
|
|
338
|
+
#### Типы данных
|
|
339
|
+
|
|
340
|
+
```typescript
|
|
341
|
+
interface SyncOptions {
|
|
342
|
+
incremental?: boolean; // Инкрементальная синхронизация
|
|
343
|
+
compression?: boolean; // Сжатие чанков
|
|
344
|
+
encryption?: boolean; // Шифрование чанков
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
interface EncryptedChunk {
|
|
348
|
+
id: string; // ID чанка
|
|
349
|
+
data: string; // Зашифрованные данные (base64)
|
|
350
|
+
hash: string; // SHA-256 хэш
|
|
351
|
+
size: number; // Размер оригинальных данных
|
|
352
|
+
metadata?: any; // Дополнительные метаданные
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
interface SyncResult {
|
|
356
|
+
sessionId: string; // ID сессии синхронизации
|
|
357
|
+
status: string; // Статус операции
|
|
358
|
+
message?: string; // Сообщение о результате
|
|
359
|
+
chunksProcessed?: number; // Количество обработанных чанков
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
#### Примеры использования
|
|
214
364
|
|
|
215
365
|
```javascript
|
|
216
|
-
//
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
366
|
+
// Полный цикл delta-chunking синхронизации
|
|
367
|
+
const syncResult = await sdk.deltaSync.initializeSync('project-id', {
|
|
368
|
+
incremental: true,
|
|
369
|
+
compression: true
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
console.log('Сессия синхронизации:', syncResult.sessionId);
|
|
373
|
+
|
|
374
|
+
// Подготовка и отправка чанков
|
|
375
|
+
const chunks = [
|
|
223
376
|
{
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
377
|
+
id: 'chunk-1',
|
|
378
|
+
data: btoa('console.log("Hello World");'), // base64
|
|
379
|
+
hash: 'sha256-hash',
|
|
380
|
+
size: 26
|
|
227
381
|
}
|
|
228
382
|
];
|
|
229
383
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
384
|
+
await sdk.deltaSync.sendDeltaChunks('project-id', chunks);
|
|
385
|
+
|
|
386
|
+
// Финализация
|
|
387
|
+
const finalResult = await sdk.deltaSync.finalizeDeltaSync('project-id');
|
|
388
|
+
console.log('Синхронизация завершена:', finalResult.status);
|
|
389
|
+
|
|
390
|
+
// Мониторинг через WebSocket
|
|
391
|
+
sdk.projectSync.on('sync-progress', (progress) => {
|
|
392
|
+
console.log(`Обработано ${progress.currentChunk}/${progress.totalChunks} чанков`);
|
|
235
393
|
});
|
|
236
394
|
```
|
|
237
395
|
|
|
238
|
-
###
|
|
396
|
+
### 💬 Chat API (`sdk.chat`)
|
|
239
397
|
|
|
240
|
-
|
|
241
|
-
// Запуск file watcher (в разработке)
|
|
242
|
-
const watcher = await sdk.startAutoSync('project-id', '/path/to/watch');
|
|
398
|
+
#### AI-ассистент
|
|
243
399
|
|
|
244
|
-
|
|
245
|
-
|
|
400
|
+
```typescript
|
|
401
|
+
// Отправка сообщения
|
|
402
|
+
sendMessage(messages: Message[], options?: ChatOptions): Promise<ChatResponse>
|
|
403
|
+
|
|
404
|
+
// Потоковый чат
|
|
405
|
+
streamChat(messages: Message[], options?: StreamChatOptions): AsyncGenerator<ChatChunk>
|
|
246
406
|
|
|
247
|
-
//
|
|
248
|
-
|
|
249
|
-
console.log('🔴 File watcher остановлен');
|
|
407
|
+
// Чат с контекстом проекта
|
|
408
|
+
chatWithContext(projectId: string, message: string, options?: ChatOptions): Promise<ChatResponse>
|
|
250
409
|
```
|
|
251
410
|
|
|
252
|
-
|
|
411
|
+
#### Примеры использования
|
|
253
412
|
|
|
254
413
|
```javascript
|
|
255
|
-
//
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
414
|
+
// Простой чат
|
|
415
|
+
const response = await sdk.chat.sendMessage([
|
|
416
|
+
{ role: 'user', content: 'Объясни что такое async/await' }
|
|
417
|
+
]);
|
|
418
|
+
|
|
419
|
+
console.log(response.choices[0].message.content);
|
|
420
|
+
|
|
421
|
+
// Потоковый чат
|
|
422
|
+
const stream = sdk.chat.streamChat([
|
|
423
|
+
{ role: 'user', content: 'Напиши функцию сортировки' }
|
|
424
|
+
]);
|
|
425
|
+
|
|
426
|
+
for await (const chunk of stream) {
|
|
427
|
+
process.stdout.write(chunk.choices[0]?.delta?.content || '');
|
|
263
428
|
}
|
|
429
|
+
|
|
430
|
+
// Чат с контекстом проекта
|
|
431
|
+
const contextResponse = await sdk.chat.chatWithContext(
|
|
432
|
+
'project-id',
|
|
433
|
+
'Найди баги в моем коде'
|
|
434
|
+
);
|
|
264
435
|
```
|
|
265
436
|
|
|
266
|
-
|
|
437
|
+
## 🛡️ Безопасность и Лимиты
|
|
438
|
+
|
|
439
|
+
SDK автоматически обрабатывает rate limiting и кэширование:
|
|
440
|
+
|
|
441
|
+
### Rate Limits
|
|
442
|
+
- **Indexing Status**: 5 запросов/минуту (используйте WebSocket для real-time)
|
|
443
|
+
- **Projects**: 30 запросов/минуту
|
|
444
|
+
- **Global**: 10/сек, 100/мин, 1000/час
|
|
267
445
|
|
|
446
|
+
### Кэширование
|
|
447
|
+
- **Indexing Status**: 10 секунд TTL
|
|
448
|
+
- **Projects**: 30 секунд TTL
|
|
449
|
+
|
|
450
|
+
### Рекомендации
|
|
268
451
|
```javascript
|
|
269
|
-
|
|
452
|
+
// ✅ Правильно: WebSocket для real-time статуса
|
|
453
|
+
sdk.projectSync.on('sync-status-update', callback);
|
|
270
454
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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');
|
|
455
|
+
// ❌ Неправильно: Polling статуса
|
|
456
|
+
// setInterval(() => sdk.indexing.getStatus(id), 2000);
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
## 🔧 Обработка ошибок
|
|
460
|
+
|
|
461
|
+
```javascript
|
|
462
|
+
try {
|
|
463
|
+
const project = await sdk.projects.createProject('Test', '/path');
|
|
464
|
+
} catch (error) {
|
|
465
|
+
if (error.status === 401) {
|
|
466
|
+
console.error('Неверный API ключ');
|
|
467
|
+
} else if (error.status === 429) {
|
|
468
|
+
console.error('Превышен rate limit');
|
|
469
|
+
} else {
|
|
470
|
+
console.error('Ошибка API:', error.message);
|
|
310
471
|
}
|
|
311
472
|
}
|
|
312
473
|
|
|
313
|
-
//
|
|
314
|
-
|
|
474
|
+
// WebSocket ошибки
|
|
475
|
+
sdk.projectSync.on('error', (error) => {
|
|
476
|
+
if (error.recoverable) {
|
|
477
|
+
console.warn('Временная ошибка WebSocket:', error.error);
|
|
478
|
+
} else {
|
|
479
|
+
console.error('Критическая ошибка WebSocket:', error.error);
|
|
480
|
+
}
|
|
481
|
+
});
|
|
315
482
|
```
|
|
316
483
|
|
|
317
|
-
##
|
|
484
|
+
## 🚀 Продвинутое использование
|
|
318
485
|
|
|
319
|
-
###
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
// ... и еще 10+ полей
|
|
332
|
-
}
|
|
486
|
+
### Настройка HTTP клиента
|
|
487
|
+
|
|
488
|
+
```javascript
|
|
489
|
+
const sdk = new CodeSolverSDK({
|
|
490
|
+
baseURL: 'https://api.codesolver.dev',
|
|
491
|
+
apiKey: process.env.CODESOLVER_API_KEY,
|
|
492
|
+
timeout: 60000,
|
|
493
|
+
headers: {
|
|
494
|
+
'User-Agent': 'MyApp/1.0.0',
|
|
495
|
+
'X-Custom-Header': 'value'
|
|
496
|
+
}
|
|
497
|
+
});
|
|
333
498
|
```
|
|
334
499
|
|
|
335
|
-
###
|
|
500
|
+
### WebSocket с переподключением
|
|
336
501
|
|
|
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
|
-
}
|
|
502
|
+
```javascript
|
|
503
|
+
const sdk = new CodeSolverSDK({
|
|
504
|
+
baseURL: 'wss://api.codesolver.dev',
|
|
505
|
+
webSocket: {
|
|
506
|
+
enabled: true,
|
|
507
|
+
maxRetries: 5,
|
|
508
|
+
retryDelay: 3000,
|
|
509
|
+
debug: true
|
|
510
|
+
}
|
|
511
|
+
});
|
|
366
512
|
|
|
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
|
-
}
|
|
513
|
+
sdk.projectSync.on('connected', () => {
|
|
514
|
+
console.log('WebSocket подключен');
|
|
515
|
+
});
|
|
377
516
|
|
|
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
|
-
}
|
|
517
|
+
sdk.projectSync.on('disconnected', (data) => {
|
|
518
|
+
console.log('WebSocket отключен:', data.reason);
|
|
519
|
+
});
|
|
520
|
+
```
|
|
394
521
|
|
|
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
|
-
}
|
|
522
|
+
### Delta-Chunking с шифрованием
|
|
406
523
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
stop(): Promise<void>;
|
|
414
|
-
}
|
|
524
|
+
```javascript
|
|
525
|
+
const syncResult = await sdk.deltaSync.initializeSync('project-id', {
|
|
526
|
+
incremental: true,
|
|
527
|
+
compression: true,
|
|
528
|
+
encryption: true
|
|
529
|
+
});
|
|
415
530
|
|
|
416
|
-
//
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
}
|
|
531
|
+
// Шифрование чанков на клиенте
|
|
532
|
+
const encryptedChunks = chunks.map(chunk => ({
|
|
533
|
+
...chunk,
|
|
534
|
+
data: encrypt(chunk.data), // Ваша функция шифрования
|
|
535
|
+
hash: sha256(chunk.data)
|
|
536
|
+
}));
|
|
537
|
+
|
|
538
|
+
await sdk.deltaSync.sendDeltaChunks('project-id', encryptedChunks);
|
|
422
539
|
```
|
|
423
540
|
|
|
424
|
-
##
|
|
541
|
+
## 📊 Мониторинг и диагностика
|
|
425
542
|
|
|
426
543
|
```javascript
|
|
427
|
-
|
|
544
|
+
// Диагностика API
|
|
545
|
+
const diagnosis = await sdk.diagnoseAPI();
|
|
546
|
+
console.log('Статус API:', diagnosis);
|
|
428
547
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
548
|
+
// Health check
|
|
549
|
+
const health = await sdk.httpClient.get('/health');
|
|
550
|
+
console.log('Здоровье сервера:', health);
|
|
432
551
|
|
|
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 });
|
|
552
|
+
// Детальная информация о системе
|
|
553
|
+
const info = await sdk.httpClient.get('/health/info');
|
|
554
|
+
console.log('Информация о системе:', info);
|
|
454
555
|
```
|
|
455
556
|
|
|
456
|
-
##
|
|
557
|
+
## 🔄 Миграция с предыдущих версий
|
|
558
|
+
|
|
559
|
+
### С версии 4.x на 5.x
|
|
457
560
|
|
|
458
561
|
```javascript
|
|
459
|
-
//
|
|
460
|
-
const
|
|
461
|
-
console.log('Backend доступен:', response.ok);
|
|
562
|
+
// Старый способ (4.x)
|
|
563
|
+
const status = await sdk.projects.getIndexingStatus(projectId);
|
|
462
564
|
|
|
463
|
-
//
|
|
464
|
-
const
|
|
465
|
-
baseURL: 'http://localhost:3000',
|
|
466
|
-
timeout: 120000 // 2 минуты
|
|
467
|
-
});
|
|
565
|
+
// Новый способ (5.x)
|
|
566
|
+
const status = await sdk.indexing.getStatus(projectId);
|
|
468
567
|
|
|
469
|
-
//
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
debug: 'debug'
|
|
568
|
+
// Или лучше - WebSocket
|
|
569
|
+
sdk.projectSync.on('sync-status-update', (status) => {
|
|
570
|
+
// Real-time статус
|
|
473
571
|
});
|
|
474
572
|
```
|
|
475
573
|
|
|
574
|
+
## 📝 Changelog
|
|
575
|
+
|
|
576
|
+
### v5.1.3 (Latest)
|
|
577
|
+
- ✅ Добавлен `IndexingApi` для управления индексацией
|
|
578
|
+
- ✅ Добавлен `ProjectSyncClient` для WebSocket уведомлений
|
|
579
|
+
- ✅ Исправлена генерация URL в `SearchApi`
|
|
580
|
+
- ✅ Добавлен метод `semanticSearch`
|
|
581
|
+
- ✅ Добавлен метод `findOrCreateProject`
|
|
582
|
+
- ✅ Улучшена обработка ошибок WebSocket
|
|
583
|
+
- ✅ Обновлена документация и примеры
|
|
584
|
+
|
|
585
|
+
### v5.0.0
|
|
586
|
+
- 🚀 Полная переработка архитектуры
|
|
587
|
+
- 🔌 WebSocket поддержка для real-time уведомлений
|
|
588
|
+
- 🔄 Delta-chunking для эффективной синхронизации
|
|
589
|
+
- 🛡️ Встроенное rate limiting и кэширование
|
|
590
|
+
|
|
591
|
+
## 📞 Поддержка
|
|
592
|
+
|
|
593
|
+
- **GitHub**: [Issues](https://github.com/codesolver/solver-sdk/issues)
|
|
594
|
+
- **Email**: support@codesolver.dev
|
|
595
|
+
- **Документация**: [docs.codesolver.dev](https://docs.codesolver.dev)
|
|
596
|
+
|
|
476
597
|
## 📄 Лицензия
|
|
477
598
|
|
|
478
|
-
MIT License
|
|
599
|
+
MIT License - см. [LICENSE](LICENSE) файл.
|
|
479
600
|
|
|
480
601
|
---
|
|
481
602
|
|
|
482
|
-
|
|
483
|
-
> История изменений: [CHANGELOG.md](CHANGELOG.md)
|
|
603
|
+
**🚀 Code Solver SDK v5.1.3** - Создано с ❤️ для разработчиков
|