solver-sdk 3.1.18 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -505
- package/dist/cjs/api/chat-api/cancel-methods.js +77 -0
- package/dist/cjs/api/chat-api/cancel-methods.js.map +1 -0
- package/dist/cjs/api/chat-api/index.js +3 -2
- package/dist/cjs/api/chat-api/index.js.map +1 -1
- package/dist/cjs/api/chat-api/interfaces.js.map +1 -1
- package/dist/cjs/api/projects-api.js +119 -77
- package/dist/cjs/api/projects-api.js.map +1 -1
- package/dist/cjs/api/tools-api.js +86 -0
- package/dist/cjs/api/tools-api.js.map +1 -0
- package/dist/cjs/code-solver-sdk.js +10 -0
- package/dist/cjs/code-solver-sdk.js.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/index.js +2 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/esm/api/chat-api/cancel-methods.js +73 -0
- package/dist/esm/api/chat-api/cancel-methods.js.map +1 -0
- package/dist/esm/api/chat-api/index.js +3 -2
- package/dist/esm/api/chat-api/index.js.map +1 -1
- package/dist/esm/api/chat-api/interfaces.js.map +1 -1
- package/dist/esm/api/projects-api.js +119 -77
- package/dist/esm/api/projects-api.js.map +1 -1
- package/dist/esm/api/tools-api.js +82 -0
- package/dist/esm/api/tools-api.js.map +1 -0
- package/dist/esm/code-solver-sdk.js +10 -0
- package/dist/esm/code-solver-sdk.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/index.js +2 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/types/api/chat-api/cancel-methods.d.ts +57 -0
- package/dist/types/api/chat-api/cancel-methods.d.ts.map +1 -0
- package/dist/types/api/chat-api/index.d.ts +2 -2
- package/dist/types/api/chat-api/index.d.ts.map +1 -1
- package/dist/types/api/chat-api/interfaces.d.ts +18 -0
- package/dist/types/api/chat-api/interfaces.d.ts.map +1 -1
- package/dist/types/api/projects-api.d.ts +88 -40
- package/dist/types/api/projects-api.d.ts.map +1 -1
- package/dist/types/api/tools-api.d.ts +61 -0
- package/dist/types/api/tools-api.d.ts.map +1 -0
- package/dist/types/code-solver-sdk.d.ts +8 -0
- package/dist/types/code-solver-sdk.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +218 -8
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# Code Solver SDK
|
|
1
|
+
# Code Solver SDK v5.0.0
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> **🗑️ Ультра-чистый JavaScript/TypeScript SDK для VS Code Extensions**
|
|
4
|
+
> Без legacy кода, без мертвых методов, только актуальный API
|
|
5
5
|
|
|
6
6
|
JavaScript/TypeScript SDK для работы с Code Solver API. Предоставляет простой интерфейс для индексации кода, семантического поиска функций и работы с AI чатом.
|
|
7
7
|
|
|
@@ -9,87 +9,15 @@ JavaScript/TypeScript SDK для работы с Code Solver API. Предост
|
|
|
9
9
|
|
|
10
10
|
- **💬 Chat API** - взаимодействие с AI моделями (Claude, GPT)
|
|
11
11
|
- **🔍 Code Search** - семантический поиск по коду и функциям
|
|
12
|
-
- **📊 Project Indexing** - индексация и анализ проектов
|
|
12
|
+
- **📊 Project Indexing** - индексация и анализ проектов с **богатой информацией**
|
|
13
13
|
- **📝 Context API** - получение контекста для AI
|
|
14
14
|
- **🛠️ Code Modification** - модификация кода через AI
|
|
15
15
|
- **🔇 Настраиваемое логирование** - полный контроль над выводом в консоль
|
|
16
|
+
- **✨ Улучшенная типизация** - полные TypeScript типы с примерами и документацией
|
|
16
17
|
|
|
17
|
-
##
|
|
18
|
+
## 🚀 Что нового в v5.0.0
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
- **ИСПРАВЛЕНА КРИТИЧЕСКАЯ ОШИБКА 404**: Полностью обновлен SDK для работы с унифицированным API
|
|
22
|
-
- Все методы теперь используют правильный endpoint `/api/v1/projects`
|
|
23
|
-
- Убраны ссылки на несуществующий endpoint `/projects/find-or-create`
|
|
24
|
-
- Полная совместимость с backend API v3.1.14
|
|
25
|
-
- Решены все проблемы с дедупликацией проектов
|
|
26
|
-
|
|
27
|
-
### 🎯 Унифицированная архитектура
|
|
28
|
-
|
|
29
|
-
- **Один endpoint для всех операций**: Все методы создания проектов используют единый `POST /projects` с автоматической дедупликацией
|
|
30
|
-
- **Никаких дубликатов**: Система автоматически находит существующие проекты по пути
|
|
31
|
-
- **Упрощенная API**: Убрана избыточность, улучшена консистентность
|
|
32
|
-
|
|
33
|
-
### 🔄 Предыдущие обновления v3.1.9
|
|
34
|
-
|
|
35
|
-
### ✅ КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Соответствие официальной документации Anthropic API
|
|
36
|
-
|
|
37
|
-
- **🔧 Tool choice валидация**: Исправлена согласно официальной документации
|
|
38
|
-
- Только `tool_choice: "any"` или `{ type: "any" }` с thinking (как в документации)
|
|
39
|
-
- Убраны неточные валидации `auto`, `none` с thinking
|
|
40
|
-
- **🛡️ Interleaved thinking**: Улучшена логика добавления beta header
|
|
41
|
-
- Добавляет `interleaved-thinking-2025-05-14` только если `options.beta` не установлен
|
|
42
|
-
- **📋 onEvent callback**: Финальное исправление структуры данных
|
|
43
|
-
- 100% соответствие стандарту Anthropic API в onEvent callbacks
|
|
44
|
-
|
|
45
|
-
### v3.1.8 (предыдущие обновления)
|
|
46
|
-
|
|
47
|
-
### 🚨 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: onEvent callback данные
|
|
48
|
-
- **Проблема решена**: onEvent callback теперь получает **оригинальные события Anthropic API**
|
|
49
|
-
- **Исправлено**: `content_block_start` содержит полный `content_block` объект с правильными `id`, `name`, `input`
|
|
50
|
-
- **Исправлено**: `input_json_delta` передается как `delta.type: 'input_json_delta'` вместо обычного text
|
|
51
|
-
- **Убрано**: Лишние поля `projectId`, `timestamp` которые нарушали стандарт Anthropic
|
|
52
|
-
- **Результат**: Полная совместимость с Anthropic API стандартом для tool_use событий
|
|
53
|
-
|
|
54
|
-
### 🔧 Что было исправлено:
|
|
55
|
-
```javascript
|
|
56
|
-
// ❌ БЫЛО (v3.1.7): onEvent получал обработанные данные
|
|
57
|
-
onEvent: (type, data) => {
|
|
58
|
-
// data содержал: { projectId, timestamp, content_block: null }
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// ✅ СТАЛО (v3.1.8): onEvent получает оригинальные данные
|
|
62
|
-
onEvent: (type, data) => {
|
|
63
|
-
// data содержит стандартные Anthropic события:
|
|
64
|
-
// content_block_start: { type, index, content_block: { type: 'tool_use', id, name, input } }
|
|
65
|
-
// content_block_delta: { type, index, delta: { type: 'input_json_delta', partial_json } }
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### v3.1.7 (предыдущие обновления)
|
|
70
|
-
|
|
71
|
-
### 🚨 ИСПРАВЛЕНО: Избыточное логирование в консоли
|
|
72
|
-
- **Проблема решена**: SDK больше не создает спам в Developer Console VS Code
|
|
73
|
-
- **Новые уровни логирования**: `'silent' | 'error' | 'warn' | 'info' | 'debug'`
|
|
74
|
-
- **Детальный контроль потоков**: Настройка логирования SSE событий, chunk'ов и callbacks
|
|
75
|
-
- **Обратная совместимость**: Старые опции `debug: true/false/'verbose'` работают как раньше
|
|
76
|
-
|
|
77
|
-
### v3.1.6 (предыдущие обновления)
|
|
78
|
-
|
|
79
|
-
- **🔧 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ**: Восстановлена передача `content_block_start` событий для `tool_use` блоков
|
|
80
|
-
- **✅ Tool Continuation**: Исправлена поддержка tool continuation функциональности
|
|
81
|
-
- **🛠️ Новые события**: Добавлена обработка `input_json_delta`, `signature_delta` для инструментов
|
|
82
|
-
- **📊 Улучшенная обработка**: Корректная обработка всех типов content блоков (thinking, text, tool_use)
|
|
83
|
-
- **🔒 Валидация**: Исправлена валидация `tool_choice` согласно документации Anthropic
|
|
84
|
-
|
|
85
|
-
### v3.1.5 (предыдущие улучшения)
|
|
86
|
-
- **✅ Исправлена критическая проблема `toJSON`** - решена ошибка сериализации в VS Code IPC
|
|
87
|
-
- **🆕 Новые API методы**: `getIndexingStatus()`, `getProjectInfo()` для безопасной работы
|
|
88
|
-
- **🔧 Безопасная сериализация**: Все Date объекты автоматически преобразуются в ISO строки
|
|
89
|
-
- **🧠 Thinking API**: Полная поддержка мышления Claude с real-time выводом
|
|
90
|
-
- **📊 Real-time данные**: Приоритет live данных над статическими из БД
|
|
91
|
-
|
|
92
|
-
> **Для разработчиков инструментов**: v3.1.6 восстанавливает корректную работу tool continuation!
|
|
20
|
+
> **Чистая версия** - убраны все устаревшие методы. Только актуальный API без мертвого кода.
|
|
93
21
|
|
|
94
22
|
## 📦 Установка
|
|
95
23
|
|
|
@@ -97,518 +25,199 @@ onEvent: (type, data) => {
|
|
|
97
25
|
npm install solver-sdk
|
|
98
26
|
```
|
|
99
27
|
|
|
100
|
-
##
|
|
101
|
-
|
|
102
|
-
SDK предлагает гибкую систему логирования для контроля вывода в консоль:
|
|
103
|
-
|
|
104
|
-
### 📊 Уровни логирования
|
|
105
|
-
```javascript
|
|
106
|
-
const sdk = await CodeSolverSDK.create({
|
|
107
|
-
baseURL: 'http://localhost:3000',
|
|
108
|
-
|
|
109
|
-
// Уровни логирования (от тихого к подробному):
|
|
110
|
-
debug: 'silent', // Полное отключение (даже ошибки)
|
|
111
|
-
debug: 'error', // Только ошибки (рекомендуется для VS Code)
|
|
112
|
-
debug: 'warn', // Предупреждения и ошибки
|
|
113
|
-
debug: 'info', // Базовая информация
|
|
114
|
-
debug: 'debug', // Подробная отладка
|
|
115
|
-
|
|
116
|
-
// Обратная совместимость:
|
|
117
|
-
debug: false, // Отключено
|
|
118
|
-
debug: true, // Базовое логирование
|
|
119
|
-
debug: 'verbose' // Подробное (аналог 'debug')
|
|
120
|
-
});
|
|
121
|
-
```
|
|
28
|
+
## ⚙️ Конфигурация
|
|
122
29
|
|
|
123
|
-
### 🎛️ Детальный контроль потоков
|
|
124
30
|
```javascript
|
|
125
31
|
const sdk = await CodeSolverSDK.create({
|
|
126
|
-
baseURL: 'http://localhost:3000',
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
//
|
|
130
|
-
streamLogging: {
|
|
131
|
-
sseEvents: false, // SSE события (content_block_start/delta/stop)
|
|
132
|
-
streamChunks: false, // Chunk'и потока (каждый кусок текста)
|
|
133
|
-
eventCallbacks: false,// onEvent callback'и
|
|
134
|
-
importantOnly: true // Только важные события (start, stop, errors)
|
|
135
|
-
}
|
|
32
|
+
baseURL: 'http://localhost:3000', // Обязательный
|
|
33
|
+
apiKey: 'your-api-key', // Опционально
|
|
34
|
+
timeout: 30000, // Таймаут запросов (мс)
|
|
35
|
+
debug: 'error' // Уровень логирования
|
|
136
36
|
});
|
|
137
37
|
```
|
|
138
38
|
|
|
139
|
-
###
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
debug: 'info'
|
|
146
|
-
|
|
147
|
-
// 🔹 Deep debugging:
|
|
148
|
-
debug: 'debug',
|
|
149
|
-
streamLogging: { sseEvents: true, streamChunks: true }
|
|
150
|
-
|
|
151
|
-
// 🔹 Полная тишина:
|
|
152
|
-
debug: 'silent'
|
|
153
|
-
```
|
|
39
|
+
### 📊 Уровни логирования
|
|
40
|
+
- `'silent'` - полное отключение
|
|
41
|
+
- `'error'` - только ошибки (рекомендуется)
|
|
42
|
+
- `'warn'` - предупреждения и ошибки
|
|
43
|
+
- `'info'` - базовая информация
|
|
44
|
+
- `'debug'` - подробная отладка
|
|
154
45
|
|
|
155
46
|
## 🚀 Быстрый старт
|
|
156
47
|
|
|
157
48
|
```javascript
|
|
158
49
|
import { CodeSolverSDK } from 'solver-sdk';
|
|
159
50
|
|
|
160
|
-
// Создание SDK
|
|
51
|
+
// Создание SDK
|
|
161
52
|
const sdk = await CodeSolverSDK.create({
|
|
162
53
|
baseURL: 'http://localhost:3000',
|
|
163
|
-
debug: 'error' //
|
|
54
|
+
debug: 'error' // Рекомендуемый уровень для production
|
|
164
55
|
});
|
|
165
56
|
|
|
166
|
-
//
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
streamLogging: {
|
|
171
|
-
sseEvents: true, // Логировать SSE события
|
|
172
|
-
streamChunks: true, // Логировать chunk'и потока
|
|
173
|
-
eventCallbacks: true // Логировать onEvent callbacks
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
// Создание и индексация проекта
|
|
178
|
-
const project = await sdk.projects.findOrCreateProject(
|
|
179
|
-
'/path/to/project',
|
|
180
|
-
'My Project'
|
|
57
|
+
// 1. Создание проекта (с автоматической дедупликацией)
|
|
58
|
+
const project = await sdk.projects.createProject(
|
|
59
|
+
'My Project',
|
|
60
|
+
'/path/to/project'
|
|
181
61
|
);
|
|
182
62
|
|
|
63
|
+
// 2. Запуск индексации
|
|
183
64
|
await sdk.projects.startIndexing(project.id);
|
|
184
65
|
|
|
185
|
-
//
|
|
186
|
-
|
|
187
|
-
|
|
66
|
+
// 3. Проверка статуса
|
|
67
|
+
const status = await sdk.projects.getIndexingStatus(project.id);
|
|
68
|
+
console.log(`Статус: ${status.status}, прогресс: ${status.progress}%`);
|
|
188
69
|
|
|
189
|
-
// Поиск
|
|
190
|
-
const
|
|
70
|
+
// 4. Поиск в коде
|
|
71
|
+
const results = await sdk.search.searchCode(project.id, {
|
|
191
72
|
query: 'function calculateSum',
|
|
192
73
|
limit: 10
|
|
193
74
|
});
|
|
194
75
|
|
|
195
|
-
//
|
|
196
|
-
const functions = await sdk.search.searchFunctions(project.id, {
|
|
197
|
-
query: 'FileIndexingService',
|
|
198
|
-
limit: 5
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
// Работа с чатом
|
|
76
|
+
// 5. Чат с AI
|
|
202
77
|
const response = await sdk.chat.chat([
|
|
203
|
-
{ role: 'user', content: 'Объясни
|
|
78
|
+
{ role: 'user', content: 'Объясни найденный код' }
|
|
204
79
|
], { projectId: project.id });
|
|
205
80
|
|
|
206
|
-
|
|
207
|
-
for await (const chunk of sdk.chat.streamChat([
|
|
208
|
-
{ role: 'user', content: 'Объясни рекурсию пошагово' }
|
|
209
|
-
], {
|
|
210
|
-
projectId: project.id,
|
|
211
|
-
thinking: {
|
|
212
|
-
type: 'enabled',
|
|
213
|
-
budget_tokens: 5000
|
|
214
|
-
},
|
|
215
|
-
onEvent: (type, data) => {
|
|
216
|
-
if (type === 'content_block_delta' && data.delta?.type === 'thinking_delta') {
|
|
217
|
-
console.log(`🧠 Думает: ${data.delta.thinking}`);
|
|
218
|
-
} else if (type === 'content_block_delta' && data.delta?.type === 'text_delta') {
|
|
219
|
-
console.log(`💬 Отвечает: ${data.delta.text}`);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
})) {
|
|
223
|
-
if (chunk.text) {
|
|
224
|
-
process.stdout.write(chunk.text);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
81
|
+
console.log(response.content);
|
|
227
82
|
```
|
|
228
83
|
|
|
229
84
|
## 📋 API Методы
|
|
230
85
|
|
|
231
86
|
### 📁 Projects API
|
|
232
87
|
```javascript
|
|
233
|
-
// Создание проекта
|
|
234
|
-
await sdk.projects.createProject(
|
|
235
|
-
|
|
236
|
-
'/project/path', // path
|
|
237
|
-
{ description: 'Desc' } // data (опционально)
|
|
238
|
-
);
|
|
239
|
-
|
|
240
|
-
// Получение списка проектов
|
|
241
|
-
await sdk.projects.getProjects();
|
|
242
|
-
|
|
243
|
-
// Получение информации о проекте
|
|
244
|
-
await sdk.projects.getProject(projectId);
|
|
88
|
+
// Создание проекта
|
|
89
|
+
await sdk.projects.createProject('Project Name', '/project/path');
|
|
90
|
+
await sdk.projects.createProject('Project Name', '/project/path', { description: 'Optional' });
|
|
245
91
|
|
|
246
|
-
// Получение
|
|
247
|
-
await sdk.projects.
|
|
92
|
+
// Получение проектов
|
|
93
|
+
await sdk.projects.getAllProjects(); // Все проекты
|
|
94
|
+
await sdk.projects.getReadyProjects(); // Только готовые к работе
|
|
95
|
+
await sdk.projects.getProject(projectId); // Конкретный проект с полной информацией
|
|
248
96
|
```
|
|
249
97
|
|
|
250
|
-
###
|
|
98
|
+
### ⚙️ Indexing API
|
|
251
99
|
```javascript
|
|
252
|
-
//
|
|
253
|
-
|
|
254
|
-
await sdk.projects.
|
|
255
|
-
|
|
256
|
-
//
|
|
257
|
-
const
|
|
258
|
-
console.log(
|
|
259
|
-
|
|
260
|
-
// Получение общей информации о проекте
|
|
261
|
-
const projectInfo = await sdk.projects.getProjectInfo(project.id);
|
|
262
|
-
|
|
263
|
-
// Ожидание завершения индексации
|
|
264
|
-
while (true) {
|
|
265
|
-
const status = await sdk.projects.getIndexingStatus(project.id);
|
|
266
|
-
console.log(`Прогресс: ${status.progress}%, Файлы: ${status.processedFiles}/${status.totalFiles}`);
|
|
267
|
-
|
|
268
|
-
if (status.status === 'complete') break;
|
|
269
|
-
if (status.status === 'failed') throw new Error('Ошибка индексации: ' + status.error);
|
|
270
|
-
|
|
271
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
272
|
-
}
|
|
100
|
+
// Управление индексацией
|
|
101
|
+
await sdk.projects.startIndexing(projectId);
|
|
102
|
+
await sdk.projects.cancelIndexing(projectId);
|
|
103
|
+
|
|
104
|
+
// Статус индексации
|
|
105
|
+
const status = await sdk.projects.getIndexingStatus(projectId);
|
|
106
|
+
console.log(`${status.status}: ${status.progress}%`);
|
|
273
107
|
```
|
|
274
108
|
|
|
275
109
|
### 🔍 Search API
|
|
276
110
|
```javascript
|
|
277
|
-
// Поиск
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
query: 'search query',
|
|
111
|
+
// Поиск в коде
|
|
112
|
+
const results = await sdk.search.searchCode(projectId, {
|
|
113
|
+
query: 'function name',
|
|
281
114
|
limit: 20
|
|
282
115
|
});
|
|
283
116
|
|
|
284
|
-
//
|
|
285
|
-
await sdk.search.searchCode({
|
|
286
|
-
projectId: projectId,
|
|
287
|
-
query: 'search query',
|
|
288
|
-
limit: 20
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
// Поиск функций (гибкая сигнатура)
|
|
292
|
-
// Способ 1: projectId отдельно
|
|
117
|
+
// Поиск функций
|
|
293
118
|
const functions = await sdk.search.searchFunctions(projectId, {
|
|
294
|
-
query: 'calculateSum',
|
|
295
|
-
limit: 10
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
// Способ 2: projectId в параметрах
|
|
299
|
-
const functions = await sdk.search.searchFunctions({
|
|
300
|
-
projectId: projectId,
|
|
301
|
-
query: 'calculateSum',
|
|
119
|
+
query: 'calculateSum',
|
|
302
120
|
limit: 10
|
|
303
121
|
});
|
|
304
122
|
|
|
305
|
-
// Статистика
|
|
123
|
+
// Статистика
|
|
306
124
|
const stats = await sdk.search.getFunctionStats(projectId);
|
|
307
|
-
console.log(`Всего функций: ${stats.stats.totalFunctions}`);
|
|
308
125
|
```
|
|
309
126
|
|
|
310
127
|
### 💬 Chat API
|
|
311
128
|
```javascript
|
|
312
|
-
// Обычный чат
|
|
129
|
+
// Обычный чат
|
|
313
130
|
const response = await sdk.chat.chat([
|
|
314
|
-
{ role: 'user', content: '
|
|
315
|
-
], { projectId
|
|
131
|
+
{ role: 'user', content: 'Explain this code' }
|
|
132
|
+
], { projectId });
|
|
316
133
|
|
|
317
|
-
// Потоковый чат
|
|
318
|
-
for await (const chunk of sdk.chat.streamChat(messages, { projectId
|
|
134
|
+
// Потоковый чат
|
|
135
|
+
for await (const chunk of sdk.chat.streamChat(messages, { projectId })) {
|
|
319
136
|
console.log(chunk.text);
|
|
320
137
|
}
|
|
321
138
|
|
|
322
|
-
//
|
|
323
|
-
const response = await sdk.chat.chat(
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
projectId: 'your-project-id',
|
|
327
|
-
thinking: {
|
|
328
|
-
type: 'enabled',
|
|
329
|
-
budget_tokens: 5000 // Бюджет для мышления
|
|
330
|
-
}
|
|
139
|
+
// С thinking (мышление Claude)
|
|
140
|
+
const response = await sdk.chat.chat(messages, {
|
|
141
|
+
projectId,
|
|
142
|
+
thinking: { type: 'enabled', budget_tokens: 5000 }
|
|
331
143
|
});
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 💡 Типы данных
|
|
332
147
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
console.log(`💬 Отвечает: ${data.delta.text}`);
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
})) {
|
|
350
|
-
if (chunk.text) {
|
|
351
|
-
process.stdout.write(chunk.text);
|
|
352
|
-
}
|
|
148
|
+
### Project
|
|
149
|
+
```typescript
|
|
150
|
+
interface Project {
|
|
151
|
+
id: string;
|
|
152
|
+
name: string;
|
|
153
|
+
path: string;
|
|
154
|
+
ready: boolean; // Готов к работе
|
|
155
|
+
fileCount: number; // Количество файлов
|
|
156
|
+
indexStatus: 'pending' | 'indexing' | 'indexed' | 'failed' | 'cancelled';
|
|
157
|
+
indexingProgress?: number; // 0-100%
|
|
158
|
+
languageStats?: {[lang: string]: number}; // Статистика языков
|
|
159
|
+
indexingErrors?: any[]; // Ошибки индексации
|
|
160
|
+
// ... и еще 10+ полей
|
|
353
161
|
}
|
|
354
162
|
```
|
|
355
163
|
|
|
356
|
-
##
|
|
164
|
+
## 📚 Пример использования
|
|
357
165
|
|
|
358
166
|
```javascript
|
|
167
|
+
import { CodeSolverSDK } from 'solver-sdk';
|
|
168
|
+
|
|
359
169
|
const sdk = await CodeSolverSDK.create({
|
|
360
|
-
baseURL: 'http://localhost:3000'
|
|
361
|
-
apiKey: 'your-api-key', // Рекомендуется
|
|
362
|
-
timeout: 30000, // Таймаут запросов
|
|
363
|
-
debug: false // Отладка
|
|
170
|
+
baseURL: 'http://localhost:3000'
|
|
364
171
|
});
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
**⚠️ Важно**: Для Chat API `projectId` **рекомендуется**, но не обязателен в реализации:
|
|
368
|
-
```javascript
|
|
369
|
-
// ✅ РАБОТАЕТ (но без контекста проекта)
|
|
370
|
-
const response = await sdk.chat.chat(messages);
|
|
371
|
-
|
|
372
|
-
// ✅ РЕКОМЕНДУЕТСЯ (с контекстом проекта)
|
|
373
|
-
const response = await sdk.chat.chat(messages, { projectId: 'your-project-id' });
|
|
374
|
-
|
|
375
|
-
// 💡 Получить projectId можно так:
|
|
376
|
-
const projects = await sdk.projects.getReadyProjects();
|
|
377
|
-
const projectId = projects[0].id;
|
|
378
|
-
```
|
|
379
172
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
# Все тесты
|
|
384
|
-
npm test
|
|
385
|
-
|
|
386
|
-
# Только HTTP тесты
|
|
387
|
-
npm test -- --testNamePattern="HTTP"
|
|
388
|
-
|
|
389
|
-
# Интеграционные тесты
|
|
390
|
-
npm run test:integration
|
|
391
|
-
|
|
392
|
-
# Тесты индексации
|
|
393
|
-
npm test -- --testPathPattern="indexing"
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
## 📚 Примеры использования
|
|
397
|
-
|
|
398
|
-
### Полный цикл работы с проектом
|
|
399
|
-
|
|
400
|
-
```javascript
|
|
401
|
-
import { CodeSolverSDK } from 'solver-sdk';
|
|
173
|
+
// Работа с проектом
|
|
174
|
+
const project = await sdk.projects.createProject('My App', '/path/to/app');
|
|
175
|
+
await sdk.projects.startIndexing(project.id);
|
|
402
176
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
console.log('Запуск индексации...');
|
|
417
|
-
await sdk.projects.startIndexing(project.id);
|
|
418
|
-
|
|
419
|
-
// 3. Ждем завершения индексации
|
|
420
|
-
console.log('Ожидание завершения индексации...');
|
|
421
|
-
while (true) {
|
|
422
|
-
const status = await sdk.projects.getIndexingStatus(project.id);
|
|
423
|
-
if (status.status === 'complete') break;
|
|
424
|
-
if (status.status === 'failed') throw new Error('Ошибка индексации: ' + status.error);
|
|
425
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
// 4. Ищем React компоненты
|
|
429
|
-
const components = await sdk.search.searchCode(project.id, {
|
|
430
|
-
query: 'React.Component class',
|
|
431
|
-
limit: 10
|
|
432
|
-
});
|
|
433
|
-
|
|
434
|
-
// 5. Задаем вопрос AI о коду
|
|
435
|
-
const aiResponse = await sdk.chat.chat([
|
|
436
|
-
{
|
|
437
|
-
role: 'user',
|
|
438
|
-
content: `Проанализируй найденные React компоненты: ${JSON.stringify(components)}`
|
|
439
|
-
}
|
|
440
|
-
], { projectId: project.id });
|
|
441
|
-
|
|
442
|
-
console.log('✅ Анализ завершен');
|
|
443
|
-
console.log('📊 Компоненты:', components.results.length);
|
|
444
|
-
console.log('🤖 AI анализ:', aiResponse.content);
|
|
445
|
-
|
|
446
|
-
} catch (error) {
|
|
447
|
-
console.error('❌ Ошибка:', error.message);
|
|
448
|
-
}
|
|
449
|
-
}
|
|
177
|
+
// Ожидание индексации
|
|
178
|
+
let status;
|
|
179
|
+
do {
|
|
180
|
+
status = await sdk.projects.getIndexingStatus(project.id);
|
|
181
|
+
console.log(`${status.status}: ${status.progress}%`);
|
|
182
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
183
|
+
} while (status.status === 'indexing');
|
|
184
|
+
|
|
185
|
+
// Поиск и чат
|
|
186
|
+
const results = await sdk.search.searchCode(project.id, {
|
|
187
|
+
query: 'function main',
|
|
188
|
+
limit: 5
|
|
189
|
+
});
|
|
450
190
|
|
|
451
|
-
|
|
191
|
+
const response = await sdk.chat.chat([
|
|
192
|
+
{ role: 'user', content: 'Explain this code' }
|
|
193
|
+
], { projectId: project.id });
|
|
452
194
|
```
|
|
453
195
|
|
|
454
196
|
## 🔧 Устранение неполадок
|
|
455
197
|
|
|
456
|
-
### ✅ Исправлена проблема toJSON (v3.1.5)
|
|
457
|
-
```javascript
|
|
458
|
-
// ❌ СТАРАЯ ОШИБКА (до v3.1.5):
|
|
459
|
-
// CodeExpectedError: Method not found: toJSON
|
|
460
|
-
|
|
461
|
-
// ✅ РЕШЕНИЕ: Обновите SDK до последней версии
|
|
462
|
-
npm install solver-sdk@latest # v3.1.15
|
|
463
|
-
|
|
464
|
-
// ✅ Теперь все API возвращают JSON-совместимые объекты
|
|
465
|
-
const status = await sdk.projects.getIndexingStatus(projectId);
|
|
466
|
-
// Все Date объекты автоматически преобразуются в ISO строки
|
|
467
|
-
```
|
|
468
|
-
|
|
469
|
-
### Проблемы с подключением
|
|
470
198
|
```javascript
|
|
471
|
-
// Проверка
|
|
472
|
-
const
|
|
473
|
-
console.log('
|
|
474
|
-
```
|
|
199
|
+
// Проверка подключения
|
|
200
|
+
const response = await fetch('http://localhost:3000/health');
|
|
201
|
+
console.log('Backend доступен:', response.ok);
|
|
475
202
|
|
|
476
|
-
|
|
477
|
-
```javascript
|
|
478
|
-
// Увеличение таймаутов для больших проектов
|
|
203
|
+
// Увеличение таймаута для больших проектов
|
|
479
204
|
const sdk = await CodeSolverSDK.create({
|
|
480
205
|
baseURL: 'http://localhost:3000',
|
|
481
206
|
timeout: 120000 // 2 минуты
|
|
482
207
|
});
|
|
208
|
+
|
|
209
|
+
// Отладка с подробными логами
|
|
210
|
+
const sdk = await CodeSolverSDK.create({
|
|
211
|
+
baseURL: 'http://localhost:3000',
|
|
212
|
+
debug: 'debug'
|
|
213
|
+
});
|
|
483
214
|
```
|
|
484
215
|
|
|
485
216
|
## 📄 Лицензия
|
|
486
217
|
|
|
487
218
|
MIT License
|
|
488
219
|
|
|
489
|
-
## 🔧 Индексация: полный workflow
|
|
490
|
-
|
|
491
|
-
```javascript
|
|
492
|
-
async function indexProject(projectPath, projectName) {
|
|
493
|
-
const sdk = await CodeSolverSDK.create({
|
|
494
|
-
baseURL: 'http://localhost:3000'
|
|
495
|
-
});
|
|
496
|
-
|
|
497
|
-
// 1. Создать/найти проект
|
|
498
|
-
const project = await sdk.projects.findOrCreateProject(projectPath, projectName);
|
|
499
|
-
|
|
500
|
-
// 2. Запустить индексацию
|
|
501
|
-
await sdk.projects.startIndexing(project.id);
|
|
502
|
-
|
|
503
|
-
// 3. Мониторинг прогресса
|
|
504
|
-
while (true) {
|
|
505
|
-
const status = await sdk.projects.getIndexingStatus(project.id);
|
|
506
|
-
|
|
507
|
-
if (status.status === 'complete') {
|
|
508
|
-
console.log('✅ Индексация завершена!');
|
|
509
|
-
break;
|
|
510
|
-
} else if (status.status === 'failed') {
|
|
511
|
-
console.log('❌ Ошибка:', status.error);
|
|
512
|
-
break;
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
console.log(`📊 Прогресс: ${status.progress || 0}%`);
|
|
516
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
return project;
|
|
520
|
-
}
|
|
521
|
-
```
|
|
522
|
-
|
|
523
|
-
## 🔌 VS Code Extension (готовый код)
|
|
524
|
-
|
|
525
|
-
```typescript
|
|
526
|
-
import { CodeSolverSDK } from 'solver-sdk';
|
|
527
|
-
import * as vscode from 'vscode';
|
|
528
|
-
|
|
529
|
-
let sdk: CodeSolverSDK;
|
|
530
|
-
|
|
531
|
-
export async function activate(context: vscode.ExtensionContext) {
|
|
532
|
-
sdk = await CodeSolverSDK.create({
|
|
533
|
-
baseURL: 'http://localhost:3000'
|
|
534
|
-
});
|
|
535
|
-
|
|
536
|
-
// Команда индексации
|
|
537
|
-
const indexCmd = vscode.commands.registerCommand('extension.indexProject', async () => {
|
|
538
|
-
const folder = vscode.workspace.workspaceFolders?.[0];
|
|
539
|
-
if (!folder) return;
|
|
540
|
-
|
|
541
|
-
return vscode.window.withProgress({
|
|
542
|
-
location: vscode.ProgressLocation.Notification,
|
|
543
|
-
title: 'Индексация проекта',
|
|
544
|
-
cancellable: false
|
|
545
|
-
}, async (progress) => {
|
|
546
|
-
const project = await sdk.projects.findOrCreateProject(folder.uri.fsPath, folder.name);
|
|
547
|
-
await sdk.projects.startIndexing(project.id);
|
|
548
|
-
|
|
549
|
-
while (true) {
|
|
550
|
-
const status = await sdk.projects.getIndexingStatus(project.id);
|
|
551
|
-
if (status.status === 'complete') break;
|
|
552
|
-
progress.report({ message: `${status.progress || 0}%` });
|
|
553
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
vscode.window.showInformationMessage('✅ Проект проиндексирован!');
|
|
557
|
-
});
|
|
558
|
-
});
|
|
559
|
-
|
|
560
|
-
// Команда поиска функций
|
|
561
|
-
const searchCmd = vscode.commands.registerCommand('extension.searchFunctions', async () => {
|
|
562
|
-
const query = await vscode.window.showInputBox({ prompt: 'Поиск функций' });
|
|
563
|
-
if (!query) return;
|
|
564
|
-
|
|
565
|
-
const projects = await sdk.projects.getReadyProjects();
|
|
566
|
-
if (projects.length === 0) return;
|
|
567
|
-
|
|
568
|
-
const response = await sdk.search.searchFunctions(projects[0].id, { query, limit: 20 });
|
|
569
|
-
|
|
570
|
-
if (!response.success || response.results.length === 0) {
|
|
571
|
-
vscode.window.showInformationMessage('Функции не найдены');
|
|
572
|
-
return;
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
const items = response.results.map(fn => ({
|
|
576
|
-
label: fn.name,
|
|
577
|
-
description: fn.signature,
|
|
578
|
-
detail: `${fn.filePath}:${fn.startLine}`,
|
|
579
|
-
function: fn
|
|
580
|
-
}));
|
|
581
|
-
|
|
582
|
-
const selected = await vscode.window.showQuickPick(items);
|
|
583
|
-
if (selected) {
|
|
584
|
-
const doc = await vscode.workspace.openTextDocument(selected.function.filePath);
|
|
585
|
-
const editor = await vscode.window.showTextDocument(doc);
|
|
586
|
-
|
|
587
|
-
const range = new vscode.Range(
|
|
588
|
-
selected.function.startLine - 1, 0,
|
|
589
|
-
selected.function.endLine - 1, 0
|
|
590
|
-
);
|
|
591
|
-
|
|
592
|
-
editor.selection = new vscode.Selection(range.start, range.end);
|
|
593
|
-
editor.revealRange(range, vscode.TextEditorRevealType.InCenter);
|
|
594
|
-
}
|
|
595
|
-
});
|
|
596
|
-
|
|
597
|
-
context.subscriptions.push(indexCmd, searchCmd);
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
// package.json для VS Code Extension
|
|
601
|
-
{
|
|
602
|
-
"contributes": {
|
|
603
|
-
"commands": [
|
|
604
|
-
{ "command": "extension.indexProject", "title": "📊 Индексировать проект" },
|
|
605
|
-
{ "command": "extension.searchFunctions", "title": "🔍 Поиск функций" }
|
|
606
|
-
]
|
|
607
|
-
},
|
|
608
|
-
"dependencies": { "solver-sdk": "^3.1.5" }
|
|
609
|
-
}
|
|
610
|
-
```
|
|
611
|
-
|
|
612
220
|
---
|
|
613
221
|
|
|
614
|
-
|
|
222
|
+
> **Документация актуальна для v5.0.0**
|
|
223
|
+
> История изменений: [CHANGELOG.md](CHANGELOG.md)
|