@adpal/shared-lib 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +168 -1
- package/dist/index.d.ts +168 -1
- package/dist/index.js +136 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +130 -34
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/logger.ts","../src/retry.ts","../src/schemas.ts"],"names":["logger","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Кастомные классы ошибок\n *\n * Иерархия ошибок для структурированной обработки исключений.\n * Каждый класс содержит дополнительный контекст для отладки.\n *\n * @module errors\n */\n\n// ============================================================================\n// Базовый класс\n// ============================================================================\n\n/**\n * Базовый класс для всех ошибок приложения\n *\n * Расширяет стандартный Error с дополнительными полями:\n * - code: машиночитаемый код ошибки\n * - context: дополнительные данные для отладки\n * - retryable: можно ли повторить операцию\n */\nexport class AppError extends Error {\n /** Машиночитаемый код ошибки */\n readonly code: string;\n /** Дополнительный контекст для отладки */\n readonly context?: Record<string, unknown>;\n /** Можно ли повторить операцию */\n readonly retryable: boolean;\n /** Временная метка создания ошибки */\n readonly timestamp: Date;\n\n constructor(\n message: string,\n options: {\n code?: string;\n context?: Record<string, unknown>;\n retryable?: boolean;\n cause?: Error;\n } = {}\n ) {\n super(message, { cause: options.cause });\n this.name = 'AppError';\n this.code = options.code || 'APP_ERROR';\n this.context = options.context;\n this.retryable = options.retryable ?? false;\n this.timestamp = new Date();\n }\n\n /**\n * Преобразовать в JSON для логирования\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n context: this.context,\n retryable: this.retryable,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack,\n };\n }\n}\n\n// ============================================================================\n// Ошибки API\n// ============================================================================\n\n/**\n * Ошибка при вызове внешнего API\n *\n * Используется для Voyage AI, Anthropic, Turbopuffer.\n */\nexport class ApiError extends AppError {\n /** HTTP статус код */\n readonly statusCode: number;\n /** Имя сервиса */\n readonly service: string;\n\n constructor(\n message: string,\n options: {\n statusCode: number;\n service: string;\n context?: Record<string, unknown>;\n retryable?: boolean;\n cause?: Error;\n }\n ) {\n super(message, {\n code: `${options.service.toUpperCase()}_API_ERROR`,\n context: { ...options.context, statusCode: options.statusCode },\n retryable: options.retryable ?? isRetryableStatus(options.statusCode),\n cause: options.cause,\n });\n this.name = 'ApiError';\n this.statusCode = options.statusCode;\n this.service = options.service;\n }\n}\n\n/**\n * Ошибка Voyage AI API\n */\nexport class VoyageApiError extends ApiError {\n constructor(\n message: string,\n statusCode: number,\n context?: Record<string, unknown>\n ) {\n super(message, {\n statusCode,\n service: 'voyage',\n context,\n });\n this.name = 'VoyageApiError';\n }\n}\n\n/**\n * Ошибка Anthropic API\n */\nexport class AnthropicApiError extends ApiError {\n constructor(\n message: string,\n statusCode: number,\n context?: Record<string, unknown>\n ) {\n super(message, {\n statusCode,\n service: 'anthropic',\n context,\n });\n this.name = 'AnthropicApiError';\n }\n}\n\n/**\n * Ошибка Turbopuffer API\n */\nexport class TurbopufferApiError extends ApiError {\n constructor(\n message: string,\n statusCode: number,\n context?: Record<string, unknown>\n ) {\n super(message, {\n statusCode,\n service: 'turbopuffer',\n context,\n });\n this.name = 'TurbopufferApiError';\n }\n}\n\n// ============================================================================\n// Ошибки валидации\n// ============================================================================\n\n/**\n * Ошибка валидации данных\n *\n * Используется при невалидных входных данных или ответах API.\n */\nexport class ValidationError extends AppError {\n /** Поле, в котором обнаружена ошибка */\n readonly field?: string;\n /** Ожидаемое значение или тип */\n readonly expected?: string;\n /** Полученное значение */\n readonly received?: unknown;\n\n constructor(\n message: string,\n options: {\n field?: string;\n expected?: string;\n received?: unknown;\n context?: Record<string, unknown>;\n } = {}\n ) {\n super(message, {\n code: 'VALIDATION_ERROR',\n context: {\n ...options.context,\n field: options.field,\n expected: options.expected,\n received: options.received,\n },\n retryable: false,\n });\n this.name = 'ValidationError';\n this.field = options.field;\n this.expected = options.expected;\n this.received = options.received;\n }\n}\n\n// ============================================================================\n// Ошибки конфигурации\n// ============================================================================\n\n/**\n * Ошибка отсутствующей конфигурации\n *\n * Используется при отсутствии обязательных переменных окружения.\n */\nexport class ConfigError extends AppError {\n /** Имя отсутствующей переменной */\n readonly variableName: string;\n\n constructor(variableName: string) {\n super(`Отсутствует обязательная переменная окружения: ${variableName}`, {\n code: 'CONFIG_ERROR',\n context: { variableName },\n retryable: false,\n });\n this.name = 'ConfigError';\n this.variableName = variableName;\n }\n}\n\n// ============================================================================\n// Вспомогательные функции\n// ============================================================================\n\n/**\n * Определить, можно ли повторить запрос по HTTP статусу\n *\n * Повторяемые статусы:\n * - 408: Request Timeout\n * - 429: Too Many Requests\n * - 500: Internal Server Error\n * - 502: Bad Gateway\n * - 503: Service Unavailable\n * - 504: Gateway Timeout\n */\nfunction isRetryableStatus(statusCode: number): boolean {\n return [408, 429, 500, 502, 503, 504].includes(statusCode);\n}\n\n/**\n * Проверить, является ли ошибка экземпляром AppError\n */\nexport function isAppError(error: unknown): error is AppError {\n return error instanceof AppError;\n}\n\n/**\n * Обернуть неизвестную ошибку в AppError\n */\nexport function wrapError(error: unknown, defaultMessage = 'Неизвестная ошибка'): AppError {\n if (error instanceof AppError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new AppError(error.message || defaultMessage, {\n cause: error,\n context: { originalName: error.name },\n });\n }\n\n return new AppError(defaultMessage, {\n context: { originalError: error },\n });\n}\n","/**\n * Структурированное логирование\n *\n * Централизованный логгер с уровнями и форматированием.\n * В продакшене выводит JSON для парсинга CloudWatch/Datadog.\n * В dev режиме — читаемый формат с цветами.\n *\n * @module logger\n */\n\n// ============================================================================\n// Типы\n// ============================================================================\n\n/** Уровни логирования */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/** Метаданные для структурированного логирования */\nexport interface LogMeta {\n /** Имя модуля/компонента */\n module?: string;\n /** ID операции для трейсинга */\n operationId?: string;\n /** ID пользователя */\n userId?: string;\n /** Длительность операции в мс */\n durationMs?: number;\n /** Дополнительные поля */\n [key: string]: unknown;\n}\n\n/** Структура лог-записи */\ninterface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n meta?: LogMeta;\n error?: {\n name: string;\n message: string;\n stack?: string;\n };\n}\n\n// ============================================================================\n// Конфигурация\n// ============================================================================\n\n/** Приоритет уровней (меньше = важнее) */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/** Цвета для консоли в dev режиме */\nconst COLORS: Record<LogLevel, string> = {\n debug: '\\x1b[36m', // Cyan\n info: '\\x1b[32m', // Green\n warn: '\\x1b[33m', // Yellow\n error: '\\x1b[31m', // Red\n};\nconst RESET = '\\x1b[0m';\n\n/** Текущий уровень логирования */\nfunction getCurrentLogLevel(): LogLevel {\n const envLevel = process.env.LOG_LEVEL?.toLowerCase();\n if (envLevel && envLevel in LOG_LEVEL_PRIORITY) {\n return envLevel as LogLevel;\n }\n return process.env.NODE_ENV === 'production' ? 'info' : 'debug';\n}\n\n/** Проверка, включён ли dev режим */\nfunction isDev(): boolean {\n return process.env.NODE_ENV !== 'production';\n}\n\n// ============================================================================\n// Форматирование\n// ============================================================================\n\n/**\n * Форматировать лог-запись для консоли\n */\nfunction formatLogEntry(entry: LogEntry): string {\n if (isDev()) {\n // Dev режим: читаемый формат с цветами\n const color = COLORS[entry.level];\n const levelStr = entry.level.toUpperCase().padEnd(5);\n const time = new Date(entry.timestamp).toLocaleTimeString();\n\n let output = `${color}[${levelStr}]${RESET} ${time} ${entry.message}`;\n\n if (entry.meta && Object.keys(entry.meta).length > 0) {\n output += ` ${JSON.stringify(entry.meta)}`;\n }\n\n if (entry.error) {\n output += `\\n Error: ${entry.error.name}: ${entry.error.message}`;\n if (entry.error.stack) {\n output += `\\n ${entry.error.stack.split('\\n').slice(1).join('\\n ')}`;\n }\n }\n\n return output;\n }\n\n // Production: JSON для парсинга\n return JSON.stringify(entry);\n}\n\n/**\n * Сериализовать ошибку для логирования\n */\nfunction serializeError(error: Error): LogEntry['error'] {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n}\n\n// ============================================================================\n// Основной класс логгера\n// ============================================================================\n\n/**\n * Класс логгера\n *\n * Создаёт экземпляр с привязкой к модулю.\n *\n * @example\n * const log = new Logger('voyage');\n * log.info('Запрос отправлен', { tokens: 1500 });\n * log.error('Ошибка API', new Error('timeout'));\n */\nexport class Logger {\n private readonly module: string;\n private readonly minLevel: LogLevel;\n\n constructor(module: string) {\n this.module = module;\n this.minLevel = getCurrentLogLevel();\n }\n\n /**\n * Проверить, включён ли данный уровень\n */\n private isEnabled(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[this.minLevel];\n }\n\n /**\n * Записать лог\n */\n private log(level: LogLevel, message: string, meta?: LogMeta, error?: Error): void {\n if (!this.isEnabled(level)) return;\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n message,\n meta: { module: this.module, ...meta },\n };\n\n if (error) {\n entry.error = serializeError(error);\n }\n\n const formatted = formatLogEntry(entry);\n\n switch (level) {\n case 'error':\n console.error(formatted);\n break;\n case 'warn':\n console.warn(formatted);\n break;\n default:\n console.log(formatted);\n }\n }\n\n /**\n * Debug уровень — детальная информация для отладки\n */\n debug(message: string, meta?: LogMeta): void {\n this.log('debug', message, meta);\n }\n\n /**\n * Info уровень — информационные сообщения\n */\n info(message: string, meta?: LogMeta): void {\n this.log('info', message, meta);\n }\n\n /**\n * Warn уровень — предупреждения\n */\n warn(message: string, meta?: LogMeta): void {\n this.log('warn', message, meta);\n }\n\n /**\n * Error уровень — ошибки\n */\n error(message: string, error?: Error | unknown, meta?: LogMeta): void {\n const err = error instanceof Error ? error : undefined;\n this.log('error', message, meta, err);\n }\n\n /**\n * Создать child logger с дополнительным контекстом\n */\n child(context: LogMeta): ChildLogger {\n return new ChildLogger(this, context);\n }\n}\n\n/**\n * Child logger с привязанным контекстом\n */\nclass ChildLogger {\n constructor(\n private readonly parent: Logger,\n private readonly context: LogMeta\n ) {}\n\n debug(message: string, meta?: LogMeta): void {\n this.parent.debug(message, { ...this.context, ...meta });\n }\n\n info(message: string, meta?: LogMeta): void {\n this.parent.info(message, { ...this.context, ...meta });\n }\n\n warn(message: string, meta?: LogMeta): void {\n this.parent.warn(message, { ...this.context, ...meta });\n }\n\n error(message: string, error?: Error | unknown, meta?: LogMeta): void {\n this.parent.error(message, error, { ...this.context, ...meta });\n }\n}\n\n// ============================================================================\n// Готовые экземпляры логгеров\n// ============================================================================\n\n/** Логгер для Voyage AI */\nexport const voyageLogger = new Logger('voyage');\n\n/** Логгер для Turbopuffer */\nexport const turbopufferLogger = new Logger('turbopuffer');\n\n/** Логгер для Anthropic */\nexport const anthropicLogger = new Logger('anthropic');\n\n/** Логгер для API запросов */\nexport const apiLogger = new Logger('api');\n\n/** Логгер общего назначения */\nexport const logger = new Logger('app');\n\n// ============================================================================\n// Утилиты для измерения времени\n// ============================================================================\n\n/**\n * Создать таймер для измерения длительности операции\n *\n * @example\n * const timer = createTimer();\n * await doSomething();\n * log.info('Операция завершена', { durationMs: timer() });\n */\nexport function createTimer(): () => number {\n const start = performance.now();\n return () => Math.round(performance.now() - start);\n}\n","/**\n * Retry логика с exponential backoff\n *\n * Утилиты для повторения неудачных операций с экспоненциальной\n * задержкой и джиттером для предотвращения thundering herd.\n *\n * @module retry\n */\n\nimport { Logger } from './logger';\nimport { AppError, isAppError } from './errors';\n\n// ============================================================================\n// Типы\n// ============================================================================\n\n/**\n * Опции для retry\n */\nexport interface RetryOptions {\n /** Максимальное количество попыток (включая первую) */\n maxAttempts?: number;\n /** Базовая задержка в мс (удваивается с каждой попыткой) */\n baseDelayMs?: number;\n /** Максимальная задержка в мс */\n maxDelayMs?: number;\n /** Добавлять случайный джиттер (0-1, доля от задержки) */\n jitter?: number;\n /** Функция для определения, нужно ли повторять */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /** Callback при каждой неудачной попытке */\n onRetry?: (error: unknown, attempt: number, delayMs: number) => void;\n /** Логгер для записи попыток */\n logger?: Logger;\n}\n\n/**\n * Результат выполнения с retry\n */\nexport interface RetryResult<T> {\n /** Результат успешного выполнения */\n data: T;\n /** Количество попыток (1 = успех с первого раза) */\n attempts: number;\n /** Общее время выполнения в мс */\n totalTimeMs: number;\n}\n\n// ============================================================================\n// Константы по умолчанию\n// ============================================================================\n\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_BASE_DELAY_MS = 1000;\nconst DEFAULT_MAX_DELAY_MS = 30000;\nconst DEFAULT_JITTER = 0.1;\n\n// ============================================================================\n// Вспомогательные функции\n// ============================================================================\n\n/**\n * Ожидать указанное количество миллисекунд\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Рассчитать задержку с экспоненциальным ростом и джиттером\n *\n * @param attempt - Номер попытки (начиная с 1)\n * @param baseDelayMs - Базовая задержка\n * @param maxDelayMs - Максимальная задержка\n * @param jitter - Джиттер (0-1)\n * @returns Задержка в мс\n */\nfunction calculateDelay(\n attempt: number,\n baseDelayMs: number,\n maxDelayMs: number,\n jitter: number\n): number {\n // Экспоненциальный рост: base * 2^(attempt-1)\n const exponentialDelay = baseDelayMs * Math.pow(2, attempt - 1);\n\n // Ограничиваем максимальной задержкой\n const cappedDelay = Math.min(exponentialDelay, maxDelayMs);\n\n // Добавляем джиттер\n const jitterAmount = cappedDelay * jitter * Math.random();\n\n return Math.round(cappedDelay + jitterAmount);\n}\n\n/**\n * Определить по умолчанию, нужно ли повторять\n *\n * Повторяем если:\n * - Ошибка помечена как retryable\n * - Это сетевая ошибка (fetch failed, timeout)\n */\nfunction defaultShouldRetry(error: unknown): boolean {\n // AppError с флагом retryable\n if (isAppError(error) && error.retryable) {\n return true;\n }\n\n // Стандартные сетевые ошибки\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n const networkErrors = [\n 'fetch failed',\n 'network error',\n 'timeout',\n 'econnreset',\n 'econnrefused',\n 'socket hang up',\n ];\n return networkErrors.some((e) => message.includes(e));\n }\n\n return false;\n}\n\n// ============================================================================\n// Основная функция\n// ============================================================================\n\n/**\n * Выполнить функцию с retry и exponential backoff\n *\n * @param fn - Асинхронная функция для выполнения\n * @param options - Опции retry\n * @returns Результат выполнения с метаданными\n * @throws Последняя ошибка, если все попытки исчерпаны\n *\n * @example\n * const result = await withRetry(\n * () => fetch('https://api.example.com/data'),\n * { maxAttempts: 3, baseDelayMs: 1000 }\n * );\n * console.log(`Успех за ${result.attempts} попыток`);\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<RetryResult<T>> {\n const {\n maxAttempts = DEFAULT_MAX_ATTEMPTS,\n baseDelayMs = DEFAULT_BASE_DELAY_MS,\n maxDelayMs = DEFAULT_MAX_DELAY_MS,\n jitter = DEFAULT_JITTER,\n shouldRetry = defaultShouldRetry,\n onRetry,\n logger,\n } = options;\n\n const startTime = performance.now();\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const data = await fn();\n return {\n data,\n attempts: attempt,\n totalTimeMs: Math.round(performance.now() - startTime),\n };\n } catch (error) {\n lastError = error;\n\n // Последняя попытка — бросаем ошибку\n if (attempt >= maxAttempts) {\n logger?.error(`Все ${maxAttempts} попыток исчерпаны`, error);\n break;\n }\n\n // Проверяем, нужно ли повторять\n if (!shouldRetry(error, attempt)) {\n logger?.warn(`Ошибка не подлежит повторению на попытке ${attempt}`, {\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n break;\n }\n\n // Рассчитываем задержку\n const delayMs = calculateDelay(attempt, baseDelayMs, maxDelayMs, jitter);\n\n logger?.info(`Попытка ${attempt}/${maxAttempts} не удалась, повтор через ${delayMs}мс`, {\n errorMessage: error instanceof Error ? error.message : String(error),\n delayMs,\n });\n\n // Вызываем callback\n onRetry?.(error, attempt, delayMs);\n\n // Ждём перед следующей попыткой\n await sleep(delayMs);\n }\n }\n\n // Если дошли сюда — все попытки исчерпаны\n throw lastError;\n}\n\n// ============================================================================\n// Обёртки для специфичных сценариев\n// ============================================================================\n\n/**\n * Retry для API запросов с предустановленными параметрами\n *\n * Оптимизировано для внешних API (Voyage, Anthropic, Turbopuffer).\n *\n * @example\n * const response = await retryApiCall(\n * () => fetch(VOYAGE_API_URL, { method: 'POST', body }),\n * { logger: voyageLogger }\n * );\n */\nexport async function retryApiCall<T>(\n fn: () => Promise<T>,\n options: Pick<RetryOptions, 'logger' | 'onRetry' | 'maxAttempts'> = {}\n): Promise<T> {\n const result = await withRetry(fn, {\n maxAttempts: options.maxAttempts ?? 3,\n baseDelayMs: 1000,\n maxDelayMs: 10000,\n jitter: 0.2,\n logger: options.logger,\n onRetry: options.onRetry,\n });\n\n return result.data;\n}\n\n/**\n * Retry для критичных операций с более агрессивными параметрами\n *\n * Используется для операций, которые обязательно должны выполниться.\n *\n * @example\n * await retryCritical(\n * () => saveToDatabase(data),\n * { logger }\n * );\n */\nexport async function retryCritical<T>(\n fn: () => Promise<T>,\n options: Pick<RetryOptions, 'logger' | 'onRetry'> = {}\n): Promise<T> {\n const result = await withRetry(fn, {\n maxAttempts: 5,\n baseDelayMs: 500,\n maxDelayMs: 30000,\n jitter: 0.3,\n logger: options.logger,\n onRetry: options.onRetry,\n shouldRetry: () => true, // Повторяем всегда\n });\n\n return result.data;\n}\n","/**\n * Zod схемы для валидации API ответов\n *\n * Типобезопасная валидация ответов от внешних API.\n * Гарантирует соответствие данных ожидаемой структуре.\n *\n * @module schemas\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Voyage AI Schemas\n// ============================================================================\n\n/**\n * Схема ответа Voyage Embeddings API\n *\n * @see https://docs.voyageai.com/docs/embeddings\n */\nexport const VoyageEmbeddingResponseSchema = z.object({\n /** Массив эмбеддингов */\n data: z.array(\n z.object({\n /** Вектор эмбеддинга */\n embedding: z.array(z.number()),\n /** Индекс в исходном массиве */\n index: z.number().optional(),\n })\n ),\n /** Статистика использования */\n usage: z.object({\n /** Общее количество токенов */\n total_tokens: z.number(),\n }),\n /** Модель, использованная для генерации */\n model: z.string().optional(),\n});\n\nexport type VoyageEmbeddingResponse = z.infer<typeof VoyageEmbeddingResponseSchema>;\n\n/**\n * Схема ответа Voyage Rerank API\n *\n * @see https://docs.voyageai.com/docs/reranker\n */\nexport const VoyageRerankResponseSchema = z.object({\n /** Массив результатов реранкинга */\n data: z.array(\n z.object({\n /** Индекс документа в исходном массиве */\n index: z.number(),\n /** Оценка релевантности (0-1) */\n relevance_score: z.number().min(0).max(1),\n })\n ),\n /** Статистика использования */\n usage: z.object({\n /** Общее количество токенов */\n total_tokens: z.number(),\n }),\n /** Модель, использованная для реранкинга */\n model: z.string().optional(),\n});\n\nexport type VoyageRerankResponse = z.infer<typeof VoyageRerankResponseSchema>;\n\n// ============================================================================\n// Turbopuffer Schemas\n// ============================================================================\n\n/**\n * Базовая схема атрибутов вектора\n */\nexport const VectorAttributesSchema = z.object({\n /** ID записи в Supabase */\n supabase_id: z.number(),\n /** Уникальный ID сообщения/документа */\n message_id: z.string(),\n /** Тип источника */\n source_type: z.enum(['email', 'pdf', 'website']),\n /** Тип чанка */\n chunk_type: z.string(),\n /** Email отправителя */\n sender: z.string().optional(),\n /** Email получателя */\n recipient: z.string().optional(),\n /** Дата источника */\n source_date: z.string().optional(),\n /** ID цепочки писем */\n thread_id: z.string().optional(),\n /** ID клиента */\n client_id: z.string().optional(),\n /** URL источника */\n source_url: z.string().optional(),\n /** Номер страницы */\n page_number: z.number().optional(),\n /** Заголовок секции */\n section_title: z.string().optional(),\n /** ID в content_sources */\n content_source_id: z.number().optional(),\n /** Тема письма */\n subject: z.string().optional(),\n /** Превью контента */\n content_preview: z.string().optional(),\n /** Заголовок документа */\n title: z.string().optional(),\n /** Полный контент */\n content: z.string().optional(),\n /** Категория */\n category: z.string().optional(),\n /** Тональность */\n sentiment: z.enum(['positive', 'negative', 'neutral']).optional(),\n /** Дата создания */\n created_at: z.string().optional(),\n});\n\nexport type VectorAttributes = z.infer<typeof VectorAttributesSchema>;\n\n/**\n * Схема результата поиска Turbopuffer\n */\nexport const TurbopufferSearchResultSchema = z.object({\n /** ID вектора */\n id: z.string(),\n /** Расстояние до запроса */\n dist: z.number(),\n /** Атрибуты вектора */\n attributes: VectorAttributesSchema.partial(),\n});\n\nexport type TurbopufferSearchResult = z.infer<typeof TurbopufferSearchResultSchema>;\n\n// ============================================================================\n// Anthropic Schemas\n// ============================================================================\n\n/**\n * Схема сообщения в ответе Claude\n */\nexport const ClaudeMessageSchema = z.object({\n /** ID сообщения */\n id: z.string(),\n /** Тип объекта */\n type: z.literal('message'),\n /** Роль */\n role: z.enum(['assistant', 'user']),\n /** Контент */\n content: z.array(\n z.object({\n type: z.enum(['text', 'tool_use']),\n text: z.string().optional(),\n })\n ),\n /** Модель */\n model: z.string(),\n /** Причина остановки */\n stop_reason: z.enum(['end_turn', 'max_tokens', 'stop_sequence', 'tool_use']).nullable(),\n /** Использование токенов */\n usage: z.object({\n input_tokens: z.number(),\n output_tokens: z.number(),\n }),\n});\n\nexport type ClaudeMessage = z.infer<typeof ClaudeMessageSchema>;\n\n// ============================================================================\n// Chat API Schemas\n// ============================================================================\n\n/**\n * Схема входящего запроса к Chat API\n */\nexport const ChatRequestSchema = z.object({\n /** Сообщение пользователя */\n message: z.string().min(1).max(10000),\n /** История сообщений */\n history: z\n .array(\n z.object({\n role: z.enum(['user', 'assistant']),\n content: z.string(),\n })\n )\n .optional()\n .default([]),\n /** ID сессии */\n sessionId: z.string().optional(),\n /** Режим (customer/internal) */\n mode: z.enum(['customer', 'internal']).optional().default('customer'),\n});\n\nexport type ChatRequest = z.infer<typeof ChatRequestSchema>;\n\n/**\n * Схема источника в ответе\n */\nexport const SourceSchema = z.object({\n /** Тип источника */\n type: z.enum(['email', 'pdf', 'website']),\n /** Заголовок */\n title: z.string(),\n /** URL или идентификатор */\n url: z.string().optional(),\n /** Превью контента */\n preview: z.string().optional(),\n /** Оценка релевантности */\n relevance: z.number().optional(),\n});\n\nexport type Source = z.infer<typeof SourceSchema>;\n\n// ============================================================================\n// Утилиты для валидации\n// ============================================================================\n\n/**\n * Безопасно распарсить данные по схеме\n *\n * @param schema - Zod схема\n * @param data - Данные для валидации\n * @returns Результат парсинга или null при ошибке\n *\n * @example\n * const response = await fetch(url);\n * const data = await response.json();\n * const parsed = safeParse(VoyageEmbeddingResponseSchema, data);\n * if (!parsed) throw new ValidationError('Invalid API response');\n */\nexport function safeParse<T>(\n schema: z.ZodType<T>,\n data: unknown\n): T | null {\n const result = schema.safeParse(data);\n return result.success ? result.data : null;\n}\n\n/**\n * Распарсить данные по схеме с выбросом ошибки\n *\n * @param schema - Zod схема\n * @param data - Данные для валидации\n * @param errorMessage - Сообщение об ошибке\n * @returns Валидные данные\n * @throws Error при невалидных данных\n */\nexport function parseOrThrow<T>(\n schema: z.ZodType<T>,\n data: unknown,\n errorMessage = 'Validation failed'\n): T {\n const result = schema.safeParse(data);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => `${i.path.join('.')}: ${i.message}`)\n .join('; ');\n throw new Error(`${errorMessage}: ${issues}`);\n }\n return result.data;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/logger.ts","../src/retry.ts","../src/schemas.ts","../src/api-response.ts"],"names":["error","logger","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Кастомные классы ошибок\n *\n * Иерархия ошибок для структурированной обработки исключений.\n * Каждый класс содержит дополнительный контекст для отладки.\n *\n * @module errors\n */\n\n// ============================================================================\n// Базовый класс\n// ============================================================================\n\n/**\n * Базовый класс для всех ошибок приложения\n *\n * Расширяет стандартный Error с дополнительными полями:\n * - code: машиночитаемый код ошибки\n * - context: дополнительные данные для отладки\n * - retryable: можно ли повторить операцию\n */\nexport class AppError extends Error {\n /** Машиночитаемый код ошибки */\n readonly code: string;\n /** Дополнительный контекст для отладки */\n readonly context?: Record<string, unknown>;\n /** Можно ли повторить операцию */\n readonly retryable: boolean;\n /** Временная метка создания ошибки */\n readonly timestamp: Date;\n\n constructor(\n message: string,\n options: {\n code?: string;\n context?: Record<string, unknown>;\n retryable?: boolean;\n cause?: Error;\n } = {}\n ) {\n super(message, { cause: options.cause });\n this.name = 'AppError';\n this.code = options.code || 'APP_ERROR';\n this.context = options.context;\n this.retryable = options.retryable ?? false;\n this.timestamp = new Date();\n }\n\n /**\n * Преобразовать в JSON для логирования\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n context: this.context,\n retryable: this.retryable,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack,\n };\n }\n}\n\n// ============================================================================\n// Ошибки API\n// ============================================================================\n\n/**\n * Ошибка при вызове внешнего API\n *\n * Используется для Voyage AI, Anthropic, Turbopuffer.\n */\nexport class ApiError extends AppError {\n /** HTTP статус код */\n readonly statusCode: number;\n /** Имя сервиса */\n readonly service: string;\n\n constructor(\n message: string,\n options: {\n statusCode: number;\n service: string;\n context?: Record<string, unknown>;\n retryable?: boolean;\n cause?: Error;\n }\n ) {\n super(message, {\n code: `${options.service.toUpperCase()}_API_ERROR`,\n context: { ...options.context, statusCode: options.statusCode },\n retryable: options.retryable ?? isRetryableStatus(options.statusCode),\n cause: options.cause,\n });\n this.name = 'ApiError';\n this.statusCode = options.statusCode;\n this.service = options.service;\n }\n}\n\n/**\n * Ошибка Voyage AI API\n */\nexport class VoyageApiError extends ApiError {\n constructor(\n message: string,\n statusCode: number,\n context?: Record<string, unknown>\n ) {\n super(message, {\n statusCode,\n service: 'voyage',\n context,\n });\n this.name = 'VoyageApiError';\n }\n}\n\n/**\n * Ошибка Anthropic API\n */\nexport class AnthropicApiError extends ApiError {\n constructor(\n message: string,\n statusCode: number,\n context?: Record<string, unknown>\n ) {\n super(message, {\n statusCode,\n service: 'anthropic',\n context,\n });\n this.name = 'AnthropicApiError';\n }\n}\n\n/**\n * Ошибка Turbopuffer API\n */\nexport class TurbopufferApiError extends ApiError {\n constructor(\n message: string,\n statusCode: number,\n context?: Record<string, unknown>\n ) {\n super(message, {\n statusCode,\n service: 'turbopuffer',\n context,\n });\n this.name = 'TurbopufferApiError';\n }\n}\n\n// ============================================================================\n// Ошибки валидации\n// ============================================================================\n\n/**\n * Ошибка валидации данных\n *\n * Используется при невалидных входных данных или ответах API.\n */\nexport class ValidationError extends AppError {\n /** Поле, в котором обнаружена ошибка */\n readonly field?: string;\n /** Ожидаемое значение или тип */\n readonly expected?: string;\n /** Полученное значение */\n readonly received?: unknown;\n\n constructor(\n message: string,\n options: {\n field?: string;\n expected?: string;\n received?: unknown;\n context?: Record<string, unknown>;\n } = {}\n ) {\n super(message, {\n code: 'VALIDATION_ERROR',\n context: {\n ...options.context,\n field: options.field,\n expected: options.expected,\n received: options.received,\n },\n retryable: false,\n });\n this.name = 'ValidationError';\n this.field = options.field;\n this.expected = options.expected;\n this.received = options.received;\n }\n}\n\n// ============================================================================\n// Ошибки конфигурации\n// ============================================================================\n\n/**\n * Ошибка отсутствующей конфигурации\n *\n * Используется при отсутствии обязательных переменных окружения.\n */\nexport class ConfigError extends AppError {\n /** Имя отсутствующей переменной */\n readonly variableName: string;\n\n constructor(variableName: string) {\n super(`Отсутствует обязательная переменная окружения: ${variableName}`, {\n code: 'CONFIG_ERROR',\n context: { variableName },\n retryable: false,\n });\n this.name = 'ConfigError';\n this.variableName = variableName;\n }\n}\n\n// ============================================================================\n// Вспомогательные функции\n// ============================================================================\n\n/**\n * Определить, можно ли повторить запрос по HTTP статусу\n *\n * Повторяемые статусы:\n * - 408: Request Timeout\n * - 429: Too Many Requests\n * - 500: Internal Server Error\n * - 502: Bad Gateway\n * - 503: Service Unavailable\n * - 504: Gateway Timeout\n */\nfunction isRetryableStatus(statusCode: number): boolean {\n return [408, 429, 500, 502, 503, 504].includes(statusCode);\n}\n\n/**\n * Проверить, является ли ошибка экземпляром AppError\n */\nexport function isAppError(error: unknown): error is AppError {\n return error instanceof AppError;\n}\n\n/**\n * Обернуть неизвестную ошибку в AppError\n */\nexport function wrapError(error: unknown, defaultMessage = 'Неизвестная ошибка'): AppError {\n if (error instanceof AppError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new AppError(error.message || defaultMessage, {\n cause: error,\n context: { originalName: error.name },\n });\n }\n\n return new AppError(defaultMessage, {\n context: { originalError: error },\n });\n}\n","/**\n * Структурированное логирование\n *\n * Централизованный логгер с уровнями и форматированием.\n * В продакшене выводит JSON для парсинга CloudWatch/Datadog.\n * В dev режиме — читаемый формат с цветами.\n *\n * @module logger\n */\n\n// ============================================================================\n// Типы\n// ============================================================================\n\n/** Уровни логирования */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/** Метаданные для структурированного логирования */\nexport interface LogMeta {\n /** Имя модуля/компонента */\n module?: string;\n /** ID операции для трейсинга */\n operationId?: string;\n /** ID пользователя */\n userId?: string;\n /** Длительность операции в мс */\n durationMs?: number;\n /** Дополнительные поля */\n [key: string]: unknown;\n}\n\n/** Структура лог-записи */\ninterface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n meta?: LogMeta;\n error?: {\n name: string;\n message: string;\n stack?: string;\n };\n}\n\n// ============================================================================\n// Конфигурация\n// ============================================================================\n\n/** Приоритет уровней (меньше = важнее) */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/** Цвета для консоли в dev режиме */\nconst COLORS: Record<LogLevel, string> = {\n debug: '\\x1b[36m', // Cyan\n info: '\\x1b[32m', // Green\n warn: '\\x1b[33m', // Yellow\n error: '\\x1b[31m', // Red\n};\nconst RESET = '\\x1b[0m';\n\n/** Текущий уровень логирования */\nfunction getCurrentLogLevel(): LogLevel {\n const envLevel = process.env.LOG_LEVEL?.toLowerCase();\n if (envLevel && envLevel in LOG_LEVEL_PRIORITY) {\n return envLevel as LogLevel;\n }\n return process.env.NODE_ENV === 'production' ? 'info' : 'debug';\n}\n\n/** Проверка, включён ли dev режим */\nfunction isDev(): boolean {\n return process.env.NODE_ENV !== 'production';\n}\n\n// ============================================================================\n// Форматирование\n// ============================================================================\n\n/**\n * Форматировать лог-запись для консоли\n */\nfunction formatLogEntry(entry: LogEntry): string {\n if (isDev()) {\n // Dev режим: читаемый формат с цветами\n const color = COLORS[entry.level];\n const levelStr = entry.level.toUpperCase().padEnd(5);\n const time = new Date(entry.timestamp).toLocaleTimeString();\n\n let output = `${color}[${levelStr}]${RESET} ${time} ${entry.message}`;\n\n if (entry.meta && Object.keys(entry.meta).length > 0) {\n output += ` ${JSON.stringify(entry.meta)}`;\n }\n\n if (entry.error) {\n output += `\\n Error: ${entry.error.name}: ${entry.error.message}`;\n if (entry.error.stack) {\n output += `\\n ${entry.error.stack.split('\\n').slice(1).join('\\n ')}`;\n }\n }\n\n return output;\n }\n\n // Production: JSON для парсинга\n return JSON.stringify(entry);\n}\n\n/**\n * Сериализовать ошибку для логирования\n */\nfunction serializeError(error: Error): LogEntry['error'] {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n}\n\n// ============================================================================\n// Основной класс логгера\n// ============================================================================\n\n/**\n * Класс логгера\n *\n * Создаёт экземпляр с привязкой к модулю.\n *\n * @example\n * const log = new Logger('voyage');\n * log.info('Запрос отправлен', { tokens: 1500 });\n * log.error('Ошибка API', new Error('timeout'));\n */\nexport class Logger {\n private readonly module: string;\n private readonly minLevel: LogLevel;\n\n constructor(module: string) {\n this.module = module;\n this.minLevel = getCurrentLogLevel();\n }\n\n /**\n * Проверить, включён ли данный уровень\n */\n private isEnabled(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[this.minLevel];\n }\n\n /**\n * Записать лог\n */\n private log(level: LogLevel, message: string, meta?: LogMeta, error?: Error): void {\n if (!this.isEnabled(level)) return;\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n message,\n meta: { module: this.module, ...meta },\n };\n\n if (error) {\n entry.error = serializeError(error);\n }\n\n const formatted = formatLogEntry(entry);\n\n switch (level) {\n case 'error':\n console.error(formatted);\n break;\n case 'warn':\n console.warn(formatted);\n break;\n default:\n console.log(formatted);\n }\n }\n\n /**\n * Debug уровень — детальная информация для отладки\n */\n debug(message: string, meta?: LogMeta): void {\n this.log('debug', message, meta);\n }\n\n /**\n * Info уровень — информационные сообщения\n */\n info(message: string, meta?: LogMeta): void {\n this.log('info', message, meta);\n }\n\n /**\n * Warn уровень — предупреждения\n */\n warn(message: string, meta?: LogMeta): void {\n this.log('warn', message, meta);\n }\n\n /**\n * Error уровень — ошибки\n */\n error(message: string, error?: Error | unknown, meta?: LogMeta): void {\n const err = error instanceof Error ? error : undefined;\n this.log('error', message, meta, err);\n }\n\n /**\n * Создать child logger с дополнительным контекстом\n */\n child(context: LogMeta): ChildLogger {\n return new ChildLogger(this, context);\n }\n}\n\n/**\n * Child logger с привязанным контекстом\n */\nclass ChildLogger {\n constructor(\n private readonly parent: Logger,\n private readonly context: LogMeta\n ) {}\n\n debug(message: string, meta?: LogMeta): void {\n this.parent.debug(message, { ...this.context, ...meta });\n }\n\n info(message: string, meta?: LogMeta): void {\n this.parent.info(message, { ...this.context, ...meta });\n }\n\n warn(message: string, meta?: LogMeta): void {\n this.parent.warn(message, { ...this.context, ...meta });\n }\n\n error(message: string, error?: Error | unknown, meta?: LogMeta): void {\n this.parent.error(message, error, { ...this.context, ...meta });\n }\n}\n\n// ============================================================================\n// Готовые экземпляры логгеров\n// ============================================================================\n\n/** Логгер для Voyage AI */\nexport const voyageLogger = new Logger('voyage');\n\n/** Логгер для Turbopuffer */\nexport const turbopufferLogger = new Logger('turbopuffer');\n\n/** Логгер для Anthropic */\nexport const anthropicLogger = new Logger('anthropic');\n\n/** Логгер для API запросов */\nexport const apiLogger = new Logger('api');\n\n/** Логгер общего назначения */\nexport const logger = new Logger('app');\n\n// ============================================================================\n// Утилиты для измерения времени\n// ============================================================================\n\n/**\n * Создать таймер для измерения длительности операции\n *\n * @example\n * const timer = createTimer();\n * await doSomething();\n * log.info('Операция завершена', { durationMs: timer() });\n */\nexport function createTimer(): () => number {\n const start = performance.now();\n return () => Math.round(performance.now() - start);\n}\n","/**\n * Retry логика с exponential backoff\n *\n * Утилиты для повторения неудачных операций с экспоненциальной\n * задержкой и джиттером для предотвращения thundering herd.\n *\n * @module retry\n */\n\nimport { Logger } from './logger';\nimport { AppError, isAppError } from './errors';\n\n// ============================================================================\n// Типы\n// ============================================================================\n\n/**\n * Опции для retry\n */\nexport interface RetryOptions {\n /** Максимальное количество попыток (включая первую) */\n maxAttempts?: number;\n /** Базовая задержка в мс (удваивается с каждой попыткой) */\n baseDelayMs?: number;\n /** Максимальная задержка в мс */\n maxDelayMs?: number;\n /** Добавлять случайный джиттер (0-1, доля от задержки) */\n jitter?: number;\n /** Функция для определения, нужно ли повторять */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /** Callback при каждой неудачной попытке */\n onRetry?: (error: unknown, attempt: number, delayMs: number) => void;\n /** Логгер для записи попыток */\n logger?: Logger;\n}\n\n/**\n * Результат выполнения с retry\n */\nexport interface RetryResult<T> {\n /** Результат успешного выполнения */\n data: T;\n /** Количество попыток (1 = успех с первого раза) */\n attempts: number;\n /** Общее время выполнения в мс */\n totalTimeMs: number;\n}\n\n// ============================================================================\n// Константы по умолчанию\n// ============================================================================\n\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_BASE_DELAY_MS = 1000;\nconst DEFAULT_MAX_DELAY_MS = 30000;\nconst DEFAULT_JITTER = 0.1;\n\n// ============================================================================\n// Вспомогательные функции\n// ============================================================================\n\n/**\n * Ожидать указанное количество миллисекунд\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Рассчитать задержку с экспоненциальным ростом и джиттером\n *\n * @param attempt - Номер попытки (начиная с 1)\n * @param baseDelayMs - Базовая задержка\n * @param maxDelayMs - Максимальная задержка\n * @param jitter - Джиттер (0-1)\n * @returns Задержка в мс\n */\nfunction calculateDelay(\n attempt: number,\n baseDelayMs: number,\n maxDelayMs: number,\n jitter: number\n): number {\n // Экспоненциальный рост: base * 2^(attempt-1)\n const exponentialDelay = baseDelayMs * Math.pow(2, attempt - 1);\n\n // Ограничиваем максимальной задержкой\n const cappedDelay = Math.min(exponentialDelay, maxDelayMs);\n\n // Добавляем джиттер\n const jitterAmount = cappedDelay * jitter * Math.random();\n\n return Math.round(cappedDelay + jitterAmount);\n}\n\n/**\n * Определить по умолчанию, нужно ли повторять\n *\n * Повторяем если:\n * - Ошибка помечена как retryable\n * - Это сетевая ошибка (fetch failed, timeout)\n */\nfunction defaultShouldRetry(error: unknown): boolean {\n // AppError с флагом retryable\n if (isAppError(error) && error.retryable) {\n return true;\n }\n\n // Стандартные сетевые ошибки\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n const networkErrors = [\n 'fetch failed',\n 'network error',\n 'timeout',\n 'econnreset',\n 'econnrefused',\n 'socket hang up',\n ];\n return networkErrors.some((e) => message.includes(e));\n }\n\n return false;\n}\n\n// ============================================================================\n// Основная функция\n// ============================================================================\n\n/**\n * Выполнить функцию с retry и exponential backoff\n *\n * @param fn - Асинхронная функция для выполнения\n * @param options - Опции retry\n * @returns Результат выполнения с метаданными\n * @throws Последняя ошибка, если все попытки исчерпаны\n *\n * @example\n * const result = await withRetry(\n * () => fetch('https://api.example.com/data'),\n * { maxAttempts: 3, baseDelayMs: 1000 }\n * );\n * console.log(`Успех за ${result.attempts} попыток`);\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<RetryResult<T>> {\n const {\n maxAttempts = DEFAULT_MAX_ATTEMPTS,\n baseDelayMs = DEFAULT_BASE_DELAY_MS,\n maxDelayMs = DEFAULT_MAX_DELAY_MS,\n jitter = DEFAULT_JITTER,\n shouldRetry = defaultShouldRetry,\n onRetry,\n logger,\n } = options;\n\n const startTime = performance.now();\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const data = await fn();\n return {\n data,\n attempts: attempt,\n totalTimeMs: Math.round(performance.now() - startTime),\n };\n } catch (error) {\n lastError = error;\n\n // Последняя попытка — бросаем ошибку\n if (attempt >= maxAttempts) {\n logger?.error(`Все ${maxAttempts} попыток исчерпаны`, error);\n break;\n }\n\n // Проверяем, нужно ли повторять\n if (!shouldRetry(error, attempt)) {\n logger?.warn(`Ошибка не подлежит повторению на попытке ${attempt}`, {\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n break;\n }\n\n // Рассчитываем задержку\n const delayMs = calculateDelay(attempt, baseDelayMs, maxDelayMs, jitter);\n\n logger?.info(`Попытка ${attempt}/${maxAttempts} не удалась, повтор через ${delayMs}мс`, {\n errorMessage: error instanceof Error ? error.message : String(error),\n delayMs,\n });\n\n // Вызываем callback\n onRetry?.(error, attempt, delayMs);\n\n // Ждём перед следующей попыткой\n await sleep(delayMs);\n }\n }\n\n // Если дошли сюда — все попытки исчерпаны\n throw lastError;\n}\n\n// ============================================================================\n// Обёртки для специфичных сценариев\n// ============================================================================\n\n/**\n * Retry для API запросов с предустановленными параметрами\n *\n * Оптимизировано для внешних API (Voyage, Anthropic, Turbopuffer).\n *\n * @example\n * const response = await retryApiCall(\n * () => fetch(VOYAGE_API_URL, { method: 'POST', body }),\n * { logger: voyageLogger }\n * );\n */\nexport async function retryApiCall<T>(\n fn: () => Promise<T>,\n options: Pick<RetryOptions, 'logger' | 'onRetry' | 'maxAttempts'> = {}\n): Promise<T> {\n const result = await withRetry(fn, {\n maxAttempts: options.maxAttempts ?? 3,\n baseDelayMs: 1000,\n maxDelayMs: 10000,\n jitter: 0.2,\n logger: options.logger,\n onRetry: options.onRetry,\n });\n\n return result.data;\n}\n\n/**\n * Retry для критичных операций с более агрессивными параметрами\n *\n * Используется для операций, которые обязательно должны выполниться.\n *\n * @example\n * await retryCritical(\n * () => saveToDatabase(data),\n * { logger }\n * );\n */\nexport async function retryCritical<T>(\n fn: () => Promise<T>,\n options: Pick<RetryOptions, 'logger' | 'onRetry'> = {}\n): Promise<T> {\n const result = await withRetry(fn, {\n maxAttempts: 5,\n baseDelayMs: 500,\n maxDelayMs: 30000,\n jitter: 0.3,\n logger: options.logger,\n onRetry: options.onRetry,\n shouldRetry: () => true, // Повторяем всегда\n });\n\n return result.data;\n}\n\n// ============================================================================\n// Fallback Helpers\n// ============================================================================\n\n/**\n * Опции для withFallback\n */\nexport interface FallbackOptions<T> extends RetryOptions {\n /** Значение по умолчанию при неудаче */\n fallback: T | (() => T);\n /** Не логировать ошибку (используется когда fallback ожидаем) */\n silent?: boolean;\n}\n\n/**\n * Выполнить функцию с retry и fallback значением при неудаче\n *\n * Используется для graceful degradation — когда операция может упасть,\n * но мы хотим продолжить работу с дефолтным значением.\n *\n * @param fn - Асинхронная функция для выполнения\n * @param options - Опции с обязательным fallback\n * @returns Результат выполнения или fallback значение\n *\n * @example\n * // Rerank с fallback на исходные результаты\n * const reranked = await withFallback(\n * () => rerankResults(query, results),\n * {\n * fallback: results,\n * maxAttempts: 2,\n * logger: voyageLogger,\n * }\n * );\n *\n * @example\n * // Получить настройки с fallback на defaults\n * const settings = await withFallback(\n * () => fetchUserSettings(userId),\n * {\n * fallback: () => DEFAULT_SETTINGS,\n * silent: true, // Не логировать, если настройки не найдены\n * }\n * );\n */\nexport async function withFallback<T>(\n fn: () => Promise<T>,\n options: FallbackOptions<T>\n): Promise<T> {\n const { fallback, silent = false, logger, ...retryOptions } = options;\n\n try {\n const result = await withRetry(fn, { ...retryOptions, logger });\n return result.data;\n } catch (error) {\n if (!silent && logger) {\n logger.warn('Операция не удалась, используем fallback', {\n errorMessage: error instanceof Error ? error.message : String(error),\n errorType: error instanceof Error ? error.constructor.name : typeof error,\n });\n }\n\n // Вычисляем fallback значение\n return typeof fallback === 'function' ? (fallback as () => T)() : fallback;\n }\n}\n\n/**\n * Результат операции с информацией об использовании fallback\n */\nexport interface FallbackResult<T> {\n /** Результат (данные или fallback) */\n data: T;\n /** true если использован fallback */\n usedFallback: boolean;\n /** Ошибка, если была */\n error?: Error;\n}\n\n/**\n * Версия withFallback, которая возвращает информацию об использовании fallback\n *\n * Полезно когда нужно знать, пришли ли данные из источника или из fallback.\n *\n * @example\n * const { data, usedFallback } = await withFallbackInfo(\n * () => fetchLiveData(),\n * { fallback: cachedData }\n * );\n *\n * if (usedFallback) {\n * console.log('Показываем кэшированные данные');\n * }\n */\nexport async function withFallbackInfo<T>(\n fn: () => Promise<T>,\n options: FallbackOptions<T>\n): Promise<FallbackResult<T>> {\n const { fallback, silent = false, logger, ...retryOptions } = options;\n\n try {\n const result = await withRetry(fn, { ...retryOptions, logger });\n return {\n data: result.data,\n usedFallback: false,\n };\n } catch (error) {\n if (!silent && logger) {\n logger.warn('Операция не удалась, используем fallback', {\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n }\n\n const fallbackValue = typeof fallback === 'function'\n ? (fallback as () => T)()\n : fallback;\n\n return {\n data: fallbackValue,\n usedFallback: true,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n","/**\n * Zod схемы для валидации API ответов\n *\n * Типобезопасная валидация ответов от внешних API.\n * Гарантирует соответствие данных ожидаемой структуре.\n *\n * @module schemas\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Voyage AI Schemas\n// ============================================================================\n\n/**\n * Схема ответа Voyage Embeddings API\n *\n * @see https://docs.voyageai.com/docs/embeddings\n */\nexport const VoyageEmbeddingResponseSchema = z.object({\n /** Массив эмбеддингов */\n data: z.array(\n z.object({\n /** Вектор эмбеддинга */\n embedding: z.array(z.number()),\n /** Индекс в исходном массиве */\n index: z.number().optional(),\n })\n ),\n /** Статистика использования */\n usage: z.object({\n /** Общее количество токенов */\n total_tokens: z.number(),\n }),\n /** Модель, использованная для генерации */\n model: z.string().optional(),\n});\n\nexport type VoyageEmbeddingResponse = z.infer<typeof VoyageEmbeddingResponseSchema>;\n\n/**\n * Схема ответа Voyage Rerank API\n *\n * @see https://docs.voyageai.com/docs/reranker\n */\nexport const VoyageRerankResponseSchema = z.object({\n /** Массив результатов реранкинга */\n data: z.array(\n z.object({\n /** Индекс документа в исходном массиве */\n index: z.number(),\n /** Оценка релевантности (0-1) */\n relevance_score: z.number().min(0).max(1),\n })\n ),\n /** Статистика использования */\n usage: z.object({\n /** Общее количество токенов */\n total_tokens: z.number(),\n }),\n /** Модель, использованная для реранкинга */\n model: z.string().optional(),\n});\n\nexport type VoyageRerankResponse = z.infer<typeof VoyageRerankResponseSchema>;\n\n// ============================================================================\n// Turbopuffer Schemas\n// ============================================================================\n\n/**\n * Базовая схема атрибутов вектора\n */\nexport const VectorAttributesSchema = z.object({\n /** ID записи в Supabase */\n supabase_id: z.number(),\n /** Уникальный ID сообщения/документа */\n message_id: z.string(),\n /** Тип источника */\n source_type: z.enum(['email', 'pdf', 'website']),\n /** Тип чанка */\n chunk_type: z.string(),\n /** Email отправителя */\n sender: z.string().optional(),\n /** Email получателя */\n recipient: z.string().optional(),\n /** Дата источника */\n source_date: z.string().optional(),\n /** ID цепочки писем */\n thread_id: z.string().optional(),\n /** ID клиента */\n client_id: z.string().optional(),\n /** URL источника */\n source_url: z.string().optional(),\n /** Номер страницы */\n page_number: z.number().optional(),\n /** Заголовок секции */\n section_title: z.string().optional(),\n /** ID в content_sources */\n content_source_id: z.number().optional(),\n /** Тема письма */\n subject: z.string().optional(),\n /** Превью контента */\n content_preview: z.string().optional(),\n /** Заголовок документа */\n title: z.string().optional(),\n /** Полный контент */\n content: z.string().optional(),\n /** Категория */\n category: z.string().optional(),\n /** Тональность */\n sentiment: z.enum(['positive', 'negative', 'neutral']).optional(),\n /** Дата создания */\n created_at: z.string().optional(),\n});\n\nexport type VectorAttributes = z.infer<typeof VectorAttributesSchema>;\n\n/**\n * Схема результата поиска Turbopuffer\n */\nexport const TurbopufferSearchResultSchema = z.object({\n /** ID вектора */\n id: z.string(),\n /** Расстояние до запроса */\n dist: z.number(),\n /** Атрибуты вектора */\n attributes: VectorAttributesSchema.partial(),\n});\n\nexport type TurbopufferSearchResult = z.infer<typeof TurbopufferSearchResultSchema>;\n\n// ============================================================================\n// Anthropic Schemas\n// ============================================================================\n\n/**\n * Схема сообщения в ответе Claude\n */\nexport const ClaudeMessageSchema = z.object({\n /** ID сообщения */\n id: z.string(),\n /** Тип объекта */\n type: z.literal('message'),\n /** Роль */\n role: z.enum(['assistant', 'user']),\n /** Контент */\n content: z.array(\n z.object({\n type: z.enum(['text', 'tool_use']),\n text: z.string().optional(),\n })\n ),\n /** Модель */\n model: z.string(),\n /** Причина остановки */\n stop_reason: z.enum(['end_turn', 'max_tokens', 'stop_sequence', 'tool_use']).nullable(),\n /** Использование токенов */\n usage: z.object({\n input_tokens: z.number(),\n output_tokens: z.number(),\n }),\n});\n\nexport type ClaudeMessage = z.infer<typeof ClaudeMessageSchema>;\n\n// ============================================================================\n// Chat API Schemas\n// ============================================================================\n\n/**\n * Схема входящего запроса к Chat API\n */\nexport const ChatRequestSchema = z.object({\n /** Сообщение пользователя */\n message: z.string().min(1).max(10000),\n /** История сообщений */\n history: z\n .array(\n z.object({\n role: z.enum(['user', 'assistant']),\n content: z.string(),\n })\n )\n .optional()\n .default([]),\n /** ID сессии */\n sessionId: z.string().optional(),\n /** Режим (customer/internal) */\n mode: z.enum(['customer', 'internal']).optional().default('customer'),\n});\n\nexport type ChatRequest = z.infer<typeof ChatRequestSchema>;\n\n/**\n * Схема источника в ответе\n */\nexport const SourceSchema = z.object({\n /** Тип источника */\n type: z.enum(['email', 'pdf', 'website']),\n /** Заголовок */\n title: z.string(),\n /** URL или идентификатор */\n url: z.string().optional(),\n /** Превью контента */\n preview: z.string().optional(),\n /** Оценка релевантности */\n relevance: z.number().optional(),\n});\n\nexport type Source = z.infer<typeof SourceSchema>;\n\n// ============================================================================\n// Утилиты для валидации\n// ============================================================================\n\n/**\n * Безопасно распарсить данные по схеме\n *\n * @param schema - Zod схема\n * @param data - Данные для валидации\n * @returns Результат парсинга или null при ошибке\n *\n * @example\n * const response = await fetch(url);\n * const data = await response.json();\n * const parsed = safeParse(VoyageEmbeddingResponseSchema, data);\n * if (!parsed) throw new ValidationError('Invalid API response');\n */\nexport function safeParse<T>(\n schema: z.ZodType<T>,\n data: unknown\n): T | null {\n const result = schema.safeParse(data);\n return result.success ? result.data : null;\n}\n\n/**\n * Распарсить данные по схеме с выбросом ошибки\n *\n * @param schema - Zod схема\n * @param data - Данные для валидации\n * @param errorMessage - Сообщение об ошибке\n * @returns Валидные данные\n * @throws Error при невалидных данных\n */\nexport function parseOrThrow<T>(\n schema: z.ZodType<T>,\n data: unknown,\n errorMessage = 'Validation failed'\n): T {\n const result = schema.safeParse(data);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => `${i.path.join('.')}: ${i.message}`)\n .join('; ');\n throw new Error(`${errorMessage}: ${issues}`);\n }\n return result.data;\n}\n","/**\n * Стандартизированные типы API ответов\n *\n * Обеспечивает единый формат для всех API endpoints.\n *\n * @module api-response\n */\n\n// ============================================================================\n// Типы\n// ============================================================================\n\n/**\n * Успешный ответ API\n */\nexport interface ApiSuccessResponse<T> {\n success: true;\n data: T;\n meta?: {\n requestId?: string;\n timestamp?: string;\n duration_ms?: number;\n pagination?: PaginationMeta;\n };\n}\n\n/**\n * Ответ API с ошибкой\n */\nexport interface ApiErrorResponse {\n success: false;\n error: {\n code: string;\n message: string;\n details?: unknown;\n };\n meta?: {\n requestId?: string;\n timestamp?: string;\n };\n}\n\n/**\n * Объединённый тип ответа API\n */\nexport type ApiResponse<T> = ApiSuccessResponse<T> | ApiErrorResponse;\n\n/**\n * Метаданные пагинации\n */\nexport interface PaginationMeta {\n page: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n hasMore: boolean;\n}\n\n// ============================================================================\n// Хелперы для создания ответов\n// ============================================================================\n\n/**\n * Создать успешный ответ\n *\n * @example\n * return Response.json(success(users, { pagination }));\n */\nexport function success<T>(\n data: T,\n meta?: ApiSuccessResponse<T>['meta']\n): ApiSuccessResponse<T> {\n return {\n success: true,\n data,\n meta: {\n timestamp: new Date().toISOString(),\n ...meta,\n },\n };\n}\n\n/**\n * Создать ответ с ошибкой\n *\n * @example\n * return Response.json(error('NOT_FOUND', 'User not found'), { status: 404 });\n */\nexport function error(\n code: string,\n message: string,\n details?: unknown,\n requestId?: string\n): ApiErrorResponse {\n const errorObj: ApiErrorResponse['error'] = { code, message };\n if (details !== undefined) {\n errorObj.details = details;\n }\n\n const meta: ApiErrorResponse['meta'] = {\n timestamp: new Date().toISOString(),\n };\n if (requestId) {\n meta.requestId = requestId;\n }\n\n return {\n success: false,\n error: errorObj,\n meta,\n };\n}\n\n/**\n * Создать метаданные пагинации\n *\n * @example\n * const pagination = paginate(1, 20, 100);\n * // { page: 1, pageSize: 20, totalItems: 100, totalPages: 5, hasMore: true }\n */\nexport function paginate(\n page: number,\n pageSize: number,\n totalItems: number\n): PaginationMeta {\n const totalPages = Math.ceil(totalItems / pageSize);\n return {\n page,\n pageSize,\n totalItems,\n totalPages,\n hasMore: page < totalPages,\n };\n}\n\n// ============================================================================\n// Типы для списков\n// ============================================================================\n\n/**\n * Ответ со списком и пагинацией\n */\nexport interface ListResponse<T> {\n items: T[];\n pagination: PaginationMeta;\n}\n\n/**\n * Создать ответ со списком\n *\n * @example\n * return Response.json(success(list(users, 1, 20, 100)));\n */\nexport function list<T>(\n items: T[],\n page: number,\n pageSize: number,\n totalItems: number\n): ListResponse<T> {\n return {\n items,\n pagination: paginate(page, pageSize, totalItems),\n };\n}\n\n// ============================================================================\n// Типы общих ошибок\n// ============================================================================\n\nexport const ErrorCodes = {\n // Client errors (4xx)\n BAD_REQUEST: 'BAD_REQUEST',\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n NOT_FOUND: 'NOT_FOUND',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n RATE_LIMITED: 'RATE_LIMITED',\n\n // Server errors (5xx)\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE',\n EXTERNAL_API_ERROR: 'EXTERNAL_API_ERROR',\n DATABASE_ERROR: 'DATABASE_ERROR',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -120,21 +120,21 @@ var ConfigError = class extends AppError {
|
|
|
120
120
|
function isRetryableStatus(statusCode) {
|
|
121
121
|
return [408, 429, 500, 502, 503, 504].includes(statusCode);
|
|
122
122
|
}
|
|
123
|
-
function isAppError(
|
|
124
|
-
return
|
|
123
|
+
function isAppError(error2) {
|
|
124
|
+
return error2 instanceof AppError;
|
|
125
125
|
}
|
|
126
|
-
function wrapError(
|
|
127
|
-
if (
|
|
128
|
-
return
|
|
129
|
-
}
|
|
130
|
-
if (
|
|
131
|
-
return new AppError(
|
|
132
|
-
cause:
|
|
133
|
-
context: { originalName:
|
|
126
|
+
function wrapError(error2, defaultMessage = "\u041D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430") {
|
|
127
|
+
if (error2 instanceof AppError) {
|
|
128
|
+
return error2;
|
|
129
|
+
}
|
|
130
|
+
if (error2 instanceof Error) {
|
|
131
|
+
return new AppError(error2.message || defaultMessage, {
|
|
132
|
+
cause: error2,
|
|
133
|
+
context: { originalName: error2.name }
|
|
134
134
|
});
|
|
135
135
|
}
|
|
136
136
|
return new AppError(defaultMessage, {
|
|
137
|
-
context: { originalError:
|
|
137
|
+
context: { originalError: error2 }
|
|
138
138
|
});
|
|
139
139
|
}
|
|
140
140
|
|
|
@@ -187,11 +187,11 @@ function formatLogEntry(entry) {
|
|
|
187
187
|
}
|
|
188
188
|
return JSON.stringify(entry);
|
|
189
189
|
}
|
|
190
|
-
function serializeError(
|
|
190
|
+
function serializeError(error2) {
|
|
191
191
|
return {
|
|
192
|
-
name:
|
|
193
|
-
message:
|
|
194
|
-
stack:
|
|
192
|
+
name: error2.name,
|
|
193
|
+
message: error2.message,
|
|
194
|
+
stack: error2.stack
|
|
195
195
|
};
|
|
196
196
|
}
|
|
197
197
|
var Logger = class {
|
|
@@ -210,7 +210,7 @@ var Logger = class {
|
|
|
210
210
|
/**
|
|
211
211
|
* Записать лог
|
|
212
212
|
*/
|
|
213
|
-
log(level, message, meta,
|
|
213
|
+
log(level, message, meta, error2) {
|
|
214
214
|
if (!this.isEnabled(level)) return;
|
|
215
215
|
const entry = {
|
|
216
216
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -218,8 +218,8 @@ var Logger = class {
|
|
|
218
218
|
message,
|
|
219
219
|
meta: { module: this.module, ...meta }
|
|
220
220
|
};
|
|
221
|
-
if (
|
|
222
|
-
entry.error = serializeError(
|
|
221
|
+
if (error2) {
|
|
222
|
+
entry.error = serializeError(error2);
|
|
223
223
|
}
|
|
224
224
|
const formatted = formatLogEntry(entry);
|
|
225
225
|
switch (level) {
|
|
@@ -254,8 +254,8 @@ var Logger = class {
|
|
|
254
254
|
/**
|
|
255
255
|
* Error уровень — ошибки
|
|
256
256
|
*/
|
|
257
|
-
error(message,
|
|
258
|
-
const err =
|
|
257
|
+
error(message, error2, meta) {
|
|
258
|
+
const err = error2 instanceof Error ? error2 : void 0;
|
|
259
259
|
this.log("error", message, meta, err);
|
|
260
260
|
}
|
|
261
261
|
/**
|
|
@@ -279,8 +279,8 @@ var ChildLogger = class {
|
|
|
279
279
|
warn(message, meta) {
|
|
280
280
|
this.parent.warn(message, { ...this.context, ...meta });
|
|
281
281
|
}
|
|
282
|
-
error(message,
|
|
283
|
-
this.parent.error(message,
|
|
282
|
+
error(message, error2, meta) {
|
|
283
|
+
this.parent.error(message, error2, { ...this.context, ...meta });
|
|
284
284
|
}
|
|
285
285
|
};
|
|
286
286
|
var voyageLogger = new Logger("voyage");
|
|
@@ -307,12 +307,12 @@ function calculateDelay(attempt, baseDelayMs, maxDelayMs, jitter) {
|
|
|
307
307
|
const jitterAmount = cappedDelay * jitter * Math.random();
|
|
308
308
|
return Math.round(cappedDelay + jitterAmount);
|
|
309
309
|
}
|
|
310
|
-
function defaultShouldRetry(
|
|
311
|
-
if (isAppError(
|
|
310
|
+
function defaultShouldRetry(error2) {
|
|
311
|
+
if (isAppError(error2) && error2.retryable) {
|
|
312
312
|
return true;
|
|
313
313
|
}
|
|
314
|
-
if (
|
|
315
|
-
const message =
|
|
314
|
+
if (error2 instanceof Error) {
|
|
315
|
+
const message = error2.message.toLowerCase();
|
|
316
316
|
const networkErrors = [
|
|
317
317
|
"fetch failed",
|
|
318
318
|
"network error",
|
|
@@ -345,24 +345,24 @@ async function withRetry(fn, options = {}) {
|
|
|
345
345
|
attempts: attempt,
|
|
346
346
|
totalTimeMs: Math.round(performance.now() - startTime)
|
|
347
347
|
};
|
|
348
|
-
} catch (
|
|
349
|
-
lastError =
|
|
348
|
+
} catch (error2) {
|
|
349
|
+
lastError = error2;
|
|
350
350
|
if (attempt >= maxAttempts) {
|
|
351
|
-
logger2?.error(`\u0412\u0441\u0435 ${maxAttempts} \u043F\u043E\u043F\u044B\u0442\u043E\u043A \u0438\u0441\u0447\u0435\u0440\u043F\u0430\u043D\u044B`,
|
|
351
|
+
logger2?.error(`\u0412\u0441\u0435 ${maxAttempts} \u043F\u043E\u043F\u044B\u0442\u043E\u043A \u0438\u0441\u0447\u0435\u0440\u043F\u0430\u043D\u044B`, error2);
|
|
352
352
|
break;
|
|
353
353
|
}
|
|
354
|
-
if (!shouldRetry(
|
|
354
|
+
if (!shouldRetry(error2, attempt)) {
|
|
355
355
|
logger2?.warn(`\u041E\u0448\u0438\u0431\u043A\u0430 \u043D\u0435 \u043F\u043E\u0434\u043B\u0435\u0436\u0438\u0442 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044E \u043D\u0430 \u043F\u043E\u043F\u044B\u0442\u043A\u0435 ${attempt}`, {
|
|
356
|
-
errorMessage:
|
|
356
|
+
errorMessage: error2 instanceof Error ? error2.message : String(error2)
|
|
357
357
|
});
|
|
358
358
|
break;
|
|
359
359
|
}
|
|
360
360
|
const delayMs = calculateDelay(attempt, baseDelayMs, maxDelayMs, jitter);
|
|
361
361
|
logger2?.info(`\u041F\u043E\u043F\u044B\u0442\u043A\u0430 ${attempt}/${maxAttempts} \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C, \u043F\u043E\u0432\u0442\u043E\u0440 \u0447\u0435\u0440\u0435\u0437 ${delayMs}\u043C\u0441`, {
|
|
362
|
-
errorMessage:
|
|
362
|
+
errorMessage: error2 instanceof Error ? error2.message : String(error2),
|
|
363
363
|
delayMs
|
|
364
364
|
});
|
|
365
|
-
onRetry?.(
|
|
365
|
+
onRetry?.(error2, attempt, delayMs);
|
|
366
366
|
await sleep(delayMs);
|
|
367
367
|
}
|
|
368
368
|
}
|
|
@@ -392,6 +392,43 @@ async function retryCritical(fn, options = {}) {
|
|
|
392
392
|
});
|
|
393
393
|
return result.data;
|
|
394
394
|
}
|
|
395
|
+
async function withFallback(fn, options) {
|
|
396
|
+
const { fallback, silent = false, logger: logger2, ...retryOptions } = options;
|
|
397
|
+
try {
|
|
398
|
+
const result = await withRetry(fn, { ...retryOptions, logger: logger2 });
|
|
399
|
+
return result.data;
|
|
400
|
+
} catch (error2) {
|
|
401
|
+
if (!silent && logger2) {
|
|
402
|
+
logger2.warn("\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C fallback", {
|
|
403
|
+
errorMessage: error2 instanceof Error ? error2.message : String(error2),
|
|
404
|
+
errorType: error2 instanceof Error ? error2.constructor.name : typeof error2
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
return typeof fallback === "function" ? fallback() : fallback;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
async function withFallbackInfo(fn, options) {
|
|
411
|
+
const { fallback, silent = false, logger: logger2, ...retryOptions } = options;
|
|
412
|
+
try {
|
|
413
|
+
const result = await withRetry(fn, { ...retryOptions, logger: logger2 });
|
|
414
|
+
return {
|
|
415
|
+
data: result.data,
|
|
416
|
+
usedFallback: false
|
|
417
|
+
};
|
|
418
|
+
} catch (error2) {
|
|
419
|
+
if (!silent && logger2) {
|
|
420
|
+
logger2.warn("\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C fallback", {
|
|
421
|
+
errorMessage: error2 instanceof Error ? error2.message : String(error2)
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
const fallbackValue = typeof fallback === "function" ? fallback() : fallback;
|
|
425
|
+
return {
|
|
426
|
+
data: fallbackValue,
|
|
427
|
+
usedFallback: true,
|
|
428
|
+
error: error2 instanceof Error ? error2 : new Error(String(error2))
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
}
|
|
395
432
|
var VoyageEmbeddingResponseSchema = z.object({
|
|
396
433
|
/** Массив эмбеддингов */
|
|
397
434
|
data: z.array(
|
|
@@ -542,6 +579,65 @@ function parseOrThrow(schema, data, errorMessage = "Validation failed") {
|
|
|
542
579
|
return result.data;
|
|
543
580
|
}
|
|
544
581
|
|
|
545
|
-
|
|
582
|
+
// src/api-response.ts
|
|
583
|
+
function success(data, meta) {
|
|
584
|
+
return {
|
|
585
|
+
success: true,
|
|
586
|
+
data,
|
|
587
|
+
meta: {
|
|
588
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
589
|
+
...meta
|
|
590
|
+
}
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
function error(code, message, details, requestId) {
|
|
594
|
+
const errorObj = { code, message };
|
|
595
|
+
if (details !== void 0) {
|
|
596
|
+
errorObj.details = details;
|
|
597
|
+
}
|
|
598
|
+
const meta = {
|
|
599
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
600
|
+
};
|
|
601
|
+
if (requestId) {
|
|
602
|
+
meta.requestId = requestId;
|
|
603
|
+
}
|
|
604
|
+
return {
|
|
605
|
+
success: false,
|
|
606
|
+
error: errorObj,
|
|
607
|
+
meta
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
function paginate(page, pageSize, totalItems) {
|
|
611
|
+
const totalPages = Math.ceil(totalItems / pageSize);
|
|
612
|
+
return {
|
|
613
|
+
page,
|
|
614
|
+
pageSize,
|
|
615
|
+
totalItems,
|
|
616
|
+
totalPages,
|
|
617
|
+
hasMore: page < totalPages
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
function list(items, page, pageSize, totalItems) {
|
|
621
|
+
return {
|
|
622
|
+
items,
|
|
623
|
+
pagination: paginate(page, pageSize, totalItems)
|
|
624
|
+
};
|
|
625
|
+
}
|
|
626
|
+
var ErrorCodes = {
|
|
627
|
+
// Client errors (4xx)
|
|
628
|
+
BAD_REQUEST: "BAD_REQUEST",
|
|
629
|
+
UNAUTHORIZED: "UNAUTHORIZED",
|
|
630
|
+
FORBIDDEN: "FORBIDDEN",
|
|
631
|
+
NOT_FOUND: "NOT_FOUND",
|
|
632
|
+
VALIDATION_ERROR: "VALIDATION_ERROR",
|
|
633
|
+
RATE_LIMITED: "RATE_LIMITED",
|
|
634
|
+
// Server errors (5xx)
|
|
635
|
+
INTERNAL_ERROR: "INTERNAL_ERROR",
|
|
636
|
+
SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE",
|
|
637
|
+
EXTERNAL_API_ERROR: "EXTERNAL_API_ERROR",
|
|
638
|
+
DATABASE_ERROR: "DATABASE_ERROR"
|
|
639
|
+
};
|
|
640
|
+
|
|
641
|
+
export { AnthropicApiError, ApiError, AppError, ChatRequestSchema, ClaudeMessageSchema, ConfigError, ErrorCodes, Logger, SourceSchema, TurbopufferApiError, TurbopufferSearchResultSchema, ValidationError, VectorAttributesSchema, VoyageApiError, VoyageEmbeddingResponseSchema, VoyageRerankResponseSchema, anthropicLogger, apiLogger, createTimer, error, isAppError, list, logger, paginate, parseOrThrow, retryApiCall, retryCritical, safeParse, sleep, success, turbopufferLogger, voyageLogger, withFallback, withFallbackInfo, withRetry, wrapError };
|
|
546
642
|
//# sourceMappingURL=index.mjs.map
|
|
547
643
|
//# sourceMappingURL=index.mjs.map
|