Package Exports
- solver-sdk
Readme
Code Solver SDK v3.1.6
JavaScript/TypeScript SDK для VS Code Extensions
Подключение к AI бэкенду для индексации, поиска и работы с кодом
JavaScript/TypeScript SDK для работы с Code Solver API. Предоставляет простой интерфейс для индексации кода, семантического поиска функций и работы с AI чатом.
🎯 Основные возможности
- 💬 Chat API - взаимодействие с AI моделями (Claude, GPT)
- 🔍 Code Search - семантический поиск по коду и функциям
- 📊 Project Indexing - индексация и анализ проектов
- 📝 Context API - получение контекста для AI
- 🛠️ Code Modification - модификация кода через AI
🔄 Последние обновления v3.1.6
- 🔧 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Восстановлена передача
content_block_startсобытий дляtool_useблоков - ✅ Tool Continuation: Исправлена поддержка tool continuation функциональности
- 🛠️ Новые события: Добавлена обработка
input_json_delta,signature_deltaдля инструментов - 📊 Улучшенная обработка: Корректная обработка всех типов content блоков (thinking, text, tool_use)
- 🔒 Валидация: Исправлена валидация
tool_choiceсогласно документации Anthropic
v3.1.5 (предыдущие улучшения)
- ✅ Исправлена критическая проблема
toJSON- решена ошибка сериализации в VS Code IPC - 🆕 Новые API методы:
getIndexingStatus(),getProjectInfo()для безопасной работы - 🔧 Безопасная сериализация: Все Date объекты автоматически преобразуются в ISO строки
- 🧠 Thinking API: Полная поддержка мышления Claude с real-time выводом
- 📊 Real-time данные: Приоритет live данных над статическими из БД
Для разработчиков инструментов: v3.1.6 восстанавливает корректную работу tool continuation!
📦 Установка
npm install solver-sdk🚀 Быстрый старт
import { CodeSolverSDK } from 'solver-sdk';
// Создание SDK
const sdk = await CodeSolverSDK.create({
baseURL: 'http://localhost:3000'
});
// Создание и индексация проекта
const project = await sdk.projects.findOrCreateProject(
'/path/to/project',
'My Project'
);
await sdk.projects.startIndexing(project.id);
// Поиск кода
const searchResults = await sdk.search.searchCode(project.id, {
query: 'function calculateSum',
limit: 10
});
// Поиск функций
const functions = await sdk.search.searchFunctions(project.id, {
query: 'FileIndexingService',
limit: 5
});
// Работа с чатом
const response = await sdk.chat.chat([
{ role: 'user', content: 'Объясни этот код' }
], { projectId: project.id });
// Потоковый чат с thinking (мышлением)
for await (const chunk of sdk.chat.streamChat([
{ role: 'user', content: 'Объясни рекурсию пошагово' }
], {
projectId: project.id,
thinking: {
type: 'enabled',
budget_tokens: 5000
},
onEvent: (type, data) => {
if (type === 'content_block_delta' && data.delta?.type === 'thinking_delta') {
console.log(`🧠 Думает: ${data.delta.thinking}`);
} else if (type === 'content_block_delta' && data.delta?.type === 'text_delta') {
console.log(`💬 Отвечает: ${data.delta.text}`);
}
}
})) {
if (chunk.text) {
process.stdout.write(chunk.text);
}
}📋 API Методы
📁 Projects API
// Создание проекта (исправленная сигнатура)
await sdk.projects.createProject(
'Project Name', // name
'/project/path', // path
{ description: 'Desc' } // data (опционально)
);
// Получение списка проектов
await sdk.projects.getProjects();
// Получение информации о проекте
await sdk.projects.getProject(projectId);
// Получение готовых проектов
await sdk.projects.getReadyProjects();🔄 Projects & Indexing API
// Создание/поиск проекта и запуск индексации
const project = await sdk.projects.findOrCreateProject('/path/to/project', 'Project Name');
await sdk.projects.startIndexing(project.id, { force: false }); // options опционально
// Получение real-time статуса индексации
const indexingStatus = await sdk.projects.getIndexingStatus(project.id);
console.log('Статус:', indexingStatus.status, 'Прогресс:', indexingStatus.progress + '%');
// Получение общей информации о проекте
const projectInfo = await sdk.projects.getProjectInfo(project.id);
// Ожидание завершения индексации
while (true) {
const status = await sdk.projects.getIndexingStatus(project.id);
console.log(`Прогресс: ${status.progress}%, Файлы: ${status.processedFiles}/${status.totalFiles}`);
if (status.status === 'complete') break;
if (status.status === 'failed') throw new Error('Ошибка индексации: ' + status.error);
await new Promise(resolve => setTimeout(resolve, 2000));
}🔍 Search API
// Поиск кода (гибкая сигнатура)
// Способ 1: projectId отдельно
await sdk.search.searchCode(projectId, {
query: 'search query',
limit: 20
});
// Способ 2: projectId в параметрах
await sdk.search.searchCode({
projectId: projectId,
query: 'search query',
limit: 20
});
// Поиск функций (гибкая сигнатура)
// Способ 1: projectId отдельно
const functions = await sdk.search.searchFunctions(projectId, {
query: 'calculateSum',
limit: 10
});
// Способ 2: projectId в параметрах
const functions = await sdk.search.searchFunctions({
projectId: projectId,
query: 'calculateSum',
limit: 10
});
// Статистика функций в проекте
const stats = await sdk.search.getFunctionStats(projectId);
console.log(`Всего функций: ${stats.stats.totalFunctions}`);💬 Chat API
// Обычный чат (projectId опционален в реализации, но рекомендуется)
const response = await sdk.chat.chat([
{ role: 'user', content: 'Объясни этот код' }
], { projectId: 'your-project-id' }); // projectId опционален
// Потоковый чат
for await (const chunk of sdk.chat.streamChat(messages, { projectId: 'your-project-id' })) {
console.log(chunk.text);
}
// 🧠 Chat с thinking (мышлением Claude)
const response = await sdk.chat.chat([
{ role: 'user', content: 'Объясни рекурсию подробно' }
], {
projectId: 'your-project-id',
thinking: {
type: 'enabled',
budget_tokens: 5000 // Бюджет для мышления
}
});
// 🧠 Потоковый чат с thinking и real-time выводом
for await (const chunk of sdk.chat.streamChat([
{ role: 'user', content: 'Проанализируй архитектуру проекта' }
], {
projectId: 'your-project-id',
thinking: {
type: 'enabled',
budget_tokens: 8000
},
onEvent: (type, data) => {
if (type === 'content_block_delta' && data.delta?.type === 'thinking_delta') {
console.log(`🧠 Думает: ${data.delta.thinking}`);
} else if (type === 'content_block_delta' && data.delta?.type === 'text_delta') {
console.log(`💬 Отвечает: ${data.delta.text}`);
}
}
})) {
if (chunk.text) {
process.stdout.write(chunk.text);
}
}⚙️ Конфигурация
const sdk = await CodeSolverSDK.create({
baseURL: 'http://localhost:3000', // Обязательный
apiKey: 'your-api-key', // Рекомендуется
timeout: 30000, // Таймаут запросов
debug: false // Отладка
});⚠️ Важно: Для Chat API projectId рекомендуется, но не обязателен в реализации:
// ✅ РАБОТАЕТ (но без контекста проекта)
const response = await sdk.chat.chat(messages);
// ✅ РЕКОМЕНДУЕТСЯ (с контекстом проекта)
const response = await sdk.chat.chat(messages, { projectId: 'your-project-id' });
// 💡 Получить projectId можно так:
const projects = await sdk.projects.getReadyProjects();
const projectId = projects[0].id;🧪 Тестирование
# Все тесты
npm test
# Только HTTP тесты
npm test -- --testNamePattern="HTTP"
# Интеграционные тесты
npm run test:integration
# Тесты индексации
npm test -- --testPathPattern="indexing"📚 Примеры использования
Полный цикл работы с проектом
import { CodeSolverSDK } from 'solver-sdk';
async function fullWorkflow() {
const sdk = await CodeSolverSDK.create({
baseURL: 'http://localhost:3000'
});
try {
// 1. Создаем проект
const project = await sdk.projects.findOrCreateProject(
'/path/to/react-app',
'My React App'
);
// 2. Запускаем индексацию
console.log('Запуск индексации...');
await sdk.projects.startIndexing(project.id);
// 3. Ждем завершения индексации
console.log('Ожидание завершения индексации...');
while (true) {
const status = await sdk.projects.getIndexingStatus(project.id);
if (status.status === 'complete') break;
if (status.status === 'failed') throw new Error('Ошибка индексации: ' + status.error);
await new Promise(resolve => setTimeout(resolve, 2000));
}
// 4. Ищем React компоненты
const components = await sdk.search.searchCode(project.id, {
query: 'React.Component class',
limit: 10
});
// 5. Задаем вопрос AI о коду
const aiResponse = await sdk.chat.chat([
{
role: 'user',
content: `Проанализируй найденные React компоненты: ${JSON.stringify(components)}`
}
], { projectId: project.id });
console.log('✅ Анализ завершен');
console.log('📊 Компоненты:', components.results.length);
console.log('🤖 AI анализ:', aiResponse.content);
} catch (error) {
console.error('❌ Ошибка:', error.message);
}
}
fullWorkflow();🔧 Устранение неполадок
✅ Исправлена проблема toJSON (v3.1.5)
// ❌ СТАРАЯ ОШИБКА (до v3.1.5):
// CodeExpectedError: Method not found: toJSON
// ✅ РЕШЕНИЕ: Обновите SDK до v3.1.5+
npm install solver-sdk@latest
// ✅ Теперь все API возвращают JSON-совместимые объекты
const status = await sdk.projects.getIndexingStatus(projectId);
// Все Date объекты автоматически преобразуются в ISO строкиПроблемы с подключением
// Проверка здоровья API
const isHealthy = await sdk.checkHealth();
console.log('API доступен:', isHealthy);Таймауты и повторы
// Увеличение таймаутов для больших проектов
const sdk = await CodeSolverSDK.create({
baseURL: 'http://localhost:3000',
timeout: 120000 // 2 минуты
});📄 Лицензия
MIT License
🔧 Индексация: полный workflow
async function indexProject(projectPath, projectName) {
const sdk = await CodeSolverSDK.create({
baseURL: 'http://localhost:3000'
});
// 1. Создать/найти проект
const project = await sdk.projects.findOrCreateProject(projectPath, projectName);
// 2. Запустить индексацию
await sdk.projects.startIndexing(project.id);
// 3. Мониторинг прогресса
while (true) {
const status = await sdk.projects.getIndexingStatus(project.id);
if (status.status === 'complete') {
console.log('✅ Индексация завершена!');
break;
} else if (status.status === 'failed') {
console.log('❌ Ошибка:', status.error);
break;
}
console.log(`📊 Прогресс: ${status.progress || 0}%`);
await new Promise(resolve => setTimeout(resolve, 2000));
}
return project;
}🔌 VS Code Extension (готовый код)
import { CodeSolverSDK } from 'solver-sdk';
import * as vscode from 'vscode';
let sdk: CodeSolverSDK;
export async function activate(context: vscode.ExtensionContext) {
sdk = await CodeSolverSDK.create({
baseURL: 'http://localhost:3000'
});
// Команда индексации
const indexCmd = vscode.commands.registerCommand('extension.indexProject', async () => {
const folder = vscode.workspace.workspaceFolders?.[0];
if (!folder) return;
return vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: 'Индексация проекта',
cancellable: false
}, async (progress) => {
const project = await sdk.projects.findOrCreateProject(folder.uri.fsPath, folder.name);
await sdk.projects.startIndexing(project.id);
while (true) {
const status = await sdk.projects.getIndexingStatus(project.id);
if (status.status === 'complete') break;
progress.report({ message: `${status.progress || 0}%` });
await new Promise(resolve => setTimeout(resolve, 2000));
}
vscode.window.showInformationMessage('✅ Проект проиндексирован!');
});
});
// Команда поиска функций
const searchCmd = vscode.commands.registerCommand('extension.searchFunctions', async () => {
const query = await vscode.window.showInputBox({ prompt: 'Поиск функций' });
if (!query) return;
const projects = await sdk.projects.getReadyProjects();
if (projects.length === 0) return;
const response = await sdk.search.searchFunctions(projects[0].id, { query, limit: 20 });
if (!response.success || response.results.length === 0) {
vscode.window.showInformationMessage('Функции не найдены');
return;
}
const items = response.results.map(fn => ({
label: fn.name,
description: fn.signature,
detail: `${fn.filePath}:${fn.startLine}`,
function: fn
}));
const selected = await vscode.window.showQuickPick(items);
if (selected) {
const doc = await vscode.workspace.openTextDocument(selected.function.filePath);
const editor = await vscode.window.showTextDocument(doc);
const range = new vscode.Range(
selected.function.startLine - 1, 0,
selected.function.endLine - 1, 0
);
editor.selection = new vscode.Selection(range.start, range.end);
editor.revealRange(range, vscode.TextEditorRevealType.InCenter);
}
});
context.subscriptions.push(indexCmd, searchCmd);
}
// package.json для VS Code Extension
{
"contributes": {
"commands": [
{ "command": "extension.indexProject", "title": "📊 Индексировать проект" },
{ "command": "extension.searchFunctions", "title": "🔍 Поиск функций" }
]
},
"dependencies": { "solver-sdk": "^3.1.5" }
}🎉 Один файл = полная документация!