Package Exports
- solver-sdk
Readme
Code Solver SDK
AI-powered code analysis SDK with WorkCoins billing system. 100% typed, production ready.
Install
npm install solver-sdk@9.1.0
# или
npm install solver-sdk@latestQuick Start
import { CodeSolverSDK } from 'solver-sdk';
const sdk = await CodeSolverSDK.create({
baseURL: 'https://api.example.com',
getAuthToken: async () => getToken()
});
// Projects
const projects = await sdk.projects.getAllProjects();
await sdk.projects.createProject('MyProject');
// Chat with Thinking
const response = await sdk.chat.chat([
{ role: 'user', content: 'explain this code' }
], { thinking: { type: 'enabled', budget_tokens: 10000 } });
// Search
const results = await sdk.search.searchCode({
projectId,
query: 'authentication function'
});
// User & Updates
const profile = await sdk.user.getProfile();
const update = await sdk.updates.checkForUpdates({...});API Overview
| Feature | Methods | Status |
|---|---|---|
| Projects | 19 | ✅ Full CRUD + state |
| Delta Chunking | 7 | ✅ Encrypted sync |
| Chat | 13 | ✅ Streaming + Extended Thinking |
| Search | 4 | ✅ Vector-based |
| Tools | 5 | ✅ AI tool schemas |
| Models | 5 | ✅ Provider info |
| Updates | 5 | ✅ Auto-check + changelog |
| User | 3 | ✅ Profile + Limits |
| Credits | 3 | ✅ Balance + Status + Estimates |
| Auth | 2 | ✅ Token revocation + logout |
Total: 66 methods | Full API Reference
Quick Reference
Projects (19) - управление проектами и индексация
getAllProjects() | getProject(id) | createProject(name) | deleteProject(id)
findOrCreateProject(name) | getReadyProjects() | getProjectState(id)
getProjectStatus(id) | getIndexingStatus(id) | cancelIndexing(id)
clearIndexingError(id) | getRecoveryStatus(id) | resumeSync(id)
cancelRecovery(id) | initializeDeltaSync(id) | resetIndexing(id)
restartIndexing(id) | getFilePathMapping(id)Chat (13) - AI диалоги и streaming
chat(messages, options?) | chatCompletion(messages, options?)
chatWithRegionFailover(messages, options?) | streamChat(messages, options?)
streamPrompt(prompt, options?) | sendContinuation(requestId, messages)
resumeChat(requestId, messages, partialText, options?)
sendPromptWithRegionFailover(prompt, options?) | checkAvailability()
cancelRequest(requestId) | getStreamsStats() | cleanupStaleStreams()
cancelUserStreams(reason?)Delta Chunking (7) - синхронизация файлов
initSync(projectId, request) | uploadChunkBatch(projectId, chunks)
uploadChunksWithRetry(projectId, chunks, options?)
finalizeSync(projectId) | getSyncStatus(projectId)
cancelSync(projectId) | cleanupFiles(projectId, activeFiles)Search (4) - поиск кода
searchCode(projectId, params) | searchFunctions(projectId, params)
semanticSearch(projectId, params) | getFunctionStats(projectId)Tools (5) - AI инструменты
getSchemas() | findToolByName(name) | getToolsStats()
validateToolSchema(tool) | createToolSchema(name, desc, props, required?)Models (5) - AI модели
getAllModels() | getModels() | getAvailableModels()
getProviderModels(providerId) | getModelInfo(modelId)Updates (5) - обновления SDK
checkForUpdates(options) | getChangelog(version, locale)
sendStats(event) | getLatestVersion(channel?) | checkAvailability()Credits (3) - WorkCoins баланс
getBalance() | getStatus() | estimate(tokens, model?, operationType?)User (3) - профиль и лимиты
getProfile() | getLimitStatus() | checkAvailability()Auth (2) - аутентификация
revokeToken(token) | logout()Auth
// Local dev
const sdk = await CodeSolverSDK.create({
baseURL: 'http://localhost:3000',
getAuthToken: async () => 'your-token'
});
// Production with token refresh + error handling
import { AuthenticationError } from 'solver-sdk';
const sdk = await CodeSolverSDK.create({
baseURL: 'https://api.example.com',
getAuthToken: async () => {
if (isTokenExpired()) {
await refreshToken();
}
return getToken();
}
});
// All methods throw AuthenticationError on 401
try {
await sdk.user.getProfile();
} catch (error) {
if (error instanceof AuthenticationError) {
await refreshToken();
// retry
}
}WebSocket (Real-time)
// Connect
await sdk.connectWebSocket();
// Subscribe to project
sdk.projectSync.subscribeToProject(projectId);
// Listen for updates
sdk.projectSync.on('sync-progress', (data) => {
console.log(`Progress: ${data.processedFiles}/${data.totalFiles}`);
});
sdk.projectSync.on('sync-completed', (data) => {
console.log(`Done: ${data.statistics.totalFiles} files`);
});Error Handling
All SDK methods throw typed exceptions. All errors have: statusCode, errorType, message, requestId, timestamp.
Available Error Types
import {
AuthenticationError, // 401 - token expired/invalid
ForbiddenError, // 403 - access denied
ValidationError, // 422 - invalid data
NotFoundError, // 404 - resource not found
ConflictError, // 409 - data conflict
BadRequestError, // 400 - bad request
InternalServerError, // 500 - server error
ServiceUnavailableError,// 503 - service down
GatewayTimeoutError, // 504 - timeout
LimitExceededError, // 403 - WorkCoins limit exceeded
RateLimitError, // 429 - too many requests
NetworkError, // 0 - network failure
TimeoutError, // 408 - request timeout
DatabaseError // 400 - database error
} from 'solver-sdk';Common Patterns
import { AuthenticationError, LimitExceededError, RateLimitError } from 'solver-sdk';
try {
await sdk.chat.streamChat([{ role: 'user', content: 'Hello' }]);
} catch (error) {
// Auth errors - refresh token and retry
if (error instanceof AuthenticationError) {
await refreshToken();
return retry();
}
// WorkCoins limit - show upgrade prompt
if (error instanceof LimitExceededError) {
console.log(`WorkCoins exhausted: ${error.message}`);
if (error.action) {
console.log(`Recommendation: ${error.action.suggestion}`);
console.log(`Action URL: ${error.action.url}`);
}
}
// Rate limit - wait and retry
if (error instanceof RateLimitError) {
await new Promise(r => setTimeout(r, error.getRetryDelayMs()));
return retry();
}
}Proactive Limit Checking
// Check WorkCoins before expensive operations
const status = await sdk.credits.getStatus();
if (!status.canMakeRequest) {
console.error('No WorkCoins available');
return;
}
if (status.status === 'warning') {
console.warn(`Low on WorkCoins: ${status.message}`);
}
// Make request
await sdk.chat.streamChat([...]);WorkCoins (Credits) API
// Get balance
const balance = await sdk.credits.getBalance();
console.log(`${balance.creditsRemaining} / ${balance.creditsLimit} WorkCoins`);
// Get status with recommendations
const status = await sdk.credits.getStatus();
console.log(`Status: ${status.status}`); // 'ok' | 'warning' | 'critical' | 'depleted'
// Estimate cost
const estimate = await sdk.credits.estimate(50000, 'haiku', 'code_generation');
console.log(`Estimated: ${estimate.estimatedCredits} WorkCoins`);Streaming Tool Use (Создание/Редактирование файлов)
SDK передаёт только официальные события Anthropic API через callback onEvent. Когда AI создаёт или редактирует файлы, параметры инструментов стримятся посимвольно через официальное событие input_json_delta.
✅ Рекомендация Anthropic: Используйте стандартное событие
content_block_deltaс типомinput_json_deltaдля real-time визуализации прогресса. Это обеспечивает совместимость с обновлениями API и гарантирует стабильность работы.
Real-time отображение прогресса через официальный API
// Накапливаем partial JSON для каждого инструмента
const toolInputs = new Map<number, string>();
for await (const chunk of sdk.chat.streamChat(messages, {
projectId: 'project-id',
tools: ['read_file', 'search_replace'],
onEvent: (type, data) => {
// 🎯 Стриминг параметров инструмента
if (type === 'content_block_delta' && data.delta?.type === 'input_json_delta') {
const index = data.index;
const partialJson = data.delta.partial_json;
// Накапливаем JSON по индексу блока
const accumulated = (toolInputs.get(index) || '') + partialJson;
toolInputs.set(index, accumulated);
// Пытаемся извлечь читаемые поля из неполного JSON (безопасно)
try {
const filePathMatch = accumulated.match(/"file_path"\s*:\s*"([^"]*)"/);
const operationMatch = accumulated.match(/"operation"\s*:\s*"([^"]*)"/);
if (filePathMatch) {
// 💡 Показываем пользователю: "Редактирование: src/app.ts"
console.log(`📝 ${operationMatch?.[1] || 'Обработка'}: ${filePathMatch[1]}`);
}
// Обновляем UI с прогрессом
updateProgress({
file: filePathMatch?.[1],
operation: operationMatch?.[1],
bytesReceived: accumulated.length
});
} catch {
// JSON ещё неполный - ждём следующий чанк
}
}
// ✅ Инструмент готов к выполнению (полный JSON получен)
if (type === 'content_block_stop') {
const index = data.index;
const fullJson = toolInputs.get(index);
if (fullJson) {
try {
const toolInput = JSON.parse(fullJson);
console.log('🔧 Инструмент готов:', toolInput);
toolInputs.delete(index); // Очищаем
} catch (e) {
console.error('❌ Некорректный JSON инструмента');
}
}
}
}
})) {
// Обрабатываем остальные события...
}Официальные события Anthropic API
| Событие | Данные | Описание |
|---|---|---|
message_start |
{ message: {...} } |
Начало ответа AI |
content_block_start |
{ index, content_block } |
Начало блока (text/thinking/tool_use) |
content_block_delta |
{ index, delta } |
Стриминг содержимого |
content_block_stop |
{ index } |
Завершение блока |
message_delta |
{ delta } |
Метаданные ответа |
message_stop |
{} |
Конец ответа |
Типы delta для content_block_delta
// Текст ответа AI
delta: { type: 'text_delta', text: 'Создаю функцию...' }
// Мышление AI (Extended Thinking)
delta: { type: 'thinking_delta', thinking: 'Анализирую требования...' }
// 🎯 Параметры инструмента (посимвольно!)
delta: { type: 'input_json_delta', partial_json: '{"file_path": "src/app' }Пример UI компонента
function ToolProgressIndicator() {
const [currentTool, setCurrentTool] = useState<{
file?: string;
operation?: string;
progress: number;
} | null>(null);
// В onEvent callback
if (type === 'content_block_delta' && data.delta?.type === 'input_json_delta') {
// Извлекаем инфо из partial JSON
const fileMatch = accumulated.match(/"file_path"\s*:\s*"([^"]*)"/);
const opMatch = accumulated.match(/"operation"\s*:\s*"([^"]*)"/);
setCurrentTool({
file: fileMatch?.[1],
operation: opMatch?.[1] || 'processing',
progress: accumulated.length
});
}
return currentTool && (
<div className="tool-progress">
<span className="operation">{currentTool.operation}</span>
<span className="file">{currentTool.file}</span>
<div className="progress-bar" style={{ width: `${currentTool.progress / 10}%` }} />
</div>
);
}Fine-grained Tool Streaming
SDK автоматически использует fine-grained tool streaming для всех запросов с tools. Это значительно снижает latency при генерации больших tool inputs:
- Без fine-grained: задержки 15+ секунд, мелкие чанки
- С fine-grained: задержки ~3 секунды, крупные чанки
Обработка Invalid JSON
При использовании fine-grained streaming возможны incomplete JSON responses (особенно при достижении max_tokens). SDK автоматически:
- Обнаруживает invalid JSON в tool responses
- Оборачивает в валидный объект
{"INVALID_JSON": "..."} - Отправляет retry запрос с увеличенным max_tokens
Метрики доступны в DEBUG режиме логирования.
TODO Tracking
SDK автоматически передает события прогресса выполнения задач от Claude. Когда AI работает над сложной задачей (рефакторинг, добавление фичи), Claude создает TODO список для отслеживания прогресса.
Пример использования
import { ChatApi } from '@vscursor/solver-sdk';
const api = new ChatApi(baseURL);
for await (const chunk of api.streamChat(messages, { thinking: true })) {
if (chunk.type === 'todo_update') {
const event = chunk as any;
// Отображаем прогресс-бар
console.log(`📋 Прогресс: ${event.progress?.completed}/${event.progress?.total}`);
if (event.progress?.current) {
console.log(`🔧 Текущая задача: ${event.progress.current}`);
}
// Отображаем все задачи
event.todos.forEach((todo: any) => {
const icon = todo.status === 'completed' ? '✅' :
todo.status === 'in_progress' ? '🔧' : '⏳';
const text = todo.status === 'in_progress' && todo.activeForm
? `${todo.content} (${todo.activeForm})`
: todo.content;
console.log(`${icon} ${text}`);
});
}
}Формат TODO события
interface TodoUpdateEvent {
type: 'todo_update';
operation: 'write' | 'read';
todos: Array<{
id: string; // Уникальный ID (например: "todo-1234567890-abc")
content: string; // Описание задачи
status: 'pending' | 'in_progress' | 'completed' | 'cancelled';
activeForm?: string; // Дополнительная информация для in_progress
}>;
tool_use_id: string; // ID tool_use от Claude
progress: {
completed: number; // Количество завершенных задач
total: number; // Общее количество задач
current: string; // Описание текущей задачи
};
}Пример:
{
type: 'todo_update',
operation: 'write',
todos: [
{
id: 'todo-1763533466409-uxptasdq3',
content: 'Analyze codebase',
status: 'completed',
},
{
id: 'todo-1763533466409-r67wnbk83',
content: 'Implement feature',
status: 'in_progress',
activeForm: 'Creating authentication logic...'
},
{
id: 'todo-1763533466409-2se2juf10',
content: 'Add tests',
status: 'pending'
}
],
tool_use_id: 'toolu_01ABC123',
progress: {
completed: 1,
total: 3,
current: 'Implement feature'
}
}⚠️ Важно: Backend автоматически обрабатывает manage_todo_list
Backend не требует явной отправки tool_result для manage_todo_list от клиента.
Событие todo_update отправляется для UI widget, но tool_result создается автоматически на стороне backend.
Клиент должен только обрабатывать todo_update события для обновления UI:
if (chunk.type === 'todo_update') {
// ✅ Обновить TODO widget в UI
updateTodoWidget(chunk.todos, chunk.progress);
// ✅ Показать прогресс-бар
updateProgressBar(chunk.progress.completed, chunk.progress.total);
// ✅ Показать текущую задачу
if (chunk.progress.current) {
showCurrentTask(chunk.progress.current);
}
// ❌ НЕ нужно отправлять tool_result обратно!
// Backend создает tool_result автоматически
}Почему так работает:
manage_todo_list - это информационный CLIENT tool, который:
- Не блокирует выполнение задач
- Используется только для UI tracking
- Автоматически помечается как успешный на backend
- Не требует реального выполнения на клиенте
Статусы TODO
Backend поддерживает оба формата статусов для совместимости:
| Backend Status | Cursor Format | Описание |
|---|---|---|
pending |
not-started |
Задача еще не начата |
in_progress |
in-progress |
Задача выполняется прямо сейчас |
completed |
completed |
Задача завершена |
cancelled |
cancelled |
Задача отменена |
Примечание: Backend автоматически нормализует not-started → pending и in-progress → in_progress для внутренней обработки.
Интеграция в UI
React компонент с использованием progress:
interface TodoProgressViewProps {
todos: Array<{
id: string;
content: string;
status: string;
activeForm?: string;
}>;
progress: {
completed: number;
total: number;
current: string;
};
}
function TodoProgressView({ todos, progress }: TodoProgressViewProps) {
const progressPercent = Math.round((progress.completed / progress.total) * 100);
return (
<div className="todo-progress">
{/* Прогресс-бар */}
<div className="progress-bar">
<div
className="progress-fill"
style={{ width: `${progressPercent}%` }}
aria-valuenow={progressPercent}
aria-valuemin={0}
aria-valuemax={100}
/>
</div>
{/* Текстовый прогресс */}
<div className="progress-text">
{progress.completed}/{progress.total} tasks completed
</div>
{/* Текущая задача (если есть) */}
{progress.current && (
<div className="current-task">
🔧 <strong>Working on:</strong> {progress.current}
</div>
)}
{/* Список задач */}
<ul className="todo-list">
{todos.map(todo => {
const icon = getIcon(todo.status);
const text = todo.status === 'in_progress' && todo.activeForm
? `${todo.content} (${todo.activeForm})`
: todo.content;
return (
<li key={todo.id} className={`todo-item ${todo.status}`}>
<span className="todo-icon">{icon}</span>
<span className="todo-text">{text}</span>
</li>
);
})}
</ul>
</div>
);
}
function getIcon(status: string): string {
switch (status) {
case 'completed': return '✅';
case 'in_progress': return '🔧';
case 'cancelled': return '❌';
case 'pending':
default: return '⏳';
}
}Types
import {
ChatMessage,
ChatOptions,
Project,
ProjectState,
SearchResult,
UserProfile,
LimitStatus,
LimitExceededError,
RateLimitError
} from 'solver-sdk';Debug
const sdk = await CodeSolverSDK.create({
debug: 'verbose', // silent | error | warn | info | debug | verbose
webSocket: { debug: true }
});Delta Chunking (Indexing)
// ✅ Main indexing method
await sdk.deltaManager.syncEncryptedChunks(projectId, chunks, rootHash, {
batchSize: 50,
onProgress: (current, total) => console.log(`${current}/${total}`)
});
// Check sync status
const state = await sdk.projects.getProjectState(projectId, clientRootHash);
if (state.syncRequired) {
// Needs sync
}
// Cancel ongoing sync
await sdk.deltaManager.cancelSync(projectId);File Invalidation
// Инвалидировать файл при изменении
const result = await sdk.deltaManager.invalidateFile(projectId, {
filePath: 'src/app.tsx',
reason: 'file_changed'
});
console.log(`Invalidated ${result.chunksInvalidated} chunks`);
console.log(`Cache invalidated: ${result.cacheInvalidated}`);
// Отправить новые chunks после инвалидации
await sdk.deltaManager.syncEncryptedChunks(projectId, newChunks, rootHash);Session Recovery
// Always check on project open
const recovery = await sdk.projects.getRecoveryStatus(projectId);
if (recovery.needsRecovery) {
const { processedFiles, totalFiles, percentage } = recovery.progress;
// Show dialog: "Continue (67%) — 480/642 files" or "Start Fresh"
await sdk.projects.resumeSync(projectId); // Continue
// OR
await sdk.projects.cancelRecovery(projectId); // Start over
}Key Types
ProjectState
interface ProjectState {
projectId: string;
merkleRootHash: string | null;
totalFiles: number; // For UI display
indexingStatus: 'pending' | 'in-progress' | 'complete' | 'failed';
syncRequired?: boolean; // Compare with client hash
}SyncProgressEvent
interface SyncProgressEvent {
projectId: string;
progress: number; // 0-100
processedFiles: number; // 450
totalFiles: number; // 722
stage: 'receiving_chunks' | 'processing_chunks' | 'creating_embeddings' | 'finalizing';
}RecoveryInfo
interface RecoveryInfo {
needsRecovery: boolean;
progress: {
processedFiles: number;
totalFiles: number;
percentage: number; // 0-100
};
canResume: boolean;
}CreditsStatus
interface CreditsStatus {
status: 'ok' | 'warning' | 'critical' | 'depleted';
balance: CreditsBalance;
canMakeRequest: boolean;
message: string;
action?: CreditsAction;
}CreditsBalance
interface CreditsBalance {
creditsLimit: number; // Monthly credits limit
creditsUsed: number; // Total credits used
creditsRemaining: number; // Credits remaining
percentUsed: number; // Usage percentage (0-100)
bonusCredits?: number; // Bonus credits available
bonusCreditsUsed?: number; // Bonus credits used
bonusCreditsRemaining?: number; // Bonus credits remaining
autoPurchaseEnabled: boolean; // Is auto-purchase enabled
purchasedCredits?: number; // Credits purchased this month via auto-purchase
resetDate?: Date; // Monthly reset date
}CreditsAction
interface CreditsAction {
type: 'info' | 'upgrade' | 'enable_auto_purchase' | 'buy_credits';
suggestion: string; // User-facing recommendation
url: string; // Action URL (e.g. '/dashboard#billing')
options?: string[]; // Available options ['enable_auto_purchase', 'buy_credits', 'upgrade']
}Troubleshooting
"0 files" after indexing
const state = await sdk.projects.getProjectState(projectId);
console.log(state.totalFiles); // Should be > 0
// If 0: update backend to latest versionNo WebSocket updates
// 1. Check connection
console.log(sdk.isWebSocketConnected); // should be true
// 2. Verify subscription
sdk.projectSync.subscribeToProject(projectId);
// 3. Ensure OAuth token (production)
const sdk = await CodeSolverSDK.create({
getAuthToken: () => authManager.getAccessToken()
});
// 4. Fallback to HTTP polling
const status = await sdk.projects.getIndexingStatus(projectId);Interrupted sync
const recovery = await sdk.projects.getRecoveryStatus(projectId);
if (recovery.needsRecovery) {
// Option 1: Resume
await sdk.projects.resumeSync(projectId);
// Option 2: Cancel and restart
await sdk.projects.cancelRecovery(projectId);
}🔍 Web Search Tool
SDK поддерживает Anthropic Web Search Tool - server-side инструмент для поиска в интернете.
Конфигурация
Web search настраивается через environment variables на сервере:
# Включить web search
WEB_SEARCH_ENABLED=true
# Максимальное количество searches за один запрос
WEB_SEARCH_MAX_USES=5
# Whitelist доменов (optional)
WEB_SEARCH_ALLOWED_DOMAINS=wikipedia.org,stackoverflow.com,github.com
# Blacklist доменов (optional)
WEB_SEARCH_BLOCKED_DOMAINS=spam.com,malicious-site.orgContent Block Types для Server-Side Tools
type ServerSideContentBlock =
| 'server_tool_use' // Server-side tool использование
| 'web_search_tool_result' // Результаты поиска
| 'web_fetch_tool_result' // Результаты web fetch
| 'code_execution_tool_result' // Результаты code execution
| 'text_editor_code_execution_tool_result'; // Результаты text editorStop Reason: pause_turn
Когда модель использует server-side tool, вы получите stop_reason: 'pause_turn':
// В streaming событии message_delta
{
type: 'message_delta',
delta: {
stop_reason: 'pause_turn' // Server-side tool execution
}
}
// После выполнения придут результаты
{
type: 'content_block_start',
content_block: {
type: 'web_search_tool_result',
content: [
{
type: 'web_search_result',
url: 'https://example.com',
title: 'Example Page',
encrypted_content: '...',
page_age: '2024-01-15'
}
]
}
}Usage Tracking
Web search запросы отслеживаются в usage.server_tool_use:
interface Usage {
input_tokens: number;
output_tokens: number;
cache_read_input_tokens?: number;
cache_creation_input_tokens?: number;
server_tool_use?: {
web_search_requests?: number; // Количество searches
code_execution_requests?: number; // Количество code executions
};
}Pricing
Official Anthropic Pricing:
- $10 за 1000 web searches
- $0.01 за один search
Web search конвертируется в WorkCoins credits автоматически на основе текущего exchange rate.
API Reference
Projects (sdk.projects)
getAllProjects(): Promise<Project[]>
getProjects(): Promise<Project[]>
getProject(projectId: string): Promise<Project>
createProject(name: string, data?: any, options?: ProjectOptions): Promise<Project>
findOrCreateProject(name: string): Promise<Project>
deleteProject(projectId: string): Promise<void>
getReadyProjects(): Promise<Project[]>
getProjectState(projectId: string, clientRootHash?: string): Promise<ProjectState>
getProjectStatus(projectId: string): Promise<any>
getIndexingStatus(projectId: string): Promise<any>
cancelIndexing(projectId: string): Promise<boolean>
clearIndexingError(projectId: string): Promise<boolean>
getRecoveryStatus(projectId: string): Promise<RecoveryInfo>
resumeSync(projectId: string, options?: any): Promise<any>
cancelRecovery(projectId: string): Promise<void>
initializeDeltaSync(projectId: string, params: any): Promise<any>
resetIndexing(projectId: string): Promise<any>
restartIndexing(projectId: string): Promise<any>
getFilePathMapping(projectId: string): Promise<any>Delta Manager (sdk.deltaManager)
initSync(projectId: string, request: SyncInitRequest): Promise<any>
uploadChunkBatch(projectId: string, chunks: any[]): Promise<any>
uploadChunksWithRetry(projectId: string, chunks: any[], options?: any): Promise<any>
finalizeSync(projectId: string): Promise<SyncResult>
getSyncStatus(projectId: string): Promise<SyncStatus>
cancelSync(projectId: string): Promise<{ success: boolean; message?: string }>
cleanupFiles(projectId: string, activeFiles: string[]): Promise<any>Chat (sdk.chat)
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
chatCompletion(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
chatWithRegionFailover(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
streamChat(messages: ChatMessage[], options?: ChatStreamOptions): AsyncGenerator<ChatStreamChunk>
streamPrompt(prompt: string, options?: ChatStreamOptions): AsyncGenerator<ChatStreamChunk>
sendContinuation(requestId: string, messages: ChatMessage[]): AsyncGenerator<ChatStreamChunk>
resumeChat(requestId: string, messages: ChatMessage[], partialText: string, options?: ChatStreamOptions): AsyncGenerator<ChatStreamChunk>
sendPromptWithRegionFailover(prompt: string, options?: ChatOptions): Promise<string>
checkAvailability(): Promise<boolean>
cancelRequest(requestId: string): Promise<void>
getStreamsStats(): Promise<any>
cleanupStaleStreams(timeoutMs?: number): Promise<any>
cancelUserStreams(reason?: string): Promise<number>Search (sdk.search)
searchCode(projectIdOrParams: string | SearchCodeParams, params?: SearchCodeParams): Promise<SearchResult[]>
searchFunctions(projectIdOrParams: string | SearchFunctionsParams, params?: SearchFunctionsParams): Promise<FunctionSearchResult>
semanticSearch(projectId: string, params: SearchCodeParams): Promise<SearchResult[]>
getFunctionStats(projectId: string): Promise<{ stats: { totalFunctions: number } }>Tools (sdk.tools)
getSchemas(): Promise<ToolsResponse>
findToolByName(name: string): Promise<ToolSchema | null>
getToolsStats(): Promise<{ total: number; categories: Record<string, number>; mostUsed?: string[] }>
validateToolSchema(tool: ToolSchema): boolean
createToolSchema(name: string, description: string, properties: any, required?: string[]): ToolSchemaUser (sdk.user)
getProfile(): Promise<UserProfile>
getLimitStatus(): Promise<LimitStatus>
checkAvailability(): Promise<boolean>Credits (sdk.credits)
getBalance(): Promise<CreditsBalance>
getStatus(): Promise<CreditsStatus>
estimate(tokens: number, model?: ModelType, operationType?: OperationType): Promise<CreditsEstimate>Auth (sdk.auth)
revokeToken(token: string): Promise<{ ok: boolean }>
logout(): Promise<{ ok: boolean }>Models (sdk.models)
getAllModels(): Promise<any[]>
getModels(): Promise<any[]>
getAvailableModels(): Promise<any[]>
getProviderModels(providerId: string): Promise<ProviderModels>
getModelInfo(modelId: string): Promise<any>Updates (sdk.updates)
checkForUpdates(options: UpdateCheckOptions): Promise<UpdateResponse>
getChangelog(version: string, locale: string): Promise<string>
sendStats(event: UpdateStatsEvent): Promise<void>
getLatestVersion(channel?: string): Promise<LatestVersionInfo>
checkAvailability(): Promise<boolean>WebSocket (sdk.projectSync)
connectWebSocket(): Promise<void>
disconnectWebSocket(): void
isWebSocketConnected: boolean
projectSync.subscribeToProject(projectId: string): void
projectSync.unsubscribeFromProject(projectId: string): void
projectSync.on('sync-status-update', callback): void
projectSync.on('sync-progress', callback): void
projectSync.on('sync-completed', callback): void
projectSync.on('sync-error', callback): void
projectSync.off(event: string, callback): voidUtility
checkHealth(): Promise<boolean>
version: string
baseURL: stringDocumentation
All methods have full JSDoc comments with examples. Check your IDE autocomplete for detailed reference.
For full API documentation: See API Reference section above.