JSPM

  • Created
  • Published
  • Downloads 14
  • Score
    100M100P100Q82171F
  • License MIT

SDK для интеграции с Code Solver Backend API

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" }
}

🎉 Один файл = полная документация!