JSPM

  • Created
  • Published
  • Downloads 194
  • Score
    100M100P100Q78555F
  • License MIT

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

Package Exports

  • solver-sdk

Readme

Code Solver SDK v3.1.2

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

📦 Установка

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 });

📋 API Методы

📁 Projects API

// Создание проекта
await sdk.projects.createProject({
  name: 'Project Name',
  path: '/project/path',
  description: 'Description'
  });
  
// Получение списка проектов  
await sdk.projects.getProjects();

// Получение информации о проекте
await sdk.projects.getProject(projectId);

🔄 Projects & Indexing API

// Создание/поиск проекта и запуск индексации
const project = await sdk.projects.findOrCreateProject('/path/to/project', 'Project Name');
await sdk.projects.startIndexing(project.id);

// Получение статуса индексации
const status = await sdk.projects.getProjectStatus(project.id);

// Ожидание завершения индексации
while (true) {
  const status = await sdk.projects.getProjectStatus(project.id);
  if (status.status === 'ready') break;
  if (status.status === 'error') throw new Error('Ошибка индексации');
  await new Promise(resolve => setTimeout(resolve, 2000));
}

🔍 Search API

// Поиск кода
await sdk.search.searchCode(projectId, {
  query: 'search query',
  limit: 20
});

💬 Chat API

// Обычный чат (projectId ОБЯЗАТЕЛЕН!)
const response = await sdk.chat.chat([
  { role: 'user', content: 'Объясни этот код' }
], { projectId: 'your-project-id' });

// Потоковый чат
for await (const chunk of sdk.chat.streamChat(messages, { projectId: 'your-project-id' })) {
  console.log(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.getProjectStatus(project.id);
      if (status.status === 'ready') break;
      if (status.status === 'error') throw new 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.length);
    console.log('🤖 AI анализ:', aiResponse.content);

  } catch (error) {
    console.error('❌ Ошибка:', error.message);
  }
}

fullWorkflow();

🔧 Устранение неполадок

Проблемы с подключением

// Проверка здоровья API
const isHealthy = await sdk.checkHealth();
console.log('API доступен:', isHealthy);

Таймауты и повторы

// Увеличение таймаутов для больших проектов
const sdk = await CodeSolverSDK.create({
  baseURL: 'http://localhost:3000',
  timeout: 120000  // 2 минуты
});

📝 Changelog v3.1.2

✅ Добавлено

  • Поиск функций через /search/functions API
  • Методы searchFunctions() и searchFunctionsGet()
  • Статистика функций getFunctionStats()
  • Автоматический выбор модели и токенов на бэкенде
  • Упрощенные Chat API без параметров модели

❌ Удалено

  • AgentsApi - больше не используется
  • DependenciesApi - работает внутренне
  • simple-indexing-client.ts - дублировал ProjectsApi
  • Все устаревшие методы и примеры
  • Ручной выбор модели и лимитов токенов клиентом

🔄 Изменено

  • Обновлены все примеры кода на актуальный синтаксис
  • Упрощена документация в один файл
  • Исправлены пути API с префиксом /api/v1
  • Улучшена обработка ошибок индексации
  • Chat API упрощен - модель выбирается автоматически
  • Полная синхронизация документации с реальным кодом

📄 Лицензия

MIT License

Q: Пустые результаты поиска

// Убедитесь что проект проиндексирован
const readyProjects = await sdk.projects.getReadyProjects();
console.log('Готовые проекты:', readyProjects);

🔧 Индексация: полный 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.getProjectStatus(project.id);
    
    if (status.status === 'ready') {
      console.log('✅ Индексация завершена!');
      break;
    } else if (status.status === 'error') {
      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.getProjectStatus(project.id);
        if (status.status === 'ready') 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.2" }
}

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