JSPM

  • Created
  • Published
  • Downloads 56
  • Score
    100M100P100Q12955F
  • License MIT

SDK для работы с VSCursor Backend - AI-powered система анализа кода

Package Exports

  • solver-sdk

Readme

Code Solver SDK v5.1.0

🗑️ Ультра-чистый JavaScript/TypeScript SDK для VS Code Extensions
Без legacy кода, без мертвых методов, только актуальный API

JavaScript/TypeScript SDK для работы с Code Solver API. Предоставляет простой интерфейс для индексации кода, семантического поиска функций, работы с AI чатом и новую Delta-Chunking архитектуру для Cursor-подобной синхронизации проектов.

🎯 Основные возможности

  • 🔄 Delta-Chunking - Cursor-like инкрементальная синхронизация проектов
  • 💬 Chat API - взаимодействие с AI моделями (Claude, GPT)
  • 🔍 Code Search - семантический поиск по коду и функциям
  • 📊 Project Indexing - индексация и анализ проектов с богатой информацией
  • 📝 Context API - получение контекста для AI
  • 🛠️ Code Modification - модификация кода через AI
  • 🔇 Настраиваемое логирование - полный контроль над выводом в консоль
  • ✨ Улучшенная типизация - полные TypeScript типы с примерами и документацией

🚀 Что нового в v5.1.0

🔄 Delta-Chunking API - добавлена полная документация для новой архитектуры синхронизации

  • Delta-Chunking интеграция - встроено в основной CodeSolverSDK класс
  • 📝 Полная документация - все методы, типы и примеры использования
  • 🔐 Шифрование и chunking - конфигурация encryption и chunking опций
  • 🎯 Готово к продакшену - интеграция с backend полностью реализована

📦 Установка

npm install solver-sdk

⚙️ Конфигурация

const sdk = await CodeSolverSDK.create({
  baseURL: 'http://localhost:3000',     // Обязательный  
  apiKey: 'your-api-key',               // Опционально
  timeout: 30000,                       // Таймаут запросов (мс)
  debug: 'error'                        // Уровень логирования
});

📊 Уровни логирования

  • 'silent' - полное отключение
  • 'error' - только ошибки (рекомендуется)
  • 'warn' - предупреждения и ошибки
  • 'info' - базовая информация
  • 'debug' - подробная отладка

🚀 Быстрый старт

import { CodeSolverSDK } from 'solver-sdk';

// Создание SDK
const sdk = await CodeSolverSDK.create({
  baseURL: 'http://localhost:3000',
  debug: 'error' // Рекомендуемый уровень для production
});

// 1. Создание проекта (с автоматической дедупликацией)
const project = await sdk.projects.createProject(
  'My Project',
  '/path/to/project'
);

// 2. Запуск индексации
await sdk.projects.startIndexing(project.id);

// 3. Проверка статуса
const status = await sdk.projects.getIndexingStatus(project.id);
console.log(`Статус: ${status.status}, прогресс: ${status.progress}%`);

// 4. Поиск в коде
const results = await sdk.search.searchCode(project.id, {
  query: 'function calculateSum',
  limit: 10
});

// 5. Чат с AI
const response = await sdk.chat.chat([
  { role: 'user', content: 'Объясни найденный код' }
], { projectId: project.id });

console.log(response.content);

📋 API Методы

📁 Projects API

// Создание проекта
await sdk.projects.createProject('Project Name', '/project/path');
await sdk.projects.createProject('Project Name', '/project/path', { description: 'Optional' });

// Получение проектов
await sdk.projects.getAllProjects();       // Все проекты
await sdk.projects.getReadyProjects();     // Только готовые к работе
await sdk.projects.getProject(projectId);  // Конкретный проект с полной информацией

⚙️ Indexing API

// Управление индексацией
await sdk.projects.startIndexing(projectId);
await sdk.projects.cancelIndexing(projectId);

// Статус индексации
const status = await sdk.projects.getIndexingStatus(projectId);
console.log(`${status.status}: ${status.progress}%`);

🔍 Search API

// Поиск в коде
const results = await sdk.search.searchCode(projectId, {
  query: 'function name',
  limit: 20
});

// Поиск функций
const functions = await sdk.search.searchFunctions(projectId, {
  query: 'calculateSum', 
  limit: 10
});

// Статистика
const stats = await sdk.search.getFunctionStats(projectId);

💬 Chat API

// Обычный чат
const response = await sdk.chat.chat([
  { role: 'user', content: 'Explain this code' }
], { projectId });

// Потоковый чат  
for await (const chunk of sdk.chat.streamChat(messages, { projectId })) {
  console.log(chunk.text);
}

// С thinking (мышление Claude)
const response = await sdk.chat.chat(messages, { 
  projectId,
  thinking: { type: 'enabled', budget_tokens: 5000 }
});

🔄 Delta-Chunking API

🚀 Новый Cursor-подобный подход к синхронизации проектов
Инкрементальные обновления, шифрование, real-time статус

Создание SDK с Delta-Chunking

import { CodeSolverSDK } from 'solver-sdk';

// Создание SDK с включенным delta-chunking
const sdk = await CodeSolverSDK.create({
  baseURL: 'http://localhost:3000',
  apiKey: 'your-api-key',
  deltaChunking: {                          // ✨ Опциональная секция
    enabled: true,                          // Включить delta-chunking
    encryption: {
      enabled: true,
      key: 'your-32-char-encryption-key-here!'  // 32 символа
    },
    chunking: {
      maxTokens: 400,                       // Максимальный размер чанка
      minTokens: 100,                       // Минимальный размер чанка  
      useTreeSitter: false,                 // Пока простая разбивка
      preserveContext: true                 // Сохранять контекст между чанками
    },
    fileWatching: {
      enabled: false,                       // Автоматическое наблюдение (в разработке)
      pollInterval: 1000,                   // Интервал проверки изменений
      ignorePatterns: ['node_modules/**']   // Игнорируемые файлы
    }
  },
  debug: 'error'
});

// Проверяем что delta-chunking включен
console.log('Delta-chunking доступен:', sdk.isDeltaChunkingEnabled);

Синхронизация проекта

// Основной метод синхронизации (только если deltaChunking.enabled = true)
const result = await sdk.syncProject('project-id', '/path/to/project', {
  forceFull: false,           // Инкрементальная синхронизация 
  batchSize: 50,             // Чанков за раз
  ignorePatterns: [          // Игнорировать файлы/папки
    'node_modules/**', 
    '*.log',
    '.git/**'
  ],
  includeExtensions: ['.ts', '.js', '.py'],  // Только эти расширения
  maxFileSizeKB: 1024,       // Максимальный размер файла 1MB
  onProgress: (current, total) => {          // Callback прогресса
    console.log(`Прогресс: ${current}/${total} (${Math.round(current/total*100)}%)`);
  }
});

console.log(`✅ Синхронизация завершена: ${result.processedChunks} чанков`);

Синхронизация файлов (для браузера)

// Для web/браузерных приложений без доступа к файловой системе
const files = [
  {
    path: 'src/index.ts',
    content: 'console.log("Hello World");',
    size: 28
  },
  {
    path: 'src/utils.ts', 
    content: 'export const sum = (a, b) => a + b;',
    size: 37
  }
];

const result = await sdk.syncFiles('project-id', files, {
  batchSize: 20,
  onProgress: (current, total) => {
    console.log(`📤 Загружено: ${current}/${total}`);
  }
});

Автоматическое наблюдение за изменениями

// Запуск file watcher (в разработке)
const watcher = await sdk.startAutoSync('project-id', '/path/to/watch');

// Проверка активности
console.log(`👀 Auto-sync активен: ${watcher.isActive}`);

// Остановка наблюдения
await watcher.stop();
console.log('🔴 File watcher остановлен');

Статус и управление

// Проверка статуса синхронизации
const status = await sdk.getSyncStatus('project-id');
console.log(`📊 Статус: ${status.status}, прогресс: ${status.progress || 0}%`);

// Отмена активной синхронизации
const cancelled = await sdk.cancelSync('project-id');
if (cancelled) {
  console.log('❌ Синхронизация отменена');
}

Полный пример workflow

import { CodeSolverSDK } from 'solver-sdk';

async function syncProject() {
  // 1. Создание SDK
  const sdk = await CodeSolverSDK.create({
    baseURL: 'http://localhost:3000',
    deltaChunking: {
      enabled: true,
      encryption: { enabled: true, key: 'my-secret-key-32-characters-long!' }
    },
    debug: 'info'
  });

  try {
    // 2. Синхронизация с прогрессом
    const result = await sdk.syncProject('my-project-id', './my-project', {
      onProgress: (current, total) => {
        const percent = Math.round((current / total) * 100);
        console.log(`🔄 Синхронизация: ${percent}% (${current}/${total} чанков)`);
      },
      ignorePatterns: ['node_modules/**', 'dist/**', '*.log']
    });

    // 3. Результат
    console.log('🎉 Синхронизация завершена:', {
      success: result.success,
      processedChunks: result.processedChunks,
      duration: result.duration + 'ms',
      newFiles: result.details?.newFiles,
      changedFiles: result.details?.changedFiles
    });

    // 4. Проверка финального статуса
    const status = await sdk.getSyncStatus('my-project-id');
    console.log(`✅ Финальный статус: ${status.status}`);

  } catch (error) {
    console.error('❌ Ошибка синхронизации:', error.message);
    
    // Отменяем если что-то пошло не так
    await sdk.cancelSync('my-project-id');
  }
}

// Запуск
syncProject();

💡 Типы данных

Project

interface Project {
  id: string;
  name: string; 
  path: string;
  ready: boolean;              // Готов к работе
  fileCount: number;           // Количество файлов
  indexStatus: 'pending' | 'indexing' | 'indexed' | 'failed' | 'cancelled';
  indexingProgress?: number;   // 0-100%
  languageStats?: {[lang: string]: number};  // Статистика языков
  indexingErrors?: any[];      // Ошибки индексации
  // ... и еще 10+ полей
}

Delta-Chunking Types

// Расширенная конфигурация CodeSolverSDK с delta-chunking
interface CodeSolverSDKOptions {
  baseURL: string;
  apiKey?: string;
  deltaChunking?: {                        // ✨ Опциональная секция
    enabled: boolean;                      // Включение delta-chunking функциональности
    
    encryption?: {
      enabled: boolean;                    // Включить шифрование чанков
      key: string;                         // 32-символьный ключ для AES-256
    };
    
    chunking?: {
      maxTokens?: number;                  // Максимальный размер чанка (по умолчанию: 400)
      minTokens?: number;                  // Минимальный размер чанка (по умолчанию: 100)
      useTreeSitter?: boolean;             // Использовать tree-sitter парсер (в разработке)
      preserveContext?: boolean;           // Сохранять контекст между чанками
    };
    
    fileWatching?: {
      enabled: boolean;                    // Включить автоматическое наблюдение за изменениями
      pollInterval?: number;               // Интервал проверки изменений в мс (по умолчанию: 1000)
      ignorePatterns?: string[];           // Паттерны для игнорирования файлов
    };
  };
  timeout?: number;                        // Таймаут запросов (мс)
  debug?: 'silent' | 'error' | 'warn' | 'info' | 'debug';
}

// Опции синхронизации
interface SyncOptions {
  forceFull?: boolean;         // Принудительная полная синхронизация
  batchSize?: number;          // Размер батча для загрузки чанков (по умолчанию: 50)
  ignorePatterns?: string[];   // Паттерны для игнорирования файлов
  includeExtensions?: string[]; // Включать только определенные расширения
  maxFileSizeKB?: number;      // Максимальный размер файла для обработки (KB)
  onProgress?: (current: number, total: number) => void; // Callback прогресса
  timeoutMs?: number;          // Таймаут для операций
}

// Результат синхронизации
interface SyncResult {
  success: boolean;
  projectId: string;
  sessionId?: string;
  processedChunks: number;
  totalChunks: number;
  duration: number;            // Время выполнения в мс
  error?: string;
  details?: {
    newFiles: number;
    changedFiles: number;
    deletedFiles: number;
    failedChunks: number;
  };
}

// Статус синхронизации
interface SyncStatus {
  status: 'inactive' | 'initializing' | 'active' | 'finalizing' | 'completed' | 'failed';
  progress?: number;           // 0-100%
  chunksReceived?: number;
  chunksProcessed?: number;
  sessionId?: string;
  errors?: string[];
  startTime?: Date;
  estimatedCompletion?: Date;
}

// File watcher для автоматической синхронизации
interface FileWatcher {
  projectId: string;
  watchPath: string;
  isActive: boolean;
  start(): Promise<void>;
  stop(): Promise<void>;
}

// Контент файла
interface FileContent {
  path: string;                // Относительный путь файла
  content: string;             // Содержимое файла
  size: number;                // Размер в байтах
}

📚 Пример использования

import { CodeSolverSDK } from 'solver-sdk';

const sdk = await CodeSolverSDK.create({
  baseURL: 'http://localhost:3000'
});

// Работа с проектом
const project = await sdk.projects.createProject('My App', '/path/to/app');
await sdk.projects.startIndexing(project.id);

// Ожидание индексации
let status;
do {
  status = await sdk.projects.getIndexingStatus(project.id);
  console.log(`${status.status}: ${status.progress}%`);
  await new Promise(r => setTimeout(r, 2000));
} while (status.status === 'indexing');

// Поиск и чат
const results = await sdk.search.searchCode(project.id, { 
  query: 'function main', 
  limit: 5 
});

const response = await sdk.chat.chat([
  { role: 'user', content: 'Explain this code' }
], { projectId: project.id });

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

// Проверка подключения
const response = await fetch('http://localhost:3000/health');
console.log('Backend доступен:', response.ok);

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

// Отладка с подробными логами
const sdk = await CodeSolverSDK.create({
  baseURL: 'http://localhost:3000', 
  debug: 'debug'
});

📄 Лицензия

MIT License


Документация актуальна для v5.0.0
История изменений: CHANGELOG.md