solver-sdk
Version:
SDK для интеграции с Code Solver Backend API (совместимо с браузером и Node.js), с поддержкой функциональности мышления (Thinking Mode)
690 lines • 32.8 kB
TypeScript
import { WebSocketClientOptions } from './websocket-client.js';
/**
* Пространства имен для WebSocket
*/
export declare enum WebSocketNamespace {
/** Основное пространство имен */
DEFAULT = "/",
/** Пространство для рассуждений */
REASONING = "/reasoning",
/** Пространство для индексации */
INDEXING = "/indexing",
/** Пространство для зависимостей */
DEPENDENCIES = "/dependencies"
}
/**
* Опции для Code Solver WebSocket клиента
*/
export interface CodeSolverWebSocketOptions extends WebSocketClientOptions {
/** API ключ для авторизации */
apiKey?: string;
/**
* Проверять SSL-сертификаты при подключении
* Установите false для работы с самоподписанными сертификатами
*/
rejectUnauthorized?: boolean;
/**
* Автоматически включать механизм ping/pong при подключении
* По умолчанию: true
*/
enableAutoPing?: boolean;
/**
* Интервал между ping-сообщениями в миллисекундах
* По умолчанию: 15000 (15 сек)
*/
pingInterval?: number;
/**
* Количество пропущенных pong-ответов до признания соединения потерянным
* По умолчанию: 3
*/
pingTimeoutThreshold?: number;
/**
* Стратегия задержки между попытками переподключения
* 'linear' - линейное увеличение задержки
* 'exponential' - экспоненциальное увеличение задержки (с jitter)
* По умолчанию: 'exponential'
*/
reconnectStrategy?: 'linear' | 'exponential';
/**
* Включение сохранения и восстановления сессии
* По умолчанию: true
*/
enableSessionPersistence?: boolean;
/**
* Базовая задержка для переподключения в миллисекундах
* По умолчанию: 1000
*/
retryDelay?: number;
/**
* Максимальная задержка для переподключения в миллисекундах
* По умолчанию: 30000
*/
maxRetryDelay?: number;
}
/**
* События, связанные с рассуждениями от Anthropic API
*/
export interface ReasoningEvents {
/** Событие начала сообщения */
message_start: {
/** ID сообщения */
id: string;
/** Тип сообщения */
type: string;
/** Роль отправителя */
role: string;
/** Модель */
model?: string;
};
/** Событие начала блока контента */
content_block_start: {
/** ID блока */
id: string;
/** Тип блока */
type: string;
/** Тип контента */
content_type: string;
/** Индекс блока */
index: number;
};
/** Событие дельты блока контента */
content_block_delta: {
/** Индекс блока */
index: number;
/** Содержимое дельты */
delta: {
/** Тип дельты */
type: string;
/** Текстовое содержимое (для дельты text_delta) */
text?: string;
/** Содержимое мышления (для дельты thinking_delta) */
thinking?: string;
/** Содержимое частичного JSON (для дельты input_json_delta) */
input_json?: string;
/** Подпись для верификации (для дельты signature_delta) */
signature?: string;
};
};
/** Событие остановки блока контента */
content_block_stop: {
/** ID блока */
id: string;
/** Тип блока */
type: string;
/** Тип контента */
content_type: string;
/** Индекс блока */
index: number;
};
/** Событие дельты сообщения */
message_delta: {
/** ID сообщения */
id: string;
/** Дельта сообщения */
delta: any;
};
/** Событие окончания сообщения */
message_stop: {
/** ID сообщения */
id: string;
/** Тип сообщения */
type: string;
/** Роль отправителя */
role: string;
/** Модель */
model?: string;
};
/** Событие ошибки */
error: {
/** Код ошибки */
code: string;
/** Сообщение об ошибке */
message: string;
/** Детали ошибки */
details?: {
/** HTTP статус */
status?: number;
/** Тип ошибки */
type?: string;
/** Причина ошибки */
reason?: string;
};
};
}
/**
* События, связанные с индексацией
*/
export interface IndexingEvents {
/** Событие индексации файла */
file_indexed: {
/** ID проекта */
projectId: string;
/** Информация о файле */
file: {
/** Путь к файлу */
path: string;
/** Язык программирования */
language: string;
/** Время индексации */
indexedAt: number;
/** Тип изменения */
changeType: 'semantic' | 'structural' | 'formatting';
};
};
/** Событие завершения индексации проекта */
indexing_complete: {
/** ID проекта */
projectId: string;
/** Время завершения */
timestamp: number;
/** Статистика индексации */
stats: {
/** Общее количество файлов */
totalFiles: number;
/** Количество проиндексированных файлов */
indexed: number;
/** Количество файлов с ошибками */
failed: number;
/** Время индексации в миллисекундах */
time: number;
};
/** Версия индекса */
indexVersion: string;
};
}
/**
* Общие события
*/
export interface CommonEvents {
/** Событие подключения */
connect: {
/** ID клиента */
clientId: string;
};
/** Событие отключения */
disconnect: {
/** Причина отключения */
reason: string;
};
}
/**
* События, связанные с зависимостями файлов
*/
export interface DependenciesEvents {
/** Событие обновления зависимостей */
dependency_update: {
/** ID проекта */
projectId: string;
/** Временная метка */
timestamp: number;
/** Затронутые файлы */
affectedFiles: string[];
};
}
/**
* Типы WebSocket событий
*/
export type WebSocketEvents = ReasoningEvents & IndexingEvents & CommonEvents & DependenciesEvents;
/**
* Обработчики для событий от Anthropic API
*/
export interface AnthropicStreamCallbacks {
/** Обработчик для события начала сообщения */
onMessageStart?: (data: ReasoningEvents['message_start']) => void;
/** Обработчик для события начала блока мышления (через content_block_start с типом thinking) */
onThinkingStart?: (data: ReasoningEvents['content_block_start']) => void;
/** Обработчик для события дельты блока мышления (через content_block_delta с типом thinking_delta) */
onThinkingDelta?: (data: {
index: number;
delta: string;
}) => void;
/** Обработчик для события остановки блока мышления (через content_block_stop с типом thinking) */
onThinkingStop?: (data: ReasoningEvents['content_block_stop']) => void;
/** Обработчик для события начала блока контента */
onContentStart?: (data: ReasoningEvents['content_block_start']) => void;
/** Обработчик для события дельты блока контента */
onContentDelta?: (data: ReasoningEvents['content_block_delta']) => void;
/** Обработчик для события остановки блока контента */
onContentStop?: (data: ReasoningEvents['content_block_stop']) => void;
/** Обработчик для события окончания сообщения */
onMessageStop?: (data: ReasoningEvents['message_stop']) => void;
/** Обработчик для события ошибки */
onError?: (data: ReasoningEvents['error']) => void;
/** Обработчик для всех событий (для отладки) */
onAny?: (eventName: string, data: any) => void;
}
/**
* Интерфейс для статистики ping/pong сообщений
*/
export interface PingPongStats {
/** Намспейс, для которого собрана статистика */
namespace: WebSocketNamespace;
/** Socket ID */
socketId: string | null;
/** Количество отправленных ping-сообщений */
pingSent: number;
/** Количество полученных pong-ответов */
pongReceived: number;
/** Средняя задержка RTT (Round Trip Time) в миллисекундах */
averageRtt: number;
/** Минимальная задержка RTT в миллисекундах */
minRtt: number;
/** Максимальная задержка RTT в миллисекундах */
maxRtt: number;
/** Последняя задержка RTT в миллисекундах */
lastRtt: number;
/** Время последнего полученного pong-ответа */
lastPongTimestamp: number;
/** Статус соединения */
isConnected: boolean;
}
/**
* Интерфейс для диагностики соединения
*/
export interface ConnectionDiagnostics {
/** Пространство имен */
namespace: WebSocketNamespace;
/** Состояние соединения */
isConnected: boolean;
/** ID сокета */
socketId: string | null;
/** Время последней активности */
lastActivity: number;
/** Задержка RTT */
rtt: {
/** Текущая задержка */
current: number;
/** Минимальная задержка */
min: number;
/** Максимальная задержка */
max: number;
/** Средняя задержка */
avg: number;
};
/** Количество отправленных ping-сообщений */
pingSent: number;
/** Количество полученных pong-ответов */
pongReceived: number;
/** Количество пропущенных pong-ответов */
missedPongs: number;
/** Количество таймаутов */
timeoutCount: number;
/** Количество попыток переподключения */
reconnectAttempts: number;
/** Время последнего подключения */
lastConnectTime: number;
/** Информация о восстановлении сессии */
sessionRecovery: {
/** Наличие токена сессии */
hasSessionToken: boolean;
/** Длина токена сессии */
tokenLength: number;
/** Было ли восстановлено из сессии */
wasRecovered: boolean;
};
}
/**
* WebSocket клиент для работы с Code Solver API
*/
export declare class CodeSolverWebSocketClient {
/** Базовый URL API */
private readonly baseURL;
/** Опции клиента */
private readonly options;
/** Пространство имен для Socket.IO */
private readonly namespace;
/** WebSocket клиенты для разных пространств имен */
private clients;
/** Активная сессия рассуждения */
private activeReasoningId;
/** Активная сессия индексации */
private activeProjectId;
/** Обработчики событий мышления */
private thinkingEventHandlers;
/** Таймеры для ping/pong */
private pingIntervals;
/** Статистика ping/pong */
private pingStats;
/** Количество последовательных таймаутов */
private pingTimeouts;
/** Задержка по умолчанию между ping-сообщениями (30 секунд) */
private defaultPingInterval;
/** Порог таймаута (количество пропущенных pong) */
private timeoutThreshold;
/** Хранилище обработчиков ping/pong */
private pingPongEventHandlers;
/** Токены сессий для разных пространств имен */
private sessionTokens;
/** Состояние подключения для разных пространств имен */
private connectionState;
/** Таймер для проверки здоровья соединений */
private healthCheckTimer;
/**
* Создает новый WebSocket клиент для Code Solver API
* @param {string} baseURL Базовый URL API
* @param {CodeSolverWebSocketOptions} [options] Опции клиента
*/
constructor(baseURL: string, options?: CodeSolverWebSocketOptions);
/**
* Логирование сообщений
* @param {string} level Уровень логирования ('info', 'debug', 'error')
* @param {string} message Сообщение для логирования
* @param {any} [data] Дополнительные данные для логирования
*/
private logger;
/**
* Подключается к пространству имен WebSocket
* @param {WebSocketNamespace} namespace Пространство имен
* @param {Record<string, any>} [params] Параметры подключения
* @returns {Promise<WebSocketClient>} WebSocket клиент
*/
private connect;
/**
* Подключается к пространству имен индексации
* @param projectId ID проекта (опционально)
* @returns Promise с результатом подключения
*/
connectToIndexing(projectId?: string): Promise<boolean>;
/**
* Подключается к уведомлениям
* @returns {Promise<boolean>} Результат подключения
*/
connectToNotifications(): Promise<boolean>;
/**
* Подключается к пространству имен dependencies
* @param projectId ID проекта (опционально)
* @returns Promise с результатом подключения
*/
connectToDependencies(projectId?: string): Promise<boolean>;
/**
* Отключается от пространства имен
* @param {WebSocketNamespace} namespace Пространство имен
*/
disconnect(namespace: WebSocketNamespace): void;
/**
* Отключается от всех пространств имен
* Отключает автоматический механизм ping/pong
*/
disconnectAll(): void;
/**
* Добавляет обработчик события для пространства имен
* @param {string} eventType Тип события
* @param {Function} handler Обработчик события
* @param {WebSocketNamespace} [namespace] Пространство имен (если не указано, добавляется ко всем активным)
*/
on(eventType: string, handler: (data: any) => void, namespace?: WebSocketNamespace): void;
/**
* Удаляет обработчик события для пространства имен
* @param {string} eventType Тип события
* @param {Function} [handler] Обработчик события (если не указан, удаляются все обработчики)
* @param {WebSocketNamespace} [namespace] Пространство имен (если не указано, удаляется из всех активных)
*/
off(eventType: string, handler?: (data: any) => void, namespace?: WebSocketNamespace): void;
/**
* Отправляет сообщение в пространство имен
* @param {WebSocketNamespace} namespace Пространство имен
* @param {string} eventType Тип события
* @param {any} [data] Данные сообщения
* @returns {boolean} Успешно ли отправлено сообщение
*/
send(namespace: WebSocketNamespace, eventType: string, data?: any): boolean;
/**
* Отправляет сообщение в активную сессию рассуждения
* @param {string} eventType Тип события
* @param {any} [data] Данные сообщения
* @returns {boolean} Успешно ли отправлено сообщение
*/
sendToReasoning(eventType: string, data?: any): boolean;
/**
* Отправляет сообщение в активную сессию индексации
* @param {string} eventType Тип события
* @param {any} [data] Данные сообщения
* @returns {boolean} Успешно ли отправлено сообщение
*/
sendToIndexing(eventType: string, data?: any): boolean;
/**
* Отправляет сообщение в уведомления
* @param {string} eventType Тип события
* @param {any} [data] Данные сообщения
* @returns {boolean} Успешно ли отправлено сообщение
*/
sendToNotifications(eventType: string, data?: any): boolean;
/**
* Проверяет, подключен ли клиент к указанному пространству имен
* @param {WebSocketNamespace} namespace Пространство имен
* @returns {boolean} Статус подключения
*/
isConnected(namespace: WebSocketNamespace): boolean;
/**
* Проверяет, подключен ли клиент к пространству имен рассуждений
* @returns {boolean} Статус подключения
*/
isConnectedToReasoning(): boolean;
/**
* Проверяет, подключен ли клиент к пространству имен индексации
* @returns {boolean} Статус подключения
*/
isConnectedToIndexing(): boolean;
/**
* Проверяет, подключен ли клиент к пространству имен уведомлений
* @returns {boolean} Статус подключения
*/
isConnectedToNotifications(): boolean;
/**
* Получает ID сокета для указанного пространства имен
* @param {WebSocketNamespace} [namespace=WebSocketNamespace.REASONING] Пространство имен
* @returns {string|null} ID сокета или null, если соединение не установлено
*/
getSocketId(namespace?: WebSocketNamespace): string | null;
/**
* Подписывается на события мышления
* @param {string} reasoningId Идентификатор рассуждения
* @param {Function} handler Обработчик событий мышления
* @returns {void}
*/
subscribeToThinking(reasoningId: string, handler: (data: any) => void): void;
/**
* Отписывается от событий мышления
* @param {string} reasoningId Идентификатор рассуждения
* @returns {void}
*/
unsubscribeFromThinking(reasoningId: string): void;
/**
* Подключается к сессии рассуждения с thinking
* @param {string} [reasoningId="system"] Идентификатор рассуждения
* @param {Function} [thinkingHandler] Обработчик событий мышления
* @returns {Promise<string>} Идентификатор сессии рассуждения
*/
connectToThinkingSession(reasoningId?: string, thinkingHandler?: (data: any) => void): Promise<string>;
/**
* Настраивает отладочное логирование для WebSocket клиента
* @param namespace Пространство имен
*/
private setupDebugLogging;
/**
* Проверяет наличие callback-функции в данных и правильно вызывает ее
* @param eventName Имя события
* @param data Данные события
* @private
*/
private extractAndCallCallback;
/**
* Включить автоматическую отправку ping-сообщений и сбор статистики
* @param {number} interval - Интервал между ping-сообщениями в миллисекундах
* @param {number} timeoutThreshold - Количество пропущенных pong-сообщений, после которого соединение считается потерянным
* @returns {boolean} - Успешность включения ping/pong
*/
enablePingPong(interval?: number, timeoutThreshold?: number): boolean;
/**
* Отключить автоматическую отправку ping-сообщений
* @param {WebSocketNamespace} [namespace] - Пространство имен для отключения (если не указано - отключается везде)
*/
disablePingPong(namespace?: WebSocketNamespace): void;
/**
* Получить статистику ping/pong
* @param {WebSocketNamespace} [namespace] - Пространство имен для получения статистики
* @returns {PingPongStats | PingPongStats[] | null} - Статистика ping/pong
*/
getPingStats(namespace?: WebSocketNamespace): PingPongStats | PingPongStats[] | null;
/**
* Добавляет обработчик для событий ping/pong
* @param {string} eventType - Тип события (connection_timeout)
* @param {(data: any) => void} handler - Обработчик события
*/
onPingPongEvent(eventType: string, handler: (data: any) => void): void;
/**
* Удаляет обработчик для событий ping/pong
* @param {string} eventType - Тип события
* @param {(data: any) => void} [handler] - Обработчик события (если не указан, удаляются все обработчики)
*/
offPingPongEvent(eventType: string, handler?: (data: any) => void): void;
/**
* Возвращает функцию-обработчик для pong-ответов, которая рассчитывает RTT
* @returns {(data: any) => void} Функция-обработчик
*/
getPongHandler(): (data: any) => void;
/**
* Выполняет диагностику соединения и возвращает подробный отчет
* @param {WebSocketNamespace} namespace Пространство имен
* @returns {ConnectionDiagnostics} Объект с диагностической информацией
*/
diagnoseConnection(namespace: WebSocketNamespace): ConnectionDiagnostics;
/**
* Выполняет диагностику всех активных соединений
* @returns {Record<string, ConnectionDiagnostics>} Объект с диагностической информацией по всем соединениям
*/
diagnoseAllConnections(): Record<string, ConnectionDiagnostics>;
/**
* Рассчитывает задержку для переподключения на основе количества попыток и стратегии
* @param {WebSocketNamespace} namespace Пространство имен
* @returns {number} Задержка в миллисекундах
*/
private calculateReconnectDelay;
/**
* Принудительно переподключает соединение для указанного пространства имен
* @param {WebSocketNamespace} namespace Пространство имен
* @param {boolean} immediate Выполнить переподключение немедленно, без задержки
* @returns {Promise<boolean>} Успешность операции
*/
reconnectNamespace(namespace: WebSocketNamespace, immediate?: boolean): Promise<boolean>;
/**
* Настраивает периодическую проверку здоровья соединения
* @param {number} [interval=30000] Интервал проверки в миллисекундах
*/
setupConnectionHealthCheck(interval?: number): void;
/**
* Сохраняет токен сессии для пространства имен
* @param {WebSocketNamespace} namespace Пространство имен
* @param {string} token Токен сессии
*/
saveSessionToken(namespace: WebSocketNamespace, token: string): void;
/**
* Получает сохраненный токен сессии для пространства имен
* @param {WebSocketNamespace} namespace Пространство имен
* @returns {string | null} Токен сессии или null, если не найден
*/
getSessionToken(namespace: WebSocketNamespace): string | null;
/**
* Удаляет сохраненный токен сессии для пространства имен
* @param {WebSocketNamespace} namespace Пространство имен
*/
clearSessionToken(namespace: WebSocketNamespace): void;
/**
* Устанавливает состояние подключения для пространства имен
* @param {WebSocketNamespace} namespace Пространство имен
* @param {boolean} connected Состояние подключения
* @param {boolean} reconnecting Состояние переподключения
*/
private setConnectionState;
/**
* Увеличивает счетчик попыток переподключения для пространства имен
* @param {WebSocketNamespace} namespace Пространство имен
* @returns {number} Новое количество попыток
*/
private incrementReconnectAttempts;
/**
* Получает состояние подключения для пространства имен
* @param {WebSocketNamespace} namespace Пространство имен
* @returns {object} Состояние подключения
*/
getConnectionState(namespace: WebSocketNamespace): {
lastConnectTime: number;
reconnectAttempts: number;
connected: boolean;
reconnecting: boolean;
};
/**
* Устанавливает ID активной сессии рассуждения
* @param {string} reasoningId ID сессии рассуждения
* @returns {boolean} Успешность установки
*/
setActiveReasoningId(reasoningId: string): boolean;
/**
* Устанавливает ID активного проекта
* @param {string} projectId ID проекта
* @returns {boolean} Успешность установки
*/
setActiveProjectId(projectId: string): boolean;
/**
* Устанавливает ID активной сессии рассуждения с расширенными возможностями
* @param {string} reasoningId ID сессии рассуждения
* @param {boolean} waitForJoin Дождаться результата присоединения
* @param {boolean} createIfNotExists Создать новое рассуждение, если ID не существует
* @returns {Promise<boolean>} Результат операции
*/
setActiveReasoningIdAsync(reasoningId: string, waitForJoin?: boolean, createIfNotExists?: boolean): Promise<boolean>;
/**
* Создает новое рассуждение на сервере
* @private
* @returns {Promise<string>} ID нового рассуждения
*/
private createNewReasoning;
/**
* Проверяет существование рассуждения на сервере
* @param {string} reasoningId ID рассуждения для проверки
* @returns {Promise<boolean>} Существует ли рассуждение
*/
checkReasoningExists(reasoningId: string): Promise<boolean>;
/**
* Подключается к пространству имен рассуждений
* @param reasoningId ID рассуждения (опционально)
* @param options Дополнительные настройки подключения
* @returns Promise с результатом подключения
*/
connectToReasoning(reasoningId?: string, options?: {
autoJoin?: boolean;
createIfNotExists?: boolean;
checkExistence?: boolean;
saveSession?: boolean;
}): Promise<boolean>;
/**
* Получает текущий статус сессии рассуждения
* @param {string} reasoningId ID сессии рассуждения (опционально, по умолчанию активная)
* @returns {Promise<{exists: boolean, isActive: boolean, metadata?: any}>} Статус сессии
*/
getReasoningStatus(reasoningId?: string): Promise<{
exists: boolean;
isActive: boolean;
metadata?: any;
}>;
/**
* Присоединяется к сессии рассуждения
* @param {string} reasoningId ID сессии рассуждения
* @param {boolean} setActive Установить как активное рассуждение
* @returns {Promise<boolean>} Результат операции
*/
joinReasoning(reasoningId: string, setActive?: boolean): Promise<boolean>;
/**
* Подключается к пространству имен рассуждений с расширенными опциями
* @param reasoningId ID рассуждения (опционально)
* @param options Дополнительные настройки подключения
* @returns Promise с результатом подключения
*/
connectToReasoningEx(reasoningId?: string, options?: {
autoJoin?: boolean;
createIfNotExists?: boolean;
checkExistence?: boolean;
saveSession?: boolean;
}): Promise<boolean>;
}
//# sourceMappingURL=code-solver-websocket-client.d.ts.map