UNPKG

solver-sdk

Version:

SDK для интеграции с Code Solver Backend API (совместимо с браузером и Node.js), с поддержкой функциональности мышления (Thinking Mode)

690 lines 32.8 kB
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