@flare-ai-sdk/server 1.0.1 → 1.0.2

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/errors.ts","../src/utils/metrics.ts","../src/utils/rate-limiter.ts","../src/utils/request-queue.ts","../src/utils/retry.ts","../src/utils/circuit-breaker.ts","../src/providers/base.ts","../src/providers/anthropic/anthropic.ts","../src/providers/custom-base.ts","../src/providers/custom/custom.ts","../src/providers/google/google.ts","../src/providers/openai/openai.ts","../src/providers/sarvam/sarvam.ts","../src/providers/factory.ts","../src/stream/stream-reader.ts","../src/stream/stream-client.ts"],"sourcesContent":["\r\nexport * from \"./types\"\r\nexport * from \"./utils/errors\"\r\nexport * from \"./utils/metrics\"\r\nexport * from \"./utils/rate-limiter\"\r\nexport * from \"./utils/request-queue\"\r\nexport * from \"./utils/retry\"\r\nexport * from \"./utils/circuit-breaker\"\r\nexport * from \"./utils/errors\"\r\nexport * from \"./providers\"\r\nexport * from \"./stream/stream-reader\"\r\nexport * from \"./stream/stream-client\"","/**\r\n * Custom error classes for paprflare-kit\r\n * @module errors\r\n */\r\n\r\n/**\r\n * Base error class for all paprflare-kit errors\r\n */\r\nexport class FlareError extends Error {\r\n public readonly code: string;\r\n public readonly statusCode?: number;\r\n public readonly retryable: boolean;\r\n public readonly details?: Record<string, any>;\r\n\r\n constructor(\r\n message: string,\r\n code: string,\r\n statusCode?: number,\r\n retryable = false,\r\n details?: Record<string, any>\r\n ) {\r\n super(message);\r\n this.name = 'FlareError';\r\n this.code = code;\r\n this.statusCode = statusCode;\r\n this.retryable = retryable;\r\n this.details = details;\r\n Error.captureStackTrace(this, this.constructor);\r\n }\r\n}\r\n\r\n/**\r\n * Network-related errors\r\n */\r\nexport class NetworkError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'NETWORK_ERROR', undefined, true, details);\r\n this.name = 'NetworkError';\r\n }\r\n}\r\n\r\n/**\r\n * Timeout errors\r\n */\r\nexport class TimeoutError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'TIMEOUT_ERROR', 408, true, details);\r\n this.name = 'TimeoutError';\r\n }\r\n}\r\n\r\n/**\r\n * Rate limit exceeded errors\r\n */\r\nexport class RateLimitError extends FlareError {\r\n public readonly retryAfter?: number;\r\n\r\n constructor(message: string, retryAfter?: number, details?: Record<string, any>) {\r\n super(message, 'RATE_LIMIT_ERROR', 429, true, details);\r\n this.name = 'RateLimitError';\r\n this.retryAfter = retryAfter;\r\n }\r\n}\r\n\r\n/**\r\n * Authentication/authorization errors\r\n */\r\nexport class AuthenticationError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'AUTHENTICATION_ERROR', 401, false, details);\r\n this.name = 'AuthenticationError';\r\n }\r\n}\r\n\r\n/**\r\n * Invalid request errors\r\n */\r\nexport class ValidationError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'VALIDATION_ERROR', 400, false, details);\r\n this.name = 'ValidationError';\r\n }\r\n}\r\n\r\n/**\r\n * Circuit breaker open errors\r\n */\r\nexport class CircuitBreakerError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'CIRCUIT_BREAKER_OPEN', 503, true, details);\r\n this.name = 'CircuitBreakerError';\r\n }\r\n}\r\n\r\n/**\r\n * Provider-specific errors\r\n */\r\nexport class ProviderError extends FlareError {\r\n public readonly provider: string;\r\n\r\n constructor(provider: string, message: string, statusCode?: number, details?: Record<string, any>) {\r\n super(message, 'PROVIDER_ERROR', statusCode, true, details);\r\n this.name = 'ProviderError';\r\n this.provider = provider;\r\n }\r\n}\r\n\r\n/**\r\n * Streaming errors\r\n */\r\nexport class StreamError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'STREAM_ERROR', undefined, false, details);\r\n this.name = 'StreamError';\r\n }\r\n}\r\n\r\n/**\r\n * Parse/validation errors for structured output\r\n */\r\nexport class ParseError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'PARSE_ERROR', undefined, false, details);\r\n this.name = 'ParseError';\r\n }\r\n}\r\n\r\n/**\r\n * Content filter errors\r\n */\r\nexport class ContentFilterError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'CONTENT_FILTER_ERROR', 400, false, details);\r\n this.name = 'ContentFilterError';\r\n }\r\n}\r\n\r\n/**\r\n * Check if an error is retryable\r\n */\r\nexport function isRetryableError(error: Error): boolean {\r\n if (error instanceof FlareError) {\r\n return error.retryable;\r\n }\r\n\r\n // Network errors are generally retryable\r\n if (error.message.includes('ECONNREFUSED') ||\r\n error.message.includes('ETIMEDOUT') ||\r\n error.message.includes('ENOTFOUND')) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Extract status code from error\r\n */\r\nexport function getErrorStatusCode(error: Error): number | undefined {\r\n if (error instanceof FlareError) {\r\n return error.statusCode;\r\n }\r\n return undefined;\r\n}","/**\r\n * Metrics collection and reporting\r\n * @module metrics\r\n */\r\n\r\nimport { MetricsData } from '../types';\r\n\r\n/**\r\n * Latency histogram for percentile calculation\r\n */\r\nclass LatencyHistogram {\r\n private samples: number[] = [];\r\n private maxSamples = 1000;\r\n\r\n add(latency: number): void {\r\n this.samples.push(latency);\r\n if (this.samples.length > this.maxSamples) {\r\n this.samples.shift();\r\n }\r\n }\r\n\r\n getPercentile(p: number): number {\r\n if (this.samples.length === 0) return 0;\r\n\r\n const sorted = [...this.samples].sort((a, b) => a - b);\r\n const index = Math.ceil((p / 100) * sorted.length) - 1;\r\n return sorted[Math.max(0, index)];\r\n }\r\n\r\n getAverage(): number {\r\n if (this.samples.length === 0) return 0;\r\n return this.samples.reduce((a, b) => a + b, 0) / this.samples.length;\r\n }\r\n\r\n clear(): void {\r\n this.samples = [];\r\n }\r\n}\r\n\r\n/**\r\n * Metrics collector for monitoring SDK performance\r\n * \r\n * @example\r\n * ```typescript\r\n * const metrics = new MetricsCollector();\r\n * \r\n * const start = Date.now();\r\n * try {\r\n * await doRequest();\r\n * metrics.recordSuccess(Date.now() - start);\r\n * } catch (error) {\r\n * metrics.recordFailure(Date.now() - start);\r\n * }\r\n * \r\n * console.log(metrics.getMetrics());\r\n * ```\r\n */\r\nexport class MetricsCollector {\r\n private totalRequests = 0;\r\n private successfulRequests = 0;\r\n private failedRequests = 0;\r\n private latencyHistogram = new LatencyHistogram();\r\n private startTime = Date.now();\r\n private windowStart = Date.now();\r\n private windowRequests = 0;\r\n private windowDuration = 60000; // 1 minute window\r\n\r\n /**\r\n * Record successful request\r\n * @param latency - Request latency in milliseconds\r\n */\r\n recordSuccess(latency: number): void {\r\n this.totalRequests++;\r\n this.successfulRequests++;\r\n this.latencyHistogram.add(latency);\r\n this.updateWindow();\r\n }\r\n\r\n /**\r\n * Record failed request\r\n * @param latency - Request latency in milliseconds\r\n */\r\n recordFailure(latency: number): void {\r\n this.totalRequests++;\r\n this.failedRequests++;\r\n this.latencyHistogram.add(latency);\r\n this.updateWindow();\r\n }\r\n\r\n /**\r\n * Update rolling window for RPS calculation\r\n */\r\n private updateWindow(): void {\r\n const now = Date.now();\r\n if (now - this.windowStart >= this.windowDuration) {\r\n this.windowRequests = 0;\r\n this.windowStart = now;\r\n }\r\n this.windowRequests++;\r\n }\r\n\r\n /**\r\n * Get current metrics\r\n */\r\n getMetrics(): MetricsData {\r\n const elapsed = (Date.now() - this.windowStart) / 1000;\r\n const rps = elapsed > 0 ? this.windowRequests / elapsed : 0;\r\n\r\n return {\r\n totalRequests: this.totalRequests,\r\n successfulRequests: this.successfulRequests,\r\n failedRequests: this.failedRequests,\r\n avgLatency: this.latencyHistogram.getAverage(),\r\n p95Latency: this.latencyHistogram.getPercentile(95),\r\n p99Latency: this.latencyHistogram.getPercentile(99),\r\n rps,\r\n };\r\n }\r\n\r\n /**\r\n * Get success rate as percentage\r\n */\r\n getSuccessRate(): number {\r\n if (this.totalRequests === 0) return 100;\r\n return (this.successfulRequests / this.totalRequests) * 100;\r\n }\r\n\r\n /**\r\n * Get uptime in milliseconds\r\n */\r\n getUptime(): number {\r\n return Date.now() - this.startTime;\r\n }\r\n\r\n /**\r\n * Reset all metrics\r\n */\r\n reset(): void {\r\n this.totalRequests = 0;\r\n this.successfulRequests = 0;\r\n this.failedRequests = 0;\r\n this.latencyHistogram.clear();\r\n this.windowStart = Date.now();\r\n this.windowRequests = 0;\r\n }\r\n\r\n /**\r\n * Get detailed statistics\r\n */\r\n getDetailedStats() {\r\n return {\r\n ...this.getMetrics(),\r\n successRate: this.getSuccessRate(),\r\n uptime: this.getUptime(),\r\n timestamp: Date.now(),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Global metrics collector instance\r\n */\r\nlet globalMetrics: MetricsCollector | null = null;\r\n\r\n/**\r\n * Get or create global metrics collector\r\n */\r\nexport function getGlobalMetrics(): MetricsCollector {\r\n if (!globalMetrics) {\r\n globalMetrics = new MetricsCollector();\r\n }\r\n return globalMetrics;\r\n}\r\n\r\n/**\r\n * Create a new metrics collector\r\n */\r\nexport function createMetricsCollector(): MetricsCollector {\r\n return new MetricsCollector();\r\n}\r\n\r\n/**\r\n * Measure function execution time and record metrics\r\n * @param fn - Function to measure\r\n * @param collector - Metrics collector (defaults to global)\r\n * @returns Function result\r\n */\r\nexport async function measureLatency<T>(\r\n fn: () => Promise<T>,\r\n collector: MetricsCollector = getGlobalMetrics()\r\n): Promise<T> {\r\n const start = Date.now();\r\n try {\r\n const result = await fn();\r\n collector.recordSuccess(Date.now() - start);\r\n return result;\r\n } catch (error) {\r\n collector.recordFailure(Date.now() - start);\r\n throw error;\r\n }\r\n}","/**\r\n * Rate limiter implementation\r\n * @module rateLimiter\r\n */\r\n\r\nimport { RateLimitConfig } from '../types';\r\nimport { RateLimitError } from './errors';\r\n\r\n/**\r\n * Token bucket for rate limiting\r\n */\r\ninterface TokenBucket {\r\n tokens: number;\r\n lastRefill: number;\r\n}\r\n\r\n/**\r\n * Default rate limit configuration\r\n */\r\nconst DEFAULT_CONFIG: Required<RateLimitConfig> = {\r\n maxRequests: 100,\r\n windowMs: 60000, // 1 minute\r\n clientId: 'default',\r\n};\r\n\r\n/**\r\n * Token bucket rate limiter\r\n * Implements sliding window algorithm for smooth rate limiting\r\n * \r\n * @example\r\n * ```typescript\r\n * const limiter = new RateLimiter({ maxRequests: 10, windowMs: 1000 });\r\n * \r\n * try {\r\n * await limiter.acquire('user-123');\r\n * // Request allowed\r\n * } catch (error) {\r\n * // Rate limit exceeded\r\n * }\r\n * ```\r\n */\r\nexport class RateLimiter {\r\n private buckets = new Map<string, TokenBucket>();\r\n private config: Required<RateLimitConfig>;\r\n private cleanupInterval?: NodeJS.Timeout;\r\n\r\n constructor(config: Partial<RateLimitConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n this.startCleanup();\r\n }\r\n\r\n /**\r\n * Acquire a token for rate limiting\r\n * @param clientId - Client identifier\r\n * @throws RateLimitError if rate limit exceeded\r\n */\r\n async acquire(clientId?: string): Promise<void> {\r\n const id = clientId || this.config.clientId;\r\n const bucket = this.getBucket(id);\r\n\r\n this.refillBucket(bucket);\r\n\r\n if (bucket.tokens <= 0) {\r\n const retryAfter = this.calculateRetryAfter(bucket);\r\n throw new RateLimitError(\r\n `Rate limit exceeded. Try again in ${Math.ceil(retryAfter / 1000)}s`,\r\n retryAfter,\r\n { clientId: id, limit: this.config.maxRequests, window: this.config.windowMs }\r\n );\r\n }\r\n\r\n bucket.tokens--;\r\n }\r\n\r\n /**\r\n * Check if request would be allowed without consuming token\r\n * @param clientId - Client identifier\r\n * @returns true if request would be allowed\r\n */\r\n check(clientId?: string): boolean {\r\n const id = clientId || this.config.clientId;\r\n const bucket = this.getBucket(id);\r\n this.refillBucket(bucket);\r\n return bucket.tokens > 0;\r\n }\r\n\r\n /**\r\n * Get remaining tokens for client\r\n * @param clientId - Client identifier\r\n * @returns Number of remaining requests\r\n */\r\n getRemaining(clientId?: string): number {\r\n const id = clientId || this.config.clientId;\r\n const bucket = this.getBucket(id);\r\n this.refillBucket(bucket);\r\n return Math.floor(bucket.tokens);\r\n }\r\n\r\n /**\r\n * Reset rate limit for client\r\n * @param clientId - Client identifier\r\n */\r\n reset(clientId?: string): void {\r\n const id = clientId || this.config.clientId;\r\n this.buckets.delete(id);\r\n }\r\n\r\n /**\r\n * Get or create bucket for client\r\n */\r\n private getBucket(clientId: string): TokenBucket {\r\n let bucket = this.buckets.get(clientId);\r\n\r\n if (!bucket) {\r\n bucket = {\r\n tokens: this.config.maxRequests,\r\n lastRefill: Date.now(),\r\n };\r\n this.buckets.set(clientId, bucket);\r\n }\r\n\r\n return bucket;\r\n }\r\n\r\n /**\r\n * Refill tokens based on elapsed time\r\n */\r\n private refillBucket(bucket: TokenBucket): void {\r\n const now = Date.now();\r\n const elapsed = now - bucket.lastRefill;\r\n\r\n if (elapsed <= 0) return;\r\n\r\n // Calculate tokens to add based on elapsed time\r\n const tokensToAdd = (elapsed / this.config.windowMs) * this.config.maxRequests;\r\n bucket.tokens = Math.min(this.config.maxRequests, bucket.tokens + tokensToAdd);\r\n bucket.lastRefill = now;\r\n }\r\n\r\n /**\r\n * Calculate retry-after time in milliseconds\r\n */\r\n private calculateRetryAfter(bucket: TokenBucket): number {\r\n const tokensNeeded = 1 - bucket.tokens;\r\n return (tokensNeeded / this.config.maxRequests) * this.config.windowMs;\r\n }\r\n\r\n /**\r\n * Start periodic cleanup of old buckets\r\n */\r\n private startCleanup(): void {\r\n this.cleanupInterval = setInterval(() => {\r\n const now = Date.now();\r\n const maxAge = this.config.windowMs * 2;\r\n\r\n for (const [clientId, bucket] of this.buckets.entries()) {\r\n if (now - bucket.lastRefill > maxAge) {\r\n this.buckets.delete(clientId);\r\n }\r\n }\r\n }, this.config.windowMs);\r\n\r\n // Prevent cleanup interval from keeping process alive\r\n if (this.cleanupInterval.unref) {\r\n this.cleanupInterval.unref();\r\n }\r\n }\r\n\r\n /**\r\n * Get statistics for monitoring\r\n */\r\n getStats() {\r\n return {\r\n totalClients: this.buckets.size,\r\n config: this.config,\r\n };\r\n }\r\n\r\n /**\r\n * Clean up resources\r\n */\r\n destroy(): void {\r\n if (this.cleanupInterval) {\r\n clearInterval(this.cleanupInterval);\r\n }\r\n this.buckets.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Create a rate limiter instance\r\n * @param config - Rate limit configuration\r\n * @returns RateLimiter instance\r\n */\r\nexport function createRateLimiter(config?: Partial<RateLimitConfig>): RateLimiter {\r\n return new RateLimiter(config);\r\n}","/**\r\n * Request queue with priority handling\r\n * @module requestQueue\r\n */\r\n\r\nimport EventEmitter from 'eventemitter3';\r\n\r\n/**\r\n * Queue item with priority and callbacks\r\n */\r\ninterface QueueItem<T> {\r\n id: string;\r\n priority: number;\r\n fn: () => Promise<T>;\r\n resolve: (value: T) => void;\r\n reject: (error: Error) => void;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Queue configuration\r\n */\r\nexport interface QueueConfig {\r\n /** Maximum concurrent requests */\r\n concurrency?: number;\r\n /** Maximum queue size */\r\n maxQueueSize?: number;\r\n /** Request timeout in ms */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * Default queue configuration\r\n */\r\nconst DEFAULT_CONFIG: Required<QueueConfig> = {\r\n concurrency: 10,\r\n maxQueueSize: 1000,\r\n timeout: 30000,\r\n};\r\n\r\n/**\r\n * Priority queue for managing concurrent requests\r\n * Higher priority items are processed first\r\n * \r\n * @example\r\n * ```typescript\r\n * const queue = new RequestQueue({ concurrency: 5 });\r\n * \r\n * queue.on('drain', () => console.log('Queue empty'));\r\n * \r\n * const result = await queue.add(\r\n * async () => fetchData(),\r\n * { priority: 10 }\r\n * );\r\n * ```\r\n */\r\nexport class RequestQueue extends EventEmitter {\r\n private queue: QueueItem<any>[] = [];\r\n private running = 0;\r\n private config: Required<QueueConfig>;\r\n private requestCounter = 0;\r\n\r\n constructor(config: Partial<QueueConfig> = {}) {\r\n super();\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Add request to queue\r\n * @param fn - Async function to execute\r\n * @param priority - Request priority (higher = processed first)\r\n * @returns Promise resolving to function result\r\n */\r\n add<T>(fn: () => Promise<T>, priority = 0): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n if (this.queue.length >= this.config.maxQueueSize) {\r\n reject(new Error('Queue is full'));\r\n return;\r\n }\r\n\r\n const item: QueueItem<T> = {\r\n id: `req_${++this.requestCounter}`,\r\n priority,\r\n fn,\r\n resolve,\r\n reject,\r\n timestamp: Date.now(),\r\n };\r\n\r\n // Insert item in priority order (higher priority first)\r\n const insertIndex = this.queue.findIndex(q => q.priority < priority);\r\n if (insertIndex === -1) {\r\n this.queue.push(item);\r\n } else {\r\n this.queue.splice(insertIndex, 0, item);\r\n }\r\n\r\n this.emit('enqueue', { id: item.id, priority, queueSize: this.queue.length });\r\n this.process();\r\n });\r\n }\r\n\r\n /**\r\n * Process queue items\r\n */\r\n private async process(): Promise<void> {\r\n while (this.running < this.config.concurrency && this.queue.length > 0) {\r\n const item = this.queue.shift()!;\r\n this.running++;\r\n\r\n this.emit('start', { id: item.id, running: this.running });\r\n\r\n this.executeItem(item).finally(() => {\r\n this.running--;\r\n this.emit('complete', { id: item.id, running: this.running });\r\n\r\n if (this.running === 0 && this.queue.length === 0) {\r\n this.emit('drain');\r\n }\r\n\r\n this.process();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Execute queue item with timeout\r\n */\r\n private async executeItem<T>(item: QueueItem<T>): Promise<void> {\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n setTimeout(() => {\r\n reject(new Error(`Request timeout after ${this.config.timeout}ms`));\r\n }, this.config.timeout);\r\n });\r\n\r\n try {\r\n const result = await Promise.race([item.fn(), timeoutPromise]);\r\n item.resolve(result);\r\n } catch (error) {\r\n item.reject(error instanceof Error ? error : new Error(String(error)));\r\n }\r\n }\r\n\r\n /**\r\n * Get queue size\r\n */\r\n size(): number {\r\n return this.queue.length;\r\n }\r\n\r\n /**\r\n * Get number of running requests\r\n */\r\n getRunning(): number {\r\n return this.running;\r\n }\r\n\r\n /**\r\n * Check if queue is empty\r\n */\r\n isEmpty(): boolean {\r\n return this.queue.length === 0 && this.running === 0;\r\n }\r\n\r\n /**\r\n * Clear all pending requests\r\n */\r\n clear(): void {\r\n const error = new Error('Queue cleared');\r\n for (const item of this.queue) {\r\n item.reject(error);\r\n }\r\n this.queue = [];\r\n this.emit('clear');\r\n }\r\n\r\n /**\r\n * Wait for queue to drain\r\n */\r\n async drain(): Promise<void> {\r\n if (this.isEmpty()) return;\r\n\r\n return new Promise(resolve => {\r\n this.once('drain', resolve);\r\n });\r\n }\r\n\r\n /**\r\n * Get queue statistics\r\n */\r\n getStats() {\r\n return {\r\n queueSize: this.queue.length,\r\n running: this.running,\r\n concurrency: this.config.concurrency,\r\n maxQueueSize: this.config.maxQueueSize,\r\n };\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n updateConfig(config: Partial<QueueConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n this.process(); // Trigger processing in case concurrency increased\r\n }\r\n}\r\n\r\n/**\r\n * Create a request queue instance\r\n * @param config - Queue configuration\r\n * @returns RequestQueue instance\r\n */\r\nexport function createRequestQueue(config?: Partial<QueueConfig>): RequestQueue {\r\n return new RequestQueue(config);\r\n}","/**\r\n * Retry logic with exponential backoff\r\n * @module retry\r\n */\r\n\r\nimport { RetryConfig } from '../types';\r\nimport { isRetryableError } from './errors';\r\n\r\n/**\r\n * Default retry configuration\r\n */\r\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\r\n maxRetries: 3,\r\n initialDelay: 1000,\r\n maxDelay: 30000,\r\n backoffMultiplier: 2,\r\n jitter: true,\r\n};\r\n\r\n/**\r\n * Calculate delay with exponential backoff\r\n * @param attempt - Current attempt number (0-indexed)\r\n * @param config - Retry configuration\r\n * @returns Delay in milliseconds\r\n */\r\nfunction calculateDelay(attempt: number, config: Required<RetryConfig>): number {\r\n const exponentialDelay = Math.min(\r\n config.initialDelay * Math.pow(config.backoffMultiplier, attempt),\r\n config.maxDelay\r\n );\r\n\r\n if (config.jitter) {\r\n // Add jitter: random value between 0 and exponentialDelay\r\n return Math.random() * exponentialDelay;\r\n }\r\n\r\n return exponentialDelay;\r\n}\r\n\r\n/**\r\n * Sleep for specified milliseconds\r\n * @param ms - Milliseconds to sleep\r\n */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * Retry a function with exponential backoff\r\n * @param fn - Async function to retry\r\n * @param config - Retry configuration\r\n * @param onRetry - Optional callback on retry attempt\r\n * @returns Promise resolving to function result\r\n * @throws Error after all retries exhausted\r\n * \r\n * @example\r\n * ```typescript\r\n * const result = await withRetry(\r\n * async () => fetchData(),\r\n * { maxRetries: 3, initialDelay: 1000 },\r\n * (attempt, error) => console.log(`Retry ${attempt}: ${error.message}`)\r\n * );\r\n * ```\r\n */\r\nexport async function withRetry<T>(\r\n fn: () => Promise<T>,\r\n config: Partial<RetryConfig> = {},\r\n onRetry?: (attempt: number, error: Error, delay: number) => void\r\n): Promise<T> {\r\n const retryConfig = { ...DEFAULT_RETRY_CONFIG, ...config };\r\n let lastError: Error;\r\n\r\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error));\r\n\r\n // Don't retry if not retryable or if this was the last attempt\r\n if (!isRetryableError(lastError) || attempt === retryConfig.maxRetries) {\r\n throw lastError;\r\n }\r\n\r\n const delay = calculateDelay(attempt, retryConfig);\r\n\r\n if (onRetry) {\r\n onRetry(attempt + 1, lastError, delay);\r\n }\r\n\r\n await sleep(delay);\r\n }\r\n }\r\n\r\n throw lastError!;\r\n}\r\n\r\n/**\r\n * Retry class with configurable behavior\r\n */\r\nexport class RetryHandler {\r\n private config: Required<RetryConfig>;\r\n\r\n constructor(config: Partial<RetryConfig> = {}) {\r\n this.config = { ...DEFAULT_RETRY_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Execute function with retry logic\r\n */\r\n async execute<T>(\r\n fn: () => Promise<T>,\r\n onRetry?: (attempt: number, error: Error, delay: number) => void\r\n ): Promise<T> {\r\n return withRetry(fn, this.config, onRetry);\r\n }\r\n\r\n /**\r\n * Update retry configuration\r\n */\r\n updateConfig(config: Partial<RetryConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n getConfig(): Required<RetryConfig> {\r\n return { ...this.config };\r\n }\r\n}\r\n\r\n/**\r\n * Create a retry handler with custom configuration\r\n * @param config - Retry configuration\r\n * @returns RetryHandler instance\r\n * \r\n * @example\r\n * ```typescript\r\n * const retry = createRetryHandler({ maxRetries: 5, initialDelay: 500 });\r\n * const result = await retry.execute(() => apiCall());\r\n * ```\r\n */\r\nexport function createRetryHandler(config?: Partial<RetryConfig>): RetryHandler {\r\n return new RetryHandler(config);\r\n}","/**\r\n * Circuit breaker pattern implementation\r\n * @module circuitBreaker\r\n */\r\n\r\nimport EventEmitter from 'eventemitter3';\r\nimport { CircuitBreakerConfig } from '../types';\r\nimport { CircuitBreakerError } from './errors';\r\n\r\n/**\r\n * Circuit breaker states\r\n */\r\nexport enum CircuitState {\r\n CLOSED = 'closed',\r\n OPEN = 'open',\r\n HALF_OPEN = 'half-open',\r\n}\r\n\r\n/**\r\n * Default circuit breaker configuration\r\n */\r\nconst DEFAULT_CONFIG: Required<CircuitBreakerConfig> = {\r\n failureThreshold: 5,\r\n resetTimeout: 60000,\r\n halfOpenRequests: 1,\r\n};\r\n\r\n/**\r\n * Circuit breaker implementation for fault tolerance\r\n * Prevents cascading failures by stopping requests to failing services\r\n * \r\n * States:\r\n * - CLOSED: Normal operation, requests pass through\r\n * - OPEN: Service failing, requests blocked\r\n * - HALF_OPEN: Testing if service recovered, limited requests allowed\r\n * \r\n * @example\r\n * ```typescript\r\n * const breaker = new CircuitBreaker({ failureThreshold: 3 });\r\n * \r\n * breaker.on('open', () => console.log('Circuit opened'));\r\n * breaker.on('close', () => console.log('Circuit closed'));\r\n * \r\n * const result = await breaker.execute(async () => {\r\n * return await fetchData();\r\n * });\r\n * ```\r\n */\r\nexport class CircuitBreaker extends EventEmitter {\r\n private state: CircuitState = CircuitState.CLOSED;\r\n private failureCount = 0;\r\n private successCount = 0;\r\n private lastFailureTime?: number;\r\n private resetTimer?: NodeJS.Timeout;\r\n private config: Required<CircuitBreakerConfig>;\r\n\r\n constructor(config: Partial<CircuitBreakerConfig> = {}) {\r\n super();\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Execute a function with circuit breaker protection\r\n * @param fn - Async function to execute\r\n * @returns Promise resolving to function result\r\n * @throws CircuitBreakerError if circuit is open\r\n */\r\n async execute<T>(fn: () => Promise<T>): Promise<T> {\r\n if (this.state === CircuitState.OPEN) {\r\n throw new CircuitBreakerError('Circuit breaker is open', {\r\n state: this.state,\r\n failureCount: this.failureCount,\r\n lastFailureTime: this.lastFailureTime,\r\n });\r\n }\r\n\r\n try {\r\n const result = await fn();\r\n this.onSuccess();\r\n return result;\r\n } catch (error) {\r\n this.onFailure();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Handle successful execution\r\n */\r\n private onSuccess(): void {\r\n this.failureCount = 0;\r\n\r\n if (this.state === CircuitState.HALF_OPEN) {\r\n this.successCount++;\r\n if (this.successCount >= this.config.halfOpenRequests) {\r\n this.close();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle failed execution\r\n */\r\n private onFailure(): void {\r\n this.failureCount++;\r\n this.lastFailureTime = Date.now();\r\n this.successCount = 0;\r\n\r\n if (this.failureCount >= this.config.failureThreshold) {\r\n this.open();\r\n }\r\n }\r\n\r\n /**\r\n * Open the circuit (block requests)\r\n */\r\n private open(): void {\r\n if (this.state === CircuitState.OPEN) return;\r\n\r\n this.state = CircuitState.OPEN;\r\n this.emit('open', { failureCount: this.failureCount });\r\n\r\n // Schedule reset attempt\r\n this.resetTimer = setTimeout(() => {\r\n this.halfOpen();\r\n }, this.config.resetTimeout);\r\n }\r\n\r\n /**\r\n * Enter half-open state (test if service recovered)\r\n */\r\n private halfOpen(): void {\r\n if (this.state === CircuitState.CLOSED) return;\r\n\r\n this.state = CircuitState.HALF_OPEN;\r\n this.successCount = 0;\r\n this.emit('half-open');\r\n }\r\n\r\n /**\r\n * Close the circuit (allow requests)\r\n */\r\n private close(): void {\r\n if (this.state === CircuitState.CLOSED) return;\r\n\r\n this.state = CircuitState.CLOSED;\r\n this.failureCount = 0;\r\n this.successCount = 0;\r\n this.lastFailureTime = undefined;\r\n\r\n if (this.resetTimer) {\r\n clearTimeout(this.resetTimer);\r\n this.resetTimer = undefined;\r\n }\r\n\r\n this.emit('close');\r\n }\r\n\r\n /**\r\n * Get current circuit state\r\n */\r\n getState(): CircuitState {\r\n return this.state;\r\n }\r\n\r\n /**\r\n * Get circuit statistics\r\n */\r\n getStats() {\r\n return {\r\n state: this.state,\r\n failureCount: this.failureCount,\r\n successCount: this.successCount,\r\n lastFailureTime: this.lastFailureTime,\r\n };\r\n }\r\n\r\n /**\r\n * Manually reset the circuit breaker\r\n */\r\n reset(): void {\r\n this.close();\r\n }\r\n\r\n /**\r\n * Clean up resources\r\n */\r\n destroy(): void {\r\n if (this.resetTimer) {\r\n clearTimeout(this.resetTimer);\r\n }\r\n this.removeAllListeners();\r\n }\r\n}\r\n\r\n/**\r\n * Create a circuit breaker instance\r\n * @param config - Circuit breaker configuration\r\n * @returns CircuitBreaker instance\r\n */\r\nexport function createCircuitBreaker(config?: Partial<CircuitBreakerConfig>): CircuitBreaker {\r\n return new CircuitBreaker(config);\r\n}","/**\r\n * Base provider interface and implementations\r\n * @module providers\r\n */\r\n\r\nimport type {\r\n GenerateObjectRequest,\r\n GenerateObjectResponse,\r\n GenerateTextRequest,\r\n GenerateTextResponse,\r\n Message,\r\n ModelConfig\r\n} from \"../types\";\r\n\r\n/**\r\n * Base AI provider interface\r\n */\r\nexport interface AIProviderInterface {\r\n generateText(request: GenerateTextRequest): Promise<GenerateTextResponse>;\r\n streamText(request: GenerateTextRequest): AsyncIterable<any>;\r\n generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>>;\r\n streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any>;\r\n}\r\n\r\n/**\r\n * Base provider class with common functionality\r\n */\r\nexport abstract class BaseProvider implements AIProviderInterface {\r\n protected config: ModelConfig;\r\n\r\n constructor(config: ModelConfig) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Format messages for API request\r\n * Handles system prompts and conversation history\r\n */\r\n protected formatMessages(request: GenerateTextRequest): Message[] {\r\n const messages: Message[] = [];\r\n\r\n if (request.systemPrompt) {\r\n messages.push({ role: 'system', content: request.systemPrompt });\r\n }\r\n\r\n messages.push(...request.messages);\r\n return messages;\r\n }\r\n\r\n /**\r\n * Validate configuration\r\n */\r\n protected validateConfig(): void {\r\n if (!this.config.apiKey) {\r\n throw new Error(`API key is required for ${this.config.provider} provider`);\r\n }\r\n if (!this.config.model) {\r\n throw new Error(`Model is required for ${this.config.provider} provider`);\r\n }\r\n }\r\n\r\n abstract generateText(request: GenerateTextRequest): Promise<GenerateTextResponse>;\r\n abstract streamText(request: GenerateTextRequest): AsyncIterable<any>;\r\n abstract generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>>;\r\n abstract streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any>;\r\n}\r\n\r\n","import Anthropic from \"@anthropic-ai/sdk\";\r\nimport { GenerateObjectRequest, GenerateObjectResponse, GenerateTextRequest, GenerateTextResponse } from \"../../types\";\r\nimport { BaseProvider } from \"../base\";\r\n\r\n/**\r\n * Anthropic provider implementation using official SDK\r\n */\r\nexport class AnthropicProvider extends BaseProvider {\r\n private client: Anthropic;\r\n\r\n constructor(config: any) {\r\n super(config);\r\n this.client = new Anthropic({\r\n apiKey: this.config.apiKey,\r\n baseURL: this.config.baseUrl,\r\n });\r\n }\r\n\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n const messages = this.formatMessages(request);\r\n const systemPrompt = messages.find(m => m.role === 'system')?.content;\r\n const userMessages = messages.filter(m => m.role !== 'system');\r\n\r\n const response = await this.client.messages.create({\r\n model: this.config.model,\r\n messages: userMessages as any,\r\n system: systemPrompt,\r\n max_tokens: this.config.maxTokens || 1024,\r\n temperature: this.config.temperature,\r\n });\r\n\r\n const textContent = response.content.find(c => c.type === 'text');\r\n\r\n return {\r\n text: textContent?.type === 'text' ? textContent.text : '',\r\n usage: {\r\n promptTokens: response.usage.input_tokens,\r\n completionTokens: response.usage.output_tokens,\r\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\r\n },\r\n finishReason: response.stop_reason as any,\r\n };\r\n }\r\n\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n const messages = this.formatMessages(request);\r\n const systemPrompt = messages.find(m => m.role === 'system')?.content;\r\n const userMessages = messages.filter(m => m.role !== 'system');\r\n\r\n const stream = await this.client.messages.stream({\r\n model: this.config.model,\r\n messages: userMessages as any,\r\n system: systemPrompt,\r\n max_tokens: this.config.maxTokens || 1024,\r\n temperature: this.config.temperature,\r\n });\r\n\r\n for await (const event of stream) {\r\n if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {\r\n yield { type: 'content', content: event.delta.text };\r\n }\r\n\r\n if (event.type === 'message_stop') {\r\n const message = await stream.finalMessage();\r\n yield {\r\n type: 'done',\r\n done: {\r\n finishReason: message.stop_reason,\r\n usage: {\r\n promptTokens: message.usage.input_tokens,\r\n completionTokens: message.usage.output_tokens,\r\n totalTokens: message.usage.input_tokens + message.usage.output_tokens,\r\n },\r\n },\r\n };\r\n }\r\n }\r\n }\r\n\r\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>> {\r\n const textResponse = await this.generateText({\r\n ...request,\r\n messages: [\r\n ...request.messages,\r\n {\r\n role: 'user',\r\n content: `Respond with valid JSON matching this schema: ${JSON.stringify(request.schema)}`\r\n },\r\n ],\r\n });\r\n\r\n const object = JSON.parse(textResponse.text);\r\n return {\r\n object,\r\n text: textResponse.text,\r\n usage: textResponse.usage,\r\n };\r\n }\r\n\r\n async *streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any> {\r\n let accumulatedText = '';\r\n\r\n for await (const chunk of this.streamText(request)) {\r\n if (chunk.type === 'content') {\r\n accumulatedText += chunk.content;\r\n\r\n try {\r\n const partial = JSON.parse(accumulatedText);\r\n yield { type: 'partial', partial, text: accumulatedText };\r\n } catch (e) {\r\n // Not yet valid JSON\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const object = JSON.parse(accumulatedText);\r\n yield { type: 'complete', object, text: accumulatedText };\r\n } catch (e) {\r\n yield { type: 'error', error: new Error('Invalid JSON in response') };\r\n }\r\n }\r\n}","/**\r\n * Base provider for custom/URL-based implementations\r\n * @module providers/custom\r\n */\r\n\r\nimport type {\r\n GenerateTextRequest,\r\n} from \"../types\";\r\nimport { BaseProvider } from \"./base\";\r\n\r\n/**\r\n * Base provider class for custom URL-based providers\r\n * Use this for providers without official SDKs (Sarvam, Custom, etc.)\r\n */\r\nexport abstract class CustomBaseProvider extends BaseProvider {\r\n /**\r\n * Make HTTP request with proper error handling\r\n */\r\n protected async makeRequest(\r\n url: string,\r\n options: RequestInit,\r\n stream = false\r\n ): Promise<Response> {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n ...((options.headers as Record<string, string>) || {}),\r\n };\r\n\r\n if (this.config.apiKey) {\r\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\r\n }\r\n\r\n const response = await fetch(url, {\r\n ...options,\r\n headers,\r\n });\r\n\r\n if (!response.ok && !stream) {\r\n const errorText = await response.text();\r\n throw new Error(`Provider request failed: ${response.status} ${errorText}`);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Get API endpoint URL\r\n */\r\n protected getEndpoint(path: string): string {\r\n const baseUrl = this.config.baseUrl || this.getDefaultBaseUrl();\r\n return `${baseUrl}${path}`;\r\n }\r\n\r\n /**\r\n * Get default base URL for provider\r\n */\r\n protected abstract getDefaultBaseUrl(): string;\r\n\r\n /**\r\n * Parse streaming SSE response\r\n */\r\n protected async *parseSSEStream(response: Response): AsyncIterable<any> {\r\n const reader = response.body!.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || '';\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data: ')) {\r\n const data = line.slice(6).trim();\r\n if (data === '[DONE]') continue;\r\n\r\n try {\r\n yield JSON.parse(data);\r\n } catch (e) {\r\n // Skip invalid JSON\r\n }\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n /**\r\n * Build request body with common parameters\r\n */\r\n protected buildRequestBody(request: GenerateTextRequest, stream = false): any {\r\n return {\r\n model: this.config.model,\r\n messages: this.formatMessages(request),\r\n max_tokens: this.config.maxTokens,\r\n temperature: this.config.temperature,\r\n top_p: this.config.topP,\r\n frequency_penalty: this.config.frequencyPenalty,\r\n presence_penalty: this.config.presencePenalty,\r\n stop: this.config.stop,\r\n stream,\r\n };\r\n }\r\n}","import { ProviderError } from \"../../utils/errors\";\r\nimport { GenerateObjectRequest, GenerateObjectResponse, GenerateTextRequest, GenerateTextResponse } from \"../../types\";\r\nimport { CustomBaseProvider } from \"../custom-base\";\r\n\r\n/**\r\n * Custom provider for any OpenAI-compatible API\r\n * \r\n * @example\r\n * ```typescript\r\n * const provider = new CustomProvider({\r\n * provider: 'custom',\r\n * model: 'your-model',\r\n * apiKey: process.env.CUSTOM_API_KEY,\r\n * baseUrl: 'https://your-api.com/v1',\r\n * });\r\n * ```\r\n */\r\nexport class CustomProvider extends CustomBaseProvider {\r\n protected getDefaultBaseUrl(): string {\r\n // Custom provider requires baseUrl in config\r\n if (!this.config.baseUrl) {\r\n throw new ProviderError(\r\n 'custom',\r\n 'baseUrl is required for custom provider',\r\n undefined,\r\n { config: this.config }\r\n );\r\n }\r\n return this.config.baseUrl;\r\n }\r\n\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n this.validateConfig();\r\n\r\n try {\r\n const response = await this.makeRequest(\r\n this.getEndpoint('/chat/completions'),\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(this.buildRequestBody(request)),\r\n }\r\n );\r\n\r\n const data = await response.json();\r\n\r\n if (!data.choices || data.choices.length === 0) {\r\n throw new ProviderError(\r\n 'custom',\r\n 'No choices returned from custom API',\r\n response.status,\r\n { response: data }\r\n );\r\n }\r\n\r\n return {\r\n text: data.choices[0].message.content,\r\n usage: {\r\n promptTokens: data.usage?.prompt_tokens || 0,\r\n completionTokens: data.usage?.completion_tokens || 0,\r\n totalTokens: data.usage?.total_tokens || 0,\r\n },\r\n finishReason: data.choices[0].finish_reason || 'stop',\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'custom',\r\n error instanceof Error ? error.message : 'Unknown error',\r\n undefined,\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n this.validateConfig();\r\n\r\n try {\r\n const response = await this.makeRequest(\r\n this.getEndpoint('/chat/completions'),\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(this.buildRequestBody(request, true)),\r\n },\r\n true\r\n );\r\n\r\n for await (const data of this.parseSSEStream(response)) {\r\n const content = data.choices?.[0]?.delta?.content;\r\n\r\n if (content) {\r\n yield { type: 'content', content };\r\n }\r\n\r\n if (data.choices?.[0]?.finish_reason) {\r\n yield {\r\n type: 'done',\r\n done: {\r\n finishReason: data.choices[0].finish_reason || 'stop',\r\n usage: {\r\n promptTokens: data.usage?.prompt_tokens || 0,\r\n completionTokens: data.usage?.completion_tokens || 0,\r\n totalTokens: data.usage?.total_tokens || 0,\r\n },\r\n },\r\n };\r\n }\r\n }\r\n } catch (error) {\r\n yield {\r\n type: 'error',\r\n error: new ProviderError(\r\n 'custom',\r\n error instanceof Error ? error.message : 'Streaming error',\r\n undefined,\r\n { originalError: error }\r\n ),\r\n };\r\n }\r\n }\r\n\r\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>> {\r\n const enhancedRequest = {\r\n ...request,\r\n messages: [\r\n ...request.messages,\r\n {\r\n role: 'user' as const,\r\n content: `Respond with valid JSON matching this schema: ${JSON.stringify(request.schema)}`,\r\n },\r\n ],\r\n };\r\n\r\n const textResponse = await this.generateText(enhancedRequest);\r\n\r\n try {\r\n const object = JSON.parse(textResponse.text);\r\n return {\r\n object,\r\n text: textResponse.text,\r\n usage: textResponse.usage,\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'custom',\r\n `Failed to parse JSON response: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n undefined,\r\n { responseText: textResponse.text }\r\n );\r\n }\r\n }\r\n\r\n async *streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any> {\r\n let accumulatedText = '';\r\n\r\n for await (const chunk of this.streamText(request)) {\r\n if (chunk.type === 'content') {\r\n accumulatedText += chunk.content;\r\n\r\n try {\r\n const partial = JSON.parse(accumulatedText);\r\n yield { type: 'partial', partial, text: accumulatedText };\r\n } catch (e) {\r\n // Not yet valid JSON\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const object = JSON.parse(accumulatedText);\r\n yield { type: 'complete', object, text: accumulatedText };\r\n } catch (e) {\r\n yield { type: 'error', error: new Error('Invalid JSON in response') };\r\n }\r\n }\r\n}","import { GoogleGenerativeAI, GenerativeModel } from \"@google/generative-ai\";\r\nimport { ProviderError } from \"../../utils/errors\";\r\nimport { GenerateObjectRequest, GenerateObjectResponse, GenerateTextRequest, GenerateTextResponse, Message } from \"../../types\";\r\nimport { BaseProvider } from \"../base\";\r\n\r\n/**\r\n * Google AI (Gemini) provider implementation\r\n * Supports Google's Gemini models via their official SDK\r\n * \r\n * @example\r\n * ```typescript\r\n * const provider = new GoogleProvider({\r\n * provider: 'google',\r\n * model: 'gemini-pro',\r\n * apiKey: process.env.GOOGLE_API_KEY,\r\n * });\r\n * ```\r\n */\r\nexport class GoogleProvider extends BaseProvider {\r\n private genAI: GoogleGenerativeAI;\r\n private model: GenerativeModel;\r\n\r\n constructor(config: any) {\r\n super(config);\r\n this.genAI = new GoogleGenerativeAI(this.config.apiKey!);\r\n this.model = this.genAI.getGenerativeModel({\r\n model: this.config.model,\r\n generationConfig: {\r\n maxOutputTokens: this.config.maxTokens,\r\n temperature: this.config.temperature,\r\n topP: this.config.topP,\r\n stopSequences: this.config.stop,\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Format messages for Google's API format\r\n */\r\n private formatGoogleMessages(messages: Message[]): any[] {\r\n return messages.map(msg => ({\r\n role: msg.role === 'assistant' ? 'model' : 'user',\r\n parts: [{ text: msg.content }],\r\n }));\r\n }\r\n\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n const messages = this.formatMessages(request);\r\n const systemPrompt = messages.find(m => m.role === 'system')?.content;\r\n const conversationMessages = messages.filter(m => m.role !== 'system');\r\n\r\n try {\r\n const chat = this.model.startChat({\r\n history: this.formatGoogleMessages(conversationMessages.slice(0, -1)),\r\n systemInstruction: systemPrompt,\r\n });\r\n\r\n const lastMessage = conversationMessages[conversationMessages.length - 1];\r\n const result = await chat.sendMessage(lastMessage.content);\r\n const response = result.response;\r\n\r\n return {\r\n text: response.text(),\r\n usage: {\r\n promptTokens: response.usageMetadata?.promptTokenCount || 0,\r\n completionTokens: response.usageMetadata?.candidatesTokenCount || 0,\r\n totalTokens: response.usageMetadata?.totalTokenCount || 0,\r\n },\r\n finishReason: this.mapGoogleFinishReason(response.candidates?.[0]?.finishReason),\r\n metadata: {\r\n safetyRatings: response.candidates?.[0]?.safetyRatings,\r\n },\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'google',\r\n error instanceof Error ? error.message : 'Unknown error',\r\n undefined,\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n const messages = this.formatMessages(request);\r\n const systemPrompt = messages.find(m => m.role === 'system')?.content;\r\n const conversationMessages = messages.filter(m => m.role !== 'system');\r\n\r\n try {\r\n const chat = this.model.startChat({\r\n history: this.formatGoogleMessages(conversationMessages.slice(0, -1)),\r\n systemInstruction: systemPrompt,\r\n });\r\n\r\n const lastMessage = conversationMessages[conversationMessages.length - 1];\r\n const result = await chat.sendMessageStream(lastMessage.content);\r\n\r\n for await (const chunk of result.stream) {\r\n const text = chunk.text();\r\n if (text) {\r\n yield { type: 'content', content: text };\r\n }\r\n }\r\n\r\n const response = await result.response;\r\n yield {\r\n type: 'done',\r\n done: {\r\n finishReason: this.mapGoogleFinishReason(response.candidates?.[0]?.finishReason),\r\n usage: {\r\n promptTokens: response.usageMetadata?.promptTokenCount || 0,\r\n completionTokens: response.usageMetadata?.candidatesTokenCount || 0,\r\n totalTokens: response.usageMetadata?.totalTokenCount || 0,\r\n },\r\n },\r\n };\r\n } catch (error) {\r\n yield {\r\n type: 'error',\r\n error: new ProviderError(\r\n 'google',\r\n error instanceof Error ? error.message : 'Streaming error',\r\n undefined,\r\n { originalError: error }\r\n ),\r\n };\r\n }\r\n }\r\n\r\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>> {\r\n const enhancedRequest = {\r\n ...request,\r\n messages: [\r\n ...request.messages,\r\n {\r\n role: 'user' as const,\r\n content: `Respond with valid JSON matching this schema: ${JSON.stringify(request.schema)}. Only return the JSON object, no other text.`,\r\n },\r\n ],\r\n };\r\n\r\n const textResponse = await this.generateText(enhancedRequest);\r\n\r\n let jsonText = textResponse.text.trim();\r\n const jsonMatch = jsonText.match(/```json\\s*([\\s\\S]*?)\\s*```/);\r\n if (jsonMatch) {\r\n jsonText = jsonMatch[1];\r\n }\r\n\r\n try {\r\n const object = JSON.parse(jsonText);\r\n return {\r\n object,\r\n text: textResponse.text,\r\n usage: textResponse.usage,\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'google',\r\n `Failed to parse JSON response: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n undefined,\r\n { responseText: textResponse.text }\r\n );\r\n }\r\n }\r\n\r\n async *streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any> {\r\n let accumulatedText = '';\r\n\r\n for await (const chunk of this.streamText(request)) {\r\n if (chunk.type === 'content') {\r\n accumulatedText += chunk.content;\r\n\r\n let jsonText = accumulatedText.trim();\r\n const jsonMatch = jsonText.match(/```json\\s*([\\s\\S]*?)\\s*```/);\r\n if (jsonMatch) {\r\n jsonText = jsonMatch[1];\r\n }\r\n\r\n try {\r\n const partial = JSON.parse(jsonText);\r\n yield { type: 'partial', partial, text: accumulatedText };\r\n } catch (e) {\r\n // Not yet valid JSON\r\n }\r\n }\r\n }\r\n\r\n let jsonText = accumulatedText.trim();\r\n const jsonMatch = jsonText.match(/```json\\s*([\\s\\S]*?)\\s*```/);\r\n if (jsonMatch) {\r\n jsonText = jsonMatch[1];\r\n }\r\n\r\n try {\r\n const object = JSON.parse(jsonText);\r\n yield { type: 'complete', object, text: accumulatedText };\r\n } catch (e) {\r\n yield {\r\n type: 'error',\r\n error: new Error(`Invalid JSON in response: ${accumulatedText.substring(0, 100)}...`),\r\n };\r\n }\r\n }\r\n\r\n private mapGoogleFinishReason(reason?: string): 'stop' | 'length' | 'content_filter' | 'tool_calls' {\r\n const mapping: Record<string, any> = {\r\n 'STOP': 'stop',\r\n 'MAX_TOKENS': 'length',\r\n 'SAFETY': 'content_filter',\r\n 'RECITATION': 'content_filter',\r\n 'OTHER': 'stop',\r\n };\r\n return mapping[reason || 'STOP'] || 'stop';\r\n }\r\n}","import OpenAI from \"openai\";\r\nimport { GenerateObjectRequest, GenerateObjectResponse, GenerateTextRequest, GenerateTextResponse } from \"../../types\";\r\nimport { BaseProvider } from \"../base\";\r\n\r\n/**\r\n * OpenAI provider implementation using official SDK\r\n */\r\nexport class OpenAIProvider extends BaseProvider {\r\n private client: OpenAI;\r\n\r\n constructor(config: any) {\r\n super(config);\r\n this.client = new OpenAI({\r\n apiKey: this.config.apiKey,\r\n baseURL: this.config.baseUrl,\r\n });\r\n }\r\n\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n const completion = await this.client.chat.completions.create({\r\n model: this.config.model,\r\n messages: this.formatMessages(request) as any,\r\n max_tokens: this.config.maxTokens,\r\n temperature: this.config.temperature,\r\n top_p: this.config.topP,\r\n frequency_penalty: this.config.frequencyPenalty,\r\n presence_penalty: this.config.presencePenalty,\r\n stop: this.config.stop,\r\n });\r\n\r\n return {\r\n text: completion.choices[0].message.content || '',\r\n usage: {\r\n promptTokens: completion.usage?.prompt_tokens || 0,\r\n completionTokens: completion.usage?.completion_tokens || 0,\r\n totalTokens: completion.usage?.total_tokens || 0,\r\n },\r\n finishReason: completion.choices[0].finish_reason as any,\r\n };\r\n }\r\n\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n const stream = await this.client.chat.completions.create({\r\n model: this.config.model,\r\n messages: this.formatMessages(request) as any,\r\n max_tokens: this.config.maxTokens,\r\n temperature: this.config.temperature,\r\n stream: true,\r\n });\r\n\r\n for await (const chunk of stream) {\r\n const content = chunk.choices[0]?.delta?.content;\r\n if (content) {\r\n yield { type: 'content', content };\r\n }\r\n\r\n if (chunk.choices[0]?.finish_reason) {\r\n yield {\r\n type: 'done',\r\n done: {\r\n finishReason: chunk.choices[0].finish_reason,\r\n usage: chunk.usage ? {\r\n promptTokens: chunk.usage.prompt_tokens || 0,\r\n completionTokens: chunk.usage.completion_tokens || 0,\r\n totalTokens: chunk.usage.total_tokens || 0,\r\n } : undefined,\r\n },\r\n };\r\n }\r\n }\r\n }\r\n\r\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>> {\r\n const textResponse = await this.generateText({\r\n ...request,\r\n messages: [\r\n ...request.messages,\r\n {\r\n role: 'system',\r\n content: `Respond with valid JSON matching this schema: ${JSON.stringify(request.schema)}`\r\n },\r\n ],\r\n });\r\n\r\n const object = JSON.parse(textResponse.text);\r\n return {\r\n object,\r\n text: textResponse.text,\r\n usage: textResponse.usage,\r\n };\r\n }\r\n\r\n async *streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any> {\r\n let accumulatedText = '';\r\n\r\n for await (const chunk of this.streamText(request)) {\r\n if (chunk.type === 'content') {\r\n accumulatedText += chunk.content;\r\n\r\n try {\r\n const partial = JSON.parse(accumulatedText);\r\n yield { type: 'partial', partial, text: accumulatedText };\r\n } catch (e) {\r\n // Not yet valid JSON\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const object = JSON.parse(accumulatedText);\r\n yield { type: 'complete', object, text: accumulatedText };\r\n } catch (e) {\r\n yield { type: 'error', error: new Error('Invalid JSON in response') };\r\n }\r\n }\r\n}","import { ProviderError } from \"../../utils/errors\";\r\nimport { GenerateObjectRequest, GenerateObjectResponse, GenerateTextRequest, GenerateTextResponse } from \"../../types\";\r\nimport { CustomBaseProvider } from \"../custom-base\";\r\n\r\n/**\r\n * Sarvam AI provider implementation\r\n * Supports Sarvam's Indian language models\r\n * \r\n * @example\r\n * ```typescript\r\n * const provider = new SarvamProvider({\r\n * provider: 'sarvam',\r\n * model: 'sarvam-2b',\r\n * apiKey: process.env.SARVAM_API_KEY,\r\n * });\r\n * ```\r\n */\r\nexport class SarvamProvider extends CustomBaseProvider {\r\n protected getDefaultBaseUrl(): string {\r\n return 'https://api.sarvam.ai/v1';\r\n }\r\n\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n this.validateConfig();\r\n\r\n try {\r\n const response = await this.makeRequest(\r\n this.getEndpoint('/chat/completions'),\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(this.buildRequestBody(request)),\r\n }\r\n );\r\n\r\n const data = await response.json();\r\n\r\n if (!data.choices || data.choices.length === 0) {\r\n throw new ProviderError(\r\n 'sarvam',\r\n 'No choices returned from Sarvam API',\r\n response.status,\r\n { response: data }\r\n );\r\n }\r\n\r\n return {\r\n text: data.choices[0].message.content,\r\n usage: {\r\n promptTokens: data.usage?.prompt_tokens || 0,\r\n completionTokens: data.usage?.completion_tokens || 0,\r\n totalTokens: data.usage?.total_tokens || 0,\r\n },\r\n finishReason: this.mapFinishReason(data.choices[0].finish_reason),\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'sarvam',\r\n error instanceof Error ? error.message : 'Unknown error',\r\n undefined,\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n this.validateConfig();\r\n\r\n try {\r\n const response = await this.makeRequest(\r\n this.getEndpoint('/chat/completions'),\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(this.buildRequestBody(request, true)),\r\n },\r\n true\r\n );\r\n\r\n for await (const data of this.parseSSEStream(response)) {\r\n const content = data.choices?.[0]?.delta?.content;\r\n\r\n if (content) {\r\n yield { type: 'content', content };\r\n }\r\n\r\n if (data.choices?.[0]?.finish_reason) {\r\n yield {\r\n type: 'done',\r\n done: {\r\n finishReason: this.mapFinishReason(data.choices[0].finish_reason),\r\n usage: {\r\n promptTokens: data.usage?.prompt_tokens || 0,\r\n completionTokens: data.usage?.completion_tokens || 0,\r\n totalTokens: data.usage?.total_tokens || 0,\r\n },\r\n },\r\n };\r\n }\r\n }\r\n } catch (error) {\r\n yield {\r\n type: 'error',\r\n error: new ProviderError(\r\n 'sarvam',\r\n error instanceof Error ? error.message : 'Streaming error',\r\n undefined,\r\n { originalError: error }\r\n ),\r\n };\r\n }\r\n }\r\n\r\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>> {\r\n const enhancedRequest = {\r\n ...request,\r\n messages: [\r\n ...request.messages,\r\n {\r\n role: 'user' as const,\r\n content: `Respond with valid JSON matching this schema: ${JSON.stringify(request.schema)}`,\r\n },\r\n ],\r\n };\r\n\r\n const textResponse = await this.generateText(enhancedRequest);\r\n\r\n try {\r\n const object = JSON.parse(textResponse.text);\r\n return {\r\n object,\r\n text: textResponse.text,\r\n usage: textResponse.usage,\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'sarvam',\r\n `Failed to parse JSON response: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n undefined,\r\n { responseText: textResponse.text }\r\n );\r\n }\r\n }\r\n\r\n async *streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any> {\r\n let accumulatedText = '';\r\n\r\n for await (const chunk of this.streamText(request)) {\r\n if (chunk.type === 'content') {\r\n accumulatedText += chunk.content;\r\n\r\n try {\r\n const partial = JSON.parse(accumulatedText);\r\n yield { type: 'partial', partial, text: accumulatedText };\r\n } catch (e) {\r\n // Not yet valid JSON\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const object = JSON.parse(accumulatedText);\r\n yield { type: 'complete', object, text: accumulatedText };\r\n } catch (e) {\r\n yield { type: 'error', error: new Error('Invalid JSON in response') };\r\n }\r\n }\r\n\r\n private mapFinishReason(reason: string): 'stop' | 'length' | 'content_filter' | 'tool_calls' {\r\n const mapping: Record<string, any> = {\r\n 'stop': 'stop',\r\n 'length': 'length',\r\n 'max_tokens': 'length',\r\n 'content_filter': 'content_filter',\r\n };\r\n return mapping[reason] || 'stop';\r\n }\r\n}","\r\n// Import after BaseProvider is defined\r\nimport { ModelConfig } from \"../types\";\r\nimport { AnthropicProvider } from \"./anthropic\";\r\nimport { AIProviderInterface } from \"./base\";\r\nimport { CustomProvider } from \"./custom\";\r\nimport { GoogleProvider } from \"./google\";\r\nimport { OpenAIProvider } from \"./openai\";\r\nimport { SarvamProvider } from \"./sarvam\";\r\n\r\n/**\r\n * Create provider instance based on configuration\r\n */\r\nexport function createProvider(config: ModelConfig): AIProviderInterface {\r\n switch (config.provider) {\r\n case 'openai':\r\n return new OpenAIProvider(config);\r\n case 'anthropic':\r\n return new AnthropicProvider(config);\r\n case 'google':\r\n return new GoogleProvider(config);\r\n case 'sarvam':\r\n return new SarvamProvider(config);\r\n case 'custom':\r\n return new CustomProvider(config);\r\n default:\r\n throw new Error(`Unknown extended provider: ${config.provider}`);\r\n }\r\n}","/**\r\n * Streaming utilities for real-time data processing\r\n * @module stream\r\n */\r\n\r\nimport { StreamReader } from \"../types\";\r\nimport { StreamError } from \"../utils/errors\";\r\n\r\n/**\r\n * Transform stream for processing chunks\r\n */\r\nexport class TransformStream<TInput, TOutput> {\r\n private transformer: (chunk: TInput) => TOutput | Promise<TOutput>;\r\n\r\n constructor(transformer: (chunk: TInput) => TOutput | Promise<TOutput>) {\r\n this.transformer = transformer;\r\n }\r\n\r\n async *transform(source: AsyncIterable<TInput>): AsyncIterable<TOutput> {\r\n for await (const chunk of source) {\r\n yield await this.transformer(chunk);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Stream reader implementation\r\n */\r\nexport class FlareStreamReader<T> implements StreamReader<T> {\r\n private source: AsyncIterator<T>;\r\n private done = false;\r\n\r\n constructor(source: AsyncIterable<T>) {\r\n this.source = source[Symbol.asyncIterator]();\r\n }\r\n\r\n async read(): Promise<{ value: T; done: boolean }> {\r\n if (this.done) {\r\n return { value: undefined as any, done: true };\r\n }\r\n\r\n const result = await this.source.next();\r\n this.done = result.done || false;\r\n return { value: result.value, done: this.done };\r\n }\r\n\r\n cancel(): void {\r\n this.done = true;\r\n if (this.source.return) {\r\n this.source.return();\r\n }\r\n }\r\n\r\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\r\n while (!this.done) {\r\n const { value, done } = await this.read();\r\n if (done) break;\r\n yield value;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create a data stream writer for Server-Sent Events\r\n * @returns Writer object with methods to push data\r\n * \r\n * @example\r\n * ```typescript\r\n * const writer = createDataStreamWriter();\r\n * \r\n * writer.writeData({ type: 'message', content: 'Hello' });\r\n * writer.writeError(new Error('Something went wrong'));\r\n * writer.close();\r\n * \r\n * return new Response(writer.readable);\r\n * ```\r\n */\r\nexport function createDataStreamWriter() {\r\n let controller: ReadableStreamDefaultController<Uint8Array> | null = null;\r\n const encoder = new TextEncoder();\r\n\r\n const readable = new ReadableStream<Uint8Array>({\r\n start(ctrl) {\r\n controller = ctrl;\r\n },\r\n cancel() {\r\n controller = null;\r\n },\r\n });\r\n\r\n const write = (data: string) => {\r\n if (controller) {\r\n controller.enqueue(encoder.encode(data));\r\n }\r\n };\r\n\r\n return {\r\n readable,\r\n\r\n /**\r\n * Write data event\r\n */\r\n writeData(data: any): void {\r\n write(`data: ${JSON.stringify(data)}\\n\\n`);\r\n },\r\n\r\n /**\r\n * Write error event\r\n */\r\n writeError(error: Error): void {\r\n write(`event: error\\ndata: ${JSON.stringify({\r\n message: error.message,\r\n code: (error as any).code\r\n })}\\n\\n`);\r\n },\r\n\r\n /**\r\n * Write custom event\r\n */\r\n writeEvent(event: string, data: any): void {\r\n write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`);\r\n },\r\n\r\n /**\r\n * Close the stream\r\n */\r\n close(): void {\r\n if (controller) {\r\n controller.close();\r\n controller = null;\r\n }\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Convert async iterable to UI stream response\r\n * Transforms server stream into format suitable for client consumption\r\n * \r\n * @param stream - Async iterable of chunks\r\n * @returns Response object with streaming body\r\n * \r\n * @example\r\n * ```typescript\r\n * const stream = streamText({ messages, config });\r\n * return toUiStreamResponse(stream);\r\n * ```\r\n */\r\nexport function toUiStreamResponse<T>(\r\n stream: AsyncIterable<T>,\r\n headers?: Record<string, string>\r\n): Response {\r\n const writer = createDataStreamWriter();\r\n\r\n // Process stream in background\r\n (async () => {\r\n try {\r\n for await (const chunk of stream) {\r\n writer.writeData(chunk);\r\n }\r\n writer.close();\r\n } catch (error) {\r\n writer.writeError(error instanceof Error ? error : new Error(String(error)));\r\n writer.close();\r\n }\r\n })();\r\n\r\n return new Response(writer.readable, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n ...headers,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Parse Server-Sent Events stream\r\n * @param response - Fetch Response with SSE stream\r\n * @returns Async iterable of parsed events\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await fetch('/api/stream');\r\n * for await (const event of parseSSEStream(response)) {\r\n * console.log(event);\r\n * }\r\n * ```\r\n */\r\nexport async function* parseSSEStream(response: Response): AsyncIterable<any> {\r\n if (!response.body) {\r\n throw new StreamError('Response body is null');\r\n }\r\n\r\n const reader = response.body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split('\\n\\n');\r\n buffer = lines.pop() || '';\r\n\r\n for (const line of lines) {\r\n if (!line.trim()) continue;\r\n\r\n const match = line.match(/^data: (.+)$/m);\r\n if (match) {\r\n try {\r\n yield JSON.parse(match[1]);\r\n } catch (e) {\r\n console.error('Failed to parse SSE data:', e);\r\n }\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n}\r\n\r\n/**\r\n * Merge multiple streams into one\r\n * @param streams - Array of async iterables\r\n * @returns Merged async iterable\r\n */\r\nexport async function* mergeStreams<T>(...streams: AsyncIterable<T>[]): AsyncIterable<T> {\r\n const iterators = streams.map(s => s[Symbol.asyncIterator]());\r\n const pending = new Set(iterators);\r\n\r\n while (pending.size > 0) {\r\n const results = await Promise.race(\r\n Array.from(pending).map(async (it) => ({ it, result: await it.next() }))\r\n );\r\n\r\n if (results.result.done) {\r\n pending.delete(results.it);\r\n } else {\r\n yield results.result.value;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Buffer stream chunks for batch processing\r\n * @param stream - Source stream\r\n * @param size - Buffer size\r\n * @returns Buffered stream\r\n */\r\nexport async function* bufferStream<T>(\r\n stream: AsyncIterable<T>,\r\n size: number\r\n): AsyncIterable<T[]> {\r\n let buffer: T[] = [];\r\n\r\n for await (const item of stream) {\r\n buffer.push(item);\r\n if (buffer.length >= size) {\r\n yield buffer;\r\n buffer = [];\r\n }\r\n }\r\n\r\n if (buffer.length > 0) {\r\n yield buffer;\r\n }\r\n}\r\n\r\n/**\r\n * Throttle stream to limit rate\r\n * @param stream - Source stream\r\n * @param delayMs - Delay between chunks in milliseconds\r\n * @returns Throttled stream\r\n */\r\nexport async function* throttleStream<T>(\r\n stream: AsyncIterable<T>,\r\n delayMs: number\r\n): AsyncIterable<T> {\r\n for await (const item of stream) {\r\n yield item;\r\n await new Promise(resolve => setTimeout(resolve, delayMs));\r\n }\r\n}","/**\r\n * Main FlareClient for AI interactions\r\n * @module client\r\n */\r\n\r\nimport EventEmitter from 'eventemitter3';\r\nimport {\r\n FlareConfig,\r\n GenerateTextRequest,\r\n GenerateTextResponse,\r\n GenerateObjectRequest,\r\n GenerateObjectResponse,\r\n HealthStatus,\r\n} from '../types';\r\nimport { AIProviderInterface, createProvider } from '../providers';\r\nimport { RetryHandler } from '../utils/retry';\r\nimport { CircuitBreaker } from '../utils/circuit-breaker';\r\nimport { RateLimiter } from '../utils/rate-limiter';\r\nimport { RequestQueue } from '../utils/request-queue';\r\nimport { MetricsCollector } from '../utils/metrics';\r\n\r\n/**\r\n * Default configuration\r\n */\r\nconst DEFAULT_CONFIG: Partial<FlareConfig> = {\r\n maxTokens: 1024,\r\n temperature: 0.7,\r\n enableQueueing: true,\r\n enablePooling: true,\r\n enableMetrics: true,\r\n retry: {\r\n maxRetries: 3,\r\n initialDelay: 1000,\r\n maxDelay: 30000,\r\n },\r\n circuitBreaker: {\r\n failureThreshold: 5,\r\n resetTimeout: 60000,\r\n },\r\n rateLimit: {\r\n maxRequests: 100,\r\n windowMs: 60000,\r\n },\r\n};\r\n\r\n/**\r\n * Main FlareClient for AI interactions\r\n * Provides text generation, streaming, and structured output\r\n * with built-in retry, circuit breaker, and rate limiting\r\n * \r\n * @example\r\n * ```typescript\r\n * const client = new FlareClient({\r\n * provider: 'openai',\r\n * model: 'gpt-4',\r\n * apiKey: process.env.OPENAI_API_KEY,\r\n * });\r\n * \r\n * // Generate text\r\n * const response = await client.generateText({\r\n * messages: [{ role: 'user', content: 'Hello!' }],\r\n * });\r\n * \r\n * // Stream text\r\n * const stream = client.streamText({\r\n * messages: [{ role: 'user', content: 'Tell me a story' }],\r\n * });\r\n * \r\n * for await (const chunk of stream) {\r\n * console.log(chunk.content);\r\n * }\r\n * ```\r\n */\r\nexport class FlareClient extends EventEmitter {\r\n private config: FlareConfig;\r\n private provider: AIProviderInterface;\r\n private retryHandler: RetryHandler;\r\n private circuitBreaker: CircuitBreaker;\r\n private rateLimiter: RateLimiter;\r\n private requestQueue?: RequestQueue;\r\n private metrics: MetricsCollector;\r\n private startTime = Date.now();\r\n\r\n constructor(config: FlareConfig) {\r\n super();\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n\r\n\r\n\r\n // Initialize reliability components\r\n this.provider = createProvider(this.config);\r\n this.retryHandler = new RetryHandler(this.config.retry);\r\n this.circuitBreaker = new CircuitBreaker(this.config.circuitBreaker);\r\n this.rateLimiter = new RateLimiter(this.config.rateLimit);\r\n this.metrics = new MetricsCollector();\r\n\r\n if (this.config.enableQueueing) {\r\n this.requestQueue = new RequestQueue({\r\n concurrency: this.config.poolSize || 10,\r\n });\r\n }\r\n\r\n this.setupEventListeners();\r\n }\r\n\r\n /**\r\n * Setup event listeners for monitoring\r\n */\r\n private setupEventListeners(): void {\r\n this.circuitBreaker.on('open', () => {\r\n this.emit('circuit-breaker:open');\r\n if (this.config.debug) {\r\n console.warn('[FlareClient] Circuit breaker opened');\r\n }\r\n });\r\n\r\n this.circuitBreaker.on('close', () => {\r\n this.emit('circuit-breaker:close');\r\n if (this.config.debug) {\r\n console.log('[FlareClient] Circuit breaker closed');\r\n }\r\n });\r\n\r\n if (this.requestQueue) {\r\n this.requestQueue.on('enqueue', (data) => {\r\n this.emit('queue:enqueue', data);\r\n });\r\n\r\n this.requestQueue.on('drain', () => {\r\n this.emit('queue:drain');\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Generate text synchronously\r\n * @param request - Text generation request\r\n * @returns Generated text response\r\n */\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n // Check rate limit\r\n await this.rateLimiter.acquire(this.config.rateLimit?.clientId);\r\n\r\n // Execute with reliability patterns\r\n const execute = async () => {\r\n return await this.circuitBreaker.execute(async () => {\r\n const mergedConfig = { ...this.config, ...request.config };\r\n return await this.provider.generateText({\r\n ...request,\r\n config: mergedConfig,\r\n });\r\n });\r\n };\r\n\r\n let result: GenerateTextResponse;\r\n\r\n if (this.requestQueue && this.config.enableQueueing) {\r\n result = await this.requestQueue.add(\r\n () => this.retryHandler.execute(execute),\r\n request.config?.queuePriority || 0\r\n );\r\n } else {\r\n result = await this.retryHandler.execute(execute);\r\n }\r\n\r\n this.metrics.recordSuccess(Date.now() - startTime);\r\n this.emit('request:success', { latency: Date.now() - startTime });\r\n\r\n return result;\r\n } catch (error) {\r\n this.metrics.recordFailure(Date.now() - startTime);\r\n this.emit('request:error', { error, latency: Date.now() - startTime });\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Stream text generation\r\n * @param request - Text generation request\r\n * @returns Async iterable of text chunks\r\n */\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n await this.rateLimiter.acquire(this.config.rateLimit?.clientId);\r\n\r\n const stream = this.provider.streamText(request);\r\n\r\n for await (const chunk of stream) {\r\n yield chunk;\r\n }\r\n\r\n this.metrics.recordSuccess(Date.now() - startTime);\r\n this.emit('request:success', { latency: Date.now() - startTime, streaming: true });\r\n } catch (error) {\r\n this.metrics.recordFailure(Date.now() - startTime);\r\n this.emit('request:error', { error, latency: Date.now() - startTime, streaming: true });\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Generate structured object\r\n * @param request - Object generation request\r\n * @returns Generated object response\r\n */\r\n async generateObject<T = any>(\r\n request: GenerateObjectRequest<T>\r\n ): Promise<GenerateObjectResponse<T>> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n await this.rateLimiter.acquire(this.config.rateLimit?.clientId);\r\n\r\n const execute = async () => {\r\n return await this.circuitBreaker.execute(async () => {\r\n return await this.provider.generateObject<T>(request);\r\n });\r\n };\r\n\r\n let result: GenerateObjectResponse<T>;\r\n\r\n if (this.requestQueue && this.config.enableQueueing) {\r\n result = await this.requestQueue.add(\r\n () => this.retryHandler.execute(execute),\r\n request.config?.queuePriority || 0\r\n );\r\n } else {\r\n result = await this.retryHandler.execute(execute);\r\n }\r\n\r\n this.metrics.recordSuccess(Date.now() - startTime);\r\n return result;\r\n } catch (error) {\r\n this.metrics.recordFailure(Date.now() - startTime);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Stream object generation\r\n * @param request - Object generation request\r\n * @returns Async iterable of object chunks\r\n */\r\n async *streamObject<T = any>(\r\n request: GenerateObjectRequest<T>\r\n ): AsyncIterable<any> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n await this.rateLimiter.acquire(this.config.rateLimit?.clientId);\r\n\r\n const stream = this.provider.streamObject<T>(request);\r\n\r\n for await (const chunk of stream) {\r\n yield chunk;\r\n }\r\n\r\n this.metrics.recordSuccess(Date.now() - startTime);\r\n } catch (error) {\r\n this.metrics.recordFailure(Date.now() - startTime);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get health status\r\n */\r\n getHealth(): HealthStatus {\r\n const metrics = this.metrics.getMetrics();\r\n\r\n let status: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';\r\n if (this.circuitBreaker.getState() === 'open') {\r\n status = 'unhealthy';\r\n } else if (metrics.failedRequests > metrics.successfulRequests * 0.1) {\r\n status = 'degraded';\r\n }\r\n\r\n return {\r\n status,\r\n timestamp: Date.now(),\r\n uptime: Date.now() - this.startTime,\r\n circuitBreaker: this.circuitBreaker.getState(),\r\n activeConnections: this.requestQueue?.getRunning(),\r\n queueSize: this.requestQueue?.size(),\r\n metrics,\r\n };\r\n }\r\n\r\n /**\r\n * Get performance metrics\r\n */\r\n getMetrics() {\r\n return this.metrics.getDetailedStats();\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n updateConfig(config: Partial<FlareConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n\r\n if (config.retry) {\r\n this.retryHandler.updateConfig(config.retry);\r\n }\r\n\r\n if (config.rateLimit) {\r\n this.rateLimiter = new RateLimiter(config.rateLimit);\r\n }\r\n }\r\n\r\n /**\r\n * Reset circuit breaker\r\n */\r\n resetCircuitBreaker(): void {\r\n this.circuitBreaker.reset();\r\n }\r\n\r\n /**\r\n * Clean up resources\r\n */\r\n destroy(): void {\r\n this.circuitBreaker.destroy();\r\n this.rateLimiter.destroy();\r\n if (this.requestQueue) {\r\n this.requestQueue.clear();\r\n }\r\n this.removeAllListeners();\r\n }\r\n}\r\n\r\n/**\r\n * Create FlareClient instance\r\n * @param config - Client configuration\r\n * @returns FlareClient instance\r\n */\r\nexport function createFlareClient(config: FlareConfig): FlareClient {\r\n return new FlareClient(config);\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,IAAM,aAAN,cAAyB,MAAM;AAAA,EAMlC,YACI,SACA,MACA,YACA,YAAY,OACZ,SACF;AACE,UAAM,OAAO;AAZjB,wBAAgB;AAChB,wBAAgB;AAChB,wBAAgB;AAChB,wBAAgB;AAUZ,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,EAClD;AACJ;AAKO,IAAM,eAAN,cAA2B,WAAW;AAAA,EACzC,YAAY,SAAiB,SAA+B;AACxD,UAAM,SAAS,iBAAiB,QAAW,MAAM,OAAO;AACxD,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,eAAN,cAA2B,WAAW;AAAA,EACzC,YAAY,SAAiB,SAA+B;AACxD,UAAM,SAAS,iBAAiB,KAAK,MAAM,OAAO;AAClD,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,iBAAN,cAA6B,WAAW;AAAA,EAG3C,YAAY,SAAiB,YAAqB,SAA+B;AAC7E,UAAM,SAAS,oBAAoB,KAAK,MAAM,OAAO;AAHzD,wBAAgB;AAIZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACtB;AACJ;AAKO,IAAM,sBAAN,cAAkC,WAAW;AAAA,EAChD,YAAY,SAAiB,SAA+B;AACxD,UAAM,SAAS,wBAAwB,KAAK,OAAO,OAAO;AAC1D,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,kBAAN,cAA8B,WAAW;AAAA,EAC5C,YAAY,SAAiB,SAA+B;AACxD,UAAM,SAAS,oBAAoB,KAAK,OAAO,OAAO;AACtD,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,sBAAN,cAAkC,WAAW;AAAA,EAChD,YAAY,SAAiB,SAA+B;AACxD,UAAM,SAAS,wBAAwB,KAAK,MAAM,OAAO;AACzD,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAG1C,YAAY,UAAkB,SAAiB,YAAqB,SAA+B;AAC/F,UAAM,SAAS,kBAAkB,YAAY,MAAM,OAAO;AAH9D,wBAAgB;AAIZ,SAAK,OAAO;AACZ,SAAK,WAAW;AAAA,EACpB;AACJ;AAKO,IAAM,cAAN,cAA0B,WAAW;AAAA,EACxC,YAAY,SAAiB,SAA+B;AACxD,UAAM,SAAS,gBAAgB,QAAW,OAAO,OAAO;AACxD,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,aAAN,cAAyB,WAAW;AAAA,EACvC,YAAY,SAAiB,SAA+B;AACxD,UAAM,SAAS,eAAe,QAAW,OAAO,OAAO;AACvD,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,qBAAN,cAAiC,WAAW;AAAA,EAC/C,YAAY,SAAiB,SAA+B;AACxD,UAAM,SAAS,wBAAwB,KAAK,OAAO,OAAO;AAC1D,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,SAAS,iBAAiB,OAAuB;AACpD,MAAI,iBAAiB,YAAY;AAC7B,WAAO,MAAM;AAAA,EACjB;AAGA,MAAI,MAAM,QAAQ,SAAS,cAAc,KACrC,MAAM,QAAQ,SAAS,WAAW,KAClC,MAAM,QAAQ,SAAS,WAAW,GAAG;AACrC,WAAO;AAAA,EACX;AAEA,SAAO;AACX;AAKO,SAAS,mBAAmB,OAAkC;AACjE,MAAI,iBAAiB,YAAY;AAC7B,WAAO,MAAM;AAAA,EACjB;AACA,SAAO;AACX;;;ACzJA,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AACI,wBAAQ,WAAoB,CAAC;AAC7B,wBAAQ,cAAa;AAAA;AAAA,EAErB,IAAI,SAAuB;AACvB,SAAK,QAAQ,KAAK,OAAO;AACzB,QAAI,KAAK,QAAQ,SAAS,KAAK,YAAY;AACvC,WAAK,QAAQ,MAAM;AAAA,IACvB;AAAA,EACJ;AAAA,EAEA,cAAc,GAAmB;AAC7B,QAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AAEtC,UAAM,SAAS,CAAC,GAAG,KAAK,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACrD,UAAM,QAAQ,KAAK,KAAM,IAAI,MAAO,OAAO,MAAM,IAAI;AACrD,WAAO,OAAO,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACpC;AAAA,EAEA,aAAqB;AACjB,QAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AACtC,WAAO,KAAK,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;AAAA,EAClE;AAAA,EAEA,QAAc;AACV,SAAK,UAAU,CAAC;AAAA,EACpB;AACJ;AAoBO,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AACH,wBAAQ,iBAAgB;AACxB,wBAAQ,sBAAqB;AAC7B,wBAAQ,kBAAiB;AACzB,wBAAQ,oBAAmB,IAAI,iBAAiB;AAChD,wBAAQ,aAAY,KAAK,IAAI;AAC7B,wBAAQ,eAAc,KAAK,IAAI;AAC/B,wBAAQ,kBAAiB;AACzB,wBAAQ,kBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzB,cAAc,SAAuB;AACjC,SAAK;AACL,SAAK;AACL,SAAK,iBAAiB,IAAI,OAAO;AACjC,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,SAAuB;AACjC,SAAK;AACL,SAAK;AACL,SAAK,iBAAiB,IAAI,OAAO;AACjC,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AACzB,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,KAAK,eAAe,KAAK,gBAAgB;AAC/C,WAAK,iBAAiB;AACtB,WAAK,cAAc;AAAA,IACvB;AACA,SAAK;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAA0B;AACtB,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK,eAAe;AAClD,UAAM,MAAM,UAAU,IAAI,KAAK,iBAAiB,UAAU;AAE1D,WAAO;AAAA,MACH,eAAe,KAAK;AAAA,MACpB,oBAAoB,KAAK;AAAA,MACzB,gBAAgB,KAAK;AAAA,MACrB,YAAY,KAAK,iBAAiB,WAAW;AAAA,MAC7C,YAAY,KAAK,iBAAiB,cAAc,EAAE;AAAA,MAClD,YAAY,KAAK,iBAAiB,cAAc,EAAE;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAyB;AACrB,QAAI,KAAK,kBAAkB,EAAG,QAAO;AACrC,WAAQ,KAAK,qBAAqB,KAAK,gBAAiB;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,YAAoB;AAChB,WAAO,KAAK,IAAI,IAAI,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACV,SAAK,gBAAgB;AACrB,SAAK,qBAAqB;AAC1B,SAAK,iBAAiB;AACtB,SAAK,iBAAiB,MAAM;AAC5B,SAAK,cAAc,KAAK,IAAI;AAC5B,SAAK,iBAAiB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB;AACf,WAAO,iCACA,KAAK,WAAW,IADhB;AAAA,MAEH,aAAa,KAAK,eAAe;AAAA,MACjC,QAAQ,KAAK,UAAU;AAAA,MACvB,WAAW,KAAK,IAAI;AAAA,IACxB;AAAA,EACJ;AACJ;AAKA,IAAI,gBAAyC;AAKtC,SAAS,mBAAqC;AACjD,MAAI,CAAC,eAAe;AAChB,oBAAgB,IAAI,iBAAiB;AAAA,EACzC;AACA,SAAO;AACX;AAKO,SAAS,yBAA2C;AACvD,SAAO,IAAI,iBAAiB;AAChC;AAQA,SAAsB,eAClB,IAEU;AAAA,6CAFV,IACA,YAA8B,iBAAiB,GACrC;AACV,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACA,YAAM,SAAS,MAAM,GAAG;AACxB,gBAAU,cAAc,KAAK,IAAI,IAAI,KAAK;AAC1C,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,gBAAU,cAAc,KAAK,IAAI,IAAI,KAAK;AAC1C,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;;;ACrLA,IAAM,iBAA4C;AAAA,EAC9C,aAAa;AAAA,EACb,UAAU;AAAA;AAAA,EACV,UAAU;AACd;AAkBO,IAAM,cAAN,MAAkB;AAAA,EAKrB,YAAY,SAAmC,CAAC,GAAG;AAJnD,wBAAQ,WAAU,oBAAI,IAAyB;AAC/C,wBAAQ;AACR,wBAAQ;AAGJ,SAAK,SAAS,kCAAK,iBAAmB;AACtC,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOM,QAAQ,UAAkC;AAAA;AAC5C,YAAM,KAAK,YAAY,KAAK,OAAO;AACnC,YAAM,SAAS,KAAK,UAAU,EAAE;AAEhC,WAAK,aAAa,MAAM;AAExB,UAAI,OAAO,UAAU,GAAG;AACpB,cAAM,aAAa,KAAK,oBAAoB,MAAM;AAClD,cAAM,IAAI;AAAA,UACN,qCAAqC,KAAK,KAAK,aAAa,GAAI,CAAC;AAAA,UACjE;AAAA,UACA,EAAE,UAAU,IAAI,OAAO,KAAK,OAAO,aAAa,QAAQ,KAAK,OAAO,SAAS;AAAA,QACjF;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAA4B;AAC9B,UAAM,KAAK,YAAY,KAAK,OAAO;AACnC,UAAM,SAAS,KAAK,UAAU,EAAE;AAChC,SAAK,aAAa,MAAM;AACxB,WAAO,OAAO,SAAS;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,UAA2B;AACpC,UAAM,KAAK,YAAY,KAAK,OAAO;AACnC,UAAM,SAAS,KAAK,UAAU,EAAE;AAChC,SAAK,aAAa,MAAM;AACxB,WAAO,KAAK,MAAM,OAAO,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAyB;AAC3B,UAAM,KAAK,YAAY,KAAK,OAAO;AACnC,SAAK,QAAQ,OAAO,EAAE;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,UAA+B;AAC7C,QAAI,SAAS,KAAK,QAAQ,IAAI,QAAQ;AAEtC,QAAI,CAAC,QAAQ;AACT,eAAS;AAAA,QACL,QAAQ,KAAK,OAAO;AAAA,QACpB,YAAY,KAAK,IAAI;AAAA,MACzB;AACA,WAAK,QAAQ,IAAI,UAAU,MAAM;AAAA,IACrC;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,QAA2B;AAC5C,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,UAAU,MAAM,OAAO;AAE7B,QAAI,WAAW,EAAG;AAGlB,UAAM,cAAe,UAAU,KAAK,OAAO,WAAY,KAAK,OAAO;AACnE,WAAO,SAAS,KAAK,IAAI,KAAK,OAAO,aAAa,OAAO,SAAS,WAAW;AAC7E,WAAO,aAAa;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,QAA6B;AACrD,UAAM,eAAe,IAAI,OAAO;AAChC,WAAQ,eAAe,KAAK,OAAO,cAAe,KAAK,OAAO;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AACzB,SAAK,kBAAkB,YAAY,MAAM;AACrC,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,SAAS,KAAK,OAAO,WAAW;AAEtC,iBAAW,CAAC,UAAU,MAAM,KAAK,KAAK,QAAQ,QAAQ,GAAG;AACrD,YAAI,MAAM,OAAO,aAAa,QAAQ;AAClC,eAAK,QAAQ,OAAO,QAAQ;AAAA,QAChC;AAAA,MACJ;AAAA,IACJ,GAAG,KAAK,OAAO,QAAQ;AAGvB,QAAI,KAAK,gBAAgB,OAAO;AAC5B,WAAK,gBAAgB,MAAM;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACP,WAAO;AAAA,MACH,cAAc,KAAK,QAAQ;AAAA,MAC3B,QAAQ,KAAK;AAAA,IACjB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACZ,QAAI,KAAK,iBAAiB;AACtB,oBAAc,KAAK,eAAe;AAAA,IACtC;AACA,SAAK,QAAQ,MAAM;AAAA,EACvB;AACJ;AAOO,SAAS,kBAAkB,QAAgD;AAC9E,SAAO,IAAI,YAAY,MAAM;AACjC;;;AC/LA,2BAAyB;AA6BzB,IAAMA,kBAAwC;AAAA,EAC1C,aAAa;AAAA,EACb,cAAc;AAAA,EACd,SAAS;AACb;AAkBO,IAAM,eAAN,cAA2B,qBAAAC,QAAa;AAAA,EAM3C,YAAY,SAA+B,CAAC,GAAG;AAC3C,UAAM;AANV,wBAAQ,SAA0B,CAAC;AACnC,wBAAQ,WAAU;AAClB,wBAAQ;AACR,wBAAQ,kBAAiB;AAIrB,SAAK,SAAS,kCAAKD,kBAAmB;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAO,IAAsB,WAAW,GAAe;AACnD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,UAAI,KAAK,MAAM,UAAU,KAAK,OAAO,cAAc;AAC/C,eAAO,IAAI,MAAM,eAAe,CAAC;AACjC;AAAA,MACJ;AAEA,YAAM,OAAqB;AAAA,QACvB,IAAI,OAAO,EAAE,KAAK,cAAc;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACxB;AAGA,YAAM,cAAc,KAAK,MAAM,UAAU,OAAK,EAAE,WAAW,QAAQ;AACnE,UAAI,gBAAgB,IAAI;AACpB,aAAK,MAAM,KAAK,IAAI;AAAA,MACxB,OAAO;AACH,aAAK,MAAM,OAAO,aAAa,GAAG,IAAI;AAAA,MAC1C;AAEA,WAAK,KAAK,WAAW,EAAE,IAAI,KAAK,IAAI,UAAU,WAAW,KAAK,MAAM,OAAO,CAAC;AAC5E,WAAK,QAAQ;AAAA,IACjB,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKc,UAAyB;AAAA;AACnC,aAAO,KAAK,UAAU,KAAK,OAAO,eAAe,KAAK,MAAM,SAAS,GAAG;AACpE,cAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,aAAK;AAEL,aAAK,KAAK,SAAS,EAAE,IAAI,KAAK,IAAI,SAAS,KAAK,QAAQ,CAAC;AAEzD,aAAK,YAAY,IAAI,EAAE,QAAQ,MAAM;AACjC,eAAK;AACL,eAAK,KAAK,YAAY,EAAE,IAAI,KAAK,IAAI,SAAS,KAAK,QAAQ,CAAC;AAE5D,cAAI,KAAK,YAAY,KAAK,KAAK,MAAM,WAAW,GAAG;AAC/C,iBAAK,KAAK,OAAO;AAAA,UACrB;AAEA,eAAK,QAAQ;AAAA,QACjB,CAAC;AAAA,MACL;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKc,YAAe,MAAmC;AAAA;AAC5D,YAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACrD,mBAAW,MAAM;AACb,iBAAO,IAAI,MAAM,yBAAyB,KAAK,OAAO,OAAO,IAAI,CAAC;AAAA,QACtE,GAAG,KAAK,OAAO,OAAO;AAAA,MAC1B,CAAC;AAED,UAAI;AACA,cAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,KAAK,GAAG,GAAG,cAAc,CAAC;AAC7D,aAAK,QAAQ,MAAM;AAAA,MACvB,SAAS,OAAO;AACZ,aAAK,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,MACzE;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe;AACX,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAmB;AACf,WAAO,KAAK,MAAM,WAAW,KAAK,KAAK,YAAY;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACV,UAAM,QAAQ,IAAI,MAAM,eAAe;AACvC,eAAW,QAAQ,KAAK,OAAO;AAC3B,WAAK,OAAO,KAAK;AAAA,IACrB;AACA,SAAK,QAAQ,CAAC;AACd,SAAK,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKM,QAAuB;AAAA;AACzB,UAAI,KAAK,QAAQ,EAAG;AAEpB,aAAO,IAAI,QAAQ,aAAW;AAC1B,aAAK,KAAK,SAAS,OAAO;AAAA,MAC9B,CAAC;AAAA,IACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACP,WAAO;AAAA,MACH,WAAW,KAAK,MAAM;AAAA,MACtB,SAAS,KAAK;AAAA,MACd,aAAa,KAAK,OAAO;AAAA,MACzB,cAAc,KAAK,OAAO;AAAA,IAC9B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAoC;AAC7C,SAAK,SAAS,kCAAK,KAAK,SAAW;AACnC,SAAK,QAAQ;AAAA,EACjB;AACJ;AAOO,SAAS,mBAAmB,QAA6C;AAC5E,SAAO,IAAI,aAAa,MAAM;AAClC;;;AC5MA,IAAM,uBAA8C;AAAA,EAChD,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,QAAQ;AACZ;AAQA,SAAS,eAAe,SAAiB,QAAuC;AAC5E,QAAM,mBAAmB,KAAK;AAAA,IAC1B,OAAO,eAAe,KAAK,IAAI,OAAO,mBAAmB,OAAO;AAAA,IAChE,OAAO;AAAA,EACX;AAEA,MAAI,OAAO,QAAQ;AAEf,WAAO,KAAK,OAAO,IAAI;AAAA,EAC3B;AAEA,SAAO;AACX;AAMA,SAAS,MAAM,IAA2B;AACtC,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACzD;AAmBA,SAAsB,UAClB,IAGU;AAAA,6CAHV,IACA,SAA+B,CAAC,GAChC,SACU;AACV,UAAM,cAAc,kCAAK,uBAAyB;AAClD,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,YAAY,YAAY,WAAW;AAChE,UAAI;AACA,eAAO,MAAM,GAAG;AAAA,MACpB,SAAS,OAAO;AACZ,oBAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAGpE,YAAI,CAAC,iBAAiB,SAAS,KAAK,YAAY,YAAY,YAAY;AACpE,gBAAM;AAAA,QACV;AAEA,cAAM,QAAQ,eAAe,SAAS,WAAW;AAEjD,YAAI,SAAS;AACT,kBAAQ,UAAU,GAAG,WAAW,KAAK;AAAA,QACzC;AAEA,cAAM,MAAM,KAAK;AAAA,MACrB;AAAA,IACJ;AAEA,UAAM;AAAA,EACV;AAAA;AAKO,IAAM,eAAN,MAAmB;AAAA,EAGtB,YAAY,SAA+B,CAAC,GAAG;AAF/C,wBAAQ;AAGJ,SAAK,SAAS,kCAAK,uBAAyB;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKM,QACF,IACA,SACU;AAAA;AACV,aAAO,UAAU,IAAI,KAAK,QAAQ,OAAO;AAAA,IAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAoC;AAC7C,SAAK,SAAS,kCAAK,KAAK,SAAW;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAmC;AAC/B,WAAO,mBAAK,KAAK;AAAA,EACrB;AACJ;AAaO,SAAS,mBAAmB,QAA6C;AAC5E,SAAO,IAAI,aAAa,MAAM;AAClC;;;AC3IA,IAAAE,wBAAyB;AAOlB,IAAK,eAAL,kBAAKC,kBAAL;AACH,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,eAAY;AAHJ,SAAAA;AAAA,GAAA;AASZ,IAAMC,kBAAiD;AAAA,EACnD,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,kBAAkB;AACtB;AAuBO,IAAM,iBAAN,cAA6B,sBAAAC,QAAa;AAAA,EAQ7C,YAAY,SAAwC,CAAC,GAAG;AACpD,UAAM;AARV,wBAAQ,SAAsB;AAC9B,wBAAQ,gBAAe;AACvB,wBAAQ,gBAAe;AACvB,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AAIJ,SAAK,SAAS,kCAAKD,kBAAmB;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQM,QAAW,IAAkC;AAAA;AAC/C,UAAI,KAAK,UAAU,mBAAmB;AAClC,cAAM,IAAI,oBAAoB,2BAA2B;AAAA,UACrD,OAAO,KAAK;AAAA,UACZ,cAAc,KAAK;AAAA,UACnB,iBAAiB,KAAK;AAAA,QAC1B,CAAC;AAAA,MACL;AAEA,UAAI;AACA,cAAM,SAAS,MAAM,GAAG;AACxB,aAAK,UAAU;AACf,eAAO;AAAA,MACX,SAAS,OAAO;AACZ,aAAK,UAAU;AACf,cAAM;AAAA,MACV;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAkB;AACtB,SAAK,eAAe;AAEpB,QAAI,KAAK,UAAU,6BAAwB;AACvC,WAAK;AACL,UAAI,KAAK,gBAAgB,KAAK,OAAO,kBAAkB;AACnD,aAAK,MAAM;AAAA,MACf;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAkB;AACtB,SAAK;AACL,SAAK,kBAAkB,KAAK,IAAI;AAChC,SAAK,eAAe;AAEpB,QAAI,KAAK,gBAAgB,KAAK,OAAO,kBAAkB;AACnD,WAAK,KAAK;AAAA,IACd;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAa;AACjB,QAAI,KAAK,UAAU,kBAAmB;AAEtC,SAAK,QAAQ;AACb,SAAK,KAAK,QAAQ,EAAE,cAAc,KAAK,aAAa,CAAC;AAGrD,SAAK,aAAa,WAAW,MAAM;AAC/B,WAAK,SAAS;AAAA,IAClB,GAAG,KAAK,OAAO,YAAY;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAiB;AACrB,QAAI,KAAK,UAAU,sBAAqB;AAExC,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAc;AAClB,QAAI,KAAK,UAAU,sBAAqB;AAExC,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,SAAK,kBAAkB;AAEvB,QAAI,KAAK,YAAY;AACjB,mBAAa,KAAK,UAAU;AAC5B,WAAK,aAAa;AAAA,IACtB;AAEA,SAAK,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAyB;AACrB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACP,WAAO;AAAA,MACH,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,iBAAiB,KAAK;AAAA,IAC1B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACV,SAAK,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACZ,QAAI,KAAK,YAAY;AACjB,mBAAa,KAAK,UAAU;AAAA,IAChC;AACA,SAAK,mBAAmB;AAAA,EAC5B;AACJ;AAOO,SAAS,qBAAqB,QAAwD;AACzF,SAAO,IAAI,eAAe,MAAM;AACpC;;;AC/KO,IAAe,eAAf,MAA2D;AAAA,EAG9D,YAAY,QAAqB;AAFjC,wBAAU;AAGN,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,eAAe,SAAyC;AAC9D,UAAM,WAAsB,CAAC;AAE7B,QAAI,QAAQ,cAAc;AACtB,eAAS,KAAK,EAAE,MAAM,UAAU,SAAS,QAAQ,aAAa,CAAC;AAAA,IACnE;AAEA,aAAS,KAAK,GAAG,QAAQ,QAAQ;AACjC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKU,iBAAuB;AAC7B,QAAI,CAAC,KAAK,OAAO,QAAQ;AACrB,YAAM,IAAI,MAAM,2BAA2B,KAAK,OAAO,QAAQ,WAAW;AAAA,IAC9E;AACA,QAAI,CAAC,KAAK,OAAO,OAAO;AACpB,YAAM,IAAI,MAAM,yBAAyB,KAAK,OAAO,QAAQ,WAAW;AAAA,IAC5E;AAAA,EACJ;AAMJ;;;ACjEA,iBAAsB;AAOf,IAAM,oBAAN,cAAgC,aAAa;AAAA,EAGhD,YAAY,QAAa;AACrB,UAAM,MAAM;AAHhB,wBAAQ;AAIJ,SAAK,SAAS,IAAI,WAAAE,QAAU;AAAA,MACxB,QAAQ,KAAK,OAAO;AAAA,MACpB,SAAS,KAAK,OAAO;AAAA,IACzB,CAAC;AAAA,EACL;AAAA,EAEM,aAAa,SAA6D;AAAA;AAlBpF;AAmBQ,YAAM,WAAW,KAAK,eAAe,OAAO;AAC5C,YAAM,gBAAe,cAAS,KAAK,OAAK,EAAE,SAAS,QAAQ,MAAtC,mBAAyC;AAC9D,YAAM,eAAe,SAAS,OAAO,OAAK,EAAE,SAAS,QAAQ;AAE7D,YAAM,WAAW,MAAM,KAAK,OAAO,SAAS,OAAO;AAAA,QAC/C,OAAO,KAAK,OAAO;AAAA,QACnB,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY,KAAK,OAAO,aAAa;AAAA,QACrC,aAAa,KAAK,OAAO;AAAA,MAC7B,CAAC;AAED,YAAM,cAAc,SAAS,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AAEhE,aAAO;AAAA,QACH,OAAM,2CAAa,UAAS,SAAS,YAAY,OAAO;AAAA,QACxD,OAAO;AAAA,UACH,cAAc,SAAS,MAAM;AAAA,UAC7B,kBAAkB,SAAS,MAAM;AAAA,UACjC,aAAa,SAAS,MAAM,eAAe,SAAS,MAAM;AAAA,QAC9D;AAAA,QACA,cAAc,SAAS;AAAA,MAC3B;AAAA,IACJ;AAAA;AAAA,EAEO,WAAW,SAAkD;AAAA;AA5CxE;AA6CQ,YAAM,WAAW,KAAK,eAAe,OAAO;AAC5C,YAAM,gBAAe,cAAS,KAAK,OAAK,EAAE,SAAS,QAAQ,MAAtC,mBAAyC;AAC9D,YAAM,eAAe,SAAS,OAAO,OAAK,EAAE,SAAS,QAAQ;AAE7D,YAAM,SAAS,kBAAM,KAAK,OAAO,SAAS,OAAO;AAAA,QAC7C,OAAO,KAAK,OAAO;AAAA,QACnB,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY,KAAK,OAAO,aAAa;AAAA,QACrC,aAAa,KAAK,OAAO;AAAA,MAC7B,CAAC;AAED;AAAA,mCAA0B,SAA1B,uFAAkC;AAAvB,gBAAM,QAAjB;AACI,cAAI,MAAM,SAAS,yBAAyB,MAAM,MAAM,SAAS,cAAc;AAC3E,kBAAM,EAAE,MAAM,WAAW,SAAS,MAAM,MAAM,KAAK;AAAA,UACvD;AAEA,cAAI,MAAM,SAAS,gBAAgB;AAC/B,kBAAM,UAAU,kBAAM,OAAO,aAAa;AAC1C,kBAAM;AAAA,cACF,MAAM;AAAA,cACN,MAAM;AAAA,gBACF,cAAc,QAAQ;AAAA,gBACtB,OAAO;AAAA,kBACH,cAAc,QAAQ,MAAM;AAAA,kBAC5B,kBAAkB,QAAQ,MAAM;AAAA,kBAChC,aAAa,QAAQ,MAAM,eAAe,QAAQ,MAAM;AAAA,gBAC5D;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,eAnBA,MAzDR;AAyDQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoBJ;AAAA;AAAA,EAEM,eAAkB,SAAuE;AAAA;AAC3F,YAAM,eAAe,MAAM,KAAK,aAAa,iCACtC,UADsC;AAAA,QAEzC,UAAU;AAAA,UACN,GAAG,QAAQ;AAAA,UACX;AAAA,YACI,MAAM;AAAA,YACN,SAAS,iDAAiD,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UAC5F;AAAA,QACJ;AAAA,MACJ,EAAC;AAED,YAAM,SAAS,KAAK,MAAM,aAAa,IAAI;AAC3C,aAAO;AAAA,QACH;AAAA,QACA,MAAM,aAAa;AAAA,QACnB,OAAO,aAAa;AAAA,MACxB;AAAA,IACJ;AAAA;AAAA,EAEO,aAAgB,SAAuD;AAAA;AAC1E,UAAI,kBAAkB;AAEtB;AAAA,mCAA0B,KAAK,WAAW,OAAO,IAAjD,uFAAoD;AAAzC,gBAAM,QAAjB;AACI,cAAI,MAAM,SAAS,WAAW;AAC1B,+BAAmB,MAAM;AAEzB,gBAAI;AACA,oBAAM,UAAU,KAAK,MAAM,eAAe;AAC1C,oBAAM,EAAE,MAAM,WAAW,SAAS,MAAM,gBAAgB;AAAA,YAC5D,SAAS,GAAG;AAAA,YAEZ;AAAA,UACJ;AAAA,QACJ;AAAA,eAXA,MAtGR;AAsGQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,eAAe;AACzC,cAAM,EAAE,MAAM,YAAY,QAAQ,MAAM,gBAAgB;AAAA,MAC5D,SAAS,GAAG;AACR,cAAM,EAAE,MAAM,SAAS,OAAO,IAAI,MAAM,0BAA0B,EAAE;AAAA,MACxE;AAAA,IACJ;AAAA;AACJ;;;AC5GO,IAAe,qBAAf,cAA0C,aAAa;AAAA;AAAA;AAAA;AAAA,EAI1C,YACZ,KACA,SACA,SAAS,OACQ;AAAA;AACjB,YAAM,UAAkC;AAAA,QACpC,gBAAgB;AAAA,SACX,QAAQ,WAAsC,CAAC;AAGxD,UAAI,KAAK,OAAO,QAAQ;AACpB,gBAAQ,eAAe,IAAI,UAAU,KAAK,OAAO,MAAM;AAAA,MAC3D;AAEA,YAAM,WAAW,MAAM,MAAM,KAAK,iCAC3B,UAD2B;AAAA,QAE9B;AAAA,MACJ,EAAC;AAED,UAAI,CAAC,SAAS,MAAM,CAAC,QAAQ;AACzB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAM,IAAI,MAAM,4BAA4B,SAAS,MAAM,IAAI,SAAS,EAAE;AAAA,MAC9E;AAEA,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKU,YAAY,MAAsB;AACxC,UAAM,UAAU,KAAK,OAAO,WAAW,KAAK,kBAAkB;AAC9D,WAAO,GAAG,OAAO,GAAG,IAAI;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAUiB,eAAe,UAAwC;AAAA;AACpE,YAAM,SAAS,SAAS,KAAM,UAAU;AACxC,YAAM,UAAU,IAAI,YAAY;AAChC,UAAI,SAAS;AAEb,UAAI;AACA,eAAO,MAAM;AACT,gBAAM,EAAE,MAAM,MAAM,IAAI,kBAAM,OAAO,KAAK;AAC1C,cAAI,KAAM;AAEV,oBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,gBAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,mBAAS,MAAM,IAAI,KAAK;AAExB,qBAAW,QAAQ,OAAO;AACtB,gBAAI,KAAK,WAAW,QAAQ,GAAG;AAC3B,oBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,kBAAI,SAAS,SAAU;AAEvB,kBAAI;AACA,sBAAM,KAAK,MAAM,IAAI;AAAA,cACzB,SAAS,GAAG;AAAA,cAEZ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,UAAE;AACE,eAAO,YAAY;AAAA,MACvB;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKU,iBAAiB,SAA8B,SAAS,OAAY;AAC1E,WAAO;AAAA,MACH,OAAO,KAAK,OAAO;AAAA,MACnB,UAAU,KAAK,eAAe,OAAO;AAAA,MACrC,YAAY,KAAK,OAAO;AAAA,MACxB,aAAa,KAAK,OAAO;AAAA,MACzB,OAAO,KAAK,OAAO;AAAA,MACnB,mBAAmB,KAAK,OAAO;AAAA,MAC/B,kBAAkB,KAAK,OAAO;AAAA,MAC9B,MAAM,KAAK,OAAO;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AACJ;;;AC5FO,IAAM,iBAAN,cAA6B,mBAAmB;AAAA,EACzC,oBAA4B;AAElC,QAAI,CAAC,KAAK,OAAO,SAAS;AACtB,YAAM,IAAI;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,QAAQ,KAAK,OAAO;AAAA,MAC1B;AAAA,IACJ;AACA,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA,EAEM,aAAa,SAA6D;AAAA;AA/BpF;AAgCQ,WAAK,eAAe;AAEpB,UAAI;AACA,cAAM,WAAW,MAAM,KAAK;AAAA,UACxB,KAAK,YAAY,mBAAmB;AAAA,UACpC;AAAA,YACI,QAAQ;AAAA,YACR,MAAM,KAAK,UAAU,KAAK,iBAAiB,OAAO,CAAC;AAAA,UACvD;AAAA,QACJ;AAEA,cAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,YAAI,CAAC,KAAK,WAAW,KAAK,QAAQ,WAAW,GAAG;AAC5C,gBAAM,IAAI;AAAA,YACN;AAAA,YACA;AAAA,YACA,SAAS;AAAA,YACT,EAAE,UAAU,KAAK;AAAA,UACrB;AAAA,QACJ;AAEA,eAAO;AAAA,UACH,MAAM,KAAK,QAAQ,CAAC,EAAE,QAAQ;AAAA,UAC9B,OAAO;AAAA,YACH,gBAAc,UAAK,UAAL,mBAAY,kBAAiB;AAAA,YAC3C,oBAAkB,UAAK,UAAL,mBAAY,sBAAqB;AAAA,YACnD,eAAa,UAAK,UAAL,mBAAY,iBAAgB;AAAA,UAC7C;AAAA,UACA,cAAc,KAAK,QAAQ,CAAC,EAAE,iBAAiB;AAAA,QACnD;AAAA,MACJ,SAAS,OAAO;AACZ,cAAM,IAAI;AAAA,UACN;AAAA,UACA,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UACzC;AAAA,UACA,EAAE,eAAe,MAAM;AAAA,QAC3B;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEO,WAAW,SAAkD;AAAA;AAzExE;AA0EQ,WAAK,eAAe;AAEpB,UAAI;AACA,cAAM,WAAW,kBAAM,KAAK;AAAA,UACxB,KAAK,YAAY,mBAAmB;AAAA,UACpC;AAAA,YACI,QAAQ;AAAA,YACR,MAAM,KAAK,UAAU,KAAK,iBAAiB,SAAS,IAAI,CAAC;AAAA,UAC7D;AAAA,UACA;AAAA,QACJ;AAEA;AAAA,qCAAyB,KAAK,eAAe,QAAQ,IAArD,uFAAwD;AAA7C,kBAAM,OAAjB;AACI,kBAAM,WAAU,sBAAK,YAAL,mBAAe,OAAf,mBAAmB,UAAnB,mBAA0B;AAE1C,gBAAI,SAAS;AACT,oBAAM,EAAE,MAAM,WAAW,QAAQ;AAAA,YACrC;AAEA,iBAAI,gBAAK,YAAL,mBAAe,OAAf,mBAAmB,eAAe;AAClC,oBAAM;AAAA,gBACF,MAAM;AAAA,gBACN,MAAM;AAAA,kBACF,cAAc,KAAK,QAAQ,CAAC,EAAE,iBAAiB;AAAA,kBAC/C,OAAO;AAAA,oBACH,gBAAc,UAAK,UAAL,mBAAY,kBAAiB;AAAA,oBAC3C,oBAAkB,UAAK,UAAL,mBAAY,sBAAqB;AAAA,oBACnD,eAAa,UAAK,UAAL,mBAAY,iBAAgB;AAAA,kBAC7C;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,iBApBA,MAtFZ;AAsFY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBJ,SAASC,QAAO;AACZ,cAAM;AAAA,UACF,MAAM;AAAA,UACN,OAAO,IAAI;AAAA,YACP;AAAA,YACAA,kBAAiB,QAAQA,OAAM,UAAU;AAAA,YACzC;AAAA,YACA,EAAE,eAAeA,OAAM;AAAA,UAC3B;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEM,eAAkB,SAAuE;AAAA;AAC3F,YAAM,kBAAkB,iCACjB,UADiB;AAAA,QAEpB,UAAU;AAAA,UACN,GAAG,QAAQ;AAAA,UACX;AAAA,YACI,MAAM;AAAA,YACN,SAAS,iDAAiD,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UAC5F;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,eAAe,MAAM,KAAK,aAAa,eAAe;AAE5D,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,aAAa,IAAI;AAC3C,eAAO;AAAA,UACH;AAAA,UACA,MAAM,aAAa;AAAA,UACnB,OAAO,aAAa;AAAA,QACxB;AAAA,MACJ,SAAS,OAAO;AACZ,cAAM,IAAI;AAAA,UACN;AAAA,UACA,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC1F;AAAA,UACA,EAAE,cAAc,aAAa,KAAK;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEO,aAAgB,SAAuD;AAAA;AAC1E,UAAI,kBAAkB;AAEtB;AAAA,mCAA0B,KAAK,WAAW,OAAO,IAAjD,uFAAoD;AAAzC,gBAAM,QAAjB;AACI,cAAI,MAAM,SAAS,WAAW;AAC1B,+BAAmB,MAAM;AAEzB,gBAAI;AACA,oBAAM,UAAU,KAAK,MAAM,eAAe;AAC1C,oBAAM,EAAE,MAAM,WAAW,SAAS,MAAM,gBAAgB;AAAA,YAC5D,SAAS,GAAG;AAAA,YAEZ;AAAA,UACJ;AAAA,QACJ;AAAA,eAXA,MA1JR;AA0JQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,eAAe;AACzC,cAAM,EAAE,MAAM,YAAY,QAAQ,MAAM,gBAAgB;AAAA,MAC5D,SAAS,GAAG;AACR,cAAM,EAAE,MAAM,SAAS,OAAO,IAAI,MAAM,0BAA0B,EAAE;AAAA,MACxE;AAAA,IACJ;AAAA;AACJ;;;AC9KA,2BAAoD;AAkB7C,IAAM,iBAAN,cAA6B,aAAa;AAAA,EAI7C,YAAY,QAAa;AACrB,UAAM,MAAM;AAJhB,wBAAQ;AACR,wBAAQ;AAIJ,SAAK,QAAQ,IAAI,wCAAmB,KAAK,OAAO,MAAO;AACvD,SAAK,QAAQ,KAAK,MAAM,mBAAmB;AAAA,MACvC,OAAO,KAAK,OAAO;AAAA,MACnB,kBAAkB;AAAA,QACd,iBAAiB,KAAK,OAAO;AAAA,QAC7B,aAAa,KAAK,OAAO;AAAA,QACzB,MAAM,KAAK,OAAO;AAAA,QAClB,eAAe,KAAK,OAAO;AAAA,MAC/B;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,UAA4B;AACrD,WAAO,SAAS,IAAI,UAAQ;AAAA,MACxB,MAAM,IAAI,SAAS,cAAc,UAAU;AAAA,MAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,QAAQ,CAAC;AAAA,IACjC,EAAE;AAAA,EACN;AAAA,EAEM,aAAa,SAA6D;AAAA;AA9CpF;AA+CQ,YAAM,WAAW,KAAK,eAAe,OAAO;AAC5C,YAAM,gBAAe,cAAS,KAAK,OAAK,EAAE,SAAS,QAAQ,MAAtC,mBAAyC;AAC9D,YAAM,uBAAuB,SAAS,OAAO,OAAK,EAAE,SAAS,QAAQ;AAErE,UAAI;AACA,cAAM,OAAO,KAAK,MAAM,UAAU;AAAA,UAC9B,SAAS,KAAK,qBAAqB,qBAAqB,MAAM,GAAG,EAAE,CAAC;AAAA,UACpE,mBAAmB;AAAA,QACvB,CAAC;AAED,cAAM,cAAc,qBAAqB,qBAAqB,SAAS,CAAC;AACxE,cAAM,SAAS,MAAM,KAAK,YAAY,YAAY,OAAO;AACzD,cAAM,WAAW,OAAO;AAExB,eAAO;AAAA,UACH,MAAM,SAAS,KAAK;AAAA,UACpB,OAAO;AAAA,YACH,gBAAc,cAAS,kBAAT,mBAAwB,qBAAoB;AAAA,YAC1D,oBAAkB,cAAS,kBAAT,mBAAwB,yBAAwB;AAAA,YAClE,eAAa,cAAS,kBAAT,mBAAwB,oBAAmB;AAAA,UAC5D;AAAA,UACA,cAAc,KAAK,uBAAsB,oBAAS,eAAT,mBAAsB,OAAtB,mBAA0B,YAAY;AAAA,UAC/E,UAAU;AAAA,YACN,gBAAe,oBAAS,eAAT,mBAAsB,OAAtB,mBAA0B;AAAA,UAC7C;AAAA,QACJ;AAAA,MACJ,SAAS,OAAO;AACZ,cAAM,IAAI;AAAA,UACN;AAAA,UACA,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UACzC;AAAA,UACA,EAAE,eAAe,MAAM;AAAA,QAC3B;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEO,WAAW,SAAkD;AAAA;AAnFxE;AAoFQ,YAAM,WAAW,KAAK,eAAe,OAAO;AAC5C,YAAM,gBAAe,cAAS,KAAK,OAAK,EAAE,SAAS,QAAQ,MAAtC,mBAAyC;AAC9D,YAAM,uBAAuB,SAAS,OAAO,OAAK,EAAE,SAAS,QAAQ;AAErE,UAAI;AACA,cAAM,OAAO,KAAK,MAAM,UAAU;AAAA,UAC9B,SAAS,KAAK,qBAAqB,qBAAqB,MAAM,GAAG,EAAE,CAAC;AAAA,UACpE,mBAAmB;AAAA,QACvB,CAAC;AAED,cAAM,cAAc,qBAAqB,qBAAqB,SAAS,CAAC;AACxE,cAAM,SAAS,kBAAM,KAAK,kBAAkB,YAAY,OAAO;AAE/D;AAAA,qCAA0B,OAAO,SAAjC,uFAAyC;AAA9B,kBAAM,QAAjB;AACI,kBAAM,OAAO,MAAM,KAAK;AACxB,gBAAI,MAAM;AACN,oBAAM,EAAE,MAAM,WAAW,SAAS,KAAK;AAAA,YAC3C;AAAA,UACJ;AAAA,iBALA,MAjGZ;AAiGY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,cAAM,WAAW,kBAAM,OAAO;AAC9B,cAAM;AAAA,UACF,MAAM;AAAA,UACN,MAAM;AAAA,YACF,cAAc,KAAK,uBAAsB,oBAAS,eAAT,mBAAsB,OAAtB,mBAA0B,YAAY;AAAA,YAC/E,OAAO;AAAA,cACH,gBAAc,cAAS,kBAAT,mBAAwB,qBAAoB;AAAA,cAC1D,oBAAkB,cAAS,kBAAT,mBAAwB,yBAAwB;AAAA,cAClE,eAAa,cAAS,kBAAT,mBAAwB,oBAAmB;AAAA,YAC5D;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,SAASC,QAAO;AACZ,cAAM;AAAA,UACF,MAAM;AAAA,UACN,OAAO,IAAI;AAAA,YACP;AAAA,YACAA,kBAAiB,QAAQA,OAAM,UAAU;AAAA,YACzC;AAAA,YACA,EAAE,eAAeA,OAAM;AAAA,UAC3B;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEM,eAAkB,SAAuE;AAAA;AAC3F,YAAM,kBAAkB,iCACjB,UADiB;AAAA,QAEpB,UAAU;AAAA,UACN,GAAG,QAAQ;AAAA,UACX;AAAA,YACI,MAAM;AAAA,YACN,SAAS,iDAAiD,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UAC5F;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,eAAe,MAAM,KAAK,aAAa,eAAe;AAE5D,UAAI,WAAW,aAAa,KAAK,KAAK;AACtC,YAAM,YAAY,SAAS,MAAM,4BAA4B;AAC7D,UAAI,WAAW;AACX,mBAAW,UAAU,CAAC;AAAA,MAC1B;AAEA,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,eAAO;AAAA,UACH;AAAA,UACA,MAAM,aAAa;AAAA,UACnB,OAAO,aAAa;AAAA,QACxB;AAAA,MACJ,SAAS,OAAO;AACZ,cAAM,IAAI;AAAA,UACN;AAAA,UACA,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC1F;AAAA,UACA,EAAE,cAAc,aAAa,KAAK;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEO,aAAgB,SAAuD;AAAA;AAC1E,UAAI,kBAAkB;AAEtB;AAAA,mCAA0B,KAAK,WAAW,OAAO,IAAjD,uFAAoD;AAAzC,gBAAM,QAAjB;AACI,cAAI,MAAM,SAAS,WAAW;AAC1B,+BAAmB,MAAM;AAEzB,gBAAIC,YAAW,gBAAgB,KAAK;AACpC,kBAAMC,aAAYD,UAAS,MAAM,4BAA4B;AAC7D,gBAAIC,YAAW;AACX,cAAAD,YAAWC,WAAU,CAAC;AAAA,YAC1B;AAEA,gBAAI;AACA,oBAAM,UAAU,KAAK,MAAMD,SAAQ;AACnC,oBAAM,EAAE,MAAM,WAAW,SAAS,MAAM,gBAAgB;AAAA,YAC5D,SAAS,GAAG;AAAA,YAEZ;AAAA,UACJ;AAAA,QACJ;AAAA,eAjBA,MAzKR;AAyKQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA,UAAI,WAAW,gBAAgB,KAAK;AACpC,YAAM,YAAY,SAAS,MAAM,4BAA4B;AAC7D,UAAI,WAAW;AACX,mBAAW,UAAU,CAAC;AAAA,MAC1B;AAEA,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,cAAM,EAAE,MAAM,YAAY,QAAQ,MAAM,gBAAgB;AAAA,MAC5D,SAAS,GAAG;AACR,cAAM;AAAA,UACF,MAAM;AAAA,UACN,OAAO,IAAI,MAAM,6BAA6B,gBAAgB,UAAU,GAAG,GAAG,CAAC,KAAK;AAAA,QACxF;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEQ,sBAAsB,QAAsE;AAChG,UAAM,UAA+B;AAAA,MACjC,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,MACV,cAAc;AAAA,MACd,SAAS;AAAA,IACb;AACA,WAAO,QAAQ,UAAU,MAAM,KAAK;AAAA,EACxC;AACJ;;;ACvNA,oBAAmB;AAOZ,IAAM,iBAAN,cAA6B,aAAa;AAAA,EAG7C,YAAY,QAAa;AACrB,UAAM,MAAM;AAHhB,wBAAQ;AAIJ,SAAK,SAAS,IAAI,cAAAE,QAAO;AAAA,MACrB,QAAQ,KAAK,OAAO;AAAA,MACpB,SAAS,KAAK,OAAO;AAAA,IACzB,CAAC;AAAA,EACL;AAAA,EAEM,aAAa,SAA6D;AAAA;AAlBpF;AAmBQ,YAAM,aAAa,MAAM,KAAK,OAAO,KAAK,YAAY,OAAO;AAAA,QACzD,OAAO,KAAK,OAAO;AAAA,QACnB,UAAU,KAAK,eAAe,OAAO;AAAA,QACrC,YAAY,KAAK,OAAO;AAAA,QACxB,aAAa,KAAK,OAAO;AAAA,QACzB,OAAO,KAAK,OAAO;AAAA,QACnB,mBAAmB,KAAK,OAAO;AAAA,QAC/B,kBAAkB,KAAK,OAAO;AAAA,QAC9B,MAAM,KAAK,OAAO;AAAA,MACtB,CAAC;AAED,aAAO;AAAA,QACH,MAAM,WAAW,QAAQ,CAAC,EAAE,QAAQ,WAAW;AAAA,QAC/C,OAAO;AAAA,UACH,gBAAc,gBAAW,UAAX,mBAAkB,kBAAiB;AAAA,UACjD,oBAAkB,gBAAW,UAAX,mBAAkB,sBAAqB;AAAA,UACzD,eAAa,gBAAW,UAAX,mBAAkB,iBAAgB;AAAA,QACnD;AAAA,QACA,cAAc,WAAW,QAAQ,CAAC,EAAE;AAAA,MACxC;AAAA,IACJ;AAAA;AAAA,EAEO,WAAW,SAAkD;AAAA;AAzCxE;AA0CQ,YAAM,SAAS,kBAAM,KAAK,OAAO,KAAK,YAAY,OAAO;AAAA,QACrD,OAAO,KAAK,OAAO;AAAA,QACnB,UAAU,KAAK,eAAe,OAAO;AAAA,QACrC,YAAY,KAAK,OAAO;AAAA,QACxB,aAAa,KAAK,OAAO;AAAA,QACzB,QAAQ;AAAA,MACZ,CAAC;AAED;AAAA,mCAA0B,SAA1B,uFAAkC;AAAvB,gBAAM,QAAjB;AACI,gBAAM,WAAU,iBAAM,QAAQ,CAAC,MAAf,mBAAkB,UAAlB,mBAAyB;AACzC,cAAI,SAAS;AACT,kBAAM,EAAE,MAAM,WAAW,QAAQ;AAAA,UACrC;AAEA,eAAI,WAAM,QAAQ,CAAC,MAAf,mBAAkB,eAAe;AACjC,kBAAM;AAAA,cACF,MAAM;AAAA,cACN,MAAM;AAAA,gBACF,cAAc,MAAM,QAAQ,CAAC,EAAE;AAAA,gBAC/B,OAAO,MAAM,QAAQ;AAAA,kBACjB,cAAc,MAAM,MAAM,iBAAiB;AAAA,kBAC3C,kBAAkB,MAAM,MAAM,qBAAqB;AAAA,kBACnD,aAAa,MAAM,MAAM,gBAAgB;AAAA,gBAC7C,IAAI;AAAA,cACR;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,eAnBA,MAlDR;AAkDQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoBJ;AAAA;AAAA,EAEM,eAAkB,SAAuE;AAAA;AAC3F,YAAM,eAAe,MAAM,KAAK,aAAa,iCACtC,UADsC;AAAA,QAEzC,UAAU;AAAA,UACN,GAAG,QAAQ;AAAA,UACX;AAAA,YACI,MAAM;AAAA,YACN,SAAS,iDAAiD,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UAC5F;AAAA,QACJ;AAAA,MACJ,EAAC;AAED,YAAM,SAAS,KAAK,MAAM,aAAa,IAAI;AAC3C,aAAO;AAAA,QACH;AAAA,QACA,MAAM,aAAa;AAAA,QACnB,OAAO,aAAa;AAAA,MACxB;AAAA,IACJ;AAAA;AAAA,EAEO,aAAgB,SAAuD;AAAA;AAC1E,UAAI,kBAAkB;AAEtB;AAAA,mCAA0B,KAAK,WAAW,OAAO,IAAjD,uFAAoD;AAAzC,gBAAM,QAAjB;AACI,cAAI,MAAM,SAAS,WAAW;AAC1B,+BAAmB,MAAM;AAEzB,gBAAI;AACA,oBAAM,UAAU,KAAK,MAAM,eAAe;AAC1C,oBAAM,EAAE,MAAM,WAAW,SAAS,MAAM,gBAAgB;AAAA,YAC5D,SAAS,GAAG;AAAA,YAEZ;AAAA,UACJ;AAAA,QACJ;AAAA,eAXA,MA/FR;AA+FQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,eAAe;AACzC,cAAM,EAAE,MAAM,YAAY,QAAQ,MAAM,gBAAgB;AAAA,MAC5D,SAAS,GAAG;AACR,cAAM,EAAE,MAAM,SAAS,OAAO,IAAI,MAAM,0BAA0B,EAAE;AAAA,MACxE;AAAA,IACJ;AAAA;AACJ;;;AClGO,IAAM,iBAAN,cAA6B,mBAAmB;AAAA,EACzC,oBAA4B;AAClC,WAAO;AAAA,EACX;AAAA,EAEM,aAAa,SAA6D;AAAA;AAtBpF;AAuBQ,WAAK,eAAe;AAEpB,UAAI;AACA,cAAM,WAAW,MAAM,KAAK;AAAA,UACxB,KAAK,YAAY,mBAAmB;AAAA,UACpC;AAAA,YACI,QAAQ;AAAA,YACR,MAAM,KAAK,UAAU,KAAK,iBAAiB,OAAO,CAAC;AAAA,UACvD;AAAA,QACJ;AAEA,cAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,YAAI,CAAC,KAAK,WAAW,KAAK,QAAQ,WAAW,GAAG;AAC5C,gBAAM,IAAI;AAAA,YACN;AAAA,YACA;AAAA,YACA,SAAS;AAAA,YACT,EAAE,UAAU,KAAK;AAAA,UACrB;AAAA,QACJ;AAEA,eAAO;AAAA,UACH,MAAM,KAAK,QAAQ,CAAC,EAAE,QAAQ;AAAA,UAC9B,OAAO;AAAA,YACH,gBAAc,UAAK,UAAL,mBAAY,kBAAiB;AAAA,YAC3C,oBAAkB,UAAK,UAAL,mBAAY,sBAAqB;AAAA,YACnD,eAAa,UAAK,UAAL,mBAAY,iBAAgB;AAAA,UAC7C;AAAA,UACA,cAAc,KAAK,gBAAgB,KAAK,QAAQ,CAAC,EAAE,aAAa;AAAA,QACpE;AAAA,MACJ,SAAS,OAAO;AACZ,cAAM,IAAI;AAAA,UACN;AAAA,UACA,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UACzC;AAAA,UACA,EAAE,eAAe,MAAM;AAAA,QAC3B;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEO,WAAW,SAAkD;AAAA;AAhExE;AAiEQ,WAAK,eAAe;AAEpB,UAAI;AACA,cAAM,WAAW,kBAAM,KAAK;AAAA,UACxB,KAAK,YAAY,mBAAmB;AAAA,UACpC;AAAA,YACI,QAAQ;AAAA,YACR,MAAM,KAAK,UAAU,KAAK,iBAAiB,SAAS,IAAI,CAAC;AAAA,UAC7D;AAAA,UACA;AAAA,QACJ;AAEA;AAAA,qCAAyB,KAAK,eAAe,QAAQ,IAArD,uFAAwD;AAA7C,kBAAM,OAAjB;AACI,kBAAM,WAAU,sBAAK,YAAL,mBAAe,OAAf,mBAAmB,UAAnB,mBAA0B;AAE1C,gBAAI,SAAS;AACT,oBAAM,EAAE,MAAM,WAAW,QAAQ;AAAA,YACrC;AAEA,iBAAI,gBAAK,YAAL,mBAAe,OAAf,mBAAmB,eAAe;AAClC,oBAAM;AAAA,gBACF,MAAM;AAAA,gBACN,MAAM;AAAA,kBACF,cAAc,KAAK,gBAAgB,KAAK,QAAQ,CAAC,EAAE,aAAa;AAAA,kBAChE,OAAO;AAAA,oBACH,gBAAc,UAAK,UAAL,mBAAY,kBAAiB;AAAA,oBAC3C,oBAAkB,UAAK,UAAL,mBAAY,sBAAqB;AAAA,oBACnD,eAAa,UAAK,UAAL,mBAAY,iBAAgB;AAAA,kBAC7C;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,iBApBA,MA7EZ;AA6EY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBJ,SAASC,QAAO;AACZ,cAAM;AAAA,UACF,MAAM;AAAA,UACN,OAAO,IAAI;AAAA,YACP;AAAA,YACAA,kBAAiB,QAAQA,OAAM,UAAU;AAAA,YACzC;AAAA,YACA,EAAE,eAAeA,OAAM;AAAA,UAC3B;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEM,eAAkB,SAAuE;AAAA;AAC3F,YAAM,kBAAkB,iCACjB,UADiB;AAAA,QAEpB,UAAU;AAAA,UACN,GAAG,QAAQ;AAAA,UACX;AAAA,YACI,MAAM;AAAA,YACN,SAAS,iDAAiD,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UAC5F;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,eAAe,MAAM,KAAK,aAAa,eAAe;AAE5D,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,aAAa,IAAI;AAC3C,eAAO;AAAA,UACH;AAAA,UACA,MAAM,aAAa;AAAA,UACnB,OAAO,aAAa;AAAA,QACxB;AAAA,MACJ,SAAS,OAAO;AACZ,cAAM,IAAI;AAAA,UACN;AAAA,UACA,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC1F;AAAA,UACA,EAAE,cAAc,aAAa,KAAK;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEO,aAAgB,SAAuD;AAAA;AAC1E,UAAI,kBAAkB;AAEtB;AAAA,mCAA0B,KAAK,WAAW,OAAO,IAAjD,uFAAoD;AAAzC,gBAAM,QAAjB;AACI,cAAI,MAAM,SAAS,WAAW;AAC1B,+BAAmB,MAAM;AAEzB,gBAAI;AACA,oBAAM,UAAU,KAAK,MAAM,eAAe;AAC1C,oBAAM,EAAE,MAAM,WAAW,SAAS,MAAM,gBAAgB;AAAA,YAC5D,SAAS,GAAG;AAAA,YAEZ;AAAA,UACJ;AAAA,QACJ;AAAA,eAXA,MAjJR;AAiJQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,eAAe;AACzC,cAAM,EAAE,MAAM,YAAY,QAAQ,MAAM,gBAAgB;AAAA,MAC5D,SAAS,GAAG;AACR,cAAM,EAAE,MAAM,SAAS,OAAO,IAAI,MAAM,0BAA0B,EAAE;AAAA,MACxE;AAAA,IACJ;AAAA;AAAA,EAEQ,gBAAgB,QAAqE;AACzF,UAAM,UAA+B;AAAA,MACjC,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,cAAc;AAAA,MACd,kBAAkB;AAAA,IACtB;AACA,WAAO,QAAQ,MAAM,KAAK;AAAA,EAC9B;AACJ;;;AClKO,SAAS,eAAe,QAA0C;AACrE,UAAQ,OAAO,UAAU;AAAA,IACrB,KAAK;AACD,aAAO,IAAI,eAAe,MAAM;AAAA,IACpC,KAAK;AACD,aAAO,IAAI,kBAAkB,MAAM;AAAA,IACvC,KAAK;AACD,aAAO,IAAI,eAAe,MAAM;AAAA,IACpC,KAAK;AACD,aAAO,IAAI,eAAe,MAAM;AAAA,IACpC,KAAK;AACD,aAAO,IAAI,eAAe,MAAM;AAAA,IACpC;AACI,YAAM,IAAI,MAAM,8BAA8B,OAAO,QAAQ,EAAE;AAAA,EACvE;AACJ;;;ACjBO,IAAM,kBAAN,MAAuC;AAAA,EAG1C,YAAY,aAA4D;AAFxE,wBAAQ;AAGJ,SAAK,cAAc;AAAA,EACvB;AAAA,EAEO,UAAU,QAAuD;AAAA;AACpE;AAAA,mCAA0B,SAA1B,uFAAkC;AAAvB,gBAAM,QAAjB;AACI,gBAAM,kBAAM,KAAK,YAAY,KAAK;AAAA,QACtC;AAAA,eAFA,MAnBR;AAmBQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAGJ;AAAA;AACJ;AAKO,IAAM,oBAAN,MAAsD;AAAA,EAIzD,YAAY,QAA0B;AAHtC,wBAAQ;AACR,wBAAQ,QAAO;AAGX,SAAK,SAAS,OAAO,OAAO,aAAa,EAAE;AAAA,EAC/C;AAAA,EAEM,OAA6C;AAAA;AAC/C,UAAI,KAAK,MAAM;AACX,eAAO,EAAE,OAAO,QAAkB,MAAM,KAAK;AAAA,MACjD;AAEA,YAAM,SAAS,MAAM,KAAK,OAAO,KAAK;AACtC,WAAK,OAAO,OAAO,QAAQ;AAC3B,aAAO,EAAE,OAAO,OAAO,OAAO,MAAM,KAAK,KAAK;AAAA,IAClD;AAAA;AAAA,EAEA,SAAe;AACX,SAAK,OAAO;AACZ,QAAI,KAAK,OAAO,QAAQ;AACpB,WAAK,OAAO,OAAO;AAAA,IACvB;AAAA,EACJ;AAAA,EAEA,CAAQ,OAAO,aAAa,IAA8B;AAAA;AACtD,aAAO,CAAC,KAAK,MAAM;AACf,cAAM,EAAE,OAAO,KAAK,IAAI,kBAAM,KAAK,KAAK;AACxC,YAAI,KAAM;AACV,cAAM;AAAA,MACV;AAAA,IACJ;AAAA;AACJ;AAiBO,SAAS,yBAAyB;AACrC,MAAI,aAAiE;AACrE,QAAM,UAAU,IAAI,YAAY;AAEhC,QAAM,WAAW,IAAI,eAA2B;AAAA,IAC5C,MAAM,MAAM;AACR,mBAAa;AAAA,IACjB;AAAA,IACA,SAAS;AACL,mBAAa;AAAA,IACjB;AAAA,EACJ,CAAC;AAED,QAAM,QAAQ,CAAC,SAAiB;AAC5B,QAAI,YAAY;AACZ,iBAAW,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC3C;AAAA,EACJ;AAEA,SAAO;AAAA,IACH;AAAA;AAAA;AAAA;AAAA,IAKA,UAAU,MAAiB;AACvB,YAAM,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA;AAAA,CAAM;AAAA,IAC7C;AAAA;AAAA;AAAA;AAAA,IAKA,WAAW,OAAoB;AAC3B,YAAM;AAAA,QAAuB,KAAK,UAAU;AAAA,QACxC,SAAS,MAAM;AAAA,QACf,MAAO,MAAc;AAAA,MACzB,CAAC,CAAC;AAAA;AAAA,CAAM;AAAA,IACZ;AAAA;AAAA;AAAA;AAAA,IAKA,WAAW,OAAe,MAAiB;AACvC,YAAM,UAAU,KAAK;AAAA,QAAW,KAAK,UAAU,IAAI,CAAC;AAAA;AAAA,CAAM;AAAA,IAC9D;AAAA;AAAA;AAAA;AAAA,IAKA,QAAc;AACV,UAAI,YAAY;AACZ,mBAAW,MAAM;AACjB,qBAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AACJ;AAeO,SAAS,mBACZ,QACA,SACQ;AACR,QAAM,SAAS,uBAAuB;AAGtC,GAAC,MAAY;AACT,QAAI;AACA;AAAA,mCAA0B,SAA1B,0EAAkC;AAAvB,gBAAM,QAAjB;AACI,iBAAO,UAAU,KAAK;AAAA,QAC1B;AAAA,eAFA,MA7JZ;AA6JY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,aAAO,MAAM;AAAA,IACjB,SAASC,QAAO;AACZ,aAAO,WAAWA,kBAAiB,QAAQA,SAAQ,IAAI,MAAM,OAAOA,MAAK,CAAC,CAAC;AAC3E,aAAO,MAAM;AAAA,IACjB;AAAA,EACJ,IAAG;AAEH,SAAO,IAAI,SAAS,OAAO,UAAU;AAAA,IACjC,SAAS;AAAA,MACL,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,cAAc;AAAA,OACX;AAAA,EAEX,CAAC;AACL;AAeA,SAAuB,eAAe,UAAwC;AAAA;AAC1E,QAAI,CAAC,SAAS,MAAM;AAChB,YAAM,IAAI,YAAY,uBAAuB;AAAA,IACjD;AAEA,UAAM,SAAS,SAAS,KAAK,UAAU;AACvC,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,SAAS;AAEb,QAAI;AACA,aAAO,MAAM;AACT,cAAM,EAAE,MAAM,MAAM,IAAI,kBAAM,OAAO,KAAK;AAE1C,YAAI,KAAM;AAEV,kBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,cAAM,QAAQ,OAAO,MAAM,MAAM;AACjC,iBAAS,MAAM,IAAI,KAAK;AAExB,mBAAW,QAAQ,OAAO;AACtB,cAAI,CAAC,KAAK,KAAK,EAAG;AAElB,gBAAM,QAAQ,KAAK,MAAM,eAAe;AACxC,cAAI,OAAO;AACP,gBAAI;AACA,oBAAM,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,YAC7B,SAAS,GAAG;AACR,sBAAQ,MAAM,6BAA6B,CAAC;AAAA,YAChD;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,UAAE;AACE,aAAO,YAAY;AAAA,IACvB;AAAA,EACJ;AAAA;AAOA,SAAuB,gBAAmB,SAA+C;AAAA;AACrF,UAAM,YAAY,QAAQ,IAAI,OAAK,EAAE,OAAO,aAAa,EAAE,CAAC;AAC5D,UAAM,UAAU,IAAI,IAAI,SAAS;AAEjC,WAAO,QAAQ,OAAO,GAAG;AACrB,YAAM,UAAU,kBAAM,QAAQ;AAAA,QAC1B,MAAM,KAAK,OAAO,EAAE,IAAI,CAAO,OAAI;AAAI,mBAAE,IAAI,QAAQ,MAAM,GAAG,KAAK,EAAE;AAAA,UAAE;AAAA,MAC3E;AAEA,UAAI,QAAQ,OAAO,MAAM;AACrB,gBAAQ,OAAO,QAAQ,EAAE;AAAA,MAC7B,OAAO;AACH,cAAM,QAAQ,OAAO;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ;AAAA;AAQA,SAAuB,aACnB,QACA,MACkB;AAAA;AAClB,QAAI,SAAc,CAAC;AAEnB;AAAA,iCAAyB,SAAzB,uFAAiC;AAAtB,cAAM,OAAjB;AACI,eAAO,KAAK,IAAI;AAChB,YAAI,OAAO,UAAU,MAAM;AACvB,gBAAM;AACN,mBAAS,CAAC;AAAA,QACd;AAAA,MACJ;AAAA,aANA,MArQJ;AAqQI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,QAAI,OAAO,SAAS,GAAG;AACnB,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAQA,SAAuB,eACnB,QACA,SACgB;AAAA;AAChB;AAAA,iCAAyB,SAAzB,uFAAiC;AAAtB,cAAM,OAAjB;AACI,cAAM;AACN,0BAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,OAAO,CAAC;AAAA,MAC7D;AAAA,aAHA,MA5RJ;AA4RI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAIJ;AAAA;;;AC3RA,IAAAC,wBAAyB;AAmBzB,IAAMC,kBAAuC;AAAA,EACzC,WAAW;AAAA,EACX,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,OAAO;AAAA,IACH,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAU;AAAA,EACd;AAAA,EACA,gBAAgB;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAClB;AAAA,EACA,WAAW;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,EACd;AACJ;AA8BO,IAAM,cAAN,cAA0B,sBAAAC,QAAa;AAAA,EAU1C,YAAY,QAAqB;AAC7B,UAAM;AAVV,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ,aAAY,KAAK,IAAI;AAIzB,SAAK,SAAS,kCAAKD,kBAAmB;AAKtC,SAAK,WAAW,eAAe,KAAK,MAAM;AAC1C,SAAK,eAAe,IAAI,aAAa,KAAK,OAAO,KAAK;AACtD,SAAK,iBAAiB,IAAI,eAAe,KAAK,OAAO,cAAc;AACnE,SAAK,cAAc,IAAI,YAAY,KAAK,OAAO,SAAS;AACxD,SAAK,UAAU,IAAI,iBAAiB;AAEpC,QAAI,KAAK,OAAO,gBAAgB;AAC5B,WAAK,eAAe,IAAI,aAAa;AAAA,QACjC,aAAa,KAAK,OAAO,YAAY;AAAA,MACzC,CAAC;AAAA,IACL;AAEA,SAAK,oBAAoB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAChC,SAAK,eAAe,GAAG,QAAQ,MAAM;AACjC,WAAK,KAAK,sBAAsB;AAChC,UAAI,KAAK,OAAO,OAAO;AACnB,gBAAQ,KAAK,sCAAsC;AAAA,MACvD;AAAA,IACJ,CAAC;AAED,SAAK,eAAe,GAAG,SAAS,MAAM;AAClC,WAAK,KAAK,uBAAuB;AACjC,UAAI,KAAK,OAAO,OAAO;AACnB,gBAAQ,IAAI,sCAAsC;AAAA,MACtD;AAAA,IACJ,CAAC;AAED,QAAI,KAAK,cAAc;AACnB,WAAK,aAAa,GAAG,WAAW,CAAC,SAAS;AACtC,aAAK,KAAK,iBAAiB,IAAI;AAAA,MACnC,CAAC;AAED,WAAK,aAAa,GAAG,SAAS,MAAM;AAChC,aAAK,KAAK,aAAa;AAAA,MAC3B,CAAC;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOM,aAAa,SAA6D;AAAA;AA3IpF;AA4IQ,YAAM,YAAY,KAAK,IAAI;AAE3B,UAAI;AAEA,cAAM,KAAK,YAAY,SAAQ,UAAK,OAAO,cAAZ,mBAAuB,QAAQ;AAG9D,cAAM,UAAU,MAAY;AACxB,iBAAO,MAAM,KAAK,eAAe,QAAQ,MAAY;AACjD,kBAAM,eAAe,kCAAK,KAAK,SAAW,QAAQ;AAClD,mBAAO,MAAM,KAAK,SAAS,aAAa,iCACjC,UADiC;AAAA,cAEpC,QAAQ;AAAA,YACZ,EAAC;AAAA,UACL,EAAC;AAAA,QACL;AAEA,YAAI;AAEJ,YAAI,KAAK,gBAAgB,KAAK,OAAO,gBAAgB;AACjD,mBAAS,MAAM,KAAK,aAAa;AAAA,YAC7B,MAAM,KAAK,aAAa,QAAQ,OAAO;AAAA,cACvC,aAAQ,WAAR,mBAAgB,kBAAiB;AAAA,UACrC;AAAA,QACJ,OAAO;AACH,mBAAS,MAAM,KAAK,aAAa,QAAQ,OAAO;AAAA,QACpD;AAEA,aAAK,QAAQ,cAAc,KAAK,IAAI,IAAI,SAAS;AACjD,aAAK,KAAK,mBAAmB,EAAE,SAAS,KAAK,IAAI,IAAI,UAAU,CAAC;AAEhE,eAAO;AAAA,MACX,SAAS,OAAO;AACZ,aAAK,QAAQ,cAAc,KAAK,IAAI,IAAI,SAAS;AACjD,aAAK,KAAK,iBAAiB,EAAE,OAAO,SAAS,KAAK,IAAI,IAAI,UAAU,CAAC;AACrE,cAAM;AAAA,MACV;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,WAAW,SAAkD;AAAA;AAxLxE;AAyLQ,YAAM,YAAY,KAAK,IAAI;AAE3B,UAAI;AACA,0BAAM,KAAK,YAAY,SAAQ,UAAK,OAAO,cAAZ,mBAAuB,QAAQ;AAE9D,cAAM,SAAS,KAAK,SAAS,WAAW,OAAO;AAE/C;AAAA,qCAA0B,SAA1B,uFAAkC;AAAvB,kBAAM,QAAjB;AACI,kBAAM;AAAA,UACV;AAAA,iBAFA,MAhMZ;AAgMY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,aAAK,QAAQ,cAAc,KAAK,IAAI,IAAI,SAAS;AACjD,aAAK,KAAK,mBAAmB,EAAE,SAAS,KAAK,IAAI,IAAI,WAAW,WAAW,KAAK,CAAC;AAAA,MACrF,SAASE,QAAO;AACZ,aAAK,QAAQ,cAAc,KAAK,IAAI,IAAI,SAAS;AACjD,aAAK,KAAK,iBAAiB,EAAE,OAAAA,QAAO,SAAS,KAAK,IAAI,IAAI,WAAW,WAAW,KAAK,CAAC;AACtF,cAAMA;AAAA,MACV;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOM,eACF,SACkC;AAAA;AApN1C;AAqNQ,YAAM,YAAY,KAAK,IAAI;AAE3B,UAAI;AACA,cAAM,KAAK,YAAY,SAAQ,UAAK,OAAO,cAAZ,mBAAuB,QAAQ;AAE9D,cAAM,UAAU,MAAY;AACxB,iBAAO,MAAM,KAAK,eAAe,QAAQ,MAAY;AACjD,mBAAO,MAAM,KAAK,SAAS,eAAkB,OAAO;AAAA,UACxD,EAAC;AAAA,QACL;AAEA,YAAI;AAEJ,YAAI,KAAK,gBAAgB,KAAK,OAAO,gBAAgB;AACjD,mBAAS,MAAM,KAAK,aAAa;AAAA,YAC7B,MAAM,KAAK,aAAa,QAAQ,OAAO;AAAA,cACvC,aAAQ,WAAR,mBAAgB,kBAAiB;AAAA,UACrC;AAAA,QACJ,OAAO;AACH,mBAAS,MAAM,KAAK,aAAa,QAAQ,OAAO;AAAA,QACpD;AAEA,aAAK,QAAQ,cAAc,KAAK,IAAI,IAAI,SAAS;AACjD,eAAO;AAAA,MACX,SAAS,OAAO;AACZ,aAAK,QAAQ,cAAc,KAAK,IAAI,IAAI,SAAS;AACjD,cAAM;AAAA,MACV;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,aACH,SACkB;AAAA;AA1P1B;AA2PQ,YAAM,YAAY,KAAK,IAAI;AAE3B,UAAI;AACA,0BAAM,KAAK,YAAY,SAAQ,UAAK,OAAO,cAAZ,mBAAuB,QAAQ;AAE9D,cAAM,SAAS,KAAK,SAAS,aAAgB,OAAO;AAEpD;AAAA,qCAA0B,SAA1B,uFAAkC;AAAvB,kBAAM,QAAjB;AACI,kBAAM;AAAA,UACV;AAAA,iBAFA,MAlQZ;AAkQY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,aAAK,QAAQ,cAAc,KAAK,IAAI,IAAI,SAAS;AAAA,MACrD,SAASA,QAAO;AACZ,aAAK,QAAQ,cAAc,KAAK,IAAI,IAAI,SAAS;AACjD,cAAMA;AAAA,MACV;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAA0B;AAhR9B;AAiRQ,UAAM,UAAU,KAAK,QAAQ,WAAW;AAExC,QAAI,SAA+C;AACnD,QAAI,KAAK,eAAe,SAAS,MAAM,QAAQ;AAC3C,eAAS;AAAA,IACb,WAAW,QAAQ,iBAAiB,QAAQ,qBAAqB,KAAK;AAClE,eAAS;AAAA,IACb;AAEA,WAAO;AAAA,MACH;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,QAAQ,KAAK,IAAI,IAAI,KAAK;AAAA,MAC1B,gBAAgB,KAAK,eAAe,SAAS;AAAA,MAC7C,oBAAmB,UAAK,iBAAL,mBAAmB;AAAA,MACtC,YAAW,UAAK,iBAAL,mBAAmB;AAAA,MAC9B;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACT,WAAO,KAAK,QAAQ,iBAAiB;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAoC;AAC7C,SAAK,SAAS,kCAAK,KAAK,SAAW;AAEnC,QAAI,OAAO,OAAO;AACd,WAAK,aAAa,aAAa,OAAO,KAAK;AAAA,IAC/C;AAEA,QAAI,OAAO,WAAW;AAClB,WAAK,cAAc,IAAI,YAAY,OAAO,SAAS;AAAA,IACvD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,sBAA4B;AACxB,SAAK,eAAe,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACZ,SAAK,eAAe,QAAQ;AAC5B,SAAK,YAAY,QAAQ;AACzB,QAAI,KAAK,cAAc;AACnB,WAAK,aAAa,MAAM;AAAA,IAC5B;AACA,SAAK,mBAAmB;AAAA,EAC5B;AACJ;AAOO,SAAS,kBAAkB,QAAkC;AAChE,SAAO,IAAI,YAAY,MAAM;AACjC;","names":["DEFAULT_CONFIG","EventEmitter","import_eventemitter3","CircuitState","DEFAULT_CONFIG","EventEmitter","Anthropic","error","error","jsonText","jsonMatch","OpenAI","error","error","import_eventemitter3","DEFAULT_CONFIG","EventEmitter","error"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/errors.ts","../src/utils/metrics.ts","../src/utils/rate-limiter.ts","../src/utils/request-queue.ts","../src/utils/retry.ts","../src/utils/circuit-breaker.ts","../src/providers/base.ts","../src/providers/anthropic/anthropic.ts","../src/providers/custom-base.ts","../src/providers/custom/custom.ts","../src/providers/google/google.ts","../src/providers/openai/openai.ts","../src/providers/sarvam/sarvam.ts","../src/providers/factory.ts","../src/stream/stream-reader.ts","../src/stream/stream-client.ts"],"sourcesContent":["\r\nexport * from \"./types\"\r\nexport * from \"./utils/errors\"\r\nexport * from \"./utils/metrics\"\r\nexport * from \"./utils/rate-limiter\"\r\nexport * from \"./utils/request-queue\"\r\nexport * from \"./utils/retry\"\r\nexport * from \"./utils/circuit-breaker\"\r\nexport * from \"./utils/errors\"\r\nexport * from \"./providers\"\r\nexport * from \"./stream/stream-reader\"\r\nexport * from \"./stream/stream-client\"","/**\r\n * Custom error classes for paprflare-kit\r\n * @module errors\r\n */\r\n\r\n/**\r\n * Base error class for all paprflare-kit errors\r\n */\r\nexport class FlareError extends Error {\r\n public readonly code: string;\r\n public readonly statusCode?: number;\r\n public readonly retryable: boolean;\r\n public readonly details?: Record<string, any>;\r\n\r\n constructor(\r\n message: string,\r\n code: string,\r\n statusCode?: number,\r\n retryable = false,\r\n details?: Record<string, any>\r\n ) {\r\n super(message);\r\n this.name = 'FlareError';\r\n this.code = code;\r\n this.statusCode = statusCode;\r\n this.retryable = retryable;\r\n this.details = details;\r\n Error.captureStackTrace(this, this.constructor);\r\n }\r\n}\r\n\r\n/**\r\n * Network-related errors\r\n */\r\nexport class NetworkError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'NETWORK_ERROR', undefined, true, details);\r\n this.name = 'NetworkError';\r\n }\r\n}\r\n\r\n/**\r\n * Timeout errors\r\n */\r\nexport class TimeoutError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'TIMEOUT_ERROR', 408, true, details);\r\n this.name = 'TimeoutError';\r\n }\r\n}\r\n\r\n/**\r\n * Rate limit exceeded errors\r\n */\r\nexport class RateLimitError extends FlareError {\r\n public readonly retryAfter?: number;\r\n\r\n constructor(message: string, retryAfter?: number, details?: Record<string, any>) {\r\n super(message, 'RATE_LIMIT_ERROR', 429, true, details);\r\n this.name = 'RateLimitError';\r\n this.retryAfter = retryAfter;\r\n }\r\n}\r\n\r\n/**\r\n * Authentication/authorization errors\r\n */\r\nexport class AuthenticationError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'AUTHENTICATION_ERROR', 401, false, details);\r\n this.name = 'AuthenticationError';\r\n }\r\n}\r\n\r\n/**\r\n * Invalid request errors\r\n */\r\nexport class ValidationError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'VALIDATION_ERROR', 400, false, details);\r\n this.name = 'ValidationError';\r\n }\r\n}\r\n\r\n/**\r\n * Circuit breaker open errors\r\n */\r\nexport class CircuitBreakerError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'CIRCUIT_BREAKER_OPEN', 503, true, details);\r\n this.name = 'CircuitBreakerError';\r\n }\r\n}\r\n\r\n/**\r\n * Provider-specific errors\r\n */\r\nexport class ProviderError extends FlareError {\r\n public readonly provider: string;\r\n\r\n constructor(provider: string, message: string, statusCode?: number, details?: Record<string, any>) {\r\n super(message, 'PROVIDER_ERROR', statusCode, true, details);\r\n this.name = 'ProviderError';\r\n this.provider = provider;\r\n }\r\n}\r\n\r\n/**\r\n * Streaming errors\r\n */\r\nexport class StreamError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'STREAM_ERROR', undefined, false, details);\r\n this.name = 'StreamError';\r\n }\r\n}\r\n\r\n/**\r\n * Parse/validation errors for structured output\r\n */\r\nexport class ParseError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'PARSE_ERROR', undefined, false, details);\r\n this.name = 'ParseError';\r\n }\r\n}\r\n\r\n/**\r\n * Content filter errors\r\n */\r\nexport class ContentFilterError extends FlareError {\r\n constructor(message: string, details?: Record<string, any>) {\r\n super(message, 'CONTENT_FILTER_ERROR', 400, false, details);\r\n this.name = 'ContentFilterError';\r\n }\r\n}\r\n\r\n/**\r\n * Check if an error is retryable\r\n */\r\nexport function isRetryableError(error: Error): boolean {\r\n if (error instanceof FlareError) {\r\n return error.retryable;\r\n }\r\n\r\n // Network errors are generally retryable\r\n if (error.message.includes('ECONNREFUSED') ||\r\n error.message.includes('ETIMEDOUT') ||\r\n error.message.includes('ENOTFOUND')) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Extract status code from error\r\n */\r\nexport function getErrorStatusCode(error: Error): number | undefined {\r\n if (error instanceof FlareError) {\r\n return error.statusCode;\r\n }\r\n return undefined;\r\n}","/**\r\n * Metrics collection and reporting\r\n * @module metrics\r\n */\r\n\r\nimport { MetricsData } from '../types';\r\n\r\n/**\r\n * Latency histogram for percentile calculation\r\n */\r\nclass LatencyHistogram {\r\n private samples: number[] = [];\r\n private maxSamples = 1000;\r\n\r\n add(latency: number): void {\r\n this.samples.push(latency);\r\n if (this.samples.length > this.maxSamples) {\r\n this.samples.shift();\r\n }\r\n }\r\n\r\n getPercentile(p: number): number {\r\n if (this.samples.length === 0) return 0;\r\n\r\n const sorted = [...this.samples].sort((a, b) => a - b);\r\n const index = Math.ceil((p / 100) * sorted.length) - 1;\r\n return sorted[Math.max(0, index)];\r\n }\r\n\r\n getAverage(): number {\r\n if (this.samples.length === 0) return 0;\r\n return this.samples.reduce((a, b) => a + b, 0) / this.samples.length;\r\n }\r\n\r\n clear(): void {\r\n this.samples = [];\r\n }\r\n}\r\n\r\n/**\r\n * Metrics collector for monitoring SDK performance\r\n * \r\n * @example\r\n * ```typescript\r\n * const metrics = new MetricsCollector();\r\n * \r\n * const start = Date.now();\r\n * try {\r\n * await doRequest();\r\n * metrics.recordSuccess(Date.now() - start);\r\n * } catch (error) {\r\n * metrics.recordFailure(Date.now() - start);\r\n * }\r\n * \r\n * console.log(metrics.getMetrics());\r\n * ```\r\n */\r\nexport class MetricsCollector {\r\n private totalRequests = 0;\r\n private successfulRequests = 0;\r\n private failedRequests = 0;\r\n private latencyHistogram = new LatencyHistogram();\r\n private startTime = Date.now();\r\n private windowStart = Date.now();\r\n private windowRequests = 0;\r\n private windowDuration = 60000; // 1 minute window\r\n\r\n /**\r\n * Record successful request\r\n * @param latency - Request latency in milliseconds\r\n */\r\n recordSuccess(latency: number): void {\r\n this.totalRequests++;\r\n this.successfulRequests++;\r\n this.latencyHistogram.add(latency);\r\n this.updateWindow();\r\n }\r\n\r\n /**\r\n * Record failed request\r\n * @param latency - Request latency in milliseconds\r\n */\r\n recordFailure(latency: number): void {\r\n this.totalRequests++;\r\n this.failedRequests++;\r\n this.latencyHistogram.add(latency);\r\n this.updateWindow();\r\n }\r\n\r\n /**\r\n * Update rolling window for RPS calculation\r\n */\r\n private updateWindow(): void {\r\n const now = Date.now();\r\n if (now - this.windowStart >= this.windowDuration) {\r\n this.windowRequests = 0;\r\n this.windowStart = now;\r\n }\r\n this.windowRequests++;\r\n }\r\n\r\n /**\r\n * Get current metrics\r\n */\r\n getMetrics(): MetricsData {\r\n const elapsed = (Date.now() - this.windowStart) / 1000;\r\n const rps = elapsed > 0 ? this.windowRequests / elapsed : 0;\r\n\r\n return {\r\n totalRequests: this.totalRequests,\r\n successfulRequests: this.successfulRequests,\r\n failedRequests: this.failedRequests,\r\n avgLatency: this.latencyHistogram.getAverage(),\r\n p95Latency: this.latencyHistogram.getPercentile(95),\r\n p99Latency: this.latencyHistogram.getPercentile(99),\r\n rps,\r\n };\r\n }\r\n\r\n /**\r\n * Get success rate as percentage\r\n */\r\n getSuccessRate(): number {\r\n if (this.totalRequests === 0) return 100;\r\n return (this.successfulRequests / this.totalRequests) * 100;\r\n }\r\n\r\n /**\r\n * Get uptime in milliseconds\r\n */\r\n getUptime(): number {\r\n return Date.now() - this.startTime;\r\n }\r\n\r\n /**\r\n * Reset all metrics\r\n */\r\n reset(): void {\r\n this.totalRequests = 0;\r\n this.successfulRequests = 0;\r\n this.failedRequests = 0;\r\n this.latencyHistogram.clear();\r\n this.windowStart = Date.now();\r\n this.windowRequests = 0;\r\n }\r\n\r\n /**\r\n * Get detailed statistics\r\n */\r\n getDetailedStats() {\r\n return {\r\n ...this.getMetrics(),\r\n successRate: this.getSuccessRate(),\r\n uptime: this.getUptime(),\r\n timestamp: Date.now(),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Global metrics collector instance\r\n */\r\nlet globalMetrics: MetricsCollector | null = null;\r\n\r\n/**\r\n * Get or create global metrics collector\r\n */\r\nexport function getGlobalMetrics(): MetricsCollector {\r\n if (!globalMetrics) {\r\n globalMetrics = new MetricsCollector();\r\n }\r\n return globalMetrics;\r\n}\r\n\r\n/**\r\n * Create a new metrics collector\r\n */\r\nexport function createMetricsCollector(): MetricsCollector {\r\n return new MetricsCollector();\r\n}\r\n\r\n/**\r\n * Measure function execution time and record metrics\r\n * @param fn - Function to measure\r\n * @param collector - Metrics collector (defaults to global)\r\n * @returns Function result\r\n */\r\nexport async function measureLatency<T>(\r\n fn: () => Promise<T>,\r\n collector: MetricsCollector = getGlobalMetrics()\r\n): Promise<T> {\r\n const start = Date.now();\r\n try {\r\n const result = await fn();\r\n collector.recordSuccess(Date.now() - start);\r\n return result;\r\n } catch (error) {\r\n collector.recordFailure(Date.now() - start);\r\n throw error;\r\n }\r\n}","/**\r\n * Rate limiter implementation\r\n * @module rateLimiter\r\n */\r\n\r\nimport { RateLimitConfig } from '../types';\r\nimport { RateLimitError } from './errors';\r\n\r\n/**\r\n * Token bucket for rate limiting\r\n */\r\ninterface TokenBucket {\r\n tokens: number;\r\n lastRefill: number;\r\n}\r\n\r\n/**\r\n * Default rate limit configuration\r\n */\r\nconst DEFAULT_CONFIG: Required<RateLimitConfig> = {\r\n maxRequests: 100,\r\n windowMs: 60000, // 1 minute\r\n clientId: 'default',\r\n};\r\n\r\n/**\r\n * Token bucket rate limiter\r\n * Implements sliding window algorithm for smooth rate limiting\r\n * \r\n * @example\r\n * ```typescript\r\n * const limiter = new RateLimiter({ maxRequests: 10, windowMs: 1000 });\r\n * \r\n * try {\r\n * await limiter.acquire('user-123');\r\n * // Request allowed\r\n * } catch (error) {\r\n * // Rate limit exceeded\r\n * }\r\n * ```\r\n */\r\nexport class RateLimiter {\r\n private buckets = new Map<string, TokenBucket>();\r\n private config: Required<RateLimitConfig>;\r\n private cleanupInterval?: NodeJS.Timeout;\r\n\r\n constructor(config: Partial<RateLimitConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n this.startCleanup();\r\n }\r\n\r\n /**\r\n * Acquire a token for rate limiting\r\n * @param clientId - Client identifier\r\n * @throws RateLimitError if rate limit exceeded\r\n */\r\n async acquire(clientId?: string): Promise<void> {\r\n const id = clientId || this.config.clientId;\r\n const bucket = this.getBucket(id);\r\n\r\n this.refillBucket(bucket);\r\n\r\n if (bucket.tokens <= 0) {\r\n const retryAfter = this.calculateRetryAfter(bucket);\r\n throw new RateLimitError(\r\n `Rate limit exceeded. Try again in ${Math.ceil(retryAfter / 1000)}s`,\r\n retryAfter,\r\n { clientId: id, limit: this.config.maxRequests, window: this.config.windowMs }\r\n );\r\n }\r\n\r\n bucket.tokens--;\r\n }\r\n\r\n /**\r\n * Check if request would be allowed without consuming token\r\n * @param clientId - Client identifier\r\n * @returns true if request would be allowed\r\n */\r\n check(clientId?: string): boolean {\r\n const id = clientId || this.config.clientId;\r\n const bucket = this.getBucket(id);\r\n this.refillBucket(bucket);\r\n return bucket.tokens > 0;\r\n }\r\n\r\n /**\r\n * Get remaining tokens for client\r\n * @param clientId - Client identifier\r\n * @returns Number of remaining requests\r\n */\r\n getRemaining(clientId?: string): number {\r\n const id = clientId || this.config.clientId;\r\n const bucket = this.getBucket(id);\r\n this.refillBucket(bucket);\r\n return Math.floor(bucket.tokens);\r\n }\r\n\r\n /**\r\n * Reset rate limit for client\r\n * @param clientId - Client identifier\r\n */\r\n reset(clientId?: string): void {\r\n const id = clientId || this.config.clientId;\r\n this.buckets.delete(id);\r\n }\r\n\r\n /**\r\n * Get or create bucket for client\r\n */\r\n private getBucket(clientId: string): TokenBucket {\r\n let bucket = this.buckets.get(clientId);\r\n\r\n if (!bucket) {\r\n bucket = {\r\n tokens: this.config.maxRequests,\r\n lastRefill: Date.now(),\r\n };\r\n this.buckets.set(clientId, bucket);\r\n }\r\n\r\n return bucket;\r\n }\r\n\r\n /**\r\n * Refill tokens based on elapsed time\r\n */\r\n private refillBucket(bucket: TokenBucket): void {\r\n const now = Date.now();\r\n const elapsed = now - bucket.lastRefill;\r\n\r\n if (elapsed <= 0) return;\r\n\r\n // Calculate tokens to add based on elapsed time\r\n const tokensToAdd = (elapsed / this.config.windowMs) * this.config.maxRequests;\r\n bucket.tokens = Math.min(this.config.maxRequests, bucket.tokens + tokensToAdd);\r\n bucket.lastRefill = now;\r\n }\r\n\r\n /**\r\n * Calculate retry-after time in milliseconds\r\n */\r\n private calculateRetryAfter(bucket: TokenBucket): number {\r\n const tokensNeeded = 1 - bucket.tokens;\r\n return (tokensNeeded / this.config.maxRequests) * this.config.windowMs;\r\n }\r\n\r\n /**\r\n * Start periodic cleanup of old buckets\r\n */\r\n private startCleanup(): void {\r\n this.cleanupInterval = setInterval(() => {\r\n const now = Date.now();\r\n const maxAge = this.config.windowMs * 2;\r\n\r\n for (const [clientId, bucket] of this.buckets.entries()) {\r\n if (now - bucket.lastRefill > maxAge) {\r\n this.buckets.delete(clientId);\r\n }\r\n }\r\n }, this.config.windowMs);\r\n\r\n // Prevent cleanup interval from keeping process alive\r\n if (this.cleanupInterval.unref) {\r\n this.cleanupInterval.unref();\r\n }\r\n }\r\n\r\n /**\r\n * Get statistics for monitoring\r\n */\r\n getStats() {\r\n return {\r\n totalClients: this.buckets.size,\r\n config: this.config,\r\n };\r\n }\r\n\r\n /**\r\n * Clean up resources\r\n */\r\n destroy(): void {\r\n if (this.cleanupInterval) {\r\n clearInterval(this.cleanupInterval);\r\n }\r\n this.buckets.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Create a rate limiter instance\r\n * @param config - Rate limit configuration\r\n * @returns RateLimiter instance\r\n */\r\nexport function createRateLimiter(config?: Partial<RateLimitConfig>): RateLimiter {\r\n return new RateLimiter(config);\r\n}","/**\r\n * Request queue with priority handling\r\n * @module requestQueue\r\n */\r\n\r\nimport EventEmitter from 'eventemitter3';\r\n\r\n/**\r\n * Queue item with priority and callbacks\r\n */\r\ninterface QueueItem<T> {\r\n id: string;\r\n priority: number;\r\n fn: () => Promise<T>;\r\n resolve: (value: T) => void;\r\n reject: (error: Error) => void;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Queue configuration\r\n */\r\nexport interface QueueConfig {\r\n /** Maximum concurrent requests */\r\n concurrency?: number;\r\n /** Maximum queue size */\r\n maxQueueSize?: number;\r\n /** Request timeout in ms */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * Default queue configuration\r\n */\r\nconst DEFAULT_CONFIG: Required<QueueConfig> = {\r\n concurrency: 10,\r\n maxQueueSize: 1000,\r\n timeout: 30000,\r\n};\r\n\r\n/**\r\n * Priority queue for managing concurrent requests\r\n * Higher priority items are processed first\r\n * \r\n * @example\r\n * ```typescript\r\n * const queue = new RequestQueue({ concurrency: 5 });\r\n * \r\n * queue.on('drain', () => console.log('Queue empty'));\r\n * \r\n * const result = await queue.add(\r\n * async () => fetchData(),\r\n * { priority: 10 }\r\n * );\r\n * ```\r\n */\r\nexport class RequestQueue extends EventEmitter {\r\n private queue: QueueItem<any>[] = [];\r\n private running = 0;\r\n private config: Required<QueueConfig>;\r\n private requestCounter = 0;\r\n\r\n constructor(config: Partial<QueueConfig> = {}) {\r\n super();\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Add request to queue\r\n * @param fn - Async function to execute\r\n * @param priority - Request priority (higher = processed first)\r\n * @returns Promise resolving to function result\r\n */\r\n add<T>(fn: () => Promise<T>, priority = 0): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n if (this.queue.length >= this.config.maxQueueSize) {\r\n reject(new Error('Queue is full'));\r\n return;\r\n }\r\n\r\n const item: QueueItem<T> = {\r\n id: `req_${++this.requestCounter}`,\r\n priority,\r\n fn,\r\n resolve,\r\n reject,\r\n timestamp: Date.now(),\r\n };\r\n\r\n // Insert item in priority order (higher priority first)\r\n const insertIndex = this.queue.findIndex(q => q.priority < priority);\r\n if (insertIndex === -1) {\r\n this.queue.push(item);\r\n } else {\r\n this.queue.splice(insertIndex, 0, item);\r\n }\r\n\r\n this.emit('enqueue', { id: item.id, priority, queueSize: this.queue.length });\r\n this.process();\r\n });\r\n }\r\n\r\n /**\r\n * Process queue items\r\n */\r\n private async process(): Promise<void> {\r\n while (this.running < this.config.concurrency && this.queue.length > 0) {\r\n const item = this.queue.shift()!;\r\n this.running++;\r\n\r\n this.emit('start', { id: item.id, running: this.running });\r\n\r\n this.executeItem(item).finally(() => {\r\n this.running--;\r\n this.emit('complete', { id: item.id, running: this.running });\r\n\r\n if (this.running === 0 && this.queue.length === 0) {\r\n this.emit('drain');\r\n }\r\n\r\n this.process();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Execute queue item with timeout\r\n */\r\n private async executeItem<T>(item: QueueItem<T>): Promise<void> {\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n setTimeout(() => {\r\n reject(new Error(`Request timeout after ${this.config.timeout}ms`));\r\n }, this.config.timeout);\r\n });\r\n\r\n try {\r\n const result = await Promise.race([item.fn(), timeoutPromise]);\r\n item.resolve(result);\r\n } catch (error) {\r\n item.reject(error instanceof Error ? error : new Error(String(error)));\r\n }\r\n }\r\n\r\n /**\r\n * Get queue size\r\n */\r\n size(): number {\r\n return this.queue.length;\r\n }\r\n\r\n /**\r\n * Get number of running requests\r\n */\r\n getRunning(): number {\r\n return this.running;\r\n }\r\n\r\n /**\r\n * Check if queue is empty\r\n */\r\n isEmpty(): boolean {\r\n return this.queue.length === 0 && this.running === 0;\r\n }\r\n\r\n /**\r\n * Clear all pending requests\r\n */\r\n clear(): void {\r\n const error = new Error('Queue cleared');\r\n for (const item of this.queue) {\r\n item.reject(error);\r\n }\r\n this.queue = [];\r\n this.emit('clear');\r\n }\r\n\r\n /**\r\n * Wait for queue to drain\r\n */\r\n async drain(): Promise<void> {\r\n if (this.isEmpty()) return;\r\n\r\n return new Promise(resolve => {\r\n this.once('drain', resolve);\r\n });\r\n }\r\n\r\n /**\r\n * Get queue statistics\r\n */\r\n getStats() {\r\n return {\r\n queueSize: this.queue.length,\r\n running: this.running,\r\n concurrency: this.config.concurrency,\r\n maxQueueSize: this.config.maxQueueSize,\r\n };\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n updateConfig(config: Partial<QueueConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n this.process(); // Trigger processing in case concurrency increased\r\n }\r\n}\r\n\r\n/**\r\n * Create a request queue instance\r\n * @param config - Queue configuration\r\n * @returns RequestQueue instance\r\n */\r\nexport function createRequestQueue(config?: Partial<QueueConfig>): RequestQueue {\r\n return new RequestQueue(config);\r\n}","/**\r\n * Retry logic with exponential backoff\r\n * @module retry\r\n */\r\n\r\nimport { RetryConfig } from '../types';\r\nimport { isRetryableError } from './errors';\r\n\r\n/**\r\n * Default retry configuration\r\n */\r\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\r\n maxRetries: 3,\r\n initialDelay: 1000,\r\n maxDelay: 30000,\r\n backoffMultiplier: 2,\r\n jitter: true,\r\n};\r\n\r\n/**\r\n * Calculate delay with exponential backoff\r\n * @param attempt - Current attempt number (0-indexed)\r\n * @param config - Retry configuration\r\n * @returns Delay in milliseconds\r\n */\r\nfunction calculateDelay(attempt: number, config: Required<RetryConfig>): number {\r\n const exponentialDelay = Math.min(\r\n config.initialDelay * Math.pow(config.backoffMultiplier, attempt),\r\n config.maxDelay\r\n );\r\n\r\n if (config.jitter) {\r\n // Add jitter: random value between 0 and exponentialDelay\r\n return Math.random() * exponentialDelay;\r\n }\r\n\r\n return exponentialDelay;\r\n}\r\n\r\n/**\r\n * Sleep for specified milliseconds\r\n * @param ms - Milliseconds to sleep\r\n */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * Retry a function with exponential backoff\r\n * @param fn - Async function to retry\r\n * @param config - Retry configuration\r\n * @param onRetry - Optional callback on retry attempt\r\n * @returns Promise resolving to function result\r\n * @throws Error after all retries exhausted\r\n * \r\n * @example\r\n * ```typescript\r\n * const result = await withRetry(\r\n * async () => fetchData(),\r\n * { maxRetries: 3, initialDelay: 1000 },\r\n * (attempt, error) => console.log(`Retry ${attempt}: ${error.message}`)\r\n * );\r\n * ```\r\n */\r\nexport async function withRetry<T>(\r\n fn: () => Promise<T>,\r\n config: Partial<RetryConfig> = {},\r\n onRetry?: (attempt: number, error: Error, delay: number) => void\r\n): Promise<T> {\r\n const retryConfig = { ...DEFAULT_RETRY_CONFIG, ...config };\r\n let lastError: Error;\r\n\r\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error));\r\n\r\n // Don't retry if not retryable or if this was the last attempt\r\n if (!isRetryableError(lastError) || attempt === retryConfig.maxRetries) {\r\n throw lastError;\r\n }\r\n\r\n const delay = calculateDelay(attempt, retryConfig);\r\n\r\n if (onRetry) {\r\n onRetry(attempt + 1, lastError, delay);\r\n }\r\n\r\n await sleep(delay);\r\n }\r\n }\r\n\r\n throw lastError!;\r\n}\r\n\r\n/**\r\n * Retry class with configurable behavior\r\n */\r\nexport class RetryHandler {\r\n private config: Required<RetryConfig>;\r\n\r\n constructor(config: Partial<RetryConfig> = {}) {\r\n this.config = { ...DEFAULT_RETRY_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Execute function with retry logic\r\n */\r\n async execute<T>(\r\n fn: () => Promise<T>,\r\n onRetry?: (attempt: number, error: Error, delay: number) => void\r\n ): Promise<T> {\r\n return withRetry(fn, this.config, onRetry);\r\n }\r\n\r\n /**\r\n * Update retry configuration\r\n */\r\n updateConfig(config: Partial<RetryConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n getConfig(): Required<RetryConfig> {\r\n return { ...this.config };\r\n }\r\n}\r\n\r\n/**\r\n * Create a retry handler with custom configuration\r\n * @param config - Retry configuration\r\n * @returns RetryHandler instance\r\n * \r\n * @example\r\n * ```typescript\r\n * const retry = createRetryHandler({ maxRetries: 5, initialDelay: 500 });\r\n * const result = await retry.execute(() => apiCall());\r\n * ```\r\n */\r\nexport function createRetryHandler(config?: Partial<RetryConfig>): RetryHandler {\r\n return new RetryHandler(config);\r\n}","/**\r\n * Circuit breaker pattern implementation\r\n * @module circuitBreaker\r\n */\r\n\r\nimport EventEmitter from 'eventemitter3';\r\nimport { CircuitBreakerConfig } from '../types';\r\nimport { CircuitBreakerError } from './errors';\r\n\r\n/**\r\n * Circuit breaker states\r\n */\r\nexport enum CircuitState {\r\n CLOSED = 'closed',\r\n OPEN = 'open',\r\n HALF_OPEN = 'half-open',\r\n}\r\n\r\n/**\r\n * Default circuit breaker configuration\r\n */\r\nconst DEFAULT_CONFIG: Required<CircuitBreakerConfig> = {\r\n failureThreshold: 5,\r\n resetTimeout: 60000,\r\n halfOpenRequests: 1,\r\n};\r\n\r\n/**\r\n * Circuit breaker implementation for fault tolerance\r\n * Prevents cascading failures by stopping requests to failing services\r\n * \r\n * States:\r\n * - CLOSED: Normal operation, requests pass through\r\n * - OPEN: Service failing, requests blocked\r\n * - HALF_OPEN: Testing if service recovered, limited requests allowed\r\n * \r\n * @example\r\n * ```typescript\r\n * const breaker = new CircuitBreaker({ failureThreshold: 3 });\r\n * \r\n * breaker.on('open', () => console.log('Circuit opened'));\r\n * breaker.on('close', () => console.log('Circuit closed'));\r\n * \r\n * const result = await breaker.execute(async () => {\r\n * return await fetchData();\r\n * });\r\n * ```\r\n */\r\nexport class CircuitBreaker extends EventEmitter {\r\n private state: CircuitState = CircuitState.CLOSED;\r\n private failureCount = 0;\r\n private successCount = 0;\r\n private lastFailureTime?: number;\r\n private resetTimer?: NodeJS.Timeout;\r\n private config: Required<CircuitBreakerConfig>;\r\n\r\n constructor(config: Partial<CircuitBreakerConfig> = {}) {\r\n super();\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Execute a function with circuit breaker protection\r\n * @param fn - Async function to execute\r\n * @returns Promise resolving to function result\r\n * @throws CircuitBreakerError if circuit is open\r\n */\r\n async execute<T>(fn: () => Promise<T>): Promise<T> {\r\n if (this.state === CircuitState.OPEN) {\r\n throw new CircuitBreakerError('Circuit breaker is open', {\r\n state: this.state,\r\n failureCount: this.failureCount,\r\n lastFailureTime: this.lastFailureTime,\r\n });\r\n }\r\n\r\n try {\r\n const result = await fn();\r\n this.onSuccess();\r\n return result;\r\n } catch (error) {\r\n this.onFailure();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Handle successful execution\r\n */\r\n private onSuccess(): void {\r\n this.failureCount = 0;\r\n\r\n if (this.state === CircuitState.HALF_OPEN) {\r\n this.successCount++;\r\n if (this.successCount >= this.config.halfOpenRequests) {\r\n this.close();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle failed execution\r\n */\r\n private onFailure(): void {\r\n this.failureCount++;\r\n this.lastFailureTime = Date.now();\r\n this.successCount = 0;\r\n\r\n if (this.failureCount >= this.config.failureThreshold) {\r\n this.open();\r\n }\r\n }\r\n\r\n /**\r\n * Open the circuit (block requests)\r\n */\r\n private open(): void {\r\n if (this.state === CircuitState.OPEN) return;\r\n\r\n this.state = CircuitState.OPEN;\r\n this.emit('open', { failureCount: this.failureCount });\r\n\r\n // Schedule reset attempt\r\n this.resetTimer = setTimeout(() => {\r\n this.halfOpen();\r\n }, this.config.resetTimeout);\r\n }\r\n\r\n /**\r\n * Enter half-open state (test if service recovered)\r\n */\r\n private halfOpen(): void {\r\n if (this.state === CircuitState.CLOSED) return;\r\n\r\n this.state = CircuitState.HALF_OPEN;\r\n this.successCount = 0;\r\n this.emit('half-open');\r\n }\r\n\r\n /**\r\n * Close the circuit (allow requests)\r\n */\r\n private close(): void {\r\n if (this.state === CircuitState.CLOSED) return;\r\n\r\n this.state = CircuitState.CLOSED;\r\n this.failureCount = 0;\r\n this.successCount = 0;\r\n this.lastFailureTime = undefined;\r\n\r\n if (this.resetTimer) {\r\n clearTimeout(this.resetTimer);\r\n this.resetTimer = undefined;\r\n }\r\n\r\n this.emit('close');\r\n }\r\n\r\n /**\r\n * Get current circuit state\r\n */\r\n getState(): CircuitState {\r\n return this.state;\r\n }\r\n\r\n /**\r\n * Get circuit statistics\r\n */\r\n getStats() {\r\n return {\r\n state: this.state,\r\n failureCount: this.failureCount,\r\n successCount: this.successCount,\r\n lastFailureTime: this.lastFailureTime,\r\n };\r\n }\r\n\r\n /**\r\n * Manually reset the circuit breaker\r\n */\r\n reset(): void {\r\n this.close();\r\n }\r\n\r\n /**\r\n * Clean up resources\r\n */\r\n destroy(): void {\r\n if (this.resetTimer) {\r\n clearTimeout(this.resetTimer);\r\n }\r\n this.removeAllListeners();\r\n }\r\n}\r\n\r\n/**\r\n * Create a circuit breaker instance\r\n * @param config - Circuit breaker configuration\r\n * @returns CircuitBreaker instance\r\n */\r\nexport function createCircuitBreaker(config?: Partial<CircuitBreakerConfig>): CircuitBreaker {\r\n return new CircuitBreaker(config);\r\n}","/**\r\n * Base provider interface and implementations\r\n * @module providers\r\n */\r\n\r\nimport type {\r\n GenerateObjectRequest,\r\n GenerateObjectResponse,\r\n GenerateTextRequest,\r\n GenerateTextResponse,\r\n Message,\r\n ModelConfig\r\n} from \"../types\";\r\n\r\n/**\r\n * Base AI provider interface\r\n */\r\nexport interface AIProviderInterface {\r\n generateText(request: GenerateTextRequest): Promise<GenerateTextResponse>;\r\n streamText(request: GenerateTextRequest): AsyncIterable<any>;\r\n generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>>;\r\n streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any>;\r\n}\r\n\r\n/**\r\n * Base provider class with common functionality\r\n */\r\nexport abstract class BaseProvider implements AIProviderInterface {\r\n protected config: ModelConfig;\r\n\r\n constructor(config: ModelConfig) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Format messages for API request\r\n * Handles system prompts and conversation history\r\n */\r\n protected formatMessages(request: GenerateTextRequest): Message[] {\r\n const messages: Message[] = [];\r\n\r\n if (request.systemPrompt) {\r\n messages.push({ role: 'system', content: request.systemPrompt });\r\n }\r\n\r\n messages.push(...request.messages);\r\n return messages;\r\n }\r\n\r\n /**\r\n * Validate configuration\r\n */\r\n protected validateConfig(): void {\r\n if (!this.config.apiKey) {\r\n throw new Error(`API key is required for ${this.config.provider} provider`);\r\n }\r\n if (!this.config.model) {\r\n throw new Error(`Model is required for ${this.config.provider} provider`);\r\n }\r\n }\r\n\r\n abstract generateText(request: GenerateTextRequest): Promise<GenerateTextResponse>;\r\n abstract streamText(request: GenerateTextRequest): AsyncIterable<any>;\r\n abstract generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>>;\r\n abstract streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any>;\r\n}\r\n\r\n","import Anthropic from \"@anthropic-ai/sdk\";\r\nimport { GenerateObjectRequest, GenerateObjectResponse, GenerateTextRequest, GenerateTextResponse } from \"../../types\";\r\nimport { BaseProvider } from \"../base\";\r\n\r\n/**\r\n * Anthropic provider implementation using official SDK\r\n */\r\nexport class AnthropicProvider extends BaseProvider {\r\n private client: Anthropic;\r\n\r\n constructor(config: any) {\r\n super(config);\r\n this.client = new Anthropic({\r\n apiKey: this.config.apiKey,\r\n baseURL: this.config.baseUrl,\r\n });\r\n }\r\n\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n const messages = this.formatMessages(request);\r\n const systemPrompt = messages.find(m => m.role === 'system')?.content;\r\n const userMessages = messages.filter(m => m.role !== 'system');\r\n\r\n const response = await this.client.messages.create({\r\n model: this.config.model,\r\n messages: userMessages as any,\r\n system: systemPrompt,\r\n max_tokens: this.config.maxTokens || 1024,\r\n temperature: this.config.temperature,\r\n });\r\n\r\n const textContent = response.content.find(c => c.type === 'text');\r\n\r\n return {\r\n text: textContent?.type === 'text' ? textContent.text : '',\r\n usage: {\r\n promptTokens: response.usage.input_tokens,\r\n completionTokens: response.usage.output_tokens,\r\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\r\n },\r\n finishReason: response.stop_reason as any,\r\n };\r\n }\r\n\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n const messages = this.formatMessages(request);\r\n const systemPrompt = messages.find(m => m.role === 'system')?.content;\r\n const userMessages = messages.filter(m => m.role !== 'system');\r\n\r\n const stream = await this.client.messages.stream({\r\n model: this.config.model,\r\n messages: userMessages as any,\r\n system: systemPrompt,\r\n max_tokens: this.config.maxTokens || 1024,\r\n temperature: this.config.temperature,\r\n });\r\n\r\n for await (const event of stream) {\r\n if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {\r\n yield { type: 'content', content: event.delta.text };\r\n }\r\n\r\n if (event.type === 'message_stop') {\r\n const message = await stream.finalMessage();\r\n yield {\r\n type: 'done',\r\n done: {\r\n finishReason: message.stop_reason,\r\n usage: {\r\n promptTokens: message.usage.input_tokens,\r\n completionTokens: message.usage.output_tokens,\r\n totalTokens: message.usage.input_tokens + message.usage.output_tokens,\r\n },\r\n },\r\n };\r\n }\r\n }\r\n }\r\n\r\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>> {\r\n const textResponse = await this.generateText({\r\n ...request,\r\n messages: [\r\n ...request.messages,\r\n {\r\n role: 'user',\r\n content: `Respond with valid JSON matching this schema: ${JSON.stringify(request.schema)}`\r\n },\r\n ],\r\n });\r\n\r\n const object = JSON.parse(textResponse.text);\r\n return {\r\n object,\r\n text: textResponse.text,\r\n usage: textResponse.usage,\r\n };\r\n }\r\n\r\n async *streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any> {\r\n let accumulatedText = '';\r\n\r\n for await (const chunk of this.streamText(request)) {\r\n if (chunk.type === 'content') {\r\n accumulatedText += chunk.content;\r\n\r\n try {\r\n const partial = JSON.parse(accumulatedText);\r\n yield { type: 'partial', partial, text: accumulatedText };\r\n } catch (e) {\r\n // Not yet valid JSON\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const object = JSON.parse(accumulatedText);\r\n yield { type: 'complete', object, text: accumulatedText };\r\n } catch (e) {\r\n yield { type: 'error', error: new Error('Invalid JSON in response') };\r\n }\r\n }\r\n}","/**\r\n * Base provider for custom/URL-based implementations\r\n * @module providers/custom\r\n */\r\n\r\nimport type {\r\n GenerateTextRequest,\r\n} from \"../types\";\r\nimport { BaseProvider } from \"./base\";\r\n\r\n/**\r\n * Base provider class for custom URL-based providers\r\n * Use this for providers without official SDKs (Sarvam, Custom, etc.)\r\n */\r\nexport abstract class CustomBaseProvider extends BaseProvider {\r\n /**\r\n * Make HTTP request with proper error handling\r\n */\r\n protected async makeRequest(\r\n url: string,\r\n options: RequestInit,\r\n stream = false\r\n ): Promise<Response> {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n ...((options.headers as Record<string, string>) || {}),\r\n };\r\n\r\n if (this.config.apiKey) {\r\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\r\n }\r\n\r\n const response = await fetch(url, {\r\n ...options,\r\n headers,\r\n });\r\n\r\n if (!response.ok && !stream) {\r\n const errorText = await response.text();\r\n throw new Error(`Provider request failed: ${response.status} ${errorText}`);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Get API endpoint URL\r\n */\r\n protected getEndpoint(path: string): string {\r\n const baseUrl = this.config.baseUrl || this.getDefaultBaseUrl();\r\n return `${baseUrl}${path}`;\r\n }\r\n\r\n /**\r\n * Get default base URL for provider\r\n */\r\n protected abstract getDefaultBaseUrl(): string;\r\n\r\n /**\r\n * Parse streaming SSE response\r\n */\r\n protected async *parseSSEStream(response: Response): AsyncIterable<any> {\r\n const reader = response.body!.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || '';\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data: ')) {\r\n const data = line.slice(6).trim();\r\n if (data === '[DONE]') continue;\r\n\r\n try {\r\n yield JSON.parse(data);\r\n } catch (e) {\r\n // Skip invalid JSON\r\n }\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n /**\r\n * Build request body with common parameters\r\n */\r\n protected buildRequestBody(request: GenerateTextRequest, stream = false): any {\r\n return {\r\n model: this.config.model,\r\n messages: this.formatMessages(request),\r\n max_tokens: this.config.maxTokens,\r\n temperature: this.config.temperature,\r\n top_p: this.config.topP,\r\n frequency_penalty: this.config.frequencyPenalty,\r\n presence_penalty: this.config.presencePenalty,\r\n stop: this.config.stop,\r\n stream,\r\n };\r\n }\r\n}","import { ProviderError } from \"../../utils/errors\";\r\nimport { GenerateObjectRequest, GenerateObjectResponse, GenerateTextRequest, GenerateTextResponse } from \"../../types\";\r\nimport { CustomBaseProvider } from \"../custom-base\";\r\n\r\n/**\r\n * Custom provider for any OpenAI-compatible API\r\n * \r\n * @example\r\n * ```typescript\r\n * const provider = new CustomProvider({\r\n * provider: 'custom',\r\n * model: 'your-model',\r\n * apiKey: process.env.CUSTOM_API_KEY,\r\n * baseUrl: 'https://your-api.com/v1',\r\n * });\r\n * ```\r\n */\r\nexport class CustomProvider extends CustomBaseProvider {\r\n protected getDefaultBaseUrl(): string {\r\n // Custom provider requires baseUrl in config\r\n if (!this.config.baseUrl) {\r\n throw new ProviderError(\r\n 'custom',\r\n 'baseUrl is required for custom provider',\r\n undefined,\r\n { config: this.config }\r\n );\r\n }\r\n return this.config.baseUrl;\r\n }\r\n\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n this.validateConfig();\r\n\r\n try {\r\n const response = await this.makeRequest(\r\n this.getEndpoint('/chat/completions'),\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(this.buildRequestBody(request)),\r\n }\r\n );\r\n\r\n const data = await response.json();\r\n\r\n if (!data.choices || data.choices.length === 0) {\r\n throw new ProviderError(\r\n 'custom',\r\n 'No choices returned from custom API',\r\n response.status,\r\n { response: data }\r\n );\r\n }\r\n\r\n return {\r\n text: data.choices[0].message.content,\r\n usage: {\r\n promptTokens: data.usage?.prompt_tokens || 0,\r\n completionTokens: data.usage?.completion_tokens || 0,\r\n totalTokens: data.usage?.total_tokens || 0,\r\n },\r\n finishReason: data.choices[0].finish_reason || 'stop',\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'custom',\r\n error instanceof Error ? error.message : 'Unknown error',\r\n undefined,\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n this.validateConfig();\r\n\r\n try {\r\n const response = await this.makeRequest(\r\n this.getEndpoint('/chat/completions'),\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(this.buildRequestBody(request, true)),\r\n },\r\n true\r\n );\r\n\r\n for await (const data of this.parseSSEStream(response)) {\r\n const content = data.choices?.[0]?.delta?.content;\r\n\r\n if (content) {\r\n yield { type: 'content', content };\r\n }\r\n\r\n if (data.choices?.[0]?.finish_reason) {\r\n yield {\r\n type: 'done',\r\n done: {\r\n finishReason: data.choices[0].finish_reason || 'stop',\r\n usage: {\r\n promptTokens: data.usage?.prompt_tokens || 0,\r\n completionTokens: data.usage?.completion_tokens || 0,\r\n totalTokens: data.usage?.total_tokens || 0,\r\n },\r\n },\r\n };\r\n }\r\n }\r\n } catch (error) {\r\n yield {\r\n type: 'error',\r\n error: new ProviderError(\r\n 'custom',\r\n error instanceof Error ? error.message : 'Streaming error',\r\n undefined,\r\n { originalError: error }\r\n ),\r\n };\r\n }\r\n }\r\n\r\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>> {\r\n const enhancedRequest = {\r\n ...request,\r\n messages: [\r\n ...request.messages,\r\n {\r\n role: 'user' as const,\r\n content: `Respond with valid JSON matching this schema: ${JSON.stringify(request.schema)}`,\r\n },\r\n ],\r\n };\r\n\r\n const textResponse = await this.generateText(enhancedRequest);\r\n\r\n try {\r\n const object = JSON.parse(textResponse.text);\r\n return {\r\n object,\r\n text: textResponse.text,\r\n usage: textResponse.usage,\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'custom',\r\n `Failed to parse JSON response: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n undefined,\r\n { responseText: textResponse.text }\r\n );\r\n }\r\n }\r\n\r\n async *streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any> {\r\n let accumulatedText = '';\r\n\r\n for await (const chunk of this.streamText(request)) {\r\n if (chunk.type === 'content') {\r\n accumulatedText += chunk.content;\r\n\r\n try {\r\n const partial = JSON.parse(accumulatedText);\r\n yield { type: 'partial', partial, text: accumulatedText };\r\n } catch (e) {\r\n // Not yet valid JSON\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const object = JSON.parse(accumulatedText);\r\n yield { type: 'complete', object, text: accumulatedText };\r\n } catch (e) {\r\n yield { type: 'error', error: new Error('Invalid JSON in response') };\r\n }\r\n }\r\n}","import { GoogleGenerativeAI, GenerativeModel } from \"@google/generative-ai\";\r\nimport { ProviderError } from \"../../utils/errors\";\r\nimport { GenerateObjectRequest, GenerateObjectResponse, GenerateTextRequest, GenerateTextResponse, Message } from \"../../types\";\r\nimport { BaseProvider } from \"../base\";\r\n\r\n/**\r\n * Google AI (Gemini) provider implementation\r\n * Supports Google's Gemini models via their official SDK\r\n * \r\n * @example\r\n * ```typescript\r\n * const provider = new GoogleProvider({\r\n * provider: 'google',\r\n * model: 'gemini-pro',\r\n * apiKey: process.env.GOOGLE_API_KEY,\r\n * });\r\n * ```\r\n */\r\nexport class GoogleProvider extends BaseProvider {\r\n private genAI: GoogleGenerativeAI;\r\n private model: GenerativeModel;\r\n\r\n constructor(config: any) {\r\n super(config);\r\n this.genAI = new GoogleGenerativeAI(this.config.apiKey!);\r\n this.model = this.genAI.getGenerativeModel({\r\n model: this.config.model,\r\n generationConfig: {\r\n maxOutputTokens: this.config.maxTokens,\r\n temperature: this.config.temperature,\r\n topP: this.config.topP,\r\n stopSequences: this.config.stop,\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Format messages for Google's API format\r\n */\r\n private formatGoogleMessages(messages: Message[]): any[] {\r\n return messages.map(msg => ({\r\n role: msg.role === 'assistant' ? 'model' : 'user',\r\n parts: [{ text: msg.content }],\r\n }));\r\n }\r\n\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n const messages = this.formatMessages(request);\r\n const systemPrompt = messages.find(m => m.role === 'system')?.content;\r\n const conversationMessages = messages.filter(m => m.role !== 'system');\r\n\r\n try {\r\n const chat = this.model.startChat({\r\n history: this.formatGoogleMessages(conversationMessages.slice(0, -1)),\r\n systemInstruction: systemPrompt ? {\r\n role: 'system',\r\n parts: [{ text: systemPrompt }]\r\n } : undefined,\r\n });\r\n\r\n const lastMessage = conversationMessages[conversationMessages.length - 1];\r\n const result = await chat.sendMessage(lastMessage.content);\r\n const response = result.response;\r\n\r\n return {\r\n text: response.text(),\r\n usage: {\r\n promptTokens: response.usageMetadata?.promptTokenCount || 0,\r\n completionTokens: response.usageMetadata?.candidatesTokenCount || 0,\r\n totalTokens: response.usageMetadata?.totalTokenCount || 0,\r\n },\r\n finishReason: this.mapGoogleFinishReason(response.candidates?.[0]?.finishReason),\r\n metadata: {\r\n safetyRatings: response.candidates?.[0]?.safetyRatings,\r\n },\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'google',\r\n error instanceof Error ? error.message : 'Unknown error',\r\n undefined,\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n const messages = this.formatMessages(request);\r\n const systemPrompt = messages.find(m => m.role === 'system')?.content;\r\n const conversationMessages = messages.filter(m => m.role !== 'system');\r\n\r\n try {\r\n const chat = this.model.startChat({\r\n history: this.formatGoogleMessages(conversationMessages.slice(0, -1)),\r\n systemInstruction: systemPrompt,\r\n });\r\n\r\n const lastMessage = conversationMessages[conversationMessages.length - 1];\r\n const result = await chat.sendMessageStream(lastMessage.content);\r\n\r\n for await (const chunk of result.stream) {\r\n const text = chunk.text();\r\n if (text) {\r\n yield { type: 'content', content: text };\r\n }\r\n }\r\n\r\n const response = await result.response;\r\n yield {\r\n type: 'done',\r\n done: {\r\n finishReason: this.mapGoogleFinishReason(response.candidates?.[0]?.finishReason),\r\n usage: {\r\n promptTokens: response.usageMetadata?.promptTokenCount || 0,\r\n completionTokens: response.usageMetadata?.candidatesTokenCount || 0,\r\n totalTokens: response.usageMetadata?.totalTokenCount || 0,\r\n },\r\n },\r\n };\r\n } catch (error) {\r\n yield {\r\n type: 'error',\r\n error: new ProviderError(\r\n 'google',\r\n error instanceof Error ? error.message : 'Streaming error',\r\n undefined,\r\n { originalError: error }\r\n ),\r\n };\r\n }\r\n }\r\n\r\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>> {\r\n const enhancedRequest = {\r\n ...request,\r\n messages: [\r\n ...request.messages,\r\n {\r\n role: 'user' as const,\r\n content: `Respond with valid JSON matching this schema: ${JSON.stringify(request.schema)}. Only return the JSON object, no other text.`,\r\n },\r\n ],\r\n };\r\n\r\n const textResponse = await this.generateText(enhancedRequest);\r\n\r\n let jsonText = textResponse.text.trim();\r\n const jsonMatch = jsonText.match(/```json\\s*([\\s\\S]*?)\\s*```/);\r\n if (jsonMatch) {\r\n jsonText = jsonMatch[1];\r\n }\r\n\r\n try {\r\n const object = JSON.parse(jsonText);\r\n return {\r\n object,\r\n text: textResponse.text,\r\n usage: textResponse.usage,\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'google',\r\n `Failed to parse JSON response: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n undefined,\r\n { responseText: textResponse.text }\r\n );\r\n }\r\n }\r\n\r\n async *streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any> {\r\n let accumulatedText = '';\r\n\r\n for await (const chunk of this.streamText(request)) {\r\n if (chunk.type === 'content') {\r\n accumulatedText += chunk.content;\r\n\r\n let jsonText = accumulatedText.trim();\r\n const jsonMatch = jsonText.match(/```json\\s*([\\s\\S]*?)\\s*```/);\r\n if (jsonMatch) {\r\n jsonText = jsonMatch[1];\r\n }\r\n\r\n try {\r\n const partial = JSON.parse(jsonText);\r\n yield { type: 'partial', partial, text: accumulatedText };\r\n } catch (e) {\r\n // Not yet valid JSON\r\n }\r\n }\r\n }\r\n\r\n let jsonText = accumulatedText.trim();\r\n const jsonMatch = jsonText.match(/```json\\s*([\\s\\S]*?)\\s*```/);\r\n if (jsonMatch) {\r\n jsonText = jsonMatch[1];\r\n }\r\n\r\n try {\r\n const object = JSON.parse(jsonText);\r\n yield { type: 'complete', object, text: accumulatedText };\r\n } catch (e) {\r\n yield {\r\n type: 'error',\r\n error: new Error(`Invalid JSON in response: ${accumulatedText.substring(0, 100)}...`),\r\n };\r\n }\r\n }\r\n\r\n private mapGoogleFinishReason(reason?: string): 'stop' | 'length' | 'content_filter' | 'tool_calls' {\r\n const mapping: Record<string, any> = {\r\n 'STOP': 'stop',\r\n 'MAX_TOKENS': 'length',\r\n 'SAFETY': 'content_filter',\r\n 'RECITATION': 'content_filter',\r\n 'OTHER': 'stop',\r\n };\r\n return mapping[reason || 'STOP'] || 'stop';\r\n }\r\n}","import OpenAI from \"openai\";\r\nimport { GenerateObjectRequest, GenerateObjectResponse, GenerateTextRequest, GenerateTextResponse } from \"../../types\";\r\nimport { BaseProvider } from \"../base\";\r\n\r\n/**\r\n * OpenAI provider implementation using official SDK\r\n */\r\nexport class OpenAIProvider extends BaseProvider {\r\n private client: OpenAI;\r\n\r\n constructor(config: any) {\r\n super(config);\r\n this.client = new OpenAI({\r\n apiKey: this.config.apiKey,\r\n baseURL: this.config.baseUrl,\r\n });\r\n }\r\n\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n const completion = await this.client.chat.completions.create({\r\n model: this.config.model,\r\n messages: this.formatMessages(request) as any,\r\n max_tokens: this.config.maxTokens,\r\n temperature: this.config.temperature,\r\n top_p: this.config.topP,\r\n frequency_penalty: this.config.frequencyPenalty,\r\n presence_penalty: this.config.presencePenalty,\r\n stop: this.config.stop,\r\n });\r\n\r\n return {\r\n text: completion.choices[0].message.content || '',\r\n usage: {\r\n promptTokens: completion.usage?.prompt_tokens || 0,\r\n completionTokens: completion.usage?.completion_tokens || 0,\r\n totalTokens: completion.usage?.total_tokens || 0,\r\n },\r\n finishReason: completion.choices[0].finish_reason as any,\r\n };\r\n }\r\n\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n const stream = await this.client.chat.completions.create({\r\n model: this.config.model,\r\n messages: this.formatMessages(request) as any,\r\n max_tokens: this.config.maxTokens,\r\n temperature: this.config.temperature,\r\n stream: true,\r\n });\r\n\r\n for await (const chunk of stream) {\r\n const content = chunk.choices[0]?.delta?.content;\r\n if (content) {\r\n yield { type: 'content', content };\r\n }\r\n\r\n if (chunk.choices[0]?.finish_reason) {\r\n yield {\r\n type: 'done',\r\n done: {\r\n finishReason: chunk.choices[0].finish_reason,\r\n usage: chunk.usage ? {\r\n promptTokens: chunk.usage.prompt_tokens || 0,\r\n completionTokens: chunk.usage.completion_tokens || 0,\r\n totalTokens: chunk.usage.total_tokens || 0,\r\n } : undefined,\r\n },\r\n };\r\n }\r\n }\r\n }\r\n\r\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>> {\r\n const textResponse = await this.generateText({\r\n ...request,\r\n messages: [\r\n ...request.messages,\r\n {\r\n role: 'system',\r\n content: `Respond with valid JSON matching this schema: ${JSON.stringify(request.schema)}`\r\n },\r\n ],\r\n });\r\n\r\n const object = JSON.parse(textResponse.text);\r\n return {\r\n object,\r\n text: textResponse.text,\r\n usage: textResponse.usage,\r\n };\r\n }\r\n\r\n async *streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any> {\r\n let accumulatedText = '';\r\n\r\n for await (const chunk of this.streamText(request)) {\r\n if (chunk.type === 'content') {\r\n accumulatedText += chunk.content;\r\n\r\n try {\r\n const partial = JSON.parse(accumulatedText);\r\n yield { type: 'partial', partial, text: accumulatedText };\r\n } catch (e) {\r\n // Not yet valid JSON\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const object = JSON.parse(accumulatedText);\r\n yield { type: 'complete', object, text: accumulatedText };\r\n } catch (e) {\r\n yield { type: 'error', error: new Error('Invalid JSON in response') };\r\n }\r\n }\r\n}","import { ProviderError } from \"../../utils/errors\";\r\nimport { GenerateObjectRequest, GenerateObjectResponse, GenerateTextRequest, GenerateTextResponse } from \"../../types\";\r\nimport { CustomBaseProvider } from \"../custom-base\";\r\n\r\n/**\r\n * Sarvam AI provider implementation\r\n * Supports Sarvam's Indian language models\r\n * \r\n * @example\r\n * ```typescript\r\n * const provider = new SarvamProvider({\r\n * provider: 'sarvam',\r\n * model: 'sarvam-2b',\r\n * apiKey: process.env.SARVAM_API_KEY,\r\n * });\r\n * ```\r\n */\r\nexport class SarvamProvider extends CustomBaseProvider {\r\n protected getDefaultBaseUrl(): string {\r\n return 'https://api.sarvam.ai/v1';\r\n }\r\n\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n this.validateConfig();\r\n\r\n try {\r\n const response = await this.makeRequest(\r\n this.getEndpoint('/chat/completions'),\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(this.buildRequestBody(request)),\r\n }\r\n );\r\n\r\n const data = await response.json();\r\n\r\n if (!data.choices || data.choices.length === 0) {\r\n throw new ProviderError(\r\n 'sarvam',\r\n 'No choices returned from Sarvam API',\r\n response.status,\r\n { response: data }\r\n );\r\n }\r\n\r\n return {\r\n text: data.choices[0].message.content,\r\n usage: {\r\n promptTokens: data.usage?.prompt_tokens || 0,\r\n completionTokens: data.usage?.completion_tokens || 0,\r\n totalTokens: data.usage?.total_tokens || 0,\r\n },\r\n finishReason: this.mapFinishReason(data.choices[0].finish_reason),\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'sarvam',\r\n error instanceof Error ? error.message : 'Unknown error',\r\n undefined,\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n this.validateConfig();\r\n\r\n try {\r\n const response = await this.makeRequest(\r\n this.getEndpoint('/chat/completions'),\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(this.buildRequestBody(request, true)),\r\n },\r\n true\r\n );\r\n\r\n for await (const data of this.parseSSEStream(response)) {\r\n const content = data.choices?.[0]?.delta?.content;\r\n\r\n if (content) {\r\n yield { type: 'content', content };\r\n }\r\n\r\n if (data.choices?.[0]?.finish_reason) {\r\n yield {\r\n type: 'done',\r\n done: {\r\n finishReason: this.mapFinishReason(data.choices[0].finish_reason),\r\n usage: {\r\n promptTokens: data.usage?.prompt_tokens || 0,\r\n completionTokens: data.usage?.completion_tokens || 0,\r\n totalTokens: data.usage?.total_tokens || 0,\r\n },\r\n },\r\n };\r\n }\r\n }\r\n } catch (error) {\r\n yield {\r\n type: 'error',\r\n error: new ProviderError(\r\n 'sarvam',\r\n error instanceof Error ? error.message : 'Streaming error',\r\n undefined,\r\n { originalError: error }\r\n ),\r\n };\r\n }\r\n }\r\n\r\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<GenerateObjectResponse<T>> {\r\n const enhancedRequest = {\r\n ...request,\r\n messages: [\r\n ...request.messages,\r\n {\r\n role: 'user' as const,\r\n content: `Respond with valid JSON matching this schema: ${JSON.stringify(request.schema)}`,\r\n },\r\n ],\r\n };\r\n\r\n const textResponse = await this.generateText(enhancedRequest);\r\n\r\n try {\r\n const object = JSON.parse(textResponse.text);\r\n return {\r\n object,\r\n text: textResponse.text,\r\n usage: textResponse.usage,\r\n };\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'sarvam',\r\n `Failed to parse JSON response: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n undefined,\r\n { responseText: textResponse.text }\r\n );\r\n }\r\n }\r\n\r\n async *streamObject<T>(request: GenerateObjectRequest<T>): AsyncIterable<any> {\r\n let accumulatedText = '';\r\n\r\n for await (const chunk of this.streamText(request)) {\r\n if (chunk.type === 'content') {\r\n accumulatedText += chunk.content;\r\n\r\n try {\r\n const partial = JSON.parse(accumulatedText);\r\n yield { type: 'partial', partial, text: accumulatedText };\r\n } catch (e) {\r\n // Not yet valid JSON\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const object = JSON.parse(accumulatedText);\r\n yield { type: 'complete', object, text: accumulatedText };\r\n } catch (e) {\r\n yield { type: 'error', error: new Error('Invalid JSON in response') };\r\n }\r\n }\r\n\r\n private mapFinishReason(reason: string): 'stop' | 'length' | 'content_filter' | 'tool_calls' {\r\n const mapping: Record<string, any> = {\r\n 'stop': 'stop',\r\n 'length': 'length',\r\n 'max_tokens': 'length',\r\n 'content_filter': 'content_filter',\r\n };\r\n return mapping[reason] || 'stop';\r\n }\r\n}","\r\n// Import after BaseProvider is defined\r\nimport { ModelConfig } from \"../types\";\r\nimport { AnthropicProvider } from \"./anthropic\";\r\nimport { AIProviderInterface } from \"./base\";\r\nimport { CustomProvider } from \"./custom\";\r\nimport { GoogleProvider } from \"./google\";\r\nimport { OpenAIProvider } from \"./openai\";\r\nimport { SarvamProvider } from \"./sarvam\";\r\n\r\n/**\r\n * Create provider instance based on configuration\r\n */\r\nexport function createProvider(config: ModelConfig): AIProviderInterface {\r\n switch (config.provider) {\r\n case 'openai':\r\n return new OpenAIProvider(config);\r\n case 'anthropic':\r\n return new AnthropicProvider(config);\r\n case 'google':\r\n return new GoogleProvider(config);\r\n case 'sarvam':\r\n return new SarvamProvider(config);\r\n case 'custom':\r\n return new CustomProvider(config);\r\n default:\r\n throw new Error(`Unknown extended provider: ${config.provider}`);\r\n }\r\n}","/**\r\n * Streaming utilities for real-time data processing\r\n * @module stream\r\n */\r\n\r\nimport { StreamReader } from \"../types\";\r\nimport { StreamError } from \"../utils/errors\";\r\n\r\n/**\r\n * Transform stream for processing chunks\r\n */\r\nexport class TransformStream<TInput, TOutput> {\r\n private transformer: (chunk: TInput) => TOutput | Promise<TOutput>;\r\n\r\n constructor(transformer: (chunk: TInput) => TOutput | Promise<TOutput>) {\r\n this.transformer = transformer;\r\n }\r\n\r\n async *transform(source: AsyncIterable<TInput>): AsyncIterable<TOutput> {\r\n for await (const chunk of source) {\r\n yield await this.transformer(chunk);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Stream reader implementation\r\n */\r\nexport class FlareStreamReader<T> implements StreamReader<T> {\r\n private source: AsyncIterator<T>;\r\n private done = false;\r\n\r\n constructor(source: AsyncIterable<T>) {\r\n this.source = source[Symbol.asyncIterator]();\r\n }\r\n\r\n async read(): Promise<{ value: T; done: boolean }> {\r\n if (this.done) {\r\n return { value: undefined as any, done: true };\r\n }\r\n\r\n const result = await this.source.next();\r\n this.done = result.done || false;\r\n return { value: result.value, done: this.done };\r\n }\r\n\r\n cancel(): void {\r\n this.done = true;\r\n if (this.source.return) {\r\n this.source.return();\r\n }\r\n }\r\n\r\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\r\n while (!this.done) {\r\n const { value, done } = await this.read();\r\n if (done) break;\r\n yield value;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create a data stream writer for Server-Sent Events\r\n * @returns Writer object with methods to push data\r\n * \r\n * @example\r\n * ```typescript\r\n * const writer = createDataStreamWriter();\r\n * \r\n * writer.writeData({ type: 'message', content: 'Hello' });\r\n * writer.writeError(new Error('Something went wrong'));\r\n * writer.close();\r\n * \r\n * return new Response(writer.readable);\r\n * ```\r\n */\r\nexport function createDataStreamWriter() {\r\n let controller: ReadableStreamDefaultController<Uint8Array> | null = null;\r\n const encoder = new TextEncoder();\r\n\r\n const readable = new ReadableStream<Uint8Array>({\r\n start(ctrl) {\r\n controller = ctrl;\r\n },\r\n cancel() {\r\n controller = null;\r\n },\r\n });\r\n\r\n const write = (data: string) => {\r\n if (controller) {\r\n controller.enqueue(encoder.encode(data));\r\n }\r\n };\r\n\r\n return {\r\n readable,\r\n\r\n /**\r\n * Write data event\r\n */\r\n writeData(data: any): void {\r\n write(`data: ${JSON.stringify(data)}\\n\\n`);\r\n },\r\n\r\n /**\r\n * Write error event\r\n */\r\n writeError(error: Error): void {\r\n write(`event: error\\ndata: ${JSON.stringify({\r\n message: error.message,\r\n code: (error as any).code\r\n })}\\n\\n`);\r\n },\r\n\r\n /**\r\n * Write custom event\r\n */\r\n writeEvent(event: string, data: any): void {\r\n write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`);\r\n },\r\n\r\n /**\r\n * Close the stream\r\n */\r\n close(): void {\r\n if (controller) {\r\n controller.close();\r\n controller = null;\r\n }\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Convert async iterable to UI stream response\r\n * Transforms server stream into format suitable for client consumption\r\n * \r\n * @param stream - Async iterable of chunks\r\n * @returns Response object with streaming body\r\n * \r\n * @example\r\n * ```typescript\r\n * const stream = streamText({ messages, config });\r\n * return toUiStreamResponse(stream);\r\n * ```\r\n */\r\nexport function toUiStreamResponse<T>(\r\n stream: AsyncIterable<T>,\r\n headers?: Record<string, string>\r\n): Response {\r\n const writer = createDataStreamWriter();\r\n\r\n // Process stream in background\r\n (async () => {\r\n try {\r\n for await (const chunk of stream) {\r\n writer.writeData(chunk);\r\n }\r\n writer.close();\r\n } catch (error) {\r\n writer.writeError(error instanceof Error ? error : new Error(String(error)));\r\n writer.close();\r\n }\r\n })();\r\n\r\n return new Response(writer.readable, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n ...headers,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Parse Server-Sent Events stream\r\n * @param response - Fetch Response with SSE stream\r\n * @returns Async iterable of parsed events\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await fetch('/api/stream');\r\n * for await (const event of parseSSEStream(response)) {\r\n * console.log(event);\r\n * }\r\n * ```\r\n */\r\nexport async function* parseSSEStream(response: Response): AsyncIterable<any> {\r\n if (!response.body) {\r\n throw new StreamError('Response body is null');\r\n }\r\n\r\n const reader = response.body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split('\\n\\n');\r\n buffer = lines.pop() || '';\r\n\r\n for (const line of lines) {\r\n if (!line.trim()) continue;\r\n\r\n const match = line.match(/^data: (.+)$/m);\r\n if (match) {\r\n try {\r\n yield JSON.parse(match[1]);\r\n } catch (e) {\r\n console.error('Failed to parse SSE data:', e);\r\n }\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n}\r\n\r\n/**\r\n * Merge multiple streams into one\r\n * @param streams - Array of async iterables\r\n * @returns Merged async iterable\r\n */\r\nexport async function* mergeStreams<T>(...streams: AsyncIterable<T>[]): AsyncIterable<T> {\r\n const iterators = streams.map(s => s[Symbol.asyncIterator]());\r\n const pending = new Set(iterators);\r\n\r\n while (pending.size > 0) {\r\n const results = await Promise.race(\r\n Array.from(pending).map(async (it) => ({ it, result: await it.next() }))\r\n );\r\n\r\n if (results.result.done) {\r\n pending.delete(results.it);\r\n } else {\r\n yield results.result.value;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Buffer stream chunks for batch processing\r\n * @param stream - Source stream\r\n * @param size - Buffer size\r\n * @returns Buffered stream\r\n */\r\nexport async function* bufferStream<T>(\r\n stream: AsyncIterable<T>,\r\n size: number\r\n): AsyncIterable<T[]> {\r\n let buffer: T[] = [];\r\n\r\n for await (const item of stream) {\r\n buffer.push(item);\r\n if (buffer.length >= size) {\r\n yield buffer;\r\n buffer = [];\r\n }\r\n }\r\n\r\n if (buffer.length > 0) {\r\n yield buffer;\r\n }\r\n}\r\n\r\n/**\r\n * Throttle stream to limit rate\r\n * @param stream - Source stream\r\n * @param delayMs - Delay between chunks in milliseconds\r\n * @returns Throttled stream\r\n */\r\nexport async function* throttleStream<T>(\r\n stream: AsyncIterable<T>,\r\n delayMs: number\r\n): AsyncIterable<T> {\r\n for await (const item of stream) {\r\n yield item;\r\n await new Promise(resolve => setTimeout(resolve, delayMs));\r\n }\r\n}","/**\r\n * Main FlareClient for AI interactions\r\n * @module client\r\n */\r\n\r\nimport EventEmitter from 'eventemitter3';\r\nimport {\r\n FlareConfig,\r\n GenerateTextRequest,\r\n GenerateTextResponse,\r\n GenerateObjectRequest,\r\n GenerateObjectResponse,\r\n HealthStatus,\r\n} from '../types';\r\nimport { AIProviderInterface, createProvider } from '../providers';\r\nimport { RetryHandler } from '../utils/retry';\r\nimport { CircuitBreaker } from '../utils/circuit-breaker';\r\nimport { RateLimiter } from '../utils/rate-limiter';\r\nimport { RequestQueue } from '../utils/request-queue';\r\nimport { MetricsCollector } from '../utils/metrics';\r\n\r\n/**\r\n * Default configuration\r\n */\r\nconst DEFAULT_CONFIG: Partial<FlareConfig> = {\r\n maxTokens: 1024,\r\n temperature: 0.7,\r\n enableQueueing: true,\r\n enablePooling: true,\r\n enableMetrics: true,\r\n retry: {\r\n maxRetries: 3,\r\n initialDelay: 1000,\r\n maxDelay: 30000,\r\n },\r\n circuitBreaker: {\r\n failureThreshold: 5,\r\n resetTimeout: 60000,\r\n },\r\n rateLimit: {\r\n maxRequests: 100,\r\n windowMs: 60000,\r\n },\r\n};\r\n\r\n/**\r\n * Main FlareClient for AI interactions\r\n * Provides text generation, streaming, and structured output\r\n * with built-in retry, circuit breaker, and rate limiting\r\n * \r\n * @example\r\n * ```typescript\r\n * const client = new FlareClient({\r\n * provider: 'openai',\r\n * model: 'gpt-4',\r\n * apiKey: process.env.OPENAI_API_KEY,\r\n * });\r\n * \r\n * // Generate text\r\n * const response = await client.generateText({\r\n * messages: [{ role: 'user', content: 'Hello!' }],\r\n * });\r\n * \r\n * // Stream text\r\n * const stream = client.streamText({\r\n * messages: [{ role: 'user', content: 'Tell me a story' }],\r\n * });\r\n * \r\n * for await (const chunk of stream) {\r\n * console.log(chunk.content);\r\n * }\r\n * ```\r\n */\r\nexport class FlareClient extends EventEmitter {\r\n private config: FlareConfig;\r\n private provider: AIProviderInterface;\r\n private retryHandler: RetryHandler;\r\n private circuitBreaker: CircuitBreaker;\r\n private rateLimiter: RateLimiter;\r\n private requestQueue?: RequestQueue;\r\n private metrics: MetricsCollector;\r\n private startTime = Date.now();\r\n\r\n constructor(config: FlareConfig) {\r\n super();\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n\r\n\r\n\r\n // Initialize reliability components\r\n this.provider = createProvider(this.config);\r\n this.retryHandler = new RetryHandler(this.config.retry);\r\n this.circuitBreaker = new CircuitBreaker(this.config.circuitBreaker);\r\n this.rateLimiter = new RateLimiter(this.config.rateLimit);\r\n this.metrics = new MetricsCollector();\r\n\r\n if (this.config.enableQueueing) {\r\n this.requestQueue = new RequestQueue({\r\n concurrency: this.config.poolSize || 10,\r\n });\r\n }\r\n\r\n this.setupEventListeners();\r\n }\r\n\r\n /**\r\n * Setup event listeners for monitoring\r\n */\r\n private setupEventListeners(): void {\r\n this.circuitBreaker.on('open', () => {\r\n this.emit('circuit-breaker:open');\r\n if (this.config.debug) {\r\n console.warn('[FlareClient] Circuit breaker opened');\r\n }\r\n });\r\n\r\n this.circuitBreaker.on('close', () => {\r\n this.emit('circuit-breaker:close');\r\n if (this.config.debug) {\r\n console.log('[FlareClient] Circuit breaker closed');\r\n }\r\n });\r\n\r\n if (this.requestQueue) {\r\n this.requestQueue.on('enqueue', (data) => {\r\n this.emit('queue:enqueue', data);\r\n });\r\n\r\n this.requestQueue.on('drain', () => {\r\n this.emit('queue:drain');\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Generate text synchronously\r\n * @param request - Text generation request\r\n * @returns Generated text response\r\n */\r\n async generateText(request: GenerateTextRequest): Promise<GenerateTextResponse> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n // Check rate limit\r\n await this.rateLimiter.acquire(this.config.rateLimit?.clientId);\r\n\r\n // Execute with reliability patterns\r\n const execute = async () => {\r\n return await this.circuitBreaker.execute(async () => {\r\n const mergedConfig = { ...this.config, ...request.config };\r\n return await this.provider.generateText({\r\n ...request,\r\n config: mergedConfig,\r\n });\r\n });\r\n };\r\n\r\n let result: GenerateTextResponse;\r\n\r\n if (this.requestQueue && this.config.enableQueueing) {\r\n result = await this.requestQueue.add(\r\n () => this.retryHandler.execute(execute),\r\n request.config?.queuePriority || 0\r\n );\r\n } else {\r\n result = await this.retryHandler.execute(execute);\r\n }\r\n\r\n this.metrics.recordSuccess(Date.now() - startTime);\r\n this.emit('request:success', { latency: Date.now() - startTime });\r\n\r\n return result;\r\n } catch (error) {\r\n this.metrics.recordFailure(Date.now() - startTime);\r\n this.emit('request:error', { error, latency: Date.now() - startTime });\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Stream text generation\r\n * @param request - Text generation request\r\n * @returns Async iterable of text chunks\r\n */\r\n async *streamText(request: GenerateTextRequest): AsyncIterable<any> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n await this.rateLimiter.acquire(this.config.rateLimit?.clientId);\r\n\r\n const stream = this.provider.streamText(request);\r\n\r\n for await (const chunk of stream) {\r\n yield chunk;\r\n }\r\n\r\n this.metrics.recordSuccess(Date.now() - startTime);\r\n this.emit('request:success', { latency: Date.now() - startTime, streaming: true });\r\n } catch (error) {\r\n this.metrics.recordFailure(Date.now() - startTime);\r\n this.emit('request:error', { error, latency: Date.now() - startTime, streaming: true });\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Generate structured object\r\n * @param request - Object generation request\r\n * @returns Generated object response\r\n */\r\n async generateObject<T = any>(\r\n request: GenerateObjectRequest<T>\r\n ): Promise<GenerateObjectResponse<T>> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n await this.rateLimiter.acquire(this.config.rateLimit?.clientId);\r\n\r\n const execute = async () => {\r\n return await this.circuitBreaker.execute(async () => {\r\n return await this.provider.generateObject<T>(request);\r\n });\r\n };\r\n\r\n let result: GenerateObjectResponse<T>;\r\n\r\n if (this.requestQueue && this.config.enableQueueing) {\r\n result = await this.requestQueue.add(\r\n () => this.retryHandler.execute(execute),\r\n request.config?.queuePriority || 0\r\n );\r\n } else {\r\n result = await this.retryHandler.execute(execute);\r\n }\r\n\r\n this.metrics.recordSuccess(Date.now() - startTime);\r\n return result;\r\n } catch (error) {\r\n this.metrics.recordFailure(Date.now() - startTime);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Stream object generation\r\n * @param request - Object generation request\r\n * @returns Async iterable of object chunks\r\n */\r\n async *streamObject<T = any>(\r\n request: GenerateObjectRequest<T>\r\n ): AsyncIterable<any> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n await this.rateLimiter.acquire(this.config.rateLimit?.clientId);\r\n\r\n const stream = this.provider.streamObject<T>(request);\r\n\r\n for await (const chunk of stream) {\r\n yield chunk;\r\n }\r\n\r\n this.metrics.recordSuccess(Date.now() - startTime);\r\n } catch (error) {\r\n this.metrics.recordFailure(Date.now() - startTime);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get health status\r\n */\r\n getHealth(): HealthStatus {\r\n const metrics = this.metrics.getMetrics();\r\n\r\n let status: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';\r\n if (this.circuitBreaker.getState() === 'open') {\r\n status = 'unhealthy';\r\n } else if (metrics.failedRequests > metrics.successfulRequests * 0.1) {\r\n status = 'degraded';\r\n }\r\n\r\n return {\r\n status,\r\n timestamp: Date.now(),\r\n uptime: Date.now() - this.startTime,\r\n circuitBreaker: this.circuitBreaker.getState(),\r\n activeConnections: this.requestQueue?.getRunning(),\r\n queueSize: this.requestQueue?.size(),\r\n metrics,\r\n };\r\n }\r\n\r\n /**\r\n * Get performance metrics\r\n */\r\n getMetrics() {\r\n return this.metrics.getDetailedStats();\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n updateConfig(config: Partial<FlareConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n\r\n if (config.retry) {\r\n this.retryHandler.updateConfig(config.retry);\r\n }\r\n\r\n if (config.rateLimit) {\r\n this.rateLimiter = new RateLimiter(config.rateLimit);\r\n }\r\n }\r\n\r\n /**\r\n * Reset circuit breaker\r\n */\r\n resetCircuitBreaker(): void {\r\n this.circuitBreaker.reset();\r\n }\r\n\r\n /**\r\n * Clean up resources\r\n */\r\n destroy(): void {\r\n this.circuitBreaker.destroy();\r\n this.rateLimiter.destroy();\r\n if (this.requestQueue) {\r\n this.requestQueue.clear();\r\n }\r\n this.removeAllListeners();\r\n }\r\n}\r\n\r\n/**\r\n * Create FlareClient instance\r\n * @param config - Client configuration\r\n * @returns FlareClient instance\r\n */\r\nexport function createFlareClient(config: FlareConfig): FlareClient {\r\n return new FlareClient(config);\r\n}"],"mappings":"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","names":["DEFAULT_CONFIG","EventEmitter","import_eventemitter3","CircuitState","DEFAULT_CONFIG","EventEmitter","Anthropic","error","error","jsonText","jsonMatch","OpenAI","error","error","import_eventemitter3","DEFAULT_CONFIG","EventEmitter","error"]}